1 Parameters

suffix = ""
data_to_read = "./Data/acc_cancer_no146_primaryonly15k_cancercells.rds"

2 functions

3 Data

acc = read_rds(file = data_to_read)

4 ACC primary cancer cells

print_tab(plt = DimPlot(acc,group.by = "patient.ident"),title = "by patient")

by patient

print_tab(plt = DimPlot(acc,group.by = "lum_or_myo"),title = "cell type")

cell type

print_tab(plt = FeaturePlot(acc,features  = "luminal_over_myo"),title = "luminal_over_myo score")

luminal_over_myo score

NA

acc = SetIdent(object = acc,value = "lum_or_myo")
deg = FindMarkers(object = acc,ident.1 = "luminal",ident.2 = "myo",densify = T,logfc.threshold = 0)
acc_deg  = deg %>% mutate(fdr = p.adjust(p_val,method = "fdr"))%>% #add fdr
    filter((avg_log2FC>1 & fdr<0.1) | (avg_log2FC< (-1) & fdr<0.1))  #filter significant

5 Immune checkpoints

FeaturePlot(object = acc,features = c("CD247","PDCD1LG2","CTLA4"))

6 chemokines

6.1 Variable genes

print_tab(plt = FeaturePlot(object = acc,features = "CCL28"),title = "CCL28",subtitle_num = 3)

CCL28

print_tab(plt = FeaturePlot(object = acc,features = "CCL22"),title = "CCL22",subtitle_num = 3)

CCL22

print_tab(plt = FeaturePlot(object = acc,features = "CCL2"),title = "CCL2",subtitle_num = 3)

CCL2

NA

6.2 lum/myo DEG

CC genes in myo vs luminal deg:

cc_receptor_ligands = rownames(acc)[startsWith(x =rownames(acc), prefix = "CCR") | startsWith(x =rownames(acc), prefix = "CCL")]
deg_genes = cc_receptor_ligands[cc_receptor_ligands %in% rownames(acc_deg)]
acc_deg[deg_genes,]
NA

lumScore_vs_gene = FetchData(object = acc,vars = c("CCL28","lum_or_myo"))
lumScore_vs_gene = lumScore_vs_gene %>% dplyr::filter(lum_or_myo != "NA")
ccl28_plt = ggboxplot(lumScore_vs_gene, x = "lum_or_myo", y = "CCL28",
          palette = "jco",
          add = "jitter")+ 
  stat_compare_means(method = "wilcox.test",comparisons = list(c("luminal","myo")))+
  stat_summary(fun.data = function(x) data.frame(y=12, label = 
                                                   paste("Mean=",mean(x) %>% round(2),
                                                         "\n 0 TPM cells =", (sum(x==0,na.rm = T)/length(x))%>% round(2))), geom="text") +
     theme(legend.position="none")

lumScore_vs_gene = FetchData(object = acc,vars = c("CCL22","lum_or_myo"))
lumScore_vs_gene = lumScore_vs_gene %>% dplyr::filter(lum_or_myo != "NA")
ccl22_plt = ggboxplot(lumScore_vs_gene, x = "lum_or_myo", y = "CCL22",
          palette = "jco",
          add = "jitter")+ 
  stat_compare_means(method = "wilcox.test",comparisons = list(c("luminal","myo")))+
  stat_summary(fun.data = function(x) data.frame(y=12, label = 
                                                   paste("Mean=",mean(x) %>% round(2),
                                                         "\n 0 TPM cells =", (sum(x==0,na.rm = T)/length(x))%>% round(2))), geom="text") +
     theme(legend.position="none")

print_tab(plt = ccl28_plt,title = "CCL28 lum/myo",subtitle_num = 3)

CCL28 lum/myo

print_tab(plt = ccl22_plt,title = "CCL22 lum/myo",subtitle_num = 3)

CCL22 lum/myo

NA

7 CXC

7.1 Variable genes

print_tab(plt = FeaturePlot(object = acc,features = "CXCR4"),title = "receptors",subtitle_num = 3)

receptors

print_tab(plt = FeaturePlot(object = acc,features = c("CXCL1","CXCL2","CXCL3","CXCL14"))
,title = "receptors",subtitle_num = 3)

receptors

NA

7.2 lum/myo DEG

cxc_ligand = rownames(acc)[startsWith(x =rownames(acc), prefix = "CXCL") | startsWith(x =rownames(acc), prefix = "CXCR") ]
acc_deg[cxc_ligand[cxc_ligand %in% rownames(acc_deg)],]

lumScore_vs_gene = FetchData(object = acc,vars = c("CXCL2","lum_or_myo"))
lumScore_vs_gene = lumScore_vs_gene %>% dplyr::filter(lum_or_myo != "NA")
CXCL2_plt = ggboxplot(lumScore_vs_gene, x = "lum_or_myo", y = "CXCL2",
          palette = "jco",
          add = "jitter")+ 
  stat_compare_means(method = "wilcox.test",comparisons = list(c("luminal","myo")))+
  stat_summary(fun.data = function(x) data.frame(y=15, label = 
                                                   paste("Mean=",mean(x) %>% round(2),
                                                         "\n 0 TPM cells =", (sum(x==0,na.rm = T)/length(x))%>% round(2))), geom="text") +
     theme(legend.position="none")

lumScore_vs_gene = FetchData(object = acc,vars = c("CXCL3","lum_or_myo"))
lumScore_vs_gene = lumScore_vs_gene %>% dplyr::filter(lum_or_myo != "NA")
CXCL3_plt = ggboxplot(lumScore_vs_gene, x = "lum_or_myo", y = "CXCL3",
          palette = "jco",
          add = "jitter")+ 
  stat_compare_means(method = "wilcox.test",comparisons = list(c("luminal","myo")))+
  stat_summary(fun.data = function(x) data.frame(y=12, label = 
                                                   paste("Mean=",mean(x) %>% round(2),
                                                         "\n 0 TPM cells =", (sum(x==0,na.rm = T)/length(x))%>% round(2))), geom="text") +
     theme(legend.position="none")

lumScore_vs_gene = FetchData(object = acc,vars = c("CXCL14","lum_or_myo"))
lumScore_vs_gene = lumScore_vs_gene %>% dplyr::filter(lum_or_myo != "NA")
CXCL14_plt = ggboxplot(lumScore_vs_gene, x = "lum_or_myo", y = "CXCL14",
          palette = "jco",
          add = "jitter")+ 
  stat_compare_means(method = "wilcox.test",comparisons = list(c("luminal","myo")))+
  stat_summary(fun.data = function(x) data.frame(y=16, label = 
                                                   paste("Mean=",mean(x) %>% round(2),
                                                         "\n 0 TPM cells =", (sum(x==0,na.rm = T)/length(x))%>% round(2))), geom="text") +
     theme(legend.position="none")


print_tab(plt = CXCL2_plt,title = "CXCL2 lum/myo",subtitle_num = 3)

CXCL2 lum/myo

print_tab(plt = CXCL3_plt,title = "CXCL3 lum/myo",subtitle_num = 3)

CXCL3 lum/myo

print_tab(plt = CXCL14_plt,title = "CXCL14 lum/myo",subtitle_num = 3)

CXCL14 lum/myo

