1. load libraries

#Differential Expression Analysis

2. load seurat object

#Load Seurat Object L7
load("../../../0-IMP-OBJECTS/Harmony_integrated_All_samples_Merged_with_PBMC10x_with_harmony_clustering.Robj")


All_samples_Merged
An object of class Seurat 
64169 features across 59355 samples within 6 assays 
Active assay: SCT (27417 features, 3000 variable features)
 3 layers present: counts, data, scale.data
 5 other assays present: RNA, ADT, prediction.score.celltype.l1, prediction.score.celltype.l2, prediction.score.celltype.l3
 6 dimensional reductions calculated: integrated_dr, ref.umap, pca, umap, harmony, umap.harmony
DimPlot(All_samples_Merged, reduction = "umap.harmony", group.by = "cell_line",label = T, label.box = T)

DimPlot(All_samples_Merged, reduction = "umap.harmony", group.by = "Harmony_snn_res.0.9",label = T, label.box = T)

#Differential Expression Analysis

3. P1 vs PBMC-Tcells


DefaultAssay(All_samples_Merged) <- "SCT"
Idents(All_samples_Merged) <- "Harmony_snn_res.0.9"

# P1 vs PBMC-Tcells
P1_vs_PBMC_Tcells <- FindMarkers(All_samples_Merged, 
                        ident.1 = c(3, 8, 10, 18),  # P1 clusters
                        ident.2 = c(0, 5, 14, 24, 20),      # PBMC Tcells clusters
                        assay = "SCT")

write.csv(P1_vs_PBMC_Tcells, "New_comparison_P1_vs_PBMC_Tcells.csv")

# Convert to data frame and add gene names as a new column
P1_vs_PBMC_Tcells <- as.data.frame(P1_vs_PBMC_Tcells)
P1_vs_PBMC_Tcells$gene <- rownames(P1_vs_PBMC_Tcells)


# Rearranging the columns for better readability (optional)
P1_vs_PBMC_Tcells  <- P1_vs_PBMC_Tcells[, 
    c("gene", "p_val", "avg_log2FC", "pct.1", "pct.2", "p_val_adj")]



# Create volcano plot for P1 vs PBMC-Tcells
volcano_P1_vs_PBMC_Tcells <- EnhancedVolcano(P1_vs_PBMC_Tcells, 
                                    lab = rownames(P1_vs_PBMC_Tcells),
                                    x = 'avg_log2FC',
                                    y = 'p_val_adj',
                                    title = 'P1_vs_PBMC_Tcells',
                                    xlab = bquote(~Log[2]~ 'fold change'),
                                    pCutoff = 1e-100,
                                    FCcutoff = 1.5, 
                                    pointSize = 3.0,
                                    labSize = 5.0,
                                    boxedLabels = TRUE,
                                    colAlpha = 0.5,
                                    legendPosition = 'right',
                                    legendLabSize = 10,
                                    legendIconSize = 4.0,
                                    drawConnectors = TRUE,
                                    widthConnectors = 0.5,
                                    colConnectors = 'grey50',
                                    arrowheads = FALSE,
                                    max.overlaps = 30)
Avis : One or more p-values is 0. Converting to 10^-1 * current lowest non-zero p-value...
print(volcano_P1_vs_PBMC_Tcells)
png("volcano_P1_vs_PBMC_Tcells.png", width = 12, height = 10, units = "in", res = 300)
print(volcano_P1_vs_PBMC_Tcells)
dev.off()
png 
  2 

volcano2_P1_vs_PBMC_Tcells <- EnhancedVolcano(P1_vs_PBMC_Tcells, 
                lab = rownames(P1_vs_PBMC_Tcells),
                x = "avg_log2FC", 
                y = "p_val_adj",
                selectLab = c('EPCAM', 'KIR3DL2', 'FOXM1', 'TWIST1', 'TNFSF9', 
                              'CD80', 'FOS','PTPN6','NCR1','NCR2',
                              'PCLAF', 'KIR3DL1', 'IL4','ITGA6','CCL5',
                              'IL7R', 'TCF7', 'PTTG1', 'RRM2', 'MKI67', 'CD70', 
                              'IL2RA', 'FCGR3A', 'GNLY', 'FOXP3', 'SELL',  'LEF1',
                              'CCL17', 'THY1', 'CD27', 'CD28', 'CD7',
                              # Key Sézary syndrome genes
                              'PRF1', 'GZMB', 'NCR1', 'NFATC3', 
                              'KLRK1', 'LCK', 'KLRC1', 'KLRC2', 'TNF', 
                              'KIR3DL1','KIR3DL3','KIR3DL4', 'IFNG', 'IFNGR1', 'CD244', 'FASLG'),
                title = "P1_vs_PBMC_Tcells",
                subtitle = "Sézary Syndrome Cell Lines",
                xlab = bquote(~Log[2]~ 'fold change'),
                pCutoff = 0.05,
                FCcutoff = 1.5, 
                pointSize = 3.0,
                labSize = 4.0,
                labFace = 'bold',
                boxedLabels = TRUE,
                colAlpha = 0.5,
                legendPosition = 'right',
                legendLabSize = 10,
                legendIconSize = 4.0,
                drawConnectors = TRUE,
                widthConnectors = 0.5,
                colConnectors = 'grey50',
                arrowheads = FALSE,
                max.overlaps = 30)
Avis : One or more p-values is 0. Converting to 10^-1 * current lowest non-zero p-value...
print(volcano2_P1_vs_PBMC_Tcells)
png("volcano2_P1_vs_PBMC_Tcells.png", width = 12, height = 10, units = "in", res = 300)
print(volcano2_P1_vs_PBMC_Tcells)
dev.off()
png 
  2 

# Display top differentially expressed genes for each comparison
head(P1_vs_PBMC_Tcells)
NA
NA

4. P2 vs PBMC-Tcells


DefaultAssay(All_samples_Merged) <- "SCT"
Idents(All_samples_Merged) <- "Harmony_snn_res.0.9"

# P2 vs PBMC-Tcells
P2_vs_PBMC_Tcells <- FindMarkers(All_samples_Merged, 
                        ident.1 = c(1, 2, 13),  # P2 clusters
                       ident.2 = c(0, 5, 14, 24, 20),  # PBMC T cells clusters
                    
                        assay = "SCT")
write.csv(P2_vs_PBMC_Tcells, "New_comparison_P2_vs_PBMC_Tcells.csv")

# Create volcano plot for P2 vs PBMC-Tcells
volcano_P2_vs_PBMC_Tcells <- EnhancedVolcano(P2_vs_PBMC_Tcells, 
                                    lab = rownames(P2_vs_PBMC_Tcells),
                                    x = 'avg_log2FC',
                                    y = 'p_val_adj',
                                    title = 'P2_vs_PBMC_Tcells',
                                    pCutoff = 0.05,
                                    FCcutoff = 1.5,
                                    pointSize = 1.5,
                                    labSize = 4.0,
                                    col = c('grey', 'darkgreen', 'blue', 'red'),
                                    colAlpha = 0.5,
                                    legendPosition = 'right',
                                    legendLabSize = 10,
                                    legendIconSize = 4.0,
                                    drawConnectors = TRUE,
                                    widthConnectors = 0.5)
Avis : One or more p-values is 0. Converting to 10^-1 * current lowest non-zero p-value...
print(volcano_P2_vs_PBMC_Tcells)
png("volcano_P2_vs_PBMC_Tcells.png", width = 12, height = 10, units = "in", res = 300)
print(volcano_P2_vs_PBMC_Tcells)
dev.off()
png 
  2 

volcano2_P2_vs_PBMC_Tcells <- EnhancedVolcano(P2_vs_PBMC_Tcells, 
                lab = rownames(P2_vs_PBMC_Tcells),
                x = "avg_log2FC", 
                y = "p_val_adj",
                selectLab = c('KIR3DL2','KIR3DL1','KIR3DL3','KIR3DL4',  'TWIST1', 'TNFSF9', 
                               'FOS', 'TCF7','LEF1',
                               'CD86', 'VCAM1','CCL5',
                              'CD40',  'CD70', 
                              'IL2RA', 'FCGR3A', 'GNLY', 'FOXP3',  'LEF1',
                              'CCL17', 'THY1', 'CD27', 'CD28', 'CD7','EPCAM','TOX','IL16','IL21',
                              # Key Sézary syndrome genes
                              'PRF1', 'GZMB',  
                              'KLRK1', 'LCK', 'KLRC1', 'KLRC2',  
                               'IFNG', 'IFNGR1', 'FASLG'),
                title = "P2_vs_PBMC_Tcells",
                subtitle = "Sézary Syndrome Cell Lines",
                xlab = bquote(~Log[2]~ 'fold change'),
                pCutoff = 0.05,
                FCcutoff = 1.5, 
                pointSize = 3.0,
                labSize = 4.0,
                labFace = 'bold',
                boxedLabels = TRUE,
                colAlpha = 0.5,
                legendPosition = 'right',
                legendLabSize = 10,
                legendIconSize = 4.0,
                drawConnectors = TRUE,
                widthConnectors = 0.5,
                colConnectors = 'grey50',
                arrowheads = FALSE,
                max.overlaps = 30)
