1 TODO

  1. Ensure no columns have names like ‘etnia’ but instead ‘ethnicity_cat’
  2. Decide how to handle the retirement of tritrypdb.org

2 Changelog

  • 202408: Made demographics data more available for the new regression analyses.
  • 202405: Reworked handling of the demographics data
  • 202308: Small reorganization to more closely adhere to the flow of the manuscript’s text.
  • 202305: Updated default image format.
  • 202304: Added a series of stanzas printing out the Cali-only data.
  • Updated input metadata sheets

3 Notes

  • Interferon score for severity. A few different sets are available, may need to choose a specific paper, then modify it?

4 Introduction

This document takes the various outputs produced by salmon/hisat/htseq/etc and generates the data which will be used in all of the following analyses.

4.1 Metadata Sources

Periodically, the shared metadata sheet was downloaded locally to the sample_sheets/ directory, given a suffix corresponding to the current worksheet revision, and the various trimming/alignment/etc statistics were manually added. Finally, some demographics were appended to the sample metadata. The resulting modified metadata was used as the input for all following analyses.

samplesheet <- "sample_sheets/tmrc3_samples.xlsx"
testthat::expect_true(file.exists(samplesheet))
demographics <- "sample_sheets/tmrc3_demographicsv2.xlsx"
hslp_samplesheet <- "sample_sheets/tmrc3_samples_pruned.xlsx"
species_identities <- "sample_sheets/identified_parasite_species.xlsx"
data_structures <- c(data_structures, "samplesheet", "demographics")

5 Annotation Collection

The primary annotation sources are:

  1. Ensembl’s biomart archive from 2020 for human annotations (“Homo Sapiens - Ensembl Genome Browser 100” (n.d.)).
  2. The TriTrypDB release 36 for parasite annotations (TriTrypDB Leishmania Panamensis, Version 46” (n.d.)).

Both provide GO data. They also provide helpful links to other data sources. For the moment, we are focusing on the human annotations. In the first instance, the annotations are acquired via some functions in hpgltools which seek to make biomaRt (Smedley et al. (2009)) a little more robust. In the second instance, the annotations are extracted from a locally generated orgDB/annotationDbi (AnnotationDbi (n.d.)) instance.

5.1 Gene annotations

These analyses have focused on gene-level abundances/differences. Thus, when htseq-count was invoked against the hisat2-based mappings, parameters were chosen to count genes rather than transcripts. In this context, a gene refers to the non-redundant union of the transcripts’ exons. Similarly, when salmon counts were used via tximport, a mapping of genes to transcripts was used to collapse the matrix to gene-level abundances. This decision may be revisited.

The parasite annotations were downloaded from the tritrypdb via the provided REST interface, exported into an OrgDB instance, and extracted via the EuPathDB package.

hs_annot <- load_biomart_annotations(year = "2020", month = "jan")
## Using mart: ENSEMBL_MART_ENSEMBL from host: jan2020.archive.ensembl.org.
## Successfully connected to the hsapiens_gene_ensembl database.
## Finished downloading ensembl gene annotations.
## Finished downloading ensembl structure annotations.
## symbol columns is null, pattern matching 'symbol'.
## Including symbols, there are 68435 vs the 249606 gene annotations.
## Not dropping haplotype chromosome annotations, set drop_haplotypes = TRUE if this is bad.
## Saving annotations to hsapiens_biomart_annotations.rda.
## Finished save().
hs_annot <- hs_annot[["annotation"]]
## The next two lines make a bridge between the gff file used by hisat2
## and the gene IDs.

The following lines may be used if one wishes to use the relatively strict ID.version system (optionally) enforced by salmon. It should be noted that newer versions of tximport have options which ignore this, and I also now have a function which will set the ID.version for the gene annotations to be the same as what was observed in the count tables. Either of those strategies makes the following not necessary; but if you wish to be a little bit pedantic about the gene<->Tx IDs, then this should give you a sense of how well matched are the downloaded annotations and gene IDs used by salmon.

hs_annot[["transcript"]] <- paste0(rownames(hs_annot), ".", hs_annot[["version"]])
hs_annot <- group_mean_cds_length(hs_annot)
hs_tx_annot <- hs_annot ## Make a copy so I don't lose transcript IDs for salmon
rownames(hs_annot) <- make.names(hs_annot[["ensembl_gene_id"]], unique = TRUE)
not_unique_idx <- grepl(x = rownames(hs_annot), pattern = "\\.\\d+$")
hs_annot <- hs_annot[!not_unique_idx, ]

5.1.1 Also collect parasite annotations

The following block will stop working soon. Its purpose is to download the current (or a specific version) annotations from one of the eupathdb.org websites. These are being retired/moved soon. My version of the EuPathDB package creates installable orgdb packages; so I presumably will just need to include the appropriate tarballs in the recipe for this container. In response to the retirement of eupathdb, I spun up an instance of my eupathdb package to download everything; hopefully it will finish before the various servers go down. I was too late for schistodb, it is already offline (I am pretty sure I have an older copy though).

Given that I recently included the parasite transcripts to the data, I should also spend a moment and figure out how to include the annotations.

As a starting point, I will just grab the EuPathDB panamensis annotations. I think I will need to limit them to just the shared columns and drop the rest.

meta <- sm(download_eupath_metadata(webservice = "tritrypdb"))
panamensis_entry <- get_eupath_entry("MHOM", metadata = meta[["valid"]])

panamensis_db <- make_eupath_orgdb(panamensis_entry)
panamensis_pkg <- panamensis_db[["pkgname"]]
package_name <- panamensis_db[["pkgname"]]
if (is.null(panamensis_pkg)) {
  panamensis_pkg <- panamensis_db[["orgdb_name"]]
  package_name <- panamensis_pkg
}
tt <- library(panamensis_pkg, character.only = TRUE)
panamensis_pkg <- get0(panamensis_pkg)
all_fields <- columns(panamensis_pkg)
all_lp_annot <- sm(load_orgdb_annotations(
    panamensis_pkg,
    keytype = "gid",
    fields = c("annot_gene_entrez_id", "annot_gene_name",
               "annot_strand", "annot_chromosome", "annot_cds_length",
               "annot_gene_location_text", "annot_gene_product")))$genes

Ok, I added the orgdb tarball and an entry to install it to my bootstrap for this container. So let us load the annotations for our Leishmanial strain of interest!

package_name <- "org.Lpanamensis.MHOMCOL81L13.v68.eg.db"
tt <- library(package_name, character.only = TRUE)
## Loading required package: AnnotationDbi
## 
## Attaching package: 'AnnotationDbi'
## The following object is masked from 'package:dplyr':
## 
##     select
## 
panamensis_pkg <- get0(package_name)
all_fields <- columns(panamensis_pkg)
all_lp_annot <- sm(load_orgdb_annotations(
  package_name,
  keytype = "gid",
  fields = c("annot_gene_entrez_id", "annot_gene_name",
             "annot_strand", "annot_chromosome", "annot_cds_length",
             "annot_gene_location_text", "annot_gene_product")))[["genes"]]

The following was added to support the possibility of making a single expressionset using the mappings against a genome of concatenated hg38 and lpanamensis sequence. In order to do that, one must have an annotation set with consistent columns across all genes from both species.

I am not sure if I copied those count tables to the container (I suspect I did not), but I will leave the code here as an example of how one might make a concatenated expressionset/summarizedexperiment.

all_lp_annot[["end"]] <- gsub(x = all_lp_annot[["annot_gene_location_text"]],
                              pattern = "^.*\\.\\.", replacement = "")
all_lp_annot[["end"]] <- gsub(x = all_lp_annot[["end"]],
                              pattern = "\\(.*$", replacement = "")
all_lp_annot[["end"]] <- gsub(x = all_lp_annot[["end"]],
                              pattern = "\\,", replacement = "")
all_lp_annot[["start"]] <- gsub(x = all_lp_annot[["annot_gene_location_text"]],
                                pattern = "^.*:", replacement = "")
all_lp_annot[["start"]] <- gsub(x = all_lp_annot[["start"]],
                                pattern = "\\.\\..*$", replacement = "")
all_lp_annot[["start"]] <- gsub(x = all_lp_annot[["start"]],
                                pattern = "\\,", replacement = "")
all_lp_annot[["mean_cds_len"]] <- all_lp_annot[["annot_cds_length"]]
all_lp_annot[["version"]] <- 1
all_lp_annot[["transcript_version"]] <- 1
all_lp_annot[["hgnc_symbol"]] <- ""
all_lp_annot[["uniprot_gn_symbol"]] <- ""
all_lp_annot[["transcript"]] <- all_lp_annot[["gid"]]
all_lp_annot[["ensembl_transcript_id"]] <- all_lp_annot[["gid"]]

colnames(hs_tx_annot)
##  [1] "ensembl_gene_id"       "ensembl_transcript_id" "version"              
##  [4] "transcript_version"    "description"           "gene_biotype"         
##  [7] "cds_length"            "chromosome_name"       "strand"               
## [10] "start_position"        "end_position"          "hgnc_symbol"          
## [13] "uniprot_gn_symbol"     "transcript"            "mean_cds_len"
colnames(all_lp_annot)
##  [1] "gid"                      "annot_external_db_name"  
##  [3] "gene_type"                "annot_gene_entrez_id"    
##  [5] "annot_gene_name"          "annot_strand"            
##  [7] "annot_chromosome"         "annot_cds_length"        
##  [9] "annot_gene_location_text" "annot_gene_product"      
## [11] "end"                      "start"                   
## [13] "mean_cds_len"             "version"                 
## [15] "transcript_version"       "hgnc_symbol"             
## [17] "uniprot_gn_symbol"        "transcript"              
## [19] "ensembl_transcript_id"
wanted_columns <- c("gid", "ensembl_transcript_id", "version", "transcript_version", "annot_gene_product",
                    "gene_type", "annot_cds_length", "annot_chromosome", "annot_strand", "start",
                    "end", "hgnc_symbol", "uniprot_gn_symbol", "transcript", "mean_cds_len")
all_lp_annot <- all_lp_annot[, wanted_columns]
colnames(all_lp_annot) <- colnames(hs_tx_annot)

hslp_annot <- rbind(hs_tx_annot, all_lp_annot)

Finally, dump the current gene ontology data from the EuPathDB-generated orgdb instance. This may be used by goseq/topgo/gostats/etc…

Just as a lark, grab orthologs across the EuPathDB as well in the following block.

One might reasonably ask why in the heck the gene ID column was changed to ‘ensembl_gene_id’, this is to make it easier (possible) to merge these annotations with the ensembl human annotations, if one chooses to combine the two genomes and examine them together.

lp_go <- load_orgdb_go(package_name)
## The chosen keytype was not available.  Using 'GID'.
## This is an orgdb, good.
lp_go <- lp_go[, c("GID", "GO")]
lp_lengths <- all_lp_annot[, c("ensembl_gene_id", "mean_cds_len")]
colnames(lp_lengths)  <- c("gid", "length")
all_lp_annot[["description"]] <- tolower(all_lp_annot[["description"]])

## extract_eupath_orthologs is from EuPathDB and isn't really
## being used for anything in this document afaik.
##orthos <- extract_eupath_orthologs(db = panamensis_pkg)
data_structures <- c(data_structures, "lp_lengths", "lp_go", "all_lp_annot", "meta")

5.1.2 Set up gene->transcript mappings

One should pay careful attention to the columns used to concatenate the gene/version and transcript/version. If these do not match exactly, many genes will be dropped by tximport without any output to signify something is wrong.

Note to self, I made a fun function which grabs the ids from salmon results. In addition I found that tximport can optionally ignore them.

## The tx_gene_map is used for tximport and salmon quantifications.
hs_annot[["transcript"]] <- paste0(rownames(hs_annot), ".",
                                   hs_annot[["transcript_version"]])
rownames(hs_annot) <- make.names(hs_annot[["ensembl_gene_id"]], unique = TRUE)
hs_tx_gene_map <- hs_annot[, c("transcript", "ensembl_gene_id")]

5.2 Gene ontology data

The set of GO categories has not been limited to the 2020 data at the time of this writing. The GO categories is collected along with lengths for goseq. The other methods either have built-in databases of human data (gProfiler) or support orgDB data (org.Hs.eg.db) (clusterProfiler/topGO/gostats).

hs_go <- try(load_biomart_go()[["go"]])
## Using mart: ENSEMBL_MART_ENSEMBL from host: useast.ensembl.org.
## Successfully connected to the hsapiens_gene_ensembl database.
## Finished downloading ensembl go annotations, saving to hsapiens_go_annotations.rda.
## Saving ontologies to hsapiens_go_annotations.rda.
## Finished save().
if ("try-error" %in% class(hs_go)) {
  hs_go <- NULL
}

hs_length <- hs_annot[, c("ensembl_gene_id", "cds_length")]
colnames(hs_length) <- c("ID", "length")
data_structures <- c(data_structures, "hs_length", "hs_go", "hs_annot")

6 Dataset: Create the parent data structure of all samples

Before we do any of the following subsets/analyses of the data, we need to collect it all in one place. Let’s do that here and name it ‘hs_expt’, it will comprise the full set of human data. When we cull some samples it will be renamed to ‘hs_valid’.

The variable ‘data_structures’ will contain the names of every variable I create in this document which I wish to save to disk.

Similarly, the character vector ‘sanitize_columns’ is the list of metadata columns over which I will iterate and sanitize the data, removing any spurious spaces, capitalization, etc.

6.1 Create Expressionset

The primary function used is ‘create_expt()’, which is responsible for combining the metadata (from the first block of code), the gene annotations (from the 2nd/3rd), and count tables (included in the metadata as a column of filenames) into a single expressionset (Huber et al. (2015)). The sanitize_columns variable defines the metadata columns which will be explicitly sanitized beyond the general checks performed. ‘subset_genes()’ is responsible for including only the protein coding genes in the data; it records the amount of information lost to the metadata as column ‘ncrna_lost’. ‘sanitize_metadata()’ will perform some sanity checks of the metadata to ensure that excel did not do anything untoward to the metadata. The ’set_expt_*()’ functions modify the metadata to make it more friendly for future tasks, including setting some columns to factors, defining the column of interest vs. known surrogate(s). Finally, ‘subset_expt()’ is used to drop samples which are known to not be of interest, like the few samples from people who presented as healthy in the clinic (when the clinicalpresentation column of the metadata is ‘h’).

One note if anyone actually reads this, I have a sister function which creates summarizedExperiments (SummarizedExperiment (n.d.)) instead of expressionSets, and I think all of my code should move to that; but it just has not happened because I just haven’t had a chance to finish writing the tests and making whatever little changes would be required to get them to all pass. If my fictitious reader is interested, I would love help completing the switch from exprs->se.

sanitize_columns <- c("visitnumber", "finaloutcome", "donor",
                      "typeofcells", "clinicalpresentation", "drug",
                      "condition", "batch", "clinic")
hs_expt <- create_expt(samplesheet,
                       file_column = "hg38_100hisatfile",
                       savefile = glue("rda/tmrc3_hs_expt_all_raw-v{ver}.rda"),
                       gene_info = hs_annot) %>%
  subset_genes(column = "gene_biotype", method = "keep",
               pattern = "protein_coding", meta_column = "ncrna_lost") %>%
  sanitize_expt_pData(columns = sanitize_columns)  %>%
  set_expt_factors(columns = sanitize_columns, class = "factor") %>%
  set_expt_conditions(fact = "finaloutcome") %>%
  set_expt_batches(fact = "visitnumber") %>%
  subset_expt(subset = "typeofcells!='pbmcs'") %>%
  subset_expt(subset = "typeofcells!='macrophages'") %>%
  subset_expt(subset = "clinicalpresentation!='h'")
## Reading the sample metadata.
## Did not find the column: sampleid.
## Setting the ID column to the first column.
## Dropped 69 rows from the sample metadata because the sample ID is blank.
## Warning in extract_metadata(metadata, id_column = id_column, ...): There were
## NA values in the condition column, setting them to 'undefined'.

## Warning in extract_metadata(metadata, id_column = id_column, ...): There were
## NA values in the condition column, setting them to 'undefined'.
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'subset_expt': error in evaluating the argument 'expt' in selecting a method for function 'subset_expt': error in evaluating the argument 'expt' in selecting a method for function 'subset_expt': error in evaluating the argument 'object' in selecting a method for function 'pData': error in evaluating the argument 'object' in selecting a method for function 'pData': error in evaluating the argument 'object' in selecting a method for function 'fData': error in evaluating the argument 'object' in selecting a method for function 'pData': error in evaluating the argument 'object' in selecting a method for function 'fData': character string is not in a standard unambiguous format
data_structures <- c(data_structures, "hs_expt")

## The following should make visit 1 the largest if one uses that column as a size factor when plotting.
meta <- pData(hs_expt) %>%
  mutate(visitnumber = fct_relevel(visitnumber, c("3", "2", "1")))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'pData': object 'hs_expt' not found
start_order <- rownames(meta)
## Error in h(simpleError(msg, call)): error in evaluating the argument 'x' in selecting a method for function 'rownames': object 'meta' not found
## Incorporate the identified strains
identified <- openxlsx::read.xlsx(species_identities)
no_data_idx <- identified[["Species"]] == "No hay dato"
identified <- identified[!no_data_idx, ]
identified <- identified[, c("Patient", "Species")]
colnames(identified) <- c("Patient", "ParasiteSpecies")
meta <- merge(meta, identified, by.x = "tubelabelorigin", by.y = "Patient", all.x = TRUE)
## Error in h(simpleError(msg, call)): error in evaluating the argument 'x' in selecting a method for function 'merge': object 'meta' not found
meta <- sanitize_metadata(meta, columns = "ParasiteSpecies", spaces = TRUE)
## Error in eval(expr, envir, enclos): object 'meta' not found
## Note that the merge removes the rownames and maybe changes sample order.
rownames(meta) <- meta[["tmrcidentifier"]]
## Error in eval(expr, envir, enclos): object 'meta' not found
meta <- meta[start_order, ]
## Error in eval(expr, envir, enclos): object 'meta' not found
pData(hs_expt) <- meta
## Error in eval(expr, envir, enclos): object 'meta' not found
save(list = "hs_expt", file = glue("rda/tmrc3_hs_expt_all_sanitized-v{ver}.rda"))
## Error in save(list = "hs_expt", file = glue("rda/tmrc3_hs_expt_all_sanitized-v{ver}.rda")): object 'hs_expt' not found

6.2 Add the patient demographics

There are some parameters provided by the clinicians which may prove to be of interest. I therefore am adding the demographics here. I will also run some simple checks to try to make sure that the clinician’s metadata agrees with the sample metadata.

In this first block, read the demographics and sanitize out the encoded NAs (999 and 888 or whatever) and add a column to join it to the sample sheet data.

hs_demographics <- openxlsx::read.xlsx(demographics)
hs_demographics[["join"]] <- tolower(hs_demographics[["Patient_ID"]])

columns_with_encoded_na <- c("Adherence_Glucantime", "Adherence_Miltefosine",
                             "Total_Ampules_Prescribed_Milt", "Prescribed_Daily_Dose_Milt",
                             "Total_Ampules_Prescribed_Gluc", "Prescribed_Daily_Dose_Gluc",
                             "V5_Total_Area_Ulcer", "V5_Vertical_Axis_Ulcer",
                             "V5_Horizontal_Axis_Ulcer", "V5_Total_Area_Lesion",
                             "V5_Vertical_Axis_Lesion", "V5_Horizontal_Axis_Lesion",
                             "V4_Total_Area_Ulcer", "V4_Vertical_Axis_Ulcer",
                             "V4_Horizontal_Axis_Ulcer", "V4_Total_Area_Lesion",
                             "V4_Vertical_Axis_Lesion", "V4_Horizontal_Axis_Lesion",
                             "V3_Total_Area_Ulcer", "V3_Vertical_Axis_Ulcer",
                             "V3_Horizontal_Axis_Ulcer", "V3_Total_Area_Lesion",
                             "V3_Vertical_Axis_Lesion", "V3_Horizontal_Axis_Lesion",
                             "V2_Total_Area_Ulcer", "V2_Vertical_Axis_Ulcer",
                             "V2_Horizontal_Axis_Ulcer", "V2_Total_Area_Lesion",
                             "V2_Vertical_Axis_Lesion", "V2_Horizontal_Axis_Lesion",
                             "V5_New_Lesions", "V4_New_Lesions", "V3_New_Lesions",
                             "V2_New_Lesions")
for (col in columns_with_encoded_na) {
  na_idx <- hs_demographics[[col]] == 999
  message("Column ", col, " contains ", sum(na_idx), " encoded NA values.")
  hs_demographics[na_idx, col] <- NA
}
## Column Adherence_Glucantime contains 5 encoded NA values.
## Column Adherence_Miltefosine contains 35 encoded NA values.
## Column Total_Ampules_Prescribed_Milt contains 35 encoded NA values.
## Column Prescribed_Daily_Dose_Milt contains 35 encoded NA values.
## Column Total_Ampules_Prescribed_Gluc contains 5 encoded NA values.
## Column Prescribed_Daily_Dose_Gluc contains 5 encoded NA values.
## Column V5_Total_Area_Ulcer contains 38 encoded NA values.
## Column V5_Vertical_Axis_Ulcer contains 38 encoded NA values.
## Column V5_Horizontal_Axis_Ulcer contains 38 encoded NA values.
## Column V5_Total_Area_Lesion contains 38 encoded NA values.
## Column V5_Vertical_Axis_Lesion contains 38 encoded NA values.
## Column V5_Horizontal_Axis_Lesion contains 38 encoded NA values.
## Column V4_Total_Area_Ulcer contains 35 encoded NA values.
## Column V4_Vertical_Axis_Ulcer contains 35 encoded NA values.
## Column V4_Horizontal_Axis_Ulcer contains 35 encoded NA values.
## Column V4_Total_Area_Lesion contains 35 encoded NA values.
## Column V4_Vertical_Axis_Lesion contains 35 encoded NA values.
## Column V4_Horizontal_Axis_Lesion contains 35 encoded NA values.
## Column V3_Total_Area_Ulcer contains 10 encoded NA values.
## Column V3_Vertical_Axis_Ulcer contains 10 encoded NA values.
## Column V3_Horizontal_Axis_Ulcer contains 10 encoded NA values.
## Column V3_Total_Area_Lesion contains 10 encoded NA values.
## Column V3_Vertical_Axis_Lesion contains 10 encoded NA values.
## Column V3_Horizontal_Axis_Lesion contains 10 encoded NA values.
## Column V2_Total_Area_Ulcer contains 4 encoded NA values.
## Column V2_Vertical_Axis_Ulcer contains 4 encoded NA values.
## Column V2_Horizontal_Axis_Ulcer contains 4 encoded NA values.
## Column V2_Total_Area_Lesion contains 4 encoded NA values.
## Column V2_Vertical_Axis_Lesion contains 4 encoded NA values.
## Column V2_Horizontal_Axis_Lesion contains 4 encoded NA values.
## Column V5_New_Lesions contains 21 encoded NA values.
## Column V4_New_Lesions contains 14 encoded NA values.
## Column V3_New_Lesions contains 4 encoded NA values.
## Column V2_New_Lesions contains 2 encoded NA values.
factor_columns <- c("Sex", "Ethnicity", "Infection_Location", "Previously_Diagnosed",
                    "Adverse_Effects_V3", "Adverse_Effects_V4", "Therapeutic_Outcome_V3",
                    "Therapeutic_Outcome_V4", "Therapeutic_Outcome_V5",
                    "Therapeutic_Outcome_Final")
for (col in factor_columns) {
  hs_demographics[[col]] <- as.factor(hs_demographics[[col]])
}

## Extract the clinic from the patient id via a cheeseball regex.
hs_demographics[["Clinic"]] <- gsub(x = hs_demographics[["Patient_ID"]],
                                    pattern = "^SU(\\d){1}.*$", replacement = "\\1")
data_structures <- c(data_structures, "hs_demographics")

6.3 Get the Sample sheet data ready for joining and perform the merge

In the following we add a column ‘join’ analagous to that added to the demographics, this will be used to add the various columns across each person’s samples. I guess I could have done this with merge(all.x = TRUE, all.y = TRUE)

Some changes I made to enforce more consistent date management are causing problems. Notably, some columns are now getting set to the format ‘Date’, which cannot have strings like ‘undefined’.

hs_pd <- pData(hs_expt)
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'pData': object 'hs_expt' not found
hs_pd[["join"]] <- hs_pd[["tubelabelorigin"]]
## Error in eval(expr, envir, enclos): object 'hs_pd' not found
hs_pd_demographics <- plyr::join(hs_pd, hs_demographics, by = "join")
## Error in eval(expr, envir, enclos): object 'hs_pd' not found
rownames(hs_pd_demographics) <- rownames(hs_pd)
## Error in h(simpleError(msg, call)): error in evaluating the argument 'x' in selecting a method for function 'rownames': object 'hs_pd' not found
na_idx <- is.na(hs_pd_demographics)
## Error in eval(expr, envir, enclos): object 'hs_pd_demographics' not found
sum(na_idx)
## [1] 2
hs_pd_demographics[na_idx] <- ""
## Error: object 'hs_pd_demographics' not found
data_structures <- c(data_structures, "hs_pd_demographics")

6.4 Add the demographics to the expressionset

In addition we will create a series of composite variables from combinations of extant factors.

pData(hs_expt) <- hs_pd_demographics
## Error in eval(expr, envir, enclos): object 'hs_pd_demographics' not found
## Now add in the ethnicity and sex
## Add a combination of the ethnicity and clinic
## While I am at it, do sex+clinic
table(pData(hs_expt)[["Sex"]])
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'pData': object 'hs_expt' not found
table(pData(hs_expt)[["Ethnicity"]])
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'pData': object 'hs_expt' not found
table(pData(hs_expt)[["clinic"]])
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'pData': object 'hs_expt' not found
etnia_names <- as.character(pData(hs_expt)[["Ethnicity"]])
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'pData': object 'hs_expt' not found
etnia_idx <- etnia_names == 1
## Error in eval(expr, envir, enclos): object 'etnia_names' not found
etnia_names[etnia_idx] <- "afrocol"
## Error: object 'etnia_names' not found
etnia_idx <- etnia_names == 2
## Error in eval(expr, envir, enclos): object 'etnia_names' not found
etnia_names[etnia_idx] <- "indigena"
## Error: object 'etnia_names' not found
etnia_idx <- etnia_names == 3
## Error in eval(expr, envir, enclos): object 'etnia_names' not found
etnia_names[etnia_idx] <- "mestiza"
## Error: object 'etnia_names' not found
pData(hs_expt)[["etnia"]] <- as.factor(etnia_names)
## Error in h(simpleError(msg, call)): error in evaluating the argument 'x' in selecting a method for function 'as.factor': object 'etnia_names' not found
table(pData(hs_expt)[["etnia"]])
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'pData': object 'hs_expt' not found
table(pData(hs_expt)[["Ethnicity"]])
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'pData': object 'hs_expt' not found
etnia_factor <- paste0(pData(hs_expt)[["clinic"]], "_",
                       etnia_names)
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'pData': object 'hs_expt' not found
pData(hs_expt)[["clinic_etnia"]] <- as.factor(etnia_factor)
## Error in h(simpleError(msg, call)): error in evaluating the argument 'x' in selecting a method for function 'as.factor': object 'etnia_factor' not found
table(pData(hs_expt)[["clinic_etnia"]])
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'pData': object 'hs_expt' not found
pData(hs_expt)[["sex"]] <- "female"
## Error: object 'hs_expt' not found
male_idx <- pData(hs_expt)[["Sex"]] == 1
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'pData': object 'hs_expt' not found
pData(hs_expt)[male_idx, "sex"] <- "male"
## Error: object 'hs_expt' not found
pData(hs_expt)[["sex"]] <- as.factor(pData(hs_expt)[["sex"]])
## Error in h(simpleError(msg, call)): error in evaluating the argument 'x' in selecting a method for function 'as.factor': error in evaluating the argument 'object' in selecting a method for function 'pData': object 'hs_expt' not found
sex_factor <- paste0(pData(hs_expt)[["clinic"]], "_",
                     pData(hs_expt)[["sex"]])
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'pData': object 'hs_expt' not found
pData(hs_expt)[["clinic_sex"]] <- as.factor(sex_factor)
## Error in h(simpleError(msg, call)): error in evaluating the argument 'x' in selecting a method for function 'as.factor': object 'sex_factor' not found
table(pData(hs_expt)[["clinic_sex"]])
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'pData': object 'hs_expt' not found
pData(hs_expt)[["etnia_sex"]] <- paste0(pData(hs_expt)[["etnia"]], "_",
                                        pData(hs_expt)[["sex"]])
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'pData': object 'hs_expt' not found
pData(hs_expt)[["etnia_sex"]] <- as.factor(pData(hs_expt)[["etnia_sex"]])
## Error in h(simpleError(msg, call)): error in evaluating the argument 'x' in selecting a method for function 'as.factor': error in evaluating the argument 'object' in selecting a method for function 'pData': object 'hs_expt' not found
table(pData(hs_expt)[["etnia_sex"]])
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'pData': object 'hs_expt' not found
## Set a factor of samples which are visit 1 vs. 2/3.
v1_samples <- pData(hs_expt)[["visitnumber"]] == "1"
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'pData': object 'hs_expt' not found
pData(hs_expt)[v1_samples, "visitbipart"] <- "v1"
## Error: object 'hs_expt' not found
pData(hs_expt)[!v1_samples, "visitbipart"] <- "vother"
## Error: object 'hs_expt' not found
table(pData(hs_expt)[["visitbipart"]])
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'pData': object 'hs_expt' not found
pData(hs_expt)[["cell_visit_cf"]] <- paste0(pData(hs_expt)[["typeofcells"]], "_",
                                            pData(hs_expt)[["visitnumber"]], "_",
                                            pData(hs_expt)[["finaloutcome"]])
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'pData': object 'hs_expt' not found
age_vector <- pData(hs_expt)[["Age"]]
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'pData': object 'hs_expt' not found
pData(hs_expt)[["age_cat"]] <- make_quartile_factor(age_vector)
## Error in eval(expr, envir, enclos): object 'age_vector' not found
save(list = "hs_expt", file = glue("rda/tmrc3_hs_expt_all_sanitized_demographics-v{ver}.rda"))
## Error in save(list = "hs_expt", file = glue("rda/tmrc3_hs_expt_all_sanitized_demographics-v{ver}.rda")): object 'hs_expt' not found

6.5 Sanity check, clinical outcome vs. demographics

Check to make sure the demographics agrees with the metadata. I really want this block to return NULL upon completion.

two_columns <- pData(hs_expt)[, c("finaloutcome", "Therapeutic_Outcome_Final")]
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'pData': object 'hs_expt' not found
undef_idx <- two_columns[[2]] == "undefined"
## Error in eval(expr, envir, enclos): object 'two_columns' not found
two_columns <- two_columns[!undef_idx, ]
## Error in eval(expr, envir, enclos): object 'two_columns' not found
two_columns[["rewritten"]] <- "undef"
## Error: object 'two_columns' not found
cure_idx <- two_columns[[2]] == 0
## Error in eval(expr, envir, enclos): object 'two_columns' not found
two_columns[cure_idx, "rewritten"] <- "cure"
## Error: object 'two_columns' not found
fail_idx <- two_columns[[2]] == 1
## Error in eval(expr, envir, enclos): object 'two_columns' not found
two_columns[fail_idx, "rewritten"] <- "failure"
## Error: object 'two_columns' not found
lost_idx <- two_columns[[2]] == 2
## Error in eval(expr, envir, enclos): object 'two_columns' not found
two_columns[lost_idx, "rewritten"] <- "lost"
## Error: object 'two_columns' not found
same_idx <- two_columns[["finaloutcome"]] == two_columns[["rewritten"]]
## Error in eval(expr, envir, enclos): object 'two_columns' not found
broken <- two_columns[!same_idx, ]
## Error in eval(expr, envir, enclos): object 'two_columns' not found
## I very much want the following line to evaluate to 0 rows.
broken
## Error in eval(expr, envir, enclos): object 'broken' not found

6.6 Summarize: Collect sample numbers before filtering

There are some metadata factors for which I think it will be nice to see the numbers before and after our filters. The following shows how many samples we have of the primary types before filtering.

dim(pData(hs_expt))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'pData': object 'hs_expt' not found
table(pData(hs_expt)[["drug"]])
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'pData': object 'hs_expt' not found
table(pData(hs_expt)[["clinic"]])
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'pData': object 'hs_expt' not found
table(pData(hs_expt)[["finaloutcome"]])
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'pData': object 'hs_expt' not found
table(pData(hs_expt)[["typeofcells"]])
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'pData': object 'hs_expt' not found
table(pData(hs_expt)[["visitnumber"]])
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'pData': object 'hs_expt' not found
summary(as.numeric(pData(hs_expt)[["Evolution_Time"]]))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'summary': error in evaluating the argument 'object' in selecting a method for function 'pData': object 'hs_expt' not found
summary(as.numeric(pData(hs_expt)[["Prescribed_Daily_Dose_Gluc"]]))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'summary': error in evaluating the argument 'object' in selecting a method for function 'pData': object 'hs_expt' not found
summary(as.numeric(pData(hs_expt)[["V3_Vertical_Axis_Lesion"]]))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'summary': error in evaluating the argument 'object' in selecting a method for function 'pData': object 'hs_expt' not found
summary(as.numeric(pData(hs_expt)[["V3_Total_Area_Lesion"]]))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'summary': error in evaluating the argument 'object' in selecting a method for function 'pData': object 'hs_expt' not found
summary(as.numeric(pData(hs_expt)[["V3_Horizontal_Axis_Lesion"]]))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'summary': error in evaluating the argument 'object' in selecting a method for function 'pData': object 'hs_expt' not found
table(pData(hs_expt)[["sex"]])
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'pData': object 'hs_expt' not found
table(pData(hs_expt)[["etnia"]])
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'pData': object 'hs_expt' not found
table(pData(hs_expt)[["Ethnicity"]])
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'pData': object 'hs_expt' not found
summary(as.numeric(pData(hs_expt)[["Age"]]))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'summary': error in evaluating the argument 'object' in selecting a method for function 'pData': object 'hs_expt' not found
summary(pData(hs_expt)[["Weight"]])
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'summary': error in evaluating the argument 'object' in selecting a method for function 'pData': object 'hs_expt' not found
summary(pData(hs_expt)[["Height"]])
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'summary': error in evaluating the argument 'object' in selecting a method for function 'pData': object 'hs_expt' not found
table(pData(hs_expt)[["Therapeutic_Outcome_Final"]])
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'pData': object 'hs_expt' not found
table(pData(hs_expt)[["finaloutcome"]])
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'pData': object 'hs_expt' not found
unique(pData(hs_expt)[["Patient_ID"]])
## Error in h(simpleError(msg, call)): error in evaluating the argument 'x' in selecting a method for function 'unique': error in evaluating the argument 'object' in selecting a method for function 'pData': object 'hs_expt' not found
length(unique(pData(hs_expt)[["Patient_ID"]]))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'x' in selecting a method for function 'unique': error in evaluating the argument 'object' in selecting a method for function 'pData': object 'hs_expt' not found

Get the sex of the unique patients.

unique_people <- unique(pData(hs_expt)[["Patient_ID"]])
## Error in h(simpleError(msg, call)): error in evaluating the argument 'x' in selecting a method for function 'unique': error in evaluating the argument 'object' in selecting a method for function 'pData': object 'hs_expt' not found
unique_people
## Error in eval(expr, envir, enclos): object 'unique_people' not found
length(unique_people)
## Error in eval(expr, envir, enclos): object 'unique_people' not found
df <- pData(hs_expt)
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'pData': object 'hs_expt' not found
people <- df[["Patient_ID"]]
## Error in df[["Patient_ID"]]: object of type 'closure' is not subsettable
first_indices <- order(people)[!duplicated(sort(people))]
## Error in eval(expr, envir, enclos): object 'people' not found
table(df[first_indices, "sex"])
## Error in eval(expr, envir, enclos): object 'first_indices' not found
table(df[first_indices, "finaloutcome"])
## Error in eval(expr, envir, enclos): object 'first_indices' not found

6.7 Define desired colors for the various subsets

There are lots of ways which we will categorize the data, here are some potential color choices for them.

color_choices <- list(
    "cf" = list(
      "cure" = "#998EC3",
      "failure" = "#F1A340"),
    "cflost" = list(
      "cure" = "#998EC3",
      "failure" = "#F1A340",
      "lost" = "#343434"),
    "type_visit" = list(
      "monocytes_v1" = "#DD1C77",
      "monocytes_v2" = "#C994C7",
      "monocytes_v3" = "#E7E1EF",
      "eosinophils_v1" = "#31A354",
      "eosinophils_v2" = "#ADDD8E",
      "eosinophils_v3" = "#F7FCD9",
      "neutrophils_v1" = "#3182BD",
      "neutrophils_v2" = "#9ECAE1",
      "neutrophils_v3" = "#DEEBF7",
      "biopsy_v1" = "#D95F0E"),
    "type" = list(
      "monocytes" = "#DD1C77",
      "eosinophils" = "#31A354",
      "neutrophils" = "#3182BD",
      "biopsy" = "#D95F0E"),
    "two_visit" = list(
      "first" = "#33EE33",
      "later" = "#023302"),
    "visit" = list(
      "v1" = "#CCCCCC",
      "v2" = "#666666",
      "v3" = "#111111"),
    "visit2" = list(
      "1" = "#CCCCCC",
      "2" = "#666666",
      "3" = "#111111"),
    "visitbi" = list(
      "v1" = "#BB0000",
      "vother" = "#0000BB"),
    "labs" = list(
      "Brazil" = "#FFC300",
      "Colombia" = "#525252"),
    "clinic" = list(
      "tumaco" = "#3182AA",
      "cali" = "#C994AA"),
    "clinic_cf" = list(
      "tumaco_cure" = "#7670B3",
      "tumaco_failure" = "#E7298A",
      "cali_cure" = "#1B9E77",
      "cali_failure" = "#D95F02"),
    "ethnicity" = list(
      "afrocol" = "#4293CE",
      "indigena" = "#BDBDBD",
      "mestiza" = "#FEB24C"),
    "clinic_etnia" = list(
      "cali_afrocol" = "#3182BD",
      "cali_indigena" = "#636363",
      "cali_mestiza" = "#F03B20",
      "tumaco_afrocol" = "#9ECAE1",
      "tumaco_indigena" = "#BDBDBD",
      "tumaco_mestiza" = "#FEB24C"),
    "sex" = list(
      "female" = "#3182BD",
      "male" = "#C994C7"),
    "clinic_sex" = list(
      "cali_female" = "#0000CC",
      "tumaco_female" = "#3182BD",
      "cali_male" = "#E7298A",
      "tumaco_male" = "#C994C7"),
    "cf_type" = list(
      "cure_biopsy" = "#D95F0E",
      "failure_biopsy" = "#FEC44F",
      "cure_monocytes" = "#DD1C77",
      "failure_monocytes" = "#C994C7",
      "cure_eosinophils" = "#31A354",
      "failure_eosinophils" = "#ADDD8E",
      "cure_neutrophils" = "#3182BD",
      "failure_neutrophils" = "#9ECAE1"),
    "parasite" = list(
      "notapplicable" = "#000000",
      "lvbraziliensis" = "#AA0000",
      "lvguyanensis" = "#660066",
      "lvpanamensis" = "#3160AC"))
data_structures <- c(data_structures, "color_choices")

7 Define the starting data

Given the starting point above, we will start extracting groups of samples of interest.

7.1 Set our initial coverage goal

The first set of samples removed from the data are those with too many missing genes.

7.2 Figure S2: Non-zero genes before sample filtering

all_nz <- plot_nonzero(hs_expt)
## Error in h(simpleError(msg, call)): error in evaluating the argument 'data' in selecting a method for function 'plot_nonzero': object 'hs_expt' not found
pp(file = "figures/S2_nonzero_all_samples.svg")
all_nz$plot
## Error in eval(expr, envir, enclos): object 'all_nz' not found
dev.off()
## png 
##   2
all_nz
## Error in eval(expr, envir, enclos): object 'all_nz' not found

7.2.1 Save CPM, all samples

We should save a cpm and rpkm copy of the raw data for every subset in order to make it easier for folks to work with WGCNA and other tools (STRING).

dir.create("cpm/3_Cali_and_Tumaco", recursive = TRUE)
dir.create("rpkm")
## Warning in dir.create("rpkm"): 'rpkm' already exists
cpm_data <- normalize_expt(hs_expt, convert = "cpm")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'normalize_expt': object 'hs_expt' not found
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("cpm/3_Cali_and_Tumaco/all_samples-v{ver}.xlsx"))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'data' in selecting a method for function 'write_xlsx': error in evaluating the argument 'object' in selecting a method for function 'exprs': object 'cpm_data' not found
rpkm_data <- normalize_expt(hs_expt, filter = TRUE, convert = "rpkm",
                            column = "mean_cds_len", na_to_zero = TRUE)
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'normalize_expt': object 'hs_expt' not found
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("rpkm/hs_expt_rpkm-v{ver}.csv"))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'x' in selecting a method for function 'as.data.frame': error in evaluating the argument 'object' in selecting a method for function 'exprs': object 'rpkm_data' not found

7.3 Subset: Filter out problematic samples

To my eyes, there are 3 or 4 samples which are likely candidates for removal. In addition, we will remove samples which were lost during the treatment and/or ones which were used in other experiments but included in the TMRC3 sample sheet (thus the ‘notapplicable’ or ‘null’).

I think this is stated elsewhere: variables prefixed with ‘tc’ are Tumaco and Cali; ‘t’ or ‘c’ correspond.

tc_nolost <- subset_expt(hs_expt, subset = "finaloutcome!='lost'")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'subset_expt': object 'hs_expt' not found
tc_nomilt <- subset_expt(tc_nolost, subset = "drug=='antimony'")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'subset_expt': object 'tc_nolost' not found
plot_legend(tc_nomilt)
## Error in eval(expr, envir, enclos): object 'tc_nomilt' not found
nomilt_nonzero <- plot_nonzero(tc_nomilt, plot_labels = TRUE)
## Error in h(simpleError(msg, call)): error in evaluating the argument 'data' in selecting a method for function 'plot_nonzero': object 'tc_nomilt' not found
nomilt_nonzero
## Error in eval(expr, envir, enclos): object 'nomilt_nonzero' not found
pp(file = "figures/figs2_nonzero.svg")
nomilt_nonzero
## Error in eval(expr, envir, enclos): object 'nomilt_nonzero' not found
dev.off()
## png 
##   2
tc_valid <- subset_expt(tc_nomilt, nonzero = 11000) %>%
  set_expt_colors(colors = color_choices[["cf"]])
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'pData': error in evaluating the argument 'expt' in selecting a method for function 'subset_expt': object 'tc_nomilt' not found
save(list = "tc_valid", file = glue("rda/tmrc3_tc_valid-v{ver}.rda"))
## Error in save(list = "tc_valid", file = glue("rda/tmrc3_tc_valid-v{ver}.rda")): object 'tc_valid' not found
data_structures <- c(data_structures, "tc_valid")

8 Visualize the sample breakdown

clinic_type_outcome_sankey <- plot_meta_sankey(
  tc_valid, factors = c("clinic", "typeofcells", "finaloutcome"),
  drill_down = TRUE, color_choices = color_choices)
## Error in h(simpleError(msg, call)): error in evaluating the argument 'design' in selecting a method for function 'plot_meta_sankey': object 'tc_valid' not found
clinic_type_outcome_sankey
## Error in eval(expr, envir, enclos): object 'clinic_type_outcome_sankey' not found
clinic_ethnicity_outcome_sankey <- plot_meta_sankey(
  tc_valid, factors = c("clinic", "etnia", "finaloutcome"),
  drill_down = TRUE, color_choices = color_choices)
## Error in h(simpleError(msg, call)): error in evaluating the argument 'design' in selecting a method for function 'plot_meta_sankey': object 'tc_valid' not found
clinic_ethnicity_outcome_sankey
## Error in eval(expr, envir, enclos): object 'clinic_ethnicity_outcome_sankey' not found
clinic_sex_outcome_sankey <- plot_meta_sankey(
  tc_valid, factors = c("clinic", "sex", "finaloutcome"),
  drill_down = TRUE, color_choices = color_choices)
## Error in h(simpleError(msg, call)): error in evaluating the argument 'design' in selecting a method for function 'plot_meta_sankey': object 'tc_valid' not found
clinic_sex_outcome_sankey
## Error in eval(expr, envir, enclos): object 'clinic_sex_outcome_sankey' not found

8.1 Figure XX + 1: Non-zero genes after sample filtering

The following plot is essentially identical to the previous with two exceptions:

  1. The samples with too few genes (11,000 currently) are gone.
  2. The samples are colored by cure(purple)/fail(yellow)
nz_post <- plot_nonzero(tc_valid)
## Error in h(simpleError(msg, call)): error in evaluating the argument 'data' in selecting a method for function 'plot_nonzero': object 'tc_valid' not found
nz_post
## Error in eval(expr, envir, enclos): object 'nz_post' not found
pp(file = "figures/figS2v2_post.svg")
nz_post
## Error in eval(expr, envir, enclos): object 'nz_post' not found
dev.off()
## png 
##   2

8.2 Summarize: Tally samples after filtering

We need to keep track of how many of each sample type is lost when we do our various filters. Thus I am repeating the same set of tallies. This will likely happen one more time, following the removal of samples which came from Cali.

table(pData(tc_valid)[["drug"]])
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'pData': object 'tc_valid' not found
table(pData(tc_valid)[["clinic"]])
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'pData': object 'tc_valid' not found
table(pData(tc_valid)[["finaloutcome"]])
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'pData': object 'tc_valid' not found
table(pData(tc_valid)[["typeofcells"]])
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'pData': object 'tc_valid' not found
table(pData(tc_valid)[["visit"]])
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'pData': object 'tc_valid' not found
summary(as.numeric(pData(tc_valid)[["Evolution_Time"]]))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'summary': error in evaluating the argument 'object' in selecting a method for function 'pData': object 'tc_valid' not found
summary(as.numeric(pData(tc_valid)[["Prescribed_Daily_Dose_Gluc"]]))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'summary': error in evaluating the argument 'object' in selecting a method for function 'pData': object 'tc_valid' not found
summary(as.numeric(pData(tc_valid)[["V3_Vertical_Axis_Lesion"]]))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'summary': error in evaluating the argument 'object' in selecting a method for function 'pData': object 'tc_valid' not found
summary(as.numeric(pData(tc_valid)[["V3_Total_Area_Lesion"]]))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'summary': error in evaluating the argument 'object' in selecting a method for function 'pData': object 'tc_valid' not found
summary(as.numeric(pData(tc_valid)[["V3_Horizontal_Axis_Ulcer"]]))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'summary': error in evaluating the argument 'object' in selecting a method for function 'pData': object 'tc_valid' not found
table(pData(tc_valid)[["sex"]])
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'pData': object 'tc_valid' not found
table(pData(tc_valid)[["etnia"]])
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'pData': object 'tc_valid' not found
summary(as.numeric(pData(tc_valid)[["Age"]]))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'summary': error in evaluating the argument 'object' in selecting a method for function 'pData': object 'tc_valid' not found
summary(pData(tc_valid)[["Weight"]])
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'summary': error in evaluating the argument 'object' in selecting a method for function 'pData': object 'tc_valid' not found
summary(pData(tc_valid)[["Height"]])
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'summary': error in evaluating the argument 'object' in selecting a method for function 'pData': object 'tc_valid' not found
length(unique(pData(tc_valid)[["Patient_ID"]]))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'x' in selecting a method for function 'unique': error in evaluating the argument 'object' in selecting a method for function 'pData': object 'tc_valid' not found

8.3 Extract the demographics from the remaining samples

When we perform the logistic/linear models examining variables in the demographics, we need to ensure that we are working with only the people who are included in the final dataset.

people_remaining <- unique(pData(tc_valid)[["Patient_ID"]])
## Error in h(simpleError(msg, call)): error in evaluating the argument 'x' in selecting a method for function 'unique': error in evaluating the argument 'object' in selecting a method for function 'pData': object 'tc_valid' not found
demographics_filtered_idx <- hs_demographics[["Patient_ID"]] %in% people_remaining
## Error in h(simpleError(msg, call)): error in evaluating the argument 'table' in selecting a method for function '%in%': object 'people_remaining' not found
demographics_filtered <- hs_demographics[demographics_filtered_idx, ]
## Error in eval(expr, envir, enclos): object 'demographics_filtered_idx' not found
data_structures <- c(data_structures, "demographics_filtered")

8.4 Split the data by cure/fail for some counting

We now have two datasets which are comprised of only the cure/fail samples. It is worth considering if there are ways we can leverage this separation.

tc_cure <- subset_expt(tc_valid, subset = "finaloutcome=='cure'")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'subset_expt': object 'tc_valid' not found
data_structures <- c(data_structures, "tc_cure")

table(pData(tc_cure)[["visitnumber"]])
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'pData': object 'tc_cure' not found
tc_fail <- subset_expt(tc_valid, subset = "finaloutcome=='failure'")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'subset_expt': object 'tc_valid' not found
data_structures <- c(data_structures, "tc_fail")

table(pData(tc_fail)[["visitnumber"]])
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'pData': object 'tc_fail' not found

10 Tumaco and Cali data structures

All data structures which start with the prefix ‘tc’ are Tumaco and Cali. Those with ‘t’ are only Tumaco, ‘c’ are only Cali.

tc_clinical <- tc_valid %>%
  set_expt_conditions(fact = "finaloutcome", colors = color_choices[["cf"]]) %>%
  set_expt_batches(fact = "typeofcells")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'pData': error in evaluating the argument 'object' in selecting a method for function 'pData': object 'tc_valid' not found
save(list = "tc_clinical", file = glue("rda/tmrc3_tc_clinical-v{ver}.rda"))
## Error in save(list = "tc_clinical", file = glue("rda/tmrc3_tc_clinical-v{ver}.rda")): object 'tc_clinical' not found
data_structures <- c(data_structures, "tc_clinical")

10.1 Subset: Monocytes by clinic

For some of the following data structures, we will be concatenating various metadata factors of interest, usually the final outcome and one other metadatum.

10.2 Subset Monocytes

In the following block I am writing out the Monocytes in a couple different ways, once with the clinical outcome as the primary factor, and again using the concatenation of clinic/outcome.

clinic_cf <- paste0(pData(tc_monocytes)[["clinic"]], "_",
                    pData(tc_monocytes)[["finaloutcome"]])
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'pData': object 'tc_monocytes' not found
table(clinic_cf)
## Error in eval(expr, envir, enclos): object 'clinic_cf' not found
tc_monocytes <- set_expt_conditions(
  tc_monocytes, fact = clinic_cf, colors = color_choices[["clinic_cf"]]) %>%
  set_expt_batches(fact = "visitnumber")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'pData': error in evaluating the argument 'object' in selecting a method for function 'pData': object 'tc_monocytes' not found
save(list = "tc_monocytes", file = glue("rda/tmrc3_tc_monocytes-v{ver}.rda"))
## Error in save(list = "tc_monocytes", file = glue("rda/tmrc3_tc_monocytes-v{ver}.rda")): object 'tc_monocytes' not found
data_structures <- c(data_structures, "tc_monocytes")

tcv1_monocytes <- subset_expt(tc_monocytes, subset = "visitnumber=='1'")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'subset_expt': object 'tc_monocytes' not found
save(list = "tcv1_monocytes", file = glue("rda/tmrc3_tcv1_monocytes-v{ver}.rda"))
## Error in save(list = "tcv1_monocytes", file = glue("rda/tmrc3_tcv1_monocytes-v{ver}.rda")): object 'tcv1_monocytes' not found
data_structures <- c(data_structures, "tcv1_monocytes")
tcv2_monocytes <- subset_expt(tc_monocytes, subset = "visitnumber=='2'")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'subset_expt': object 'tc_monocytes' not found
save(list = "tcv2_monocytes", file = glue("rda/tmrc3_tcv2_monocytes-v{ver}.rda"))
## Error in save(list = "tcv2_monocytes", file = glue("rda/tmrc3_tcv2_monocytes-v{ver}.rda")): object 'tcv2_monocytes' not found
data_structures <- c(data_structures, "tcv2_monocytes")
tcv3_monocytes <- subset_expt(tc_monocytes, subset = "visitnumber=='3'")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'subset_expt': object 'tc_monocytes' not found
save(list = "tcv3_monocytes", file = glue("rda/tmrc3_tcv3_monocytes-v{ver}.rda"))
## Error in save(list = "tcv3_monocytes", file = glue("rda/tmrc3_tcv3_monocytes-v{ver}.rda")): object 'tcv3_monocytes' not found
data_structures <- c(data_structures, "tcv3_monocytes")

10.3 Subset: Eosinophils

… and the Eosinophils. These are noteworthy because they have fewer fails than some other cohorts.

clinic_cf <- paste0(pData(tc_eosinophils)[["clinic"]], "_",
                    pData(tc_eosinophils)[["finaloutcome"]])
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'pData': object 'tc_eosinophils' not found
table(clinic_cf)
## Error in eval(expr, envir, enclos): object 'clinic_cf' not found
tc_eosinophils <- set_expt_conditions(
  tc_eosinophils, fact = clinic_cf, colors = color_choices[["clinic_cf"]]) %>%
  set_expt_batches(fact = "visitnumber")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'pData': error in evaluating the argument 'object' in selecting a method for function 'pData': object 'tc_eosinophils' not found
save(list = "tc_eosinophils", file = glue("rda/tmrc3_tc_eosinophils-v{ver}.rda"))
## Error in save(list = "tc_eosinophils", file = glue("rda/tmrc3_tc_eosinophils-v{ver}.rda")): object 'tc_eosinophils' not found
data_structures <- c(data_structures, "tc_eosinophils")

tcv1_eosinophils <- subset_expt(tc_eosinophils, subset = "visitnumber=='1'")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'subset_expt': object 'tc_eosinophils' not found
save(list = "tcv1_eosinophils", file = glue("rda/tmrc3_tcv1_eosinophils-v{ver}.rda"))
## Error in save(list = "tcv1_eosinophils", file = glue("rda/tmrc3_tcv1_eosinophils-v{ver}.rda")): object 'tcv1_eosinophils' not found
data_structures <- c(data_structures, "tcv1_eosinophils")
tcv2_eosinophils <- subset_expt(tc_eosinophils, subset = "visitnumber=='2'")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'subset_expt': object 'tc_eosinophils' not found
save(list = "tcv2_eosinophils", file = glue("rda/tmrc3_tcv2_eosinophils-v{ver}.rda"))
## Error in save(list = "tcv2_eosinophils", file = glue("rda/tmrc3_tcv2_eosinophils-v{ver}.rda")): object 'tcv2_eosinophils' not found
data_structures <- c(data_structures, "tcv2_eosinophils")
tcv3_eosinophils <- subset_expt(tc_eosinophils, subset = "visitnumber=='3'")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'subset_expt': object 'tc_eosinophils' not found
save(list = "tcv3_eosinophils", file = glue("rda/tmrc3_tcv3_eosinophils-v{ver}.rda"))
## Error in save(list = "tcv3_eosinophils", file = glue("rda/tmrc3_tcv3_eosinophils-v{ver}.rda")): object 'tcv3_eosinophils' not found
data_structures <- c(data_structures, "tcv3_eosinophils")

10.4 Subset: Biopsies

Followed by the Biopsy samples…

tc_clinical_nobiop <- subset_expt(tc_clinical, subset = "typeofcells!='biopsy'") %>%
  set_expt_colors(color_choices[["cf"]])
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'pData': error in evaluating the argument 'expt' in selecting a method for function 'subset_expt': object 'tc_clinical' not found
save(list = "tc_clinical_nobiop", file = glue("rda/tmrc3_tc_clinical_nobiop-v{ver}.rda"))
## Error in save(list = "tc_clinical_nobiop", file = glue("rda/tmrc3_tc_clinical_nobiop-v{ver}.rda")): object 'tc_clinical_nobiop' not found
data_structures <- c(data_structures, "tc_clinical_nobiop")

tc_biopsies <- tc_valid %>%
  set_expt_conditions(fact = "clinic") %>%
  set_expt_batches(fact = "finaloutcome") %>%
  subset_expt(subset = "typeofcells=='biopsy'")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'subset_expt': error in evaluating the argument 'object' in selecting a method for function 'pData': error in evaluating the argument 'object' in selecting a method for function 'pData': object 'tc_valid' not found
tc_cf <- paste0(pData(tc_biopsies)[["clinic"]], "_",
                pData(tc_biopsies)[["finaloutcome"]])
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'pData': object 'tc_biopsies' not found
table(tc_cf)
## Error in eval(expr, envir, enclos): object 'tc_cf' not found
tc_biopsies <- set_expt_conditions(
  tc_biopsies, fact = tc_cf, colors = color_choices[["clinic_cf"]]) %>%
  set_expt_batches(fact = "visitnumber")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'pData': error in evaluating the argument 'object' in selecting a method for function 'pData': object 'tc_biopsies' not found
save(list = "tc_biopsies", file = glue("rda/tmrc3_tc_biopsies-v{ver}.rda"))
## Error in save(list = "tc_biopsies", file = glue("rda/tmrc3_tc_biopsies-v{ver}.rda")): object 'tc_biopsies' not found
data_structures <- c(data_structures, "tc_biopsies")

10.5 Subset: Neutrophils by clinic

Followed by the Neutrophils…

clinic_cf <- paste0(pData(tc_neutrophils)[["clinic"]], "_",
                    pData(tc_neutrophils)[["finaloutcome"]])
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'pData': object 'tc_neutrophils' not found
table(clinic_cf)
## Error in eval(expr, envir, enclos): object 'clinic_cf' not found
tc_neutrophils <- set_expt_conditions(
  tc_neutrophils, fact = clinic_cf, colors = color_choices[["clinic_cf"]]) %>%
  set_expt_batches(fact = "visitnumber")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'pData': error in evaluating the argument 'object' in selecting a method for function 'pData': object 'tc_neutrophils' not found
save(list = "tc_neutrophils", file = glue("rda/tmrc3_tc_neutrophils-v{ver}.rda"))
## Error in save(list = "tc_neutrophils", file = glue("rda/tmrc3_tc_neutrophils-v{ver}.rda")): object 'tc_neutrophils' not found
data_structures <- c(data_structures, "tc_neutrophils")

tcv1_neutrophils <- subset_expt(tc_neutrophils, subset = "visitnumber=='1'")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'subset_expt': object 'tc_neutrophils' not found
save(list = "tcv1_neutrophils", file = glue("rda/tmrc3_tcv1_neutrophils-v{ver}.rda"))
## Error in save(list = "tcv1_neutrophils", file = glue("rda/tmrc3_tcv1_neutrophils-v{ver}.rda")): object 'tcv1_neutrophils' not found
data_structures <- c(data_structures, "tcv1_neutrophils")
tcv2_neutrophils <- subset_expt(tc_neutrophils, subset = "visitnumber=='2'")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'subset_expt': object 'tc_neutrophils' not found
save(list = "tcv2_neutrophils", file = glue("rda/tmrc3_tcv2_neutrophils-v{ver}.rda"))
## Error in save(list = "tcv2_neutrophils", file = glue("rda/tmrc3_tcv2_neutrophils-v{ver}.rda")): object 'tcv2_neutrophils' not found
data_structures <- c(data_structures, "tcv2_neutrophils")
tcv3_neutrophils <- subset_expt(tc_neutrophils, subset = "visitnumber=='3'")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'subset_expt': object 'tc_neutrophils' not found
save(list = "tcv3_neutrophils", file = glue("rda/tmrc3_tcv3_neutrophils-v{ver}.rda"))
## Error in save(list = "tcv3_neutrophils", file = glue("rda/tmrc3_tcv3_neutrophils-v{ver}.rda")): object 'tcv3_neutrophils' not found
data_structures <- c(data_structures, "tcv3_neutrophils")

10.6 By sex

tc_sex <- set_expt_conditions(tc_valid, fact = "sex", colors = color_choices[["sex"]])
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'pData': object 'tc_valid' not found
save(list = "tc_sex", file = glue("rda/tmrc3_tc_sex-v{ver}.rda"))
## Error in save(list = "tc_sex", file = glue("rda/tmrc3_tc_sex-v{ver}.rda")): object 'tc_sex' not found
data_structures <- c(data_structures, "tc_sex")

11 Dataset: Only Tumaco samples

Our recent discussions have settled one big question regarding which samples to use: We will limit our analyses to only those samples from Tumaco.

The following block will therefore set that group as our default for future analyses. We will essentially repeat all of the above sample separations for the Tumaco-only cohort.

11.1 All cell types

t_clinical <- tc_clinical %>%
  subset_expt(subset = "clinic=='tumaco'")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'subset_expt': object 'tc_clinical' not found
save(list = "t_clinical", file = glue("rda/tmrc3_t_clinical-v{ver}.rda"))
## Error in save(list = "t_clinical", file = glue("rda/tmrc3_t_clinical-v{ver}.rda")): object 't_clinical' not found
data_structures <- c(data_structures, "t_clinical")

cpm_data <- normalize_expt(t_clinical, convert = "cpm")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'normalize_expt': object 't_clinical' not found
t_clinical_cpm_variance <- variance_expt(cpm_data)
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'normalize_expt': object 'cpm_data' not found
## Add variance by gene for all samples excluding biopsies (I assume also excluding Cali).
## This is intended to address a query from Maria Adelaida on 20230111

11.1.1 Write out the Tumaco Clinical with variance

written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("cpm/4_Tumaco/t_clinical-v{ver}.xlsx"))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'data' in selecting a method for function 'write_xlsx': error in evaluating the argument 'object' in selecting a method for function 'exprs': object 'cpm_data' not found
rpkm_data <- normalize_expt(t_clinical, filter = TRUE, convert = "rpkm",
                            na_to_zero = TRUE, column = "mean_cds_len")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'normalize_expt': object 't_clinical' not found
write.csv(x = as.data.frame(exprs(rpkm_data)),
                 file = glue("rpkm/t_clinical-v{ver}.csv"))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'x' in selecting a method for function 'as.data.frame': error in evaluating the argument 'object' in selecting a method for function 'exprs': object 'rpkm_data' not found
cpm_data <- normalize_expt(t_clinical, convert = "cpm", filter = TRUE, batch = "svaseq")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'normalize_expt': object 't_clinical' not found
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("cpm/4_Tumaco/t_clinical_sva-v{ver}.xlsx"))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'data' in selecting a method for function 'write_xlsx': error in evaluating the argument 'object' in selecting a method for function 'exprs': object 'cpm_data' not found
rpkm_data <- normalize_expt(t_clinical, filter = TRUE, batch = "svaseq") %>%
  normalize_expt(convert = "rpkm", column = "mean_cds_len", na_to_zero = TRUE)
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'normalize_expt': error in evaluating the argument 'expt' in selecting a method for function 'normalize_expt': object 't_clinical' not found
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("rpkm/t_clinical_sva-v{ver}.csv"))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'x' in selecting a method for function 'as.data.frame': error in evaluating the argument 'object' in selecting a method for function 'exprs': object 'rpkm_data' not found

12 Perform write_expt on the Tumaco clinical samples

written_expt <- write_expt(
    t_clinical,
    excel = glue("excel/t_clinical-v{ver}.xlsx"))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'exprs': object 't_clinical' not found

12.1 Without biopsies

dir.create("cpm/4_Tumaco", recursive = TRUE)
t_clinical_nobiop <- subset_expt(t_clinical, subset = "typeofcells!='biopsy'")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'subset_expt': object 't_clinical' not found
save(list = "t_clinical_nobiop", file = glue("rda/tmrc3_t_clinical_nobiop-v{ver}.rda"))
## Error in save(list = "t_clinical_nobiop", file = glue("rda/tmrc3_t_clinical_nobiop-v{ver}.rda")): object 't_clinical_nobiop' not found
data_structures <- c(data_structures, "t_clinical_nobiop")

cpm_data <- normalize_expt(t_clinical_nobiop, convert = "cpm")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'normalize_expt': object 't_clinical_nobiop' not found
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("cpm/4_Tumaco/t_clinical_nobiop-v{ver}.xlsx"))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'data' in selecting a method for function 'write_xlsx': error in evaluating the argument 'object' in selecting a method for function 'exprs': object 'cpm_data' not found
rpkm_data <- normalize_expt(t_clinical, filter = TRUE, batch = "svaseq") %>%
  normalize_expt(convert = "rpkm", column = "mean_cds_len", na_to_zero = TRUE)
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'normalize_expt': error in evaluating the argument 'expt' in selecting a method for function 'normalize_expt': object 't_clinical' not found
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("rpkm/t_clinical_sva-v{ver}.csv"))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'x' in selecting a method for function 'as.data.frame': error in evaluating the argument 'object' in selecting a method for function 'exprs': object 'rpkm_data' not found
cpm_data <- normalize_expt(t_clinical_nobiop, convert = "cpm",
                           filter = TRUE, batch = "svaseq")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'normalize_expt': object 't_clinical_nobiop' not found
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("cpm/4_Tumaco/t_clinical_nobiop_sva-v{ver}.xlsx"))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'data' in selecting a method for function 'write_xlsx': error in evaluating the argument 'object' in selecting a method for function 'exprs': object 'cpm_data' not found
rpkm_data <- normalize_expt(t_clinical_nobiop, filter = TRUE, batch = "svaseq") %>%
  normalize_expt(convert = "rpkm", column = "mean_cds_len", na_to_zero = TRUE)
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'normalize_expt': error in evaluating the argument 'expt' in selecting a method for function 'normalize_expt': object 't_clinical_nobiop' not found
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("rpkm/t_clinical_nobiop_sva-v{ver}.csv"))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'x' in selecting a method for function 'as.data.frame': error in evaluating the argument 'object' in selecting a method for function 'exprs': object 'rpkm_data' not found

12.1.1 Pull out the top-n most variant genes

I added a few columns to the gene annotations reflecting the variance/stdev/mean expression of each gene. This really highlights the extraordinary degree to which genes are changing in the data…

top_expt <- normalize_expt(t_clinical_cpm_variance, filter = TRUE) %>%
  variance_expt()
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'normalize_expt': error in evaluating the argument 'expt' in selecting a method for function 'normalize_expt': object 't_clinical_cpm_variance' not found
top_fd <- fData(top_expt)
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'fData': object 'top_expt' not found
top_ex <- exprs(top_expt)
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'exprs': object 'top_expt' not found
idx <- order(top_fd[["exprs_gene_stdev"]], decreasing = TRUE)
## Error in eval(expr, envir, enclos): object 'top_fd' not found
top_df <- top_fd[idx, ]
## Error in eval(expr, envir, enclos): object 'top_fd' not found
written <- write_xlsx(
    data = head(top_fd, n = 100),
    excel = glue("excel/t_clinical_cpm_stdev_top100-v{ver}.xlsx"))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'data' in selecting a method for function 'write_xlsx': error in evaluating the argument 'x' in selecting a method for function 'head': object 'top_fd' not found
bottom_expt <- normalize_expt(t_clinical_cpm_variance, filter = "simple", threshold = 500) %>%
  variance_expt()
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'normalize_expt': error in evaluating the argument 'expt' in selecting a method for function 'normalize_expt': object 't_clinical_cpm_variance' not found
bottom_fd <- fData(bottom_expt)
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'fData': object 'bottom_expt' not found
bottom_ex <- exprs(bottom_expt)
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'exprs': object 'bottom_expt' not found
idx <- order(bottom_fd[["exprs_gene_stdev"]])
## Error in eval(expr, envir, enclos): object 'bottom_fd' not found
bottom <- bottom_fd[idx, ]
## Error in eval(expr, envir, enclos): object 'bottom_fd' not found
written <- write_xlsx(
    data = head(bottom_fd, n = 100),
    excel = glue("excel/t_clinical_cpm_stdev_bottom100-v{ver}.xlsx"))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'data' in selecting a method for function 'write_xlsx': error in evaluating the argument 'x' in selecting a method for function 'head': object 'bottom_fd' not found

12.2 Summarize: Collect Tumaco sample numbers.

At least in theory, everything which follows will be using the above ‘clinical’ data structure. Thus, let us count it up and get a sense of what we will work with.

table(pData(t_clinical)[["drug"]])
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'pData': object 't_clinical' not found
table(pData(t_clinical)[["clinic"]])
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'pData': object 't_clinical' not found
table(pData(t_clinical)[["finaloutcome"]])
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'pData': object 't_clinical' not found
table(pData(t_clinical)[["typeofcells"]])
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'pData': object 't_clinical' not found
table(pData(t_clinical)[["visitnumber"]])
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'pData': object 't_clinical' not found
summary(pData(t_clinical)[["Evolution_Time"]])
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'summary': error in evaluating the argument 'object' in selecting a method for function 'pData': object 't_clinical' not found
summary(pData(t_clinical)[["Prescribed_Daily_Dose_Gluc"]])
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'summary': error in evaluating the argument 'object' in selecting a method for function 'pData': object 't_clinical' not found
summary(pData(t_clinical)[["V3_Vertical_Axis_Lesion"]])
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'summary': error in evaluating the argument 'object' in selecting a method for function 'pData': object 't_clinical' not found
summary(pData(t_clinical)[["V3_Total_Area_Lesion"]])
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'summary': error in evaluating the argument 'object' in selecting a method for function 'pData': object 't_clinical' not found
summary(pData(t_clinical)[["V3_Horizontal_Axis_Ulcer"]])
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'summary': error in evaluating the argument 'object' in selecting a method for function 'pData': object 't_clinical' not found
table(pData(t_clinical)[["Sex"]])
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'pData': object 't_clinical' not found
table(pData(t_clinical)[["Ethnicity"]])
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'pData': object 't_clinical' not found
summary(pData(t_clinical)[["Age"]])
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'summary': error in evaluating the argument 'object' in selecting a method for function 'pData': object 't_clinical' not found
summary(pData(t_clinical)[["Weight"]])
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'summary': error in evaluating the argument 'object' in selecting a method for function 'pData': object 't_clinical' not found
table(pData(t_clinical)[["Height"]])
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'pData': object 't_clinical' not found
length(unique(pData(t_clinical)[["Patient_ID"]]))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'x' in selecting a method for function 'unique': error in evaluating the argument 'object' in selecting a method for function 'pData': object 't_clinical' not found
only_cure <- pData(t_clinical)[["finaloutcome"]] == "cure"
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'pData': object 't_clinical' not found
c_meta <- pData(t_clinical)[only_cure, ]
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'pData': object 't_clinical' not found
length(unique(c_meta[["Patient_ID"]]))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'x' in selecting a method for function 'unique': object 'c_meta' not found
only_fail <- pData(t_clinical)[["finaloutcome"]] == "failure"
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'pData': object 't_clinical' not found
f_meta <- pData(t_clinical)[only_fail, ]
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'pData': object 't_clinical' not found
length(unique(f_meta[["Patient_ID"]]))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'x' in selecting a method for function 'unique': object 'f_meta' not found

12.3 Split the data by cure/fail for some counting

t_cure <- subset_expt(t_clinical, subset = "finaloutcome=='cure'")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'subset_expt': object 't_clinical' not found
table(pData(t_cure)$visitnumber)
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'pData': object 't_cure' not found
t_fail <- subset_expt(t_clinical, subset = "finaloutcome=='failure'")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'subset_expt': object 't_clinical' not found
table(pData(t_fail)$visitnumber)
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'pData': object 't_fail' not found

12.4 Subset: Create Tumaco-only and cell-type specific data

I previously made a bunch of data subsets by visit, cell type, etc. So let us overwrite them all with versions which contain only the Tumaco samples.

12.4.1 Tumaco biopsies

The is a copy of the cell type extractions above, except we lead off with the removal of the Cali samples.

t_biopsies <- tc_biopsies %>%
  subset_expt(subset = "clinic=='tumaco'")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'subset_expt': object 'tc_biopsies' not found
save(list = "t_biopsies", file = glue("rda/tmrc3_t_biopsies-v{ver}.rda"))
## Error in save(list = "t_biopsies", file = glue("rda/tmrc3_t_biopsies-v{ver}.rda")): object 't_biopsies' not found
data_structures <- c(data_structures, "t_biopsies")

cpm_data <- normalize_expt(t_biopsies, convert = "cpm")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'normalize_expt': object 't_biopsies' not found
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("cpm/4_Tumaco/t_biopsies-v{ver}.xlsx"))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'data' in selecting a method for function 'write_xlsx': error in evaluating the argument 'object' in selecting a method for function 'exprs': object 'cpm_data' not found
rpkm_data <- normalize_expt(t_biopsies, filter = TRUE, convert = "rpkm",
                            na_to_zero = TRUE, column = "mean_cds_len")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'normalize_expt': object 't_biopsies' not found
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("rpkm/t_biopsies-v{ver}.csv"))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'x' in selecting a method for function 'as.data.frame': error in evaluating the argument 'object' in selecting a method for function 'exprs': object 'rpkm_data' not found
cpm_data <- normalize_expt(t_biopsies, convert = "cpm", filter = TRUE, batch = "svaseq")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'normalize_expt': object 't_biopsies' not found
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("cpm/4_Tumaco/t_biopsies_sva-v{ver}.xlsx"))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'data' in selecting a method for function 'write_xlsx': error in evaluating the argument 'object' in selecting a method for function 'exprs': object 'cpm_data' not found

12.4.2 Tumaco Eosinophils

t_eosinophils <- tc_eosinophils %>%
  subset_expt(subset = "clinic=='tumaco'")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'subset_expt': object 'tc_eosinophils' not found
save(list = "t_eosinophils", file = glue("rda/tmrc3_t_eosinophils-v{ver}.rda"))
## Error in save(list = "t_eosinophils", file = glue("rda/tmrc3_t_eosinophils-v{ver}.rda")): object 't_eosinophils' not found
data_structures <- c(data_structures, "t_eosinophils")

cpm_data <- normalize_expt(t_eosinophils, convert = "cpm")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'normalize_expt': object 't_eosinophils' not found
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("cpm/4_Tumaco/t_eosinophils-v{ver}.xlsx"))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'data' in selecting a method for function 'write_xlsx': error in evaluating the argument 'object' in selecting a method for function 'exprs': object 'cpm_data' not found
cpm_data <- normalize_expt(t_eosinophils, convert = "cpm", filter = TRUE, batch = "svaseq")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'normalize_expt': object 't_eosinophils' not found
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("cpm/4_Tumaco/t_eosinophils_sva-v{ver}.xlsx"))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'data' in selecting a method for function 'write_xlsx': error in evaluating the argument 'object' in selecting a method for function 'exprs': object 'cpm_data' not found
rpkm_data <- normalize_expt(t_eosinophils, filter = TRUE, batch = "svaseq") %>%
  normalize_expt(convert = "rpkm", column = "mean_cds_len", na_to_zero = TRUE)
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'normalize_expt': error in evaluating the argument 'expt' in selecting a method for function 'normalize_expt': object 't_eosinophils' not found
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("rpkm/t_eosinophils_sva-v{ver}.csv"))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'x' in selecting a method for function 'as.data.frame': error in evaluating the argument 'object' in selecting a method for function 'exprs': object 'rpkm_data' not found

12.4.3 Tumaco subsets monocytes

t_monocytes <- tc_monocytes %>%
  subset_expt(subset = "clinic=='tumaco'")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'subset_expt': object 'tc_monocytes' not found
save(list = "t_monocytes", file = glue("rda/tmrc3_t_monocytes-v{ver}.rda"))
## Error in save(list = "t_monocytes", file = glue("rda/tmrc3_t_monocytes-v{ver}.rda")): object 't_monocytes' not found
data_structures <- c(data_structures, "t_monocytes")

cpm_data <- normalize_expt(t_monocytes, convert = "cpm")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'normalize_expt': object 't_monocytes' not found
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("cpm/4_Tumaco/t_monocytes-v{ver}.xlsx"))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'data' in selecting a method for function 'write_xlsx': error in evaluating the argument 'object' in selecting a method for function 'exprs': object 'cpm_data' not found
rpkm_data <- normalize_expt(t_monocytes, filter = TRUE, convert = "rpkm",
                            na_to_zero = TRUE, column = "mean_cds_len")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'normalize_expt': object 't_monocytes' not found
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("rpkm/t_monocytes-v{ver}.csv"))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'x' in selecting a method for function 'as.data.frame': error in evaluating the argument 'object' in selecting a method for function 'exprs': object 'rpkm_data' not found
cpm_data <- normalize_expt(t_monocytes, convert = "cpm", filter = TRUE, batch = "svaseq")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'normalize_expt': object 't_monocytes' not found
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("cpm/4_Tumaco/t_monocytes_sva-v{ver}.xlsx"))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'data' in selecting a method for function 'write_xlsx': error in evaluating the argument 'object' in selecting a method for function 'exprs': object 'cpm_data' not found
rpkm_data <- normalize_expt(t_monocytes, filter = TRUE, batch = "svaseq") %>%
  normalize_expt(convert = "rpkm", column = "mean_cds_len", na_to_zero = TRUE)
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'normalize_expt': error in evaluating the argument 'expt' in selecting a method for function 'normalize_expt': object 't_monocytes' not found
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("rpkm/t_monocytes_sva-v{ver}.csv"))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'x' in selecting a method for function 'as.data.frame': error in evaluating the argument 'object' in selecting a method for function 'exprs': object 'rpkm_data' not found

12.4.4 Tumaco subsets neutrophils

t_neutrophils <- tc_neutrophils %>%
  subset_expt(subset = "clinic=='tumaco'")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'subset_expt': object 'tc_neutrophils' not found
save(list = "t_neutrophils", file = glue("rda/tmrc3_t_neutrophils-v{ver}.rda"))
## Error in save(list = "t_neutrophils", file = glue("rda/tmrc3_t_neutrophils-v{ver}.rda")): object 't_neutrophils' not found
data_structures <- c(data_structures, "t_neutrophils")

cpm_data <- normalize_expt(t_neutrophils, convert = "cpm")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'normalize_expt': object 't_neutrophils' not found
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("cpm/4_Tumaco/t_neutrophils-v{ver}.xlsx"))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'data' in selecting a method for function 'write_xlsx': error in evaluating the argument 'object' in selecting a method for function 'exprs': object 'cpm_data' not found
rpkm_data <- normalize_expt(t_neutrophils, filter = TRUE, convert = "rpkm",
                            na_to_zero = TRUE, column = "mean_cds_len")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'normalize_expt': object 't_neutrophils' not found
write.csv(x = as.data.frame(exprs(rpkm_data)),
                 file = glue("rpkm/t_neutrophils-v{ver}.csv"))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'x' in selecting a method for function 'as.data.frame': error in evaluating the argument 'object' in selecting a method for function 'exprs': object 'rpkm_data' not found
cpm_data <- normalize_expt(t_neutrophils, convert = "cpm", filter = TRUE, batch = "svaseq")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'normalize_expt': object 't_neutrophils' not found
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("cpm/4_Tumaco/t_neutrophils_sva-v{ver}.xlsx"))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'data' in selecting a method for function 'write_xlsx': error in evaluating the argument 'object' in selecting a method for function 'exprs': object 'cpm_data' not found
rpkm_data <- normalize_expt(t_neutrophils, filter = TRUE, batch = "svaseq") %>%
  normalize_expt(convert = "rpkm", column = "mean_cds_len", na_to_zero = TRUE)
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'normalize_expt': error in evaluating the argument 'expt' in selecting a method for function 'normalize_expt': object 't_neutrophils' not found
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("rpkm/t_neutrophils_sva-v{ver}.csv"))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'x' in selecting a method for function 'as.data.frame': error in evaluating the argument 'object' in selecting a method for function 'exprs': object 'rpkm_data' not found

12.4.5 Tumaco Visit 1 samples

tv1_samples <- tcv1_samples %>%
  subset_expt(subset = "clinic=='tumaco'")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'subset_expt': object 'tcv1_samples' not found
save(list = "tv1_samples", file = glue("rda/tmrc3_tv1_samples-v{ver}.rda"))
## Error in save(list = "tv1_samples", file = glue("rda/tmrc3_tv1_samples-v{ver}.rda")): object 'tv1_samples' not found
data_structures <- c(data_structures, "tv1_samples")

cpm_data <- normalize_expt(tv1_samples, convert = "cpm")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'normalize_expt': object 'tv1_samples' not found
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("cpm/4_Tumaco/tv1_samples-v{ver}.xlsx"))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'data' in selecting a method for function 'write_xlsx': error in evaluating the argument 'object' in selecting a method for function 'exprs': object 'cpm_data' not found
rpkm_data <- normalize_expt(tv1_samples, filter = TRUE, convert = "rpkm",
                            na_to_zero = TRUE, column = "mean_cds_len")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'normalize_expt': object 'tv1_samples' not found
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("rpkm/tv1_samples-v{ver}.csv"))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'x' in selecting a method for function 'as.data.frame': error in evaluating the argument 'object' in selecting a method for function 'exprs': object 'rpkm_data' not found
cpm_data <- normalize_expt(tv1_samples, convert="cpm", filter=TRUE, batch="svaseq")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'normalize_expt': object 'tv1_samples' not found
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("cpm/4_Tumaco/tv1_samples_sva-v{ver}.xlsx"))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'data' in selecting a method for function 'write_xlsx': error in evaluating the argument 'object' in selecting a method for function 'exprs': object 'cpm_data' not found
rpkm_data <- normalize_expt(tv1_samples, filter = TRUE, batch = "svaseq") %>%
  normalize_expt(convert = "rpkm", column = "mean_cds_len", na_to_zero = TRUE)
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'normalize_expt': error in evaluating the argument 'expt' in selecting a method for function 'normalize_expt': object 'tv1_samples' not found
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("rpkm/tv1_samples_sva-v{ver}.csv"))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'x' in selecting a method for function 'as.data.frame': error in evaluating the argument 'object' in selecting a method for function 'exprs': object 'rpkm_data' not found

12.4.6 Tumaco Visit 2 samples

tv2_samples <- tcv2_samples %>%
  subset_expt(subset = "clinic=='tumaco'")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'subset_expt': object 'tcv2_samples' not found
save(list = "tv2_samples", file = glue("rda/tmrc3_tv2_samples-v{ver}.rda"))
## Error in save(list = "tv2_samples", file = glue("rda/tmrc3_tv2_samples-v{ver}.rda")): object 'tv2_samples' not found
data_structures <- c(data_structures, "tv2_samples")

cpm_data <- normalize_expt(tv2_samples, convert = "cpm")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'normalize_expt': object 'tv2_samples' not found
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("cpm/4_Tumaco/tv2_samples-v{ver}.xlsx"))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'data' in selecting a method for function 'write_xlsx': error in evaluating the argument 'object' in selecting a method for function 'exprs': object 'cpm_data' not found
rpkm_data <- normalize_expt(tv2_samples, filter = TRUE, convert = "rpkm",
                            na_to_zero = TRUE, column = "mean_cds_len")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'normalize_expt': object 'tv2_samples' not found
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("rpkm/tv2_samples-v{ver}.csv"))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'x' in selecting a method for function 'as.data.frame': error in evaluating the argument 'object' in selecting a method for function 'exprs': object 'rpkm_data' not found
cpm_data <- normalize_expt(tv2_samples, convert = "cpm", filter = TRUE, batch = "svaseq")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'normalize_expt': object 'tv2_samples' not found
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("cpm/4_Tumaco/tv2_samples_sva-v{ver}.xlsx"))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'data' in selecting a method for function 'write_xlsx': error in evaluating the argument 'object' in selecting a method for function 'exprs': object 'cpm_data' not found
rpkm_data <- normalize_expt(tv2_samples, filter = TRUE, batch = "svaseq") %>%
  normalize_expt(convert = "rpkm", column = "mean_cds_len", na_to_zero = TRUE)
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'normalize_expt': error in evaluating the argument 'expt' in selecting a method for function 'normalize_expt': object 'tv2_samples' not found
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("rpkm/tv2_samples_sva-v{ver}.csv"))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'x' in selecting a method for function 'as.data.frame': error in evaluating the argument 'object' in selecting a method for function 'exprs': object 'rpkm_data' not found

12.4.7 Tumaco visit 3 samples

tv3_samples <- tcv3_samples %>%
  subset_expt(subset = "clinic=='tumaco'")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'subset_expt': object 'tcv3_samples' not found
save(list = "tv3_samples", file = glue("rda/tmrc3_tv3_samples-v{ver}.rda"))
## Error in save(list = "tv3_samples", file = glue("rda/tmrc3_tv3_samples-v{ver}.rda")): object 'tv3_samples' not found
data_structures <- c(data_structures, "tv3_samples")

cpm_data <- normalize_expt(tv3_samples, convert = "cpm")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'normalize_expt': object 'tv3_samples' not found
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("cpm/4_Tumaco/tv3_samples-v{ver}.xlsx"))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'data' in selecting a method for function 'write_xlsx': error in evaluating the argument 'object' in selecting a method for function 'exprs': object 'cpm_data' not found
rpkm_data <- normalize_expt(tv3_samples, filter = TRUE, convert = "rpkm",
                            na_to_zero = TRUE, column = "mean_cds_len")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'normalize_expt': object 'tv3_samples' not found
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("rpkm/tv3_samples-v{ver}.csv"))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'x' in selecting a method for function 'as.data.frame': error in evaluating the argument 'object' in selecting a method for function 'exprs': object 'rpkm_data' not found
cpm_data <- normalize_expt(tv3_samples, convert = "cpm", filter = TRUE, batch = "svaseq")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'normalize_expt': object 'tv3_samples' not found
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("cpm/4_Tumaco/tv3_samples_sva-v{ver}.xlsx"))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'data' in selecting a method for function 'write_xlsx': error in evaluating the argument 'object' in selecting a method for function 'exprs': object 'cpm_data' not found
rpkm_data <- normalize_expt(tv3_samples, filter = TRUE, batch = "svaseq") %>%
  normalize_expt(convert = "rpkm", column = "mean_cds_len", na_to_zero = TRUE)
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'normalize_expt': error in evaluating the argument 'expt' in selecting a method for function 'normalize_expt': object 'tv3_samples' not found
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("rpkm/tv3_samples_sva-v{ver}.csv"))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'x' in selecting a method for function 'as.data.frame': error in evaluating the argument 'object' in selecting a method for function 'exprs': object 'rpkm_data' not found

12.4.8 Tumaco visit 1 Eosinophils

tv1_eosinophils <- tcv1_eosinophils %>%
  subset_expt(subset = "clinic=='tumaco'")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'subset_expt': object 'tcv1_eosinophils' not found
save(list = "tv1_eosinophils", file = glue("rda/tmrc3_tv1_eosinophils-v{ver}.rda"))
## Error in save(list = "tv1_eosinophils", file = glue("rda/tmrc3_tv1_eosinophils-v{ver}.rda")): object 'tv1_eosinophils' not found
data_structures <- c(data_structures, "tv1_eosinophils")

cpm_data <- normalize_expt(tv1_eosinophils, convert = "cpm")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'normalize_expt': object 'tv1_eosinophils' not found
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("cpm/4_Tumaco/tv1_eosinophils-v{ver}.xlsx"))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'data' in selecting a method for function 'write_xlsx': error in evaluating the argument 'object' in selecting a method for function 'exprs': object 'cpm_data' not found
rpkm_data <- normalize_expt(tv1_eosinophils, filter = TRUE, convert = "rpkm",
                            na_to_zero = TRUE, column = "mean_cds_len")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'normalize_expt': object 'tv1_eosinophils' not found
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("rpkm/tv1_eosinophils-v{ver}.csv"))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'x' in selecting a method for function 'as.data.frame': error in evaluating the argument 'object' in selecting a method for function 'exprs': object 'rpkm_data' not found
cpm_data <- normalize_expt(tv1_eosinophils, convert = "cpm", filter = TRUE, batch = "svaseq")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'normalize_expt': object 'tv1_eosinophils' not found
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("cpm/4_Tumaco/tv1_eosinophils_sva-v{ver}.xlsx"))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'data' in selecting a method for function 'write_xlsx': error in evaluating the argument 'object' in selecting a method for function 'exprs': object 'cpm_data' not found
rpkm_data <- normalize_expt(tv1_eosinophils, filter = TRUE, batch = "svaseq") %>%
  normalize_expt(convert = "rpkm", column = "mean_cds_len", na_to_zero = TRUE)
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'normalize_expt': error in evaluating the argument 'expt' in selecting a method for function 'normalize_expt': object 'tv1_eosinophils' not found
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("rpkm/tv1_eosinophils_sva-v{ver}.csv"))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'x' in selecting a method for function 'as.data.frame': error in evaluating the argument 'object' in selecting a method for function 'exprs': object 'rpkm_data' not found

12.4.9 Tumaco visit 2 samples

tv2_eosinophils <- tcv2_eosinophils %>%
  subset_expt(subset = "clinic=='tumaco'")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'subset_expt': object 'tcv2_eosinophils' not found
save(list = "tv2_eosinophils", file = glue("rda/tmrc3_tv2_eosinophils-v{ver}.rda"))
## Error in save(list = "tv2_eosinophils", file = glue("rda/tmrc3_tv2_eosinophils-v{ver}.rda")): object 'tv2_eosinophils' not found
data_structures <- c(data_structures, "tv2_eosinophils")

cpm_data <- normalize_expt(tv2_eosinophils, convert = "cpm")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'normalize_expt': object 'tv2_eosinophils' not found
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("cpm/4_Tumaco/tv2_eosinophils-v{ver}.xlsx"))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'data' in selecting a method for function 'write_xlsx': error in evaluating the argument 'object' in selecting a method for function 'exprs': object 'cpm_data' not found
rpkm_data <- normalize_expt(tv2_eosinophils, filter = TRUE, convert = "rpkm",
                            na_to_zero = TRUE, column = "mean_cds_len")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'normalize_expt': object 'tv2_eosinophils' not found
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("rpkm/tv2_eosinophils-v{ver}.csv"))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'x' in selecting a method for function 'as.data.frame': error in evaluating the argument 'object' in selecting a method for function 'exprs': object 'rpkm_data' not found
cpm_data <- normalize_expt(tv2_eosinophils, convert = "cpm", filter = TRUE, batch = "svaseq")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'normalize_expt': object 'tv2_eosinophils' not found
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("cpm/4_Tumaco/tv2_eosinophils_sva-v{ver}.xlsx"))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'data' in selecting a method for function 'write_xlsx': error in evaluating the argument 'object' in selecting a method for function 'exprs': object 'cpm_data' not found
rpkm_data <- normalize_expt(tv2_eosinophils, filter = TRUE, batch = "svaseq") %>%
  normalize_expt(convert = "rpkm", column = "mean_cds_len", na_to_zero = TRUE)
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'normalize_expt': error in evaluating the argument 'expt' in selecting a method for function 'normalize_expt': object 'tv2_eosinophils' not found
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("rpkm/tv2_eosinophils_sva-v{ver}.csv"))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'x' in selecting a method for function 'as.data.frame': error in evaluating the argument 'object' in selecting a method for function 'exprs': object 'rpkm_data' not found

12.4.10 Tumaco visit 3 eosinophil

tv3_eosinophils <- tcv3_eosinophils %>%
  subset_expt(subset = "clinic=='tumaco'")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'subset_expt': object 'tcv3_eosinophils' not found
save(list = "tv3_eosinophils", file = glue("rda/tmrc3_tv3_eosinophils-v{ver}.rda"))
## Error in save(list = "tv3_eosinophils", file = glue("rda/tmrc3_tv3_eosinophils-v{ver}.rda")): object 'tv3_eosinophils' not found
data_structures <- c(data_structures, "tv3_eosinophils")

cpm_data <- normalize_expt(tv3_eosinophils, convert = "cpm")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'normalize_expt': object 'tv3_eosinophils' not found
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("cpm/4_Tumaco/tv3_eosinophils-v{ver}.xlsx"))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'data' in selecting a method for function 'write_xlsx': error in evaluating the argument 'object' in selecting a method for function 'exprs': object 'cpm_data' not found
rpkm_data <- normalize_expt(tv3_eosinophils, filter = TRUE, convert = "rpkm",
                            na_to_zero = TRUE, column = "mean_cds_len")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'normalize_expt': object 'tv3_eosinophils' not found
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("rpkm/tv3_eosinophils-v{ver}.csv"))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'x' in selecting a method for function 'as.data.frame': error in evaluating the argument 'object' in selecting a method for function 'exprs': object 'rpkm_data' not found
cpm_data <- normalize_expt(tv3_eosinophils, convert = "cpm", filter = TRUE, batch = "svaseq")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'normalize_expt': object 'tv3_eosinophils' not found
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("cpm/4_Tumaco/tv3_eosinophils_sva-v{ver}.xlsx"))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'data' in selecting a method for function 'write_xlsx': error in evaluating the argument 'object' in selecting a method for function 'exprs': object 'cpm_data' not found
## Note, the cbcb filter left behind a sufficient number of zeros that it confused cpm.
rpkm_data <- normalize_expt(tv3_eosinophils, filter = "simple", batch = "svaseq") %>%
  normalize_expt(convert = "rpkm", column = "mean_cds_len", na_to_zero = TRUE)
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'normalize_expt': error in evaluating the argument 'expt' in selecting a method for function 'normalize_expt': object 'tv3_eosinophils' not found
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("rpkm/tv3_eosinophils_sva-v{ver}.csv"))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'x' in selecting a method for function 'as.data.frame': error in evaluating the argument 'object' in selecting a method for function 'exprs': object 'rpkm_data' not found

12.4.11 Tumaco visit 1 monocytes

tv1_monocytes <- tcv1_monocytes %>%
  subset_expt(subset = "clinic=='tumaco'")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'subset_expt': object 'tcv1_monocytes' not found
save(list = "tv1_monocytes", file = glue("rda/tmrc3_tv1_monocytes-v{ver}.rda"))
## Error in save(list = "tv1_monocytes", file = glue("rda/tmrc3_tv1_monocytes-v{ver}.rda")): object 'tv1_monocytes' not found
data_structures <- c(data_structures, "tv1_monocytes")

cpm_data <- normalize_expt(tv1_monocytes, convert = "cpm")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'normalize_expt': object 'tv1_monocytes' not found
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("cpm/4_Tumaco/tv1_monocytes-v{ver}.xlsx"))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'data' in selecting a method for function 'write_xlsx': error in evaluating the argument 'object' in selecting a method for function 'exprs': object 'cpm_data' not found
rpkm_data <- normalize_expt(tv1_monocytes, filter = TRUE, convert = "rpkm",
                            na_to_zero = TRUE, column = "mean_cds_len")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'normalize_expt': object 'tv1_monocytes' not found
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("rpkm/tv1_monocytes-v{ver}.csv"))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'x' in selecting a method for function 'as.data.frame': error in evaluating the argument 'object' in selecting a method for function 'exprs': object 'rpkm_data' not found
cpm_data <- normalize_expt(tv1_monocytes, convert="cpm", filter=TRUE, batch="svaseq")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'normalize_expt': object 'tv1_monocytes' not found
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("cpm/4_Tumaco/tv1_monocytes_sva-v{ver}.xlsx"))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'data' in selecting a method for function 'write_xlsx': error in evaluating the argument 'object' in selecting a method for function 'exprs': object 'cpm_data' not found
rpkm_data <- normalize_expt(tv1_monocytes, filter = TRUE, batch = "svaseq") %>%
  normalize_expt(convert = "rpkm", column = "mean_cds_len", na_to_zero = TRUE)
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'normalize_expt': error in evaluating the argument 'expt' in selecting a method for function 'normalize_expt': object 'tv1_monocytes' not found
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("rpkm/tv1_monocytes_sva-v{ver}.csv"))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'x' in selecting a method for function 'as.data.frame': error in evaluating the argument 'object' in selecting a method for function 'exprs': object 'rpkm_data' not found

12.4.12 Tumaco visit 2 monocytes

tv2_monocytes <- tcv2_monocytes %>%
  subset_expt(subset = "clinic=='tumaco'")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'subset_expt': object 'tcv2_monocytes' not found
save(list = "tv2_monocytes", file = glue("rda/tmrc3_tv2_monocytes-v{ver}.rda"))
## Error in save(list = "tv2_monocytes", file = glue("rda/tmrc3_tv2_monocytes-v{ver}.rda")): object 'tv2_monocytes' not found
data_structures <- c(data_structures, "tv2_monocytes")

cpm_data <- normalize_expt(tv2_monocytes, convert = "cpm")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'normalize_expt': object 'tv2_monocytes' not found
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("cpm/4_Tumaco/tv2_monocytes-v{ver}.xlsx"))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'data' in selecting a method for function 'write_xlsx': error in evaluating the argument 'object' in selecting a method for function 'exprs': object 'cpm_data' not found
rpkm_data <- normalize_expt(tv2_monocytes, filter = TRUE, convert = "rpkm",
                            na_to_zero = TRUE, column = "mean_cds_len")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'normalize_expt': object 'tv2_monocytes' not found
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("rpkm/tv2_monocytes-v{ver}.csv"))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'x' in selecting a method for function 'as.data.frame': error in evaluating the argument 'object' in selecting a method for function 'exprs': object 'rpkm_data' not found
cpm_data <- normalize_expt(tv2_monocytes, convert = "cpm", filter = TRUE, batch = "svaseq")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'normalize_expt': object 'tv2_monocytes' not found
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("cpm/4_Tumaco/tv2_monocytes_sva-v{ver}.xlsx"))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'data' in selecting a method for function 'write_xlsx': error in evaluating the argument 'object' in selecting a method for function 'exprs': object 'cpm_data' not found
rpkm_data <- normalize_expt(tv2_monocytes, filter = TRUE, batch = "svaseq") %>%
  normalize_expt(convert = "rpkm", column = "mean_cds_len", na_to_zero = TRUE)
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'normalize_expt': error in evaluating the argument 'expt' in selecting a method for function 'normalize_expt': object 'tv2_monocytes' not found
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("rpkm/tv2_monocytes_sva-v{ver}.csv"))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'x' in selecting a method for function 'as.data.frame': error in evaluating the argument 'object' in selecting a method for function 'exprs': object 'rpkm_data' not found

12.4.13 Tumaco visit 3 monocytes

tv3_monocytes <- tcv3_monocytes %>%
  subset_expt(subset = "clinic=='tumaco'")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'subset_expt': object 'tcv3_monocytes' not found
save(list = "tv3_monocytes", file = glue("rda/tmrc3_tv3_monocytes-v{ver}.rda"))
## Error in save(list = "tv3_monocytes", file = glue("rda/tmrc3_tv3_monocytes-v{ver}.rda")): object 'tv3_monocytes' not found
data_structures <- c(data_structures, "tv3_monocytes")

cpm_data <- normalize_expt(tv3_monocytes, convert = "cpm")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'normalize_expt': object 'tv3_monocytes' not found
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("cpm/4_Tumaco/tv3_monocytes-v{ver}.xlsx"))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'data' in selecting a method for function 'write_xlsx': error in evaluating the argument 'object' in selecting a method for function 'exprs': object 'cpm_data' not found
rpkm_data <- normalize_expt(tv3_monocytes, filter = TRUE, convert = "rpkm",
                            na_to_zero = TRUE, column = "mean_cds_len")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'normalize_expt': object 'tv3_monocytes' not found
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("rpkm/tv3_monocytes-v{ver}.csv"))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'x' in selecting a method for function 'as.data.frame': error in evaluating the argument 'object' in selecting a method for function 'exprs': object 'rpkm_data' not found
cpm_data <- normalize_expt(tv3_monocytes, convert = "cpm", filter = TRUE, batch = "svaseq")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'normalize_expt': object 'tv3_monocytes' not found
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("cpm/4_Tumaco/tv3_monocytes_sva-v{ver}.xlsx"))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'data' in selecting a method for function 'write_xlsx': error in evaluating the argument 'object' in selecting a method for function 'exprs': object 'cpm_data' not found
rpkm_data <- normalize_expt(tv3_monocytes, filter = TRUE, batch = "svaseq") %>%
  normalize_expt(convert = "rpkm", column = "mean_cds_len", na_to_zero = TRUE)
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'normalize_expt': error in evaluating the argument 'expt' in selecting a method for function 'normalize_expt': object 'tv3_monocytes' not found
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("rpkm/tv3_monocytes_sva-v{ver}.csv"))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'x' in selecting a method for function 'as.data.frame': error in evaluating the argument 'object' in selecting a method for function 'exprs': object 'rpkm_data' not found

12.4.14 Tumaco visit 1 neutrophils

tv1_neutrophils <- tcv1_neutrophils %>%
  subset_expt(subset = "clinic=='tumaco'")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'subset_expt': object 'tcv1_neutrophils' not found
save(list = "tv1_neutrophils", file = glue("rda/tmrc3_tv1_neutrophils-v{ver}.rda"))
## Error in save(list = "tv1_neutrophils", file = glue("rda/tmrc3_tv1_neutrophils-v{ver}.rda")): object 'tv1_neutrophils' not found
data_structures <- c(data_structures, "tv1_neutrophils")

cpm_data <- normalize_expt(tv1_neutrophils, convert = "cpm")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'normalize_expt': object 'tv1_neutrophils' not found
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("cpm/4_Tumaco/tv1_neutrophils-v{ver}.xlsx"))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'data' in selecting a method for function 'write_xlsx': error in evaluating the argument 'object' in selecting a method for function 'exprs': object 'cpm_data' not found
rpkm_data <- normalize_expt(tv1_neutrophils, filter = TRUE, convert = "rpkm",
                            na_to_zero = TRUE, column = "mean_cds_len")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'normalize_expt': object 'tv1_neutrophils' not found
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("rpkm/tv1_neutrophils-v{ver}.csv"))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'x' in selecting a method for function 'as.data.frame': error in evaluating the argument 'object' in selecting a method for function 'exprs': object 'rpkm_data' not found
cpm_data <- normalize_expt(tv1_neutrophils, convert = "cpm", filter = TRUE, batch = "svaseq")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'normalize_expt': object 'tv1_neutrophils' not found
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("cpm/4_Tumaco/tv1_neutrophils_sva-v{ver}.xlsx"))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'data' in selecting a method for function 'write_xlsx': error in evaluating the argument 'object' in selecting a method for function 'exprs': object 'cpm_data' not found
rpkm_data <- normalize_expt(tv1_neutrophils, filter = TRUE, batch = "svaseq") %>%
  normalize_expt(convert = "rpkm", column = "mean_cds_len", na_to_zero = TRUE)
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'normalize_expt': error in evaluating the argument 'expt' in selecting a method for function 'normalize_expt': object 'tv1_neutrophils' not found
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("rpkm/tv1_neutrophils_sva-v{ver}.csv"))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'x' in selecting a method for function 'as.data.frame': error in evaluating the argument 'object' in selecting a method for function 'exprs': object 'rpkm_data' not found

12.4.15 Tumaco visit 2 neutrophils

tv2_neutrophils <- tcv2_neutrophils %>%
  subset_expt(subset = "clinic=='tumaco'")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'subset_expt': object 'tcv2_neutrophils' not found
save(list = "tv2_neutrophils", file = glue("rda/tmrc3_tv2_neutrophils-v{ver}.rda"))
## Error in save(list = "tv2_neutrophils", file = glue("rda/tmrc3_tv2_neutrophils-v{ver}.rda")): object 'tv2_neutrophils' not found
data_structures <- c(data_structures, "tv2_neutrophils")

cpm_data <- normalize_expt(tv2_neutrophils, convert = "cpm")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'normalize_expt': object 'tv2_neutrophils' not found
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("cpm/4_Tumaco/tv2_neutrophils-v{ver}.xlsx"))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'data' in selecting a method for function 'write_xlsx': error in evaluating the argument 'object' in selecting a method for function 'exprs': object 'cpm_data' not found
rpkm_data <- normalize_expt(tv2_neutrophils, filter = TRUE, convert = "rpkm",
                            na_to_zero = TRUE, column = "mean_cds_len")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'normalize_expt': object 'tv2_neutrophils' not found
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("rpkm/tv2_neutrophils-v{ver}.csv"))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'x' in selecting a method for function 'as.data.frame': error in evaluating the argument 'object' in selecting a method for function 'exprs': object 'rpkm_data' not found
cpm_data <- normalize_expt(tv2_neutrophils, convert = "cpm", filter = TRUE, batch = "svaseq")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'normalize_expt': object 'tv2_neutrophils' not found
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("cpm/4_Tumaco/tv2_neutrophils_sva-v{ver}.xlsx"))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'data' in selecting a method for function 'write_xlsx': error in evaluating the argument 'object' in selecting a method for function 'exprs': object 'cpm_data' not found
rpkm_data <- normalize_expt(tv2_neutrophils, filter = TRUE, batch = "svaseq") %>%
  normalize_expt(convert = "rpkm", column = "mean_cds_len", na_to_zero = TRUE)
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'normalize_expt': error in evaluating the argument 'expt' in selecting a method for function 'normalize_expt': object 'tv2_neutrophils' not found
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("rpkm/tv2_neutrophils_sva-v{ver}.csv"))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'x' in selecting a method for function 'as.data.frame': error in evaluating the argument 'object' in selecting a method for function 'exprs': object 'rpkm_data' not found

12.4.16 Tumaco visit 3 neutrophils

tv3_neutrophils <- tcv3_neutrophils %>%
  subset_expt(subset = "clinic=='tumaco'")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'subset_expt': object 'tcv3_neutrophils' not found
save(list = "tv3_neutrophils", file = glue("rda/tmrc3_tv3_neutrophils-v{ver}.rda"))
## Error in save(list = "tv3_neutrophils", file = glue("rda/tmrc3_tv3_neutrophils-v{ver}.rda")): object 'tv3_neutrophils' not found
data_structures <- c(data_structures, "tv3_neutrophils")

cpm_data <- normalize_expt(tv3_neutrophils, convert = "cpm")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'normalize_expt': object 'tv3_neutrophils' not found
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("cpm/4_Tumaco/tv3_neutrophils-v{ver}.xlsx"))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'data' in selecting a method for function 'write_xlsx': error in evaluating the argument 'object' in selecting a method for function 'exprs': object 'cpm_data' not found
rpkm_data <- normalize_expt(tv3_neutrophils, filter = TRUE, convert = "rpkm",
                            na_to_zero = TRUE, column = "mean_cds_len")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'normalize_expt': object 'tv3_neutrophils' not found
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("rpkm/tv3_neutrophils-v{ver}.csv"))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'x' in selecting a method for function 'as.data.frame': error in evaluating the argument 'object' in selecting a method for function 'exprs': object 'rpkm_data' not found
cpm_data <- normalize_expt(tv3_neutrophils, convert = "cpm", filter = TRUE, batch = "svaseq")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'normalize_expt': object 'tv3_neutrophils' not found
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("cpm/4_Tumaco/tv3_neutrophils_sva-v{ver}.xlsx"))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'data' in selecting a method for function 'write_xlsx': error in evaluating the argument 'object' in selecting a method for function 'exprs': object 'cpm_data' not found
rpkm_data <- normalize_expt(tv3_neutrophils, filter = TRUE, batch = "svaseq") %>%
  normalize_expt(convert = "rpkm", column = "mean_cds_len", na_to_zero = TRUE)
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'normalize_expt': error in evaluating the argument 'expt' in selecting a method for function 'normalize_expt': object 'tv3_neutrophils' not found
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("rpkm/tv3_neutrophils_sva-v{ver}.csv"))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'x' in selecting a method for function 'as.data.frame': error in evaluating the argument 'object' in selecting a method for function 'exprs': object 'rpkm_data' not found

13 Dataset: Only Cali samples

Even though we are only considering the Tumaco samples, one might wish to perform comparisons among the Cali samples. The following blocks therefore separate them out in a similar fashion.

dir.create("cpm/4_Cali", recursive = TRUE)
c_clinical <- tc_clinical %>%
  subset_expt(subset = "clinic=='cali'")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'subset_expt': object 'tc_clinical' not found
save(list = "c_clinical", file = glue("rda/tmrc3_c_clinical-v{ver}.rda"))
## Error in save(list = "c_clinical", file = glue("rda/tmrc3_c_clinical-v{ver}.rda")): object 'c_clinical' not found
data_structures <- c(data_structures, "c_clinical")

cpm_data <- normalize_expt(c_clinical, convert = "cpm")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'normalize_expt': object 'c_clinical' not found
c_clinical_cpm_variance <- variance_expt(cpm_data)
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'normalize_expt': object 'cpm_data' not found
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("cpm/4_Cali/c_clinical-v{ver}.xlsx"))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'data' in selecting a method for function 'write_xlsx': error in evaluating the argument 'object' in selecting a method for function 'exprs': object 'cpm_data' not found
rpkm_data <- normalize_expt(c_clinical, filter = TRUE, convert = "rpkm",
                            na_to_zero = TRUE, column = "mean_cds_len")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'normalize_expt': object 'c_clinical' not found
write.csv(x = as.data.frame(exprs(rpkm_data)),
                 file = glue("rpkm/t_clinical-v{ver}.csv"))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'x' in selecting a method for function 'as.data.frame': error in evaluating the argument 'object' in selecting a method for function 'exprs': object 'rpkm_data' not found
cpm_data <- normalize_expt(c_clinical, convert = "cpm", filter = TRUE, batch = "svaseq")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'normalize_expt': object 'c_clinical' not found
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("cpm/4_Cali/c_clinical_sva-v{ver}.xlsx"))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'data' in selecting a method for function 'write_xlsx': error in evaluating the argument 'object' in selecting a method for function 'exprs': object 'cpm_data' not found
rpkm_data <- normalize_expt(c_clinical, filter = TRUE, batch = "svaseq") %>%
  normalize_expt(convert = "rpkm", column = "mean_cds_len", na_to_zero = TRUE)
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'normalize_expt': error in evaluating the argument 'expt' in selecting a method for function 'normalize_expt': object 'c_clinical' not found
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("rpkm/c_clinical_sva-v{ver}.csv"))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'x' in selecting a method for function 'as.data.frame': error in evaluating the argument 'object' in selecting a method for function 'exprs': object 'rpkm_data' not found

The Cali samples without biopsies.

c_clinical_nobiop <- subset_expt(c_clinical, subset = "typeofcells!='biopsy'")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'subset_expt': object 'c_clinical' not found
save(list = "c_clinical_nobiop", file = glue("rda/tmrc3_c_clinical_nobiop-v{ver}.rda"))
## Error in save(list = "c_clinical_nobiop", file = glue("rda/tmrc3_c_clinical_nobiop-v{ver}.rda")): object 'c_clinical_nobiop' not found
data_structures <- c(data_structures, "c_clinical_nobiop")

cpm_data <- normalize_expt(c_clinical_nobiop, convert = "cpm")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'normalize_expt': object 'c_clinical_nobiop' not found
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("cpm/4_Cali/c_clinical_nobiop-v{ver}.xlsx"))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'data' in selecting a method for function 'write_xlsx': error in evaluating the argument 'object' in selecting a method for function 'exprs': object 'cpm_data' not found
rpkm_data <- normalize_expt(c_clinical, filter = TRUE, batch = "svaseq") %>%
  normalize_expt(convert = "rpkm", column = "mean_cds_len", na_to_zero = TRUE)
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'normalize_expt': error in evaluating the argument 'expt' in selecting a method for function 'normalize_expt': object 'c_clinical' not found
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("rpkm/c_clinical_sva-v{ver}.csv"))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'x' in selecting a method for function 'as.data.frame': error in evaluating the argument 'object' in selecting a method for function 'exprs': object 'rpkm_data' not found
cpm_data <- normalize_expt(c_clinical_nobiop, convert = "cpm", filter = TRUE, batch = "svaseq")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'normalize_expt': object 'c_clinical_nobiop' not found
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("cpm/4_Cali/c_clinical_nobiop_sva-v{ver}.xlsx"))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'data' in selecting a method for function 'write_xlsx': error in evaluating the argument 'object' in selecting a method for function 'exprs': object 'cpm_data' not found
rpkm_data <- normalize_expt(c_clinical_nobiop, filter = TRUE, batch = "svaseq") %>%
  normalize_expt(convert = "rpkm", column = "mean_cds_len", na_to_zero = TRUE)
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'normalize_expt': error in evaluating the argument 'expt' in selecting a method for function 'normalize_expt': object 'c_clinical_nobiop' not found
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("rpkm/c_clinical_nobiop_sva-v{ver}.csv"))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'x' in selecting a method for function 'as.data.frame': error in evaluating the argument 'object' in selecting a method for function 'exprs': object 'rpkm_data' not found

13.0.1 Pull out the top-n most variant genes

I added a few columns to the gene annotations reflecting the variance/stdev/mean expression of each gene. This really highlights the extraordinary degree to which genes are changing in the data…

top_expt <- normalize_expt(c_clinical_cpm_variance, filter = TRUE) %>%
  variance_expt()
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'normalize_expt': error in evaluating the argument 'expt' in selecting a method for function 'normalize_expt': object 'c_clinical_cpm_variance' not found
top_fd <- fData(top_expt)
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'fData': object 'top_expt' not found
top_ex <- exprs(top_expt)
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'exprs': object 'top_expt' not found
idx <- order(top_fd[["exprs_gene_stdev"]], decreasing = TRUE)
## Error in eval(expr, envir, enclos): object 'top_fd' not found
top_df <- top_fd[idx, ]
## Error in eval(expr, envir, enclos): object 'top_fd' not found
written <- write_xlsx(
    data = head(top_fd, n = 100),
    excel = glue("excel/c_clinical_cpm_stdev_top100-v{ver}.xlsx"))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'data' in selecting a method for function 'write_xlsx': error in evaluating the argument 'x' in selecting a method for function 'head': object 'top_fd' not found
bottom_expt <- normalize_expt(c_clinical_cpm_variance, filter = "simple", threshold = 500) %>%
  variance_expt()
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'normalize_expt': error in evaluating the argument 'expt' in selecting a method for function 'normalize_expt': object 'c_clinical_cpm_variance' not found
bottom_fd <- fData(bottom_expt)
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'fData': object 'bottom_expt' not found
bottom_ex <- exprs(bottom_expt)
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'exprs': object 'bottom_expt' not found
idx <- order(bottom_fd[["exprs_gene_stdev"]])
## Error in eval(expr, envir, enclos): object 'bottom_fd' not found
bottom <- bottom_fd[idx, ]
## Error in eval(expr, envir, enclos): object 'bottom_fd' not found
written <- write_xlsx(
    data = head(bottom_fd, n = 100),
    excel = glue("excel/c_clinical_cpm_stdev_bottom100-v{ver}.xlsx"))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'data' in selecting a method for function 'write_xlsx': error in evaluating the argument 'x' in selecting a method for function 'head': object 'bottom_fd' not found

13.1 Summarize: Collect Cali sample numbers.

This is copy/pasted from above and prints out how many of each sample type there are of each category.

table(pData(c_clinical)[["drug"]])
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'pData': object 'c_clinical' not found
table(pData(c_clinical)[["clinic"]])
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'pData': object 'c_clinical' not found
table(pData(c_clinical)[["finaloutcome"]])
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'pData': object 'c_clinical' not found
table(pData(c_clinical)[["typeofcells"]])
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'pData': object 'c_clinical' not found
table(pData(c_clinical)[["visitnumber"]])
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'pData': object 'c_clinical' not found
summary(pData(c_clinical)[["Evolution_Time"]])
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'summary': error in evaluating the argument 'object' in selecting a method for function 'pData': object 'c_clinical' not found
summary(pData(c_clinical)[["Prescribed_Daily_Dose_Gluc"]])
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'summary': error in evaluating the argument 'object' in selecting a method for function 'pData': object 'c_clinical' not found
summary(pData(c_clinical)[["V3_Vertical_Axis_Lesion"]])
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'summary': error in evaluating the argument 'object' in selecting a method for function 'pData': object 'c_clinical' not found
summary(pData(c_clinical)[["V3_Total_Area_Lesion"]])
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'summary': error in evaluating the argument 'object' in selecting a method for function 'pData': object 'c_clinical' not found
summary(pData(c_clinical)[["V3_Horizontal_Axis_Ulcer"]])
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'summary': error in evaluating the argument 'object' in selecting a method for function 'pData': object 'c_clinical' not found
table(pData(c_clinical)[["Sex"]])
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'pData': object 'c_clinical' not found
table(pData(c_clinical)[["Ethnicity"]])
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'pData': object 'c_clinical' not found
summary(pData(c_clinical)[["Age"]])
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'summary': error in evaluating the argument 'object' in selecting a method for function 'pData': object 'c_clinical' not found
summary(pData(c_clinical)[["Height"]])
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'summary': error in evaluating the argument 'object' in selecting a method for function 'pData': object 'c_clinical' not found
summary(pData(c_clinical)[["Weight"]])
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'summary': error in evaluating the argument 'object' in selecting a method for function 'pData': object 'c_clinical' not found
length(unique(pData(c_clinical)[["Patient_ID"]]))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'x' in selecting a method for function 'unique': error in evaluating the argument 'object' in selecting a method for function 'pData': object 'c_clinical' not found
only_cure <- pData(c_clinical)[["finaloutcome"]] == "cure"
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'pData': object 'c_clinical' not found
c_meta <- pData(c_clinical)[only_cure, ]
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'pData': object 'c_clinical' not found
length(unique(c_meta[["Patient_ID"]]))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'x' in selecting a method for function 'unique': object 'c_meta' not found
only_fail <- pData(c_clinical)[["finaloutcome"]] == "failure"
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'pData': object 'c_clinical' not found
f_meta <- pData(c_clinical)[only_fail, ]
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'pData': object 'c_clinical' not found
length(unique(f_meta[["Patient_ID"]]))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'x' in selecting a method for function 'unique': object 'f_meta' not found

13.2 Split the data by cure/fail for some counting

cali_cure <- subset_expt(c_clinical, subset = "finaloutcome=='cure'")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'subset_expt': object 'c_clinical' not found
table(pData(cali_cure)[["visitnumber"]])
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'pData': object 'cali_cure' not found
cali_fail <- subset_expt(c_clinical, subset = "finaloutcome=='failure'")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'subset_expt': object 'c_clinical' not found
table(pData(cali_fail)[["visitnumber"]])
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'pData': object 'cali_fail' not found

13.3 Subset: Create Cali-specific versions of the various structures

I previously made a bunch of data subsets by visit, cell type, etc. So let us overwrite them all with versions which contain only the Cali samples.

There is no going back to the Cali samples after this block unless we regenerate the data from the original expressionsets.

13.3.1 Cali biopsies

c_biopsies <- tc_biopsies %>%
  subset_expt(subset = "clinic=='cali'")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'subset_expt': object 'tc_biopsies' not found
save(list = "c_biopsies", file = glue("rda/tmrc3_c_biopsies-v{ver}.rda"))
## Error in save(list = "c_biopsies", file = glue("rda/tmrc3_c_biopsies-v{ver}.rda")): object 'c_biopsies' not found
data_structures <- c(data_structures, "c_biopsies")

cpm_data <- normalize_expt(c_biopsies, convert = "cpm")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'normalize_expt': object 'c_biopsies' not found
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("cpm/4_Cali/c_biopsies-v{ver}.xlsx"))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'data' in selecting a method for function 'write_xlsx': error in evaluating the argument 'object' in selecting a method for function 'exprs': object 'cpm_data' not found
rpkm_data <- normalize_expt(c_biopsies, filter = TRUE, convert = "rpkm",
                            na_to_zero = TRUE, column = "mean_cds_len")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'normalize_expt': object 'c_biopsies' not found
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("rpkm/c_biopsies-v{ver}.csv"))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'x' in selecting a method for function 'as.data.frame': error in evaluating the argument 'object' in selecting a method for function 'exprs': object 'rpkm_data' not found
cpm_data <- normalize_expt(c_biopsies, convert = "cpm", filter = TRUE)
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'normalize_expt': object 'c_biopsies' not found
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("cpm/4_Cali/c_biopsies_nosva-v{ver}.xlsx"))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'data' in selecting a method for function 'write_xlsx': error in evaluating the argument 'object' in selecting a method for function 'exprs': object 'cpm_data' not found

13.3.2 Cali Eosinophils

c_eosinophils <- tc_eosinophils %>%
  subset_expt(subset = "clinic=='cali'")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'subset_expt': object 'tc_eosinophils' not found
save(list = "c_eosinophils", file = glue("rda/tmrc3_c_eosinophils-v{ver}.rda"))
## Error in save(list = "c_eosinophils", file = glue("rda/tmrc3_c_eosinophils-v{ver}.rda")): object 'c_eosinophils' not found
data_structures <- c(data_structures, "c_eosinophils")

cpm_data <- normalize_expt(c_eosinophils, convert = "cpm")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'normalize_expt': object 'c_eosinophils' not found
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("cpm/4_Cali/c_eosinophils-v{ver}.xlsx"))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'data' in selecting a method for function 'write_xlsx': error in evaluating the argument 'object' in selecting a method for function 'exprs': object 'cpm_data' not found
cpm_data <- normalize_expt(c_eosinophils, convert = "cpm", filter = TRUE)
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'normalize_expt': object 'c_eosinophils' not found
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("cpm/4_Cali/c_eosinophils_nosva-v{ver}.xlsx"))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'data' in selecting a method for function 'write_xlsx': error in evaluating the argument 'object' in selecting a method for function 'exprs': object 'cpm_data' not found
rpkm_data <- normalize_expt(c_eosinophils, filter = TRUE) %>%
  normalize_expt(convert = "rpkm", column = "mean_cds_len", na_to_zero = TRUE)
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'normalize_expt': error in evaluating the argument 'expt' in selecting a method for function 'normalize_expt': object 'c_eosinophils' not found
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("rpkm/c_eosinophils_nosva-v{ver}.csv"))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'x' in selecting a method for function 'as.data.frame': error in evaluating the argument 'object' in selecting a method for function 'exprs': object 'rpkm_data' not found

13.3.3 Cali subsets monocytes

c_monocytes <- tc_monocytes %>%
  subset_expt(subset = "clinic=='cali'")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'subset_expt': object 'tc_monocytes' not found
save(list = "c_monocytes", file = glue("rda/tmrc3_c_monocytes-v{ver}.rda"))
## Error in save(list = "c_monocytes", file = glue("rda/tmrc3_c_monocytes-v{ver}.rda")): object 'c_monocytes' not found
data_structures <- c(data_structures, "c_monocytes")

cpm_data <- normalize_expt(c_monocytes, convert = "cpm")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'normalize_expt': object 'c_monocytes' not found
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("cpm/4_Cali/c_monocytes-v{ver}.xlsx"))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'data' in selecting a method for function 'write_xlsx': error in evaluating the argument 'object' in selecting a method for function 'exprs': object 'cpm_data' not found
rpkm_data <- normalize_expt(c_monocytes, filter = TRUE, convert = "rpkm",
                            na_to_zero = TRUE, column = "mean_cds_len")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'normalize_expt': object 'c_monocytes' not found
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("rpkm/c_monocytes-v{ver}.csv"))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'x' in selecting a method for function 'as.data.frame': error in evaluating the argument 'object' in selecting a method for function 'exprs': object 'rpkm_data' not found
cpm_data <- normalize_expt(c_monocytes, convert = "cpm", filter = TRUE)
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'normalize_expt': object 'c_monocytes' not found
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("cpm/4_Cali/c_monocytes_nosva-v{ver}.xlsx"))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'data' in selecting a method for function 'write_xlsx': error in evaluating the argument 'object' in selecting a method for function 'exprs': object 'cpm_data' not found
rpkm_data <- normalize_expt(c_monocytes, filter = TRUE, batch = "svaseq") %>%
  normalize_expt(convert = "rpkm", column = "mean_cds_len", na_to_zero = TRUE)
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'normalize_expt': error in evaluating the argument 'expt' in selecting a method for function 'normalize_expt': object 'c_monocytes' not found
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("rpkm/c_monocytes_sva-v{ver}.csv"))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'x' in selecting a method for function 'as.data.frame': error in evaluating the argument 'object' in selecting a method for function 'exprs': object 'rpkm_data' not found

13.3.4 Cali subsets neutrophils

c_neutrophils <- tc_neutrophils %>%
  subset_expt(subset = "clinic=='cali'")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'subset_expt': object 'tc_neutrophils' not found
save(list = "c_neutrophils", file = glue("rda/tmrc3_c_neutrophils-v{ver}.rda"))
## Error in save(list = "c_neutrophils", file = glue("rda/tmrc3_c_neutrophils-v{ver}.rda")): object 'c_neutrophils' not found
data_structures <- c(data_structures, "c_neutrophils")

cpm_data <- normalize_expt(c_neutrophils, convert = "cpm")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'normalize_expt': object 'c_neutrophils' not found
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("cpm/4_Cali/c_neutrophil-v{ver}.xlsx"))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'data' in selecting a method for function 'write_xlsx': error in evaluating the argument 'object' in selecting a method for function 'exprs': object 'cpm_data' not found
rpkm_data <- normalize_expt(c_neutrophils, filter = TRUE, convert = "rpkm",
                            na_to_zero = TRUE, column = "mean_cds_len")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'normalize_expt': object 'c_neutrophils' not found
write.csv(x = as.data.frame(exprs(rpkm_data)),
                 file = glue("rpkm/c_neutrophils-v{ver}.csv"))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'x' in selecting a method for function 'as.data.frame': error in evaluating the argument 'object' in selecting a method for function 'exprs': object 'rpkm_data' not found
cpm_data <- normalize_expt(c_neutrophils, convert = "cpm", filter = TRUE, batch = "svaseq")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'normalize_expt': object 'c_neutrophils' not found
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("cpm/4_Cali/c_neutrophils_sva-v{ver}.xlsx"))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'data' in selecting a method for function 'write_xlsx': error in evaluating the argument 'object' in selecting a method for function 'exprs': object 'cpm_data' not found
rpkm_data <- normalize_expt(c_neutrophils, filter = TRUE, batch = "svaseq") %>%
  normalize_expt(convert = "rpkm", column = "mean_cds_len", na_to_zero = TRUE)
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'normalize_expt': error in evaluating the argument 'expt' in selecting a method for function 'normalize_expt': object 'c_neutrophils' not found
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("rpkm/c_neutrophils_sva-v{ver}.csv"))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'x' in selecting a method for function 'as.data.frame': error in evaluating the argument 'object' in selecting a method for function 'exprs': object 'rpkm_data' not found

13.3.5 Cali Visit 1 samples

cv1_samples <- tcv1_samples %>%
  subset_expt(subset = "clinic=='cali'")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'subset_expt': object 'tcv1_samples' not found
save(list = "cv1_samples", file = glue("rda/tmrc3_cv1_samples-v{ver}.rda"))
## Error in save(list = "cv1_samples", file = glue("rda/tmrc3_cv1_samples-v{ver}.rda")): object 'cv1_samples' not found
data_structures <- c(data_structures, "cv1_samples")

cpm_data <- normalize_expt(cv1_samples, convert = "cpm")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'normalize_expt': object 'cv1_samples' not found
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("cpm/4_Cali/cv1_samples-v{ver}.xlsx"))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'data' in selecting a method for function 'write_xlsx': error in evaluating the argument 'object' in selecting a method for function 'exprs': object 'cpm_data' not found
rpkm_data <- normalize_expt(cv1_samples, filter = TRUE, convert = "rpkm",
                            na_to_zero = TRUE, column = "mean_cds_len")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'normalize_expt': object 'cv1_samples' not found
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("rpkm/cv1_samples-v{ver}.csv"))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'x' in selecting a method for function 'as.data.frame': error in evaluating the argument 'object' in selecting a method for function 'exprs': object 'rpkm_data' not found
cpm_data <- normalize_expt(cv1_samples, convert =  "cpm", filter = TRUE, batch = "svaseq")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'normalize_expt': object 'cv1_samples' not found
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("cpm/4_Cali/cv1_samples_sva-v{ver}.xlsx"))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'data' in selecting a method for function 'write_xlsx': error in evaluating the argument 'object' in selecting a method for function 'exprs': object 'cpm_data' not found
rpkm_data <- normalize_expt(cv1_samples, filter = TRUE, batch = "svaseq") %>%
  normalize_expt(convert = "rpkm", column = "mean_cds_len", na_to_zero = TRUE)
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'normalize_expt': error in evaluating the argument 'expt' in selecting a method for function 'normalize_expt': object 'cv1_samples' not found
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("rpkm/cv1_samples_sva-v{ver}.csv"))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'x' in selecting a method for function 'as.data.frame': error in evaluating the argument 'object' in selecting a method for function 'exprs': object 'rpkm_data' not found

13.3.6 Cali Visit 2 samples

cv2_samples <- tcv2_samples %>%
  subset_expt(subset = "clinic=='cali'")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'subset_expt': object 'tcv2_samples' not found
save(list = "cv2_samples", file = glue("rda/tmrc3_cv2_samples-v{ver}.rda"))
## Error in save(list = "cv2_samples", file = glue("rda/tmrc3_cv2_samples-v{ver}.rda")): object 'cv2_samples' not found
data_structures <- c(data_structures, "cv2_samples")

cpm_data <- normalize_expt(cv2_samples, convert = "cpm")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'normalize_expt': object 'cv2_samples' not found
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("cpm/4_Cali/cv2_samples-v{ver}.xlsx"))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'data' in selecting a method for function 'write_xlsx': error in evaluating the argument 'object' in selecting a method for function 'exprs': object 'cpm_data' not found
rpkm_data <- normalize_expt(cv2_samples, filter = TRUE, convert = "rpkm",
                            na_to_zero = TRUE, column = "mean_cds_len")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'normalize_expt': object 'cv2_samples' not found
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("rpkm/cv2_samples-v{ver}.csv"))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'x' in selecting a method for function 'as.data.frame': error in evaluating the argument 'object' in selecting a method for function 'exprs': object 'rpkm_data' not found
cpm_data <- normalize_expt(cv2_samples, convert = "cpm", filter = TRUE, batch = "svaseq")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'normalize_expt': object 'cv2_samples' not found
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("cpm/4_Cali/cv2_samples_sva-v{ver}.xlsx"))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'data' in selecting a method for function 'write_xlsx': error in evaluating the argument 'object' in selecting a method for function 'exprs': object 'cpm_data' not found
rpkm_data <- normalize_expt(cv2_samples, filter = TRUE, batch = "svaseq") %>%
  normalize_expt(convert = "rpkm", column = "mean_cds_len", na_to_zero = TRUE)
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'normalize_expt': error in evaluating the argument 'expt' in selecting a method for function 'normalize_expt': object 'cv2_samples' not found
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("rpkm/cv2_samples_sva-v{ver}.csv"))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'x' in selecting a method for function 'as.data.frame': error in evaluating the argument 'object' in selecting a method for function 'exprs': object 'rpkm_data' not found

13.3.7 Cali visit 3 samples

cv3_samples <- tcv3_samples %>%
  subset_expt(subset = "clinic=='cali'")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'subset_expt': object 'tcv3_samples' not found
save(list = "cv3_samples", file = glue("rda/tmrc3_cv3_samples-v{ver}.rda"))
## Error in save(list = "cv3_samples", file = glue("rda/tmrc3_cv3_samples-v{ver}.rda")): object 'cv3_samples' not found
data_structures <- c(data_structures, "cv3_samples")

cpm_data <- normalize_expt(cv3_samples, convert = "cpm")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'normalize_expt': object 'cv3_samples' not found
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("cpm/4_Cali/cv3_samples-v{ver}.xlsx"))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'data' in selecting a method for function 'write_xlsx': error in evaluating the argument 'object' in selecting a method for function 'exprs': object 'cpm_data' not found
rpkm_data <- normalize_expt(cv3_samples, filter = TRUE, convert = "rpkm",
                            na_to_zero = TRUE, column = "mean_cds_len")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'normalize_expt': object 'cv3_samples' not found
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("rpkm/cv3_samples-v{ver}.csv"))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'x' in selecting a method for function 'as.data.frame': error in evaluating the argument 'object' in selecting a method for function 'exprs': object 'rpkm_data' not found
cpm_data <- normalize_expt(cv3_samples, convert = "cpm", filter = TRUE, batch = "svaseq")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'normalize_expt': object 'cv3_samples' not found
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("cpm/4_Cali/cv3_samples_sva-v{ver}.xlsx"))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'data' in selecting a method for function 'write_xlsx': error in evaluating the argument 'object' in selecting a method for function 'exprs': object 'cpm_data' not found
rpkm_data <- normalize_expt(cv3_samples, filter = TRUE, batch = "svaseq") %>%
  normalize_expt(convert = "rpkm", column = "mean_cds_len", na_to_zero = TRUE)
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'normalize_expt': error in evaluating the argument 'expt' in selecting a method for function 'normalize_expt': object 'cv3_samples' not found
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("rpkm/cv3_samples_sva-v{ver}.csv"))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'x' in selecting a method for function 'as.data.frame': error in evaluating the argument 'object' in selecting a method for function 'exprs': object 'rpkm_data' not found

13.3.8 Cali visit 1 Eosinophils

cv1_eosinophils <- tcv1_eosinophils %>%
  subset_expt(subset = "clinic=='cali'")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'subset_expt': object 'tcv1_eosinophils' not found
save(list = "cv1_eosinophils", file = glue("rda/tmrc3_cv1_eosinophils-v{ver}.rda"))
## Error in save(list = "cv1_eosinophils", file = glue("rda/tmrc3_cv1_eosinophils-v{ver}.rda")): object 'cv1_eosinophils' not found
data_structures <- c(data_structures, "cv1_eosinophils")

cpm_data <- normalize_expt(cv1_eosinophils, convert = "cpm")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'normalize_expt': object 'cv1_eosinophils' not found
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("cpm/4_Cali/cv1_eosinophils-v{ver}.xlsx"))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'data' in selecting a method for function 'write_xlsx': error in evaluating the argument 'object' in selecting a method for function 'exprs': object 'cpm_data' not found
rpkm_data <- normalize_expt(cv1_eosinophils, filter = TRUE, convert = "rpkm",
                            na_to_zero = TRUE, column = "mean_cds_len")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'normalize_expt': object 'cv1_eosinophils' not found
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("rpkm/cv1_eosinophils-v{ver}.csv"))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'x' in selecting a method for function 'as.data.frame': error in evaluating the argument 'object' in selecting a method for function 'exprs': object 'rpkm_data' not found
cpm_data <- normalize_expt(cv1_eosinophils, convert = "cpm", filter = TRUE)
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'normalize_expt': object 'cv1_eosinophils' not found
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("cpm/4_Cali/cv1_eosinophils_nosva-v{ver}.xlsx"))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'data' in selecting a method for function 'write_xlsx': error in evaluating the argument 'object' in selecting a method for function 'exprs': object 'cpm_data' not found
rpkm_data <- normalize_expt(cv1_eosinophils, filter = TRUE) %>%
  normalize_expt(convert = "rpkm", column = "mean_cds_len", na_to_zero = TRUE)
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'normalize_expt': error in evaluating the argument 'expt' in selecting a method for function 'normalize_expt': object 'cv1_eosinophils' not found
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("rpkm/cv1_eosinophils_nosva-v{ver}.csv"))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'x' in selecting a method for function 'as.data.frame': error in evaluating the argument 'object' in selecting a method for function 'exprs': object 'rpkm_data' not found

13.3.9 Cali visit 2 samples

cv2_eosinophils <- tcv2_eosinophils %>%
  subset_expt(subset = "clinic=='cali'")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'subset_expt': object 'tcv2_eosinophils' not found
save(list = "cv2_eosinophils", file = glue("rda/tmrc3_cv2_eosinophils-v{ver}.rda"))
## Error in save(list = "cv2_eosinophils", file = glue("rda/tmrc3_cv2_eosinophils-v{ver}.rda")): object 'cv2_eosinophils' not found
data_structures <- c(data_structures, "cv2_eosinophils")

cpm_data <- normalize_expt(cv2_eosinophils, convert = "cpm")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'normalize_expt': object 'cv2_eosinophils' not found
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("cpm/4_Cali/cv2_eosinophils-v{ver}.xlsx"))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'data' in selecting a method for function 'write_xlsx': error in evaluating the argument 'object' in selecting a method for function 'exprs': object 'cpm_data' not found
rpkm_data <- normalize_expt(cv2_eosinophils, filter = TRUE, convert = "rpkm",
                            na_to_zero = TRUE, column = "mean_cds_len")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'normalize_expt': object 'cv2_eosinophils' not found
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("rpkm/cv2_eosinophils-v{ver}.csv"))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'x' in selecting a method for function 'as.data.frame': error in evaluating the argument 'object' in selecting a method for function 'exprs': object 'rpkm_data' not found
cpm_data <- normalize_expt(cv2_eosinophils, convert = "cpm", filter = TRUE)
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'normalize_expt': object 'cv2_eosinophils' not found
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("cpm/4_Cali/cv2_eosinophils_nosva-v{ver}.xlsx"))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'data' in selecting a method for function 'write_xlsx': error in evaluating the argument 'object' in selecting a method for function 'exprs': object 'cpm_data' not found
rpkm_data <- normalize_expt(cv2_eosinophils, filter = TRUE) %>%
  normalize_expt(convert = "rpkm", column = "mean_cds_len", na_to_zero = TRUE)
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'normalize_expt': error in evaluating the argument 'expt' in selecting a method for function 'normalize_expt': object 'cv2_eosinophils' not found
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("rpkm/cv2_eosinophils_nosva-v{ver}.csv"))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'x' in selecting a method for function 'as.data.frame': error in evaluating the argument 'object' in selecting a method for function 'exprs': object 'rpkm_data' not found

13.3.10 Cali visit 3 eosinophil

cv3_eosinophils <- tcv3_eosinophils %>%
  subset_expt(subset = "clinic=='cali'")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'subset_expt': object 'tcv3_eosinophils' not found
save(list = "cv3_eosinophils", file = glue("rda/tmrc3_cv3_eosinophils-v{ver}.rda"))
## Error in save(list = "cv3_eosinophils", file = glue("rda/tmrc3_cv3_eosinophils-v{ver}.rda")): object 'cv3_eosinophils' not found
data_structures <- c(data_structures, "cv3_eosinophils")

cpm_data <- normalize_expt(cv3_eosinophils, convert = "cpm")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'normalize_expt': object 'cv3_eosinophils' not found
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("cpm/4_Cali/cv3_eosinophils-v{ver}.xlsx"))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'data' in selecting a method for function 'write_xlsx': error in evaluating the argument 'object' in selecting a method for function 'exprs': object 'cpm_data' not found
rpkm_data <- normalize_expt(cv3_eosinophils, filter = TRUE, convert = "rpkm",
                            na_to_zero = TRUE, column = "mean_cds_len")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'normalize_expt': object 'cv3_eosinophils' not found
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("rpkm/cv3_eosinophils-v{ver}.csv"))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'x' in selecting a method for function 'as.data.frame': error in evaluating the argument 'object' in selecting a method for function 'exprs': object 'rpkm_data' not found
cpm_data <- normalize_expt(cv3_eosinophils, convert = "cpm", filter = TRUE)
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'normalize_expt': object 'cv3_eosinophils' not found
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("cpm/4_Cali/cv3_eosinophils_nosva-v{ver}.xlsx"))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'data' in selecting a method for function 'write_xlsx': error in evaluating the argument 'object' in selecting a method for function 'exprs': object 'cpm_data' not found
## Note, the cbcb filter left behind a sufficient number of zeros that it confused cpm.
rpkm_data <- normalize_expt(cv3_eosinophils, filter = "simple") %>%
  normalize_expt(convert = "rpkm", column = "mean_cds_len", na_to_zero = TRUE)
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'normalize_expt': error in evaluating the argument 'expt' in selecting a method for function 'normalize_expt': object 'cv3_eosinophils' not found
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("rpkm/cv3_eosinophils_nosva-v{ver}.csv"))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'x' in selecting a method for function 'as.data.frame': error in evaluating the argument 'object' in selecting a method for function 'exprs': object 'rpkm_data' not found

13.3.11 Cali visit 1 monocytes

cv1_monocytes <- tcv1_monocytes %>%
  subset_expt(subset = "clinic=='cali'")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'subset_expt': object 'tcv1_monocytes' not found
save(list = "cv1_monocytes", file = glue("rda/tmrc3_cv1_monocytes-v{ver}.rda"))
## Error in save(list = "cv1_monocytes", file = glue("rda/tmrc3_cv1_monocytes-v{ver}.rda")): object 'cv1_monocytes' not found
data_structures <- c(data_structures, "cv1_monocytes")

cpm_data <- normalize_expt(cv1_monocytes, convert = "cpm")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'normalize_expt': object 'cv1_monocytes' not found
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("cpm/4_Cali/cv1_monocytes-v{ver}.xlsx"))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'data' in selecting a method for function 'write_xlsx': error in evaluating the argument 'object' in selecting a method for function 'exprs': object 'cpm_data' not found
rpkm_data <- normalize_expt(cv1_monocytes, filter = TRUE, convert = "rpkm",
                            na_to_zero = TRUE, column = "mean_cds_len")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'normalize_expt': object 'cv1_monocytes' not found
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("rpkm/cv1_monocytes-v{ver}.csv"))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'x' in selecting a method for function 'as.data.frame': error in evaluating the argument 'object' in selecting a method for function 'exprs': object 'rpkm_data' not found
cpm_data <- normalize_expt(cv1_monocytes, convert = "cpm", filter = TRUE, batch = "svaseq")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'normalize_expt': object 'cv1_monocytes' not found
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("cpm/4_Cali/cv1_monocytes_sva-v{ver}.xlsx"))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'data' in selecting a method for function 'write_xlsx': error in evaluating the argument 'object' in selecting a method for function 'exprs': object 'cpm_data' not found
rpkm_data <- normalize_expt(cv1_monocytes, filter = TRUE, batch = "svaseq") %>%
  normalize_expt(convert = "rpkm", column = "mean_cds_len", na_to_zero = TRUE)
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'normalize_expt': error in evaluating the argument 'expt' in selecting a method for function 'normalize_expt': object 'cv1_monocytes' not found
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("rpkm/cv1_monocytes_sva-v{ver}.csv"))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'x' in selecting a method for function 'as.data.frame': error in evaluating the argument 'object' in selecting a method for function 'exprs': object 'rpkm_data' not found

13.3.12 Cali visit 2 monocytes

cv2_monocytes <- tcv2_monocytes %>%
  subset_expt(subset = "clinic=='cali'")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'subset_expt': object 'tcv2_monocytes' not found
save(list = "cv2_monocytes", file = glue("rda/tmrc3_cv2_monocytes-v{ver}.rda"))
## Error in save(list = "cv2_monocytes", file = glue("rda/tmrc3_cv2_monocytes-v{ver}.rda")): object 'cv2_monocytes' not found
data_structures <- c(data_structures, "cv2_monocytes")

cpm_data <- normalize_expt(cv2_monocytes, convert = "cpm")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'normalize_expt': object 'cv2_monocytes' not found
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("cpm/4_Cali/cv2_monocytes-v{ver}.xlsx"))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'data' in selecting a method for function 'write_xlsx': error in evaluating the argument 'object' in selecting a method for function 'exprs': object 'cpm_data' not found
rpkm_data <- normalize_expt(cv2_monocytes, filter = TRUE, convert = "rpkm",
                            na_to_zero = TRUE, column = "mean_cds_len")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'normalize_expt': object 'cv2_monocytes' not found
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("rpkm/cv2_monocytes-v{ver}.csv"))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'x' in selecting a method for function 'as.data.frame': error in evaluating the argument 'object' in selecting a method for function 'exprs': object 'rpkm_data' not found
cpm_data <- normalize_expt(cv2_monocytes, convert = "cpm", filter = TRUE, batch = "svaseq")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'normalize_expt': object 'cv2_monocytes' not found
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("cpm/4_Cali/cv2_monocytes_sva-v{ver}.xlsx"))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'data' in selecting a method for function 'write_xlsx': error in evaluating the argument 'object' in selecting a method for function 'exprs': object 'cpm_data' not found
rpkm_data <- normalize_expt(cv2_monocytes, filter = TRUE, batch = "svaseq") %>%
  normalize_expt(convert = "rpkm", column = "mean_cds_len", na_to_zero = TRUE)
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'normalize_expt': error in evaluating the argument 'expt' in selecting a method for function 'normalize_expt': object 'cv2_monocytes' not found
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("rpkm/cv2_monocytes_sva-v{ver}.csv"))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'x' in selecting a method for function 'as.data.frame': error in evaluating the argument 'object' in selecting a method for function 'exprs': object 'rpkm_data' not found

13.3.13 Cali visit 3 monocytes

cv3_monocytes <- tcv3_monocytes %>%
  subset_expt(subset = "clinic=='cali'")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'subset_expt': object 'tcv3_monocytes' not found
save(list = "cv3_monocytes", file = glue("rda/tmrc3_cv3_monocytes-v{ver}.rda"))
## Error in save(list = "cv3_monocytes", file = glue("rda/tmrc3_cv3_monocytes-v{ver}.rda")): object 'cv3_monocytes' not found
data_structures <- c(data_structures, "cv3_monocytes")

cpm_data <- normalize_expt(cv3_monocytes, convert = "cpm")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'normalize_expt': object 'cv3_monocytes' not found
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("cpm/4_Cali/cv3_monocytes-v{ver}.xlsx"))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'data' in selecting a method for function 'write_xlsx': error in evaluating the argument 'object' in selecting a method for function 'exprs': object 'cpm_data' not found
rpkm_data <- normalize_expt(cv3_monocytes, filter = TRUE, convert = "rpkm",
                            na_to_zero = TRUE, column = "mean_cds_len")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'normalize_expt': object 'cv3_monocytes' not found
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("rpkm/cv3_monocytes-v{ver}.csv"))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'x' in selecting a method for function 'as.data.frame': error in evaluating the argument 'object' in selecting a method for function 'exprs': object 'rpkm_data' not found
cpm_data <- normalize_expt(cv3_monocytes, convert = "cpm", filter = TRUE, batch = "svaseq")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'normalize_expt': object 'cv3_monocytes' not found
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("cpm/4_Cali/cv3_monocytes_sva-v{ver}.xlsx"))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'data' in selecting a method for function 'write_xlsx': error in evaluating the argument 'object' in selecting a method for function 'exprs': object 'cpm_data' not found
rpkm_data <- normalize_expt(cv3_monocytes, filter = TRUE, batch = "svaseq") %>%
  normalize_expt(convert = "rpkm", column = "mean_cds_len", na_to_zero = TRUE)
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'normalize_expt': error in evaluating the argument 'expt' in selecting a method for function 'normalize_expt': object 'cv3_monocytes' not found
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("rpkm/cv3_monocytes_sva-v{ver}.csv"))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'x' in selecting a method for function 'as.data.frame': error in evaluating the argument 'object' in selecting a method for function 'exprs': object 'rpkm_data' not found

13.3.14 Cali visit 1 neutrophils

cv1_neutrophils <- tcv1_neutrophils %>%
  subset_expt(subset = "clinic=='cali'")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'subset_expt': object 'tcv1_neutrophils' not found
save(list = "cv1_neutrophils", file = glue("rda/tmrc3_cv1_neutrophils-v{ver}.rda"))
## Error in save(list = "cv1_neutrophils", file = glue("rda/tmrc3_cv1_neutrophils-v{ver}.rda")): object 'cv1_neutrophils' not found
data_structures <- c(data_structures, "cv1_neutrophils")

cpm_data <- normalize_expt(cv1_neutrophils, convert = "cpm")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'normalize_expt': object 'cv1_neutrophils' not found
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("cpm/4_Cali/cv1_neutrophils-v{ver}.xlsx"))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'data' in selecting a method for function 'write_xlsx': error in evaluating the argument 'object' in selecting a method for function 'exprs': object 'cpm_data' not found
rpkm_data <- normalize_expt(cv1_neutrophils, filter = TRUE, convert = "rpkm",
                            na_to_zero = TRUE, column = "mean_cds_len")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'normalize_expt': object 'cv1_neutrophils' not found
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("rpkm/cv1_neutrophils-v{ver}.csv"))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'x' in selecting a method for function 'as.data.frame': error in evaluating the argument 'object' in selecting a method for function 'exprs': object 'rpkm_data' not found
cpm_data <- normalize_expt(cv1_neutrophils, convert = "cpm", filter = TRUE, batch = "svaseq")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'normalize_expt': object 'cv1_neutrophils' not found
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("cpm/4_Cali/cv1_neutrophils_sva-v{ver}.xlsx"))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'data' in selecting a method for function 'write_xlsx': error in evaluating the argument 'object' in selecting a method for function 'exprs': object 'cpm_data' not found
rpkm_data <- normalize_expt(cv1_neutrophils, filter = TRUE, batch = "svaseq") %>%
  normalize_expt(convert = "rpkm", column = "mean_cds_len", na_to_zero = TRUE)
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'normalize_expt': error in evaluating the argument 'expt' in selecting a method for function 'normalize_expt': object 'cv1_neutrophils' not found
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("rpkm/cv1_neutrophils_sva-v{ver}.csv"))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'x' in selecting a method for function 'as.data.frame': error in evaluating the argument 'object' in selecting a method for function 'exprs': object 'rpkm_data' not found

13.3.15 Cali visit 2 neutrophils

cv2_neutrophils <- tcv2_neutrophils %>%
  subset_expt(subset = "clinic=='cali'")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'subset_expt': object 'tcv2_neutrophils' not found
save(list = "cv2_neutrophils", file = glue("rda/tmrc3_cv2_neutrophils-v{ver}.rda"))
## Error in save(list = "cv2_neutrophils", file = glue("rda/tmrc3_cv2_neutrophils-v{ver}.rda")): object 'cv2_neutrophils' not found
data_structures <- c(data_structures, "cv2_neutrophils")

cpm_data <- normalize_expt(cv2_neutrophils, convert = "cpm")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'normalize_expt': object 'cv2_neutrophils' not found
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("cpm/4_Cali/cv2_neutrophils-v{ver}.xlsx"))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'data' in selecting a method for function 'write_xlsx': error in evaluating the argument 'object' in selecting a method for function 'exprs': object 'cpm_data' not found
rpkm_data <- normalize_expt(cv2_neutrophils, filter = TRUE, convert = "rpkm",
                            na_to_zero = TRUE, column = "mean_cds_len")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'normalize_expt': object 'cv2_neutrophils' not found
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("rpkm/cv2_neutrophils-v{ver}.csv"))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'x' in selecting a method for function 'as.data.frame': error in evaluating the argument 'object' in selecting a method for function 'exprs': object 'rpkm_data' not found
cpm_data <- normalize_expt(cv2_neutrophils, convert = "cpm", filter = TRUE, batch = "svaseq")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'normalize_expt': object 'cv2_neutrophils' not found
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("cpm/4_Cali/cv2_neutrophils_sva-v{ver}.xlsx"))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'data' in selecting a method for function 'write_xlsx': error in evaluating the argument 'object' in selecting a method for function 'exprs': object 'cpm_data' not found
rpkm_data <- normalize_expt(cv2_neutrophils, filter = TRUE, batch = "svaseq") %>%
  normalize_expt(convert = "rpkm", column = "mean_cds_len", na_to_zero = TRUE)
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'normalize_expt': error in evaluating the argument 'expt' in selecting a method for function 'normalize_expt': object 'cv2_neutrophils' not found
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("rpkm/cv2_neutrophils_sva-v{ver}.csv"))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'x' in selecting a method for function 'as.data.frame': error in evaluating the argument 'object' in selecting a method for function 'exprs': object 'rpkm_data' not found

13.3.16 Cali visit 3 neutrophils

cv3_neutrophils <- tcv3_neutrophils %>%
  subset_expt(subset = "clinic=='cali'")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'subset_expt': object 'tcv3_neutrophils' not found
save(list = "cv3_neutrophils", file = glue("rda/tmrc3_cv3_neutrophils-v{ver}.rda"))
## Error in save(list = "cv3_neutrophils", file = glue("rda/tmrc3_cv3_neutrophils-v{ver}.rda")): object 'cv3_neutrophils' not found
data_structures <- c(data_structures, "cv3_neutrophils")

cpm_data <- normalize_expt(cv3_neutrophils, convert = "cpm")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'normalize_expt': object 'cv3_neutrophils' not found
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("cpm/4_Cali/cv3_neutrophils-v{ver}.xlsx"))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'data' in selecting a method for function 'write_xlsx': error in evaluating the argument 'object' in selecting a method for function 'exprs': object 'cpm_data' not found
rpkm_data <- normalize_expt(cv3_neutrophils, filter = TRUE, convert = "rpkm",
                            na_to_zero = TRUE, column = "mean_cds_len")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'normalize_expt': object 'cv3_neutrophils' not found
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("rpkm/cv3_neutrophils-v{ver}.csv"))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'x' in selecting a method for function 'as.data.frame': error in evaluating the argument 'object' in selecting a method for function 'exprs': object 'rpkm_data' not found
cpm_data <- normalize_expt(cv3_neutrophils, convert = "cpm", filter = TRUE, batch = "svaseq")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'normalize_expt': object 'cv3_neutrophils' not found
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("cpm/4_Cali/cv3_neutrophils_sva-v{ver}.xlsx"))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'data' in selecting a method for function 'write_xlsx': error in evaluating the argument 'object' in selecting a method for function 'exprs': object 'cpm_data' not found
rpkm_data <- normalize_expt(cv3_neutrophils, filter = TRUE, batch = "svaseq") %>%
  normalize_expt(convert = "rpkm", column = "mean_cds_len", na_to_zero = TRUE)
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'normalize_expt': error in evaluating the argument 'expt' in selecting a method for function 'normalize_expt': object 'cv3_neutrophils' not found
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("rpkm/cv3_neutrophils_sva-v{ver}.csv"))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'x' in selecting a method for function 'as.data.frame': error in evaluating the argument 'object' in selecting a method for function 'exprs': object 'rpkm_data' not found

13.3.17 Tumaco compare visits

Is this redundant?

tc_visit <- set_expt_conditions(
  tc_clinical, fact = "visitnumber", colors = color_choices[["visit2"]]) %>%
  set_expt_batches(fact = "finaloutcome") %>%
  subset_expt(subset = "typeofcells!='biopsy'")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'subset_expt': error in evaluating the argument 'object' in selecting a method for function 'pData': error in evaluating the argument 'object' in selecting a method for function 'pData': object 'tc_clinical' not found
save(list = "tc_visit", file = glue("rda/tmrc3_tc_visit-v{ver}.rda"))
## Error in save(list = "tc_visit", file = glue("rda/tmrc3_tc_visit-v{ver}.rda")): object 'tc_visit' not found
data_structures <- c(data_structures, "tc_visit")

tc_v1vs <- tc_visit
## Error in eval(expr, envir, enclos): object 'tc_visit' not found
pData(tc_v1vs)[["visit"]] <- as.character(pData(tc_v1vs)[["visitnumber"]])
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'pData': object 'tc_v1vs' not found
v1_samples <- pData(tc_v1vs)[["visit"]] == "1"
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'pData': object 'tc_v1vs' not found
pData(tc_v1vs)[v1_samples, "visit"] <- "first"
## Error: object 'tc_v1vs' not found
pData(tc_v1vs)[!v1_samples, "visit"] <- "later"
## Error: object 'tc_v1vs' not found
pData(tc_v1vs)[["visit"]] <- as.factor(pData(tc_v1vs)[["visit"]])
## Error in h(simpleError(msg, call)): error in evaluating the argument 'x' in selecting a method for function 'as.factor': error in evaluating the argument 'object' in selecting a method for function 'pData': object 'tc_v1vs' not found
tc_v1vs <- set_expt_conditions(
  tc_v1vs, fact = "visit", colors = color_choices[["two_visits"]])
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'pData': object 'tc_v1vs' not found
save(list = "tc_v1vs", file = glue("rda/tmrc3_tc_v1vs-v{ver}.rda"))
## Error in save(list = "tc_v1vs", file = glue("rda/tmrc3_tc_v1vs-v{ver}.rda")): object 'tc_v1vs' not found
data_structures <- c(data_structures, "tc_v1vs")
t_v1vs <- subset_expt(tc_v1vs, subset = "clinic == 'tumaco'")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'subset_expt': object 'tc_v1vs' not found
save(list = "t_v1vs", file = glue("rda/tmrc3_t_v1vs-v{ver}.rda"))
## Error in save(list = "t_v1vs", file = glue("rda/tmrc3_t_v1vs-v{ver}.rda")): object 't_v1vs' not found
data_structures <- c(data_structures, "t_v1vs")

t_visit <- set_expt_conditions(
  t_clinical, fact = "visitnumber", colors = color_choices[["visit2"]]) %>%
  set_expt_batches(fact = "finaloutcome") %>%
  subset_expt(subset = "typeofcells!='biopsy'")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'subset_expt': error in evaluating the argument 'object' in selecting a method for function 'pData': error in evaluating the argument 'object' in selecting a method for function 'pData': object 't_clinical' not found
save(list = "t_visit", file = glue("rda/tmrc3_t_visit-v{ver}.rda"))
## Error in save(list = "t_visit", file = glue("rda/tmrc3_t_visit-v{ver}.rda")): object 't_visit' not found
data_structures <- c(data_structures, "t_visit")
cpm_data <- normalize_expt(t_visit, convert = "cpm")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'normalize_expt': object 't_visit' not found
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("cpm/4_Tumaco/t_visit-v{ver}.xlsx"))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'data' in selecting a method for function 'write_xlsx': error in evaluating the argument 'object' in selecting a method for function 'exprs': object 'cpm_data' not found
cpm_data <- normalize_expt(t_visit, convert = "cpm", filter = TRUE, batch = "svaseq")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'normalize_expt': object 't_visit' not found
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("cpm/4_Tumaco/t_visit_sva-v{ver}.xlsx"))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'data' in selecting a method for function 'write_xlsx': error in evaluating the argument 'object' in selecting a method for function 'exprs': object 'cpm_data' not found

13.3.18 Visit cure/fail contrasts

visit_cf_expt_factor <- paste0("v", pData(t_clinical)[["visitnumber"]],
                               pData(t_clinical)[["finaloutcome"]])
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'pData': object 't_clinical' not found
t_visitcf <- set_expt_conditions(t_clinical, fact = visit_cf_expt_factor)
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'pData': object 't_clinical' not found
save(list = "t_visitcf", file = glue("rda/tmrc3_t_visitcf-v{ver}.rda"))
## Error in save(list = "t_visitcf", file = glue("rda/tmrc3_t_visitcf-v{ver}.rda")): object 't_visitcf' not found
data_structures <- c(data_structures, "t_visitcf")

t_visitcf_eosinophil <- subset_expt(t_visitcf, subset = "typeofcells=='eosinophils'")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'subset_expt': object 't_visitcf' not found
save(list = "t_visitcf_eosinophil", file = glue("rda/tmrc3_t_visitcf_eosinophil-v{ver}.rda"))
## Error in save(list = "t_visitcf_eosinophil", file = glue("rda/tmrc3_t_visitcf_eosinophil-v{ver}.rda")): object 't_visitcf_eosinophil' not found
data_structures <- c(data_structures, "t_visitcf_eosinophil")

t_visitcf_monocyte <- subset_expt(t_visitcf, subset = "typeofcells=='monocytes'")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'subset_expt': object 't_visitcf' not found
save(list = "t_visitcf_monocyte", file = glue("rda/tmrc3_t_visitcf_monocyte-v{ver}.rda"))
## Error in save(list = "t_visitcf_monocyte", file = glue("rda/tmrc3_t_visitcf_monocyte-v{ver}.rda")): object 't_visitcf_monocyte' not found
data_structures <- c(data_structures, "t_visitcf_monocyte")

t_visitcf_neutrophil <- subset_expt(t_visitcf, subset = "typeofcells=='neutrophils'")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'subset_expt': object 't_visitcf' not found
save(list = "t_visitcf_neutrophil", file = glue("rda/tmrc3_t_visitcf_neutrophil-v{ver}.rda"))
## Error in save(list = "t_visitcf_neutrophil", file = glue("rda/tmrc3_t_visitcf_neutrophil-v{ver}.rda")): object 't_visitcf_neutrophil' not found
data_structures <- c(data_structures, "t_visitcf_neutrophil")

13.3.19 Cali compare visits

Is this redundant?

c_visit <- set_expt_conditions(c_clinical, fact = "visitnumber") %>%
  set_expt_batches(fact = "finaloutcome") %>%
  subset_expt(subset = "typeofcells!='biopsy'")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'subset_expt': error in evaluating the argument 'object' in selecting a method for function 'pData': error in evaluating the argument 'object' in selecting a method for function 'pData': object 'c_clinical' not found
save(list = "c_visit", file = glue("rda/tmrc3_c_visit-v{ver}.rda"))
## Error in save(list = "c_visit", file = glue("rda/tmrc3_c_visit-v{ver}.rda")): object 'c_visit' not found
data_structures <- c(data_structures, "c_visit")

cpm_data <- normalize_expt(c_visit, convert = "cpm")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'normalize_expt': object 'c_visit' not found
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("cpm/4_Tumaco/c_visit-v{ver}.xlsx"))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'data' in selecting a method for function 'write_xlsx': error in evaluating the argument 'object' in selecting a method for function 'exprs': object 'cpm_data' not found
cpm_data <- normalize_expt(c_visit, convert = "cpm", filter = TRUE, batch = "svaseq")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'normalize_expt': object 'c_visit' not found
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("cpm/4_Cali/c_visit_sva-v{ver}.xlsx"))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'data' in selecting a method for function 'write_xlsx': error in evaluating the argument 'object' in selecting a method for function 'exprs': object 'cpm_data' not found

13.3.20 Visit cure/fail contrasts

visit_cf_expt_factor <- paste0("v", pData(c_clinical)[["visitnumber"]],
                               pData(c_clinical)[["finaloutcome"]])
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'pData': object 'c_clinical' not found
c_visitcf <- set_expt_conditions(c_clinical, fact = visit_cf_expt_factor)
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'pData': object 'c_clinical' not found
save(list = "c_visitcf", file = glue("rda/tmrc3_c_visitcf-v{ver}.rda"))
## Error in save(list = "c_visitcf", file = glue("rda/tmrc3_c_visitcf-v{ver}.rda")): object 'c_visitcf' not found
data_structures <- c(data_structures, "c_visitcf")

c_visitcf_eosinophil <- subset_expt(c_visitcf, subset = "typeofcells=='eosinophils'")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'subset_expt': object 'c_visitcf' not found
save(list = "c_visitcf_eosinophil", file = glue("rda/tmrc3_c_visitcf_eosinophil-v{ver}.rda"))
## Error in save(list = "c_visitcf_eosinophil", file = glue("rda/tmrc3_c_visitcf_eosinophil-v{ver}.rda")): object 'c_visitcf_eosinophil' not found
data_structures <- c(data_structures, "c_visitcf_eosinophil")

c_visitcf_monocyte <- subset_expt(c_visitcf, subset = "typeofcells=='monocytes'")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'subset_expt': object 'c_visitcf' not found
save(list = "c_visitcf_monocyte", file = glue("rda/tmrc3_c_visitcf_monocyte-v{ver}.rda"))
## Error in save(list = "c_visitcf_monocyte", file = glue("rda/tmrc3_c_visitcf_monocyte-v{ver}.rda")): object 'c_visitcf_monocyte' not found
data_structures <- c(data_structures, "c_visitcf_monocyte")

c_visitcf_neutrophil <- subset_expt(c_visitcf, subset = "typeofcells=='neutrophils'")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'subset_expt': object 'c_visitcf' not found
save(list = "c_visitcf_neutrophil", file = glue("rda/tmrc3_c_visitcf_neutrophil-v{ver}.rda"))
## Error in save(list = "c_visitcf_neutrophil", file = glue("rda/tmrc3_c_visitcf_neutrophil-v{ver}.rda")): object 'c_visitcf_neutrophil' not found
data_structures <- c(data_structures, "c_visitcf_neutrophil")

14 Summarize: Tabulate sample numbers

14.1 Both

ncol(exprs(tc_clinical))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'x' in selecting a method for function 'ncol': error in evaluating the argument 'object' in selecting a method for function 'exprs': object 'tc_clinical' not found
sum(pData(tc_clinical)[["finaloutcome"]] == "cure")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'pData': object 'tc_clinical' not found
sum(pData(tc_clinical)[["finaloutcome"]] == "failure")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'pData': object 'tc_clinical' not found
all_types[["biopsy"]]
## Error in eval(expr, envir, enclos): object 'all_types' not found
sum(pData(tc_biopsies)[["finaloutcome"]] == "cure")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'pData': object 'tc_biopsies' not found
sum(pData(tc_biopsies)[["finaloutcome"]] == "failure")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'pData': object 'tc_biopsies' not found
all_types[["eosinophils"]]
## Error in eval(expr, envir, enclos): object 'all_types' not found
sum(pData(tc_eosinophils)[["finaloutcome"]] == "cure")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'pData': object 'tc_eosinophils' not found
sum(pData(tc_eosinophils)[["finaloutcome"]] == "failure")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'pData': object 'tc_eosinophils' not found
nrow(pData(tcv1_eosinophils))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'x' in selecting a method for function 'nrow': error in evaluating the argument 'object' in selecting a method for function 'pData': object 'tcv1_eosinophils' not found
sum(pData(tcv1_eosinophils)[["finaloutcome"]] == "cure")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'pData': object 'tcv1_eosinophils' not found
sum(pData(tcv1_eosinophils)[["finaloutcome"]] == "failure")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'pData': object 'tcv1_eosinophils' not found
nrow(pData(tcv2_eosinophils))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'x' in selecting a method for function 'nrow': error in evaluating the argument 'object' in selecting a method for function 'pData': object 'tcv2_eosinophils' not found
sum(pData(tcv2_eosinophils)[["finaloutcome"]] == "cure")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'pData': object 'tcv2_eosinophils' not found
sum(pData(tcv2_eosinophils)[["finaloutcome"]] == "failure")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'pData': object 'tcv2_eosinophils' not found
nrow(pData(tcv3_eosinophils))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'x' in selecting a method for function 'nrow': error in evaluating the argument 'object' in selecting a method for function 'pData': object 'tcv3_eosinophils' not found
sum(pData(tcv3_eosinophils)[["finaloutcome"]] == "cure")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'pData': object 'tcv3_eosinophils' not found
sum(pData(tcv3_eosinophils)[["finaloutcome"]] == "failure")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'pData': object 'tcv3_eosinophils' not found
all_types[["monocytes"]]
## Error in eval(expr, envir, enclos): object 'all_types' not found
sum(pData(tc_monocytes)[["finaloutcome"]] == "cure")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'pData': object 'tc_monocytes' not found
sum(pData(tc_monocytes)[["finaloutcome"]] == "failure")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'pData': object 'tc_monocytes' not found
nrow(pData(tcv1_monocytes))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'x' in selecting a method for function 'nrow': error in evaluating the argument 'object' in selecting a method for function 'pData': object 'tcv1_monocytes' not found
sum(pData(tcv1_monocytes)[["finaloutcome"]] == "cure")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'pData': object 'tcv1_monocytes' not found
sum(pData(tcv1_monocytes)[["finaloutcome"]] == "failure")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'pData': object 'tcv1_monocytes' not found
nrow(pData(tcv2_monocytes))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'x' in selecting a method for function 'nrow': error in evaluating the argument 'object' in selecting a method for function 'pData': object 'tcv2_monocytes' not found
sum(pData(tcv2_monocytes)[["finaloutcome"]] == "cure")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'pData': object 'tcv2_monocytes' not found
sum(pData(tcv2_monocytes)[["finaloutcome"]] == "failure")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'pData': object 'tcv2_monocytes' not found
nrow(pData(tcv3_monocytes))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'x' in selecting a method for function 'nrow': error in evaluating the argument 'object' in selecting a method for function 'pData': object 'tcv3_monocytes' not found
sum(pData(tcv3_monocytes)[["finaloutcome"]] == "cure")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'pData': object 'tcv3_monocytes' not found
sum(pData(tcv3_monocytes)[["finaloutcome"]] == "failure")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'pData': object 'tcv3_monocytes' not found
all_types[["neutrophils"]]
## Error in eval(expr, envir, enclos): object 'all_types' not found
sum(pData(tc_neutrophils)[["finaloutcome"]] == "cure")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'pData': object 'tc_neutrophils' not found
sum(pData(tc_neutrophils)[["finaloutcome"]] == "failure")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'pData': object 'tc_neutrophils' not found
nrow(pData(tcv1_neutrophils))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'x' in selecting a method for function 'nrow': error in evaluating the argument 'object' in selecting a method for function 'pData': object 'tcv1_neutrophils' not found
sum(pData(tcv1_neutrophils)[["finaloutcome"]] == "cure")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'pData': object 'tcv1_neutrophils' not found
sum(pData(tcv1_neutrophils)[["finaloutcome"]] == "failure")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'pData': object 'tcv1_neutrophils' not found
nrow(pData(tcv2_monocytes))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'x' in selecting a method for function 'nrow': error in evaluating the argument 'object' in selecting a method for function 'pData': object 'tcv2_monocytes' not found
sum(pData(tcv2_neutrophils)[["finaloutcome"]] == "cure")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'pData': object 'tcv2_neutrophils' not found
sum(pData(tcv2_neutrophils)[["finaloutcome"]] == "failure")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'pData': object 'tcv2_neutrophils' not found
nrow(pData(tcv3_neutrophils))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'x' in selecting a method for function 'nrow': error in evaluating the argument 'object' in selecting a method for function 'pData': object 'tcv3_neutrophils' not found
sum(pData(tcv3_neutrophils)[["finaloutcome"]] == "cure")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'pData': object 'tcv3_neutrophils' not found
sum(pData(tcv3_neutrophils)[["finaloutcome"]] == "failure")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'pData': object 'tcv3_neutrophils' not found

14.2 Tumaco

Here is an outline of the samples in their current state:

ncol(exprs(t_clinical))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'x' in selecting a method for function 'ncol': error in evaluating the argument 'object' in selecting a method for function 'exprs': object 't_clinical' not found
sum(pData(t_clinical)[["finaloutcome"]] == "cure")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'pData': object 't_clinical' not found
sum(pData(t_clinical)[["finaloutcome"]] == "failure")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'pData': object 't_clinical' not found
all_types[["biopsy"]]
## Error in eval(expr, envir, enclos): object 'all_types' not found
sum(pData(t_biopsies)[["finaloutcome"]] == "cure")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'pData': object 't_biopsies' not found
sum(pData(t_biopsies)[["finaloutcome"]] == "failure")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'pData': object 't_biopsies' not found
all_types[["eosinophils"]]
## Error in eval(expr, envir, enclos): object 'all_types' not found
sum(pData(t_eosinophils)[["finaloutcome"]] == "cure")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'pData': object 't_eosinophils' not found
sum(pData(t_eosinophils)[["finaloutcome"]] == "failure")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'pData': object 't_eosinophils' not found
nrow(pData(tv1_eosinophils))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'x' in selecting a method for function 'nrow': error in evaluating the argument 'object' in selecting a method for function 'pData': object 'tv1_eosinophils' not found
sum(pData(tv1_eosinophils)[["finaloutcome"]] == "cure")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'pData': object 'tv1_eosinophils' not found
sum(pData(tv1_eosinophils)[["finaloutcome"]] == "failure")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'pData': object 'tv1_eosinophils' not found
nrow(pData(tv2_eosinophils))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'x' in selecting a method for function 'nrow': error in evaluating the argument 'object' in selecting a method for function 'pData': object 'tv2_eosinophils' not found
sum(pData(tv2_eosinophils)[["finaloutcome"]] == "cure")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'pData': object 'tv2_eosinophils' not found
sum(pData(tv2_eosinophils)[["finaloutcome"]] == "failure")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'pData': object 'tv2_eosinophils' not found
nrow(pData(tv3_eosinophils))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'x' in selecting a method for function 'nrow': error in evaluating the argument 'object' in selecting a method for function 'pData': object 'tv3_eosinophils' not found
sum(pData(tv3_eosinophils)[["finaloutcome"]] == "cure")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'pData': object 'tv3_eosinophils' not found
sum(pData(tv3_eosinophils)[["finaloutcome"]] == "failure")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'pData': object 'tv3_eosinophils' not found
all_types[["monocytes"]]
## Error in eval(expr, envir, enclos): object 'all_types' not found
sum(pData(t_monocytes)[["finaloutcome"]] == "cure")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'pData': object 't_monocytes' not found
sum(pData(t_monocytes)[["finaloutcome"]] == "failure")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'pData': object 't_monocytes' not found
nrow(pData(tv1_monocytes))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'x' in selecting a method for function 'nrow': error in evaluating the argument 'object' in selecting a method for function 'pData': object 'tv1_monocytes' not found
sum(pData(tv1_monocytes)[["finaloutcome"]] == "cure")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'pData': object 'tv1_monocytes' not found
sum(pData(tv1_monocytes)[["finaloutcome"]] == "failure")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'pData': object 'tv1_monocytes' not found
nrow(pData(tv2_monocytes))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'x' in selecting a method for function 'nrow': error in evaluating the argument 'object' in selecting a method for function 'pData': object 'tv2_monocytes' not found
sum(pData(tv2_monocytes)[["finaloutcome"]] == "cure")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'pData': object 'tv2_monocytes' not found
sum(pData(tv2_monocytes)[["finaloutcome"]] == "failure")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'pData': object 'tv2_monocytes' not found
nrow(pData(tv3_monocytes))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'x' in selecting a method for function 'nrow': error in evaluating the argument 'object' in selecting a method for function 'pData': object 'tv3_monocytes' not found
sum(pData(tv3_monocytes)[["finaloutcome"]] == "cure")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'pData': object 'tv3_monocytes' not found
sum(pData(tv3_monocytes)[["finaloutcome"]] == "failure")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'pData': object 'tv3_monocytes' not found
all_types[["neutrophils"]]
## Error in eval(expr, envir, enclos): object 'all_types' not found
sum(pData(t_neutrophils)[["finaloutcome"]] == "cure")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'pData': object 't_neutrophils' not found
sum(pData(t_neutrophils)[["finaloutcome"]] == "failure")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'pData': object 't_neutrophils' not found
nrow(pData(tv1_neutrophils))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'x' in selecting a method for function 'nrow': error in evaluating the argument 'object' in selecting a method for function 'pData': object 'tv1_neutrophils' not found
sum(pData(tv1_neutrophils)[["finaloutcome"]] == "cure")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'pData': object 'tv1_neutrophils' not found
sum(pData(tv1_neutrophils)[["finaloutcome"]] == "failure")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'pData': object 'tv1_neutrophils' not found
nrow(pData(tv2_monocytes))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'x' in selecting a method for function 'nrow': error in evaluating the argument 'object' in selecting a method for function 'pData': object 'tv2_monocytes' not found
sum(pData(tv2_neutrophils)[["finaloutcome"]] == "cure")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'pData': object 'tv2_neutrophils' not found
sum(pData(tv2_neutrophils)[["finaloutcome"]] == "failure")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'pData': object 'tv2_neutrophils' not found
nrow(pData(tv3_neutrophils))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'x' in selecting a method for function 'nrow': error in evaluating the argument 'object' in selecting a method for function 'pData': object 'tv3_neutrophils' not found
sum(pData(tv3_neutrophils)[["finaloutcome"]] == "cure")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'pData': object 'tv3_neutrophils' not found
sum(pData(tv3_neutrophils)[["finaloutcome"]] == "failure")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'pData': object 'tv3_neutrophils' not found

14.3 Cali

ncol(exprs(c_clinical))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'x' in selecting a method for function 'ncol': error in evaluating the argument 'object' in selecting a method for function 'exprs': object 'c_clinical' not found
sum(pData(c_clinical)[["finaloutcome"]] == "cure")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'pData': object 'c_clinical' not found
sum(pData(c_clinical)[["finaloutcome"]] == "failure")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'pData': object 'c_clinical' not found
#all_types[["biopsy"]]
sum(pData(c_biopsies)[["finaloutcome"]] == "cure")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'pData': object 'c_biopsies' not found
sum(pData(c_biopsies)[["finaloutcome"]] == "failure")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'pData': object 'c_biopsies' not found
#all_types[["eosinophils"]]
sum(pData(c_eosinophils)[["finaloutcome"]] == "cure")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'pData': object 'c_eosinophils' not found
sum(pData(c_eosinophils)[["finaloutcome"]] == "failure")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'pData': object 'c_eosinophils' not found
nrow(pData(cv1_eosinophils))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'x' in selecting a method for function 'nrow': error in evaluating the argument 'object' in selecting a method for function 'pData': object 'cv1_eosinophils' not found
sum(pData(cv1_eosinophils)[["finaloutcome"]] == "cure")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'pData': object 'cv1_eosinophils' not found
sum(pData(cv1_eosinophils)[["finaloutcome"]] == "failure")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'pData': object 'cv1_eosinophils' not found
nrow(pData(cv2_eosinophils))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'x' in selecting a method for function 'nrow': error in evaluating the argument 'object' in selecting a method for function 'pData': object 'cv2_eosinophils' not found
sum(pData(cv2_eosinophils)[["finaloutcome"]] == "cure")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'pData': object 'cv2_eosinophils' not found
sum(pData(cv2_eosinophils)[["finaloutcome"]] == "failure")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'pData': object 'cv2_eosinophils' not found
nrow(pData(cv3_eosinophils))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'x' in selecting a method for function 'nrow': error in evaluating the argument 'object' in selecting a method for function 'pData': object 'cv3_eosinophils' not found
sum(pData(cv3_eosinophils)[["finaloutcome"]] == "cure")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'pData': object 'cv3_eosinophils' not found
sum(pData(cv3_eosinophils)[["finaloutcome"]] == "failure")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'pData': object 'cv3_eosinophils' not found
#all_types[["monocytes"]]
sum(pData(c_monocytes)[["finaloutcome"]] == "cure")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'pData': object 'c_monocytes' not found
sum(pData(c_monocytes)[["finaloutcome"]] == "failure")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'pData': object 'c_monocytes' not found
nrow(pData(cv1_monocytes))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'x' in selecting a method for function 'nrow': error in evaluating the argument 'object' in selecting a method for function 'pData': object 'cv1_monocytes' not found
sum(pData(cv1_monocytes)[["finaloutcome"]] == "cure")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'pData': object 'cv1_monocytes' not found
sum(pData(cv1_monocytes)[["finaloutcome"]] == "failure")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'pData': object 'cv1_monocytes' not found
nrow(pData(cv2_monocytes))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'x' in selecting a method for function 'nrow': error in evaluating the argument 'object' in selecting a method for function 'pData': object 'cv2_monocytes' not found
sum(pData(cv2_monocytes)[["finaloutcome"]] == "cure")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'pData': object 'cv2_monocytes' not found
sum(pData(cv2_monocytes)[["finaloutcome"]] == "failure")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'pData': object 'cv2_monocytes' not found
nrow(pData(cv3_monocytes))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'x' in selecting a method for function 'nrow': error in evaluating the argument 'object' in selecting a method for function 'pData': object 'cv3_monocytes' not found
sum(pData(cv3_monocytes)[["finaloutcome"]] == "cure")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'pData': object 'cv3_monocytes' not found
sum(pData(cv3_monocytes)[["finaloutcome"]] == "failure")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'pData': object 'cv3_monocytes' not found
#all_types[["neutrophils"]]
sum(pData(c_neutrophils)[["finaloutcome"]] == "cure")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'pData': object 'c_neutrophils' not found
sum(pData(c_neutrophils)[["finaloutcome"]] == "failure")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'pData': object 'c_neutrophils' not found
nrow(pData(cv1_neutrophils))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'x' in selecting a method for function 'nrow': error in evaluating the argument 'object' in selecting a method for function 'pData': object 'cv1_neutrophils' not found
sum(pData(cv1_neutrophils)[["finaloutcome"]] == "cure")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'pData': object 'cv1_neutrophils' not found
sum(pData(cv1_neutrophils)[["finaloutcome"]] == "failure")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'pData': object 'cv1_neutrophils' not found
nrow(pData(cv2_monocytes))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'x' in selecting a method for function 'nrow': error in evaluating the argument 'object' in selecting a method for function 'pData': object 'cv2_monocytes' not found
sum(pData(cv2_neutrophils)[["finaloutcome"]] == "cure")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'pData': object 'cv2_neutrophils' not found
sum(pData(cv2_neutrophils)[["finaloutcome"]] == "failure")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'pData': object 'cv2_neutrophils' not found
nrow(pData(cv3_neutrophils))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'x' in selecting a method for function 'nrow': error in evaluating the argument 'object' in selecting a method for function 'pData': object 'cv3_neutrophils' not found
sum(pData(cv3_neutrophils)[["finaloutcome"]] == "cure")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'pData': object 'cv3_neutrophils' not found
sum(pData(cv3_neutrophils)[["finaloutcome"]] == "failure")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'pData': object 'cv3_neutrophils' not found

15 An external dataset

One potentially interesting comparisons point, especially vis a vis the Biopsy samples, is to compare with another set of recent L. braziliensis infected biopsy samples. The following sets up an expressionset using the raw data from bioproject PRJNA525604.

Note 202409: I just added the scott tsv metadata to this container and thus to this data structure; this only works because the samples are nicely in the same order.

new_sample_sheet <- sm(
  suppressWarnings(gather_preprocessing_metadata(
    "sample_sheets/scott_sra_samples.xlsx", specification = make_rnaseq_spec())))
scott_metadata <- as.data.frame(readr::read_tsv("sample_sheets/scott_capsule_studydesign.tsv"))
## Rows: 28 Columns: 8
## -- Column specification --------------------------------------------------------
## Delimiter: "\t"
## chr (8): sample, disease, treatment_outcome, age, sex, DTH, lesion_size, Tim...
## 
## i Use `spec()` to retrieve the full column specification for this data.
## i Specify the column types or set `show_col_types = FALSE` to quiet this message.
new_meta <- cbind.data.frame(new_sample_sheet[["new_meta"]], scott_metadata)

external_cf <- create_expt(new_meta,
                           gene_info = hs_annot, file_column = "hisat_count_table") %>%
  set_expt_conditions(fact = "treatment_outcome") %>%
    set_expt_batches(fact = "sex") %>%
    subset_expt(subset = "condition!='na'")
## Reading the sample metadata.
## The sample definitions comprises: 28 rows(samples) and 47 columns(metadata fields).
## Matched 21476 annotations and counts.
## Bringing together the count matrix and gene information.
## Some annotations were lost in merging, setting them to 'undefined'.
## Saving the expressionset to 'expt.rda'.
## The final expressionset has 21481 features and 28 samples.
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'subset_expt': error in evaluating the argument 'object' in selecting a method for function 'pData': The provided factor is not in the design matrix.
pData(external_cf)[["ParasiteSpecies"]] <- "lvbraziliensis"
## Error: object 'external_cf' not found
save(list = "external_cf", file = glue("rda/tmrc3_external_cf-v{ver}.rda"))
## Error in save(list = "external_cf", file = glue("rda/tmrc3_external_cf-v{ver}.rda")): object 'external_cf' not found
data_structures <- c(data_structures, "external_cf")

biopsy_cf <- set_expt_conditions(tc_biopsies, fact = "finaloutcome")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'pData': object 'tc_biopsies' not found
pData(biopsy_cf)[["lab"]] <- "Colombia"
## Error: object 'biopsy_cf' not found
pData(external_cf)[["lab"]] <- "Brazil"
## Error: object 'external_cf' not found
pData(external_cf)[["finaloutcome"]] <- pData(external_cf)[["treatmentoutcome"]]
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'pData': object 'external_cf' not found
tmrc3_external <- combine_expts(external_cf, biopsy_cf) %>%
  set_expt_conditions(fact = "lab", colors = color_choices[["labs"]]) %>%
  set_expt_batches(fact = "finaloutcome")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'pData': error in evaluating the argument 'object' in selecting a method for function 'pData': object 'external_cf' not found
save(list = "tmrc3_external", file = glue("rda/tmrc3_external-v{ver}.rda"))
## Error in save(list = "tmrc3_external", file = glue("rda/tmrc3_external-v{ver}.rda")): object 'tmrc3_external' not found
data_structures <- c(data_structures, "tmrc3_external")

tmrc3_external_species <- set_expt_conditions(
  tmrc3_external, fact = "ParasiteSpecies", colors = color_choices[["parasite"]]) %>%
  set_expt_batches(fact = "lab")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'pData': error in evaluating the argument 'object' in selecting a method for function 'pData': object 'tmrc3_external' not found
save(list = "tmrc3_external_species", file = glue("rda/tmrc3_external_sepcies-v{ver}.rda"))
## Error in save(list = "tmrc3_external_species", file = glue("rda/tmrc3_external_sepcies-v{ver}.rda")): object 'tmrc3_external_species' not found
data_structures <- c(data_structures, "tmrc3_external_species")

## In my singularity container, this fails with a pthread problem, not doing quant here.
#tt <- normalize_expt(tmrc3_external_species, filter = TRUE, transform = "log2",
#                     convert = "cpm", norm = "quant")
tt <- normalize_expt(tmrc3_external_species, filter = TRUE, transform = "log2",
                     convert = "cpm", norm = "tmm")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'expt' in selecting a method for function 'normalize_expt': object 'tmrc3_external_species' not found
plot_pca(tt)
## Error in plot_pca(tt): This understands classes of type: expt, ExpressionSet, data.frame, and matrix.
confused <- set_expt_conditions(
  hs_expt, fact = "ParasiteSpecies", colors = color_choices[["parasite"]])
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'pData': object 'hs_expt' not found

15.1 Ethnicity

tc_etnia_expt <- set_expt_conditions(
  tc_clinical, fact = "etnia", colors = color_choices[["ethnicity"]])
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'pData': object 'tc_clinical' not found
save(list = "tc_etnia_expt", file = glue("rda/tmrc3_tc_etnia-v{ver}.rda"))
## Error in save(list = "tc_etnia_expt", file = glue("rda/tmrc3_tc_etnia-v{ver}.rda")): object 'tc_etnia_expt' not found
data_structures <- c(data_structures, "tc_etnia_expt")

t_etnia_expt <- set_expt_conditions(
  t_clinical, fact = "etnia", colors = color_choices[["ethnicity"]])
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'pData': object 't_clinical' not found
save(list = "t_etnia_expt", file = glue("rda/tmrc3_t_etnia-v{ver}.rda"))
## Error in save(list = "t_etnia_expt", file = glue("rda/tmrc3_t_etnia-v{ver}.rda")): object 't_etnia_expt' not found
data_structures <- c(data_structures, "t_etnia_expt")

16 Bring back the parasites

haha I knew I should not have removed the following block. In previous iterations of this I included a datastructure which pulled in the parasite reads from all samples with ‘sufficient’ coverage. This is not very many samples, for the simple reason that the drug treatment basically works! As a result, we removed the following section from the container (also for space). Oh, I may need to copy some more count tables into the container recipe for this to work.

It should be noted (if anyone ever reads this), that I also did a version of all of these analyses where I explicitly made a concatenated database (genome/gff/CDS) of human and parasite references (e.g. for salmon/hisat/bwa/etc) and did all of this using it in order to satisfy myself that the various treatments are similar enough to be called the same (I just saw that block while hunting for this parasite data and thought it was worth noting).

In any event, the following is copy/pasted from my working tree:

16.1 Dataset: Parasite reads

Make an expressionset of the parasite reads in the TMRC3 samples and distinguish between the faux and real reads. E.g: Are there samples which definitively contain parasites?

Later, I manually went through the mappings of samples with a significant number of parasite reads in IGV with some TMRC2 known zymodeme samples. In many cases it is possible to state definitively the classification of the parasite which infected an individual.

Note: I am renaming the resulting data structures a little because we generally do not call things ‘tmrc2/tmrc3/etc’ in the container.

lp_expt <- create_expt(
  samplesheet,
  file_column = "lpanamensis_v36hisat_file", gene_info = all_lp_annot) %>%
  subset_expt(coverage = 30000) %>%
  subset_expt(nonzero = 3000) %>%
  set_expt_conditions(fact = "typeofcells") %>%
  subset_expt(subset = "clinic!='undefined'") %>%
  sanitize_expt_pData("finaloutcome")
## Reading the sample metadata.
## Did not find the column: sampleid.
## Setting the ID column to the first column.
## Dropped 69 rows from the sample metadata because the sample ID is blank.
## Warning in extract_metadata(metadata, id_column = id_column, ...): There were
## NA values in the condition column, setting them to 'undefined'.

## Warning in extract_metadata(metadata, id_column = id_column, ...): There were
## NA values in the condition column, setting them to 'undefined'.
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'pData': error in evaluating the argument 'expt' in selecting a method for function 'subset_expt': error in evaluating the argument 'object' in selecting a method for function 'pData': error in evaluating the argument 'expt' in selecting a method for function 'subset_expt': error in evaluating the argument 'expt' in selecting a method for function 'subset_expt': character string is not in a standard unambiguous format
visit_fact <- pData(lp_expt)[["visitnumber"]]
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'pData': object 'lp_expt' not found
batch_na <- is.na(visit_fact)
## Error in eval(expr, envir, enclos): object 'visit_fact' not found
visit_fact[batch_na] <- "undefined"
## Error: object 'visit_fact' not found
lp_expt <- set_expt_batches(lp_expt, fact = visit_fact)
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'pData': object 'lp_expt' not found
save(list = "lp_expt", file = glue("rda/lp_expt_all_sanitized-v{ver}.rda"))
## Error in save(list = "lp_expt", file = glue("rda/lp_expt_all_sanitized-v{ver}.rda")): object 'lp_expt' not found
data_structures <- c(data_structures, "lp_expt")

The above block is similar in concept to the previous expressionset creation. It uses a different column and currently ignores the gene annotations. Given that many of the samples have essentially 0 reads, I set a cutoff of only 20 observed genes. Finally, I did a quick and dirty PCA plot of this peculiar data structure in the hopes of being able to ‘see’ the difference between what are assumed to be ‘real’ samples with a significant number of ‘real’ parasite reads vs. those samples which just have a couple of potentially spurious reads.

17 Save all data structures into one big pile

found_idx <- data_structures %in% ls()
if (sum(!found_idx) > 0) {
  not_found <- data_structures[!found_idx]
  warning("Some datastructures were not generated: ", toString(not_found), ".")
  data_structures <- data_structures[found_idx]
}
## Warning: Some datastructures were not generated: meta, hs_expt,
## hs_pd_demographics, tc_valid, demographics_filtered, tc_cure, tc_fail,
## tcv1_samples, tcv2_samples, tcv3_samples, tc_clinical, tc_monocytes,
## tcv1_monocytes, tcv2_monocytes, tcv3_monocytes, tc_eosinophils,
## tcv1_eosinophils, tcv2_eosinophils, tcv3_eosinophils, tc_clinical_nobiop,
## tc_biopsies, tc_neutrophils, tcv1_neutrophils, tcv2_neutrophils,
## tcv3_neutrophils, tc_sex, t_clinical, t_clinical_nobiop, t_biopsies,
## t_eosinophils, t_monocytes, t_neutrophils, tv1_samples, tv2_samples,
## tv3_samples, tv1_eosinophils, tv2_eosinophils, tv3_eosinophils, tv1_monocytes,
## tv2_monocytes, tv3_monocytes, tv1_neutrophils, tv2_neutrophils,
## tv3_neutrophils, c_clinical, c_clinical_nobiop, c_biopsies, c_eosinophils,
## c_monocytes, c_neutrophils, cv1_samples, cv2_samples, cv3_samples,
## cv1_eosinophils, cv2_eosinophils, cv3_eosinophils, cv1_monocytes,
## cv2_monocytes, cv3_monocytes, cv1_neutrophils, cv2_neutrophils,
## cv3_neutrophils, tc_visit, tc_v1vs, t_v1vs, t_visit, t_visitcf,
## t_visitcf_eosinophil, t_visitcf_monocyte, t_visitcf_neutrophil, c_visit,
## c_visitcf, c_visitcf_eosinophil, c_visitcf_monocyte, c_visitcf_neutrophil,
## external_cf, tmrc3_external, tmrc3_external_species, tc_etnia_expt,
## t_etnia_expt, lp_expt.
save(list = data_structures, file = glue("rda/tmrc3_data_structures-v{ver}.rda"))
## Warning in gzfile(file, "wb"): cannot open compressed file
## 'rda/tmrc3_data_structures-v202411.rda', probable reason 'No such file or
## directory'
## Error in gzfile(file, "wb"): cannot open the connection
pander::pander(sessionInfo())

R version 4.4.1 (2024-06-14)

Platform: x86_64-conda-linux-gnu

locale: C

attached base packages: stats4, stats, graphics, grDevices, utils, datasets, methods and base

other attached packages: org.Lpanamensis.MHOMCOL81L13.v68.eg.db(v.2024.09), AnnotationDbi(v.1.64.1), tidyr(v.1.3.1), hpgltools(v.1.0), Matrix(v.1.6-5), SummarizedExperiment(v.1.32.0), GenomicRanges(v.1.54.1), GenomeInfoDb(v.1.38.6), IRanges(v.2.36.0), S4Vectors(v.0.40.2), MatrixGenerics(v.1.14.0), matrixStats(v.1.2.0), Biobase(v.2.62.0), BiocGenerics(v.0.48.1), glue(v.1.7.0), forcats(v.1.0.0) and dplyr(v.1.1.4)

loaded via a namespace (and not attached): RColorBrewer(v.1.1-3), jsonlite(v.1.8.8), magrittr(v.2.0.3), GenomicFeatures(v.1.54.3), rmarkdown(v.2.25), BiocIO(v.1.12.0), fs(v.1.6.3), zlibbioc(v.1.48.0), vctrs(v.0.6.5), Rsamtools(v.2.18.0), memoise(v.2.0.1), RCurl(v.1.98-1.14), htmltools(v.0.5.7), S4Arrays(v.1.2.0), progress(v.1.2.3), curl(v.5.2.0), broom(v.1.0.5), SparseArray(v.1.2.4), sass(v.0.4.8), bslib(v.0.6.1), htmlwidgets(v.1.6.4), plyr(v.1.8.9), testthat(v.3.2.1), plotly(v.4.10.4), cachem(v.1.0.8), GenomicAlignments(v.1.38.2), mime(v.0.12), lifecycle(v.1.0.4), iterators(v.1.0.14), pkgconfig(v.2.0.3), R6(v.2.5.1), fastmap(v.1.1.1), GenomeInfoDbData(v.1.2.11), shiny(v.1.8.0), digest(v.0.6.34), colorspace(v.2.1-0), RSQLite(v.2.3.5), filelock(v.1.0.3), fansi(v.1.0.6), httr(v.1.4.7), abind(v.1.4-5), compiler(v.4.4.1), pander(v.0.6.5), bit64(v.4.0.5), withr(v.3.0.0), backports(v.1.4.1), BiocParallel(v.1.36.0), DBI(v.1.2.2), biomaRt(v.2.58.2), rappdirs(v.0.3.3), DelayedArray(v.0.28.0), rjson(v.0.2.21), HDO.db(v.0.99.1), tools(v.4.4.1), zip(v.2.3.1), httpuv(v.1.6.14), varhandle(v.2.0.6), restfulr(v.0.0.15), GOSemSim(v.2.28.1), promises(v.1.2.1), grid(v.4.4.1), reshape2(v.1.4.4), fgsea(v.1.28.0), generics(v.0.1.3), gtable(v.0.3.4), tzdb(v.0.4.0), data.table(v.1.15.0), hms(v.1.1.3), xml2(v.1.3.6), utf8(v.1.2.4), XVector(v.0.42.0), foreach(v.1.5.2), pillar(v.1.9.0), stringr(v.1.5.1), vroom(v.1.6.5), yulab.utils(v.0.1.7), later(v.1.3.2), splines(v.4.4.1), BiocFileCache(v.2.10.1), lattice(v.0.22-5), rtracklayer(v.1.62.0), bit(v.4.0.5), annotate(v.1.80.0), tidyselect(v.1.2.0), GO.db(v.3.18.0), Biostrings(v.2.70.2), knitr(v.1.45), xfun(v.0.42), brio(v.1.1.4), stringi(v.1.8.3), lazyeval(v.0.2.2), yaml(v.2.3.8), evaluate(v.0.23), codetools(v.0.2-19), tibble(v.3.2.1), qvalue(v.2.34.0), graph(v.1.80.0), cli(v.3.6.2), xtable(v.1.8-4), munsell(v.0.5.0), jquerylib(v.0.1.4), Rcpp(v.1.0.12), dbplyr(v.2.4.0), png(v.0.1-8), XML(v.3.99-0.16.1), parallel(v.4.4.1), ellipsis(v.0.3.2), readr(v.2.1.5), ggplot2(v.3.5.0), blob(v.1.2.4), prettyunits(v.1.2.0), DOSE(v.3.28.2), bitops(v.1.0-7), viridisLite(v.0.4.2), GSEABase(v.1.64.0), scales(v.1.3.0), openxlsx(v.4.2.5.2), purrr(v.1.0.2), crayon(v.1.5.2), rlang(v.1.1.3), cowplot(v.1.1.3), fastmatch(v.1.1-4), KEGGREST(v.1.42.0) and waldo(v.0.5.2)

message("This is hpgltools commit: ", get_git_commit())
## If you wish to reproduce this exact build of hpgltools, invoke the following:
## > git clone http://github.com/abelew/hpgltools.git
## > git reset 08c5d4e0f4602762a9507c7b53068ac99f62c683
## This is hpgltools commit: Mon Nov 4 14:19:02 2024 -0500: 08c5d4e0f4602762a9507c7b53068ac99f62c683
message("Saving to ", savefile)
## Saving to 01datasets.rda.xz
# tmp <- sm(saveme(filename = savefile))
tmp <- loadme(filename = savefile)

Bibliography

AnnotationDbi.” n.d. Bioconductor. http://bioconductor.org/packages/AnnotationDbi/. Accessed June 27, 2024.
“Homo Sapiens - Ensembl Genome Browser 100.” n.d. http://apr2020.archive.ensembl.org/Homo_sapiens/Info/Index. Accessed June 27, 2024.
Huber, Wolfgang, Vincent J. Carey, Robert Gentleman, Simon Anders, Marc Carlson, Benilton S. Carvalho, Hector Corrada Bravo, et al. 2015. “Orchestrating High-Throughput Genomic Analysis with Bioconductor.” Nature Methods 12 (2): 115–21. https://doi.org/10.1038/nmeth.3252.
Smedley, Damian, Syed Haider, Benoit Ballester, Richard Holland, Darin London, Gudmundur Thorisson, and Arek Kasprzyk. 2009. BioMart – Biological Queries Made Easy.” BMC Genomics 10 (1): 22. https://doi.org/10.1186/1471-2164-10-22.
SummarizedExperiment.” n.d. Bioconductor. http://bioconductor.org/packages/SummarizedExperiment/. Accessed June 27, 2024.
TriTrypDB Leishmania Panamensis, Version 46.” n.d. https://tritrypdb.org/common/downloads/release-46/LpanamensisMHOMCOL81L13/. Accessed June 27, 2024.
LS0tCnRpdGxlOiAiVE1SQzMgYHIgU3lzLmdldGVudignVkVSU0lPTicpYDogQ3JlYXRpbmcgRGF0YSBTdHJ1Y3R1cmVzIgphdXRob3I6ICJhdGIgYWJlbGV3QGdtYWlsLmNvbSIKZGF0ZTogImByIFN5cy5EYXRlKClgIgpiaWJsaW9ncmFwaHk6IGF0Yi5iaWIKb3V0cHV0OgogIGh0bWxfZG9jdW1lbnQ6CiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlCiAgICBjb2RlX2ZvbGRpbmc6IHNob3cKICAgIGZpZ19jYXB0aW9uOiB0cnVlCiAgICBmaWdfaGVpZ2h0OiA3CiAgICBmaWdfd2lkdGg6IDcKICAgIGhpZ2hsaWdodDogemVuYnVybgogICAga2VlcF9tZDogZmFsc2UKICAgIG1vZGU6IHNlbGZjb250YWluZWQKICAgIG51bWJlcl9zZWN0aW9uczogdHJ1ZQogICAgc2VsZl9jb250YWluZWQ6IHRydWUKICAgIHRoZW1lOiByZWFkYWJsZQogICAgdG9jOiB0cnVlCiAgICB0b2NfZmxvYXQ6CiAgICAgIGNvbGxhcHNlZDogZmFsc2UKICAgICAgc21vb3RoX3Njcm9sbDogZmFsc2UKLS0tCgo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgpib2R5IC5tYWluLWNvbnRhaW5lciB7CiAgbWF4LXdpZHRoOiAxNjAwcHg7Cn0KYm9keSwgdGQgewogIGZvbnQtc2l6ZTogMTZweDsKfQpjb2RlLnIgewogIGZvbnQtc2l6ZTogMTZweDsKfQpwcmUgewogIGZvbnQtc2l6ZTogMTZweAp9Cjwvc3R5bGU+CgpgYGB7ciBvcHRpb25zLCBpbmNsdWRlID0gRkFMU0V9CmxpYnJhcnkoZHBseXIpCmxpYnJhcnkoZm9yY2F0cykKbGlicmFyeShnbHVlKQpsaWJyYXJ5KGhwZ2x0b29scykKbGlicmFyeSh0aWR5cikKCmtuaXRyOjpvcHRzX2tuaXQkc2V0KHByb2dyZXNzID0gVFJVRSwgdmVyYm9zZSA9IFRSVUUsIHdpZHRoID0gOTAsIGVjaG8gPSBUUlVFKQprbml0cjo6b3B0c19jaHVuayRzZXQoCiAgZXJyb3IgPSBUUlVFLCBmaWcud2lkdGggPSA4LCBmaWcuaGVpZ2h0ID0gOCwgZmlnLnJldGluYSA9IDIsCiAgb3V0LndpZHRoID0gIjEwMCUiLCBkZXYgPSAicG5nIiwKICBkZXYuYXJncyA9IGxpc3QocG5nID0gbGlzdCh0eXBlID0gImNhaXJvLXBuZyIpKSkKb2xkX29wdGlvbnMgPC0gb3B0aW9ucyhkaWdpdHMgPSA0LCBzdHJpbmdzQXNGYWN0b3JzID0gRkFMU0UsIGtuaXRyLmR1cGxpY2F0ZS5sYWJlbCA9ICJhbGxvdyIpCmdncGxvdDI6OnRoZW1lX3NldChnZ3Bsb3QyOjp0aGVtZV9idyhiYXNlX3NpemUgPSAxMikpCnZlciA8LSBTeXMuZ2V0ZW52KCJWRVJTSU9OIikKcnVuZGF0ZSA8LSBmb3JtYXQoU3lzLkRhdGUoKSwgZm9ybWF0ID0gIiVZJW0lZCIpCgpybWRfZmlsZSA8LSAiMDFkYXRhc2V0cy5SbWQiCnNhdmVmaWxlIDwtIGdzdWIocGF0dGVybiA9ICJcXC5SbWQiLCByZXBsYWNlID0gIlxcLnJkYVxcLnh6IiwgeCA9IHJtZF9maWxlKQptZXRob2RzIDwtIGxpc3QoImJhc2ljIiA9IFRSVUUsICJkZXNlcSIgPSBUUlVFLCAiZHJlYW0iID0gRkFMU0UsCiAgICAgICAgICAgICAgICAiZWJzZXEiID0gRkFMU0UsICJlZGdlciIgPSBUUlVFLCAibGltbWEiID0gVFJVRSwgIm5vaXNlcSIgPSBUUlVFKQpkYXRhX3N0cnVjdHVyZXMgPC0gYygibWV0aG9kcyIpCmBgYAoKIyBUT0RPCgoxLiAgRW5zdXJlIG5vIGNvbHVtbnMgaGF2ZSBuYW1lcyBsaWtlICdldG5pYScgYnV0IGluc3RlYWQKICAgICdldGhuaWNpdHlfY2F0JwoyLiAgRGVjaWRlIGhvdyB0byBoYW5kbGUgdGhlIHJldGlyZW1lbnQgb2YgdHJpdHJ5cGRiLm9yZwoKIyBDaGFuZ2Vsb2cKCiogMjAyNDA4OiBNYWRlIGRlbW9ncmFwaGljcyBkYXRhIG1vcmUgYXZhaWxhYmxlIGZvciB0aGUgbmV3IHJlZ3Jlc3Npb24gYW5hbHlzZXMuCiogMjAyNDA1OiBSZXdvcmtlZCBoYW5kbGluZyBvZiB0aGUgZGVtb2dyYXBoaWNzIGRhdGEKKiAyMDIzMDg6IFNtYWxsIHJlb3JnYW5pemF0aW9uIHRvIG1vcmUgY2xvc2VseSBhZGhlcmUgdG8gdGhlIGZsb3cgb2YgdGhlIG1hbnVzY3JpcHQncyB0ZXh0LgoqIDIwMjMwNTogVXBkYXRlZCBkZWZhdWx0IGltYWdlIGZvcm1hdC4KKiAyMDIzMDQ6IEFkZGVkIGEgc2VyaWVzIG9mIHN0YW56YXMgcHJpbnRpbmcgb3V0IHRoZSBDYWxpLW9ubHkgZGF0YS4KKiBVcGRhdGVkIGlucHV0IG1ldGFkYXRhIHNoZWV0cwoKIyBOb3RlcwoKKiBJbnRlcmZlcm9uIHNjb3JlIGZvciBzZXZlcml0eS4gIEEgZmV3IGRpZmZlcmVudCBzZXRzIGFyZSBhdmFpbGFibGUsCiAgbWF5IG5lZWQgdG8gY2hvb3NlIGEgc3BlY2lmaWMgcGFwZXIsIHRoZW4gbW9kaWZ5IGl0PwoKIyBJbnRyb2R1Y3Rpb24KClRoaXMgZG9jdW1lbnQgdGFrZXMgdGhlIHZhcmlvdXMgb3V0cHV0cyBwcm9kdWNlZCBieQpzYWxtb24vaGlzYXQvaHRzZXEvZXRjIGFuZCBnZW5lcmF0ZXMgdGhlIGRhdGEgd2hpY2ggd2lsbCBiZSB1c2VkIGluCmFsbCBvZiB0aGUgZm9sbG93aW5nIGFuYWx5c2VzLgoKIyMgTWV0YWRhdGEgU291cmNlcwoKUGVyaW9kaWNhbGx5LCB0aGUgc2hhcmVkIG1ldGFkYXRhIHNoZWV0IHdhcyBkb3dubG9hZGVkIGxvY2FsbHkgdG8gdGhlCnNhbXBsZV9zaGVldHMvIGRpcmVjdG9yeSwgZ2l2ZW4gYSBzdWZmaXggY29ycmVzcG9uZGluZyB0byB0aGUgY3VycmVudAp3b3Jrc2hlZXQgcmV2aXNpb24sIGFuZCB0aGUgdmFyaW91cyB0cmltbWluZy9hbGlnbm1lbnQvZXRjIHN0YXRpc3RpY3MKd2VyZSBtYW51YWxseSBhZGRlZC4gIEZpbmFsbHksIHNvbWUgZGVtb2dyYXBoaWNzIHdlcmUKYXBwZW5kZWQgdG8gdGhlIHNhbXBsZSBtZXRhZGF0YS4gIFRoZSByZXN1bHRpbmcgbW9kaWZpZWQgbWV0YWRhdGEKd2FzIHVzZWQgYXMgdGhlIGlucHV0IGZvciBhbGwgZm9sbG93aW5nIGFuYWx5c2VzLgoKYGBge3J9CnNhbXBsZXNoZWV0IDwtICJzYW1wbGVfc2hlZXRzL3RtcmMzX3NhbXBsZXMueGxzeCIKdGVzdHRoYXQ6OmV4cGVjdF90cnVlKGZpbGUuZXhpc3RzKHNhbXBsZXNoZWV0KSkKZGVtb2dyYXBoaWNzIDwtICJzYW1wbGVfc2hlZXRzL3RtcmMzX2RlbW9ncmFwaGljc3YyLnhsc3giCmhzbHBfc2FtcGxlc2hlZXQgPC0gInNhbXBsZV9zaGVldHMvdG1yYzNfc2FtcGxlc19wcnVuZWQueGxzeCIKc3BlY2llc19pZGVudGl0aWVzIDwtICJzYW1wbGVfc2hlZXRzL2lkZW50aWZpZWRfcGFyYXNpdGVfc3BlY2llcy54bHN4IgpkYXRhX3N0cnVjdHVyZXMgPC0gYyhkYXRhX3N0cnVjdHVyZXMsICJzYW1wbGVzaGVldCIsICJkZW1vZ3JhcGhpY3MiKQpgYGAKCiMgQW5ub3RhdGlvbiBDb2xsZWN0aW9uCgpUaGUgcHJpbWFyeSBhbm5vdGF0aW9uIHNvdXJjZXMgYXJlOgoKMS4gIEVuc2VtYmwncyBiaW9tYXJ0IGFyY2hpdmUgZnJvbSAyMDIwIGZvciBodW1hbiBhbm5vdGF0aW9ucyAoQEhvbW9TYXBpZW5zRW5zZW1ibGEpLgoyLiAgVGhlIFRyaVRyeXBEQiByZWxlYXNlIDM2IGZvciBwYXJhc2l0ZSBhbm5vdGF0aW9ucyAoQFRyaVRyeXBEQkxlaXNobWFuaWFQYW5hbWVuc2lzKS4KCkJvdGggcHJvdmlkZSBHTyBkYXRhLiAgVGhleSBhbHNvIHByb3ZpZGUgaGVscGZ1bCBsaW5rcyB0byBvdGhlciBkYXRhCnNvdXJjZXMuICBGb3IgdGhlIG1vbWVudCwgd2UgYXJlIGZvY3VzaW5nIG9uIHRoZSBodW1hbiBhbm5vdGF0aW9ucy4KSW4gdGhlIGZpcnN0IGluc3RhbmNlLCB0aGUgYW5ub3RhdGlvbnMgYXJlIGFjcXVpcmVkIHZpYSBzb21lIGZ1bmN0aW9ucwppbiBocGdsdG9vbHMgd2hpY2ggc2VlayB0byBtYWtlIGJpb21hUnQKKEBzbWVkbGV5QmlvTWFydEJpb2xvZ2ljYWxRdWVyaWVzMjAwOSkgYSBsaXR0bGUgbW9yZSByb2J1c3QuIEluIHRoZQpzZWNvbmQgaW5zdGFuY2UsIHRoZSBhbm5vdGF0aW9ucyBhcmUgZXh0cmFjdGVkIGZyb20gYSBsb2NhbGx5CmdlbmVyYXRlZCBvcmdEQi9hbm5vdGF0aW9uRGJpIChAQW5ub3RhdGlvbkRiaSkgaW5zdGFuY2UuCgojIyBHZW5lIGFubm90YXRpb25zCgpUaGVzZSBhbmFseXNlcyBoYXZlIGZvY3VzZWQgb24gZ2VuZS1sZXZlbCBhYnVuZGFuY2VzL2RpZmZlcmVuY2VzLgpUaHVzLCB3aGVuIGh0c2VxLWNvdW50IHdhcyBpbnZva2VkIGFnYWluc3QgdGhlIGhpc2F0Mi1iYXNlZCBtYXBwaW5ncywKcGFyYW1ldGVycyB3ZXJlIGNob3NlbiB0byBjb3VudCBnZW5lcyByYXRoZXIgdGhhbiB0cmFuc2NyaXB0cy4gIEluIHRoaXMKY29udGV4dCwgYSBnZW5lIHJlZmVycyB0byB0aGUgbm9uLXJlZHVuZGFudCB1bmlvbiBvZiB0aGUgdHJhbnNjcmlwdHMnIGV4b25zLgpTaW1pbGFybHksIHdoZW4gc2FsbW9uIGNvdW50cyB3ZXJlIHVzZWQgdmlhIHR4aW1wb3J0LCBhIG1hcHBpbmcgb2YKZ2VuZXMgdG8gdHJhbnNjcmlwdHMgd2FzIHVzZWQgdG8gY29sbGFwc2UgdGhlIG1hdHJpeCB0byBnZW5lLWxldmVsCmFidW5kYW5jZXMuICBUaGlzIGRlY2lzaW9uIG1heSBiZSByZXZpc2l0ZWQuCgpUaGUgcGFyYXNpdGUgYW5ub3RhdGlvbnMgd2VyZSBkb3dubG9hZGVkIGZyb20gdGhlIHRyaXRyeXBkYiB2aWEgdGhlCnByb3ZpZGVkIFJFU1QgaW50ZXJmYWNlLCBleHBvcnRlZCBpbnRvIGFuIE9yZ0RCIGluc3RhbmNlLCBhbmQKZXh0cmFjdGVkIHZpYSB0aGUgRXVQYXRoREIgcGFja2FnZS4KCmBgYHtyfQpoc19hbm5vdCA8LSBsb2FkX2Jpb21hcnRfYW5ub3RhdGlvbnMoeWVhciA9ICIyMDIwIiwgbW9udGggPSAiamFuIikKaHNfYW5ub3QgPC0gaHNfYW5ub3RbWyJhbm5vdGF0aW9uIl1dCiMjIFRoZSBuZXh0IHR3byBsaW5lcyBtYWtlIGEgYnJpZGdlIGJldHdlZW4gdGhlIGdmZiBmaWxlIHVzZWQgYnkgaGlzYXQyCiMjIGFuZCB0aGUgZ2VuZSBJRHMuCmBgYAoKVGhlIGZvbGxvd2luZyBsaW5lcyBtYXkgYmUgdXNlZCBpZiBvbmUgd2lzaGVzIHRvIHVzZSB0aGUgcmVsYXRpdmVseQpzdHJpY3QgSUQudmVyc2lvbiBzeXN0ZW0gKG9wdGlvbmFsbHkpIGVuZm9yY2VkIGJ5IHNhbG1vbi4gIEl0IHNob3VsZApiZSBub3RlZCB0aGF0IG5ld2VyIHZlcnNpb25zIG9mIHR4aW1wb3J0IGhhdmUgb3B0aW9ucyB3aGljaCBpZ25vcmUKdGhpcywgYW5kIEkgYWxzbyBub3cgaGF2ZSBhIGZ1bmN0aW9uIHdoaWNoIHdpbGwgc2V0IHRoZSBJRC52ZXJzaW9uIGZvcgp0aGUgZ2VuZSBhbm5vdGF0aW9ucyB0byBiZSB0aGUgc2FtZSBhcyB3aGF0IHdhcyBvYnNlcnZlZCBpbiB0aGUgY291bnQKdGFibGVzLiAgRWl0aGVyIG9mIHRob3NlIHN0cmF0ZWdpZXMgbWFrZXMgdGhlIGZvbGxvd2luZyBub3QgbmVjZXNzYXJ5OwpidXQgaWYgeW91IHdpc2ggdG8gYmUgYSBsaXR0bGUgYml0IHBlZGFudGljIGFib3V0IHRoZSBnZW5lPC0+VHggSURzLAp0aGVuIHRoaXMgc2hvdWxkIGdpdmUgeW91IGEgc2Vuc2Ugb2YgaG93IHdlbGwgbWF0Y2hlZCBhcmUgdGhlIGRvd25sb2FkZWQKYW5ub3RhdGlvbnMgYW5kIGdlbmUgSURzIHVzZWQgYnkgc2FsbW9uLgoKYGBge3J9CmhzX2Fubm90W1sidHJhbnNjcmlwdCJdXSA8LSBwYXN0ZTAocm93bmFtZXMoaHNfYW5ub3QpLCAiLiIsIGhzX2Fubm90W1sidmVyc2lvbiJdXSkKaHNfYW5ub3QgPC0gZ3JvdXBfbWVhbl9jZHNfbGVuZ3RoKGhzX2Fubm90KQpoc190eF9hbm5vdCA8LSBoc19hbm5vdCAjIyBNYWtlIGEgY29weSBzbyBJIGRvbid0IGxvc2UgdHJhbnNjcmlwdCBJRHMgZm9yIHNhbG1vbgpyb3duYW1lcyhoc19hbm5vdCkgPC0gbWFrZS5uYW1lcyhoc19hbm5vdFtbImVuc2VtYmxfZ2VuZV9pZCJdXSwgdW5pcXVlID0gVFJVRSkKbm90X3VuaXF1ZV9pZHggPC0gZ3JlcGwoeCA9IHJvd25hbWVzKGhzX2Fubm90KSwgcGF0dGVybiA9ICJcXC5cXGQrJCIpCmhzX2Fubm90IDwtIGhzX2Fubm90WyFub3RfdW5pcXVlX2lkeCwgXQpgYGAKCiMjIyBBbHNvIGNvbGxlY3QgcGFyYXNpdGUgYW5ub3RhdGlvbnMKClRoZSBmb2xsb3dpbmcgYmxvY2sgd2lsbCBzdG9wIHdvcmtpbmcgc29vbi4gIEl0cyBwdXJwb3NlIGlzIHRvCmRvd25sb2FkIHRoZSBjdXJyZW50IChvciBhIHNwZWNpZmljIHZlcnNpb24pIGFubm90YXRpb25zIGZyb20gb25lIG9mCnRoZSBldXBhdGhkYi5vcmcgd2Vic2l0ZXMuICBUaGVzZSBhcmUgYmVpbmcgcmV0aXJlZC9tb3ZlZCBzb29uLiAgTXkKdmVyc2lvbiBvZiB0aGUgRXVQYXRoREIgcGFja2FnZSBjcmVhdGVzIGluc3RhbGxhYmxlIG9yZ2RiIHBhY2thZ2VzOyBzbwpJIHByZXN1bWFibHkgd2lsbCBqdXN0IG5lZWQgdG8gaW5jbHVkZSB0aGUgYXBwcm9wcmlhdGUgdGFyYmFsbHMgaW4gdGhlCnJlY2lwZSBmb3IgdGhpcyBjb250YWluZXIuICBJbiByZXNwb25zZSB0byB0aGUgcmV0aXJlbWVudCBvZiBldXBhdGhkYiwKSSBzcHVuIHVwIGFuIGluc3RhbmNlIG9mIG15IGV1cGF0aGRiIHBhY2thZ2UgdG8gZG93bmxvYWQgZXZlcnl0aGluZzsKaG9wZWZ1bGx5IGl0IHdpbGwgZmluaXNoIGJlZm9yZSB0aGUgdmFyaW91cyBzZXJ2ZXJzIGdvIGRvd24uICBJIHdhcwp0b28gbGF0ZSBmb3Igc2NoaXN0b2RiLCBpdCBpcyBhbHJlYWR5IG9mZmxpbmUgKEkgYW0gcHJldHR5IHN1cmUgSSBoYXZlCmFuIG9sZGVyIGNvcHkgdGhvdWdoKS4KCkdpdmVuIHRoYXQgSSByZWNlbnRseSBpbmNsdWRlZCB0aGUgcGFyYXNpdGUgdHJhbnNjcmlwdHMgdG8gdGhlIGRhdGEsIEkKc2hvdWxkIGFsc28gc3BlbmQgYSBtb21lbnQgYW5kIGZpZ3VyZSBvdXQgaG93IHRvIGluY2x1ZGUgdGhlCmFubm90YXRpb25zLgoKQXMgYSBzdGFydGluZyBwb2ludCwgSSB3aWxsIGp1c3QgZ3JhYiB0aGUgRXVQYXRoREIgcGFuYW1lbnNpcwphbm5vdGF0aW9ucy4gIEkgdGhpbmsgSSB3aWxsIG5lZWQgdG8gbGltaXQgdGhlbSB0byBqdXN0IHRoZSBzaGFyZWQKY29sdW1ucyBhbmQgZHJvcCB0aGUgcmVzdC4KCmBgYHtyLCBldmFsPUZBTFNFfQptZXRhIDwtIHNtKGRvd25sb2FkX2V1cGF0aF9tZXRhZGF0YSh3ZWJzZXJ2aWNlID0gInRyaXRyeXBkYiIpKQpwYW5hbWVuc2lzX2VudHJ5IDwtIGdldF9ldXBhdGhfZW50cnkoIk1IT00iLCBtZXRhZGF0YSA9IG1ldGFbWyJ2YWxpZCJdXSkKCnBhbmFtZW5zaXNfZGIgPC0gbWFrZV9ldXBhdGhfb3JnZGIocGFuYW1lbnNpc19lbnRyeSkKcGFuYW1lbnNpc19wa2cgPC0gcGFuYW1lbnNpc19kYltbInBrZ25hbWUiXV0KcGFja2FnZV9uYW1lIDwtIHBhbmFtZW5zaXNfZGJbWyJwa2duYW1lIl1dCmlmIChpcy5udWxsKHBhbmFtZW5zaXNfcGtnKSkgewogIHBhbmFtZW5zaXNfcGtnIDwtIHBhbmFtZW5zaXNfZGJbWyJvcmdkYl9uYW1lIl1dCiAgcGFja2FnZV9uYW1lIDwtIHBhbmFtZW5zaXNfcGtnCn0KdHQgPC0gbGlicmFyeShwYW5hbWVuc2lzX3BrZywgY2hhcmFjdGVyLm9ubHkgPSBUUlVFKQpwYW5hbWVuc2lzX3BrZyA8LSBnZXQwKHBhbmFtZW5zaXNfcGtnKQphbGxfZmllbGRzIDwtIGNvbHVtbnMocGFuYW1lbnNpc19wa2cpCmFsbF9scF9hbm5vdCA8LSBzbShsb2FkX29yZ2RiX2Fubm90YXRpb25zKAogICAgcGFuYW1lbnNpc19wa2csCiAgICBrZXl0eXBlID0gImdpZCIsCiAgICBmaWVsZHMgPSBjKCJhbm5vdF9nZW5lX2VudHJlel9pZCIsICJhbm5vdF9nZW5lX25hbWUiLAogICAgICAgICAgICAgICAiYW5ub3Rfc3RyYW5kIiwgImFubm90X2Nocm9tb3NvbWUiLCAiYW5ub3RfY2RzX2xlbmd0aCIsCiAgICAgICAgICAgICAgICJhbm5vdF9nZW5lX2xvY2F0aW9uX3RleHQiLCAiYW5ub3RfZ2VuZV9wcm9kdWN0IikpKSRnZW5lcwpgYGAKCk9rLCBJIGFkZGVkIHRoZSBvcmdkYiB0YXJiYWxsIGFuZCBhbiBlbnRyeSB0byBpbnN0YWxsIGl0IHRvIG15CmJvb3RzdHJhcCBmb3IgdGhpcyBjb250YWluZXIuICBTbyBsZXQgdXMgbG9hZCB0aGUgYW5ub3RhdGlvbnMgZm9yIG91cgpMZWlzaG1hbmlhbCBzdHJhaW4gb2YgaW50ZXJlc3QhCgpgYGB7cn0KcGFja2FnZV9uYW1lIDwtICJvcmcuTHBhbmFtZW5zaXMuTUhPTUNPTDgxTDEzLnY2OC5lZy5kYiIKdHQgPC0gbGlicmFyeShwYWNrYWdlX25hbWUsIGNoYXJhY3Rlci5vbmx5ID0gVFJVRSkKcGFuYW1lbnNpc19wa2cgPC0gZ2V0MChwYWNrYWdlX25hbWUpCmFsbF9maWVsZHMgPC0gY29sdW1ucyhwYW5hbWVuc2lzX3BrZykKYWxsX2xwX2Fubm90IDwtIHNtKGxvYWRfb3JnZGJfYW5ub3RhdGlvbnMoCiAgcGFja2FnZV9uYW1lLAogIGtleXR5cGUgPSAiZ2lkIiwKICBmaWVsZHMgPSBjKCJhbm5vdF9nZW5lX2VudHJlel9pZCIsICJhbm5vdF9nZW5lX25hbWUiLAogICAgICAgICAgICAgImFubm90X3N0cmFuZCIsICJhbm5vdF9jaHJvbW9zb21lIiwgImFubm90X2Nkc19sZW5ndGgiLAogICAgICAgICAgICAgImFubm90X2dlbmVfbG9jYXRpb25fdGV4dCIsICJhbm5vdF9nZW5lX3Byb2R1Y3QiKSkpW1siZ2VuZXMiXV0KYGBgCgpUaGUgZm9sbG93aW5nIHdhcyBhZGRlZCB0byBzdXBwb3J0IHRoZSBwb3NzaWJpbGl0eSBvZiBtYWtpbmcgYSBzaW5nbGUKZXhwcmVzc2lvbnNldCB1c2luZyB0aGUgbWFwcGluZ3MgYWdhaW5zdCBhIGdlbm9tZSBvZiBjb25jYXRlbmF0ZWQgaGczOAphbmQgbHBhbmFtZW5zaXMgc2VxdWVuY2UuICBJbiBvcmRlciB0byBkbyB0aGF0LCBvbmUgbXVzdCBoYXZlIGFuCmFubm90YXRpb24gc2V0IHdpdGggY29uc2lzdGVudCBjb2x1bW5zIGFjcm9zcyBhbGwgZ2VuZXMgZnJvbSBib3RoCnNwZWNpZXMuCgpJIGFtIG5vdCBzdXJlIGlmIEkgY29waWVkIHRob3NlIGNvdW50IHRhYmxlcyB0byB0aGUgY29udGFpbmVyIChJCnN1c3BlY3QgSSBkaWQgbm90KSwgYnV0IEkgd2lsbCBsZWF2ZSB0aGUgY29kZSBoZXJlIGFzIGFuIGV4YW1wbGUgb2YKaG93IG9uZSBtaWdodCBtYWtlIGEgY29uY2F0ZW5hdGVkIGV4cHJlc3Npb25zZXQvc3VtbWFyaXplZGV4cGVyaW1lbnQuCgpgYGB7cn0KYWxsX2xwX2Fubm90W1siZW5kIl1dIDwtIGdzdWIoeCA9IGFsbF9scF9hbm5vdFtbImFubm90X2dlbmVfbG9jYXRpb25fdGV4dCJdXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0dGVybiA9ICJeLipcXC5cXC4iLCByZXBsYWNlbWVudCA9ICIiKQphbGxfbHBfYW5ub3RbWyJlbmQiXV0gPC0gZ3N1Yih4ID0gYWxsX2xwX2Fubm90W1siZW5kIl1dLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuID0gIlxcKC4qJCIsIHJlcGxhY2VtZW50ID0gIiIpCmFsbF9scF9hbm5vdFtbImVuZCJdXSA8LSBnc3ViKHggPSBhbGxfbHBfYW5ub3RbWyJlbmQiXV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdHRlcm4gPSAiXFwsIiwgcmVwbGFjZW1lbnQgPSAiIikKYWxsX2xwX2Fubm90W1sic3RhcnQiXV0gPC0gZ3N1Yih4ID0gYWxsX2xwX2Fubm90W1siYW5ub3RfZ2VuZV9sb2NhdGlvbl90ZXh0Il1dLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdHRlcm4gPSAiXi4qOiIsIHJlcGxhY2VtZW50ID0gIiIpCmFsbF9scF9hbm5vdFtbInN0YXJ0Il1dIDwtIGdzdWIoeCA9IGFsbF9scF9hbm5vdFtbInN0YXJ0Il1dLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdHRlcm4gPSAiXFwuXFwuLiokIiwgcmVwbGFjZW1lbnQgPSAiIikKYWxsX2xwX2Fubm90W1sic3RhcnQiXV0gPC0gZ3N1Yih4ID0gYWxsX2xwX2Fubm90W1sic3RhcnQiXV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0dGVybiA9ICJcXCwiLCByZXBsYWNlbWVudCA9ICIiKQphbGxfbHBfYW5ub3RbWyJtZWFuX2Nkc19sZW4iXV0gPC0gYWxsX2xwX2Fubm90W1siYW5ub3RfY2RzX2xlbmd0aCJdXQphbGxfbHBfYW5ub3RbWyJ2ZXJzaW9uIl1dIDwtIDEKYWxsX2xwX2Fubm90W1sidHJhbnNjcmlwdF92ZXJzaW9uIl1dIDwtIDEKYWxsX2xwX2Fubm90W1siaGduY19zeW1ib2wiXV0gPC0gIiIKYWxsX2xwX2Fubm90W1sidW5pcHJvdF9nbl9zeW1ib2wiXV0gPC0gIiIKYWxsX2xwX2Fubm90W1sidHJhbnNjcmlwdCJdXSA8LSBhbGxfbHBfYW5ub3RbWyJnaWQiXV0KYWxsX2xwX2Fubm90W1siZW5zZW1ibF90cmFuc2NyaXB0X2lkIl1dIDwtIGFsbF9scF9hbm5vdFtbImdpZCJdXQoKY29sbmFtZXMoaHNfdHhfYW5ub3QpCmNvbG5hbWVzKGFsbF9scF9hbm5vdCkKd2FudGVkX2NvbHVtbnMgPC0gYygiZ2lkIiwgImVuc2VtYmxfdHJhbnNjcmlwdF9pZCIsICJ2ZXJzaW9uIiwgInRyYW5zY3JpcHRfdmVyc2lvbiIsICJhbm5vdF9nZW5lX3Byb2R1Y3QiLAogICAgICAgICAgICAgICAgICAgICJnZW5lX3R5cGUiLCAiYW5ub3RfY2RzX2xlbmd0aCIsICJhbm5vdF9jaHJvbW9zb21lIiwgImFubm90X3N0cmFuZCIsICJzdGFydCIsCiAgICAgICAgICAgICAgICAgICAgImVuZCIsICJoZ25jX3N5bWJvbCIsICJ1bmlwcm90X2duX3N5bWJvbCIsICJ0cmFuc2NyaXB0IiwgIm1lYW5fY2RzX2xlbiIpCmFsbF9scF9hbm5vdCA8LSBhbGxfbHBfYW5ub3RbLCB3YW50ZWRfY29sdW1uc10KY29sbmFtZXMoYWxsX2xwX2Fubm90KSA8LSBjb2xuYW1lcyhoc190eF9hbm5vdCkKCmhzbHBfYW5ub3QgPC0gcmJpbmQoaHNfdHhfYW5ub3QsIGFsbF9scF9hbm5vdCkKYGBgCgpGaW5hbGx5LCBkdW1wIHRoZSBjdXJyZW50IGdlbmUgb250b2xvZ3kgZGF0YSBmcm9tIHRoZQpFdVBhdGhEQi1nZW5lcmF0ZWQgb3JnZGIgaW5zdGFuY2UuICBUaGlzIG1heSBiZSB1c2VkIGJ5Cmdvc2VxL3RvcGdvL2dvc3RhdHMvZXRjLi4uCgpKdXN0IGFzIGEgbGFyaywgZ3JhYiBvcnRob2xvZ3MgYWNyb3NzIHRoZSBFdVBhdGhEQiBhcyB3ZWxsIGluIHRoZQpmb2xsb3dpbmcgYmxvY2suCgpPbmUgbWlnaHQgcmVhc29uYWJseSBhc2sgd2h5IGluIHRoZSBoZWNrIHRoZSBnZW5lIElEIGNvbHVtbiB3YXMKY2hhbmdlZCB0byAnZW5zZW1ibF9nZW5lX2lkJywgdGhpcyBpcyB0byBtYWtlIGl0IGVhc2llciAocG9zc2libGUpIHRvCm1lcmdlIHRoZXNlIGFubm90YXRpb25zIHdpdGggdGhlIGVuc2VtYmwgaHVtYW4gYW5ub3RhdGlvbnMsIGlmIG9uZQpjaG9vc2VzIHRvIGNvbWJpbmUgdGhlIHR3byBnZW5vbWVzIGFuZCBleGFtaW5lIHRoZW0gdG9nZXRoZXIuCgpgYGB7cn0KbHBfZ28gPC0gbG9hZF9vcmdkYl9nbyhwYWNrYWdlX25hbWUpCmxwX2dvIDwtIGxwX2dvWywgYygiR0lEIiwgIkdPIildCmxwX2xlbmd0aHMgPC0gYWxsX2xwX2Fubm90WywgYygiZW5zZW1ibF9nZW5lX2lkIiwgIm1lYW5fY2RzX2xlbiIpXQpjb2xuYW1lcyhscF9sZW5ndGhzKSAgPC0gYygiZ2lkIiwgImxlbmd0aCIpCmFsbF9scF9hbm5vdFtbImRlc2NyaXB0aW9uIl1dIDwtIHRvbG93ZXIoYWxsX2xwX2Fubm90W1siZGVzY3JpcHRpb24iXV0pCgojIyBleHRyYWN0X2V1cGF0aF9vcnRob2xvZ3MgaXMgZnJvbSBFdVBhdGhEQiBhbmQgaXNuJ3QgcmVhbGx5CiMjIGJlaW5nIHVzZWQgZm9yIGFueXRoaW5nIGluIHRoaXMgZG9jdW1lbnQgYWZhaWsuCiMjb3J0aG9zIDwtIGV4dHJhY3RfZXVwYXRoX29ydGhvbG9ncyhkYiA9IHBhbmFtZW5zaXNfcGtnKQpkYXRhX3N0cnVjdHVyZXMgPC0gYyhkYXRhX3N0cnVjdHVyZXMsICJscF9sZW5ndGhzIiwgImxwX2dvIiwgImFsbF9scF9hbm5vdCIsICJtZXRhIikKYGBgCgojIyMgU2V0IHVwIGdlbmUtPnRyYW5zY3JpcHQgbWFwcGluZ3MKCk9uZSBzaG91bGQgcGF5IGNhcmVmdWwgYXR0ZW50aW9uIHRvIHRoZSBjb2x1bW5zIHVzZWQgdG8gY29uY2F0ZW5hdGUKdGhlIGdlbmUvdmVyc2lvbiBhbmQgdHJhbnNjcmlwdC92ZXJzaW9uLiAgSWYgdGhlc2UgZG8gbm90IG1hdGNoCmV4YWN0bHksIG1hbnkgZ2VuZXMgd2lsbCBiZSBkcm9wcGVkIGJ5IHR4aW1wb3J0IHdpdGhvdXQgYW55IG91dHB1dCB0bwpzaWduaWZ5IHNvbWV0aGluZyBpcyB3cm9uZy4KCk5vdGUgdG8gc2VsZiwgSSBtYWRlIGEgZnVuIGZ1bmN0aW9uIHdoaWNoIGdyYWJzIHRoZSBpZHMgZnJvbSBzYWxtb24KcmVzdWx0cy4gIEluIGFkZGl0aW9uIEkgZm91bmQgdGhhdCB0eGltcG9ydCBjYW4gb3B0aW9uYWxseSBpZ25vcmUKdGhlbS4KCmBgYHtyfQojIyBUaGUgdHhfZ2VuZV9tYXAgaXMgdXNlZCBmb3IgdHhpbXBvcnQgYW5kIHNhbG1vbiBxdWFudGlmaWNhdGlvbnMuCmhzX2Fubm90W1sidHJhbnNjcmlwdCJdXSA8LSBwYXN0ZTAocm93bmFtZXMoaHNfYW5ub3QpLCAiLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHNfYW5ub3RbWyJ0cmFuc2NyaXB0X3ZlcnNpb24iXV0pCnJvd25hbWVzKGhzX2Fubm90KSA8LSBtYWtlLm5hbWVzKGhzX2Fubm90W1siZW5zZW1ibF9nZW5lX2lkIl1dLCB1bmlxdWUgPSBUUlVFKQpoc190eF9nZW5lX21hcCA8LSBoc19hbm5vdFssIGMoInRyYW5zY3JpcHQiLCAiZW5zZW1ibF9nZW5lX2lkIildCmBgYAoKIyMgR2VuZSBvbnRvbG9neSBkYXRhCgpUaGUgc2V0IG9mIEdPIGNhdGVnb3JpZXMgaGFzIG5vdCBiZWVuIGxpbWl0ZWQgdG8gdGhlIDIwMjAgZGF0YSBhdCB0aGUKdGltZSBvZiB0aGlzIHdyaXRpbmcuICBUaGUgR08gY2F0ZWdvcmllcyBpcyBjb2xsZWN0ZWQgYWxvbmcgd2l0aApsZW5ndGhzIGZvciBnb3NlcS4gIFRoZSBvdGhlciBtZXRob2RzIGVpdGhlciBoYXZlIGJ1aWx0LWluIGRhdGFiYXNlcwpvZiBodW1hbiBkYXRhIChnUHJvZmlsZXIpIG9yIHN1cHBvcnQgb3JnREIgZGF0YSAob3JnLkhzLmVnLmRiKQooY2x1c3RlclByb2ZpbGVyL3RvcEdPL2dvc3RhdHMpLgoKYGBge3J9CmhzX2dvIDwtIHRyeShsb2FkX2Jpb21hcnRfZ28oKVtbImdvIl1dKQppZiAoInRyeS1lcnJvciIgJWluJSBjbGFzcyhoc19nbykpIHsKICBoc19nbyA8LSBOVUxMCn0KCmhzX2xlbmd0aCA8LSBoc19hbm5vdFssIGMoImVuc2VtYmxfZ2VuZV9pZCIsICJjZHNfbGVuZ3RoIildCmNvbG5hbWVzKGhzX2xlbmd0aCkgPC0gYygiSUQiLCAibGVuZ3RoIikKZGF0YV9zdHJ1Y3R1cmVzIDwtIGMoZGF0YV9zdHJ1Y3R1cmVzLCAiaHNfbGVuZ3RoIiwgImhzX2dvIiwgImhzX2Fubm90IikKYGBgCgojIERhdGFzZXQ6IENyZWF0ZSB0aGUgcGFyZW50IGRhdGEgc3RydWN0dXJlIG9mIGFsbCBzYW1wbGVzCgpCZWZvcmUgd2UgZG8gYW55IG9mIHRoZSBmb2xsb3dpbmcgc3Vic2V0cy9hbmFseXNlcyBvZiB0aGUgZGF0YSwgd2UKbmVlZCB0byBjb2xsZWN0IGl0IGFsbCBpbiBvbmUgcGxhY2UuICBMZXQncyBkbyB0aGF0IGhlcmUgYW5kIG5hbWUgaXQKJ2hzX2V4cHQnLCBpdCB3aWxsIGNvbXByaXNlIHRoZSBmdWxsIHNldCBvZiBodW1hbiBkYXRhLiAgV2hlbiB3ZSBjdWxsCnNvbWUgc2FtcGxlcyBpdCB3aWxsIGJlIHJlbmFtZWQgdG8gJ2hzX3ZhbGlkJy4KClRoZSB2YXJpYWJsZSAnZGF0YV9zdHJ1Y3R1cmVzJyB3aWxsIGNvbnRhaW4gdGhlIG5hbWVzIG9mIGV2ZXJ5CnZhcmlhYmxlIEkgY3JlYXRlIGluIHRoaXMgZG9jdW1lbnQgd2hpY2ggSSB3aXNoIHRvIHNhdmUgdG8gZGlzay4KClNpbWlsYXJseSwgdGhlIGNoYXJhY3RlciB2ZWN0b3IgJ3Nhbml0aXplX2NvbHVtbnMnIGlzIHRoZSBsaXN0IG9mCm1ldGFkYXRhIGNvbHVtbnMgb3ZlciB3aGljaCBJIHdpbGwgaXRlcmF0ZSBhbmQgc2FuaXRpemUgdGhlIGRhdGEsCnJlbW92aW5nIGFueSBzcHVyaW91cyBzcGFjZXMsIGNhcGl0YWxpemF0aW9uLCBldGMuCgojIyBDcmVhdGUgRXhwcmVzc2lvbnNldAoKVGhlIHByaW1hcnkgZnVuY3Rpb24gdXNlZCBpcyAnY3JlYXRlX2V4cHQoKScsIHdoaWNoIGlzIHJlc3BvbnNpYmxlIGZvcgpjb21iaW5pbmcgdGhlIG1ldGFkYXRhIChmcm9tIHRoZSBmaXJzdCBibG9jayBvZiBjb2RlKSwgdGhlIGdlbmUKYW5ub3RhdGlvbnMgKGZyb20gdGhlIDJuZC8zcmQpLCBhbmQgY291bnQgdGFibGVzIChpbmNsdWRlZCBpbiB0aGUKbWV0YWRhdGEgYXMgYSBjb2x1bW4gb2YgZmlsZW5hbWVzKSBpbnRvIGEgc2luZ2xlIGV4cHJlc3Npb25zZXQKKEBodWJlck9yY2hlc3RyYXRpbmdIaWdodGhyb3VnaHB1dEdlbm9taWMyMDE1KS4gIFRoZSBzYW5pdGl6ZV9jb2x1bW5zCnZhcmlhYmxlIGRlZmluZXMgdGhlIG1ldGFkYXRhIGNvbHVtbnMgd2hpY2ggd2lsbCBiZSBleHBsaWNpdGx5CnNhbml0aXplZCBiZXlvbmQgdGhlIGdlbmVyYWwgY2hlY2tzIHBlcmZvcm1lZC4gJ3N1YnNldF9nZW5lcygpJyBpcwpyZXNwb25zaWJsZSBmb3IgaW5jbHVkaW5nIF9vbmx5XyB0aGUgcHJvdGVpbiBjb2RpbmcgZ2VuZXMgaW4gdGhlIGRhdGE7Cml0IHJlY29yZHMgdGhlIGFtb3VudCBvZiBpbmZvcm1hdGlvbiBsb3N0IHRvIHRoZSBtZXRhZGF0YSBhcyBjb2x1bW4KJ25jcm5hX2xvc3QnLiAnc2FuaXRpemVfbWV0YWRhdGEoKScgd2lsbCBwZXJmb3JtIHNvbWUgc2FuaXR5IGNoZWNrcyBvZgp0aGUgbWV0YWRhdGEgdG8gZW5zdXJlIHRoYXQgZXhjZWwgZGlkIG5vdCBkbyBhbnl0aGluZyB1bnRvd2FyZCB0byB0aGUKbWV0YWRhdGEuIFRoZSAnc2V0X2V4cHRfKigpJyBmdW5jdGlvbnMgbW9kaWZ5IHRoZSBtZXRhZGF0YSB0byBtYWtlIGl0Cm1vcmUgZnJpZW5kbHkgZm9yIGZ1dHVyZSB0YXNrcywgaW5jbHVkaW5nIHNldHRpbmcgc29tZSBjb2x1bW5zIHRvCmZhY3RvcnMsIGRlZmluaW5nIHRoZSBjb2x1bW4gb2YgaW50ZXJlc3QgdnMuIGtub3duIHN1cnJvZ2F0ZShzKS4KRmluYWxseSwgJ3N1YnNldF9leHB0KCknIGlzIHVzZWQgdG8gZHJvcCBzYW1wbGVzIHdoaWNoIGFyZSBrbm93biB0bwpub3QgYmUgb2YgaW50ZXJlc3QsIGxpa2UgdGhlIGZldyBzYW1wbGVzIGZyb20gcGVvcGxlIHdobyBwcmVzZW50ZWQgYXMKaGVhbHRoeSBpbiB0aGUgY2xpbmljICh3aGVuIHRoZSBjbGluaWNhbHByZXNlbnRhdGlvbiBjb2x1bW4gb2YgdGhlCm1ldGFkYXRhIGlzICdoJykuCgpPbmUgbm90ZSBpZiBhbnlvbmUgYWN0dWFsbHkgcmVhZHMgdGhpcywgSSBoYXZlIGEgc2lzdGVyIGZ1bmN0aW9uIHdoaWNoCmNyZWF0ZXMgc3VtbWFyaXplZEV4cGVyaW1lbnRzIChAU3VtbWFyaXplZEV4cGVyaW1lbnQpIGluc3RlYWQgb2YKZXhwcmVzc2lvblNldHMsIGFuZCBJIHRoaW5rIGFsbCBvZiBteSBjb2RlIHNob3VsZCBtb3ZlIHRvIHRoYXQ7IGJ1dCBpdApqdXN0IGhhcyBub3QgaGFwcGVuZWQgYmVjYXVzZSBJIGp1c3QgaGF2ZW4ndCBoYWQgYSBjaGFuY2UgdG8gZmluaXNoCndyaXRpbmcgdGhlIHRlc3RzIGFuZCBtYWtpbmcgd2hhdGV2ZXIgbGl0dGxlIGNoYW5nZXMgd291bGQgYmUgcmVxdWlyZWQKdG8gZ2V0IHRoZW0gdG8gYWxsIHBhc3MuICBJZiBteSBmaWN0aXRpb3VzIHJlYWRlciBpcyBpbnRlcmVzdGVkLCBJCndvdWxkIGxvdmUgaGVscCBjb21wbGV0aW5nIHRoZSBzd2l0Y2ggZnJvbSBleHBycy0+c2UuCgpgYGB7cn0Kc2FuaXRpemVfY29sdW1ucyA8LSBjKCJ2aXNpdG51bWJlciIsICJmaW5hbG91dGNvbWUiLCAiZG9ub3IiLAogICAgICAgICAgICAgICAgICAgICAgInR5cGVvZmNlbGxzIiwgImNsaW5pY2FscHJlc2VudGF0aW9uIiwgImRydWciLAogICAgICAgICAgICAgICAgICAgICAgImNvbmRpdGlvbiIsICJiYXRjaCIsICJjbGluaWMiKQpoc19leHB0IDwtIGNyZWF0ZV9leHB0KHNhbXBsZXNoZWV0LAogICAgICAgICAgICAgICAgICAgICAgIGZpbGVfY29sdW1uID0gImhnMzhfMTAwaGlzYXRmaWxlIiwKICAgICAgICAgICAgICAgICAgICAgICBzYXZlZmlsZSA9IGdsdWUoInJkYS90bXJjM19oc19leHB0X2FsbF9yYXctdnt2ZXJ9LnJkYSIpLAogICAgICAgICAgICAgICAgICAgICAgIGdlbmVfaW5mbyA9IGhzX2Fubm90KSAlPiUKICBzdWJzZXRfZ2VuZXMoY29sdW1uID0gImdlbmVfYmlvdHlwZSIsIG1ldGhvZCA9ICJrZWVwIiwKICAgICAgICAgICAgICAgcGF0dGVybiA9ICJwcm90ZWluX2NvZGluZyIsIG1ldGFfY29sdW1uID0gIm5jcm5hX2xvc3QiKSAlPiUKICBzYW5pdGl6ZV9leHB0X3BEYXRhKGNvbHVtbnMgPSBzYW5pdGl6ZV9jb2x1bW5zKSAgJT4lCiAgc2V0X2V4cHRfZmFjdG9ycyhjb2x1bW5zID0gc2FuaXRpemVfY29sdW1ucywgY2xhc3MgPSAiZmFjdG9yIikgJT4lCiAgc2V0X2V4cHRfY29uZGl0aW9ucyhmYWN0ID0gImZpbmFsb3V0Y29tZSIpICU+JQogIHNldF9leHB0X2JhdGNoZXMoZmFjdCA9ICJ2aXNpdG51bWJlciIpICU+JQogIHN1YnNldF9leHB0KHN1YnNldCA9ICJ0eXBlb2ZjZWxscyE9J3BibWNzJyIpICU+JQogIHN1YnNldF9leHB0KHN1YnNldCA9ICJ0eXBlb2ZjZWxscyE9J21hY3JvcGhhZ2VzJyIpICU+JQogIHN1YnNldF9leHB0KHN1YnNldCA9ICJjbGluaWNhbHByZXNlbnRhdGlvbiE9J2gnIikKZGF0YV9zdHJ1Y3R1cmVzIDwtIGMoZGF0YV9zdHJ1Y3R1cmVzLCAiaHNfZXhwdCIpCgojIyBUaGUgZm9sbG93aW5nIHNob3VsZCBtYWtlIHZpc2l0IDEgdGhlIGxhcmdlc3QgaWYgb25lIHVzZXMgdGhhdCBjb2x1bW4gYXMgYSBzaXplIGZhY3RvciB3aGVuIHBsb3R0aW5nLgptZXRhIDwtIHBEYXRhKGhzX2V4cHQpICU+JQogIG11dGF0ZSh2aXNpdG51bWJlciA9IGZjdF9yZWxldmVsKHZpc2l0bnVtYmVyLCBjKCIzIiwgIjIiLCAiMSIpKSkKc3RhcnRfb3JkZXIgPC0gcm93bmFtZXMobWV0YSkKIyMgSW5jb3Jwb3JhdGUgdGhlIGlkZW50aWZpZWQgc3RyYWlucwppZGVudGlmaWVkIDwtIG9wZW54bHN4OjpyZWFkLnhsc3goc3BlY2llc19pZGVudGl0aWVzKQpub19kYXRhX2lkeCA8LSBpZGVudGlmaWVkW1siU3BlY2llcyJdXSA9PSAiTm8gaGF5IGRhdG8iCmlkZW50aWZpZWQgPC0gaWRlbnRpZmllZFshbm9fZGF0YV9pZHgsIF0KaWRlbnRpZmllZCA8LSBpZGVudGlmaWVkWywgYygiUGF0aWVudCIsICJTcGVjaWVzIildCmNvbG5hbWVzKGlkZW50aWZpZWQpIDwtIGMoIlBhdGllbnQiLCAiUGFyYXNpdGVTcGVjaWVzIikKbWV0YSA8LSBtZXJnZShtZXRhLCBpZGVudGlmaWVkLCBieS54ID0gInR1YmVsYWJlbG9yaWdpbiIsIGJ5LnkgPSAiUGF0aWVudCIsIGFsbC54ID0gVFJVRSkKbWV0YSA8LSBzYW5pdGl6ZV9tZXRhZGF0YShtZXRhLCBjb2x1bW5zID0gIlBhcmFzaXRlU3BlY2llcyIsIHNwYWNlcyA9IFRSVUUpCiMjIE5vdGUgdGhhdCB0aGUgbWVyZ2UgcmVtb3ZlcyB0aGUgcm93bmFtZXMgYW5kIG1heWJlIGNoYW5nZXMgc2FtcGxlIG9yZGVyLgpyb3duYW1lcyhtZXRhKSA8LSBtZXRhW1sidG1yY2lkZW50aWZpZXIiXV0KbWV0YSA8LSBtZXRhW3N0YXJ0X29yZGVyLCBdCgpwRGF0YShoc19leHB0KSA8LSBtZXRhCnNhdmUobGlzdCA9ICJoc19leHB0IiwgZmlsZSA9IGdsdWUoInJkYS90bXJjM19oc19leHB0X2FsbF9zYW5pdGl6ZWQtdnt2ZXJ9LnJkYSIpKQpgYGAKCiMjIEFkZCB0aGUgcGF0aWVudCBkZW1vZ3JhcGhpY3MKClRoZXJlIGFyZSBzb21lIHBhcmFtZXRlcnMgcHJvdmlkZWQgYnkgdGhlIGNsaW5pY2lhbnMgd2hpY2ggbWF5IHByb3ZlCnRvIGJlIG9mIGludGVyZXN0LiAgSSB0aGVyZWZvcmUgYW0gYWRkaW5nIHRoZSBkZW1vZ3JhcGhpY3MgaGVyZS4gIEkKd2lsbCBhbHNvIHJ1biBzb21lIHNpbXBsZSBjaGVja3MgdG8gdHJ5IHRvIG1ha2Ugc3VyZSB0aGF0IHRoZQpjbGluaWNpYW4ncyBtZXRhZGF0YSBhZ3JlZXMgd2l0aCB0aGUgc2FtcGxlIG1ldGFkYXRhLgoKSW4gdGhpcyBmaXJzdCBibG9jaywgcmVhZCB0aGUgZGVtb2dyYXBoaWNzIGFuZCBzYW5pdGl6ZSBvdXQgdGhlCmVuY29kZWQgTkFzICg5OTkgYW5kIDg4OCBvciB3aGF0ZXZlcikgYW5kIGFkZCBhIGNvbHVtbiB0byBqb2luIGl0IHRvCnRoZSBzYW1wbGUgc2hlZXQgZGF0YS4KCmBgYHtyfQpoc19kZW1vZ3JhcGhpY3MgPC0gb3Blbnhsc3g6OnJlYWQueGxzeChkZW1vZ3JhcGhpY3MpCmhzX2RlbW9ncmFwaGljc1tbImpvaW4iXV0gPC0gdG9sb3dlcihoc19kZW1vZ3JhcGhpY3NbWyJQYXRpZW50X0lEIl1dKQoKY29sdW1uc193aXRoX2VuY29kZWRfbmEgPC0gYygiQWRoZXJlbmNlX0dsdWNhbnRpbWUiLCAiQWRoZXJlbmNlX01pbHRlZm9zaW5lIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVG90YWxfQW1wdWxlc19QcmVzY3JpYmVkX01pbHQiLCAiUHJlc2NyaWJlZF9EYWlseV9Eb3NlX01pbHQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUb3RhbF9BbXB1bGVzX1ByZXNjcmliZWRfR2x1YyIsICJQcmVzY3JpYmVkX0RhaWx5X0Rvc2VfR2x1YyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlY1X1RvdGFsX0FyZWFfVWxjZXIiLCAiVjVfVmVydGljYWxfQXhpc19VbGNlciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlY1X0hvcml6b250YWxfQXhpc19VbGNlciIsICJWNV9Ub3RhbF9BcmVhX0xlc2lvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlY1X1ZlcnRpY2FsX0F4aXNfTGVzaW9uIiwgIlY1X0hvcml6b250YWxfQXhpc19MZXNpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWNF9Ub3RhbF9BcmVhX1VsY2VyIiwgIlY0X1ZlcnRpY2FsX0F4aXNfVWxjZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWNF9Ib3Jpem9udGFsX0F4aXNfVWxjZXIiLCAiVjRfVG90YWxfQXJlYV9MZXNpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWNF9WZXJ0aWNhbF9BeGlzX0xlc2lvbiIsICJWNF9Ib3Jpem9udGFsX0F4aXNfTGVzaW9uIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVjNfVG90YWxfQXJlYV9VbGNlciIsICJWM19WZXJ0aWNhbF9BeGlzX1VsY2VyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVjNfSG9yaXpvbnRhbF9BeGlzX1VsY2VyIiwgIlYzX1RvdGFsX0FyZWFfTGVzaW9uIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVjNfVmVydGljYWxfQXhpc19MZXNpb24iLCAiVjNfSG9yaXpvbnRhbF9BeGlzX0xlc2lvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlYyX1RvdGFsX0FyZWFfVWxjZXIiLCAiVjJfVmVydGljYWxfQXhpc19VbGNlciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlYyX0hvcml6b250YWxfQXhpc19VbGNlciIsICJWMl9Ub3RhbF9BcmVhX0xlc2lvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlYyX1ZlcnRpY2FsX0F4aXNfTGVzaW9uIiwgIlYyX0hvcml6b250YWxfQXhpc19MZXNpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWNV9OZXdfTGVzaW9ucyIsICJWNF9OZXdfTGVzaW9ucyIsICJWM19OZXdfTGVzaW9ucyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlYyX05ld19MZXNpb25zIikKZm9yIChjb2wgaW4gY29sdW1uc193aXRoX2VuY29kZWRfbmEpIHsKICBuYV9pZHggPC0gaHNfZGVtb2dyYXBoaWNzW1tjb2xdXSA9PSA5OTkKICBtZXNzYWdlKCJDb2x1bW4gIiwgY29sLCAiIGNvbnRhaW5zICIsIHN1bShuYV9pZHgpLCAiIGVuY29kZWQgTkEgdmFsdWVzLiIpCiAgaHNfZGVtb2dyYXBoaWNzW25hX2lkeCwgY29sXSA8LSBOQQp9CgpmYWN0b3JfY29sdW1ucyA8LSBjKCJTZXgiLCAiRXRobmljaXR5IiwgIkluZmVjdGlvbl9Mb2NhdGlvbiIsICJQcmV2aW91c2x5X0RpYWdub3NlZCIsCiAgICAgICAgICAgICAgICAgICAgIkFkdmVyc2VfRWZmZWN0c19WMyIsICJBZHZlcnNlX0VmZmVjdHNfVjQiLCAiVGhlcmFwZXV0aWNfT3V0Y29tZV9WMyIsCiAgICAgICAgICAgICAgICAgICAgIlRoZXJhcGV1dGljX091dGNvbWVfVjQiLCAiVGhlcmFwZXV0aWNfT3V0Y29tZV9WNSIsCiAgICAgICAgICAgICAgICAgICAgIlRoZXJhcGV1dGljX091dGNvbWVfRmluYWwiKQpmb3IgKGNvbCBpbiBmYWN0b3JfY29sdW1ucykgewogIGhzX2RlbW9ncmFwaGljc1tbY29sXV0gPC0gYXMuZmFjdG9yKGhzX2RlbW9ncmFwaGljc1tbY29sXV0pCn0KCiMjIEV4dHJhY3QgdGhlIGNsaW5pYyBmcm9tIHRoZSBwYXRpZW50IGlkIHZpYSBhIGNoZWVzZWJhbGwgcmVnZXguCmhzX2RlbW9ncmFwaGljc1tbIkNsaW5pYyJdXSA8LSBnc3ViKHggPSBoc19kZW1vZ3JhcGhpY3NbWyJQYXRpZW50X0lEIl1dLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuID0gIl5TVShcXGQpezF9LiokIiwgcmVwbGFjZW1lbnQgPSAiXFwxIikKZGF0YV9zdHJ1Y3R1cmVzIDwtIGMoZGF0YV9zdHJ1Y3R1cmVzLCAiaHNfZGVtb2dyYXBoaWNzIikKYGBgCgojIyBHZXQgdGhlIFNhbXBsZSBzaGVldCBkYXRhIHJlYWR5IGZvciBqb2luaW5nIGFuZCBwZXJmb3JtIHRoZSBtZXJnZQoKSW4gdGhlIGZvbGxvd2luZyB3ZSBhZGQgYSBjb2x1bW4gJ2pvaW4nIGFuYWxhZ291cyB0byB0aGF0IGFkZGVkIHRvIHRoZQpkZW1vZ3JhcGhpY3MsIHRoaXMgd2lsbCBiZSB1c2VkIHRvIGFkZCB0aGUgdmFyaW91cyBjb2x1bW5zIGFjcm9zcyBlYWNoCnBlcnNvbidzIHNhbXBsZXMuICBJIGd1ZXNzIEkgY291bGQgaGF2ZSBkb25lIHRoaXMgd2l0aCBtZXJnZShhbGwueCA9ClRSVUUsIGFsbC55ID0gVFJVRSkKClNvbWUgY2hhbmdlcyBJIG1hZGUgdG8gZW5mb3JjZSBtb3JlIGNvbnNpc3RlbnQgZGF0ZSBtYW5hZ2VtZW50IGFyZQpjYXVzaW5nIHByb2JsZW1zLiAgTm90YWJseSwgc29tZSBjb2x1bW5zIGFyZSBub3cgZ2V0dGluZyBzZXQgdG8gdGhlCmZvcm1hdCAnRGF0ZScsIHdoaWNoIGNhbm5vdCBoYXZlIHN0cmluZ3MgbGlrZSAndW5kZWZpbmVkJy4KCmBgYHtyfQpoc19wZCA8LSBwRGF0YShoc19leHB0KQpoc19wZFtbImpvaW4iXV0gPC0gaHNfcGRbWyJ0dWJlbGFiZWxvcmlnaW4iXV0KCmhzX3BkX2RlbW9ncmFwaGljcyA8LSBwbHlyOjpqb2luKGhzX3BkLCBoc19kZW1vZ3JhcGhpY3MsIGJ5ID0gImpvaW4iKQpyb3duYW1lcyhoc19wZF9kZW1vZ3JhcGhpY3MpIDwtIHJvd25hbWVzKGhzX3BkKQpuYV9pZHggPC0gaXMubmEoaHNfcGRfZGVtb2dyYXBoaWNzKQpzdW0obmFfaWR4KQpoc19wZF9kZW1vZ3JhcGhpY3NbbmFfaWR4XSA8LSAiIgoKZGF0YV9zdHJ1Y3R1cmVzIDwtIGMoZGF0YV9zdHJ1Y3R1cmVzLCAiaHNfcGRfZGVtb2dyYXBoaWNzIikKYGBgCgojIyBBZGQgdGhlIGRlbW9ncmFwaGljcyB0byB0aGUgZXhwcmVzc2lvbnNldAoKSW4gYWRkaXRpb24gd2Ugd2lsbCBjcmVhdGUgYSBzZXJpZXMgb2YgY29tcG9zaXRlIHZhcmlhYmxlcyBmcm9tCmNvbWJpbmF0aW9ucyBvZiBleHRhbnQgZmFjdG9ycy4KCmBgYHtyfQpwRGF0YShoc19leHB0KSA8LSBoc19wZF9kZW1vZ3JhcGhpY3MKCiMjIE5vdyBhZGQgaW4gdGhlIGV0aG5pY2l0eSBhbmQgc2V4CiMjIEFkZCBhIGNvbWJpbmF0aW9uIG9mIHRoZSBldGhuaWNpdHkgYW5kIGNsaW5pYwojIyBXaGlsZSBJIGFtIGF0IGl0LCBkbyBzZXgrY2xpbmljCnRhYmxlKHBEYXRhKGhzX2V4cHQpW1siU2V4Il1dKQp0YWJsZShwRGF0YShoc19leHB0KVtbIkV0aG5pY2l0eSJdXSkKdGFibGUocERhdGEoaHNfZXhwdClbWyJjbGluaWMiXV0pCmV0bmlhX25hbWVzIDwtIGFzLmNoYXJhY3RlcihwRGF0YShoc19leHB0KVtbIkV0aG5pY2l0eSJdXSkKZXRuaWFfaWR4IDwtIGV0bmlhX25hbWVzID09IDEKZXRuaWFfbmFtZXNbZXRuaWFfaWR4XSA8LSAiYWZyb2NvbCIKZXRuaWFfaWR4IDwtIGV0bmlhX25hbWVzID09IDIKZXRuaWFfbmFtZXNbZXRuaWFfaWR4XSA8LSAiaW5kaWdlbmEiCmV0bmlhX2lkeCA8LSBldG5pYV9uYW1lcyA9PSAzCmV0bmlhX25hbWVzW2V0bmlhX2lkeF0gPC0gIm1lc3RpemEiCnBEYXRhKGhzX2V4cHQpW1siZXRuaWEiXV0gPC0gYXMuZmFjdG9yKGV0bmlhX25hbWVzKQp0YWJsZShwRGF0YShoc19leHB0KVtbImV0bmlhIl1dKQp0YWJsZShwRGF0YShoc19leHB0KVtbIkV0aG5pY2l0eSJdXSkKZXRuaWFfZmFjdG9yIDwtIHBhc3RlMChwRGF0YShoc19leHB0KVtbImNsaW5pYyJdXSwgIl8iLAogICAgICAgICAgICAgICAgICAgICAgIGV0bmlhX25hbWVzKQpwRGF0YShoc19leHB0KVtbImNsaW5pY19ldG5pYSJdXSA8LSBhcy5mYWN0b3IoZXRuaWFfZmFjdG9yKQp0YWJsZShwRGF0YShoc19leHB0KVtbImNsaW5pY19ldG5pYSJdXSkKCnBEYXRhKGhzX2V4cHQpW1sic2V4Il1dIDwtICJmZW1hbGUiCm1hbGVfaWR4IDwtIHBEYXRhKGhzX2V4cHQpW1siU2V4Il1dID09IDEKcERhdGEoaHNfZXhwdClbbWFsZV9pZHgsICJzZXgiXSA8LSAibWFsZSIKcERhdGEoaHNfZXhwdClbWyJzZXgiXV0gPC0gYXMuZmFjdG9yKHBEYXRhKGhzX2V4cHQpW1sic2V4Il1dKQpzZXhfZmFjdG9yIDwtIHBhc3RlMChwRGF0YShoc19leHB0KVtbImNsaW5pYyJdXSwgIl8iLAogICAgICAgICAgICAgICAgICAgICBwRGF0YShoc19leHB0KVtbInNleCJdXSkKcERhdGEoaHNfZXhwdClbWyJjbGluaWNfc2V4Il1dIDwtIGFzLmZhY3RvcihzZXhfZmFjdG9yKQp0YWJsZShwRGF0YShoc19leHB0KVtbImNsaW5pY19zZXgiXV0pCgpwRGF0YShoc19leHB0KVtbImV0bmlhX3NleCJdXSA8LSBwYXN0ZTAocERhdGEoaHNfZXhwdClbWyJldG5pYSJdXSwgIl8iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEoaHNfZXhwdClbWyJzZXgiXV0pCnBEYXRhKGhzX2V4cHQpW1siZXRuaWFfc2V4Il1dIDwtIGFzLmZhY3RvcihwRGF0YShoc19leHB0KVtbImV0bmlhX3NleCJdXSkKdGFibGUocERhdGEoaHNfZXhwdClbWyJldG5pYV9zZXgiXV0pCgojIyBTZXQgYSBmYWN0b3Igb2Ygc2FtcGxlcyB3aGljaCBhcmUgdmlzaXQgMSB2cy4gMi8zLgp2MV9zYW1wbGVzIDwtIHBEYXRhKGhzX2V4cHQpW1sidmlzaXRudW1iZXIiXV0gPT0gIjEiCnBEYXRhKGhzX2V4cHQpW3YxX3NhbXBsZXMsICJ2aXNpdGJpcGFydCJdIDwtICJ2MSIKcERhdGEoaHNfZXhwdClbIXYxX3NhbXBsZXMsICJ2aXNpdGJpcGFydCJdIDwtICJ2b3RoZXIiCnRhYmxlKHBEYXRhKGhzX2V4cHQpW1sidmlzaXRiaXBhcnQiXV0pCgpwRGF0YShoc19leHB0KVtbImNlbGxfdmlzaXRfY2YiXV0gPC0gcGFzdGUwKHBEYXRhKGhzX2V4cHQpW1sidHlwZW9mY2VsbHMiXV0sICJfIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YShoc19leHB0KVtbInZpc2l0bnVtYmVyIl1dLCAiXyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEoaHNfZXhwdClbWyJmaW5hbG91dGNvbWUiXV0pCgphZ2VfdmVjdG9yIDwtIHBEYXRhKGhzX2V4cHQpW1siQWdlIl1dCnBEYXRhKGhzX2V4cHQpW1siYWdlX2NhdCJdXSA8LSBtYWtlX3F1YXJ0aWxlX2ZhY3RvcihhZ2VfdmVjdG9yKQoKc2F2ZShsaXN0ID0gImhzX2V4cHQiLCBmaWxlID0gZ2x1ZSgicmRhL3RtcmMzX2hzX2V4cHRfYWxsX3Nhbml0aXplZF9kZW1vZ3JhcGhpY3Mtdnt2ZXJ9LnJkYSIpKQpgYGAKCiMjIFNhbml0eSBjaGVjaywgY2xpbmljYWwgb3V0Y29tZSB2cy4gZGVtb2dyYXBoaWNzCgpDaGVjayB0byBtYWtlIHN1cmUgdGhlIGRlbW9ncmFwaGljcyBhZ3JlZXMgd2l0aCB0aGUgbWV0YWRhdGEuICBJIF9yZWFsbHlfIHdhbnQKdGhpcyBibG9jayB0byByZXR1cm4gTlVMTCB1cG9uIGNvbXBsZXRpb24uCgpgYGB7cn0KdHdvX2NvbHVtbnMgPC0gcERhdGEoaHNfZXhwdClbLCBjKCJmaW5hbG91dGNvbWUiLCAiVGhlcmFwZXV0aWNfT3V0Y29tZV9GaW5hbCIpXQp1bmRlZl9pZHggPC0gdHdvX2NvbHVtbnNbWzJdXSA9PSAidW5kZWZpbmVkIgp0d29fY29sdW1ucyA8LSB0d29fY29sdW1uc1shdW5kZWZfaWR4LCBdCnR3b19jb2x1bW5zW1sicmV3cml0dGVuIl1dIDwtICJ1bmRlZiIKY3VyZV9pZHggPC0gdHdvX2NvbHVtbnNbWzJdXSA9PSAwCnR3b19jb2x1bW5zW2N1cmVfaWR4LCAicmV3cml0dGVuIl0gPC0gImN1cmUiCmZhaWxfaWR4IDwtIHR3b19jb2x1bW5zW1syXV0gPT0gMQp0d29fY29sdW1uc1tmYWlsX2lkeCwgInJld3JpdHRlbiJdIDwtICJmYWlsdXJlIgpsb3N0X2lkeCA8LSB0d29fY29sdW1uc1tbMl1dID09IDIKdHdvX2NvbHVtbnNbbG9zdF9pZHgsICJyZXdyaXR0ZW4iXSA8LSAibG9zdCIKc2FtZV9pZHggPC0gdHdvX2NvbHVtbnNbWyJmaW5hbG91dGNvbWUiXV0gPT0gdHdvX2NvbHVtbnNbWyJyZXdyaXR0ZW4iXV0KYnJva2VuIDwtIHR3b19jb2x1bW5zWyFzYW1lX2lkeCwgXQojIyBJIHZlcnkgbXVjaCB3YW50IHRoZSBmb2xsb3dpbmcgbGluZSB0byBldmFsdWF0ZSB0byAwIHJvd3MuCmJyb2tlbgpgYGAKCiMjIFN1bW1hcml6ZTogQ29sbGVjdCBzYW1wbGUgbnVtYmVycyBiZWZvcmUgZmlsdGVyaW5nCgpUaGVyZSBhcmUgc29tZSBtZXRhZGF0YSBmYWN0b3JzIGZvciB3aGljaCBJIHRoaW5rIGl0IHdpbGwgYmUgbmljZSB0bwpzZWUgdGhlIG51bWJlcnMgYmVmb3JlIGFuZCBhZnRlciBvdXIgZmlsdGVycy4gIFRoZSBmb2xsb3dpbmcgc2hvd3MgaG93Cm1hbnkgc2FtcGxlcyB3ZSBoYXZlIG9mIHRoZSBwcmltYXJ5IHR5cGVzIGJlZm9yZSBmaWx0ZXJpbmcuCgpgYGB7cn0KZGltKHBEYXRhKGhzX2V4cHQpKQp0YWJsZShwRGF0YShoc19leHB0KVtbImRydWciXV0pCnRhYmxlKHBEYXRhKGhzX2V4cHQpW1siY2xpbmljIl1dKQp0YWJsZShwRGF0YShoc19leHB0KVtbImZpbmFsb3V0Y29tZSJdXSkKdGFibGUocERhdGEoaHNfZXhwdClbWyJ0eXBlb2ZjZWxscyJdXSkKdGFibGUocERhdGEoaHNfZXhwdClbWyJ2aXNpdG51bWJlciJdXSkKc3VtbWFyeShhcy5udW1lcmljKHBEYXRhKGhzX2V4cHQpW1siRXZvbHV0aW9uX1RpbWUiXV0pKQpzdW1tYXJ5KGFzLm51bWVyaWMocERhdGEoaHNfZXhwdClbWyJQcmVzY3JpYmVkX0RhaWx5X0Rvc2VfR2x1YyJdXSkpCnN1bW1hcnkoYXMubnVtZXJpYyhwRGF0YShoc19leHB0KVtbIlYzX1ZlcnRpY2FsX0F4aXNfTGVzaW9uIl1dKSkKc3VtbWFyeShhcy5udW1lcmljKHBEYXRhKGhzX2V4cHQpW1siVjNfVG90YWxfQXJlYV9MZXNpb24iXV0pKQpzdW1tYXJ5KGFzLm51bWVyaWMocERhdGEoaHNfZXhwdClbWyJWM19Ib3Jpem9udGFsX0F4aXNfTGVzaW9uIl1dKSkKdGFibGUocERhdGEoaHNfZXhwdClbWyJzZXgiXV0pCnRhYmxlKHBEYXRhKGhzX2V4cHQpW1siZXRuaWEiXV0pCnRhYmxlKHBEYXRhKGhzX2V4cHQpW1siRXRobmljaXR5Il1dKQpzdW1tYXJ5KGFzLm51bWVyaWMocERhdGEoaHNfZXhwdClbWyJBZ2UiXV0pKQpzdW1tYXJ5KHBEYXRhKGhzX2V4cHQpW1siV2VpZ2h0Il1dKQpzdW1tYXJ5KHBEYXRhKGhzX2V4cHQpW1siSGVpZ2h0Il1dKQp0YWJsZShwRGF0YShoc19leHB0KVtbIlRoZXJhcGV1dGljX091dGNvbWVfRmluYWwiXV0pCnRhYmxlKHBEYXRhKGhzX2V4cHQpW1siZmluYWxvdXRjb21lIl1dKQoKdW5pcXVlKHBEYXRhKGhzX2V4cHQpW1siUGF0aWVudF9JRCJdXSkKbGVuZ3RoKHVuaXF1ZShwRGF0YShoc19leHB0KVtbIlBhdGllbnRfSUQiXV0pKQpgYGAKCkdldCB0aGUgc2V4IG9mIHRoZSB1bmlxdWUgcGF0aWVudHMuCgpgYGB7cn0KdW5pcXVlX3Blb3BsZSA8LSB1bmlxdWUocERhdGEoaHNfZXhwdClbWyJQYXRpZW50X0lEIl1dKQp1bmlxdWVfcGVvcGxlCmxlbmd0aCh1bmlxdWVfcGVvcGxlKQoKZGYgPC0gcERhdGEoaHNfZXhwdCkKcGVvcGxlIDwtIGRmW1siUGF0aWVudF9JRCJdXQpmaXJzdF9pbmRpY2VzIDwtIG9yZGVyKHBlb3BsZSlbIWR1cGxpY2F0ZWQoc29ydChwZW9wbGUpKV0KdGFibGUoZGZbZmlyc3RfaW5kaWNlcywgInNleCJdKQp0YWJsZShkZltmaXJzdF9pbmRpY2VzLCAiZmluYWxvdXRjb21lIl0pCmBgYAoKIyMgRGVmaW5lIGRlc2lyZWQgY29sb3JzIGZvciB0aGUgdmFyaW91cyBzdWJzZXRzCgpUaGVyZSBhcmUgbG90cyBvZiB3YXlzIHdoaWNoIHdlIHdpbGwgY2F0ZWdvcml6ZSB0aGUgZGF0YSwgaGVyZSBhcmUKc29tZSBwb3RlbnRpYWwgY29sb3IgY2hvaWNlcyBmb3IgdGhlbS4KCmBgYHtyfQpjb2xvcl9jaG9pY2VzIDwtIGxpc3QoCiAgICAiY2YiID0gbGlzdCgKICAgICAgImN1cmUiID0gIiM5OThFQzMiLAogICAgICAiZmFpbHVyZSIgPSAiI0YxQTM0MCIpLAogICAgImNmbG9zdCIgPSBsaXN0KAogICAgICAiY3VyZSIgPSAiIzk5OEVDMyIsCiAgICAgICJmYWlsdXJlIiA9ICIjRjFBMzQwIiwKICAgICAgImxvc3QiID0gIiMzNDM0MzQiKSwKICAgICJ0eXBlX3Zpc2l0IiA9IGxpc3QoCiAgICAgICJtb25vY3l0ZXNfdjEiID0gIiNERDFDNzciLAogICAgICAibW9ub2N5dGVzX3YyIiA9ICIjQzk5NEM3IiwKICAgICAgIm1vbm9jeXRlc192MyIgPSAiI0U3RTFFRiIsCiAgICAgICJlb3Npbm9waGlsc192MSIgPSAiIzMxQTM1NCIsCiAgICAgICJlb3Npbm9waGlsc192MiIgPSAiI0FEREQ4RSIsCiAgICAgICJlb3Npbm9waGlsc192MyIgPSAiI0Y3RkNEOSIsCiAgICAgICJuZXV0cm9waGlsc192MSIgPSAiIzMxODJCRCIsCiAgICAgICJuZXV0cm9waGlsc192MiIgPSAiIzlFQ0FFMSIsCiAgICAgICJuZXV0cm9waGlsc192MyIgPSAiI0RFRUJGNyIsCiAgICAgICJiaW9wc3lfdjEiID0gIiNEOTVGMEUiKSwKICAgICJ0eXBlIiA9IGxpc3QoCiAgICAgICJtb25vY3l0ZXMiID0gIiNERDFDNzciLAogICAgICAiZW9zaW5vcGhpbHMiID0gIiMzMUEzNTQiLAogICAgICAibmV1dHJvcGhpbHMiID0gIiMzMTgyQkQiLAogICAgICAiYmlvcHN5IiA9ICIjRDk1RjBFIiksCiAgICAidHdvX3Zpc2l0IiA9IGxpc3QoCiAgICAgICJmaXJzdCIgPSAiIzMzRUUzMyIsCiAgICAgICJsYXRlciIgPSAiIzAyMzMwMiIpLAogICAgInZpc2l0IiA9IGxpc3QoCiAgICAgICJ2MSIgPSAiI0NDQ0NDQyIsCiAgICAgICJ2MiIgPSAiIzY2NjY2NiIsCiAgICAgICJ2MyIgPSAiIzExMTExMSIpLAogICAgInZpc2l0MiIgPSBsaXN0KAogICAgICAiMSIgPSAiI0NDQ0NDQyIsCiAgICAgICIyIiA9ICIjNjY2NjY2IiwKICAgICAgIjMiID0gIiMxMTExMTEiKSwKICAgICJ2aXNpdGJpIiA9IGxpc3QoCiAgICAgICJ2MSIgPSAiI0JCMDAwMCIsCiAgICAgICJ2b3RoZXIiID0gIiMwMDAwQkIiKSwKICAgICJsYWJzIiA9IGxpc3QoCiAgICAgICJCcmF6aWwiID0gIiNGRkMzMDAiLAogICAgICAiQ29sb21iaWEiID0gIiM1MjUyNTIiKSwKICAgICJjbGluaWMiID0gbGlzdCgKICAgICAgInR1bWFjbyIgPSAiIzMxODJBQSIsCiAgICAgICJjYWxpIiA9ICIjQzk5NEFBIiksCiAgICAiY2xpbmljX2NmIiA9IGxpc3QoCiAgICAgICJ0dW1hY29fY3VyZSIgPSAiIzc2NzBCMyIsCiAgICAgICJ0dW1hY29fZmFpbHVyZSIgPSAiI0U3Mjk4QSIsCiAgICAgICJjYWxpX2N1cmUiID0gIiMxQjlFNzciLAogICAgICAiY2FsaV9mYWlsdXJlIiA9ICIjRDk1RjAyIiksCiAgICAiZXRobmljaXR5IiA9IGxpc3QoCiAgICAgICJhZnJvY29sIiA9ICIjNDI5M0NFIiwKICAgICAgImluZGlnZW5hIiA9ICIjQkRCREJEIiwKICAgICAgIm1lc3RpemEiID0gIiNGRUIyNEMiKSwKICAgICJjbGluaWNfZXRuaWEiID0gbGlzdCgKICAgICAgImNhbGlfYWZyb2NvbCIgPSAiIzMxODJCRCIsCiAgICAgICJjYWxpX2luZGlnZW5hIiA9ICIjNjM2MzYzIiwKICAgICAgImNhbGlfbWVzdGl6YSIgPSAiI0YwM0IyMCIsCiAgICAgICJ0dW1hY29fYWZyb2NvbCIgPSAiIzlFQ0FFMSIsCiAgICAgICJ0dW1hY29faW5kaWdlbmEiID0gIiNCREJEQkQiLAogICAgICAidHVtYWNvX21lc3RpemEiID0gIiNGRUIyNEMiKSwKICAgICJzZXgiID0gbGlzdCgKICAgICAgImZlbWFsZSIgPSAiIzMxODJCRCIsCiAgICAgICJtYWxlIiA9ICIjQzk5NEM3IiksCiAgICAiY2xpbmljX3NleCIgPSBsaXN0KAogICAgICAiY2FsaV9mZW1hbGUiID0gIiMwMDAwQ0MiLAogICAgICAidHVtYWNvX2ZlbWFsZSIgPSAiIzMxODJCRCIsCiAgICAgICJjYWxpX21hbGUiID0gIiNFNzI5OEEiLAogICAgICAidHVtYWNvX21hbGUiID0gIiNDOTk0QzciKSwKICAgICJjZl90eXBlIiA9IGxpc3QoCiAgICAgICJjdXJlX2Jpb3BzeSIgPSAiI0Q5NUYwRSIsCiAgICAgICJmYWlsdXJlX2Jpb3BzeSIgPSAiI0ZFQzQ0RiIsCiAgICAgICJjdXJlX21vbm9jeXRlcyIgPSAiI0REMUM3NyIsCiAgICAgICJmYWlsdXJlX21vbm9jeXRlcyIgPSAiI0M5OTRDNyIsCiAgICAgICJjdXJlX2Vvc2lub3BoaWxzIiA9ICIjMzFBMzU0IiwKICAgICAgImZhaWx1cmVfZW9zaW5vcGhpbHMiID0gIiNBREREOEUiLAogICAgICAiY3VyZV9uZXV0cm9waGlscyIgPSAiIzMxODJCRCIsCiAgICAgICJmYWlsdXJlX25ldXRyb3BoaWxzIiA9ICIjOUVDQUUxIiksCiAgICAicGFyYXNpdGUiID0gbGlzdCgKICAgICAgIm5vdGFwcGxpY2FibGUiID0gIiMwMDAwMDAiLAogICAgICAibHZicmF6aWxpZW5zaXMiID0gIiNBQTAwMDAiLAogICAgICAibHZndXlhbmVuc2lzIiA9ICIjNjYwMDY2IiwKICAgICAgImx2cGFuYW1lbnNpcyIgPSAiIzMxNjBBQyIpKQpkYXRhX3N0cnVjdHVyZXMgPC0gYyhkYXRhX3N0cnVjdHVyZXMsICJjb2xvcl9jaG9pY2VzIikKYGBgCgojIERlZmluZSB0aGUgc3RhcnRpbmcgZGF0YQoKR2l2ZW4gdGhlIHN0YXJ0aW5nIHBvaW50IGFib3ZlLCB3ZSB3aWxsIHN0YXJ0IGV4dHJhY3RpbmcgZ3JvdXBzIG9mCnNhbXBsZXMgb2YgaW50ZXJlc3QuCgojIyBTZXQgb3VyIGluaXRpYWwgY292ZXJhZ2UgZ29hbAoKVGhlIGZpcnN0IHNldCBvZiBzYW1wbGVzIHJlbW92ZWQgZnJvbSB0aGUgZGF0YSBhcmUgdGhvc2Ugd2l0aCB0b28gbWFueQptaXNzaW5nIGdlbmVzLgoKIyMgRmlndXJlIFMyOiBOb24temVybyBnZW5lcyBiZWZvcmUgc2FtcGxlIGZpbHRlcmluZwoKYGBge3J9CmFsbF9ueiA8LSBwbG90X25vbnplcm8oaHNfZXhwdCkKcHAoZmlsZSA9ICJmaWd1cmVzL1MyX25vbnplcm9fYWxsX3NhbXBsZXMuc3ZnIikKYWxsX256JHBsb3QKZGV2Lm9mZigpCmFsbF9uegpgYGAKCiMjIyBTYXZlIENQTSwgYWxsIHNhbXBsZXMKCldlIHNob3VsZCBzYXZlIGEgY3BtIGFuZCBycGttIGNvcHkgb2YgdGhlIHJhdyBkYXRhIGZvciBldmVyeSBzdWJzZXQgaW4Kb3JkZXIgdG8gbWFrZSBpdCBlYXNpZXIgZm9yIGZvbGtzIHRvIHdvcmsgd2l0aCBXR0NOQSBhbmQgb3RoZXIgdG9vbHMKKFNUUklORykuCgpgYGB7cn0KZGlyLmNyZWF0ZSgiY3BtLzNfQ2FsaV9hbmRfVHVtYWNvIiwgcmVjdXJzaXZlID0gVFJVRSkKZGlyLmNyZWF0ZSgicnBrbSIpCmNwbV9kYXRhIDwtIG5vcm1hbGl6ZV9leHB0KGhzX2V4cHQsIGNvbnZlcnQgPSAiY3BtIikKd3JpdHRlbiA8LSB3cml0ZV94bHN4KAogICAgZXhwcnMoY3BtX2RhdGEpLAogICAgZXhjZWwgPSBnbHVlKCJjcG0vM19DYWxpX2FuZF9UdW1hY28vYWxsX3NhbXBsZXMtdnt2ZXJ9Lnhsc3giKSkKCnJwa21fZGF0YSA8LSBub3JtYWxpemVfZXhwdChoc19leHB0LCBmaWx0ZXIgPSBUUlVFLCBjb252ZXJ0ID0gInJwa20iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uID0gIm1lYW5fY2RzX2xlbiIsIG5hX3RvX3plcm8gPSBUUlVFKQp3cml0ZS5jc3YoeCA9IGFzLmRhdGEuZnJhbWUoZXhwcnMocnBrbV9kYXRhKSksCiAgICAgICAgICBmaWxlID0gZ2x1ZSgicnBrbS9oc19leHB0X3Jwa20tdnt2ZXJ9LmNzdiIpKQpgYGAKCiMjIFN1YnNldDogRmlsdGVyIG91dCBwcm9ibGVtYXRpYyBzYW1wbGVzCgpUbyBteSBleWVzLCB0aGVyZSBhcmUgMyBvciA0IHNhbXBsZXMgd2hpY2ggYXJlIGxpa2VseSBjYW5kaWRhdGVzIGZvcgpyZW1vdmFsLiAgSW4gYWRkaXRpb24sIHdlIHdpbGwgcmVtb3ZlIHNhbXBsZXMgd2hpY2ggd2VyZSBsb3N0IGR1cmluZwp0aGUgdHJlYXRtZW50IGFuZC9vciBvbmVzIHdoaWNoIHdlcmUgdXNlZCBpbiBvdGhlciBleHBlcmltZW50cyBidXQKaW5jbHVkZWQgaW4gdGhlIFRNUkMzIHNhbXBsZSBzaGVldCAodGh1cyB0aGUgJ25vdGFwcGxpY2FibGUnIG9yCidudWxsJykuCgpJIHRoaW5rIHRoaXMgaXMgc3RhdGVkIGVsc2V3aGVyZTogdmFyaWFibGVzIHByZWZpeGVkIHdpdGggJ3RjJyBhcmUKVHVtYWNvIGFuZCBDYWxpOyAndCcgb3IgJ2MnIGNvcnJlc3BvbmQuCgpgYGB7cn0KdGNfbm9sb3N0IDwtIHN1YnNldF9leHB0KGhzX2V4cHQsIHN1YnNldCA9ICJmaW5hbG91dGNvbWUhPSdsb3N0JyIpCnRjX25vbWlsdCA8LSBzdWJzZXRfZXhwdCh0Y19ub2xvc3QsIHN1YnNldCA9ICJkcnVnPT0nYW50aW1vbnknIikKcGxvdF9sZWdlbmQodGNfbm9taWx0KQpub21pbHRfbm9uemVybyA8LSBwbG90X25vbnplcm8odGNfbm9taWx0LCBwbG90X2xhYmVscyA9IFRSVUUpCm5vbWlsdF9ub256ZXJvCnBwKGZpbGUgPSAiZmlndXJlcy9maWdzMl9ub256ZXJvLnN2ZyIpCm5vbWlsdF9ub256ZXJvCmRldi5vZmYoKQp0Y192YWxpZCA8LSBzdWJzZXRfZXhwdCh0Y19ub21pbHQsIG5vbnplcm8gPSAxMTAwMCkgJT4lCiAgc2V0X2V4cHRfY29sb3JzKGNvbG9ycyA9IGNvbG9yX2Nob2ljZXNbWyJjZiJdXSkKCnNhdmUobGlzdCA9ICJ0Y192YWxpZCIsIGZpbGUgPSBnbHVlKCJyZGEvdG1yYzNfdGNfdmFsaWQtdnt2ZXJ9LnJkYSIpKQpkYXRhX3N0cnVjdHVyZXMgPC0gYyhkYXRhX3N0cnVjdHVyZXMsICJ0Y192YWxpZCIpCmBgYAoKIyBWaXN1YWxpemUgdGhlIHNhbXBsZSBicmVha2Rvd24KCmBgYHtyfQpjbGluaWNfdHlwZV9vdXRjb21lX3NhbmtleSA8LSBwbG90X21ldGFfc2Fua2V5KAogIHRjX3ZhbGlkLCBmYWN0b3JzID0gYygiY2xpbmljIiwgInR5cGVvZmNlbGxzIiwgImZpbmFsb3V0Y29tZSIpLAogIGRyaWxsX2Rvd24gPSBUUlVFLCBjb2xvcl9jaG9pY2VzID0gY29sb3JfY2hvaWNlcykKY2xpbmljX3R5cGVfb3V0Y29tZV9zYW5rZXkKCmNsaW5pY19ldGhuaWNpdHlfb3V0Y29tZV9zYW5rZXkgPC0gcGxvdF9tZXRhX3NhbmtleSgKICB0Y192YWxpZCwgZmFjdG9ycyA9IGMoImNsaW5pYyIsICJldG5pYSIsICJmaW5hbG91dGNvbWUiKSwKICBkcmlsbF9kb3duID0gVFJVRSwgY29sb3JfY2hvaWNlcyA9IGNvbG9yX2Nob2ljZXMpCmNsaW5pY19ldGhuaWNpdHlfb3V0Y29tZV9zYW5rZXkKCmNsaW5pY19zZXhfb3V0Y29tZV9zYW5rZXkgPC0gcGxvdF9tZXRhX3NhbmtleSgKICB0Y192YWxpZCwgZmFjdG9ycyA9IGMoImNsaW5pYyIsICJzZXgiLCAiZmluYWxvdXRjb21lIiksCiAgZHJpbGxfZG93biA9IFRSVUUsIGNvbG9yX2Nob2ljZXMgPSBjb2xvcl9jaG9pY2VzKQpjbGluaWNfc2V4X291dGNvbWVfc2Fua2V5CmBgYAoKIyMgRmlndXJlIFhYICsgMTogTm9uLXplcm8gZ2VuZXMgYWZ0ZXIgc2FtcGxlIGZpbHRlcmluZwoKVGhlIGZvbGxvd2luZyBwbG90IGlzIGVzc2VudGlhbGx5IGlkZW50aWNhbCB0byB0aGUgcHJldmlvdXMgd2l0aCB0d28KZXhjZXB0aW9uczoKCjEuICBUaGUgc2FtcGxlcyB3aXRoIHRvbyBmZXcgZ2VuZXMgKDExLDAwMCBjdXJyZW50bHkpIGFyZSBnb25lLgoyLiAgVGhlIHNhbXBsZXMgYXJlIGNvbG9yZWQgYnkgY3VyZShwdXJwbGUpL2ZhaWwoeWVsbG93KQoKYGBge3J9Cm56X3Bvc3QgPC0gcGxvdF9ub256ZXJvKHRjX3ZhbGlkKQpuel9wb3N0CnBwKGZpbGUgPSAiZmlndXJlcy9maWdTMnYyX3Bvc3Quc3ZnIikKbnpfcG9zdApkZXYub2ZmKCkKYGBgCgojIyBTdW1tYXJpemU6IFRhbGx5IHNhbXBsZXMgYWZ0ZXIgZmlsdGVyaW5nCgpXZSBuZWVkIHRvIGtlZXAgdHJhY2sgb2YgaG93IG1hbnkgb2YgZWFjaCBzYW1wbGUgdHlwZSBpcyBsb3N0IHdoZW4gd2UKZG8gb3VyIHZhcmlvdXMgZmlsdGVycy4gIFRodXMgSSBhbSByZXBlYXRpbmcgdGhlIHNhbWUgc2V0IG9mIHRhbGxpZXMuClRoaXMgd2lsbCBsaWtlbHkgaGFwcGVuIG9uZSBtb3JlIHRpbWUsIGZvbGxvd2luZyB0aGUgcmVtb3ZhbCBvZgpzYW1wbGVzIHdoaWNoIGNhbWUgZnJvbSBDYWxpLgoKYGBge3J9CnRhYmxlKHBEYXRhKHRjX3ZhbGlkKVtbImRydWciXV0pCnRhYmxlKHBEYXRhKHRjX3ZhbGlkKVtbImNsaW5pYyJdXSkKdGFibGUocERhdGEodGNfdmFsaWQpW1siZmluYWxvdXRjb21lIl1dKQp0YWJsZShwRGF0YSh0Y192YWxpZClbWyJ0eXBlb2ZjZWxscyJdXSkKdGFibGUocERhdGEodGNfdmFsaWQpW1sidmlzaXQiXV0pCnN1bW1hcnkoYXMubnVtZXJpYyhwRGF0YSh0Y192YWxpZClbWyJFdm9sdXRpb25fVGltZSJdXSkpCnN1bW1hcnkoYXMubnVtZXJpYyhwRGF0YSh0Y192YWxpZClbWyJQcmVzY3JpYmVkX0RhaWx5X0Rvc2VfR2x1YyJdXSkpCnN1bW1hcnkoYXMubnVtZXJpYyhwRGF0YSh0Y192YWxpZClbWyJWM19WZXJ0aWNhbF9BeGlzX0xlc2lvbiJdXSkpCnN1bW1hcnkoYXMubnVtZXJpYyhwRGF0YSh0Y192YWxpZClbWyJWM19Ub3RhbF9BcmVhX0xlc2lvbiJdXSkpCnN1bW1hcnkoYXMubnVtZXJpYyhwRGF0YSh0Y192YWxpZClbWyJWM19Ib3Jpem9udGFsX0F4aXNfVWxjZXIiXV0pKQp0YWJsZShwRGF0YSh0Y192YWxpZClbWyJzZXgiXV0pCnRhYmxlKHBEYXRhKHRjX3ZhbGlkKVtbImV0bmlhIl1dKQpzdW1tYXJ5KGFzLm51bWVyaWMocERhdGEodGNfdmFsaWQpW1siQWdlIl1dKSkKc3VtbWFyeShwRGF0YSh0Y192YWxpZClbWyJXZWlnaHQiXV0pCnN1bW1hcnkocERhdGEodGNfdmFsaWQpW1siSGVpZ2h0Il1dKQoKbGVuZ3RoKHVuaXF1ZShwRGF0YSh0Y192YWxpZClbWyJQYXRpZW50X0lEIl1dKSkKYGBgCgojIyBFeHRyYWN0IHRoZSBkZW1vZ3JhcGhpY3MgZnJvbSB0aGUgcmVtYWluaW5nIHNhbXBsZXMKCldoZW4gd2UgcGVyZm9ybSB0aGUgbG9naXN0aWMvbGluZWFyIG1vZGVscyBleGFtaW5pbmcgdmFyaWFibGVzIGluIHRoZQpkZW1vZ3JhcGhpY3MsIHdlIG5lZWQgdG8gZW5zdXJlIHRoYXQgd2UgYXJlIHdvcmtpbmcgd2l0aCBvbmx5IHRoZQpwZW9wbGUgd2hvIGFyZSBpbmNsdWRlZCBpbiB0aGUgZmluYWwgZGF0YXNldC4KCmBgYHtyfQpwZW9wbGVfcmVtYWluaW5nIDwtIHVuaXF1ZShwRGF0YSh0Y192YWxpZClbWyJQYXRpZW50X0lEIl1dKQpkZW1vZ3JhcGhpY3NfZmlsdGVyZWRfaWR4IDwtIGhzX2RlbW9ncmFwaGljc1tbIlBhdGllbnRfSUQiXV0gJWluJSBwZW9wbGVfcmVtYWluaW5nCmRlbW9ncmFwaGljc19maWx0ZXJlZCA8LSBoc19kZW1vZ3JhcGhpY3NbZGVtb2dyYXBoaWNzX2ZpbHRlcmVkX2lkeCwgXQpkYXRhX3N0cnVjdHVyZXMgPC0gYyhkYXRhX3N0cnVjdHVyZXMsICJkZW1vZ3JhcGhpY3NfZmlsdGVyZWQiKQpgYGAKCiMjIFNwbGl0IHRoZSBkYXRhIGJ5IGN1cmUvZmFpbCBmb3Igc29tZSBjb3VudGluZwoKV2Ugbm93IGhhdmUgdHdvIGRhdGFzZXRzIHdoaWNoIGFyZSBjb21wcmlzZWQgb2Ygb25seSB0aGUKY3VyZS9mYWlsIHNhbXBsZXMuICBJdCBpcyB3b3J0aCBjb25zaWRlcmluZyBpZiB0aGVyZSBhcmUgd2F5cyB3ZQpjYW4gbGV2ZXJhZ2UgdGhpcyBzZXBhcmF0aW9uLgoKYGBge3J9CnRjX2N1cmUgPC0gc3Vic2V0X2V4cHQodGNfdmFsaWQsIHN1YnNldCA9ICJmaW5hbG91dGNvbWU9PSdjdXJlJyIpCmRhdGFfc3RydWN0dXJlcyA8LSBjKGRhdGFfc3RydWN0dXJlcywgInRjX2N1cmUiKQoKdGFibGUocERhdGEodGNfY3VyZSlbWyJ2aXNpdG51bWJlciJdXSkKCnRjX2ZhaWwgPC0gc3Vic2V0X2V4cHQodGNfdmFsaWQsIHN1YnNldCA9ICJmaW5hbG91dGNvbWU9PSdmYWlsdXJlJyIpCmRhdGFfc3RydWN0dXJlcyA8LSBjKGRhdGFfc3RydWN0dXJlcywgInRjX2ZhaWwiKQoKdGFibGUocERhdGEodGNfZmFpbClbWyJ2aXNpdG51bWJlciJdXSkKYGBgCgojIFByaW50IG91dCBjZWxsIHR5cGUgYW5kIHZpc2l0IG51bWJlcnMKCmBgYHtyfQphbGxfdHlwZXMgPC0gdGFibGUocERhdGEodGNfdmFsaWQpW1sidHlwZW9mY2VsbHMiXV0pCmFsbF90eXBlcwphbGxfdGltZXMgPC0gdGFibGUocERhdGEodGNfdmFsaWQpW1sidmlzaXRudW1iZXIiXV0pCmFsbF90aW1lcwpgYGAKCiMjIyBXcml0ZSB2YWxpZCBzYW1wbGVzCgpXZSBjb21wbGV0ZWQgdGhlIGluaXRpYWwgZmlsdGVyIG9mIHRoZSBkYXRhLiAgV3JpdGUgaXQgb3V0LiAgVGhpcwpkYXRhIHNob3VsZCBpbmNsdWRlIGFsbCBzYW1wbGVzIGV4Y2VwdCB0aG9zZSB3ZSBleHBsaWNpdGx5IHJlbW92ZWQgZHVlCnRvIHBvb3IgY292ZXJhZ2UsIGxvc3Qtc3RhdHVzLCBvciBub24tY2Fub25pY2FsIGNlbGwgdHlwZSAodGhlIHBpbG90CnN0dWR5KS4KCmBgYHtyfQpjcG1fZGF0YSA8LSBub3JtYWxpemVfZXhwdCh0Y192YWxpZCwgY29udmVydCA9ICJjcG0iKQp3cml0dGVuIDwtIHdyaXRlX3hsc3goCiAgICBleHBycyhjcG1fZGF0YSksCiAgICBleGNlbCA9IGdsdWUoImNwbS8zX0NhbGlfYW5kX1R1bWFjby9hbGxfdmFsaWRfc2FtcGxlcy12e3Zlcn0ueGxzeCIpKQpycGttX2RhdGEgPC0gbm9ybWFsaXplX2V4cHQodGNfdmFsaWQsIGZpbHRlciA9IFRSVUUsIGNvbnZlcnQgPSAicnBrbSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW4gPSAibWVhbl9jZHNfbGVuIiwgbmFfdG9femVybyA9IFRSVUUpCndyaXRlLmNzdih4ID0gYXMuZGF0YS5mcmFtZShleHBycyhycGttX2RhdGEpKSwKICAgICAgICAgIGZpbGUgPSBnbHVlKCJycGttL3RjX2FsbF92YWxpZF9zYW1wbGVzLXZ7dmVyfS5jc3YiKSkKYGBgCgojIyBFeHRyYWN0IGNlbGwgdHlwZXMKCkV4dHJhY3QgdGhlIHNhbXBsZXMgb2YgZWFjaCBjZWxsIHR5cGUsIHRoZXNlIHdpbGwgYmUgdGhlIGJhc2lzIGZvciBhCnNpZ25pZmljYW50IG51bWJlciBvZiB0aGUgY2xpbmljYWwgb3V0Y29tZSBjb21wYXJpc29ucy4KCmBgYHtyfQojIyBOb3RlLCBJIHdpbGwgc2F2ZSB0aGVzZSBkYXRhIHN0cnVjdHVyZXMgaW4gYSBsaXR0bGUgYml0IHdoZW4gSQojIyBkZWNpZGUgaG93IEkgd2FudCB0byBzZXQgdGhlIGNvbmRpdGlvbnMsIGJhdGNoZXMsIGFuZCBjb2xvcnMuCnRjX2Vvc2lub3BoaWxzIDwtIHN1YnNldF9leHB0KHRjX3ZhbGlkLCBzdWJzZXQgPSAidHlwZW9mY2VsbHM9PSdlb3Npbm9waGlscyciKQp0Y19tb25vY3l0ZXMgPC0gc3Vic2V0X2V4cHQodGNfdmFsaWQsIHN1YnNldCA9ICJ0eXBlb2ZjZWxscz09J21vbm9jeXRlcyciKQp0Y19uZXV0cm9waGlscyA8LSBzdWJzZXRfZXhwdCh0Y192YWxpZCwgc3Vic2V0ID0gInR5cGVvZmNlbGxzPT0nbmV1dHJvcGhpbHMnIikKYGBgCgojIyMgV3JpdGUgY2VsbCB0eXBlIGNwbQoKVGhlIGZvbGxvd2luZyB3cml0ZXMgb3V0IHJwa20vY3BtIHZhbHVlcyBmb3IgZWFjaCBjZWxsdHlwZSBmcm9tIGJvdGgKY2xpbmljcyh0YyBwcmVmaXgpLgoKYGBge3J9CmNwbV9kYXRhIDwtIG5vcm1hbGl6ZV9leHB0KHRjX2Vvc2lub3BoaWxzLCBjb252ZXJ0ID0gImNwbSIpCndyaXR0ZW4gPC0gd3JpdGVfeGxzeCgKICAgIGV4cHJzKGNwbV9kYXRhKSwKICAgIGV4Y2VsID0gZ2x1ZSgiY3BtLzNfQ2FsaV9hbmRfVHVtYWNvL3RjX2Vvc2lub3BoaWxzLXZ7dmVyfS54bHN4IikpCnJwa21fZGF0YSA8LSBub3JtYWxpemVfZXhwdCh0Y19lb3Npbm9waGlscywgZmlsdGVyID0gVFJVRSwgY29udmVydCA9ICJycGttIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hX3RvX3plcm8gPSBUUlVFLCBjb2x1bW4gPSAibWVhbl9jZHNfbGVuIikKd3JpdGUuY3N2KHggPSBhcy5kYXRhLmZyYW1lKGV4cHJzKHJwa21fZGF0YSkpLAogICAgICAgICAgZmlsZSA9IGdsdWUoInJwa20vdGNfZW9zaW5vcGhpbHMtdnt2ZXJ9LmNzdiIpKQoKY3BtX2RhdGEgPC0gbm9ybWFsaXplX2V4cHQodGNfbW9ub2N5dGVzLCBjb252ZXJ0ID0gImNwbSIpCndyaXR0ZW4gPC0gd3JpdGVfeGxzeCgKICAgIGV4cHJzKGNwbV9kYXRhKSwKICAgIGV4Y2VsID0gZ2x1ZSgiY3BtLzNfQ2FsaV9hbmRfVHVtYWNvL3RjX21vbm9jeXRlcy12e3Zlcn0ueGxzeCIpKQpycGttX2RhdGEgPC0gbm9ybWFsaXplX2V4cHQodGNfbW9ub2N5dGVzLCBmaWx0ZXIgPSBUUlVFLCBjb252ZXJ0ID0gInJwa20iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFfdG9femVybyA9IFRSVUUsIGNvbHVtbiA9ICJtZWFuX2Nkc19sZW4iKQp3cml0ZS5jc3YoeCA9IGFzLmRhdGEuZnJhbWUoZXhwcnMocnBrbV9kYXRhKSksCiAgICAgICAgICBmaWxlID0gZ2x1ZSgicnBrbS90Y19tb25vY3l0ZXMtdnt2ZXJ9LmNzdiIpKQoKY3BtX2RhdGEgPC0gbm9ybWFsaXplX2V4cHQodGNfbmV1dHJvcGhpbHMsIGNvbnZlcnQgPSAiY3BtIikKd3JpdHRlbiA8LSB3cml0ZV94bHN4KAogICAgZXhwcnMoY3BtX2RhdGEpLAogICAgZXhjZWwgPSBnbHVlKCJjcG0vM19DYWxpX2FuZF9UdW1hY28vdGNfbmV1dHJvcGhpbHMtdnt2ZXJ9Lnhsc3giKSkKcnBrbV9kYXRhIDwtIG5vcm1hbGl6ZV9leHB0KHRjX25ldXRyb3BoaWxzLCBmaWx0ZXIgPSBUUlVFLCBjb252ZXJ0ID0gInJwa20iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFfdG9femVybyA9IFRSVUUsIGNvbHVtbiA9ICJtZWFuX2Nkc19sZW4iKQp3cml0ZS5jc3YoeCA9IGFzLmRhdGEuZnJhbWUoZXhwcnMocnBrbV9kYXRhKSksCiAgICAgICAgICBmaWxlID0gZ2x1ZSgicnBrbS90Y19uZXV0cm9waGlscy12e3Zlcn0uY3N2IikpCmBgYAoKIyMgVHVtYWNvIGFuZCBDYWxpIHNhbXBsZXMgYnkgdmlzaXQKClRoZSBwcmVmaXhlcyBvZiB0aGUgZm9sbG93aW5nIGRhdGFzdHJ1Y3R1cmVzIHN0YXRlIHRoYXQgdGhlc2UgYXJlIGZyb20KYm90aCBjbGluaWNzICh0YykgYW5kIGEgc3BlY2lmaWMgdmlzaXQgKHYxL3YyL3YzKS4gIFRoZSBycGttL2NwbQp2YWx1ZXMgd2lsbCBiZSB3cml0dGVuIGltbWVkaWF0ZWx5IHRoZXJlYWZ0ZXIuCgpgYGB7cn0KdGN2MV9zYW1wbGVzIDwtIHN1YnNldF9leHB0KHRjX3ZhbGlkLCBzdWJzZXQgPSAidmlzaXRudW1iZXI9PScxJyIpCnNhdmUobGlzdCA9ICJ0Y3YxX3NhbXBsZXMiLCBmaWxlID0gZ2x1ZSgicmRhL3RtcmMzX3RjdjFfc2FtcGxlcy12e3Zlcn0ucmRhIikpCmRhdGFfc3RydWN0dXJlcyA8LSBjKGRhdGFfc3RydWN0dXJlcywgInRjdjFfc2FtcGxlcyIpCgp0Y3YyX3NhbXBsZXMgPC0gc3Vic2V0X2V4cHQodGNfdmFsaWQsIHN1YnNldCA9ICJ2aXNpdG51bWJlcj09JzInIikKc2F2ZShsaXN0ID0gInRjdjJfc2FtcGxlcyIsIGZpbGUgPSBnbHVlKCJyZGEvdG1yYzNfdGN2Ml9zYW1wbGVzLXZ7dmVyfS5yZGEiKSkKZGF0YV9zdHJ1Y3R1cmVzIDwtIGMoZGF0YV9zdHJ1Y3R1cmVzLCAidGN2Ml9zYW1wbGVzIikKCnRjdjNfc2FtcGxlcyA8LSBzdWJzZXRfZXhwdCh0Y192YWxpZCwgc3Vic2V0ID0gInZpc2l0bnVtYmVyPT0nMyciKQpzYXZlKGxpc3QgPSAidGN2M19zYW1wbGVzIiwgZmlsZSA9IGdsdWUoInJkYS90bXJjM190Y3YzX3NhbXBsZXMtdnt2ZXJ9LnJkYSIpKQpkYXRhX3N0cnVjdHVyZXMgPC0gYyhkYXRhX3N0cnVjdHVyZXMsICJ0Y3YzX3NhbXBsZXMiKQpgYGAKCiMjIyBDYWxpIGFuZCBUdW1hY28gYnkgdmlzaXQsIHdyaXRlIGNwbQoKYGBge3J9CmNwbV9kYXRhIDwtIG5vcm1hbGl6ZV9leHB0KHRjdjFfc2FtcGxlcywgY29udmVydCA9ICJjcG0iKQp3cml0dGVuIDwtIHdyaXRlX3hsc3goCiAgICBleHBycyhjcG1fZGF0YSksCiAgICBleGNlbCA9IGdsdWUoImNwbS8zX0NhbGlfYW5kX1R1bWFjby90Y3YxX3NhbXBsZXMtdnt2ZXJ9Lnhsc3giKSkKcnBrbV9kYXRhIDwtIG5vcm1hbGl6ZV9leHB0KHRjdjFfc2FtcGxlcywgZmlsdGVyID0gVFJVRSwgY29udmVydCA9ICJycGttIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hX3RvX3plcm8gPSBUUlVFLCBjb2x1bW4gPSAibWVhbl9jZHNfbGVuIikKd3JpdGUuY3N2KHggPSBhcy5kYXRhLmZyYW1lKGV4cHJzKHJwa21fZGF0YSkpLAogICAgICAgICAgZmlsZSA9IGdsdWUoInJwa20vdGN2MV9zYW1wbGVzLXZ7dmVyfS5jc3YiKSkKCmNwbV9kYXRhIDwtIG5vcm1hbGl6ZV9leHB0KHRjdjJfc2FtcGxlcywgY29udmVydCA9ICJjcG0iKQp3cml0dGVuIDwtIHdyaXRlX3hsc3goCiAgICBleHBycyhjcG1fZGF0YSksCiAgICBleGNlbCA9IGdsdWUoImNwbS8zX0NhbGlfYW5kX1R1bWFjby90Y3YyX3NhbXBsZXMtdnt2ZXJ9Lnhsc3giKSkKcnBrbV9kYXRhIDwtIG5vcm1hbGl6ZV9leHB0KHRjdjJfc2FtcGxlcywgZmlsdGVyID0gVFJVRSwgY29udmVydCA9ICJycGttIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hX3RvX3plcm8gPSBUUlVFLCBjb2x1bW4gPSAibWVhbl9jZHNfbGVuIikKd3JpdGUuY3N2KHggPSBhcy5kYXRhLmZyYW1lKGV4cHJzKHJwa21fZGF0YSkpLAogICAgICAgICAgZmlsZSA9IGdsdWUoInJwa20vdGN2Ml9zYW1wbGVzLXZ7dmVyfS5jc3YiKSkKCmNwbV9kYXRhIDwtIG5vcm1hbGl6ZV9leHB0KHRjdjNfc2FtcGxlcywgY29udmVydCA9ICJjcG0iKQp3cml0dGVuIDwtIHdyaXRlX3hsc3goCiAgICBleHBycyhjcG1fZGF0YSksCiAgICBleGNlbCA9IGdsdWUoImNwbS8zX0NhbGlfYW5kX1R1bWFjby90Y3YzX3NhbXBsZXMtdnt2ZXJ9Lnhsc3giKSkKcnBrbV9kYXRhIDwtIG5vcm1hbGl6ZV9leHB0KHRjdjNfc2FtcGxlcywgZmlsdGVyID0gVFJVRSwgY29udmVydCA9ICJycGttIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hX3RvX3plcm8gPSBUUlVFLCBjb2x1bW4gPSAibWVhbl9jZHNfbGVuIikKd3JpdGUuY3N2KHggPSBhcy5kYXRhLmZyYW1lKGV4cHJzKHJwa21fZGF0YSkpLAogICAgICAgICAgZmlsZSA9IGdsdWUoInJwa20vdGN2M19zYW1wbGVzLXZ7dmVyfS5jc3YiKSkKYGBgCgojIFR1bWFjbyBhbmQgQ2FsaSBkYXRhIHN0cnVjdHVyZXMKCkFsbCBkYXRhIHN0cnVjdHVyZXMgd2hpY2ggc3RhcnQgd2l0aCB0aGUgcHJlZml4ICd0YycgYXJlIFR1bWFjbyBhbmQKQ2FsaS4gIFRob3NlIHdpdGggJ3QnIGFyZSBvbmx5IFR1bWFjbywgJ2MnIGFyZSBvbmx5IENhbGkuCgpgYGB7cn0KdGNfY2xpbmljYWwgPC0gdGNfdmFsaWQgJT4lCiAgc2V0X2V4cHRfY29uZGl0aW9ucyhmYWN0ID0gImZpbmFsb3V0Y29tZSIsIGNvbG9ycyA9IGNvbG9yX2Nob2ljZXNbWyJjZiJdXSkgJT4lCiAgc2V0X2V4cHRfYmF0Y2hlcyhmYWN0ID0gInR5cGVvZmNlbGxzIikKc2F2ZShsaXN0ID0gInRjX2NsaW5pY2FsIiwgZmlsZSA9IGdsdWUoInJkYS90bXJjM190Y19jbGluaWNhbC12e3Zlcn0ucmRhIikpCmRhdGFfc3RydWN0dXJlcyA8LSBjKGRhdGFfc3RydWN0dXJlcywgInRjX2NsaW5pY2FsIikKYGBgCgojIyBTdWJzZXQ6IE1vbm9jeXRlcyBieSBjbGluaWMKCkZvciBzb21lIG9mIHRoZSBmb2xsb3dpbmcgZGF0YSBzdHJ1Y3R1cmVzLCB3ZSB3aWxsIGJlIGNvbmNhdGVuYXRpbmcKdmFyaW91cyBtZXRhZGF0YSBmYWN0b3JzIG9mIGludGVyZXN0LCB1c3VhbGx5IHRoZSBmaW5hbCBvdXRjb21lIGFuZApvbmUgb3RoZXIgbWV0YWRhdHVtLgoKIyMgU3Vic2V0IE1vbm9jeXRlcwoKSW4gdGhlIGZvbGxvd2luZyBibG9jayBJIGFtIHdyaXRpbmcgb3V0IHRoZSBNb25vY3l0ZXMgaW4gYSBjb3VwbGUKZGlmZmVyZW50IHdheXMsIG9uY2Ugd2l0aCB0aGUgY2xpbmljYWwgb3V0Y29tZSBhcyB0aGUgcHJpbWFyeSBmYWN0b3IsCmFuZCBhZ2FpbiB1c2luZyB0aGUgY29uY2F0ZW5hdGlvbiBvZiBjbGluaWMvb3V0Y29tZS4KCmBgYHtyfQpjbGluaWNfY2YgPC0gcGFzdGUwKHBEYXRhKHRjX21vbm9jeXRlcylbWyJjbGluaWMiXV0sICJfIiwKICAgICAgICAgICAgICAgICAgICBwRGF0YSh0Y19tb25vY3l0ZXMpW1siZmluYWxvdXRjb21lIl1dKQp0YWJsZShjbGluaWNfY2YpCnRjX21vbm9jeXRlcyA8LSBzZXRfZXhwdF9jb25kaXRpb25zKAogIHRjX21vbm9jeXRlcywgZmFjdCA9IGNsaW5pY19jZiwgY29sb3JzID0gY29sb3JfY2hvaWNlc1tbImNsaW5pY19jZiJdXSkgJT4lCiAgc2V0X2V4cHRfYmF0Y2hlcyhmYWN0ID0gInZpc2l0bnVtYmVyIikKc2F2ZShsaXN0ID0gInRjX21vbm9jeXRlcyIsIGZpbGUgPSBnbHVlKCJyZGEvdG1yYzNfdGNfbW9ub2N5dGVzLXZ7dmVyfS5yZGEiKSkKZGF0YV9zdHJ1Y3R1cmVzIDwtIGMoZGF0YV9zdHJ1Y3R1cmVzLCAidGNfbW9ub2N5dGVzIikKCnRjdjFfbW9ub2N5dGVzIDwtIHN1YnNldF9leHB0KHRjX21vbm9jeXRlcywgc3Vic2V0ID0gInZpc2l0bnVtYmVyPT0nMSciKQpzYXZlKGxpc3QgPSAidGN2MV9tb25vY3l0ZXMiLCBmaWxlID0gZ2x1ZSgicmRhL3RtcmMzX3RjdjFfbW9ub2N5dGVzLXZ7dmVyfS5yZGEiKSkKZGF0YV9zdHJ1Y3R1cmVzIDwtIGMoZGF0YV9zdHJ1Y3R1cmVzLCAidGN2MV9tb25vY3l0ZXMiKQp0Y3YyX21vbm9jeXRlcyA8LSBzdWJzZXRfZXhwdCh0Y19tb25vY3l0ZXMsIHN1YnNldCA9ICJ2aXNpdG51bWJlcj09JzInIikKc2F2ZShsaXN0ID0gInRjdjJfbW9ub2N5dGVzIiwgZmlsZSA9IGdsdWUoInJkYS90bXJjM190Y3YyX21vbm9jeXRlcy12e3Zlcn0ucmRhIikpCmRhdGFfc3RydWN0dXJlcyA8LSBjKGRhdGFfc3RydWN0dXJlcywgInRjdjJfbW9ub2N5dGVzIikKdGN2M19tb25vY3l0ZXMgPC0gc3Vic2V0X2V4cHQodGNfbW9ub2N5dGVzLCBzdWJzZXQgPSAidmlzaXRudW1iZXI9PSczJyIpCnNhdmUobGlzdCA9ICJ0Y3YzX21vbm9jeXRlcyIsIGZpbGUgPSBnbHVlKCJyZGEvdG1yYzNfdGN2M19tb25vY3l0ZXMtdnt2ZXJ9LnJkYSIpKQpkYXRhX3N0cnVjdHVyZXMgPC0gYyhkYXRhX3N0cnVjdHVyZXMsICJ0Y3YzX21vbm9jeXRlcyIpCmBgYAoKIyMgU3Vic2V0OiBFb3Npbm9waGlscwoKLi4uIGFuZCB0aGUgRW9zaW5vcGhpbHMuICBUaGVzZSBhcmUgbm90ZXdvcnRoeSBiZWNhdXNlIHRoZXkgaGF2ZSBmZXdlcgpmYWlscyB0aGFuIHNvbWUgb3RoZXIgY29ob3J0cy4KCmBgYHtyfQpjbGluaWNfY2YgPC0gcGFzdGUwKHBEYXRhKHRjX2Vvc2lub3BoaWxzKVtbImNsaW5pYyJdXSwgIl8iLAogICAgICAgICAgICAgICAgICAgIHBEYXRhKHRjX2Vvc2lub3BoaWxzKVtbImZpbmFsb3V0Y29tZSJdXSkKdGFibGUoY2xpbmljX2NmKQp0Y19lb3Npbm9waGlscyA8LSBzZXRfZXhwdF9jb25kaXRpb25zKAogIHRjX2Vvc2lub3BoaWxzLCBmYWN0ID0gY2xpbmljX2NmLCBjb2xvcnMgPSBjb2xvcl9jaG9pY2VzW1siY2xpbmljX2NmIl1dKSAlPiUKICBzZXRfZXhwdF9iYXRjaGVzKGZhY3QgPSAidmlzaXRudW1iZXIiKQpzYXZlKGxpc3QgPSAidGNfZW9zaW5vcGhpbHMiLCBmaWxlID0gZ2x1ZSgicmRhL3RtcmMzX3RjX2Vvc2lub3BoaWxzLXZ7dmVyfS5yZGEiKSkKZGF0YV9zdHJ1Y3R1cmVzIDwtIGMoZGF0YV9zdHJ1Y3R1cmVzLCAidGNfZW9zaW5vcGhpbHMiKQoKdGN2MV9lb3Npbm9waGlscyA8LSBzdWJzZXRfZXhwdCh0Y19lb3Npbm9waGlscywgc3Vic2V0ID0gInZpc2l0bnVtYmVyPT0nMSciKQpzYXZlKGxpc3QgPSAidGN2MV9lb3Npbm9waGlscyIsIGZpbGUgPSBnbHVlKCJyZGEvdG1yYzNfdGN2MV9lb3Npbm9waGlscy12e3Zlcn0ucmRhIikpCmRhdGFfc3RydWN0dXJlcyA8LSBjKGRhdGFfc3RydWN0dXJlcywgInRjdjFfZW9zaW5vcGhpbHMiKQp0Y3YyX2Vvc2lub3BoaWxzIDwtIHN1YnNldF9leHB0KHRjX2Vvc2lub3BoaWxzLCBzdWJzZXQgPSAidmlzaXRudW1iZXI9PScyJyIpCnNhdmUobGlzdCA9ICJ0Y3YyX2Vvc2lub3BoaWxzIiwgZmlsZSA9IGdsdWUoInJkYS90bXJjM190Y3YyX2Vvc2lub3BoaWxzLXZ7dmVyfS5yZGEiKSkKZGF0YV9zdHJ1Y3R1cmVzIDwtIGMoZGF0YV9zdHJ1Y3R1cmVzLCAidGN2Ml9lb3Npbm9waGlscyIpCnRjdjNfZW9zaW5vcGhpbHMgPC0gc3Vic2V0X2V4cHQodGNfZW9zaW5vcGhpbHMsIHN1YnNldCA9ICJ2aXNpdG51bWJlcj09JzMnIikKc2F2ZShsaXN0ID0gInRjdjNfZW9zaW5vcGhpbHMiLCBmaWxlID0gZ2x1ZSgicmRhL3RtcmMzX3RjdjNfZW9zaW5vcGhpbHMtdnt2ZXJ9LnJkYSIpKQpkYXRhX3N0cnVjdHVyZXMgPC0gYyhkYXRhX3N0cnVjdHVyZXMsICJ0Y3YzX2Vvc2lub3BoaWxzIikKYGBgCgojIyBTdWJzZXQ6IEJpb3BzaWVzCgpGb2xsb3dlZCBieSB0aGUgQmlvcHN5IHNhbXBsZXMuLi4KCmBgYHtyfQp0Y19jbGluaWNhbF9ub2Jpb3AgPC0gc3Vic2V0X2V4cHQodGNfY2xpbmljYWwsIHN1YnNldCA9ICJ0eXBlb2ZjZWxscyE9J2Jpb3BzeSciKSAlPiUKICBzZXRfZXhwdF9jb2xvcnMoY29sb3JfY2hvaWNlc1tbImNmIl1dKQpzYXZlKGxpc3QgPSAidGNfY2xpbmljYWxfbm9iaW9wIiwgZmlsZSA9IGdsdWUoInJkYS90bXJjM190Y19jbGluaWNhbF9ub2Jpb3Atdnt2ZXJ9LnJkYSIpKQpkYXRhX3N0cnVjdHVyZXMgPC0gYyhkYXRhX3N0cnVjdHVyZXMsICJ0Y19jbGluaWNhbF9ub2Jpb3AiKQoKdGNfYmlvcHNpZXMgPC0gdGNfdmFsaWQgJT4lCiAgc2V0X2V4cHRfY29uZGl0aW9ucyhmYWN0ID0gImNsaW5pYyIpICU+JQogIHNldF9leHB0X2JhdGNoZXMoZmFjdCA9ICJmaW5hbG91dGNvbWUiKSAlPiUKICBzdWJzZXRfZXhwdChzdWJzZXQgPSAidHlwZW9mY2VsbHM9PSdiaW9wc3knIikKdGNfY2YgPC0gcGFzdGUwKHBEYXRhKHRjX2Jpb3BzaWVzKVtbImNsaW5pYyJdXSwgIl8iLAogICAgICAgICAgICAgICAgcERhdGEodGNfYmlvcHNpZXMpW1siZmluYWxvdXRjb21lIl1dKQp0YWJsZSh0Y19jZikKdGNfYmlvcHNpZXMgPC0gc2V0X2V4cHRfY29uZGl0aW9ucygKICB0Y19iaW9wc2llcywgZmFjdCA9IHRjX2NmLCBjb2xvcnMgPSBjb2xvcl9jaG9pY2VzW1siY2xpbmljX2NmIl1dKSAlPiUKICBzZXRfZXhwdF9iYXRjaGVzKGZhY3QgPSAidmlzaXRudW1iZXIiKQpzYXZlKGxpc3QgPSAidGNfYmlvcHNpZXMiLCBmaWxlID0gZ2x1ZSgicmRhL3RtcmMzX3RjX2Jpb3BzaWVzLXZ7dmVyfS5yZGEiKSkKZGF0YV9zdHJ1Y3R1cmVzIDwtIGMoZGF0YV9zdHJ1Y3R1cmVzLCAidGNfYmlvcHNpZXMiKQpgYGAKCiMjIFN1YnNldDogTmV1dHJvcGhpbHMgYnkgY2xpbmljCgpGb2xsb3dlZCBieSB0aGUgTmV1dHJvcGhpbHMuLi4KCmBgYHtyfQpjbGluaWNfY2YgPC0gcGFzdGUwKHBEYXRhKHRjX25ldXRyb3BoaWxzKVtbImNsaW5pYyJdXSwgIl8iLAogICAgICAgICAgICAgICAgICAgIHBEYXRhKHRjX25ldXRyb3BoaWxzKVtbImZpbmFsb3V0Y29tZSJdXSkKdGFibGUoY2xpbmljX2NmKQp0Y19uZXV0cm9waGlscyA8LSBzZXRfZXhwdF9jb25kaXRpb25zKAogIHRjX25ldXRyb3BoaWxzLCBmYWN0ID0gY2xpbmljX2NmLCBjb2xvcnMgPSBjb2xvcl9jaG9pY2VzW1siY2xpbmljX2NmIl1dKSAlPiUKICBzZXRfZXhwdF9iYXRjaGVzKGZhY3QgPSAidmlzaXRudW1iZXIiKQpzYXZlKGxpc3QgPSAidGNfbmV1dHJvcGhpbHMiLCBmaWxlID0gZ2x1ZSgicmRhL3RtcmMzX3RjX25ldXRyb3BoaWxzLXZ7dmVyfS5yZGEiKSkKZGF0YV9zdHJ1Y3R1cmVzIDwtIGMoZGF0YV9zdHJ1Y3R1cmVzLCAidGNfbmV1dHJvcGhpbHMiKQoKdGN2MV9uZXV0cm9waGlscyA8LSBzdWJzZXRfZXhwdCh0Y19uZXV0cm9waGlscywgc3Vic2V0ID0gInZpc2l0bnVtYmVyPT0nMSciKQpzYXZlKGxpc3QgPSAidGN2MV9uZXV0cm9waGlscyIsIGZpbGUgPSBnbHVlKCJyZGEvdG1yYzNfdGN2MV9uZXV0cm9waGlscy12e3Zlcn0ucmRhIikpCmRhdGFfc3RydWN0dXJlcyA8LSBjKGRhdGFfc3RydWN0dXJlcywgInRjdjFfbmV1dHJvcGhpbHMiKQp0Y3YyX25ldXRyb3BoaWxzIDwtIHN1YnNldF9leHB0KHRjX25ldXRyb3BoaWxzLCBzdWJzZXQgPSAidmlzaXRudW1iZXI9PScyJyIpCnNhdmUobGlzdCA9ICJ0Y3YyX25ldXRyb3BoaWxzIiwgZmlsZSA9IGdsdWUoInJkYS90bXJjM190Y3YyX25ldXRyb3BoaWxzLXZ7dmVyfS5yZGEiKSkKZGF0YV9zdHJ1Y3R1cmVzIDwtIGMoZGF0YV9zdHJ1Y3R1cmVzLCAidGN2Ml9uZXV0cm9waGlscyIpCnRjdjNfbmV1dHJvcGhpbHMgPC0gc3Vic2V0X2V4cHQodGNfbmV1dHJvcGhpbHMsIHN1YnNldCA9ICJ2aXNpdG51bWJlcj09JzMnIikKc2F2ZShsaXN0ID0gInRjdjNfbmV1dHJvcGhpbHMiLCBmaWxlID0gZ2x1ZSgicmRhL3RtcmMzX3RjdjNfbmV1dHJvcGhpbHMtdnt2ZXJ9LnJkYSIpKQpkYXRhX3N0cnVjdHVyZXMgPC0gYyhkYXRhX3N0cnVjdHVyZXMsICJ0Y3YzX25ldXRyb3BoaWxzIikKYGBgCgojIyBCeSBzZXgKCmBgYHtyfQp0Y19zZXggPC0gc2V0X2V4cHRfY29uZGl0aW9ucyh0Y192YWxpZCwgZmFjdCA9ICJzZXgiLCBjb2xvcnMgPSBjb2xvcl9jaG9pY2VzW1sic2V4Il1dKQpzYXZlKGxpc3QgPSAidGNfc2V4IiwgZmlsZSA9IGdsdWUoInJkYS90bXJjM190Y19zZXgtdnt2ZXJ9LnJkYSIpKQpkYXRhX3N0cnVjdHVyZXMgPC0gYyhkYXRhX3N0cnVjdHVyZXMsICJ0Y19zZXgiKQpgYGAKCiMgRGF0YXNldDogT25seSBUdW1hY28gc2FtcGxlcwoKT3VyIHJlY2VudCBkaXNjdXNzaW9ucyBoYXZlIHNldHRsZWQgb25lIGJpZyBxdWVzdGlvbiByZWdhcmRpbmcgd2hpY2gKc2FtcGxlcyB0byB1c2U6ICBXZSB3aWxsIGxpbWl0IG91ciBhbmFseXNlcyB0byBvbmx5IHRob3NlIHNhbXBsZXMgZnJvbQpUdW1hY28uCgpUaGUgZm9sbG93aW5nIGJsb2NrIHdpbGwgdGhlcmVmb3JlIHNldCB0aGF0IGdyb3VwIGFzIG91ciBkZWZhdWx0IGZvcgpmdXR1cmUgYW5hbHlzZXMuICBXZSB3aWxsIGVzc2VudGlhbGx5IHJlcGVhdCBhbGwgb2YgdGhlIGFib3ZlIHNhbXBsZQpzZXBhcmF0aW9ucyBmb3IgdGhlIFR1bWFjby1vbmx5IGNvaG9ydC4KCiMjIEFsbCBjZWxsIHR5cGVzCgpgYGB7cn0KdF9jbGluaWNhbCA8LSB0Y19jbGluaWNhbCAlPiUKICBzdWJzZXRfZXhwdChzdWJzZXQgPSAiY2xpbmljPT0ndHVtYWNvJyIpCnNhdmUobGlzdCA9ICJ0X2NsaW5pY2FsIiwgZmlsZSA9IGdsdWUoInJkYS90bXJjM190X2NsaW5pY2FsLXZ7dmVyfS5yZGEiKSkKZGF0YV9zdHJ1Y3R1cmVzIDwtIGMoZGF0YV9zdHJ1Y3R1cmVzLCAidF9jbGluaWNhbCIpCgpjcG1fZGF0YSA8LSBub3JtYWxpemVfZXhwdCh0X2NsaW5pY2FsLCBjb252ZXJ0ID0gImNwbSIpCnRfY2xpbmljYWxfY3BtX3ZhcmlhbmNlIDwtIHZhcmlhbmNlX2V4cHQoY3BtX2RhdGEpCiMjIEFkZCB2YXJpYW5jZSBieSBnZW5lIGZvciBhbGwgc2FtcGxlcyBleGNsdWRpbmcgYmlvcHNpZXMgKEkgYXNzdW1lIGFsc28gZXhjbHVkaW5nIENhbGkpLgojIyBUaGlzIGlzIGludGVuZGVkIHRvIGFkZHJlc3MgYSBxdWVyeSBmcm9tIE1hcmlhIEFkZWxhaWRhIG9uIDIwMjMwMTExCmBgYAoKIyMjIFdyaXRlIG91dCB0aGUgVHVtYWNvIENsaW5pY2FsIHdpdGggdmFyaWFuY2UKCmBgYHtyfQp3cml0dGVuIDwtIHdyaXRlX3hsc3goCiAgICBleHBycyhjcG1fZGF0YSksCiAgICBleGNlbCA9IGdsdWUoImNwbS80X1R1bWFjby90X2NsaW5pY2FsLXZ7dmVyfS54bHN4IikpCnJwa21fZGF0YSA8LSBub3JtYWxpemVfZXhwdCh0X2NsaW5pY2FsLCBmaWx0ZXIgPSBUUlVFLCBjb252ZXJ0ID0gInJwa20iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFfdG9femVybyA9IFRSVUUsIGNvbHVtbiA9ICJtZWFuX2Nkc19sZW4iKQp3cml0ZS5jc3YoeCA9IGFzLmRhdGEuZnJhbWUoZXhwcnMocnBrbV9kYXRhKSksCiAgICAgICAgICAgICAgICAgZmlsZSA9IGdsdWUoInJwa20vdF9jbGluaWNhbC12e3Zlcn0uY3N2IikpCmNwbV9kYXRhIDwtIG5vcm1hbGl6ZV9leHB0KHRfY2xpbmljYWwsIGNvbnZlcnQgPSAiY3BtIiwgZmlsdGVyID0gVFJVRSwgYmF0Y2ggPSAic3Zhc2VxIikKd3JpdHRlbiA8LSB3cml0ZV94bHN4KAogICAgZXhwcnMoY3BtX2RhdGEpLAogICAgZXhjZWwgPSBnbHVlKCJjcG0vNF9UdW1hY28vdF9jbGluaWNhbF9zdmEtdnt2ZXJ9Lnhsc3giKSkKcnBrbV9kYXRhIDwtIG5vcm1hbGl6ZV9leHB0KHRfY2xpbmljYWwsIGZpbHRlciA9IFRSVUUsIGJhdGNoID0gInN2YXNlcSIpICU+JQogIG5vcm1hbGl6ZV9leHB0KGNvbnZlcnQgPSAicnBrbSIsIGNvbHVtbiA9ICJtZWFuX2Nkc19sZW4iLCBuYV90b196ZXJvID0gVFJVRSkKd3JpdGUuY3N2KHggPSBhcy5kYXRhLmZyYW1lKGV4cHJzKHJwa21fZGF0YSkpLAogICAgICAgICAgZmlsZSA9IGdsdWUoInJwa20vdF9jbGluaWNhbF9zdmEtdnt2ZXJ9LmNzdiIpKQpgYGAKCiMgUGVyZm9ybSB3cml0ZV9leHB0IG9uIHRoZSBUdW1hY28gY2xpbmljYWwgc2FtcGxlcwoKYGBge3J9CndyaXR0ZW5fZXhwdCA8LSB3cml0ZV9leHB0KAogICAgdF9jbGluaWNhbCwKICAgIGV4Y2VsID0gZ2x1ZSgiZXhjZWwvdF9jbGluaWNhbC12e3Zlcn0ueGxzeCIpKQpgYGAKCiMjIFdpdGhvdXQgYmlvcHNpZXMKCmBgYHtyfQpkaXIuY3JlYXRlKCJjcG0vNF9UdW1hY28iLCByZWN1cnNpdmUgPSBUUlVFKQp0X2NsaW5pY2FsX25vYmlvcCA8LSBzdWJzZXRfZXhwdCh0X2NsaW5pY2FsLCBzdWJzZXQgPSAidHlwZW9mY2VsbHMhPSdiaW9wc3knIikKc2F2ZShsaXN0ID0gInRfY2xpbmljYWxfbm9iaW9wIiwgZmlsZSA9IGdsdWUoInJkYS90bXJjM190X2NsaW5pY2FsX25vYmlvcC12e3Zlcn0ucmRhIikpCmRhdGFfc3RydWN0dXJlcyA8LSBjKGRhdGFfc3RydWN0dXJlcywgInRfY2xpbmljYWxfbm9iaW9wIikKCmNwbV9kYXRhIDwtIG5vcm1hbGl6ZV9leHB0KHRfY2xpbmljYWxfbm9iaW9wLCBjb252ZXJ0ID0gImNwbSIpCndyaXR0ZW4gPC0gd3JpdGVfeGxzeCgKICAgIGV4cHJzKGNwbV9kYXRhKSwKICAgIGV4Y2VsID0gZ2x1ZSgiY3BtLzRfVHVtYWNvL3RfY2xpbmljYWxfbm9iaW9wLXZ7dmVyfS54bHN4IikpCnJwa21fZGF0YSA8LSBub3JtYWxpemVfZXhwdCh0X2NsaW5pY2FsLCBmaWx0ZXIgPSBUUlVFLCBiYXRjaCA9ICJzdmFzZXEiKSAlPiUKICBub3JtYWxpemVfZXhwdChjb252ZXJ0ID0gInJwa20iLCBjb2x1bW4gPSAibWVhbl9jZHNfbGVuIiwgbmFfdG9femVybyA9IFRSVUUpCndyaXRlLmNzdih4ID0gYXMuZGF0YS5mcmFtZShleHBycyhycGttX2RhdGEpKSwKICAgICAgICAgIGZpbGUgPSBnbHVlKCJycGttL3RfY2xpbmljYWxfc3ZhLXZ7dmVyfS5jc3YiKSkKCmNwbV9kYXRhIDwtIG5vcm1hbGl6ZV9leHB0KHRfY2xpbmljYWxfbm9iaW9wLCBjb252ZXJ0ID0gImNwbSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlciA9IFRSVUUsIGJhdGNoID0gInN2YXNlcSIpCndyaXR0ZW4gPC0gd3JpdGVfeGxzeCgKICAgIGV4cHJzKGNwbV9kYXRhKSwKICAgIGV4Y2VsID0gZ2x1ZSgiY3BtLzRfVHVtYWNvL3RfY2xpbmljYWxfbm9iaW9wX3N2YS12e3Zlcn0ueGxzeCIpKQpycGttX2RhdGEgPC0gbm9ybWFsaXplX2V4cHQodF9jbGluaWNhbF9ub2Jpb3AsIGZpbHRlciA9IFRSVUUsIGJhdGNoID0gInN2YXNlcSIpICU+JQogIG5vcm1hbGl6ZV9leHB0KGNvbnZlcnQgPSAicnBrbSIsIGNvbHVtbiA9ICJtZWFuX2Nkc19sZW4iLCBuYV90b196ZXJvID0gVFJVRSkKd3JpdGUuY3N2KHggPSBhcy5kYXRhLmZyYW1lKGV4cHJzKHJwa21fZGF0YSkpLAogICAgICAgICAgZmlsZSA9IGdsdWUoInJwa20vdF9jbGluaWNhbF9ub2Jpb3Bfc3ZhLXZ7dmVyfS5jc3YiKSkKYGBgCgojIyMgUHVsbCBvdXQgdGhlIHRvcC1uIG1vc3QgdmFyaWFudCBnZW5lcwoKSSBhZGRlZCBhIGZldyBjb2x1bW5zIHRvIHRoZSBnZW5lIGFubm90YXRpb25zIHJlZmxlY3RpbmcgdGhlCnZhcmlhbmNlL3N0ZGV2L21lYW4gZXhwcmVzc2lvbiBvZiBlYWNoIGdlbmUuICBUaGlzIHJlYWxseSBoaWdobGlnaHRzCnRoZSBleHRyYW9yZGluYXJ5IGRlZ3JlZSB0byB3aGljaCBnZW5lcyBhcmUgY2hhbmdpbmcgaW4gdGhlIGRhdGEuLi4KCmBgYHtyfQp0b3BfZXhwdCA8LSBub3JtYWxpemVfZXhwdCh0X2NsaW5pY2FsX2NwbV92YXJpYW5jZSwgZmlsdGVyID0gVFJVRSkgJT4lCiAgdmFyaWFuY2VfZXhwdCgpCnRvcF9mZCA8LSBmRGF0YSh0b3BfZXhwdCkKdG9wX2V4IDwtIGV4cHJzKHRvcF9leHB0KQppZHggPC0gb3JkZXIodG9wX2ZkW1siZXhwcnNfZ2VuZV9zdGRldiJdXSwgZGVjcmVhc2luZyA9IFRSVUUpCnRvcF9kZiA8LSB0b3BfZmRbaWR4LCBdCndyaXR0ZW4gPC0gd3JpdGVfeGxzeCgKICAgIGRhdGEgPSBoZWFkKHRvcF9mZCwgbiA9IDEwMCksCiAgICBleGNlbCA9IGdsdWUoImV4Y2VsL3RfY2xpbmljYWxfY3BtX3N0ZGV2X3RvcDEwMC12e3Zlcn0ueGxzeCIpKQoKYm90dG9tX2V4cHQgPC0gbm9ybWFsaXplX2V4cHQodF9jbGluaWNhbF9jcG1fdmFyaWFuY2UsIGZpbHRlciA9ICJzaW1wbGUiLCB0aHJlc2hvbGQgPSA1MDApICU+JQogIHZhcmlhbmNlX2V4cHQoKQpib3R0b21fZmQgPC0gZkRhdGEoYm90dG9tX2V4cHQpCmJvdHRvbV9leCA8LSBleHBycyhib3R0b21fZXhwdCkKaWR4IDwtIG9yZGVyKGJvdHRvbV9mZFtbImV4cHJzX2dlbmVfc3RkZXYiXV0pCmJvdHRvbSA8LSBib3R0b21fZmRbaWR4LCBdCndyaXR0ZW4gPC0gd3JpdGVfeGxzeCgKICAgIGRhdGEgPSBoZWFkKGJvdHRvbV9mZCwgbiA9IDEwMCksCiAgICBleGNlbCA9IGdsdWUoImV4Y2VsL3RfY2xpbmljYWxfY3BtX3N0ZGV2X2JvdHRvbTEwMC12e3Zlcn0ueGxzeCIpKQpgYGAKCiMjIFN1bW1hcml6ZTogQ29sbGVjdCBUdW1hY28gc2FtcGxlIG51bWJlcnMuCgpBdCBsZWFzdCBpbiB0aGVvcnksIGV2ZXJ5dGhpbmcgd2hpY2ggZm9sbG93cyB3aWxsIGJlIHVzaW5nIHRoZSBhYm92ZQonY2xpbmljYWwnIGRhdGEgc3RydWN0dXJlLiAgVGh1cywgbGV0IHVzIGNvdW50IGl0IHVwIGFuZCBnZXQgYSBzZW5zZQpvZiB3aGF0IHdlIHdpbGwgd29yayB3aXRoLgoKYGBge3J9CnRhYmxlKHBEYXRhKHRfY2xpbmljYWwpW1siZHJ1ZyJdXSkKdGFibGUocERhdGEodF9jbGluaWNhbClbWyJjbGluaWMiXV0pCnRhYmxlKHBEYXRhKHRfY2xpbmljYWwpW1siZmluYWxvdXRjb21lIl1dKQp0YWJsZShwRGF0YSh0X2NsaW5pY2FsKVtbInR5cGVvZmNlbGxzIl1dKQp0YWJsZShwRGF0YSh0X2NsaW5pY2FsKVtbInZpc2l0bnVtYmVyIl1dKQpzdW1tYXJ5KHBEYXRhKHRfY2xpbmljYWwpW1siRXZvbHV0aW9uX1RpbWUiXV0pCnN1bW1hcnkocERhdGEodF9jbGluaWNhbClbWyJQcmVzY3JpYmVkX0RhaWx5X0Rvc2VfR2x1YyJdXSkKc3VtbWFyeShwRGF0YSh0X2NsaW5pY2FsKVtbIlYzX1ZlcnRpY2FsX0F4aXNfTGVzaW9uIl1dKQpzdW1tYXJ5KHBEYXRhKHRfY2xpbmljYWwpW1siVjNfVG90YWxfQXJlYV9MZXNpb24iXV0pCnN1bW1hcnkocERhdGEodF9jbGluaWNhbClbWyJWM19Ib3Jpem9udGFsX0F4aXNfVWxjZXIiXV0pCnRhYmxlKHBEYXRhKHRfY2xpbmljYWwpW1siU2V4Il1dKQp0YWJsZShwRGF0YSh0X2NsaW5pY2FsKVtbIkV0aG5pY2l0eSJdXSkKc3VtbWFyeShwRGF0YSh0X2NsaW5pY2FsKVtbIkFnZSJdXSkKc3VtbWFyeShwRGF0YSh0X2NsaW5pY2FsKVtbIldlaWdodCJdXSkKdGFibGUocERhdGEodF9jbGluaWNhbClbWyJIZWlnaHQiXV0pCgpsZW5ndGgodW5pcXVlKHBEYXRhKHRfY2xpbmljYWwpW1siUGF0aWVudF9JRCJdXSkpCm9ubHlfY3VyZSA8LSBwRGF0YSh0X2NsaW5pY2FsKVtbImZpbmFsb3V0Y29tZSJdXSA9PSAiY3VyZSIKY19tZXRhIDwtIHBEYXRhKHRfY2xpbmljYWwpW29ubHlfY3VyZSwgXQpsZW5ndGgodW5pcXVlKGNfbWV0YVtbIlBhdGllbnRfSUQiXV0pKQpvbmx5X2ZhaWwgPC0gcERhdGEodF9jbGluaWNhbClbWyJmaW5hbG91dGNvbWUiXV0gPT0gImZhaWx1cmUiCmZfbWV0YSA8LSBwRGF0YSh0X2NsaW5pY2FsKVtvbmx5X2ZhaWwsIF0KbGVuZ3RoKHVuaXF1ZShmX21ldGFbWyJQYXRpZW50X0lEIl1dKSkKYGBgCgojIyBTcGxpdCB0aGUgZGF0YSBieSBjdXJlL2ZhaWwgZm9yIHNvbWUgY291bnRpbmcKCmBgYHtyfQp0X2N1cmUgPC0gc3Vic2V0X2V4cHQodF9jbGluaWNhbCwgc3Vic2V0ID0gImZpbmFsb3V0Y29tZT09J2N1cmUnIikKdGFibGUocERhdGEodF9jdXJlKSR2aXNpdG51bWJlcikKCnRfZmFpbCA8LSBzdWJzZXRfZXhwdCh0X2NsaW5pY2FsLCBzdWJzZXQgPSAiZmluYWxvdXRjb21lPT0nZmFpbHVyZSciKQp0YWJsZShwRGF0YSh0X2ZhaWwpJHZpc2l0bnVtYmVyKQpgYGAKCiMjIFN1YnNldDogQ3JlYXRlIFR1bWFjby1vbmx5IGFuZCBjZWxsLXR5cGUgc3BlY2lmaWMgZGF0YQoKSSBwcmV2aW91c2x5IG1hZGUgYSBidW5jaCBvZiBkYXRhIHN1YnNldHMgYnkgdmlzaXQsIGNlbGwgdHlwZSwgZXRjLgpTbyBsZXQgdXMgb3ZlcndyaXRlIHRoZW0gYWxsIHdpdGggdmVyc2lvbnMgd2hpY2ggY29udGFpbiBvbmx5IHRoZQpUdW1hY28gc2FtcGxlcy4KCiMjIyBUdW1hY28gYmlvcHNpZXMKClRoZSBpcyBhIGNvcHkgb2YgdGhlIGNlbGwgdHlwZSBleHRyYWN0aW9ucyBhYm92ZSwgZXhjZXB0IHdlIGxlYWQgb2ZmCndpdGggdGhlIHJlbW92YWwgb2YgdGhlIENhbGkgc2FtcGxlcy4KCmBgYHtyfQp0X2Jpb3BzaWVzIDwtIHRjX2Jpb3BzaWVzICU+JQogIHN1YnNldF9leHB0KHN1YnNldCA9ICJjbGluaWM9PSd0dW1hY28nIikKc2F2ZShsaXN0ID0gInRfYmlvcHNpZXMiLCBmaWxlID0gZ2x1ZSgicmRhL3RtcmMzX3RfYmlvcHNpZXMtdnt2ZXJ9LnJkYSIpKQpkYXRhX3N0cnVjdHVyZXMgPC0gYyhkYXRhX3N0cnVjdHVyZXMsICJ0X2Jpb3BzaWVzIikKCmNwbV9kYXRhIDwtIG5vcm1hbGl6ZV9leHB0KHRfYmlvcHNpZXMsIGNvbnZlcnQgPSAiY3BtIikKd3JpdHRlbiA8LSB3cml0ZV94bHN4KAogICAgZXhwcnMoY3BtX2RhdGEpLAogICAgZXhjZWwgPSBnbHVlKCJjcG0vNF9UdW1hY28vdF9iaW9wc2llcy12e3Zlcn0ueGxzeCIpKQpycGttX2RhdGEgPC0gbm9ybWFsaXplX2V4cHQodF9iaW9wc2llcywgZmlsdGVyID0gVFJVRSwgY29udmVydCA9ICJycGttIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hX3RvX3plcm8gPSBUUlVFLCBjb2x1bW4gPSAibWVhbl9jZHNfbGVuIikKd3JpdGUuY3N2KHggPSBhcy5kYXRhLmZyYW1lKGV4cHJzKHJwa21fZGF0YSkpLAogICAgICAgICAgZmlsZSA9IGdsdWUoInJwa20vdF9iaW9wc2llcy12e3Zlcn0uY3N2IikpCgpjcG1fZGF0YSA8LSBub3JtYWxpemVfZXhwdCh0X2Jpb3BzaWVzLCBjb252ZXJ0ID0gImNwbSIsIGZpbHRlciA9IFRSVUUsIGJhdGNoID0gInN2YXNlcSIpCndyaXR0ZW4gPC0gd3JpdGVfeGxzeCgKICAgIGV4cHJzKGNwbV9kYXRhKSwKICAgIGV4Y2VsID0gZ2x1ZSgiY3BtLzRfVHVtYWNvL3RfYmlvcHNpZXNfc3ZhLXZ7dmVyfS54bHN4IikpCmBgYAoKIyMjIFR1bWFjbyBFb3Npbm9waGlscwoKYGBge3J9CnRfZW9zaW5vcGhpbHMgPC0gdGNfZW9zaW5vcGhpbHMgJT4lCiAgc3Vic2V0X2V4cHQoc3Vic2V0ID0gImNsaW5pYz09J3R1bWFjbyciKQpzYXZlKGxpc3QgPSAidF9lb3Npbm9waGlscyIsIGZpbGUgPSBnbHVlKCJyZGEvdG1yYzNfdF9lb3Npbm9waGlscy12e3Zlcn0ucmRhIikpCmRhdGFfc3RydWN0dXJlcyA8LSBjKGRhdGFfc3RydWN0dXJlcywgInRfZW9zaW5vcGhpbHMiKQoKY3BtX2RhdGEgPC0gbm9ybWFsaXplX2V4cHQodF9lb3Npbm9waGlscywgY29udmVydCA9ICJjcG0iKQp3cml0dGVuIDwtIHdyaXRlX3hsc3goCiAgICBleHBycyhjcG1fZGF0YSksCiAgICBleGNlbCA9IGdsdWUoImNwbS80X1R1bWFjby90X2Vvc2lub3BoaWxzLXZ7dmVyfS54bHN4IikpCmNwbV9kYXRhIDwtIG5vcm1hbGl6ZV9leHB0KHRfZW9zaW5vcGhpbHMsIGNvbnZlcnQgPSAiY3BtIiwgZmlsdGVyID0gVFJVRSwgYmF0Y2ggPSAic3Zhc2VxIikKd3JpdHRlbiA8LSB3cml0ZV94bHN4KAogICAgZXhwcnMoY3BtX2RhdGEpLAogICAgZXhjZWwgPSBnbHVlKCJjcG0vNF9UdW1hY28vdF9lb3Npbm9waGlsc19zdmEtdnt2ZXJ9Lnhsc3giKSkKcnBrbV9kYXRhIDwtIG5vcm1hbGl6ZV9leHB0KHRfZW9zaW5vcGhpbHMsIGZpbHRlciA9IFRSVUUsIGJhdGNoID0gInN2YXNlcSIpICU+JQogIG5vcm1hbGl6ZV9leHB0KGNvbnZlcnQgPSAicnBrbSIsIGNvbHVtbiA9ICJtZWFuX2Nkc19sZW4iLCBuYV90b196ZXJvID0gVFJVRSkKd3JpdGUuY3N2KHggPSBhcy5kYXRhLmZyYW1lKGV4cHJzKHJwa21fZGF0YSkpLAogICAgICAgICAgZmlsZSA9IGdsdWUoInJwa20vdF9lb3Npbm9waGlsc19zdmEtdnt2ZXJ9LmNzdiIpKQpgYGAKCiMjIyBUdW1hY28gc3Vic2V0cyBtb25vY3l0ZXMKCmBgYHtyfQp0X21vbm9jeXRlcyA8LSB0Y19tb25vY3l0ZXMgJT4lCiAgc3Vic2V0X2V4cHQoc3Vic2V0ID0gImNsaW5pYz09J3R1bWFjbyciKQpzYXZlKGxpc3QgPSAidF9tb25vY3l0ZXMiLCBmaWxlID0gZ2x1ZSgicmRhL3RtcmMzX3RfbW9ub2N5dGVzLXZ7dmVyfS5yZGEiKSkKZGF0YV9zdHJ1Y3R1cmVzIDwtIGMoZGF0YV9zdHJ1Y3R1cmVzLCAidF9tb25vY3l0ZXMiKQoKY3BtX2RhdGEgPC0gbm9ybWFsaXplX2V4cHQodF9tb25vY3l0ZXMsIGNvbnZlcnQgPSAiY3BtIikKd3JpdHRlbiA8LSB3cml0ZV94bHN4KAogICAgZXhwcnMoY3BtX2RhdGEpLAogICAgZXhjZWwgPSBnbHVlKCJjcG0vNF9UdW1hY28vdF9tb25vY3l0ZXMtdnt2ZXJ9Lnhsc3giKSkKcnBrbV9kYXRhIDwtIG5vcm1hbGl6ZV9leHB0KHRfbW9ub2N5dGVzLCBmaWx0ZXIgPSBUUlVFLCBjb252ZXJ0ID0gInJwa20iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFfdG9femVybyA9IFRSVUUsIGNvbHVtbiA9ICJtZWFuX2Nkc19sZW4iKQp3cml0ZS5jc3YoeCA9IGFzLmRhdGEuZnJhbWUoZXhwcnMocnBrbV9kYXRhKSksCiAgICAgICAgICBmaWxlID0gZ2x1ZSgicnBrbS90X21vbm9jeXRlcy12e3Zlcn0uY3N2IikpCmNwbV9kYXRhIDwtIG5vcm1hbGl6ZV9leHB0KHRfbW9ub2N5dGVzLCBjb252ZXJ0ID0gImNwbSIsIGZpbHRlciA9IFRSVUUsIGJhdGNoID0gInN2YXNlcSIpCndyaXR0ZW4gPC0gd3JpdGVfeGxzeCgKICAgIGV4cHJzKGNwbV9kYXRhKSwKICAgIGV4Y2VsID0gZ2x1ZSgiY3BtLzRfVHVtYWNvL3RfbW9ub2N5dGVzX3N2YS12e3Zlcn0ueGxzeCIpKQpycGttX2RhdGEgPC0gbm9ybWFsaXplX2V4cHQodF9tb25vY3l0ZXMsIGZpbHRlciA9IFRSVUUsIGJhdGNoID0gInN2YXNlcSIpICU+JQogIG5vcm1hbGl6ZV9leHB0KGNvbnZlcnQgPSAicnBrbSIsIGNvbHVtbiA9ICJtZWFuX2Nkc19sZW4iLCBuYV90b196ZXJvID0gVFJVRSkKd3JpdGUuY3N2KHggPSBhcy5kYXRhLmZyYW1lKGV4cHJzKHJwa21fZGF0YSkpLAogICAgICAgICAgZmlsZSA9IGdsdWUoInJwa20vdF9tb25vY3l0ZXNfc3ZhLXZ7dmVyfS5jc3YiKSkKYGBgCgojIyMgVHVtYWNvIHN1YnNldHMgbmV1dHJvcGhpbHMKCmBgYHtyfQp0X25ldXRyb3BoaWxzIDwtIHRjX25ldXRyb3BoaWxzICU+JQogIHN1YnNldF9leHB0KHN1YnNldCA9ICJjbGluaWM9PSd0dW1hY28nIikKc2F2ZShsaXN0ID0gInRfbmV1dHJvcGhpbHMiLCBmaWxlID0gZ2x1ZSgicmRhL3RtcmMzX3RfbmV1dHJvcGhpbHMtdnt2ZXJ9LnJkYSIpKQpkYXRhX3N0cnVjdHVyZXMgPC0gYyhkYXRhX3N0cnVjdHVyZXMsICJ0X25ldXRyb3BoaWxzIikKCmNwbV9kYXRhIDwtIG5vcm1hbGl6ZV9leHB0KHRfbmV1dHJvcGhpbHMsIGNvbnZlcnQgPSAiY3BtIikKd3JpdHRlbiA8LSB3cml0ZV94bHN4KAogICAgZXhwcnMoY3BtX2RhdGEpLAogICAgZXhjZWwgPSBnbHVlKCJjcG0vNF9UdW1hY28vdF9uZXV0cm9waGlscy12e3Zlcn0ueGxzeCIpKQpycGttX2RhdGEgPC0gbm9ybWFsaXplX2V4cHQodF9uZXV0cm9waGlscywgZmlsdGVyID0gVFJVRSwgY29udmVydCA9ICJycGttIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hX3RvX3plcm8gPSBUUlVFLCBjb2x1bW4gPSAibWVhbl9jZHNfbGVuIikKd3JpdGUuY3N2KHggPSBhcy5kYXRhLmZyYW1lKGV4cHJzKHJwa21fZGF0YSkpLAogICAgICAgICAgICAgICAgIGZpbGUgPSBnbHVlKCJycGttL3RfbmV1dHJvcGhpbHMtdnt2ZXJ9LmNzdiIpKQpjcG1fZGF0YSA8LSBub3JtYWxpemVfZXhwdCh0X25ldXRyb3BoaWxzLCBjb252ZXJ0ID0gImNwbSIsIGZpbHRlciA9IFRSVUUsIGJhdGNoID0gInN2YXNlcSIpCndyaXR0ZW4gPC0gd3JpdGVfeGxzeCgKICAgIGV4cHJzKGNwbV9kYXRhKSwKICAgIGV4Y2VsID0gZ2x1ZSgiY3BtLzRfVHVtYWNvL3RfbmV1dHJvcGhpbHNfc3ZhLXZ7dmVyfS54bHN4IikpCnJwa21fZGF0YSA8LSBub3JtYWxpemVfZXhwdCh0X25ldXRyb3BoaWxzLCBmaWx0ZXIgPSBUUlVFLCBiYXRjaCA9ICJzdmFzZXEiKSAlPiUKICBub3JtYWxpemVfZXhwdChjb252ZXJ0ID0gInJwa20iLCBjb2x1bW4gPSAibWVhbl9jZHNfbGVuIiwgbmFfdG9femVybyA9IFRSVUUpCndyaXRlLmNzdih4ID0gYXMuZGF0YS5mcmFtZShleHBycyhycGttX2RhdGEpKSwKICAgICAgICAgIGZpbGUgPSBnbHVlKCJycGttL3RfbmV1dHJvcGhpbHNfc3ZhLXZ7dmVyfS5jc3YiKSkKYGBgCgojIyMgVHVtYWNvIFZpc2l0IDEgc2FtcGxlcwoKYGBge3J9CnR2MV9zYW1wbGVzIDwtIHRjdjFfc2FtcGxlcyAlPiUKICBzdWJzZXRfZXhwdChzdWJzZXQgPSAiY2xpbmljPT0ndHVtYWNvJyIpCnNhdmUobGlzdCA9ICJ0djFfc2FtcGxlcyIsIGZpbGUgPSBnbHVlKCJyZGEvdG1yYzNfdHYxX3NhbXBsZXMtdnt2ZXJ9LnJkYSIpKQpkYXRhX3N0cnVjdHVyZXMgPC0gYyhkYXRhX3N0cnVjdHVyZXMsICJ0djFfc2FtcGxlcyIpCgpjcG1fZGF0YSA8LSBub3JtYWxpemVfZXhwdCh0djFfc2FtcGxlcywgY29udmVydCA9ICJjcG0iKQp3cml0dGVuIDwtIHdyaXRlX3hsc3goCiAgICBleHBycyhjcG1fZGF0YSksCiAgICBleGNlbCA9IGdsdWUoImNwbS80X1R1bWFjby90djFfc2FtcGxlcy12e3Zlcn0ueGxzeCIpKQpycGttX2RhdGEgPC0gbm9ybWFsaXplX2V4cHQodHYxX3NhbXBsZXMsIGZpbHRlciA9IFRSVUUsIGNvbnZlcnQgPSAicnBrbSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYV90b196ZXJvID0gVFJVRSwgY29sdW1uID0gIm1lYW5fY2RzX2xlbiIpCndyaXRlLmNzdih4ID0gYXMuZGF0YS5mcmFtZShleHBycyhycGttX2RhdGEpKSwKICAgICAgICAgIGZpbGUgPSBnbHVlKCJycGttL3R2MV9zYW1wbGVzLXZ7dmVyfS5jc3YiKSkKY3BtX2RhdGEgPC0gbm9ybWFsaXplX2V4cHQodHYxX3NhbXBsZXMsIGNvbnZlcnQ9ImNwbSIsIGZpbHRlcj1UUlVFLCBiYXRjaD0ic3Zhc2VxIikKd3JpdHRlbiA8LSB3cml0ZV94bHN4KAogICAgZXhwcnMoY3BtX2RhdGEpLAogICAgZXhjZWwgPSBnbHVlKCJjcG0vNF9UdW1hY28vdHYxX3NhbXBsZXNfc3ZhLXZ7dmVyfS54bHN4IikpCnJwa21fZGF0YSA8LSBub3JtYWxpemVfZXhwdCh0djFfc2FtcGxlcywgZmlsdGVyID0gVFJVRSwgYmF0Y2ggPSAic3Zhc2VxIikgJT4lCiAgbm9ybWFsaXplX2V4cHQoY29udmVydCA9ICJycGttIiwgY29sdW1uID0gIm1lYW5fY2RzX2xlbiIsIG5hX3RvX3plcm8gPSBUUlVFKQp3cml0ZS5jc3YoeCA9IGFzLmRhdGEuZnJhbWUoZXhwcnMocnBrbV9kYXRhKSksCiAgICAgICAgICBmaWxlID0gZ2x1ZSgicnBrbS90djFfc2FtcGxlc19zdmEtdnt2ZXJ9LmNzdiIpKQpgYGAKCiMjIyBUdW1hY28gVmlzaXQgMiBzYW1wbGVzCgpgYGB7cn0KdHYyX3NhbXBsZXMgPC0gdGN2Ml9zYW1wbGVzICU+JQogIHN1YnNldF9leHB0KHN1YnNldCA9ICJjbGluaWM9PSd0dW1hY28nIikKc2F2ZShsaXN0ID0gInR2Ml9zYW1wbGVzIiwgZmlsZSA9IGdsdWUoInJkYS90bXJjM190djJfc2FtcGxlcy12e3Zlcn0ucmRhIikpCmRhdGFfc3RydWN0dXJlcyA8LSBjKGRhdGFfc3RydWN0dXJlcywgInR2Ml9zYW1wbGVzIikKCmNwbV9kYXRhIDwtIG5vcm1hbGl6ZV9leHB0KHR2Ml9zYW1wbGVzLCBjb252ZXJ0ID0gImNwbSIpCndyaXR0ZW4gPC0gd3JpdGVfeGxzeCgKICAgIGV4cHJzKGNwbV9kYXRhKSwKICAgIGV4Y2VsID0gZ2x1ZSgiY3BtLzRfVHVtYWNvL3R2Ml9zYW1wbGVzLXZ7dmVyfS54bHN4IikpCnJwa21fZGF0YSA8LSBub3JtYWxpemVfZXhwdCh0djJfc2FtcGxlcywgZmlsdGVyID0gVFJVRSwgY29udmVydCA9ICJycGttIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hX3RvX3plcm8gPSBUUlVFLCBjb2x1bW4gPSAibWVhbl9jZHNfbGVuIikKd3JpdGUuY3N2KHggPSBhcy5kYXRhLmZyYW1lKGV4cHJzKHJwa21fZGF0YSkpLAogICAgICAgICAgZmlsZSA9IGdsdWUoInJwa20vdHYyX3NhbXBsZXMtdnt2ZXJ9LmNzdiIpKQpjcG1fZGF0YSA8LSBub3JtYWxpemVfZXhwdCh0djJfc2FtcGxlcywgY29udmVydCA9ICJjcG0iLCBmaWx0ZXIgPSBUUlVFLCBiYXRjaCA9ICJzdmFzZXEiKQp3cml0dGVuIDwtIHdyaXRlX3hsc3goCiAgICBleHBycyhjcG1fZGF0YSksCiAgICBleGNlbCA9IGdsdWUoImNwbS80X1R1bWFjby90djJfc2FtcGxlc19zdmEtdnt2ZXJ9Lnhsc3giKSkKcnBrbV9kYXRhIDwtIG5vcm1hbGl6ZV9leHB0KHR2Ml9zYW1wbGVzLCBmaWx0ZXIgPSBUUlVFLCBiYXRjaCA9ICJzdmFzZXEiKSAlPiUKICBub3JtYWxpemVfZXhwdChjb252ZXJ0ID0gInJwa20iLCBjb2x1bW4gPSAibWVhbl9jZHNfbGVuIiwgbmFfdG9femVybyA9IFRSVUUpCndyaXRlLmNzdih4ID0gYXMuZGF0YS5mcmFtZShleHBycyhycGttX2RhdGEpKSwKICAgICAgICAgIGZpbGUgPSBnbHVlKCJycGttL3R2Ml9zYW1wbGVzX3N2YS12e3Zlcn0uY3N2IikpCmBgYAoKIyMjIFR1bWFjbyB2aXNpdCAzIHNhbXBsZXMKCmBgYHtyfQp0djNfc2FtcGxlcyA8LSB0Y3YzX3NhbXBsZXMgJT4lCiAgc3Vic2V0X2V4cHQoc3Vic2V0ID0gImNsaW5pYz09J3R1bWFjbyciKQpzYXZlKGxpc3QgPSAidHYzX3NhbXBsZXMiLCBmaWxlID0gZ2x1ZSgicmRhL3RtcmMzX3R2M19zYW1wbGVzLXZ7dmVyfS5yZGEiKSkKZGF0YV9zdHJ1Y3R1cmVzIDwtIGMoZGF0YV9zdHJ1Y3R1cmVzLCAidHYzX3NhbXBsZXMiKQoKY3BtX2RhdGEgPC0gbm9ybWFsaXplX2V4cHQodHYzX3NhbXBsZXMsIGNvbnZlcnQgPSAiY3BtIikKd3JpdHRlbiA8LSB3cml0ZV94bHN4KAogICAgZXhwcnMoY3BtX2RhdGEpLAogICAgZXhjZWwgPSBnbHVlKCJjcG0vNF9UdW1hY28vdHYzX3NhbXBsZXMtdnt2ZXJ9Lnhsc3giKSkKcnBrbV9kYXRhIDwtIG5vcm1hbGl6ZV9leHB0KHR2M19zYW1wbGVzLCBmaWx0ZXIgPSBUUlVFLCBjb252ZXJ0ID0gInJwa20iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFfdG9femVybyA9IFRSVUUsIGNvbHVtbiA9ICJtZWFuX2Nkc19sZW4iKQp3cml0ZS5jc3YoeCA9IGFzLmRhdGEuZnJhbWUoZXhwcnMocnBrbV9kYXRhKSksCiAgICAgICAgICBmaWxlID0gZ2x1ZSgicnBrbS90djNfc2FtcGxlcy12e3Zlcn0uY3N2IikpCmNwbV9kYXRhIDwtIG5vcm1hbGl6ZV9leHB0KHR2M19zYW1wbGVzLCBjb252ZXJ0ID0gImNwbSIsIGZpbHRlciA9IFRSVUUsIGJhdGNoID0gInN2YXNlcSIpCndyaXR0ZW4gPC0gd3JpdGVfeGxzeCgKICAgIGV4cHJzKGNwbV9kYXRhKSwKICAgIGV4Y2VsID0gZ2x1ZSgiY3BtLzRfVHVtYWNvL3R2M19zYW1wbGVzX3N2YS12e3Zlcn0ueGxzeCIpKQpycGttX2RhdGEgPC0gbm9ybWFsaXplX2V4cHQodHYzX3NhbXBsZXMsIGZpbHRlciA9IFRSVUUsIGJhdGNoID0gInN2YXNlcSIpICU+JQogIG5vcm1hbGl6ZV9leHB0KGNvbnZlcnQgPSAicnBrbSIsIGNvbHVtbiA9ICJtZWFuX2Nkc19sZW4iLCBuYV90b196ZXJvID0gVFJVRSkKd3JpdGUuY3N2KHggPSBhcy5kYXRhLmZyYW1lKGV4cHJzKHJwa21fZGF0YSkpLAogICAgICAgICAgZmlsZSA9IGdsdWUoInJwa20vdHYzX3NhbXBsZXNfc3ZhLXZ7dmVyfS5jc3YiKSkKYGBgCgojIyMgVHVtYWNvIHZpc2l0IDEgRW9zaW5vcGhpbHMKCmBgYHtyfQp0djFfZW9zaW5vcGhpbHMgPC0gdGN2MV9lb3Npbm9waGlscyAlPiUKICBzdWJzZXRfZXhwdChzdWJzZXQgPSAiY2xpbmljPT0ndHVtYWNvJyIpCnNhdmUobGlzdCA9ICJ0djFfZW9zaW5vcGhpbHMiLCBmaWxlID0gZ2x1ZSgicmRhL3RtcmMzX3R2MV9lb3Npbm9waGlscy12e3Zlcn0ucmRhIikpCmRhdGFfc3RydWN0dXJlcyA8LSBjKGRhdGFfc3RydWN0dXJlcywgInR2MV9lb3Npbm9waGlscyIpCgpjcG1fZGF0YSA8LSBub3JtYWxpemVfZXhwdCh0djFfZW9zaW5vcGhpbHMsIGNvbnZlcnQgPSAiY3BtIikKd3JpdHRlbiA8LSB3cml0ZV94bHN4KAogICAgZXhwcnMoY3BtX2RhdGEpLAogICAgZXhjZWwgPSBnbHVlKCJjcG0vNF9UdW1hY28vdHYxX2Vvc2lub3BoaWxzLXZ7dmVyfS54bHN4IikpCnJwa21fZGF0YSA8LSBub3JtYWxpemVfZXhwdCh0djFfZW9zaW5vcGhpbHMsIGZpbHRlciA9IFRSVUUsIGNvbnZlcnQgPSAicnBrbSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYV90b196ZXJvID0gVFJVRSwgY29sdW1uID0gIm1lYW5fY2RzX2xlbiIpCndyaXRlLmNzdih4ID0gYXMuZGF0YS5mcmFtZShleHBycyhycGttX2RhdGEpKSwKICAgICAgICAgIGZpbGUgPSBnbHVlKCJycGttL3R2MV9lb3Npbm9waGlscy12e3Zlcn0uY3N2IikpCmNwbV9kYXRhIDwtIG5vcm1hbGl6ZV9leHB0KHR2MV9lb3Npbm9waGlscywgY29udmVydCA9ICJjcG0iLCBmaWx0ZXIgPSBUUlVFLCBiYXRjaCA9ICJzdmFzZXEiKQp3cml0dGVuIDwtIHdyaXRlX3hsc3goCiAgICBleHBycyhjcG1fZGF0YSksCiAgICBleGNlbCA9IGdsdWUoImNwbS80X1R1bWFjby90djFfZW9zaW5vcGhpbHNfc3ZhLXZ7dmVyfS54bHN4IikpCnJwa21fZGF0YSA8LSBub3JtYWxpemVfZXhwdCh0djFfZW9zaW5vcGhpbHMsIGZpbHRlciA9IFRSVUUsIGJhdGNoID0gInN2YXNlcSIpICU+JQogIG5vcm1hbGl6ZV9leHB0KGNvbnZlcnQgPSAicnBrbSIsIGNvbHVtbiA9ICJtZWFuX2Nkc19sZW4iLCBuYV90b196ZXJvID0gVFJVRSkKd3JpdGUuY3N2KHggPSBhcy5kYXRhLmZyYW1lKGV4cHJzKHJwa21fZGF0YSkpLAogICAgICAgICAgZmlsZSA9IGdsdWUoInJwa20vdHYxX2Vvc2lub3BoaWxzX3N2YS12e3Zlcn0uY3N2IikpCmBgYAoKIyMjIFR1bWFjbyB2aXNpdCAyIHNhbXBsZXMKCmBgYHtyfQp0djJfZW9zaW5vcGhpbHMgPC0gdGN2Ml9lb3Npbm9waGlscyAlPiUKICBzdWJzZXRfZXhwdChzdWJzZXQgPSAiY2xpbmljPT0ndHVtYWNvJyIpCnNhdmUobGlzdCA9ICJ0djJfZW9zaW5vcGhpbHMiLCBmaWxlID0gZ2x1ZSgicmRhL3RtcmMzX3R2Ml9lb3Npbm9waGlscy12e3Zlcn0ucmRhIikpCmRhdGFfc3RydWN0dXJlcyA8LSBjKGRhdGFfc3RydWN0dXJlcywgInR2Ml9lb3Npbm9waGlscyIpCgpjcG1fZGF0YSA8LSBub3JtYWxpemVfZXhwdCh0djJfZW9zaW5vcGhpbHMsIGNvbnZlcnQgPSAiY3BtIikKd3JpdHRlbiA8LSB3cml0ZV94bHN4KAogICAgZXhwcnMoY3BtX2RhdGEpLAogICAgZXhjZWwgPSBnbHVlKCJjcG0vNF9UdW1hY28vdHYyX2Vvc2lub3BoaWxzLXZ7dmVyfS54bHN4IikpCnJwa21fZGF0YSA8LSBub3JtYWxpemVfZXhwdCh0djJfZW9zaW5vcGhpbHMsIGZpbHRlciA9IFRSVUUsIGNvbnZlcnQgPSAicnBrbSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYV90b196ZXJvID0gVFJVRSwgY29sdW1uID0gIm1lYW5fY2RzX2xlbiIpCndyaXRlLmNzdih4ID0gYXMuZGF0YS5mcmFtZShleHBycyhycGttX2RhdGEpKSwKICAgICAgICAgIGZpbGUgPSBnbHVlKCJycGttL3R2Ml9lb3Npbm9waGlscy12e3Zlcn0uY3N2IikpCmNwbV9kYXRhIDwtIG5vcm1hbGl6ZV9leHB0KHR2Ml9lb3Npbm9waGlscywgY29udmVydCA9ICJjcG0iLCBmaWx0ZXIgPSBUUlVFLCBiYXRjaCA9ICJzdmFzZXEiKQp3cml0dGVuIDwtIHdyaXRlX3hsc3goCiAgICBleHBycyhjcG1fZGF0YSksCiAgICBleGNlbCA9IGdsdWUoImNwbS80X1R1bWFjby90djJfZW9zaW5vcGhpbHNfc3ZhLXZ7dmVyfS54bHN4IikpCnJwa21fZGF0YSA8LSBub3JtYWxpemVfZXhwdCh0djJfZW9zaW5vcGhpbHMsIGZpbHRlciA9IFRSVUUsIGJhdGNoID0gInN2YXNlcSIpICU+JQogIG5vcm1hbGl6ZV9leHB0KGNvbnZlcnQgPSAicnBrbSIsIGNvbHVtbiA9ICJtZWFuX2Nkc19sZW4iLCBuYV90b196ZXJvID0gVFJVRSkKd3JpdGUuY3N2KHggPSBhcy5kYXRhLmZyYW1lKGV4cHJzKHJwa21fZGF0YSkpLAogICAgICAgICAgZmlsZSA9IGdsdWUoInJwa20vdHYyX2Vvc2lub3BoaWxzX3N2YS12e3Zlcn0uY3N2IikpCmBgYAoKIyMjIFR1bWFjbyB2aXNpdCAzIGVvc2lub3BoaWwKCmBgYHtyfQp0djNfZW9zaW5vcGhpbHMgPC0gdGN2M19lb3Npbm9waGlscyAlPiUKICBzdWJzZXRfZXhwdChzdWJzZXQgPSAiY2xpbmljPT0ndHVtYWNvJyIpCnNhdmUobGlzdCA9ICJ0djNfZW9zaW5vcGhpbHMiLCBmaWxlID0gZ2x1ZSgicmRhL3RtcmMzX3R2M19lb3Npbm9waGlscy12e3Zlcn0ucmRhIikpCmRhdGFfc3RydWN0dXJlcyA8LSBjKGRhdGFfc3RydWN0dXJlcywgInR2M19lb3Npbm9waGlscyIpCgpjcG1fZGF0YSA8LSBub3JtYWxpemVfZXhwdCh0djNfZW9zaW5vcGhpbHMsIGNvbnZlcnQgPSAiY3BtIikKd3JpdHRlbiA8LSB3cml0ZV94bHN4KAogICAgZXhwcnMoY3BtX2RhdGEpLAogICAgZXhjZWwgPSBnbHVlKCJjcG0vNF9UdW1hY28vdHYzX2Vvc2lub3BoaWxzLXZ7dmVyfS54bHN4IikpCnJwa21fZGF0YSA8LSBub3JtYWxpemVfZXhwdCh0djNfZW9zaW5vcGhpbHMsIGZpbHRlciA9IFRSVUUsIGNvbnZlcnQgPSAicnBrbSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYV90b196ZXJvID0gVFJVRSwgY29sdW1uID0gIm1lYW5fY2RzX2xlbiIpCndyaXRlLmNzdih4ID0gYXMuZGF0YS5mcmFtZShleHBycyhycGttX2RhdGEpKSwKICAgICAgICAgIGZpbGUgPSBnbHVlKCJycGttL3R2M19lb3Npbm9waGlscy12e3Zlcn0uY3N2IikpCmNwbV9kYXRhIDwtIG5vcm1hbGl6ZV9leHB0KHR2M19lb3Npbm9waGlscywgY29udmVydCA9ICJjcG0iLCBmaWx0ZXIgPSBUUlVFLCBiYXRjaCA9ICJzdmFzZXEiKQp3cml0dGVuIDwtIHdyaXRlX3hsc3goCiAgICBleHBycyhjcG1fZGF0YSksCiAgICBleGNlbCA9IGdsdWUoImNwbS80X1R1bWFjby90djNfZW9zaW5vcGhpbHNfc3ZhLXZ7dmVyfS54bHN4IikpCiMjIE5vdGUsIHRoZSBjYmNiIGZpbHRlciBsZWZ0IGJlaGluZCBhIHN1ZmZpY2llbnQgbnVtYmVyIG9mIHplcm9zIHRoYXQgaXQgY29uZnVzZWQgY3BtLgpycGttX2RhdGEgPC0gbm9ybWFsaXplX2V4cHQodHYzX2Vvc2lub3BoaWxzLCBmaWx0ZXIgPSAic2ltcGxlIiwgYmF0Y2ggPSAic3Zhc2VxIikgJT4lCiAgbm9ybWFsaXplX2V4cHQoY29udmVydCA9ICJycGttIiwgY29sdW1uID0gIm1lYW5fY2RzX2xlbiIsIG5hX3RvX3plcm8gPSBUUlVFKQp3cml0ZS5jc3YoeCA9IGFzLmRhdGEuZnJhbWUoZXhwcnMocnBrbV9kYXRhKSksCiAgICAgICAgICBmaWxlID0gZ2x1ZSgicnBrbS90djNfZW9zaW5vcGhpbHNfc3ZhLXZ7dmVyfS5jc3YiKSkKYGBgCgojIyMgVHVtYWNvIHZpc2l0IDEgbW9ub2N5dGVzCgpgYGB7cn0KdHYxX21vbm9jeXRlcyA8LSB0Y3YxX21vbm9jeXRlcyAlPiUKICBzdWJzZXRfZXhwdChzdWJzZXQgPSAiY2xpbmljPT0ndHVtYWNvJyIpCnNhdmUobGlzdCA9ICJ0djFfbW9ub2N5dGVzIiwgZmlsZSA9IGdsdWUoInJkYS90bXJjM190djFfbW9ub2N5dGVzLXZ7dmVyfS5yZGEiKSkKZGF0YV9zdHJ1Y3R1cmVzIDwtIGMoZGF0YV9zdHJ1Y3R1cmVzLCAidHYxX21vbm9jeXRlcyIpCgpjcG1fZGF0YSA8LSBub3JtYWxpemVfZXhwdCh0djFfbW9ub2N5dGVzLCBjb252ZXJ0ID0gImNwbSIpCndyaXR0ZW4gPC0gd3JpdGVfeGxzeCgKICAgIGV4cHJzKGNwbV9kYXRhKSwKICAgIGV4Y2VsID0gZ2x1ZSgiY3BtLzRfVHVtYWNvL3R2MV9tb25vY3l0ZXMtdnt2ZXJ9Lnhsc3giKSkKcnBrbV9kYXRhIDwtIG5vcm1hbGl6ZV9leHB0KHR2MV9tb25vY3l0ZXMsIGZpbHRlciA9IFRSVUUsIGNvbnZlcnQgPSAicnBrbSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYV90b196ZXJvID0gVFJVRSwgY29sdW1uID0gIm1lYW5fY2RzX2xlbiIpCndyaXRlLmNzdih4ID0gYXMuZGF0YS5mcmFtZShleHBycyhycGttX2RhdGEpKSwKICAgICAgICAgIGZpbGUgPSBnbHVlKCJycGttL3R2MV9tb25vY3l0ZXMtdnt2ZXJ9LmNzdiIpKQpjcG1fZGF0YSA8LSBub3JtYWxpemVfZXhwdCh0djFfbW9ub2N5dGVzLCBjb252ZXJ0PSJjcG0iLCBmaWx0ZXI9VFJVRSwgYmF0Y2g9InN2YXNlcSIpCndyaXR0ZW4gPC0gd3JpdGVfeGxzeCgKICAgIGV4cHJzKGNwbV9kYXRhKSwKICAgIGV4Y2VsID0gZ2x1ZSgiY3BtLzRfVHVtYWNvL3R2MV9tb25vY3l0ZXNfc3ZhLXZ7dmVyfS54bHN4IikpCnJwa21fZGF0YSA8LSBub3JtYWxpemVfZXhwdCh0djFfbW9ub2N5dGVzLCBmaWx0ZXIgPSBUUlVFLCBiYXRjaCA9ICJzdmFzZXEiKSAlPiUKICBub3JtYWxpemVfZXhwdChjb252ZXJ0ID0gInJwa20iLCBjb2x1bW4gPSAibWVhbl9jZHNfbGVuIiwgbmFfdG9femVybyA9IFRSVUUpCndyaXRlLmNzdih4ID0gYXMuZGF0YS5mcmFtZShleHBycyhycGttX2RhdGEpKSwKICAgICAgICAgIGZpbGUgPSBnbHVlKCJycGttL3R2MV9tb25vY3l0ZXNfc3ZhLXZ7dmVyfS5jc3YiKSkKYGBgCgojIyMgVHVtYWNvIHZpc2l0IDIgbW9ub2N5dGVzCgpgYGB7cn0KdHYyX21vbm9jeXRlcyA8LSB0Y3YyX21vbm9jeXRlcyAlPiUKICBzdWJzZXRfZXhwdChzdWJzZXQgPSAiY2xpbmljPT0ndHVtYWNvJyIpCnNhdmUobGlzdCA9ICJ0djJfbW9ub2N5dGVzIiwgZmlsZSA9IGdsdWUoInJkYS90bXJjM190djJfbW9ub2N5dGVzLXZ7dmVyfS5yZGEiKSkKZGF0YV9zdHJ1Y3R1cmVzIDwtIGMoZGF0YV9zdHJ1Y3R1cmVzLCAidHYyX21vbm9jeXRlcyIpCgpjcG1fZGF0YSA8LSBub3JtYWxpemVfZXhwdCh0djJfbW9ub2N5dGVzLCBjb252ZXJ0ID0gImNwbSIpCndyaXR0ZW4gPC0gd3JpdGVfeGxzeCgKICAgIGV4cHJzKGNwbV9kYXRhKSwKICAgIGV4Y2VsID0gZ2x1ZSgiY3BtLzRfVHVtYWNvL3R2Ml9tb25vY3l0ZXMtdnt2ZXJ9Lnhsc3giKSkKcnBrbV9kYXRhIDwtIG5vcm1hbGl6ZV9leHB0KHR2Ml9tb25vY3l0ZXMsIGZpbHRlciA9IFRSVUUsIGNvbnZlcnQgPSAicnBrbSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYV90b196ZXJvID0gVFJVRSwgY29sdW1uID0gIm1lYW5fY2RzX2xlbiIpCndyaXRlLmNzdih4ID0gYXMuZGF0YS5mcmFtZShleHBycyhycGttX2RhdGEpKSwKICAgICAgICAgIGZpbGUgPSBnbHVlKCJycGttL3R2Ml9tb25vY3l0ZXMtdnt2ZXJ9LmNzdiIpKQpjcG1fZGF0YSA8LSBub3JtYWxpemVfZXhwdCh0djJfbW9ub2N5dGVzLCBjb252ZXJ0ID0gImNwbSIsIGZpbHRlciA9IFRSVUUsIGJhdGNoID0gInN2YXNlcSIpCndyaXR0ZW4gPC0gd3JpdGVfeGxzeCgKICAgIGV4cHJzKGNwbV9kYXRhKSwKICAgIGV4Y2VsID0gZ2x1ZSgiY3BtLzRfVHVtYWNvL3R2Ml9tb25vY3l0ZXNfc3ZhLXZ7dmVyfS54bHN4IikpCnJwa21fZGF0YSA8LSBub3JtYWxpemVfZXhwdCh0djJfbW9ub2N5dGVzLCBmaWx0ZXIgPSBUUlVFLCBiYXRjaCA9ICJzdmFzZXEiKSAlPiUKICBub3JtYWxpemVfZXhwdChjb252ZXJ0ID0gInJwa20iLCBjb2x1bW4gPSAibWVhbl9jZHNfbGVuIiwgbmFfdG9femVybyA9IFRSVUUpCndyaXRlLmNzdih4ID0gYXMuZGF0YS5mcmFtZShleHBycyhycGttX2RhdGEpKSwKICAgICAgICAgIGZpbGUgPSBnbHVlKCJycGttL3R2Ml9tb25vY3l0ZXNfc3ZhLXZ7dmVyfS5jc3YiKSkKYGBgCgojIyMgVHVtYWNvIHZpc2l0IDMgbW9ub2N5dGVzCgpgYGB7cn0KdHYzX21vbm9jeXRlcyA8LSB0Y3YzX21vbm9jeXRlcyAlPiUKICBzdWJzZXRfZXhwdChzdWJzZXQgPSAiY2xpbmljPT0ndHVtYWNvJyIpCnNhdmUobGlzdCA9ICJ0djNfbW9ub2N5dGVzIiwgZmlsZSA9IGdsdWUoInJkYS90bXJjM190djNfbW9ub2N5dGVzLXZ7dmVyfS5yZGEiKSkKZGF0YV9zdHJ1Y3R1cmVzIDwtIGMoZGF0YV9zdHJ1Y3R1cmVzLCAidHYzX21vbm9jeXRlcyIpCgpjcG1fZGF0YSA8LSBub3JtYWxpemVfZXhwdCh0djNfbW9ub2N5dGVzLCBjb252ZXJ0ID0gImNwbSIpCndyaXR0ZW4gPC0gd3JpdGVfeGxzeCgKICAgIGV4cHJzKGNwbV9kYXRhKSwKICAgIGV4Y2VsID0gZ2x1ZSgiY3BtLzRfVHVtYWNvL3R2M19tb25vY3l0ZXMtdnt2ZXJ9Lnhsc3giKSkKcnBrbV9kYXRhIDwtIG5vcm1hbGl6ZV9leHB0KHR2M19tb25vY3l0ZXMsIGZpbHRlciA9IFRSVUUsIGNvbnZlcnQgPSAicnBrbSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYV90b196ZXJvID0gVFJVRSwgY29sdW1uID0gIm1lYW5fY2RzX2xlbiIpCndyaXRlLmNzdih4ID0gYXMuZGF0YS5mcmFtZShleHBycyhycGttX2RhdGEpKSwKICAgICAgICAgIGZpbGUgPSBnbHVlKCJycGttL3R2M19tb25vY3l0ZXMtdnt2ZXJ9LmNzdiIpKQpjcG1fZGF0YSA8LSBub3JtYWxpemVfZXhwdCh0djNfbW9ub2N5dGVzLCBjb252ZXJ0ID0gImNwbSIsIGZpbHRlciA9IFRSVUUsIGJhdGNoID0gInN2YXNlcSIpCndyaXR0ZW4gPC0gd3JpdGVfeGxzeCgKICAgIGV4cHJzKGNwbV9kYXRhKSwKICAgIGV4Y2VsID0gZ2x1ZSgiY3BtLzRfVHVtYWNvL3R2M19tb25vY3l0ZXNfc3ZhLXZ7dmVyfS54bHN4IikpCnJwa21fZGF0YSA8LSBub3JtYWxpemVfZXhwdCh0djNfbW9ub2N5dGVzLCBmaWx0ZXIgPSBUUlVFLCBiYXRjaCA9ICJzdmFzZXEiKSAlPiUKICBub3JtYWxpemVfZXhwdChjb252ZXJ0ID0gInJwa20iLCBjb2x1bW4gPSAibWVhbl9jZHNfbGVuIiwgbmFfdG9femVybyA9IFRSVUUpCndyaXRlLmNzdih4ID0gYXMuZGF0YS5mcmFtZShleHBycyhycGttX2RhdGEpKSwKICAgICAgICAgIGZpbGUgPSBnbHVlKCJycGttL3R2M19tb25vY3l0ZXNfc3ZhLXZ7dmVyfS5jc3YiKSkKYGBgCgojIyMgVHVtYWNvIHZpc2l0IDEgbmV1dHJvcGhpbHMKCmBgYHtyfQp0djFfbmV1dHJvcGhpbHMgPC0gdGN2MV9uZXV0cm9waGlscyAlPiUKICBzdWJzZXRfZXhwdChzdWJzZXQgPSAiY2xpbmljPT0ndHVtYWNvJyIpCnNhdmUobGlzdCA9ICJ0djFfbmV1dHJvcGhpbHMiLCBmaWxlID0gZ2x1ZSgicmRhL3RtcmMzX3R2MV9uZXV0cm9waGlscy12e3Zlcn0ucmRhIikpCmRhdGFfc3RydWN0dXJlcyA8LSBjKGRhdGFfc3RydWN0dXJlcywgInR2MV9uZXV0cm9waGlscyIpCgpjcG1fZGF0YSA8LSBub3JtYWxpemVfZXhwdCh0djFfbmV1dHJvcGhpbHMsIGNvbnZlcnQgPSAiY3BtIikKd3JpdHRlbiA8LSB3cml0ZV94bHN4KAogICAgZXhwcnMoY3BtX2RhdGEpLAogICAgZXhjZWwgPSBnbHVlKCJjcG0vNF9UdW1hY28vdHYxX25ldXRyb3BoaWxzLXZ7dmVyfS54bHN4IikpCnJwa21fZGF0YSA8LSBub3JtYWxpemVfZXhwdCh0djFfbmV1dHJvcGhpbHMsIGZpbHRlciA9IFRSVUUsIGNvbnZlcnQgPSAicnBrbSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYV90b196ZXJvID0gVFJVRSwgY29sdW1uID0gIm1lYW5fY2RzX2xlbiIpCndyaXRlLmNzdih4ID0gYXMuZGF0YS5mcmFtZShleHBycyhycGttX2RhdGEpKSwKICAgICAgICAgIGZpbGUgPSBnbHVlKCJycGttL3R2MV9uZXV0cm9waGlscy12e3Zlcn0uY3N2IikpCmNwbV9kYXRhIDwtIG5vcm1hbGl6ZV9leHB0KHR2MV9uZXV0cm9waGlscywgY29udmVydCA9ICJjcG0iLCBmaWx0ZXIgPSBUUlVFLCBiYXRjaCA9ICJzdmFzZXEiKQp3cml0dGVuIDwtIHdyaXRlX3hsc3goCiAgICBleHBycyhjcG1fZGF0YSksCiAgICBleGNlbCA9IGdsdWUoImNwbS80X1R1bWFjby90djFfbmV1dHJvcGhpbHNfc3ZhLXZ7dmVyfS54bHN4IikpCnJwa21fZGF0YSA8LSBub3JtYWxpemVfZXhwdCh0djFfbmV1dHJvcGhpbHMsIGZpbHRlciA9IFRSVUUsIGJhdGNoID0gInN2YXNlcSIpICU+JQogIG5vcm1hbGl6ZV9leHB0KGNvbnZlcnQgPSAicnBrbSIsIGNvbHVtbiA9ICJtZWFuX2Nkc19sZW4iLCBuYV90b196ZXJvID0gVFJVRSkKd3JpdGUuY3N2KHggPSBhcy5kYXRhLmZyYW1lKGV4cHJzKHJwa21fZGF0YSkpLAogICAgICAgICAgZmlsZSA9IGdsdWUoInJwa20vdHYxX25ldXRyb3BoaWxzX3N2YS12e3Zlcn0uY3N2IikpCmBgYAoKIyMjIFR1bWFjbyB2aXNpdCAyIG5ldXRyb3BoaWxzCgpgYGB7cn0KdHYyX25ldXRyb3BoaWxzIDwtIHRjdjJfbmV1dHJvcGhpbHMgJT4lCiAgc3Vic2V0X2V4cHQoc3Vic2V0ID0gImNsaW5pYz09J3R1bWFjbyciKQpzYXZlKGxpc3QgPSAidHYyX25ldXRyb3BoaWxzIiwgZmlsZSA9IGdsdWUoInJkYS90bXJjM190djJfbmV1dHJvcGhpbHMtdnt2ZXJ9LnJkYSIpKQpkYXRhX3N0cnVjdHVyZXMgPC0gYyhkYXRhX3N0cnVjdHVyZXMsICJ0djJfbmV1dHJvcGhpbHMiKQoKY3BtX2RhdGEgPC0gbm9ybWFsaXplX2V4cHQodHYyX25ldXRyb3BoaWxzLCBjb252ZXJ0ID0gImNwbSIpCndyaXR0ZW4gPC0gd3JpdGVfeGxzeCgKICAgIGV4cHJzKGNwbV9kYXRhKSwKICAgIGV4Y2VsID0gZ2x1ZSgiY3BtLzRfVHVtYWNvL3R2Ml9uZXV0cm9waGlscy12e3Zlcn0ueGxzeCIpKQpycGttX2RhdGEgPC0gbm9ybWFsaXplX2V4cHQodHYyX25ldXRyb3BoaWxzLCBmaWx0ZXIgPSBUUlVFLCBjb252ZXJ0ID0gInJwa20iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFfdG9femVybyA9IFRSVUUsIGNvbHVtbiA9ICJtZWFuX2Nkc19sZW4iKQp3cml0ZS5jc3YoeCA9IGFzLmRhdGEuZnJhbWUoZXhwcnMocnBrbV9kYXRhKSksCiAgICAgICAgICBmaWxlID0gZ2x1ZSgicnBrbS90djJfbmV1dHJvcGhpbHMtdnt2ZXJ9LmNzdiIpKQpjcG1fZGF0YSA8LSBub3JtYWxpemVfZXhwdCh0djJfbmV1dHJvcGhpbHMsIGNvbnZlcnQgPSAiY3BtIiwgZmlsdGVyID0gVFJVRSwgYmF0Y2ggPSAic3Zhc2VxIikKd3JpdHRlbiA8LSB3cml0ZV94bHN4KAogICAgZXhwcnMoY3BtX2RhdGEpLAogICAgZXhjZWwgPSBnbHVlKCJjcG0vNF9UdW1hY28vdHYyX25ldXRyb3BoaWxzX3N2YS12e3Zlcn0ueGxzeCIpKQpycGttX2RhdGEgPC0gbm9ybWFsaXplX2V4cHQodHYyX25ldXRyb3BoaWxzLCBmaWx0ZXIgPSBUUlVFLCBiYXRjaCA9ICJzdmFzZXEiKSAlPiUKICBub3JtYWxpemVfZXhwdChjb252ZXJ0ID0gInJwa20iLCBjb2x1bW4gPSAibWVhbl9jZHNfbGVuIiwgbmFfdG9femVybyA9IFRSVUUpCndyaXRlLmNzdih4ID0gYXMuZGF0YS5mcmFtZShleHBycyhycGttX2RhdGEpKSwKICAgICAgICAgIGZpbGUgPSBnbHVlKCJycGttL3R2Ml9uZXV0cm9waGlsc19zdmEtdnt2ZXJ9LmNzdiIpKQpgYGAKCiMjIyBUdW1hY28gdmlzaXQgMyBuZXV0cm9waGlscwoKYGBge3J9CnR2M19uZXV0cm9waGlscyA8LSB0Y3YzX25ldXRyb3BoaWxzICU+JQogIHN1YnNldF9leHB0KHN1YnNldCA9ICJjbGluaWM9PSd0dW1hY28nIikKc2F2ZShsaXN0ID0gInR2M19uZXV0cm9waGlscyIsIGZpbGUgPSBnbHVlKCJyZGEvdG1yYzNfdHYzX25ldXRyb3BoaWxzLXZ7dmVyfS5yZGEiKSkKZGF0YV9zdHJ1Y3R1cmVzIDwtIGMoZGF0YV9zdHJ1Y3R1cmVzLCAidHYzX25ldXRyb3BoaWxzIikKCmNwbV9kYXRhIDwtIG5vcm1hbGl6ZV9leHB0KHR2M19uZXV0cm9waGlscywgY29udmVydCA9ICJjcG0iKQp3cml0dGVuIDwtIHdyaXRlX3hsc3goCiAgICBleHBycyhjcG1fZGF0YSksCiAgICBleGNlbCA9IGdsdWUoImNwbS80X1R1bWFjby90djNfbmV1dHJvcGhpbHMtdnt2ZXJ9Lnhsc3giKSkKcnBrbV9kYXRhIDwtIG5vcm1hbGl6ZV9leHB0KHR2M19uZXV0cm9waGlscywgZmlsdGVyID0gVFJVRSwgY29udmVydCA9ICJycGttIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hX3RvX3plcm8gPSBUUlVFLCBjb2x1bW4gPSAibWVhbl9jZHNfbGVuIikKd3JpdGUuY3N2KHggPSBhcy5kYXRhLmZyYW1lKGV4cHJzKHJwa21fZGF0YSkpLAogICAgICAgICAgZmlsZSA9IGdsdWUoInJwa20vdHYzX25ldXRyb3BoaWxzLXZ7dmVyfS5jc3YiKSkKY3BtX2RhdGEgPC0gbm9ybWFsaXplX2V4cHQodHYzX25ldXRyb3BoaWxzLCBjb252ZXJ0ID0gImNwbSIsIGZpbHRlciA9IFRSVUUsIGJhdGNoID0gInN2YXNlcSIpCndyaXR0ZW4gPC0gd3JpdGVfeGxzeCgKICAgIGV4cHJzKGNwbV9kYXRhKSwKICAgIGV4Y2VsID0gZ2x1ZSgiY3BtLzRfVHVtYWNvL3R2M19uZXV0cm9waGlsc19zdmEtdnt2ZXJ9Lnhsc3giKSkKcnBrbV9kYXRhIDwtIG5vcm1hbGl6ZV9leHB0KHR2M19uZXV0cm9waGlscywgZmlsdGVyID0gVFJVRSwgYmF0Y2ggPSAic3Zhc2VxIikgJT4lCiAgbm9ybWFsaXplX2V4cHQoY29udmVydCA9ICJycGttIiwgY29sdW1uID0gIm1lYW5fY2RzX2xlbiIsIG5hX3RvX3plcm8gPSBUUlVFKQp3cml0ZS5jc3YoeCA9IGFzLmRhdGEuZnJhbWUoZXhwcnMocnBrbV9kYXRhKSksCiAgICAgICAgICBmaWxlID0gZ2x1ZSgicnBrbS90djNfbmV1dHJvcGhpbHNfc3ZhLXZ7dmVyfS5jc3YiKSkKYGBgCgojIERhdGFzZXQ6IE9ubHkgQ2FsaSBzYW1wbGVzCgpFdmVuIHRob3VnaCB3ZSBhcmUgb25seSBjb25zaWRlcmluZyB0aGUgVHVtYWNvIHNhbXBsZXMsIG9uZSBtaWdodCB3aXNoCnRvIHBlcmZvcm0gY29tcGFyaXNvbnMgYW1vbmcgdGhlIENhbGkgc2FtcGxlcy4gIFRoZSBmb2xsb3dpbmcgYmxvY2tzCnRoZXJlZm9yZSBzZXBhcmF0ZSB0aGVtIG91dCBpbiBhIHNpbWlsYXIgZmFzaGlvbi4KCmBgYHtyfQpkaXIuY3JlYXRlKCJjcG0vNF9DYWxpIiwgcmVjdXJzaXZlID0gVFJVRSkKY19jbGluaWNhbCA8LSB0Y19jbGluaWNhbCAlPiUKICBzdWJzZXRfZXhwdChzdWJzZXQgPSAiY2xpbmljPT0nY2FsaSciKQpzYXZlKGxpc3QgPSAiY19jbGluaWNhbCIsIGZpbGUgPSBnbHVlKCJyZGEvdG1yYzNfY19jbGluaWNhbC12e3Zlcn0ucmRhIikpCmRhdGFfc3RydWN0dXJlcyA8LSBjKGRhdGFfc3RydWN0dXJlcywgImNfY2xpbmljYWwiKQoKY3BtX2RhdGEgPC0gbm9ybWFsaXplX2V4cHQoY19jbGluaWNhbCwgY29udmVydCA9ICJjcG0iKQpjX2NsaW5pY2FsX2NwbV92YXJpYW5jZSA8LSB2YXJpYW5jZV9leHB0KGNwbV9kYXRhKQoKd3JpdHRlbiA8LSB3cml0ZV94bHN4KAogICAgZXhwcnMoY3BtX2RhdGEpLAogICAgZXhjZWwgPSBnbHVlKCJjcG0vNF9DYWxpL2NfY2xpbmljYWwtdnt2ZXJ9Lnhsc3giKSkKcnBrbV9kYXRhIDwtIG5vcm1hbGl6ZV9leHB0KGNfY2xpbmljYWwsIGZpbHRlciA9IFRSVUUsIGNvbnZlcnQgPSAicnBrbSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYV90b196ZXJvID0gVFJVRSwgY29sdW1uID0gIm1lYW5fY2RzX2xlbiIpCndyaXRlLmNzdih4ID0gYXMuZGF0YS5mcmFtZShleHBycyhycGttX2RhdGEpKSwKICAgICAgICAgICAgICAgICBmaWxlID0gZ2x1ZSgicnBrbS90X2NsaW5pY2FsLXZ7dmVyfS5jc3YiKSkKY3BtX2RhdGEgPC0gbm9ybWFsaXplX2V4cHQoY19jbGluaWNhbCwgY29udmVydCA9ICJjcG0iLCBmaWx0ZXIgPSBUUlVFLCBiYXRjaCA9ICJzdmFzZXEiKQp3cml0dGVuIDwtIHdyaXRlX3hsc3goCiAgICBleHBycyhjcG1fZGF0YSksCiAgICBleGNlbCA9IGdsdWUoImNwbS80X0NhbGkvY19jbGluaWNhbF9zdmEtdnt2ZXJ9Lnhsc3giKSkKcnBrbV9kYXRhIDwtIG5vcm1hbGl6ZV9leHB0KGNfY2xpbmljYWwsIGZpbHRlciA9IFRSVUUsIGJhdGNoID0gInN2YXNlcSIpICU+JQogIG5vcm1hbGl6ZV9leHB0KGNvbnZlcnQgPSAicnBrbSIsIGNvbHVtbiA9ICJtZWFuX2Nkc19sZW4iLCBuYV90b196ZXJvID0gVFJVRSkKd3JpdGUuY3N2KHggPSBhcy5kYXRhLmZyYW1lKGV4cHJzKHJwa21fZGF0YSkpLAogICAgICAgICAgZmlsZSA9IGdsdWUoInJwa20vY19jbGluaWNhbF9zdmEtdnt2ZXJ9LmNzdiIpKQpgYGAKClRoZSBDYWxpIHNhbXBsZXMgd2l0aG91dCBiaW9wc2llcy4KCmBgYHtyfQpjX2NsaW5pY2FsX25vYmlvcCA8LSBzdWJzZXRfZXhwdChjX2NsaW5pY2FsLCBzdWJzZXQgPSAidHlwZW9mY2VsbHMhPSdiaW9wc3knIikKc2F2ZShsaXN0ID0gImNfY2xpbmljYWxfbm9iaW9wIiwgZmlsZSA9IGdsdWUoInJkYS90bXJjM19jX2NsaW5pY2FsX25vYmlvcC12e3Zlcn0ucmRhIikpCmRhdGFfc3RydWN0dXJlcyA8LSBjKGRhdGFfc3RydWN0dXJlcywgImNfY2xpbmljYWxfbm9iaW9wIikKCmNwbV9kYXRhIDwtIG5vcm1hbGl6ZV9leHB0KGNfY2xpbmljYWxfbm9iaW9wLCBjb252ZXJ0ID0gImNwbSIpCndyaXR0ZW4gPC0gd3JpdGVfeGxzeCgKICAgIGV4cHJzKGNwbV9kYXRhKSwKICAgIGV4Y2VsID0gZ2x1ZSgiY3BtLzRfQ2FsaS9jX2NsaW5pY2FsX25vYmlvcC12e3Zlcn0ueGxzeCIpKQpycGttX2RhdGEgPC0gbm9ybWFsaXplX2V4cHQoY19jbGluaWNhbCwgZmlsdGVyID0gVFJVRSwgYmF0Y2ggPSAic3Zhc2VxIikgJT4lCiAgbm9ybWFsaXplX2V4cHQoY29udmVydCA9ICJycGttIiwgY29sdW1uID0gIm1lYW5fY2RzX2xlbiIsIG5hX3RvX3plcm8gPSBUUlVFKQp3cml0ZS5jc3YoeCA9IGFzLmRhdGEuZnJhbWUoZXhwcnMocnBrbV9kYXRhKSksCiAgICAgICAgICBmaWxlID0gZ2x1ZSgicnBrbS9jX2NsaW5pY2FsX3N2YS12e3Zlcn0uY3N2IikpCgpjcG1fZGF0YSA8LSBub3JtYWxpemVfZXhwdChjX2NsaW5pY2FsX25vYmlvcCwgY29udmVydCA9ICJjcG0iLCBmaWx0ZXIgPSBUUlVFLCBiYXRjaCA9ICJzdmFzZXEiKQp3cml0dGVuIDwtIHdyaXRlX3hsc3goCiAgICBleHBycyhjcG1fZGF0YSksCiAgICBleGNlbCA9IGdsdWUoImNwbS80X0NhbGkvY19jbGluaWNhbF9ub2Jpb3Bfc3ZhLXZ7dmVyfS54bHN4IikpCnJwa21fZGF0YSA8LSBub3JtYWxpemVfZXhwdChjX2NsaW5pY2FsX25vYmlvcCwgZmlsdGVyID0gVFJVRSwgYmF0Y2ggPSAic3Zhc2VxIikgJT4lCiAgbm9ybWFsaXplX2V4cHQoY29udmVydCA9ICJycGttIiwgY29sdW1uID0gIm1lYW5fY2RzX2xlbiIsIG5hX3RvX3plcm8gPSBUUlVFKQp3cml0ZS5jc3YoeCA9IGFzLmRhdGEuZnJhbWUoZXhwcnMocnBrbV9kYXRhKSksCiAgICAgICAgICBmaWxlID0gZ2x1ZSgicnBrbS9jX2NsaW5pY2FsX25vYmlvcF9zdmEtdnt2ZXJ9LmNzdiIpKQpgYGAKCiMjIyBQdWxsIG91dCB0aGUgdG9wLW4gbW9zdCB2YXJpYW50IGdlbmVzCgpJIGFkZGVkIGEgZmV3IGNvbHVtbnMgdG8gdGhlIGdlbmUgYW5ub3RhdGlvbnMgcmVmbGVjdGluZyB0aGUKdmFyaWFuY2Uvc3RkZXYvbWVhbiBleHByZXNzaW9uIG9mIGVhY2ggZ2VuZS4gIFRoaXMgcmVhbGx5IGhpZ2hsaWdodHMKdGhlIGV4dHJhb3JkaW5hcnkgZGVncmVlIHRvIHdoaWNoIGdlbmVzIGFyZSBjaGFuZ2luZyBpbiB0aGUgZGF0YS4uLgoKCmBgYHtyfQp0b3BfZXhwdCA8LSBub3JtYWxpemVfZXhwdChjX2NsaW5pY2FsX2NwbV92YXJpYW5jZSwgZmlsdGVyID0gVFJVRSkgJT4lCiAgdmFyaWFuY2VfZXhwdCgpCnRvcF9mZCA8LSBmRGF0YSh0b3BfZXhwdCkKdG9wX2V4IDwtIGV4cHJzKHRvcF9leHB0KQppZHggPC0gb3JkZXIodG9wX2ZkW1siZXhwcnNfZ2VuZV9zdGRldiJdXSwgZGVjcmVhc2luZyA9IFRSVUUpCnRvcF9kZiA8LSB0b3BfZmRbaWR4LCBdCgp3cml0dGVuIDwtIHdyaXRlX3hsc3goCiAgICBkYXRhID0gaGVhZCh0b3BfZmQsIG4gPSAxMDApLAogICAgZXhjZWwgPSBnbHVlKCJleGNlbC9jX2NsaW5pY2FsX2NwbV9zdGRldl90b3AxMDAtdnt2ZXJ9Lnhsc3giKSkKCmJvdHRvbV9leHB0IDwtIG5vcm1hbGl6ZV9leHB0KGNfY2xpbmljYWxfY3BtX3ZhcmlhbmNlLCBmaWx0ZXIgPSAic2ltcGxlIiwgdGhyZXNob2xkID0gNTAwKSAlPiUKICB2YXJpYW5jZV9leHB0KCkKYm90dG9tX2ZkIDwtIGZEYXRhKGJvdHRvbV9leHB0KQpib3R0b21fZXggPC0gZXhwcnMoYm90dG9tX2V4cHQpCmlkeCA8LSBvcmRlcihib3R0b21fZmRbWyJleHByc19nZW5lX3N0ZGV2Il1dKQpib3R0b20gPC0gYm90dG9tX2ZkW2lkeCwgXQoKd3JpdHRlbiA8LSB3cml0ZV94bHN4KAogICAgZGF0YSA9IGhlYWQoYm90dG9tX2ZkLCBuID0gMTAwKSwKICAgIGV4Y2VsID0gZ2x1ZSgiZXhjZWwvY19jbGluaWNhbF9jcG1fc3RkZXZfYm90dG9tMTAwLXZ7dmVyfS54bHN4IikpCmBgYAoKIyMgU3VtbWFyaXplOiBDb2xsZWN0IENhbGkgc2FtcGxlIG51bWJlcnMuCgpUaGlzIGlzIGNvcHkvcGFzdGVkIGZyb20gYWJvdmUgYW5kIHByaW50cyBvdXQgaG93IG1hbnkgb2YgZWFjaCBzYW1wbGUKdHlwZSB0aGVyZSBhcmUgb2YgZWFjaCBjYXRlZ29yeS4KCmBgYHtyfQp0YWJsZShwRGF0YShjX2NsaW5pY2FsKVtbImRydWciXV0pCnRhYmxlKHBEYXRhKGNfY2xpbmljYWwpW1siY2xpbmljIl1dKQp0YWJsZShwRGF0YShjX2NsaW5pY2FsKVtbImZpbmFsb3V0Y29tZSJdXSkKdGFibGUocERhdGEoY19jbGluaWNhbClbWyJ0eXBlb2ZjZWxscyJdXSkKdGFibGUocERhdGEoY19jbGluaWNhbClbWyJ2aXNpdG51bWJlciJdXSkKc3VtbWFyeShwRGF0YShjX2NsaW5pY2FsKVtbIkV2b2x1dGlvbl9UaW1lIl1dKQpzdW1tYXJ5KHBEYXRhKGNfY2xpbmljYWwpW1siUHJlc2NyaWJlZF9EYWlseV9Eb3NlX0dsdWMiXV0pCnN1bW1hcnkocERhdGEoY19jbGluaWNhbClbWyJWM19WZXJ0aWNhbF9BeGlzX0xlc2lvbiJdXSkKc3VtbWFyeShwRGF0YShjX2NsaW5pY2FsKVtbIlYzX1RvdGFsX0FyZWFfTGVzaW9uIl1dKQpzdW1tYXJ5KHBEYXRhKGNfY2xpbmljYWwpW1siVjNfSG9yaXpvbnRhbF9BeGlzX1VsY2VyIl1dKQp0YWJsZShwRGF0YShjX2NsaW5pY2FsKVtbIlNleCJdXSkKdGFibGUocERhdGEoY19jbGluaWNhbClbWyJFdGhuaWNpdHkiXV0pCnN1bW1hcnkocERhdGEoY19jbGluaWNhbClbWyJBZ2UiXV0pCnN1bW1hcnkocERhdGEoY19jbGluaWNhbClbWyJIZWlnaHQiXV0pCnN1bW1hcnkocERhdGEoY19jbGluaWNhbClbWyJXZWlnaHQiXV0pCgpsZW5ndGgodW5pcXVlKHBEYXRhKGNfY2xpbmljYWwpW1siUGF0aWVudF9JRCJdXSkpCm9ubHlfY3VyZSA8LSBwRGF0YShjX2NsaW5pY2FsKVtbImZpbmFsb3V0Y29tZSJdXSA9PSAiY3VyZSIKY19tZXRhIDwtIHBEYXRhKGNfY2xpbmljYWwpW29ubHlfY3VyZSwgXQpsZW5ndGgodW5pcXVlKGNfbWV0YVtbIlBhdGllbnRfSUQiXV0pKQpvbmx5X2ZhaWwgPC0gcERhdGEoY19jbGluaWNhbClbWyJmaW5hbG91dGNvbWUiXV0gPT0gImZhaWx1cmUiCmZfbWV0YSA8LSBwRGF0YShjX2NsaW5pY2FsKVtvbmx5X2ZhaWwsIF0KbGVuZ3RoKHVuaXF1ZShmX21ldGFbWyJQYXRpZW50X0lEIl1dKSkKYGBgCgojIyBTcGxpdCB0aGUgZGF0YSBieSBjdXJlL2ZhaWwgZm9yIHNvbWUgY291bnRpbmcKCmBgYHtyfQpjYWxpX2N1cmUgPC0gc3Vic2V0X2V4cHQoY19jbGluaWNhbCwgc3Vic2V0ID0gImZpbmFsb3V0Y29tZT09J2N1cmUnIikKdGFibGUocERhdGEoY2FsaV9jdXJlKVtbInZpc2l0bnVtYmVyIl1dKQoKY2FsaV9mYWlsIDwtIHN1YnNldF9leHB0KGNfY2xpbmljYWwsIHN1YnNldCA9ICJmaW5hbG91dGNvbWU9PSdmYWlsdXJlJyIpCnRhYmxlKHBEYXRhKGNhbGlfZmFpbClbWyJ2aXNpdG51bWJlciJdXSkKYGBgCgojIyBTdWJzZXQ6IENyZWF0ZSBDYWxpLXNwZWNpZmljIHZlcnNpb25zIG9mIHRoZSB2YXJpb3VzIHN0cnVjdHVyZXMKCkkgcHJldmlvdXNseSBtYWRlIGEgYnVuY2ggb2YgZGF0YSBzdWJzZXRzIGJ5IHZpc2l0LCBjZWxsIHR5cGUsIGV0Yy4KU28gbGV0IHVzIG92ZXJ3cml0ZSB0aGVtIGFsbCB3aXRoIHZlcnNpb25zIHdoaWNoIGNvbnRhaW4gb25seSB0aGUKQ2FsaSBzYW1wbGVzLgoKVGhlcmUgaXMgbm8gZ29pbmcgYmFjayB0byB0aGUgQ2FsaSBzYW1wbGVzIGFmdGVyIHRoaXMgYmxvY2sgdW5sZXNzIHdlCnJlZ2VuZXJhdGUgdGhlIGRhdGEgZnJvbSB0aGUgb3JpZ2luYWwgZXhwcmVzc2lvbnNldHMuCgojIyMgQ2FsaSBiaW9wc2llcwoKYGBge3J9CmNfYmlvcHNpZXMgPC0gdGNfYmlvcHNpZXMgJT4lCiAgc3Vic2V0X2V4cHQoc3Vic2V0ID0gImNsaW5pYz09J2NhbGknIikKc2F2ZShsaXN0ID0gImNfYmlvcHNpZXMiLCBmaWxlID0gZ2x1ZSgicmRhL3RtcmMzX2NfYmlvcHNpZXMtdnt2ZXJ9LnJkYSIpKQpkYXRhX3N0cnVjdHVyZXMgPC0gYyhkYXRhX3N0cnVjdHVyZXMsICJjX2Jpb3BzaWVzIikKCmNwbV9kYXRhIDwtIG5vcm1hbGl6ZV9leHB0KGNfYmlvcHNpZXMsIGNvbnZlcnQgPSAiY3BtIikKd3JpdHRlbiA8LSB3cml0ZV94bHN4KAogICAgZXhwcnMoY3BtX2RhdGEpLAogICAgZXhjZWwgPSBnbHVlKCJjcG0vNF9DYWxpL2NfYmlvcHNpZXMtdnt2ZXJ9Lnhsc3giKSkKcnBrbV9kYXRhIDwtIG5vcm1hbGl6ZV9leHB0KGNfYmlvcHNpZXMsIGZpbHRlciA9IFRSVUUsIGNvbnZlcnQgPSAicnBrbSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYV90b196ZXJvID0gVFJVRSwgY29sdW1uID0gIm1lYW5fY2RzX2xlbiIpCndyaXRlLmNzdih4ID0gYXMuZGF0YS5mcmFtZShleHBycyhycGttX2RhdGEpKSwKICAgICAgICAgIGZpbGUgPSBnbHVlKCJycGttL2NfYmlvcHNpZXMtdnt2ZXJ9LmNzdiIpKQoKY3BtX2RhdGEgPC0gbm9ybWFsaXplX2V4cHQoY19iaW9wc2llcywgY29udmVydCA9ICJjcG0iLCBmaWx0ZXIgPSBUUlVFKQp3cml0dGVuIDwtIHdyaXRlX3hsc3goCiAgICBleHBycyhjcG1fZGF0YSksCiAgICBleGNlbCA9IGdsdWUoImNwbS80X0NhbGkvY19iaW9wc2llc19ub3N2YS12e3Zlcn0ueGxzeCIpKQpgYGAKCiMjIyBDYWxpIEVvc2lub3BoaWxzCgpgYGB7cn0KY19lb3Npbm9waGlscyA8LSB0Y19lb3Npbm9waGlscyAlPiUKICBzdWJzZXRfZXhwdChzdWJzZXQgPSAiY2xpbmljPT0nY2FsaSciKQpzYXZlKGxpc3QgPSAiY19lb3Npbm9waGlscyIsIGZpbGUgPSBnbHVlKCJyZGEvdG1yYzNfY19lb3Npbm9waGlscy12e3Zlcn0ucmRhIikpCmRhdGFfc3RydWN0dXJlcyA8LSBjKGRhdGFfc3RydWN0dXJlcywgImNfZW9zaW5vcGhpbHMiKQoKY3BtX2RhdGEgPC0gbm9ybWFsaXplX2V4cHQoY19lb3Npbm9waGlscywgY29udmVydCA9ICJjcG0iKQp3cml0dGVuIDwtIHdyaXRlX3hsc3goCiAgICBleHBycyhjcG1fZGF0YSksCiAgICBleGNlbCA9IGdsdWUoImNwbS80X0NhbGkvY19lb3Npbm9waGlscy12e3Zlcn0ueGxzeCIpKQpjcG1fZGF0YSA8LSBub3JtYWxpemVfZXhwdChjX2Vvc2lub3BoaWxzLCBjb252ZXJ0ID0gImNwbSIsIGZpbHRlciA9IFRSVUUpCndyaXR0ZW4gPC0gd3JpdGVfeGxzeCgKICAgIGV4cHJzKGNwbV9kYXRhKSwKICAgIGV4Y2VsID0gZ2x1ZSgiY3BtLzRfQ2FsaS9jX2Vvc2lub3BoaWxzX25vc3ZhLXZ7dmVyfS54bHN4IikpCnJwa21fZGF0YSA8LSBub3JtYWxpemVfZXhwdChjX2Vvc2lub3BoaWxzLCBmaWx0ZXIgPSBUUlVFKSAlPiUKICBub3JtYWxpemVfZXhwdChjb252ZXJ0ID0gInJwa20iLCBjb2x1bW4gPSAibWVhbl9jZHNfbGVuIiwgbmFfdG9femVybyA9IFRSVUUpCndyaXRlLmNzdih4ID0gYXMuZGF0YS5mcmFtZShleHBycyhycGttX2RhdGEpKSwKICAgICAgICAgIGZpbGUgPSBnbHVlKCJycGttL2NfZW9zaW5vcGhpbHNfbm9zdmEtdnt2ZXJ9LmNzdiIpKQpgYGAKCiMjIyBDYWxpIHN1YnNldHMgbW9ub2N5dGVzCgpgYGB7cn0KY19tb25vY3l0ZXMgPC0gdGNfbW9ub2N5dGVzICU+JQogIHN1YnNldF9leHB0KHN1YnNldCA9ICJjbGluaWM9PSdjYWxpJyIpCnNhdmUobGlzdCA9ICJjX21vbm9jeXRlcyIsIGZpbGUgPSBnbHVlKCJyZGEvdG1yYzNfY19tb25vY3l0ZXMtdnt2ZXJ9LnJkYSIpKQpkYXRhX3N0cnVjdHVyZXMgPC0gYyhkYXRhX3N0cnVjdHVyZXMsICJjX21vbm9jeXRlcyIpCgpjcG1fZGF0YSA8LSBub3JtYWxpemVfZXhwdChjX21vbm9jeXRlcywgY29udmVydCA9ICJjcG0iKQp3cml0dGVuIDwtIHdyaXRlX3hsc3goCiAgICBleHBycyhjcG1fZGF0YSksCiAgICBleGNlbCA9IGdsdWUoImNwbS80X0NhbGkvY19tb25vY3l0ZXMtdnt2ZXJ9Lnhsc3giKSkKcnBrbV9kYXRhIDwtIG5vcm1hbGl6ZV9leHB0KGNfbW9ub2N5dGVzLCBmaWx0ZXIgPSBUUlVFLCBjb252ZXJ0ID0gInJwa20iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFfdG9femVybyA9IFRSVUUsIGNvbHVtbiA9ICJtZWFuX2Nkc19sZW4iKQp3cml0ZS5jc3YoeCA9IGFzLmRhdGEuZnJhbWUoZXhwcnMocnBrbV9kYXRhKSksCiAgICAgICAgICBmaWxlID0gZ2x1ZSgicnBrbS9jX21vbm9jeXRlcy12e3Zlcn0uY3N2IikpCmNwbV9kYXRhIDwtIG5vcm1hbGl6ZV9leHB0KGNfbW9ub2N5dGVzLCBjb252ZXJ0ID0gImNwbSIsIGZpbHRlciA9IFRSVUUpCndyaXR0ZW4gPC0gd3JpdGVfeGxzeCgKICAgIGV4cHJzKGNwbV9kYXRhKSwKICAgIGV4Y2VsID0gZ2x1ZSgiY3BtLzRfQ2FsaS9jX21vbm9jeXRlc19ub3N2YS12e3Zlcn0ueGxzeCIpKQpycGttX2RhdGEgPC0gbm9ybWFsaXplX2V4cHQoY19tb25vY3l0ZXMsIGZpbHRlciA9IFRSVUUsIGJhdGNoID0gInN2YXNlcSIpICU+JQogIG5vcm1hbGl6ZV9leHB0KGNvbnZlcnQgPSAicnBrbSIsIGNvbHVtbiA9ICJtZWFuX2Nkc19sZW4iLCBuYV90b196ZXJvID0gVFJVRSkKd3JpdGUuY3N2KHggPSBhcy5kYXRhLmZyYW1lKGV4cHJzKHJwa21fZGF0YSkpLAogICAgICAgICAgZmlsZSA9IGdsdWUoInJwa20vY19tb25vY3l0ZXNfc3ZhLXZ7dmVyfS5jc3YiKSkKYGBgCgojIyMgQ2FsaSBzdWJzZXRzIG5ldXRyb3BoaWxzCgpgYGB7cn0KY19uZXV0cm9waGlscyA8LSB0Y19uZXV0cm9waGlscyAlPiUKICBzdWJzZXRfZXhwdChzdWJzZXQgPSAiY2xpbmljPT0nY2FsaSciKQpzYXZlKGxpc3QgPSAiY19uZXV0cm9waGlscyIsIGZpbGUgPSBnbHVlKCJyZGEvdG1yYzNfY19uZXV0cm9waGlscy12e3Zlcn0ucmRhIikpCmRhdGFfc3RydWN0dXJlcyA8LSBjKGRhdGFfc3RydWN0dXJlcywgImNfbmV1dHJvcGhpbHMiKQoKY3BtX2RhdGEgPC0gbm9ybWFsaXplX2V4cHQoY19uZXV0cm9waGlscywgY29udmVydCA9ICJjcG0iKQp3cml0dGVuIDwtIHdyaXRlX3hsc3goCiAgICBleHBycyhjcG1fZGF0YSksCiAgICBleGNlbCA9IGdsdWUoImNwbS80X0NhbGkvY19uZXV0cm9waGlsLXZ7dmVyfS54bHN4IikpCnJwa21fZGF0YSA8LSBub3JtYWxpemVfZXhwdChjX25ldXRyb3BoaWxzLCBmaWx0ZXIgPSBUUlVFLCBjb252ZXJ0ID0gInJwa20iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFfdG9femVybyA9IFRSVUUsIGNvbHVtbiA9ICJtZWFuX2Nkc19sZW4iKQp3cml0ZS5jc3YoeCA9IGFzLmRhdGEuZnJhbWUoZXhwcnMocnBrbV9kYXRhKSksCiAgICAgICAgICAgICAgICAgZmlsZSA9IGdsdWUoInJwa20vY19uZXV0cm9waGlscy12e3Zlcn0uY3N2IikpCmNwbV9kYXRhIDwtIG5vcm1hbGl6ZV9leHB0KGNfbmV1dHJvcGhpbHMsIGNvbnZlcnQgPSAiY3BtIiwgZmlsdGVyID0gVFJVRSwgYmF0Y2ggPSAic3Zhc2VxIikKd3JpdHRlbiA8LSB3cml0ZV94bHN4KAogICAgZXhwcnMoY3BtX2RhdGEpLAogICAgZXhjZWwgPSBnbHVlKCJjcG0vNF9DYWxpL2NfbmV1dHJvcGhpbHNfc3ZhLXZ7dmVyfS54bHN4IikpCnJwa21fZGF0YSA8LSBub3JtYWxpemVfZXhwdChjX25ldXRyb3BoaWxzLCBmaWx0ZXIgPSBUUlVFLCBiYXRjaCA9ICJzdmFzZXEiKSAlPiUKICBub3JtYWxpemVfZXhwdChjb252ZXJ0ID0gInJwa20iLCBjb2x1bW4gPSAibWVhbl9jZHNfbGVuIiwgbmFfdG9femVybyA9IFRSVUUpCndyaXRlLmNzdih4ID0gYXMuZGF0YS5mcmFtZShleHBycyhycGttX2RhdGEpKSwKICAgICAgICAgIGZpbGUgPSBnbHVlKCJycGttL2NfbmV1dHJvcGhpbHNfc3ZhLXZ7dmVyfS5jc3YiKSkKYGBgCgojIyMgQ2FsaSBWaXNpdCAxIHNhbXBsZXMKCmBgYHtyfQpjdjFfc2FtcGxlcyA8LSB0Y3YxX3NhbXBsZXMgJT4lCiAgc3Vic2V0X2V4cHQoc3Vic2V0ID0gImNsaW5pYz09J2NhbGknIikKc2F2ZShsaXN0ID0gImN2MV9zYW1wbGVzIiwgZmlsZSA9IGdsdWUoInJkYS90bXJjM19jdjFfc2FtcGxlcy12e3Zlcn0ucmRhIikpCmRhdGFfc3RydWN0dXJlcyA8LSBjKGRhdGFfc3RydWN0dXJlcywgImN2MV9zYW1wbGVzIikKCmNwbV9kYXRhIDwtIG5vcm1hbGl6ZV9leHB0KGN2MV9zYW1wbGVzLCBjb252ZXJ0ID0gImNwbSIpCndyaXR0ZW4gPC0gd3JpdGVfeGxzeCgKICAgIGV4cHJzKGNwbV9kYXRhKSwKICAgIGV4Y2VsID0gZ2x1ZSgiY3BtLzRfQ2FsaS9jdjFfc2FtcGxlcy12e3Zlcn0ueGxzeCIpKQpycGttX2RhdGEgPC0gbm9ybWFsaXplX2V4cHQoY3YxX3NhbXBsZXMsIGZpbHRlciA9IFRSVUUsIGNvbnZlcnQgPSAicnBrbSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYV90b196ZXJvID0gVFJVRSwgY29sdW1uID0gIm1lYW5fY2RzX2xlbiIpCndyaXRlLmNzdih4ID0gYXMuZGF0YS5mcmFtZShleHBycyhycGttX2RhdGEpKSwKICAgICAgICAgIGZpbGUgPSBnbHVlKCJycGttL2N2MV9zYW1wbGVzLXZ7dmVyfS5jc3YiKSkKY3BtX2RhdGEgPC0gbm9ybWFsaXplX2V4cHQoY3YxX3NhbXBsZXMsIGNvbnZlcnQgPSAgImNwbSIsIGZpbHRlciA9IFRSVUUsIGJhdGNoID0gInN2YXNlcSIpCndyaXR0ZW4gPC0gd3JpdGVfeGxzeCgKICAgIGV4cHJzKGNwbV9kYXRhKSwKICAgIGV4Y2VsID0gZ2x1ZSgiY3BtLzRfQ2FsaS9jdjFfc2FtcGxlc19zdmEtdnt2ZXJ9Lnhsc3giKSkKcnBrbV9kYXRhIDwtIG5vcm1hbGl6ZV9leHB0KGN2MV9zYW1wbGVzLCBmaWx0ZXIgPSBUUlVFLCBiYXRjaCA9ICJzdmFzZXEiKSAlPiUKICBub3JtYWxpemVfZXhwdChjb252ZXJ0ID0gInJwa20iLCBjb2x1bW4gPSAibWVhbl9jZHNfbGVuIiwgbmFfdG9femVybyA9IFRSVUUpCndyaXRlLmNzdih4ID0gYXMuZGF0YS5mcmFtZShleHBycyhycGttX2RhdGEpKSwKICAgICAgICAgIGZpbGUgPSBnbHVlKCJycGttL2N2MV9zYW1wbGVzX3N2YS12e3Zlcn0uY3N2IikpCmBgYAoKIyMjIENhbGkgVmlzaXQgMiBzYW1wbGVzCgpgYGB7cn0KY3YyX3NhbXBsZXMgPC0gdGN2Ml9zYW1wbGVzICU+JQogIHN1YnNldF9leHB0KHN1YnNldCA9ICJjbGluaWM9PSdjYWxpJyIpCnNhdmUobGlzdCA9ICJjdjJfc2FtcGxlcyIsIGZpbGUgPSBnbHVlKCJyZGEvdG1yYzNfY3YyX3NhbXBsZXMtdnt2ZXJ9LnJkYSIpKQpkYXRhX3N0cnVjdHVyZXMgPC0gYyhkYXRhX3N0cnVjdHVyZXMsICJjdjJfc2FtcGxlcyIpCgpjcG1fZGF0YSA8LSBub3JtYWxpemVfZXhwdChjdjJfc2FtcGxlcywgY29udmVydCA9ICJjcG0iKQp3cml0dGVuIDwtIHdyaXRlX3hsc3goCiAgICBleHBycyhjcG1fZGF0YSksCiAgICBleGNlbCA9IGdsdWUoImNwbS80X0NhbGkvY3YyX3NhbXBsZXMtdnt2ZXJ9Lnhsc3giKSkKcnBrbV9kYXRhIDwtIG5vcm1hbGl6ZV9leHB0KGN2Ml9zYW1wbGVzLCBmaWx0ZXIgPSBUUlVFLCBjb252ZXJ0ID0gInJwa20iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFfdG9femVybyA9IFRSVUUsIGNvbHVtbiA9ICJtZWFuX2Nkc19sZW4iKQp3cml0ZS5jc3YoeCA9IGFzLmRhdGEuZnJhbWUoZXhwcnMocnBrbV9kYXRhKSksCiAgICAgICAgICBmaWxlID0gZ2x1ZSgicnBrbS9jdjJfc2FtcGxlcy12e3Zlcn0uY3N2IikpCmNwbV9kYXRhIDwtIG5vcm1hbGl6ZV9leHB0KGN2Ml9zYW1wbGVzLCBjb252ZXJ0ID0gImNwbSIsIGZpbHRlciA9IFRSVUUsIGJhdGNoID0gInN2YXNlcSIpCndyaXR0ZW4gPC0gd3JpdGVfeGxzeCgKICAgIGV4cHJzKGNwbV9kYXRhKSwKICAgIGV4Y2VsID0gZ2x1ZSgiY3BtLzRfQ2FsaS9jdjJfc2FtcGxlc19zdmEtdnt2ZXJ9Lnhsc3giKSkKcnBrbV9kYXRhIDwtIG5vcm1hbGl6ZV9leHB0KGN2Ml9zYW1wbGVzLCBmaWx0ZXIgPSBUUlVFLCBiYXRjaCA9ICJzdmFzZXEiKSAlPiUKICBub3JtYWxpemVfZXhwdChjb252ZXJ0ID0gInJwa20iLCBjb2x1bW4gPSAibWVhbl9jZHNfbGVuIiwgbmFfdG9femVybyA9IFRSVUUpCndyaXRlLmNzdih4ID0gYXMuZGF0YS5mcmFtZShleHBycyhycGttX2RhdGEpKSwKICAgICAgICAgIGZpbGUgPSBnbHVlKCJycGttL2N2Ml9zYW1wbGVzX3N2YS12e3Zlcn0uY3N2IikpCmBgYAoKIyMjIENhbGkgdmlzaXQgMyBzYW1wbGVzCgpgYGB7cn0KY3YzX3NhbXBsZXMgPC0gdGN2M19zYW1wbGVzICU+JQogIHN1YnNldF9leHB0KHN1YnNldCA9ICJjbGluaWM9PSdjYWxpJyIpCnNhdmUobGlzdCA9ICJjdjNfc2FtcGxlcyIsIGZpbGUgPSBnbHVlKCJyZGEvdG1yYzNfY3YzX3NhbXBsZXMtdnt2ZXJ9LnJkYSIpKQpkYXRhX3N0cnVjdHVyZXMgPC0gYyhkYXRhX3N0cnVjdHVyZXMsICJjdjNfc2FtcGxlcyIpCgpjcG1fZGF0YSA8LSBub3JtYWxpemVfZXhwdChjdjNfc2FtcGxlcywgY29udmVydCA9ICJjcG0iKQp3cml0dGVuIDwtIHdyaXRlX3hsc3goCiAgICBleHBycyhjcG1fZGF0YSksCiAgICBleGNlbCA9IGdsdWUoImNwbS80X0NhbGkvY3YzX3NhbXBsZXMtdnt2ZXJ9Lnhsc3giKSkKcnBrbV9kYXRhIDwtIG5vcm1hbGl6ZV9leHB0KGN2M19zYW1wbGVzLCBmaWx0ZXIgPSBUUlVFLCBjb252ZXJ0ID0gInJwa20iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFfdG9femVybyA9IFRSVUUsIGNvbHVtbiA9ICJtZWFuX2Nkc19sZW4iKQp3cml0ZS5jc3YoeCA9IGFzLmRhdGEuZnJhbWUoZXhwcnMocnBrbV9kYXRhKSksCiAgICAgICAgICBmaWxlID0gZ2x1ZSgicnBrbS9jdjNfc2FtcGxlcy12e3Zlcn0uY3N2IikpCmNwbV9kYXRhIDwtIG5vcm1hbGl6ZV9leHB0KGN2M19zYW1wbGVzLCBjb252ZXJ0ID0gImNwbSIsIGZpbHRlciA9IFRSVUUsIGJhdGNoID0gInN2YXNlcSIpCndyaXR0ZW4gPC0gd3JpdGVfeGxzeCgKICAgIGV4cHJzKGNwbV9kYXRhKSwKICAgIGV4Y2VsID0gZ2x1ZSgiY3BtLzRfQ2FsaS9jdjNfc2FtcGxlc19zdmEtdnt2ZXJ9Lnhsc3giKSkKcnBrbV9kYXRhIDwtIG5vcm1hbGl6ZV9leHB0KGN2M19zYW1wbGVzLCBmaWx0ZXIgPSBUUlVFLCBiYXRjaCA9ICJzdmFzZXEiKSAlPiUKICBub3JtYWxpemVfZXhwdChjb252ZXJ0ID0gInJwa20iLCBjb2x1bW4gPSAibWVhbl9jZHNfbGVuIiwgbmFfdG9femVybyA9IFRSVUUpCndyaXRlLmNzdih4ID0gYXMuZGF0YS5mcmFtZShleHBycyhycGttX2RhdGEpKSwKICAgICAgICAgIGZpbGUgPSBnbHVlKCJycGttL2N2M19zYW1wbGVzX3N2YS12e3Zlcn0uY3N2IikpCmBgYAoKIyMjIENhbGkgdmlzaXQgMSBFb3Npbm9waGlscwoKYGBge3J9CmN2MV9lb3Npbm9waGlscyA8LSB0Y3YxX2Vvc2lub3BoaWxzICU+JQogIHN1YnNldF9leHB0KHN1YnNldCA9ICJjbGluaWM9PSdjYWxpJyIpCnNhdmUobGlzdCA9ICJjdjFfZW9zaW5vcGhpbHMiLCBmaWxlID0gZ2x1ZSgicmRhL3RtcmMzX2N2MV9lb3Npbm9waGlscy12e3Zlcn0ucmRhIikpCmRhdGFfc3RydWN0dXJlcyA8LSBjKGRhdGFfc3RydWN0dXJlcywgImN2MV9lb3Npbm9waGlscyIpCgpjcG1fZGF0YSA8LSBub3JtYWxpemVfZXhwdChjdjFfZW9zaW5vcGhpbHMsIGNvbnZlcnQgPSAiY3BtIikKd3JpdHRlbiA8LSB3cml0ZV94bHN4KAogICAgZXhwcnMoY3BtX2RhdGEpLAogICAgZXhjZWwgPSBnbHVlKCJjcG0vNF9DYWxpL2N2MV9lb3Npbm9waGlscy12e3Zlcn0ueGxzeCIpKQpycGttX2RhdGEgPC0gbm9ybWFsaXplX2V4cHQoY3YxX2Vvc2lub3BoaWxzLCBmaWx0ZXIgPSBUUlVFLCBjb252ZXJ0ID0gInJwa20iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFfdG9femVybyA9IFRSVUUsIGNvbHVtbiA9ICJtZWFuX2Nkc19sZW4iKQp3cml0ZS5jc3YoeCA9IGFzLmRhdGEuZnJhbWUoZXhwcnMocnBrbV9kYXRhKSksCiAgICAgICAgICBmaWxlID0gZ2x1ZSgicnBrbS9jdjFfZW9zaW5vcGhpbHMtdnt2ZXJ9LmNzdiIpKQpjcG1fZGF0YSA8LSBub3JtYWxpemVfZXhwdChjdjFfZW9zaW5vcGhpbHMsIGNvbnZlcnQgPSAiY3BtIiwgZmlsdGVyID0gVFJVRSkKd3JpdHRlbiA8LSB3cml0ZV94bHN4KAogICAgZXhwcnMoY3BtX2RhdGEpLAogICAgZXhjZWwgPSBnbHVlKCJjcG0vNF9DYWxpL2N2MV9lb3Npbm9waGlsc19ub3N2YS12e3Zlcn0ueGxzeCIpKQpycGttX2RhdGEgPC0gbm9ybWFsaXplX2V4cHQoY3YxX2Vvc2lub3BoaWxzLCBmaWx0ZXIgPSBUUlVFKSAlPiUKICBub3JtYWxpemVfZXhwdChjb252ZXJ0ID0gInJwa20iLCBjb2x1bW4gPSAibWVhbl9jZHNfbGVuIiwgbmFfdG9femVybyA9IFRSVUUpCndyaXRlLmNzdih4ID0gYXMuZGF0YS5mcmFtZShleHBycyhycGttX2RhdGEpKSwKICAgICAgICAgIGZpbGUgPSBnbHVlKCJycGttL2N2MV9lb3Npbm9waGlsc19ub3N2YS12e3Zlcn0uY3N2IikpCmBgYAoKIyMjIENhbGkgdmlzaXQgMiBzYW1wbGVzCgpgYGB7cn0KY3YyX2Vvc2lub3BoaWxzIDwtIHRjdjJfZW9zaW5vcGhpbHMgJT4lCiAgc3Vic2V0X2V4cHQoc3Vic2V0ID0gImNsaW5pYz09J2NhbGknIikKc2F2ZShsaXN0ID0gImN2Ml9lb3Npbm9waGlscyIsIGZpbGUgPSBnbHVlKCJyZGEvdG1yYzNfY3YyX2Vvc2lub3BoaWxzLXZ7dmVyfS5yZGEiKSkKZGF0YV9zdHJ1Y3R1cmVzIDwtIGMoZGF0YV9zdHJ1Y3R1cmVzLCAiY3YyX2Vvc2lub3BoaWxzIikKCmNwbV9kYXRhIDwtIG5vcm1hbGl6ZV9leHB0KGN2Ml9lb3Npbm9waGlscywgY29udmVydCA9ICJjcG0iKQp3cml0dGVuIDwtIHdyaXRlX3hsc3goCiAgICBleHBycyhjcG1fZGF0YSksCiAgICBleGNlbCA9IGdsdWUoImNwbS80X0NhbGkvY3YyX2Vvc2lub3BoaWxzLXZ7dmVyfS54bHN4IikpCnJwa21fZGF0YSA8LSBub3JtYWxpemVfZXhwdChjdjJfZW9zaW5vcGhpbHMsIGZpbHRlciA9IFRSVUUsIGNvbnZlcnQgPSAicnBrbSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYV90b196ZXJvID0gVFJVRSwgY29sdW1uID0gIm1lYW5fY2RzX2xlbiIpCndyaXRlLmNzdih4ID0gYXMuZGF0YS5mcmFtZShleHBycyhycGttX2RhdGEpKSwKICAgICAgICAgIGZpbGUgPSBnbHVlKCJycGttL2N2Ml9lb3Npbm9waGlscy12e3Zlcn0uY3N2IikpCmNwbV9kYXRhIDwtIG5vcm1hbGl6ZV9leHB0KGN2Ml9lb3Npbm9waGlscywgY29udmVydCA9ICJjcG0iLCBmaWx0ZXIgPSBUUlVFKQp3cml0dGVuIDwtIHdyaXRlX3hsc3goCiAgICBleHBycyhjcG1fZGF0YSksCiAgICBleGNlbCA9IGdsdWUoImNwbS80X0NhbGkvY3YyX2Vvc2lub3BoaWxzX25vc3ZhLXZ7dmVyfS54bHN4IikpCnJwa21fZGF0YSA8LSBub3JtYWxpemVfZXhwdChjdjJfZW9zaW5vcGhpbHMsIGZpbHRlciA9IFRSVUUpICU+JQogIG5vcm1hbGl6ZV9leHB0KGNvbnZlcnQgPSAicnBrbSIsIGNvbHVtbiA9ICJtZWFuX2Nkc19sZW4iLCBuYV90b196ZXJvID0gVFJVRSkKd3JpdGUuY3N2KHggPSBhcy5kYXRhLmZyYW1lKGV4cHJzKHJwa21fZGF0YSkpLAogICAgICAgICAgZmlsZSA9IGdsdWUoInJwa20vY3YyX2Vvc2lub3BoaWxzX25vc3ZhLXZ7dmVyfS5jc3YiKSkKYGBgCgojIyMgQ2FsaSB2aXNpdCAzIGVvc2lub3BoaWwKCmBgYHtyfQpjdjNfZW9zaW5vcGhpbHMgPC0gdGN2M19lb3Npbm9waGlscyAlPiUKICBzdWJzZXRfZXhwdChzdWJzZXQgPSAiY2xpbmljPT0nY2FsaSciKQpzYXZlKGxpc3QgPSAiY3YzX2Vvc2lub3BoaWxzIiwgZmlsZSA9IGdsdWUoInJkYS90bXJjM19jdjNfZW9zaW5vcGhpbHMtdnt2ZXJ9LnJkYSIpKQpkYXRhX3N0cnVjdHVyZXMgPC0gYyhkYXRhX3N0cnVjdHVyZXMsICJjdjNfZW9zaW5vcGhpbHMiKQoKY3BtX2RhdGEgPC0gbm9ybWFsaXplX2V4cHQoY3YzX2Vvc2lub3BoaWxzLCBjb252ZXJ0ID0gImNwbSIpCndyaXR0ZW4gPC0gd3JpdGVfeGxzeCgKICAgIGV4cHJzKGNwbV9kYXRhKSwKICAgIGV4Y2VsID0gZ2x1ZSgiY3BtLzRfQ2FsaS9jdjNfZW9zaW5vcGhpbHMtdnt2ZXJ9Lnhsc3giKSkKcnBrbV9kYXRhIDwtIG5vcm1hbGl6ZV9leHB0KGN2M19lb3Npbm9waGlscywgZmlsdGVyID0gVFJVRSwgY29udmVydCA9ICJycGttIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hX3RvX3plcm8gPSBUUlVFLCBjb2x1bW4gPSAibWVhbl9jZHNfbGVuIikKd3JpdGUuY3N2KHggPSBhcy5kYXRhLmZyYW1lKGV4cHJzKHJwa21fZGF0YSkpLAogICAgICAgICAgZmlsZSA9IGdsdWUoInJwa20vY3YzX2Vvc2lub3BoaWxzLXZ7dmVyfS5jc3YiKSkKY3BtX2RhdGEgPC0gbm9ybWFsaXplX2V4cHQoY3YzX2Vvc2lub3BoaWxzLCBjb252ZXJ0ID0gImNwbSIsIGZpbHRlciA9IFRSVUUpCndyaXR0ZW4gPC0gd3JpdGVfeGxzeCgKICAgIGV4cHJzKGNwbV9kYXRhKSwKICAgIGV4Y2VsID0gZ2x1ZSgiY3BtLzRfQ2FsaS9jdjNfZW9zaW5vcGhpbHNfbm9zdmEtdnt2ZXJ9Lnhsc3giKSkKIyMgTm90ZSwgdGhlIGNiY2IgZmlsdGVyIGxlZnQgYmVoaW5kIGEgc3VmZmljaWVudCBudW1iZXIgb2YgemVyb3MgdGhhdCBpdCBjb25mdXNlZCBjcG0uCnJwa21fZGF0YSA8LSBub3JtYWxpemVfZXhwdChjdjNfZW9zaW5vcGhpbHMsIGZpbHRlciA9ICJzaW1wbGUiKSAlPiUKICBub3JtYWxpemVfZXhwdChjb252ZXJ0ID0gInJwa20iLCBjb2x1bW4gPSAibWVhbl9jZHNfbGVuIiwgbmFfdG9femVybyA9IFRSVUUpCndyaXRlLmNzdih4ID0gYXMuZGF0YS5mcmFtZShleHBycyhycGttX2RhdGEpKSwKICAgICAgICAgIGZpbGUgPSBnbHVlKCJycGttL2N2M19lb3Npbm9waGlsc19ub3N2YS12e3Zlcn0uY3N2IikpCmBgYAoKIyMjIENhbGkgdmlzaXQgMSBtb25vY3l0ZXMKCmBgYHtyfQpjdjFfbW9ub2N5dGVzIDwtIHRjdjFfbW9ub2N5dGVzICU+JQogIHN1YnNldF9leHB0KHN1YnNldCA9ICJjbGluaWM9PSdjYWxpJyIpCnNhdmUobGlzdCA9ICJjdjFfbW9ub2N5dGVzIiwgZmlsZSA9IGdsdWUoInJkYS90bXJjM19jdjFfbW9ub2N5dGVzLXZ7dmVyfS5yZGEiKSkKZGF0YV9zdHJ1Y3R1cmVzIDwtIGMoZGF0YV9zdHJ1Y3R1cmVzLCAiY3YxX21vbm9jeXRlcyIpCgpjcG1fZGF0YSA8LSBub3JtYWxpemVfZXhwdChjdjFfbW9ub2N5dGVzLCBjb252ZXJ0ID0gImNwbSIpCndyaXR0ZW4gPC0gd3JpdGVfeGxzeCgKICAgIGV4cHJzKGNwbV9kYXRhKSwKICAgIGV4Y2VsID0gZ2x1ZSgiY3BtLzRfQ2FsaS9jdjFfbW9ub2N5dGVzLXZ7dmVyfS54bHN4IikpCnJwa21fZGF0YSA8LSBub3JtYWxpemVfZXhwdChjdjFfbW9ub2N5dGVzLCBmaWx0ZXIgPSBUUlVFLCBjb252ZXJ0ID0gInJwa20iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFfdG9femVybyA9IFRSVUUsIGNvbHVtbiA9ICJtZWFuX2Nkc19sZW4iKQp3cml0ZS5jc3YoeCA9IGFzLmRhdGEuZnJhbWUoZXhwcnMocnBrbV9kYXRhKSksCiAgICAgICAgICBmaWxlID0gZ2x1ZSgicnBrbS9jdjFfbW9ub2N5dGVzLXZ7dmVyfS5jc3YiKSkKY3BtX2RhdGEgPC0gbm9ybWFsaXplX2V4cHQoY3YxX21vbm9jeXRlcywgY29udmVydCA9ICJjcG0iLCBmaWx0ZXIgPSBUUlVFLCBiYXRjaCA9ICJzdmFzZXEiKQp3cml0dGVuIDwtIHdyaXRlX3hsc3goCiAgICBleHBycyhjcG1fZGF0YSksCiAgICBleGNlbCA9IGdsdWUoImNwbS80X0NhbGkvY3YxX21vbm9jeXRlc19zdmEtdnt2ZXJ9Lnhsc3giKSkKcnBrbV9kYXRhIDwtIG5vcm1hbGl6ZV9leHB0KGN2MV9tb25vY3l0ZXMsIGZpbHRlciA9IFRSVUUsIGJhdGNoID0gInN2YXNlcSIpICU+JQogIG5vcm1hbGl6ZV9leHB0KGNvbnZlcnQgPSAicnBrbSIsIGNvbHVtbiA9ICJtZWFuX2Nkc19sZW4iLCBuYV90b196ZXJvID0gVFJVRSkKd3JpdGUuY3N2KHggPSBhcy5kYXRhLmZyYW1lKGV4cHJzKHJwa21fZGF0YSkpLAogICAgICAgICAgZmlsZSA9IGdsdWUoInJwa20vY3YxX21vbm9jeXRlc19zdmEtdnt2ZXJ9LmNzdiIpKQpgYGAKCiMjIyBDYWxpIHZpc2l0IDIgbW9ub2N5dGVzCgpgYGB7cn0KY3YyX21vbm9jeXRlcyA8LSB0Y3YyX21vbm9jeXRlcyAlPiUKICBzdWJzZXRfZXhwdChzdWJzZXQgPSAiY2xpbmljPT0nY2FsaSciKQpzYXZlKGxpc3QgPSAiY3YyX21vbm9jeXRlcyIsIGZpbGUgPSBnbHVlKCJyZGEvdG1yYzNfY3YyX21vbm9jeXRlcy12e3Zlcn0ucmRhIikpCmRhdGFfc3RydWN0dXJlcyA8LSBjKGRhdGFfc3RydWN0dXJlcywgImN2Ml9tb25vY3l0ZXMiKQoKY3BtX2RhdGEgPC0gbm9ybWFsaXplX2V4cHQoY3YyX21vbm9jeXRlcywgY29udmVydCA9ICJjcG0iKQp3cml0dGVuIDwtIHdyaXRlX3hsc3goCiAgICBleHBycyhjcG1fZGF0YSksCiAgICBleGNlbCA9IGdsdWUoImNwbS80X0NhbGkvY3YyX21vbm9jeXRlcy12e3Zlcn0ueGxzeCIpKQpycGttX2RhdGEgPC0gbm9ybWFsaXplX2V4cHQoY3YyX21vbm9jeXRlcywgZmlsdGVyID0gVFJVRSwgY29udmVydCA9ICJycGttIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hX3RvX3plcm8gPSBUUlVFLCBjb2x1bW4gPSAibWVhbl9jZHNfbGVuIikKd3JpdGUuY3N2KHggPSBhcy5kYXRhLmZyYW1lKGV4cHJzKHJwa21fZGF0YSkpLAogICAgICAgICAgZmlsZSA9IGdsdWUoInJwa20vY3YyX21vbm9jeXRlcy12e3Zlcn0uY3N2IikpCmNwbV9kYXRhIDwtIG5vcm1hbGl6ZV9leHB0KGN2Ml9tb25vY3l0ZXMsIGNvbnZlcnQgPSAiY3BtIiwgZmlsdGVyID0gVFJVRSwgYmF0Y2ggPSAic3Zhc2VxIikKd3JpdHRlbiA8LSB3cml0ZV94bHN4KAogICAgZXhwcnMoY3BtX2RhdGEpLAogICAgZXhjZWwgPSBnbHVlKCJjcG0vNF9DYWxpL2N2Ml9tb25vY3l0ZXNfc3ZhLXZ7dmVyfS54bHN4IikpCnJwa21fZGF0YSA8LSBub3JtYWxpemVfZXhwdChjdjJfbW9ub2N5dGVzLCBmaWx0ZXIgPSBUUlVFLCBiYXRjaCA9ICJzdmFzZXEiKSAlPiUKICBub3JtYWxpemVfZXhwdChjb252ZXJ0ID0gInJwa20iLCBjb2x1bW4gPSAibWVhbl9jZHNfbGVuIiwgbmFfdG9femVybyA9IFRSVUUpCndyaXRlLmNzdih4ID0gYXMuZGF0YS5mcmFtZShleHBycyhycGttX2RhdGEpKSwKICAgICAgICAgIGZpbGUgPSBnbHVlKCJycGttL2N2Ml9tb25vY3l0ZXNfc3ZhLXZ7dmVyfS5jc3YiKSkKYGBgCgojIyMgQ2FsaSB2aXNpdCAzIG1vbm9jeXRlcwoKYGBge3J9CmN2M19tb25vY3l0ZXMgPC0gdGN2M19tb25vY3l0ZXMgJT4lCiAgc3Vic2V0X2V4cHQoc3Vic2V0ID0gImNsaW5pYz09J2NhbGknIikKc2F2ZShsaXN0ID0gImN2M19tb25vY3l0ZXMiLCBmaWxlID0gZ2x1ZSgicmRhL3RtcmMzX2N2M19tb25vY3l0ZXMtdnt2ZXJ9LnJkYSIpKQpkYXRhX3N0cnVjdHVyZXMgPC0gYyhkYXRhX3N0cnVjdHVyZXMsICJjdjNfbW9ub2N5dGVzIikKCmNwbV9kYXRhIDwtIG5vcm1hbGl6ZV9leHB0KGN2M19tb25vY3l0ZXMsIGNvbnZlcnQgPSAiY3BtIikKd3JpdHRlbiA8LSB3cml0ZV94bHN4KAogICAgZXhwcnMoY3BtX2RhdGEpLAogICAgZXhjZWwgPSBnbHVlKCJjcG0vNF9DYWxpL2N2M19tb25vY3l0ZXMtdnt2ZXJ9Lnhsc3giKSkKcnBrbV9kYXRhIDwtIG5vcm1hbGl6ZV9leHB0KGN2M19tb25vY3l0ZXMsIGZpbHRlciA9IFRSVUUsIGNvbnZlcnQgPSAicnBrbSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYV90b196ZXJvID0gVFJVRSwgY29sdW1uID0gIm1lYW5fY2RzX2xlbiIpCndyaXRlLmNzdih4ID0gYXMuZGF0YS5mcmFtZShleHBycyhycGttX2RhdGEpKSwKICAgICAgICAgIGZpbGUgPSBnbHVlKCJycGttL2N2M19tb25vY3l0ZXMtdnt2ZXJ9LmNzdiIpKQpjcG1fZGF0YSA8LSBub3JtYWxpemVfZXhwdChjdjNfbW9ub2N5dGVzLCBjb252ZXJ0ID0gImNwbSIsIGZpbHRlciA9IFRSVUUsIGJhdGNoID0gInN2YXNlcSIpCndyaXR0ZW4gPC0gd3JpdGVfeGxzeCgKICAgIGV4cHJzKGNwbV9kYXRhKSwKICAgIGV4Y2VsID0gZ2x1ZSgiY3BtLzRfQ2FsaS9jdjNfbW9ub2N5dGVzX3N2YS12e3Zlcn0ueGxzeCIpKQpycGttX2RhdGEgPC0gbm9ybWFsaXplX2V4cHQoY3YzX21vbm9jeXRlcywgZmlsdGVyID0gVFJVRSwgYmF0Y2ggPSAic3Zhc2VxIikgJT4lCiAgbm9ybWFsaXplX2V4cHQoY29udmVydCA9ICJycGttIiwgY29sdW1uID0gIm1lYW5fY2RzX2xlbiIsIG5hX3RvX3plcm8gPSBUUlVFKQp3cml0ZS5jc3YoeCA9IGFzLmRhdGEuZnJhbWUoZXhwcnMocnBrbV9kYXRhKSksCiAgICAgICAgICBmaWxlID0gZ2x1ZSgicnBrbS9jdjNfbW9ub2N5dGVzX3N2YS12e3Zlcn0uY3N2IikpCmBgYAoKIyMjIENhbGkgdmlzaXQgMSBuZXV0cm9waGlscwoKYGBge3J9CmN2MV9uZXV0cm9waGlscyA8LSB0Y3YxX25ldXRyb3BoaWxzICU+JQogIHN1YnNldF9leHB0KHN1YnNldCA9ICJjbGluaWM9PSdjYWxpJyIpCnNhdmUobGlzdCA9ICJjdjFfbmV1dHJvcGhpbHMiLCBmaWxlID0gZ2x1ZSgicmRhL3RtcmMzX2N2MV9uZXV0cm9waGlscy12e3Zlcn0ucmRhIikpCmRhdGFfc3RydWN0dXJlcyA8LSBjKGRhdGFfc3RydWN0dXJlcywgImN2MV9uZXV0cm9waGlscyIpCgpjcG1fZGF0YSA8LSBub3JtYWxpemVfZXhwdChjdjFfbmV1dHJvcGhpbHMsIGNvbnZlcnQgPSAiY3BtIikKd3JpdHRlbiA8LSB3cml0ZV94bHN4KAogICAgZXhwcnMoY3BtX2RhdGEpLAogICAgZXhjZWwgPSBnbHVlKCJjcG0vNF9DYWxpL2N2MV9uZXV0cm9waGlscy12e3Zlcn0ueGxzeCIpKQpycGttX2RhdGEgPC0gbm9ybWFsaXplX2V4cHQoY3YxX25ldXRyb3BoaWxzLCBmaWx0ZXIgPSBUUlVFLCBjb252ZXJ0ID0gInJwa20iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFfdG9femVybyA9IFRSVUUsIGNvbHVtbiA9ICJtZWFuX2Nkc19sZW4iKQp3cml0ZS5jc3YoeCA9IGFzLmRhdGEuZnJhbWUoZXhwcnMocnBrbV9kYXRhKSksCiAgICAgICAgICBmaWxlID0gZ2x1ZSgicnBrbS9jdjFfbmV1dHJvcGhpbHMtdnt2ZXJ9LmNzdiIpKQpjcG1fZGF0YSA8LSBub3JtYWxpemVfZXhwdChjdjFfbmV1dHJvcGhpbHMsIGNvbnZlcnQgPSAiY3BtIiwgZmlsdGVyID0gVFJVRSwgYmF0Y2ggPSAic3Zhc2VxIikKd3JpdHRlbiA8LSB3cml0ZV94bHN4KAogICAgZXhwcnMoY3BtX2RhdGEpLAogICAgZXhjZWwgPSBnbHVlKCJjcG0vNF9DYWxpL2N2MV9uZXV0cm9waGlsc19zdmEtdnt2ZXJ9Lnhsc3giKSkKcnBrbV9kYXRhIDwtIG5vcm1hbGl6ZV9leHB0KGN2MV9uZXV0cm9waGlscywgZmlsdGVyID0gVFJVRSwgYmF0Y2ggPSAic3Zhc2VxIikgJT4lCiAgbm9ybWFsaXplX2V4cHQoY29udmVydCA9ICJycGttIiwgY29sdW1uID0gIm1lYW5fY2RzX2xlbiIsIG5hX3RvX3plcm8gPSBUUlVFKQp3cml0ZS5jc3YoeCA9IGFzLmRhdGEuZnJhbWUoZXhwcnMocnBrbV9kYXRhKSksCiAgICAgICAgICBmaWxlID0gZ2x1ZSgicnBrbS9jdjFfbmV1dHJvcGhpbHNfc3ZhLXZ7dmVyfS5jc3YiKSkKYGBgCgojIyMgQ2FsaSB2aXNpdCAyIG5ldXRyb3BoaWxzCgpgYGB7cn0KY3YyX25ldXRyb3BoaWxzIDwtIHRjdjJfbmV1dHJvcGhpbHMgJT4lCiAgc3Vic2V0X2V4cHQoc3Vic2V0ID0gImNsaW5pYz09J2NhbGknIikKc2F2ZShsaXN0ID0gImN2Ml9uZXV0cm9waGlscyIsIGZpbGUgPSBnbHVlKCJyZGEvdG1yYzNfY3YyX25ldXRyb3BoaWxzLXZ7dmVyfS5yZGEiKSkKZGF0YV9zdHJ1Y3R1cmVzIDwtIGMoZGF0YV9zdHJ1Y3R1cmVzLCAiY3YyX25ldXRyb3BoaWxzIikKCmNwbV9kYXRhIDwtIG5vcm1hbGl6ZV9leHB0KGN2Ml9uZXV0cm9waGlscywgY29udmVydCA9ICJjcG0iKQp3cml0dGVuIDwtIHdyaXRlX3hsc3goCiAgICBleHBycyhjcG1fZGF0YSksCiAgICBleGNlbCA9IGdsdWUoImNwbS80X0NhbGkvY3YyX25ldXRyb3BoaWxzLXZ7dmVyfS54bHN4IikpCnJwa21fZGF0YSA8LSBub3JtYWxpemVfZXhwdChjdjJfbmV1dHJvcGhpbHMsIGZpbHRlciA9IFRSVUUsIGNvbnZlcnQgPSAicnBrbSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYV90b196ZXJvID0gVFJVRSwgY29sdW1uID0gIm1lYW5fY2RzX2xlbiIpCndyaXRlLmNzdih4ID0gYXMuZGF0YS5mcmFtZShleHBycyhycGttX2RhdGEpKSwKICAgICAgICAgIGZpbGUgPSBnbHVlKCJycGttL2N2Ml9uZXV0cm9waGlscy12e3Zlcn0uY3N2IikpCmNwbV9kYXRhIDwtIG5vcm1hbGl6ZV9leHB0KGN2Ml9uZXV0cm9waGlscywgY29udmVydCA9ICJjcG0iLCBmaWx0ZXIgPSBUUlVFLCBiYXRjaCA9ICJzdmFzZXEiKQp3cml0dGVuIDwtIHdyaXRlX3hsc3goCiAgICBleHBycyhjcG1fZGF0YSksCiAgICBleGNlbCA9IGdsdWUoImNwbS80X0NhbGkvY3YyX25ldXRyb3BoaWxzX3N2YS12e3Zlcn0ueGxzeCIpKQpycGttX2RhdGEgPC0gbm9ybWFsaXplX2V4cHQoY3YyX25ldXRyb3BoaWxzLCBmaWx0ZXIgPSBUUlVFLCBiYXRjaCA9ICJzdmFzZXEiKSAlPiUKICBub3JtYWxpemVfZXhwdChjb252ZXJ0ID0gInJwa20iLCBjb2x1bW4gPSAibWVhbl9jZHNfbGVuIiwgbmFfdG9femVybyA9IFRSVUUpCndyaXRlLmNzdih4ID0gYXMuZGF0YS5mcmFtZShleHBycyhycGttX2RhdGEpKSwKICAgICAgICAgIGZpbGUgPSBnbHVlKCJycGttL2N2Ml9uZXV0cm9waGlsc19zdmEtdnt2ZXJ9LmNzdiIpKQpgYGAKCiMjIyBDYWxpIHZpc2l0IDMgbmV1dHJvcGhpbHMKCmBgYHtyfQpjdjNfbmV1dHJvcGhpbHMgPC0gdGN2M19uZXV0cm9waGlscyAlPiUKICBzdWJzZXRfZXhwdChzdWJzZXQgPSAiY2xpbmljPT0nY2FsaSciKQpzYXZlKGxpc3QgPSAiY3YzX25ldXRyb3BoaWxzIiwgZmlsZSA9IGdsdWUoInJkYS90bXJjM19jdjNfbmV1dHJvcGhpbHMtdnt2ZXJ9LnJkYSIpKQpkYXRhX3N0cnVjdHVyZXMgPC0gYyhkYXRhX3N0cnVjdHVyZXMsICJjdjNfbmV1dHJvcGhpbHMiKQoKY3BtX2RhdGEgPC0gbm9ybWFsaXplX2V4cHQoY3YzX25ldXRyb3BoaWxzLCBjb252ZXJ0ID0gImNwbSIpCndyaXR0ZW4gPC0gd3JpdGVfeGxzeCgKICAgIGV4cHJzKGNwbV9kYXRhKSwKICAgIGV4Y2VsID0gZ2x1ZSgiY3BtLzRfQ2FsaS9jdjNfbmV1dHJvcGhpbHMtdnt2ZXJ9Lnhsc3giKSkKcnBrbV9kYXRhIDwtIG5vcm1hbGl6ZV9leHB0KGN2M19uZXV0cm9waGlscywgZmlsdGVyID0gVFJVRSwgY29udmVydCA9ICJycGttIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hX3RvX3plcm8gPSBUUlVFLCBjb2x1bW4gPSAibWVhbl9jZHNfbGVuIikKd3JpdGUuY3N2KHggPSBhcy5kYXRhLmZyYW1lKGV4cHJzKHJwa21fZGF0YSkpLAogICAgICAgICAgZmlsZSA9IGdsdWUoInJwa20vY3YzX25ldXRyb3BoaWxzLXZ7dmVyfS5jc3YiKSkKY3BtX2RhdGEgPC0gbm9ybWFsaXplX2V4cHQoY3YzX25ldXRyb3BoaWxzLCBjb252ZXJ0ID0gImNwbSIsIGZpbHRlciA9IFRSVUUsIGJhdGNoID0gInN2YXNlcSIpCndyaXR0ZW4gPC0gd3JpdGVfeGxzeCgKICAgIGV4cHJzKGNwbV9kYXRhKSwKICAgIGV4Y2VsID0gZ2x1ZSgiY3BtLzRfQ2FsaS9jdjNfbmV1dHJvcGhpbHNfc3ZhLXZ7dmVyfS54bHN4IikpCnJwa21fZGF0YSA8LSBub3JtYWxpemVfZXhwdChjdjNfbmV1dHJvcGhpbHMsIGZpbHRlciA9IFRSVUUsIGJhdGNoID0gInN2YXNlcSIpICU+JQogIG5vcm1hbGl6ZV9leHB0KGNvbnZlcnQgPSAicnBrbSIsIGNvbHVtbiA9ICJtZWFuX2Nkc19sZW4iLCBuYV90b196ZXJvID0gVFJVRSkKd3JpdGUuY3N2KHggPSBhcy5kYXRhLmZyYW1lKGV4cHJzKHJwa21fZGF0YSkpLAogICAgICAgICAgZmlsZSA9IGdsdWUoInJwa20vY3YzX25ldXRyb3BoaWxzX3N2YS12e3Zlcn0uY3N2IikpCmBgYAoKIyMjIFR1bWFjbyBjb21wYXJlIHZpc2l0cwoKSXMgdGhpcyByZWR1bmRhbnQ/CgpgYGB7cn0KdGNfdmlzaXQgPC0gc2V0X2V4cHRfY29uZGl0aW9ucygKICB0Y19jbGluaWNhbCwgZmFjdCA9ICJ2aXNpdG51bWJlciIsIGNvbG9ycyA9IGNvbG9yX2Nob2ljZXNbWyJ2aXNpdDIiXV0pICU+JQogIHNldF9leHB0X2JhdGNoZXMoZmFjdCA9ICJmaW5hbG91dGNvbWUiKSAlPiUKICBzdWJzZXRfZXhwdChzdWJzZXQgPSAidHlwZW9mY2VsbHMhPSdiaW9wc3knIikKc2F2ZShsaXN0ID0gInRjX3Zpc2l0IiwgZmlsZSA9IGdsdWUoInJkYS90bXJjM190Y192aXNpdC12e3Zlcn0ucmRhIikpCmRhdGFfc3RydWN0dXJlcyA8LSBjKGRhdGFfc3RydWN0dXJlcywgInRjX3Zpc2l0IikKCnRjX3YxdnMgPC0gdGNfdmlzaXQKcERhdGEodGNfdjF2cylbWyJ2aXNpdCJdXSA8LSBhcy5jaGFyYWN0ZXIocERhdGEodGNfdjF2cylbWyJ2aXNpdG51bWJlciJdXSkKdjFfc2FtcGxlcyA8LSBwRGF0YSh0Y192MXZzKVtbInZpc2l0Il1dID09ICIxIgpwRGF0YSh0Y192MXZzKVt2MV9zYW1wbGVzLCAidmlzaXQiXSA8LSAiZmlyc3QiCnBEYXRhKHRjX3YxdnMpWyF2MV9zYW1wbGVzLCAidmlzaXQiXSA8LSAibGF0ZXIiCnBEYXRhKHRjX3YxdnMpW1sidmlzaXQiXV0gPC0gYXMuZmFjdG9yKHBEYXRhKHRjX3YxdnMpW1sidmlzaXQiXV0pCnRjX3YxdnMgPC0gc2V0X2V4cHRfY29uZGl0aW9ucygKICB0Y192MXZzLCBmYWN0ID0gInZpc2l0IiwgY29sb3JzID0gY29sb3JfY2hvaWNlc1tbInR3b192aXNpdHMiXV0pCnNhdmUobGlzdCA9ICJ0Y192MXZzIiwgZmlsZSA9IGdsdWUoInJkYS90bXJjM190Y192MXZzLXZ7dmVyfS5yZGEiKSkKZGF0YV9zdHJ1Y3R1cmVzIDwtIGMoZGF0YV9zdHJ1Y3R1cmVzLCAidGNfdjF2cyIpCnRfdjF2cyA8LSBzdWJzZXRfZXhwdCh0Y192MXZzLCBzdWJzZXQgPSAiY2xpbmljID09ICd0dW1hY28nIikKc2F2ZShsaXN0ID0gInRfdjF2cyIsIGZpbGUgPSBnbHVlKCJyZGEvdG1yYzNfdF92MXZzLXZ7dmVyfS5yZGEiKSkKZGF0YV9zdHJ1Y3R1cmVzIDwtIGMoZGF0YV9zdHJ1Y3R1cmVzLCAidF92MXZzIikKCnRfdmlzaXQgPC0gc2V0X2V4cHRfY29uZGl0aW9ucygKICB0X2NsaW5pY2FsLCBmYWN0ID0gInZpc2l0bnVtYmVyIiwgY29sb3JzID0gY29sb3JfY2hvaWNlc1tbInZpc2l0MiJdXSkgJT4lCiAgc2V0X2V4cHRfYmF0Y2hlcyhmYWN0ID0gImZpbmFsb3V0Y29tZSIpICU+JQogIHN1YnNldF9leHB0KHN1YnNldCA9ICJ0eXBlb2ZjZWxscyE9J2Jpb3BzeSciKQpzYXZlKGxpc3QgPSAidF92aXNpdCIsIGZpbGUgPSBnbHVlKCJyZGEvdG1yYzNfdF92aXNpdC12e3Zlcn0ucmRhIikpCmRhdGFfc3RydWN0dXJlcyA8LSBjKGRhdGFfc3RydWN0dXJlcywgInRfdmlzaXQiKQpjcG1fZGF0YSA8LSBub3JtYWxpemVfZXhwdCh0X3Zpc2l0LCBjb252ZXJ0ID0gImNwbSIpCndyaXR0ZW4gPC0gd3JpdGVfeGxzeCgKICAgIGV4cHJzKGNwbV9kYXRhKSwKICAgIGV4Y2VsID0gZ2x1ZSgiY3BtLzRfVHVtYWNvL3RfdmlzaXQtdnt2ZXJ9Lnhsc3giKSkKY3BtX2RhdGEgPC0gbm9ybWFsaXplX2V4cHQodF92aXNpdCwgY29udmVydCA9ICJjcG0iLCBmaWx0ZXIgPSBUUlVFLCBiYXRjaCA9ICJzdmFzZXEiKQp3cml0dGVuIDwtIHdyaXRlX3hsc3goCiAgICBleHBycyhjcG1fZGF0YSksCiAgICBleGNlbCA9IGdsdWUoImNwbS80X1R1bWFjby90X3Zpc2l0X3N2YS12e3Zlcn0ueGxzeCIpKQpgYGAKCiMjIyBWaXNpdCBjdXJlL2ZhaWwgY29udHJhc3RzCgpgYGB7cn0KdmlzaXRfY2ZfZXhwdF9mYWN0b3IgPC0gcGFzdGUwKCJ2IiwgcERhdGEodF9jbGluaWNhbClbWyJ2aXNpdG51bWJlciJdXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhKHRfY2xpbmljYWwpW1siZmluYWxvdXRjb21lIl1dKQp0X3Zpc2l0Y2YgPC0gc2V0X2V4cHRfY29uZGl0aW9ucyh0X2NsaW5pY2FsLCBmYWN0ID0gdmlzaXRfY2ZfZXhwdF9mYWN0b3IpCnNhdmUobGlzdCA9ICJ0X3Zpc2l0Y2YiLCBmaWxlID0gZ2x1ZSgicmRhL3RtcmMzX3RfdmlzaXRjZi12e3Zlcn0ucmRhIikpCmRhdGFfc3RydWN0dXJlcyA8LSBjKGRhdGFfc3RydWN0dXJlcywgInRfdmlzaXRjZiIpCgp0X3Zpc2l0Y2ZfZW9zaW5vcGhpbCA8LSBzdWJzZXRfZXhwdCh0X3Zpc2l0Y2YsIHN1YnNldCA9ICJ0eXBlb2ZjZWxscz09J2Vvc2lub3BoaWxzJyIpCnNhdmUobGlzdCA9ICJ0X3Zpc2l0Y2ZfZW9zaW5vcGhpbCIsIGZpbGUgPSBnbHVlKCJyZGEvdG1yYzNfdF92aXNpdGNmX2Vvc2lub3BoaWwtdnt2ZXJ9LnJkYSIpKQpkYXRhX3N0cnVjdHVyZXMgPC0gYyhkYXRhX3N0cnVjdHVyZXMsICJ0X3Zpc2l0Y2ZfZW9zaW5vcGhpbCIpCgp0X3Zpc2l0Y2ZfbW9ub2N5dGUgPC0gc3Vic2V0X2V4cHQodF92aXNpdGNmLCBzdWJzZXQgPSAidHlwZW9mY2VsbHM9PSdtb25vY3l0ZXMnIikKc2F2ZShsaXN0ID0gInRfdmlzaXRjZl9tb25vY3l0ZSIsIGZpbGUgPSBnbHVlKCJyZGEvdG1yYzNfdF92aXNpdGNmX21vbm9jeXRlLXZ7dmVyfS5yZGEiKSkKZGF0YV9zdHJ1Y3R1cmVzIDwtIGMoZGF0YV9zdHJ1Y3R1cmVzLCAidF92aXNpdGNmX21vbm9jeXRlIikKCnRfdmlzaXRjZl9uZXV0cm9waGlsIDwtIHN1YnNldF9leHB0KHRfdmlzaXRjZiwgc3Vic2V0ID0gInR5cGVvZmNlbGxzPT0nbmV1dHJvcGhpbHMnIikKc2F2ZShsaXN0ID0gInRfdmlzaXRjZl9uZXV0cm9waGlsIiwgZmlsZSA9IGdsdWUoInJkYS90bXJjM190X3Zpc2l0Y2ZfbmV1dHJvcGhpbC12e3Zlcn0ucmRhIikpCmRhdGFfc3RydWN0dXJlcyA8LSBjKGRhdGFfc3RydWN0dXJlcywgInRfdmlzaXRjZl9uZXV0cm9waGlsIikKYGBgCgojIyMgQ2FsaSBjb21wYXJlIHZpc2l0cwoKSXMgdGhpcyByZWR1bmRhbnQ/CgpgYGB7cn0KY192aXNpdCA8LSBzZXRfZXhwdF9jb25kaXRpb25zKGNfY2xpbmljYWwsIGZhY3QgPSAidmlzaXRudW1iZXIiKSAlPiUKICBzZXRfZXhwdF9iYXRjaGVzKGZhY3QgPSAiZmluYWxvdXRjb21lIikgJT4lCiAgc3Vic2V0X2V4cHQoc3Vic2V0ID0gInR5cGVvZmNlbGxzIT0nYmlvcHN5JyIpCnNhdmUobGlzdCA9ICJjX3Zpc2l0IiwgZmlsZSA9IGdsdWUoInJkYS90bXJjM19jX3Zpc2l0LXZ7dmVyfS5yZGEiKSkKZGF0YV9zdHJ1Y3R1cmVzIDwtIGMoZGF0YV9zdHJ1Y3R1cmVzLCAiY192aXNpdCIpCgpjcG1fZGF0YSA8LSBub3JtYWxpemVfZXhwdChjX3Zpc2l0LCBjb252ZXJ0ID0gImNwbSIpCndyaXR0ZW4gPC0gd3JpdGVfeGxzeCgKICAgIGV4cHJzKGNwbV9kYXRhKSwKICAgIGV4Y2VsID0gZ2x1ZSgiY3BtLzRfVHVtYWNvL2NfdmlzaXQtdnt2ZXJ9Lnhsc3giKSkKY3BtX2RhdGEgPC0gbm9ybWFsaXplX2V4cHQoY192aXNpdCwgY29udmVydCA9ICJjcG0iLCBmaWx0ZXIgPSBUUlVFLCBiYXRjaCA9ICJzdmFzZXEiKQp3cml0dGVuIDwtIHdyaXRlX3hsc3goCiAgICBleHBycyhjcG1fZGF0YSksCiAgICBleGNlbCA9IGdsdWUoImNwbS80X0NhbGkvY192aXNpdF9zdmEtdnt2ZXJ9Lnhsc3giKSkKYGBgCgojIyMgVmlzaXQgY3VyZS9mYWlsIGNvbnRyYXN0cwoKYGBge3J9CnZpc2l0X2NmX2V4cHRfZmFjdG9yIDwtIHBhc3RlMCgidiIsIHBEYXRhKGNfY2xpbmljYWwpW1sidmlzaXRudW1iZXIiXV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YShjX2NsaW5pY2FsKVtbImZpbmFsb3V0Y29tZSJdXSkKY192aXNpdGNmIDwtIHNldF9leHB0X2NvbmRpdGlvbnMoY19jbGluaWNhbCwgZmFjdCA9IHZpc2l0X2NmX2V4cHRfZmFjdG9yKQpzYXZlKGxpc3QgPSAiY192aXNpdGNmIiwgZmlsZSA9IGdsdWUoInJkYS90bXJjM19jX3Zpc2l0Y2Ytdnt2ZXJ9LnJkYSIpKQpkYXRhX3N0cnVjdHVyZXMgPC0gYyhkYXRhX3N0cnVjdHVyZXMsICJjX3Zpc2l0Y2YiKQoKY192aXNpdGNmX2Vvc2lub3BoaWwgPC0gc3Vic2V0X2V4cHQoY192aXNpdGNmLCBzdWJzZXQgPSAidHlwZW9mY2VsbHM9PSdlb3Npbm9waGlscyciKQpzYXZlKGxpc3QgPSAiY192aXNpdGNmX2Vvc2lub3BoaWwiLCBmaWxlID0gZ2x1ZSgicmRhL3RtcmMzX2NfdmlzaXRjZl9lb3Npbm9waGlsLXZ7dmVyfS5yZGEiKSkKZGF0YV9zdHJ1Y3R1cmVzIDwtIGMoZGF0YV9zdHJ1Y3R1cmVzLCAiY192aXNpdGNmX2Vvc2lub3BoaWwiKQoKY192aXNpdGNmX21vbm9jeXRlIDwtIHN1YnNldF9leHB0KGNfdmlzaXRjZiwgc3Vic2V0ID0gInR5cGVvZmNlbGxzPT0nbW9ub2N5dGVzJyIpCnNhdmUobGlzdCA9ICJjX3Zpc2l0Y2ZfbW9ub2N5dGUiLCBmaWxlID0gZ2x1ZSgicmRhL3RtcmMzX2NfdmlzaXRjZl9tb25vY3l0ZS12e3Zlcn0ucmRhIikpCmRhdGFfc3RydWN0dXJlcyA8LSBjKGRhdGFfc3RydWN0dXJlcywgImNfdmlzaXRjZl9tb25vY3l0ZSIpCgpjX3Zpc2l0Y2ZfbmV1dHJvcGhpbCA8LSBzdWJzZXRfZXhwdChjX3Zpc2l0Y2YsIHN1YnNldCA9ICJ0eXBlb2ZjZWxscz09J25ldXRyb3BoaWxzJyIpCnNhdmUobGlzdCA9ICJjX3Zpc2l0Y2ZfbmV1dHJvcGhpbCIsIGZpbGUgPSBnbHVlKCJyZGEvdG1yYzNfY192aXNpdGNmX25ldXRyb3BoaWwtdnt2ZXJ9LnJkYSIpKQpkYXRhX3N0cnVjdHVyZXMgPC0gYyhkYXRhX3N0cnVjdHVyZXMsICJjX3Zpc2l0Y2ZfbmV1dHJvcGhpbCIpCmBgYAoKIyBTdW1tYXJpemU6IFRhYnVsYXRlIHNhbXBsZSBudW1iZXJzCgojIyBCb3RoCgpgYGB7cn0KbmNvbChleHBycyh0Y19jbGluaWNhbCkpCnN1bShwRGF0YSh0Y19jbGluaWNhbClbWyJmaW5hbG91dGNvbWUiXV0gPT0gImN1cmUiKQpzdW0ocERhdGEodGNfY2xpbmljYWwpW1siZmluYWxvdXRjb21lIl1dID09ICJmYWlsdXJlIikKCmFsbF90eXBlc1tbImJpb3BzeSJdXQpzdW0ocERhdGEodGNfYmlvcHNpZXMpW1siZmluYWxvdXRjb21lIl1dID09ICJjdXJlIikKc3VtKHBEYXRhKHRjX2Jpb3BzaWVzKVtbImZpbmFsb3V0Y29tZSJdXSA9PSAiZmFpbHVyZSIpCgphbGxfdHlwZXNbWyJlb3Npbm9waGlscyJdXQpzdW0ocERhdGEodGNfZW9zaW5vcGhpbHMpW1siZmluYWxvdXRjb21lIl1dID09ICJjdXJlIikKc3VtKHBEYXRhKHRjX2Vvc2lub3BoaWxzKVtbImZpbmFsb3V0Y29tZSJdXSA9PSAiZmFpbHVyZSIpCgpucm93KHBEYXRhKHRjdjFfZW9zaW5vcGhpbHMpKQpzdW0ocERhdGEodGN2MV9lb3Npbm9waGlscylbWyJmaW5hbG91dGNvbWUiXV0gPT0gImN1cmUiKQpzdW0ocERhdGEodGN2MV9lb3Npbm9waGlscylbWyJmaW5hbG91dGNvbWUiXV0gPT0gImZhaWx1cmUiKQoKbnJvdyhwRGF0YSh0Y3YyX2Vvc2lub3BoaWxzKSkKc3VtKHBEYXRhKHRjdjJfZW9zaW5vcGhpbHMpW1siZmluYWxvdXRjb21lIl1dID09ICJjdXJlIikKc3VtKHBEYXRhKHRjdjJfZW9zaW5vcGhpbHMpW1siZmluYWxvdXRjb21lIl1dID09ICJmYWlsdXJlIikKCm5yb3cocERhdGEodGN2M19lb3Npbm9waGlscykpCnN1bShwRGF0YSh0Y3YzX2Vvc2lub3BoaWxzKVtbImZpbmFsb3V0Y29tZSJdXSA9PSAiY3VyZSIpCnN1bShwRGF0YSh0Y3YzX2Vvc2lub3BoaWxzKVtbImZpbmFsb3V0Y29tZSJdXSA9PSAiZmFpbHVyZSIpCgphbGxfdHlwZXNbWyJtb25vY3l0ZXMiXV0Kc3VtKHBEYXRhKHRjX21vbm9jeXRlcylbWyJmaW5hbG91dGNvbWUiXV0gPT0gImN1cmUiKQpzdW0ocERhdGEodGNfbW9ub2N5dGVzKVtbImZpbmFsb3V0Y29tZSJdXSA9PSAiZmFpbHVyZSIpCgpucm93KHBEYXRhKHRjdjFfbW9ub2N5dGVzKSkKc3VtKHBEYXRhKHRjdjFfbW9ub2N5dGVzKVtbImZpbmFsb3V0Y29tZSJdXSA9PSAiY3VyZSIpCnN1bShwRGF0YSh0Y3YxX21vbm9jeXRlcylbWyJmaW5hbG91dGNvbWUiXV0gPT0gImZhaWx1cmUiKQoKbnJvdyhwRGF0YSh0Y3YyX21vbm9jeXRlcykpCnN1bShwRGF0YSh0Y3YyX21vbm9jeXRlcylbWyJmaW5hbG91dGNvbWUiXV0gPT0gImN1cmUiKQpzdW0ocERhdGEodGN2Ml9tb25vY3l0ZXMpW1siZmluYWxvdXRjb21lIl1dID09ICJmYWlsdXJlIikKCm5yb3cocERhdGEodGN2M19tb25vY3l0ZXMpKQpzdW0ocERhdGEodGN2M19tb25vY3l0ZXMpW1siZmluYWxvdXRjb21lIl1dID09ICJjdXJlIikKc3VtKHBEYXRhKHRjdjNfbW9ub2N5dGVzKVtbImZpbmFsb3V0Y29tZSJdXSA9PSAiZmFpbHVyZSIpCgphbGxfdHlwZXNbWyJuZXV0cm9waGlscyJdXQpzdW0ocERhdGEodGNfbmV1dHJvcGhpbHMpW1siZmluYWxvdXRjb21lIl1dID09ICJjdXJlIikKc3VtKHBEYXRhKHRjX25ldXRyb3BoaWxzKVtbImZpbmFsb3V0Y29tZSJdXSA9PSAiZmFpbHVyZSIpCgpucm93KHBEYXRhKHRjdjFfbmV1dHJvcGhpbHMpKQpzdW0ocERhdGEodGN2MV9uZXV0cm9waGlscylbWyJmaW5hbG91dGNvbWUiXV0gPT0gImN1cmUiKQpzdW0ocERhdGEodGN2MV9uZXV0cm9waGlscylbWyJmaW5hbG91dGNvbWUiXV0gPT0gImZhaWx1cmUiKQoKbnJvdyhwRGF0YSh0Y3YyX21vbm9jeXRlcykpCnN1bShwRGF0YSh0Y3YyX25ldXRyb3BoaWxzKVtbImZpbmFsb3V0Y29tZSJdXSA9PSAiY3VyZSIpCnN1bShwRGF0YSh0Y3YyX25ldXRyb3BoaWxzKVtbImZpbmFsb3V0Y29tZSJdXSA9PSAiZmFpbHVyZSIpCgpucm93KHBEYXRhKHRjdjNfbmV1dHJvcGhpbHMpKQpzdW0ocERhdGEodGN2M19uZXV0cm9waGlscylbWyJmaW5hbG91dGNvbWUiXV0gPT0gImN1cmUiKQpzdW0ocERhdGEodGN2M19uZXV0cm9waGlscylbWyJmaW5hbG91dGNvbWUiXV0gPT0gImZhaWx1cmUiKQpgYGAKCiMjIFR1bWFjbwoKSGVyZSBpcyBhbiBvdXRsaW5lIG9mIHRoZSBzYW1wbGVzIGluIHRoZWlyIGN1cnJlbnQgc3RhdGU6CgpgYGB7cn0KbmNvbChleHBycyh0X2NsaW5pY2FsKSkKc3VtKHBEYXRhKHRfY2xpbmljYWwpW1siZmluYWxvdXRjb21lIl1dID09ICJjdXJlIikKc3VtKHBEYXRhKHRfY2xpbmljYWwpW1siZmluYWxvdXRjb21lIl1dID09ICJmYWlsdXJlIikKCmFsbF90eXBlc1tbImJpb3BzeSJdXQpzdW0ocERhdGEodF9iaW9wc2llcylbWyJmaW5hbG91dGNvbWUiXV0gPT0gImN1cmUiKQpzdW0ocERhdGEodF9iaW9wc2llcylbWyJmaW5hbG91dGNvbWUiXV0gPT0gImZhaWx1cmUiKQoKYWxsX3R5cGVzW1siZW9zaW5vcGhpbHMiXV0Kc3VtKHBEYXRhKHRfZW9zaW5vcGhpbHMpW1siZmluYWxvdXRjb21lIl1dID09ICJjdXJlIikKc3VtKHBEYXRhKHRfZW9zaW5vcGhpbHMpW1siZmluYWxvdXRjb21lIl1dID09ICJmYWlsdXJlIikKCm5yb3cocERhdGEodHYxX2Vvc2lub3BoaWxzKSkKc3VtKHBEYXRhKHR2MV9lb3Npbm9waGlscylbWyJmaW5hbG91dGNvbWUiXV0gPT0gImN1cmUiKQpzdW0ocERhdGEodHYxX2Vvc2lub3BoaWxzKVtbImZpbmFsb3V0Y29tZSJdXSA9PSAiZmFpbHVyZSIpCgpucm93KHBEYXRhKHR2Ml9lb3Npbm9waGlscykpCnN1bShwRGF0YSh0djJfZW9zaW5vcGhpbHMpW1siZmluYWxvdXRjb21lIl1dID09ICJjdXJlIikKc3VtKHBEYXRhKHR2Ml9lb3Npbm9waGlscylbWyJmaW5hbG91dGNvbWUiXV0gPT0gImZhaWx1cmUiKQoKbnJvdyhwRGF0YSh0djNfZW9zaW5vcGhpbHMpKQpzdW0ocERhdGEodHYzX2Vvc2lub3BoaWxzKVtbImZpbmFsb3V0Y29tZSJdXSA9PSAiY3VyZSIpCnN1bShwRGF0YSh0djNfZW9zaW5vcGhpbHMpW1siZmluYWxvdXRjb21lIl1dID09ICJmYWlsdXJlIikKCmFsbF90eXBlc1tbIm1vbm9jeXRlcyJdXQpzdW0ocERhdGEodF9tb25vY3l0ZXMpW1siZmluYWxvdXRjb21lIl1dID09ICJjdXJlIikKc3VtKHBEYXRhKHRfbW9ub2N5dGVzKVtbImZpbmFsb3V0Y29tZSJdXSA9PSAiZmFpbHVyZSIpCgpucm93KHBEYXRhKHR2MV9tb25vY3l0ZXMpKQpzdW0ocERhdGEodHYxX21vbm9jeXRlcylbWyJmaW5hbG91dGNvbWUiXV0gPT0gImN1cmUiKQpzdW0ocERhdGEodHYxX21vbm9jeXRlcylbWyJmaW5hbG91dGNvbWUiXV0gPT0gImZhaWx1cmUiKQoKbnJvdyhwRGF0YSh0djJfbW9ub2N5dGVzKSkKc3VtKHBEYXRhKHR2Ml9tb25vY3l0ZXMpW1siZmluYWxvdXRjb21lIl1dID09ICJjdXJlIikKc3VtKHBEYXRhKHR2Ml9tb25vY3l0ZXMpW1siZmluYWxvdXRjb21lIl1dID09ICJmYWlsdXJlIikKCm5yb3cocERhdGEodHYzX21vbm9jeXRlcykpCnN1bShwRGF0YSh0djNfbW9ub2N5dGVzKVtbImZpbmFsb3V0Y29tZSJdXSA9PSAiY3VyZSIpCnN1bShwRGF0YSh0djNfbW9ub2N5dGVzKVtbImZpbmFsb3V0Y29tZSJdXSA9PSAiZmFpbHVyZSIpCgphbGxfdHlwZXNbWyJuZXV0cm9waGlscyJdXQpzdW0ocERhdGEodF9uZXV0cm9waGlscylbWyJmaW5hbG91dGNvbWUiXV0gPT0gImN1cmUiKQpzdW0ocERhdGEodF9uZXV0cm9waGlscylbWyJmaW5hbG91dGNvbWUiXV0gPT0gImZhaWx1cmUiKQoKbnJvdyhwRGF0YSh0djFfbmV1dHJvcGhpbHMpKQpzdW0ocERhdGEodHYxX25ldXRyb3BoaWxzKVtbImZpbmFsb3V0Y29tZSJdXSA9PSAiY3VyZSIpCnN1bShwRGF0YSh0djFfbmV1dHJvcGhpbHMpW1siZmluYWxvdXRjb21lIl1dID09ICJmYWlsdXJlIikKCm5yb3cocERhdGEodHYyX21vbm9jeXRlcykpCnN1bShwRGF0YSh0djJfbmV1dHJvcGhpbHMpW1siZmluYWxvdXRjb21lIl1dID09ICJjdXJlIikKc3VtKHBEYXRhKHR2Ml9uZXV0cm9waGlscylbWyJmaW5hbG91dGNvbWUiXV0gPT0gImZhaWx1cmUiKQoKbnJvdyhwRGF0YSh0djNfbmV1dHJvcGhpbHMpKQpzdW0ocERhdGEodHYzX25ldXRyb3BoaWxzKVtbImZpbmFsb3V0Y29tZSJdXSA9PSAiY3VyZSIpCnN1bShwRGF0YSh0djNfbmV1dHJvcGhpbHMpW1siZmluYWxvdXRjb21lIl1dID09ICJmYWlsdXJlIikKYGBgCgojIyBDYWxpCgpgYGB7cn0KbmNvbChleHBycyhjX2NsaW5pY2FsKSkKc3VtKHBEYXRhKGNfY2xpbmljYWwpW1siZmluYWxvdXRjb21lIl1dID09ICJjdXJlIikKc3VtKHBEYXRhKGNfY2xpbmljYWwpW1siZmluYWxvdXRjb21lIl1dID09ICJmYWlsdXJlIikKCiNhbGxfdHlwZXNbWyJiaW9wc3kiXV0Kc3VtKHBEYXRhKGNfYmlvcHNpZXMpW1siZmluYWxvdXRjb21lIl1dID09ICJjdXJlIikKc3VtKHBEYXRhKGNfYmlvcHNpZXMpW1siZmluYWxvdXRjb21lIl1dID09ICJmYWlsdXJlIikKCiNhbGxfdHlwZXNbWyJlb3Npbm9waGlscyJdXQpzdW0ocERhdGEoY19lb3Npbm9waGlscylbWyJmaW5hbG91dGNvbWUiXV0gPT0gImN1cmUiKQpzdW0ocERhdGEoY19lb3Npbm9waGlscylbWyJmaW5hbG91dGNvbWUiXV0gPT0gImZhaWx1cmUiKQoKbnJvdyhwRGF0YShjdjFfZW9zaW5vcGhpbHMpKQpzdW0ocERhdGEoY3YxX2Vvc2lub3BoaWxzKVtbImZpbmFsb3V0Y29tZSJdXSA9PSAiY3VyZSIpCnN1bShwRGF0YShjdjFfZW9zaW5vcGhpbHMpW1siZmluYWxvdXRjb21lIl1dID09ICJmYWlsdXJlIikKCm5yb3cocERhdGEoY3YyX2Vvc2lub3BoaWxzKSkKc3VtKHBEYXRhKGN2Ml9lb3Npbm9waGlscylbWyJmaW5hbG91dGNvbWUiXV0gPT0gImN1cmUiKQpzdW0ocERhdGEoY3YyX2Vvc2lub3BoaWxzKVtbImZpbmFsb3V0Y29tZSJdXSA9PSAiZmFpbHVyZSIpCgpucm93KHBEYXRhKGN2M19lb3Npbm9waGlscykpCnN1bShwRGF0YShjdjNfZW9zaW5vcGhpbHMpW1siZmluYWxvdXRjb21lIl1dID09ICJjdXJlIikKc3VtKHBEYXRhKGN2M19lb3Npbm9waGlscylbWyJmaW5hbG91dGNvbWUiXV0gPT0gImZhaWx1cmUiKQoKI2FsbF90eXBlc1tbIm1vbm9jeXRlcyJdXQpzdW0ocERhdGEoY19tb25vY3l0ZXMpW1siZmluYWxvdXRjb21lIl1dID09ICJjdXJlIikKc3VtKHBEYXRhKGNfbW9ub2N5dGVzKVtbImZpbmFsb3V0Y29tZSJdXSA9PSAiZmFpbHVyZSIpCgpucm93KHBEYXRhKGN2MV9tb25vY3l0ZXMpKQpzdW0ocERhdGEoY3YxX21vbm9jeXRlcylbWyJmaW5hbG91dGNvbWUiXV0gPT0gImN1cmUiKQpzdW0ocERhdGEoY3YxX21vbm9jeXRlcylbWyJmaW5hbG91dGNvbWUiXV0gPT0gImZhaWx1cmUiKQoKbnJvdyhwRGF0YShjdjJfbW9ub2N5dGVzKSkKc3VtKHBEYXRhKGN2Ml9tb25vY3l0ZXMpW1siZmluYWxvdXRjb21lIl1dID09ICJjdXJlIikKc3VtKHBEYXRhKGN2Ml9tb25vY3l0ZXMpW1siZmluYWxvdXRjb21lIl1dID09ICJmYWlsdXJlIikKCm5yb3cocERhdGEoY3YzX21vbm9jeXRlcykpCnN1bShwRGF0YShjdjNfbW9ub2N5dGVzKVtbImZpbmFsb3V0Y29tZSJdXSA9PSAiY3VyZSIpCnN1bShwRGF0YShjdjNfbW9ub2N5dGVzKVtbImZpbmFsb3V0Y29tZSJdXSA9PSAiZmFpbHVyZSIpCgojYWxsX3R5cGVzW1sibmV1dHJvcGhpbHMiXV0Kc3VtKHBEYXRhKGNfbmV1dHJvcGhpbHMpW1siZmluYWxvdXRjb21lIl1dID09ICJjdXJlIikKc3VtKHBEYXRhKGNfbmV1dHJvcGhpbHMpW1siZmluYWxvdXRjb21lIl1dID09ICJmYWlsdXJlIikKCm5yb3cocERhdGEoY3YxX25ldXRyb3BoaWxzKSkKc3VtKHBEYXRhKGN2MV9uZXV0cm9waGlscylbWyJmaW5hbG91dGNvbWUiXV0gPT0gImN1cmUiKQpzdW0ocERhdGEoY3YxX25ldXRyb3BoaWxzKVtbImZpbmFsb3V0Y29tZSJdXSA9PSAiZmFpbHVyZSIpCgpucm93KHBEYXRhKGN2Ml9tb25vY3l0ZXMpKQpzdW0ocERhdGEoY3YyX25ldXRyb3BoaWxzKVtbImZpbmFsb3V0Y29tZSJdXSA9PSAiY3VyZSIpCnN1bShwRGF0YShjdjJfbmV1dHJvcGhpbHMpW1siZmluYWxvdXRjb21lIl1dID09ICJmYWlsdXJlIikKCm5yb3cocERhdGEoY3YzX25ldXRyb3BoaWxzKSkKc3VtKHBEYXRhKGN2M19uZXV0cm9waGlscylbWyJmaW5hbG91dGNvbWUiXV0gPT0gImN1cmUiKQpzdW0ocERhdGEoY3YzX25ldXRyb3BoaWxzKVtbImZpbmFsb3V0Y29tZSJdXSA9PSAiZmFpbHVyZSIpCmBgYAoKIyBBbiBleHRlcm5hbCBkYXRhc2V0CgpPbmUgcG90ZW50aWFsbHkgaW50ZXJlc3RpbmcgY29tcGFyaXNvbnMgcG9pbnQsIGVzcGVjaWFsbHkgdmlzIGEgdmlzCnRoZSBCaW9wc3kgc2FtcGxlcywgaXMgdG8gY29tcGFyZSB3aXRoIGFub3RoZXIgc2V0IG9mIHJlY2VudApMLiBicmF6aWxpZW5zaXMgaW5mZWN0ZWQgYmlvcHN5IHNhbXBsZXMuICBUaGUgZm9sbG93aW5nIHNldHMgdXAgYW4KZXhwcmVzc2lvbnNldCB1c2luZyB0aGUgcmF3IGRhdGEgZnJvbSBiaW9wcm9qZWN0IFBSSk5BNTI1NjA0LgoKTm90ZSAyMDI0MDk6IEkganVzdCBhZGRlZCB0aGUgc2NvdHQgdHN2IG1ldGFkYXRhIHRvIHRoaXMgY29udGFpbmVyIGFuZAp0aHVzIHRvIHRoaXMgZGF0YSBzdHJ1Y3R1cmU7IHRoaXMgb25seSB3b3JrcyBiZWNhdXNlIHRoZSBzYW1wbGVzIGFyZQpuaWNlbHkgaW4gdGhlIHNhbWUgb3JkZXIuCgpgYGB7cn0KbmV3X3NhbXBsZV9zaGVldCA8LSBzbSgKICBzdXBwcmVzc1dhcm5pbmdzKGdhdGhlcl9wcmVwcm9jZXNzaW5nX21ldGFkYXRhKAogICAgInNhbXBsZV9zaGVldHMvc2NvdHRfc3JhX3NhbXBsZXMueGxzeCIsIHNwZWNpZmljYXRpb24gPSBtYWtlX3JuYXNlcV9zcGVjKCkpKSkKc2NvdHRfbWV0YWRhdGEgPC0gYXMuZGF0YS5mcmFtZShyZWFkcjo6cmVhZF90c3YoInNhbXBsZV9zaGVldHMvc2NvdHRfY2Fwc3VsZV9zdHVkeWRlc2lnbi50c3YiKSkKbmV3X21ldGEgPC0gY2JpbmQuZGF0YS5mcmFtZShuZXdfc2FtcGxlX3NoZWV0W1sibmV3X21ldGEiXV0sIHNjb3R0X21ldGFkYXRhKQoKZXh0ZXJuYWxfY2YgPC0gY3JlYXRlX2V4cHQobmV3X21ldGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVfaW5mbyA9IGhzX2Fubm90LCBmaWxlX2NvbHVtbiA9ICJoaXNhdF9jb3VudF90YWJsZSIpICU+JQogIHNldF9leHB0X2NvbmRpdGlvbnMoZmFjdCA9ICJ0cmVhdG1lbnRfb3V0Y29tZSIpICU+JQogICAgc2V0X2V4cHRfYmF0Y2hlcyhmYWN0ID0gInNleCIpICU+JQogICAgc3Vic2V0X2V4cHQoc3Vic2V0ID0gImNvbmRpdGlvbiE9J25hJyIpCnBEYXRhKGV4dGVybmFsX2NmKVtbIlBhcmFzaXRlU3BlY2llcyJdXSA8LSAibHZicmF6aWxpZW5zaXMiCnNhdmUobGlzdCA9ICJleHRlcm5hbF9jZiIsIGZpbGUgPSBnbHVlKCJyZGEvdG1yYzNfZXh0ZXJuYWxfY2Ytdnt2ZXJ9LnJkYSIpKQpkYXRhX3N0cnVjdHVyZXMgPC0gYyhkYXRhX3N0cnVjdHVyZXMsICJleHRlcm5hbF9jZiIpCgpiaW9wc3lfY2YgPC0gc2V0X2V4cHRfY29uZGl0aW9ucyh0Y19iaW9wc2llcywgZmFjdCA9ICJmaW5hbG91dGNvbWUiKQpwRGF0YShiaW9wc3lfY2YpW1sibGFiIl1dIDwtICJDb2xvbWJpYSIKcERhdGEoZXh0ZXJuYWxfY2YpW1sibGFiIl1dIDwtICJCcmF6aWwiCnBEYXRhKGV4dGVybmFsX2NmKVtbImZpbmFsb3V0Y29tZSJdXSA8LSBwRGF0YShleHRlcm5hbF9jZilbWyJ0cmVhdG1lbnRvdXRjb21lIl1dCgp0bXJjM19leHRlcm5hbCA8LSBjb21iaW5lX2V4cHRzKGV4dGVybmFsX2NmLCBiaW9wc3lfY2YpICU+JQogIHNldF9leHB0X2NvbmRpdGlvbnMoZmFjdCA9ICJsYWIiLCBjb2xvcnMgPSBjb2xvcl9jaG9pY2VzW1sibGFicyJdXSkgJT4lCiAgc2V0X2V4cHRfYmF0Y2hlcyhmYWN0ID0gImZpbmFsb3V0Y29tZSIpCgpzYXZlKGxpc3QgPSAidG1yYzNfZXh0ZXJuYWwiLCBmaWxlID0gZ2x1ZSgicmRhL3RtcmMzX2V4dGVybmFsLXZ7dmVyfS5yZGEiKSkKZGF0YV9zdHJ1Y3R1cmVzIDwtIGMoZGF0YV9zdHJ1Y3R1cmVzLCAidG1yYzNfZXh0ZXJuYWwiKQoKdG1yYzNfZXh0ZXJuYWxfc3BlY2llcyA8LSBzZXRfZXhwdF9jb25kaXRpb25zKAogIHRtcmMzX2V4dGVybmFsLCBmYWN0ID0gIlBhcmFzaXRlU3BlY2llcyIsIGNvbG9ycyA9IGNvbG9yX2Nob2ljZXNbWyJwYXJhc2l0ZSJdXSkgJT4lCiAgc2V0X2V4cHRfYmF0Y2hlcyhmYWN0ID0gImxhYiIpCnNhdmUobGlzdCA9ICJ0bXJjM19leHRlcm5hbF9zcGVjaWVzIiwgZmlsZSA9IGdsdWUoInJkYS90bXJjM19leHRlcm5hbF9zZXBjaWVzLXZ7dmVyfS5yZGEiKSkKZGF0YV9zdHJ1Y3R1cmVzIDwtIGMoZGF0YV9zdHJ1Y3R1cmVzLCAidG1yYzNfZXh0ZXJuYWxfc3BlY2llcyIpCgojIyBJbiBteSBzaW5ndWxhcml0eSBjb250YWluZXIsIHRoaXMgZmFpbHMgd2l0aCBhIHB0aHJlYWQgcHJvYmxlbSwgbm90IGRvaW5nIHF1YW50IGhlcmUuCiN0dCA8LSBub3JtYWxpemVfZXhwdCh0bXJjM19leHRlcm5hbF9zcGVjaWVzLCBmaWx0ZXIgPSBUUlVFLCB0cmFuc2Zvcm0gPSAibG9nMiIsCiMgICAgICAgICAgICAgICAgICAgICBjb252ZXJ0ID0gImNwbSIsIG5vcm0gPSAicXVhbnQiKQp0dCA8LSBub3JtYWxpemVfZXhwdCh0bXJjM19leHRlcm5hbF9zcGVjaWVzLCBmaWx0ZXIgPSBUUlVFLCB0cmFuc2Zvcm0gPSAibG9nMiIsCiAgICAgICAgICAgICAgICAgICAgIGNvbnZlcnQgPSAiY3BtIiwgbm9ybSA9ICJ0bW0iKQpwbG90X3BjYSh0dCkKCmNvbmZ1c2VkIDwtIHNldF9leHB0X2NvbmRpdGlvbnMoCiAgaHNfZXhwdCwgZmFjdCA9ICJQYXJhc2l0ZVNwZWNpZXMiLCBjb2xvcnMgPSBjb2xvcl9jaG9pY2VzW1sicGFyYXNpdGUiXV0pCmBgYAoKIyMgRXRobmljaXR5CgpgYGB7ciB0X2V0bmlhX2V4cHR9CnRjX2V0bmlhX2V4cHQgPC0gc2V0X2V4cHRfY29uZGl0aW9ucygKICB0Y19jbGluaWNhbCwgZmFjdCA9ICJldG5pYSIsIGNvbG9ycyA9IGNvbG9yX2Nob2ljZXNbWyJldGhuaWNpdHkiXV0pCnNhdmUobGlzdCA9ICJ0Y19ldG5pYV9leHB0IiwgZmlsZSA9IGdsdWUoInJkYS90bXJjM190Y19ldG5pYS12e3Zlcn0ucmRhIikpCmRhdGFfc3RydWN0dXJlcyA8LSBjKGRhdGFfc3RydWN0dXJlcywgInRjX2V0bmlhX2V4cHQiKQoKdF9ldG5pYV9leHB0IDwtIHNldF9leHB0X2NvbmRpdGlvbnMoCiAgdF9jbGluaWNhbCwgZmFjdCA9ICJldG5pYSIsIGNvbG9ycyA9IGNvbG9yX2Nob2ljZXNbWyJldGhuaWNpdHkiXV0pCnNhdmUobGlzdCA9ICJ0X2V0bmlhX2V4cHQiLCBmaWxlID0gZ2x1ZSgicmRhL3RtcmMzX3RfZXRuaWEtdnt2ZXJ9LnJkYSIpKQpkYXRhX3N0cnVjdHVyZXMgPC0gYyhkYXRhX3N0cnVjdHVyZXMsICJ0X2V0bmlhX2V4cHQiKQpgYGAKCiMgQnJpbmcgYmFjayB0aGUgcGFyYXNpdGVzCgpoYWhhIEkga25ldyBJIHNob3VsZCBub3QgaGF2ZSByZW1vdmVkIHRoZSBmb2xsb3dpbmcgYmxvY2suICBJbgpwcmV2aW91cyBpdGVyYXRpb25zIG9mIHRoaXMgSSBpbmNsdWRlZCBhIGRhdGFzdHJ1Y3R1cmUgd2hpY2ggcHVsbGVkIGluCnRoZSBwYXJhc2l0ZSByZWFkcyBmcm9tIGFsbCBzYW1wbGVzIHdpdGggJ3N1ZmZpY2llbnQnIGNvdmVyYWdlLiAgVGhpcwppcyBub3QgdmVyeSBtYW55IHNhbXBsZXMsIGZvciB0aGUgc2ltcGxlIHJlYXNvbiB0aGF0IHRoZSBkcnVnCnRyZWF0bWVudCBiYXNpY2FsbHkgd29ya3MhICBBcyBhIHJlc3VsdCwgd2UgcmVtb3ZlZCB0aGUgZm9sbG93aW5nCnNlY3Rpb24gZnJvbSB0aGUgY29udGFpbmVyIChhbHNvIGZvciBzcGFjZSkuICBPaCwgSSBtYXkgbmVlZCB0byBjb3B5CnNvbWUgbW9yZSBjb3VudCB0YWJsZXMgaW50byB0aGUgY29udGFpbmVyIHJlY2lwZSBmb3IgdGhpcyB0byB3b3JrLgoKSXQgc2hvdWxkIGJlIG5vdGVkIChpZiBhbnlvbmUgZXZlciByZWFkcyB0aGlzKSwgdGhhdCBJIGFsc28gZGlkIGEKdmVyc2lvbiBvZiBhbGwgb2YgdGhlc2UgYW5hbHlzZXMgd2hlcmUgSSBleHBsaWNpdGx5IG1hZGUgYQpjb25jYXRlbmF0ZWQgZGF0YWJhc2UgKGdlbm9tZS9nZmYvQ0RTKSBvZiBodW1hbiBhbmQgcGFyYXNpdGUKcmVmZXJlbmNlcyAoZS5nLiBmb3Igc2FsbW9uL2hpc2F0L2J3YS9ldGMpIGFuZCBkaWQgYWxsIG9mIHRoaXMgdXNpbmcKaXQgaW4gb3JkZXIgdG8gc2F0aXNmeSBteXNlbGYgdGhhdCB0aGUgdmFyaW91cyB0cmVhdG1lbnRzIGFyZSBzaW1pbGFyCmVub3VnaCB0byBiZSBjYWxsZWQgdGhlIHNhbWUgKEkganVzdCBzYXcgdGhhdCBibG9jayB3aGlsZSBodW50aW5nIGZvcgp0aGlzIHBhcmFzaXRlIGRhdGEgYW5kIHRob3VnaHQgaXQgd2FzIHdvcnRoIG5vdGluZykuCgpJbiBhbnkgZXZlbnQsIHRoZSBmb2xsb3dpbmcgaXMgY29weS9wYXN0ZWQgZnJvbSBteSB3b3JraW5nIHRyZWU6CgojIyBEYXRhc2V0OiBQYXJhc2l0ZSByZWFkcwoKTWFrZSBhbiBleHByZXNzaW9uc2V0IG9mIHRoZSBwYXJhc2l0ZSByZWFkcyBpbiB0aGUgVE1SQzMgc2FtcGxlcyBhbmQKZGlzdGluZ3Vpc2ggYmV0d2VlbiB0aGUgZmF1eCBhbmQgcmVhbCByZWFkcy4KRS5nOiBBcmUgdGhlcmUgc2FtcGxlcyB3aGljaCBkZWZpbml0aXZlbHkgY29udGFpbiBwYXJhc2l0ZXM/CgpMYXRlciwgSSBtYW51YWxseSB3ZW50IHRocm91Z2ggdGhlIG1hcHBpbmdzIG9mIHNhbXBsZXMgd2l0aCBhCnNpZ25pZmljYW50IG51bWJlciBvZiBwYXJhc2l0ZSByZWFkcyBpbiBJR1Ygd2l0aCBzb21lIFRNUkMyIGtub3duCnp5bW9kZW1lIHNhbXBsZXMuICBJbiBtYW55IGNhc2VzIGl0IGlzIHBvc3NpYmxlIHRvIHN0YXRlIGRlZmluaXRpdmVseQp0aGUgY2xhc3NpZmljYXRpb24gb2YgdGhlIHBhcmFzaXRlIHdoaWNoIGluZmVjdGVkIGFuIGluZGl2aWR1YWwuCgpOb3RlOiBJIGFtIHJlbmFtaW5nIHRoZSByZXN1bHRpbmcgZGF0YSBzdHJ1Y3R1cmVzIGEgbGl0dGxlIGJlY2F1c2Ugd2UKZ2VuZXJhbGx5IGRvIG5vdCBjYWxsIHRoaW5ncyAndG1yYzIvdG1yYzMvZXRjJyBpbiB0aGUgY29udGFpbmVyLgoKYGBge3J9CmxwX2V4cHQgPC0gY3JlYXRlX2V4cHQoCiAgc2FtcGxlc2hlZXQsCiAgZmlsZV9jb2x1bW4gPSAibHBhbmFtZW5zaXNfdjM2aGlzYXRfZmlsZSIsIGdlbmVfaW5mbyA9IGFsbF9scF9hbm5vdCkgJT4lCiAgc3Vic2V0X2V4cHQoY292ZXJhZ2UgPSAzMDAwMCkgJT4lCiAgc3Vic2V0X2V4cHQobm9uemVybyA9IDMwMDApICU+JQogIHNldF9leHB0X2NvbmRpdGlvbnMoZmFjdCA9ICJ0eXBlb2ZjZWxscyIpICU+JQogIHN1YnNldF9leHB0KHN1YnNldCA9ICJjbGluaWMhPSd1bmRlZmluZWQnIikgJT4lCiAgc2FuaXRpemVfZXhwdF9wRGF0YSgiZmluYWxvdXRjb21lIikKCnZpc2l0X2ZhY3QgPC0gcERhdGEobHBfZXhwdClbWyJ2aXNpdG51bWJlciJdXQpiYXRjaF9uYSA8LSBpcy5uYSh2aXNpdF9mYWN0KQp2aXNpdF9mYWN0W2JhdGNoX25hXSA8LSAidW5kZWZpbmVkIgpscF9leHB0IDwtIHNldF9leHB0X2JhdGNoZXMobHBfZXhwdCwgZmFjdCA9IHZpc2l0X2ZhY3QpCgpzYXZlKGxpc3QgPSAibHBfZXhwdCIsIGZpbGUgPSBnbHVlKCJyZGEvbHBfZXhwdF9hbGxfc2FuaXRpemVkLXZ7dmVyfS5yZGEiKSkKZGF0YV9zdHJ1Y3R1cmVzIDwtIGMoZGF0YV9zdHJ1Y3R1cmVzLCAibHBfZXhwdCIpCmBgYAoKVGhlIGFib3ZlIGJsb2NrIGlzIHNpbWlsYXIgaW4gY29uY2VwdCB0byB0aGUgcHJldmlvdXMgZXhwcmVzc2lvbnNldApjcmVhdGlvbi4gIEl0IHVzZXMgYSBkaWZmZXJlbnQgY29sdW1uIGFuZCBjdXJyZW50bHkgaWdub3JlcyB0aGUgZ2VuZQphbm5vdGF0aW9ucy4gIEdpdmVuIHRoYXQgbWFueSBvZiB0aGUgc2FtcGxlcyBoYXZlIGVzc2VudGlhbGx5IDAgcmVhZHMsCkkgc2V0IGEgY3V0b2ZmIG9mIG9ubHkgMjAgb2JzZXJ2ZWQgZ2VuZXMuICBGaW5hbGx5LCBJIGRpZCBhIHF1aWNrIGFuZApkaXJ0eSBQQ0EgcGxvdCBvZiB0aGlzIHBlY3VsaWFyIGRhdGEgc3RydWN0dXJlIGluIHRoZSBob3BlcyBvZiBiZWluZwphYmxlIHRvICdzZWUnIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gd2hhdCBhcmUgYXNzdW1lZCB0byBiZSAncmVhbCcKc2FtcGxlcyB3aXRoIGEgc2lnbmlmaWNhbnQgbnVtYmVyIG9mICdyZWFsJyBwYXJhc2l0ZSByZWFkcyB2cy4gdGhvc2UKc2FtcGxlcyB3aGljaCBqdXN0IGhhdmUgYSBjb3VwbGUgb2YgcG90ZW50aWFsbHkgc3B1cmlvdXMgcmVhZHMuCgojIFNhdmUgYWxsIGRhdGEgc3RydWN0dXJlcyBpbnRvIG9uZSBiaWcgcGlsZQoKYGBge3J9CmZvdW5kX2lkeCA8LSBkYXRhX3N0cnVjdHVyZXMgJWluJSBscygpCmlmIChzdW0oIWZvdW5kX2lkeCkgPiAwKSB7CiAgbm90X2ZvdW5kIDwtIGRhdGFfc3RydWN0dXJlc1shZm91bmRfaWR4XQogIHdhcm5pbmcoIlNvbWUgZGF0YXN0cnVjdHVyZXMgd2VyZSBub3QgZ2VuZXJhdGVkOiAiLCB0b1N0cmluZyhub3RfZm91bmQpLCAiLiIpCiAgZGF0YV9zdHJ1Y3R1cmVzIDwtIGRhdGFfc3RydWN0dXJlc1tmb3VuZF9pZHhdCn0Kc2F2ZShsaXN0ID0gZGF0YV9zdHJ1Y3R1cmVzLCBmaWxlID0gZ2x1ZSgicmRhL3RtcmMzX2RhdGFfc3RydWN0dXJlcy12e3Zlcn0ucmRhIikpCmBgYAoKYGBge3J9CnBhbmRlcjo6cGFuZGVyKHNlc3Npb25JbmZvKCkpCm1lc3NhZ2UoIlRoaXMgaXMgaHBnbHRvb2xzIGNvbW1pdDogIiwgZ2V0X2dpdF9jb21taXQoKSkKbWVzc2FnZSgiU2F2aW5nIHRvICIsIHNhdmVmaWxlKQojIHRtcCA8LSBzbShzYXZlbWUoZmlsZW5hbWUgPSBzYXZlZmlsZSkpCmBgYAoKYGBge3IsIGV2YWw9RkFMU0V9CnRtcCA8LSBsb2FkbWUoZmlsZW5hbWUgPSBzYXZlZmlsZSkKYGBgCgojIEJpYmxpb2dyYXBoeQo=