Setup

library(ithi.utils)
load_base_libs()

library(methods)
library(forcats)
library(grid)
library(gridExtra)
library(gridBase)

library(ithi.meta)
library(ithi.figures)
library(ithi.utils)
library(ithi.seq)
library(ithi.supp)
library(ithi.xcr)
ihc_table_path <- snakemake@input$ihc_table
xcr_table_path <- snakemake@input$xcr_table
tcr_diversity_file <- snakemake@input$tcr_diversity
bcr_diversity_file <- snakemake@input$bcr_diversity
molecular_subtype_file <- snakemake@input$molsubtypes

db_path <- snakemake@params$db
total_tiltypes <- snakemake@params$total_tiltypes
all_tiltypes <- snakemake@params$all_tiltypes
tils_for_cluster <- snakemake@params$tils_for_cluster
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 55.8% 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
molsubtypes <- fread(molecular_subtype_file)

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

til_clusters <- ithi.figures:::get_til_clusters(ihc_table, molsubtypes, tils_for_cluster = tils_for_cluster, 
    nclusts = 3)

Analysis

Naively, if it was true that less infiltrated tumours have more TCRs to be sequenced, N-TIL tumours should also have higher TCR/BCR diversity, which is not the case.

This is a valid point for ES-TIL vs. S-TIL. It could be argued that having more expanded TIL that result in missing detection of rare TIL clonotypes in high-TIL samples is actually signal that we’re trying to capture, though. If very rare clonotypes are squeezed out because we don’t have enough reads, that means that the clonotypes that we do see are expanded relative to those – and this should be quantified as less diversity. This was the motivation behind using species diversity measures like Shannon entropy (in addition to just using unique clonotype count).

We’ll address this 2 ways:

  • Using diversity measures (e.g. Chao1, Efron-Thisted) that extrapolate the number of ‘missing’ clonotypes in a sample
  • Incorporating TIL density covariates into a linear model of TIL cluster vs. TCR/BCR diversity

If the reason behind our findings is that rare TCRs are missed, the first point should reveal no differences between S-TIL and ES-TIL populations.

More broadly, if the degree of infiltration confounds these TCR/BCR diversity for some other reason, the second point should address that. Note that we use total TIL densities (and not epithelial/stromal split) when doing this, because TIL clusters are defined on the basis of epithelial/stromal TIL densities.

As for what the point of this analysis is – now that we’ve switched this analysis to using our TIL subtypes rather than the transcriptomic/molecular subtypes, the point of this analysis is to describe other properties of our subtypes, i.e. the properties of TCR/BCR diversity. Naively one might think from our discussion of total CD8/CD4 TIL densities being correlated with TCR diversity in the manuscript (PAGE NUMBER) that the most ‘immune-hot’ samples should have the highest TCR/BCR diversity. In fact, however, this analysis shows that it’s actually the S-TIL samples that have the highest diversity, implying that the stromal TIL populations in S-TIL samples may be more clonally diverse than the TIL populations in ES-TIL samples. This isn’t significant (it’s a trend), but still seems important to note.

Using other diversity measures

Other ways to get at this question include using diversity measures that estimate the proportion of unsampled clonotypes (e.g. Chao1; though the accuracy of these measures is debated in the literature, see ____). We can also use other diversity measures that put greater weight on the more abundant clonotypes, i.e. Hill diversity for alpha >= 2.

Chao1/Efron-Thisted

tilsubtype_immune_res <- supp_molsubtype_immune_properties(ihc_table, molsubtypes, 
    xcr_table, tcr_diversity_file, bcr_diversity_file, db_path, tiltypes = all_tiltypes, 
    subtype_class = "til_clusters", raw_measures = c("clonotypes_unique", "D50_index", 
        "chao1", "efron_thisted", "inverse_simpson", "renyi_4", "renyi_8", "renyi_16", 
        "renyi_32", "renyi_64"), translated_measures = c("Unique clonotypes", 
        "D50 index", "Chao1", "Efron Thisted", "Inverse Simpson", "Renyi 4", 
        "Renyi 8", "Renyi 16", "Renyi 32", "Renyi 64"))
tilsubtype_immune_res$subtype_diversity_plots$Chao1

tilsubtype_immune_res$subtype_diversity_plots$`Efron Thisted`

which recapitulate the same results.

While the differences between S-TIL and ES-TIL aren’t significant, they’re visually comparable to the (also non-significant) findings with other diversity measures.

More Hill diversity measures

tilsubtype_immune_res$subtype_diversity_plots$`Inverse Simpson`

tilsubtype_immune_res$subtype_diversity_plots$`Renyi 4`

tilsubtype_immune_res$subtype_diversity_plots$`Renyi 8`

tilsubtype_immune_res$subtype_diversity_plots$`Renyi 16`

tilsubtype_immune_res$subtype_diversity_plots$`Renyi 32`

tilsubtype_immune_res$subtype_diversity_plots$`Renyi 64`

Incorporating TIL density into a linear model

To get at this point, we can also design a model with total CD8/CD4/CD20/Plasma TIL density as an additional covariate. Note that we are not interested in the differences between epithelial and stromal here, since that is likely part of the signal.

ihc_table_subset <- subset(ihc_table, select = c("condensed_id", "patient_id", 
    total_tiltypes))
ihc_xcr_cluster_table <- Reduce(plyr::join, list(xcr_diversity, til_clusters, 
    ihc_table_subset))
ihc_xcr_cluster_table_filtered <- subset(ihc_xcr_cluster_table, !is.na(cluster) & 
    cluster != "N-TIL")

get_lm_result <- function(var = "tcr_shannon_entropy", random_effects = NULL) {
    if (is.null(random_effects)) {
        mod <- lm(as.formula(paste0(var, " ~ T_CD8_density + T_CD4_density + T_CD20_density + T_Plasma_density + cluster")), 
            data = ihc_xcr_cluster_table_filtered)
    } else {
        mod <- lmer(as.formula(paste0(var, " ~ T_CD8_density + T_CD4_density + T_CD20_density + T_Plasma_density + cluster + ", 
            random_effects)), data = ihc_xcr_cluster_table_filtered)
    }
    return(mod)
}

vars <- c("tcr_shannon_entropy", "tcr_clonotypes_unique", "bcr_shannon_entropy", 
    "bcr_clonotypes_unique")

In a linear model without any random effects:

lm_res <- lapply(vars, function(x) get_lm_result(x))
lm_res_summaries <- lapply(lm_res, summary)
names(lm_res_summaries) <- vars
lm_res_summaries
$tcr_shannon_entropy

Call:
lm(formula = as.formula(paste0(var, " ~ T_CD8_density + T_CD4_density + T_CD20_density + T_Plasma_density + cluster")), 
    data = ihc_xcr_cluster_table_filtered)

Residuals:
    Min      1Q  Median      3Q     Max 
-399.59 -133.20   -0.17   84.19  617.52 

Coefficients:
                  Estimate Std. Error t value Pr(>|t|)    
(Intercept)       362.7619    92.1328   3.937 0.000474 ***
T_CD8_density       0.1778     0.2916   0.610 0.546748    
T_CD4_density       2.0635     0.8220   2.510 0.017891 *  
T_CD20_density      3.7129     1.9956   1.861 0.072968 .  
T_Plasma_density   -3.2347     1.4720  -2.198 0.036120 *  
clusterES-TIL    -275.3710    91.9434  -2.995 0.005568 ** 
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 211.8 on 29 degrees of freedom
Multiple R-squared:  0.4016,    Adjusted R-squared:  0.2984 
F-statistic: 3.893 on 5 and 29 DF,  p-value: 0.008036


$tcr_clonotypes_unique

Call:
lm(formula = as.formula(paste0(var, " ~ T_CD8_density + T_CD4_density + T_CD20_density + T_Plasma_density + cluster")), 
    data = ihc_xcr_cluster_table_filtered)

Residuals:
    Min      1Q  Median      3Q     Max 
-572.83 -260.80  -11.26  199.30  997.70 

Coefficients:
                  Estimate Std. Error t value Pr(>|t|)   
(Intercept)       618.8036   173.7924   3.561   0.0013 **
T_CD8_density       0.9359     0.5500   1.702   0.0995 . 
T_CD4_density       3.8569     1.5505   2.487   0.0189 * 
T_CD20_density      6.1439     3.7643   1.632   0.1135   
T_Plasma_density   -5.4491     2.7766  -1.963   0.0594 . 
clusterES-TIL    -477.2909   173.4352  -2.752   0.0101 * 
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 399.5 on 29 degrees of freedom
Multiple R-squared:  0.358, Adjusted R-squared:  0.2473 
F-statistic: 3.234 on 5 and 29 DF,  p-value: 0.01929


$bcr_shannon_entropy

