Functions
Data
acc_immune = LoadH5Seurat(file = "./Data/acc_immune.h5seurat")
DimPlot(acc_immune,label = T)

FeaturePlot(acc_immune, features = c("CD8A","MS4A1", "CD4","CD14","MS4A2"))

markers = FindAllMarkers(object = acc_immune,densify = T)
assign cell type
acc_immune <- RenameIdents(object = acc_immune,
"0" = "CD4",
"1" = "CD4",
"2" = "CD14+ Mono",
"3" = "CD4",
"4" = "CD8",
"5" = "B",
"6" = "CD4",
"7" = "CD8",
"8" = "FCϵR1")
acc_immune$cell_identity = acc_immune@active.ident
DimPlot(object = acc_immune,label = F)

Antigen
presenting machinery
apm_genes = c("HLA-A","HLA-B","HLA-C","B2M","TAP1","TAP2", "TAPBP")
apm_score = FetchData(acc_immune,vars = apm_genes,slot = "data") %>% rowMeans()
acc_immune = AddMetaData(object = acc_immune,metadata = apm_score,col.name = "APM_score")
print_tab(plt = FeaturePlot(acc_immune,features = apm_genes),title = "genes")
print_tab(plt = FeaturePlot(acc_immune,features = "APM_score"),title = "score")
Exhaustion markers
exhausted_genes = c("PDCD1","CD244","CD160","CTLA4","HAVCR2")
FeaturePlot(acc_immune,features = exhausted_genes)
Immune receptors
receptors = c("CCR3", "CCR4", "CCR10","CXCR2", "CXCR3", "CXCR4", "IL17A")
FeaturePlot(acc_immune,features = receptors)
CellphoneDB
acc_cancer_cells = readRDS("/sci/labs/yotamd/lab_share/avishai.wizel/R_projects/ACC_microenv/Data/acc_cancer_no146_primaryonly15k_cancercells.rds")
acc_caf = readRDS("/sci/labs/yotamd/lab_share/ACC/ACC_sc/analysis/acc_tpm_nCount_mito_no146_cafs.rds")
DimPlot(acc_caf)

# merge cancer and immune
common_genes = intersect(rownames(acc_cancer_cells),rownames(acc_immune)) %>% intersect(rownames(acc_caf_cells))
acc_cancer_and_cd45 = merge(acc_cancer_cells[common_genes,],acc_immune[common_genes,])
overlapping_cells = colnames(acc_cancer_cells) %>% intersect(colnames(acc_caf))
acc_cancer_cd45_caf = merge(acc_cancer_and_cd45[common_genes,],acc_caf_cells[common_genes,!colnames(acc_caf_cells) %in% overlapping_cells] )
#write metadata
#create lum or myo
lum_over_myo = FetchData(object = acc_cancer_cells,vars = "luminal_over_myo")
lum_over_myo$lum_or_myo = "Unknown"
lum_over_myo$lum_or_myo [lum_over_myo$luminal_over_myo>1] = "Luminal"
lum_over_myo$lum_or_myo [lum_over_myo$luminal_over_myo<(-1)] = "Myo"
lum_or_myo = lum_over_myo[,"lum_or_myo",drop = F]
names(lum_or_myo)[1] = "cell_identity"
# combine
immune_identity =FetchData(object = acc_immune,vars = "cell_identity")
caf_identity =FetchData(object = acc_caf_cells,vars = "cell.type")
names(caf_identity)[1] = "cell_identity"
all_identity = do.call("rbind", list(lum_or_myo, immune_identity, caf_identity))
#rename and sort columns
all_identity$barcode_sample = rownames(all_identity)
all_identity = all_identity %>% rename(cell_type = cell_identity)
all_identity = all_identity[,c(2,1)]
write.table(x = all_identity,file = "./Data/CellphoneDB/metadata_soft.tsv",row.names =F,sep = "\t")
#write normalized counts
count_matrix = as.data.frame(acc_cancer_cd45_caf@assays[["RNA"]]@data)
fwrite(count_matrix, file = "./Data/CellphoneDB/counts.txt",sep = "\t",row.names = T)
significant
interactions heatmap
plot_cpdb_heatmap(scdata = acc_cancer_cd45_caf, idents = 'cell_type',pvals = pvals,main = "Number of significant interactions",alpha = 0.05)
Warning in strwidth(t, units = "in", cex = fontsize_col/fontsize) :
conversion failure on 'FCϵR1' in 'mbcsToSbcs': dot substituted for <cf>
Warning in strwidth(t, units = "in", cex = fontsize_col/fontsize) :
conversion failure on 'FCϵR1' in 'mbcsToSbcs': dot substituted for <b5>
Warning in strwidth(t, units = "in", cex = fontsize_row/fontsize) :
conversion failure on 'FCϵR1' in 'mbcsToSbcs': dot substituted for <cf>
Warning in strwidth(t, units = "in", cex = fontsize_row/fontsize) :
conversion failure on 'FCϵR1' in 'mbcsToSbcs': dot substituted for <b5>
Warning in grSoftVersion() :
unable to load shared object '/usr/local/lib/R/modules//R_X11.so':
libXt.so.6: cannot open shared object file: No such file or directory

#trace(plot_cpdb,edit = T)
uniq_interactions <- function(cell_type1, cell_type2_a ,cell_type2_b, gene.family = NULL,genes = NULL) {
a = plot_cpdb(cell_type1 = cell_type1, cell_type2 =cell_type2_a, scdata = acc_cancer_cd45_caf,
idents = 'cell_type', means = means, pvals = pvals,
gene.family = gene.family,return_table = T, p.adjust.method = "fdr",keep_significant_only = T, genes = genes)
b = plot_cpdb(cell_type1 = cell_type1, cell_type2 = cell_type2_b, scdata = acc_cancer_cd45_caf,
idents = 'cell_type', means = means, pvals = pvals,
gene.family = gene.family,return_table = T,p.adjust.method = "fdr",keep_significant_only = T, genes = genes)
all = list()
i=0
nelements = a$Var2 %>% unique() %>% length()
a_couples = a$Var2 %>% unique()%>% as.vector()
b_couples = b$Var2 %>% unique()%>% as.vector()
for (i in 1:nelements) {
sig_couples_a = a %>% filter(Var2 == a_couples[i]) %>% filter(pvals_adj <= 0.05) %>% pull(Var1) %>% as.vector()
sig_couples_b = b %>% filter(Var2 == b_couples[i]) %>% filter(pvals_adj <= 0.05) %>% pull(Var1) %>% as.vector()
only_in_a = sig_couples_a[! sig_couples_a %in% sig_couples_b]
all[[a_couples[i]]] = only_in_a
i = i+1
}
all = t(map_dfr(all, ~as_data_frame(t(.)))) %>% as.data.frame() %>% set_names(a_couples)
return(all)
}
Costimulatory interactions
print_tab(plt =
plot_cpdb(cell_type1 = 'CD|B|FC', cell_type2 = 'Luminal', scdata = acc_cancer_cd45_caf,
idents = 'cell_type', means = means, pvals = pvals,
gene.family = 'costimulatory',return_table = F,max_size = 3,p.adjust.method = "fdr",keep_significant_only = T,cluster_rows = F)+
ggtitle("Costimulatory Luminal")
,title = "Luminal")
Luminal

