.libPaths("/n/data1/cores/ntc/R-4.0.1/library/")
setwd("/n/scratch3/groups/hms/cores/ntc/Weinstock008")

library(DESeq2)

taking in filtered bed file made from running mhm on ATAC data counting around peak centers.

have to revert to peak span for working bed file but excluding all dREGs that have been removed based on low ATAC read count (<6 tot reads).

linked value based on “dREG” list and filtered bed contains 11567 peak hits. final bed should agree.

centers <- read.table("PDX_filtered.bed", sep="\t")
peaks <- read.table("TCL_PDX_dist_peak.bed", sep="\t")

colnames(centers) <- c("Chr", "Start_center", "End_center", "dREG", "Blank", "Strand")
colnames(peaks) <- c("Chr", "Start", "End", "dREG", "Score", "Strand", "Center_Start", "Center_End")

combined <- peaks[(peaks$dREG %in% centers$dREG),]
write.table(combined, "PDX_filtered.bed", quote = FALSE, sep = "\t", row.names = FALSE, col.names = FALSE)

working on master data file with scripts run (bedtools closest and intersect) to link GGA annot genes to dREG filtered annot enhancers.

add in counts data from PRO and ATAC across dREG span.

full <- read.table("overall.bed", sep="\t")
colnames(full) <- c("chr_gene", "start_gene", "end_gene", "name_gene", "score_gene", "strand_gene", 
     "chr_peak", "start_peak", "end_peak", "name_peak", "score_peak", "strand_peak", "center_start", "center_end", "biotype", "distance")

write.table(full, "PDX_Gene_to_Enhancer_master.txt", quote = FALSE, sep = "\t", row.names = FALSE, col.names = TRUE)

load DEseq and normalize with DEseq size factors based on depth

Import gene body counts table generated in O2 into R

normalizing counts for all data types with DEseq size factors and melding to full table

raw_atac <- read.table("PDX_ATAC_counts.txt", header = TRUE, sep = "\t", row.names = 1)
raw_pro <- read.table("PDX_PRO_counts.txt", header = TRUE, sep = "\t", row.names = 1)
raw_rna <- read.table("PDX_RNA_counts.txt", header = TRUE, sep = "\t", row.names = 1)

### Create metadata object to categorize samples:

metadata_atac <- data.frame(row.names = colnames(raw_atac[, 6:ncol(raw_atac)]),
                       disease = c(rep("AITL",2),rep("Other",5)))
                       
metadata_atac # verify the table looks ok

#confirm that row and column names match
all(rownames(metadata_atac) %in% colnames(raw_atac))
all(rownames(metadata_atac) == colnames(raw_atac)[6:ncol(raw_atac)])


## Create DESeq Data Set from the count table, and sample list:

dds_atac <- DESeqDataSetFromMatrix(countData = raw_atac[, 6:ncol(raw_atac)],      # the matrix of counts from featureCounts;
                              colData = metadata_atac,                     # the sample table created in the last step;
                              design= ~disease)            # this is R's notation for models

dds_atac <- estimateSizeFactors(dds_atac)
deseq_sizes_atac <- as.data.frame(sizeFactors(dds_atac))
deseq_sizes_atac
write.table(deseq_sizes_atac, "ATAC_norm_factors.txt", quote = FALSE, sep = "\t", row.names = TRUE, col.names = TRUE)

normalization of ATAC data

dds_atac <- estimateDispersions(dds_atac)
pdf("Dispersion_ATAC_norm.pdf")
plotDispEsts(dds_atac)
dev.off()

# check results of normalization
colSums(counts(dds_atac))                # raw read counts per sample
colSums(counts(dds_atac, normalized=T))  # Total number of normalized counts per sample
data.frame(colSums(counts(dds_atac)), (colSums(counts(dds_atac, normalized=T))), row.names=colnames(counts(dds_atac)))

write.table(counts(dds_atac, normalized=TRUE), file="ATAC_norm_counts.txt", sep="\t")
counts_atac <- read.table("ATAC_norm_counts.txt", sep="\t")
counts_atac$dREG <- row.names(counts_atac)

full <- merge(full, counts_atac, by.x = "name_peak", by.y = "dREG", all.x=TRUE)

Now PRO

Create metadata object to categorize samples:

metadata_pro <- data.frame(row.names = colnames(raw_pro[, 1:ncol(raw_pro)]),
                            disease = c(rep("AITL",2),rep("Other",5)))

metadata_pro # verify the table looks ok

#confirm that row and column names match
all(rownames(metadata_pro) %in% colnames(raw_pro))
all(rownames(metadata_pro) == colnames(raw_pro)[1:ncol(raw_pro)])


## Create DESeq Data Set from the count table, and sample list:

dds_pro <- DESeqDataSetFromMatrix(countData = raw_pro[, 1:ncol(raw_pro)],      # the matrix of counts from featureCounts;
                                   colData = metadata_pro,                     # the sample table created in the last step;
                                   design= ~disease)            # this is R's notation for models

