1 Gather annotation data

Lets get a set of core shared genes among the three main species: L. major, L.mexicana, and L.panamensis. I am not sure how I want to deal with multi-copy genes yet.

meta <- EuPathDB::download_eupath_metadata(webservice="tritrypdb")
lm_entry <- EuPathDB::get_eupath_entry(species="Leishmania major", metadata=meta)
## Found the following hits: Leishmania major Friedlin, Leishmania major LV39c5, Leishmania major SD75.1, choosing the first.
## Using: Leishmania major Friedlin.
lp_entry <- EuPathDB::get_eupath_entry(species="Leishmania panamensis", metadata=meta)
## Found the following hits: Leishmania panamensis MHOMCOL81L13, Leishmania panamensis MHOMPA94PSC1, choosing the first.
## Using: Leishmania panamensis MHOMCOL81L13.
lmex_entry <- EuPathDB::get_eupath_entry(species="Leishmania mexicana", metadata=meta)
## Found: Leishmania mexicana MHOMGT2001U1103
lama_entry <- EuPathDB::get_eupath_entry(species="Leishmania amazonensis", metadata=meta)
## Found: Leishmania amazonensis MHOMBR71973M2269
lb_entry <- EuPathDB::get_eupath_entry(species="2904", metadata=meta)
## Found the following hits: Leishmania braziliensis MHOMBR75M2904, Leishmania braziliensis MHOMBR75M2904_2019, choosing the first.
## Using: Leishmania braziliensis MHOMBR75M2904.
##lm_db <- EuPathDB::make_eupath_orgdb(entry=lm_entry, installp=TRUE, reinstall=TRUE, overwrite=TRUE)
lm_db <- EuPathDB::make_eupath_orgdb(entry=lm_entry)
## Starting creation of org.Lmajor.Friedlin.v50.eg.db.
## [WARN] API request failed for Leishmania major Friedlin (code = 422):
## Warning in warn(sprintf("API request failed for %s (code = 422): ",
## entry[["Taxon"]])): API request failed for Leishmania major Friedlin (code =
## 422):
## [WARN] API request failed for Leishmania major Friedlin (code = 422):
## Warning in warn(sprintf("API request failed for %s (code = 422): ",
## entry[["Taxon"]])): API request failed for Leishmania major Friedlin (code =
## 422):
## [WARN] API request failed for Leishmania major Friedlin (code = 422):
## Warning in warn(sprintf("API request failed for %s (code = 422): ",
## entry[["Taxon"]])): API request failed for Leishmania major Friedlin (code =
## 422):
## [WARN] API request failed for Leishmania major Friedlin (code = 422):
## Warning in warn(sprintf("API request failed for %s (code = 422): ",
## entry[["Taxon"]])): API request failed for Leishmania major Friedlin (code =
## 422):
## [WARN] API request failed for Leishmania major Friedlin (code = 422):
## Warning in warn(sprintf("API request failed for %s (code = 422): ",
## entry[["Taxon"]])): API request failed for Leishmania major Friedlin (code =
## 422):
## [WARN] API request failed for Leishmania major Friedlin (code = 422):
## Warning in warn(sprintf("API request failed for %s (code = 422): ",
## entry[["Taxon"]])): API request failed for Leishmania major Friedlin (code =
## 422):
## Setting NA to numeric.
## Error in if (names(x)[nc] == "") names(x)[nc] <- paste0("V", nc) : 
##   missing value where TRUE/FALSE needed
## Warning in EuPathDB::make_eupath_orgdb(entry = lm_entry): Unable to create an
## orgdb for this species.
##lmex_db <- EuPathDB::make_eupath_orgdb(entry=lmex_entry, installp=TRUE, reinstall=TRUE, overwrite=TRUE)
lmex_db <- EuPathDB::make_eupath_orgdb(entry=lmex_entry)
## Starting creation of org.Lmexicana.MHOMGT2001U1103.v50.eg.db.
## [WARN] API request failed for Leishmania mexicana MHOMGT2001U1103 (code = 422):
## Warning in warn(sprintf("API request failed for %s (code = 422): ",
## entry[["Taxon"]])): API request failed for Leishmania mexicana MHOMGT2001U1103
## (code = 422):
## [WARN] API request failed for Leishmania mexicana MHOMGT2001U1103 (code = 422):
## Warning in warn(sprintf("API request failed for %s (code = 422): ",
## entry[["Taxon"]])): API request failed for Leishmania mexicana MHOMGT2001U1103
## (code = 422):
## [WARN] API request failed for Leishmania mexicana MHOMGT2001U1103 (code = 422):
## Warning in warn(sprintf("API request failed for %s (code = 422): ",
## entry[["Taxon"]])): API request failed for Leishmania mexicana MHOMGT2001U1103
## (code = 422):
## [WARN] API request failed for Leishmania mexicana MHOMGT2001U1103 (code = 422):
## Warning in warn(sprintf("API request failed for %s (code = 422): ",
## entry[["Taxon"]])): API request failed for Leishmania mexicana MHOMGT2001U1103
## (code = 422):
## [WARN] API request failed for Leishmania mexicana MHOMGT2001U1103 (code = 422):
## Warning in warn(sprintf("API request failed for %s (code = 422): ",
## entry[["Taxon"]])): API request failed for Leishmania mexicana MHOMGT2001U1103
## (code = 422):
## [WARN] API request failed for Leishmania mexicana MHOMGT2001U1103 (code = 422):
## Warning in warn(sprintf("API request failed for %s (code = 422): ",
## entry[["Taxon"]])): API request failed for Leishmania mexicana MHOMGT2001U1103
## (code = 422):
## Setting NA to numeric.
## Error in if (names(x)[nc] == "") names(x)[nc] <- paste0("V", nc) : 
##   missing value where TRUE/FALSE needed
## Warning in EuPathDB::make_eupath_orgdb(entry = lmex_entry): Unable to create an
## orgdb for this species.
##lp_db <- EuPathDB::make_eupath_orgdb(entry=lp_entry, installp=TRUE, reinstall=TRUE, overwrite=TRUE)
lp_db <- EuPathDB::make_eupath_orgdb(entry=lp_entry)
## Starting creation of org.Lpanamensis.MHOMCOL81L13.v50.eg.db.
## [WARN] API request failed for Leishmania panamensis MHOMCOL81L13 (code = 422):
## Warning in warn(sprintf("API request failed for %s (code = 422): ",
## entry[["Taxon"]])): API request failed for Leishmania panamensis MHOMCOL81L13
## (code = 422):
## [WARN] API request failed for Leishmania panamensis MHOMCOL81L13 (code = 422):
## Warning in warn(sprintf("API request failed for %s (code = 422): ",
## entry[["Taxon"]])): API request failed for Leishmania panamensis MHOMCOL81L13
## (code = 422):
## [WARN] API request failed for Leishmania panamensis MHOMCOL81L13 (code = 422):
## Warning in warn(sprintf("API request failed for %s (code = 422): ",
## entry[["Taxon"]])): API request failed for Leishmania panamensis MHOMCOL81L13
## (code = 422):
## [WARN] API request failed for Leishmania panamensis MHOMCOL81L13 (code = 422):
## Warning in warn(sprintf("API request failed for %s (code = 422): ",
## entry[["Taxon"]])): API request failed for Leishmania panamensis MHOMCOL81L13
## (code = 422):
## [WARN] API request failed for Leishmania panamensis MHOMCOL81L13 (code = 422):
## Warning in warn(sprintf("API request failed for %s (code = 422): ",
## entry[["Taxon"]])): API request failed for Leishmania panamensis MHOMCOL81L13
## (code = 422):
## [WARN] API request failed for Leishmania panamensis MHOMCOL81L13 (code = 422):
## Warning in warn(sprintf("API request failed for %s (code = 422): ",
## entry[["Taxon"]])): API request failed for Leishmania panamensis MHOMCOL81L13
## (code = 422):
## Setting NA to numeric.
## Error in if (names(x)[nc] == "") names(x)[nc] <- paste0("V", nc) : 
##   missing value where TRUE/FALSE needed
## Warning in EuPathDB::make_eupath_orgdb(entry = lp_entry): Unable to create an
## orgdb for this species.
##la_db <- EuPathDB::make_eupath_orgdb(entry=lama_entry, installp=TRUE, reinstall=TRUE, overwrite=TRUE)
la_db <- EuPathDB::make_eupath_orgdb(entry=lama_entry)
## Starting creation of org.Lamazonensis.MHOMBR71973M2269.v50.eg.db.
## [WARN] API request failed for Leishmania amazonensis MHOMBR71973M2269 (code = 422):
## Warning in warn(sprintf("API request failed for %s (code = 422): ",
## entry[["Taxon"]])): API request failed for Leishmania amazonensis
## MHOMBR71973M2269 (code = 422):
## [WARN] API request failed for Leishmania amazonensis MHOMBR71973M2269 (code = 422):
## Warning in warn(sprintf("API request failed for %s (code = 422): ",
## entry[["Taxon"]])): API request failed for Leishmania amazonensis
## MHOMBR71973M2269 (code = 422):
## [WARN] API request failed for Leishmania amazonensis MHOMBR71973M2269 (code = 422):
## Warning in warn(sprintf("API request failed for %s (code = 422): ",
## entry[["Taxon"]])): API request failed for Leishmania amazonensis
## MHOMBR71973M2269 (code = 422):
## [WARN] API request failed for Leishmania amazonensis MHOMBR71973M2269 (code = 422):
## Warning in warn(sprintf("API request failed for %s (code = 422): ",
## entry[["Taxon"]])): API request failed for Leishmania amazonensis
## MHOMBR71973M2269 (code = 422):
## [WARN] API request failed for Leishmania amazonensis MHOMBR71973M2269 (code = 422):
## Warning in warn(sprintf("API request failed for %s (code = 422): ",
## entry[["Taxon"]])): API request failed for Leishmania amazonensis
## MHOMBR71973M2269 (code = 422):
## [WARN] API request failed for Leishmania amazonensis MHOMBR71973M2269 (code = 422):
## Warning in warn(sprintf("API request failed for %s (code = 422): ",
## entry[["Taxon"]])): API request failed for Leishmania amazonensis
## MHOMBR71973M2269 (code = 422):
## Setting NA to numeric.
## Error in if (names(x)[nc] == "") names(x)[nc] <- paste0("V", nc) : 
##   missing value where TRUE/FALSE needed
## Warning in EuPathDB::make_eupath_orgdb(entry = lama_entry): Unable to create an
## orgdb for this species.
##lb_db <- EuPathDB::make_eupath_orgdb(entry=lb_entry, installp=TRUE, reinstall=TRUE, overwrite=TRUE)
lb_db <- EuPathDB::make_eupath_orgdb(entry=lb_entry)
## Starting creation of org.Lbraziliensis.MHOMBR75M2904.v50.eg.db.
## [WARN] API request failed for Leishmania braziliensis MHOMBR75M2904 (code = 422):
## Warning in warn(sprintf("API request failed for %s (code = 422): ",
## entry[["Taxon"]])): API request failed for Leishmania braziliensis MHOMBR75M2904
## (code = 422):
## [WARN] API request failed for Leishmania braziliensis MHOMBR75M2904 (code = 422):
## Warning in warn(sprintf("API request failed for %s (code = 422): ",
## entry[["Taxon"]])): API request failed for Leishmania braziliensis MHOMBR75M2904
## (code = 422):
## [WARN] API request failed for Leishmania braziliensis MHOMBR75M2904 (code = 422):
## Warning in warn(sprintf("API request failed for %s (code = 422): ",
## entry[["Taxon"]])): API request failed for Leishmania braziliensis MHOMBR75M2904
## (code = 422):
## [WARN] API request failed for Leishmania braziliensis MHOMBR75M2904 (code = 422):
## Warning in warn(sprintf("API request failed for %s (code = 422): ",
## entry[["Taxon"]])): API request failed for Leishmania braziliensis MHOMBR75M2904
## (code = 422):
## [WARN] API request failed for Leishmania braziliensis MHOMBR75M2904 (code = 422):
## Warning in warn(sprintf("API request failed for %s (code = 422): ",
## entry[["Taxon"]])): API request failed for Leishmania braziliensis MHOMBR75M2904
## (code = 422):
## [WARN] API request failed for Leishmania braziliensis MHOMBR75M2904 (code = 422):
## Warning in warn(sprintf("API request failed for %s (code = 422): ",
## entry[["Taxon"]])): API request failed for Leishmania braziliensis MHOMBR75M2904
## (code = 422):
## Setting NA to numeric.
## Error in if (names(x)[nc] == "") names(x)[nc] <- paste0("V", nc) : 
##   missing value where TRUE/FALSE needed
## Warning in EuPathDB::make_eupath_orgdb(entry = lb_entry): Unable to create an
## orgdb for this species.
lm_annot <- EuPathDB::load_eupath_annotations(entry=lm_entry)
## Error in EuPathDB::load_eupath_annotations(entry = lm_entry): unused argument (entry = lm_entry)
lmex_annot <- EuPathDB::load_eupath_annotations(entry=lmex_entry)
## Error in EuPathDB::load_eupath_annotations(entry = lmex_entry): unused argument (entry = lmex_entry)
lpan_annot <- EuPathDB::load_eupath_annotations(entry=lp_entry)
## Error in EuPathDB::load_eupath_annotations(entry = lp_entry): unused argument (entry = lp_entry)
lama_annot <- EuPathDB::load_eupath_annotations(entry=lama_entry)
## Error in EuPathDB::load_eupath_annotations(entry = lama_entry): unused argument (entry = lama_entry)
lbraz_annot <- EuPathDB::load_eupath_annotations(entry=lb_entry)
## Error in EuPathDB::load_eupath_annotations(entry = lb_entry): unused argument (entry = lb_entry)

