# print params
paged_table(as.data.frame(unlist(params)))

1 Data


library(TCGAbiolinks)
library(biomaRt)
library(kableExtra)
library(rmarkdown)
source("./Notebooks/TCGA/TCGA_functions.R")
# find hpv signature genes
opscc_deg = readRDS(file = "./Data_out/opscc_deg.rds")

avg_diff_cutoff = 0.4
fdr_cutoff = 0.1
signature = opscc_deg %>% filter(avg_diff > avg_diff_cutoff &
                                  fdr < fdr_cutoff) %>% rownames()
signature
 [1] "HPV16-E5" "HPV16-E1" "H2AFZ"    "STMN1"    "CKS1B"    "TUBA1B"   "PTN"      "FBL"      "ALDH3A1"  "KRT5"     "RPL37"    "HMGB2"   
[13] "PTTG1"    "DST"      "IGFBP2"   "KRT15"    "RPS16"    "ATP1B3"   "PDLIM1"   "HSPA1A"   "S100A2"   "IGKC"     "HSPB1"   
  
project_name = "TCGA-HNSC"
HNSC_tpm = readRDS("./Data_out/TCGA_survival_analysis/TCGA_HNSC_TPM.RDS")

if (params$log_tpm) {
  HNSC_tpm = log2(HNSC_tpm+1)
  
}
clinical_data <- GDCquery_clinic(project_name, "clinical")
OPSCC_tissues = c("Base of tongue, NOS",
"Oropharynx, NOS",
"Posterior wall of oropharynx",
"Tonsil, NOS")
clinical_data = clinical_data[clinical_data$tissue_or_organ_of_origin %in% OPSCC_tissues,]
# add HPV data by clinical data
cbp_data = read_tsv(file = "./Input_data/TCGA/cbioportal_hnsc_tcga_pan_can_atlas_2018_clinical_data.tsv")
Rows: 523 Columns: 62
── Column specification ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
Delimiter: "\t"
chr (43): Study ID, Patient ID, Sample ID, Neoplasm Disease Stage American Joint Committee on Cancer Code, American Joint Committee on Can...
dbl (18): Diagnosis Age, Aneuploidy Score, Buffa Hypoxia Score, Last Communication Contact from Initial Pathologic Diagnosis Date, Birth f...
lgl  (1): Patient Weight

ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
cbp_data = cbp_data[,c("Patient ID", "Subtype")] %>% dplyr::rename(hpv_status = Subtype) %>% 
  mutate(hpv_status = gsub(,x = hpv_status,pattern = "HNSC_HPV",replacement = "HPV"))
clinical_data = inner_join(x = clinical_data,y = cbp_data,by = c("submitter_id"="Patient ID"))
na_patients = clinical_data[is.na(clinical_data$hpv_status), "submitter_id"]
# load data 
library("readxl")
library(stringr)
library(ggpubr)
TCGA_HPV_data <- read_excel("./Input_data/TCGA/PMC3806554_ncomms3513-s2.xlsx",skip = 3)
TCGA_HPV_data  %<>% filter(`Tumor type` == "Primary solid")
TCGA_HPV_data$submitter_id = TCGA_HPV_data$`Sample barcode` %>% str_sub( start = 1, end = 12) 
TCGA_HPV_data = TCGA_HPV_data %>%
    filter(Cancer == "HNSC") %>%
    mutate (hpv_status = 
            if_else(
              condition = ppm == "N/A",
              true = "HPV-",
              false =  "HPV+"))


TCGA_HPV_data = TCGA_HPV_data [TCGA_HPV_data$submitter_id %in% na_patients, c("submitter_id","hpv_status")] #get only na patients
clinical_data[match(TCGA_HPV_data$submitter_id, clinical_data$submitter_id),"hpv_status"] <- TCGA_HPV_data$hpv_status # add missing data in cbp
# clinical_data = inner_join(x = clinical_data,y = TCGA_HPV_data[,c("submitter_id","hpv_status")],by = c("submitter_id"="submitter_id"))
clinical_data  = clinical_data[ !is.na(clinical_data$hpv_status), ]

2 MYB

gene_status = set_clinical_data(clin_data = clinical_data,genes = "MYB",tpm_data_frame = HNSC_tpm,stratify = params$stratify)
paged_table(gene_status)
clinical_data_with_scores = clinical_data[clinical_data$submitter_id %in% rownames(gene_status),]
gene_status$patient = rownames(gene_status)
clinical_data_with_scores = left_join(x = clinical_data_with_scores,y = gene_status, by = c("submitter_id"="patient"))

p = TCGAanalyze_survival(
    data = clinical_data_with_scores,
    clusterCol = "gene_status",
    main = "TCGA Set\n GBM",
    height = 10,
    width=10,filename = NULL,pval.method    =T
)

p[[1]]/p[[2]]

3 HPV+ signature


p = TCGAanalyze_survival(
    data = clinical_data_with_scores,
    clusterCol = "hpv_status",
    filename = NULL,pval.method = T
)

p[[1]]/p[[2]]

4 MYB - HPV correlation

# load data 
library("readxl")
library(stringr)
library(ggpubr)
TCGA_HPV_data <- read_excel("./Input_data/TCGA/PMC3806554_ncomms3513-s5.xlsx",skip = 2)
TCGA_HPV_data$submitter_id = TCGA_HPV_data$`Sample Barcode` %>% str_sub( start = 1, end = 12) 
rownames(TCGA_HPV_data) = TCGA_HPV_data$submitter_id
TCGA_HPV_data = TCGA_HPV_data %>% filter(Cancer == "CESC")