dds_pro <- estimateSizeFactors(dds_pro)
deseq_sizes_pro <- as.data.frame(sizeFactors(dds_pro))
deseq_sizes_pro
write.table(deseq_sizes_pro, "PRO_norm_factors.txt", quote = FALSE, sep = "\t", row.names = TRUE, col.names = TRUE)

normalization of PRO data

dds_pro <- estimateDispersions(dds_pro)
pdf("Dispersion_PRO_norm.pdf")
plotDispEsts(dds_pro)
dev.off()

# check results of normalization
colSums(counts(dds_pro))                # raw read counts per sample
colSums(counts(dds_pro, normalized=T))  # Total number of normalized counts per sample
data.frame(colSums(counts(dds_pro)), (colSums(counts(dds_pro, normalized=T))), row.names=colnames(counts(dds_pro)))

write.table(counts(dds_pro, normalized=TRUE), file="PRO_norm_counts.txt", sep="\t")
counts_pro <- read.table("PRO_norm_counts.txt", sep="\t")
counts_pro$dREG <- row.names(counts_pro)


full <- merge(full, counts_pro, by.x = "name_peak", by.y = "dREG", all.x=TRUE)

Now RNA

Create metadata object to categorize samples:

metadata_rna <- data.frame(row.names = colnames(raw_rna[, 6:ncol(raw_rna)]),
                            disease = c(rep("AITL",2),rep("Other",5)))

metadata_rna # verify the table looks ok

#confirm that row and column names match
all(rownames(metadata_rna) %in% colnames(raw_rna))
all(rownames(metadata_rna) == colnames(raw_rna)[6:ncol(raw_rna)])


## Create DESeq Data Set from the count table, and sample list:

dds_rna <- DESeqDataSetFromMatrix(countData = raw_rna[, 6:ncol(raw_rna)],      # the matrix of counts from featureCounts;
                                   colData = metadata_rna,                     # the sample table created in the last step;
                                   design= ~disease)            # this is R's notation for models

dds_rna <- estimateSizeFactors(dds_rna)
deseq_sizes_rna <- as.data.frame(sizeFactors(dds_rna))
deseq_sizes_rna
write.table(deseq_sizes_rna, "RNA_norm_factors.txt", quote = FALSE, sep = "\t", row.names = TRUE, col.names = TRUE)

normalization of RNA data

dds_rna <- estimateDispersions(dds_rna)
pdf("Dispersion_RNA_norm.pdf")
plotDispEsts(dds_rna)
dev.off()

# check results of normalization
colSums(counts(dds_rna))                # raw read counts per sample
colSums(counts(dds_rna, normalized=T))  # Total number of normalized counts per sample
data.frame(colSums(counts(dds_rna)), (colSums(counts(dds_rna, normalized=T))), row.names=colnames(counts(dds_rna)))

write.table(counts(dds_rna, normalized=TRUE), file="RNA_norm_counts.txt", sep="\t")
counts_rna <- read.table("RNA_norm_counts.txt", sep="\t")
counts_rna$dREG <- row.names(counts_rna)

full <- merge(full, counts_rna, by.x = "name_peak", by.y = "dREG", all.x=TRUE)

final table completed

write.table(full, "PDX_Final_gene_to_enhancer.txt", quote = FALSE, sep = "\t", row.names = FALSE, col.names = TRUE)

# clean-up and save out DEseq data sets

saveRDS(dds_atac, file="ATAC.rds")
saveRDS(dds_pro, file="PRO.rds")
saveRDS(dds_rna, file="RNA.rds")
# RNA counts for GGA locations #########

gga_rna <- read.table("RNA_GGA_counts.txt", header = TRUE, sep = "\t", row.names = 1)

### Create metadata object to categorize samples:

metadata_rna <- data.frame(row.names = colnames(gga_rna[, 6:ncol(gga_rna)]),
                           disease = c(rep("AITL",2),rep("Other",5)))

metadata_rna # verify the table looks ok

#confirm that row and column names match
all(rownames(metadata_rna) %in% colnames(gga_rna))
all(rownames(metadata_rna) == colnames(gga_rna)[6:ncol(gga_rna)])

# Create DESeq Data Set from the count table, and sample list:

dds_rna <- DESeqDataSetFromMatrix(countData = gga_rna[, 6:ncol(gga_rna)],      # the matrix of counts from featureCounts;
                                  colData = metadata_rna,                     # the sample table created in the last step;
                                  design= ~disease)            # this is R's notation for models

dds_rna <- estimateSizeFactors(dds_rna)
deseq_sizes_rna <- as.data.frame(sizeFactors(dds_rna))
deseq_sizes_rna
write.table(deseq_sizes_rna, "GGA_norm_factors.txt", quote = FALSE, sep = "\t", row.names = TRUE, col.names = TRUE)

normalization of RNA data

dds_rna <- estimateDispersions(dds_rna)
pdf("Dispersion_GGA_norm.pdf")
plotDispEsts(dds_rna)
dev.off()