2 Collect orthologs

lm_ortho <- EuPathDB::extract_eupath_orthologs(lm_db)
## Error in EuPathDB::extract_eupath_orthologs(lm_db): I only understand orgdbs or the name of a species.
lmex_ortho <- EuPathDB::extract_eupath_orthologs(lmex_db)
## Error in EuPathDB::extract_eupath_orthologs(lmex_db): I only understand orgdbs or the name of a species.
lp_ortho <- EuPathDB::extract_eupath_orthologs(lp_db)
## Error in EuPathDB::extract_eupath_orthologs(lp_db): I only understand orgdbs or the name of a species.
la_ortho <- EuPathDB::extract_eupath_orthologs(la_db)
## Error in EuPathDB::extract_eupath_orthologs(la_db): I only understand orgdbs or the name of a species.
lb_ortho <- EuPathDB::extract_eupath_orthologs(lb_db)
## Error in EuPathDB::extract_eupath_orthologs(lb_db): I only understand orgdbs or the name of a species.

3 Create expressionset

sample_sheet <- "sample_sheets/UMD_leishmania_host_metasheet_20200227.xlsx"

lm_expt_annot <- lm_annot
## Error in eval(expr, envir, enclos): object 'lm_annot' not found
rownames(lm_expt_annot) <- paste0(rownames(lm_expt_annot), ".mRNA")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'x' in selecting a method for function 'rownames': object 'lm_expt_annot' not found
lm_expt <- create_expt(metadata=sample_sheet,
                       gene_info=lm_expt_annot,
                       savefile="lmajor.rda",
                       file_column="lmajorfile")