gene_status = set_clinical_data(clin_data = clinical_data,genes = "MYB",tpm_data_frame = HNSC_tpm,stratify = params$stratify)
gene_status = gene_status[TCGA_HPV_data$submitter_id,] %>%  cbind(HPV_PPM = TCGA_HPV_data$ppm) %>% na.omit()

paged_table(gene_status)


sp <- ggscatter(gene_status, x = "MYB", y = "HPV_PPM",
   add = "reg.line",  # Add regressin line
   add.params = list(color = "blue", fill = "lightgray"), # Customize reg. line
   conf.int = TRUE # Add confidence interval
   )
# Add correlation coefficient
sp + stat_cor(method = "pearson")

5 HPV signature - HPV correlation

# with HPV signature
gene_status = set_clinical_data(clin_data = clinical_data,genes = signature,tpm_data_frame = HNSC_tpm,stratify = params$stratify,signature_name = "HPV+ signature")
gene_status = gene_status[TCGA_HPV_data$submitter_id,] %>% cbind(HPV_PPM = TCGA_HPV_data$ppm) %>% na.omit()
paged_table(gene_status)

sp <- ggscatter(gene_status, x = "HPV+ signature", y = "HPV_PPM",
   add = "reg.line",  # Add regressin line
   add.params = list(color = "blue", fill = "lightgray"), # Customize reg. line
   conf.int = TRUE # Add confidence interval
   )
# Add correlation coefficient
sp + stat_cor(method = "pearson")

6 MYB- HPV T test

# create data

gene_status = set_clinical_data(clin_data = clinical_data,genes = "MYB",tpm_data_frame = HNSC_tpm,stratify = params$stratify)
gene_status$patient = rownames(gene_status)
gene_status = inner_join(x = gene_status,y = clinical_data[,c("submitter_id","hpv_status")],by = c("patient"="submitter_id"))

paged_table(gene_status)
NA
NA
NA
# plot
library(ggpubr)
library(rstatix)
stat.test <- gene_status %>%
  t_test(MYB ~ hpv_status) %>%
  add_significance()
stat.test


bxp <- ggboxplot(gene_status, x = "hpv_status", y = "MYB", fill = "#00AFBB")+
  geom_jitter()
stat.test <- stat.test %>% add_xy_position(x = "hpv_status")
bxp + 
  stat_pvalue_manual(stat.test,  label = "T-test, p = {p}") 

7 MYB and HPV survival plot

7.1 HPV + tumors

clinical_data_with_scores = clinical_data  %>% filter(hpv_status == "HPV+")

gene_status = set_clinical_data(clin_data = clinical_data_with_scores,genes = "MYB",tpm_data_frame = HNSC_tpm,stratify = "M")
paged_table(gene_status)
gene_status$patient = rownames(gene_status)
clinical_data_with_scores = inner_join(x = clinical_data_with_scores,y = gene_status, by = c("submitter_id"="patient"))
# debugonce(TCGAanalyze_survival)

p = TCGAanalyze_survival(
    data = clinical_data_with_scores,
    clusterCol = "gene_status",
    filename = NULL,pval.method = T
)
p[[1]]/p[[2]]

7.2 HPV- tumors

clinical_data_with_scores = clinical_data  %>% filter(hpv_status == "HPV-")

gene_status = set_clinical_data(clin_data = clinical_data_with_scores,genes = "MYB",tpm_data_frame = HNSC_tpm,stratify = params$stratify)
paged_table(gene_status)
gene_status$patient = rownames(gene_status)
clinical_data_with_scores = inner_join(x = clinical_data_with_scores,y = gene_status, by = c("submitter_id"="patient"))

p = TCGAanalyze_survival(
    data = clinical_data_with_scores,
    clusterCol = "gene_status",
    filename = NULL,pval.method = T
)
p[[1]]/p[[2]]

7.3 combine MYB and HPV survival plot

gene_status = set_clinical_data(clin_data = clinical_data,genes = "MYB",tpm_data_frame = HNSC_tpm,stratify = params$stratify)
gene_status$patient = rownames(gene_status)

clinical_data_with_scores = inner_join(x = clinical_data,y = gene_status, by = c("submitter_id"="patient"))

clinical_data_with_scores$gene_status = paste(clinical_data_with_scores$gene_status,clinical_data_with_scores$hpv_status,sep = ", ")
gene_status$hpv_status = NULL
paged_table(gene_status)

p = TCGAanalyze_survival(
    data = clinical_data_with_scores,
    clusterCol = "gene_status",
    main = "TCGA Set\n GBM",
    height = 10,
    width=10,filename = NULL,pval.method = T
)
p[[1]]/p[[2]]

8 shared signature

shared_signature = readRDS(file = "./Data_out/temp/shared_signature.RDS")
gene_status = set_clinical_data(clin_data = clinical_data,genes = shared_signature,tpm_data_frame = HNSC_tpm,stratify = params$stratify,signature_name = "HPV+ signature")
paged_table(gene_status)
clinical_data_with_scores = clinical_data[clinical_data$submitter_id %in% rownames(gene_status),]
gene_status$patient = rownames(gene_status)
clinical_data_with_scores = left_join(x = clinical_data_with_scores,y = gene_status, by = c("submitter_id"="patient"))

p = TCGAanalyze_survival(
    data = clinical_data_with_scores,
    clusterCol = "gene_status",
    main = "TCGA Set\n GBM",
    height = 10,
    width=10,filename = NULL,pval.method = T
)

p[[1]]/p[[2]]