Avis : One or more p-values is 0. Converting to 10^-1 * current lowest non-zero p-value...
print(volcano2_P2_vs_PBMC_Tcells)
png("volcano2_P2_vs_PBMC_Tcells.png", width = 12, height = 10, units = "in", res = 300)
print(volcano2_P2_vs_PBMC_Tcells)
dev.off()
png 
  2 

# Display top differentially expressed genes for each comparison

head(P2_vs_PBMC_Tcells)
NA
NA

5. P3 vs PBMC-Tcells


DefaultAssay(All_samples_Merged) <- "SCT"
Idents(All_samples_Merged) <- "Harmony_snn_res.0.9"

# P2_vs_PBMC_Tcells
P3_vs_PBMC_Tcells <- FindMarkers(All_samples_Merged, 
                        ident.1 = c(4, 7, 9, 6, 16, 19),      # P2 clusters
                        ident.2 = c(0, 5, 14, 24, 20),  # P3 clusters
                        assay = "SCT")
write.csv(P3_vs_PBMC_Tcells, "comparison_P3_vs_PBMC_Tcells.csv")

# Create volcano plot for P2_vs_PBMC_Tcells
volcano_P3_vs_PBMC_Tcells <- EnhancedVolcano(P3_vs_PBMC_Tcells, 
                                    lab = rownames(P3_vs_PBMC_Tcells),
                                    x = 'avg_log2FC',
                                    y = 'p_val_adj',
                                    title = 'P3_vs_PBMC_Tcells',
                                    pCutoff = 0.05,
                                    FCcutoff = 1.5,
                                    pointSize = 1.5,
                                    labSize = 4.0,
                                    col = c('grey', 'darkgreen', 'blue', 'red'),
                                    colAlpha = 0.5,
                                    legendPosition = 'right',
                                    legendLabSize = 10,
                                    legendIconSize = 4.0,
                                    drawConnectors = TRUE,
                                    widthConnectors = 0.5)
Avis : One or more p-values is 0. Converting to 10^-1 * current lowest non-zero p-value...
print(volcano_P3_vs_PBMC_Tcells)
png("volcano_P3_vs_PBMC_Tcells.png", width = 12, height = 10, units = "in", res = 300)
print(volcano_P3_vs_PBMC_Tcells)
dev.off()
png 
  2 

volcano2_P3_vs_PBMC_Tcells <- EnhancedVolcano(P3_vs_PBMC_Tcells, 
                lab = rownames(P3_vs_PBMC_Tcells),
                x = "avg_log2FC", 
                y = "p_val_adj",
                selectLab = c('KIR3DL2','KIR3DL1','KIR3DL3','KIR3DL4',  'TWIST1', 'TNFSF9', 
                               
                               'VCAM1','CCL5','CCL23','IL13','IL19', 'TIGIT','JUN','TP53','CD40','CCR10',
                              'CD40',   'KIT','CD52','CD44','RORC','TIFA',
                              'FOXP3',  
                              'CCL17', 'THY1', 'CD28', 'CD7','EPCAM','IL16',
                              # Key Sézary syndrome genes
                                
                              'KLRK1', 'KLRC1', 'KLRC2',  
                               'IFNG', 'IFNGR1', 'FASLG'),
                title = "P3_vs_PBMC_Tcells",
                subtitle = "Sézary Syndrome Cell Lines",
                xlab = bquote(~Log[2]~ 'fold change'),
                pCutoff = 0.05,
                FCcutoff = 1.5, 
                pointSize = 3.0,
                labSize = 4.0,
                labFace = 'bold',
                boxedLabels = TRUE,
                colAlpha = 0.5,
                legendPosition = 'right',
                legendLabSize = 10,
                legendIconSize = 4.0,
                drawConnectors = TRUE,
                widthConnectors = 0.5,
                colConnectors = 'grey50',
                arrowheads = FALSE,
                max.overlaps = 30)
Avis : One or more p-values is 0. Converting to 10^-1 * current lowest non-zero p-value...
print(volcano2_P3_vs_PBMC_Tcells)
png("volcano2_P3_vs_PBMC_Tcells.png", width = 12, height = 10, units = "in", res = 300)
print(volcano2_P3_vs_PBMC_Tcells)
dev.off()
png 
  2 

print(volcano_P1_vs_PBMC_Tcells)

print(volcano_P2_vs_PBMC_Tcells)

print(volcano_P3_vs_PBMC_Tcells)

print(volcano2_P1_vs_PBMC_Tcells)

print(volcano2_P2_vs_PBMC_Tcells)

print(volcano2_P3_vs_PBMC_Tcells)


# Display top differentially expressed genes for each comparison
head(P1_vs_PBMC_Tcells)
head(P2_vs_PBMC_Tcells)
head(P3_vs_PBMC_Tcells)
NA
NA

6. Enrichment Analysis

library(clusterProfiler)
library(org.Hs.eg.db)
library(enrichplot)

perform_go_enrichment <- function(gene_list, gene_universe, title) {
  ego <- enrichGO(gene = gene_list,
                  universe = gene_universe,
                  OrgDb = org.Hs.eg.db,
                  keyType = "SYMBOL",
                  ont = "BP",
                  pAdjustMethod = "BH",
                  qvalueCutoff = 0.05,
                  readable = TRUE)
  
  if (nrow(ego@result) == 0) {
    warning(paste("No enriched GO terms found for", title))
    return(NULL)
  }
  
  p <- dotplot(ego, showCategory = 10, title = paste("GO -", title)) +
    theme(axis.text.y = element_text(size = 8))
  
  print(p)
  png(paste0("GO_enrichment_", gsub(" ", "_", title), ".png"), width = 12, height = 8, units = "in", res = 300)
  print(p)
  dev.off()
  
  return(ego)
}

perform_kegg_enrichment <- function(gene_list, gene_universe, title) {
  # Convert gene symbols to Entrez IDs
  entrez_ids <- bitr(gene_list, fromType = "SYMBOL", toType = "ENTREZID", OrgDb = org.Hs.eg.db)
  universe_entrez <- bitr(gene_universe, fromType = "SYMBOL", toType = "ENTREZID", OrgDb = org.Hs.eg.db)
  
  print(paste("Number of input genes:", length(gene_list)))
  print(paste("Number of input genes mapped to Entrez IDs:", nrow(entrez_ids)))
  print(paste("Number of universe genes:", length(gene_universe)))
  print(paste("Number of universe genes mapped to Entrez IDs:", nrow(universe_entrez)))
  
  if(nrow(entrez_ids) == 0) {
    warning(paste("No genes could be mapped for", title))
    return(NULL)
  }
  
  tryCatch({
    ekegg <- enrichKEGG(gene = entrez_ids$ENTREZID,
                        universe = universe_entrez$ENTREZID,
                        organism = 'hsa',
                        keyType = "kegg",
                        pvalueCutoff = 0.05,
                        pAdjustMethod = "BH")
    
    if(nrow(ekegg@result) == 0) {
      warning(paste("No enriched KEGG pathways found for", title))
      return(NULL)
    }
    
    p <- dotplot(ekegg, showCategory = 10, title = paste("KEGG -", title)) +
      theme(axis.text.y = element_text(size = 8))
    
    print(p)
    png(paste0("KEGG_enrichment_", gsub(" ", "_", title), ".png"), width = 12, height = 8, units = "in", res = 300)
    print(p)
    dev.off()
    
    return(ekegg)
  }, error = function(e) {
    warning(paste("Error in KEGG enrichment for", title, ":", e$message))
    return(NULL)
  })
}

gene_universe <- rownames(All_samples_Merged)

# P1_vs_PBMC_Tcells comparison
upregulated_genes_P1_vs_PBMC_Tcells <- rownames(P1_vs_PBMC_Tcells[P1_vs_PBMC_Tcells$avg_log2FC > 2.5 & P1_vs_PBMC_Tcells$p_val_adj < 0.05, ])
downregulated_genes_P1_vs_PBMC_Tcells <- rownames(P1_vs_PBMC_Tcells[P1_vs_PBMC_Tcells$avg_log2FC < -2.5 & P1_vs_PBMC_Tcells$p_val_adj < 0.05, ])