## Reading the sample metadata.
## Dropped 2 rows from the sample metadata because they were blank.
## The sample definitions comprises: 441 rows(samples) and 67 columns(metadata fields).
## Reading count tables.
## Reading salmon data with tximport.
## Finished reading count data.
## Warning in create_expt(metadata = sample_sheet, gene_info = lm_expt_annot, :
## Some samples were removed when cross referencing the samples against the count
## data.
## Error in create_expt(metadata = sample_sheet, gene_info = lm_expt_annot, : object 'lm_expt_annot' not found
lmex_expt_annot <- lmex_annot
## Error in eval(expr, envir, enclos): object 'lmex_annot' not found
rownames(lmex_expt_annot) <- paste0(rownames(lmex_expt_annot), ".1")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'x' in selecting a method for function 'rownames': object 'lmex_expt_annot' not found
lmex_expt <- create_expt(metadata=sample_sheet,
                         gene_info=lmex_expt_annot,
                         savefile="lmexicana.rda",
                         file_column="lmexicanafile")
## Reading the sample metadata.
## Dropped 2 rows from the sample metadata because they were blank.
## The sample definitions comprises: 441 rows(samples) and 67 columns(metadata fields).
## Reading count tables.
## Reading salmon data with tximport.
## Finished reading count data.
## Warning in create_expt(metadata = sample_sheet, gene_info = lmex_expt_annot, :
## Some samples were removed when cross referencing the samples against the count
## data.
## Error in create_expt(metadata = sample_sheet, gene_info = lmex_expt_annot, : object 'lmex_expt_annot' not found
lp_expt_annot <- lpan_annot
## Error in eval(expr, envir, enclos): object 'lpan_annot' not found
rownames(lp_expt_annot) <- paste0(rownames(lp_expt_annot), ".1")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'x' in selecting a method for function 'rownames': object 'lp_expt_annot' not found
lp_expt <- create_expt(metadata=sample_sheet,
                       gene_info=lp_expt_annot,
                       savefile="lpanamensis.rda",
                       file_column="lpanamensisfile")
## Reading the sample metadata.
## Dropped 2 rows from the sample metadata because they were blank.
## The sample definitions comprises: 441 rows(samples) and 67 columns(metadata fields).
## Reading count tables.
## Reading salmon data with tximport.
## Finished reading count data.
## Warning in create_expt(metadata = sample_sheet, gene_info = lp_expt_annot, :
## Some samples were removed when cross referencing the samples against the count
## data.
## Error in create_expt(metadata = sample_sheet, gene_info = lp_expt_annot, : object 'lp_expt_annot' not found
la_expt_annot <- lama_annot
## Error in eval(expr, envir, enclos): object 'lama_annot' not found
rownames(la_expt_annot) <- paste0(rownames(la_expt_annot), ".1")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'x' in selecting a method for function 'rownames': object 'la_expt_annot' not found
la_expt <- create_expt(metadata=sample_sheet,
                       gene_info=la_expt_annot,
                       savefile="lamazonensis.rda",
                       file_column="lamazonensisfile")
## Reading the sample metadata.
## Dropped 2 rows from the sample metadata because they were blank.
## The sample definitions comprises: 441 rows(samples) and 67 columns(metadata fields).
## Reading count tables.
## Reading salmon data with tximport.
## Finished reading count data.
## Warning in create_expt(metadata = sample_sheet, gene_info = la_expt_annot, :
## Some samples were removed when cross referencing the samples against the count
## data.
## Error in create_expt(metadata = sample_sheet, gene_info = la_expt_annot, : object 'la_expt_annot' not found
lb_expt_annot <- lbraz_annot
## Error in eval(expr, envir, enclos): object 'lbraz_annot' not found
rownames(lb_expt_annot) <- paste0(rownames(lb_expt_annot), ".mRNA")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'x' in selecting a method for function 'rownames': object 'lb_expt_annot' not found
lb_expt <- create_expt(metadata=sample_sheet,
                       gene_info=lb_expt_annot,
                       savefile="lbraziliensis.rda",
                       file_column="lbraziliensisfile")