9 HMSC signature

# load
hmsc_deg = read.table(file = "./Data_out/HPV_analysis/hpv_deg_df.csv",row.names = 1)
  avg_diff_cutoff = 1
  fdr_cutoff = 0.1
  signature = hmsc_deg %>% filter(avg_diff>avg_diff_cutoff & fdr<fdr_cutoff) %>% rownames()
  signature
gene_status = set_clinical_data(clin_data = clinical_data,genes = signature,tpm_data_frame = HNSC_tpm,stratify = params$stratify,signature_name = "HPV+ signature")
paged_table(gene_status)
clinical_data_with_scores = clinical_data[clinical_data$submitter_id %in% rownames(gene_status),]
gene_status$patient = rownames(gene_status)
clinical_data_with_scores = left_join(x = clinical_data_with_scores,y = gene_status, by = c("submitter_id"="patient"))

p = TCGAanalyze_survival(
    data = clinical_data_with_scores,
    clusterCol = "gene_status",
    main = "TCGA Set\n GBM",
    height = 10,
    width=10,filename = NULL,pval.method = T
)

p[[1]]/p[[2]]
LS0tCnRpdGxlOiAnYHIgcnN0dWRpb2FwaTo6Z2V0U291cmNlRWRpdG9yQ29udGV4dCgpJHBhdGggJT4lIGJhc2VuYW1lKCkgJT4lIGdzdWIocGF0dGVybiA9ICJcXC5SbWQiLHJlcGxhY2VtZW50ID0gIiIpYCcgCmF1dGhvcjogIkF2aXNoYWkgV2l6ZWwiCmRhdGU6ICdgciBTeXMudGltZSgpYCcKb3V0cHV0OiAKICBodG1sX25vdGVib29rOiAKICAgIGNvZGVfZm9sZGluZzogaGlkZQogICAgdG9jOiB5ZXMKICAgIHRvY19jb2xsYXBzZTogeWVzCiAgICB0b2NfZmxvYXQ6IAogICAgICBjb2xsYXBzZWQ6IFRSVUUKICAgIG51bWJlcl9zZWN0aW9uczogdHJ1ZQogICAgdG9jX2RlcHRoOiAyCiAgICAKICBodG1sX2RvY3VtZW50OiAKICAgIGNvZGVfZm9sZGluZzogaGlkZQogICAgdG9jOiB5ZXMKICAgIHRvY19jb2xsYXBzZTogeWVzCiAgICB0b2NfZmxvYXQ6IAogICAgICBjb2xsYXBzZWQ6IFRSVUUKICAgIG51bWJlcl9zZWN0aW9uczogdHJ1ZQogICAgdG9jX2RlcHRoOiAyCiAgICBkZi1wcmludDogcGFnZWQKCnBhcmFtczoKICBzdHJhdGlmeTogIk0iCiAgbG9nX3RwbTogVFJVRQogIGRhdGFfb3V0X2RpcjogTlVMTAogIGZpZ3Nfb3V0X2RpcjogTlVMTAotLS0KCgpgYGB7cn0KIyBwcmludCBwYXJhbXMKcGFnZWRfdGFibGUoYXMuZGF0YS5mcmFtZSh1bmxpc3QocGFyYW1zKSkpCmBgYAoKIyBEYXRhCgpgYGB7cn0KCmxpYnJhcnkoVENHQWJpb2xpbmtzKQpsaWJyYXJ5KGJpb21hUnQpCmxpYnJhcnkoa2FibGVFeHRyYSkKbGlicmFyeShybWFya2Rvd24pCnNvdXJjZSgiLi9Ob3RlYm9va3MvVENHQS9UQ0dBX2Z1bmN0aW9ucy5SIikKYGBgCgoKCmBgYHtyfQojIGZpbmQgaHB2IHNpZ25hdHVyZSBnZW5lcwpvcHNjY19kZWcgPSByZWFkUkRTKGZpbGUgPSAiLi9EYXRhX291dC9vcHNjY19kZWcucmRzIikKCmF2Z19kaWZmX2N1dG9mZiA9IDAuNApmZHJfY3V0b2ZmID0gMC4xCnNpZ25hdHVyZSA9IG9wc2NjX2RlZyAlPiUgZmlsdGVyKGF2Z19kaWZmID4gYXZnX2RpZmZfY3V0b2ZmICYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZkciA8IGZkcl9jdXRvZmYpICU+JSByb3duYW1lcygpCnNpZ25hdHVyZQogIApgYGAKCmBgYHtyfQpwcm9qZWN0X25hbWUgPSAiVENHQS1ITlNDIgpgYGAKCmBgYHtyfQpITlNDX3RwbSA9IHJlYWRSRFMoIi4vRGF0YV9vdXQvVENHQV9zdXJ2aXZhbF9hbmFseXNpcy9UQ0dBX0hOU0NfVFBNLlJEUyIpCgppZiAocGFyYW1zJGxvZ190cG0pIHsKICBITlNDX3RwbSA9IGxvZzIoSE5TQ190cG0rMSkKICAKfQpgYGAKCmBgYHtyfQpjbGluaWNhbF9kYXRhIDwtIEdEQ3F1ZXJ5X2NsaW5pYyhwcm9qZWN0X25hbWUsICJjbGluaWNhbCIpCk9QU0NDX3Rpc3N1ZXMgPSBjKCJCYXNlIG9mIHRvbmd1ZSwgTk9TIiwKIk9yb3BoYXJ5bngsIE5PUyIsCiJQb3N0ZXJpb3Igd2FsbCBvZiBvcm9waGFyeW54IiwKIlRvbnNpbCwgTk9TIikKY2xpbmljYWxfZGF0YSA9IGNsaW5pY2FsX2RhdGFbY2xpbmljYWxfZGF0YSR0aXNzdWVfb3Jfb3JnYW5fb2Zfb3JpZ2luICVpbiUgT1BTQ0NfdGlzc3VlcyxdCmBgYAoKYGBge3J9CiMgYWRkIEhQViBkYXRhIGJ5IGNsaW5pY2FsIGRhdGEKY2JwX2RhdGEgPSByZWFkX3RzdihmaWxlID0gIi4vSW5wdXRfZGF0YS9UQ0dBL2NiaW9wb3J0YWxfaG5zY190Y2dhX3Bhbl9jYW5fYXRsYXNfMjAxOF9jbGluaWNhbF9kYXRhLnRzdiIpCmNicF9kYXRhID0gY2JwX2RhdGFbLGMoIlBhdGllbnQgSUQiLCAiU3VidHlwZSIpXSAlPiUgZHBseXI6OnJlbmFtZShocHZfc3RhdHVzID0gU3VidHlwZSkgJT4lIAogIG11dGF0ZShocHZfc3RhdHVzID0gZ3N1YigseCA9IGhwdl9zdGF0dXMscGF0dGVybiA9ICJITlNDX0hQViIscmVwbGFjZW1lbnQgPSAiSFBWIikpCmNsaW5pY2FsX2RhdGEgPSBpbm5lcl9qb2luKHggPSBjbGluaWNhbF9kYXRhLHkgPSBjYnBfZGF0YSxieSA9IGMoInN1Ym1pdHRlcl9pZCI9IlBhdGllbnQgSUQiKSkKbmFfcGF0aWVudHMgPSBjbGluaWNhbF9kYXRhW2lzLm5hKGNsaW5pY2FsX2RhdGEkaHB2X3N0YXR1cyksICJzdWJtaXR0ZXJfaWQiXQpgYGAKCmBgYHtyfQojIGxvYWQgZGF0YSAKbGlicmFyeSgicmVhZHhsIikKbGlicmFyeShzdHJpbmdyKQpsaWJyYXJ5KGdncHVicikKVENHQV9IUFZfZGF0YSA8LSByZWFkX2V4Y2VsKCIuL0lucHV0X2RhdGEvVENHQS9QTUMzODA2NTU0X25jb21tczM1MTMtczIueGxzeCIsc2tpcCA9IDMpClRDR0FfSFBWX2RhdGEgICU8PiUgZmlsdGVyKGBUdW1vciB0eXBlYCA9PSAiUHJpbWFyeSBzb2xpZCIpClRDR0FfSFBWX2RhdGEkc3VibWl0dGVyX2lkID0gVENHQV9IUFZfZGF0YSRgU2FtcGxlIGJhcmNvZGVgICU+JSBzdHJfc3ViKCBzdGFydCA9IDEsIGVuZCA9IDEyKSAKVENHQV9IUFZfZGF0YSA9IFRDR0FfSFBWX2RhdGEgJT4lCiAgICBmaWx0ZXIoQ2FuY2VyID09ICJITlNDIikgJT4lCiAgICBtdXRhdGUgKGhwdl9zdGF0dXMgPSAKICAgICAgICAgICAgaWZfZWxzZSgKICAgICAgICAgICAgICBjb25kaXRpb24gPSBwcG0gPT0gIk4vQSIsCiAgICAgICAgICAgICAgdHJ1ZSA9ICJIUFYtIiwKICAgICAgICAgICAgICBmYWxzZSA9ICAiSFBWKyIpKQoKClRDR0FfSFBWX2RhdGEgPSBUQ0dBX0hQVl9kYXRhIFtUQ0dBX0hQVl9kYXRhJHN1Ym1pdHRlcl9pZCAlaW4lIG5hX3BhdGllbnRzLCBjKCJzdWJtaXR0ZXJfaWQiLCJocHZfc3RhdHVzIildICNnZXQgb25seSBuYSBwYXRpZW50cwpjbGluaWNhbF9kYXRhW21hdGNoKFRDR0FfSFBWX2RhdGEkc3VibWl0dGVyX2lkLCBjbGluaWNhbF9kYXRhJHN1Ym1pdHRlcl9pZCksImhwdl9zdGF0dXMiXSA8LSBUQ0dBX0hQVl9kYXRhJGhwdl9zdGF0dXMgIyBhZGQgbWlzc2luZyBkYXRhIGluIGNicApjbGluaWNhbF9kYXRhICA9IGNsaW5pY2FsX2RhdGFbICFpcy5uYShjbGluaWNhbF9kYXRhJGhwdl9zdGF0dXMpLCBdCgpgYGAKCgojIE1ZQgpgYGB7cn0KZ2VuZV9zdGF0dXMgPSBzZXRfY2xpbmljYWxfZGF0YShjbGluX2RhdGEgPSBjbGluaWNhbF9kYXRhLGdlbmVzID0gIk1ZQiIsdHBtX2RhdGFfZnJhbWUgPSBITlNDX3RwbSxzdHJhdGlmeSA9IHBhcmFtcyRzdHJhdGlmeSkKcGFnZWRfdGFibGUoZ2VuZV9zdGF0dXMpCmBgYAoKCgoKCmBgYHtyIGZpZy5oZWlnaHQ9NiwgZmlnLndpZHRoPTh9CmNsaW5pY2FsX2RhdGFfd2l0aF9zY29yZXMgPSBjbGluaWNhbF9kYXRhW2NsaW5pY2FsX2RhdGEkc3VibWl0dGVyX2lkICVpbiUgcm93bmFtZXMoZ2VuZV9zdGF0dXMpLF0KZ2VuZV9zdGF0dXMkcGF0aWVudCA9IHJvd25hbWVzKGdlbmVfc3RhdHVzKQpjbGluaWNhbF9kYXRhX3dpdGhfc2NvcmVzID0gbGVmdF9qb2luKHggPSBjbGluaWNhbF9kYXRhX3dpdGhfc2NvcmVzLHkgPSBnZW5lX3N0YXR1cywgYnkgPSBjKCJzdWJtaXR0ZXJfaWQiPSJwYXRpZW50IikpCgpwID0gVENHQWFuYWx5emVfc3Vydml2YWwoCiAgICBkYXRhID0gY2xpbmljYWxfZGF0YV93aXRoX3Njb3JlcywKICAgIGNsdXN0ZXJDb2wgPSAiZ2VuZV9zdGF0dXMiLAogICAgbWFpbiA9ICJUQ0dBIFNldFxuIEdCTSIsCiAgICBoZWlnaHQgPSAxMCwKICAgIHdpZHRoPTEwLGZpbGVuYW1lID0gTlVMTCxwdmFsLm1ldGhvZAk9VAopCgpwW1sxXV0vcFtbMl1dCmBgYAoKIyBIUFYrIHNpZ25hdHVyZQoKCgoKCmBgYHtyIGZpZy5oZWlnaHQ9NiwgZmlnLndpZHRoPTh9CgpwID0gVENHQWFuYWx5emVfc3Vydml2YWwoCiAgICBkYXRhID0gY2xpbmljYWxfZGF0YV93aXRoX3Njb3JlcywKICAgIGNsdXN0ZXJDb2wgPSAiaHB2X3N0YXR1cyIsCiAgICBmaWxlbmFtZSA9IE5VTEwscHZhbC5tZXRob2QgPSBUCikKCnBbWzFdXS9wW1syXV0KYGBgCgoKCiMgTVlCIC0gSFBWIGNvcnJlbGF0aW9uCgpgYGB7cn0KIyBsb2FkIGRhdGEgCmxpYnJhcnkoInJlYWR4bCIpCmxpYnJhcnkoc3RyaW5ncikKbGlicmFyeShnZ3B1YnIpClRDR0FfSFBWX2RhdGEgPC0gcmVhZF9leGNlbCgiLi9JbnB1dF9kYXRhL1RDR0EvUE1DMzgwNjU1NF9uY29tbXMzNTEzLXM1Lnhsc3giLHNraXAgPSAyKQpUQ0dBX0hQVl9kYXRhJHN1Ym1pdHRlcl9pZCA9IFRDR0FfSFBWX2RhdGEkYFNhbXBsZSBCYXJjb2RlYCAlPiUgc3RyX3N1Yiggc3RhcnQgPSAxLCBlbmQgPSAxMikgCnJvd25hbWVzKFRDR0FfSFBWX2RhdGEpID0gVENHQV9IUFZfZGF0YSRzdWJtaXR0ZXJfaWQKVENHQV9IUFZfZGF0YSA9IFRDR0FfSFBWX2RhdGEgJT4lIGZpbHRlcihDYW5jZXIgPT0gIkNFU0MiKQpgYGAKCmBgYHtyfQoKZ2VuZV9zdGF0dXMgPSBzZXRfY2xpbmljYWxfZGF0YShjbGluX2RhdGEgPSBjbGluaWNhbF9kYXRhLGdlbmVzID0gIk1ZQiIsdHBtX2RhdGFfZnJhbWUgPSBITlNDX3RwbSxzdHJhdGlmeSA9IHBhcmFtcyRzdHJhdGlmeSkKZ2VuZV9zdGF0dXMgPSBnZW5lX3N0YXR1c1tUQ0dBX0hQVl9kYXRhJHN1Ym1pdHRlcl9pZCxdICU+JSAgY2JpbmQoSFBWX1BQTSA9IFRDR0FfSFBWX2RhdGEkcHBtKSAlPiUgbmEub21pdCgpCgpwYWdlZF90YWJsZShnZW5lX3N0YXR1cykKCgpzcCA8LSBnZ3NjYXR0ZXIoZ2VuZV9zdGF0dXMsIHggPSAiTVlCIiwgeSA9ICJIUFZfUFBNIiwKICAgYWRkID0gInJlZy5saW5lIiwgICMgQWRkIHJlZ3Jlc3NpbiBsaW5lCiAgIGFkZC5wYXJhbXMgPSBsaXN0KGNvbG9yID0gImJsdWUiLCBmaWxsID0gImxpZ2h0Z3JheSIpLCAjIEN1c3RvbWl6ZSByZWcuIGxpbmUKICAgY29uZi5pbnQgPSBUUlVFICMgQWRkIGNvbmZpZGVuY2UgaW50ZXJ2YWwKICAgKQojIEFkZCBjb3JyZWxhdGlvbiBjb2VmZmljaWVudApzcCArIHN0YXRfY29yKG1ldGhvZCA9ICJwZWFyc29uIikKCmBgYAoKIyBIUFYgc2lnbmF0dXJlIC0gSFBWIGNvcnJlbGF0aW9uCgpgYGB7cn0KIyB3aXRoIEhQViBzaWduYXR1cmUKZ2VuZV9zdGF0dXMgPSBzZXRfY2xpbmljYWxfZGF0YShjbGluX2RhdGEgPSBjbGluaWNhbF9kYXRhLGdlbmVzID0gc2lnbmF0dXJlLHRwbV9kYXRhX2ZyYW1lID0gSE5TQ190cG0sc3RyYXRpZnkgPSBwYXJhbXMkc3RyYXRpZnksc2lnbmF0dXJlX25hbWUgPSAiSFBWKyBzaWduYXR1cmUiKQpnZW5lX3N0YXR1cyA9IGdlbmVfc3RhdHVzW1RDR0FfSFBWX2RhdGEkc3VibWl0dGVyX2lkLF0gJT4lIGNiaW5kKEhQVl9QUE0gPSBUQ0dBX0hQVl9kYXRhJHBwbSkgJT4lIG5hLm9taXQoKQpwYWdlZF90YWJsZShnZW5lX3N0YXR1cykKCnNwIDwtIGdnc2NhdHRlcihnZW5lX3N0YXR1cywgeCA9ICJIUFYrIHNpZ25hdHVyZSIsIHkgPSAiSFBWX1BQTSIsCiAgIGFkZCA9ICJyZWcubGluZSIsICAjIEFkZCByZWdyZXNzaW4gbGluZQogICBhZGQucGFyYW1zID0gbGlzdChjb2xvciA9ICJibHVlIiwgZmlsbCA9ICJsaWdodGdyYXkiKSwgIyBDdXN0b21pemUgcmVnLiBsaW5lCiAgIGNvbmYuaW50ID0gVFJVRSAjIEFkZCBjb25maWRlbmNlIGludGVydmFsCiAgICkKIyBBZGQgY29ycmVsYXRpb24gY29lZmZpY2llbnQKc3AgKyBzdGF0X2NvcihtZXRob2QgPSAicGVhcnNvbiIpCgoKYGBgCgojIE1ZQi0gSFBWIFQgdGVzdAoKYGBge3J9CiMgY3JlYXRlIGRhdGEKCmdlbmVfc3RhdHVzID0gc2V0X2NsaW5pY2FsX2RhdGEoY2xpbl9kYXRhID0gY2xpbmljYWxfZGF0YSxnZW5lcyA9ICJNWUIiLHRwbV9kYXRhX2ZyYW1lID0gSE5TQ190cG0sc3RyYXRpZnkgPSBwYXJhbXMkc3RyYXRpZnkpCmdlbmVfc3RhdHVzJHBhdGllbnQgPSByb3duYW1lcyhnZW5lX3N0YXR1cykKZ2VuZV9zdGF0dXMgPSBpbm5lcl9qb2luKHggPSBnZW5lX3N0YXR1cyx5ID0gY2xpbmljYWxfZGF0YVssYygic3VibWl0dGVyX2lkIiwiaHB2X3N0YXR1cyIpXSxieSA9IGMoInBhdGllbnQiPSJzdWJtaXR0ZXJfaWQiKSkKCnBhZ2VkX3RhYmxlKGdlbmVfc3RhdHVzKQoKCgpgYGAKCmBgYHtyfQojIHBsb3QKbGlicmFyeShnZ3B1YnIpCmxpYnJhcnkocnN0YXRpeCkKc3RhdC50ZXN0IDwtIGdlbmVfc3RhdHVzICU+JQogIHRfdGVzdChNWUIgfiBocHZfc3RhdHVzKSAlPiUKICBhZGRfc2lnbmlmaWNhbmNlKCkKc3RhdC50ZXN0CgoKYnhwIDwtIGdnYm94cGxvdChnZW5lX3N0YXR1cywgeCA9ICJocHZfc3RhdHVzIiwgeSA9ICJNWUIiLCBmaWxsID0gIiMwMEFGQkIiKSsKICBnZW9tX2ppdHRlcigpCnN0YXQudGVzdCA8LSBzdGF0LnRlc3QgJT4lIGFkZF94eV9wb3NpdGlvbih4ID0gImhwdl9zdGF0dXMiKQpieHAgKyAKICBzdGF0X3B2YWx1ZV9tYW51YWwoc3RhdC50ZXN0LCAgbGFiZWwgPSAiVC10ZXN0LCBwID0ge3B9IikgCgpgYGAKCiMgTVlCIGFuZCBIUFYgc3Vydml2YWwgcGxvdAoKCiMjIEhQViArIHR1bW9ycwpgYGB7cn0KY2xpbmljYWxfZGF0YV93aXRoX3Njb3JlcyA9IGNsaW5pY2FsX2RhdGEgICU+JSBmaWx0ZXIoaHB2X3N0YXR1cyA9PSAiSFBWKyIpCgpnZW5lX3N0YXR1cyA9IHNldF9jbGluaWNhbF9kYXRhKGNsaW5fZGF0YSA9IGNsaW5pY2FsX2RhdGFfd2l0aF9zY29yZXMsZ2VuZXMgPSAiTVlCIix0cG1fZGF0YV9mcmFtZSA9IEhOU0NfdHBtLHN0cmF0aWZ5ID0gIk0iKQpwYWdlZF90YWJsZShnZW5lX3N0YXR1cykKYGBgCgoKYGBge3IgZmlnLmhlaWdodD02LCBmaWcud2lkdGg9OH0KZ2VuZV9zdGF0dXMkcGF0aWVudCA9IHJvd25hbWVzKGdlbmVfc3RhdHVzKQpjbGluaWNhbF9kYXRhX3dpdGhfc2NvcmVzID0gaW5uZXJfam9pbih4ID0gY2xpbmljYWxfZGF0YV93aXRoX3Njb3Jlcyx5ID0gZ2VuZV9zdGF0dXMsIGJ5ID0gYygic3VibWl0dGVyX2lkIj0icGF0aWVudCIpKQojIGRlYnVnb25jZShUQ0dBYW5hbHl6ZV9zdXJ2aXZhbCkKCnAgPSBUQ0dBYW5hbHl6ZV9zdXJ2aXZhbCgKICAgIGRhdGEgPSBjbGluaWNhbF9kYXRhX3dpdGhfc2NvcmVzLAogICAgY2x1c3RlckNvbCA9ICJnZW5lX3N0YXR1cyIsCiAgICBmaWxlbmFtZSA9IE5VTEwscHZhbC5tZXRob2QgPSBUCikKcFtbMV1dL3BbWzJdXQpgYGAKCiMjIEhQVi0gdHVtb3JzCmBgYHtyfQpjbGluaWNhbF9kYXRhX3dpdGhfc2NvcmVzID0gY2xpbmljYWxfZGF0YSAgJT4lIGZpbHRlcihocHZfc3RhdHVzID09ICJIUFYtIikKCmdlbmVfc3RhdHVzID0gc2V0X2NsaW5pY2FsX2RhdGEoY2xpbl9kYXRhID0gY2xpbmljYWxfZGF0YV93aXRoX3Njb3JlcyxnZW5lcyA9ICJNWUIiLHRwbV9kYXRhX2ZyYW1lID0gSE5TQ190cG0sc3RyYXRpZnkgPSBwYXJhbXMkc3RyYXRpZnkpCnBhZ2VkX3RhYmxlKGdlbmVfc3RhdHVzKQpgYGAKCgpgYGB7ciBmaWcuaGVpZ2h0PTYsIGZpZy53aWR0aD04fQpnZW5lX3N0YXR1cyRwYXRpZW50ID0gcm93bmFtZXMoZ2VuZV9zdGF0dXMpCmNsaW5pY2FsX2RhdGFfd2l0aF9zY29yZXMgPSBpbm5lcl9qb2luKHggPSBjbGluaWNhbF9kYXRhX3dpdGhfc2NvcmVzLHkgPSBnZW5lX3N0YXR1cywgYnkgPSBjKCJzdWJtaXR0ZXJfaWQiPSJwYXRpZW50IikpCgpwID0gVENHQWFuYWx5emVfc3Vydml2YWwoCiAgICBkYXRhID0gY2xpbmljYWxfZGF0YV93aXRoX3Njb3JlcywKICAgIGNsdXN0ZXJDb2wgPSAiZ2VuZV9zdGF0dXMiLAogICAgZmlsZW5hbWUgPSBOVUxMLHB2YWwubWV0aG9kID0gVAopCnBbWzFdXS9wW1syXV0KYGBgCgoKCiMjIGNvbWJpbmUgTVlCIGFuZCBIUFYgc3Vydml2YWwgcGxvdAoKYGBge3J9CmdlbmVfc3RhdHVzID0gc2V0X2NsaW5pY2FsX2RhdGEoY2xpbl9kYXRhID0gY2xpbmljYWxfZGF0YSxnZW5lcyA9ICJNWUIiLHRwbV9kYXRhX2ZyYW1lID0gSE5TQ190cG0sc3RyYXRpZnkgPSBwYXJhbXMkc3RyYXRpZnkpCmdlbmVfc3RhdHVzJHBhdGllbnQgPSByb3duYW1lcyhnZW5lX3N0YXR1cykKCmNsaW5pY2FsX2RhdGFfd2l0aF9zY29yZXMgPSBpbm5lcl9qb2luKHggPSBjbGluaWNhbF9kYXRhLHkgPSBnZW5lX3N0YXR1cywgYnkgPSBjKCJzdWJtaXR0ZXJfaWQiPSJwYXRpZW50IikpCgpjbGluaWNhbF9kYXRhX3dpdGhfc2NvcmVzJGdlbmVfc3RhdHVzID0gcGFzdGUoY2xpbmljYWxfZGF0YV93aXRoX3Njb3JlcyRnZW5lX3N0YXR1cyxjbGluaWNhbF9kYXRhX3dpdGhfc2NvcmVzJGhwdl9zdGF0dXMsc2VwID0gIiwgIikKZ2VuZV9zdGF0dXMkaHB2X3N0YXR1cyA9IE5VTEwKcGFnZWRfdGFibGUoZ2VuZV9zdGF0dXMpCmBgYAoKCmBgYHtyIGZpZy5oZWlnaHQ9NiwgZmlnLndpZHRoPTExfQoKcCA9IFRDR0FhbmFseXplX3N1cnZpdmFsKAogICAgZGF0YSA9IGNsaW5pY2FsX2RhdGFfd2l0aF9zY29yZXMsCiAgICBjbHVzdGVyQ29sID0gImdlbmVfc3RhdHVzIiwKICAgIG1haW4gPSAiVENHQSBTZXRcbiBHQk0iLAogICAgaGVpZ2h0ID0gMTAsCiAgICB3aWR0aD0xMCxmaWxlbmFtZSA9IE5VTEwscHZhbC5tZXRob2QgPSBUCikKcFtbMV1dL3BbWzJdXQpgYGAKCgojIHNoYXJlZCBzaWduYXR1cmUKYGBge3J9CnNoYXJlZF9zaWduYXR1cmUgPSByZWFkUkRTKGZpbGUgPSAiLi9EYXRhX291dC90ZW1wL3NoYXJlZF9zaWduYXR1cmUuUkRTIikKYGBgCgpgYGB7cn0KZ2VuZV9zdGF0dXMgPSBzZXRfY2xpbmljYWxfZGF0YShjbGluX2RhdGEgPSBjbGluaWNhbF9kYXRhLGdlbmVzID0gc2hhcmVkX3NpZ25hdHVyZSx0cG1fZGF0YV9mcmFtZSA9IEhOU0NfdHBtLHN0cmF0aWZ5ID0gcGFyYW1zJHN0cmF0aWZ5LHNpZ25hdHVyZV9uYW1lID0gIkhQVisgc2lnbmF0dXJlIikKcGFnZWRfdGFibGUoZ2VuZV9zdGF0dXMpCmBgYAoKCgoKCmBgYHtyIGZpZy5oZWlnaHQ9NiwgZmlnLndpZHRoPTh9CmNsaW5pY2FsX2RhdGFfd2l0aF9zY29yZXMgPSBjbGluaWNhbF9kYXRhW2NsaW5pY2FsX2RhdGEkc3VibWl0dGVyX2lkICVpbiUgcm93bmFtZXMoZ2VuZV9zdGF0dXMpLF0KZ2VuZV9zdGF0dXMkcGF0aWVudCA9IHJvd25hbWVzKGdlbmVfc3RhdHVzKQpjbGluaWNhbF9kYXRhX3dpdGhfc2NvcmVzID0gbGVmdF9qb2luKHggPSBjbGluaWNhbF9kYXRhX3dpdGhfc2NvcmVzLHkgPSBnZW5lX3N0YXR1cywgYnkgPSBjKCJzdWJtaXR0ZXJfaWQiPSJwYXRpZW50IikpCgpwID0gVENHQWFuYWx5emVfc3Vydml2YWwoCiAgICBkYXRhID0gY2xpbmljYWxfZGF0YV93aXRoX3Njb3JlcywKICAgIGNsdXN0ZXJDb2wgPSAiZ2VuZV9zdGF0dXMiLAogICAgbWFpbiA9ICJUQ0dBIFNldFxuIEdCTSIsCiAgICBoZWlnaHQgPSAxMCwKICAgIHdpZHRoPTEwLGZpbGVuYW1lID0gTlVMTCxwdmFsLm1ldGhvZCA9IFQKKQoKcFtbMV1dL3BbWzJdXQpgYGAKCiMgSE1TQyBzaWduYXR1cmUKCmBgYHtyfQojIGxvYWQKaG1zY19kZWcgPSByZWFkLnRhYmxlKGZpbGUgPSAiLi9EYXRhX291dC9IUFZfYW5hbHlzaXMvaHB2X2RlZ19kZi5jc3YiLHJvdy5uYW1lcyA9IDEpCiAgYXZnX2RpZmZfY3V0b2ZmID0gMQogIGZkcl9jdXRvZmYgPSAwLjEKICBzaWduYXR1cmUgPSBobXNjX2RlZyAlPiUgZmlsdGVyKGF2Z19kaWZmPmF2Z19kaWZmX2N1dG9mZiAmIGZkcjxmZHJfY3V0b2ZmKSAlPiUgcm93bmFtZXMoKQogIHNpZ25hdHVyZQoKYGBgCgpgYGB7cn0KZ2VuZV9zdGF0dXMgPSBzZXRfY2xpbmljYWxfZGF0YShjbGluX2RhdGEgPSBjbGluaWNhbF9kYXRhLGdlbmVzID0gc2lnbmF0dXJlLHRwbV9kYXRhX2ZyYW1lID0gSE5TQ190cG0sc3RyYXRpZnkgPSBwYXJhbXMkc3RyYXRpZnksc2lnbmF0dXJlX25hbWUgPSAiSFBWKyBzaWduYXR1cmUiKQpwYWdlZF90YWJsZShnZW5lX3N0YXR1cykKYGBgCgoKCgoKYGBge3IgZmlnLmhlaWdodD02LCBmaWcud2lkdGg9OH0KY2xpbmljYWxfZGF0YV93aXRoX3Njb3JlcyA9IGNsaW5pY2FsX2RhdGFbY2xpbmljYWxfZGF0YSRzdWJtaXR0ZXJfaWQgJWluJSByb3duYW1lcyhnZW5lX3N0YXR1cyksXQpnZW5lX3N0YXR1cyRwYXRpZW50ID0gcm93bmFtZXMoZ2VuZV9zdGF0dXMpCmNsaW5pY2FsX2RhdGFfd2l0aF9zY29yZXMgPSBsZWZ0X2pvaW4oeCA9IGNsaW5pY2FsX2RhdGFfd2l0aF9zY29yZXMseSA9IGdlbmVfc3RhdHVzLCBieSA9IGMoInN1Ym1pdHRlcl9pZCI9InBhdGllbnQiKSkKCnAgPSBUQ0dBYW5hbHl6ZV9zdXJ2aXZhbCgKICAgIGRhdGEgPSBjbGluaWNhbF9kYXRhX3dpdGhfc2NvcmVzLAogICAgY2x1c3RlckNvbCA9ICJnZW5lX3N0YXR1cyIsCiAgICBtYWluID0gIlRDR0EgU2V0XG4gR0JNIiwKICAgIGhlaWdodCA9IDEwLAogICAgd2lkdGg9MTAsZmlsZW5hbWUgPSBOVUxMLHB2YWwubWV0aG9kID0gVAopCgpwW1sxXV0vcFtbMl1dCmBgYA==