# check results of normalization
colSums(counts(dds_rna))                # raw read counts per sample
colSums(counts(dds_rna, normalized=T))  # Total number of normalized counts per sample
data.frame(colSums(counts(dds_rna)), (colSums(counts(dds_rna, normalized=T))), row.names=colnames(counts(dds_rna)))

write.table(counts(dds_rna, normalized=TRUE), file="TES_TSS_RNA_norm_counts.txt", sep="\t")

######### END #########
## MKJ 26SEP23
## MKJ 04OCT23
LS0tCnRpdGxlOiAiQ29tYmluZWQgUERYIEFuYWx5c2lzIG9mIFJOQS1zZXEsIFBSTy1zZXEsIGFuZCBBVEFDLXNlcSIKb3V0cHV0OiBodG1sX25vdGVib29rCmVkaXRvcl9vcHRpb25zOiAKY2h1bmtfb3V0cHV0X3R5cGU6IGlubGluZQotLS0KCmBgYHtyfQoubGliUGF0aHMoIi9uL2RhdGExL2NvcmVzL250Yy9SLTQuMC4xL2xpYnJhcnkvIikKc2V0d2QoIi9uL3NjcmF0Y2gzL2dyb3Vwcy9obXMvY29yZXMvbnRjL1dlaW5zdG9jazAwOCIpCgpsaWJyYXJ5KERFU2VxMikKCmBgYAoKdGFraW5nIGluIGZpbHRlcmVkIGJlZCBmaWxlIG1hZGUgZnJvbSBydW5uaW5nIG1obSBvbiBBVEFDIGRhdGEgY291bnRpbmcgYXJvdW5kIHBlYWsgY2VudGVycy4KCmhhdmUgdG8gcmV2ZXJ0IHRvIHBlYWsgc3BhbiBmb3Igd29ya2luZyBiZWQgZmlsZSBidXQgZXhjbHVkaW5nIGFsbCBkUkVHcyB0aGF0IGhhdmUgYmVlbiByZW1vdmVkIGJhc2VkIG9uIGxvdyBBVEFDIHJlYWQgY291bnQgKDw2IHRvdCByZWFkcykuCgpsaW5rZWQgdmFsdWUgYmFzZWQgb24gImRSRUciIGxpc3QgYW5kIGZpbHRlcmVkIGJlZCBjb250YWlucyAxMTU2NyBwZWFrIGhpdHMuIGZpbmFsIGJlZCBzaG91bGQgYWdyZWUuCgpgYGB7cn0KY2VudGVycyA8LSByZWFkLnRhYmxlKCJQRFhfZmlsdGVyZWQuYmVkIiwgc2VwPSJcdCIpCnBlYWtzIDwtIHJlYWQudGFibGUoIlRDTF9QRFhfZGlzdF9wZWFrLmJlZCIsIHNlcD0iXHQiKQoKY29sbmFtZXMoY2VudGVycykgPC0gYygiQ2hyIiwgIlN0YXJ0X2NlbnRlciIsICJFbmRfY2VudGVyIiwgImRSRUciLCAiQmxhbmsiLCAiU3RyYW5kIikKY29sbmFtZXMocGVha3MpIDwtIGMoIkNociIsICJTdGFydCIsICJFbmQiLCAiZFJFRyIsICJTY29yZSIsICJTdHJhbmQiLCAiQ2VudGVyX1N0YXJ0IiwgIkNlbnRlcl9FbmQiKQoKY29tYmluZWQgPC0gcGVha3NbKHBlYWtzJGRSRUcgJWluJSBjZW50ZXJzJGRSRUcpLF0Kd3JpdGUudGFibGUoY29tYmluZWQsICJQRFhfZmlsdGVyZWQuYmVkIiwgcXVvdGUgPSBGQUxTRSwgc2VwID0gIlx0Iiwgcm93Lm5hbWVzID0gRkFMU0UsIGNvbC5uYW1lcyA9IEZBTFNFKQoKYGBgCgp3b3JraW5nIG9uIG1hc3RlciBkYXRhIGZpbGUgd2l0aCBzY3JpcHRzIHJ1biAoYmVkdG9vbHMgY2xvc2VzdCBhbmQgaW50ZXJzZWN0KSB0byBsaW5rIEdHQSBhbm5vdCBnZW5lcyB0byBkUkVHIGZpbHRlcmVkIGFubm90IGVuaGFuY2Vycy4KCmFkZCBpbiBjb3VudHMgZGF0YSBmcm9tIFBSTyBhbmQgQVRBQyBhY3Jvc3MgZFJFRyBzcGFuLgoKYGBge3J9CmZ1bGwgPC0gcmVhZC50YWJsZSgib3ZlcmFsbC5iZWQiLCBzZXA9Ilx0IikKY29sbmFtZXMoZnVsbCkgPC0gYygiY2hyX2dlbmUiLCAic3RhcnRfZ2VuZSIsICJlbmRfZ2VuZSIsICJuYW1lX2dlbmUiLCAic2NvcmVfZ2VuZSIsICJzdHJhbmRfZ2VuZSIsIAogICAgICJjaHJfcGVhayIsICJzdGFydF9wZWFrIiwgImVuZF9wZWFrIiwgIm5hbWVfcGVhayIsICJzY29yZV9wZWFrIiwgInN0cmFuZF9wZWFrIiwgImNlbnRlcl9zdGFydCIsICJjZW50ZXJfZW5kIiwgImJpb3R5cGUiLCAiZGlzdGFuY2UiKQoKd3JpdGUudGFibGUoZnVsbCwgIlBEWF9HZW5lX3RvX0VuaGFuY2VyX21hc3Rlci50eHQiLCBxdW90ZSA9IEZBTFNFLCBzZXAgPSAiXHQiLCByb3cubmFtZXMgPSBGQUxTRSwgY29sLm5hbWVzID0gVFJVRSkKCmBgYAoKbG9hZCBERXNlcSBhbmQgbm9ybWFsaXplIHdpdGggREVzZXEgc2l6ZSBmYWN0b3JzIGJhc2VkIG9uIGRlcHRoCgpJbXBvcnQgZ2VuZSBib2R5IGNvdW50cyB0YWJsZSBnZW5lcmF0ZWQgaW4gTzIgaW50byBSCgpub3JtYWxpemluZyBjb3VudHMgZm9yIGFsbCBkYXRhIHR5cGVzIHdpdGggREVzZXEgc2l6ZSBmYWN0b3JzIGFuZCBtZWxkaW5nIHRvIGZ1bGwgdGFibGUKCmBgYHtyfQpyYXdfYXRhYyA8LSByZWFkLnRhYmxlKCJQRFhfQVRBQ19jb3VudHMudHh0IiwgaGVhZGVyID0gVFJVRSwgc2VwID0gIlx0Iiwgcm93Lm5hbWVzID0gMSkKcmF3X3BybyA8LSByZWFkLnRhYmxlKCJQRFhfUFJPX2NvdW50cy50eHQiLCBoZWFkZXIgPSBUUlVFLCBzZXAgPSAiXHQiLCByb3cubmFtZXMgPSAxKQpyYXdfcm5hIDwtIHJlYWQudGFibGUoIlBEWF9STkFfY291bnRzLnR4dCIsIGhlYWRlciA9IFRSVUUsIHNlcCA9ICJcdCIsIHJvdy5uYW1lcyA9IDEpCgojIyMgQ3JlYXRlIG1ldGFkYXRhIG9iamVjdCB0byBjYXRlZ29yaXplIHNhbXBsZXM6CgptZXRhZGF0YV9hdGFjIDwtIGRhdGEuZnJhbWUocm93Lm5hbWVzID0gY29sbmFtZXMocmF3X2F0YWNbLCA2Om5jb2wocmF3X2F0YWMpXSksCiAgICAgICAgICAgICAgICAgICAgICAgZGlzZWFzZSA9IGMocmVwKCJBSVRMIiwyKSxyZXAoIk90aGVyIiw1KSkpCiAgICAgICAgICAgICAgICAgICAgICAgCm1ldGFkYXRhX2F0YWMgIyB2ZXJpZnkgdGhlIHRhYmxlIGxvb2tzIG9rCgojY29uZmlybSB0aGF0IHJvdyBhbmQgY29sdW1uIG5hbWVzIG1hdGNoCmFsbChyb3duYW1lcyhtZXRhZGF0YV9hdGFjKSAlaW4lIGNvbG5hbWVzKHJhd19hdGFjKSkKYWxsKHJvd25hbWVzKG1ldGFkYXRhX2F0YWMpID09IGNvbG5hbWVzKHJhd19hdGFjKVs2Om5jb2wocmF3X2F0YWMpXSkKCgojIyBDcmVhdGUgREVTZXEgRGF0YSBTZXQgZnJvbSB0aGUgY291bnQgdGFibGUsIGFuZCBzYW1wbGUgbGlzdDoKCmRkc19hdGFjIDwtIERFU2VxRGF0YVNldEZyb21NYXRyaXgoY291bnREYXRhID0gcmF3X2F0YWNbLCA2Om5jb2wocmF3X2F0YWMpXSwgICAgICAjIHRoZSBtYXRyaXggb2YgY291bnRzIGZyb20gZmVhdHVyZUNvdW50czsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sRGF0YSA9IG1ldGFkYXRhX2F0YWMsICAgICAgICAgICAgICAgICAgICAgIyB0aGUgc2FtcGxlIHRhYmxlIGNyZWF0ZWQgaW4gdGhlIGxhc3Qgc3RlcDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzaWduPSB+ZGlzZWFzZSkgICAgICAgICAgICAjIHRoaXMgaXMgUidzIG5vdGF0aW9uIGZvciBtb2RlbHMKCmRkc19hdGFjIDwtIGVzdGltYXRlU2l6ZUZhY3RvcnMoZGRzX2F0YWMpCmRlc2VxX3NpemVzX2F0YWMgPC0gYXMuZGF0YS5mcmFtZShzaXplRmFjdG9ycyhkZHNfYXRhYykpCmRlc2VxX3NpemVzX2F0YWMKd3JpdGUudGFibGUoZGVzZXFfc2l6ZXNfYXRhYywgIkFUQUNfbm9ybV9mYWN0b3JzLnR4dCIsIHF1b3RlID0gRkFMU0UsIHNlcCA9ICJcdCIsIHJvdy5uYW1lcyA9IFRSVUUsIGNvbC5uYW1lcyA9IFRSVUUpCgpgYGAKCm5vcm1hbGl6YXRpb24gb2YgQVRBQyBkYXRhCgpgYGB7cn0KZGRzX2F0YWMgPC0gZXN0aW1hdGVEaXNwZXJzaW9ucyhkZHNfYXRhYykKcGRmKCJEaXNwZXJzaW9uX0FUQUNfbm9ybS5wZGYiKQpwbG90RGlzcEVzdHMoZGRzX2F0YWMpCmRldi5vZmYoKQoKIyBjaGVjayByZXN1bHRzIG9mIG5vcm1hbGl6YXRpb24KY29sU3Vtcyhjb3VudHMoZGRzX2F0YWMpKSAgICAgICAgICAgICAgICAjIHJhdyByZWFkIGNvdW50cyBwZXIgc2FtcGxlCmNvbFN1bXMoY291bnRzKGRkc19hdGFjLCBub3JtYWxpemVkPVQpKSAgIyBUb3RhbCBudW1iZXIgb2Ygbm9ybWFsaXplZCBjb3VudHMgcGVyIHNhbXBsZQpkYXRhLmZyYW1lKGNvbFN1bXMoY291bnRzKGRkc19hdGFjKSksIChjb2xTdW1zKGNvdW50cyhkZHNfYXRhYywgbm9ybWFsaXplZD1UKSkpLCByb3cubmFtZXM9Y29sbmFtZXMoY291bnRzKGRkc19hdGFjKSkpCgp3cml0ZS50YWJsZShjb3VudHMoZGRzX2F0YWMsIG5vcm1hbGl6ZWQ9VFJVRSksIGZpbGU9IkFUQUNfbm9ybV9jb3VudHMudHh0Iiwgc2VwPSJcdCIpCmNvdW50c19hdGFjIDwtIHJlYWQudGFibGUoIkFUQUNfbm9ybV9jb3VudHMudHh0Iiwgc2VwPSJcdCIpCmNvdW50c19hdGFjJGRSRUcgPC0gcm93Lm5hbWVzKGNvdW50c19hdGFjKQoKZnVsbCA8LSBtZXJnZShmdWxsLCBjb3VudHNfYXRhYywgYnkueCA9ICJuYW1lX3BlYWsiLCBieS55ID0gImRSRUciLCBhbGwueD1UUlVFKQoKYGBgCk5vdyBQUk8KCkNyZWF0ZSBtZXRhZGF0YSBvYmplY3QgdG8gY2F0ZWdvcml6ZSBzYW1wbGVzOgoKYGBge3J9Cm1ldGFkYXRhX3BybyA8LSBkYXRhLmZyYW1lKHJvdy5uYW1lcyA9IGNvbG5hbWVzKHJhd19wcm9bLCAxOm5jb2wocmF3X3BybyldKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2Vhc2UgPSBjKHJlcCgiQUlUTCIsMikscmVwKCJPdGhlciIsNSkpKQoKbWV0YWRhdGFfcHJvICMgdmVyaWZ5IHRoZSB0YWJsZSBsb29rcyBvawoKI2NvbmZpcm0gdGhhdCByb3cgYW5kIGNvbHVtbiBuYW1lcyBtYXRjaAphbGwocm93bmFtZXMobWV0YWRhdGFfcHJvKSAlaW4lIGNvbG5hbWVzKHJhd19wcm8pKQphbGwocm93bmFtZXMobWV0YWRhdGFfcHJvKSA9PSBjb2xuYW1lcyhyYXdfcHJvKVsxOm5jb2wocmF3X3BybyldKQoKCiMjIENyZWF0ZSBERVNlcSBEYXRhIFNldCBmcm9tIHRoZSBjb3VudCB0YWJsZSwgYW5kIHNhbXBsZSBsaXN0OgoKZGRzX3BybyA8LSBERVNlcURhdGFTZXRGcm9tTWF0cml4KGNvdW50RGF0YSA9IHJhd19wcm9bLCAxOm5jb2wocmF3X3BybyldLCAgICAgICMgdGhlIG1hdHJpeCBvZiBjb3VudHMgZnJvbSBmZWF0dXJlQ291bnRzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbERhdGEgPSBtZXRhZGF0YV9wcm8sICAgICAgICAgICAgICAgICAgICAgIyB0aGUgc2FtcGxlIHRhYmxlIGNyZWF0ZWQgaW4gdGhlIGxhc3Qgc3RlcDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNpZ249IH5kaXNlYXNlKSAgICAgICAgICAgICMgdGhpcyBpcyBSJ3Mgbm90YXRpb24gZm9yIG1vZGVscwoKZGRzX3BybyA8LSBlc3RpbWF0ZVNpemVGYWN0b3JzKGRkc19wcm8pCmRlc2VxX3NpemVzX3BybyA8LSBhcy5kYXRhLmZyYW1lKHNpemVGYWN0b3JzKGRkc19wcm8pKQpkZXNlcV9zaXplc19wcm8Kd3JpdGUudGFibGUoZGVzZXFfc2l6ZXNfcHJvLCAiUFJPX25vcm1fZmFjdG9ycy50eHQiLCBxdW90ZSA9IEZBTFNFLCBzZXAgPSAiXHQiLCByb3cubmFtZXMgPSBUUlVFLCBjb2wubmFtZXMgPSBUUlVFKQoKYGBgCgpub3JtYWxpemF0aW9uIG9mIFBSTyBkYXRhCgpgYGB7cn0KZGRzX3BybyA8LSBlc3RpbWF0ZURpc3BlcnNpb25zKGRkc19wcm8pCnBkZigiRGlzcGVyc2lvbl9QUk9fbm9ybS5wZGYiKQpwbG90RGlzcEVzdHMoZGRzX3BybykKZGV2Lm9mZigpCgojIGNoZWNrIHJlc3VsdHMgb2Ygbm9ybWFsaXphdGlvbgpjb2xTdW1zKGNvdW50cyhkZHNfcHJvKSkgICAgICAgICAgICAgICAgIyByYXcgcmVhZCBjb3VudHMgcGVyIHNhbXBsZQpjb2xTdW1zKGNvdW50cyhkZHNfcHJvLCBub3JtYWxpemVkPVQpKSAgIyBUb3RhbCBudW1iZXIgb2Ygbm9ybWFsaXplZCBjb3VudHMgcGVyIHNhbXBsZQpkYXRhLmZyYW1lKGNvbFN1bXMoY291bnRzKGRkc19wcm8pKSwgKGNvbFN1bXMoY291bnRzKGRkc19wcm8sIG5vcm1hbGl6ZWQ9VCkpKSwgcm93Lm5hbWVzPWNvbG5hbWVzKGNvdW50cyhkZHNfcHJvKSkpCgp3cml0ZS50YWJsZShjb3VudHMoZGRzX3Bybywgbm9ybWFsaXplZD1UUlVFKSwgZmlsZT0iUFJPX25vcm1fY291bnRzLnR4dCIsIHNlcD0iXHQiKQpjb3VudHNfcHJvIDwtIHJlYWQudGFibGUoIlBST19ub3JtX2NvdW50cy50eHQiLCBzZXA9Ilx0IikKY291bnRzX3BybyRkUkVHIDwtIHJvdy5uYW1lcyhjb3VudHNfcHJvKQoKCmZ1bGwgPC0gbWVyZ2UoZnVsbCwgY291bnRzX3BybywgYnkueCA9ICJuYW1lX3BlYWsiLCBieS55ID0gImRSRUciLCBhbGwueD1UUlVFKQoKYGBgCk5vdyBSTkEKCkNyZWF0ZSBtZXRhZGF0YSBvYmplY3QgdG8gY2F0ZWdvcml6ZSBzYW1wbGVzOgoKYGBge3J9Cm1ldGFkYXRhX3JuYSA8LSBkYXRhLmZyYW1lKHJvdy5uYW1lcyA9IGNvbG5hbWVzKHJhd19ybmFbLCA2Om5jb2wocmF3X3JuYSldKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2Vhc2UgPSBjKHJlcCgiQUlUTCIsMikscmVwKCJPdGhlciIsNSkpKQoKbWV0YWRhdGFfcm5hICMgdmVyaWZ5IHRoZSB0YWJsZSBsb29rcyBvawoKI2NvbmZpcm0gdGhhdCByb3cgYW5kIGNvbHVtbiBuYW1lcyBtYXRjaAphbGwocm93bmFtZXMobWV0YWRhdGFfcm5hKSAlaW4lIGNvbG5hbWVzKHJhd19ybmEpKQphbGwocm93bmFtZXMobWV0YWRhdGFfcm5hKSA9PSBjb2xuYW1lcyhyYXdfcm5hKVs2Om5jb2wocmF3X3JuYSldKQoKCiMjIENyZWF0ZSBERVNlcSBEYXRhIFNldCBmcm9tIHRoZSBjb3VudCB0YWJsZSwgYW5kIHNhbXBsZSBsaXN0OgoKZGRzX3JuYSA8LSBERVNlcURhdGFTZXRGcm9tTWF0cml4KGNvdW50RGF0YSA9IHJhd19ybmFbLCA2Om5jb2wocmF3X3JuYSldLCAgICAgICMgdGhlIG1hdHJpeCBvZiBjb3VudHMgZnJvbSBmZWF0dXJlQ291bnRzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbERhdGEgPSBtZXRhZGF0YV9ybmEsICAgICAgICAgICAgICAgICAgICAgIyB0aGUgc2FtcGxlIHRhYmxlIGNyZWF0ZWQgaW4gdGhlIGxhc3Qgc3RlcDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNpZ249IH5kaXNlYXNlKSAgICAgICAgICAgICMgdGhpcyBpcyBSJ3Mgbm90YXRpb24gZm9yIG1vZGVscwoKZGRzX3JuYSA8LSBlc3RpbWF0ZVNpemVGYWN0b3JzKGRkc19ybmEpCmRlc2VxX3NpemVzX3JuYSA8LSBhcy5kYXRhLmZyYW1lKHNpemVGYWN0b3JzKGRkc19ybmEpKQpkZXNlcV9zaXplc19ybmEKd3JpdGUudGFibGUoZGVzZXFfc2l6ZXNfcm5hLCAiUk5BX25vcm1fZmFjdG9ycy50eHQiLCBxdW90ZSA9IEZBTFNFLCBzZXAgPSAiXHQiLCByb3cubmFtZXMgPSBUUlVFLCBjb2wubmFtZXMgPSBUUlVFKQoKYGBgCgpub3JtYWxpemF0aW9uIG9mIFJOQSBkYXRhCgpgYGB7cn0KZGRzX3JuYSA8LSBlc3RpbWF0ZURpc3BlcnNpb25zKGRkc19ybmEpCnBkZigiRGlzcGVyc2lvbl9STkFfbm9ybS5wZGYiKQpwbG90RGlzcEVzdHMoZGRzX3JuYSkKZGV2Lm9mZigpCgojIGNoZWNrIHJlc3VsdHMgb2Ygbm9ybWFsaXphdGlvbgpjb2xTdW1zKGNvdW50cyhkZHNfcm5hKSkgICAgICAgICAgICAgICAgIyByYXcgcmVhZCBjb3VudHMgcGVyIHNhbXBsZQpjb2xTdW1zKGNvdW50cyhkZHNfcm5hLCBub3JtYWxpemVkPVQpKSAgIyBUb3RhbCBudW1iZXIgb2Ygbm9ybWFsaXplZCBjb3VudHMgcGVyIHNhbXBsZQpkYXRhLmZyYW1lKGNvbFN1bXMoY291bnRzKGRkc19ybmEpKSwgKGNvbFN1bXMoY291bnRzKGRkc19ybmEsIG5vcm1hbGl6ZWQ9VCkpKSwgcm93Lm5hbWVzPWNvbG5hbWVzKGNvdW50cyhkZHNfcm5hKSkpCgp3cml0ZS50YWJsZShjb3VudHMoZGRzX3JuYSwgbm9ybWFsaXplZD1UUlVFKSwgZmlsZT0iUk5BX25vcm1fY291bnRzLnR4dCIsIHNlcD0iXHQiKQpjb3VudHNfcm5hIDwtIHJlYWQudGFibGUoIlJOQV9ub3JtX2NvdW50cy50eHQiLCBzZXA9Ilx0IikKY291bnRzX3JuYSRkUkVHIDwtIHJvdy5uYW1lcyhjb3VudHNfcm5hKQoKZnVsbCA8LSBtZXJnZShmdWxsLCBjb3VudHNfcm5hLCBieS54ID0gIm5hbWVfcGVhayIsIGJ5LnkgPSAiZFJFRyIsIGFsbC54PVRSVUUpCgpgYGAKCmZpbmFsIHRhYmxlIGNvbXBsZXRlZAoKYGBge3J9CndyaXRlLnRhYmxlKGZ1bGwsICJQRFhfRmluYWxfZ2VuZV90b19lbmhhbmNlci50eHQiLCBxdW90ZSA9IEZBTFNFLCBzZXAgPSAiXHQiLCByb3cubmFtZXMgPSBGQUxTRSwgY29sLm5hbWVzID0gVFJVRSkKCiMgY2xlYW4tdXAgYW5kIHNhdmUgb3V0IERFc2VxIGRhdGEgc2V0cwoKc2F2ZVJEUyhkZHNfYXRhYywgZmlsZT0iQVRBQy5yZHMiKQpzYXZlUkRTKGRkc19wcm8sIGZpbGU9IlBSTy5yZHMiKQpzYXZlUkRTKGRkc19ybmEsIGZpbGU9IlJOQS5yZHMiKQoKYGBgCgpgYGB7cn0KIyBSTkEgY291bnRzIGZvciBHR0EgbG9jYXRpb25zICMjIyMjIyMjIwoKZ2dhX3JuYSA8LSByZWFkLnRhYmxlKCJSTkFfR0dBX2NvdW50cy50eHQiLCBoZWFkZXIgPSBUUlVFLCBzZXAgPSAiXHQiLCByb3cubmFtZXMgPSAxKQoKIyMjIENyZWF0ZSBtZXRhZGF0YSBvYmplY3QgdG8gY2F0ZWdvcml6ZSBzYW1wbGVzOgoKbWV0YWRhdGFfcm5hIDwtIGRhdGEuZnJhbWUocm93Lm5hbWVzID0gY29sbmFtZXMoZ2dhX3JuYVssIDY6bmNvbChnZ2Ffcm5hKV0pLAogICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNlYXNlID0gYyhyZXAoIkFJVEwiLDIpLHJlcCgiT3RoZXIiLDUpKSkKCm1ldGFkYXRhX3JuYSAjIHZlcmlmeSB0aGUgdGFibGUgbG9va3Mgb2sKCiNjb25maXJtIHRoYXQgcm93IGFuZCBjb2x1bW4gbmFtZXMgbWF0Y2gKYWxsKHJvd25hbWVzKG1ldGFkYXRhX3JuYSkgJWluJSBjb2xuYW1lcyhnZ2Ffcm5hKSkKYWxsKHJvd25hbWVzKG1ldGFkYXRhX3JuYSkgPT0gY29sbmFtZXMoZ2dhX3JuYSlbNjpuY29sKGdnYV9ybmEpXSkKCiMgQ3JlYXRlIERFU2VxIERhdGEgU2V0IGZyb20gdGhlIGNvdW50IHRhYmxlLCBhbmQgc2FtcGxlIGxpc3Q6CgpkZHNfcm5hIDwtIERFU2VxRGF0YVNldEZyb21NYXRyaXgoY291bnREYXRhID0gZ2dhX3JuYVssIDY6bmNvbChnZ2Ffcm5hKV0sICAgICAgIyB0aGUgbWF0cml4IG9mIGNvdW50cyBmcm9tIGZlYXR1cmVDb3VudHM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xEYXRhID0gbWV0YWRhdGFfcm5hLCAgICAgICAgICAgICAgICAgICAgICMgdGhlIHNhbXBsZSB0YWJsZSBjcmVhdGVkIGluIHRoZSBsYXN0IHN0ZXA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNpZ249IH5kaXNlYXNlKSAgICAgICAgICAgICMgdGhpcyBpcyBSJ3Mgbm90YXRpb24gZm9yIG1vZGVscwoKZGRzX3JuYSA8LSBlc3RpbWF0ZVNpemVGYWN0b3JzKGRkc19ybmEpCmRlc2VxX3NpemVzX3JuYSA8LSBhcy5kYXRhLmZyYW1lKHNpemVGYWN0b3JzKGRkc19ybmEpKQpkZXNlcV9zaXplc19ybmEKd3JpdGUudGFibGUoZGVzZXFfc2l6ZXNfcm5hLCAiR0dBX25vcm1fZmFjdG9ycy50eHQiLCBxdW90ZSA9IEZBTFNFLCBzZXAgPSAiXHQiLCByb3cubmFtZXMgPSBUUlVFLCBjb2wubmFtZXMgPSBUUlVFKQoKYGBgCgpub3JtYWxpemF0aW9uIG9mIFJOQSBkYXRhCgpgYGB7cn0KZGRzX3JuYSA8LSBlc3RpbWF0ZURpc3BlcnNpb25zKGRkc19ybmEpCnBkZigiRGlzcGVyc2lvbl9HR0Ffbm9ybS5wZGYiKQpwbG90RGlzcEVzdHMoZGRzX3JuYSkKZGV2Lm9mZigpCgojIGNoZWNrIHJlc3VsdHMgb2Ygbm9ybWFsaXphdGlvbgpjb2xTdW1zKGNvdW50cyhkZHNfcm5hKSkgICAgICAgICAgICAgICAgIyByYXcgcmVhZCBjb3VudHMgcGVyIHNhbXBsZQpjb2xTdW1zKGNvdW50cyhkZHNfcm5hLCBub3JtYWxpemVkPVQpKSAgIyBUb3RhbCBudW1iZXIgb2Ygbm9ybWFsaXplZCBjb3VudHMgcGVyIHNhbXBsZQpkYXRhLmZyYW1lKGNvbFN1bXMoY291bnRzKGRkc19ybmEpKSwgKGNvbFN1bXMoY291bnRzKGRkc19ybmEsIG5vcm1hbGl6ZWQ9VCkpKSwgcm93Lm5hbWVzPWNvbG5hbWVzKGNvdW50cyhkZHNfcm5hKSkpCgp3cml0ZS50YWJsZShjb3VudHMoZGRzX3JuYSwgbm9ybWFsaXplZD1UUlVFKSwgZmlsZT0iVEVTX1RTU19STkFfbm9ybV9jb3VudHMudHh0Iiwgc2VwPSJcdCIpCgojIyMjIyMjIyMgRU5EICMjIyMjIyMjIwojIyBNS0ogMjZTRVAyMwojIyBNS0ogMDRPQ1QyMwpgYGA=