print_tab(plt =
plot_cpdb(cell_type1 = 'CD|B|FC', cell_type2 = 'Myo', scdata = acc_cancer_cd45_caf,
idents = 'cell_type', means = means, pvals = pvals,
gene.family = 'costimulatory',return_table = F,max_size = 3,p.adjust.method = "fdr",keep_significant_only = T,cluster_rows = F)+
ggtitle("Costimulatory Myo")
,title = "Myo")
Myo

print_tab(plt =
plot_cpdb(cell_type1 = 'CD|B|FC', cell_type2 = 'CAF', scdata = acc_cancer_cd45_caf,
idents = 'cell_type', means = means, pvals = pvals,
gene.family = 'costimulatory',return_table = F,max_size = 3,p.adjust.method = "fdr",keep_significant_only = T,cluster_rows = F)+
ggtitle("Costimulatory Myo")
,title = "CAF")
CAF

print_tab(plt =
uniq_interactions(cell_type1 = 'CD|B|FC',cell_type2_a = 'Luminal',cell_type2_b = "Myo",gene.family = "Costimulatory")
,title = "unique in luminal")
unique in luminal

print_tab(plt =
uniq_interactions(cell_type1 = 'CD|B|FC',cell_type2_a = 'Myo',cell_type2_b = "Luminal",gene.family = "Costimulatory")
,title = "unique in myo")
unique in myo
print_tab(plt =
uniq_interactions(cell_type1 = 'CD|B|FC',cell_type2_a = 'CAF',cell_type2_b = "Myo|Luminal",gene.family = "Costimulatory")
,title = "unique in CAF")
Coinhibitory interactions
print_tab(plot_cpdb(cell_type1 = 'CD|B|FC', cell_type2 = 'Luminal', scdata = acc_cancer_cd45_caf,
idents = 'cell_type', means = means, pvals = pvals,
gene.family = 'coinhibitory',return_table = F,max_size = 4,p.adjust.method = "fdr",keep_significant_only = F,cluster_rows = F)+
ggtitle("coinhibitory Luminal"),title = "Luminal")
Luminal

print_tab(plot_cpdb(cell_type1 = 'CD|B|FC', cell_type2 = 'Myo', scdata = acc_cancer_cd45_caf,
idents = 'cell_type', means = means, pvals = pvals,
gene.family = 'coinhibitory',return_table = F,max_size = 4,p.adjust.method = "fdr",keep_significant_only = F,cluster_rows = F)+
ggtitle("coinhibitory Myo"),title = "Myo")
Myo

print_tab(plt =
uniq_interactions(cell_type1 = 'CD|B|FC',cell_type2_a = 'Luminal',cell_type2_b = "Myo",gene.family = "coinhibitory")
,title = "unique in luminal")
unique in luminal

print_tab(plt =
uniq_interactions(cell_type1 = 'CD|B|FC',cell_type2_a = 'Myo',cell_type2_b = "Luminal",gene.family = "coinhibitory")
,title = "unique in myo")
unique in myo
print_tab(plt =
uniq_interactions(cell_type1 = 'CD|B|FC',cell_type2_a = 'CAF',cell_type2_b = "Myo|Luminal",gene.family = "coinhibitory")
,title = "unique in CAF")
Chemokines interactions
print_tab(
plot_cpdb(cell_type1 = 'CD|B|FC', cell_type2 = 'Luminal', scdata = acc_cancer_cd45_caf,
idents = 'cell_type', means = means, pvals = pvals,
gene.family = 'chemokines',return_table = F,max_size = 4,p.adjust.method = "fdr",keep_significant_only = F,cluster_rows = F)+
ggtitle("chemokines Luminal"),title = "Luminal")
Luminal

print_tab(
plot_cpdb(cell_type1 = 'CD|B|FC', cell_type2 = 'Myo', scdata = acc_cancer_cd45_caf,
idents = 'cell_type', means = means, pvals = pvals,
gene.family = 'chemokines',return_table = F,max_size = 4,p.adjust.method = "fdr",keep_significant_only = F,cluster_rows = F)+
ggtitle("chemokines Myo"),title = "Myo")
Myo

print_tab(plt =
uniq_interactions(cell_type1 = 'CD|B|FC',cell_type2_a = 'Luminal',cell_type2_b = "Myo",gene.family = "chemokines")
,title = "unique in luminal")
unique in luminal

print_tab(plt =
uniq_interactions(cell_type1 = 'CD|B|FC',cell_type2_a = 'Myo',cell_type2_b = "Luminal",gene.family = "chemokines")
,title = "unique in myo")
unique in myo
print_tab(plt =
uniq_interactions(cell_type1 = 'CD|B|FC',cell_type2_a = 'CAF',cell_type2_b = "Myo|Luminal",gene.family = "chemokines")
,title = "unique in CAF")
Chemokine ligands
genes = c("CXCL1\\D", "CXCL2\\D","CXCL3\\D","CXCL17","C3","CXCL14")
print_tab(plot_cpdb(cell_type1 = 'CD|B|FC', cell_type2 = 'Myo', scdata = acc_cancer_cd45_caf,
idents = 'cell_type', means = means, pvals = pvals,
genes = genes,return_table = F,max_size = 4,p.adjust.method = "fdr" ,keep_significant_only = F)
,title = "Myo")
Myo

print_tab(plot_cpdb(cell_type1 = 'CD|B|FC', cell_type2 = 'Luminal', scdata = acc_cancer_cd45_caf,
idents = 'cell_type', means = means, pvals = pvals,
genes = genes,return_table = F,max_size = 4,p.adjust.method = "fdr" ,keep_significant_only = F)
,title = "Luminal")
Luminal

print_tab(plt =
uniq_interactions(cell_type1 = 'CD|B|FC',cell_type2_a = 'Luminal',cell_type2_b = "Myo", genes = genes)
,title = "unique in luminal")
unique in luminal

print_tab(plt =
uniq_interactions(cell_type1 = 'CD|B|FC',cell_type2_a = 'Myo',cell_type2_b = "Luminal", genes = genes)
,title = "unique in myo")
unique in myo
print_tab(plt =
uniq_interactions(cell_type1 = 'CD|B|FC',cell_type2_a = 'CAF',cell_type2_b = "Myo|Luminal", genes = genes)
,title = "unique in CAF")
CCL22
and CCL28
print_tab(plot_cpdb(cell_type1 = 'CD|B|FC', cell_type2 = 'Myo', scdata = acc_cancer_cd45_caf,
idents = 'cell_type', means = means, pvals = pvals,
genes = c("CCL22", "CCL28" ),return_table = F,max_size = 4,p.adjust.method = "fdr" ,keep_significant_only = F),title = "Myo")
Myo

print_tab(plot_cpdb(cell_type1 = 'CD|B|FC', cell_type2 = 'Luminal', scdata = acc_cancer_cd45_caf,
idents = 'cell_type', means = means, pvals = pvals,
genes = c("CCL22", "CCL28" ),return_table = F,max_size = 6,p.adjust.method = "fdr" ,keep_significant_only = F),title = "Luminal")
Luminal

NA
plot_cpdb(cell_type1 = 'CD|B|FC', cell_type2 = 'Myo', scdata = acc_cancer_cd45_caf,
idents = 'cell_type', means = means, pvals = pvals,
genes = c("JAG", "MYB" ),return_table = F,max_size = 4,p.adjust.method = "fdr" ,keep_significant_only = F)