go_up_P1_vs_PBMC_Tcells <- perform_go_enrichment(upregulated_genes_P1_vs_PBMC_Tcells, gene_universe, "Upregulated Genes in P1_vs_PBMC_Tcells")

go_down_P1_vs_PBMC_Tcells <- perform_go_enrichment(downregulated_genes_P1_vs_PBMC_Tcells, gene_universe, "Downregulated Genes in P1_vs_PBMC_Tcells")

kegg_up_P1_vs_PBMC_Tcells <- perform_kegg_enrichment(upregulated_genes_P1_vs_PBMC_Tcells, gene_universe, "Upregulated Genes in P1_vs_PBMC_Tcells")
'select()' returned 1:1 mapping between keys and columns
Avis : 9.94% of input gene IDs are fail to map...'select()' returned 1:many mapping between keys and columns
Avis : 28.75% of input gene IDs are fail to map...
[1] "Number of input genes: 2504"
[1] "Number of input genes mapped to Entrez IDs: 2255"
[1] "Number of universe genes: 27417"
[1] "Number of universe genes mapped to Entrez IDs: 19538"

kegg_down_P1_vs_PBMC_Tcells <- perform_kegg_enrichment(downregulated_genes_P1_vs_PBMC_Tcells, gene_universe, "Downregulated Genes in P1_vs_PBMC_Tcells")
'select()' returned 1:1 mapping between keys and columns
Avis : 11.33% of input gene IDs are fail to map...'select()' returned 1:many mapping between keys and columns
Avis : 28.75% of input gene IDs are fail to map...
[1] "Number of input genes: 618"
[1] "Number of input genes mapped to Entrez IDs: 548"
[1] "Number of universe genes: 27417"
[1] "Number of universe genes mapped to Entrez IDs: 19538"

# P2_vs_PBMC_Tcells comparison
upregulated_genes_P2_vs_PBMC_Tcells <- rownames(P2_vs_PBMC_Tcells[P2_vs_PBMC_Tcells$avg_log2FC > 0.5 & P2_vs_PBMC_Tcells$p_val_adj < 0.001, ])
downregulated_genes_P2_vs_PBMC_Tcells <- rownames(P2_vs_PBMC_Tcells[P2_vs_PBMC_Tcells$avg_log2FC < -2.5 & P2_vs_PBMC_Tcells$p_val_adj < 0.05, ])

go_up_P2_vs_PBMC_Tcells <- perform_go_enrichment(upregulated_genes_P2_vs_PBMC_Tcells, gene_universe, "Upregulated Genes in P2_vs_PBMC_Tcells")

go_down_P2_vs_PBMC_Tcells <- perform_go_enrichment(downregulated_genes_P2_vs_PBMC_Tcells, gene_universe, "Downregulated Genes in P2_vs_PBMC_Tcells")

kegg_up_P2_vs_PBMC_Tcells <- perform_kegg_enrichment(upregulated_genes_P2_vs_PBMC_Tcells, gene_universe, "Upregulated Genes in P2_vs_PBMC_Tcells")
'select()' returned 1:many mapping between keys and columns
Avis : 10.46% of input gene IDs are fail to map...'select()' returned 1:many mapping between keys and columns
Avis : 28.75% of input gene IDs are fail to map...
[1] "Number of input genes: 10314"
[1] "Number of input genes mapped to Entrez IDs: 9238"
[1] "Number of universe genes: 27417"
[1] "Number of universe genes mapped to Entrez IDs: 19538"

kegg_down_P2_vs_PBMC_Tcells <- perform_kegg_enrichment(downregulated_genes_P2_vs_PBMC_Tcells, gene_universe, "Downregulated Genes in P2_vs_PBMC_Tcells")
'select()' returned 1:1 mapping between keys and columns
Avis : 14.44% of input gene IDs are fail to map...'select()' returned 1:many mapping between keys and columns
Avis : 28.75% of input gene IDs are fail to map...
[1] "Number of input genes: 810"
[1] "Number of input genes mapped to Entrez IDs: 693"
[1] "Number of universe genes: 27417"
[1] "Number of universe genes mapped to Entrez IDs: 19538"

# P3_vs_PBMC_Tcells comparison
upregulated_genes_P3_vs_PBMC_Tcells <- rownames(P3_vs_PBMC_Tcells[P3_vs_PBMC_Tcells$avg_log2FC > 1.5 & P3_vs_PBMC_Tcells$p_val_adj < 0.05, ])
downregulated_genes_P3_vs_PBMC_Tcells <- rownames(P3_vs_PBMC_Tcells[P3_vs_PBMC_Tcells$avg_log2FC < -1.5 & P3_vs_PBMC_Tcells$p_val_adj < 0.05, ])

go_up_P3_vs_PBMC_Tcells <- perform_go_enrichment(upregulated_genes_P3_vs_PBMC_Tcells, gene_universe, "Upregulated Genes in P3_vs_PBMC_Tcells")

go_down_P3_vs_PBMC_Tcells <- perform_go_enrichment(downregulated_genes_P3_vs_PBMC_Tcells, gene_universe, "Downregulated Genes in P3_vs_PBMC_Tcells")

kegg_up_P3_vs_PBMC_Tcells <- perform_kegg_enrichment(upregulated_genes_P3_vs_PBMC_Tcells, gene_universe, "Upregulated Genes in P3_vs_PBMC_Tcells")
'select()' returned 1:many mapping between keys and columns
Avis : 10.59% of input gene IDs are fail to map...'select()' returned 1:many mapping between keys and columns
Avis : 28.75% of input gene IDs are fail to map...
[1] "Number of input genes: 5913"
[1] "Number of input genes mapped to Entrez IDs: 5288"
[1] "Number of universe genes: 27417"
[1] "Number of universe genes mapped to Entrez IDs: 19538"

kegg_down_P3_vs_PBMC_Tcells <- perform_kegg_enrichment(downregulated_genes_P3_vs_PBMC_Tcells, gene_universe, "Downregulated Genes in P3_vs_PBMC_Tcells")
'select()' returned 1:1 mapping between keys and columns
Avis : 14.31% of input gene IDs are fail to map...'select()' returned 1:many mapping between keys and columns
Avis : 28.75% of input gene IDs are fail to map...
[1] "Number of input genes: 1041"
[1] "Number of input genes mapped to Entrez IDs: 892"
[1] "Number of universe genes: 27417"
[1] "Number of universe genes mapped to Entrez IDs: 19538"