## Reading the sample metadata.
## Dropped 2 rows from the sample metadata because they were blank.
## The sample definitions comprises: 441 rows(samples) and 67 columns(metadata fields).
## Reading count tables.
## Reading salmon data with tximport.
## Finished reading count data.
## Warning in create_expt(metadata = sample_sheet, gene_info = lb_expt_annot, :
## Some samples were removed when cross referencing the samples against the count
## data.
## Error in create_expt(metadata = sample_sheet, gene_info = lb_expt_annot, : object 'lb_expt_annot' not found
sub_cols <- c("GID", "ORTHOLOGS_ID", "ORTHOLOGS_GROUP")
lmlp_idx <- lm_ortho[["ORTHOLOGS_SPECIES"]] == "Leishmania panamensis MHOM/COL/81/L13"
## Error in eval(expr, envir, enclos): object 'lm_ortho' not found
lplm_idx <- lp_ortho[["ORTHOLOGS_SPECIES"]] == "Leishmania major strain Friedlin"
## Error in eval(expr, envir, enclos): object 'lp_ortho' not found
lmlp_ortho <- lm_ortho[lmlp_idx, sub_cols]
## Error in eval(expr, envir, enclos): object 'lm_ortho' not found
lplm_ortho <- lp_ortho[lplm_idx, sub_cols]
## Error in eval(expr, envir, enclos): object 'lp_ortho' not found
lm_mtrx <- exprs(lm_expt)
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'exprs': object 'lm_expt' not found
rownames(lm_mtrx) <- gsub(pattern="\\.mRNA", replacement="", x=rownames(lm_mtrx))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'x' in selecting a method for function 'rownames': object 'lm_mtrx' not found
lm_des <- pData(lm_expt)
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'pData': object 'lm_expt' not found
lm_annot <- fData(lm_expt)
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'fData': object 'lm_expt' not found
lp_mtrx <- exprs(lp_expt)
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'exprs': object 'lp_expt' not found
rownames(lp_mtrx) <- gsub(pattern="\\.1", replacement="", x=rownames(lp_mtrx))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'x' in selecting a method for function 'rownames': object 'lp_mtrx' not found
lp_des <- pData(lp_expt)
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'pData': object 'lp_expt' not found
lp_annot <- fData(lp_expt)
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'fData': object 'lp_expt' not found
colnames(lmlp_ortho) <- c("lm_gid", "lp_gid", "ogid")
## Error in colnames(lmlp_ortho) <- c("lm_gid", "lp_gid", "ogid"): object 'lmlp_ortho' not found
colnames(lplm_ortho) <- c("lp_gid", "lm_gid", "ogid")
## Error in colnames(lplm_ortho) <- c("lp_gid", "lm_gid", "ogid"): object 'lplm_ortho' not found
combined_ids <- merge(lmlp_ortho, lplm_ortho, all=TRUE)
## Error in merge(lmlp_ortho, lplm_ortho, all = TRUE): object 'lmlp_ortho' not found
ogids <- unique(combined_ids[["ogid"]])
## Error in h(simpleError(msg, call)): error in evaluating the argument 'x' in selecting a method for function 'unique': object 'combined_ids' not found
exprs <- data.frame(row.names=ogids)
## Error in data.frame(row.names = ogids): object 'ogids' not found
for (m in 1:ncol(lm_mtrx)) {
  name <- colnames(lm_mtrx)[m]
  exprs[[name]] <- 0
}
## Error in h(simpleError(msg, call)): error in evaluating the argument 'x' in selecting a method for function 'ncol': object 'lm_mtrx' not found
for (p in 1:ncol(lp_mtrx)) {
  name <- colnames(lp_mtrx)[p]
  exprs[[name]] <- 0
}
## Error in h(simpleError(msg, call)): error in evaluating the argument 'x' in selecting a method for function 'ncol': object 'lp_mtrx' not found
for (i in 1:length(ogids)) {
  ogid <- ogids[i]
  og_idx <- combined_ids[["ogid"]] == ogid
  lm_ids <- unique(combined_ids[og_idx, "lm_gid"])
  lp_ids <- unique(combined_ids[og_idx, "lp_gid"])
  lm_idx <- rownames(lm_mtrx) == lm_ids
  lp_idx <- rownames(lp_mtrx) == lp_ids
  if (sum(lm_idx) == 1) {
    lm_sum <- lm_mtrx[lm_idx, ]
  } else {
    lm_sum <- colSums(lm_mtrx[lm_idx, ])
  }
  if (sum(lp_idx) == 1) {
    lp_sum <- lp_mtrx[lp_idx, ]
  } else {
    lp_sum <- colSums(lp_mtrx[lp_idx, ])
  }
  sum <- c(lm_sum, lp_sum)
  exprs[ogid, ] <- sum
}
## Error in eval(expr, envir, enclos): object 'ogids' not found
pander::pander(sessionInfo())

R version 4.0.3 (2020-10-10)

Platform: x86_64-pc-linux-gnu (64-bit)

locale: LC_CTYPE=en_US.UTF-8, LC_NUMERIC=C, LC_TIME=en_US.UTF-8, LC_COLLATE=en_US.UTF-8, LC_MONETARY=en_US.UTF-8, LC_MESSAGES=en_US.UTF-8, LC_PAPER=en_US.UTF-8, LC_NAME=C, LC_ADDRESS=C, LC_TELEPHONE=C, LC_MEASUREMENT=en_US.UTF-8 and LC_IDENTIFICATION=C

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

other attached packages: futile.logger(v.1.4.3), hpgltools(v.1.0), testthat(v.3.0.1), R6(v.2.5.0), Biobase(v.2.50.0) and BiocGenerics(v.0.36.0)