Call:
lm(formula = as.formula(paste0(var, " ~ T_CD8_density + T_CD4_density + T_CD20_density + T_Plasma_density + cluster")), 
    data = ihc_xcr_cluster_table_filtered)

Residuals:
    Min      1Q  Median      3Q     Max 
-390.67 -248.96  -91.31   40.16 1465.92 

Coefficients:
                 Estimate Std. Error t value Pr(>|t|)
(Intercept)      314.3465   194.8001   1.614    0.117
T_CD8_density     -0.2258     0.6165  -0.366    0.717
T_CD4_density     -2.2107     1.7380  -1.272    0.213
T_CD20_density     0.1582     4.2193   0.037    0.970
T_Plasma_density   0.1241     3.1122   0.040    0.968
clusterES-TIL    239.8725   194.3997   1.234    0.227

Residual standard error: 447.8 on 29 degrees of freedom
Multiple R-squared:  0.1212,    Adjusted R-squared:  -0.03034 
F-statistic: 0.7997 on 5 and 29 DF,  p-value: 0.559


$bcr_clonotypes_unique

Call:
lm(formula = as.formula(paste0(var, " ~ T_CD8_density + T_CD4_density + T_CD20_density + T_Plasma_density + cluster")), 
    data = ihc_xcr_cluster_table_filtered)

Residuals:
    Min      1Q  Median      3Q     Max 
-1317.7  -740.0   -81.1   346.1  3869.7 

Coefficients:
                   Estimate Std. Error t value Pr(>|t|)    
(Intercept)      2130.99076  520.89394   4.091 0.000312 ***
T_CD8_density      -0.07509    1.64851  -0.046 0.963981    
T_CD4_density      -4.14022    4.64727  -0.891 0.380319    
T_CD20_density      6.69066   11.28235   0.593 0.557764    
T_Plasma_density   -6.54300    8.32212  -0.786 0.438117    
clusterES-TIL    -292.44442  519.82317  -0.563 0.578041    
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 1197 on 29 degrees of freedom
Multiple R-squared:  0.08741,   Adjusted R-squared:  -0.06993 
F-statistic: 0.5555 on 5 and 29 DF,  p-value: 0.7329

In a linear model with patient as a random effect:

lm_res <- lapply(vars, function(x) get_lm_result(x, random_effects = "(1|patient_id)"))
lm_res_summaries <- lapply(lm_res, summary)
names(lm_res_summaries) <- vars
lm_res_summaries
$tcr_shannon_entropy
Linear mixed model fit by REML t-tests use Satterthwaite approximations
  to degrees of freedom [lmerMod]
Formula: 
tcr_shannon_entropy ~ T_CD8_density + T_CD4_density + T_CD20_density +  
    T_Plasma_density + cluster + (1 | patient_id)
   Data: ihc_xcr_cluster_table_filtered

REML criterion at convergence: 443.5

Scaled residuals: 
     Min       1Q   Median       3Q      Max 
-1.63619 -0.60722  0.08228  0.42727  2.85964 

Random effects:
 Groups     Name        Variance Std.Dev.
 patient_id (Intercept)  5454     73.85  
 Residual               40383    200.96  
Number of obs: 35, groups:  patient_id, 14

Fixed effects:
                  Estimate Std. Error        df t value Pr(>|t|)    
(Intercept)       349.1769    93.4229   27.1810   3.738 0.000875 ***
T_CD8_density       0.2091     0.2980   26.4730   0.702 0.489074    
T_CD4_density       2.0257     0.8418   25.4810   2.406 0.023681 *  
T_CD20_density      4.1567     2.0456   24.9620   2.032 0.052922 .  
T_Plasma_density   -3.2183     1.4873   28.1860  -2.164 0.039095 *  
clusterES-TIL    -270.9569    94.6134   23.6310  -2.864 0.008635 ** 
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Correlation of Fixed Effects:
            (Intr) T_CD8_ T_CD4_ T_CD20 T_Pls_
T_CD8_dnsty  0.018                            
T_CD4_dnsty -0.483 -0.056                     
T_CD20_dnst  0.109  0.475 -0.268              
T_Plsm_dnst -0.333 -0.748  0.004 -0.645       
clstrES-TIL -0.486 -0.320 -0.261 -0.095  0.484

$tcr_clonotypes_unique
Linear mixed model fit by REML t-tests use Satterthwaite approximations
  to degrees of freedom [lmerMod]
Formula: 
tcr_clonotypes_unique ~ T_CD8_density + T_CD4_density + T_CD20_density +  
    T_Plasma_density + cluster + (1 | patient_id)
   Data: ihc_xcr_cluster_table_filtered

REML criterion at convergence: 480.4

Scaled residuals: 
     Min       1Q   Median       3Q      Max 
-1.47738 -0.63967 -0.04096  0.50804  2.40637 

Random effects:
 Groups     Name        Variance Std.Dev.
 patient_id (Intercept)   9071    95.24  
 Residual               151915   389.76  
Number of obs: 35, groups:  patient_id, 14

Fixed effects:
                  Estimate Std. Error        df t value Pr(>|t|)   
(Intercept)       607.9392   175.1537   27.3080   3.471  0.00174 **
T_CD8_density       0.9648     0.5571   25.6680   1.732  0.09534 . 
T_CD4_density       3.8549     1.5715   25.1650   2.453  0.02143 * 
T_CD20_density      6.4703     3.8159   24.9590   1.696  0.10240   
T_Plasma_density   -5.4571     2.7947   27.8740  -1.953  0.06097 . 
clusterES-TIL    -482.6953   176.1027   23.9530  -2.741  0.01139 * 
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Correlation of Fixed Effects:
            (Intr) T_CD8_ T_CD4_ T_CD20 T_Pls_
T_CD8_dnsty  0.034                            
T_CD4_dnsty -0.489 -0.056                     
T_CD20_dnst  0.095  0.475 -0.259              
T_Plsm_dnst -0.340 -0.757 -0.004 -0.630       
clstrES-TIL -0.509 -0.345 -0.237 -0.098  0.508

$bcr_shannon_entropy
Linear mixed model fit by REML t-tests use Satterthwaite approximations
  to degrees of freedom [lmerMod]
Formula: 
bcr_shannon_entropy ~ T_CD8_density + T_CD4_density + T_CD20_density +  
    T_Plasma_density + cluster + (1 | patient_id)
   Data: ihc_xcr_cluster_table_filtered

REML criterion at convergence: 452.9

Scaled residuals: 
     Min       1Q   Median       3Q      Max 
-2.71224 -0.12789 -0.03281  0.11130  2.43026 

Random effects:
 Groups     Name        Variance Std.Dev.
 patient_id (Intercept) 160588   400.7   
 Residual                18893   137.5   
Number of obs: 35, groups:  patient_id, 14

Fixed effects:
                 Estimate Std. Error       df t value Pr(>|t|)
(Intercept)      190.9305   132.8360  22.2040   1.437    0.165
T_CD8_density     -0.1104     0.2796  19.2220  -0.395    0.697
T_CD4_density      0.1074     0.8374  20.2040   0.128    0.899
T_CD20_density    -0.7765     2.1534  21.3180  -0.361    0.722
T_Plasma_density   0.6888     1.4028  19.7380   0.491    0.629
clusterES-TIL     78.4135    97.3060  20.2440   0.806    0.430

Correlation of Fixed Effects:
            (Intr) T_CD8_ T_CD4_ T_CD20 T_Pls_
T_CD8_dnsty -0.103                            
T_CD4_dnsty -0.305  0.028                     
T_CD20_dnst  0.180  0.397 -0.395              
T_Plsm_dnst -0.196 -0.652  0.090 -0.758       
clstrES-TIL -0.212 -0.153 -0.429 -0.073  0.310

$bcr_clonotypes_unique
Linear mixed model fit by REML t-tests use Satterthwaite approximations
  to degrees of freedom [lmerMod]
Formula: 
bcr_clonotypes_unique ~ T_CD8_density + T_CD4_density + T_CD20_density +  
    T_Plasma_density + cluster + (1 | patient_id)
   Data: ihc_xcr_cluster_table_filtered

REML criterion at convergence: 523

Scaled residuals: 
     Min       1Q   Median       3Q      Max 
-2.28387 -0.26752 -0.04838  0.21259  2.79887 

Random effects:
 Groups     Name        Variance Std.Dev.
 patient_id (Intercept) 1236760  1112.1  
 Residual                272049   521.6  
Number of obs: 35, groups:  patient_id, 14

Fixed effects:
                  Estimate Std. Error        df t value Pr(>|t|)    