LS0tCnRpdGxlOiAiUGF0aWVudHMgdnMgUEJNQy1UY2VsbHMiCmF1dGhvcjogTmFzaXIgTWFobW9vZCBBYmJhc2kKZGF0ZTogImByIFN5cy5EYXRlKClgIgpvdXRwdXQ6CiAgIyBwZGZfZG9jdW1lbnQ6IGRlZmF1bHQKICAjIHdvcmRfZG9jdW1lbnQ6IGRlZmF1bHQKICAjIGh0bWxfZG9jdW1lbnQ6IGRlZmF1bHQKICAjcm1kZm9ybWF0czo6cmVhZHRoZWRvd24KICBodG1sX25vdGVib29rOgogICAgdG9jOiB0cnVlCiAgICB0b2NfZmxvYXQ6IHRydWUKICAgIHRvY19jb2xsYXBzZWQ6IHRydWUKLS0tCgojIDEuIGxvYWQgbGlicmFyaWVzCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQoKCmxpYnJhcnkoU2V1cmF0KQpsaWJyYXJ5KGRwbHlyKQpsaWJyYXJ5KGdncGxvdDIpCmxpYnJhcnkocGhlYXRtYXApCmxpYnJhcnkoY2x1c3RlclByb2ZpbGVyKQpsaWJyYXJ5KG9yZy5Icy5lZy5kYikKbGlicmFyeShlbnJpY2hwbG90KQpsaWJyYXJ5KGVucmljaHBsb3QpCmxpYnJhcnkoRW5oYW5jZWRWb2xjYW5vKQoKCgpgYGAKI0RpZmZlcmVudGlhbCBFeHByZXNzaW9uIEFuYWx5c2lzCgojIDIuIGxvYWQgc2V1cmF0IG9iamVjdApgYGB7ciBsb2FkX3NldXJhdH0KI0xvYWQgU2V1cmF0IE9iamVjdCBMNwpsb2FkKCIuLi8uLi8uLi8wLUlNUC1PQkpFQ1RTL0hhcm1vbnlfaW50ZWdyYXRlZF9BbGxfc2FtcGxlc19NZXJnZWRfd2l0aF9QQk1DMTB4X3dpdGhfaGFybW9ueV9jbHVzdGVyaW5nLlJvYmoiKQoKCkFsbF9zYW1wbGVzX01lcmdlZAoKRGltUGxvdChBbGxfc2FtcGxlc19NZXJnZWQsIHJlZHVjdGlvbiA9ICJ1bWFwLmhhcm1vbnkiLCBncm91cC5ieSA9ICJjZWxsX2xpbmUiLGxhYmVsID0gVCwgbGFiZWwuYm94ID0gVCkKRGltUGxvdChBbGxfc2FtcGxlc19NZXJnZWQsIHJlZHVjdGlvbiA9ICJ1bWFwLmhhcm1vbnkiLCBncm91cC5ieSA9ICJIYXJtb255X3Nubl9yZXMuMC45IixsYWJlbCA9IFQsIGxhYmVsLmJveCA9IFQpCgpgYGAKCiNEaWZmZXJlbnRpYWwgRXhwcmVzc2lvbiBBbmFseXNpcwoKIyAzLiBQMSB2cyBQQk1DLVRjZWxscwpgYGB7ciBmaW5kbWFya2VyczEsIGZpZy5oZWlnaHQ9OCwgZmlnLndpZHRoPTEyfQoKRGVmYXVsdEFzc2F5KEFsbF9zYW1wbGVzX01lcmdlZCkgPC0gIlNDVCIKSWRlbnRzKEFsbF9zYW1wbGVzX01lcmdlZCkgPC0gIkhhcm1vbnlfc25uX3Jlcy4wLjkiCgojIFAxIHZzIFBCTUMtVGNlbGxzClAxX3ZzX1BCTUNfVGNlbGxzIDwtIEZpbmRNYXJrZXJzKEFsbF9zYW1wbGVzX01lcmdlZCwgCiAgICAgICAgICAgICAgICAgICAgICAgIGlkZW50LjEgPSBjKDMsIDgsIDEwLCAxOCksICAjIFAxIGNsdXN0ZXJzCiAgICAgICAgICAgICAgICAgICAgICAgIGlkZW50LjIgPSBjKDAsIDUsIDE0LCAyNCwgMjApLCAgICAgICMgUEJNQyBUY2VsbHMgY2x1c3RlcnMKICAgICAgICAgICAgICAgICAgICAgICAgYXNzYXkgPSAiU0NUIikKCndyaXRlLmNzdihQMV92c19QQk1DX1RjZWxscywgIk5ld19jb21wYXJpc29uX1AxX3ZzX1BCTUNfVGNlbGxzLmNzdiIpCgojIENvbnZlcnQgdG8gZGF0YSBmcmFtZSBhbmQgYWRkIGdlbmUgbmFtZXMgYXMgYSBuZXcgY29sdW1uClAxX3ZzX1BCTUNfVGNlbGxzIDwtIGFzLmRhdGEuZnJhbWUoUDFfdnNfUEJNQ19UY2VsbHMpClAxX3ZzX1BCTUNfVGNlbGxzJGdlbmUgPC0gcm93bmFtZXMoUDFfdnNfUEJNQ19UY2VsbHMpCgoKIyBSZWFycmFuZ2luZyB0aGUgY29sdW1ucyBmb3IgYmV0dGVyIHJlYWRhYmlsaXR5IChvcHRpb25hbCkKUDFfdnNfUEJNQ19UY2VsbHMgIDwtIFAxX3ZzX1BCTUNfVGNlbGxzWywgCiAgICBjKCJnZW5lIiwgInBfdmFsIiwgImF2Z19sb2cyRkMiLCAicGN0LjEiLCAicGN0LjIiLCAicF92YWxfYWRqIildCgoKCiMgQ3JlYXRlIHZvbGNhbm8gcGxvdCBmb3IgUDEgdnMgUEJNQy1UY2VsbHMKdm9sY2Fub19QMV92c19QQk1DX1RjZWxscyA8LSBFbmhhbmNlZFZvbGNhbm8oUDFfdnNfUEJNQ19UY2VsbHMsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWIgPSByb3duYW1lcyhQMV92c19QQk1DX1RjZWxscyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHggPSAnYXZnX2xvZzJGQycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSAncF92YWxfYWRqJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGUgPSAnUDFfdnNfUEJNQ19UY2VsbHMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bGFiID0gYnF1b3RlKH5Mb2dbMl1+ICdmb2xkIGNoYW5nZScpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ3V0b2ZmID0gMWUtMTAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQ2N1dG9mZiA9IDEuNSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50U2l6ZSA9IDMuMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiU2l6ZSA9IDUuMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm94ZWRMYWJlbHMgPSBUUlVFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xBbHBoYSA9IDAuNSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVnZW5kUG9zaXRpb24gPSAncmlnaHQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWdlbmRMYWJTaXplID0gMTAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZ2VuZEljb25TaXplID0gNC4wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcmF3Q29ubmVjdG9ycyA9IFRSVUUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoQ29ubmVjdG9ycyA9IDAuNSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sQ29ubmVjdG9ycyA9ICdncmV5NTAnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJvd2hlYWRzID0gRkFMU0UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heC5vdmVybGFwcyA9IDMwKQpwcmludCh2b2xjYW5vX1AxX3ZzX1BCTUNfVGNlbGxzKQpwbmcoInZvbGNhbm9fUDFfdnNfUEJNQ19UY2VsbHMucG5nIiwgd2lkdGggPSAxMiwgaGVpZ2h0ID0gMTAsIHVuaXRzID0gImluIiwgcmVzID0gMzAwKQpwcmludCh2b2xjYW5vX1AxX3ZzX1BCTUNfVGNlbGxzKQpkZXYub2ZmKCkKCgp2b2xjYW5vMl9QMV92c19QQk1DX1RjZWxscyA8LSBFbmhhbmNlZFZvbGNhbm8oUDFfdnNfUEJNQ19UY2VsbHMsIAogICAgICAgICAgICAgICAgbGFiID0gcm93bmFtZXMoUDFfdnNfUEJNQ19UY2VsbHMpLAogICAgICAgICAgICAgICAgeCA9ICJhdmdfbG9nMkZDIiwgCiAgICAgICAgICAgICAgICB5ID0gInBfdmFsX2FkaiIsCiAgICAgICAgICAgICAgICBzZWxlY3RMYWIgPSBjKCdFUENBTScsICdLSVIzREwyJywgJ0ZPWE0xJywgJ1RXSVNUMScsICdUTkZTRjknLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0NEODAnLCAnRk9TJywnUFRQTjYnLCdOQ1IxJywnTkNSMicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdQQ0xBRicsICdLSVIzREwxJywgJ0lMNCcsJ0lUR0E2JywnQ0NMNScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdJTDdSJywgJ1RDRjcnLCAnUFRURzEnLCAnUlJNMicsICdNS0k2NycsICdDRDcwJywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdJTDJSQScsICdGQ0dSM0EnLCAnR05MWScsICdGT1hQMycsICdTRUxMJywgICdMRUYxJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0NDTDE3JywgJ1RIWTEnLCAnQ0QyNycsICdDRDI4JywgJ0NENycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgS2V5IFPDqXphcnkgc3luZHJvbWUgZ2VuZXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1BSRjEnLCAnR1pNQicsICdOQ1IxJywgJ05GQVRDMycsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnS0xSSzEnLCAnTENLJywgJ0tMUkMxJywgJ0tMUkMyJywgJ1RORicsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnS0lSM0RMMScsJ0tJUjNETDMnLCdLSVIzREw0JywgJ0lGTkcnLCAnSUZOR1IxJywgJ0NEMjQ0JywgJ0ZBU0xHJyksCiAgICAgICAgICAgICAgICB0aXRsZSA9ICJQMV92c19QQk1DX1RjZWxscyIsCiAgICAgICAgICAgICAgICBzdWJ0aXRsZSA9ICJTw6l6YXJ5IFN5bmRyb21lIENlbGwgTGluZXMiLAogICAgICAgICAgICAgICAgeGxhYiA9IGJxdW90ZSh+TG9nWzJdfiAnZm9sZCBjaGFuZ2UnKSwKICAgICAgICAgICAgICAgIHBDdXRvZmYgPSAwLjA1LAogICAgICAgICAgICAgICAgRkNjdXRvZmYgPSAxLjUsIAogICAgICAgICAgICAgICAgcG9pbnRTaXplID0gMy4wLAogICAgICAgICAgICAgICAgbGFiU2l6ZSA9IDQuMCwKICAgICAgICAgICAgICAgIGxhYkZhY2UgPSAnYm9sZCcsCiAgICAgICAgICAgICAgICBib3hlZExhYmVscyA9IFRSVUUsCiAgICAgICAgICAgICAgICBjb2xBbHBoYSA9IDAuNSwKICAgICAgICAgICAgICAgIGxlZ2VuZFBvc2l0aW9uID0gJ3JpZ2h0JywKICAgICAgICAgICAgICAgIGxlZ2VuZExhYlNpemUgPSAxMCwKICAgICAgICAgICAgICAgIGxlZ2VuZEljb25TaXplID0gNC4wLAogICAgICAgICAgICAgICAgZHJhd0Nvbm5lY3RvcnMgPSBUUlVFLAogICAgICAgICAgICAgICAgd2lkdGhDb25uZWN0b3JzID0gMC41LAogICAgICAgICAgICAgICAgY29sQ29ubmVjdG9ycyA9ICdncmV5NTAnLAogICAgICAgICAgICAgICAgYXJyb3doZWFkcyA9IEZBTFNFLAogICAgICAgICAgICAgICAgbWF4Lm92ZXJsYXBzID0gMzApCnByaW50KHZvbGNhbm8yX1AxX3ZzX1BCTUNfVGNlbGxzKQpwbmcoInZvbGNhbm8yX1AxX3ZzX1BCTUNfVGNlbGxzLnBuZyIsIHdpZHRoID0gMTIsIGhlaWdodCA9IDEwLCB1bml0cyA9ICJpbiIsIHJlcyA9IDMwMCkKcHJpbnQodm9sY2FubzJfUDFfdnNfUEJNQ19UY2VsbHMpCmRldi5vZmYoKQoKIyBEaXNwbGF5IHRvcCBkaWZmZXJlbnRpYWxseSBleHByZXNzZWQgZ2VuZXMgZm9yIGVhY2ggY29tcGFyaXNvbgpoZWFkKFAxX3ZzX1BCTUNfVGNlbGxzKQoKCmBgYAoKCiMgNC4gUDIgdnMgUEJNQy1UY2VsbHMKYGBge3IgZmluZG1hcmtlcnMyLCBmaWcuaGVpZ2h0PTgsIGZpZy53aWR0aD0xMn0KCkRlZmF1bHRBc3NheShBbGxfc2FtcGxlc19NZXJnZWQpIDwtICJTQ1QiCklkZW50cyhBbGxfc2FtcGxlc19NZXJnZWQpIDwtICJIYXJtb255X3Nubl9yZXMuMC45IgoKIyBQMiB2cyBQQk1DLVRjZWxscwpQMl92c19QQk1DX1RjZWxscyA8LSBGaW5kTWFya2VycyhBbGxfc2FtcGxlc19NZXJnZWQsIAogICAgICAgICAgICAgICAgICAgICAgICBpZGVudC4xID0gYygxLCAyLCAxMyksICAjIFAyIGNsdXN0ZXJzCiAgICAgICAgICAgICAgICAgICAgICAgaWRlbnQuMiA9IGMoMCwgNSwgMTQsIDI0LCAyMCksICAjIFBCTUMgVCBjZWxscyBjbHVzdGVycwogICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICBhc3NheSA9ICJTQ1QiKQp3cml0ZS5jc3YoUDJfdnNfUEJNQ19UY2VsbHMsICJOZXdfY29tcGFyaXNvbl9QMl92c19QQk1DX1RjZWxscy5jc3YiKQoKIyBDcmVhdGUgdm9sY2FubyBwbG90IGZvciBQMiB2cyBQQk1DLVRjZWxscwp2b2xjYW5vX1AyX3ZzX1BCTUNfVGNlbGxzIDwtIEVuaGFuY2VkVm9sY2FubyhQMl92c19QQk1DX1RjZWxscywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYiA9IHJvd25hbWVzKFAyX3ZzX1BCTUNfVGNlbGxzKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeCA9ICdhdmdfbG9nMkZDJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSA9ICdwX3ZhbF9hZGonLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZSA9ICdQMl92c19QQk1DX1RjZWxscycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDdXRvZmYgPSAwLjA1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQ2N1dG9mZiA9IDEuNSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRTaXplID0gMS41LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJTaXplID0gNC4wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2wgPSBjKCdncmV5JywgJ2RhcmtncmVlbicsICdibHVlJywgJ3JlZCcpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xBbHBoYSA9IDAuNSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVnZW5kUG9zaXRpb24gPSAncmlnaHQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWdlbmRMYWJTaXplID0gMTAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZ2VuZEljb25TaXplID0gNC4wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcmF3Q29ubmVjdG9ycyA9IFRSVUUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoQ29ubmVjdG9ycyA9IDAuNSkKcHJpbnQodm9sY2Fub19QMl92c19QQk1DX1RjZWxscykKcG5nKCJ2b2xjYW5vX1AyX3ZzX1BCTUNfVGNlbGxzLnBuZyIsIHdpZHRoID0gMTIsIGhlaWdodCA9IDEwLCB1bml0cyA9ICJpbiIsIHJlcyA9IDMwMCkKcHJpbnQodm9sY2Fub19QMl92c19QQk1DX1RjZWxscykKZGV2Lm9mZigpCgp2b2xjYW5vMl9QMl92c19QQk1DX1RjZWxscyA8LSBFbmhhbmNlZFZvbGNhbm8oUDJfdnNfUEJNQ19UY2VsbHMsIAogICAgICAgICAgICAgICAgbGFiID0gcm93bmFtZXMoUDJfdnNfUEJNQ19UY2VsbHMpLAogICAgICAgICAgICAgICAgeCA9ICJhdmdfbG9nMkZDIiwgCiAgICAgICAgICAgICAgICB5ID0gInBfdmFsX2FkaiIsCiAgICAgICAgICAgICAgICBzZWxlY3RMYWIgPSBjKCdLSVIzREwyJywnS0lSM0RMMScsJ0tJUjNETDMnLCdLSVIzREw0JywgICdUV0lTVDEnLCAnVE5GU0Y5JywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnRk9TJywgJ1RDRjcnLCdMRUYxJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdDRDg2JywgJ1ZDQU0xJywnQ0NMNScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdDRDQwJywgICdDRDcwJywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdJTDJSQScsICdGQ0dSM0EnLCAnR05MWScsICdGT1hQMycsICAnTEVGMScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdDQ0wxNycsICdUSFkxJywgJ0NEMjcnLCAnQ0QyOCcsICdDRDcnLCdFUENBTScsJ1RPWCcsJ0lMMTYnLCdJTDIxJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBLZXkgU8OpemFyeSBzeW5kcm9tZSBnZW5lcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUFJGMScsICdHWk1CJywgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnS0xSSzEnLCAnTENLJywgJ0tMUkMxJywgJ0tMUkMyJywgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0lGTkcnLCAnSUZOR1IxJywgJ0ZBU0xHJyksCiAgICAgICAgICAgICAgICB0aXRsZSA9ICJQMl92c19QQk1DX1RjZWxscyIsCiAgICAgICAgICAgICAgICBzdWJ0aXRsZSA9ICJTw6l6YXJ5IFN5bmRyb21lIENlbGwgTGluZXMiLAogICAgICAgICAgICAgICAgeGxhYiA9IGJxdW90ZSh+TG9nWzJdfiAnZm9sZCBjaGFuZ2UnKSwKICAgICAgICAgICAgICAgIHBDdXRvZmYgPSAwLjA1LAogICAgICAgICAgICAgICAgRkNjdXRvZmYgPSAxLjUsIAogICAgICAgICAgICAgICAgcG9pbnRTaXplID0gMy4wLAogICAgICAgICAgICAgICAgbGFiU2l6ZSA9IDQuMCwKICAgICAgICAgICAgICAgIGxhYkZhY2UgPSAnYm9sZCcsCiAgICAgICAgICAgICAgICBib3hlZExhYmVscyA9IFRSVUUsCiAgICAgICAgICAgICAgICBjb2xBbHBoYSA9IDAuNSwKICAgICAgICAgICAgICAgIGxlZ2VuZFBvc2l0aW9uID0gJ3JpZ2h0JywKICAgICAgICAgICAgICAgIGxlZ2VuZExhYlNpemUgPSAxMCwKICAgICAgICAgICAgICAgIGxlZ2VuZEljb25TaXplID0gNC4wLAogICAgICAgICAgICAgICAgZHJhd0Nvbm5lY3RvcnMgPSBUUlVFLAogICAgICAgICAgICAgICAgd2lkdGhDb25uZWN0b3JzID0gMC41LAogICAgICAgICAgICAgICAgY29sQ29ubmVjdG9ycyA9ICdncmV5NTAnLAogICAgICAgICAgICAgICAgYXJyb3doZWFkcyA9IEZBTFNFLAogICAgICAgICAgICAgICAgbWF4Lm92ZXJsYXBzID0gMzApCnByaW50KHZvbGNhbm8yX1AyX3ZzX1BCTUNfVGNlbGxzKQpwbmcoInZvbGNhbm8yX1AyX3ZzX1BCTUNfVGNlbGxzLnBuZyIsIHdpZHRoID0gMTIsIGhlaWdodCA9IDEwLCB1bml0cyA9ICJpbiIsIHJlcyA9IDMwMCkKcHJpbnQodm9sY2FubzJfUDJfdnNfUEJNQ19UY2VsbHMpCmRldi5vZmYoKQoKCiMgRGlzcGxheSB0b3AgZGlmZmVyZW50aWFsbHkgZXhwcmVzc2VkIGdlbmVzIGZvciBlYWNoIGNvbXBhcmlzb24KCmhlYWQoUDJfdnNfUEJNQ19UY2VsbHMpCgoKYGBgCgoKIyA1LiBQMyB2cyBQQk1DLVRjZWxscwpgYGB7ciBmaW5kbWFya2VyczMsIGZpZy5oZWlnaHQ9OCwgZmlnLndpZHRoPTEyfQoKRGVmYXVsdEFzc2F5KEFsbF9zYW1wbGVzX01lcmdlZCkgPC0gIlNDVCIKSWRlbnRzKEFsbF9zYW1wbGVzX01lcmdlZCkgPC0gIkhhcm1vbnlfc25uX3Jlcy4wLjkiCgojIFAyX3ZzX1BCTUNfVGNlbGxzClAzX3ZzX1BCTUNfVGNlbGxzIDwtIEZpbmRNYXJrZXJzKEFsbF9zYW1wbGVzX01lcmdlZCwgCiAgICAgICAgICAgICAgICAgICAgICAgIGlkZW50LjEgPSBjKDQsIDcsIDksIDYsIDE2LCAxOSksICAgICAgIyBQMiBjbHVzdGVycwogICAgICAgICAgICAgICAgICAgICAgICBpZGVudC4yID0gYygwLCA1LCAxNCwgMjQsIDIwKSwgICMgUDMgY2x1c3RlcnMKICAgICAgICAgICAgICAgICAgICAgICAgYXNzYXkgPSAiU0NUIikKd3JpdGUuY3N2KFAzX3ZzX1BCTUNfVGNlbGxzLCAiY29tcGFyaXNvbl9QM192c19QQk1DX1RjZWxscy5jc3YiKQoKIyBDcmVhdGUgdm9sY2FubyBwbG90IGZvciBQMl92c19QQk1DX1RjZWxscwp2b2xjYW5vX1AzX3ZzX1BCTUNfVGNlbGxzIDwtIEVuaGFuY2VkVm9sY2FubyhQM192c19QQk1DX1RjZWxscywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYiA9IHJvd25hbWVzKFAzX3ZzX1BCTUNfVGNlbGxzKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeCA9ICdhdmdfbG9nMkZDJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSA9ICdwX3ZhbF9hZGonLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZSA9ICdQM192c19QQk1DX1RjZWxscycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDdXRvZmYgPSAwLjA1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQ2N1dG9mZiA9IDEuNSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRTaXplID0gMS41LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJTaXplID0gNC4wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2wgPSBjKCdncmV5JywgJ2RhcmtncmVlbicsICdibHVlJywgJ3JlZCcpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xBbHBoYSA9IDAuNSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVnZW5kUG9zaXRpb24gPSAncmlnaHQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWdlbmRMYWJTaXplID0gMTAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZ2VuZEljb25TaXplID0gNC4wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcmF3Q29ubmVjdG9ycyA9IFRSVUUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoQ29ubmVjdG9ycyA9IDAuNSkKcHJpbnQodm9sY2Fub19QM192c19QQk1DX1RjZWxscykKcG5nKCJ2b2xjYW5vX1AzX3ZzX1BCTUNfVGNlbGxzLnBuZyIsIHdpZHRoID0gMTIsIGhlaWdodCA9IDEwLCB1bml0cyA9ICJpbiIsIHJlcyA9IDMwMCkKcHJpbnQodm9sY2Fub19QM192c19QQk1DX1RjZWxscykKZGV2Lm9mZigpCgp2b2xjYW5vMl9QM192c19QQk1DX1RjZWxscyA8LSBFbmhhbmNlZFZvbGNhbm8oUDNfdnNfUEJNQ19UY2VsbHMsIAogICAgICAgICAgICAgICAgbGFiID0gcm93bmFtZXMoUDNfdnNfUEJNQ19UY2VsbHMpLAogICAgICAgICAgICAgICAgeCA9ICJhdmdfbG9nMkZDIiwgCiAgICAgICAgICAgICAgICB5ID0gInBfdmFsX2FkaiIsCiAgICAgICAgICAgICAgICBzZWxlY3RMYWIgPSBjKCdLSVIzREwyJywnS0lSM0RMMScsJ0tJUjNETDMnLCdLSVIzREw0JywgICdUV0lTVDEnLCAnVE5GU0Y5JywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdWQ0FNMScsJ0NDTDUnLCdDQ0wyMycsJ0lMMTMnLCdJTDE5JywgJ1RJR0lUJywnSlVOJywnVFA1MycsJ0NENDAnLCdDQ1IxMCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdDRDQwJywgICAnS0lUJywnQ0Q1MicsJ0NENDQnLCdST1JDJywnVElGQScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdGT1hQMycsICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0NDTDE3JywgJ1RIWTEnLCAnQ0QyOCcsICdDRDcnLCdFUENBTScsJ0lMMTYnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIEtleSBTw6l6YXJ5IHN5bmRyb21lIGdlbmVzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdLTFJLMScsICdLTFJDMScsICdLTFJDMicsICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdJRk5HJywgJ0lGTkdSMScsICdGQVNMRycpLAogICAgICAgICAgICAgICAgdGl0bGUgPSAiUDNfdnNfUEJNQ19UY2VsbHMiLAogICAgICAgICAgICAgICAgc3VidGl0bGUgPSAiU8OpemFyeSBTeW5kcm9tZSBDZWxsIExpbmVzIiwKICAgICAgICAgICAgICAgIHhsYWIgPSBicXVvdGUofkxvZ1syXX4gJ2ZvbGQgY2hhbmdlJyksCiAgICAgICAgICAgICAgICBwQ3V0b2ZmID0gMC4wNSwKICAgICAgICAgICAgICAgIEZDY3V0b2ZmID0gMS41LCAKICAgICAgICAgICAgICAgIHBvaW50U2l6ZSA9IDMuMCwKICAgICAgICAgICAgICAgIGxhYlNpemUgPSA0LjAsCiAgICAgICAgICAgICAgICBsYWJGYWNlID0gJ2JvbGQnLAogICAgICAgICAgICAgICAgYm94ZWRMYWJlbHMgPSBUUlVFLAogICAgICAgICAgICAgICAgY29sQWxwaGEgPSAwLjUsCiAgICAgICAgICAgICAgICBsZWdlbmRQb3NpdGlvbiA9ICdyaWdodCcsCiAgICAgICAgICAgICAgICBsZWdlbmRMYWJTaXplID0gMTAsCiAgICAgICAgICAgICAgICBsZWdlbmRJY29uU2l6ZSA9IDQuMCwKICAgICAgICAgICAgICAgIGRyYXdDb25uZWN0b3JzID0gVFJVRSwKICAgICAgICAgICAgICAgIHdpZHRoQ29ubmVjdG9ycyA9IDAuNSwKICAgICAgICAgICAgICAgIGNvbENvbm5lY3RvcnMgPSAnZ3JleTUwJywKICAgICAgICAgICAgICAgIGFycm93aGVhZHMgPSBGQUxTRSwKICAgICAgICAgICAgICAgIG1heC5vdmVybGFwcyA9IDMwKQpwcmludCh2b2xjYW5vMl9QM192c19QQk1DX1RjZWxscykKcG5nKCJ2b2xjYW5vMl9QM192c19QQk1DX1RjZWxscy5wbmciLCB3aWR0aCA9IDEyLCBoZWlnaHQgPSAxMCwgdW5pdHMgPSAiaW4iLCByZXMgPSAzMDApCnByaW50KHZvbGNhbm8yX1AzX3ZzX1BCTUNfVGNlbGxzKQpkZXYub2ZmKCkKCnByaW50KHZvbGNhbm9fUDFfdnNfUEJNQ19UY2VsbHMpCnByaW50KHZvbGNhbm9fUDJfdnNfUEJNQ19UY2VsbHMpCnByaW50KHZvbGNhbm9fUDNfdnNfUEJNQ19UY2VsbHMpCnByaW50KHZvbGNhbm8yX1AxX3ZzX1BCTUNfVGNlbGxzKQpwcmludCh2b2xjYW5vMl9QMl92c19QQk1DX1RjZWxscykKcHJpbnQodm9sY2FubzJfUDNfdnNfUEJNQ19UY2VsbHMpCgojIERpc3BsYXkgdG9wIGRpZmZlcmVudGlhbGx5IGV4cHJlc3NlZCBnZW5lcyBmb3IgZWFjaCBjb21wYXJpc29uCmhlYWQoUDFfdnNfUEJNQ19UY2VsbHMpCmhlYWQoUDJfdnNfUEJNQ19UY2VsbHMpCmhlYWQoUDNfdnNfUEJNQ19UY2VsbHMpCgoKYGBgCgoKIyA2LiBFbnJpY2htZW50IEFuYWx5c2lzCmBgYHtyIGVucmljaG1lbnQyLCBmaWcuaGVpZ2h0PTgsIGZpZy53aWR0aD0xMn0KbGlicmFyeShjbHVzdGVyUHJvZmlsZXIpCmxpYnJhcnkob3JnLkhzLmVnLmRiKQpsaWJyYXJ5KGVucmljaHBsb3QpCgpwZXJmb3JtX2dvX2VucmljaG1lbnQgPC0gZnVuY3Rpb24oZ2VuZV9saXN0LCBnZW5lX3VuaXZlcnNlLCB0aXRsZSkgewogIGVnbyA8LSBlbnJpY2hHTyhnZW5lID0gZ2VuZV9saXN0LAogICAgICAgICAgICAgICAgICB1bml2ZXJzZSA9IGdlbmVfdW5pdmVyc2UsCiAgICAgICAgICAgICAgICAgIE9yZ0RiID0gb3JnLkhzLmVnLmRiLAogICAgICAgICAgICAgICAgICBrZXlUeXBlID0gIlNZTUJPTCIsCiAgICAgICAgICAgICAgICAgIG9udCA9ICJCUCIsCiAgICAgICAgICAgICAgICAgIHBBZGp1c3RNZXRob2QgPSAiQkgiLAogICAgICAgICAgICAgICAgICBxdmFsdWVDdXRvZmYgPSAwLjA1LAogICAgICAgICAgICAgICAgICByZWFkYWJsZSA9IFRSVUUpCiAgCiAgaWYgKG5yb3coZWdvQHJlc3VsdCkgPT0gMCkgewogICAgd2FybmluZyhwYXN0ZSgiTm8gZW5yaWNoZWQgR08gdGVybXMgZm91bmQgZm9yIiwgdGl0bGUpKQogICAgcmV0dXJuKE5VTEwpCiAgfQogIAogIHAgPC0gZG90cGxvdChlZ28sIHNob3dDYXRlZ29yeSA9IDEwLCB0aXRsZSA9IHBhc3RlKCJHTyAtIiwgdGl0bGUpKSArCiAgICB0aGVtZShheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gOCkpCiAgCiAgcHJpbnQocCkKICBwbmcocGFzdGUwKCJHT19lbnJpY2htZW50XyIsIGdzdWIoIiAiLCAiXyIsIHRpdGxlKSwgIi5wbmciKSwgd2lkdGggPSAxMiwgaGVpZ2h0ID0gOCwgdW5pdHMgPSAiaW4iLCByZXMgPSAzMDApCiAgcHJpbnQocCkKICBkZXYub2ZmKCkKICAKICByZXR1cm4oZWdvKQp9CgpwZXJmb3JtX2tlZ2dfZW5yaWNobWVudCA8LSBmdW5jdGlvbihnZW5lX2xpc3QsIGdlbmVfdW5pdmVyc2UsIHRpdGxlKSB7CiAgIyBDb252ZXJ0IGdlbmUgc3ltYm9scyB0byBFbnRyZXogSURzCiAgZW50cmV6X2lkcyA8LSBiaXRyKGdlbmVfbGlzdCwgZnJvbVR5cGUgPSAiU1lNQk9MIiwgdG9UeXBlID0gIkVOVFJFWklEIiwgT3JnRGIgPSBvcmcuSHMuZWcuZGIpCiAgdW5pdmVyc2VfZW50cmV6IDwtIGJpdHIoZ2VuZV91bml2ZXJzZSwgZnJvbVR5cGUgPSAiU1lNQk9MIiwgdG9UeXBlID0gIkVOVFJFWklEIiwgT3JnRGIgPSBvcmcuSHMuZWcuZGIpCiAgCiAgcHJpbnQocGFzdGUoIk51bWJlciBvZiBpbnB1dCBnZW5lczoiLCBsZW5ndGgoZ2VuZV9saXN0KSkpCiAgcHJpbnQocGFzdGUoIk51bWJlciBvZiBpbnB1dCBnZW5lcyBtYXBwZWQgdG8gRW50cmV6IElEczoiLCBucm93KGVudHJlel9pZHMpKSkKICBwcmludChwYXN0ZSgiTnVtYmVyIG9mIHVuaXZlcnNlIGdlbmVzOiIsIGxlbmd0aChnZW5lX3VuaXZlcnNlKSkpCiAgcHJpbnQocGFzdGUoIk51bWJlciBvZiB1bml2ZXJzZSBnZW5lcyBtYXBwZWQgdG8gRW50cmV6IElEczoiLCBucm93KHVuaXZlcnNlX2VudHJleikpKQogIAogIGlmKG5yb3coZW50cmV6X2lkcykgPT0gMCkgewogICAgd2FybmluZyhwYXN0ZSgiTm8gZ2VuZXMgY291bGQgYmUgbWFwcGVkIGZvciIsIHRpdGxlKSkKICAgIHJldHVybihOVUxMKQogIH0KICAKICB0cnlDYXRjaCh7CiAgICBla2VnZyA8LSBlbnJpY2hLRUdHKGdlbmUgPSBlbnRyZXpfaWRzJEVOVFJFWklELAogICAgICAgICAgICAgICAgICAgICAgICB1bml2ZXJzZSA9IHVuaXZlcnNlX2VudHJleiRFTlRSRVpJRCwKICAgICAgICAgICAgICAgICAgICAgICAgb3JnYW5pc20gPSAnaHNhJywKICAgICAgICAgICAgICAgICAgICAgICAga2V5VHlwZSA9ICJrZWdnIiwKICAgICAgICAgICAgICAgICAgICAgICAgcHZhbHVlQ3V0b2ZmID0gMC4wNSwKICAgICAgICAgICAgICAgICAgICAgICAgcEFkanVzdE1ldGhvZCA9ICJCSCIpCiAgICAKICAgIGlmKG5yb3coZWtlZ2dAcmVzdWx0KSA9PSAwKSB7CiAgICAgIHdhcm5pbmcocGFzdGUoIk5vIGVucmljaGVkIEtFR0cgcGF0aHdheXMgZm91bmQgZm9yIiwgdGl0bGUpKQogICAgICByZXR1cm4oTlVMTCkKICAgIH0KICAgIAogICAgcCA8LSBkb3RwbG90KGVrZWdnLCBzaG93Q2F0ZWdvcnkgPSAxMCwgdGl0bGUgPSBwYXN0ZSgiS0VHRyAtIiwgdGl0bGUpKSArCiAgICAgIHRoZW1lKGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSA4KSkKICAgIAogICAgcHJpbnQocCkKICAgIHBuZyhwYXN0ZTAoIktFR0dfZW5yaWNobWVudF8iLCBnc3ViKCIgIiwgIl8iLCB0aXRsZSksICIucG5nIiksIHdpZHRoID0gMTIsIGhlaWdodCA9IDgsIHVuaXRzID0gImluIiwgcmVzID0gMzAwKQogICAgcHJpbnQocCkKICAgIGRldi5vZmYoKQogICAgCiAgICByZXR1cm4oZWtlZ2cpCiAgfSwgZXJyb3IgPSBmdW5jdGlvbihlKSB7CiAgICB3YXJuaW5nKHBhc3RlKCJFcnJvciBpbiBLRUdHIGVucmljaG1lbnQgZm9yIiwgdGl0bGUsICI6IiwgZSRtZXNzYWdlKSkKICAgIHJldHVybihOVUxMKQogIH0pCn0KCmdlbmVfdW5pdmVyc2UgPC0gcm93bmFtZXMoQWxsX3NhbXBsZXNfTWVyZ2VkKQoKIyBQMV92c19QQk1DX1RjZWxscyBjb21wYXJpc29uCnVwcmVndWxhdGVkX2dlbmVzX1AxX3ZzX1BCTUNfVGNlbGxzIDwtIHJvd25hbWVzKFAxX3ZzX1BCTUNfVGNlbGxzW1AxX3ZzX1BCTUNfVGNlbGxzJGF2Z19sb2cyRkMgPiAyLjUgJiBQMV92c19QQk1DX1RjZWxscyRwX3ZhbF9hZGogPCAwLjA1LCBdKQpkb3ducmVndWxhdGVkX2dlbmVzX1AxX3ZzX1BCTUNfVGNlbGxzIDwtIHJvd25hbWVzKFAxX3ZzX1BCTUNfVGNlbGxzW1AxX3ZzX1BCTUNfVGNlbGxzJGF2Z19sb2cyRkMgPCAtMi41ICYgUDFfdnNfUEJNQ19UY2VsbHMkcF92YWxfYWRqIDwgMC4wNSwgXSkKCmdvX3VwX1AxX3ZzX1BCTUNfVGNlbGxzIDwtIHBlcmZvcm1fZ29fZW5yaWNobWVudCh1cHJlZ3VsYXRlZF9nZW5lc19QMV92c19QQk1DX1RjZWxscywgZ2VuZV91bml2ZXJzZSwgIlVwcmVndWxhdGVkIEdlbmVzIGluIFAxX3ZzX1BCTUNfVGNlbGxzIikKZ29fZG93bl9QMV92c19QQk1DX1RjZWxscyA8LSBwZXJmb3JtX2dvX2VucmljaG1lbnQoZG93bnJlZ3VsYXRlZF9nZW5lc19QMV92c19QQk1DX1RjZWxscywgZ2VuZV91bml2ZXJzZSwgIkRvd25yZWd1bGF0ZWQgR2VuZXMgaW4gUDFfdnNfUEJNQ19UY2VsbHMiKQprZWdnX3VwX1AxX3ZzX1BCTUNfVGNlbGxzIDwtIHBlcmZvcm1fa2VnZ19lbnJpY2htZW50KHVwcmVndWxhdGVkX2dlbmVzX1AxX3ZzX1BCTUNfVGNlbGxzLCBnZW5lX3VuaXZlcnNlLCAiVXByZWd1bGF0ZWQgR2VuZXMgaW4gUDFfdnNfUEJNQ19UY2VsbHMiKQprZWdnX2Rvd25fUDFfdnNfUEJNQ19UY2VsbHMgPC0gcGVyZm9ybV9rZWdnX2VucmljaG1lbnQoZG93bnJlZ3VsYXRlZF9nZW5lc19QMV92c19QQk1DX1RjZWxscywgZ2VuZV91bml2ZXJzZSwgIkRvd25yZWd1bGF0ZWQgR2VuZXMgaW4gUDFfdnNfUEJNQ19UY2VsbHMiKQoKIyBQMl92c19QQk1DX1RjZWxscyBjb21wYXJpc29uCnVwcmVndWxhdGVkX2dlbmVzX1AyX3ZzX1BCTUNfVGNlbGxzIDwtIHJvd25hbWVzKFAyX3ZzX1BCTUNfVGNlbGxzW1AyX3ZzX1BCTUNfVGNlbGxzJGF2Z19sb2cyRkMgPiAwLjUgJiBQMl92c19QQk1DX1RjZWxscyRwX3ZhbF9hZGogPCAwLjAwMSwgXSkKZG93bnJlZ3VsYXRlZF9nZW5lc19QMl92c19QQk1DX1RjZWxscyA8LSByb3duYW1lcyhQMl92c19QQk1DX1RjZWxsc1tQMl92c19QQk1DX1RjZWxscyRhdmdfbG9nMkZDIDwgLTIuNSAmIFAyX3ZzX1BCTUNfVGNlbGxzJHBfdmFsX2FkaiA8IDAuMDUsIF0pCgpnb191cF9QMl92c19QQk1DX1RjZWxscyA8LSBwZXJmb3JtX2dvX2VucmljaG1lbnQodXByZWd1bGF0ZWRfZ2VuZXNfUDJfdnNfUEJNQ19UY2VsbHMsIGdlbmVfdW5pdmVyc2UsICJVcHJlZ3VsYXRlZCBHZW5lcyBpbiBQMl92c19QQk1DX1RjZWxscyIpCmdvX2Rvd25fUDJfdnNfUEJNQ19UY2VsbHMgPC0gcGVyZm9ybV9nb19lbnJpY2htZW50KGRvd25yZWd1bGF0ZWRfZ2VuZXNfUDJfdnNfUEJNQ19UY2VsbHMsIGdlbmVfdW5pdmVyc2UsICJEb3ducmVndWxhdGVkIEdlbmVzIGluIFAyX3ZzX1BCTUNfVGNlbGxzIikKa2VnZ191cF9QMl92c19QQk1DX1RjZWxscyA8LSBwZXJmb3JtX2tlZ2dfZW5yaWNobWVudCh1cHJlZ3VsYXRlZF9nZW5lc19QMl92c19QQk1DX1RjZWxscywgZ2VuZV91bml2ZXJzZSwgIlVwcmVndWxhdGVkIEdlbmVzIGluIFAyX3ZzX1BCTUNfVGNlbGxzIikKa2VnZ19kb3duX1AyX3ZzX1BCTUNfVGNlbGxzIDwtIHBlcmZvcm1fa2VnZ19lbnJpY2htZW50KGRvd25yZWd1bGF0ZWRfZ2VuZXNfUDJfdnNfUEJNQ19UY2VsbHMsIGdlbmVfdW5pdmVyc2UsICJEb3ducmVndWxhdGVkIEdlbmVzIGluIFAyX3ZzX1BCTUNfVGNlbGxzIikKCiMgUDNfdnNfUEJNQ19UY2VsbHMgY29tcGFyaXNvbgp1cHJlZ3VsYXRlZF9nZW5lc19QM192c19QQk1DX1RjZWxscyA8LSByb3duYW1lcyhQM192c19QQk1DX1RjZWxsc1tQM192c19QQk1DX1RjZWxscyRhdmdfbG9nMkZDID4gMS41ICYgUDNfdnNfUEJNQ19UY2VsbHMkcF92YWxfYWRqIDwgMC4wNSwgXSkKZG93bnJlZ3VsYXRlZF9nZW5lc19QM192c19QQk1DX1RjZWxscyA8LSByb3duYW1lcyhQM192c19QQk1DX1RjZWxsc1tQM192c19QQk1DX1RjZWxscyRhdmdfbG9nMkZDIDwgLTEuNSAmIFAzX3ZzX1BCTUNfVGNlbGxzJHBfdmFsX2FkaiA8IDAuMDUsIF0pCgpnb191cF9QM192c19QQk1DX1RjZWxscyA8LSBwZXJmb3JtX2dvX2VucmljaG1lbnQodXByZWd1bGF0ZWRfZ2VuZXNfUDNfdnNfUEJNQ19UY2VsbHMsIGdlbmVfdW5pdmVyc2UsICJVcHJlZ3VsYXRlZCBHZW5lcyBpbiBQM192c19QQk1DX1RjZWxscyIpCmdvX2Rvd25fUDNfdnNfUEJNQ19UY2VsbHMgPC0gcGVyZm9ybV9nb19lbnJpY2htZW50KGRvd25yZWd1bGF0ZWRfZ2VuZXNfUDNfdnNfUEJNQ19UY2VsbHMsIGdlbmVfdW5pdmVyc2UsICJEb3ducmVndWxhdGVkIEdlbmVzIGluIFAzX3ZzX1BCTUNfVGNlbGxzIikKa2VnZ191cF9QM192c19QQk1DX1RjZWxscyA8LSBwZXJmb3JtX2tlZ2dfZW5yaWNobWVudCh1cHJlZ3VsYXRlZF9nZW5lc19QM192c19QQk1DX1RjZWxscywgZ2VuZV91bml2ZXJzZSwgIlVwcmVndWxhdGVkIEdlbmVzIGluIFAzX3ZzX1BCTUNfVGNlbGxzIikKa2VnZ19kb3duX1AzX3ZzX1BCTUNfVGNlbGxzIDwtIHBlcmZvcm1fa2VnZ19lbnJpY2htZW50KGRvd25yZWd1bGF0ZWRfZ2VuZXNfUDNfdnNfUEJNQ19UY2VsbHMsIGdlbmVfdW5pdmVyc2UsICJEb3ducmVndWxhdGVkIEdlbmVzIGluIFAzX3ZzX1BCTUNfVGNlbGxzIikKCgpgYGAKCgoKCg==