Contents

source("../utils/utils.R")
config = load_config()

# load CHT results
cht_full = lapply(ab_tp_list, function(ab_tp) load_cht_results(ab_tp, remove_chr = F)) %>% bind_rows()
cht = cht_full %>% filter(!TEST.SNP.CHROM %in% c("chrX", "chrY", "chrM"))
cht_sign = cht %>% filter(signif_strongAI) 

# genes and promoters
genes = load_genes()
promoters = resize(genes, width = 1000, fix = "start")

# combined motif set (all TFs, peaks + alleles)
fimo = get_full_motif_sets(cht, ab_tp_list)
# only alleles
fimo_alleles  = lapply(ab_tp_list, function(ab_tp) parse_motifs_in_two_alleles(ab_tp, cht)) %>% bind_rows() 

1 Gained reads with new WASP filtering including INDELs

2 Number of reads filtered along steps of pipeline

3 Percent of reads filtered along WASP pipeline

4 Distribution of INDEL size

vcf = read.table(paste0(config$data$VCF$vcf_dir, "/", config$data$VCF$stringent))[, c("V1", "V2", "V3", "V4", "V5")]
colnames(vcf) = c("chr", "start", "end", "REF", "ALT")
vcf$REF_len = apply(vcf,2,nchar)[,c("REF")]
vcf$ALT_len = apply(vcf,2,nchar)[,c("ALT")]

INDELs = subset(vcf, REF_len != ALT_len)
INDELs$INDEL_len = pmax(INDELs$REF_len, INDELs$ALT_len) - 1

p = ggplot(INDELs, aes(x=INDEL_len)) +
    geom_histogram(bins = 26, fill="grey60") + 
    xlab("Length of INDELs (bp)") +
    ylab("Number of INDELs") +
    xlim(0,25) +
    geom_vline(xintercept=1.5, linewidth=0.5, linetype="dashed", colour="grey30") +
    geom_vline(xintercept=5.5, linewidth=0.5, linetype="dashed", colour="grey30") +
    geom_vline(xintercept=10.5, linewidth=0.5, linetype="dashed", colour="grey30") +
    annotate(x = 18, y=80000, geom = "text", label="number of INDEL by size", size=3) +
    annotate(x = 18, y=70000, geom = "text", label=paste0("1bp = ", nrow(subset(INDELs, INDEL_len==1)), " (", round(nrow(subset(INDELs, INDEL_len==1))/nrow(INDELs), 3)*100, "%)"), size=2.5) +
    annotate(x = 18, y=60000, geom = "text", label=paste0("2-5bp = ", nrow(subset(INDELs, INDEL_len>=2 & INDEL_len<=5)), " (", round(nrow(subset(INDELs, INDEL_len>=2 & INDEL_len<=5))/nrow(INDELs), 3)*100, "%)"), size=2.5) +
    annotate(x = 18, y=50000, geom = "text", label=paste0("6-10bp = ", nrow(subset(INDELs, INDEL_len>=6 & INDEL_len<=10)), " (", round(nrow(subset(INDELs, INDEL_len>=6 & INDEL_len<=10))/nrow(INDELs), 3)*100, "%)"), size=2.5) +
    annotate(x = 18, y=40000, geom = "text", label=paste0(">10bp = ", nrow(subset(INDELs, INDEL_len>10)), " (", round(nrow(subset(INDELs, INDEL_len>10))/nrow(INDELs), 3)*100, "%)"), size=2.5) +
    theme_bw() + 
    theme(legend.position="none") +
    theme(panel.grid = element_line(colour = "grey80", linewidth = 1), axis.text = element_text(size = 9)) +
    theme(axis.title = element_text(size = 9), plot.title = element_text(size=9)) +
    theme(strip.text = element_text(size=9)) +
    theme(panel.grid.minor = element_line(linewidth = 0.25), panel.grid.major = element_line(linewidth = 0.5)) 

p

ggsave(file.path(outdir_fig_suppl, "FigS1C_INDELs_distribution_size.pdf"), p, width = 4, height = 4)

5 Distribution of INDEL size after CHT test (WASP filtered)

filtered_variants = unique(cht[, c("TEST.SNP.ID", "TEST.SNP.REF.ALLELE", "TEST.SNP.ALT.ALLELE")])
colnames(filtered_variants) = c("variant_ID", "REF", "ALT")
filtered_variants$REF_len = apply(filtered_variants,2,nchar)[,c("REF")]
filtered_variants$ALT_len = apply(filtered_variants,2,nchar)[,c("ALT")]

filtered_INDELs = subset(filtered_variants, REF_len != ALT_len)
filtered_INDELs$INDEL_len = pmax(filtered_INDELs$REF_len, filtered_INDELs$ALT_len) - 1

p = ggplot(filtered_INDELs, aes(x=INDEL_len)) +
    geom_histogram(bins = 26, fill="grey60") + 
    xlab("Length of INDELs (bp)") +
    ylab("Number of INDELs") +
    xlim(0,25) +
    geom_vline(xintercept=1.5, linewidth=0.5, linetype="dashed", colour="grey30") +
    geom_vline(xintercept=5.5, linewidth=0.5, linetype="dashed", colour="grey30") +
    geom_vline(xintercept=10.5, linewidth=0.5, linetype="dashed", colour="grey30") +
    annotate(x = 18, y=20000, geom = "text", label="number of INDEL by size", size=3) +
    annotate(x = 18, y=18000, geom = "text", label=paste0("1bp = ", nrow(subset(filtered_INDELs, INDEL_len==1)), " (", round(nrow(subset(filtered_INDELs, INDEL_len==1))/nrow(filtered_INDELs), 3)*100, "%)"), size=2.5) +
    annotate(x = 18, y=16000, geom = "text", label=paste0("2-5bp = ", nrow(subset(filtered_INDELs, INDEL_len>=2 & INDEL_len<=5)), " (", round(nrow(subset(filtered_INDELs, INDEL_len>=2 & INDEL_len<=5))/nrow(filtered_INDELs), 3)*100, "%)"), size=2.5) +
    annotate(x = 18, y=14000, geom = "text", label=paste0("6-10bp = ", nrow(subset(filtered_INDELs, INDEL_len>=6 & INDEL_len<=10)), " (", round(nrow(subset(filtered_INDELs, INDEL_len>=6 & INDEL_len<=10))/nrow(filtered_INDELs), 3)*100, "%)"), size=2.5) +
    annotate(x = 18, y=12000, geom = "text", label=paste0(">10bp = ", nrow(subset(filtered_INDELs, INDEL_len>10)), " (", round(nrow(subset(filtered_INDELs, INDEL_len>10))/nrow(filtered_INDELs), 3)*100, "%)"), size=2.5) +
    theme_bw() + 
    theme(legend.position="none") +
    theme(panel.grid = element_line(colour = "grey80", linewidth = 1), axis.text = element_text(size = 9)) +
    theme(axis.title = element_text(size = 9), plot.title = element_text(size=9)) +
    theme(strip.text = element_text(size=9)) +
    theme(panel.grid.minor = element_line(linewidth = 0.25), panel.grid.major = element_line(linewidth = 0.5)) 