(Intercept)      1894.9573   415.6618   25.1950   4.559 0.000115 ***
T_CD8_density      -0.5746     1.0327   21.5620  -0.556 0.583707    
T_CD4_density       0.6400     3.0640   23.0430   0.209 0.836379    
T_CD20_density      7.1545     7.7956   24.6540   0.918 0.367637    
T_Plasma_density   -2.9706     5.1569   22.2680  -0.576 0.570359    
clusterES-TIL    -701.4705   355.6819   23.2780  -1.972 0.060583 .  
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Correlation of Fixed Effects:
            (Intr) T_CD8_ T_CD4_ T_CD20 T_Pls_
T_CD8_dnsty -0.109                            
T_CD4_dnsty -0.356  0.017                     
T_CD20_dnst  0.196  0.410 -0.377              
T_Plsm_dnst -0.229 -0.662  0.075 -0.749       
clstrES-TIL -0.256 -0.167 -0.422 -0.074  0.324

Regardless of whether patient is accounted for as a random effect, ES-TIL samples have less TCR diversity (unique clonotype count and entropy) than S-TIL samples, controlling for total CD8, CD4, CD20, and Plasma cell density.

Summary

Therefore, it appears to remain that TCR/BCR diversity is highest in ES-TIL samples, even when using diversity indices that estimate the number of missing clonotypes. While this is not significant, there is a trend.

Hopefully this is answered adequately. Thoughts?