loaded via a namespace (and not attached): RUnit(v.0.4.32), tidyselect(v.1.1.0), lme4(v.1.1-26), RSQLite(v.2.2.2), AnnotationDbi(v.1.52.0), grid(v.4.0.3), BiocParallel(v.1.24.1), devtools(v.2.3.2), scatterpie(v.0.1.5), munsell(v.0.5.0), codetools(v.0.2-18), statmod(v.1.4.35), withr(v.2.4.0), colorspace(v.2.0-0), GOSemSim(v.2.16.1), OrganismDbi(v.1.32.0), knitr(v.1.30), rstudioapi(v.0.13), stats4(v.4.0.3), DOSE(v.3.16.0), MatrixGenerics(v.1.2.0), tximport(v.1.18.0), GenomeInfoDbData(v.1.2.4), polyclip(v.1.10-0), bit64(v.4.0.5), farver(v.2.0.3), rprojroot(v.2.0.2), downloader(v.0.4), vctrs(v.0.3.6), generics(v.0.1.0), lambda.r(v.1.2.4), xfun(v.0.19), BiocFileCache(v.1.14.0), doParallel(v.1.0.16), GenomeInfoDb(v.1.26.2), graphlayouts(v.0.7.1), locfit(v.1.5-9.4), bitops(v.1.0-6), fgsea(v.1.16.0), DelayedArray(v.0.16.0), assertthat(v.0.2.1), promises(v.1.1.1), scales(v.1.1.1), ggraph(v.2.0.4), enrichplot(v.1.10.1), gtable(v.0.3.0), biocViews(v.1.58.1), sva(v.3.38.0), processx(v.3.4.5), tidygraph(v.1.2.0), rlang(v.0.4.10), genefilter(v.1.72.0), splines(v.4.0.3), rtracklayer(v.1.50.0), broom(v.0.7.3), BiocManager(v.1.30.10), yaml(v.2.2.1), reshape2(v.1.4.4), GenomicFeatures(v.1.42.1), backports(v.1.2.1), httpuv(v.1.5.5), qvalue(v.2.22.0), RBGL(v.1.66.0), clusterProfiler(v.3.18.0), tools(v.4.0.3), usethis(v.1.6.3), ggplot2(v.3.3.3), ellipsis(v.0.3.1), gplots(v.3.1.1), RColorBrewer(v.1.1-2), sessioninfo(v.1.1.1), Rcpp(v.1.0.6), plyr(v.1.8.6), progress(v.1.2.2), zlibbioc(v.1.36.0), purrr(v.0.3.4), RCurl(v.1.98-1.2), ps(v.1.5.0), prettyunits(v.1.1.1), openssl(v.1.4.3), viridis(v.0.5.1), cowplot(v.1.1.0), S4Vectors(v.0.28.1), SummarizedExperiment(v.1.20.0), ggrepel(v.0.9.0), colorRamps(v.2.3), fs(v.1.5.0), variancePartition(v.1.20.0), magrittr(v.2.0.1), futile.options(v.1.0.1), data.table(v.1.13.6), openxlsx(v.4.2.3), DO.db(v.2.9), matrixStats(v.0.57.0), pkgload(v.1.1.0), mime(v.0.9), hms(v.1.0.0), evaluate(v.0.14), xtable(v.1.8-4), pbkrtest(v.0.5-0.1), XML(v.3.99-0.5), IRanges(v.2.24.1), gridExtra(v.2.3), compiler(v.4.0.3), biomaRt(v.2.46.0), tibble(v.3.0.5), KernSmooth(v.2.23-18), crayon(v.1.3.4), shadowtext(v.0.0.7), minqa(v.1.2.4), htmltools(v.0.5.1), later(v.1.1.0.1), mgcv(v.1.8-33), tidyr(v.1.1.2), DBI(v.1.1.1), formatR(v.1.7), tweenr(v.1.0.1), dbplyr(v.2.0.0), MASS(v.7.3-53), rappdirs(v.0.3.1), boot(v.1.3-25), readr(v.1.4.0), Matrix(v.1.3-0), cli(v.2.2.0), igraph(v.1.2.6), GenomicRanges(v.1.42.0), pkgconfig(v.2.0.3), rvcheck(v.0.1.8), GenomicAlignments(v.1.26.0), xml2(v.1.3.2), foreach(v.1.5.1), annotate(v.1.68.0), XVector(v.0.30.0), AnnotationForge(v.1.32.0), rvest(v.0.3.6), stringr(v.1.4.0), callr(v.3.5.1), digest(v.0.6.27), graph(v.1.68.0), Biostrings(v.2.58.0), EuPathDB(v.1.6.0), rmarkdown(v.2.6), fastmatch(v.1.1-0), edgeR(v.3.32.0), PROPER(v.1.22.0), curl(v.4.3), shiny(v.1.5.0), Rsamtools(v.2.6.0), gtools(v.3.8.2), nloptr(v.1.2.2.2), lifecycle(v.0.2.0), nlme(v.3.1-151), jsonlite(v.1.7.2), desc(v.1.2.0), viridisLite(v.0.3.0), askpass(v.1.1), limma(v.3.46.0), fansi(v.0.4.2), pillar(v.1.4.7), lattice(v.0.20-41), fastmap(v.1.0.1), httr(v.1.4.2), pkgbuild(v.1.2.0), survival(v.3.2-7), GO.db(v.3.12.1), interactiveDisplayBase(v.1.28.0), glue(v.1.4.2), remotes(v.2.2.0), zip(v.2.1.1), iterators(v.1.0.13), pander(v.0.6.3), BiocVersion(v.3.12.0), bit(v.4.0.4), ggforce(v.0.3.2), stringi(v.1.5.3), blob(v.1.2.1), AnnotationHub(v.2.22.0), caTools(v.1.18.0), AnnotationHubData(v.1.20.0), memoise(v.1.1.0), rBiopaxParser(v.2.30.0) and dplyr(v.1.0.3)