p

ggsave(file.path(outdir_fig_suppl, "FigS1D_INDELs_after_WASP_filter_distribution_size.pdf"), p, width = 4, height = 4)
LS0tCnRpdGxlOiAiRmlndXJlX1MxIgpvdXRwdXQ6CiAgIEJpb2NTdHlsZTo6aHRtbF9kb2N1bWVudDoKICAgICAgdG9jOiB0cnVlCiAgICAgIGRmX3ByaW50OiBwYWdlZAogICAgICBzZWxmX2NvbnRhaW5lZDogdHJ1ZQogICAgICBjb2RlX2Rvd25sb2FkOiB0cnVlCiAgICAgIGhpZ2hsaWdodDogdGFuZ28KI2JpYmxpb2dyYXBoeToga25uX21sX2ludHJvLmJpYgplZGl0b3Jfb3B0aW9uczogCiAgY2h1bmtfb3V0cHV0X3R5cGU6IGlubGluZQotLS0KLS0tCnRpdGxlOiAiV0FTUCBiZW5jaG1hcmtzIgpvdXRwdXQ6CiAgIEJpb2NTdHlsZTo6aHRtbF9kb2N1bWVudDoKICAgICAgdG9jOiB0cnVlCiAgICAgIGRmX3ByaW50OiBwYWdlZAogICAgICBzZWxmX2NvbnRhaW5lZDogdHJ1ZQogICAgICBjb2RlX2Rvd25sb2FkOiB0cnVlCiAgICAgIGhpZ2hsaWdodDogdGFuZ28KI2JpYmxpb2dyYXBoeToga25uX21sX2ludHJvLmJpYgplZGl0b3Jfb3B0aW9uczogCiAgY2h1bmtfb3V0cHV0X3R5cGU6IGlubGluZQotLS0KCmBgYHtyIHN0eWxlLCBlY2hvPUZBTFNFLCByZXN1bHRzPSJhc2lzIn0KbGlicmFyeSgia25pdHIiKQpvcHRpb25zKGRpZ2l0cyA9IDIsIHdpZHRoID0gODApCm9wdGlvbnMoYml0bWFwVHlwZSA9ICdjYWlybycpCmdvbGRlbl9yYXRpbyA8LSAoMSArIHNxcnQoNSkpIC8gMgpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSwgdGlkeSA9IEZBTFNFLCBpbmNsdWRlID0gVFJVRSwKICAgICAgICAgICAgICAgZGV2PWMoJ3BuZycsICdwZGYnKSwgZmlnLmhlaWdodCA9IDYsIGZpZy53aWR0aCA9IDYsIGNvbW1lbnQgPSAnICAnLCBkcGkgPSAzMDAsIHdhcm5pbmcgPSBGQUxTRSwgbWVzc2FnZT1GQUxTRSkKYGBgCgpgYGB7cn0Kc291cmNlKCIuLi91dGlscy91dGlscy5SIikKY29uZmlnID0gbG9hZF9jb25maWcoKQoKIyBsb2FkIENIVCByZXN1bHRzCmNodF9mdWxsID0gbGFwcGx5KGFiX3RwX2xpc3QsIGZ1bmN0aW9uKGFiX3RwKSBsb2FkX2NodF9yZXN1bHRzKGFiX3RwLCByZW1vdmVfY2hyID0gRikpICU+JSBiaW5kX3Jvd3MoKQpjaHQgPSBjaHRfZnVsbCAlPiUgZmlsdGVyKCFURVNULlNOUC5DSFJPTSAlaW4lIGMoImNoclgiLCAiY2hyWSIsICJjaHJNIikpCmNodF9zaWduID0gY2h0ICU+JSBmaWx0ZXIoc2lnbmlmX3N0cm9uZ0FJKSAKCiMgZ2VuZXMgYW5kIHByb21vdGVycwpnZW5lcyA9IGxvYWRfZ2VuZXMoKQpwcm9tb3RlcnMgPSByZXNpemUoZ2VuZXMsIHdpZHRoID0gMTAwMCwgZml4ID0gInN0YXJ0IikKCiMgY29tYmluZWQgbW90aWYgc2V0IChhbGwgVEZzLCBwZWFrcyArIGFsbGVsZXMpCmZpbW8gPSBnZXRfZnVsbF9tb3RpZl9zZXRzKGNodCwgYWJfdHBfbGlzdCkKIyBvbmx5IGFsbGVsZXMKZmltb19hbGxlbGVzICA9IGxhcHBseShhYl90cF9saXN0LCBmdW5jdGlvbihhYl90cCkgcGFyc2VfbW90aWZzX2luX3R3b19hbGxlbGVzKGFiX3RwLCBjaHQpKSAlPiUgYmluZF9yb3dzKCkgCmBgYAoKIyBHYWluZWQgcmVhZHMgd2l0aCBuZXcgV0FTUCBmaWx0ZXJpbmcgaW5jbHVkaW5nIElOREVMcwoKYGBge3IgY29tcGFyZWRfcmVhZHNfd2l0aF9XaXRob3V0X0lOREVMcywgY29tbWVudD1OQSwgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRX0KCnJlYWRzX3dpdGhfVlNfd2l0aG91dElOREVMcyA9IHJlYWQudGFibGUoIi9nL2Z1cmxvbmcvcHJvamVjdC82OF9GMV9jaXNyZWdfaWNoaXAvYW5hbHlzaXMvbWFwcGFiaWxpdHlfZmlsdGVyL21hcHBpbmdfcGlwZWxpbmVfV0FTUF9sb2dzL2NvdW50cy9kdXBsaWNhdGVkX3JlYWRzX2ZpbHRlcmVkX3dpdGhfVlNfd2l0aG91dF9JTkRFTHMudHh0IiwgaGVhZGVyPVRSVUUpCnJlYWRzX3dpdGhfVlNfd2l0aG91dElOREVMcyRnYWluID0gcmVhZHNfd2l0aF9WU193aXRob3V0SU5ERUxzJHdpdGhfSU5ERUxzIC8gcmVhZHNfd2l0aF9WU193aXRob3V0SU5ERUxzJHdpdGhvdXRfSU5ERUxzCnJlYWRzX3dpdGhfVlNfd2l0aG91dElOREVMcyRhbnRpYm9keSA9IGZhY3RvcihyZWFkc193aXRoX1ZTX3dpdGhvdXRJTkRFTHMkYW50aWJvZHksIGxldmVscyA9IGMoImJpbiIsICJjdGNmIiwgIm1lZjIiLCAidHdpIiwgImlucHV0IikpCgpwID0gZ2dwbG90KHJlYWRzX3dpdGhfVlNfd2l0aG91dElOREVMcywgYWVzKHg9YW50aWJvZHksIHk9Z2FpbiwgY29sb3VyPWFudGlib2R5KSkgKwogICAgZ2VvbV9qaXR0ZXIod2lkdGg9MC4zNSkgKwogICAgZ2VvbV9ib3hwbG90KGZpbGw9TkEsIGNvbG91cj0iZ3JleTEwIiwgYWxwaGE9MC40LCB3aWR0aD0wLjIsIG91dGxpZXIuY29sb3IgPSBOQSkgKyAKICAgIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDEsIGxpbmV0eXBlPSJkYXNoZWQiLCBjb2xvdXI9ImdyZXk0MCIsIHNpemU9MS41KSArCiAgICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gc2NhbGVzOjpwZXJjZW50LCBsaW1pdHM9YygxLDIpKSArCiAgICB4bGFiKCJTYW1wbGVzIGJ5IGFudGlib2R5IikgKwogICAgeWxhYigiUGVyY2VudGFnZSBvZiByZWFkIGdhbmVkIHdpdGggbmV3IFdBU1AgcGlwZWxpbmUiKSArIAogICAgdGhlbWVfYncoKSArIAogICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJub25lIikgKwogICAgdGhlbWUocGFuZWwuZ3JpZCA9IGVsZW1lbnRfbGluZShjb2xvdXIgPSAiZ3JleTgwIiwgbGluZXdpZHRoID0gMSksIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gOSkpICsKICAgIHRoZW1lKGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDkpLCBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9OSkpICsKICAgIHRoZW1lKHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2xpbmUobGluZXdpZHRoID0gMC4yNSksIHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2xpbmUobGluZXdpZHRoID0gMC41KSkgCgpwCmdnc2F2ZShmaWxlLnBhdGgob3V0ZGlyX2ZpZ19zdXBwbCwgIkZpZ1MxX1dBU1BfZmlsdGVyaW5nX2luY2x1ZGluZ19JTkRFTHMucGRmIiksIHAsIHdpZHRoID0gNiwgaGVpZ2h0ID0gNikKYGBgCgojIE51bWJlciBvZiByZWFkcyBmaWx0ZXJlZCBhbG9uZyBzdGVwcyBvZiBwaXBlbGluZQoKYGBge3IgZmlsdGVyZWRfcmVhZHNfV0FTUCwgY29tbWVudD1OQSwgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgZmlnLmhlaWdodCA9IDYsIGZpZy53aWR0aCA9IDIwfQoKV0FTUF9maWx0ZXJzID0gcmVhZC50YWJsZSgiL2cvZnVybG9uZy9wcm9qZWN0LzY4X0YxX2Npc3JlZ19pY2hpcC9hbmFseXNpcy9tYXBwYWJpbGl0eV9maWx0ZXIvbWFwcGluZ19waXBlbGluZV9XQVNQX2xvZ3MvY291bnRzL1dBU1BfZmlsdGVyZWRfcmVhZHNfd2hvbGVfcGlwZWxpbmVfd2l0aElOREVMc19zYW1wbGVzLnR4dCIsIGhlYWRlcj1UUlVFKQpXQVNQX2ZpbHRlcnMkdG90YWxfcmVhZHNfcmF0aW8gPSBXQVNQX2ZpbHRlcnMkbl9yZWFkcyAvIFdBU1BfZmlsdGVycyRuX3JlYWRzCldBU1BfZmlsdGVycyRtYXBwZWRfcmVhZHNfcmF0aW8gPSAoV0FTUF9maWx0ZXJzJG1hcHBlZF9yZWFkcyAvIFdBU1BfZmlsdGVycyRuX3JlYWRzKSAvIDIKV0FTUF9maWx0ZXJzJHBhc3NlZF9NQVBRX2ZpbHRlcl9yYXRpbyA9IChXQVNQX2ZpbHRlcnMkcGFzc2VkX01BUFFfZmlsdGVyIC8gV0FTUF9maWx0ZXJzJG5fcmVhZHMpIC8gMgpXQVNQX2ZpbHRlcnMkcGFzc2VkX3ByZS5XQVNQX1FDX3JhdGlvID0gKFdBU1BfZmlsdGVycyRwYXNzZWRfcHJlLldBU1BfUUMgLyBXQVNQX2ZpbHRlcnMkbl9yZWFkcykgLyAyCldBU1BfZmlsdGVycyRtYXBwYWJpbGl0eV9maWx0ZXJfcmF0aW8gPSAoV0FTUF9maWx0ZXJzJG1hcHBhYmlsaXR5X2ZpbHRlciAvIFdBU1BfZmlsdGVycyRuX3JlYWRzKSAvIDIKV0FTUF9maWx0ZXJzJGR1cGxpY2F0ZV9yZWFkc19maWx0ZXJlZF9yYXRpbyA9IChXQVNQX2ZpbHRlcnMkZHVwbGljYXRlX3JlYWRzX2ZpbHRlcmVkIC8gV0FTUF9maWx0ZXJzJG5fcmVhZHMpIC8gMgoKV0FTUF9maWx0ZXJfbG9uZyA9IFdBU1BfZmlsdGVycyAlPiUKIHBpdm90X2xvbmdlcighYygic2FtcGxlX25hbWUiLCAibl9yZWFkcyIsICJtYXBwZWRfcmVhZHMiLCAicGFzc2VkX01BUFFfZmlsdGVyIiwgInBhc3NlZF9wcmUuV0FTUF9RQyIsICJtYXBwYWJpbGl0eV9maWx0ZXIiLCAiZHVwbGljYXRlX3JlYWRzX2ZpbHRlcmVkIiwgImNvbmRpdGlvbiIsICJhbnRpYm9keSIsICJjcm9zcyIsICJyZXAiICksIG5hbWVzX3RvID0gImZpbHRlciIsIHZhbHVlc190byA9ICJyYXRpbyIpCldBU1BfZmlsdGVyX2xvbmckZmlsdGVyID0gZ3N1YigidG90YWxfcmVhZHNfcmF0aW8iLCAidG90YWwgcmVhZHMiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdzdWIoIm1hcHBlZF9yZWFkc19yYXRpbyIsICJtYXBwZWQgcmVhZHMiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdzdWIoInBhc3NlZF9NQVBRX2ZpbHRlcl9yYXRpbyIsICJwYXNzZWQgTUFQUSBmaWx0ZXJzIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnc3ViKCJwYXNzZWRfcHJlLldBU1BfUUNfcmF0aW8iLCAicGFzc2VkIHByZS1XQVNQIFFDIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdzdWIoIm1hcHBhYmlsaXR5X2ZpbHRlcl9yYXRpbyIsICJtYXBwYWJpbGl0eSBmaWx0ZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3N1YigiZHVwbGljYXRlX3JlYWRzX2ZpbHRlcmVkX3JhdGlvIiwgImR1cGxpY2F0ZXMgcmVtb3ZlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0FTUF9maWx0ZXJfbG9uZyRmaWx0ZXIpKSkpKSkKV0FTUF9maWx0ZXJfbG9uZyRmaWx0ZXIgPSBmYWN0b3IoV0FTUF9maWx0ZXJfbG9uZyRmaWx0ZXIsIHJldihjKCJ0b3RhbCByZWFkcyIsICJtYXBwZWQgcmVhZHMiLCAicGFzc2VkIE1BUFEgZmlsdGVycyIsICJwYXNzZWQgcHJlLVdBU1AgUUMiLCAibWFwcGFiaWxpdHkgZmlsdGVyIiwgImR1cGxpY2F0ZXMgcmVtb3ZlZCIpKSkKV0FTUF9maWx0ZXJfbG9uZyRhbnRpYm9keSA9IGZhY3RvcihXQVNQX2ZpbHRlcl9sb25nJGFudGlib2R5LCBsZXZlbHMgPSBjKCJiaW4iLCAiY3RjZiIsICJtZWYyIiwgInR3aSIsICJpbnB1dCIpKQoKCldBU1BfZmlsdGVyX2xvbmdfbm9JbnB1dCA9IHN1YnNldChXQVNQX2ZpbHRlcl9sb25nLCBjb25kaXRpb24gIT0gImlucHV0LjI0IiAmIGNvbmRpdGlvbiAhPSAiaW5wdXQuNjgiICYgY29uZGl0aW9uICE9ICJpbnB1dC4xMDEyIikKCnAgPSBnZ3Bsb3QoV0FTUF9maWx0ZXJfbG9uZywgYWVzKHg9ZmlsdGVyLCB5PXJhdGlvLCBjb2xvdXI9YW50aWJvZHkpKSArCiAgICBnZW9tX2ppdHRlcih3aWR0aD0wLjQsIHNpemU9MSkgKwogICAgZ2VvbV9ib3hwbG90KGZpbGw9TkEsIGNvbG91cj0iZ3JleTEwIiwgYWxwaGE9MC40LCB3aWR0aD0wLjIsIG91dGxpZXIuY29sb3IgPSBOQSkgKwogICAgZmFjZXRfd3JhcChmYWNldHMgPSAiYW50aWJvZHkiLCBuY29sID0gNSkgKwogICAgeGxhYigiUUMgZmlsdGVyaW5nIHN0ZXAiKSArCiAgICB5bGFiKCJQZXJjZW50YWdlIG9mIHJlYWRzIGtlcHQgYWxvbmcgZmlsdGVyaW5nIHN0ZXBzIikgKyAKICAgIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBzY2FsZXM6OnBlcmNlbnQsIGxpbWl0cz1jKDAsMS4wMDEpKSArCiAgICBjb29yZF9mbGlwKCkgKwogICAgdGhlbWVfYncoKSArIAogICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJub25lIikgKwogICAgdGhlbWUocGFuZWwuZ3JpZCA9IGVsZW1lbnRfbGluZShjb2xvdXIgPSAiZ3JleTgwIiwgbGluZXdpZHRoID0gMSksIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gOSkpICsKICAgIHRoZW1lKGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDkpLCBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9OSkpICsKICAgIHRoZW1lKHN0cmlwLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZT05KSkgKwogICAgdGhlbWUocGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfbGluZShsaW5ld2lkdGggPSAwLjI1KSwgcGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfbGluZShsaW5ld2lkdGggPSAwLjUpKSArIAogICAgdGhlbWUocGFuZWwuc3BhY2luZyA9IHVuaXQoMiwgImxpbmVzIikpCgpwCmdnc2F2ZShmaWxlLnBhdGgob3V0ZGlyX2ZpZ19zdXBwbCwgIkZpZ1MxX051bWJlcl9vZl9yZWFkc19maWx0ZXJlZC5wZGYiKSwgcCwgd2lkdGggPSA2LCBoZWlnaHQgPSA2KQpgYGAKCgojIFBlcmNlbnQgb2YgcmVhZHMgZmlsdGVyZWQgYWxvbmcgV0FTUCBwaXBlbGluZQoKYGBge3IgZmlsdGVyZWRfcmVhZHNfV0FTUF9waXBlbGluZSwgY29tbWVudD1OQSwgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgZmlnLmhlaWdodCA9IDYsIGZpZy53aWR0aCA9IDIwfQpXQVNQX2ZpbHRlcmVkX3JlYWRzID0gcmVhZC50YWJsZSgiL2cvZnVybG9uZy9wcm9qZWN0LzY4X0YxX2Npc3JlZ19pY2hpcC9hbmFseXNpcy9tYXBwYWJpbGl0eV9maWx0ZXIvbWFwcGluZ19waXBlbGluZV9XQVNQX2xvZ3MvY291bnRzL2ZpbHRlcmluZ193aXRoaW5fV0FTUF9jb3VudHMudHh0IiwgaGVhZGVyPVRSVUUpCgpXQVNQX2ZpbHRlcmVkX3JlYWRzJHRvdGFsX3JlYWRzX3JhdGlvID0gV0FTUF9maWx0ZXJlZF9yZWFkcyRUb3RfcmVhZHMgLyBXQVNQX2ZpbHRlcmVkX3JlYWRzJFRvdF9yZWFkcyAKV0FTUF9maWx0ZXJlZF9yZWFkcyRJTkRFTF9yZWFkc19yYXRpbyA9IChXQVNQX2ZpbHRlcmVkX3JlYWRzJElOREVMX3JlYWRzIC8gV0FTUF9maWx0ZXJlZF9yZWFkcyRUb3RfcmVhZHMpIApXQVNQX2ZpbHRlcmVkX3JlYWRzJE1hcHBhYmlsaXR5X2ZpbHRlcmVkX3JhdGlvID0gKFdBU1BfZmlsdGVyZWRfcmVhZHMkTWFwcGFiaWxpdHlfZmlsdGVyZWQgLyBXQVNQX2ZpbHRlcmVkX3JlYWRzJFRvdF9yZWFkcykgCldBU1BfZmlsdGVyZWRfcmVhZHMkQWxsZWxpY19jb21iaW5hdGlvbnNfcmF0aW8gPSAoV0FTUF9maWx0ZXJlZF9yZWFkcyRBbGxlbGljX2NvbWJpbmF0aW9ucyAvIFdBU1BfZmlsdGVyZWRfcmVhZHMkVG90X3JlYWRzKSAKV0FTUF9maWx0ZXJlZF9yZWFkcyRJbXByb3Blcl9tYXBwaW5nX3JhdGlvID0gKFdBU1BfZmlsdGVyZWRfcmVhZHMkSW1wcm9wZXJfbWFwcGluZyAvIFdBU1BfZmlsdGVyZWRfcmVhZHMkVG90X3JlYWRzKSAKCgpXQVNQX2ZpbHRlcmVkX3JlYWRzX2xvbmcgPSBXQVNQX2ZpbHRlcmVkX3JlYWRzICU+JQogcGl2b3RfbG9uZ2VyKCFjKCJzYW1wbGVfbmFtZSIsICJUb3RfcmVhZHMiLCAiSU5ERUxfcmVhZHMiLCAiTWFwcGFiaWxpdHlfZmlsdGVyZWQiLCAiQWxsZWxpY19jb21iaW5hdGlvbnMiLCAiSW1wcm9wZXJfbWFwcGluZyIsICJjb25kaXRpb24iLCAiYW50aWJvZHkiLCAiY3Jvc3MiLCAicmVwIiApLCBuYW1lc190byA9ICJmaWx0ZXIiLCB2YWx1ZXNfdG8gPSAicmF0aW8iKQpXQVNQX2ZpbHRlcmVkX3JlYWRzX2xvbmckZmlsdGVyID0gZ3N1YigidG90YWxfcmVhZHNfcmF0aW8iLCAidG90YWwgcmVhZHMiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdzdWIoIklOREVMX3JlYWRzX3JhdGlvIiwgIklOREVMcyIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3N1YigiTWFwcGFiaWxpdHlfZmlsdGVyZWRfcmF0aW8iLCAiTWFwcGFiaWxpdHkgaXNzdWVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdzdWIoIkFsbGVsaWNfY29tYmluYXRpb25zX3JhdGlvIiwgIkFsbGVsZSBjb21iaW5hdGlvbnMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3N1YigiSW1wcm9wZXJfbWFwcGluZ19yYXRpbyIsICJJbXByb3BlciBtYXBwaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXQVNQX2ZpbHRlcmVkX3JlYWRzX2xvbmckZmlsdGVyKSkpKSkKV0FTUF9maWx0ZXJlZF9yZWFkc19sb25nJGZpbHRlciA9IGZhY3RvcihXQVNQX2ZpbHRlcmVkX3JlYWRzX2xvbmckZmlsdGVyLCByZXYoYygidG90YWwgcmVhZHMiLCAiSU5ERUxzIiwgIk1hcHBhYmlsaXR5IGlzc3VlcyIsICJBbGxlbGUgY29tYmluYXRpb25zIiwgIkltcHJvcGVyIG1hcHBpbmciKSkpCldBU1BfZmlsdGVyZWRfcmVhZHNfbG9uZyRhbnRpYm9keSA9IGZhY3RvcihXQVNQX2ZpbHRlcmVkX3JlYWRzX2xvbmckYW50aWJvZHksIGxldmVscyA9IGMoImJpbiIsICJjdGNmIiwgIm1lZjIiLCAidHdpIiwgImlucHV0IikpCgpXQVNQX2ZpbHRlcmVkX3JlYWRzX2xvbmcgPSBzdWJzZXQoV0FTUF9maWx0ZXJlZF9yZWFkc19sb25nLCBmaWx0ZXIgIT0gInRvdGFsIHJlYWRzIikKCnAgPSBnZ3Bsb3QoV0FTUF9maWx0ZXJlZF9yZWFkc19sb25nLCBhZXMoeD1maWx0ZXIsIHk9cmF0aW8sIGNvbG91cj1hbnRpYm9keSkpICsKICAgIGdlb21faml0dGVyKHdpZHRoPTAuNCwgc2l6ZT0xKSArCiAgICBnZW9tX2JveHBsb3QoZmlsbD1OQSwgY29sb3VyPSJncmV5MTAiLCBhbHBoYT0wLjQsIHdpZHRoPTAuMiwgb3V0bGllci5jb2xvciA9IE5BKSArCiAgICBmYWNldF93cmFwKGZhY2V0cyA9ICJhbnRpYm9keSIsIG5jb2wgPSA1KSArCiAgICB4bGFiKCJXQVNQIGZpbHRlcmluZyBzdGVwcyIpICsKICAgIHlsYWIoIlBlcmNlbnRhZ2Ugb2YgcmVhZHMgcmVtb3ZlZCBieSBXQVNQIGZpbHRlcmluZyIpICsgCiAgICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gc2NhbGVzOjpwZXJjZW50LCBsaW1pdHM9YygwLDAuMzApKSArCiAgICBjb29yZF9mbGlwKCkgKwogICAgdGhlbWVfYncoKSArIAogICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJub25lIikgKwogICAgdGhlbWUocGFuZWwuZ3JpZCA9IGVsZW1lbnRfbGluZShjb2xvdXIgPSAiZ3JleTgwIiwgbGluZXdpZHRoID0gMSksIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gOSkpICsKICAgIHRoZW1lKGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDkpLCBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9OSkpICsKICAgIHRoZW1lKHN0cmlwLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZT05KSkgKwogICAgdGhlbWUocGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfbGluZShsaW5ld2lkdGggPSAwLjI1KSwgcGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfbGluZShsaW5ld2lkdGggPSAwLjUpKSArIAogICAgdGhlbWUocGFuZWwuc3BhY2luZyA9IHVuaXQoMiwgImxpbmVzIikpCgpwCmdnc2F2ZShmaWxlLnBhdGgob3V0ZGlyX2ZpZ19zdXBwbCwgIkZpZ1MxX051bWJlcl9vZl9yZWFkc19maWx0ZXJlZF9XQVNQX3BpcGVsaW5lLnBkZiIpLCBwLCB3aWR0aCA9IDYsIGhlaWdodCA9IDYpCmBgYAoKCiogTWF4aW11bSBwZXJjZW50YWdlIG9mIHBhc3NlZCBNQVBRIGZpbHRlcnMgcmVhZHMgdGhhdCBvdmVybGFwIGFuIElOREVMOiBgciBtYXgoV0FTUF9maWx0ZXJlZF9yZWFkcyRJTkRFTF9yZWFkc19yYXRpbykqMTAwYCUgbWluaW11bTogYHIgbWluKFdBU1BfZmlsdGVyZWRfcmVhZHMkSU5ERUxfcmVhZHNfcmF0aW8pKjEwMGAlCgoKKiBNYXhpbXVtIHBlcmNlbnRhZ2Ugb2YgbWFwcGFiaWxpdHkgZmlsdGVyZWQgcmVhZHMgYnkgdGhlIG5ldyBXQVNQIHBpcGVsaW5lOiBgciBtYXgoV0FTUF9maWx0ZXJlZF9yZWFkcyRNYXBwYWJpbGl0eV9maWx0ZXJlZF9yYXRpbykqMTAwYCUgbWluaW11bTogYHIgbWluKFdBU1BfZmlsdGVyZWRfcmVhZHMkTWFwcGFiaWxpdHlfZmlsdGVyZWRfcmF0aW8pKjEwMGAlCgoKCgojIERpc3RyaWJ1dGlvbiBvZiBJTkRFTCBzaXplCgpgYGB7ciB9CnZjZiA9IHJlYWQudGFibGUocGFzdGUwKGNvbmZpZyRkYXRhJFZDRiR2Y2ZfZGlyLCAiLyIsIGNvbmZpZyRkYXRhJFZDRiRzdHJpbmdlbnQpKVssIGMoIlYxIiwgIlYyIiwgIlYzIiwgIlY0IiwgIlY1IildCmNvbG5hbWVzKHZjZikgPSBjKCJjaHIiLCAic3RhcnQiLCAiZW5kIiwgIlJFRiIsICJBTFQiKQp2Y2YkUkVGX2xlbiA9IGFwcGx5KHZjZiwyLG5jaGFyKVssYygiUkVGIildCnZjZiRBTFRfbGVuID0gYXBwbHkodmNmLDIsbmNoYXIpWyxjKCJBTFQiKV0KCklOREVMcyA9IHN1YnNldCh2Y2YsIFJFRl9sZW4gIT0gQUxUX2xlbikKSU5ERUxzJElOREVMX2xlbiA9IHBtYXgoSU5ERUxzJFJFRl9sZW4sIElOREVMcyRBTFRfbGVuKSAtIDEKCnAgPSBnZ3Bsb3QoSU5ERUxzLCBhZXMoeD1JTkRFTF9sZW4pKSArCiAgICBnZW9tX2hpc3RvZ3JhbShiaW5zID0gMjYsIGZpbGw9ImdyZXk2MCIpICsgCiAgICB4bGFiKCJMZW5ndGggb2YgSU5ERUxzIChicCkiKSArCiAgICB5bGFiKCJOdW1iZXIgb2YgSU5ERUxzIikgKwogICAgeGxpbSgwLDI1KSArCiAgICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQ9MS41LCBsaW5ld2lkdGg9MC41LCBsaW5ldHlwZT0iZGFzaGVkIiwgY29sb3VyPSJncmV5MzAiKSArCiAgICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQ9NS41LCBsaW5ld2lkdGg9MC41LCBsaW5ldHlwZT0iZGFzaGVkIiwgY29sb3VyPSJncmV5MzAiKSArCiAgICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQ9MTAuNSwgbGluZXdpZHRoPTAuNSwgbGluZXR5cGU9ImRhc2hlZCIsIGNvbG91cj0iZ3JleTMwIikgKwogICAgYW5ub3RhdGUoeCA9IDE4LCB5PTgwMDAwLCBnZW9tID0gInRleHQiLCBsYWJlbD0ibnVtYmVyIG9mIElOREVMIGJ5IHNpemUiLCBzaXplPTMpICsKICAgIGFubm90YXRlKHggPSAxOCwgeT03MDAwMCwgZ2VvbSA9ICJ0ZXh0IiwgbGFiZWw9cGFzdGUwKCIxYnAgPSAiLCBucm93KHN1YnNldChJTkRFTHMsIElOREVMX2xlbj09MSkpLCAiICgiLCByb3VuZChucm93KHN1YnNldChJTkRFTHMsIElOREVMX2xlbj09MSkpL25yb3coSU5ERUxzKSwgMykqMTAwLCAiJSkiKSwgc2l6ZT0yLjUpICsKICAgIGFubm90YXRlKHggPSAxOCwgeT02MDAwMCwgZ2VvbSA9ICJ0ZXh0IiwgbGFiZWw9cGFzdGUwKCIyLTVicCA9ICIsIG5yb3coc3Vic2V0KElOREVMcywgSU5ERUxfbGVuPj0yICYgSU5ERUxfbGVuPD01KSksICIgKCIsIHJvdW5kKG5yb3coc3Vic2V0KElOREVMcywgSU5ERUxfbGVuPj0yICYgSU5ERUxfbGVuPD01KSkvbnJvdyhJTkRFTHMpLCAzKSoxMDAsICIlKSIpLCBzaXplPTIuNSkgKwogICAgYW5ub3RhdGUoeCA9IDE4LCB5PTUwMDAwLCBnZW9tID0gInRleHQiLCBsYWJlbD1wYXN0ZTAoIjYtMTBicCA9ICIsIG5yb3coc3Vic2V0KElOREVMcywgSU5ERUxfbGVuPj02ICYgSU5ERUxfbGVuPD0xMCkpLCAiICgiLCByb3VuZChucm93KHN1YnNldChJTkRFTHMsIElOREVMX2xlbj49NiAmIElOREVMX2xlbjw9MTApKS9ucm93KElOREVMcyksIDMpKjEwMCwgIiUpIiksIHNpemU9Mi41KSArCiAgICBhbm5vdGF0ZSh4ID0gMTgsIHk9NDAwMDAsIGdlb20gPSAidGV4dCIsIGxhYmVsPXBhc3RlMCgiPjEwYnAgPSAiLCBucm93KHN1YnNldChJTkRFTHMsIElOREVMX2xlbj4xMCkpLCAiICgiLCByb3VuZChucm93KHN1YnNldChJTkRFTHMsIElOREVMX2xlbj4xMCkpL25yb3coSU5ERUxzKSwgMykqMTAwLCAiJSkiKSwgc2l6ZT0yLjUpICsKICAgIHRoZW1lX2J3KCkgKyAKICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpICsKICAgIHRoZW1lKHBhbmVsLmdyaWQgPSBlbGVtZW50X2xpbmUoY29sb3VyID0gImdyZXk4MCIsIGxpbmV3aWR0aCA9IDEpLCBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDkpKSArCiAgICB0aGVtZShheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSA5KSwgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTkpKSArCiAgICB0aGVtZShzdHJpcC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemU9OSkpICsKICAgIHRoZW1lKHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2xpbmUobGluZXdpZHRoID0gMC4yNSksIHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2xpbmUobGluZXdpZHRoID0gMC41KSkgCgpwCmdnc2F2ZShmaWxlLnBhdGgob3V0ZGlyX2ZpZ19zdXBwbCwgIkZpZ1MxQ19JTkRFTHNfZGlzdHJpYnV0aW9uX3NpemUucGRmIiksIHAsIHdpZHRoID0gNCwgaGVpZ2h0ID0gNCkKYGBgCgoKCiMgRGlzdHJpYnV0aW9uIG9mIElOREVMIHNpemUgYWZ0ZXIgQ0hUIHRlc3QgKFdBU1AgZmlsdGVyZWQpCgpgYGB7ciB9CmZpbHRlcmVkX3ZhcmlhbnRzID0gdW5pcXVlKGNodFssIGMoIlRFU1QuU05QLklEIiwgIlRFU1QuU05QLlJFRi5BTExFTEUiLCAiVEVTVC5TTlAuQUxULkFMTEVMRSIpXSkKY29sbmFtZXMoZmlsdGVyZWRfdmFyaWFudHMpID0gYygidmFyaWFudF9JRCIsICJSRUYiLCAiQUxUIikKZmlsdGVyZWRfdmFyaWFudHMkUkVGX2xlbiA9IGFwcGx5KGZpbHRlcmVkX3ZhcmlhbnRzLDIsbmNoYXIpWyxjKCJSRUYiKV0KZmlsdGVyZWRfdmFyaWFudHMkQUxUX2xlbiA9IGFwcGx5KGZpbHRlcmVkX3ZhcmlhbnRzLDIsbmNoYXIpWyxjKCJBTFQiKV0KCmZpbHRlcmVkX0lOREVMcyA9IHN1YnNldChmaWx0ZXJlZF92YXJpYW50cywgUkVGX2xlbiAhPSBBTFRfbGVuKQpmaWx0ZXJlZF9JTkRFTHMkSU5ERUxfbGVuID0gcG1heChmaWx0ZXJlZF9JTkRFTHMkUkVGX2xlbiwgZmlsdGVyZWRfSU5ERUxzJEFMVF9sZW4pIC0gMQoKcCA9IGdncGxvdChmaWx0ZXJlZF9JTkRFTHMsIGFlcyh4PUlOREVMX2xlbikpICsKICAgIGdlb21faGlzdG9ncmFtKGJpbnMgPSAyNiwgZmlsbD0iZ3JleTYwIikgKyAKICAgIHhsYWIoIkxlbmd0aCBvZiBJTkRFTHMgKGJwKSIpICsKICAgIHlsYWIoIk51bWJlciBvZiBJTkRFTHMiKSArCiAgICB4bGltKDAsMjUpICsKICAgIGdlb21fdmxpbmUoeGludGVyY2VwdD0xLjUsIGxpbmV3aWR0aD0wLjUsIGxpbmV0eXBlPSJkYXNoZWQiLCBjb2xvdXI9ImdyZXkzMCIpICsKICAgIGdlb21fdmxpbmUoeGludGVyY2VwdD01LjUsIGxpbmV3aWR0aD0wLjUsIGxpbmV0eXBlPSJkYXNoZWQiLCBjb2xvdXI9ImdyZXkzMCIpICsKICAgIGdlb21fdmxpbmUoeGludGVyY2VwdD0xMC41LCBsaW5ld2lkdGg9MC41LCBsaW5ldHlwZT0iZGFzaGVkIiwgY29sb3VyPSJncmV5MzAiKSArCiAgICBhbm5vdGF0ZSh4ID0gMTgsIHk9MjAwMDAsIGdlb20gPSAidGV4dCIsIGxhYmVsPSJudW1iZXIgb2YgSU5ERUwgYnkgc2l6ZSIsIHNpemU9MykgKwogICAgYW5ub3RhdGUoeCA9IDE4LCB5PTE4MDAwLCBnZW9tID0gInRleHQiLCBsYWJlbD1wYXN0ZTAoIjFicCA9ICIsIG5yb3coc3Vic2V0KGZpbHRlcmVkX0lOREVMcywgSU5ERUxfbGVuPT0xKSksICIgKCIsIHJvdW5kKG5yb3coc3Vic2V0KGZpbHRlcmVkX0lOREVMcywgSU5ERUxfbGVuPT0xKSkvbnJvdyhmaWx0ZXJlZF9JTkRFTHMpLCAzKSoxMDAsICIlKSIpLCBzaXplPTIuNSkgKwogICAgYW5ub3RhdGUoeCA9IDE4LCB5PTE2MDAwLCBnZW9tID0gInRleHQiLCBsYWJlbD1wYXN0ZTAoIjItNWJwID0gIiwgbnJvdyhzdWJzZXQoZmlsdGVyZWRfSU5ERUxzLCBJTkRFTF9sZW4+PTIgJiBJTkRFTF9sZW48PTUpKSwgIiAoIiwgcm91bmQobnJvdyhzdWJzZXQoZmlsdGVyZWRfSU5ERUxzLCBJTkRFTF9sZW4+PTIgJiBJTkRFTF9sZW48PTUpKS9ucm93KGZpbHRlcmVkX0lOREVMcyksIDMpKjEwMCwgIiUpIiksIHNpemU9Mi41KSArCiAgICBhbm5vdGF0ZSh4ID0gMTgsIHk9MTQwMDAsIGdlb20gPSAidGV4dCIsIGxhYmVsPXBhc3RlMCgiNi0xMGJwID0gIiwgbnJvdyhzdWJzZXQoZmlsdGVyZWRfSU5ERUxzLCBJTkRFTF9sZW4+PTYgJiBJTkRFTF9sZW48PTEwKSksICIgKCIsIHJvdW5kKG5yb3coc3Vic2V0KGZpbHRlcmVkX0lOREVMcywgSU5ERUxfbGVuPj02ICYgSU5ERUxfbGVuPD0xMCkpL25yb3coZmlsdGVyZWRfSU5ERUxzKSwgMykqMTAwLCAiJSkiKSwgc2l6ZT0yLjUpICsKICAgIGFubm90YXRlKHggPSAxOCwgeT0xMjAwMCwgZ2VvbSA9ICJ0ZXh0IiwgbGFiZWw9cGFzdGUwKCI+MTBicCA9ICIsIG5yb3coc3Vic2V0KGZpbHRlcmVkX0lOREVMcywgSU5ERUxfbGVuPjEwKSksICIgKCIsIHJvdW5kKG5yb3coc3Vic2V0KGZpbHRlcmVkX0lOREVMcywgSU5ERUxfbGVuPjEwKSkvbnJvdyhmaWx0ZXJlZF9JTkRFTHMpLCAzKSoxMDAsICIlKSIpLCBzaXplPTIuNSkgKwogICAgdGhlbWVfYncoKSArIAogICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJub25lIikgKwogICAgdGhlbWUocGFuZWwuZ3JpZCA9IGVsZW1lbnRfbGluZShjb2xvdXIgPSAiZ3JleTgwIiwgbGluZXdpZHRoID0gMSksIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gOSkpICsKICAgIHRoZW1lKGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDkpLCBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9OSkpICsKICAgIHRoZW1lKHN0cmlwLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZT05KSkgKwogICAgdGhlbWUocGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfbGluZShsaW5ld2lkdGggPSAwLjI1KSwgcGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfbGluZShsaW5ld2lkdGggPSAwLjUpKSAKCnAKZ2dzYXZlKGZpbGUucGF0aChvdXRkaXJfZmlnX3N1cHBsLCAiRmlnUzFEX0lOREVMc19hZnRlcl9XQVNQX2ZpbHRlcl9kaXN0cmlidXRpb25fc2l6ZS5wZGYiKSwgcCwgd2lkdGggPSA0LCBoZWlnaHQgPSA0KQpgYGA=