LS0tCnRpdGxlOiAiVElMIGNsdXN0ZXJzOiBYQ1IgZGl2ZXJzaXR5IHN0YXRpc3RpY3MiCi0tLQogICAgICAgICAgICAgICAgICAgICAgICBgYGB7ciwgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KCiMjIyMjIyMjIFNuYWtlbWFrZSBoZWFkZXIgIyMjIyMjIyMKbGlicmFyeShtZXRob2RzKQpTbmFrZW1ha2UgPC0gc2V0Q2xhc3MoCiAgICAiU25ha2VtYWtlIiwKICAgIHNsb3RzID0gYygKICAgICAgICBpbnB1dCA9ICJsaXN0IiwKICAgICAgICBvdXRwdXQgPSAibGlzdCIsCiAgICAgICAgcGFyYW1zID0gImxpc3QiLAogICAgICAgIHdpbGRjYXJkcyA9ICJsaXN0IiwKICAgICAgICB0aHJlYWRzID0gIm51bWVyaWMiLAogICAgICAgIGxvZyA9ICJsaXN0IiwKICAgICAgICByZXNvdXJjZXMgPSAibGlzdCIsCiAgICAgICAgY29uZmlnID0gImxpc3QiLAogICAgICAgIHJ1bGUgPSAiY2hhcmFjdGVyIgogICAgKQopCnNuYWtlbWFrZSA8LSBTbmFrZW1ha2UoCiAgICBpbnB1dCA9IGxpc3QoJy9zaGFobGFiL2FsemhhbmcvcHJvamVjdHMvSVRIX0ltbXVuZS9wYXBlci9yZXN1bHRzL3RhYmxlcy9ydW4yL2loY190YWJsZS50c3YnLCAnL3NoYWhsYWIvYWx6aGFuZy9waXBlbGluZV9vdXRwdXRzL2l0aF9pbW11bmUvbWl4Y3IvbWl4Y3JfcnVucy9pdGhfMV8yXzMvbWl4Y3I1L3Bvc3Rwcm9jZXNzL0lHSC9wb3N0ZmlsdGVyX2RpdmVyc2l0eV9zdGF0cy9kaXZlcnNpdHkuc3RyaWN0LnJlc2FtcGxlZC50eHQnLCAnbm90ZWJvb2tzL3RpbGNsdXN0ZXJfeGNyZGl2ZXJzaXR5LlJtZCcsICcvc2hhaGxhYi9hbHpoYW5nL3Byb2plY3RzL0lUSF9JbW11bmUvcGFwZXIvcmVzdWx0cy90YWJsZXMvcnVuMi9tb2xzdWJ0eXBlcy50c3YnLCAnL3NoYWhsYWIvYWx6aGFuZy9waXBlbGluZV9vdXRwdXRzL2l0aF9pbW11bmUvbWl4Y3IvbWl4Y3JfcnVucy9pdGhfMV8yXzMvbWl4Y3I1L3Bvc3Rwcm9jZXNzL1RSQi9wb3N0ZmlsdGVyX2RpdmVyc2l0eV9zdGF0cy9kaXZlcnNpdHkuc3RyaWN0LnJlc2FtcGxlZC50eHQnLCAnL3NoYWhsYWIvYWx6aGFuZy9wcm9qZWN0cy9JVEhfSW1tdW5lL3BhcGVyL3Jlc3VsdHMvdGFibGVzL3J1bjIveGNyX3RhYmxlLnRzdicsICJpaGNfdGFibGUiID0gJy9zaGFobGFiL2FsemhhbmcvcHJvamVjdHMvSVRIX0ltbXVuZS9wYXBlci9yZXN1bHRzL3RhYmxlcy9ydW4yL2loY190YWJsZS50c3YnLCAiYmNyX2RpdmVyc2l0eSIgPSAnL3NoYWhsYWIvYWx6aGFuZy9waXBlbGluZV9vdXRwdXRzL2l0aF9pbW11bmUvbWl4Y3IvbWl4Y3JfcnVucy9pdGhfMV8yXzMvbWl4Y3I1L3Bvc3Rwcm9jZXNzL0lHSC9wb3N0ZmlsdGVyX2RpdmVyc2l0eV9zdGF0cy9kaXZlcnNpdHkuc3RyaWN0LnJlc2FtcGxlZC50eHQnLCAibm90ZWJvb2siID0gJ25vdGVib29rcy90aWxjbHVzdGVyX3hjcmRpdmVyc2l0eS5SbWQnLCAibW9sc3VidHlwZXMiID0gJy9zaGFobGFiL2FsemhhbmcvcHJvamVjdHMvSVRIX0ltbXVuZS9wYXBlci9yZXN1bHRzL3RhYmxlcy9ydW4yL21vbHN1YnR5cGVzLnRzdicsICJ0Y3JfZGl2ZXJzaXR5IiA9ICcvc2hhaGxhYi9hbHpoYW5nL3BpcGVsaW5lX291dHB1dHMvaXRoX2ltbXVuZS9taXhjci9taXhjcl9ydW5zL2l0aF8xXzJfMy9taXhjcjUvcG9zdHByb2Nlc3MvVFJCL3Bvc3RmaWx0ZXJfZGl2ZXJzaXR5X3N0YXRzL2RpdmVyc2l0eS5zdHJpY3QucmVzYW1wbGVkLnR4dCcsICJ4Y3JfdGFibGUiID0gJy9zaGFobGFiL2FsemhhbmcvcHJvamVjdHMvSVRIX0ltbXVuZS9wYXBlci9yZXN1bHRzL3RhYmxlcy9ydW4yL3hjcl90YWJsZS50c3YnKSwKICAgIG91dHB1dCA9IGxpc3QoJy9zaGFobGFiL2FsemhhbmcvcHJvamVjdHMvSVRIX0ltbXVuZS9wYXBlci9yZXN1bHRzL3Jldmlldy9ub3RlYm9va3MvcnVuMi90aWxjbHVzdGVyX3hjcmRpdmVyc2l0eS5uYi5odG1sJyksCiAgICBwYXJhbXMgPSBsaXN0KGMoJ1RfQ0Q4X2RlbnNpdHknLCAnVF9DRDRfZGVuc2l0eScsICdUX0NEMjBfZGVuc2l0eScsICdUX1BsYXNtYV9kZW5zaXR5JywgJ0VfQ0Q4X2RlbnNpdHknLCAnRV9DRDRfZGVuc2l0eScsICdFX0NEMjBfZGVuc2l0eScsICdFX1BsYXNtYV9kZW5zaXR5JywgJ1NfQ0Q4X2RlbnNpdHknLCAnU19DRDRfZGVuc2l0eScsICdTX0NEMjBfZGVuc2l0eScsICdTX1BsYXNtYV9kZW5zaXR5JyksIGMoJ1RfQ0Q4X2RlbnNpdHknLCAnVF9DRDRfZGVuc2l0eScsICdUX0NEMjBfZGVuc2l0eScsICdUX1BsYXNtYV9kZW5zaXR5JyksICd0aWxjbHVzdGVyX3hjcmRpdmVyc2l0eV9hbmFseXNpcycsIGMoJ0VfQ0Q4X2RlbnNpdHknLCAnRV9DRDRfZGVuc2l0eScsICdFX0NEMjBfZGVuc2l0eScsICdFX1BsYXNtYV9kZW5zaXR5JywgJ1NfQ0Q4X2RlbnNpdHknLCAnU19DRDRfZGVuc2l0eScsICdTX0NEMjBfZGVuc2l0eScsICdTX1BsYXNtYV9kZW5zaXR5JyksICcvc2hhaGxhYi9hbHpoYW5nL3Byb2plY3RzL0lUSF9JbW11bmUvbWV0YWRhdGEvZGIvaW1tdW5lX3Byb2plY3Quc3FsaXRlMycsICJhbGxfdGlsdHlwZXMiID0gYygnVF9DRDhfZGVuc2l0eScsICdUX0NENF9kZW5zaXR5JywgJ1RfQ0QyMF9kZW5zaXR5JywgJ1RfUGxhc21hX2RlbnNpdHknLCAnRV9DRDhfZGVuc2l0eScsICdFX0NENF9kZW5zaXR5JywgJ0VfQ0QyMF9kZW5zaXR5JywgJ0VfUGxhc21hX2RlbnNpdHknLCAnU19DRDhfZGVuc2l0eScsICdTX0NENF9kZW5zaXR5JywgJ1NfQ0QyMF9kZW5zaXR5JywgJ1NfUGxhc21hX2RlbnNpdHknKSwgInRvdGFsX3RpbHR5cGVzIiA9IGMoJ1RfQ0Q4X2RlbnNpdHknLCAnVF9DRDRfZGVuc2l0eScsICdUX0NEMjBfZGVuc2l0eScsICdUX1BsYXNtYV9kZW5zaXR5JyksICJuYW1lIiA9ICd0aWxjbHVzdGVyX3hjcmRpdmVyc2l0eV9hbmFseXNpcycsICJkYiIgPSAnL3NoYWhsYWIvYWx6aGFuZy9wcm9qZWN0cy9JVEhfSW1tdW5lL21ldGFkYXRhL2RiL2ltbXVuZV9wcm9qZWN0LnNxbGl0ZTMnLCAidGlsc19mb3JfY2x1c3RlciIgPSBjKCdFX0NEOF9kZW5zaXR5JywgJ0VfQ0Q0X2RlbnNpdHknLCAnRV9DRDIwX2RlbnNpdHknLCAnRV9QbGFzbWFfZGVuc2l0eScsICdTX0NEOF9kZW5zaXR5JywgJ1NfQ0Q0X2RlbnNpdHknLCAnU19DRDIwX2RlbnNpdHknLCAnU19QbGFzbWFfZGVuc2l0eScpKSwKICAgIHdpbGRjYXJkcyA9IGxpc3QoKSwKICAgIHRocmVhZHMgPSAxLAogICAgbG9nID0gbGlzdCgnL3NoYWhsYWIvYWx6aGFuZy9jbHVzdHRtcC9wYXBlcnJldmlldzIvbm90ZWJvb2tzL3RpbGNsdXN0ZXJfeGNyZGl2ZXJzaXR5X2FuYWx5c2lzLmxvZycpLAogICAgcmVzb3VyY2VzID0gbGlzdCgpLAogICAgY29uZmlnID0gbGlzdCgidmFyaWFiaWxpdHlfdHlwZSIgPSAnc3RhYmlsaXplJywgInRvdGFsX3RpbHR5cGVzIiA9IGMoJ1RfQ0Q4X2RlbnNpdHknLCAnVF9DRDRfZGVuc2l0eScsICdUX0NEMjBfZGVuc2l0eScsICdUX1BsYXNtYV9kZW5zaXR5JyksICJpaGNfZmVhdHVyZXNfb3V0cHV0IiA9ICcvc2hhaGxhYi9hbHpoYW5nL3Byb2plY3RzL0lUSF9JbW11bmUvcGFwZXIvcmVzdWx0cy9pbnRlcm1lZGlhdGVzL3J1bjIvaWhjX2ZlYXR1cmVzX291dHB1dC50eHQnLCAibmFub3N0cmluZ19hbm5vdGF0aW9ucyIgPSAnL3NoYWhsYWIvYWx6aGFuZy9wcm9qZWN0cy9JVEhfSW1tdW5lL2RhdGEvZXhwcmVzc2lvbi9uYW5vc3RyaW5nL3BhbmNhbmNlcl9hbm5vdGF0aW9ucy50c3YnLCAicmVmc2VxX2dlbmVfZmlsZSIgPSAnL3NoYWhsYWIvYWx6aGFuZy9kYXRhL2dlbm9tZS9oZzE5L3JlZnNlcV9nZW5lcy5iZWQnLCAiYnJlYWtwb2ludF90YWJsZSIgPSAnL3NoYWhsYWIvYW1jcGhlcnNvbi9wcm9qZWN0cy9pdGgzL2l0aDMvbm90ZWJvb2tzL2Jlc3Bva2UvaXRoX2JyZWFrcG9pbnRzLnRzdicsICJ4Y3JfdGFibGUiID0gJy9zaGFobGFiL2FsemhhbmcvcHJvamVjdHMvSVRIX0ltbXVuZS9wYXBlci9yZXN1bHRzL3RhYmxlcy9ydW4yL3hjcl90YWJsZS50c3YnLCAiaWhjX3RhYmxlIiA9ICcvc2hhaGxhYi9hbHpoYW5nL3Byb2plY3RzL0lUSF9JbW11bmUvcGFwZXIvcmVzdWx0cy90YWJsZXMvcnVuMi9paGNfdGFibGUudHN2JywgImNvcHludW1iZXJfdGFibGUiID0gJy9zaGFobGFiL2FsemhhbmcvZGF0YS9pdGhpL21hc3Rlcl9jb3B5bnVtYmVyX2ZpbGUudHN2JywgImltYWdlX3N1bW1hcnkyIiA9ICcvc2hhaGxhYi9hbHpoYW5nL2RhdGEvaXRoaS95dWFuX2hlY3JfaW1hZ2VfcmVzdWx0c18yLmNzdicsICJmaW5uaGVfcGlwZWxpbmVfcmVzdWx0c19kaXIiID0gJy9zaGFobGFiL2FsemhhbmcvcGlwZWxpbmVfb3V0cHV0cy9pdGhfaW1tdW5lL2Zpbm5oZS9ydW4xJywgIml0aF9pY2djX2JjIiA9ICcvc2hhaGxhYi9hbHpoYW5nL3Byb2plY3RzL0lUSF9JbW11bmUvcGFwZXIvcmVzdWx0cy90YWJsZXMvcnVuMi9pdGhfaWNnY19tZXJnZWRfYmMudHN2JywgImNsb2xhX3Jlc3VsdF9maWxlIiA9ICcvc2hhaGxhYi9hbHpoYW5nL3BpcGVsaW5lX291dHB1dHMvaXRoX2ltbXVuZS9jbG9sYS9ydW40L2Nsb2xhX2NvbmRlbnNlZF9yZXN1bHRzL2JldGEvY2xvbGFfcmVzdWx0cy50c3YnLCAiYWxsX3RpbHR5cGVzIiA9IGMoJ1RfQ0Q4X2RlbnNpdHknLCAnVF9DRDRfZGVuc2l0eScsICdUX0NEMjBfZGVuc2l0eScsICdUX1BsYXNtYV9kZW5zaXR5JywgJ0VfQ0Q4X2RlbnNpdHknLCAnRV9DRDRfZGVuc2l0eScsICdFX0NEMjBfZGVuc2l0eScsICdFX1BsYXNtYV9kZW5zaXR5JywgJ1NfQ0Q4X2RlbnNpdHknLCAnU19DRDRfZGVuc2l0eScsICdTX0NEMjBfZGVuc2l0eScsICdTX1BsYXNtYV9kZW5zaXR5JyksICJpdGhfc3RhdHMiID0gJy9zaGFobGFiL2FsemhhbmcvcHJvamVjdHMvSVRIX0ltbXVuZS9wYXBlci9yZXN1bHRzL3RhYmxlcy9ydW4yL2l0aF9zdGF0aXN0aWNzLnRzdicsICJtb2xzdWJ0eXBlcyIgPSAnL3NoYWhsYWIvYWx6aGFuZy9wcm9qZWN0cy9JVEhfSW1tdW5lL3BhcGVyL3Jlc3VsdHMvdGFibGVzL3J1bjIvbW9sc3VidHlwZXMudHN2JywgImRpc3RhbmNlX21ldGhvZCIgPSAnaG9ybicsICJpY2djX3NwZWNpbWVuIiA9ICcvc2hhaGxhYi9hbHpoYW5nL2RhdGEvSUNHQy9zcGVjaW1lbi50c3YnLCAiaXRoX3N0YXRfdHlwZXMiID0gYygnZW50cm9weScsICdwb3N0cHJvY2Vzc2VkX2RpdmVyZ2VuY2UnLCAnY29tYmluZWRfaXRoX25vcm1hbGl6ZWQnLCAncHJvcG9ydGlvbl9zdWJjbG9uYWwnKSwgImxvZ2RpciIgPSAnL3NoYWhsYWIvYWx6aGFuZy9jbHVzdHRtcC9wYXBlcnJldmlldzInLCAibm90ZWJvb2tfZGlyIiA9ICcvc2hhaGxhYi9hbHpoYW5nL3Byb2plY3RzL0lUSF9JbW11bmUvcGFwZXIvcmVzdWx0cy9yZXZpZXcvbm90ZWJvb2tzL3J1bjInLCAidGlsc19mb3JfY2x1c3RlciIgPSBjKCdFX0NEOF9kZW5zaXR5JywgJ0VfQ0Q0X2RlbnNpdHknLCAnRV9DRDIwX2RlbnNpdHknLCAnRV9QbGFzbWFfZGVuc2l0eScsICdTX0NEOF9kZW5zaXR5JywgJ1NfQ0Q0X2RlbnNpdHknLCAnU19DRDIwX2RlbnNpdHknLCAnU19QbGFzbWFfZGVuc2l0eScpLCAiZXBpdG9wZXNfdW5pcXVlX2ZpbHRlcmVkIiA9ICcvc2hhaGxhYi9hbHpoYW5nL3Byb2plY3RzL0lUSF9JbW11bmUvcGFwZXIvcmVzdWx0cy90YWJsZXMvcnVuMi9lcGl0b3Blc191bmlxdWVfZmlsdGVyZWQudHN2JywgImJlbmNobWFya2RpciIgPSAnL3NoYWhsYWIvYWx6aGFuZy9iZW5jaG1hcmtzL3BhcGVycmV2aWV3MicsICJ0aWxzX2Zvcl92YXJpYWJpbGl0eSIgPSBjKCdUX0NEOF9kZW5zaXR5JywgJ1RfQ0Q0X2RlbnNpdHknLCAnVF9DRDIwX2RlbnNpdHknLCAnVF9QbGFzbWFfZGVuc2l0eScpLCAiY2xvbmVfdHJlZXMiID0gJy9zaGFobGFiL2FsemhhbmcvcHJvamVjdHMvSVRIX0ltbXVuZS9wYXBlci9yZXN1bHRzL3RhYmxlcy9ydW4yL2Nsb25lcy90cmVlX2RhdGEudHN2JywgInRpbF9jbHVzdGVyc19vdXRwdXQiID0gJy9zaGFobGFiL2FsemhhbmcvcHJvamVjdHMvSVRIX0ltbXVuZS9wYXBlci9yZXN1bHRzL2ludGVybWVkaWF0ZXMvcnVuMi90aWxfY2x1c3RlcnNfb3V0cHV0LnR4dCcsICJ0Y3JfZGl2ZXJzaXR5IiA9ICcvc2hhaGxhYi9hbHpoYW5nL3BpcGVsaW5lX291dHB1dHMvaXRoX2ltbXVuZS9taXhjci9taXhjcl9ydW5zL2l0aF8xXzJfMy9taXhjcjUvcG9zdHByb2Nlc3MvVFJCL3Bvc3RmaWx0ZXJfZGl2ZXJzaXR5X3N0YXRzL2RpdmVyc2l0eS5zdHJpY3QucmVzYW1wbGVkLnR4dCcsICJ0dW1vdXJfcHVyaXR5IiA9ICcvc2hhaGxhYi9hbHpoYW5nL3Byb2plY3RzL0lUSF9JbW11bmUvcGFwZXIvcmVzdWx0cy90YWJsZXMvcnVuMi90dW1vdXJfcHVyaXR5LnRzdicsICJ0aWxjbHVzdGVyX3N1cGVydmlzZWRfaXB5bmIiID0gJy9zaGFobGFiL2FsemhhbmcvcHJvamVjdHMvSVRIX0ltbXVuZS9wYXBlci9yZXZpZXcvaXB5L3RpbGNsdXN0ZXJfc3VwZXJ2aXNlZG11bHRpY2xhc3MuaXB5bmInLCAibW1jdG1fZmluYWxfcGF0aWVudF9kaXIiID0gJy9zaGFobGFiL2FsemhhbmcvcHJvamVjdHMvSVRIX0ltbXVuZS9yZXN1bHRzL21tY3RtX3Jlc3VsdHMvaXRoX2J5LXBhdGllbnRfd2l0aC1vdicsICJiY3JfZGl2ZXJzaXR5IiA9ICcvc2hhaGxhYi9hbHpoYW5nL3BpcGVsaW5lX291dHB1dHMvaXRoX2ltbXVuZS9taXhjci9taXhjcl9ydW5zL2l0aF8xXzJfMy9taXhjcjUvcG9zdHByb2Nlc3MvSUdIL3Bvc3RmaWx0ZXJfZGl2ZXJzaXR5X3N0YXRzL2RpdmVyc2l0eS5zdHJpY3QucmVzYW1wbGVkLnR4dCcsICJhcnJheV9leHByZXNzaW9uX2ZpbGUiID0gJy9zaGFobGFiL2FsemhhbmcvcHJvamVjdHMvSVRIX0ltbXVuZS9kYXRhL2V4cHJlc3Npb24vYXJyYXkvZ2VuZV9leHByc19ybWFfYmF0Y2hfY29ycmVjdGVkLnR4dCcsICJjbG9uZV9icmFuY2hfbGVuZ3RocyIgPSAnL3NoYWhsYWIvYWx6aGFuZy9wcm9qZWN0cy9JVEhfSW1tdW5lL3BhcGVyL3Jlc3VsdHMvdGFibGVzL3J1bjIvY2xvbmVzL2JyYW5jaF9kYXRhLnRzdicsICJuZW9lZGl0aW5nX291dGRpciIgPSAnL3NoYWhsYWIvYWx6aGFuZy9waXBlbGluZV9vdXRwdXRzL2l0aF9pbW11bmUvbmVvZWRpdGluZy9ydW42JywgImltYWdlX3N1bW1hcnkiID0gJy9zaGFobGFiL2FsemhhbmcvZGF0YS9pdGhpL3l1YW5faGVjcl9pbWFnZV9yZXN1bHRzLmNzdicsICJyZW1peHRfY2VsbHVsYXJpdHlfcGxvaWR5IiA9ICcvc2hhaGxhYi9hbHpoYW5nL3Byb2plY3RzL0lUSF9JbW11bmUvcGFwZXIvcmVzdWx0cy90YWJsZXMvcnVuMi9yZW1peHRfY2VsbHVsYXJpdHlfcGxvaWR5LnRzdicsICJrbm93bl9zdWJ0eXBlc19hcnJheSIgPSAnL3NoYWhsYWIvYWx6aGFuZy9wcm9qZWN0cy9JVEhfSW1tdW5lL2RhdGEvZXhwcmVzc2lvbi9hcnJheS9zdWJ0eXBlcy9rbm93bl9zdWJ0eXBlcy50c3YnLCAicGF0aWVudHNfZm9yX2Nsb25hbCIgPSBjKDEsIDIsIDMsIDQsIDcsIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTUsIDE2LCAxNyksICJoZV9yZXN1bHRzX2RpciIgPSAnL3NoYWhsYWIvYWx6aGFuZy9kYXRhL2l0aGkvZmlubl9yZXN1bHRzL2hlX291dHB1dF9Ob3YyOScsICJjbG9uZV9wcmV2YWxlbmNlcyIgPSAnL3NoYWhsYWIvYWx6aGFuZy9wcm9qZWN0cy9JVEhfSW1tdW5lL3BhcGVyL3Jlc3VsdHMvdGFibGVzL3J1bjIvY2xvbmVzL2Nsb25lX2RhdGEudHN2JywgImljZ2Nfc3VidHlwZXMiID0gJy9zaGFobGFiL2FsemhhbmcvZGF0YS9JQ0dDL2ljZ2NfcHJpbWFyeV90dW1vdXJfc3VidHlwZXMudHN2JywgInNudl9jbHVzdGVyX2RpciIgPSAnL3NoYWhsYWIvYWx6aGFuZy9wcm9qZWN0cy9JVEhfSW1tdW5lL3BhcGVyL3Jlc3VsdHMvdGFibGVzL3J1bjIvY2xvbmVzL3Nudl9jbHVzdGVyJywgImlncGFydGl0aW9uX291dGRpciIgPSAnL3NoYWhsYWIvYWx6aGFuZy9waXBlbGluZV9vdXRwdXRzL2l0aF9pbW11bmUvaWdwYXJ0aXRpb24vcnVuMjInLCAiZGIiID0gJy9zaGFobGFiL2FsemhhbmcvcHJvamVjdHMvSVRIX0ltbXVuZS9tZXRhZGF0YS9kYi9pbW11bmVfcHJvamVjdC5zcWxpdGUzJywgIm5hbm9zdHJpbmdfZGF0YSIgPSAnL3NoYWhsYWIvYWx6aGFuZy9wcm9qZWN0cy9JVEhfSW1tdW5lL3Jlc3VsdHMvbmFub3N0cmluZ19yZXN1bHRzL2l0aF9mdWxsL3FjL2xpbW1hX3F1YW50aWxlL25vcm1hbGl6ZWRfZXhwcmVzc2lvbl92b2FfbGFiZWxzX2ZpbHRlcmVkLnRzdicsICJ0YWJsZV9kaXIiID0gJy9zaGFobGFiL2FsemhhbmcvcHJvamVjdHMvSVRIX0ltbXVuZS9wYXBlci9yZXN1bHRzL3Jldmlldy90YWJsZXMvcnVuMicsICJwcmV2YWxlbmNlX3RocmVzaG9sZCIgPSAwLjAxLCAicm9vbmV5X211dHNpZ2N2X2ZpbGUiID0gJy9zaGFobGFiL2FsemhhbmcvcHJvamVjdHMvSVRIX0ltbXVuZS9leHRlcm5hbC9vdGhlcl9wYXBlcnMvbW1jNi54bHN4JywgInNvbWF0aWNfY29kaW5nX3Jlc3VsdF9kaXIiID0gJy9zaGFobGFiL2FsemhhbmcvcHJvamVjdHMvSVRIX0ltbXVuZS9wYXBlci9yZXN1bHRzL3RhYmxlcy9ydW4yL3NvbWF0aWNfY29kaW5nX3ZhcmlhbnRzJywgInNudl90YWJsZSIgPSAnL3NoYWhsYWIvYW1jcGhlcnNvbi9wcm9qZWN0cy9pdGgzL2l0aDMvbm90ZWJvb2tzL2Jlc3Bva2UvaXRoX3NudnMudHN2JyksCiAgICBydWxlID0gJ3RpbGNsdXN0ZXJfeGNyZGl2ZXJzaXR5X2FuYWx5c2lzJwopCiMjIyMjIyMjIE9yaWdpbmFsIHNjcmlwdCAjIyMjIyMjIyMKCiAgICAgICAgICAgICAgICAgICAgICAgIGBgYAoKCiMjIFNldHVwCgpgYGB7ciBnbG9iYWxfY2h1bmtfb3B0aW9ucywgaW5jbHVkZT1GQUxTRX0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFLCB0aWR5PVRSVUUsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIGNhY2hlPVRSVUUpICNjYWNoZT1UUlVFCmBgYAoKYGBge3J9CmxpYnJhcnkoaXRoaS51dGlscykKbG9hZF9iYXNlX2xpYnMoKQoKbGlicmFyeShtZXRob2RzKQpsaWJyYXJ5KGZvcmNhdHMpCmxpYnJhcnkoZ3JpZCkKbGlicmFyeShncmlkRXh0cmEpCmxpYnJhcnkoZ3JpZEJhc2UpCgpsaWJyYXJ5KGl0aGkubWV0YSkKbGlicmFyeShpdGhpLmZpZ3VyZXMpCmxpYnJhcnkoaXRoaS51dGlscykKbGlicmFyeShpdGhpLnNlcSkKbGlicmFyeShpdGhpLnN1cHApCmxpYnJhcnkoaXRoaS54Y3IpCmBgYAoKYGBge3J9CmloY190YWJsZV9wYXRoIDwtIHNuYWtlbWFrZUBpbnB1dCRpaGNfdGFibGUKeGNyX3RhYmxlX3BhdGggPC0gc25ha2VtYWtlQGlucHV0JHhjcl90YWJsZQp0Y3JfZGl2ZXJzaXR5X2ZpbGUgPC0gc25ha2VtYWtlQGlucHV0JHRjcl9kaXZlcnNpdHkKYmNyX2RpdmVyc2l0eV9maWxlIDwtIHNuYWtlbWFrZUBpbnB1dCRiY3JfZGl2ZXJzaXR5Cm1vbGVjdWxhcl9zdWJ0eXBlX2ZpbGUgPC0gc25ha2VtYWtlQGlucHV0JG1vbHN1YnR5cGVzCgpkYl9wYXRoIDwtIHNuYWtlbWFrZUBwYXJhbXMkZGIKdG90YWxfdGlsdHlwZXMgPC0gc25ha2VtYWtlQHBhcmFtcyR0b3RhbF90aWx0eXBlcwphbGxfdGlsdHlwZXMgPC0gc25ha2VtYWtlQHBhcmFtcyRhbGxfdGlsdHlwZXMKdGlsc19mb3JfY2x1c3RlciA8LSBzbmFrZW1ha2VAcGFyYW1zJHRpbHNfZm9yX2NsdXN0ZXIKYGBgCgpgYGB7cn0KYW5ub3RhdGlvbl9jb2xvdXJzIDwtIGl0aGkuZmlndXJlczo6Z2V0X2Fubm90YXRpb25fY29sb3VycygpCgppaGNfdGFibGUgPC0gZnJlYWQoaWhjX3RhYmxlX3BhdGgpCnhjcl90YWJsZSA8LSByZWFkX2Nsb25vdHlwZXMoeGNyX3RhYmxlX3BhdGgsIGR1cGxpY2F0ZXMgPSBGQUxTRSwgZGJfcGF0aCA9IGRiX3BhdGgpCm1vbHN1YnR5cGVzIDwtIGZyZWFkKG1vbGVjdWxhcl9zdWJ0eXBlX2ZpbGUpCgp0Y3JfZGl2ZXJzaXR5IDwtIHJlYWRfeGNyX2RpdmVyc2l0eV9maWxlKHRjcl9kaXZlcnNpdHlfZmlsZSwgZGJfcGF0aCkKYmNyX2RpdmVyc2l0eSA8LSByZWFkX3hjcl9kaXZlcnNpdHlfZmlsZShiY3JfZGl2ZXJzaXR5X2ZpbGUsIGRiX3BhdGgpCnhjcl9kaXZlcnNpdHkgPC0gaXRoaS5zdXBwOjpnZXRfeGNyX2RpdmVyc2l0eSh0Y3JfZGl2ZXJzaXR5X2ZpbGUsIGJjcl9kaXZlcnNpdHlfZmlsZSwgZGJfcGF0aCwgeGNyX3RhYmxlKQoKdGlsX2NsdXN0ZXJzIDwtIGl0aGkuZmlndXJlczo6OmdldF90aWxfY2x1c3RlcnMoaWhjX3RhYmxlLCBtb2xzdWJ0eXBlcywgdGlsc19mb3JfY2x1c3RlciA9IHRpbHNfZm9yX2NsdXN0ZXIsIG5jbHVzdHMgPSAzKQpgYGAKCiMjIEFuYWx5c2lzCgpOYWl2ZWx5LCBpZiBpdCB3YXMgdHJ1ZSB0aGF0IGxlc3MgaW5maWx0cmF0ZWQgdHVtb3VycyBoYXZlIG1vcmUgVENScyB0byBiZSBzZXF1ZW5jZWQsIE4tVElMIHR1bW91cnMgc2hvdWxkIGFsc28gaGF2ZSBoaWdoZXIgVENSL0JDUiBkaXZlcnNpdHksIHdoaWNoIGlzIG5vdCB0aGUgY2FzZS4gCgpUaGlzIGlzIGEgdmFsaWQgcG9pbnQgZm9yIEVTLVRJTCB2cy4gUy1USUwuIEl0IGNvdWxkIGJlIGFyZ3VlZCB0aGF0IGhhdmluZyBtb3JlIGV4cGFuZGVkIFRJTCB0aGF0IHJlc3VsdCBpbiBtaXNzaW5nIGRldGVjdGlvbiBvZiByYXJlIFRJTCBjbG9ub3R5cGVzIGluIGhpZ2gtVElMIHNhbXBsZXMgaXMgYWN0dWFsbHkgc2lnbmFsIHRoYXQgd2UncmUgdHJ5aW5nIHRvIGNhcHR1cmUsIHRob3VnaC4gSWYgdmVyeSByYXJlIGNsb25vdHlwZXMgYXJlIHNxdWVlemVkIG91dCBiZWNhdXNlIHdlIGRvbid0IGhhdmUgZW5vdWdoIHJlYWRzLCB0aGF0IG1lYW5zIHRoYXQgdGhlIGNsb25vdHlwZXMgdGhhdCB3ZSBkbyBzZWUgYXJlIGV4cGFuZGVkIHJlbGF0aXZlIHRvIHRob3NlIC0tIGFuZCB0aGlzIHNob3VsZCBiZSBxdWFudGlmaWVkIGFzIGxlc3MgZGl2ZXJzaXR5LiBUaGlzIHdhcyB0aGUgbW90aXZhdGlvbiBiZWhpbmQgdXNpbmcgc3BlY2llcyBkaXZlcnNpdHkgbWVhc3VyZXMgbGlrZSBTaGFubm9uIGVudHJvcHkgKGluIGFkZGl0aW9uIHRvIGp1c3QgdXNpbmcgdW5pcXVlIGNsb25vdHlwZSBjb3VudCkuIAoKCldlJ2xsIGFkZHJlc3MgdGhpcyAyIHdheXM6CgoqIFVzaW5nIGRpdmVyc2l0eSBtZWFzdXJlcyAoZS5nLiBDaGFvMSwgRWZyb24tVGhpc3RlZCkgdGhhdCBleHRyYXBvbGF0ZSB0aGUgbnVtYmVyIG9mICdtaXNzaW5nJyBjbG9ub3R5cGVzIGluIGEgc2FtcGxlCiogSW5jb3Jwb3JhdGluZyBUSUwgZGVuc2l0eSBjb3ZhcmlhdGVzIGludG8gYSBsaW5lYXIgbW9kZWwgb2YgVElMIGNsdXN0ZXIgdnMuIFRDUi9CQ1IgZGl2ZXJzaXR5CgpJZiB0aGUgcmVhc29uIGJlaGluZCBvdXIgZmluZGluZ3MgaXMgdGhhdCByYXJlIFRDUnMgYXJlIG1pc3NlZCwgdGhlIGZpcnN0IHBvaW50IHNob3VsZCByZXZlYWwgbm8gZGlmZmVyZW5jZXMgYmV0d2VlbiBTLVRJTCBhbmQgRVMtVElMIHBvcHVsYXRpb25zLiAKCk1vcmUgYnJvYWRseSwgaWYgdGhlIGRlZ3JlZSBvZiBpbmZpbHRyYXRpb24gY29uZm91bmRzIHRoZXNlIFRDUi9CQ1IgZGl2ZXJzaXR5IGZvciBzb21lIG90aGVyIHJlYXNvbiwgdGhlIHNlY29uZCBwb2ludCBzaG91bGQgYWRkcmVzcyB0aGF0LiBOb3RlIHRoYXQgd2UgdXNlIHRvdGFsIFRJTCBkZW5zaXRpZXMgKGFuZCBub3QgZXBpdGhlbGlhbC9zdHJvbWFsIHNwbGl0KSB3aGVuIGRvaW5nIHRoaXMsIGJlY2F1c2UgVElMIGNsdXN0ZXJzIGFyZSBkZWZpbmVkIG9uIHRoZSBiYXNpcyBvZiBlcGl0aGVsaWFsL3N0cm9tYWwgVElMIGRlbnNpdGllcy4gCgpBcyBmb3Igd2hhdCB0aGUgcG9pbnQgb2YgdGhpcyBhbmFseXNpcyBpcyAtLSBub3cgdGhhdCB3ZSd2ZSBzd2l0Y2hlZCB0aGlzIGFuYWx5c2lzIHRvIHVzaW5nIG91ciBUSUwgc3VidHlwZXMgcmF0aGVyIHRoYW4gdGhlIHRyYW5zY3JpcHRvbWljL21vbGVjdWxhciBzdWJ0eXBlcywgdGhlIHBvaW50IG9mIHRoaXMgYW5hbHlzaXMgaXMgdG8gZGVzY3JpYmUgb3RoZXIgcHJvcGVydGllcyBvZiBvdXIgc3VidHlwZXMsIGkuZS4gdGhlIHByb3BlcnRpZXMgb2YgVENSL0JDUiBkaXZlcnNpdHkuIE5haXZlbHkgb25lIG1pZ2h0IHRoaW5rIGZyb20gb3VyIGRpc2N1c3Npb24gb2YgdG90YWwgQ0Q4L0NENCBUSUwgZGVuc2l0aWVzIGJlaW5nIGNvcnJlbGF0ZWQgd2l0aCBUQ1IgZGl2ZXJzaXR5IGluIHRoZSBtYW51c2NyaXB0IChQQUdFIE5VTUJFUikgdGhhdCB0aGUgbW9zdCAnaW1tdW5lLWhvdCcgc2FtcGxlcyBzaG91bGQgaGF2ZSB0aGUgaGlnaGVzdCBUQ1IvQkNSIGRpdmVyc2l0eS4gSW4gZmFjdCwgaG93ZXZlciwgdGhpcyBhbmFseXNpcyBzaG93cyB0aGF0IGl0J3MgYWN0dWFsbHkgdGhlIFMtVElMIHNhbXBsZXMgdGhhdCBoYXZlIHRoZSBoaWdoZXN0IGRpdmVyc2l0eSwgaW1wbHlpbmcgdGhhdCB0aGUgc3Ryb21hbCBUSUwgcG9wdWxhdGlvbnMgaW4gUy1USUwgc2FtcGxlcyBtYXkgYmUgbW9yZSBjbG9uYWxseSBkaXZlcnNlIHRoYW4gdGhlIFRJTCBwb3B1bGF0aW9ucyBpbiBFUy1USUwgc2FtcGxlcy4gVGhpcyBpc24ndCBzaWduaWZpY2FudCAoaXQncyBhIHRyZW5kKSwgYnV0IHN0aWxsIHNlZW1zIGltcG9ydGFudCB0byBub3RlLiAKCiMjIyBVc2luZyBvdGhlciBkaXZlcnNpdHkgbWVhc3VyZXMKCk90aGVyIHdheXMgdG8gZ2V0IGF0IHRoaXMgcXVlc3Rpb24gaW5jbHVkZSB1c2luZyBkaXZlcnNpdHkgbWVhc3VyZXMgdGhhdCBlc3RpbWF0ZSB0aGUgcHJvcG9ydGlvbiBvZiB1bnNhbXBsZWQgY2xvbm90eXBlcyAoZS5nLiBDaGFvMTsgdGhvdWdoIHRoZSBhY2N1cmFjeSBvZiB0aGVzZSBtZWFzdXJlcyBpcyBkZWJhdGVkIGluIHRoZSBsaXRlcmF0dXJlLCBzZWUgX19fXykuIFdlIGNhbiBhbHNvIHVzZSBvdGhlciBkaXZlcnNpdHkgbWVhc3VyZXMgdGhhdCBwdXQgZ3JlYXRlciB3ZWlnaHQgb24gdGhlIG1vcmUgYWJ1bmRhbnQgY2xvbm90eXBlcywgaS5lLiBIaWxsIGRpdmVyc2l0eSBmb3IgYWxwaGEgPj0gMi4gCgojIyMjIENoYW8xL0Vmcm9uLVRoaXN0ZWQKCmBgYHtyLCByZXN1bHRzPSdoaWRlJ30KdGlsc3VidHlwZV9pbW11bmVfcmVzIDwtIHN1cHBfbW9sc3VidHlwZV9pbW11bmVfcHJvcGVydGllcyhpaGNfdGFibGUsIG1vbHN1YnR5cGVzLCB4Y3JfdGFibGUsIHRjcl9kaXZlcnNpdHlfZmlsZSwgYmNyX2RpdmVyc2l0eV9maWxlLCBkYl9wYXRoLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGlsdHlwZXMgPSBhbGxfdGlsdHlwZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnR5cGVfY2xhc3MgPSAidGlsX2NsdXN0ZXJzIiwgcmF3X21lYXN1cmVzID0gYygiY2xvbm90eXBlc191bmlxdWUiLCAiRDUwX2luZGV4IiwgImNoYW8xIiwgImVmcm9uX3RoaXN0ZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImludmVyc2Vfc2ltcHNvbiIsICJyZW55aV80IiwgInJlbnlpXzgiLCAicmVueWlfMTYiLCAicmVueWlfMzIiLCAicmVueWlfNjQiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNsYXRlZF9tZWFzdXJlcyA9IGMoIlVuaXF1ZSBjbG9ub3R5cGVzIiwgIkQ1MCBpbmRleCIsICJDaGFvMSIsICJFZnJvbiBUaGlzdGVkIiwgIkludmVyc2UgU2ltcHNvbiIsICJSZW55aSA0IiwgIlJlbnlpIDgiLCAiUmVueWkgMTYiLCAiUmVueWkgMzIiLCAiUmVueWkgNjQiKSkKYGBgCgoKYGBge3J9CnRpbHN1YnR5cGVfaW1tdW5lX3JlcyRzdWJ0eXBlX2RpdmVyc2l0eV9wbG90cyRDaGFvMQpgYGAKCmBgYHtyfQp0aWxzdWJ0eXBlX2ltbXVuZV9yZXMkc3VidHlwZV9kaXZlcnNpdHlfcGxvdHMkYEVmcm9uIFRoaXN0ZWRgCmBgYAoKd2hpY2ggcmVjYXBpdHVsYXRlIHRoZSBzYW1lIHJlc3VsdHMuIAoKV2hpbGUgdGhlIGRpZmZlcmVuY2VzIGJldHdlZW4gUy1USUwgYW5kIEVTLVRJTCBhcmVuJ3Qgc2lnbmlmaWNhbnQsIHRoZXkncmUgdmlzdWFsbHkgY29tcGFyYWJsZSB0byB0aGUgKGFsc28gbm9uLXNpZ25pZmljYW50KSBmaW5kaW5ncyB3aXRoIG90aGVyIGRpdmVyc2l0eSBtZWFzdXJlcy4gCgojIyMjIE1vcmUgSGlsbCBkaXZlcnNpdHkgbWVhc3VyZXMKCmBgYHtyfQp0aWxzdWJ0eXBlX2ltbXVuZV9yZXMkc3VidHlwZV9kaXZlcnNpdHlfcGxvdHMkYEludmVyc2UgU2ltcHNvbmAKYGBgCgpgYGB7cn0KdGlsc3VidHlwZV9pbW11bmVfcmVzJHN1YnR5cGVfZGl2ZXJzaXR5X3Bsb3RzJGBSZW55aSA0YApgYGAKCmBgYHtyfQp0aWxzdWJ0eXBlX2ltbXVuZV9yZXMkc3VidHlwZV9kaXZlcnNpdHlfcGxvdHMkYFJlbnlpIDhgCmBgYAoKYGBge3J9CnRpbHN1YnR5cGVfaW1tdW5lX3JlcyRzdWJ0eXBlX2RpdmVyc2l0eV9wbG90cyRgUmVueWkgMTZgCmBgYAoKYGBge3J9CnRpbHN1YnR5cGVfaW1tdW5lX3JlcyRzdWJ0eXBlX2RpdmVyc2l0eV9wbG90cyRgUmVueWkgMzJgCmBgYAoKYGBge3J9CnRpbHN1YnR5cGVfaW1tdW5lX3JlcyRzdWJ0eXBlX2RpdmVyc2l0eV9wbG90cyRgUmVueWkgNjRgCmBgYAoKIyMjIEluY29ycG9yYXRpbmcgVElMIGRlbnNpdHkgaW50byBhIGxpbmVhciBtb2RlbAoKVG8gZ2V0IGF0IHRoaXMgcG9pbnQsIHdlIGNhbiBhbHNvIGRlc2lnbiBhIG1vZGVsIHdpdGggKnRvdGFsKiBDRDgvQ0Q0L0NEMjAvUGxhc21hIFRJTCBkZW5zaXR5IGFzIGFuIGFkZGl0aW9uYWwgY292YXJpYXRlLiBOb3RlIHRoYXQgd2UgYXJlIG5vdCBpbnRlcmVzdGVkIGluIHRoZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIGVwaXRoZWxpYWwgYW5kIHN0cm9tYWwgaGVyZSwgc2luY2UgdGhhdCBpcyBsaWtlbHkgcGFydCBvZiB0aGUgc2lnbmFsLiAKCmBgYHtyfQppaGNfdGFibGVfc3Vic2V0IDwtIHN1YnNldChpaGNfdGFibGUsIHNlbGVjdD1jKCJjb25kZW5zZWRfaWQiLCAicGF0aWVudF9pZCIsIHRvdGFsX3RpbHR5cGVzKSkKaWhjX3hjcl9jbHVzdGVyX3RhYmxlIDwtIFJlZHVjZShwbHlyOjpqb2luLCBsaXN0KHhjcl9kaXZlcnNpdHksIHRpbF9jbHVzdGVycywgaWhjX3RhYmxlX3N1YnNldCkpCmloY194Y3JfY2x1c3Rlcl90YWJsZV9maWx0ZXJlZCA8LSBzdWJzZXQoaWhjX3hjcl9jbHVzdGVyX3RhYmxlLCAhaXMubmEoY2x1c3RlcikgJiBjbHVzdGVyICE9ICJOLVRJTCIpCgpnZXRfbG1fcmVzdWx0IDwtIGZ1bmN0aW9uKHZhciA9ICJ0Y3Jfc2hhbm5vbl9lbnRyb3B5IiwgcmFuZG9tX2VmZmVjdHMgPSBOVUxMKSB7CiAgIGlmIChpcy5udWxsKHJhbmRvbV9lZmZlY3RzKSkgewogICAgIG1vZCA8LSBsbShhcy5mb3JtdWxhKHBhc3RlMCh2YXIsICIgfiBUX0NEOF9kZW5zaXR5ICsgVF9DRDRfZGVuc2l0eSArIFRfQ0QyMF9kZW5zaXR5ICsgVF9QbGFzbWFfZGVuc2l0eSArIGNsdXN0ZXIiKSksIGRhdGEgPSBpaGNfeGNyX2NsdXN0ZXJfdGFibGVfZmlsdGVyZWQpCiAgIH0gZWxzZSB7CiAgICAgbW9kIDwtIGxtZXIoYXMuZm9ybXVsYShwYXN0ZTAodmFyLCAiIH4gVF9DRDhfZGVuc2l0eSArIFRfQ0Q0X2RlbnNpdHkgKyBUX0NEMjBfZGVuc2l0eSArIFRfUGxhc21hX2RlbnNpdHkgKyBjbHVzdGVyICsgIiwgcmFuZG9tX2VmZmVjdHMpKSwgZGF0YSA9IGloY194Y3JfY2x1c3Rlcl90YWJsZV9maWx0ZXJlZCkKICAgfQogICByZXR1cm4obW9kKQp9Cgp2YXJzIDwtIGMoCiAgInRjcl9zaGFubm9uX2VudHJvcHkiLAogICJ0Y3JfY2xvbm90eXBlc191bmlxdWUiLAogICJiY3Jfc2hhbm5vbl9lbnRyb3B5IiwKICAiYmNyX2Nsb25vdHlwZXNfdW5pcXVlIgopCmBgYAoKSW4gYSBsaW5lYXIgbW9kZWwgd2l0aG91dCBhbnkgcmFuZG9tIGVmZmVjdHM6CgpgYGB7cn0KbG1fcmVzIDwtIGxhcHBseSh2YXJzLCBmdW5jdGlvbih4KSBnZXRfbG1fcmVzdWx0KHgpKQpsbV9yZXNfc3VtbWFyaWVzIDwtIGxhcHBseShsbV9yZXMsIHN1bW1hcnkpCm5hbWVzKGxtX3Jlc19zdW1tYXJpZXMpIDwtIHZhcnMKbG1fcmVzX3N1bW1hcmllcwpgYGAKCkluIGEgbGluZWFyIG1vZGVsIHdpdGggcGF0aWVudCBhcyBhIHJhbmRvbSBlZmZlY3Q6CgpgYGB7cn0KbG1fcmVzIDwtIGxhcHBseSh2YXJzLCBmdW5jdGlvbih4KSBnZXRfbG1fcmVzdWx0KHgsIHJhbmRvbV9lZmZlY3RzID0gIigxfHBhdGllbnRfaWQpIikpCmxtX3Jlc19zdW1tYXJpZXMgPC0gbGFwcGx5KGxtX3Jlcywgc3VtbWFyeSkKbmFtZXMobG1fcmVzX3N1bW1hcmllcykgPC0gdmFycwpsbV9yZXNfc3VtbWFyaWVzCmBgYAoKUmVnYXJkbGVzcyBvZiB3aGV0aGVyIHBhdGllbnQgaXMgYWNjb3VudGVkIGZvciBhcyBhIHJhbmRvbSBlZmZlY3QsIEVTLVRJTCBzYW1wbGVzIGhhdmUgbGVzcyBUQ1IgZGl2ZXJzaXR5ICh1bmlxdWUgY2xvbm90eXBlIGNvdW50IGFuZCBlbnRyb3B5KSB0aGFuIFMtVElMIHNhbXBsZXMsIGNvbnRyb2xsaW5nIGZvciB0b3RhbCBDRDgsIENENCwgQ0QyMCwgYW5kIFBsYXNtYSBjZWxsIGRlbnNpdHkuIAoKIyMgU3VtbWFyeQoKVGhlcmVmb3JlLCBpdCBhcHBlYXJzIHRvIHJlbWFpbiB0aGF0IFRDUi9CQ1IgZGl2ZXJzaXR5IGlzIGhpZ2hlc3QgaW4gRVMtVElMIHNhbXBsZXMsIGV2ZW4gd2hlbiB1c2luZyBkaXZlcnNpdHkgaW5kaWNlcyB0aGF0IGVzdGltYXRlIHRoZSBudW1iZXIgb2YgbWlzc2luZyBjbG9ub3R5cGVzLiBXaGlsZSB0aGlzIGlzIG5vdCBzaWduaWZpY2FudCwgdGhlcmUgaXMgYSB0cmVuZC4gCgpIb3BlZnVsbHkgdGhpcyBpcyBhbnN3ZXJlZCBhZGVxdWF0ZWx5LiBUaG91Z2h0cz8gCgoK