message(paste0("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 052640a0b091e9a740e487957e087f265d0c74b5
## This is hpgltools commit: Thu Dec 3 13:42:02 2020 -0500: 052640a0b091e9a740e487957e087f265d0c74b5
## message(paste0("Saving to ", savefile))
## tmp <- sm(saveme(filename=savefile))
LS0tCnRpdGxlOiAiMjAxOTAxMjQgcGFyYXNpdGUgY2VsbCBjb21wYXJpc29ucy4iCmF1dGhvcjogImF0YiBhYmVsZXdAZ21haWwuY29tIgpkYXRlOiAiYHIgU3lzLkRhdGUoKWAiCm91dHB1dDoKICBodG1sX2RvY3VtZW50OgogICAgY29kZV9kb3dubG9hZDogdHJ1ZQogICAgY29kZV9mb2xkaW5nOiBzaG93CiAgICBmaWdfY2FwdGlvbjogdHJ1ZQogICAgZmlnX2hlaWdodDogNwogICAgZmlnX3dpZHRoOiA3CiAgICBoaWdobGlnaHQ6IHRhbmdvCiAgICBrZWVwX21kOiBmYWxzZQogICAgbW9kZTogc2VsZmNvbnRhaW5lZAogICAgbnVtYmVyX3NlY3Rpb25zOiB0cnVlCiAgICBzZWxmX2NvbnRhaW5lZDogdHJ1ZQogICAgdGhlbWU6IHJlYWRhYmxlCiAgICB0b2M6IHRydWUKICAgIHRvY19mbG9hdDoKICAgICAgY29sbGFwc2VkOiBmYWxzZQogICAgICBzbW9vdGhfc2Nyb2xsOiBmYWxzZQogIHJtZGZvcm1hdHM6OnJlYWR0aGVkb3duOgogICAgY29kZV9kb3dubG9hZDogdHJ1ZQogICAgY29kZV9mb2xkaW5nOiBzaG93CiAgICBkZl9wcmludDogcGFnZWQKICAgIGZpZ19jYXB0aW9uOiB0cnVlCiAgICBmaWdfaGVpZ2h0OiA3CiAgICBmaWdfd2lkdGg6IDcKICAgIGhpZ2hsaWdodDogdGFuZ28KICAgIHdpZHRoOiAzMDAKICAgIGtlZXBfbWQ6IGZhbHNlCiAgICBtb2RlOiBzZWxmY29udGFpbmVkCiAgICB0b2NfZmxvYXQ6IHRydWUKICBCaW9jU3R5bGU6Omh0bWxfZG9jdW1lbnQ6CiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlCiAgICBjb2RlX2ZvbGRpbmc6IHNob3cKICAgIGZpZ19jYXB0aW9uOiB0cnVlCiAgICBmaWdfaGVpZ2h0OiA3CiAgICBmaWdfd2lkdGg6IDcKICAgIGhpZ2hsaWdodDogdGFuZ28KICAgIGtlZXBfbWQ6IGZhbHNlCiAgICBtb2RlOiBzZWxmY29udGFpbmVkCiAgICB0b2NfZmxvYXQ6IHRydWUKLS0tCgo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgpib2R5LCB0ZCB7CiAgZm9udC1zaXplOiAxNnB4Owp9CmNvZGUucnsKICBmb250LXNpemU6IDE2cHg7Cn0KcHJlIHsKIGZvbnQtc2l6ZTogMTZweAp9Cjwvc3R5bGU+CgpgYGB7ciBvcHRpb25zLCBpbmNsdWRlPUZBTFNFfQpsaWJyYXJ5KGhwZ2x0b29scykKdHQgPC0gc20oZGV2dG9vbHM6OmxvYWRfYWxsKCJ+L2hwZ2x0b29scyIpKQprbml0cjo6b3B0c19rbml0JHNldChwcm9ncmVzcz1UUlVFLAogICAgICAgICAgICAgICAgICAgICB2ZXJib3NlPVRSVUUsCiAgICAgICAgICAgICAgICAgICAgIHdpZHRoPTEyMCwKICAgICAgICAgICAgICAgICAgICAgZWNobz1UUlVFKQprbml0cjo6b3B0c19jaHVuayRzZXQoZXJyb3I9VFJVRSwKICAgICAgICAgICAgICAgICAgICAgIGZpZy53aWR0aD04LAogICAgICAgICAgICAgICAgICAgICAgZmlnLmhlaWdodD04LAogICAgICAgICAgICAgICAgICAgICAgZHBpPTk2KQpvbGRfb3B0aW9ucyA8LSBvcHRpb25zKGRpZ2l0cz00LAogICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ3NBc0ZhY3RvcnM9RkFMU0UsCiAgICAgICAgICAgICAgICAgICAgICAga25pdHIuZHVwbGljYXRlLmxhYmVsPSJhbGxvdyIpCmdncGxvdDI6OnRoZW1lX3NldChnZ3Bsb3QyOjp0aGVtZV9idyhiYXNlX3NpemU9MTIpKQp2ZXIgPC0gIjIwMjAwMjIwIgpydW5kYXRlIDwtIGZvcm1hdChTeXMuRGF0ZSgpLCBmb3JtYXQ9IiVZJW0lZCIpCnJtZF9maWxlIDwtIHBhc3RlMCgiMjAyMDAyMjBfcGFyYXNpdGVfY29tcGFyaXNvbnMuUm1kIikKYGBgCgojIEdhdGhlciBhbm5vdGF0aW9uIGRhdGEKCkxldHMgZ2V0IGEgc2V0IG9mIGNvcmUgc2hhcmVkIGdlbmVzIGFtb25nIHRoZSB0aHJlZSBtYWluIHNwZWNpZXM6IEwuIG1ham9yLApMLm1leGljYW5hLCBhbmQgTC5wYW5hbWVuc2lzLiAgSSBhbSBub3Qgc3VyZSBob3cgSSB3YW50IHRvIGRlYWwgd2l0aCBtdWx0aS1jb3B5CmdlbmVzIHlldC4KCmBgYHtyIGFubm90fQptZXRhIDwtIEV1UGF0aERCOjpkb3dubG9hZF9ldXBhdGhfbWV0YWRhdGEod2Vic2VydmljZT0idHJpdHJ5cGRiIikKbG1fZW50cnkgPC0gRXVQYXRoREI6OmdldF9ldXBhdGhfZW50cnkoc3BlY2llcz0iTGVpc2htYW5pYSBtYWpvciIsIG1ldGFkYXRhPW1ldGEpCmxwX2VudHJ5IDwtIEV1UGF0aERCOjpnZXRfZXVwYXRoX2VudHJ5KHNwZWNpZXM9IkxlaXNobWFuaWEgcGFuYW1lbnNpcyIsIG1ldGFkYXRhPW1ldGEpCmxtZXhfZW50cnkgPC0gRXVQYXRoREI6OmdldF9ldXBhdGhfZW50cnkoc3BlY2llcz0iTGVpc2htYW5pYSBtZXhpY2FuYSIsIG1ldGFkYXRhPW1ldGEpCmxhbWFfZW50cnkgPC0gRXVQYXRoREI6OmdldF9ldXBhdGhfZW50cnkoc3BlY2llcz0iTGVpc2htYW5pYSBhbWF6b25lbnNpcyIsIG1ldGFkYXRhPW1ldGEpCmxiX2VudHJ5IDwtIEV1UGF0aERCOjpnZXRfZXVwYXRoX2VudHJ5KHNwZWNpZXM9IjI5MDQiLCBtZXRhZGF0YT1tZXRhKQoKIyNsbV9kYiA8LSBFdVBhdGhEQjo6bWFrZV9ldXBhdGhfb3JnZGIoZW50cnk9bG1fZW50cnksIGluc3RhbGxwPVRSVUUsIHJlaW5zdGFsbD1UUlVFLCBvdmVyd3JpdGU9VFJVRSkKbG1fZGIgPC0gRXVQYXRoREI6Om1ha2VfZXVwYXRoX29yZ2RiKGVudHJ5PWxtX2VudHJ5KQoKIyNsbWV4X2RiIDwtIEV1UGF0aERCOjptYWtlX2V1cGF0aF9vcmdkYihlbnRyeT1sbWV4X2VudHJ5LCBpbnN0YWxscD1UUlVFLCByZWluc3RhbGw9VFJVRSwgb3ZlcndyaXRlPVRSVUUpCmxtZXhfZGIgPC0gRXVQYXRoREI6Om1ha2VfZXVwYXRoX29yZ2RiKGVudHJ5PWxtZXhfZW50cnkpCgojI2xwX2RiIDwtIEV1UGF0aERCOjptYWtlX2V1cGF0aF9vcmdkYihlbnRyeT1scF9lbnRyeSwgaW5zdGFsbHA9VFJVRSwgcmVpbnN0YWxsPVRSVUUsIG92ZXJ3cml0ZT1UUlVFKQpscF9kYiA8LSBFdVBhdGhEQjo6bWFrZV9ldXBhdGhfb3JnZGIoZW50cnk9bHBfZW50cnkpCgojI2xhX2RiIDwtIEV1UGF0aERCOjptYWtlX2V1cGF0aF9vcmdkYihlbnRyeT1sYW1hX2VudHJ5LCBpbnN0YWxscD1UUlVFLCByZWluc3RhbGw9VFJVRSwgb3ZlcndyaXRlPVRSVUUpCmxhX2RiIDwtIEV1UGF0aERCOjptYWtlX2V1cGF0aF9vcmdkYihlbnRyeT1sYW1hX2VudHJ5KQoKIyNsYl9kYiA8LSBFdVBhdGhEQjo6bWFrZV9ldXBhdGhfb3JnZGIoZW50cnk9bGJfZW50cnksIGluc3RhbGxwPVRSVUUsIHJlaW5zdGFsbD1UUlVFLCBvdmVyd3JpdGU9VFJVRSkKbGJfZGIgPC0gRXVQYXRoREI6Om1ha2VfZXVwYXRoX29yZ2RiKGVudHJ5PWxiX2VudHJ5KQoKbG1fYW5ub3QgPC0gRXVQYXRoREI6OmxvYWRfZXVwYXRoX2Fubm90YXRpb25zKGVudHJ5PWxtX2VudHJ5KQpsbWV4X2Fubm90IDwtIEV1UGF0aERCOjpsb2FkX2V1cGF0aF9hbm5vdGF0aW9ucyhlbnRyeT1sbWV4X2VudHJ5KQpscGFuX2Fubm90IDwtIEV1UGF0aERCOjpsb2FkX2V1cGF0aF9hbm5vdGF0aW9ucyhlbnRyeT1scF9lbnRyeSkKbGFtYV9hbm5vdCA8LSBFdVBhdGhEQjo6bG9hZF9ldXBhdGhfYW5ub3RhdGlvbnMoZW50cnk9bGFtYV9lbnRyeSkKbGJyYXpfYW5ub3QgPC0gRXVQYXRoREI6OmxvYWRfZXVwYXRoX2Fubm90YXRpb25zKGVudHJ5PWxiX2VudHJ5KQpgYGAKCiMgQ29sbGVjdCBvcnRob2xvZ3MKCmBgYHtyIG9ydGhvc30KbG1fb3J0aG8gPC0gRXVQYXRoREI6OmV4dHJhY3RfZXVwYXRoX29ydGhvbG9ncyhsbV9kYikKbG1leF9vcnRobyA8LSBFdVBhdGhEQjo6ZXh0cmFjdF9ldXBhdGhfb3J0aG9sb2dzKGxtZXhfZGIpCmxwX29ydGhvIDwtIEV1UGF0aERCOjpleHRyYWN0X2V1cGF0aF9vcnRob2xvZ3MobHBfZGIpCmxhX29ydGhvIDwtIEV1UGF0aERCOjpleHRyYWN0X2V1cGF0aF9vcnRob2xvZ3MobGFfZGIpCmxiX29ydGhvIDwtIEV1UGF0aERCOjpleHRyYWN0X2V1cGF0aF9vcnRob2xvZ3MobGJfZGIpCmBgYAoKIyBDcmVhdGUgZXhwcmVzc2lvbnNldAoKYGBge3IgZXhwdH0Kc2FtcGxlX3NoZWV0IDwtICJzYW1wbGVfc2hlZXRzL1VNRF9sZWlzaG1hbmlhX2hvc3RfbWV0YXNoZWV0XzIwMjAwMjI3Lnhsc3giCgpsbV9leHB0X2Fubm90IDwtIGxtX2Fubm90CnJvd25hbWVzKGxtX2V4cHRfYW5ub3QpIDwtIHBhc3RlMChyb3duYW1lcyhsbV9leHB0X2Fubm90KSwgIi5tUk5BIikKbG1fZXhwdCA8LSBjcmVhdGVfZXhwdChtZXRhZGF0YT1zYW1wbGVfc2hlZXQsCiAgICAgICAgICAgICAgICAgICAgICAgZ2VuZV9pbmZvPWxtX2V4cHRfYW5ub3QsCiAgICAgICAgICAgICAgICAgICAgICAgc2F2ZWZpbGU9ImxtYWpvci5yZGEiLAogICAgICAgICAgICAgICAgICAgICAgIGZpbGVfY29sdW1uPSJsbWFqb3JmaWxlIikKCgpsbWV4X2V4cHRfYW5ub3QgPC0gbG1leF9hbm5vdApyb3duYW1lcyhsbWV4X2V4cHRfYW5ub3QpIDwtIHBhc3RlMChyb3duYW1lcyhsbWV4X2V4cHRfYW5ub3QpLCAiLjEiKQpsbWV4X2V4cHQgPC0gY3JlYXRlX2V4cHQobWV0YWRhdGE9c2FtcGxlX3NoZWV0LAogICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZV9pbmZvPWxtZXhfZXhwdF9hbm5vdCwKICAgICAgICAgICAgICAgICAgICAgICAgIHNhdmVmaWxlPSJsbWV4aWNhbmEucmRhIiwKICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVfY29sdW1uPSJsbWV4aWNhbmFmaWxlIikKCmxwX2V4cHRfYW5ub3QgPC0gbHBhbl9hbm5vdApyb3duYW1lcyhscF9leHB0X2Fubm90KSA8LSBwYXN0ZTAocm93bmFtZXMobHBfZXhwdF9hbm5vdCksICIuMSIpCmxwX2V4cHQgPC0gY3JlYXRlX2V4cHQobWV0YWRhdGE9c2FtcGxlX3NoZWV0LAogICAgICAgICAgICAgICAgICAgICAgIGdlbmVfaW5mbz1scF9leHB0X2Fubm90LAogICAgICAgICAgICAgICAgICAgICAgIHNhdmVmaWxlPSJscGFuYW1lbnNpcy5yZGEiLAogICAgICAgICAgICAgICAgICAgICAgIGZpbGVfY29sdW1uPSJscGFuYW1lbnNpc2ZpbGUiKQoKbGFfZXhwdF9hbm5vdCA8LSBsYW1hX2Fubm90CnJvd25hbWVzKGxhX2V4cHRfYW5ub3QpIDwtIHBhc3RlMChyb3duYW1lcyhsYV9leHB0X2Fubm90KSwgIi4xIikKbGFfZXhwdCA8LSBjcmVhdGVfZXhwdChtZXRhZGF0YT1zYW1wbGVfc2hlZXQsCiAgICAgICAgICAgICAgICAgICAgICAgZ2VuZV9pbmZvPWxhX2V4cHRfYW5ub3QsCiAgICAgICAgICAgICAgICAgICAgICAgc2F2ZWZpbGU9ImxhbWF6b25lbnNpcy5yZGEiLAogICAgICAgICAgICAgICAgICAgICAgIGZpbGVfY29sdW1uPSJsYW1hem9uZW5zaXNmaWxlIikKCmxiX2V4cHRfYW5ub3QgPC0gbGJyYXpfYW5ub3QKcm93bmFtZXMobGJfZXhwdF9hbm5vdCkgPC0gcGFzdGUwKHJvd25hbWVzKGxiX2V4cHRfYW5ub3QpLCAiLm1STkEiKQpsYl9leHB0IDwtIGNyZWF0ZV9leHB0KG1ldGFkYXRhPXNhbXBsZV9zaGVldCwKICAgICAgICAgICAgICAgICAgICAgICBnZW5lX2luZm89bGJfZXhwdF9hbm5vdCwKICAgICAgICAgICAgICAgICAgICAgICBzYXZlZmlsZT0ibGJyYXppbGllbnNpcy5yZGEiLAogICAgICAgICAgICAgICAgICAgICAgIGZpbGVfY29sdW1uPSJsYnJhemlsaWVuc2lzZmlsZSIpCmBgYAoKYGBge3IgY29tYmluZV9vcnRob2xvZ3N9CnN1Yl9jb2xzIDwtIGMoIkdJRCIsICJPUlRIT0xPR1NfSUQiLCAiT1JUSE9MT0dTX0dST1VQIikKbG1scF9pZHggPC0gbG1fb3J0aG9bWyJPUlRIT0xPR1NfU1BFQ0lFUyJdXSA9PSAiTGVpc2htYW5pYSBwYW5hbWVuc2lzIE1IT00vQ09MLzgxL0wxMyIKbHBsbV9pZHggPC0gbHBfb3J0aG9bWyJPUlRIT0xPR1NfU1BFQ0lFUyJdXSA9PSAiTGVpc2htYW5pYSBtYWpvciBzdHJhaW4gRnJpZWRsaW4iCmxtbHBfb3J0aG8gPC0gbG1fb3J0aG9bbG1scF9pZHgsIHN1Yl9jb2xzXQpscGxtX29ydGhvIDwtIGxwX29ydGhvW2xwbG1faWR4LCBzdWJfY29sc10KCmxtX210cnggPC0gZXhwcnMobG1fZXhwdCkKcm93bmFtZXMobG1fbXRyeCkgPC0gZ3N1YihwYXR0ZXJuPSJcXC5tUk5BIiwgcmVwbGFjZW1lbnQ9IiIsIHg9cm93bmFtZXMobG1fbXRyeCkpCmxtX2RlcyA8LSBwRGF0YShsbV9leHB0KQpsbV9hbm5vdCA8LSBmRGF0YShsbV9leHB0KQoKbHBfbXRyeCA8LSBleHBycyhscF9leHB0KQpyb3duYW1lcyhscF9tdHJ4KSA8LSBnc3ViKHBhdHRlcm49IlxcLjEiLCByZXBsYWNlbWVudD0iIiwgeD1yb3duYW1lcyhscF9tdHJ4KSkKbHBfZGVzIDwtIHBEYXRhKGxwX2V4cHQpCmxwX2Fubm90IDwtIGZEYXRhKGxwX2V4cHQpCgpjb2xuYW1lcyhsbWxwX29ydGhvKSA8LSBjKCJsbV9naWQiLCAibHBfZ2lkIiwgIm9naWQiKQpjb2xuYW1lcyhscGxtX29ydGhvKSA8LSBjKCJscF9naWQiLCAibG1fZ2lkIiwgIm9naWQiKQpjb21iaW5lZF9pZHMgPC0gbWVyZ2UobG1scF9vcnRobywgbHBsbV9vcnRobywgYWxsPVRSVUUpCgpvZ2lkcyA8LSB1bmlxdWUoY29tYmluZWRfaWRzW1sib2dpZCJdXSkKZXhwcnMgPC0gZGF0YS5mcmFtZShyb3cubmFtZXM9b2dpZHMpCmZvciAobSBpbiAxOm5jb2wobG1fbXRyeCkpIHsKICBuYW1lIDwtIGNvbG5hbWVzKGxtX210cngpW21dCiAgZXhwcnNbW25hbWVdXSA8LSAwCn0KZm9yIChwIGluIDE6bmNvbChscF9tdHJ4KSkgewogIG5hbWUgPC0gY29sbmFtZXMobHBfbXRyeClbcF0KICBleHByc1tbbmFtZV1dIDwtIDAKfQoKZm9yIChpIGluIDE6bGVuZ3RoKG9naWRzKSkgewogIG9naWQgPC0gb2dpZHNbaV0KICBvZ19pZHggPC0gY29tYmluZWRfaWRzW1sib2dpZCJdXSA9PSBvZ2lkCiAgbG1faWRzIDwtIHVuaXF1ZShjb21iaW5lZF9pZHNbb2dfaWR4LCAibG1fZ2lkIl0pCiAgbHBfaWRzIDwtIHVuaXF1ZShjb21iaW5lZF9pZHNbb2dfaWR4LCAibHBfZ2lkIl0pCiAgbG1faWR4IDwtIHJvd25hbWVzKGxtX210cngpID09IGxtX2lkcwogIGxwX2lkeCA8LSByb3duYW1lcyhscF9tdHJ4KSA9PSBscF9pZHMKICBpZiAoc3VtKGxtX2lkeCkgPT0gMSkgewogICAgbG1fc3VtIDwtIGxtX210cnhbbG1faWR4LCBdCiAgfSBlbHNlIHsKICAgIGxtX3N1bSA8LSBjb2xTdW1zKGxtX210cnhbbG1faWR4LCBdKQogIH0KICBpZiAoc3VtKGxwX2lkeCkgPT0gMSkgewogICAgbHBfc3VtIDwtIGxwX210cnhbbHBfaWR4LCBdCiAgfSBlbHNlIHsKICAgIGxwX3N1bSA8LSBjb2xTdW1zKGxwX210cnhbbHBfaWR4LCBdKQogIH0KICBzdW0gPC0gYyhsbV9zdW0sIGxwX3N1bSkKICBleHByc1tvZ2lkLCBdIDwtIHN1bQp9CgpgYGAKCgpgYGB7ciBzYXZlbWV9CnBhbmRlcjo6cGFuZGVyKHNlc3Npb25JbmZvKCkpCm1lc3NhZ2UocGFzdGUwKCJUaGlzIGlzIGhwZ2x0b29scyBjb21taXQ6ICIsIGdldF9naXRfY29tbWl0KCkpKQojIyBtZXNzYWdlKHBhc3RlMCgiU2F2aW5nIHRvICIsIHNhdmVmaWxlKSkKIyMgdG1wIDwtIHNtKHNhdmVtZShmaWxlbmFtZT1zYXZlZmlsZSkpCmBgYAo=