lumScore_vs_gene = FetchData(object = acc,vars = c("CXCL1","lum_or_myo"))
lumScore_vs_gene = lumScore_vs_gene %>% dplyr::filter(lum_or_myo != "NA")
CXCL1_plt = ggboxplot(lumScore_vs_gene, x = "lum_or_myo", y = "CXCL1",
          palette = "jco",
          add = "jitter")+ 
  stat_compare_means(method = "wilcox.test",comparisons = list(c("luminal","myo")))+
  stat_summary(fun.data = function(x) data.frame(y=16, label = 
                                                   paste("Mean=",mean(x) %>% round(2),
                                                         "\n 0 TPM cells =", (sum(x==0,na.rm = T)/length(x))%>% round(2))), geom="text") +
     theme(legend.position="none")


print_tab(plt = CXCL1_plt,title = "CXCL1 lum/myo",subtitle_num = 3)

CXCL1 lum/myo

lumScore_vs_gene = FetchData(object = acc,vars = c("CXCL17","lum_or_myo"))
lumScore_vs_gene = lumScore_vs_gene %>% dplyr::filter(lum_or_myo != "NA")
CXCL17_plt = ggboxplot(lumScore_vs_gene, x = "lum_or_myo", y = "CXCL17",
          palette = "jco",
          add = "jitter")+ 
  stat_compare_means(method = "wilcox.test",comparisons = list(c("luminal","myo")))+
  stat_summary(fun.data = function(x) data.frame(y=16, label = 
                                                   paste("Mean=",mean(x) %>% round(2),
                                                         "\n 0 TPM cells =", (sum(x==0,na.rm = T)/length(x))%>% round(2))), geom="text") +
     theme(legend.position="none")


print_tab(plt = CXCL17_plt,title = "CXCL17 lum/myo",subtitle_num = 3)

CXCL17 lum/myo

NA

8 IL receptor

8.1 Variable genes

print_tab(plt = FeaturePlot(object = acc,features = c("IL17RB","IL17RD","IL17RE","IL17RC","IL17RA")),title = "IL17",subtitle_num = 3)

IL17

print_tab(plt = FeaturePlot(object = acc,features = c("IL1R2","IL1R1","IL1RAP","IL2RA")),title = "IL1-2",subtitle_num = 3)

IL1-2

print_tab(plt = FeaturePlot(object = acc,features = c( "IL10RB","IL11RA","IL27RA","IL13RA1")),title = "IL10-11-13-27",subtitle_num = 3)

IL10-11-13-27

NA

8.2 lum/myo DEG

il_receptors_genes = rownames(acc)[grepl("^IL\\d*R.*", rownames(acc))]
genes_in_deg = il_receptors_genes[il_receptors_genes %in% rownames(acc_deg)]
acc_deg[genes_in_deg,]

for (gene in genes_in_deg) {
  lumScore_vs_gene = FetchData(object = acc,vars = c(gene,"lum_or_myo"))
lumScore_vs_gene = lumScore_vs_gene %>% dplyr::filter(lum_or_myo != "NA")
plt = ggboxplot(lumScore_vs_gene, x = "lum_or_myo", y = gene,
          palette = "jco",
          add = "jitter")+ 
  stat_compare_means(method = "wilcox.test",comparisons = list(c("luminal","myo")))+
  stat_summary(fun.data = function(x) data.frame(y=10, label = 
                                                   paste("Mean=",mean(x) %>% round(2),
                                                         "\n 0 TPM cells =", (sum(x==0,na.rm = T)/length(x))%>% round(2))), geom="text") +
     theme(legend.position="none")


print_tab(plt = plt,title = paste(gene,"lum/myo"),subtitle_num = 3)
}

IL17RD lum/myo

IL1RAP lum/myo

IL20RA lum/myo

IL2RA lum/myo

NA

9 HLA 1 genes

9.1 UMAP

hla_genes = rownames(acc)[startsWith(x =rownames(acc), prefix = "HLA")]
hla_class_1 = hla_genes[!startsWith(x =hla_genes, prefix = "HLA-D")]

print_tab(plt = FeaturePlot(object = acc,features = c("HLA-A","HLA-B","HLA-C")),title = "classical  HLA 1 genes",subtitle_num = 3)

classical HLA 1 genes

i=1
exit = F
non_classical  = hla_class_1 [!hla_class_1 %in% c("HLA-A","HLA-B","HLA-C")] %>% sort()
while (!exit) {
  print_tab(plt =  FeaturePlot(object = acc,features = non_classical[i:(i+3)]),title = non_classical[i:(i+3)],subtitle_num = 3)

  i= i+4
  if (i > length(non_classical)) { exit = T}
}

HLA-E HLA-F HLA-G HLA-H

HLA-J HLA-K HLA-L HLA-N

HLA-P HLA-S HLA-T HLA-U

HLA-V HLA-W HLA-Z NA