plot_cpdb(cell_type1 = 'CD|B|FC', cell_type2 = 'Luminal', scdata = acc_cancer_cd45_caf,
idents = 'cell_type', means = means, pvals = pvals,
genes = c("JAG", "MYB" , "NOTCH","HES1","HEY"),return_table = F,max_size = 4,p.adjust.method = "fdr" ,keep_significant_only = F)

NA
NA
LS0tCnRpdGxlOiAnYHIgcnN0dWRpb2FwaTo6Z2V0U291cmNlRWRpdG9yQ29udGV4dCgpJHBhdGggJT4lIGJhc2VuYW1lKCkgJT4lIGdzdWIocGF0dGVybiA9ICJcXC5SbWQiLHJlcGxhY2VtZW50ID0gIiIpYCcgCmF1dGhvcjogIkF2aXNoYWkgV2l6ZWwiCmRhdGU6ICdgciBTeXMudGltZSgpYCcKb3V0cHV0OiAKICBodG1sX25vdGVib29rOiAKICAgIGNvZGVfZm9sZGluZzogaGlkZQogICAgdG9jOiB5ZXMKICAgIHRvY19jb2xsYXBzZTogeWVzCiAgICB0b2NfZmxvYXQ6IAogICAgICBjb2xsYXBzZWQ6IEZBTFNFCiAgICBudW1iZXJfc2VjdGlvbnM6IHRydWUKICAgIHRvY19kZXB0aDogMQotLS0KCgoKIyBGdW5jdGlvbnMKCmBgYHtyIHdhcm5pbmc9RkFMU0V9CmBgYAoKIyBEYXRhCgpgYGB7cn0KYWNjX2ltbXVuZSA9IExvYWRINVNldXJhdChmaWxlID0gIi4vRGF0YS9hY2NfaW1tdW5lLmg1c2V1cmF0IikKYGBgCgpgYGB7cn0KRGltUGxvdChhY2NfaW1tdW5lLGxhYmVsID0gVCkKYGBgCmBgYHtyIGZpZy5oZWlnaHQ9MTAsIGZpZy53aWR0aD04fQpGZWF0dXJlUGxvdChhY2NfaW1tdW5lLCBmZWF0dXJlcyA9IGMoIkNEOEEiLCJNUzRBMSIsICJDRDQiLCJDRDE0IiwiTVM0QTIiKSkKYGBgCmBgYHtyfQptYXJrZXJzID0gRmluZEFsbE1hcmtlcnMob2JqZWN0ID0gYWNjX2ltbXVuZSxkZW5zaWZ5ID0gVCkKYGBgCgojIGFzc2lnbiBjZWxsIHR5cGUKYGBge3IgZmlnLmhlaWdodD02LCBmaWcud2lkdGg9OH0KYWNjX2ltbXVuZSA8LSBSZW5hbWVJZGVudHMob2JqZWN0ID0gYWNjX2ltbXVuZSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMCIgPSAiQ0Q0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIxIiA9ICJDRDQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjIiID0gIkNEMTQrIE1vbm8iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjMiID0gIkNENCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiNCIgPSAiQ0Q4IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI1IiA9ICJCIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI2IiA9ICJDRDQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjciID0gIkNEOCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiOCIgPSAiRkPPtVIxIikKYWNjX2ltbXVuZSRjZWxsX2lkZW50aXR5ID0gYWNjX2ltbXVuZUBhY3RpdmUuaWRlbnQKRGltUGxvdChvYmplY3QgPSBhY2NfaW1tdW5lLGxhYmVsID0gRikKYGBgCgojIEFudGlnZW4gcHJlc2VudGluZyBtYWNoaW5lcnkgey50YWJzZXR9CmBgYHtyfQphcG1fZ2VuZXMgPSBjKCJITEEtQSIsIkhMQS1CIiwiSExBLUMiLCJCMk0iLCJUQVAxIiwiVEFQMiIsICJUQVBCUCIpCmFwbV9zY29yZSA9IEZldGNoRGF0YShhY2NfaW1tdW5lLHZhcnMgPSBhcG1fZ2VuZXMsc2xvdCA9ICJkYXRhIikgJT4lIHJvd01lYW5zKCkKYWNjX2ltbXVuZSA9IEFkZE1ldGFEYXRhKG9iamVjdCA9IGFjY19pbW11bmUsbWV0YWRhdGEgPSBhcG1fc2NvcmUsY29sLm5hbWUgPSAiQVBNX3Njb3JlIikKYGBgCgpgYGB7ciBmaWcuaGVpZ2h0PTgsIGZpZy53aWR0aD0xMCwgcmVzdWx0cz0nYXNpcyd9CnByaW50X3RhYihwbHQgPSBGZWF0dXJlUGxvdChhY2NfaW1tdW5lLGZlYXR1cmVzID0gYXBtX2dlbmVzKSx0aXRsZSA9ICJnZW5lcyIpCnByaW50X3RhYihwbHQgPSBGZWF0dXJlUGxvdChhY2NfaW1tdW5lLGZlYXR1cmVzID0gIkFQTV9zY29yZSIpLHRpdGxlID0gInNjb3JlIikKYGBgCgojIEV4aGF1c3Rpb24gbWFya2VycwpgYGB7ciBmaWcuaGVpZ2h0PTgsIGZpZy53aWR0aD0xMH0KZXhoYXVzdGVkX2dlbmVzID0gYygiUERDRDEiLCJDRDI0NCIsIkNEMTYwIiwiQ1RMQTQiLCJIQVZDUjIiKQpGZWF0dXJlUGxvdChhY2NfaW1tdW5lLGZlYXR1cmVzID0gZXhoYXVzdGVkX2dlbmVzKQpgYGAKIyBJbW11bmUgcmVjZXB0b3JzCmBgYHtyIGZpZy5oZWlnaHQ9OCwgZmlnLndpZHRoPTEwfQpyZWNlcHRvcnMgPSBjKCJDQ1IzIiwgIkNDUjQiLCAiQ0NSMTAiLCJDWENSMiIsICJDWENSMyIsICJDWENSNCIsICJJTDE3QSIpCkZlYXR1cmVQbG90KGFjY19pbW11bmUsZmVhdHVyZXMgPSByZWNlcHRvcnMpCgpgYGAKIyBDZWxscGhvbmVEQgpgYGB7cn0KYWNjX2NhbmNlcl9jZWxscyA9IHJlYWRSRFMoIi9zY2kvbGFicy95b3RhbWQvbGFiX3NoYXJlL2F2aXNoYWkud2l6ZWwvUl9wcm9qZWN0cy9BQ0NfbWljcm9lbnYvRGF0YS9hY2NfY2FuY2VyX25vMTQ2X3ByaW1hcnlvbmx5MTVrX2NhbmNlcmNlbGxzLnJkcyIpCmFjY19jYWYgPSByZWFkUkRTKCIvc2NpL2xhYnMveW90YW1kL2xhYl9zaGFyZS9BQ0MvQUNDX3NjL2FuYWx5c2lzL2FjY190cG1fbkNvdW50X21pdG9fbm8xNDZfY2Fmcy5yZHMiKQpgYGAKCmBgYHtyfQpEaW1QbG90KGFjY19jYWYpCmBgYAoKYGBge3J9CiMgbWVyZ2UgY2FuY2VyIGFuZCBpbW11bmUKY29tbW9uX2dlbmVzID0gaW50ZXJzZWN0KHJvd25hbWVzKGFjY19jYW5jZXJfY2VsbHMpLHJvd25hbWVzKGFjY19pbW11bmUpKSAlPiUgaW50ZXJzZWN0KHJvd25hbWVzKGFjY19jYWZfY2VsbHMpKQphY2NfY2FuY2VyX2FuZF9jZDQ1ID0gbWVyZ2UoYWNjX2NhbmNlcl9jZWxsc1tjb21tb25fZ2VuZXMsXSxhY2NfaW1tdW5lW2NvbW1vbl9nZW5lcyxdKQpvdmVybGFwcGluZ19jZWxscyA9IGNvbG5hbWVzKGFjY19jYW5jZXJfY2VsbHMpICU+JSBpbnRlcnNlY3QoY29sbmFtZXMoYWNjX2NhZikpIAphY2NfY2FuY2VyX2NkNDVfY2FmID0gbWVyZ2UoYWNjX2NhbmNlcl9hbmRfY2Q0NVtjb21tb25fZ2VuZXMsXSxhY2NfY2FmX2NlbGxzW2NvbW1vbl9nZW5lcywhY29sbmFtZXMoYWNjX2NhZl9jZWxscykgJWluJSBvdmVybGFwcGluZ19jZWxsc10gKQoKYGBgCgpgYGB7cn0KICAjd3JpdGUgbWV0YWRhdGEKCiNjcmVhdGUgbHVtIG9yIG15bwpsdW1fb3Zlcl9teW8gPSBGZXRjaERhdGEob2JqZWN0ID0gYWNjX2NhbmNlcl9jZWxscyx2YXJzID0gImx1bWluYWxfb3Zlcl9teW8iKQpsdW1fb3Zlcl9teW8kbHVtX29yX215byA9ICJVbmtub3duIgpsdW1fb3Zlcl9teW8kbHVtX29yX215byBbbHVtX292ZXJfbXlvJGx1bWluYWxfb3Zlcl9teW8+MV0gID0gIkx1bWluYWwiCmx1bV9vdmVyX215byRsdW1fb3JfbXlvIFtsdW1fb3Zlcl9teW8kbHVtaW5hbF9vdmVyX215bzwoLTEpXSAgPSAiTXlvIgpsdW1fb3JfbXlvID0gbHVtX292ZXJfbXlvWywibHVtX29yX215byIsZHJvcCA9IEZdCm5hbWVzKGx1bV9vcl9teW8pWzFdID0gImNlbGxfaWRlbnRpdHkiCgojIGNvbWJpbmUKaW1tdW5lX2lkZW50aXR5ID1GZXRjaERhdGEob2JqZWN0ID0gYWNjX2ltbXVuZSx2YXJzID0gImNlbGxfaWRlbnRpdHkiKQpjYWZfaWRlbnRpdHkgPUZldGNoRGF0YShvYmplY3QgPSBhY2NfY2FmX2NlbGxzLHZhcnMgPSAiY2VsbC50eXBlIikKbmFtZXMoY2FmX2lkZW50aXR5KVsxXSA9ICJjZWxsX2lkZW50aXR5IgphbGxfaWRlbnRpdHkgPSBkby5jYWxsKCJyYmluZCIsIGxpc3QobHVtX29yX215bywgaW1tdW5lX2lkZW50aXR5LCBjYWZfaWRlbnRpdHkpKQoKI3JlbmFtZSBhbmQgc29ydCBjb2x1bW5zCmFsbF9pZGVudGl0eSRiYXJjb2RlX3NhbXBsZSA9IHJvd25hbWVzKGFsbF9pZGVudGl0eSkKYWxsX2lkZW50aXR5ID0gYWxsX2lkZW50aXR5ICU+JSByZW5hbWUoY2VsbF90eXBlID0gY2VsbF9pZGVudGl0eSkKYWxsX2lkZW50aXR5ID0gYWxsX2lkZW50aXR5WyxjKDIsMSldCgoKd3JpdGUudGFibGUoeCA9IGFsbF9pZGVudGl0eSxmaWxlID0gIi4vRGF0YS9DZWxscGhvbmVEQi9tZXRhZGF0YV9zb2Z0LnRzdiIscm93Lm5hbWVzID1GLHNlcCA9ICJcdCIpCmBgYAoKYGBge3J9CiN3cml0ZSBub3JtYWxpemVkIGNvdW50cwpjb3VudF9tYXRyaXggPSBhcy5kYXRhLmZyYW1lKGFjY19jYW5jZXJfY2Q0NV9jYWZAYXNzYXlzW1siUk5BIl1dQGRhdGEpCmZ3cml0ZShjb3VudF9tYXRyaXgsIGZpbGUgPSAiLi9EYXRhL0NlbGxwaG9uZURCL2NvdW50cy50eHQiLHNlcCA9ICJcdCIscm93Lm5hbWVzID0gVCkKYGBgCgoKYGBge3B5dGhvbiBpbmNsdWRlPUZBTFNFfQojZG93bmxvYWQgZGF0YWJhc2UKaW1wb3J0IHBhbmRhcyBhcyBwZAppbXBvcnQgZ2xvYgppbXBvcnQgb3MKIyAtLSBWZXJzaW9uIG9mIHRoZSBkYXRhYnNlCmNwZGJfdmVyc2lvbiA9ICd2NC4xLjAnCgojIC0tIFBhdGggd2hlcmUgdGhlIGlucHV0IGZpbGVzIHRvIGdlbmVyYXRlIHRoZSBkYXRhYmFzZSBhcmUgbG9jYXRlZApjcGRiX3RhcmdldF9kaXIgPSBvcy5wYXRoLmpvaW4oJy4vRGF0YS9DZWxscGhvbmVEQi8nLCBjcGRiX3ZlcnNpb24pCgojIERvd25sb2FkIGRhdGFiYXNlCmZyb20gY2VsbHBob25lZGIudXRpbHMgaW1wb3J0IGRiX3V0aWxzCmRiX3V0aWxzLmRvd25sb2FkX2RhdGFiYXNlKGNwZGJfdGFyZ2V0X2RpciwgY3BkYl92ZXJzaW9uKQpgYGAKCmBgYHtweXRob24gaW5jbHVkZT1GQUxTRX0KZnJvbSBjZWxscGhvbmVkYi5zcmMuY29yZS5tZXRob2RzIGltcG9ydCBjcGRiX3N0YXRpc3RpY2FsX2FuYWx5c2lzX21ldGhvZAoKZGVjb252b2x1dGVkLCBtZWFucywgcHZhbHVlcywgc2lnbmlmaWNhbnRfbWVhbnMgPSBjcGRiX3N0YXRpc3RpY2FsX2FuYWx5c2lzX21ldGhvZC5jYWxsKAogICAgY3BkYl9maWxlX3BhdGggPSAiLi9EYXRhL0NlbGxwaG9uZURCL3Y0LjEuMC9jZWxscGhvbmVkYi56aXAiLCAgICAgICAgICAgICAgICAgIyBtYW5kYXRvcnk6IENlbGxQaG9uZURCIGRhdGFiYXNlIHppcCBmaWxlLgogICAgbWV0YV9maWxlX3BhdGggPSAiLi9EYXRhL0NlbGxwaG9uZURCL21ldGFkYXRhX3NvZnQudHN2IiwgICAgICAgICAgICAgICAgICMgbWFuZGF0b3J5OiB0c3YgZmlsZSBkZWZpbmluZyBiYXJjb2RlcyB0byBjZWxsIGxhYmVsLgogICAgY291bnRzX2ZpbGVfcGF0aCA9ICIuL0RhdGEvQ2VsbHBob25lREIvY291bnRzLnR4dCIsICAgICAgICAgICAgICMgbWFuZGF0b3J5OiBub3JtYWxpemVkIGNvdW50IG1hdHJpeC4KICAgIGNvdW50c19kYXRhID0gJ2hnbmNfc3ltYm9sJywgICAgICAgICAgICAgICAgICAgICAjIGRlZmluZXMgdGhlIGdlbmUgYW5ub3RhdGlvbiBpbiBjb3VudHMgbWF0cml4LgogICAgb3V0cHV0X3BhdGggPSAiLi9EYXRhL0NlbGxwaG9uZURCL291dHB1dF9zb2Z0IiwgICAgICAgICAgICAgICAgICAgICAgICAgICMgUGF0aCB0byBzYXZlIHJlc3VsdHMuCikKYGBgCgoKYGBge3J9CmxpYnJhcnkoa3RwbG90cykKYWNjX2NhbmNlcl9jZDQ1X2NhZiRjZWxsX3R5cGUgPSBhbGxfaWRlbnRpdHlbLDIsZHJvcCA9IEZdICMgYWRkIGNlbGxzIGlkZW50aXRpZXMgdG8gU2V1cmF0CgojcmVhZCBkYXRhOgpwdmFscyA9ICByZWFkLmRlbGltKGZpbGUgPSAiLi9EYXRhL0NlbGxwaG9uZURCL291dHB1dF9zb2Z0L3N0YXRpc3RpY2FsX2FuYWx5c2lzX3B2YWx1ZXNfMDdfMjRfMjAyM18xODo1MjoyMy50eHQiLCBjaGVjay5uYW1lcyA9IEZBTFNFKQptZWFucyA9IHJlYWQuZGVsaW0oZmlsZSA9ICIuL0RhdGEvQ2VsbHBob25lREIvb3V0cHV0X3NvZnQvc3RhdGlzdGljYWxfYW5hbHlzaXNfbWVhbnNfMDdfMjRfMjAyM18xODo1MjoyMy50eHQiLCBjaGVjay5uYW1lcyA9IEZBTFNFKQoKYGBgCgojIHNpZ25pZmljYW50IGludGVyYWN0aW9ucyBoZWF0bWFwCmBgYHtyfQpwbG90X2NwZGJfaGVhdG1hcChzY2RhdGEgPSBhY2NfY2FuY2VyX2NkNDVfY2FmLCBpZGVudHMgPSAnY2VsbF90eXBlJyxwdmFscyA9ICBwdmFscyxtYWluID0gIk51bWJlciBvZiBzaWduaWZpY2FudCBpbnRlcmFjdGlvbnMiLGFscGhhID0gMC4wNSkKYGBgCmBgYHtyfQojdHJhY2UocGxvdF9jcGRiLGVkaXQgPSBUKQpgYGAKCgoKYGBge3J9CnVuaXFfaW50ZXJhY3Rpb25zIDwtIGZ1bmN0aW9uKGNlbGxfdHlwZTEsIGNlbGxfdHlwZTJfYSAsY2VsbF90eXBlMl9iLCBnZW5lLmZhbWlseSA9IE5VTEwsZ2VuZXMgPSBOVUxMKSB7CgogIGEgPSBwbG90X2NwZGIoY2VsbF90eXBlMSA9IGNlbGxfdHlwZTEsIGNlbGxfdHlwZTIgPWNlbGxfdHlwZTJfYSwgc2NkYXRhID0gYWNjX2NhbmNlcl9jZDQ1X2NhZiwKICAgICAgICAgICAgICAgICAgICAgIGlkZW50cyA9ICdjZWxsX3R5cGUnLCBtZWFucyA9IG1lYW5zLCBwdmFscyA9IHB2YWxzLAogICAgICAgICAgICAgICAgICAgICAgZ2VuZS5mYW1pbHkgPSBnZW5lLmZhbWlseSxyZXR1cm5fdGFibGUgPSBULCBwLmFkanVzdC5tZXRob2QgPSAiZmRyIixrZWVwX3NpZ25pZmljYW50X29ubHkgPSBULCBnZW5lcyA9IGdlbmVzKQogIAogIGIgPSBwbG90X2NwZGIoY2VsbF90eXBlMSA9IGNlbGxfdHlwZTEsIGNlbGxfdHlwZTIgPSBjZWxsX3R5cGUyX2IsIHNjZGF0YSA9IGFjY19jYW5jZXJfY2Q0NV9jYWYsCiAgICAgICAgICAgICAgICAgICAgICBpZGVudHMgPSAnY2VsbF90eXBlJywgbWVhbnMgPSBtZWFucywgcHZhbHMgPSBwdmFscywKICAgICAgICAgICAgICAgICAgICAgIGdlbmUuZmFtaWx5ID0gZ2VuZS5mYW1pbHkscmV0dXJuX3RhYmxlID0gVCxwLmFkanVzdC5tZXRob2QgPSAiZmRyIixrZWVwX3NpZ25pZmljYW50X29ubHkgPSBULCBnZW5lcyA9IGdlbmVzKQogIAogIAogIGFsbCA9IGxpc3QoKQogIGk9MAogIG5lbGVtZW50cyA9IGEkVmFyMiAlPiUgdW5pcXVlKCkgJT4lIGxlbmd0aCgpCiAgYV9jb3VwbGVzID0gYSRWYXIyICU+JSB1bmlxdWUoKSU+JSBhcy52ZWN0b3IoKSAgCiAgYl9jb3VwbGVzID0gYiRWYXIyICU+JSB1bmlxdWUoKSU+JSBhcy52ZWN0b3IoKSAgCiAgZm9yIChpIGluIDE6bmVsZW1lbnRzKSB7CiAgICBzaWdfY291cGxlc19hID0gYSAlPiUgZmlsdGVyKFZhcjIgPT0gYV9jb3VwbGVzW2ldKSAlPiUgZmlsdGVyKHB2YWxzX2FkaiA8PSAwLjA1KSAlPiUgIHB1bGwoVmFyMSkgJT4lIGFzLnZlY3RvcigpICAKICAgIHNpZ19jb3VwbGVzX2IgPSBiICU+JSBmaWx0ZXIoVmFyMiA9PSBiX2NvdXBsZXNbaV0pICU+JSBmaWx0ZXIocHZhbHNfYWRqIDw9IDAuMDUpICU+JSAgcHVsbChWYXIxKSAlPiUgYXMudmVjdG9yKCkgIAogICAgb25seV9pbl9hID0gc2lnX2NvdXBsZXNfYVshIHNpZ19jb3VwbGVzX2EgJWluJSBzaWdfY291cGxlc19iXQogICAgYWxsW1thX2NvdXBsZXNbaV1dXSA9IG9ubHlfaW5fYSAKICAgIGkgPSBpKzEKICB9CiAgYWxsID0gdChtYXBfZGZyKGFsbCwgfmFzX2RhdGFfZnJhbWUodCguKSkpKSAlPiUgYXMuZGF0YS5mcmFtZSgpICU+JSBzZXRfbmFtZXMoYV9jb3VwbGVzKQogIHJldHVybihhbGwpCn0KCmBgYCAgIAoKIyBDb3N0aW11bGF0b3J5IGludGVyYWN0aW9ucyB7LnRhYnNldH0KYGBge3IgZmlnLmhlaWdodD04LCByZXN1bHRzPSdhc2lzJ30KCnByaW50X3RhYihwbHQgPSAKICAgICAgICAgICAgcGxvdF9jcGRiKGNlbGxfdHlwZTEgPSAnQ0R8QnxGQycsIGNlbGxfdHlwZTIgPSAnTHVtaW5hbCcsIHNjZGF0YSA9IGFjY19jYW5jZXJfY2Q0NV9jYWYsCiAgICAgICAgICAgICAgICAgICAgICBpZGVudHMgPSAnY2VsbF90eXBlJywgbWVhbnMgPSBtZWFucywgcHZhbHMgPSBwdmFscywKICAgICAgICAgICAgICAgICAgICAgIGdlbmUuZmFtaWx5ID0gJ2Nvc3RpbXVsYXRvcnknLHJldHVybl90YWJsZSA9IEYsbWF4X3NpemUgPSAzLHAuYWRqdXN0Lm1ldGhvZCA9ICJmZHIiLGtlZXBfc2lnbmlmaWNhbnRfb25seSA9IFQsY2x1c3Rlcl9yb3dzID0gRikrCiAgICAgICAgICAgIGdndGl0bGUoIkNvc3RpbXVsYXRvcnkgTHVtaW5hbCIpCiAgLHRpdGxlID0gIkx1bWluYWwiKQoKcHJpbnRfdGFiKHBsdCA9IAogICAgICAgICAgICBwbG90X2NwZGIoY2VsbF90eXBlMSA9ICdDRHxCfEZDJywgY2VsbF90eXBlMiA9ICdNeW8nLCBzY2RhdGEgPSBhY2NfY2FuY2VyX2NkNDVfY2FmLAogICAgICAgICAgICAgICAgICAgICAgaWRlbnRzID0gJ2NlbGxfdHlwZScsIG1lYW5zID0gbWVhbnMsIHB2YWxzID0gcHZhbHMsCiAgICAgICAgICAgICAgICAgICAgICBnZW5lLmZhbWlseSA9ICdjb3N0aW11bGF0b3J5JyxyZXR1cm5fdGFibGUgPSBGLG1heF9zaXplID0gMyxwLmFkanVzdC5tZXRob2QgPSAiZmRyIixrZWVwX3NpZ25pZmljYW50X29ubHkgPSBULGNsdXN0ZXJfcm93cyA9IEYpKwogICAgICAgICAgICBnZ3RpdGxlKCJDb3N0aW11bGF0b3J5IE15byIpCiAgLHRpdGxlID0gIk15byIpCgpwcmludF90YWIocGx0ID0gCiAgICAgICAgICAgIHBsb3RfY3BkYihjZWxsX3R5cGUxID0gJ0NEfEJ8RkMnLCBjZWxsX3R5cGUyID0gJ0NBRicsIHNjZGF0YSA9IGFjY19jYW5jZXJfY2Q0NV9jYWYsCiAgICAgICAgICAgICAgICAgICAgICBpZGVudHMgPSAnY2VsbF90eXBlJywgbWVhbnMgPSBtZWFucywgcHZhbHMgPSBwdmFscywKICAgICAgICAgICAgICAgICAgICAgIGdlbmUuZmFtaWx5ID0gJ2Nvc3RpbXVsYXRvcnknLHJldHVybl90YWJsZSA9IEYsbWF4X3NpemUgPSAzLHAuYWRqdXN0Lm1ldGhvZCA9ICJmZHIiLGtlZXBfc2lnbmlmaWNhbnRfb25seSA9IFQsY2x1c3Rlcl9yb3dzID0gRikrCiAgICAgICAgICAgIGdndGl0bGUoIkNvc3RpbXVsYXRvcnkgTXlvIikKICAsdGl0bGUgPSAiQ0FGIikKCnByaW50X3RhYihwbHQgPSAKICAgICAgICAgICAgdW5pcV9pbnRlcmFjdGlvbnMoY2VsbF90eXBlMSA9ICdDRHxCfEZDJyxjZWxsX3R5cGUyX2EgID0gJ0x1bWluYWwnLGNlbGxfdHlwZTJfYiA9ICJNeW8iLGdlbmUuZmFtaWx5ID0gIkNvc3RpbXVsYXRvcnkiKQosdGl0bGUgPSAidW5pcXVlIGluIGx1bWluYWwiKQoKCnByaW50X3RhYihwbHQgPSAKICAgICAgICAgICAgdW5pcV9pbnRlcmFjdGlvbnMoY2VsbF90eXBlMSA9ICdDRHxCfEZDJyxjZWxsX3R5cGUyX2EgID0gJ015bycsY2VsbF90eXBlMl9iID0gIkx1bWluYWwiLGdlbmUuZmFtaWx5ID0gIkNvc3RpbXVsYXRvcnkiKQosdGl0bGUgPSAidW5pcXVlIGluIG15byIpCgpwcmludF90YWIocGx0ID0gCiAgICAgICAgICAgIHVuaXFfaW50ZXJhY3Rpb25zKGNlbGxfdHlwZTEgPSAnQ0R8QnxGQycsY2VsbF90eXBlMl9hICA9ICdDQUYnLGNlbGxfdHlwZTJfYiA9ICJNeW98THVtaW5hbCIsZ2VuZS5mYW1pbHkgPSAiQ29zdGltdWxhdG9yeSIpCix0aXRsZSA9ICJ1bmlxdWUgaW4gQ0FGIikKYGBgCgojIENvaW5oaWJpdG9yeSBpbnRlcmFjdGlvbnMgey50YWJzZXR9CgpgYGB7ciBmaWcuaGVpZ2h0PTUscmVzdWx0cz0nYXNpcyd9CgpwcmludF90YWIocGxvdF9jcGRiKGNlbGxfdHlwZTEgPSAnQ0R8QnxGQycsIGNlbGxfdHlwZTIgPSAnTHVtaW5hbCcsIHNjZGF0YSA9IGFjY19jYW5jZXJfY2Q0NV9jYWYsCiAgICAgICAgICBpZGVudHMgPSAnY2VsbF90eXBlJywgbWVhbnMgPSBtZWFucywgcHZhbHMgPSBwdmFscywKICAgICAgICAgIGdlbmUuZmFtaWx5ID0gJ2NvaW5oaWJpdG9yeScscmV0dXJuX3RhYmxlID0gRixtYXhfc2l6ZSA9IDQscC5hZGp1c3QubWV0aG9kID0gImZkciIsa2VlcF9zaWduaWZpY2FudF9vbmx5ID0gRixjbHVzdGVyX3Jvd3MgPSBGKSsKICBnZ3RpdGxlKCJjb2luaGliaXRvcnkgTHVtaW5hbCIpLHRpdGxlID0gIkx1bWluYWwiKQoKcHJpbnRfdGFiKHBsb3RfY3BkYihjZWxsX3R5cGUxID0gJ0NEfEJ8RkMnLCBjZWxsX3R5cGUyID0gJ015bycsIHNjZGF0YSA9IGFjY19jYW5jZXJfY2Q0NV9jYWYsCiAgICAgICAgICBpZGVudHMgPSAnY2VsbF90eXBlJywgbWVhbnMgPSBtZWFucywgcHZhbHMgPSBwdmFscywKICAgICAgICAgIGdlbmUuZmFtaWx5ID0gJ2NvaW5oaWJpdG9yeScscmV0dXJuX3RhYmxlID0gRixtYXhfc2l6ZSA9IDQscC5hZGp1c3QubWV0aG9kID0gImZkciIsa2VlcF9zaWduaWZpY2FudF9vbmx5ID0gRixjbHVzdGVyX3Jvd3MgPSBGKSsKICBnZ3RpdGxlKCJjb2luaGliaXRvcnkgTXlvIiksdGl0bGUgPSAiTXlvIikKCnByaW50X3RhYihwbHQgPSAKICAgICAgICAgICAgdW5pcV9pbnRlcmFjdGlvbnMoY2VsbF90eXBlMSA9ICdDRHxCfEZDJyxjZWxsX3R5cGUyX2EgID0gJ0x1bWluYWwnLGNlbGxfdHlwZTJfYiA9ICJNeW8iLGdlbmUuZmFtaWx5ID0gImNvaW5oaWJpdG9yeSIpCix0aXRsZSA9ICJ1bmlxdWUgaW4gbHVtaW5hbCIpCgoKcHJpbnRfdGFiKHBsdCA9IAogICAgICAgICAgICB1bmlxX2ludGVyYWN0aW9ucyhjZWxsX3R5cGUxID0gJ0NEfEJ8RkMnLGNlbGxfdHlwZTJfYSAgPSAnTXlvJyxjZWxsX3R5cGUyX2IgPSAiTHVtaW5hbCIsZ2VuZS5mYW1pbHkgPSAiY29pbmhpYml0b3J5IikKLHRpdGxlID0gInVuaXF1ZSBpbiBteW8iKQoKcHJpbnRfdGFiKHBsdCA9IAogICAgICAgICAgICB1bmlxX2ludGVyYWN0aW9ucyhjZWxsX3R5cGUxID0gJ0NEfEJ8RkMnLGNlbGxfdHlwZTJfYSAgPSAnQ0FGJyxjZWxsX3R5cGUyX2IgPSAiTXlvfEx1bWluYWwiLGdlbmUuZmFtaWx5ID0gImNvaW5oaWJpdG9yeSIpCix0aXRsZSA9ICJ1bmlxdWUgaW4gQ0FGIikKCmBgYAoKIyBDaGVtb2tpbmVzIGludGVyYWN0aW9ucyB7LnRhYnNldH0KYGBge3IgZmlnLmhlaWdodD02LCByZXN1bHRzPSdhc2lzJ30KcHJpbnRfdGFiKAogIHBsb3RfY3BkYihjZWxsX3R5cGUxID0gJ0NEfEJ8RkMnLCBjZWxsX3R5cGUyID0gJ0x1bWluYWwnLCBzY2RhdGEgPSBhY2NfY2FuY2VyX2NkNDVfY2FmLAogICAgICAgICAgaWRlbnRzID0gJ2NlbGxfdHlwZScsIG1lYW5zID0gbWVhbnMsIHB2YWxzID0gcHZhbHMsCiAgICAgICAgICBnZW5lLmZhbWlseSA9ICdjaGVtb2tpbmVzJyxyZXR1cm5fdGFibGUgPSBGLG1heF9zaXplID0gNCxwLmFkanVzdC5tZXRob2QgPSAiZmRyIixrZWVwX3NpZ25pZmljYW50X29ubHkgPSBGLGNsdXN0ZXJfcm93cyA9IEYpKwogIGdndGl0bGUoImNoZW1va2luZXMgTHVtaW5hbCIpLHRpdGxlID0gIkx1bWluYWwiKQoKcHJpbnRfdGFiKAogIHBsb3RfY3BkYihjZWxsX3R5cGUxID0gJ0NEfEJ8RkMnLCBjZWxsX3R5cGUyID0gJ015bycsIHNjZGF0YSA9IGFjY19jYW5jZXJfY2Q0NV9jYWYsCiAgICAgICAgICBpZGVudHMgPSAnY2VsbF90eXBlJywgbWVhbnMgPSBtZWFucywgcHZhbHMgPSBwdmFscywKICAgICAgICAgIGdlbmUuZmFtaWx5ID0gJ2NoZW1va2luZXMnLHJldHVybl90YWJsZSA9IEYsbWF4X3NpemUgPSA0LHAuYWRqdXN0Lm1ldGhvZCA9ICJmZHIiLGtlZXBfc2lnbmlmaWNhbnRfb25seSA9IEYsY2x1c3Rlcl9yb3dzID0gRikrCiAgZ2d0aXRsZSgiY2hlbW9raW5lcyBNeW8iKSx0aXRsZSA9ICJNeW8iKQoKCnByaW50X3RhYihwbHQgPSAKICAgICAgICAgICAgdW5pcV9pbnRlcmFjdGlvbnMoY2VsbF90eXBlMSA9ICdDRHxCfEZDJyxjZWxsX3R5cGUyX2EgID0gJ0x1bWluYWwnLGNlbGxfdHlwZTJfYiA9ICJNeW8iLGdlbmUuZmFtaWx5ID0gImNoZW1va2luZXMiKQosdGl0bGUgPSAidW5pcXVlIGluIGx1bWluYWwiKQoKCnByaW50X3RhYihwbHQgPSAKICAgICAgICAgICAgdW5pcV9pbnRlcmFjdGlvbnMoY2VsbF90eXBlMSA9ICdDRHxCfEZDJyxjZWxsX3R5cGUyX2EgID0gJ015bycsY2VsbF90eXBlMl9iID0gIkx1bWluYWwiLGdlbmUuZmFtaWx5ID0gImNoZW1va2luZXMiKQosdGl0bGUgPSAidW5pcXVlIGluIG15byIpCgpwcmludF90YWIocGx0ID0gCiAgICAgICAgICAgIHVuaXFfaW50ZXJhY3Rpb25zKGNlbGxfdHlwZTEgPSAnQ0R8QnxGQycsY2VsbF90eXBlMl9hICA9ICdDQUYnLGNlbGxfdHlwZTJfYiA9ICJNeW98THVtaW5hbCIsZ2VuZS5mYW1pbHkgPSAiY2hlbW9raW5lcyIpCix0aXRsZSA9ICJ1bmlxdWUgaW4gQ0FGIikKYGBgCiMgQ2hlbW9raW5lIGxpZ2FuZHMgey50YWJzZXR9CmBgYHtyIHJlc3VsdHM9J2FzaXMnfQpnZW5lcyA9IGMoIkNYQ0wxXFxEIiwgIkNYQ0wyXFxEIiwiQ1hDTDNcXEQiLCJDWENMMTciLCJDMyIsIkNYQ0wxNCIpCnByaW50X3RhYihwbG90X2NwZGIoY2VsbF90eXBlMSA9ICdDRHxCfEZDJywgY2VsbF90eXBlMiA9ICdNeW8nLCBzY2RhdGEgPSBhY2NfY2FuY2VyX2NkNDVfY2FmLAogICAgaWRlbnRzID0gJ2NlbGxfdHlwZScsIG1lYW5zID0gbWVhbnMsIHB2YWxzID0gcHZhbHMsCiBnZW5lcyA9IGdlbmVzLHJldHVybl90YWJsZSA9IEYsbWF4X3NpemUgPSA0LHAuYWRqdXN0Lm1ldGhvZCA9ICJmZHIiICxrZWVwX3NpZ25pZmljYW50X29ubHkgPSBGKSAKICx0aXRsZSA9ICJNeW8iKQoKcHJpbnRfdGFiKHBsb3RfY3BkYihjZWxsX3R5cGUxID0gJ0NEfEJ8RkMnLCBjZWxsX3R5cGUyID0gJ0x1bWluYWwnLCBzY2RhdGEgPSBhY2NfY2FuY2VyX2NkNDVfY2FmLAogICAgaWRlbnRzID0gJ2NlbGxfdHlwZScsIG1lYW5zID0gbWVhbnMsIHB2YWxzID0gcHZhbHMsCiAgZ2VuZXMgPSBnZW5lcyxyZXR1cm5fdGFibGUgPSBGLG1heF9zaXplID0gNCxwLmFkanVzdC5tZXRob2QgPSAiZmRyIiAsa2VlcF9zaWduaWZpY2FudF9vbmx5ID0gRikgCix0aXRsZSA9ICJMdW1pbmFsIikKCgpwcmludF90YWIocGx0ID0gCiAgICAgICAgICAgIHVuaXFfaW50ZXJhY3Rpb25zKGNlbGxfdHlwZTEgPSAnQ0R8QnxGQycsY2VsbF90eXBlMl9hICA9ICdMdW1pbmFsJyxjZWxsX3R5cGUyX2IgPSAiTXlvIiwgZ2VuZXMgPSBnZW5lcykKLHRpdGxlID0gInVuaXF1ZSBpbiBsdW1pbmFsIikKCgpwcmludF90YWIocGx0ID0gCiAgICAgICAgICAgIHVuaXFfaW50ZXJhY3Rpb25zKGNlbGxfdHlwZTEgPSAnQ0R8QnxGQycsY2VsbF90eXBlMl9hICA9ICdNeW8nLGNlbGxfdHlwZTJfYiA9ICJMdW1pbmFsIiwgZ2VuZXMgPSBnZW5lcykKLHRpdGxlID0gInVuaXF1ZSBpbiBteW8iKQoKcHJpbnRfdGFiKHBsdCA9IAogICAgICAgICAgICB1bmlxX2ludGVyYWN0aW9ucyhjZWxsX3R5cGUxID0gJ0NEfEJ8RkMnLGNlbGxfdHlwZTJfYSAgPSAnQ0FGJyxjZWxsX3R5cGUyX2IgPSAiTXlvfEx1bWluYWwiLCBnZW5lcyA9IGdlbmVzKQosdGl0bGUgPSAidW5pcXVlIGluIENBRiIpCmBgYAojIENDTDIyIGFuZCBDQ0wyOCB7LnRhYnNldH0KYGBge3IgcmVzdWx0cz0nYXNpcyd9CnByaW50X3RhYihwbG90X2NwZGIoY2VsbF90eXBlMSA9ICdDRHxCfEZDJywgY2VsbF90eXBlMiA9ICdNeW8nLCBzY2RhdGEgPSBhY2NfY2FuY2VyX2NkNDVfY2FmLAogICAgaWRlbnRzID0gJ2NlbGxfdHlwZScsIG1lYW5zID0gbWVhbnMsIHB2YWxzID0gcHZhbHMsCiBnZW5lcyA9IGMoIkNDTDIyIiwgIkNDTDI4IiApLHJldHVybl90YWJsZSA9IEYsbWF4X3NpemUgPSA0LHAuYWRqdXN0Lm1ldGhvZCA9ICJmZHIiICxrZWVwX3NpZ25pZmljYW50X29ubHkgPSBGKSx0aXRsZSA9ICJNeW8iKQoKcHJpbnRfdGFiKHBsb3RfY3BkYihjZWxsX3R5cGUxID0gJ0NEfEJ8RkMnLCBjZWxsX3R5cGUyID0gJ0x1bWluYWwnLCBzY2RhdGEgPSBhY2NfY2FuY2VyX2NkNDVfY2FmLAogICAgaWRlbnRzID0gJ2NlbGxfdHlwZScsIG1lYW5zID0gbWVhbnMsIHB2YWxzID0gcHZhbHMsCiAgZ2VuZXMgPSBjKCJDQ0wyMiIsICJDQ0wyOCIgKSxyZXR1cm5fdGFibGUgPSBGLG1heF9zaXplID0gNixwLmFkanVzdC5tZXRob2QgPSAiZmRyIiAsa2VlcF9zaWduaWZpY2FudF9vbmx5ID0gRiksdGl0bGUgPSAiTHVtaW5hbCIpCgoKCmBgYAoKYGBge3IgZmlnLmhlaWdodD02fQpwbG90X2NwZGIoY2VsbF90eXBlMSA9ICdDRHxCfEZDJywgY2VsbF90eXBlMiA9ICdNeW8nLCBzY2RhdGEgPSBhY2NfY2FuY2VyX2NkNDVfY2FmLAogICAgaWRlbnRzID0gJ2NlbGxfdHlwZScsIG1lYW5zID0gbWVhbnMsIHB2YWxzID0gcHZhbHMsCiBnZW5lcyA9IGMoIkpBRyIsICJNWUIiICkscmV0dXJuX3RhYmxlID0gRixtYXhfc2l6ZSA9IDQscC5hZGp1c3QubWV0aG9kID0gImZkciIgLGtlZXBfc2lnbmlmaWNhbnRfb25seSA9IEYpIAoKcGxvdF9jcGRiKGNlbGxfdHlwZTEgPSAnQ0R8QnxGQycsIGNlbGxfdHlwZTIgPSAnTHVtaW5hbCcsIHNjZGF0YSA9IGFjY19jYW5jZXJfY2Q0NV9jYWYsCiAgICBpZGVudHMgPSAnY2VsbF90eXBlJywgbWVhbnMgPSBtZWFucywgcHZhbHMgPSBwdmFscywKICBnZW5lcyA9IGMoIkpBRyIsICJNWUIiICwgIk5PVENIIiwiSEVTMSIsIkhFWSIpLHJldHVybl90YWJsZSA9IEYsbWF4X3NpemUgPSA0LHAuYWRqdXN0Lm1ldGhvZCA9ICJmZHIiICxrZWVwX3NpZ25pZmljYW50X29ubHkgPSBGKSAKCgpgYGAKCjxzY3JpcHQgc3JjPSJodHRwczovL2h5cG90aGVzLmlzL2VtYmVkLmpzIiBhc3luYz48L3NjcmlwdD4KCg==