Warning in FetchData.Seurat(object = object, vars = c(dims, “ident”, features), : The following requested variables were not found: NA

NA

9.2 lum/myo DEG

genes_in_deg = hla_class_1[hla_class_1 %in% rownames(acc_deg)]
acc_deg[genes_in_deg,]


for (gene in genes_in_deg) {
  lumScore_vs_gene = FetchData(object = acc,vars = c(gene,"lum_or_myo"))
lumScore_vs_gene = lumScore_vs_gene %>% dplyr::filter(lum_or_myo != "NA")
plt = ggboxplot(lumScore_vs_gene, x = "lum_or_myo", y = gene,
          palette = "jco",
          add = "jitter")+ 
  stat_compare_means(method = "wilcox.test",comparisons = list(c("luminal","myo")))+
  stat_summary(fun.data = function(x) data.frame(y=max(x)+1, label = 
                                                   paste("Mean=",mean(x) %>% round(2),
                                                         "\n 0 TPM cells =", (sum(x==0,na.rm = T)/length(x))%>% round(2))), geom="text") +
     theme(legend.position="none")


print_tab(plt = plt,title = paste(gene,"lum/myo"),subtitle_num = 3)
}

HLA-F lum/myo

HLA-W lum/myo

HLA-L lum/myo

HLA-B lum/myo

NA

10 HLA 1 signature

correlation of non classical hla1

hla = FetchData(object = acc,vars = non_classical)

cor_res = cor(hla)
pheatmap(cor_res)

  geneIds = c("HLA-T","HLA-G","HLA-H","HLA-K","HLA-W","HLA-L","HLA-F","HLA-J")
  genes = paste(geneIds,collapse = ",")
  print("signature genes: " %>% paste(genes))
[1] "signature genes:  HLA-T,HLA-G,HLA-H,HLA-K,HLA-W,HLA-L,HLA-F,HLA-J"
  score <- apply(acc@assays$RNA@data[geneIds,],2,mean)
  acc=AddMetaData(acc,score,col.name = "HLA_signature")
  FeaturePlot(object = acc,features = "HLA_signature")

11 Other immune genes differentially expressed between lum/myo

intersect DEG with GO “immune response GO:0006955

# ensembl = useMart("ensembl",dataset="hsapiens_gene_ensembl") #uses human ensembl annotations
# 
#  immune_genes <- getBM(attributes=c('hgnc_symbol'),
#        filters = 'go', values = 'GO:0002376', mart = ensembl)

immune_genes = fread(input = "./Data/GO_term_summary_20230218_165937.txt",sep = "\t", select = 2) %>% pull(1)
Warning in fread(input = "./Data/GO_term_summary_20230218_165937.txt", sep = "\t",  :
  Detected 11 column names but the data has 12 columns (i.e. invalid file). Added 1 extra default column name for the first column which is guessed to be row names or an index. Use setnames() afterwards if this guess is not correct, or fix the file write command that created the file to create a valid file.
acc_deg[intersect(rownames(acc_deg),immune_genes),]
FeaturePlot(object = acc_cancer,features = "C3")

12 Retinoic acid pathway

library(msigdbr)

genes = msigdbr(species = "Homo sapiens", category = "C2") %>% filter(gs_subcat != "CGP" & grepl('RETINOIC', gs_name))

retinoic_acid_pathways = unique(genes$gs_name)
retinoic_acid_pathways = retinoic_acid_pathways[c(2)] #take relevant pathways
pathway_genes = genes %>% filter(gs_name == pathway) %>% pull("gene_symbol") 
print("pathway name:" %>% paste(retinoic_acid_pathways))
[1] "pathway name: REACTOME_SIGNALING_BY_RETINOIC_ACID"
print("genes in pathway:" )
[1] "genes in pathway:"
print(pathway_genes)
 [1] "ADH1A"   "ADH1C"   "ADH4"    "AKR1C3"  "ALDH1A1" "ALDH1A2" "ALDH1A3" "ALDH8A1" "CPT1A"   "CPT1B"   "CRABP1" 
[12] "CRABP2"  "CYP26A1" "CYP26B1" "CYP26C1" "DHRS3"   "DHRS4"   "DHRS4"   "DHRS9"   "DLAT"    "DLD"     "FABP5"  
[23] "PDHA1"   "PDHA2"   "PDHB"    "PDHX"    "PDK1"    "PDK2"    "PDK3"    "PDK4"    "PPARD"   "RARA"    "RARB"   
[34] "RARG"    "RDH10"   "RDH11"   "RDH13"   "RDH13"   "RDH13"   "RDH13"   "RDH13"   "RDH13"   "RDH13"   "RDH13"  
[45] "RDH13"   "RDH13"   "RDH14"   "RDH16"   "RDH5"    "RXRA"    "RXRB"    "RXRB"    "RXRB"    "RXRB"    "RXRB"   
[56] "RXRB"    "RXRG"    "SDR16C5"

12.1 DEG between lum and myo

Positive avg_log2FC indicate that the gene is more highly expressed in the Luminal cells, negative in myo cells

acc_deg[intersect(rownames(acc_deg),pathway_genes),]

According to https://reactome.org/PathwayBrowser/#/R-HSA-5362517

ATRA pathway

  • ALDH1A1, 2 and 3 utilise NAD+ as cofactor to oxidise all-trans-retinal (atRAL) to all-trans-retinoic acid (atRA).

  • (FABP5) is a cytosolic, lipid-binding protein thought to bind all-trans-retinoic acid (atRA) and mediate its delivery to retinoic acid receptors (RARs)

  • RDH10 is part of membrane bound oxidoreductases that reversibly catalyse the first and rate limiting step in retinoic acid biosynthesis, and use NAD+ as cofactor to the corresponding aldehyde all trans retinal (atRAL)

  • atRA can significantly increase the expression of proteins involved in energy metabolism such as PDK via induction of PPARD (Wolf 2010)

This can support the paper from Piero Dalerba, since there are high in the Luminal cells.

  • In constrast, DHRS3 may contribute to the reduction of all-trans-retinal (atRAL) to all-trans-retinol (atROL), (Haeseleer et al. 1998, Haeseleer et al. 2002, Kedishvili et al. 2002, Lin et al. 2001, Zhen et al. 2003, Belyaeva et al. 2008). DHRS3 is up in myo cells, thus supports the paper.
LS0tCnRpdGxlOiAnYHIgcnN0dWRpb2FwaTo6Z2V0U291cmNlRWRpdG9yQ29udGV4dCgpJHBhdGggJT4lIGJhc2VuYW1lKCkgJT4lIGdzdWIocGF0dGVybiA9ICJcXC5SbWQiLHJlcGxhY2VtZW50ID0gIiIpYCcgCmF1dGhvcjogIkF2aXNoYWkgV2l6ZWwiCmRhdGU6ICdgciBTeXMudGltZSgpYCcKb3V0cHV0OiAKICBodG1sX25vdGVib29rOiAKICAgIGNvZGVfZm9sZGluZzogaGlkZQogICAgdG9jOiB5ZXMKICAgIHRvY19jb2xsYXBzZTogeWVzCiAgICB0b2NfZmxvYXQ6IAogICAgICBjb2xsYXBzZWQ6IEZBTFNFCiAgICBudW1iZXJfc2VjdGlvbnM6IHRydWUKICAgIHRvY19kZXB0aDogMQotLS0KCiMgUGFyYW1ldGVycwoKYGBge3Igd2FybmluZz1GQUxTRX0Kc3VmZml4ID0gIiIKZGF0YV90b19yZWFkID0gIi4vRGF0YS9hY2NfY2FuY2VyX25vMTQ2X3ByaW1hcnlvbmx5MTVrX2NhbmNlcmNlbGxzLnJkcyIKYGBgCgoKIyBmdW5jdGlvbnMKCmBgYHtyIHdhcm5pbmc9RkFMU0V9CmBgYAoKIyBEYXRhCgpgYGB7cn0KYWNjID0gcmVhZF9yZHMoZmlsZSA9IGRhdGFfdG9fcmVhZCkKYGBgCgojIEFDQyBwcmltYXJ5IGNhbmNlciBjZWxscyB7LnRhYnNldH0KCmBgYHtyIGVjaG89VFJVRSwgcmVzdWx0cz0nYXNpcyd9CnByaW50X3RhYihwbHQgPSBEaW1QbG90KGFjYyxncm91cC5ieSA9ICJwYXRpZW50LmlkZW50IiksdGl0bGUgPSAiYnkgcGF0aWVudCIpCnByaW50X3RhYihwbHQgPSBEaW1QbG90KGFjYyxncm91cC5ieSA9ICJsdW1fb3JfbXlvIiksdGl0bGUgPSAiY2VsbCB0eXBlIikKcHJpbnRfdGFiKHBsdCA9IEZlYXR1cmVQbG90KGFjYyxmZWF0dXJlcyAgPSAibHVtaW5hbF9vdmVyX215byIpLHRpdGxlID0gImx1bWluYWxfb3Zlcl9teW8gc2NvcmUiKQoKYGBgCgoKCmBgYHtyfQphY2MgPSBTZXRJZGVudChvYmplY3QgPSBhY2MsdmFsdWUgPSAibHVtX29yX215byIpCmRlZyA9IEZpbmRNYXJrZXJzKG9iamVjdCA9IGFjYyxpZGVudC4xID0gImx1bWluYWwiLGlkZW50LjIgPSAibXlvIixkZW5zaWZ5ID0gVCxsb2dmYy50aHJlc2hvbGQgPSAwKQpgYGAKCmBgYHtyfQphY2NfZGVnICA9IGRlZyAlPiUgbXV0YXRlKGZkciA9IHAuYWRqdXN0KHBfdmFsLG1ldGhvZCA9ICJmZHIiKSklPiUgI2FkZCBmZHIKICAgIGZpbHRlcigoYXZnX2xvZzJGQz4xICYgZmRyPDAuMSkgfCAoYXZnX2xvZzJGQzwgKC0xKSAmIGZkcjwwLjEpKSAgI2ZpbHRlciBzaWduaWZpY2FudApgYGAKCgojIEltbXVuZSBjaGVja3BvaW50cwpgYGB7ciBmaWcuaGVpZ2h0PTgsIGZpZy53aWR0aD0xMH0KRmVhdHVyZVBsb3Qob2JqZWN0ID0gYWNjLGZlYXR1cmVzID0gYygiQ0QyNDciLCJQRENEMUxHMiIsIkNUTEE0IikpCmBgYAoKIyBjaGVtb2tpbmVzICAKIyMgVmFyaWFibGUgZ2VuZXMgey50YWJzZXR9CmBgYHtyIHJlc3VsdHM9J2FzaXMnfQpwcmludF90YWIocGx0ID0gRmVhdHVyZVBsb3Qob2JqZWN0ID0gYWNjLGZlYXR1cmVzID0gIkNDTDI4IiksdGl0bGUgPSAiQ0NMMjgiLHN1YnRpdGxlX251bSA9IDMpCnByaW50X3RhYihwbHQgPSBGZWF0dXJlUGxvdChvYmplY3QgPSBhY2MsZmVhdHVyZXMgPSAiQ0NMMjIiKSx0aXRsZSA9ICJDQ0wyMiIsc3VidGl0bGVfbnVtID0gMykKcHJpbnRfdGFiKHBsdCA9IEZlYXR1cmVQbG90KG9iamVjdCA9IGFjYyxmZWF0dXJlcyA9ICJDQ0wyIiksdGl0bGUgPSAiQ0NMMiIsc3VidGl0bGVfbnVtID0gMykKYGBgCgojIyBsdW0vbXlvIERFRyB7LnRhYnNldH0KQ0MgZ2VuZXMgaW4gbXlvIHZzIGx1bWluYWwgZGVnOgpgYGB7cn0KY2NfcmVjZXB0b3JfbGlnYW5kcyA9IHJvd25hbWVzKGFjYylbc3RhcnRzV2l0aCh4ID1yb3duYW1lcyhhY2MpLCBwcmVmaXggPSAiQ0NSIikgfCBzdGFydHNXaXRoKHggPXJvd25hbWVzKGFjYyksIHByZWZpeCA9ICJDQ0wiKV0KZGVnX2dlbmVzID0gY2NfcmVjZXB0b3JfbGlnYW5kc1tjY19yZWNlcHRvcl9saWdhbmRzICVpbiUgcm93bmFtZXMoYWNjX2RlZyldCmFjY19kZWdbZGVnX2dlbmVzLF0KCmBgYAoKCmBgYHtyIGVjaG89VFJVRSwgcmVzdWx0cz0nYXNpcyd9CgpsdW1TY29yZV92c19nZW5lID0gRmV0Y2hEYXRhKG9iamVjdCA9IGFjYyx2YXJzID0gYygiQ0NMMjgiLCJsdW1fb3JfbXlvIikpCmx1bVNjb3JlX3ZzX2dlbmUgPSBsdW1TY29yZV92c19nZW5lICU+JSBkcGx5cjo6ZmlsdGVyKGx1bV9vcl9teW8gIT0gIk5BIikKY2NsMjhfcGx0ID0gZ2dib3hwbG90KGx1bVNjb3JlX3ZzX2dlbmUsIHggPSAibHVtX29yX215byIsIHkgPSAiQ0NMMjgiLAogICAgICAgICAgcGFsZXR0ZSA9ICJqY28iLAogICAgICAgICAgYWRkID0gImppdHRlciIpKyAKICBzdGF0X2NvbXBhcmVfbWVhbnMobWV0aG9kID0gIndpbGNveC50ZXN0Iixjb21wYXJpc29ucyA9IGxpc3QoYygibHVtaW5hbCIsIm15byIpKSkrCiAgc3RhdF9zdW1tYXJ5KGZ1bi5kYXRhID0gZnVuY3Rpb24oeCkgZGF0YS5mcmFtZSh5PTEyLCBsYWJlbCA9IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXN0ZSgiTWVhbj0iLG1lYW4oeCkgJT4lIHJvdW5kKDIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXG4gMCBUUE0gY2VsbHMgPSIsIChzdW0oeD09MCxuYS5ybSA9IFQpL2xlbmd0aCh4KSklPiUgcm91bmQoMikpKSwgZ2VvbT0idGV4dCIpICsKICAgICB0aGVtZShsZWdlbmQucG9zaXRpb249Im5vbmUiKQoKbHVtU2NvcmVfdnNfZ2VuZSA9IEZldGNoRGF0YShvYmplY3QgPSBhY2MsdmFycyA9IGMoIkNDTDIyIiwibHVtX29yX215byIpKQpsdW1TY29yZV92c19nZW5lID0gbHVtU2NvcmVfdnNfZ2VuZSAlPiUgZHBseXI6OmZpbHRlcihsdW1fb3JfbXlvICE9ICJOQSIpCmNjbDIyX3BsdCA9IGdnYm94cGxvdChsdW1TY29yZV92c19nZW5lLCB4ID0gImx1bV9vcl9teW8iLCB5ID0gIkNDTDIyIiwKICAgICAgICAgIHBhbGV0dGUgPSAiamNvIiwKICAgICAgICAgIGFkZCA9ICJqaXR0ZXIiKSsgCiAgc3RhdF9jb21wYXJlX21lYW5zKG1ldGhvZCA9ICJ3aWxjb3gudGVzdCIsY29tcGFyaXNvbnMgPSBsaXN0KGMoImx1bWluYWwiLCJteW8iKSkpKwogIHN0YXRfc3VtbWFyeShmdW4uZGF0YSA9IGZ1bmN0aW9uKHgpIGRhdGEuZnJhbWUoeT0xMiwgbGFiZWwgPSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzdGUoIk1lYW49IixtZWFuKHgpICU+JSByb3VuZCgyKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlxuIDAgVFBNIGNlbGxzID0iLCAoc3VtKHg9PTAsbmEucm0gPSBUKS9sZW5ndGgoeCkpJT4lIHJvdW5kKDIpKSksIGdlb209InRleHQiKSArCiAgICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJub25lIikKCnByaW50X3RhYihwbHQgPSBjY2wyOF9wbHQsdGl0bGUgPSAiQ0NMMjggbHVtL215byIsc3VidGl0bGVfbnVtID0gMykKcHJpbnRfdGFiKHBsdCA9IGNjbDIyX3BsdCx0aXRsZSA9ICJDQ0wyMiBsdW0vbXlvIixzdWJ0aXRsZV9udW0gPSAzKQoKCmBgYAoKIyBDWEMKCiMjIFZhcmlhYmxlIGdlbmVzIHsudGFic2V0fQoKYGBge3IgZWNobz1UUlVFLCBmaWcuaGVpZ2h0PTgsIGZpZy53aWR0aD0xMCwgcmVzdWx0cz0nYXNpcyd9CnByaW50X3RhYihwbHQgPSBGZWF0dXJlUGxvdChvYmplY3QgPSBhY2MsZmVhdHVyZXMgPSAiQ1hDUjQiKSx0aXRsZSA9ICJyZWNlcHRvcnMiLHN1YnRpdGxlX251bSA9IDMpCnByaW50X3RhYihwbHQgPSBGZWF0dXJlUGxvdChvYmplY3QgPSBhY2MsZmVhdHVyZXMgPSBjKCJDWENMMSIsIkNYQ0wyIiwiQ1hDTDMiLCJDWENMMTQiKSkKLHRpdGxlID0gInJlY2VwdG9ycyIsc3VidGl0bGVfbnVtID0gMykKYGBgCgojIyBsdW0vbXlvIERFRyB7LnRhYnNldH0KYGBge3J9CmN4Y19saWdhbmQgPSByb3duYW1lcyhhY2MpW3N0YXJ0c1dpdGgoeCA9cm93bmFtZXMoYWNjKSwgcHJlZml4ID0gIkNYQ0wiKSB8IHN0YXJ0c1dpdGgoeCA9cm93bmFtZXMoYWNjKSwgcHJlZml4ID0gIkNYQ1IiKSBdCmFjY19kZWdbY3hjX2xpZ2FuZFtjeGNfbGlnYW5kICVpbiUgcm93bmFtZXMoYWNjX2RlZyldLF0KYGBgCgpgYGB7ciBlY2hvPVRSVUUsIGZpZy5oZWlnaHQ9OCwgZmlnLndpZHRoPTEwLCByZXN1bHRzPSdhc2lzJ30KCmx1bVNjb3JlX3ZzX2dlbmUgPSBGZXRjaERhdGEob2JqZWN0ID0gYWNjLHZhcnMgPSBjKCJDWENMMiIsImx1bV9vcl9teW8iKSkKbHVtU2NvcmVfdnNfZ2VuZSA9IGx1bVNjb3JlX3ZzX2dlbmUgJT4lIGRwbHlyOjpmaWx0ZXIobHVtX29yX215byAhPSAiTkEiKQpDWENMMl9wbHQgPSBnZ2JveHBsb3QobHVtU2NvcmVfdnNfZ2VuZSwgeCA9ICJsdW1fb3JfbXlvIiwgeSA9ICJDWENMMiIsCiAgICAgICAgICBwYWxldHRlID0gImpjbyIsCiAgICAgICAgICBhZGQgPSAiaml0dGVyIikrIAogIHN0YXRfY29tcGFyZV9tZWFucyhtZXRob2QgPSAid2lsY294LnRlc3QiLGNvbXBhcmlzb25zID0gbGlzdChjKCJsdW1pbmFsIiwibXlvIikpKSsKICBzdGF0X3N1bW1hcnkoZnVuLmRhdGEgPSBmdW5jdGlvbih4KSBkYXRhLmZyYW1lKHk9MTUsIGxhYmVsID0gCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3RlKCJNZWFuPSIsbWVhbih4KSAlPiUgcm91bmQoMiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcbiAwIFRQTSBjZWxscyA9IiwgKHN1bSh4PT0wLG5hLnJtID0gVCkvbGVuZ3RoKHgpKSU+JSByb3VuZCgyKSkpLCBnZW9tPSJ0ZXh0IikgKwogICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpCgpsdW1TY29yZV92c19nZW5lID0gRmV0Y2hEYXRhKG9iamVjdCA9IGFjYyx2YXJzID0gYygiQ1hDTDMiLCJsdW1fb3JfbXlvIikpCmx1bVNjb3JlX3ZzX2dlbmUgPSBsdW1TY29yZV92c19nZW5lICU+JSBkcGx5cjo6ZmlsdGVyKGx1bV9vcl9teW8gIT0gIk5BIikKQ1hDTDNfcGx0ID0gZ2dib3hwbG90KGx1bVNjb3JlX3ZzX2dlbmUsIHggPSAibHVtX29yX215byIsIHkgPSAiQ1hDTDMiLAogICAgICAgICAgcGFsZXR0ZSA9ICJqY28iLAogICAgICAgICAgYWRkID0gImppdHRlciIpKyAKICBzdGF0X2NvbXBhcmVfbWVhbnMobWV0aG9kID0gIndpbGNveC50ZXN0Iixjb21wYXJpc29ucyA9IGxpc3QoYygibHVtaW5hbCIsIm15byIpKSkrCiAgc3RhdF9zdW1tYXJ5KGZ1bi5kYXRhID0gZnVuY3Rpb24oeCkgZGF0YS5mcmFtZSh5PTEyLCBsYWJlbCA9IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXN0ZSgiTWVhbj0iLG1lYW4oeCkgJT4lIHJvdW5kKDIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXG4gMCBUUE0gY2VsbHMgPSIsIChzdW0oeD09MCxuYS5ybSA9IFQpL2xlbmd0aCh4KSklPiUgcm91bmQoMikpKSwgZ2VvbT0idGV4dCIpICsKICAgICB0aGVtZShsZWdlbmQucG9zaXRpb249Im5vbmUiKQoKbHVtU2NvcmVfdnNfZ2VuZSA9IEZldGNoRGF0YShvYmplY3QgPSBhY2MsdmFycyA9IGMoIkNYQ0wxNCIsImx1bV9vcl9teW8iKSkKbHVtU2NvcmVfdnNfZ2VuZSA9IGx1bVNjb3JlX3ZzX2dlbmUgJT4lIGRwbHlyOjpmaWx0ZXIobHVtX29yX215byAhPSAiTkEiKQpDWENMMTRfcGx0ID0gZ2dib3hwbG90KGx1bVNjb3JlX3ZzX2dlbmUsIHggPSAibHVtX29yX215byIsIHkgPSAiQ1hDTDE0IiwKICAgICAgICAgIHBhbGV0dGUgPSAiamNvIiwKICAgICAgICAgIGFkZCA9ICJqaXR0ZXIiKSsgCiAgc3RhdF9jb21wYXJlX21lYW5zKG1ldGhvZCA9ICJ3aWxjb3gudGVzdCIsY29tcGFyaXNvbnMgPSBsaXN0KGMoImx1bWluYWwiLCJteW8iKSkpKwogIHN0YXRfc3VtbWFyeShmdW4uZGF0YSA9IGZ1bmN0aW9uKHgpIGRhdGEuZnJhbWUoeT0xNiwgbGFiZWwgPSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzdGUoIk1lYW49IixtZWFuKHgpICU+JSByb3VuZCgyKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlxuIDAgVFBNIGNlbGxzID0iLCAoc3VtKHg9PTAsbmEucm0gPSBUKS9sZW5ndGgoeCkpJT4lIHJvdW5kKDIpKSksIGdlb209InRleHQiKSArCiAgICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJub25lIikKCgpwcmludF90YWIocGx0ID0gQ1hDTDJfcGx0LHRpdGxlID0gIkNYQ0wyIGx1bS9teW8iLHN1YnRpdGxlX251bSA9IDMpCnByaW50X3RhYihwbHQgPSBDWENMM19wbHQsdGl0bGUgPSAiQ1hDTDMgbHVtL215byIsc3VidGl0bGVfbnVtID0gMykKcHJpbnRfdGFiKHBsdCA9IENYQ0wxNF9wbHQsdGl0bGUgPSAiQ1hDTDE0IGx1bS9teW8iLHN1YnRpdGxlX251bSA9IDMpCgpsdW1TY29yZV92c19nZW5lID0gRmV0Y2hEYXRhKG9iamVjdCA9IGFjYyx2YXJzID0gYygiQ1hDTDEiLCJsdW1fb3JfbXlvIikpCmx1bVNjb3JlX3ZzX2dlbmUgPSBsdW1TY29yZV92c19nZW5lICU+JSBkcGx5cjo6ZmlsdGVyKGx1bV9vcl9teW8gIT0gIk5BIikKQ1hDTDFfcGx0ID0gZ2dib3hwbG90KGx1bVNjb3JlX3ZzX2dlbmUsIHggPSAibHVtX29yX215byIsIHkgPSAiQ1hDTDEiLAogICAgICAgICAgcGFsZXR0ZSA9ICJqY28iLAogICAgICAgICAgYWRkID0gImppdHRlciIpKyAKICBzdGF0X2NvbXBhcmVfbWVhbnMobWV0aG9kID0gIndpbGNveC50ZXN0Iixjb21wYXJpc29ucyA9IGxpc3QoYygibHVtaW5hbCIsIm15byIpKSkrCiAgc3RhdF9zdW1tYXJ5KGZ1bi5kYXRhID0gZnVuY3Rpb24oeCkgZGF0YS5mcmFtZSh5PTE2LCBsYWJlbCA9IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXN0ZSgiTWVhbj0iLG1lYW4oeCkgJT4lIHJvdW5kKDIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXG4gMCBUUE0gY2VsbHMgPSIsIChzdW0oeD09MCxuYS5ybSA9IFQpL2xlbmd0aCh4KSklPiUgcm91bmQoMikpKSwgZ2VvbT0idGV4dCIpICsKICAgICB0aGVtZShsZWdlbmQucG9zaXRpb249Im5vbmUiKQoKCnByaW50X3RhYihwbHQgPSBDWENMMV9wbHQsdGl0bGUgPSAiQ1hDTDEgbHVtL215byIsc3VidGl0bGVfbnVtID0gMykKCmx1bVNjb3JlX3ZzX2dlbmUgPSBGZXRjaERhdGEob2JqZWN0ID0gYWNjLHZhcnMgPSBjKCJDWENMMTciLCJsdW1fb3JfbXlvIikpCmx1bVNjb3JlX3ZzX2dlbmUgPSBsdW1TY29yZV92c19nZW5lICU+JSBkcGx5cjo6ZmlsdGVyKGx1bV9vcl9teW8gIT0gIk5BIikKQ1hDTDE3X3BsdCA9IGdnYm94cGxvdChsdW1TY29yZV92c19nZW5lLCB4ID0gImx1bV9vcl9teW8iLCB5ID0gIkNYQ0wxNyIsCiAgICAgICAgICBwYWxldHRlID0gImpjbyIsCiAgICAgICAgICBhZGQgPSAiaml0dGVyIikrIAogIHN0YXRfY29tcGFyZV9tZWFucyhtZXRob2QgPSAid2lsY294LnRlc3QiLGNvbXBhcmlzb25zID0gbGlzdChjKCJsdW1pbmFsIiwibXlvIikpKSsKICBzdGF0X3N1bW1hcnkoZnVuLmRhdGEgPSBmdW5jdGlvbih4KSBkYXRhLmZyYW1lKHk9MTYsIGxhYmVsID0gCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3RlKCJNZWFuPSIsbWVhbih4KSAlPiUgcm91bmQoMiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcbiAwIFRQTSBjZWxscyA9IiwgKHN1bSh4PT0wLG5hLnJtID0gVCkvbGVuZ3RoKHgpKSU+JSByb3VuZCgyKSkpLCBnZW9tPSJ0ZXh0IikgKwogICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpCgoKcHJpbnRfdGFiKHBsdCA9IENYQ0wxN19wbHQsdGl0bGUgPSAiQ1hDTDE3IGx1bS9teW8iLHN1YnRpdGxlX251bSA9IDMpCgpgYGAKCiMgSUwgcmVjZXB0b3IgCiMjIFZhcmlhYmxlIGdlbmVzIHsudGFic2V0fQpgYGB7ciBmaWcuaGVpZ2h0PTgsIGZpZy53aWR0aD0xMCwgcmVzdWx0cz0nYXNpcyd9CnByaW50X3RhYihwbHQgPSBGZWF0dXJlUGxvdChvYmplY3QgPSBhY2MsZmVhdHVyZXMgPSBjKCJJTDE3UkIiLCJJTDE3UkQiLCJJTDE3UkUiLCJJTDE3UkMiLCJJTDE3UkEiKSksdGl0bGUgPSAiSUwxNyIsc3VidGl0bGVfbnVtID0gMykKcHJpbnRfdGFiKHBsdCA9IEZlYXR1cmVQbG90KG9iamVjdCA9IGFjYyxmZWF0dXJlcyA9IGMoIklMMVIyIiwiSUwxUjEiLCJJTDFSQVAiLCJJTDJSQSIpKSx0aXRsZSA9ICJJTDEtMiIsc3VidGl0bGVfbnVtID0gMykKcHJpbnRfdGFiKHBsdCA9IEZlYXR1cmVQbG90KG9iamVjdCA9IGFjYyxmZWF0dXJlcyA9IGMoICJJTDEwUkIiLCJJTDExUkEiLCJJTDI3UkEiLCJJTDEzUkExIikpLHRpdGxlID0gIklMMTAtMTEtMTMtMjciLHN1YnRpdGxlX251bSA9IDMpCmBgYAojIyBsdW0vbXlvIERFRyB7LnRhYnNldH0KCmBgYHtyIH0KaWxfcmVjZXB0b3JzX2dlbmVzID0gcm93bmFtZXMoYWNjKVtncmVwbCgiXklMXFxkKlIuKiIsIHJvd25hbWVzKGFjYykpXQpnZW5lc19pbl9kZWcgPSBpbF9yZWNlcHRvcnNfZ2VuZXNbaWxfcmVjZXB0b3JzX2dlbmVzICVpbiUgcm93bmFtZXMoYWNjX2RlZyldCmFjY19kZWdbZ2VuZXNfaW5fZGVnLF0KYGBgCgpgYGB7ciBlY2hvPVRSVUUsIGZpZy5oZWlnaHQ9MTAsIGZpZy53aWR0aD0xMCwgcmVzdWx0cz0nYXNpcyd9Cgpmb3IgKGdlbmUgaW4gZ2VuZXNfaW5fZGVnKSB7CiAgbHVtU2NvcmVfdnNfZ2VuZSA9IEZldGNoRGF0YShvYmplY3QgPSBhY2MsdmFycyA9IGMoZ2VuZSwibHVtX29yX215byIpKQpsdW1TY29yZV92c19nZW5lID0gbHVtU2NvcmVfdnNfZ2VuZSAlPiUgZHBseXI6OmZpbHRlcihsdW1fb3JfbXlvICE9ICJOQSIpCnBsdCA9IGdnYm94cGxvdChsdW1TY29yZV92c19nZW5lLCB4ID0gImx1bV9vcl9teW8iLCB5ID0gZ2VuZSwKICAgICAgICAgIHBhbGV0dGUgPSAiamNvIiwKICAgICAgICAgIGFkZCA9ICJqaXR0ZXIiKSsgCiAgc3RhdF9jb21wYXJlX21lYW5zKG1ldGhvZCA9ICJ3aWxjb3gudGVzdCIsY29tcGFyaXNvbnMgPSBsaXN0KGMoImx1bWluYWwiLCJteW8iKSkpKwogIHN0YXRfc3VtbWFyeShmdW4uZGF0YSA9IGZ1bmN0aW9uKHgpIGRhdGEuZnJhbWUoeT0xMCwgbGFiZWwgPSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzdGUoIk1lYW49IixtZWFuKHgpICU+JSByb3VuZCgyKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlxuIDAgVFBNIGNlbGxzID0iLCAoc3VtKHg9PTAsbmEucm0gPSBUKS9sZW5ndGgoeCkpJT4lIHJvdW5kKDIpKSksIGdlb209InRleHQiKSArCiAgICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJub25lIikKCgpwcmludF90YWIocGx0ID0gcGx0LHRpdGxlID0gcGFzdGUoZ2VuZSwibHVtL215byIpLHN1YnRpdGxlX251bSA9IDMpCn0KYGBgCiMgIEhMQSAxIGdlbmVzIAojIyBVTUFQIHsudGFic2V0fQpgYGB7ciBmaWcuaGVpZ2h0PTgsIGZpZy53aWR0aD0xMCwgcmVzdWx0cz0nYXNpcyd9CmhsYV9nZW5lcyA9IHJvd25hbWVzKGFjYylbc3RhcnRzV2l0aCh4ID1yb3duYW1lcyhhY2MpLCBwcmVmaXggPSAiSExBIildCmhsYV9jbGFzc18xID0gaGxhX2dlbmVzWyFzdGFydHNXaXRoKHggPWhsYV9nZW5lcywgcHJlZml4ID0gIkhMQS1EIildCgpwcmludF90YWIocGx0ID0gRmVhdHVyZVBsb3Qob2JqZWN0ID0gYWNjLGZlYXR1cmVzID0gYygiSExBLUEiLCJITEEtQiIsIkhMQS1DIikpLHRpdGxlID0gImNsYXNzaWNhbCAgSExBIDEgZ2VuZXMiLHN1YnRpdGxlX251bSA9IDMpCmk9MQpleGl0ID0gRgpub25fY2xhc3NpY2FsICA9IGhsYV9jbGFzc18xIFshaGxhX2NsYXNzXzEgJWluJSBjKCJITEEtQSIsIkhMQS1CIiwiSExBLUMiKV0gJT4lIHNvcnQoKQp3aGlsZSAoIWV4aXQpIHsKICBwcmludF90YWIocGx0ID0gIEZlYXR1cmVQbG90KG9iamVjdCA9IGFjYyxmZWF0dXJlcyA9IG5vbl9jbGFzc2ljYWxbaTooaSszKV0pLHRpdGxlID0gbm9uX2NsYXNzaWNhbFtpOihpKzMpXSxzdWJ0aXRsZV9udW0gPSAzKQoKICBpPSBpKzQKICBpZiAoaSA+IGxlbmd0aChub25fY2xhc3NpY2FsKSkgeyBleGl0ID0gVH0KfQpgYGAKIyMgbHVtL215byBERUcgey50YWJzZXR9CgpgYGB7cn0KZ2VuZXNfaW5fZGVnID0gaGxhX2NsYXNzXzFbaGxhX2NsYXNzXzEgJWluJSByb3duYW1lcyhhY2NfZGVnKV0KYWNjX2RlZ1tnZW5lc19pbl9kZWcsXQpgYGAKCgpgYGB7ciBlY2hvPVRSVUUsIGZpZy5oZWlnaHQ9MTAsIGZpZy53aWR0aD0xNCwgcmVzdWx0cz0nYXNpcyd9CgoKZm9yIChnZW5lIGluIGdlbmVzX2luX2RlZykgewogIGx1bVNjb3JlX3ZzX2dlbmUgPSBGZXRjaERhdGEob2JqZWN0ID0gYWNjLHZhcnMgPSBjKGdlbmUsImx1bV9vcl9teW8iKSkKbHVtU2NvcmVfdnNfZ2VuZSA9IGx1bVNjb3JlX3ZzX2dlbmUgJT4lIGRwbHlyOjpmaWx0ZXIobHVtX29yX215byAhPSAiTkEiKQpwbHQgPSBnZ2JveHBsb3QobHVtU2NvcmVfdnNfZ2VuZSwgeCA9ICJsdW1fb3JfbXlvIiwgeSA9IGdlbmUsCiAgICAgICAgICBwYWxldHRlID0gImpjbyIsCiAgICAgICAgICBhZGQgPSAiaml0dGVyIikrIAogIHN0YXRfY29tcGFyZV9tZWFucyhtZXRob2QgPSAid2lsY294LnRlc3QiLGNvbXBhcmlzb25zID0gbGlzdChjKCJsdW1pbmFsIiwibXlvIikpKSsKICBzdGF0X3N1bW1hcnkoZnVuLmRhdGEgPSBmdW5jdGlvbih4KSBkYXRhLmZyYW1lKHk9bWF4KHgpKzEsIGxhYmVsID0gCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3RlKCJNZWFuPSIsbWVhbih4KSAlPiUgcm91bmQoMiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcbiAwIFRQTSBjZWxscyA9IiwgKHN1bSh4PT0wLG5hLnJtID0gVCkvbGVuZ3RoKHgpKSU+JSByb3VuZCgyKSkpLCBnZW9tPSJ0ZXh0IikgKwogICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpCgoKcHJpbnRfdGFiKHBsdCA9IHBsdCx0aXRsZSA9IHBhc3RlKGdlbmUsImx1bS9teW8iKSxzdWJ0aXRsZV9udW0gPSAzKQp9CgpgYGAKIyAgSExBIDEgc2lnbmF0dXJlCmNvcnJlbGF0aW9uIG9mIG5vbiBjbGFzc2ljYWwgaGxhMQpgYGB7cn0KaGxhID0gRmV0Y2hEYXRhKG9iamVjdCA9IGFjYyx2YXJzID0gbm9uX2NsYXNzaWNhbCkKCmNvcl9yZXMgPSBjb3IoaGxhKQpwaGVhdG1hcChjb3JfcmVzKQpgYGAKCmBgYHtyfQogIGdlbmVJZHMgPSBjKCJITEEtVCIsIkhMQS1HIiwiSExBLUgiLCJITEEtSyIsIkhMQS1XIiwiSExBLUwiLCJITEEtRiIsIkhMQS1KIikKICBnZW5lcyA9IHBhc3RlKGdlbmVJZHMsY29sbGFwc2UgPSAiLCIpCiAgcHJpbnQoInNpZ25hdHVyZSBnZW5lczogIiAlPiUgcGFzdGUoZ2VuZXMpKQogIHNjb3JlIDwtIGFwcGx5KGFjY0Bhc3NheXMkUk5BQGRhdGFbZ2VuZUlkcyxdLDIsbWVhbikKICBhY2M9QWRkTWV0YURhdGEoYWNjLHNjb3JlLGNvbC5uYW1lID0gIkhMQV9zaWduYXR1cmUiKQogIEZlYXR1cmVQbG90KG9iamVjdCA9IGFjYyxmZWF0dXJlcyA9ICJITEFfc2lnbmF0dXJlIikKYGBgCgojIE90aGVyIGltbXVuZSBnZW5lcyBkaWZmZXJlbnRpYWxseSBleHByZXNzZWQgYmV0d2VlbiBsdW0vbXlvCgppbnRlcnNlY3QgREVHIHdpdGggR08gImltbXVuZSByZXNwb25zZSBHTzowMDA2OTU1IgpgYGB7cn0KIyBlbnNlbWJsID0gdXNlTWFydCgiZW5zZW1ibCIsZGF0YXNldD0iaHNhcGllbnNfZ2VuZV9lbnNlbWJsIikgI3VzZXMgaHVtYW4gZW5zZW1ibCBhbm5vdGF0aW9ucwojIAojICBpbW11bmVfZ2VuZXMgPC0gZ2V0Qk0oYXR0cmlidXRlcz1jKCdoZ25jX3N5bWJvbCcpLAojICAgICAgICBmaWx0ZXJzID0gJ2dvJywgdmFsdWVzID0gJ0dPOjAwMDIzNzYnLCBtYXJ0ID0gZW5zZW1ibCkKCmltbXVuZV9nZW5lcyA9IGZyZWFkKGlucHV0ID0gIi4vRGF0YS9HT190ZXJtX3N1bW1hcnlfMjAyMzAyMThfMTY1OTM3LnR4dCIsc2VwID0gIlx0Iiwgc2VsZWN0ID0gMikgJT4lIHB1bGwoMSkKYWNjX2RlZ1tpbnRlcnNlY3Qocm93bmFtZXMoYWNjX2RlZyksaW1tdW5lX2dlbmVzKSxdCmBgYApgYGB7cn0KRmVhdHVyZVBsb3Qob2JqZWN0ID0gYWNjX2NhbmNlcixmZWF0dXJlcyA9ICJDMyIpCmBgYAojIFJldGlub2ljIGFjaWQgcGF0aHdheQpgYGB7cn0KbGlicmFyeShtc2lnZGJyKQoKZ2VuZXMgPSBtc2lnZGJyKHNwZWNpZXMgPSAiSG9tbyBzYXBpZW5zIiwgY2F0ZWdvcnkgPSAiQzIiKSAlPiUgZmlsdGVyKGdzX3N1YmNhdCAhPSAiQ0dQIiAmIGdyZXBsKCdSRVRJTk9JQycsIGdzX25hbWUpKQoKcmV0aW5vaWNfYWNpZF9wYXRod2F5cyA9IHVuaXF1ZShnZW5lcyRnc19uYW1lKQpyZXRpbm9pY19hY2lkX3BhdGh3YXlzID0gcmV0aW5vaWNfYWNpZF9wYXRod2F5c1tjKDIpXSAjdGFrZSByZWxldmFudCBwYXRod2F5cwpwYXRod2F5X2dlbmVzID0gZ2VuZXMgJT4lIGZpbHRlcihnc19uYW1lID09IHBhdGh3YXkpICU+JSBwdWxsKCJnZW5lX3N5bWJvbCIpIApwcmludCgicGF0aHdheSBuYW1lOiIgJT4lIHBhc3RlKHJldGlub2ljX2FjaWRfcGF0aHdheXMpKQoKcHJpbnQoImdlbmVzIGluIHBhdGh3YXk6IiApCnByaW50KHBhdGh3YXlfZ2VuZXMpCgpgYGAKIyMgREVHIGJldHdlZW4gbHVtIGFuZCBteW8KUG9zaXRpdmUgYXZnX2xvZzJGQyBpbmRpY2F0ZSB0aGF0IHRoZSBnZW5lIGlzIG1vcmUgaGlnaGx5IGV4cHJlc3NlZCBpbiB0aGUgTHVtaW5hbCBjZWxscywgbmVnYXRpdmUgaW4gbXlvIGNlbGxzCmBgYHtyfQphY2NfZGVnW2ludGVyc2VjdChyb3duYW1lcyhhY2NfZGVnKSxwYXRod2F5X2dlbmVzKSxdCmBgYAoKQWNjb3JkaW5nIHRvIGh0dHBzOi8vcmVhY3RvbWUub3JnL1BhdGh3YXlCcm93c2VyLyMvUi1IU0EtNTM2MjUxNyAKCiFbQVRSQSBwYXRod2F5XSguLi9EYXRhL0FUUkEgcGF0aHdheS5wbmcpCgoqIEFMREgxQTEsIDIgYW5kIDMgdXRpbGlzZSBOQUQrIGFzIGNvZmFjdG9yIHRvIG94aWRpc2UgYWxsLXRyYW5zLXJldGluYWwgKGF0UkFMKSB0byBhbGwtdHJhbnMtcmV0aW5vaWMgYWNpZCAoYXRSQSkuCgoqIChGQUJQNSkgaXMgYSBjeXRvc29saWMsIGxpcGlkLWJpbmRpbmcgcHJvdGVpbiB0aG91Z2h0IHRvIGJpbmQgYWxsLXRyYW5zLXJldGlub2ljIGFjaWQgKGF0UkEpIGFuZCBtZWRpYXRlIGl0cyBkZWxpdmVyeSB0byByZXRpbm9pYyBhY2lkIHJlY2VwdG9ycyAoUkFScykgCiogUkRIMTAgIGlzIHBhcnQgb2YgIG1lbWJyYW5lIGJvdW5kIG94aWRvcmVkdWN0YXNlcyB0aGF0IHJldmVyc2libHkgY2F0YWx5c2UgdGhlIGZpcnN0IGFuZCByYXRlIGxpbWl0aW5nIHN0ZXAgaW4gcmV0aW5vaWMgYWNpZCBiaW9zeW50aGVzaXMsIGFuZCB1c2UgTkFEKyBhcyBjb2ZhY3RvciB0byB0aGUgY29ycmVzcG9uZGluZyBhbGRlaHlkZSBhbGwgdHJhbnMgcmV0aW5hbCAoYXRSQUwpIAoqIGF0UkEgY2FuIHNpZ25pZmljYW50bHkgaW5jcmVhc2UgdGhlIGV4cHJlc3Npb24gb2YgcHJvdGVpbnMgaW52b2x2ZWQgaW4gZW5lcmd5IG1ldGFib2xpc20gc3VjaCBhcyBQREsgdmlhIGluZHVjdGlvbiBvZiBQUEFSRCAoV29sZiAyMDEwKQoKVGhpcyBjYW4gc3VwcG9ydCB0aGUgcGFwZXIgZnJvbSBQaWVybyBEYWxlcmJhLCBzaW5jZSB0aGVyZSBhcmUgaGlnaCBpbiB0aGUgTHVtaW5hbCBjZWxscy4KCiogSW4gY29uc3RyYXN0LCBESFJTMyBtYXkgY29udHJpYnV0ZSB0byB0aGUgcmVkdWN0aW9uIG9mIGFsbC10cmFucy1yZXRpbmFsIChhdFJBTCkgdG8gYWxsLXRyYW5zLXJldGlub2wgKGF0Uk9MKSwgKEhhZXNlbGVlciBldCBhbC4gMTk5OCwgSGFlc2VsZWVyIGV0IGFsLiAyMDAyLCBLZWRpc2h2aWxpIGV0IGFsLiAyMDAyLCBMaW4gZXQgYWwuIDIwMDEsIFpoZW4gZXQgYWwuIDIwMDMsIEJlbHlhZXZhIGV0IGFsLiAyMDA4KS4KREhSUzMgaXMgdXAgaW4gbXlvIGNlbGxzLCB0aHVzIHN1cHBvcnRzIHRoZSBwYXBlci4KCgoKCg==