1 Introduction

This document is intended to provide an overview of TMRC3 samples which have been sequenced. It includes some plots and analyses showing the relationships among the samples as well as some differential analyses when possible.

2 Annotation

We take the annotation data from ensembl’s biomart instance. The genome which was used to map the data was hg38 revision 91. My default when using biomart is to load the data from 1 year before the current date, which provides annotations which match hg38 91 almost perfectly.

hs_annot <- load_biomart_annotations()
## The biomart annotations file already exists, loading from it.
hs_annot <- hs_annot[["annotation"]]
hs_annot[["transcript"]] <- paste0(rownames(hs_annot), ".", hs_annot[["version"]])
rownames(hs_annot) <- make.names(hs_annot[["ensembl_gene_id"]], unique=TRUE)
tx_gene_map <- hs_annot[, c("transcript", "ensembl_gene_id")]
hs_go <- load_biomart_go()[["go"]]
## The biomart annotations file already exists, loading from it.
hs_length <- hs_annot[, c("ensembl_gene_id", "cds_length")]
colnames(hs_length) <- c("ID", "length")

3 Sample Estimation

I used two mapping methods for this data, hisat2 and salmon. Most analyses use hisat2, which is a more traditional map-and-count method. In contrast, salmon uses what may be thought of as a indexed voting method (so that multi-matches are discounted and the votes split among all matches). Salmon also required a pre-existing database of known transcripts (though later versions may actually use mapping from things like hisat), while hisat uses the genome and a database of known transcripts (and optionally can search for splicing junctions to find new transcripts).

3.1 Generate expressionsets

samplesheet <- "sample_sheets/tmrc3_samples_202103.xlsx"

Caveat: This initial section is using salmon quantifications. A majority of analyses used hisat2.

3.1.1 Salmon expressionsets

Currently, I have these disabled.

3.1.2 Hisat2 expressionsets

The first thing to note is the large range in coverage. There are multiple samples with coverage which is too low to use. These will be removed shortly.

hs_expt <- create_expt(samplesheet,
                       file_column="hg38100hisatfile",
                       savefile=glue::glue("hs_expt_all-v{ver}.rda"),
                       gene_info=hs_annot)
## Reading the sample metadata.
## Dropped 103 rows from the sample metadata because they were blank.
## The sample definitions comprises: 131 rows(samples) and 81 columns(metadata fields).
## Reading count tables.
## Reading count files with read.table().
## /mnt/sshfs_10186/cbcbsub00/fs/cbcb-lab/nelsayed/scratch/atb/rnaseq/lpanamensis_tmrc_2019/preprocessing/TMRC30001/outputs/hisat2_hg38_100/r1_trimmed.count_hg38_100_sno_gene_gene_id.count.xz contains 21486 rows.
## preprocessing/TMRC30002/outputs/hisat2_hg38_100/r1_trimmed.count_hg38_100_sno_gene_gene_id.count.xz contains 21486 rows and merges to 21486 rows.
## preprocessing/TMRC30003/outputs/hisat2_hg38_100/r1_trimmed.count_hg38_100_sno_gene_gene_id.count.xz contains 21486 rows and merges to 21486 rows.
## preprocessing/TMRC30004/outputs/hisat2_hg38_100/r1_trimmed.count_hg38_100_sno_gene_gene_id.count.xz contains 21486 rows and merges to 21486 rows.
## preprocessing/TMRC30005/outputs/hisat2_hg38_100/r1_trimmed.count_hg38_100_sno_gene_gene_id.count.xz contains 21486 rows and merges to 21486 rows.
## preprocessing/TMRC30006/outputs/hisat2_hg38_100/r1_trimmed.count_hg38_100_sno_gene_gene_id.count.xz contains 21486 rows and merges to 21486 rows.
## preprocessing/TMRC30007/outputs/hisat2_hg38_100/r1_trimmed.count_hg38_100_sno_gene_gene_id.count.xz contains 21486 rows and merges to 21486 rows.
## preprocessing/TMRC30008/outputs/hisat2_hg38_100/r1_trimmed.count_hg38_100_sno_gene_gene_id.count.xz contains 21486 rows and merges to 21486 rows.
## preprocessing/TMRC30009/outputs/hisat2_hg38_100/r1_trimmed.count_hg38_100_sno_gene_gene_id.count.xz contains 21486 rows and merges to 21486 rows.
## preprocessing/TMRC30010/outputs/hisat2_hg38_100/r1_trimmed.count_hg38_100_sno_gene_gene_id.count.xz contains 21486 rows and merges to 21486 rows.
## preprocessing/TMRC30015/outputs/hisat2_hg38_100/r1_trimmed.count_hg38_100_sno_gene_gene_id.count.xz contains 21486 rows and merges to 21486 rows.
## preprocessing/TMRC30011/outputs/hisat2_hg38_100/r1_trimmed.count_hg38_100_sno_gene_gene_id.count.xz contains 21486 rows and merges to 21486 rows.
## preprocessing/TMRC30012/outputs/hisat2_hg38_100/r1_trimmed.count_hg38_100_sno_gene_gene_id.count.xz contains 21486 rows and merges to 21486 rows.
## preprocessing/TMRC30013/outputs/hisat2_hg38_100/r1_trimmed.count_hg38_100_sno_gene_gene_id.count.xz contains 21486 rows and merges to 21486 rows.
## preprocessing/TMRC30016/outputs/hisat2_hg38_100/r1_trimmed.count_hg38_100_sno_gene_gene_id.count.xz contains 21486 rows and merges to 21486 rows.
## preprocessing/TMRC30017/outputs/hisat2_hg38_100/r1_trimmed.count_hg38_100_sno_gene_gene_id.count.xz contains 21486 rows and merges to 21486 rows.
## preprocessing/TMRC30050/outputs/hisat2_hg38_100/r1_trimmed.count_hg38_100_sno_gene_gene_id.count.xz contains 21486 rows and merges to 21486 rows.
## preprocessing/TMRC30052/outputs/hisat2_hg38_100/r1_trimmed.count_hg38_100_sno_gene_gene_id.count.xz contains 21486 rows and merges to 21486 rows.
## preprocessing/TMRC30071/outputs/hisat2_hg38_100/r1_trimmed.count_hg38_100_sno_gene_gene_id.count.xz contains 21486 rows and merges to 21486 rows.
## preprocessing/TMRC30056/outputs/hisat2_hg38_100/r1_trimmed.count_hg38_100_sno_gene_gene_id.count.xz contains 21486 rows and merges to 21486 rows.
## preprocessing/TMRC30058/outputs/hisat2_hg38_100/r1_trimmed.count_hg38_100_sno_gene_gene_id.count.xz contains 21486 rows and merges to 21486 rows.
## preprocessing/TMRC30105/outputs/hisat2_hg38_100/r1_trimmed.count_hg38_100_sno_gene_gene_id.count.xz contains 21486 rows and merges to 21486 rows.
## preprocessing/TMRC30094/outputs/hisat2_hg38_100/r1_trimmed.count_hg38_100_sno_gene_gene_id.count.xz contains 21486 rows and merges to 21486 rows.
## preprocessing/TMRC30080/outputs/hisat2_hg38_100/r1_trimmed.count_hg38_100_sno_gene_gene_id.count.xz contains 21486 rows and merges to 21486 rows.
## preprocessing/TMRC30103/outputs/hisat2_hg38_100/r1_trimmed.count_hg38_100_sno_gene_gene_id.count.xz contains 21486 rows and merges to 21486 rows.
## preprocessing/TMRC30018/outputs/hisat2_hg38_100/r1_trimmed.count_hg38_100_sno_gene_gene_id.count.xz contains 21486 rows and merges to 21486 rows.
## preprocessing/TMRC30107/outputs/hisat2_hg38_100/r1_trimmed.count_hg38_100_sno_gene_gene_id.count.xz contains 21486 rows and merges to 21486 rows.
## preprocessing/TMRC30083/outputs/hisat2_hg38_100/r1_trimmed.count_hg38_100_sno_gene_gene_id.count.xz contains 21486 rows and merges to 21486 rows.
## preprocessing/TMRC30019/outputs/hisat2_hg38_100/r1_trimmed.count_hg38_100_sno_gene_gene_id.count.xz contains 21486 rows and merges to 21486 rows.
## preprocessing/TMRC30082/outputs/hisat2_hg38_100/r1_trimmed.count_hg38_100_sno_gene_gene_id.count.xz contains 21486 rows and merges to 21486 rows.
## preprocessing/TMRC30093/outputs/hisat2_hg38_100/r1_trimmed.count_hg38_100_sno_gene_gene_id.count.xz contains 21486 rows and merges to 21486 rows.
## preprocessing/TMRC30096/outputs/hisat2_hg38_100/r1_trimmed.count_hg38_100_sno_gene_gene_id.count.xz contains 21486 rows and merges to 21486 rows.
## preprocessing/TMRC30014/outputs/hisat2_hg38_100/r1_trimmed.count_hg38_100_sno_gene_gene_id.count.xz contains 21486 rows and merges to 21486 rows.
## preprocessing/TMRC30021/outputs/hisat2_hg38_100/r1_trimmed.count_hg38_100_sno_gene_gene_id.count.xz contains 21486 rows and merges to 21486 rows.
## preprocessing/TMRC30029/outputs/hisat2_hg38_100/r1_trimmed.count_hg38_100_sno_gene_gene_id.count.xz contains 21486 rows and merges to 21486 rows.
## preprocessing/TMRC30020/outputs/hisat2_hg38_100/r1_trimmed.count_hg38_100_sno_gene_gene_id.count.xz contains 21486 rows and merges to 21486 rows.
## preprocessing/TMRC30038/outputs/hisat2_hg38_100/r1_trimmed.count_hg38_100_sno_gene_gene_id.count.xz contains 21486 rows and merges to 21486 rows.
## preprocessing/TMRC30039/outputs/hisat2_hg38_100/r1_trimmed.count_hg38_100_sno_gene_gene_id.count.xz contains 21486 rows and merges to 21486 rows.
## preprocessing/TMRC30023/outputs/hisat2_hg38_100/r1_trimmed.count_hg38_100_sno_gene_gene_id.count.xz contains 21486 rows and merges to 21486 rows.
## preprocessing/TMRC30025/outputs/hisat2_hg38_100/r1_trimmed.count_hg38_100_sno_gene_gene_id.count.xz contains 21486 rows and merges to 21486 rows.
## preprocessing/TMRC30022/outputs/hisat2_hg38_100/r1_trimmed.count_hg38_100_sno_gene_gene_id.count.xz contains 21486 rows and merges to 21486 rows.
## preprocessing/TMRC30046/outputs/hisat2_hg38_100/r1_trimmed.count_hg38_100_sno_gene_gene_id.count.xz contains 21486 rows and merges to 21486 rows.
## preprocessing/TMRC30047/outputs/hisat2_hg38_100/r1_trimmed.count_hg38_100_sno_gene_gene_id.count.xz contains 21486 rows and merges to 21486 rows.
## preprocessing/TMRC30048/outputs/hisat2_hg38_100/r1_trimmed.count_hg38_100_sno_gene_gene_id.count.xz contains 21486 rows and merges to 21486 rows.
## preprocessing/TMRC30026/outputs/hisat2_hg38_100/r1_trimmed.count_hg38_100_sno_gene_gene_id.count.xz contains 21486 rows and merges to 21486 rows.
## preprocessing/TMRC30030/outputs/hisat2_hg38_100/r1_trimmed.count_hg38_100_sno_gene_gene_id.count.xz contains 21486 rows and merges to 21486 rows.
## preprocessing/TMRC30031/outputs/hisat2_hg38_100/r1_trimmed.count_hg38_100_sno_gene_gene_id.count.xz contains 21486 rows and merges to 21486 rows.
## preprocessing/TMRC30032/outputs/hisat2_hg38_100/r1_trimmed.count_hg38_100_sno_gene_gene_id.count.xz contains 21486 rows and merges to 21486 rows.
## preprocessing/TMRC30024/outputs/hisat2_hg38_100/r1_trimmed.count_hg38_100_sno_gene_gene_id.count.xz contains 21486 rows and merges to 21486 rows.
## preprocessing/TMRC30040/outputs/hisat2_hg38_100/r1_trimmed.count_hg38_100_sno_gene_gene_id.count.xz contains 21486 rows and merges to 21486 rows.
## preprocessing/TMRC30033/outputs/hisat2_hg38_100/r1_trimmed.count_hg38_100_sno_gene_gene_id.count.xz contains 21486 rows and merges to 21486 rows.
## preprocessing/TMRC30049/outputs/hisat2_hg38_100/r1_trimmed.count_hg38_100_sno_gene_gene_id.count.xz contains 21486 rows and merges to 21486 rows.
## preprocessing/TMRC30053/outputs/hisat2_hg38_100/r1_trimmed.count_hg38_100_sno_gene_gene_id.count.xz contains 21486 rows and merges to 21486 rows.
## preprocessing/TMRC30054/outputs/hisat2_hg38_100/r1_trimmed.count_hg38_100_sno_gene_gene_id.count.xz contains 21486 rows and merges to 21486 rows.
## preprocessing/TMRC30037/outputs/hisat2_hg38_100/r1_trimmed.count_hg38_100_sno_gene_gene_id.count.xz contains 21486 rows and merges to 21486 rows.
## preprocessing/TMRC30027/outputs/hisat2_hg38_100/r1_trimmed.count_hg38_100_sno_gene_gene_id.count.xz contains 21486 rows and merges to 21486 rows.
## preprocessing/TMRC30028/outputs/hisat2_hg38_100/r1_trimmed.count_hg38_100_sno_gene_gene_id.count.xz contains 21486 rows and merges to 21486 rows.
## preprocessing/TMRC30034/outputs/hisat2_hg38_100/r1_trimmed.count_hg38_100_sno_gene_gene_id.count.xz contains 21486 rows and merges to 21486 rows.
## preprocessing/TMRC30035/outputs/hisat2_hg38_100/r1_trimmed.count_hg38_100_sno_gene_gene_id.count.xz contains 21486 rows and merges to 21486 rows.
## preprocessing/TMRC30036/outputs/hisat2_hg38_100/r1_trimmed.count_hg38_100_sno_gene_gene_id.count.xz contains 21486 rows and merges to 21486 rows.
## preprocessing/TMRC30044/outputs/hisat2_hg38_100/r1_trimmed.count_hg38_100_sno_gene_gene_id.count.xz contains 21486 rows and merges to 21486 rows.
## preprocessing/TMRC30055/outputs/hisat2_hg38_100/r1_trimmed.count_hg38_100_sno_gene_gene_id.count.xz contains 21486 rows and merges to 21486 rows.
## preprocessing/TMRC30068/outputs/hisat2_hg38_100/r1_trimmed.count_hg38_100_sno_gene_gene_id.count.xz contains 21486 rows and merges to 21486 rows.
## preprocessing/TMRC30070/outputs/hisat2_hg38_100/r1_trimmed.count_hg38_100_sno_gene_gene_id.count.xz contains 21486 rows and merges to 21486 rows.
## preprocessing/TMRC30041/outputs/hisat2_hg38_100/r1_trimmed.count_hg38_100_sno_gene_gene_id.count.xz contains 21486 rows and merges to 21486 rows.
## preprocessing/TMRC30042/outputs/hisat2_hg38_100/r1_trimmed.count_hg38_100_sno_gene_gene_id.count.xz contains 21486 rows and merges to 21486 rows.
## preprocessing/TMRC30043/outputs/hisat2_hg38_100/r1_trimmed.count_hg38_100_sno_gene_gene_id.count.xz contains 21486 rows and merges to 21486 rows.
## preprocessing/TMRC30045/outputs/hisat2_hg38_100/r1_trimmed.count_hg38_100_sno_gene_gene_id.count.xz contains 21486 rows and merges to 21486 rows.
## preprocessing/TMRC30059/outputs/hisat2_hg38_100/r1_trimmed.count_hg38_100_sno_gene_gene_id.count.xz contains 21486 rows and merges to 21486 rows.
## preprocessing/TMRC30060/outputs/hisat2_hg38_100/r1_trimmed.count_hg38_100_sno_gene_gene_id.count.xz contains 21486 rows and merges to 21486 rows.
## preprocessing/TMRC30061/outputs/hisat2_hg38_100/r1_trimmed.count_hg38_100_sno_gene_gene_id.count.xz contains 21486 rows and merges to 21486 rows.
## preprocessing/TMRC30062/outputs/hisat2_hg38_100/r1_trimmed.count_hg38_100_sno_gene_gene_id.count.xz contains 21486 rows and merges to 21486 rows.
## preprocessing/TMRC30063/outputs/hisat2_hg38_100/r1_trimmed.count_hg38_100_sno_gene_gene_id.count.xz contains 21486 rows and merges to 21486 rows.
## preprocessing/TMRC30051/outputs/hisat2_hg38_100/r1_trimmed.count_hg38_100_sno_gene_gene_id.count.xz contains 21486 rows and merges to 21486 rows.
## preprocessing/TMRC30064/outputs/hisat2_hg38_100/r1_trimmed.count_hg38_100_sno_gene_gene_id.count.xz contains 21486 rows and merges to 21486 rows.
## preprocessing/TMRC30065/outputs/hisat2_hg38_100/r1_trimmed.count_hg38_100_sno_gene_gene_id.count.xz contains 21486 rows and merges to 21486 rows.
## preprocessing/TMRC30066/outputs/hisat2_hg38_100/r1_trimmed.count_hg38_100_sno_gene_gene_id.count.xz contains 21486 rows and merges to 21486 rows.
## preprocessing/TMRC30067/outputs/hisat2_hg38_100/r1_trimmed.count_hg38_100_sno_gene_gene_id.count.xz contains 21486 rows and merges to 21486 rows.
## preprocessing/TMRC30057/outputs/hisat2_hg38_100/r1_trimmed.count_hg38_100_sno_gene_gene_id.count.xz contains 21486 rows and merges to 21486 rows.
## preprocessing/TMRC30069/outputs/hisat2_hg38_100/r1_trimmed.count_hg38_100_sno_gene_gene_id.count.xz contains 21486 rows and merges to 21486 rows.
## preprocessing/TMRC30074/outputs/hisat2_hg38_100/r1_trimmed.count_hg38_100_sno_gene_gene_id.count.xz contains 21486 rows and merges to 21486 rows.
## preprocessing/TMRC30072/outputs/hisat2_hg38_100/r1_trimmed.count_hg38_100_sno_gene_gene_id.count.xz contains 21486 rows and merges to 21486 rows.
## preprocessing/TMRC30076/outputs/hisat2_hg38_100/r1_trimmed.count_hg38_100_sno_gene_gene_id.count.xz contains 21486 rows and merges to 21486 rows.
## preprocessing/TMRC30077/outputs/hisat2_hg38_100/r1_trimmed.count_hg38_100_sno_gene_gene_id.count.xz contains 21486 rows and merges to 21486 rows.
## preprocessing/TMRC30078/outputs/hisat2_hg38_100/r1_trimmed.count_hg38_100_sno_gene_gene_id.count.xz contains 21486 rows and merges to 21486 rows.
## preprocessing/TMRC30088/outputs/hisat2_hg38_100/r1_trimmed.count_hg38_100_sno_gene_gene_id.count.xz contains 21486 rows and merges to 21486 rows.
## preprocessing/TMRC30079/outputs/hisat2_hg38_100/r1_trimmed.count_hg38_100_sno_gene_gene_id.count.xz contains 21486 rows and merges to 21486 rows.
## preprocessing/TMRC30097/outputs/hisat2_hg38_100/r1_trimmed.count_hg38_100_sno_gene_gene_id.count.xz contains 21486 rows and merges to 21486 rows.
## preprocessing/TMRC30075/outputs/hisat2_hg38_100/r1_trimmed.count_hg38_100_sno_gene_gene_id.count.xz contains 21486 rows and merges to 21486 rows.
## preprocessing/TMRC30085/outputs/hisat2_hg38_100/r1_trimmed.count_hg38_100_sno_gene_gene_id.count.xz contains 21486 rows and merges to 21486 rows.
## preprocessing/TMRC30086/outputs/hisat2_hg38_100/r1_trimmed.count_hg38_100_sno_gene_gene_id.count.xz contains 21486 rows and merges to 21486 rows.
## preprocessing/TMRC30087/outputs/hisat2_hg38_100/r1_trimmed.count_hg38_100_sno_gene_gene_id.count.xz contains 21486 rows and merges to 21486 rows.
## preprocessing/TMRC30101/outputs/hisat2_hg38_100/r1_trimmed.count_hg38_100_sno_gene_gene_id.count.xz contains 21486 rows and merges to 21486 rows.
## preprocessing/TMRC30089/outputs/hisat2_hg38_100/r1_trimmed.count_hg38_100_sno_gene_gene_id.count.xz contains 21486 rows and merges to 21486 rows.
## preprocessing/TMRC30090/outputs/hisat2_hg38_100/r1_trimmed.count_hg38_100_sno_gene_gene_id.count.xz contains 21486 rows and merges to 21486 rows.
## preprocessing/TMRC30081/outputs/hisat2_hg38_100/r1_trimmed.count_hg38_100_sno_gene_gene_id.count.xz contains 21486 rows and merges to 21486 rows.
## preprocessing/TMRC30092/outputs/hisat2_hg38_100/r1_trimmed.count_hg38_100_sno_gene_gene_id.count.xz contains 21486 rows and merges to 21486 rows.
## preprocessing/TMRC30104/outputs/hisat2_hg38_100/r1_trimmed.count_hg38_100_sno_gene_gene_id.count.xz contains 21486 rows and merges to 21486 rows.
## preprocessing/TMRC30106/outputs/hisat2_hg38_100/r1_trimmed.count_hg38_100_sno_gene_gene_id.count.xz contains 21486 rows and merges to 21486 rows.
## preprocessing/TMRC30095/outputs/hisat2_hg38_100/r1_trimmed.count_hg38_100_sno_gene_gene_id.count.xz contains 21486 rows and merges to 21486 rows.
## preprocessing/TMRC30108/outputs/hisat2_hg38_100/r1_trimmed.count_hg38_100_sno_gene_gene_id.count.xz contains 21486 rows and merges to 21486 rows.
## preprocessing/TMRC30084/outputs/hisat2_hg38_100/r1_trimmed.count_hg38_100_sno_gene_gene_id.count.xz contains 21486 rows and merges to 21486 rows.
## preprocessing/TMRC30098/outputs/hisat2_hg38_100/r1_trimmed.count_hg38_100_sno_gene_gene_id.count.xz contains 21486 rows and merges to 21486 rows.
## preprocessing/TMRC30099/outputs/hisat2_hg38_100/r1_trimmed.count_hg38_100_sno_gene_gene_id.count.xz contains 21486 rows and merges to 21486 rows.
## preprocessing/TMRC30100/outputs/hisat2_hg38_100/r1_trimmed.count_hg38_100_sno_gene_gene_id.count.xz contains 21486 rows and merges to 21486 rows.
## preprocessing/TMRC30102/outputs/hisat2_hg38_100/r1_trimmed.count_hg38_100_sno_gene_gene_id.count.xz contains 21486 rows and merges to 21486 rows.
## preprocessing/TMRC30091/outputs/hisat2_hg38_100/r1_trimmed.count_hg38_100_sno_gene_gene_id.count.xz contains 21486 rows and merges to 21486 rows.
## preprocessing/TMRC30073/outputs/hisat2_hg38_100/r1_trimmed.count_hg38_100_sno_gene_gene_id.count.xz contains 21486 rows and merges to 21486 rows.
## Finished reading count data.
## Warning in create_expt(samplesheet, file_column = "hg38100hisatfile", savefile
## = glue::glue("hs_expt_all-v{ver}.rda"), : Some samples were removed when cross
## referencing the samples against the count data.
## Matched 21440 annotations and counts.
## Bringing together the count matrix and gene information.
## Some annotations were lost in merging, setting them to 'undefined'.
## The final expressionset has 21481 rows and 108 columns.
hs_expt <- exclude_genes_expt(hs_expt, column="gene_biotype",
                              method="keep", pattern="protein_coding")
## Before removal, there were 21481 entries.
## Now there are 19928 entries.
## Percent kept: 99.600, 99.714, 99.759, 99.397, 99.540, 99.552, 99.928, 99.876, 99.938, 99.867, 79.229, 99.946, 99.860, 99.873, 92.600, 85.708, 99.880, 99.952, 99.900, 99.852, 99.961, 99.862, 99.946, 99.845, 99.954, 98.239, 99.837, 99.951, 89.738, 99.830, 99.951, 99.843, 99.855, 99.953, 99.915, 91.997, 99.882, 99.933, 99.863, 94.990, 92.874, 99.874, 99.948, 99.904, 97.076, 99.876, 99.955, 99.900, 99.881, 99.927, 99.801, 99.879, 99.953, 99.893, 99.899, 99.947, 99.908, 99.888, 99.941, 99.782, 80.330, 99.891, 99.941, 99.926, 99.905, 99.948, 99.883, 73.317, 99.812, 99.904, 99.865, 99.913, 99.888, 99.924, 99.847, 99.898, 99.904, 99.869, 99.895, 99.928, 99.811, 99.891, 99.935, 99.830, 99.894, 99.944, 99.811, 89.882, 86.953, 92.560, 93.354, 83.616, 88.383, 94.220, 91.439, 93.996, 92.838, 80.268, 95.899, 93.052, 93.651, 95.931, 90.869, 98.763, 98.397, 97.735, 99.166, 89.231
## Percent removed: 0.400, 0.286, 0.241, 0.603, 0.460, 0.448, 0.072, 0.124, 0.062, 0.133, 20.771, 0.054, 0.140, 0.127, 7.400, 14.292, 0.120, 0.048, 0.100, 0.148, 0.039, 0.138, 0.054, 0.155, 0.046, 1.761, 0.163, 0.049, 10.262, 0.170, 0.049, 0.157, 0.145, 0.047, 0.085, 8.003, 0.118, 0.067, 0.137, 5.010, 7.126, 0.126, 0.052, 0.096, 2.924, 0.124, 0.045, 0.100, 0.119, 0.073, 0.199, 0.121, 0.047, 0.107, 0.101, 0.053, 0.092, 0.112, 0.059, 0.218, 19.670, 0.109, 0.059, 0.074, 0.095, 0.052, 0.117, 26.683, 0.188, 0.096, 0.135, 0.087, 0.112, 0.076, 0.153, 0.102, 0.096, 0.131, 0.105, 0.072, 0.189, 0.109, 0.065, 0.170, 0.106, 0.056, 0.189, 10.118, 13.047, 7.440, 6.646, 16.384, 11.617, 5.780, 8.561, 6.004, 7.162, 19.732, 4.101, 6.948, 6.349, 4.069, 9.131, 1.237, 1.603, 2.265, 0.834, 10.769
libsizes <- plot_libsize(hs_expt)
## The scale difference between the smallest and largest
## libraries is > 10. Assuming a log10 scale is better, set scale = FALSE if not.
libsizes$plot

nonzero <- plot_nonzero(hs_expt)
nonzero$plot
## Warning: ggrepel: 90 unlabeled data points (too many overlaps). Consider
## increasing max.overlaps

box <- plot_boxplot(hs_expt)
## This data will benefit from being displayed on the log scale.
## If this is not desired, set scale='raw'
## Some entries are 0.  We are on log scale, adding 1 to the data.
## Changed 520052 zero count features.
box

3.2 Minimum coverage sample filtering

I arbitrarily chose 3,000,000 counts as a minimal level of coverage. We may want this to be higher.

hs_valid <- subset_expt(hs_expt, coverage=3000000)
## Subsetting given a minimal number of counts/sample.
## There were 108, now there are 104 samples.
plot_libsize(hs_valid)$plot
## The scale difference between the smallest and largest
## libraries is > 10. Assuming a log10 scale is better, set scale = FALSE if not.
valid_write <- sm(write_expt(hs_valid, excel=glue("excel/hs_valid-v{ver}.xlsx")))

4 Questions from Maria Adelaida

The following comes from an email 20190830 from Maria Adelaida.

  1. Samples WT1010 and WT1011 PBMCs from two healthy donors processed 2h, 7h and 12h after sample procurement. This is an analysis to explore the time-effect on gene expression and define steps for data analysis for patient samples considering time-dependent effects.

    1. An initial PCA on the raw data would be very useful to see if there is clustering based on time or (as usual), mostly a donor-specific effect. Then I think a hierarchical clustering of genes based on time-dependent modifications to see what is mostly affected (if any) - like what you guys did for T.cruzi.
  2. Samples from SU1017, SU1034 Samples from TMRC CL patients. m= monocyte, n= neutrophil. Samples labeled “1” are taken before treatment and those “2” mid way through treatment. This is exiting, because these will be our first neutrophil transcriptomes.

In an attempt to poke at these questions, I mapped the reads to hg38_91 using salmon and hisat2. It is very noteworthy that the salmon mappings are exhibiting some serious problems and should be looked into further. The hisat2 mappings are significantly more ‘normal’. Having said that, two samples remain basically unusable: tmrc30009 (1034n1) and (to a smaller degree) tmrc30007 (1017n1) have too few reads as shown above.

4.1 Preparation

To address these, I added to the end of the sample sheet columns named ‘condition’, ‘batch’, ‘donor’, and ‘time’. These are filled in with shorthand values according to the above.

4.2 Global view

Before addressing the questions explicitly by subsetting the data, I want to get a look at the samples as they are.

hs_valid <- set_expt_batches(hs_valid, fact="donor")
hs_valid <- set_expt_samplenames(hs_valid, newnames=pData(hs_valid)[["samplename"]])
all_norm <- normalize_expt(hs_valid, convert="cpm", batch="svaseq",
                           filter=TRUE)
## This function will replace the expt$expressionset slot with:
## svaseq(cpm(cbcb(data)))
## It will save copies of each step along the way
##  in expt$normalized with the corresponding libsizes. Keep libsizes in mind
##  when invoking limma.  The appropriate libsize is non-log(cpm(normalized)).
##  This is most likely kept at:
##  'new_expt$normalized$intermediate_counts$normalization$libsizes'
##  A copy of this may also be found at:
##  new_expt$best_libsize
## Leaving the data in its current base format, keep in mind that
##  some metrics are easier to see when the data is log2 transformed, but
##  EdgeR/DESeq do not accept transformed data.
## Leaving the data unnormalized.  This is necessary for DESeq, but
##  EdgeR/limma might benefit from normalization.  Good choices include quantile,
##  size-factor, tmm, etc.
## Step 1: performing count filter with option: cbcb
## Removing 5276 low-count genes (14652 remaining).
## Step 2: not normalizing the data.
## Step 3: converting the data with cpm.
## The method is: svaseq.
## Step 4: doing batch correction with svaseq.
## Using the current state of normalization.
## Passing the data to all_adjusters using the svaseq estimate type.
## batch_counts: Before batch/surrogate estimation, 1160446 entries are x>1: 76%.
## batch_counts: Before batch/surrogate estimation, 89539 entries are x==0: 6%.
## batch_counts: Before batch/surrogate estimation, 273823 entries are 0<x<1: 18%.
## The be method chose 10 surrogate variables.
## Attempting svaseq estimation with 10 surrogates.
## There are 19041 (1%) elements which are < 0 after batch correction.
## Setting low elements to zero.
## Step 4: not transforming the data.
all_norm <- normalize_expt(all_norm, transform="log2")
## This function will replace the expt$expressionset slot with:
## log2(data)
## It will save copies of each step along the way
##  in expt$normalized with the corresponding libsizes. Keep libsizes in mind
##  when invoking limma.  The appropriate libsize is non-log(cpm(normalized)).
##  This is most likely kept at:
##  'new_expt$normalized$intermediate_counts$normalization$libsizes'
##  A copy of this may also be found at:
##  new_expt$best_libsize
## Filter is false, this should likely be set to something, good
##  choices include cbcb, kofa, pofa (anything but FALSE).  If you want this to
##  stay FALSE, keep in mind that if other normalizations are performed, then the
##  resulting libsizes are likely to be strange (potentially negative!)
## Leaving the data unconverted.  It is often advisable to cpm/rpkm
##  the data to normalize for sampling differences, keep in mind though that rpkm
##  has some annoying biases, and voom() by default does a cpm (though hpgl_voom()
##  will try to detect this).
## Leaving the data unnormalized.  This is necessary for DESeq, but
##  EdgeR/limma might benefit from normalization.  Good choices include quantile,
##  size-factor, tmm, etc.
## Not correcting the count-data for batch effects.  If batch is
##  included in EdgerR/limma's model, then this is probably wise; but in extreme
##  batch effects this is a good parameter to play with.
## Step 1: not doing count filtering.
## Step 2: not normalizing the data.
## Step 3: not converting the data.
## The method is: raw.
## Step 4: not doing batch correction.
## Step 4: transforming the data with log2.
## transform_counts: Found 19041 values equal to 0, adding 1 to the matrix.
plt <- plot_pca(all_norm, plot_labels=FALSE)$plot
## Potentially check over the experimental design, there appear to be missing values.
## Warning in plot_pca(all_norm, plot_labels = FALSE): There are NA values in the
## component data. This can lead to weird plotting errors.
## Not putting labels on the PC plot.
pp(file=glue("images/tmrc3_pca_nolabels-v{ver}.pdf"), image=plt)
## Writing the image to: images/tmrc3_pca_nolabels-v202103.pdf and calling dev.off().
## Warning: Removed 21 rows containing missing values (geom_point).
## Warning: Removed 21 rows containing missing values (geom_point).

plt
## Warning: Removed 21 rows containing missing values (geom_point).

all_ts <- plot_tsne(all_norm)
## Potentially check over the experimental design, there appear to be missing values.
## Warning in plot_pca(..., pc_method = "tsne"): There are NA values in the
## component data. This can lead to weird plotting errors.
## plot labels was not set and there are more than 100 samples, disabling it.
## Not putting labels on the PC plot.
all_ts$plot
## Warning: Removed 21 rows containing missing values (geom_point).

knitr::kable(all_pca$table)
## Error in knitr::kable(all_pca$table): object 'all_pca' not found
write.csv(all_pca$table, file="coords/hs_donor_pca_coords.csv")
## Error in is.data.frame(x): object 'all_pca' not found
plot_corheat(all_norm)$plot

plot_topn(hs_valid)$plot
## `geom_smooth()` using formula 'y ~ x'

4.3 All celltypes clinical outcome

hs_clinical <- subset_expt(hs_valid, subset="condition!='PBMC'&condition!='Macrophage'")
## Using a subset expression.
## There were 104, now there are 86 samples.
hs_clinical <- set_expt_conditions(hs_clinical, fact="clinicaloutcome")
hs_clinical <- set_expt_batches(hs_clinical, fact="typeofcells")
chosen_colors <- c("#D95F02", "#7570B3", "#1B9E77", "#FF0000")
names(chosen_colors) <- c("cure", "failure", "lost", "null")
hs_clinical <- set_expt_colors(expt=hs_clinical, colors=chosen_colors)
## The new colors are a character, changing according to condition.
hs_clinical <- set_expt_samplenames(expt = hs_clinical, newnames = pData(hs_clinical)$samplename)
hs_clinical_norm <- normalize_expt(hs_clinical, filter=TRUE, convert="cpm", norm="quant")
## This function will replace the expt$expressionset slot with:
## cpm(quant(cbcb(data)))
## It will save copies of each step along the way
##  in expt$normalized with the corresponding libsizes. Keep libsizes in mind
##  when invoking limma.  The appropriate libsize is non-log(cpm(normalized)).
##  This is most likely kept at:
##  'new_expt$normalized$intermediate_counts$normalization$libsizes'
##  A copy of this may also be found at:
##  new_expt$best_libsize
## Leaving the data in its current base format, keep in mind that
##  some metrics are easier to see when the data is log2 transformed, but
##  EdgeR/DESeq do not accept transformed data.
## Not correcting the count-data for batch effects.  If batch is
##  included in EdgerR/limma's model, then this is probably wise; but in extreme
##  batch effects this is a good parameter to play with.
## Step 1: performing count filter with option: cbcb
## Removing 5472 low-count genes (14456 remaining).
## Step 2: normalizing the data with quant.
## Step 3: converting the data with cpm.
## The method is: raw.
## Step 4: not doing batch correction.
## Step 4: not transforming the data.
hs_clinical_norm <- normalize_expt(hs_clinical, transform="log2")
## This function will replace the expt$expressionset slot with:
## log2(data)
## It will save copies of each step along the way
##  in expt$normalized with the corresponding libsizes. Keep libsizes in mind
##  when invoking limma.  The appropriate libsize is non-log(cpm(normalized)).
##  This is most likely kept at:
##  'new_expt$normalized$intermediate_counts$normalization$libsizes'
##  A copy of this may also be found at:
##  new_expt$best_libsize
## Filter is false, this should likely be set to something, good
##  choices include cbcb, kofa, pofa (anything but FALSE).  If you want this to
##  stay FALSE, keep in mind that if other normalizations are performed, then the
##  resulting libsizes are likely to be strange (potentially negative!)
## Leaving the data unconverted.  It is often advisable to cpm/rpkm
##  the data to normalize for sampling differences, keep in mind though that rpkm
##  has some annoying biases, and voom() by default does a cpm (though hpgl_voom()
##  will try to detect this).
## Leaving the data unnormalized.  This is necessary for DESeq, but
##  EdgeR/limma might benefit from normalization.  Good choices include quantile,
##  size-factor, tmm, etc.
## Not correcting the count-data for batch effects.  If batch is
##  included in EdgerR/limma's model, then this is probably wise; but in extreme
##  batch effects this is a good parameter to play with.
## Step 1: not doing count filtering.
## Step 2: not normalizing the data.
## Step 3: not converting the data.
## The method is: raw.
## Step 4: not doing batch correction.
## Step 4: transforming the data with log2.
## transform_counts: Found 399372 values equal to 0, adding 1 to the matrix.
##plt <- plot_pca(hs_clinical_norm, plot_labels=FALSE, size_column="visitnumber")$plot
plt <- plot_pca(hs_clinical_norm, plot_labels=FALSE)$plot
## Not putting labels on the PC plot.
pp(file=glue("images/all_clinical_nobatch_pca-v{ver}.png"), image=plt, heigh=8, width=20)
## Writing the image to: images/all_clinical_nobatch_pca-v202103.png and calling dev.off().

plt

plt <- plot_pca(hs_clinical_norm, plot_labels=FALSE, size_column="visitnumber")$plot
## Not putting labels on the PC plot.
pp(file=glue("images/all_clinical_nobatch_pca_sized-v{ver}.png"), image=plt, heigh=8, width=20)
## Writing the image to: images/all_clinical_nobatch_pca_sized-v202103.png and calling dev.off().

plt

plt <- plot_pca(hs_clinical_norm)$plot
pp(file=glue("images/all_clinical_nobatch_pca_labeled-v{ver}.png"), height=8, width=20, image=plt)
## Writing the image to: images/all_clinical_nobatch_pca_labeled-v202103.png and calling dev.off().
## Warning: ggrepel: 1 unlabeled data points (too many overlaps). Consider
## increasing max.overlaps
## Warning: ggrepel: 10 unlabeled data points (too many overlaps). Consider
## increasing max.overlaps

plt
## Warning: ggrepel: 10 unlabeled data points (too many overlaps). Consider
## increasing max.overlaps

5 Repeat without Biopsies

hs_clinic <- subset_expt(hs_clinical, subset="batch!='Biopsy'")
## Using a subset expression.
## There were 86, now there are 54 samples.
hs_clinic_norm <- normalize_expt(hs_clinic, filter=TRUE, convert="cpm", norm="quant")
## This function will replace the expt$expressionset slot with:
## cpm(quant(cbcb(data)))
## It will save copies of each step along the way
##  in expt$normalized with the corresponding libsizes. Keep libsizes in mind
##  when invoking limma.  The appropriate libsize is non-log(cpm(normalized)).
##  This is most likely kept at:
##  'new_expt$normalized$intermediate_counts$normalization$libsizes'
##  A copy of this may also be found at:
##  new_expt$best_libsize
## Leaving the data in its current base format, keep in mind that
##  some metrics are easier to see when the data is log2 transformed, but
##  EdgeR/DESeq do not accept transformed data.
## Not correcting the count-data for batch effects.  If batch is
##  included in EdgerR/limma's model, then this is probably wise; but in extreme
##  batch effects this is a good parameter to play with.
## Step 1: performing count filter with option: cbcb
## Removing 8038 low-count genes (11890 remaining).
## Step 2: normalizing the data with quant.
## Step 3: converting the data with cpm.
## The method is: raw.
## Step 4: not doing batch correction.
## Step 4: not transforming the data.
hs_clinic_norm <- normalize_expt(hs_clinic, transform="log2")
## This function will replace the expt$expressionset slot with:
## log2(data)
## It will save copies of each step along the way
##  in expt$normalized with the corresponding libsizes. Keep libsizes in mind
##  when invoking limma.  The appropriate libsize is non-log(cpm(normalized)).
##  This is most likely kept at:
##  'new_expt$normalized$intermediate_counts$normalization$libsizes'
##  A copy of this may also be found at:
##  new_expt$best_libsize
## Filter is false, this should likely be set to something, good
##  choices include cbcb, kofa, pofa (anything but FALSE).  If you want this to
##  stay FALSE, keep in mind that if other normalizations are performed, then the
##  resulting libsizes are likely to be strange (potentially negative!)
## Leaving the data unconverted.  It is often advisable to cpm/rpkm
##  the data to normalize for sampling differences, keep in mind though that rpkm
##  has some annoying biases, and voom() by default does a cpm (though hpgl_voom()
##  will try to detect this).
## Leaving the data unnormalized.  This is necessary for DESeq, but
##  EdgeR/limma might benefit from normalization.  Good choices include quantile,
##  size-factor, tmm, etc.
## Not correcting the count-data for batch effects.  If batch is
##  included in EdgerR/limma's model, then this is probably wise; but in extreme
##  batch effects this is a good parameter to play with.
## Step 1: not doing count filtering.
## Step 2: not normalizing the data.
## Step 3: not converting the data.
## The method is: raw.
## Step 4: not doing batch correction.
## Step 4: transforming the data with log2.
## transform_counts: Found 282204 values equal to 0, adding 1 to the matrix.
plt <- plot_pca(hs_clinic_norm, plot_labels=FALSE)$plot
## Not putting labels on the PC plot.
pp(file = glue("images/no_biopsy_clinical_nobatch_pca-v{ver}.png"),
   height = 8, width = 20, image = plt)
## Writing the image to: images/no_biopsy_clinical_nobatch_pca-v202103.png and calling dev.off().

plt

plt <- plot_pca(hs_clinic_norm, plot_labels=FALSE, size_column="visitnumber")$plot
## Not putting labels on the PC plot.
plt

plt <- plot_pca(hs_clinic_norm)$plot
pp(file=glue("images/no_biopsy_clinical_nobatch_pca_labeled-v{ver}.png"),
   height = 8, width = 20, image = plt)
## Writing the image to: images/no_biopsy_clinical_nobatch_pca_labeled-v202103.png and calling dev.off().

plt

6 Combine cure and lost

Najib seems interested in this, but was curious to see how they look when the cure and lost samples are combined into a single group.

cl_idx <- pData(hs_clinical)[["condition"]] == "cure" |
  pData(hs_clinical)[["condition"]] == "lost"
new_factor <- pData(hs_clinical)[["condition"]]
new_factor[cl_idx] <- "cure_lost"
hs_cl <- set_expt_conditions(hs_clinical, fact=new_factor)

test <- normalize_expt(hs_cl, transform="log2", convert="cpm", norm="quant", filter=TRUE)
## This function will replace the expt$expressionset slot with:
## log2(cpm(quant(cbcb(data))))
## It will save copies of each step along the way
##  in expt$normalized with the corresponding libsizes. Keep libsizes in mind
##  when invoking limma.  The appropriate libsize is non-log(cpm(normalized)).
##  This is most likely kept at:
##  'new_expt$normalized$intermediate_counts$normalization$libsizes'
##  A copy of this may also be found at:
##  new_expt$best_libsize
## Not correcting the count-data for batch effects.  If batch is
##  included in EdgerR/limma's model, then this is probably wise; but in extreme
##  batch effects this is a good parameter to play with.
## Step 1: performing count filter with option: cbcb
## Removing 5472 low-count genes (14456 remaining).
## Step 2: normalizing the data with quant.
## Step 3: converting the data with cpm.
## The method is: raw.
## Step 4: not doing batch correction.
## Step 4: transforming the data with log2.
## transform_counts: Found 47 values equal to 0, adding 1 to the matrix.
plot_pca(test)$plot
## Warning: ggrepel: 63 unlabeled data points (too many overlaps). Consider
## increasing max.overlaps

hs_clv2 <- subset_expt(hs_cl, subset="batch!='Biopsy'")
## Using a subset expression.
## There were 86, now there are 54 samples.
hs_clv2_norm <- normalize_expt(hs_clv2, filter=TRUE, convert="cpm", norm="quant")
## This function will replace the expt$expressionset slot with:
## cpm(quant(cbcb(data)))
## It will save copies of each step along the way
##  in expt$normalized with the corresponding libsizes. Keep libsizes in mind
##  when invoking limma.  The appropriate libsize is non-log(cpm(normalized)).
##  This is most likely kept at:
##  'new_expt$normalized$intermediate_counts$normalization$libsizes'
##  A copy of this may also be found at:
##  new_expt$best_libsize
## Leaving the data in its current base format, keep in mind that
##  some metrics are easier to see when the data is log2 transformed, but
##  EdgeR/DESeq do not accept transformed data.
## Not correcting the count-data for batch effects.  If batch is
##  included in EdgerR/limma's model, then this is probably wise; but in extreme
##  batch effects this is a good parameter to play with.
## Step 1: performing count filter with option: cbcb
## Removing 8038 low-count genes (11890 remaining).
## Step 2: normalizing the data with quant.
## Step 3: converting the data with cpm.
## The method is: raw.
## Step 4: not doing batch correction.
## Step 4: not transforming the data.
hs_clv2_norm <- normalize_expt(hs_clv2, transform="log2")
## This function will replace the expt$expressionset slot with:
## log2(data)
## It will save copies of each step along the way
##  in expt$normalized with the corresponding libsizes. Keep libsizes in mind
##  when invoking limma.  The appropriate libsize is non-log(cpm(normalized)).
##  This is most likely kept at:
##  'new_expt$normalized$intermediate_counts$normalization$libsizes'
##  A copy of this may also be found at:
##  new_expt$best_libsize
## Filter is false, this should likely be set to something, good
##  choices include cbcb, kofa, pofa (anything but FALSE).  If you want this to
##  stay FALSE, keep in mind that if other normalizations are performed, then the
##  resulting libsizes are likely to be strange (potentially negative!)
## Leaving the data unconverted.  It is often advisable to cpm/rpkm
##  the data to normalize for sampling differences, keep in mind though that rpkm
##  has some annoying biases, and voom() by default does a cpm (though hpgl_voom()
##  will try to detect this).
## Leaving the data unnormalized.  This is necessary for DESeq, but
##  EdgeR/limma might benefit from normalization.  Good choices include quantile,
##  size-factor, tmm, etc.
## Not correcting the count-data for batch effects.  If batch is
##  included in EdgerR/limma's model, then this is probably wise; but in extreme
##  batch effects this is a good parameter to play with.
## Step 1: not doing count filtering.
## Step 2: not normalizing the data.
## Step 3: not converting the data.
## The method is: raw.
## Step 4: not doing batch correction.
## Step 4: transforming the data with log2.
## transform_counts: Found 282204 values equal to 0, adding 1 to the matrix.
plt <- plot_pca(hs_clv2_norm, plot_labels=FALSE)$plot
## Not putting labels on the PC plot.
hs_clv2_de <- all_pairwise(hs_clv2, model_batch=TRUE)
## Plotting a PCA before surrogate/batch inclusion.
## Not putting labels on the PC plot.
## Using limma's removeBatchEffect to visualize with(out) batch inclusion.
## Not putting labels on the PC plot.
## Finished running DE analyses, collecting outputs.
## Comparing analyses.

7 Cell types

The following blocks split the samples into a few groups by sample type and look at the distributions between them.

7.1 Implementation details

Get top/bottom n genes for each cell type, using clinical outcome as the factor of interest. For the moment, use sva for the DE analysis. Provide cpms for the top/bottom n genes.

Start with top/bottom 200. Perform default logFC and p-value as well.

7.1.1 Shared contrasts

Here is the contrast we will use throughput, I am leaving open the option to add more.

keepers <- list(
  "fail_vs_cure" = c("failure", "cure"))

8 NOTE

Sample sheet rows 11-14 had the clinical outcome set to ‘NA’ instead of cure/fail/lost In addition, some newer entries were ‘Cure/Failure’ instead of ‘cure/failure’, I changed this.

8.1 Monocytes

mono <- subset_expt(hs_valid, subset="typeofcells=='Monocytes'")
## Using a subset expression.
## There were 104, now there are 20 samples.
mono <- set_expt_conditions(mono, fact="clinicaloutcome")
mono <- set_expt_batches(mono, fact="donor")
## FIXME set_expt_colors should speak up if there are mismatches here!!!
mono <- set_expt_colors(expt=mono, colors=chosen_colors)
## The new colors are a character, changing according to condition.
save_result <- save(mono, file="rda/monocyte_expt.rda")
mono_norm <- normalize_expt(mono, convert="cpm", filter=TRUE)
## This function will replace the expt$expressionset slot with:
## cpm(cbcb(data))
## It will save copies of each step along the way
##  in expt$normalized with the corresponding libsizes. Keep libsizes in mind
##  when invoking limma.  The appropriate libsize is non-log(cpm(normalized)).
##  This is most likely kept at:
##  'new_expt$normalized$intermediate_counts$normalization$libsizes'
##  A copy of this may also be found at:
##  new_expt$best_libsize
## Leaving the data in its current base format, keep in mind that
##  some metrics are easier to see when the data is log2 transformed, but
##  EdgeR/DESeq do not accept transformed data.
## Leaving the data unnormalized.  This is necessary for DESeq, but
##  EdgeR/limma might benefit from normalization.  Good choices include quantile,
##  size-factor, tmm, etc.
## Not correcting the count-data for batch effects.  If batch is
##  included in EdgerR/limma's model, then this is probably wise; but in extreme
##  batch effects this is a good parameter to play with.
## Step 1: performing count filter with option: cbcb
## Removing 9025 low-count genes (10903 remaining).
## Step 2: not normalizing the data.
## Step 3: converting the data with cpm.
## The method is: raw.
## Step 4: not doing batch correction.
## Step 4: not transforming the data.
mono_norm <- normalize_expt(mono_norm, transform="log2")
## This function will replace the expt$expressionset slot with:
## log2(data)
## It will save copies of each step along the way
##  in expt$normalized with the corresponding libsizes. Keep libsizes in mind
##  when invoking limma.  The appropriate libsize is non-log(cpm(normalized)).
##  This is most likely kept at:
##  'new_expt$normalized$intermediate_counts$normalization$libsizes'
##  A copy of this may also be found at:
##  new_expt$best_libsize
## Filter is false, this should likely be set to something, good
##  choices include cbcb, kofa, pofa (anything but FALSE).  If you want this to
##  stay FALSE, keep in mind that if other normalizations are performed, then the
##  resulting libsizes are likely to be strange (potentially negative!)
## Leaving the data unconverted.  It is often advisable to cpm/rpkm
##  the data to normalize for sampling differences, keep in mind though that rpkm
##  has some annoying biases, and voom() by default does a cpm (though hpgl_voom()
##  will try to detect this).
## Leaving the data unnormalized.  This is necessary for DESeq, but
##  EdgeR/limma might benefit from normalization.  Good choices include quantile,
##  size-factor, tmm, etc.
## Not correcting the count-data for batch effects.  If batch is
##  included in EdgerR/limma's model, then this is probably wise; but in extreme
##  batch effects this is a good parameter to play with.
## Step 1: not doing count filtering.
## Step 2: not normalizing the data.
## Step 3: not converting the data.
## The method is: raw.
## Step 4: not doing batch correction.
## Step 4: transforming the data with log2.
## transform_counts: Found 617 values equal to 0, adding 1 to the matrix.
plt <- plot_pca(mono_norm, plot_labels=FALSE)$plot
## Not putting labels on the PC plot.
pp(file=glue("images/mono_pca_normalized-v{ver}.pdf"), image=plt)
## Writing the image to: images/mono_pca_normalized-v202103.pdf and calling dev.off().

plt

mono_de <- sm(all_pairwise(mono, model_batch="svaseq", filter=TRUE))

mono_tables <- combine_de_tables(mono_de, keepers=keepers,
                                 excel=glue::glue("excel/monocyte_clinical_all_tables-v{ver}.xlsx"))
## Writing a legend of columns.
## Printing a pca plot before/after surrogates/batch estimation.
## Working on 1/1: fail_vs_cure which is: failure/cure.
## Found table with failure_vs_cure
## Adding venn plots for fail_vs_cure.

## Limma expression coefficients for fail_vs_cure; R^2: 0.969; equation: y = 0.995x - 0.0119
## Deseq expression coefficients for fail_vs_cure; R^2: 0.974; equation: y = 1.03x - 0.301
## Edger expression coefficients for fail_vs_cure; R^2: 0.974; equation: y = 1.03x - 0.31
## Writing summary information, compare_plot is: TRUE.
## Performing save of excel/monocyte_clinical_all_tables-v202103.xlsx.

written <- write_xlsx(data=mono_tables[["data"]][[1]],
                      excel=glue::glue("excel/monocyte_clinical_table-v{ver}.xlsx"))
## Saving to: excel/monocyte_clinical_table-v202103.xlsx
mono_sig <- extract_significant_genes(mono_tables, according_to="deseq")
## Printing significant genes to the file:
## 1/1: Creating significant table up_deseq_fail_vs_cure
written <- write_xlsx(data=mono_sig[["deseq"]][["ups"]][[1]],
                      excel=glue::glue("excel/monocyte_clinical_sigup-v{ver}.xlsx"))
## Saving to: excel/monocyte_clinical_sigup-v202103.xlsx
written <- write_xlsx(data=mono_sig[["deseq"]][["downs"]][[1]],
                      excel=glue::glue("excel/monocyte_clinical_sigdown-v{ver}.xlsx"))
## Saving to: excel/monocyte_clinical_sigdown-v202103.xlsx
mono_pct_sig <- extract_significant_genes(mono_tables, n=200, lfc=NULL, p=NULL, according_to="deseq")
## Getting the top and bottom 200 genes.
## Printing significant genes to the file:
## 1/1: Creating significant table up_deseq_fail_vs_cure
written <- write_xlsx(data=mono_pct_sig[["deseq"]][["ups"]][[1]],
                      excel=glue::glue("excel/monocyte_clinical_sigup_pct-v{ver}.xlsx"))
## Saving to: excel/monocyte_clinical_sigup_pct-v202103.xlsx
written <- write_xlsx(data=mono_pct_sig[["deseq"]][["downs"]][[1]],
                      excel=glue::glue("excel/monocyte_clinical_sigdown_pct-v{ver}.xlsx"))
## Saving to: excel/monocyte_clinical_sigdown_pct-v202103.xlsx
mono_sig$summary_df
## data frame with 0 columns and 1 row
mono_cpm <- sm(normalize_expt(mono, convert="cpm"))
written <- write_xlsx(data=exprs(mono_cpm),
                      excel=glue::glue("excel/monocyte_cpm_before_batch-v{ver}.xlsx"))
## Saving to: excel/monocyte_cpm_before_batch-v202103.xlsx
mono_bcpm <- sm(normalize_expt(mono, filter=TRUE, convert="cpm", batch="svaseq"))
written <- write_xlsx(data=exprs(mono_bcpm),
                      excel=glue::glue("excel/monocyte_cpm_after_batch-v{ver}.xlsx"))
## Saving to: excel/monocyte_cpm_after_batch-v202103.xlsx
ups <- mono_sig[["deseq"]][["ups"]][["fail_vs_cure"]]
downs <- mono_sig[["deseq"]][["downs"]][["fail_vs_cure"]]

up_goseq <- simple_goseq(sig_genes=ups, go_db=hs_go, length_db=hs_length)
## Using the row names of your table.
## Found 118 genes out of 119 from the sig_genes in the go_db.
## Found 119 genes out of 119 from the sig_genes in the length_db.
## Using manually entered categories.
## Calculating the p-values...
## 'select()' returned 1:1 mapping between keys and columns
## simple_goseq(): Calculating q-values
## simple_goseq(): Filling godata with terms, this is slow.
## Testing that go categories are defined.
## Removing undefined categories.
## Gathering synonyms.
## Gathering category definitions.
## simple_goseq(): Making pvalue plots for the ontologies.

broad_c7 <- GSEABase::getGmt("reference/msigdb/c7.all.v7.2.entrez.gmt",
                             collectionType=GSEABase::BroadCollection(category="c7"),
                             geneIdType=GSEABase::EntrezIdentifier())

up_goseq_gsva <- goseq_msigdb(sig_genes=ups, signatures=broad_c7,
                              signature_category="c7", length_db=hs_length)
## Starting to coerce the msig data to the ontology format.
## Finished coercing the msig data.
## Error in requireNamespace(orgdb): object 'orgdb' not found

8.2 Neutrophils

neut <- subset_expt(hs_valid, subset="typeofcells=='Neutrophils'")
## Using a subset expression.
## There were 104, now there are 20 samples.
neut <- set_expt_conditions(neut, fact="clinicaloutcome")
neut <- set_expt_batches(neut, fact="donor")
neut <- set_expt_colors(expt=neut, colors=chosen_colors)
## The new colors are a character, changing according to condition.
save_result <- save(neut, file="rda/neutrophil_expt.rda")
neut_norm <- sm(normalize_expt(neut, convert="cpm", batch = "svaseq", filter=TRUE))
neut_norm <- normalize_expt(neut_norm, transform="log2")
## This function will replace the expt$expressionset slot with:
## log2(data)
## It will save copies of each step along the way
##  in expt$normalized with the corresponding libsizes. Keep libsizes in mind
##  when invoking limma.  The appropriate libsize is non-log(cpm(normalized)).
##  This is most likely kept at:
##  'new_expt$normalized$intermediate_counts$normalization$libsizes'
##  A copy of this may also be found at:
##  new_expt$best_libsize
## Filter is false, this should likely be set to something, good
##  choices include cbcb, kofa, pofa (anything but FALSE).  If you want this to
##  stay FALSE, keep in mind that if other normalizations are performed, then the
##  resulting libsizes are likely to be strange (potentially negative!)
## Leaving the data unconverted.  It is often advisable to cpm/rpkm
##  the data to normalize for sampling differences, keep in mind though that rpkm
##  has some annoying biases, and voom() by default does a cpm (though hpgl_voom()
##  will try to detect this).
## Leaving the data unnormalized.  This is necessary for DESeq, but
##  EdgeR/limma might benefit from normalization.  Good choices include quantile,
##  size-factor, tmm, etc.
## Not correcting the count-data for batch effects.  If batch is
##  included in EdgerR/limma's model, then this is probably wise; but in extreme
##  batch effects this is a good parameter to play with.
## Step 1: not doing count filtering.
## Step 2: not normalizing the data.
## Step 3: not converting the data.
## The method is: raw.
## Step 4: not doing batch correction.
## Step 4: transforming the data with log2.
## transform_counts: Found 293 values equal to 0, adding 1 to the matrix.
plt <- plot_pca(neut_norm, plot_labels=FALSE)$plot
## Not putting labels on the PC plot.
pp(file=glue("images/neut_pca_normalized-v{ver}.pdf"), image=plt)
## Writing the image to: images/neut_pca_normalized-v202103.pdf and calling dev.off().

plt

neut_de <- sm(all_pairwise(neut, model_batch="svaseq", filter=TRUE))

neut_tables <- combine_de_tables(neut_de, keepers=keepers,
                                 excel=glue::glue("excel/neutrophil_clinical_all_tables-v{ver}.xlsx"))
## Writing a legend of columns.
## Printing a pca plot before/after surrogates/batch estimation.
## Working on 1/1: fail_vs_cure which is: failure/cure.
## Found table with failure_vs_cure
## Adding venn plots for fail_vs_cure.

## Limma expression coefficients for fail_vs_cure; R^2: 0.959; equation: y = 0.98x + 0.0973
## Deseq expression coefficients for fail_vs_cure; R^2: 0.961; equation: y = 0.968x + 0.295
## Edger expression coefficients for fail_vs_cure; R^2: 0.961; equation: y = 0.967x + 0.346
## Writing summary information, compare_plot is: TRUE.
## Performing save of excel/neutrophil_clinical_all_tables-v202103.xlsx.

written <- write_xlsx(data=neut_tables[["data"]][[1]],
                      excel=glue::glue("excel/neutrophil_clinical_table-v{ver}.xlsx"))
## Saving to: excel/neutrophil_clinical_table-v202103.xlsx
neut_sig <- extract_significant_genes(neut_tables, according_to="deseq")
## Printing significant genes to the file:
## 1/1: Creating significant table up_deseq_fail_vs_cure
written <- write_xlsx(data=neut_sig[["deseq"]][["ups"]][[1]],
                      excel=glue::glue("excel/neutrophil_clinical_sigup-v{ver}.xlsx"))
## Saving to: excel/neutrophil_clinical_sigup-v202103.xlsx
written <- write_xlsx(data=neut_sig[["deseq"]][["downs"]][[1]],
                      excel=glue::glue("excel/neutrophil_clinical_sigdown-v{ver}.xlsx"))
## Saving to: excel/neutrophil_clinical_sigdown-v202103.xlsx
neut_pct_sig <- extract_significant_genes(neut_tables, n=200, lfc=NULL, p=NULL, according_to="deseq")
## Getting the top and bottom 200 genes.
## Printing significant genes to the file:
## 1/1: Creating significant table up_deseq_fail_vs_cure
written <- write_xlsx(data=neut_sig[["deseq"]][["ups"]][[1]],
                      excel=glue::glue("excel/neutrophil_clinical_sigup_pct-v{ver}.xlsx"))
## Saving to: excel/neutrophil_clinical_sigup_pct-v202103.xlsx
written <- write_xlsx(data=neut_sig[["deseq"]][["downs"]][[1]],
                      excel=glue::glue("excel/neutrophil_clinical_sigdown_pct-v{ver}.xlsx"))
## Saving to: excel/neutrophil_clinical_sigdown_pct-v202103.xlsx
neut_cpm <- sm(normalize_expt(neut, convert="cpm"))
written <- write_xlsx(data=exprs(neut_cpm),
                      excel=glue::glue("excel/neutrophil_cpm_before_batch-v{ver}.xlsx"))
## Saving to: excel/neutrophil_cpm_before_batch-v202103.xlsx
neut_bcpm <- sm(normalize_expt(neut, filter=TRUE, convert="cpm", batch="svaseq"))
written <- write_xlsx(data=exprs(neut_bcpm),
                      excel=glue::glue("excel/neutrophil_cpm_after_batch-v{ver}.xlsx"))
## Saving to: excel/neutrophil_cpm_after_batch-v202103.xlsx

8.3 Eosinophils

eo <- subset_expt(hs_valid, subset="typeofcells=='Eosinophils'")
## Using a subset expression.
## There were 104, now there are 14 samples.
eo <- set_expt_conditions(eo, fact="clinicaloutcome")
eo <- set_expt_batches(eo, fact="donor")
eo <- set_expt_colors(expt=eo, colors=chosen_colors)
## The new colors are a character, changing according to condition.
save_result <- save(eo, file="rda/eosinophil_expt.rda")
eo_norm <- sm(normalize_expt(eo, convert="cpm", filter=TRUE))
eo_norm <- normalize_expt(eo_norm, transform="log2")
## This function will replace the expt$expressionset slot with:
## log2(data)
## It will save copies of each step along the way
##  in expt$normalized with the corresponding libsizes. Keep libsizes in mind
##  when invoking limma.  The appropriate libsize is non-log(cpm(normalized)).
##  This is most likely kept at:
##  'new_expt$normalized$intermediate_counts$normalization$libsizes'
##  A copy of this may also be found at:
##  new_expt$best_libsize
## Filter is false, this should likely be set to something, good
##  choices include cbcb, kofa, pofa (anything but FALSE).  If you want this to
##  stay FALSE, keep in mind that if other normalizations are performed, then the
##  resulting libsizes are likely to be strange (potentially negative!)
## Leaving the data unconverted.  It is often advisable to cpm/rpkm
##  the data to normalize for sampling differences, keep in mind though that rpkm
##  has some annoying biases, and voom() by default does a cpm (though hpgl_voom()
##  will try to detect this).
## Leaving the data unnormalized.  This is necessary for DESeq, but
##  EdgeR/limma might benefit from normalization.  Good choices include quantile,
##  size-factor, tmm, etc.
## Not correcting the count-data for batch effects.  If batch is
##  included in EdgerR/limma's model, then this is probably wise; but in extreme
##  batch effects this is a good parameter to play with.
## Step 1: not doing count filtering.
## Step 2: not normalizing the data.
## Step 3: not converting the data.
## The method is: raw.
## Step 4: not doing batch correction.
## Step 4: transforming the data with log2.
## transform_counts: Found 181 values equal to 0, adding 1 to the matrix.
plt <- plot_pca(eo_norm, plot_labels=FALSE)$plot
## Not putting labels on the PC plot.
pp(file=glue("images/eo_pca_normalized-v{ver}.pdf"), image=plt)
## Writing the image to: images/eo_pca_normalized-v202103.pdf and calling dev.off().

plt

eo_de <- sm(all_pairwise(eo, model_batch="svaseq", filter=TRUE))

eo_tables <- combine_de_tables(eo_de, keepers=keepers,
                               excel=glue::glue("excel/eosinophil_clinical_all_tables-v{ver}.xlsx"))
## Writing a legend of columns.
## Printing a pca plot before/after surrogates/batch estimation.
## Working on 1/1: fail_vs_cure which is: failure/cure.
## Found table with failure_vs_cure
## Adding venn plots for fail_vs_cure.

## Limma expression coefficients for fail_vs_cure; R^2: 0.967; equation: y = 0.982x + 0.0747
## Deseq expression coefficients for fail_vs_cure; R^2: 0.963; equation: y = 0.991x + 0.115
## Edger expression coefficients for fail_vs_cure; R^2: 0.963; equation: y = 0.99x + 0.096
## Writing summary information, compare_plot is: TRUE.
## Performing save of excel/eosinophil_clinical_all_tables-v202103.xlsx.

written <- write_xlsx(data=eo_tables[["data"]][[1]],
                      excel=glue::glue("excel/eosinophil_clinical_table-v{ver}.xlsx"))
## Saving to: excel/eosinophil_clinical_table-v202103.xlsx
eo_sig <- extract_significant_genes(eo_tables, according_to="deseq")
## Printing significant genes to the file:
## 1/1: Creating significant table up_deseq_fail_vs_cure
written <- write_xlsx(data=eo_sig[["deseq"]][["ups"]][[1]],
                      excel=glue::glue("excel/eosinophil_clinical_sigup-v{ver}.xlsx"))
## Saving to: excel/eosinophil_clinical_sigup-v202103.xlsx
written <- write_xlsx(data=eo_sig[["deseq"]][["downs"]][[1]],
                      excel=glue::glue("excel/eosinophil_clinical_sigdown-v{ver}.xlsx"))
## Saving to: excel/eosinophil_clinical_sigdown-v202103.xlsx
eo_pct_sig <- extract_significant_genes(eo_tables, n=200, lfc=NULL, p=NULL, according_to="deseq")
## Getting the top and bottom 200 genes.
## Printing significant genes to the file:
## 1/1: Creating significant table up_deseq_fail_vs_cure
written <- write_xlsx(data=eo_pct_sig[["deseq"]][["ups"]][[1]],
                      excel=glue::glue("excel/eosinophil_clinical_sigup_pct-v{ver}.xlsx"))
## Saving to: excel/eosinophil_clinical_sigup_pct-v202103.xlsx
written <- write_xlsx(data=eo_pct_sig[["deseq"]][["downs"]][[1]],
                      excel=glue::glue("excel/eosinophil_clinical_sigdown_pct-v{ver}.xlsx"))
## Saving to: excel/eosinophil_clinical_sigdown_pct-v202103.xlsx
eo_cpm <- sm(normalize_expt(eo, convert="cpm"))
written <- write_xlsx(data=exprs(eo_cpm),
                      excel=glue::glue("excel/eosinophil_cpm_before_batch-v{ver}.xlsx"))
## Saving to: excel/eosinophil_cpm_before_batch-v202103.xlsx
eo_bcpm <- sm(normalize_expt(eo, filter=TRUE, convert="cpm", batch="svaseq"))
written <- write_xlsx(data=exprs(eo_bcpm),
                      excel=glue::glue("excel/eosinophil_cpm_after_batch-v{ver}.xlsx"))
## Saving to: excel/eosinophil_cpm_after_batch-v202103.xlsx

8.4 Biopsies

biop <- subset_expt(hs_valid, subset="typeofcells=='Biopsy'")
## Using a subset expression.
## There were 104, now there are 32 samples.
biop <- set_expt_conditions(biop, fact="clinicaloutcome")
biop <- set_expt_batches(biop, fact="donor")
biop <- set_expt_colors(expt=biop, colors=chosen_colors)
## The new colors are a character, changing according to condition.
save_result <- save(biop, file="rda/biopsy_expt.rda")
biop_norm <- normalize_expt(biop, filter=TRUE, convert="cpm")
## This function will replace the expt$expressionset slot with:
## cpm(cbcb(data))
## It will save copies of each step along the way
##  in expt$normalized with the corresponding libsizes. Keep libsizes in mind
##  when invoking limma.  The appropriate libsize is non-log(cpm(normalized)).
##  This is most likely kept at:
##  'new_expt$normalized$intermediate_counts$normalization$libsizes'
##  A copy of this may also be found at:
##  new_expt$best_libsize
## Leaving the data in its current base format, keep in mind that
##  some metrics are easier to see when the data is log2 transformed, but
##  EdgeR/DESeq do not accept transformed data.
## Leaving the data unnormalized.  This is necessary for DESeq, but
##  EdgeR/limma might benefit from normalization.  Good choices include quantile,
##  size-factor, tmm, etc.
## Not correcting the count-data for batch effects.  If batch is
##  included in EdgerR/limma's model, then this is probably wise; but in extreme
##  batch effects this is a good parameter to play with.
## Step 1: performing count filter with option: cbcb
## Removing 5940 low-count genes (13988 remaining).
## Step 2: not normalizing the data.
## Step 3: converting the data with cpm.
## The method is: raw.
## Step 4: not doing batch correction.
## Step 4: not transforming the data.
biop_norm <- normalize_expt(biop_norm, transform="log2")
## This function will replace the expt$expressionset slot with:
## log2(data)
## It will save copies of each step along the way
##  in expt$normalized with the corresponding libsizes. Keep libsizes in mind
##  when invoking limma.  The appropriate libsize is non-log(cpm(normalized)).
##  This is most likely kept at:
##  'new_expt$normalized$intermediate_counts$normalization$libsizes'
##  A copy of this may also be found at:
##  new_expt$best_libsize
## Filter is false, this should likely be set to something, good
##  choices include cbcb, kofa, pofa (anything but FALSE).  If you want this to
##  stay FALSE, keep in mind that if other normalizations are performed, then the
##  resulting libsizes are likely to be strange (potentially negative!)
## Leaving the data unconverted.  It is often advisable to cpm/rpkm
##  the data to normalize for sampling differences, keep in mind though that rpkm
##  has some annoying biases, and voom() by default does a cpm (though hpgl_voom()
##  will try to detect this).
## Leaving the data unnormalized.  This is necessary for DESeq, but
##  EdgeR/limma might benefit from normalization.  Good choices include quantile,
##  size-factor, tmm, etc.
## Not correcting the count-data for batch effects.  If batch is
##  included in EdgerR/limma's model, then this is probably wise; but in extreme
##  batch effects this is a good parameter to play with.
## Step 1: not doing count filtering.
## Step 2: not normalizing the data.
## Step 3: not converting the data.
## The method is: raw.
## Step 4: not doing batch correction.
## Step 4: transforming the data with log2.
## transform_counts: Found 1757 values equal to 0, adding 1 to the matrix.
plt <- plot_pca(biop_norm, plot_labels = FALSE)$plot
## Potentially check over the experimental design, there appear to be missing values.
## Warning in plot_pca(biop_norm, plot_labels = FALSE): There are NA values in the
## component data. This can lead to weird plotting errors.
## Not putting labels on the PC plot.
pp(file=glue("images/biop_pca_normalized-v{ver}.pdf"), image=plt)
## Writing the image to: images/biop_pca_normalized-v202103.pdf and calling dev.off().
## Warning: Removed 21 rows containing missing values (geom_point).
## Warning: Removed 21 rows containing missing values (geom_point).

plt
## Warning: Removed 21 rows containing missing values (geom_point).

biop_de <- sm(all_pairwise(biop, model_batch="svaseq", filter=TRUE))

biop_tables <- combine_de_tables(biop_de, keepers=keepers,
                                 excel=glue::glue("excel/biopsy_clinical_all_tables-v{ver}.xlsx"))
## Writing a legend of columns.
## Printing a pca plot before/after surrogates/batch estimation.
## Warning: Removed 21 rows containing missing values (geom_point).

## Warning: Removed 21 rows containing missing values (geom_point).

## Warning: Removed 21 rows containing missing values (geom_point).

## Warning: Removed 21 rows containing missing values (geom_point).
## Working on 1/1: fail_vs_cure which is: failure/cure.
## Found table with failure_vs_cure
## Adding venn plots for fail_vs_cure.

## Limma expression coefficients for fail_vs_cure; R^2: 0.992; equation: y = 0.99x + 0.0492
## Deseq expression coefficients for fail_vs_cure; R^2: 0.99; equation: y = 0.993x + 0.111
## Edger expression coefficients for fail_vs_cure; R^2: 0.99; equation: y = 0.993x + 0.0684
## Writing summary information, compare_plot is: TRUE.
## Performing save of excel/biopsy_clinical_all_tables-v202103.xlsx.

written <- write_xlsx(data=biop_tables[["data"]][[1]],
                      excel=glue::glue("excel/biopsy_clinical_table-v{ver}.xlsx"))
## Saving to: excel/biopsy_clinical_table-v202103.xlsx
biop_sig <- extract_significant_genes(biop_tables, according_to="deseq")
## Printing significant genes to the file:
## 1/1: Creating significant table up_deseq_fail_vs_cure
##written <- write_xlsx(data=biop_sig[["deseq"]][["ups"]][[1]],
##                      excel=glue::glue("excel/biopsy_clinical_sigup-v{ver}.xlsx"))
written <- write_xlsx(data=biop_sig[["deseq"]][["downs"]][[1]],
                      excel=glue::glue("excel/biopsy_clinical_sigdown-v{ver}.xlsx"))
## Saving to: excel/biopsy_clinical_sigdown-v202103.xlsx
biop_pct_sig <- extract_significant_genes(biop_tables, n=200, lfc=NULL, p=NULL, according_to="deseq")
## Getting the top and bottom 200 genes.
## Printing significant genes to the file:
## 1/1: Creating significant table up_deseq_fail_vs_cure
written <- write_xlsx(data=biop_pct_sig[["deseq"]][["ups"]][[1]],
                      excel=glue::glue("excel/biopsy_clinical_sigup_pct-v{ver}.xlsx"))
## Saving to: excel/biopsy_clinical_sigup_pct-v202103.xlsx
written <- write_xlsx(data=biop_pct_sig[["deseq"]][["downs"]][[1]],
                      excel=glue::glue("excel/biopsy_clinical_sigdown_pct-v{ver}.xlsx"))
## Saving to: excel/biopsy_clinical_sigdown_pct-v202103.xlsx
biop_cpm <- sm(normalize_expt(biop, convert="cpm"))
written <- write_xlsx(data=exprs(biop_cpm),
                      excel=glue::glue("excel/biopsy_cpm_before_batch-v{ver}.xlsx"))
## Saving to: excel/biopsy_cpm_before_batch-v202103.xlsx
biop_bcpm <- sm(normalize_expt(biop, filter=TRUE, convert="cpm", batch="svaseq"))
written <- write_xlsx(data=exprs(biop_bcpm),
                      excel=glue::glue("excel/biopsy_cpm_after_batch-v{ver}.xlsx"))
## Saving to: excel/biopsy_cpm_after_batch-v202103.xlsx

8.5 Macrophages

These samples are rather different from all of the others. The following section is therefore written primarily in response to a separate set of emails from Olga and Maria Adelaida; here is a snippet:

Dear all, about the samples corresponding to infected macrophages with three sensitive (2.2) and three resistant (2.3) clinical strains of L. (V.) panamensis, I send you the results of parasite burden by detection of 7SLRNA. I think these results are interesting, but the sample size is very small. Doctor Najib or Trey could you please send me the quality data and PCA analysis of these samples?

and

Hi Doctor, thank you. These samples corresponding to primary macrophages infected with clinical strains 2.2 (n=3) and 2.3 (n = 3). These information is in the file: TMRC project 3: excel Host TMRC3 v1.1, rows 137 to 150.

Thus I added 3 columns to the end of the sample sheet which seek to include this information. The first is ‘drug’ and encodes both the infection state (no for the two controls and yes for everything else), the second is zymodeme which I took from the tmrc2 sample sheet, the last is drug, which is either no or sb.

macr <- subset_expt(hs_valid, subset="typeofcells=='Macrophages'")
## Using a subset expression.
## There were 104, now there are 12 samples.
macr <- set_expt_conditions(macr, fact="zymodeme")
macr <- set_expt_batches(macr, fact="macrdrug")

macr_norm <- normalize_expt(macr, norm="quant", convert="cpm", filter=TRUE)
## This function will replace the expt$expressionset slot with:
## cpm(quant(cbcb(data)))
## It will save copies of each step along the way
##  in expt$normalized with the corresponding libsizes. Keep libsizes in mind
##  when invoking limma.  The appropriate libsize is non-log(cpm(normalized)).
##  This is most likely kept at:
##  'new_expt$normalized$intermediate_counts$normalization$libsizes'
##  A copy of this may also be found at:
##  new_expt$best_libsize
## Leaving the data in its current base format, keep in mind that
##  some metrics are easier to see when the data is log2 transformed, but
##  EdgeR/DESeq do not accept transformed data.
## Not correcting the count-data for batch effects.  If batch is
##  included in EdgerR/limma's model, then this is probably wise; but in extreme
##  batch effects this is a good parameter to play with.
## Step 1: performing count filter with option: cbcb
## Removing 8899 low-count genes (11029 remaining).
## Step 2: normalizing the data with quant.
## Step 3: converting the data with cpm.
## The method is: raw.
## Step 4: not doing batch correction.
## Step 4: not transforming the data.
macr_norm <- normalize_expt(macr_norm, transform="log2")
## This function will replace the expt$expressionset slot with:
## log2(data)
## It will save copies of each step along the way
##  in expt$normalized with the corresponding libsizes. Keep libsizes in mind
##  when invoking limma.  The appropriate libsize is non-log(cpm(normalized)).
##  This is most likely kept at:
##  'new_expt$normalized$intermediate_counts$normalization$libsizes'
##  A copy of this may also be found at:
##  new_expt$best_libsize
## Filter is false, this should likely be set to something, good
##  choices include cbcb, kofa, pofa (anything but FALSE).  If you want this to
##  stay FALSE, keep in mind that if other normalizations are performed, then the
##  resulting libsizes are likely to be strange (potentially negative!)
## Leaving the data unconverted.  It is often advisable to cpm/rpkm
##  the data to normalize for sampling differences, keep in mind though that rpkm
##  has some annoying biases, and voom() by default does a cpm (though hpgl_voom()
##  will try to detect this).
## Leaving the data unnormalized.  This is necessary for DESeq, but
##  EdgeR/limma might benefit from normalization.  Good choices include quantile,
##  size-factor, tmm, etc.
## Not correcting the count-data for batch effects.  If batch is
##  included in EdgerR/limma's model, then this is probably wise; but in extreme
##  batch effects this is a good parameter to play with.
## Step 1: not doing count filtering.
## Step 2: not normalizing the data.
## Step 3: not converting the data.
## The method is: raw.
## Step 4: not doing batch correction.
## Step 4: transforming the data with log2.
plt <- plot_pca(macr_norm, plot_labels=FALSE)$plot
## Not putting labels on the PC plot.
pp(file=glue("images/macrophage_side_experiment_norm_pca-v{ver}.pdf"), image=plt)
## Writing the image to: images/macrophage_side_experiment_norm_pca-v202103.pdf and calling dev.off().

plt

macr_nb <- normalize_expt(macr, batch="svaseq", filter=TRUE)
## This function will replace the expt$expressionset slot with:
## svaseq(cbcb(data))
## It will save copies of each step along the way
##  in expt$normalized with the corresponding libsizes. Keep libsizes in mind
##  when invoking limma.  The appropriate libsize is non-log(cpm(normalized)).
##  This is most likely kept at:
##  'new_expt$normalized$intermediate_counts$normalization$libsizes'
##  A copy of this may also be found at:
##  new_expt$best_libsize
## Leaving the data in its current base format, keep in mind that
##  some metrics are easier to see when the data is log2 transformed, but
##  EdgeR/DESeq do not accept transformed data.
## Leaving the data unconverted.  It is often advisable to cpm/rpkm
##  the data to normalize for sampling differences, keep in mind though that rpkm
##  has some annoying biases, and voom() by default does a cpm (though hpgl_voom()
##  will try to detect this).
## Leaving the data unnormalized.  This is necessary for DESeq, but
##  EdgeR/limma might benefit from normalization.  Good choices include quantile,
##  size-factor, tmm, etc.
## Step 1: performing count filter with option: cbcb
## Removing 8899 low-count genes (11029 remaining).
## Step 2: not normalizing the data.
## Step 3: not converting the data.
## The method is: svaseq.
## Step 4: doing batch correction with svaseq.
## Using the current state of normalization.
## Passing the data to all_adjusters using the svaseq estimate type.
## batch_counts: Before batch/surrogate estimation, 132226 entries are x>1: 100%.
## batch_counts: Before batch/surrogate estimation, 57 entries are x==0: 0%.
## The be method chose 2 surrogate variables.
## Attempting svaseq estimation with 2 surrogates.
## There are 14 (0%) elements which are < 0 after batch correction.
## Setting low elements to zero.
## Step 4: not transforming the data.
macr_nb <- normalize_expt(macr_nb, norm="quant", convert="cpm", transform="log2")
## This function will replace the expt$expressionset slot with:
## log2(cpm(quant(data)))
## It will save copies of each step along the way
##  in expt$normalized with the corresponding libsizes. Keep libsizes in mind
##  when invoking limma.  The appropriate libsize is non-log(cpm(normalized)).
##  This is most likely kept at:
##  'new_expt$normalized$intermediate_counts$normalization$libsizes'
##  A copy of this may also be found at:
##  new_expt$best_libsize
## Filter is false, this should likely be set to something, good
##  choices include cbcb, kofa, pofa (anything but FALSE).  If you want this to
##  stay FALSE, keep in mind that if other normalizations are performed, then the
##  resulting libsizes are likely to be strange (potentially negative!)
## Not correcting the count-data for batch effects.  If batch is
##  included in EdgerR/limma's model, then this is probably wise; but in extreme
##  batch effects this is a good parameter to play with.
## Step 1: not doing count filtering.
## Step 2: normalizing the data with quant.
## Step 3: converting the data with cpm.
## The method is: raw.
## Step 4: not doing batch correction.
## Step 4: transforming the data with log2.
plt <- plot_pca(macr_nb)$plot
pp(file=glue("images/macrophage_side_experiment-v{ver}/normbatch_pca.pdf"), image=plt)
## Warning in cairo_pdf(filename = file, ...): cairo error 'error while writing to
## output stream'
## Error in cairo_pdf(filename = file, ...): unable to start device 'cairo_pdf'
plt

macr_written <- write_expt(macr, excel="excel/macrophage_side_experiment/macrophage_expt.xlsx")
## Deleting the file excel/macrophage_side_experiment/macrophage_expt.xlsx before writing the tables.
## Writing the first sheet, containing a legend and some summary data.

## Writing the raw reads.
## Graphing the raw reads.
## `geom_smooth()` using formula 'y ~ x'
## `geom_smooth()` using formula 'y ~ x'

## Warning in doTryCatch(return(expr), name, parentenv, handler): display list
## redraw incomplete
## Warning in doTryCatch(return(expr), name, parentenv, handler): display list
## redraw incomplete
## Attempting mixed linear model with: ~  condition + batch
## Fitting the expressionset to the model, this is slow.
## 
## Total:120 s
## Placing factor: condition at the beginning of the model.
## Writing the normalized reads.
## Graphing the normalized reads.

## `geom_smooth()` using formula 'y ~ x'
## `geom_smooth()` using formula 'y ~ x'

## Warning in doTryCatch(return(expr), name, parentenv, handler): display list
## redraw incomplete

## Warning in doTryCatch(return(expr), name, parentenv, handler): display list
## redraw incomplete
## Attempting mixed linear model with: ~  condition + batch
## Fitting the expressionset to the model, this is slow.
## 
## Total:82 s
## Placing factor: condition at the beginning of the model.
## Writing the median reads by factor.

zymo_de <- all_pairwise(macr, model_batch="svaseq", filter=TRUE)
## batch_counts: Before batch/surrogate estimation, 132226 entries are x>1: 100%.
## batch_counts: Before batch/surrogate estimation, 57 entries are x==0: 0%.
## The be method chose 2 surrogate variables.
## Attempting svaseq estimation with 2 surrogates.
## Plotting a PCA before surrogate/batch inclusion.
## Not putting labels on the PC plot.
## Using svaseq to visualize before/after batch inclusion.
## Performing a test normalization with: raw
## This function will replace the expt$expressionset slot with:
## log2(svaseq(cpm(cbcb(data))))
## It will save copies of each step along the way
##  in expt$normalized with the corresponding libsizes. Keep libsizes in mind
##  when invoking limma.  The appropriate libsize is non-log(cpm(normalized)).
##  This is most likely kept at:
##  'new_expt$normalized$intermediate_counts$normalization$libsizes'
##  A copy of this may also be found at:
##  new_expt$best_libsize
## Leaving the data unnormalized.  This is necessary for DESeq, but
##  EdgeR/limma might benefit from normalization.  Good choices include quantile,
##  size-factor, tmm, etc.
## Step 1: performing count filter with option: cbcb
## Removing 0 low-count genes (11029 remaining).
## Step 2: not normalizing the data.
## Step 3: converting the data with cpm.
## The method is: svaseq.
## Step 4: doing batch correction with svaseq.
## Using the current state of normalization.
## Passing the data to all_adjusters using the svaseq estimate type.
## batch_counts: Before batch/surrogate estimation, 128623 entries are x>1: 97%.
## batch_counts: Before batch/surrogate estimation, 57 entries are x==0: 0%.
## batch_counts: Before batch/surrogate estimation, 3668 entries are 0<x<1: 3%.
## The be method chose 2 surrogate variables.
## Attempting svaseq estimation with 2 surrogates.
## There are 135 (0%) elements which are < 0 after batch correction.
## Setting low elements to zero.
## Step 4: transforming the data with log2.
## transform_counts: Found 135 values equal to 0, adding 1 to the matrix.
## Not putting labels on the PC plot.
## Finished running DE analyses, collecting outputs.
## Comparing analyses.

zymo_table <- combine_de_tables(zymo_de, excel="images/macrophage_side_experiment/macrophage_de.xlsx")
## Deleting the file images/macrophage_side_experiment/macrophage_de.xlsx before writing the tables.
## Writing a legend of columns.
## Printing a pca plot before/after surrogates/batch estimation.
## Working on table 1/3: z22_vs_undef
## Working on table 2/3: z23_vs_undef
## Working on table 3/3: z23_vs_z22
## Adding venn plots for z22_vs_undef.

## Limma expression coefficients for z22_vs_undef; R^2: 0.959; equation: y = 0.972x + 0.152
## Deseq expression coefficients for z22_vs_undef; R^2: 0.958; equation: y = 1.02x - 0.18
## Edger expression coefficients for z22_vs_undef; R^2: 0.958; equation: y = 1.02x - 0.165
## Adding venn plots for z23_vs_undef.

## Limma expression coefficients for z23_vs_undef; R^2: 0.953; equation: y = 0.977x + 0.151
## Deseq expression coefficients for z23_vs_undef; R^2: 0.951; equation: y = 0.966x + 0.369
## Edger expression coefficients for z23_vs_undef; R^2: 0.951; equation: y = 0.966x + 0.335
## Adding venn plots for z23_vs_z22.

## Limma expression coefficients for z23_vs_z22; R^2: 0.968; equation: y = 0.988x + 0.0823
## Deseq expression coefficients for z23_vs_z22; R^2: 0.965; equation: y = 0.939x + 0.678
## Edger expression coefficients for z23_vs_z22; R^2: 0.964; equation: y = 0.939x + 0.472
## Writing summary information, compare_plot is: TRUE.
## Performing save of images/macrophage_side_experiment/macrophage_de.xlsx.

8.5.1 Followup email from Olga

  • Macrophages infected with 2.3 vs macrophagues infected with 2.3 + SbV
  • Macrophages uninfected (M0) vs macrophages uninfected + SbV
  • Macrophages uninfected vs macrophages infected with 2.3
  • Macrophages uninfected + SbV vs Macrophagues infected with 2.3 + SbV

With this comparisons we can define the effect of infection with 2.3 and the drug effect with and without infection. In this moment we can’t evaluate the conditions with 2.2 because the samples are incomplete. Mariana will complete the samples in the next shipment.

new_factor <- paste0(pData(macr)[["macrdrug"]], "_", pData(macr)[["zymodeme"]])
new_factor <- gsub(x=new_factor, pattern="undef", replacement="uninf")
macr_v2 <- set_expt_conditions(macr, fact=new_factor)
macr_v2$conditions
##  [1] "no_uninf" "sb_uninf" "no_z2.3"  "sb_z2.3"  "no_z2.3"  "sb_z2.3" 
##  [7] "no_z2.2"  "sb_z2.2"  "sb_z2.2"  "no_z2.2"  "no_z2.3"  "sb_z2.3"
macr_v2_norm <- normalize_expt(macr_v2, onvert="cpm", filter=TRUE, norm="quant")
## This function will replace the expt$expressionset slot with:
## quant(cbcb(data))
## It will save copies of each step along the way
##  in expt$normalized with the corresponding libsizes. Keep libsizes in mind
##  when invoking limma.  The appropriate libsize is non-log(cpm(normalized)).
##  This is most likely kept at:
##  'new_expt$normalized$intermediate_counts$normalization$libsizes'
##  A copy of this may also be found at:
##  new_expt$best_libsize
## Leaving the data in its current base format, keep in mind that
##  some metrics are easier to see when the data is log2 transformed, but
##  EdgeR/DESeq do not accept transformed data.
## Leaving the data unconverted.  It is often advisable to cpm/rpkm
##  the data to normalize for sampling differences, keep in mind though that rpkm
##  has some annoying biases, and voom() by default does a cpm (though hpgl_voom()
##  will try to detect this).
## Not correcting the count-data for batch effects.  If batch is
##  included in EdgerR/limma's model, then this is probably wise; but in extreme
##  batch effects this is a good parameter to play with.
## Step 1: performing count filter with option: cbcb
## Removing 8899 low-count genes (11029 remaining).
## Step 2: normalizing the data with quant.
## Step 3: not converting the data.
## The method is: raw.
## Step 4: not doing batch correction.
## Step 4: not transforming the data.
macr_v2_norm <- normalize_expt(macr_v2_norm, transform="log2")
## This function will replace the expt$expressionset slot with:
## log2(data)
## It will save copies of each step along the way
##  in expt$normalized with the corresponding libsizes. Keep libsizes in mind
##  when invoking limma.  The appropriate libsize is non-log(cpm(normalized)).
##  This is most likely kept at:
##  'new_expt$normalized$intermediate_counts$normalization$libsizes'
##  A copy of this may also be found at:
##  new_expt$best_libsize
## Filter is false, this should likely be set to something, good
##  choices include cbcb, kofa, pofa (anything but FALSE).  If you want this to
##  stay FALSE, keep in mind that if other normalizations are performed, then the
##  resulting libsizes are likely to be strange (potentially negative!)
## Leaving the data unconverted.  It is often advisable to cpm/rpkm
##  the data to normalize for sampling differences, keep in mind though that rpkm
##  has some annoying biases, and voom() by default does a cpm (though hpgl_voom()
##  will try to detect this).
## Leaving the data unnormalized.  This is necessary for DESeq, but
##  EdgeR/limma might benefit from normalization.  Good choices include quantile,
##  size-factor, tmm, etc.
## Not correcting the count-data for batch effects.  If batch is
##  included in EdgerR/limma's model, then this is probably wise; but in extreme
##  batch effects this is a good parameter to play with.
## Step 1: not doing count filtering.
## Step 2: not normalizing the data.
## Step 3: not converting the data.
## The method is: raw.
## Step 4: not doing batch correction.
## Step 4: transforming the data with log2.
plot_pca(macr_v2_norm)$plot

keepers <- list(
  "zymo_sbv" = c("sb_z22", "sb_z23"),
  "uninf_drug" = c("no_uninf", "sb_uninf"),
  "uninfnodrug_z23" = c("no_uninf", "no_z23"),
  "uninfdrug_z23" = c("sb_uninf", "sb_z23"),
  "z23_drug_nodrug" = c("sb_z23", "no_z23"),
  "z22_drug_nodrug" = c("sb_z22", "no_z22")
)
olga_pairwise <- all_pairwise(macr_v2, do_deseq=FALSE, do_edger=FALSE, do_ebseq=FALSE)
## Plotting a PCA before surrogate/batch inclusion.
## Not putting labels on the PC plot.
## Using limma's removeBatchEffect to visualize with(out) batch inclusion.
## Not putting labels on the PC plot.
## Finished running DE analyses, collecting outputs.
## Comparing analyses.
olga_zymo_sb <- olga_pairwise[["limma"]][["all_tables"]][["sb_z23_vs_sb_z22"]]
olga_zymo_sb <- merge(olga_zymo_sb, fData(macr_v2), by="row.names")
rownames(olga_zymo_sb) <- olga_zymo_sb[["Row.names"]]
olga_zymo_sb[["Row.names"]] <- NULL
olga_zymo_sb[["transcript"]] <- NULL
written <- write_xlsx(data=olga_zymo_sb,
                      excel=glue::glue("excel/sb_23_vs22-v{ver}.xlsx"))
## Saving to: excel/sb_23_vs22-v202103.xlsx
olga_uninf_drug <- olga_pairwise[["limma"]][["all_tables"]][["sb_uninf_vs_no_uninf"]]
olga_uninf_drug <- merge(olga_uninf_drug, fData(macr_v2), by="row.names")
rownames(olga_uninf_drug) <- olga_uninf_drug[["Row.names"]]
olga_uninf_drug[["Row.names"]] <- NULL
written <- write_xlsx(data=olga_uninf_drug,
                      excel=glue::glue("excel/uninf_sb_vs_nosb-v{ver}.xlsx"))
## Saving to: excel/uninf_sb_vs_nosb-v202103.xlsx
olga_uninfnodrug_z23 <- olga_pairwise[["limma"]][["all_tables"]][["no_z23_vs_no_uninf"]]
olga_uninfnodrug_z23 <- merge(olga_uninfnodrug_z23, fData(macr_v2), by="row.names")
rownames(olga_uninfnodrug_z23) <- olga_uninfnodrug_z23[["Row.names"]]
olga_uninfnodrug_z23[["Row.names"]] <- NULL
written <- write_xlsx(data=olga_uninfnodrug_z23,
                      excel=glue::glue("excel/no_z23_vs_nosb_uninf-v{ver}.xlsx"))
## Saving to: excel/no_z23_vs_nosb_uninf-v202103.xlsx
olga_uninfdrug_z23 <- olga_pairwise[["limma"]][["all_tables"]][["sb_z23_vs_sb_uninf"]]
olga_uninfdrug_z23 <- merge(olga_uninfdrug_z23, fData(macr_v2), by="row.names")
rownames(olga_uninfdrug_z23) <- olga_uninfdrug_z23[["Row.names"]]
olga_uninfdrug_z23[["Row.names"]] <- NULL
written <- write_xlsx(data=olga_uninfdrug_z23,
                      excel=glue::glue("excel/sb_z23_vs_sb_uninf-v{ver}.xlsx"))
## Saving to: excel/sb_z23_vs_sb_uninf-v202103.xlsx
olga_z23_drugnodrug <- olga_pairwise[["limma"]][["all_tables"]][["sb_z23_vs_no_z23"]]
olga_z23_drugnodrug <- merge(olga_z23_drugnodrug, fData(macr_v2), by="row.names")
rownames(olga_z23_drugnodrug) <- olga_z23_drugnodrug[["Row.names"]]
olga_z23_drugnodrug[["Row.names"]] <- NULL
olga_z23_drugnodrug[["transcript"]] <- NULL
written <- write_xlsx(data=olga_z23_drugnodrug,
                      excel=glue::glue("excel/z23_drug_vs_nodrug-v{ver}.xlsx"))
## Saving to: excel/z23_drug_vs_nodrug-v202103.xlsx
olga_z22_drugnodrug <- olga_pairwise[["limma"]][["all_tables"]][["sb_z22_vs_no_z22"]]
olga_z22_drugnodrug <- merge(olga_z22_drugnodrug, fData(macr_v2), by="row.names")
rownames(olga_z22_drugnodrug) <- olga_z22_drugnodrug[["Row.names"]]
olga_z22_drugnodrug[["Row.names"]] <- NULL
olga_z22_drugnodrug[["transcript"]] <- NULL
written <- write_xlsx(data=olga_z22_drugnodrug,
                      excel=glue::glue("excel/z22_drug_vs_nodrug-v{ver}.xlsx"))
## Saving to: excel/z22_drug_vs_nodrug-v202103.xlsx

8.6 Donor effect

donor <- set_expt_conditions(hs_expt, fact="donor")
donor <- set_expt_batches(donor, fact="time")
save_result <- save(donor, file="rda/donor_expt.rda")
test <- normalize_expt(donor, filter=TRUE, transform="log2", convert="cpm", norm="quant")
## This function will replace the expt$expressionset slot with:
## log2(cpm(quant(cbcb(data))))
## It will save copies of each step along the way
##  in expt$normalized with the corresponding libsizes. Keep libsizes in mind
##  when invoking limma.  The appropriate libsize is non-log(cpm(normalized)).
##  This is most likely kept at:
##  'new_expt$normalized$intermediate_counts$normalization$libsizes'
##  A copy of this may also be found at:
##  new_expt$best_libsize
## Not correcting the count-data for batch effects.  If batch is
##  included in EdgerR/limma's model, then this is probably wise; but in extreme
##  batch effects this is a good parameter to play with.
## Step 1: performing count filter with option: cbcb
## Removing 4889 low-count genes (15039 remaining).
## Step 2: normalizing the data with quant.
## Step 3: converting the data with cpm.
## The method is: raw.
## Step 4: not doing batch correction.
## Step 4: transforming the data with log2.
## transform_counts: Found 82 values equal to 0, adding 1 to the matrix.
plot_pca(test)$plot
## Potentially check over the experimental design, there appear to be missing values.
## Warning in plot_pca(test): There are NA values in the component data. This can
## lead to weird plotting errors.
## plot labels was not set and there are more than 100 samples, disabling it.
## Not putting labels on the PC plot.
## Warning in MASS::cov.trob(data[, vars]): Probable convergence failure
## Warning in MASS::cov.trob(data[, vars]): Probable convergence failure

## Warning in MASS::cov.trob(data[, vars]): Probable convergence failure

## Warning in MASS::cov.trob(data[, vars]): Probable convergence failure

## Warning in MASS::cov.trob(data[, vars]): Probable convergence failure

## Warning in MASS::cov.trob(data[, vars]): Probable convergence failure

## Warning in MASS::cov.trob(data[, vars]): Probable convergence failure

## Warning in MASS::cov.trob(data[, vars]): Probable convergence failure
## Warning: Removed 21 rows containing missing values (geom_point).

8.7 Question 1

I interpreted question 1 as: pull out tmrc3000[1-6] and look at them.

I am not entirely certain what is meant by the heirarchical clustering request. I can see a couple of possibilities for what this means. The most similar thing I recall in the cruzi context was a post-DE visualization of some fairly specific genes.

hs_q1 <- subset_expt(hs_valid, subset="donor=='d1010'|donor=='d1011'")
## Using a subset expression.
## There were 104, now there are 6 samples.
q1_norm <- sm(normalize_expt(hs_q1, norm="quant", transform="log2", convert="cpm", batch=FALSE,
                           filter=TRUE))
q1_pca <- plot_pca(q1_norm)
q1_pca$plot

knitr::kable(q1_pca$table)
sampleid condition batch batch_int colors labels PC1 PC2 pc_1 pc_2 pc_3 pc_4 pc_5
1010-2 1010-2 PBMC d1010 1 #1B9E77 1010-2 -0.5218 0.3678 -0.5218 0.3678 0.3820 -0.1944 0.4920
1010-7 1010-7 PBMC d1010 1 #1B9E77 1010-7 0.1079 0.4854 0.1079 0.4854 -0.5377 0.5431 0.0449
1010-12 1010-12 PBMC d1010 1 #1B9E77 1010-12 0.4706 0.3590 0.4706 0.3590 0.3162 -0.3669 -0.4984
1011-2 1011-2 PBMC d1011 2 #1B9E77 1011-2 -0.5452 -0.3253 -0.5452 -0.3253 -0.3798 -0.2445 -0.4756
1011-7 1011-7 PBMC d1011 2 #1B9E77 1011-7 0.0469 -0.4685 0.0469 -0.4685 0.4948 0.5995 -0.0862
1011-12 1011-12 PBMC d1011 2 #1B9E77 1011-12 0.4417 -0.4183 0.4417 -0.4183 -0.2755 -0.3368 0.5233
write.csv(q1_pca$table, file="coords/q1_pca_coords.csv")

## Looks like PC1 == Time and PC2 is donor, and they have pretty much the same amount of variance

hs_time <- set_expt_conditions(hs_q1, fact="time")
time_norm <- sm(normalize_expt(hs_time, batch="svaseq", filter=TRUE))
time_norm <- normalize_expt(time_norm, transform="log2")
## This function will replace the expt$expressionset slot with:
## log2(data)
## It will save copies of each step along the way
##  in expt$normalized with the corresponding libsizes. Keep libsizes in mind
##  when invoking limma.  The appropriate libsize is non-log(cpm(normalized)).
##  This is most likely kept at:
##  'new_expt$normalized$intermediate_counts$normalization$libsizes'
##  A copy of this may also be found at:
##  new_expt$best_libsize
## Filter is false, this should likely be set to something, good
##  choices include cbcb, kofa, pofa (anything but FALSE).  If you want this to
##  stay FALSE, keep in mind that if other normalizations are performed, then the
##  resulting libsizes are likely to be strange (potentially negative!)
## Leaving the data unconverted.  It is often advisable to cpm/rpkm
##  the data to normalize for sampling differences, keep in mind though that rpkm
##  has some annoying biases, and voom() by default does a cpm (though hpgl_voom()
##  will try to detect this).
## Leaving the data unnormalized.  This is necessary for DESeq, but
##  EdgeR/limma might benefit from normalization.  Good choices include quantile,
##  size-factor, tmm, etc.
## Not correcting the count-data for batch effects.  If batch is
##  included in EdgerR/limma's model, then this is probably wise; but in extreme
##  batch effects this is a good parameter to play with.
## Step 1: not doing count filtering.
## Step 2: not normalizing the data.
## Step 3: not converting the data.
## The method is: raw.
## Step 4: not doing batch correction.
## Step 4: transforming the data with log2.
## Get a set of genes with high PC loads for PC1(time), and PC2(donor):
high_scores <- pca_highscores(time_norm, n=40)

time_stuff <- high_scores$highest[, c(1, 2)]
time_stuff
##       Comp.1                  Comp.2                 
##  [1,] "13.33:ENSG00000073756" "9.941:ENSG00000080007"
##  [2,] "10.67:ENSG00000125538" "8.803:ENSG00000012817"
##  [3,] "10.26:ENSG00000093134" "8.62:ENSG00000167874" 
##  [4,] "8.271:ENSG00000112299" "8.291:ENSG00000114315"
##  [5,] "8.154:ENSG00000140092" "7.98:ENSG00000125538" 
##  [6,] "8.042:ENSG00000168329" "7.724:ENSG00000129824"
##  [7,] "7.795:ENSG00000143365" "7.623:ENSG00000067048"
##  [8,] "7.202:ENSG00000081041" "7.506:ENSG00000241945"
##  [9,] "7.025:ENSG00000126243" "7.141:ENSG00000182310"
## [10,] "7.009:ENSG00000143450" "7.069:ENSG00000166793"
## [11,] "6.975:ENSG00000123700" "7.066:ENSG00000124216"
## [12,] "6.943:ENSG00000167191" "6.837:ENSG00000223609"
## [13,] "6.715:ENSG00000180626" "6.516:ENSG00000114374"
## [14,] "6.694:ENSG00000123975" "6.175:ENSG00000143333"
## [15,] "6.585:ENSG00000198435" "6.151:ENSG00000187583"
## [16,] "6.578:ENSG00000164530" "6.108:ENSG00000147799"
## [17,] "6.364:ENSG00000263002" "6.097:ENSG00000111671"
## [18,] "6.273:ENSG00000282804" "6.062:ENSG00000073756"
## [19,] "6.213:ENSG00000165181" "6.006:ENSG00000162383"
## [20,] "6.194:ENSG00000133574" "5.937:ENSG00000112139"
## [21,] "6.19:ENSG00000188886"  "5.912:ENSG00000186994"
## [22,] "6.126:ENSG00000104524" "5.741:ENSG00000124882"
## [23,] "6.104:ENSG00000106351" "5.667:ENSG00000104951"
## [24,] "6.088:ENSG00000163568" "5.592:ENSG00000031691"
## [25,] "6.052:ENSG00000171115" "5.588:ENSG00000181652"
## [26,] "5.942:ENSG00000164011" "5.58:ENSG00000145700" 
## [27,] "5.893:ENSG00000162739" "5.572:ENSG00000232810"
## [28,] "5.867:ENSG00000250510" "5.543:ENSG00000198692"
## [29,] "5.79:ENSG00000185090"  "5.54:ENSG00000126733" 
## [30,] "5.788:ENSG00000171860" "5.527:ENSG00000163701"
## [31,] "5.736:ENSG00000121797" "5.49:ENSG00000176406" 
## [32,] "5.733:ENSG00000125703" "5.444:ENSG00000078401"
## [33,] "5.685:ENSG00000185220" "5.441:ENSG00000152527"
## [34,] "5.681:ENSG00000255151" "5.428:ENSG00000162772"
## [35,] "5.636:ENSG00000163508" "5.405:ENSG00000135525"
## [36,] "5.552:ENSG00000165118" "5.335:ENSG00000182600"
## [37,] "5.525:ENSG00000188868" "5.257:ENSG00000065320"
## [38,] "5.47:ENSG00000143167"  "5.145:ENSG00000277632"
## [39,] "5.427:ENSG00000266202" "4.965:ENSG00000137331"
## [40,] "5.415:ENSG00000204020" "4.877:ENSG00000105501"
## Column 1 should be winners vs. time and column 2 by donor.
time_genes <- gsub(x=time_stuff[, "Comp.1"], pattern="^.*:(.*)$", replacement="\\1")
head(time_genes)
## [1] "ENSG00000073756" "ENSG00000125538" "ENSG00000093134" "ENSG00000112299"
## [5] "ENSG00000140092" "ENSG00000168329"
time_subset <- exprs(time_norm)[time_genes, ]
plot_sample_heatmap(time_norm, row_label=rownames(time_norm))

hs_donor <- set_expt_conditions(hs_q1, fact="donor")
donor_norm <- sm(normalize_expt(hs_donor, convert="cpm", batch="svaseq", filter=TRUE))
donor_norm <- normalize_expt(donor_norm, transform="log2")
## This function will replace the expt$expressionset slot with:
## log2(data)
## It will save copies of each step along the way
##  in expt$normalized with the corresponding libsizes. Keep libsizes in mind
##  when invoking limma.  The appropriate libsize is non-log(cpm(normalized)).
##  This is most likely kept at:
##  'new_expt$normalized$intermediate_counts$normalization$libsizes'
##  A copy of this may also be found at:
##  new_expt$best_libsize
## Filter is false, this should likely be set to something, good
##  choices include cbcb, kofa, pofa (anything but FALSE).  If you want this to
##  stay FALSE, keep in mind that if other normalizations are performed, then the
##  resulting libsizes are likely to be strange (potentially negative!)
## Leaving the data unconverted.  It is often advisable to cpm/rpkm
##  the data to normalize for sampling differences, keep in mind though that rpkm
##  has some annoying biases, and voom() by default does a cpm (though hpgl_voom()
##  will try to detect this).
## Leaving the data unnormalized.  This is necessary for DESeq, but
##  EdgeR/limma might benefit from normalization.  Good choices include quantile,
##  size-factor, tmm, etc.
## Not correcting the count-data for batch effects.  If batch is
##  included in EdgerR/limma's model, then this is probably wise; but in extreme
##  batch effects this is a good parameter to play with.
## Step 1: not doing count filtering.
## Step 2: not normalizing the data.
## Step 3: not converting the data.
## The method is: raw.
## Step 4: not doing batch correction.
## Step 4: transforming the data with log2.
## transform_counts: Found 11 values equal to 0, adding 1 to the matrix.
## Get a set of genes with high PC loads for PC1(donor), and PC2(donor):
high_scores <- pca_highscores(donor_norm, n=40)

donor_stuff <- high_scores$highest[, c(1, 2)]
donor_stuff
##       Comp.1                  Comp.2                 
##  [1,] "44.49:ENSG00000129824" "7.56:ENSG00000165899" 
##  [2,] "40.6:ENSG00000067048"  "5.954:ENSG00000203907"
##  [3,] "39.59:ENSG00000012817" "4.279:ENSG00000131711"
##  [4,] "35.11:ENSG00000114374" "3.914:ENSG00000037280"
##  [5,] "32.61:ENSG00000099725" "3.896:ENSG00000158747"
##  [6,] "25.97:ENSG00000067646" "3.764:ENSG00000107281"
##  [7,] "25.51:ENSG00000198692" "3.629:ENSG00000108924"
##  [8,] "20.94:ENSG00000183878" "3.541:ENSG00000229117"
##  [9,] "17.67:ENSG00000248905" "3.505:ENSG00000187186"
## [10,] "17.06:ENSG00000112139" "3.438:ENSG00000099725"
## [11,] "16.48:ENSG00000075391" "3.411:ENSG00000147912"
## [12,] "15.51:ENSG00000198848" "3.355:ENSG00000187260"
## [13,] "14.2:ENSG00000049247"  "3.345:ENSG00000144152"
## [14,] "12.6:ENSG00000129422"  "3.341:ENSG00000154620"
## [15,] "11.89:ENSG00000144115" "3.335:ENSG00000099814"
## [16,] "11.46:ENSG00000241945" "3.294:ENSG00000187862"
## [17,] "11.09:ENSG00000154620" "3.29:ENSG00000007312" 
## [18,] "10.01:ENSG00000109321" "3.238:ENSG00000171159"
## [19,] "9.533:ENSG00000276085" "3.17:ENSG00000196376" 
## [20,] "9.245:ENSG00000137959" "3.138:ENSG00000062524"
## [21,] "9.034:ENSG00000168765" "3.117:ENSG00000153563"
## [22,] "9.019:ENSG00000179344" "3.096:ENSG00000205838"
## [23,] "8.866:ENSG00000182534" "3.092:ENSG00000089692"
## [24,] "8.731:ENSG00000204001" "3.085:ENSG00000186827"
## [25,] "8.731:ENSG00000196436" "3.05:ENSG00000162545" 
## [26,] "8.647:ENSG00000160201" "3.047:ENSG00000228278"
## [27,] "8.535:ENSG00000088827" "3.042:ENSG00000112210"
## [28,] "8.521:ENSG00000148848" "3.023:ENSG00000080573"
## [29,] "8.506:ENSG00000131459" "3.01:ENSG00000198832" 
## [30,] "8.497:ENSG00000080007" "3.007:ENSG00000142156"
## [31,] "8.387:ENSG00000160307" "3.007:ENSG00000232434"
## [32,] "8.377:ENSG00000169507" "2.998:ENSG00000130748"
## [33,] "8.315:ENSG00000142156" "2.993:ENSG00000061656"
## [34,] "8.262:ENSG00000093217" "2.983:ENSG00000283486"
## [35,] "8.21:ENSG00000186193"  "2.967:ENSG00000206077"
## [36,] "8.174:ENSG00000004809" "2.967:ENSG00000148824"
## [37,] "8.044:ENSG00000140287" "2.966:ENSG00000130635"
## [38,] "8.037:ENSG00000177990" "2.927:ENSG00000137571"
## [39,] "7.956:ENSG00000107731" "2.918:ENSG00000106351"
## [40,] "7.752:ENSG00000134531" "2.89:ENSG00000184867"
## Column 1 should be winners vs. donor and column 2 by donor.
donor_genes <- gsub(x=donor_stuff[, "Comp.1"], pattern="^.*:(.*)$", replacement="\\1")
head(donor_genes)
## [1] "ENSG00000129824" "ENSG00000067048" "ENSG00000012817" "ENSG00000114374"
## [5] "ENSG00000099725" "ENSG00000067646"
donor_subset <- exprs(donor_norm)[donor_genes, ]
plot_sample_heatmap(donor_norm, row_label=rownames(donor_norm))

time_keepers <- list(
  "2hr_vs_7hr" = c("t2hr", "t7hr"),
  "2hr_vs_12hr" = c("t2hr", "t12hr"),
  "7hr_vs_12hr" = c("t7hr", "t12hr"))

q1_time <- set_expt_conditions(hs_q1, fact="time")
time_de <- sm(all_pairwise(q1_time, model_batch=FALSE, parallel=FALSE))
time_all_tables <- sm(combine_de_tables(time_de,
                                        excel=glue::glue("excel/time_de_tables-v{ver}.xlsx")))
save_result <- save(time_all_tables, file="rda/time_all_tables.rda")

time_all_tables_all <- sm(combine_de_tables(
  time_de,
  keepers="all",
  excel=glue::glue("excel/time_de_all_tables-v{ver}.xlsx")))
time_all_tables <- sm(combine_de_tables(
  time_de,
  keepers=time_keepers,
  excel=glue::glue("excel/{rundate}-time_de_tables-v{ver}.xlsx")))
q1_donor <- set_expt_conditions(hs_q1, fact="donor")
donor_de <- sm(all_pairwise(q1_donor, model_batch=FALSE))
donor_tables <- sm(combine_de_tables(
                     donor_de, excel=glue::glue("excel/donor_de_tables-v{ver}.xlsx")))
save_result <- save(donor_tables, file="rda/donor_tables.rda")
hs_q2 <- subset_expt(hs_valid, subset="donor!='d1010'&donor!='d1011'")
## Using a subset expression.
## There were 104, now there are 77 samples.
q2_norm <- sm(normalize_expt(hs_q2, transform="log2", convert="cpm", norm="quant", filter=TRUE))

q2_pca <- plot_pca(q2_norm)
knitr::kable(q2_pca$table)
sampleid condition batch batch_int colors labels PC1 PC2 pc_1 pc_2 pc_3 pc_4 pc_5 pc_6 pc_7 pc_8 pc_9 pc_10 pc_11 pc_12 pc_13 pc_14 pc_15 pc_16 pc_17 pc_18 pc_19 pc_20 pc_21 pc_22 pc_23 pc_24 pc_25 pc_26 pc_27 pc_28 pc_29 pc_30 pc_31 pc_32 pc_33 pc_34 pc_35 pc_36 pc_37 pc_38 pc_39 pc_40 pc_41 pc_42 pc_43 pc_44 pc_45 pc_46 pc_47 pc_48 pc_49 pc_50 pc_51 pc_52 pc_53 pc_54 pc_55 pc_56 pc_57 pc_58 pc_59 pc_60 pc_61 pc_62 pc_63 pc_64 pc_65 pc_66 pc_67 pc_68 pc_69 pc_70 pc_71 pc_72 pc_73 pc_74 pc_75 pc_76
1017m1 1017m1 Monocyte d1017 1 #7570B3 1017m1 -0.0276 -0.0971 -0.0276 -0.0971 -0.0284 -0.1389 -0.1672 0.1670 0.2158 -0.0157 0.0520 -0.1030 0.0350 -0.1461 0.0232 0.0480 -0.1293 0.0711 -0.1063 0.0173 -0.0802 0.1264 -0.0545 0.1639 -0.0386 0.0182 -0.2063 0.0137 -0.0100 0.0522 -0.1391 -0.0276 0.0774 -0.0125 -0.0383 -0.0874 0.1118 0.0836 0.1280 -0.1960 -0.3668 -0.3208 0.1980 0.1404 0.3204 -0.0157 -0.1579 -0.1122 -0.0837 -0.1541 0.1737 0.0495 0.0094 0.0389 -0.1355 -0.0331 -0.0511 -0.0489 -0.0068 -0.0205 -0.0065 -0.1331 -0.0405 0.0009 0.0411 0.0937 0.0654 0.0176 0.0047 -0.0706 -0.0473 -0.0299 0.0000 -0.0497 -0.0142 -0.0107 -0.0241 -0.0019
1034n1 1034n1 Neutrophil d1034 2 #D95F02 1034n1 0.1424 0.0868 0.1424 0.0868 -0.0941 0.0386 -0.0669 0.2053 0.0944 -0.0154 -0.2093 0.1022 0.0641 0.0434 0.1286 0.0524 -0.2392 -0.1682 0.0661 -0.0132 0.1563 -0.1295 -0.0090 -0.1772 -0.0251 -0.1736 0.2966 -0.0216 0.1045 -0.0487 0.0304 -0.1755 -0.0060 -0.0081 -0.1164 -0.1683 -0.0585 -0.1417 0.4213 0.0536 -0.0729 -0.2662 0.1050 -0.1080 -0.3131 -0.0300 0.0276 0.0950 0.0164 -0.1383 0.0157 -0.0448 -0.0026 0.0638 0.0247 -0.0414 0.0144 -0.0230 -0.0414 -0.0141 -0.0302 -0.0174 0.0271 -0.0034 0.0063 -0.0104 -0.0066 0.0026 -0.0033 0.0051 -0.0015 -0.0107 0.0043 0.0092 0.0055 0.0013 -0.0006 0.0043
1034bp1 1034bp1 Biopsy d1034 2 #E7298A 1034bp1 -0.1714 0.2089 -0.1714 0.2089 0.0841 -0.0421 0.1599 0.0747 0.1092 0.1332 -0.0719 -0.1149 -0.1123 -0.0401 0.0289 0.0840 -0.0235 0.0182 -0.0757 0.0505 -0.0371 0.1188 0.0101 -0.1000 0.1582 0.0295 -0.0015 0.0454 0.0188 0.0762 -0.0018 -0.0258 0.0373 -0.2166 0.1456 0.0656 -0.3253 0.1591 -0.0515 0.5891 0.0327 -0.1744 0.1733 0.0227 0.0711 0.1274 0.0519 -0.0261 -0.2710 0.0169 -0.0244 0.0488 -0.0811 -0.0678 0.0391 -0.0338 0.0044 -0.0112 -0.0009 0.0075 0.0068 -0.0211 0.0048 -0.0224 0.0100 0.0058 0.0035 0.0176 0.0001 -0.0167 -0.0116 0.0085 -0.0022 -0.0050 -0.0010 0.0104 0.0007 -0.0098
1034n2 1034n2 Neutrophil d1034 2 #D95F02 1034n2 0.1431 0.1022 0.1431 0.1022 -0.1111 0.0414 -0.0267 0.2238 0.1085 -0.0702 -0.2612 0.1573 -0.0062 0.1568 0.2058 -0.0362 -0.2314 -0.0615 -0.0290 0.0008 0.1879 -0.0996 -0.2148 -0.2532 -0.1297 0.2300 0.0730 0.0457 -0.0341 -0.0857 -0.3022 0.0987 0.0058 -0.1501 0.1491 0.0937 0.1459 0.2177 -0.1670 -0.0616 0.0667 0.2152 -0.0531 0.0288 0.2439 0.0289 -0.0405 -0.1436 0.0160 0.0958 -0.0532 -0.0272 0.0251 -0.0677 -0.0012 0.0083 -0.0050 -0.0146 -0.0093 -0.0206 0.0218 0.0120 -0.0371 -0.0104 0.0018 -0.0129 0.0208 0.0025 -0.0093 0.0004 0.0036 -0.0024 -0.0065 -0.0005 -0.0026 0.0091 0.0015 0.0003
1034m2 1034m2 Monocyte d1034 2 #7570B3 1034m2 -0.0292 -0.0951 -0.0292 -0.0951 -0.0520 -0.1202 -0.1989 0.2833 0.1362 0.0693 -0.0445 -0.0385 0.0279 -0.1559 0.0306 0.0314 -0.1958 -0.0037 -0.1497 0.0708 -0.1859 -0.0198 -0.0036 0.1099 0.0079 0.0409 -0.0220 0.1262 -0.0125 0.0169 0.2144 0.0243 -0.0188 0.0940 -0.0556 0.0667 -0.0979 -0.0523 -0.1053 -0.0013 0.1614 0.1849 -0.0303 0.0111 -0.0988 -0.0492 0.0114 0.0723 0.0080 -0.0199 -0.0423 0.0650 0.0532 0.0807 0.0987 0.0586 -0.0075 -0.0006 -0.0629 0.0273 0.2185 -0.0329 -0.0009 -0.4125 -0.3432 -0.0071 0.1109 -0.3061 0.0695 0.0485 0.0567 -0.0138 -0.0366 0.0093 -0.0148 -0.0185 0.0134 -0.0104
1034m2- 1034m2- Monocyte d1034 2 #7570B3 1034m2- -0.0236 -0.0935 -0.0236 -0.0935 -0.0441 -0.1165 -0.2076 0.2817 0.1576 0.0828 -0.0634 -0.0367 0.0336 -0.1620 0.0483 -0.0580 -0.1706 -0.0123 -0.1460 0.0615 -0.1992 -0.0228 0.0316 0.1336 -0.0233 0.0481 -0.0413 0.0031 0.0652 -0.0213 0.1384 0.0073 -0.0849 0.1076 -0.0339 0.0577 -0.0629 -0.0546 -0.1614 0.0245 0.1280 0.1385 -0.0225 -0.0462 -0.1121 -0.0241 0.0419 0.0947 -0.0022 0.0752 -0.0044 -0.0646 -0.0395 -0.0476 0.0027 -0.0252 0.0271 0.0051 0.1316 -0.0020 -0.2679 0.1746 0.0107 0.4069 0.2859 -0.0565 -0.1283 0.3118 -0.0759 -0.0465 -0.0189 0.0056 -0.0002 0.0178 0.0168 0.0060 -0.0253 0.0150
2050bp1 2050bp1 Biopsy d2050 3 #E7298A 2050bp1 -0.1625 0.1718 -0.1625 0.1718 0.0764 -0.0363 0.0740 0.0231 -0.0413 -0.3089 0.1068 0.0997 0.2895 -0.2090 -0.0259 -0.3039 -0.2148 0.3831 0.0435 -0.1349 0.1281 -0.0237 -0.0627 0.0397 0.1086 -0.0387 0.0795 -0.0823 -0.0189 0.1719 -0.0718 0.0960 0.1488 0.0781 -0.1532 -0.1835 -0.1141 0.1330 -0.0401 0.0498 0.0310 -0.0024 0.0183 -0.1611 0.0624 -0.2327 0.1178 0.0713 0.0865 0.1516 -0.0691 0.0381 0.0194 0.0230 -0.0289 -0.0295 0.0140 0.0052 -0.0290 -0.0259 0.0408 -0.0213 0.0119 0.0008 -0.0044 0.0077 -0.0032 0.0233 -0.0018 0.0139 -0.0327 0.0088 -0.0310 0.0422 -0.0020 0.0154 -0.0065 -0.0034
2052bp1 2052bp1 Biopsy d2052 4 #E7298A 2052bp1 -0.1677 0.2193 -0.1677 0.2193 0.0955 -0.0442 0.1887 0.0420 0.1229 0.1694 -0.0605 -0.1607 -0.1959 -0.0206 0.0142 0.0669 0.0229 0.0728 -0.0074 0.0000 0.0759 0.1076 0.0109 0.0346 0.2567 0.1705 0.1157 -0.0628 0.1065 -0.1256 -0.0425 0.0284 0.3053 0.1950 0.0493 -0.2620 -0.0446 0.0531 0.0087 -0.3023 -0.0535 0.2805 0.0213 -0.0402 -0.2701 0.2069 -0.0461 -0.2115 0.0791 -0.1091 0.0693 0.0302 -0.0139 0.0156 -0.0687 -0.0057 -0.0036 0.0240 -0.0006 0.0170 -0.0396 0.0005 -0.0397 0.0109 0.0073 -0.0123 0.0063 -0.0082 0.0189 -0.0114 -0.0084 -0.0045 0.0036 0.0016 0.0037 -0.0070 0.0058 0.0005
2052n1 2052n1 Neutrophil d2052 4 #D95F02 2052n1 0.1280 0.0996 0.1280 0.0996 -0.0846 0.0114 -0.0361 -0.1213 -0.2387 0.2052 0.4090 -0.3442 -0.0181 0.0459 0.1687 -0.2886 -0.4024 -0.1869 0.2877 0.3626 0.0011 0.1003 -0.0477 -0.0508 -0.0146 0.0145 -0.0464 0.0321 -0.0295 -0.0072 -0.0232 0.0263 -0.0150 0.0051 -0.0056 -0.0480 0.0123 0.0006 -0.0172 0.0245 -0.0020 0.0201 0.0051 -0.0126 0.0032 0.0109 -0.0092 -0.0046 0.0042 -0.0009 0.0076 0.0032 0.0013 0.0302 0.0114 0.0042 0.0144 0.0131 0.0057 0.0055 -0.0112 -0.0163 0.0085 -0.0034 -0.0009 -0.0056 -0.0013 0.0012 -0.0006 0.0009 0.0037 -0.0009 0.0009 -0.0019 -0.0019 0.0005 0.0001 -0.0021
2052e1 2052e1 Eosinophil d2052 4 #66A61E 2052e1 0.0857 -0.0687 0.0857 -0.0687 0.2089 0.0648 -0.0025 -0.0530 -0.0968 0.0578 0.1890 -0.0375 -0.0163 0.0853 -0.0377 0.2618 -0.1103 0.1932 -0.0564 -0.1113 0.0958 0.0150 -0.3428 -0.0781 -0.0719 -0.1503 0.1048 0.2368 0.2874 0.0529 0.0043 -0.2320 0.1697 0.2674 0.1472 0.3287 -0.0019 -0.0401 -0.0598 -0.0571 0.1035 0.0148 0.1374 -0.0898 0.0586 -0.0696 -0.0624 0.0859 -0.0708 0.0411 0.1179 -0.0104 -0.0953 0.1179 -0.0285 -0.0569 -0.0061 0.0196 0.0091 -0.0408 -0.0231 0.0203 -0.0655 0.0716 -0.0025 0.0214 -0.0098 -0.0430 0.0223 0.0359 -0.0228 0.0485 0.0011 -0.0176 -0.0153 0.0134 -0.0282 0.0102
2052n2 2052n2 Neutrophil d2052 4 #D95F02 2052n2 0.1421 0.0987 0.1421 0.0987 -0.1084 0.0314 -0.0340 0.0072 -0.0989 0.0903 0.1641 -0.1082 -0.0671 0.2595 0.1976 -0.1182 -0.0127 0.0764 -0.1471 -0.5813 -0.3877 -0.0533 0.1776 0.1309 0.1338 -0.0560 0.2324 0.1708 -0.0699 0.0186 -0.1192 -0.0423 -0.0693 -0.1568 -0.0250 -0.0700 0.0950 0.0200 -0.0401 -0.0043 -0.0193 0.0254 0.0901 -0.0716 0.0254 0.0487 -0.0159 0.0046 0.0152 -0.0159 0.0131 -0.0046 0.0293 0.0146 0.0232 0.0179 0.0387 -0.0013 0.0161 0.0156 0.0088 0.0092 -0.0038 -0.0006 -0.0011 -0.0188 0.0053 -0.0059 -0.0023 0.0013 0.0083 -0.0060 0.0027 -0.0044 -0.0052 -0.0010 0.0019 0.0011
2052m3 2052m3 Monocyte d2052 4 #7570B3 2052m3 -0.0219 -0.0814 -0.0219 -0.0814 -0.0473 -0.1587 -0.0229 0.0299 -0.0944 0.0943 0.1642 -0.0428 -0.0325 0.0749 0.0055 -0.0135 0.1087 0.1024 -0.1361 -0.0763 0.1672 -0.0851 -0.0395 -0.1896 -0.1405 0.1834 0.1194 -0.3877 0.0954 -0.0587 0.1570 -0.0604 -0.0620 0.0786 -0.0030 -0.2211 -0.0862 -0.0892 -0.1291 -0.0874 -0.0509 -0.0446 0.1582 0.1224 0.1427 0.1047 -0.1479 0.2283 -0.1532 0.1098 -0.0138 -0.0434 0.2019 -0.1107 0.3247 -0.0571 0.1629 -0.0958 0.0648 -0.0003 0.0487 -0.0265 0.0534 -0.0811 0.0230 -0.0167 -0.0350 0.0365 -0.0518 0.0439 0.0358 -0.0845 -0.0061 -0.0102 -0.0442 0.0092 0.0251 -0.0007
2052n3 2052n3 Neutrophil d2052 4 #D95F02 2052n3 0.1418 0.1078 0.1418 0.1078 -0.1006 0.0244 0.0210 0.0170 -0.0508 0.0362 0.0994 -0.0210 -0.0835 0.1434 0.1753 -0.0753 0.0362 0.1310 -0.1776 -0.1579 -0.0231 -0.0345 -0.0662 -0.0384 -0.0708 0.1462 -0.2375 -0.1950 0.0501 -0.0673 0.1778 0.0991 0.1079 0.1768 0.1534 0.0950 -0.1736 0.0262 0.2847 0.0510 0.0429 -0.0927 -0.2290 0.3205 -0.0546 -0.2098 0.0690 0.0010 0.0855 -0.0912 -0.2061 -0.0287 -0.0970 -0.0889 -0.1900 0.0337 -0.2786 -0.0224 -0.0561 0.0006 0.0300 0.0532 0.0330 0.0021 0.0122 0.0649 0.0084 0.0182 0.0066 -0.0219 -0.0088 0.0184 -0.0160 0.0147 0.0267 -0.0075 0.0037 -0.0006
2065m1 2065m1 Monocyte d2065 5 #7570B3 2065m1 -0.0404 -0.0964 -0.0404 -0.0964 -0.0379 -0.1637 0.1367 -0.1773 -0.1881 0.0108 -0.1628 0.1814 -0.0303 -0.0372 0.1438 0.0522 -0.1144 0.0516 0.0596 0.0425 -0.1040 0.0348 0.0781 -0.0382 -0.0385 0.1012 0.1602 0.1370 0.0330 0.0005 0.2415 0.0800 0.0222 0.0137 -0.0390 0.0552 -0.0571 -0.0375 -0.0567 -0.0423 -0.1498 -0.0548 -0.0238 -0.0361 0.0424 -0.0412 0.0658 -0.1001 -0.1373 0.0821 0.1542 -0.1754 0.2275 -0.1258 -0.3416 0.0499 -0.1596 -0.0983 0.1727 0.0457 -0.0422 -0.2375 0.0063 0.0116 -0.0980 -0.2180 -0.1713 -0.0126 -0.0586 0.1391 0.1735 -0.0513 0.0944 0.0958 -0.0378 0.0135 0.0074 0.0075
2065n1 2065n1 Neutrophil d2065 5 #D95F02 2065n1 0.1201 0.0865 0.1201 0.0865 -0.0904 -0.0051 0.0716 -0.1122 -0.1647 0.0941 -0.0439 0.0537 -0.0111 -0.2606 -0.0214 0.0467 -0.0040 -0.0234 -0.1666 0.1563 -0.1252 -0.3886 0.0466 -0.1047 0.1967 0.0068 -0.0782 -0.0206 0.0628 0.0719 -0.1178 -0.1729 0.0846 0.0092 -0.1351 0.0404 0.0185 -0.0657 -0.0926 -0.1201 0.0705 -0.1893 -0.0272 -0.0678 0.0797 0.1150 0.1030 -0.0777 0.0254 -0.0383 -0.0019 0.0050 0.0376 -0.2163 -0.0176 0.0669 -0.0165 -0.0342 0.0061 0.0459 0.3444 0.2506 -0.1988 0.1001 0.0173 0.1506 -0.1248 -0.0325 0.1137 -0.0626 -0.0813 -0.0688 -0.0440 0.0095 0.0152 0.0036 0.0107 0.0052
2065bp1 2065bp1 Biopsy d2065 5 #E7298A 2065bp1 -0.1719 0.2202 -0.1719 0.2202 0.0713 -0.0499 0.3050 0.0361 0.1691 0.2660 -0.1198 -0.1136 -0.0856 0.0234 -0.0070 -0.0199 -0.0019 0.1287 0.3154 -0.0656 0.0086 -0.4003 -0.0655 0.2783 -0.3789 -0.1416 -0.0572 0.0152 -0.0718 -0.1268 0.0370 0.0146 0.0241 -0.0458 -0.2045 0.1072 0.1440 -0.0748 -0.0615 0.0239 -0.0164 -0.0116 -0.0034 0.1044 0.0452 -0.0741 -0.0245 0.0956 -0.0224 -0.0176 -0.0229 -0.0209 0.0162 -0.0078 0.0262 -0.0018 -0.0080 0.0070 -0.0196 -0.0184 -0.0007 -0.0030 -0.0062 -0.0102 -0.0073 0.0095 0.0009 0.0035 -0.0182 -0.0036 0.0072 0.0029 -0.0077 -0.0008 0.0022 0.0091 -0.0007 0.0032
2066m1 2066m1 Monocyte d2066 6 #7570B3 2066m1 -0.0369 -0.1035 -0.0369 -0.1035 -0.0348 -0.1648 0.0510 0.0174 0.0008 -0.0346 0.0852 -0.0392 -0.0187 0.0001 0.0262 0.0434 0.0509 -0.1108 -0.1094 -0.0720 0.0346 0.1166 -0.0566 -0.1937 -0.1416 -0.2925 -0.1478 -0.0868 -0.1321 0.0461 -0.1760 0.0511 0.1752 -0.0308 -0.1586 -0.0130 0.0239 0.0610 -0.1609 0.0205 0.0415 -0.0023 0.0478 -0.1002 -0.1659 0.0542 -0.0948 0.1346 0.0426 -0.1505 -0.0488 -0.1231 -0.0201 -0.2663 -0.3119 0.0632 0.0874 0.0562 0.1911 -0.1657 -0.0552 0.2295 0.1821 -0.2160 0.0973 -0.1063 0.0389 -0.1323 -0.0638 -0.0198 0.0553 0.1428 0.0150 -0.0069 0.0543 0.0021 -0.0044 -0.0040
2066n1 2066n1 Neutrophil d2066 6 #D95F02 2066n1 0.1402 0.0810 0.1402 0.0810 -0.0893 0.0183 0.0043 -0.0075 0.0237 -0.0171 0.0433 -0.0395 0.0257 -0.1002 0.0477 0.1028 -0.0300 -0.1238 -0.1017 -0.1629 0.0904 0.1214 0.1210 -0.0240 -0.1687 -0.3795 -0.0999 -0.2072 0.0464 0.0531 0.0477 0.1024 0.1320 0.0129 -0.1496 0.0486 -0.0324 -0.0231 0.0197 0.1094 -0.0113 0.1434 -0.2488 0.0410 0.0048 0.0194 -0.0048 -0.4033 -0.0926 0.2669 0.3406 0.0567 0.0775 0.0807 0.1876 -0.0594 0.0115 -0.0454 -0.0757 0.0672 0.0007 0.0000 -0.0261 -0.0094 0.0355 0.0347 -0.1279 -0.0137 0.0466 0.0140 0.0048 -0.0205 -0.0111 -0.0089 -0.0318 0.0009 -0.0098 -0.0040
2066bp1 2066bp1 Biopsy d2066 6 #E7298A 2066bp1 -0.1676 0.2239 -0.1676 0.2239 0.0800 -0.0434 0.0777 0.0210 0.0530 0.1426 -0.0660 -0.1277 -0.1316 0.0445 0.0144 0.1359 0.0420 -0.1003 -0.1442 0.0497 0.0203 0.2141 0.0397 -0.1429 -0.0531 -0.0725 0.0460 -0.0163 0.0015 0.4164 -0.1269 0.0500 -0.3997 0.0774 0.0180 0.0010 0.1148 -0.0482 0.0075 -0.2491 0.0275 -0.0742 0.0510 0.0977 0.0043 -0.2311 0.3490 0.0542 0.1295 0.1672 -0.0728 0.0081 0.0747 0.0527 -0.0279 -0.0274 0.0012 0.0085 0.0122 -0.0107 0.0408 -0.0090 0.0355 0.0162 -0.0069 0.0038 -0.0186 -0.0172 -0.0172 0.0252 -0.0207 -0.0171 0.0054 0.0125 -0.0001 -0.0033 -0.0030 0.0068
2065m2 2065m2 Monocyte d2065 5 #7570B3 2065m2 -0.0363 -0.1123 -0.0363 -0.1123 -0.0341 -0.1564 0.1233 -0.2155 -0.0372 -0.0458 -0.1172 0.1743 -0.0431 -0.0559 0.1886 0.0528 -0.1132 0.0883 0.1052 -0.0062 -0.1697 0.1340 0.0826 -0.0003 -0.1553 0.1638 -0.0279 0.0856 0.1135 0.0264 0.1191 0.0265 -0.0303 0.0848 0.0532 -0.0458 0.1290 -0.0655 0.1133 0.0479 -0.2321 -0.0039 0.0126 -0.0767 -0.0333 0.1439 -0.0170 -0.0818 -0.0298 0.2986 -0.1784 -0.0776 -0.1860 0.0942 0.0961 -0.0518 0.1297 0.1294 -0.1059 -0.1759 0.0602 0.2959 0.0729 -0.1143 0.1365 0.1058 0.1419 -0.0685 0.0089 -0.1191 -0.1724 0.0631 -0.0720 -0.0722 0.0418 -0.0134 -0.0156 -0.0214
2065n2 2065n2 Neutrophil d2065 5 #D95F02 2065n2 0.1333 0.0862 0.1333 0.0862 -0.0903 0.0110 0.0900 -0.1931 0.0002 0.0034 0.0019 0.0463 -0.0088 -0.1868 -0.0412 0.0462 0.0823 0.1272 -0.1937 0.1269 -0.2597 -0.1731 -0.0232 -0.2023 -0.1403 0.1758 -0.1732 0.0367 -0.0225 -0.0120 -0.1785 -0.0981 -0.0094 0.1588 -0.0320 -0.1688 0.2418 0.1207 0.1520 0.1989 0.1550 0.0700 0.0028 -0.0272 -0.0861 -0.0158 0.0447 0.0742 0.0151 -0.0457 0.2017 0.1474 0.0152 0.1416 0.0763 0.0026 0.0765 0.0596 0.0451 -0.0006 -0.2544 -0.2588 0.1512 -0.0216 -0.0463 -0.0820 0.1024 0.0092 -0.0767 0.0508 0.0567 0.0459 0.0377 -0.0021 -0.0126 -0.0044 -0.0054 -0.0044
2066m2 2066m2 Monocyte d2066 6 #7570B3 2066m2 -0.0320 -0.1007 -0.0320 -0.1007 -0.0335 -0.1565 0.0607 -0.1962 -0.0793 0.0195 -0.0962 0.1195 -0.0696 -0.0774 0.1643 0.0929 -0.1111 0.0472 -0.0529 -0.0561 -0.0197 0.2236 -0.0382 -0.0827 -0.1435 -0.1545 -0.0788 -0.1300 -0.0453 0.0640 -0.0086 0.0591 0.0522 -0.1762 -0.0601 0.0239 -0.0056 -0.0072 -0.1731 -0.0309 0.0084 0.0520 0.0396 -0.0866 -0.1053 0.0752 -0.1107 0.1461 0.1618 -0.2817 -0.2562 0.0595 -0.1304 0.1074 0.1785 0.0566 -0.1166 -0.0210 -0.1707 0.1985 0.0373 -0.2653 -0.2182 0.2327 -0.1150 0.0692 0.0346 0.1396 0.0707 0.0087 0.0010 -0.0689 0.0096 -0.0043 -0.0218 -0.0015 0.0176 0.0016
2068m1 2068m1 Monocyte d2068 7 #7570B3 2068m1 -0.0406 -0.1006 -0.0406 -0.1006 -0.0282 -0.1771 0.1103 -0.1913 0.0209 -0.1175 -0.1637 0.0379 -0.0028 0.1957 0.0251 -0.0207 -0.1194 -0.0824 0.0567 0.0330 -0.0224 -0.0161 0.0710 0.0792 0.1672 -0.0941 -0.0042 -0.0132 0.0403 -0.0202 -0.0230 -0.0446 -0.0438 0.1557 0.0353 0.1561 -0.2044 0.1665 0.0798 0.0087 -0.0666 0.1611 0.0102 0.1440 0.1746 -0.0888 0.1188 0.1517 0.1229 -0.2780 0.2276 0.1157 0.2394 -0.0078 0.1458 0.2722 0.2228 -0.0081 -0.1732 -0.0403 -0.0645 0.1300 0.0221 -0.0636 0.1881 0.0933 0.0115 0.0275 0.0293 0.0314 0.0437 0.0414 0.0330 0.0575 0.0756 0.0355 0.0083 0.0038
2068n1 2068n1 Neutrophil d2068 7 #D95F02 2068n1 0.1309 0.0732 0.1309 0.0732 -0.0742 0.0017 0.0585 -0.1799 0.0862 -0.0767 -0.0347 -0.0854 0.0698 -0.0721 -0.2189 0.0260 -0.0638 -0.0507 -0.1500 0.1300 -0.0662 -0.0738 0.0604 0.0606 0.0208 -0.1289 0.2120 -0.0740 -0.0582 -0.0292 -0.0726 -0.1195 0.0036 -0.1227 0.0189 0.1111 -0.1915 -0.0049 0.1250 -0.1637 -0.1098 0.1933 0.1017 0.1486 0.0524 -0.0982 -0.2501 0.0127 -0.1157 0.2191 -0.2795 0.0128 -0.0688 -0.0160 -0.0419 0.1036 -0.0836 0.4069 0.1570 0.1707 -0.0960 -0.0772 0.1182 -0.0503 0.0149 0.0451 -0.0177 0.0146 0.0657 0.0099 0.0255 -0.0183 0.0148 0.0256 0.0121 0.0021 -0.0078 0.0096
2068e1 2068e1 Eosinophil d2068 7 #66A61E 2068e1 0.0798 -0.0641 0.0798 -0.0641 0.2084 0.0453 0.0071 -0.1740 0.0488 -0.0093 -0.1444 -0.0052 0.0116 0.0262 -0.0442 -0.1372 -0.0326 -0.1077 -0.1636 0.0759 -0.0939 -0.1311 -0.1640 0.0448 0.1022 -0.1695 0.0566 -0.0064 0.0476 -0.0449 0.0327 0.2772 -0.0152 -0.1000 0.1543 -0.2706 0.0024 0.0264 -0.0992 -0.0118 -0.0281 -0.0397 -0.0598 0.2440 -0.0196 0.0091 -0.0153 0.2015 0.0431 0.0524 0.2116 -0.2082 -0.2861 0.2127 0.0262 -0.0468 -0.0272 -0.0656 0.1062 -0.0973 0.1549 -0.0248 -0.1616 -0.0966 0.0321 -0.0516 -0.1591 0.0260 -0.0473 0.0194 -0.0400 0.2414 0.0397 -0.0412 -0.0496 -0.0014 0.0003 -0.0060
2068bp1 2068bp1 Biopsy d2068 7 #E7298A 2068bp1 -0.1653 0.1961 -0.1653 0.1961 0.0758 -0.0321 -0.2075 -0.0387 -0.1678 -0.3516 0.0171 -0.0012 0.0221 0.0068 -0.0005 -0.0567 -0.0100 0.0396 0.0012 0.0099 0.0272 0.0401 0.0018 0.0733 -0.0373 0.0944 0.1114 0.0156 0.2285 0.0487 -0.1564 0.0946 -0.1304 0.0193 -0.2686 0.1848 0.1388 -0.2006 0.0253 0.0673 0.1012 0.0697 -0.0054 0.4071 -0.1212 0.3269 0.0160 -0.0223 -0.2103 -0.1977 0.0132 -0.0233 -0.0594 -0.0528 -0.0574 -0.0239 0.0135 0.0387 -0.0041 0.0260 -0.0276 -0.0216 -0.0314 -0.0173 -0.0095 0.0105 -0.0056 -0.0195 -0.0172 -0.0251 -0.0168 -0.0103 0.0140 -0.0184 0.0115 0.0121 0.0014 0.0171
2072m1 2072m1 Monocyte d2072 9 #7570B3 2072m1 -0.0198 -0.1005 -0.0198 -0.1005 -0.0361 -0.1550 -0.1895 -0.2126 0.0336 0.1425 -0.1277 0.1072 -0.0114 0.0347 0.0396 0.0629 -0.0590 0.1462 0.2200 -0.0092 0.0061 0.0699 -0.0175 0.1612 0.1441 0.0085 -0.0092 -0.1117 0.0220 0.0866 -0.2033 -0.1134 0.0464 -0.1731 0.2000 -0.0840 0.0249 -0.1993 0.0479 0.0057 0.2104 0.0248 -0.1423 0.0638 -0.0391 -0.2930 -0.0524 -0.0796 -0.0572 -0.0878 0.0682 0.1148 -0.0298 -0.2260 0.0964 -0.3891 0.0652 -0.0315 0.2092 0.0733 0.0109 0.0561 0.0719 -0.0191 -0.0450 0.0297 0.0152 -0.0702 -0.0442 -0.0337 0.0730 0.0429 -0.0074 -0.0113 0.0522 0.0052 -0.0214 -0.0050
2072n1 2072n1 Neutrophil d2072 9 #D95F02 2072n1 0.1402 0.0749 0.1402 0.0749 -0.0848 0.0184 -0.1371 -0.1783 0.1131 0.0697 -0.0160 -0.0576 0.0741 -0.1554 -0.1554 0.1005 0.0091 0.0716 0.0757 -0.0150 0.0577 -0.0354 0.2541 -0.0799 0.0040 -0.0798 0.0269 0.1522 0.0234 -0.1062 -0.1296 0.1569 -0.0083 0.0587 0.0721 -0.0283 -0.1405 -0.1677 -0.0524 -0.0529 0.0807 0.0403 0.1182 0.0169 0.1747 0.1062 -0.0089 0.0304 0.0806 0.0035 -0.2266 -0.0277 -0.0254 0.0068 -0.0586 -0.0838 -0.1252 -0.4576 -0.2809 -0.1761 -0.2571 0.0126 0.1175 -0.1090 0.0200 -0.0049 -0.1388 -0.0402 0.0030 0.0401 -0.0051 0.0026 -0.0173 0.0044 0.0076 -0.0002 -0.0074 -0.0038
2072e1 2072e1 Eosinophil d2072 9 #66A61E 2072e1 0.0689 -0.0492 0.0689 -0.0492 0.1760 0.0340 -0.1636 -0.1924 0.1023 0.1573 -0.2275 -0.0519 -0.0299 -0.2241 0.1830 -0.5762 0.3195 -0.1380 -0.0869 -0.0691 0.1638 0.1245 -0.0295 0.0353 -0.1155 -0.0178 0.0882 0.1156 0.1038 -0.0006 -0.0144 -0.1760 0.0552 0.1227 0.0182 0.1332 0.0362 0.0662 -0.0231 0.0190 -0.0150 -0.0582 0.0368 -0.0543 -0.0299 -0.0284 -0.0327 -0.0572 -0.0475 -0.0142 -0.0842 0.1314 0.0956 0.0156 -0.0089 0.0424 0.0044 -0.0257 -0.0021 0.0384 0.0728 -0.0075 0.0520 -0.0790 0.0033 -0.0511 -0.0145 0.0714 -0.0209 -0.0439 0.0092 -0.0294 -0.0116 -0.0085 0.0096 0.0052 -0.0034 0.0140
2072bp1 2072bp1 Biopsy d2072 9 #E7298A 2072bp1 -0.1648 0.1925 -0.1648 0.1925 0.0592 -0.0241 -0.2801 -0.0373 -0.1418 -0.2109 0.0243 0.0642 0.0666 0.0232 0.0030 0.0067 0.0219 -0.0175 0.0763 -0.0023 -0.0825 -0.1885 0.0169 -0.0576 -0.1637 -0.1754 -0.1711 -0.0267 -0.2185 -0.1310 0.1517 -0.1747 0.0177 -0.0445 0.4224 -0.0241 -0.0061 0.0887 -0.1304 -0.1047 -0.1317 0.0511 0.3205 0.0546 -0.2363 0.0219 0.2328 -0.1887 -0.0161 -0.0025 0.0007 0.0674 0.0609 0.0042 0.0396 -0.0205 -0.0475 -0.0223 0.0314 0.0033 0.0118 0.0156 -0.0223 -0.0094 0.0300 0.0019 0.0017 -0.0016 -0.0024 -0.0004 0.0125 -0.0033 0.0022 -0.0080 -0.0060 -0.0198 -0.0051 -0.0113
2071bp1 2071bp1 Biopsy d2071 8 #E7298A 2071bp1 -0.1560 0.1967 -0.1560 0.1967 0.0691 -0.0295 -0.3518 -0.0469 -0.2021 -0.1465 -0.0904 -0.1302 -0.2398 0.0826 0.0442 0.2151 0.1510 -0.1453 -0.0366 0.0955 -0.0329 0.0410 0.0190 0.0195 0.0259 0.1107 0.0036 0.0646 0.1036 -0.2803 0.0036 0.0040 0.2618 -0.1246 -0.2835 -0.0415 0.0208 0.0425 -0.0179 0.0752 -0.0687 -0.0559 -0.0544 -0.1323 0.1416 -0.3381 -0.0301 0.1289 0.1664 0.1703 -0.0304 -0.0069 -0.0265 0.0549 0.0693 0.0445 0.0041 -0.0255 -0.0091 0.0170 -0.0124 0.0425 0.0208 0.0021 0.0101 -0.0170 0.0090 0.0097 0.0005 -0.0007 0.0119 0.0001 0.0227 -0.0181 -0.0163 -0.0116 -0.0034 -0.0045
2073m1 2073m1 Monocyte d2073 10 #7570B3 2073m1 -0.0319 -0.1114 -0.0319 -0.1114 -0.0334 -0.1614 0.0095 -0.0023 -0.0658 -0.0001 0.0274 0.0201 -0.0152 -0.0709 -0.0229 0.0470 0.0701 -0.1236 0.1114 -0.0688 -0.0298 -0.0150 -0.1239 0.0090 0.0559 -0.0672 0.0686 0.0923 -0.1373 -0.0780 -0.0850 0.1094 0.0915 -0.0400 0.0618 0.0323 -0.1060 0.1171 0.1203 -0.1005 0.1362 -0.0543 -0.1545 0.1071 -0.0528 0.0759 0.0835 0.1520 -0.0903 0.0865 0.0162 0.1000 0.1730 0.0157 -0.0486 -0.0122 0.0295 0.0384 0.0105 -0.1003 -0.0372 -0.0438 0.0756 0.1016 -0.1112 -0.1045 0.0347 0.0370 -0.0144 -0.0240 -0.4826 -0.2478 -0.2199 -0.2177 -0.3626 -0.1235 0.0029 -0.0131
2073n1 2073n1 Neutrophil d2073 10 #D95F02 2073n1 0.1355 0.0712 0.1355 0.0712 -0.0888 0.0156 0.0329 0.0084 -0.0648 -0.0184 0.0294 0.0032 0.0039 -0.2330 -0.0665 0.1121 0.0321 -0.1673 0.1097 -0.0967 0.0467 -0.0509 -0.0028 0.0742 0.1414 -0.0549 0.0644 -0.0688 0.1031 0.0216 0.0823 -0.0628 -0.0675 0.0244 0.0043 0.0034 -0.0242 0.0932 -0.1405 -0.0399 -0.0495 -0.0174 -0.0581 0.1058 0.0712 -0.0322 -0.0003 -0.0772 -0.0377 -0.0430 -0.0646 -0.0653 -0.0040 0.0047 -0.0002 -0.0380 -0.0140 -0.0088 -0.1298 -0.0626 0.1127 0.0438 0.0406 0.1564 -0.0861 -0.2571 0.5855 0.1244 -0.3406 0.0937 0.0870 0.2302 0.0725 -0.0021 0.0034 -0.0014 0.0174 -0.0162
2073e1 2073e1 Eosinophil d2073 10 #66A61E 2073e1 0.0757 -0.0689 0.0757 -0.0689 0.2109 0.0503 0.0907 0.0014 -0.0408 -0.0681 -0.0167 -0.0139 -0.0268 -0.1291 0.0197 -0.0491 0.0496 -0.1803 0.0547 -0.1218 -0.0645 -0.0250 -0.0925 -0.0531 -0.0120 0.1220 -0.0444 -0.0868 -0.1548 -0.0207 -0.0821 0.0542 -0.0280 -0.0464 -0.0144 0.0057 -0.1848 -0.1897 0.0248 0.0079 -0.0039 0.1219 0.1243 0.0331 0.0270 -0.0620 0.0123 0.0622 0.0182 0.0380 0.2064 -0.1225 -0.1382 0.1260 -0.0986 -0.0813 0.0196 -0.0497 0.0009 -0.1041 -0.0047 0.0684 0.0386 0.1507 -0.0259 0.0217 0.2408 -0.1199 0.1669 -0.0919 0.2049 -0.5243 -0.0699 0.1184 0.2283 0.0418 0.0014 -0.0046
2073bp1 2073bp1 Biopsy d2073 10 #E7298A 2073bp1 -0.1584 0.1858 -0.1584 0.1858 0.0537 -0.0336 -0.1210 0.0334 -0.1476 -0.1291 -0.1017 -0.1450 -0.0604 -0.0368 -0.0030 0.0140 0.0529 0.0017 0.0304 0.0115 -0.0423 -0.1325 -0.0232 0.0681 -0.1563 -0.0211 0.0402 -0.0081 -0.0920 0.2867 0.0371 0.0358 -0.1918 0.1040 0.2794 -0.0308 -0.1447 0.0376 0.1786 -0.0423 0.0723 -0.0621 -0.3239 -0.3301 0.1359 0.1835 -0.4307 -0.0019 0.0667 -0.0973 0.0733 -0.0774 -0.0267 -0.0245 -0.0012 0.0811 0.0144 -0.0331 0.0129 0.0039 -0.0119 0.0228 0.0199 0.0085 -0.0064 -0.0303 0.0064 -0.0011 0.0377 0.0186 0.0451 0.0081 0.0149 -0.0110 -0.0053 -0.0060 0.0048 -0.0062
2068m2 2068m2 Monocyte d2068 7 #7570B3 2068m2 -0.0334 -0.1010 -0.0334 -0.1010 -0.0341 -0.1657 0.1071 0.0781 0.1168 -0.1777 0.0255 -0.1172 0.0146 0.2091 -0.1240 -0.1306 0.0550 -0.1600 -0.0104 0.0347 -0.0406 -0.1157 0.1179 -0.0363 0.0764 -0.0694 -0.1001 0.0345 0.0953 0.0043 -0.1112 -0.0596 0.0297 0.2757 0.0102 0.1412 0.0722 0.0073 0.0583 0.1463 -0.2939 0.1472 -0.0530 -0.1412 0.0568 0.0492 0.1151 0.0243 0.1087 -0.0045 -0.1266 -0.1438 -0.1654 -0.1750 0.1433 -0.3482 -0.0480 -0.1204 0.1367 0.1111 0.1220 -0.2014 -0.0053 0.0581 -0.0727 -0.1457 0.0123 -0.0294 0.0676 0.0851 -0.0839 -0.0687 -0.0008 0.0013 -0.0474 -0.0125 0.0231 -0.0089
2068n2 2068n2 Neutrophil d2068 7 #D95F02 2068n2 0.1412 0.0906 0.1412 0.0906 -0.0922 0.0164 0.1060 0.0055 0.1668 -0.2018 -0.0447 -0.0338 0.0411 0.1913 -0.1511 -0.0667 0.0720 0.0265 0.0140 0.1594 -0.2209 0.2902 -0.1630 0.0723 -0.1909 0.0561 0.2526 -0.0437 -0.2351 0.0156 0.1270 -0.3463 0.1998 0.0138 -0.0377 -0.0876 -0.0556 -0.1688 -0.1781 -0.0352 0.1240 -0.1730 -0.1822 0.0543 0.1351 0.1473 0.1889 -0.0508 0.1186 -0.0122 0.0330 0.0246 -0.0786 -0.0286 -0.0063 0.0063 0.0133 -0.0839 -0.0420 -0.0341 -0.0193 0.0145 -0.0079 -0.0002 -0.0057 0.0061 0.0243 0.0157 -0.0062 -0.0036 -0.0079 0.0116 -0.0019 0.0060 0.0047 -0.0015 0.0003 0.0006
2068e2 2068e2 Eosinophil d2068 7 #66A61E 2068e2 0.0760 -0.0641 0.0760 -0.0641 0.2192 0.0462 0.1636 0.0451 0.0940 -0.2212 -0.0560 -0.0804 0.0064 0.2363 -0.0785 -0.0604 -0.0580 -0.1192 -0.0042 0.0801 -0.1920 -0.0506 0.1212 -0.0542 0.0457 -0.0443 -0.0881 -0.1243 0.2088 0.0447 0.0570 0.2066 0.1213 0.0037 0.1193 -0.0674 0.2098 -0.1452 -0.0724 -0.0271 0.1377 -0.1423 0.0316 -0.1149 -0.0386 -0.1305 -0.1583 -0.0357 -0.2637 0.0105 -0.1928 0.3102 0.2609 0.0406 -0.0572 0.0340 -0.0155 -0.0191 -0.0931 -0.0835 -0.0487 0.0581 -0.1085 0.0947 -0.0271 -0.1148 0.0592 -0.0445 0.0638 -0.0953 0.0860 -0.0120 -0.0097 0.0177 -0.0444 0.0038 0.0002 -0.0044
2072m2 2072m2 Monocyte d2072 9 #7570B3 2072m2 -0.0219 -0.1033 -0.0219 -0.1033 -0.0371 -0.1584 -0.0980 0.0636 0.0947 0.0161 0.0415 -0.0722 0.0108 0.0571 -0.0810 -0.0566 0.1067 0.0716 0.0994 -0.0027 0.0323 -0.0393 0.0178 -0.0560 0.0835 0.0187 -0.0826 -0.0448 0.0350 0.1019 -0.1342 -0.1358 0.1109 -0.0749 0.1374 -0.0323 0.1021 -0.1115 0.0217 0.1144 -0.0576 0.0431 -0.0509 0.0437 -0.0650 -0.0474 0.0123 -0.0465 -0.0289 0.0838 -0.0212 -0.3382 0.0105 0.0962 -0.0562 0.3272 0.1634 0.1297 -0.2986 -0.0483 0.0569 -0.0307 0.0821 0.2359 -0.3224 0.0317 -0.2821 -0.0710 -0.2538 -0.0468 0.0921 -0.0098 -0.0188 -0.0527 0.0666 0.0023 -0.0296 0.0127
2072n2 2072n2 Neutrophil d2072 9 #D95F02 2072n2 0.1506 0.0928 0.1506 0.0928 -0.1037 0.0328 -0.1351 -0.0304 0.1576 0.0071 -0.0304 0.0039 0.0415 0.0537 -0.0906 0.0575 0.1277 0.1291 0.1943 -0.0188 0.0304 0.1339 0.1160 -0.1357 -0.0975 -0.0045 -0.0616 0.1719 -0.0376 -0.0816 -0.0353 0.2376 0.0058 0.1893 0.0336 -0.1439 -0.0738 -0.0747 -0.0638 0.1032 0.0495 -0.0188 0.0647 -0.0476 0.0964 0.0588 0.0392 0.1356 -0.0284 -0.1250 0.0770 -0.1549 0.2638 0.1751 -0.0646 -0.1098 -0.1032 0.3375 0.0823 0.3358 0.2686 0.1666 -0.0368 0.0712 0.0806 0.0180 0.0535 0.0369 0.0383 -0.0241 0.0091 0.0089 0.0038 0.0029 -0.0104 -0.0111 0.0107 -0.0019
2072e2 2072e2 Eosinophil d2072 9 #66A61E 2072e2 0.0946 -0.0550 0.0946 -0.0550 0.2093 0.0672 -0.1351 0.0187 0.0565 0.0727 -0.0448 -0.0161 0.0218 0.0161 -0.0114 -0.0478 0.0743 0.0936 0.1621 0.0184 -0.0208 0.0284 0.1526 -0.1416 0.0499 -0.0209 -0.0049 -0.0029 0.0083 0.1925 0.1870 -0.0116 0.1016 -0.1062 -0.1278 -0.0085 0.0862 0.1708 0.1271 -0.0569 0.1033 0.0647 0.0530 0.0230 0.1169 0.0647 0.0753 -0.0159 0.0409 -0.0659 0.0403 -0.2148 0.0340 -0.2252 0.3051 0.0725 -0.3342 0.2135 0.1169 -0.3272 -0.2079 -0.0276 -0.1769 0.0394 -0.0185 0.0556 0.0984 -0.1369 0.0383 0.0557 -0.0351 -0.0003 -0.0074 -0.0034 -0.0122 -0.0122 -0.0266 -0.0073
2073m2 2073m2 Monocyte d2073 10 #7570B3 2073m2 -0.0314 -0.1030 -0.0314 -0.1030 -0.0373 -0.1571 0.0816 0.1280 -0.0939 -0.0300 0.0959 -0.0336 0.0006 -0.0607 -0.1100 -0.0148 0.1427 -0.1059 0.0590 -0.0183 -0.0294 -0.0517 -0.0687 -0.1100 0.0240 0.0183 0.1276 0.1738 -0.0776 0.0260 -0.0217 0.1048 0.0730 -0.0392 0.0335 0.0736 0.0167 0.0586 0.0689 -0.0640 -0.0573 -0.0061 -0.1446 -0.0341 -0.1111 0.0260 0.0634 0.1148 -0.0795 0.1181 0.0060 0.0516 0.0944 -0.0153 0.0368 -0.1195 -0.1242 -0.0859 -0.0244 0.1410 -0.1460 -0.0711 -0.2324 -0.1782 0.0511 0.4292 0.0548 0.1313 -0.2833 -0.3005 0.2029 0.1131 -0.1169 0.0673 0.1671 0.0804 -0.0040 0.0051
2073n2 2073n2 Neutrophil d2073 10 #D95F02 2073n2 0.1422 0.0899 0.1422 0.0899 -0.1115 0.0311 0.0637 0.1093 -0.0846 -0.0528 -0.0242 0.1003 -0.0350 -0.0636 -0.0103 0.0353 0.1290 -0.0893 0.1845 -0.0344 -0.0339 0.0187 -0.1719 0.0444 0.1898 0.0573 -0.0235 -0.0311 0.0400 0.1344 0.0739 -0.0650 -0.1211 0.0544 -0.0334 -0.0318 0.1074 0.1762 -0.3220 -0.0276 -0.1958 -0.0593 -0.0747 0.0008 -0.1128 -0.1127 -0.0923 0.1086 -0.1552 -0.1337 0.0623 0.0226 -0.0909 0.0211 0.0952 -0.1400 -0.2465 0.1300 -0.2509 0.0314 -0.1520 0.0769 0.2827 -0.1137 0.0518 -0.0200 -0.2870 -0.0591 0.1906 -0.0187 0.0028 -0.0746 -0.0077 0.0024 -0.0209 -0.0007 -0.0086 0.0130
2073e2 2073e2 Eosinophil d2073 10 #66A61E 2073e2 0.0787 -0.0653 0.0787 -0.0653 0.2110 0.0600 0.0777 0.1203 -0.0372 -0.0714 -0.0169 -0.0068 -0.0311 -0.0930 0.0407 -0.0425 0.0495 -0.1466 0.1352 -0.1033 -0.1053 0.0201 0.0400 -0.0647 -0.0347 0.2148 -0.0635 -0.1585 -0.1319 -0.0082 -0.0489 -0.0206 -0.0369 -0.0206 -0.0590 0.0811 -0.1178 -0.1710 0.0359 -0.0253 0.0011 0.0926 0.1271 -0.1113 0.0211 -0.0677 -0.0334 0.0100 -0.0444 -0.0143 0.0622 0.0918 -0.0173 0.0049 -0.1157 -0.0658 0.0112 0.0030 -0.0500 0.1055 -0.0189 0.0189 -0.0530 0.0031 -0.0130 0.2917 -0.1124 -0.0703 -0.1599 0.4865 -0.2781 0.2758 0.1979 -0.1088 -0.0209 -0.0296 0.0150 0.0022
2068m3 2068m3 Monocyte d2068 7 #7570B3 2068m3 -0.0183 -0.1002 -0.0183 -0.1002 -0.0415 -0.1616 -0.1054 -0.0831 0.0482 0.0620 0.0031 -0.0334 -0.0085 0.1256 -0.0781 -0.0122 0.0079 0.0858 0.0127 -0.0078 0.0721 -0.0653 -0.1223 0.0503 0.0785 -0.0017 0.0152 -0.3141 0.1104 -0.1444 -0.0284 -0.0733 -0.2748 -0.0989 -0.1016 0.0705 -0.0266 0.0341 0.0154 0.1096 -0.0605 0.0357 -0.0082 -0.2195 0.0767 0.2553 0.1292 -0.0238 0.1760 0.0685 0.0469 0.3070 0.0262 0.2684 -0.2119 -0.0430 -0.3288 0.0961 0.1006 -0.1666 0.0047 0.1155 -0.0121 0.0142 -0.1056 -0.0054 -0.0495 -0.0636 -0.0939 -0.0365 0.1095 0.0365 -0.0553 -0.0093 -0.0332 -0.0094 -0.0162 0.0013
2068n3 2068n3 Neutrophil d2068 7 #D95F02 2068n3 0.1484 0.0911 0.1484 0.0911 -0.0959 0.0248 0.0176 -0.1031 0.0871 -0.0294 0.0314 -0.0420 0.0250 0.0635 -0.1872 -0.0229 0.1226 0.2054 -0.0674 0.1538 -0.1160 0.1541 -0.2144 0.0506 -0.0462 0.0778 0.0306 -0.0173 -0.0599 -0.0955 0.0080 0.1166 -0.2299 -0.1325 -0.1522 0.1943 -0.0663 0.2178 0.1444 -0.0364 -0.0613 0.0771 0.1270 -0.1398 -0.3014 -0.1838 -0.1576 -0.1249 -0.0861 -0.0614 0.0182 -0.1897 0.1667 -0.0605 0.0677 -0.1014 0.1082 -0.2355 -0.0659 -0.1573 0.1685 0.0853 -0.1565 0.0780 0.0042 -0.0322 -0.0272 -0.0149 -0.0049 -0.0038 -0.0348 0.0028 -0.0117 -0.0426 -0.0113 0.0010 0.0062 -0.0098
2068e3 2068e3 Eosinophil d2068 7 #66A61E 2068e3 0.0921 -0.0670 0.0921 -0.0670 0.2180 0.0669 -0.0666 -0.0644 0.0534 0.0386 -0.0018 -0.0276 0.0183 0.0618 -0.0911 0.0166 -0.0584 0.0688 -0.0536 0.0183 -0.0543 -0.0447 -0.2104 0.0545 0.0390 -0.1131 -0.0005 -0.0246 0.2020 -0.1364 0.1478 0.2517 -0.1227 -0.0933 0.0074 -0.0521 0.0760 0.0719 -0.0259 -0.0246 0.0416 -0.1638 -0.0071 -0.1462 0.0130 0.1242 0.1596 -0.1735 0.1535 -0.0011 -0.0126 -0.0602 -0.0334 -0.3027 -0.0133 0.0614 0.1487 0.0770 -0.1164 0.3174 -0.1034 -0.0721 0.3011 -0.0807 -0.0231 0.1763 0.1038 0.0306 -0.1173 0.1150 -0.0719 -0.2106 -0.0226 0.0002 0.1125 -0.0154 0.0003 -0.0045
2072m3 2072m3 Monocyte d2072 9 #7570B3 2072m3 -0.0161 -0.0989 -0.0161 -0.0989 -0.0484 -0.1549 -0.0985 0.0504 0.0164 0.1029 0.0289 -0.0396 0.0231 0.0640 -0.1124 -0.0453 0.0919 0.1301 0.0852 0.0157 0.0636 -0.0930 0.0035 -0.0934 0.1077 0.0427 0.0259 -0.0935 0.0471 0.0839 -0.0542 -0.1030 -0.0423 -0.1284 0.0457 0.0293 0.1004 -0.1616 -0.0999 0.1122 -0.0028 0.0178 -0.0901 -0.0184 -0.1422 -0.0971 -0.0125 -0.0775 0.0044 0.1096 0.0811 -0.1433 -0.0032 0.0931 -0.1709 0.2520 -0.0649 -0.1080 -0.0786 0.1165 -0.0611 -0.1350 -0.1369 -0.2255 0.3143 -0.0394 0.3154 0.1359 0.3673 0.0634 -0.2065 0.0107 0.0850 0.0244 -0.0587 -0.0026 0.0476 -0.0089
2072n3 2072n3 Neutrophil d2072 9 #D95F02 2072n3 0.1542 0.1032 0.1542 0.1032 -0.1130 0.0367 -0.0815 0.0532 0.0285 0.0443 -0.0756 0.0525 0.0196 0.1193 0.0098 -0.0371 0.1042 0.1637 0.1533 -0.0069 0.0549 -0.0208 0.1004 -0.1370 0.1046 0.0263 -0.1293 0.0810 -0.0349 -0.0034 -0.0281 0.2085 -0.0445 0.1170 -0.0678 0.1884 -0.2323 -0.1240 -0.2079 -0.1458 -0.1827 -0.2408 -0.0678 -0.0191 -0.1393 -0.0055 -0.0321 -0.0250 0.0098 0.0672 0.0683 0.2670 -0.2811 -0.0192 0.1069 0.1918 0.2658 0.0876 0.2442 -0.1524 -0.0659 -0.1625 -0.0645 0.0240 -0.0926 0.0052 0.0392 -0.0124 -0.0602 -0.0095 0.0348 -0.0044 0.0016 0.0183 -0.0134 0.0108 -0.0052 0.0041
2072e3 2072e3 Eosinophil d2072 9 #66A61E 2072e3 0.0881 -0.0617 0.0881 -0.0617 0.2114 0.0649 -0.1090 0.0492 0.0160 0.0681 -0.0433 -0.0097 0.0222 0.0902 -0.0253 0.0597 -0.0061 0.1454 0.1588 0.0387 -0.0279 -0.0486 0.1720 -0.2262 0.0814 -0.0070 -0.0275 -0.0267 -0.1297 0.2020 0.2638 -0.1129 0.0836 -0.1247 -0.1781 0.0783 0.1025 0.2954 0.1231 -0.0777 0.0031 0.1352 -0.0528 0.1688 0.0307 0.1322 -0.0788 0.1005 0.0153 0.0477 -0.0528 0.1515 -0.1097 0.1450 -0.2175 -0.1318 0.2301 -0.2090 0.0008 0.1957 0.1634 0.0385 0.1755 0.0544 0.0463 -0.0601 -0.0553 0.0652 0.0114 -0.0786 0.0615 0.0082 -0.0181 0.0334 -0.0186 0.0022 0.0348 -0.0040
2159bp1 2159bp1 Biopsy d2159 11 #E7298A 2159bp1 -0.1791 0.2086 -0.1791 0.2086 0.0883 -0.0385 0.1056 0.0003 0.0926 0.0140 0.0657 0.0930 0.1105 -0.1105 0.0353 -0.0789 -0.0685 0.0437 -0.0935 -0.0537 0.0371 0.1990 0.0019 -0.2557 0.3243 -0.1406 -0.0890 0.0413 -0.2221 -0.4291 0.1823 -0.1198 -0.1994 0.0058 0.0575 0.1376 0.2980 -0.2032 0.0746 -0.0422 0.0285 -0.0218 -0.1789 -0.0217 0.1426 -0.0231 -0.1501 0.0877 -0.0533 -0.0201 0.0458 -0.0496 -0.0023 -0.0335 0.0425 0.0076 0.0017 0.0234 0.0018 -0.0223 -0.0056 0.0197 -0.0013 0.0095 -0.0106 0.0045 -0.0020 -0.0027 -0.0036 0.0028 0.0111 0.0034 -0.0058 -0.0015 0.0003 0.0020 0.0078 0.0076
2073m3 2073m3 Monocyte d2073 10 #7570B3 2073m3 -0.0272 -0.1186 -0.0272 -0.1186 -0.0283 -0.1589 0.0238 0.0721 0.0147 -0.0293 0.1149 -0.0237 -0.0022 -0.1364 -0.0468 0.0328 0.0655 -0.0584 0.1240 -0.1161 0.0008 0.0439 -0.1649 0.0683 0.0232 0.0491 -0.0424 0.1055 -0.0206 -0.1083 -0.1016 0.0923 0.0572 -0.0835 0.0422 0.0379 0.0221 0.1260 0.2007 -0.1180 0.1420 -0.2243 -0.0545 0.0755 -0.0542 0.1904 0.1170 -0.0103 0.0182 0.1646 -0.1614 0.0663 0.0578 0.0738 0.2029 0.0454 0.0446 0.0015 0.0565 0.0089 0.0603 0.0192 0.0453 0.1078 0.0621 -0.1805 -0.1168 -0.0562 0.3247 0.2369 0.1919 0.1464 0.2926 0.1361 0.2395 0.0488 -0.0039 0.0241
2073n3 2073n3 Neutrophil d2073 10 #D95F02 2073n3 0.1368 0.0684 0.1368 0.0684 -0.0907 0.0314 0.0359 0.0089 0.0474 -0.0877 0.0608 -0.0212 0.0116 -0.2167 -0.0830 0.1571 0.0324 -0.1670 0.2107 -0.1715 0.0424 0.1057 0.0061 0.0985 -0.0223 0.0217 0.0625 -0.0696 0.1946 -0.0520 0.1614 -0.0677 -0.1351 0.0796 0.1187 -0.1380 0.1825 0.1704 -0.0502 0.2089 0.0487 0.0700 0.0027 0.0657 0.0644 -0.0852 -0.0208 -0.0171 0.1375 -0.0903 -0.1805 0.0077 0.0043 -0.0101 -0.1768 0.1351 0.2465 -0.0677 0.3371 -0.0859 -0.0014 -0.1103 -0.2503 -0.0375 -0.0146 0.1949 -0.1506 -0.0681 0.0712 -0.0512 -0.0480 -0.1259 -0.0218 -0.0101 0.0119 -0.0023 -0.0043 -0.0010
2073e3 2073e3 Eosinophil d2073 10 #66A61E 2073e3 0.0864 -0.0709 0.0864 -0.0709 0.2124 0.0691 0.0559 0.0466 -0.0215 -0.0402 0.0715 -0.0079 -0.0042 -0.1214 -0.0275 0.1128 -0.0099 -0.0635 0.1197 -0.1334 -0.0506 0.0165 -0.1355 -0.0224 -0.0105 0.1673 -0.0659 -0.0291 -0.0688 0.0020 -0.0261 0.0281 -0.0786 -0.0378 -0.0515 0.0272 -0.0954 -0.2289 0.1427 0.0048 -0.0075 0.0951 0.1350 -0.0767 0.1051 -0.0402 0.1046 -0.1535 0.1320 -0.0957 -0.0129 0.0163 -0.0412 -0.1419 0.1292 0.1454 0.0074 0.0583 -0.0202 0.0899 0.0720 -0.0715 0.0201 -0.1830 0.0530 -0.3437 -0.1835 0.1972 0.0123 -0.3960 0.0552 0.2268 -0.1302 0.0078 -0.2196 -0.0071 -0.0072 0.0038
2162m1 2162m1 Monocyte d2162 12 #7570B3 2162m1 -0.0425 -0.1007 -0.0425 -0.1007 -0.0338 -0.1657 0.0313 -0.1423 0.0218 -0.0673 -0.0445 0.0207 -0.0260 0.2322 -0.0294 0.0129 -0.0681 -0.1665 -0.0073 -0.0896 0.2117 -0.0544 0.0894 0.1131 0.0793 0.0867 -0.1404 0.0681 -0.2107 -0.0394 0.0508 -0.1008 -0.1510 0.2603 -0.2095 -0.1134 -0.0287 0.1916 -0.0324 -0.0525 0.4340 -0.1767 0.2195 -0.0193 -0.0210 -0.0481 -0.1283 -0.2095 -0.1242 0.1171 0.0125 -0.1193 -0.2206 0.0447 -0.0094 0.0271 -0.0806 -0.0052 -0.0484 0.1077 -0.0270 -0.0394 -0.0738 -0.0246 -0.0185 0.0362 -0.0150 0.0234 -0.0650 -0.0650 -0.0080 -0.0062 -0.0374 0.0046 -0.0094 -0.0124 0.0005 -0.0018
2162n1 2162n1 Neutrophil d2162 12 #D95F02 2162n1 0.1225 0.0711 0.1225 0.0711 -0.0672 -0.0105 0.0483 -0.1530 0.0930 -0.0964 0.0524 -0.1531 0.0155 -0.0558 -0.1368 0.0429 -0.1571 -0.0623 -0.2089 -0.0999 0.3801 -0.0107 0.2605 0.1988 -0.0863 0.3116 -0.0324 0.0100 -0.0573 0.0782 0.1678 0.0565 0.1316 -0.2632 0.1663 0.2022 0.1713 -0.0163 -0.0068 -0.0677 -0.0133 -0.0633 -0.0252 -0.1831 -0.1093 0.0279 0.1631 0.2389 -0.0255 -0.0781 0.1912 0.0098 -0.0609 -0.0264 0.0009 -0.0369 0.0333 0.0709 -0.0210 -0.0155 0.0209 0.0240 0.0293 -0.0267 -0.0003 -0.0547 -0.0149 0.0077 -0.0023 -0.0109 -0.0400 -0.0099 0.0017 -0.0087 0.0059 -0.0003 0.0024 0.0046
2162e1 2162e1 Eosinophil d2162 12 #66A61E 2162e1 0.0811 -0.0609 0.0811 -0.0609 0.2102 0.0523 -0.0761 -0.1254 0.0056 0.0407 0.0107 -0.0092 0.0049 0.0961 -0.0675 0.1321 -0.1182 -0.0235 -0.1821 -0.0569 0.2382 -0.0966 -0.2013 0.0761 0.0715 0.0774 -0.0952 0.2924 -0.3011 0.1464 0.0372 -0.0499 -0.0508 0.0549 -0.1365 -0.2381 -0.0099 -0.1571 -0.0699 0.2185 -0.2805 0.0874 -0.2001 0.0970 -0.1022 0.0383 -0.0397 -0.0996 -0.0036 -0.0289 -0.2155 0.1130 0.2437 -0.0247 0.0498 0.0294 -0.0213 -0.0252 0.0658 -0.0948 -0.0308 0.0395 0.0034 0.1058 0.0419 0.0814 0.0219 -0.0069 -0.0039 0.0903 0.0086 -0.0193 0.0591 -0.0035 -0.0108 -0.0051 -0.0029 0.0001
2162bp1 2162bp1 Biopsy d2162 12 #E7298A 2162bp1 -0.1665 0.2377 -0.1665 0.2377 0.0961 -0.0355 -0.0622 -0.0678 0.1532 0.2802 0.3140 0.5361 0.3166 0.1709 -0.1171 -0.0158 0.0473 -0.3398 -0.0390 0.0066 -0.1010 0.0033 0.0283 0.0534 -0.0944 0.1481 -0.0284 0.0159 0.1619 0.1008 -0.0187 0.0172 0.0998 -0.0572 -0.0354 0.0247 -0.0964 0.0325 0.0104 -0.0292 -0.0206 0.0040 -0.0385 -0.0436 0.0128 0.0199 -0.0990 0.0052 0.0688 -0.0293 0.0144 -0.0078 0.0077 0.0410 -0.0183 0.0250 0.0026 -0.0184 -0.0008 0.0061 -0.0010 -0.0137 0.0122 0.0122 -0.0058 -0.0011 0.0068 -0.0041 0.0073 0.0023 0.0010 0.0043 -0.0071 -0.0008 0.0060 -0.0027 -0.0039 0.0009
macrofagos Macrofagos Macrophage unknown 14 #E6AB02 Macrofagos -0.1372 -0.1077 -0.1372 -0.1077 -0.0816 0.1683 0.1238 -0.0285 0.0979 -0.1432 0.0240 -0.1580 0.1954 0.0224 0.2302 0.0717 0.0891 -0.0250 0.0174 0.0297 0.0115 -0.0444 0.0503 -0.0385 0.0339 0.0510 -0.0878 0.1419 0.1364 0.0135 0.0371 -0.0923 -0.0478 -0.1122 -0.0021 0.0214 -0.0747 -0.0414 -0.0999 0.0118 0.0811 -0.0658 0.0682 0.1492 -0.1247 0.0398 -0.2238 -0.0128 0.3626 0.1389 0.1199 -0.0031 0.1822 -0.0949 -0.0696 -0.1978 -0.0012 0.1305 -0.0714 -0.1708 0.0629 -0.0856 0.0709 -0.0298 -0.1382 0.1131 -0.0159 0.3141 0.1450 0.0684 0.0623 0.0746 -0.1121 -0.0067 0.0384 -0.1276 0.0536 -0.1411
macrofagos+sbv Macrofagos+SbV Macrophage unknown 14 #E6AB02 Mcrfgs+SbV -0.1290 -0.1113 -0.1290 -0.1113 -0.0853 0.1934 0.0685 -0.0569 0.1861 -0.1440 0.1586 0.0535 -0.1671 -0.0079 0.0790 -0.0435 0.0109 0.0422 0.0216 0.0232 0.0299 -0.0556 0.0205 -0.0679 -0.0338 -0.0434 -0.0767 0.1034 0.1196 0.0125 0.0145 -0.0768 -0.0771 -0.1186 -0.0263 -0.0855 -0.1158 0.0201 0.0041 -0.0851 -0.0138 0.0503 -0.0651 -0.0290 0.0188 -0.0278 0.0500 -0.0036 -0.0603 -0.0223 0.0267 -0.0326 -0.0249 0.0282 0.0271 0.0275 -0.0290 -0.0928 0.1023 0.0678 -0.1131 0.2052 0.0064 -0.0600 -0.2431 0.0444 0.0469 0.1192 0.0160 -0.1606 -0.0550 -0.0853 0.4113 -0.0840 -0.1219 0.0481 0.1466 0.5027
macrofagos+10772 Macrofagos+10772 Macrophage unknown 14 #E6AB02 Mcrf+10772 -0.1318 -0.0956 -0.1318 -0.0956 -0.0957 0.1795 0.0396 0.0133 -0.0577 0.0300 -0.0800 -0.1358 0.2320 0.0181 0.0359 0.0325 0.0431 0.0018 -0.0066 -0.0254 -0.0059 0.0356 -0.0075 -0.0042 -0.0334 0.0269 -0.1125 0.0723 0.0981 -0.0548 0.0024 -0.1053 -0.0552 -0.0982 0.0083 -0.0625 -0.0897 0.0080 -0.0232 -0.0338 0.0430 0.0119 -0.0604 0.0353 -0.0477 0.0277 -0.0730 0.0531 0.1014 0.0572 0.0012 0.0758 0.0162 -0.0537 -0.0146 -0.0561 -0.0257 0.0825 -0.1422 0.0282 0.0836 -0.1704 -0.0921 0.0478 0.3282 -0.1381 -0.0417 -0.4070 -0.2944 -0.1457 -0.1958 -0.1201 0.2046 0.2629 -0.0622 0.2342 -0.0991 0.0669
macrofagos+10772+sbv Macrofagos+10772+SbV Macrophage unknown 14 #E6AB02 M+10772+SV -0.1259 -0.1061 -0.1259 -0.1061 -0.0900 0.1981 0.0844 -0.0035 0.1124 -0.0996 0.1183 0.0873 -0.1932 -0.0462 -0.0061 -0.0881 -0.0274 0.0425 0.0165 0.0161 0.0420 -0.0389 0.0341 -0.0452 0.0111 0.0059 -0.0019 0.0662 0.0579 0.0285 0.0059 -0.0493 -0.0451 -0.0731 -0.0150 0.0050 -0.0584 -0.0037 -0.0116 -0.0368 -0.0138 -0.0280 -0.0319 0.0417 -0.0258 -0.0157 -0.0025 0.0093 0.0659 0.0117 0.0032 0.0065 -0.0058 0.0254 0.0523 0.0894 -0.0523 -0.1041 0.0618 0.2113 -0.0660 0.0710 -0.0600 0.0173 0.1461 -0.0898 0.0147 -0.2036 -0.0586 0.0274 0.1891 -0.0632 0.0036 -0.5013 -0.0162 -0.1104 -0.3864 -0.3957
macrofagos+2169 Macrofagos+2169 Macrophage unknown 14 #E6AB02 Mcrfg+2169 -0.1254 -0.0768 -0.1254 -0.0768 -0.1014 0.1732 0.0939 0.0708 -0.2346 0.0978 -0.1982 -0.0945 0.2073 0.0374 -0.2070 -0.0609 -0.0547 0.0121 -0.0219 -0.0855 0.0048 0.1208 -0.0079 -0.0179 -0.0652 0.0386 -0.1504 0.0761 0.1302 -0.0314 -0.0361 -0.0831 -0.0024 -0.0831 -0.0134 -0.0719 -0.0276 0.0051 0.0296 -0.0543 -0.0398 0.0036 -0.0288 0.0165 0.0193 -0.0228 0.0394 -0.0163 -0.0650 -0.0438 -0.0166 -0.0060 -0.0396 0.0712 0.0687 0.0980 -0.0419 -0.0781 0.1085 0.1152 -0.0824 0.0926 -0.0204 0.0235 0.0453 -0.0784 -0.0106 -0.1098 -0.0312 0.1031 0.0743 0.0326 -0.2938 -0.1711 0.1275 -0.2587 0.5278 0.0809
macrofagos+2169+sbv Macrofagos+2169+SbV Macrophage unknown 14 #E6AB02 Mc+2169+SV -0.1186 -0.0862 -0.1186 -0.0862 -0.0978 0.2033 -0.0145 0.0381 -0.0654 0.0308 -0.0157 0.1384 -0.2710 -0.0366 -0.2132 -0.0984 -0.1147 -0.0103 -0.0008 -0.0107 -0.0124 0.0300 0.0398 0.0143 0.0438 0.0192 0.0619 -0.0727 -0.1028 0.0493 -0.0053 0.0693 0.0793 0.0677 0.0515 0.1201 0.1078 -0.0224 -0.0151 0.1180 -0.0156 -0.1315 0.1231 0.1172 -0.0587 0.0264 -0.1584 -0.0460 0.2546 0.0601 0.0332 -0.0164 0.1044 0.0223 0.0317 -0.0228 -0.0078 -0.0043 0.0207 0.0377 -0.0141 0.0168 0.0278 0.0213 0.0159 -0.0361 0.0172 -0.0401 0.0094 0.1627 -0.0018 0.0708 -0.3743 0.0504 -0.0225 0.2870 -0.1806 0.4488
macrofagos+12309 Macrofagos+12309 Macrophage unknown 14 #E6AB02 Mcrf+12309 -0.1299 -0.1008 -0.1299 -0.1008 -0.0874 0.1838 0.0066 -0.0704 0.0366 0.0354 0.0097 -0.1050 0.2758 0.0063 0.2379 0.1472 0.1302 -0.0119 -0.0119 0.0871 0.0025 -0.0506 -0.0527 0.0596 0.0871 0.0408 0.1797 -0.1623 -0.1599 0.0540 -0.0268 0.1443 0.0886 0.1034 0.0211 0.1244 0.1380 -0.0003 0.0013 0.0743 -0.0551 -0.0372 0.0575 -0.0185 0.0145 -0.0128 0.0205 -0.0296 -0.0468 -0.0587 -0.0401 -0.0448 -0.0325 0.1059 0.0912 0.0979 -0.0215 -0.1236 0.1097 0.1376 -0.0889 0.1384 0.0023 0.0023 -0.0579 -0.0128 0.0224 -0.0609 -0.0491 -0.0129 -0.0623 0.0153 -0.0088 0.2693 0.0168 -0.4892 -0.2638 0.1254
macrofagos+12309+sbv Macrofagos+12309+SbV Macrophage unknown 14 #E6AB02 M+12309+SV -0.1277 -0.1040 -0.1277 -0.1040 -0.0867 0.2022 -0.0309 -0.0576 0.1537 -0.0850 0.1427 0.0641 -0.2154 -0.0084 0.0536 -0.0088 0.0277 0.0137 0.0102 0.0222 0.0255 -0.0259 -0.0104 -0.0180 -0.0434 -0.0358 -0.0290 0.0323 0.0471 -0.0051 -0.0165 -0.0453 -0.0488 -0.0741 -0.0212 -0.0852 -0.0325 0.0048 0.0222 -0.0769 -0.0352 0.0445 -0.0753 -0.0592 0.0426 -0.0231 0.0666 -0.0033 -0.2053 -0.0843 -0.0126 -0.0117 -0.0467 0.0606 0.0173 0.0883 -0.0078 -0.0620 0.0895 0.0418 -0.0481 0.0906 0.0163 0.0152 -0.1310 -0.0240 -0.0180 0.0474 0.0051 0.1143 -0.2001 0.0811 -0.2883 0.4915 0.0395 0.2536 0.1146 -0.4189
macrofagos+12367+sbv Macrofagos+12367+SbV Macrophage unknown 14 #E6AB02 M+12367+SV -0.1230 -0.0981 -0.1230 -0.0981 -0.0929 0.2109 -0.1360 -0.0483 0.1211 0.0024 0.1210 0.1058 -0.2362 -0.0033 0.0312 0.0139 0.0079 -0.0171 0.0060 0.0245 0.0002 -0.0565 -0.0038 0.0229 -0.0180 -0.0656 0.0563 -0.0331 -0.0492 -0.0405 0.0181 0.0148 -0.0313 0.0481 -0.0302 -0.0728 -0.0468 0.0020 0.0235 -0.0426 0.0466 0.1060 -0.0961 -0.1381 0.0713 0.0008 0.1439 0.0598 -0.2516 -0.0165 -0.0427 0.0547 -0.0724 -0.1241 -0.1380 -0.0690 0.0971 0.1549 -0.2143 -0.2415 0.2180 -0.3434 -0.0265 0.0349 0.2675 0.0617 -0.0248 0.0008 0.0644 0.0481 0.1470 0.0567 -0.1105 -0.0285 0.1016 -0.3142 0.0396 0.1966
macrofagos+11126 Macrofagos+11126 Macrophage unknown 14 #E6AB02 Mcrf+11126 -0.1274 -0.0996 -0.1274 -0.0996 -0.0891 0.1884 -0.0691 -0.0725 0.0502 0.0641 0.0136 -0.0703 0.2336 0.0072 0.2251 0.1598 0.1094 -0.0321 -0.0127 0.0820 -0.0151 -0.0648 -0.0439 0.0820 0.0877 0.0107 0.1860 -0.1585 -0.1909 0.0309 0.0081 0.1548 0.0846 0.1578 0.0095 0.0915 0.1113 0.0030 0.0172 0.0568 -0.0001 -0.0064 0.0440 -0.0616 0.0365 -0.0095 0.0896 -0.0213 -0.0677 -0.0267 -0.0540 -0.0081 -0.0448 0.0037 -0.0139 0.0207 0.0113 0.0249 -0.0139 -0.0227 -0.0016 -0.0336 0.0107 0.0145 0.0211 0.0036 -0.0013 0.0035 0.0524 -0.0080 0.0786 -0.0150 0.0539 -0.3745 0.0006 0.5128 0.3043 -0.0923
macrofagos+12251 Macrofagos+12251 Macrophage unknown 14 #E6AB02 Mcrf+12251 -0.1253 -0.0695 -0.1253 -0.0695 -0.1053 0.1804 0.0063 0.0497 -0.2636 0.1679 -0.2306 -0.0887 0.2129 0.0901 -0.2212 -0.0279 -0.0404 -0.0381 -0.0294 -0.0923 -0.0222 0.1152 -0.0016 -0.0070 -0.0715 0.0022 -0.1298 -0.0027 0.0555 -0.0771 -0.0239 -0.0316 0.0044 0.0135 -0.0314 -0.1060 -0.0082 0.0284 0.0605 -0.0581 -0.0113 0.0933 -0.0477 -0.0741 0.0561 0.0122 0.1368 0.0336 -0.2201 -0.0556 -0.0303 -0.0262 -0.0743 -0.0305 -0.0579 -0.0051 0.0610 0.0117 -0.0097 -0.1154 0.0486 0.0227 0.0460 -0.0483 -0.1811 0.1300 0.0490 0.2788 0.1854 0.0361 0.0750 0.0209 0.0824 -0.0225 -0.1104 0.1611 -0.4833 -0.0378
macrofagos+12251+sbv Macrofagos+12251+SbV Macrophage unknown 14 #E6AB02 M+12251+SV -0.1164 -0.0766 -0.1164 -0.0766 -0.1045 0.2056 -0.0570 0.0548 -0.1470 0.1245 -0.0724 0.1523 -0.2242 -0.0098 -0.2989 -0.1114 -0.1467 -0.0100 -0.0202 -0.0427 -0.0211 0.0478 0.0068 0.0185 0.0245 -0.0282 0.0785 -0.1041 -0.1204 0.0305 -0.0114 0.0904 0.0941 0.1346 0.0346 0.1250 0.0986 -0.0178 0.0136 0.1045 0.0049 -0.0587 0.1025 0.0477 0.0052 0.0230 -0.0771 -0.0153 0.1431 0.0400 0.0246 0.0073 0.0681 -0.0120 0.0050 -0.0776 0.0125 0.0648 -0.0400 -0.0958 0.0003 -0.0058 0.0266 -0.0302 -0.0767 0.0317 -0.0326 0.0667 -0.0453 -0.2196 -0.1017 -0.0676 0.4311 0.1121 0.0109 -0.1986 0.2387 -0.3325
2168e1 2168e1 undefined d2168 13 #A6761D 2168e1 0.0834 -0.0640 0.0834 -0.0640 0.2116 0.0626 -0.0148 0.0721 -0.0940 0.0811 0.0452 0.0834 0.0167 -0.0200 0.0740 0.0153 0.0231 0.0787 -0.0815 0.0930 0.0761 0.0347 0.1856 0.1363 -0.1054 -0.0140 0.0683 -0.0764 -0.0644 -0.1762 -0.1508 -0.0787 -0.1441 0.0754 0.0359 -0.0537 -0.0730 0.1538 -0.0433 0.0378 -0.1141 -0.0921 -0.1066 0.0547 -0.0321 0.0284 0.0606 0.0995 0.0362 0.1004 0.0256 -0.0499 0.0147 -0.1672 -0.1389 -0.1388 0.1859 0.1077 -0.2185 0.1527 -0.2818 0.0879 -0.2922 0.0877 -0.2011 -0.0731 0.0613 -0.2039 0.2452 -0.1012 0.0901 0.1848 -0.0418 0.0468 -0.1399 -0.0289 0.0412 -0.0190
2168m2 2168m2 undefined d2168 13 #A6761D 2168m2 -0.0280 -0.1074 -0.0280 -0.1074 -0.0426 -0.1568 0.0872 0.1403 -0.0902 0.0190 0.1275 0.0352 0.0247 -0.0248 -0.0434 -0.0330 0.1596 0.0550 -0.0671 0.1304 0.0808 -0.0060 0.0756 -0.0153 -0.0908 -0.0374 0.1737 0.1843 -0.0068 -0.0071 0.0237 0.1037 0.0021 -0.0693 0.0660 -0.0755 0.1087 -0.0242 0.0932 0.0691 0.0276 0.0406 0.0666 0.0597 0.0425 -0.1261 -0.0287 -0.1618 0.0836 -0.1335 0.0157 0.1686 -0.2604 -0.0314 0.0106 -0.0010 0.0150 0.1082 -0.1031 -0.0587 0.0741 0.2132 -0.0608 -0.0214 0.1165 0.0359 -0.0422 0.0752 -0.0981 0.2829 0.2680 -0.2169 0.0293 0.1366 -0.4299 -0.0231 0.0855 -0.0279
2168n2 2168n2 undefined d2168 13 #A6761D 2168n2 0.1492 0.0983 0.1492 0.0983 -0.1065 0.0330 0.0526 0.1257 -0.0750 -0.0244 -0.0270 0.1636 -0.0255 0.0720 0.0991 0.0002 0.1521 0.0314 0.0224 0.1436 0.1128 0.1421 -0.0643 0.2719 0.0583 -0.1360 -0.1102 0.0748 0.0050 0.0629 0.0155 0.0266 -0.0134 0.0175 0.0576 -0.1346 0.1167 -0.1006 0.1470 0.0614 0.0156 0.2082 0.2443 -0.0198 0.0040 0.1128 -0.0646 0.2689 -0.0154 0.2737 0.1516 0.1750 -0.0521 -0.2850 -0.0308 0.2442 -0.1709 -0.1976 0.0115 0.0752 0.1212 -0.0177 0.0808 0.1380 -0.0619 0.0434 0.0807 -0.0200 0.0296 -0.0437 -0.0226 0.0708 0.0086 -0.0017 0.0304 0.0003 0.0141 0.0024
2168e2 2168e2 undefined d2168 13 #A6761D 2168e2 0.0889 -0.0668 0.0889 -0.0668 0.2129 0.0676 0.0435 0.1336 -0.0860 0.0122 0.0838 0.0943 0.0145 0.0278 0.0374 0.1431 -0.0159 0.1220 0.0071 0.1328 0.0058 0.0751 0.2364 0.1155 -0.0613 -0.0422 0.0307 -0.0312 -0.0491 -0.0931 -0.2060 -0.0919 -0.0457 0.0583 0.0475 -0.0253 0.0161 0.0914 -0.0104 0.0312 -0.0142 -0.0290 -0.1140 0.0123 -0.0561 -0.0202 -0.0366 0.0320 -0.0196 -0.0085 -0.0215 0.0621 -0.0087 0.0143 0.0486 0.0585 -0.1206 0.0347 0.0045 -0.0648 0.1216 0.0450 -0.1341 -0.2655 -0.0085 -0.2490 -0.1147 0.3081 -0.2086 0.1165 -0.1482 -0.2717 0.0085 -0.0794 0.4132 0.0221 -0.0709 0.0399
2168m3 2168m3 undefined d2168 13 #A6761D 2168m3 -0.0307 -0.0936 -0.0307 -0.0936 -0.0496 -0.1552 0.1026 0.1357 -0.1757 0.0269 0.0785 0.0169 0.0098 0.0189 -0.0386 -0.0655 0.1558 0.0291 -0.1344 0.1159 0.1299 -0.0924 0.0899 -0.0900 -0.0939 -0.0395 0.2124 0.1470 -0.0041 -0.0487 0.1743 0.1130 -0.0619 -0.0940 -0.0095 -0.0829 -0.0315 -0.0531 -0.0361 0.0281 0.0352 0.0756 0.0512 0.0263 0.1361 -0.1554 -0.0102 -0.2226 0.0522 -0.2239 0.0511 0.1257 -0.0553 0.0713 -0.0266 -0.0651 0.0224 0.0521 0.0179 -0.0434 -0.0073 -0.0531 0.1524 0.1991 -0.0835 -0.0304 -0.0009 -0.1184 0.1565 -0.1983 -0.2934 0.2007 0.0030 -0.1154 0.3691 0.0249 -0.0995 0.0304
2168n3 2168n3 undefined d2168 13 #A6761D 2168n3 0.1325 0.1034 0.1325 0.1034 -0.1017 0.0140 0.0811 0.1337 -0.1654 -0.0038 -0.0436 0.1504 -0.0787 0.0634 0.1500 -0.0626 0.1700 0.0391 -0.1019 0.1517 0.1056 -0.0313 -0.1024 0.2217 0.1941 -0.1180 -0.2581 -0.0038 0.0035 0.1174 0.1083 -0.0145 0.0886 -0.1293 -0.0161 0.0561 -0.0378 -0.1422 0.0807 -0.0727 0.0885 0.0405 0.0987 -0.0867 0.1623 0.1147 0.0789 -0.0407 0.0220 -0.0509 -0.1834 -0.1963 0.1395 0.2805 -0.0449 -0.2243 0.2503 0.0991 0.0415 -0.0220 -0.2220 -0.0641 -0.1144 -0.1818 0.0622 -0.0675 -0.0238 0.0292 -0.0678 0.0483 0.0095 -0.0538 -0.0085 -0.0001 -0.0096 0.0028 -0.0177 -0.0029
2168e3 2168e3 undefined d2168 13 #A6761D 2168e3 0.0839 -0.0606 0.0839 -0.0606 0.2096 0.0576 0.1218 0.1474 -0.1061 -0.0416 0.0374 0.0793 -0.0156 -0.0089 0.0668 0.0401 -0.0234 0.0685 -0.0364 0.1179 0.0368 0.0533 0.2365 0.1647 -0.0240 -0.0040 0.0170 -0.0506 0.0277 -0.1463 -0.1877 -0.0719 -0.0343 -0.0144 0.0456 0.0761 -0.0435 0.0476 -0.1043 -0.0290 0.0693 -0.0875 -0.0982 -0.0396 -0.0824 0.0092 0.0305 -0.0544 -0.0064 -0.0750 -0.0660 -0.1997 0.1006 0.1992 0.1211 0.0821 -0.0922 -0.1259 0.2084 -0.0985 0.1673 -0.1711 0.4019 0.0737 0.1425 0.2960 0.0589 -0.0849 0.0070 -0.1239 0.0864 0.0800 0.0042 0.0365 -0.2397 0.0124 0.0466 -0.0200
write.csv(q2_pca$table, file="coords/q2_pca_coords.csv")

9 Request on 202101

Maria Adelaida sent an email which said: “I have been working on the gene lists and the easiest and cleanest way I found was to get the GSEA hallmark gene sets that may be of interest to us. The idea is that we use some of these gene lists (to star the xenobiotic list) to map the changes in gene expression over the course of treatment and in the different cell populations.”

Upon speaking with her, I think the goal is to have a plot with one line per MSigDB Hallmark category gene. The x-axis will therefore be the three time points for those patients for whom we have 3 visits; the y-axis will be normalized cpm. Each dot will be a single Hallmark gene.

With that in mind, the most difficult challenge is picking out the samples for which we have the three time points.

meta <- hpgltools::extract_metadata(samplesheet)
## Dropped 103 rows from the sample metadata because they were blank.
na_idx <- is.na(meta)
meta[na_idx] <- ""

visit_3_samples <- meta[["visitnumber"]] == 3
threes <- meta[visit_3_samples, ]
visit_2_samples <- meta[["visitnumber"]] == 2
twos <- meta[visit_2_samples, ]
visit_1_samples <- meta[["visitnumber"]] == 1
ones <- meta[visit_1_samples, ]

ones[["tubelabelorigin"]] %in% twos[["tubelabelorigin"]]
##  [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE  TRUE  TRUE FALSE
## [13]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
## [25]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE FALSE  TRUE  TRUE  TRUE  TRUE FALSE
## [37] FALSE FALSE FALSE FALSE  TRUE  TRUE  TRUE FALSE FALSE FALSE FALSE FALSE
## [49] FALSE FALSE FALSE FALSE FALSE FALSE FALSE
ones_twos <- ones[["tubelabelorigin"]] %in% twos[["tubelabelorigin"]]
one_two <- meta[ones_twos, ]
all_three_idx <- threes[["tubelabelorigin"]] %in% one_two[["tubelabelorigin"]]
all_three <- threes[all_three_idx, ]
wanted_patients <- levels(as.factor(all_three[["tubelabelorigin"]]))

## So, it appears we have 3 visits for patients: su2068, su2072, and su2073.
plot_expt <- subset_expt(expt=all_norm, subset="tubelabelorigin=='su2068'|tubelabelorigin=='su2072'|tubelabelorigin=='su2073'")
## Using a subset expression.
## There were 104, now there are 30 samples.
plot_pca(plot_expt)$plot

plot_monocyte <- subset_expt(plot_expt, subset="typeofcells=='Monocytes'&tubelabelorigin!='su2072'")
## Using a subset expression.
## There were 30, now there are 6 samples.
up_monocyte_genes <- rownames(mono_sig[["deseq"]][["ups"]][["fail_vs_cure"]])
down_monocyte_genes <- rownames(mono_sig[["deseq"]][["downs"]][["fail_vs_cure"]])
plot_monocyte <- exclude_genes_expt(plot_monocyte, ids=down_monocyte_genes, method="keep")
## Before removal, there were 14652 entries.
## Now there are 211 entries.
## Percent kept: 1.668, 1.056, 1.376, 0.993, 1.355, 1.025
## Percent removed: 98.332, 98.944, 98.624, 99.007, 98.645, 98.975
hallmark_table <- openxlsx::read.xlsx(xlsxFile="reference/geneset_selection_GSEA_Hallmark_modified.xlsx")
first_category <- hallmark_table[[1]]

hallmark_genes_idx <- fData(plot_monocyte)[["hgnc_symbol"]] %in% first_category
hallmark_genes <- fData(plot_monocyte)[hallmark_genes_idx, ]
wanted <- rownames(hallmark_genes)

plotted <- exprs(plot_monocyte)[wanted, ]
plot_long <- reshape2::melt(plotted)
colnames(plot_long) <- c("gene", "samplename", "exprs")
dim(plot_long)
## [1] 24  3
plot_long <- merge(plot_long, fData(plot_monocyte), by.x="gene", by.y="row.names")
dim(plot_long)
## [1] 24 16
plot_long <- merge(plot_long, pData(plot_monocyte), by="samplename")
dim(plot_long)
## [1] 24 97
library(ggplot2)

plot_2068_idx <- plot_long[["tubelabelorigin"]] == "su2068"
plot_2068 <- plot_long[plot_2068_idx, ]
plt <- ggplot(data=plot_2068, mapping=aes_string(x="visitnumber", y="exprs",
                                                 colour="gene")) +
  geom_line() +
  theme(legend.position="none")
plt

probably_not <- ggplotly_url(plt, "probably_terrible_su2068.html")
## Warning in ggplotly_url(plt, "probably_terrible_su2068.html"): No url df was
## provided, nor is there a column: url, not much to do.
plot_2073_idx <- plot_long[["tubelabelorigin"]] == "su2073"
plot_2073 <- plot_long[plot_2073_idx, ]
plt <- ggplot(data=plot_2073, mapping=aes_string(x="visitnumber", y="exprs",
                                                 colour="gene")) +
  geom_line() +
  theme(legend.position="none")
plt

probably_not <- ggplotly_url(plt, "images/probably_terrible_su2073.html")
## Warning in ggplotly_url(plt, "images/probably_terrible_su2073.html"): No url df
## was provided, nor is there a column: url, not much to do.
if (!isTRUE(get0("skip_load"))) {
  pander::pander(sessionInfo())
  message(paste0("This is hpgltools commit: ", get_git_commit()))
  message(paste0("Saving to ", savefile))
  tmp <- sm(saveme(filename=savefile))
}
## If you wish to reproduce this exact build of hpgltools, invoke the following:
## > git clone http://github.com/abelew/hpgltools.git
## > git reset 3866d0ef3d5bf766f01b092108ec06406921447c
## This is hpgltools commit: Mon Mar 22 15:33:04 2021 -0400: 3866d0ef3d5bf766f01b092108ec06406921447c
## Saving to tmrc3_02sample_estimation_v202103.rda.xz
tmp <- loadme(filename=savefile)
LS0tCnRpdGxlOiAiTC4gcGFuYW1lbnNpcyAyMDIxMDM6IFRNUkMzIFNhbXBsZSBFc3RpbWF0aW9uIgphdXRob3I6ICJhdGIgYWJlbGV3QGdtYWlsLmNvbSIKZGF0ZTogImByIFN5cy5EYXRlKClgIgpvdXRwdXQ6CiBodG1sX2RvY3VtZW50OgogIGNvZGVfZG93bmxvYWQ6IHRydWUKICBjb2RlX2ZvbGRpbmc6IHNob3cKICBmaWdfY2FwdGlvbjogdHJ1ZQogIGZpZ19oZWlnaHQ6IDcKICBmaWdfd2lkdGg6IDcKICBoaWdobGlnaHQ6IGRlZmF1bHQKICBrZWVwX21kOiBmYWxzZQogIG1vZGU6IHNlbGZjb250YWluZWQKICBudW1iZXJfc2VjdGlvbnM6IHRydWUKICBzZWxmX2NvbnRhaW5lZDogdHJ1ZQogIHRoZW1lOiByZWFkYWJsZQogIHRvYzogdHJ1ZQogIHRvY19mbG9hdDoKICAgY29sbGFwc2VkOiBmYWxzZQogICBzbW9vdGhfc2Nyb2xsOiBmYWxzZQotLS0KCjxzdHlsZT4KICBib2R5IC5tYWluLWNvbnRhaW5lciB7CiAgICBtYXgtd2lkdGg6IDE2MDBweDsKICB9Cjwvc3R5bGU+CgpgYGB7ciBvcHRpb25zLCBpbmNsdWRlPUZBTFNFfQpsaWJyYXJ5KGhwZ2x0b29scykKdHQgPC0gc20oZGV2dG9vbHM6OmxvYWRfYWxsKCJ+L2hwZ2x0b29scyIpKQprbml0cjo6b3B0c19rbml0JHNldChwcm9ncmVzcz1UUlVFLAogICAgICAgICAgICAgICAgICAgICB2ZXJib3NlPVRSVUUsCiAgICAgICAgICAgICAgICAgICAgIHdpZHRoPTkwLAogICAgICAgICAgICAgICAgICAgICBlY2hvPVRSVUUpCmtuaXRyOjpvcHRzX2NodW5rJHNldChlcnJvcj1UUlVFLAogICAgICAgICAgICAgICAgICAgICAgZmlnLndpZHRoPTgsCiAgICAgICAgICAgICAgICAgICAgICBmaWcuaGVpZ2h0PTgsCiAgICAgICAgICAgICAgICAgICAgICBkcGk9OTYpCm9sZF9vcHRpb25zIDwtIG9wdGlvbnMoZGlnaXRzPTQsCiAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nc0FzRmFjdG9ycz1GQUxTRSwKICAgICAgICAgICAgICAgICAgICAgICBrbml0ci5kdXBsaWNhdGUubGFiZWw9ImFsbG93IikKZ2dwbG90Mjo6dGhlbWVfc2V0KGdncGxvdDI6OnRoZW1lX2J3KGJhc2Vfc2l6ZT0xMikpCnZlciA8LSAiMjAyMTAzIgpydW5kYXRlIDwtIGZvcm1hdChTeXMuRGF0ZSgpLCBmb3JtYXQ9IiVZJW0lZCIpCgpybWRfZmlsZSA8LSAidG1yYzNfMDJzYW1wbGVfZXN0aW1hdGlvbl92MjAyMTAzLlJtZCIKc2F2ZWZpbGUgPC0gZ3N1YihwYXR0ZXJuPSJcXC5SbWQiLCByZXBsYWNlPSJcXC5yZGFcXC54eiIsIHg9cm1kX2ZpbGUpCmBgYAoKIyBJbnRyb2R1Y3Rpb24KClRoaXMgZG9jdW1lbnQgaXMgaW50ZW5kZWQgdG8gcHJvdmlkZSBhbiBvdmVydmlldyBvZiBUTVJDMyBzYW1wbGVzIHdoaWNoIGhhdmUKYmVlbiBzZXF1ZW5jZWQuICBJdCBpbmNsdWRlcyBzb21lIHBsb3RzIGFuZCBhbmFseXNlcyBzaG93aW5nIHRoZSByZWxhdGlvbnNoaXBzCmFtb25nIHRoZSBzYW1wbGVzIGFzIHdlbGwgYXMgc29tZSBkaWZmZXJlbnRpYWwgYW5hbHlzZXMgd2hlbiBwb3NzaWJsZS4KCiMgQW5ub3RhdGlvbgoKV2UgdGFrZSB0aGUgYW5ub3RhdGlvbiBkYXRhIGZyb20gZW5zZW1ibCdzIGJpb21hcnQgaW5zdGFuY2UuICBUaGUgZ2Vub21lIHdoaWNoCndhcyB1c2VkIHRvIG1hcCB0aGUgZGF0YSB3YXMgaGczOCByZXZpc2lvbiA5MS4gIE15IGRlZmF1bHQgd2hlbiB1c2luZyBiaW9tYXJ0IGlzCnRvIGxvYWQgdGhlIGRhdGEgZnJvbSAxIHllYXIgYmVmb3JlIHRoZSBjdXJyZW50IGRhdGUsIHdoaWNoIHByb3ZpZGVzIGFubm90YXRpb25zCndoaWNoIG1hdGNoIGhnMzggOTEgYWxtb3N0IHBlcmZlY3RseS4KCmBgYHtyIGhzX2Fubm90fQpoc19hbm5vdCA8LSBsb2FkX2Jpb21hcnRfYW5ub3RhdGlvbnMoKQpoc19hbm5vdCA8LSBoc19hbm5vdFtbImFubm90YXRpb24iXV0KaHNfYW5ub3RbWyJ0cmFuc2NyaXB0Il1dIDwtIHBhc3RlMChyb3duYW1lcyhoc19hbm5vdCksICIuIiwgaHNfYW5ub3RbWyJ2ZXJzaW9uIl1dKQpyb3duYW1lcyhoc19hbm5vdCkgPC0gbWFrZS5uYW1lcyhoc19hbm5vdFtbImVuc2VtYmxfZ2VuZV9pZCJdXSwgdW5pcXVlPVRSVUUpCnR4X2dlbmVfbWFwIDwtIGhzX2Fubm90WywgYygidHJhbnNjcmlwdCIsICJlbnNlbWJsX2dlbmVfaWQiKV0KYGBgCgpgYGB7ciBoc19nb30KaHNfZ28gPC0gbG9hZF9iaW9tYXJ0X2dvKClbWyJnbyJdXQpoc19sZW5ndGggPC0gaHNfYW5ub3RbLCBjKCJlbnNlbWJsX2dlbmVfaWQiLCAiY2RzX2xlbmd0aCIpXQpjb2xuYW1lcyhoc19sZW5ndGgpIDwtIGMoIklEIiwgImxlbmd0aCIpCmBgYAoKIyBTYW1wbGUgRXN0aW1hdGlvbgoKSSB1c2VkIHR3byBtYXBwaW5nIG1ldGhvZHMgZm9yIHRoaXMgZGF0YSwgaGlzYXQyIGFuZCBzYWxtb24uICBNb3N0IGFuYWx5c2VzIHVzZQpoaXNhdDIsIHdoaWNoIGlzIGEgbW9yZSB0cmFkaXRpb25hbCBtYXAtYW5kLWNvdW50IG1ldGhvZC4gIEluIGNvbnRyYXN0LCBzYWxtb24KdXNlcyB3aGF0IG1heSBiZSB0aG91Z2h0IG9mIGFzIGEgaW5kZXhlZCB2b3RpbmcgbWV0aG9kIChzbyB0aGF0IG11bHRpLW1hdGNoZXMgYXJlCmRpc2NvdW50ZWQgYW5kIHRoZSB2b3RlcyBzcGxpdCBhbW9uZyBhbGwgbWF0Y2hlcykuICBTYWxtb24gYWxzbyByZXF1aXJlZCBhCnByZS1leGlzdGluZyBkYXRhYmFzZSBvZiBrbm93biB0cmFuc2NyaXB0cyAodGhvdWdoIGxhdGVyIHZlcnNpb25zIG1heSBhY3R1YWxseQp1c2UgbWFwcGluZyBmcm9tIHRoaW5ncyBsaWtlIGhpc2F0KSwgd2hpbGUgaGlzYXQgdXNlcyB0aGUgZ2Vub21lIGFuZCBhIGRhdGFiYXNlCm9mIGtub3duIHRyYW5zY3JpcHRzIChhbmQgb3B0aW9uYWxseSBjYW4gc2VhcmNoIGZvciBzcGxpY2luZyBqdW5jdGlvbnMgdG8gZmluZApuZXcgdHJhbnNjcmlwdHMpLgoKIyMgR2VuZXJhdGUgZXhwcmVzc2lvbnNldHMKCmBgYHtyIHNhbXBsZWhzaGVldH0Kc2FtcGxlc2hlZXQgPC0gInNhbXBsZV9zaGVldHMvdG1yYzNfc2FtcGxlc18yMDIxMDMueGxzeCIKYGBgCgpDYXZlYXQ6IFRoaXMgaW5pdGlhbCBzZWN0aW9uIGlzIHVzaW5nIHNhbG1vbiBxdWFudGlmaWNhdGlvbnMuICBBIG1ham9yaXR5IG9mIGFuYWx5c2VzIHVzZWQgaGlzYXQyLgoKIyMjIFNhbG1vbiBleHByZXNzaW9uc2V0cwoKQ3VycmVudGx5LCBJIGhhdmUgdGhlc2UgZGlzYWJsZWQuCgojIyMgSGlzYXQyIGV4cHJlc3Npb25zZXRzCgpUaGUgZmlyc3QgdGhpbmcgdG8gbm90ZSBpcyB0aGUgbGFyZ2UgcmFuZ2UgaW4gY292ZXJhZ2UuICBUaGVyZSBhcmUgbXVsdGlwbGUKc2FtcGxlcyB3aXRoIGNvdmVyYWdlIHdoaWNoIGlzIHRvbyBsb3cgdG8gdXNlLiAgVGhlc2Ugd2lsbCBiZSByZW1vdmVkIHNob3J0bHkuCgpgYGB7ciBhbGxfbmV3X2hpc2F0Mn0KaHNfZXhwdCA8LSBjcmVhdGVfZXhwdChzYW1wbGVzaGVldCwKICAgICAgICAgICAgICAgICAgICAgICBmaWxlX2NvbHVtbj0iaGczODEwMGhpc2F0ZmlsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgc2F2ZWZpbGU9Z2x1ZTo6Z2x1ZSgiaHNfZXhwdF9hbGwtdnt2ZXJ9LnJkYSIpLAogICAgICAgICAgICAgICAgICAgICAgIGdlbmVfaW5mbz1oc19hbm5vdCkKaHNfZXhwdCA8LSBleGNsdWRlX2dlbmVzX2V4cHQoaHNfZXhwdCwgY29sdW1uPSJnZW5lX2Jpb3R5cGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2Q9ImtlZXAiLCBwYXR0ZXJuPSJwcm90ZWluX2NvZGluZyIpCgpsaWJzaXplcyA8LSBwbG90X2xpYnNpemUoaHNfZXhwdCkKbGlic2l6ZXMkcGxvdAoKbm9uemVybyA8LSBwbG90X25vbnplcm8oaHNfZXhwdCkKbm9uemVybyRwbG90CmJveCA8LSBwbG90X2JveHBsb3QoaHNfZXhwdCkKYm94CmBgYAoKIyMgTWluaW11bSBjb3ZlcmFnZSBzYW1wbGUgZmlsdGVyaW5nCgpJIGFyYml0cmFyaWx5IGNob3NlIDMsMDAwLDAwMCBjb3VudHMgYXMgYSBtaW5pbWFsIGxldmVsIG9mIGNvdmVyYWdlLiAgV2UgbWF5CndhbnQgdGhpcyB0byBiZSBoaWdoZXIuCgpgYGB7ciBoaXNhdDJfd3JpdGUsIGZpZy5zaG93PSJoaWRlIn0KaHNfdmFsaWQgPC0gc3Vic2V0X2V4cHQoaHNfZXhwdCwgY292ZXJhZ2U9MzAwMDAwMCkKcGxvdF9saWJzaXplKGhzX3ZhbGlkKSRwbG90Cgp2YWxpZF93cml0ZSA8LSBzbSh3cml0ZV9leHB0KGhzX3ZhbGlkLCBleGNlbD1nbHVlKCJleGNlbC9oc192YWxpZC12e3Zlcn0ueGxzeCIpKSkKYGBgCgojIFF1ZXN0aW9ucyBmcm9tIE1hcmlhIEFkZWxhaWRhCgpUaGUgZm9sbG93aW5nIGNvbWVzIGZyb20gYW4gZW1haWwgMjAxOTA4MzAgZnJvbSBNYXJpYSBBZGVsYWlkYS4KCjEuIFNhbXBsZXMgV1QxMDEwIGFuZCBXVDEwMTEgUEJNQ3MgZnJvbSB0d28gaGVhbHRoeSBkb25vcnMgcHJvY2Vzc2VkIDJoLCA3aCBhbmQKICAgMTJoIGFmdGVyIHNhbXBsZSBwcm9jdXJlbWVudC4gVGhpcyBpcyBhbiBhbmFseXNpcyB0byBleHBsb3JlIHRoZSB0aW1lLWVmZmVjdAogICBvbiBnZW5lIGV4cHJlc3Npb24gYW5kIGRlZmluZSBzdGVwcyBmb3IgZGF0YSBhbmFseXNpcyBmb3IgcGF0aWVudCBzYW1wbGVzCiAgIGNvbnNpZGVyaW5nIHRpbWUtZGVwZW5kZW50IGVmZmVjdHMuCgogICBhLiBBbiBpbml0aWFsIFBDQSBvbiB0aGUgcmF3IGRhdGEgd291bGQgYmUgdmVyeSB1c2VmdWwgdG8gc2VlIGlmIHRoZXJlIGlzCiAgIGNsdXN0ZXJpbmcgYmFzZWQgb24gdGltZSBvciAoYXMgdXN1YWwpLCBtb3N0bHkgYSBkb25vci1zcGVjaWZpYyBlZmZlY3QuIFRoZW4KICAgSSB0aGluayBhIGhpZXJhcmNoaWNhbCBjbHVzdGVyaW5nIG9mIGdlbmVzIGJhc2VkIG9uIHRpbWUtZGVwZW5kZW50CiAgIG1vZGlmaWNhdGlvbnMgdG8gc2VlIHdoYXQgaXMgbW9zdGx5IGFmZmVjdGVkIChpZiBhbnkpIC0gbGlrZSB3aGF0IHlvdSBndXlzCiAgIGRpZCBmb3IgVC5jcnV6aS4KCjIuIFNhbXBsZXMgZnJvbSBTVTEwMTcsIFNVMTAzNCBTYW1wbGVzIGZyb20gVE1SQyBDTCBwYXRpZW50cy4gbT0gbW9ub2N5dGUsIG49CiAgIG5ldXRyb3BoaWwuIFNhbXBsZXMgbGFiZWxlZCAiMSIgYXJlIHRha2VuIGJlZm9yZSB0cmVhdG1lbnQgYW5kIHRob3NlICIyIiBtaWQgd2F5CiAgIHRocm91Z2ggdHJlYXRtZW50LiBUaGlzIGlzIGV4aXRpbmcsIGJlY2F1c2UgdGhlc2Ugd2lsbCBiZSBvdXIgZmlyc3QKICAgbmV1dHJvcGhpbCB0cmFuc2NyaXB0b21lcy4KCkluIGFuIGF0dGVtcHQgdG8gcG9rZSBhdCB0aGVzZSBxdWVzdGlvbnMsIEkgbWFwcGVkIHRoZSByZWFkcyB0byBoZzM4XzkxIHVzaW5nCnNhbG1vbiBhbmQgaGlzYXQyLiAgSXQgaXMgdmVyeSBub3Rld29ydGh5IHRoYXQgdGhlIHNhbG1vbiBtYXBwaW5ncyBhcmUKZXhoaWJpdGluZyBzb21lIHNlcmlvdXMgcHJvYmxlbXMgYW5kIHNob3VsZCBiZSBsb29rZWQgaW50byBmdXJ0aGVyLiAgVGhlIGhpc2F0MgptYXBwaW5ncyBhcmUgc2lnbmlmaWNhbnRseSBtb3JlICdub3JtYWwnLiAgSGF2aW5nIHNhaWQgdGhhdCwgdHdvIHNhbXBsZXMgcmVtYWluCmJhc2ljYWxseSB1bnVzYWJsZTogdG1yYzMwMDA5ICgxMDM0bjEpIGFuZCAodG8gYSBzbWFsbGVyIGRlZ3JlZSkgdG1yYzMwMDA3CigxMDE3bjEpIGhhdmUgdG9vIGZldyByZWFkcyBhcyBzaG93biBhYm92ZS4KCiMjIFByZXBhcmF0aW9uCgpUbyBhZGRyZXNzIHRoZXNlLCBJIGFkZGVkIHRvIHRoZSBlbmQgb2YgdGhlIHNhbXBsZSBzaGVldCBjb2x1bW5zIG5hbWVkCidjb25kaXRpb24nLCAnYmF0Y2gnLCAnZG9ub3InLCBhbmQgJ3RpbWUnLiAgVGhlc2UgYXJlIGZpbGxlZCBpbiB3aXRoIHNob3J0aGFuZAp2YWx1ZXMgYWNjb3JkaW5nIHRvIHRoZSBhYm92ZS4KCiMjIEdsb2JhbCB2aWV3CgpCZWZvcmUgYWRkcmVzc2luZyB0aGUgcXVlc3Rpb25zIGV4cGxpY2l0bHkgYnkgc3Vic2V0dGluZyB0aGUgZGF0YSwgSSB3YW50IHRvIGdldAphIGxvb2sgYXQgdGhlIHNhbXBsZXMgYXMgdGhleSBhcmUuCgpgYGB7ciBwcmVfcXVlc3Rpb25zfQpoc192YWxpZCA8LSBzZXRfZXhwdF9iYXRjaGVzKGhzX3ZhbGlkLCBmYWN0PSJkb25vciIpCmhzX3ZhbGlkIDwtIHNldF9leHB0X3NhbXBsZW5hbWVzKGhzX3ZhbGlkLCBuZXduYW1lcz1wRGF0YShoc192YWxpZClbWyJzYW1wbGVuYW1lIl1dKQphbGxfbm9ybSA8LSBub3JtYWxpemVfZXhwdChoc192YWxpZCwgY29udmVydD0iY3BtIiwgYmF0Y2g9InN2YXNlcSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcj1UUlVFKQphbGxfbm9ybSA8LSBub3JtYWxpemVfZXhwdChhbGxfbm9ybSwgdHJhbnNmb3JtPSJsb2cyIikKCnBsdCA8LSBwbG90X3BjYShhbGxfbm9ybSwgcGxvdF9sYWJlbHM9RkFMU0UpJHBsb3QKcHAoZmlsZT1nbHVlKCJpbWFnZXMvdG1yYzNfcGNhX25vbGFiZWxzLXZ7dmVyfS5wZGYiKSwgaW1hZ2U9cGx0KQpwbHQKYWxsX3RzIDwtIHBsb3RfdHNuZShhbGxfbm9ybSkKYWxsX3RzJHBsb3QKCmtuaXRyOjprYWJsZShhbGxfcGNhJHRhYmxlKQp3cml0ZS5jc3YoYWxsX3BjYSR0YWJsZSwgZmlsZT0iY29vcmRzL2hzX2Rvbm9yX3BjYV9jb29yZHMuY3N2IikKcGxvdF9jb3JoZWF0KGFsbF9ub3JtKSRwbG90CnBsb3RfdG9wbihoc192YWxpZCkkcGxvdApgYGAKCiMjIEFsbCBjZWxsdHlwZXMgY2xpbmljYWwgb3V0Y29tZQoKYGBge3IgYWxsX2NsaW5pY2FsfQpoc19jbGluaWNhbCA8LSBzdWJzZXRfZXhwdChoc192YWxpZCwgc3Vic2V0PSJjb25kaXRpb24hPSdQQk1DJyZjb25kaXRpb24hPSdNYWNyb3BoYWdlJyIpCmhzX2NsaW5pY2FsIDwtIHNldF9leHB0X2NvbmRpdGlvbnMoaHNfY2xpbmljYWwsIGZhY3Q9ImNsaW5pY2Fsb3V0Y29tZSIpCmhzX2NsaW5pY2FsIDwtIHNldF9leHB0X2JhdGNoZXMoaHNfY2xpbmljYWwsIGZhY3Q9InR5cGVvZmNlbGxzIikKY2hvc2VuX2NvbG9ycyA8LSBjKCIjRDk1RjAyIiwgIiM3NTcwQjMiLCAiIzFCOUU3NyIsICIjRkYwMDAwIikKbmFtZXMoY2hvc2VuX2NvbG9ycykgPC0gYygiY3VyZSIsICJmYWlsdXJlIiwgImxvc3QiLCAibnVsbCIpCmhzX2NsaW5pY2FsIDwtIHNldF9leHB0X2NvbG9ycyhleHB0PWhzX2NsaW5pY2FsLCBjb2xvcnM9Y2hvc2VuX2NvbG9ycykKaHNfY2xpbmljYWwgPC0gc2V0X2V4cHRfc2FtcGxlbmFtZXMoZXhwdCA9IGhzX2NsaW5pY2FsLCBuZXduYW1lcyA9IHBEYXRhKGhzX2NsaW5pY2FsKSRzYW1wbGVuYW1lKQpoc19jbGluaWNhbF9ub3JtIDwtIG5vcm1hbGl6ZV9leHB0KGhzX2NsaW5pY2FsLCBmaWx0ZXI9VFJVRSwgY29udmVydD0iY3BtIiwgbm9ybT0icXVhbnQiKQpoc19jbGluaWNhbF9ub3JtIDwtIG5vcm1hbGl6ZV9leHB0KGhzX2NsaW5pY2FsLCB0cmFuc2Zvcm09ImxvZzIiKQojI3BsdCA8LSBwbG90X3BjYShoc19jbGluaWNhbF9ub3JtLCBwbG90X2xhYmVscz1GQUxTRSwgc2l6ZV9jb2x1bW49InZpc2l0bnVtYmVyIikkcGxvdApwbHQgPC0gcGxvdF9wY2EoaHNfY2xpbmljYWxfbm9ybSwgcGxvdF9sYWJlbHM9RkFMU0UpJHBsb3QKcHAoZmlsZT1nbHVlKCJpbWFnZXMvYWxsX2NsaW5pY2FsX25vYmF0Y2hfcGNhLXZ7dmVyfS5wbmciKSwgaW1hZ2U9cGx0LCBoZWlnaD04LCB3aWR0aD0yMCkKcGx0CgpwbHQgPC0gcGxvdF9wY2EoaHNfY2xpbmljYWxfbm9ybSwgcGxvdF9sYWJlbHM9RkFMU0UsIHNpemVfY29sdW1uPSJ2aXNpdG51bWJlciIpJHBsb3QKcHAoZmlsZT1nbHVlKCJpbWFnZXMvYWxsX2NsaW5pY2FsX25vYmF0Y2hfcGNhX3NpemVkLXZ7dmVyfS5wbmciKSwgaW1hZ2U9cGx0LCBoZWlnaD04LCB3aWR0aD0yMCkKcGx0CgpwbHQgPC0gcGxvdF9wY2EoaHNfY2xpbmljYWxfbm9ybSkkcGxvdApwcChmaWxlPWdsdWUoImltYWdlcy9hbGxfY2xpbmljYWxfbm9iYXRjaF9wY2FfbGFiZWxlZC12e3Zlcn0ucG5nIiksIGhlaWdodD04LCB3aWR0aD0yMCwgaW1hZ2U9cGx0KQpwbHQKYGBgCgojIFJlcGVhdCB3aXRob3V0IEJpb3BzaWVzCgpgYGB7ciBjbGluaWNhbF9ub19iaW9waWVzfQpoc19jbGluaWMgPC0gc3Vic2V0X2V4cHQoaHNfY2xpbmljYWwsIHN1YnNldD0iYmF0Y2ghPSdCaW9wc3knIikKaHNfY2xpbmljX25vcm0gPC0gbm9ybWFsaXplX2V4cHQoaHNfY2xpbmljLCBmaWx0ZXI9VFJVRSwgY29udmVydD0iY3BtIiwgbm9ybT0icXVhbnQiKQpoc19jbGluaWNfbm9ybSA8LSBub3JtYWxpemVfZXhwdChoc19jbGluaWMsIHRyYW5zZm9ybT0ibG9nMiIpCnBsdCA8LSBwbG90X3BjYShoc19jbGluaWNfbm9ybSwgcGxvdF9sYWJlbHM9RkFMU0UpJHBsb3QKcHAoZmlsZSA9IGdsdWUoImltYWdlcy9ub19iaW9wc3lfY2xpbmljYWxfbm9iYXRjaF9wY2Etdnt2ZXJ9LnBuZyIpLAogICBoZWlnaHQgPSA4LCB3aWR0aCA9IDIwLCBpbWFnZSA9IHBsdCkKcGx0CgpwbHQgPC0gcGxvdF9wY2EoaHNfY2xpbmljX25vcm0sIHBsb3RfbGFiZWxzPUZBTFNFLCBzaXplX2NvbHVtbj0idmlzaXRudW1iZXIiKSRwbG90CnBsdAoKcGx0IDwtIHBsb3RfcGNhKGhzX2NsaW5pY19ub3JtKSRwbG90CnBwKGZpbGU9Z2x1ZSgiaW1hZ2VzL25vX2Jpb3BzeV9jbGluaWNhbF9ub2JhdGNoX3BjYV9sYWJlbGVkLXZ7dmVyfS5wbmciKSwKICAgaGVpZ2h0ID0gOCwgd2lkdGggPSAyMCwgaW1hZ2UgPSBwbHQpCnBsdApgYGAKCiMgQ29tYmluZSBjdXJlIGFuZCBsb3N0CgpOYWppYiBzZWVtcyBpbnRlcmVzdGVkIGluIHRoaXMsIGJ1dCB3YXMgY3VyaW91cyB0byBzZWUgaG93IHRoZXkgbG9vayB3aGVuIHRoZQpjdXJlIGFuZCBsb3N0IHNhbXBsZXMgYXJlIGNvbWJpbmVkIGludG8gYSBzaW5nbGUgZ3JvdXAuCgpgYGB7ciBjdXJlbG9zdF90b2dldGhlcn0KY2xfaWR4IDwtIHBEYXRhKGhzX2NsaW5pY2FsKVtbImNvbmRpdGlvbiJdXSA9PSAiY3VyZSIgfAogIHBEYXRhKGhzX2NsaW5pY2FsKVtbImNvbmRpdGlvbiJdXSA9PSAibG9zdCIKbmV3X2ZhY3RvciA8LSBwRGF0YShoc19jbGluaWNhbClbWyJjb25kaXRpb24iXV0KbmV3X2ZhY3RvcltjbF9pZHhdIDwtICJjdXJlX2xvc3QiCmhzX2NsIDwtIHNldF9leHB0X2NvbmRpdGlvbnMoaHNfY2xpbmljYWwsIGZhY3Q9bmV3X2ZhY3RvcikKCnRlc3QgPC0gbm9ybWFsaXplX2V4cHQoaHNfY2wsIHRyYW5zZm9ybT0ibG9nMiIsIGNvbnZlcnQ9ImNwbSIsIG5vcm09InF1YW50IiwgZmlsdGVyPVRSVUUpCnBsb3RfcGNhKHRlc3QpJHBsb3QKCmhzX2NsdjIgPC0gc3Vic2V0X2V4cHQoaHNfY2wsIHN1YnNldD0iYmF0Y2ghPSdCaW9wc3knIikKaHNfY2x2Ml9ub3JtIDwtIG5vcm1hbGl6ZV9leHB0KGhzX2NsdjIsIGZpbHRlcj1UUlVFLCBjb252ZXJ0PSJjcG0iLCBub3JtPSJxdWFudCIpCmhzX2NsdjJfbm9ybSA8LSBub3JtYWxpemVfZXhwdChoc19jbHYyLCB0cmFuc2Zvcm09ImxvZzIiKQpwbHQgPC0gcGxvdF9wY2EoaHNfY2x2Ml9ub3JtLCBwbG90X2xhYmVscz1GQUxTRSkkcGxvdAoKaHNfY2x2Ml9kZSA8LSBhbGxfcGFpcndpc2UoaHNfY2x2MiwgbW9kZWxfYmF0Y2g9VFJVRSkKYGBgCgojIENlbGwgdHlwZXMKClRoZSBmb2xsb3dpbmcgYmxvY2tzIHNwbGl0IHRoZSBzYW1wbGVzIGludG8gYSBmZXcgZ3JvdXBzIGJ5IHNhbXBsZSB0eXBlIGFuZCBsb29rCmF0IHRoZSBkaXN0cmlidXRpb25zIGJldHdlZW4gdGhlbS4KCiMjIEltcGxlbWVudGF0aW9uIGRldGFpbHMKCkdldCB0b3AvYm90dG9tIG4gZ2VuZXMgZm9yIGVhY2ggY2VsbCB0eXBlLCB1c2luZyBjbGluaWNhbCBvdXRjb21lIGFzIHRoZSBmYWN0b3Igb2YgaW50ZXJlc3QuCkZvciB0aGUgbW9tZW50LCB1c2Ugc3ZhIGZvciB0aGUgREUgYW5hbHlzaXMuClByb3ZpZGUgY3BtcyBmb3IgdGhlIHRvcC9ib3R0b20gbiBnZW5lcy4KClN0YXJ0IHdpdGggdG9wL2JvdHRvbSAyMDAuClBlcmZvcm0gZGVmYXVsdCBsb2dGQyBhbmQgcC12YWx1ZSBhcyB3ZWxsLgoKIyMjIFNoYXJlZCBjb250cmFzdHMKCkhlcmUgaXMgdGhlIGNvbnRyYXN0IHdlIHdpbGwgdXNlIHRocm91Z2hwdXQsIEkgYW0gbGVhdmluZyBvcGVuIHRoZSBvcHRpb24gdG8gYWRkIG1vcmUuCgpgYGB7ciBrZWVwZXJzfQprZWVwZXJzIDwtIGxpc3QoCiAgImZhaWxfdnNfY3VyZSIgPSBjKCJmYWlsdXJlIiwgImN1cmUiKSkKYGBgCgojIE5PVEUKClNhbXBsZSBzaGVldCByb3dzIDExLTE0IGhhZCB0aGUgY2xpbmljYWwgb3V0Y29tZSBzZXQgdG8gJ05BJyBpbnN0ZWFkIG9mIGN1cmUvZmFpbC9sb3N0CkluIGFkZGl0aW9uLCBzb21lIG5ld2VyIGVudHJpZXMgd2VyZSAnQ3VyZS9GYWlsdXJlJyBpbnN0ZWFkIG9mICdjdXJlL2ZhaWx1cmUnLCBJIGNoYW5nZWQgdGhpcy4KCiMjIE1vbm9jeXRlcwoKYGBge3IgbW9ub2N5dGVzfQptb25vIDwtIHN1YnNldF9leHB0KGhzX3ZhbGlkLCBzdWJzZXQ9InR5cGVvZmNlbGxzPT0nTW9ub2N5dGVzJyIpCm1vbm8gPC0gc2V0X2V4cHRfY29uZGl0aW9ucyhtb25vLCBmYWN0PSJjbGluaWNhbG91dGNvbWUiKQptb25vIDwtIHNldF9leHB0X2JhdGNoZXMobW9ubywgZmFjdD0iZG9ub3IiKQojIyBGSVhNRSBzZXRfZXhwdF9jb2xvcnMgc2hvdWxkIHNwZWFrIHVwIGlmIHRoZXJlIGFyZSBtaXNtYXRjaGVzIGhlcmUhISEKbW9ubyA8LSBzZXRfZXhwdF9jb2xvcnMoZXhwdD1tb25vLCBjb2xvcnM9Y2hvc2VuX2NvbG9ycykKc2F2ZV9yZXN1bHQgPC0gc2F2ZShtb25vLCBmaWxlPSJyZGEvbW9ub2N5dGVfZXhwdC5yZGEiKQptb25vX25vcm0gPC0gbm9ybWFsaXplX2V4cHQobW9ubywgY29udmVydD0iY3BtIiwgZmlsdGVyPVRSVUUpCm1vbm9fbm9ybSA8LSBub3JtYWxpemVfZXhwdChtb25vX25vcm0sIHRyYW5zZm9ybT0ibG9nMiIpCnBsdCA8LSBwbG90X3BjYShtb25vX25vcm0sIHBsb3RfbGFiZWxzPUZBTFNFKSRwbG90CnBwKGZpbGU9Z2x1ZSgiaW1hZ2VzL21vbm9fcGNhX25vcm1hbGl6ZWQtdnt2ZXJ9LnBkZiIpLCBpbWFnZT1wbHQpCnBsdAptb25vX2RlIDwtIHNtKGFsbF9wYWlyd2lzZShtb25vLCBtb2RlbF9iYXRjaD0ic3Zhc2VxIiwgZmlsdGVyPVRSVUUpKQptb25vX3RhYmxlcyA8LSBjb21iaW5lX2RlX3RhYmxlcyhtb25vX2RlLCBrZWVwZXJzPWtlZXBlcnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VsPWdsdWU6OmdsdWUoImV4Y2VsL21vbm9jeXRlX2NsaW5pY2FsX2FsbF90YWJsZXMtdnt2ZXJ9Lnhsc3giKSkKd3JpdHRlbiA8LSB3cml0ZV94bHN4KGRhdGE9bW9ub190YWJsZXNbWyJkYXRhIl1dW1sxXV0sCiAgICAgICAgICAgICAgICAgICAgICBleGNlbD1nbHVlOjpnbHVlKCJleGNlbC9tb25vY3l0ZV9jbGluaWNhbF90YWJsZS12e3Zlcn0ueGxzeCIpKQptb25vX3NpZyA8LSBleHRyYWN0X3NpZ25pZmljYW50X2dlbmVzKG1vbm9fdGFibGVzLCBhY2NvcmRpbmdfdG89ImRlc2VxIikKd3JpdHRlbiA8LSB3cml0ZV94bHN4KGRhdGE9bW9ub19zaWdbWyJkZXNlcSJdXVtbInVwcyJdXVtbMV1dLAogICAgICAgICAgICAgICAgICAgICAgZXhjZWw9Z2x1ZTo6Z2x1ZSgiZXhjZWwvbW9ub2N5dGVfY2xpbmljYWxfc2lndXAtdnt2ZXJ9Lnhsc3giKSkKd3JpdHRlbiA8LSB3cml0ZV94bHN4KGRhdGE9bW9ub19zaWdbWyJkZXNlcSJdXVtbImRvd25zIl1dW1sxXV0sCiAgICAgICAgICAgICAgICAgICAgICBleGNlbD1nbHVlOjpnbHVlKCJleGNlbC9tb25vY3l0ZV9jbGluaWNhbF9zaWdkb3duLXZ7dmVyfS54bHN4IikpCm1vbm9fcGN0X3NpZyA8LSBleHRyYWN0X3NpZ25pZmljYW50X2dlbmVzKG1vbm9fdGFibGVzLCBuPTIwMCwgbGZjPU5VTEwsIHA9TlVMTCwgYWNjb3JkaW5nX3RvPSJkZXNlcSIpCndyaXR0ZW4gPC0gd3JpdGVfeGxzeChkYXRhPW1vbm9fcGN0X3NpZ1tbImRlc2VxIl1dW1sidXBzIl1dW1sxXV0sCiAgICAgICAgICAgICAgICAgICAgICBleGNlbD1nbHVlOjpnbHVlKCJleGNlbC9tb25vY3l0ZV9jbGluaWNhbF9zaWd1cF9wY3Qtdnt2ZXJ9Lnhsc3giKSkKd3JpdHRlbiA8LSB3cml0ZV94bHN4KGRhdGE9bW9ub19wY3Rfc2lnW1siZGVzZXEiXV1bWyJkb3ducyJdXVtbMV1dLAogICAgICAgICAgICAgICAgICAgICAgZXhjZWw9Z2x1ZTo6Z2x1ZSgiZXhjZWwvbW9ub2N5dGVfY2xpbmljYWxfc2lnZG93bl9wY3Qtdnt2ZXJ9Lnhsc3giKSkKbW9ub19zaWckc3VtbWFyeV9kZgoKbW9ub19jcG0gPC0gc20obm9ybWFsaXplX2V4cHQobW9ubywgY29udmVydD0iY3BtIikpCndyaXR0ZW4gPC0gd3JpdGVfeGxzeChkYXRhPWV4cHJzKG1vbm9fY3BtKSwKICAgICAgICAgICAgICAgICAgICAgIGV4Y2VsPWdsdWU6OmdsdWUoImV4Y2VsL21vbm9jeXRlX2NwbV9iZWZvcmVfYmF0Y2gtdnt2ZXJ9Lnhsc3giKSkKbW9ub19iY3BtIDwtIHNtKG5vcm1hbGl6ZV9leHB0KG1vbm8sIGZpbHRlcj1UUlVFLCBjb252ZXJ0PSJjcG0iLCBiYXRjaD0ic3Zhc2VxIikpCndyaXR0ZW4gPC0gd3JpdGVfeGxzeChkYXRhPWV4cHJzKG1vbm9fYmNwbSksCiAgICAgICAgICAgICAgICAgICAgICBleGNlbD1nbHVlOjpnbHVlKCJleGNlbC9tb25vY3l0ZV9jcG1fYWZ0ZXJfYmF0Y2gtdnt2ZXJ9Lnhsc3giKSkKYGBgCgpgYGB7ciBtb25vX2dzdmFfZ29zZXF9CnVwcyA8LSBtb25vX3NpZ1tbImRlc2VxIl1dW1sidXBzIl1dW1siZmFpbF92c19jdXJlIl1dCmRvd25zIDwtIG1vbm9fc2lnW1siZGVzZXEiXV1bWyJkb3ducyJdXVtbImZhaWxfdnNfY3VyZSJdXQoKdXBfZ29zZXEgPC0gc2ltcGxlX2dvc2VxKHNpZ19nZW5lcz11cHMsIGdvX2RiPWhzX2dvLCBsZW5ndGhfZGI9aHNfbGVuZ3RoKQpgYGAKCmBgYHtyIGdzdmFfZ29zZXF9CmJyb2FkX2M3IDwtIEdTRUFCYXNlOjpnZXRHbXQoInJlZmVyZW5jZS9tc2lnZGIvYzcuYWxsLnY3LjIuZW50cmV6LmdtdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sbGVjdGlvblR5cGU9R1NFQUJhc2U6OkJyb2FkQ29sbGVjdGlvbihjYXRlZ29yeT0iYzciKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lSWRUeXBlPUdTRUFCYXNlOjpFbnRyZXpJZGVudGlmaWVyKCkpCgp1cF9nb3NlcV9nc3ZhIDwtIGdvc2VxX21zaWdkYihzaWdfZ2VuZXM9dXBzLCBzaWduYXR1cmVzPWJyb2FkX2M3LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWduYXR1cmVfY2F0ZWdvcnk9ImM3IiwgbGVuZ3RoX2RiPWhzX2xlbmd0aCkKYGBgCgojIyBOZXV0cm9waGlscwoKYGBge3IgbmV1dHJvcGhpbHN9Cm5ldXQgPC0gc3Vic2V0X2V4cHQoaHNfdmFsaWQsIHN1YnNldD0idHlwZW9mY2VsbHM9PSdOZXV0cm9waGlscyciKQpuZXV0IDwtIHNldF9leHB0X2NvbmRpdGlvbnMobmV1dCwgZmFjdD0iY2xpbmljYWxvdXRjb21lIikKbmV1dCA8LSBzZXRfZXhwdF9iYXRjaGVzKG5ldXQsIGZhY3Q9ImRvbm9yIikKbmV1dCA8LSBzZXRfZXhwdF9jb2xvcnMoZXhwdD1uZXV0LCBjb2xvcnM9Y2hvc2VuX2NvbG9ycykKc2F2ZV9yZXN1bHQgPC0gc2F2ZShuZXV0LCBmaWxlPSJyZGEvbmV1dHJvcGhpbF9leHB0LnJkYSIpCm5ldXRfbm9ybSA8LSBzbShub3JtYWxpemVfZXhwdChuZXV0LCBjb252ZXJ0PSJjcG0iLCBiYXRjaCA9ICJzdmFzZXEiLCBmaWx0ZXI9VFJVRSkpCm5ldXRfbm9ybSA8LSBub3JtYWxpemVfZXhwdChuZXV0X25vcm0sIHRyYW5zZm9ybT0ibG9nMiIpCnBsdCA8LSBwbG90X3BjYShuZXV0X25vcm0sIHBsb3RfbGFiZWxzPUZBTFNFKSRwbG90CnBwKGZpbGU9Z2x1ZSgiaW1hZ2VzL25ldXRfcGNhX25vcm1hbGl6ZWQtdnt2ZXJ9LnBkZiIpLCBpbWFnZT1wbHQpCnBsdApuZXV0X2RlIDwtIHNtKGFsbF9wYWlyd2lzZShuZXV0LCBtb2RlbF9iYXRjaD0ic3Zhc2VxIiwgZmlsdGVyPVRSVUUpKQpuZXV0X3RhYmxlcyA8LSBjb21iaW5lX2RlX3RhYmxlcyhuZXV0X2RlLCBrZWVwZXJzPWtlZXBlcnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VsPWdsdWU6OmdsdWUoImV4Y2VsL25ldXRyb3BoaWxfY2xpbmljYWxfYWxsX3RhYmxlcy12e3Zlcn0ueGxzeCIpKQp3cml0dGVuIDwtIHdyaXRlX3hsc3goZGF0YT1uZXV0X3RhYmxlc1tbImRhdGEiXV1bWzFdXSwKICAgICAgICAgICAgICAgICAgICAgIGV4Y2VsPWdsdWU6OmdsdWUoImV4Y2VsL25ldXRyb3BoaWxfY2xpbmljYWxfdGFibGUtdnt2ZXJ9Lnhsc3giKSkKbmV1dF9zaWcgPC0gZXh0cmFjdF9zaWduaWZpY2FudF9nZW5lcyhuZXV0X3RhYmxlcywgYWNjb3JkaW5nX3RvPSJkZXNlcSIpCndyaXR0ZW4gPC0gd3JpdGVfeGxzeChkYXRhPW5ldXRfc2lnW1siZGVzZXEiXV1bWyJ1cHMiXV1bWzFdXSwKICAgICAgICAgICAgICAgICAgICAgIGV4Y2VsPWdsdWU6OmdsdWUoImV4Y2VsL25ldXRyb3BoaWxfY2xpbmljYWxfc2lndXAtdnt2ZXJ9Lnhsc3giKSkKd3JpdHRlbiA8LSB3cml0ZV94bHN4KGRhdGE9bmV1dF9zaWdbWyJkZXNlcSJdXVtbImRvd25zIl1dW1sxXV0sCiAgICAgICAgICAgICAgICAgICAgICBleGNlbD1nbHVlOjpnbHVlKCJleGNlbC9uZXV0cm9waGlsX2NsaW5pY2FsX3NpZ2Rvd24tdnt2ZXJ9Lnhsc3giKSkKbmV1dF9wY3Rfc2lnIDwtIGV4dHJhY3Rfc2lnbmlmaWNhbnRfZ2VuZXMobmV1dF90YWJsZXMsIG49MjAwLCBsZmM9TlVMTCwgcD1OVUxMLCBhY2NvcmRpbmdfdG89ImRlc2VxIikKd3JpdHRlbiA8LSB3cml0ZV94bHN4KGRhdGE9bmV1dF9zaWdbWyJkZXNlcSJdXVtbInVwcyJdXVtbMV1dLAogICAgICAgICAgICAgICAgICAgICAgZXhjZWw9Z2x1ZTo6Z2x1ZSgiZXhjZWwvbmV1dHJvcGhpbF9jbGluaWNhbF9zaWd1cF9wY3Qtdnt2ZXJ9Lnhsc3giKSkKd3JpdHRlbiA8LSB3cml0ZV94bHN4KGRhdGE9bmV1dF9zaWdbWyJkZXNlcSJdXVtbImRvd25zIl1dW1sxXV0sCiAgICAgICAgICAgICAgICAgICAgICBleGNlbD1nbHVlOjpnbHVlKCJleGNlbC9uZXV0cm9waGlsX2NsaW5pY2FsX3NpZ2Rvd25fcGN0LXZ7dmVyfS54bHN4IikpCm5ldXRfY3BtIDwtIHNtKG5vcm1hbGl6ZV9leHB0KG5ldXQsIGNvbnZlcnQ9ImNwbSIpKQp3cml0dGVuIDwtIHdyaXRlX3hsc3goZGF0YT1leHBycyhuZXV0X2NwbSksCiAgICAgICAgICAgICAgICAgICAgICBleGNlbD1nbHVlOjpnbHVlKCJleGNlbC9uZXV0cm9waGlsX2NwbV9iZWZvcmVfYmF0Y2gtdnt2ZXJ9Lnhsc3giKSkKbmV1dF9iY3BtIDwtIHNtKG5vcm1hbGl6ZV9leHB0KG5ldXQsIGZpbHRlcj1UUlVFLCBjb252ZXJ0PSJjcG0iLCBiYXRjaD0ic3Zhc2VxIikpCndyaXR0ZW4gPC0gd3JpdGVfeGxzeChkYXRhPWV4cHJzKG5ldXRfYmNwbSksCiAgICAgICAgICAgICAgICAgICAgICBleGNlbD1nbHVlOjpnbHVlKCJleGNlbC9uZXV0cm9waGlsX2NwbV9hZnRlcl9iYXRjaC12e3Zlcn0ueGxzeCIpKQpgYGAKCiMjIEVvc2lub3BoaWxzCgpgYGB7ciBlb3Npbm9waGlsc30KZW8gPC0gc3Vic2V0X2V4cHQoaHNfdmFsaWQsIHN1YnNldD0idHlwZW9mY2VsbHM9PSdFb3Npbm9waGlscyciKQplbyA8LSBzZXRfZXhwdF9jb25kaXRpb25zKGVvLCBmYWN0PSJjbGluaWNhbG91dGNvbWUiKQplbyA8LSBzZXRfZXhwdF9iYXRjaGVzKGVvLCBmYWN0PSJkb25vciIpCmVvIDwtIHNldF9leHB0X2NvbG9ycyhleHB0PWVvLCBjb2xvcnM9Y2hvc2VuX2NvbG9ycykKc2F2ZV9yZXN1bHQgPC0gc2F2ZShlbywgZmlsZT0icmRhL2Vvc2lub3BoaWxfZXhwdC5yZGEiKQplb19ub3JtIDwtIHNtKG5vcm1hbGl6ZV9leHB0KGVvLCBjb252ZXJ0PSJjcG0iLCBmaWx0ZXI9VFJVRSkpCmVvX25vcm0gPC0gbm9ybWFsaXplX2V4cHQoZW9fbm9ybSwgdHJhbnNmb3JtPSJsb2cyIikKcGx0IDwtIHBsb3RfcGNhKGVvX25vcm0sIHBsb3RfbGFiZWxzPUZBTFNFKSRwbG90CnBwKGZpbGU9Z2x1ZSgiaW1hZ2VzL2VvX3BjYV9ub3JtYWxpemVkLXZ7dmVyfS5wZGYiKSwgaW1hZ2U9cGx0KQpwbHQKZW9fZGUgPC0gc20oYWxsX3BhaXJ3aXNlKGVvLCBtb2RlbF9iYXRjaD0ic3Zhc2VxIiwgZmlsdGVyPVRSVUUpKQplb190YWJsZXMgPC0gY29tYmluZV9kZV90YWJsZXMoZW9fZGUsIGtlZXBlcnM9a2VlcGVycywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VsPWdsdWU6OmdsdWUoImV4Y2VsL2Vvc2lub3BoaWxfY2xpbmljYWxfYWxsX3RhYmxlcy12e3Zlcn0ueGxzeCIpKQp3cml0dGVuIDwtIHdyaXRlX3hsc3goZGF0YT1lb190YWJsZXNbWyJkYXRhIl1dW1sxXV0sCiAgICAgICAgICAgICAgICAgICAgICBleGNlbD1nbHVlOjpnbHVlKCJleGNlbC9lb3Npbm9waGlsX2NsaW5pY2FsX3RhYmxlLXZ7dmVyfS54bHN4IikpCmVvX3NpZyA8LSBleHRyYWN0X3NpZ25pZmljYW50X2dlbmVzKGVvX3RhYmxlcywgYWNjb3JkaW5nX3RvPSJkZXNlcSIpCndyaXR0ZW4gPC0gd3JpdGVfeGxzeChkYXRhPWVvX3NpZ1tbImRlc2VxIl1dW1sidXBzIl1dW1sxXV0sCiAgICAgICAgICAgICAgICAgICAgICBleGNlbD1nbHVlOjpnbHVlKCJleGNlbC9lb3Npbm9waGlsX2NsaW5pY2FsX3NpZ3VwLXZ7dmVyfS54bHN4IikpCndyaXR0ZW4gPC0gd3JpdGVfeGxzeChkYXRhPWVvX3NpZ1tbImRlc2VxIl1dW1siZG93bnMiXV1bWzFdXSwKICAgICAgICAgICAgICAgICAgICAgIGV4Y2VsPWdsdWU6OmdsdWUoImV4Y2VsL2Vvc2lub3BoaWxfY2xpbmljYWxfc2lnZG93bi12e3Zlcn0ueGxzeCIpKQplb19wY3Rfc2lnIDwtIGV4dHJhY3Rfc2lnbmlmaWNhbnRfZ2VuZXMoZW9fdGFibGVzLCBuPTIwMCwgbGZjPU5VTEwsIHA9TlVMTCwgYWNjb3JkaW5nX3RvPSJkZXNlcSIpCndyaXR0ZW4gPC0gd3JpdGVfeGxzeChkYXRhPWVvX3BjdF9zaWdbWyJkZXNlcSJdXVtbInVwcyJdXVtbMV1dLAogICAgICAgICAgICAgICAgICAgICAgZXhjZWw9Z2x1ZTo6Z2x1ZSgiZXhjZWwvZW9zaW5vcGhpbF9jbGluaWNhbF9zaWd1cF9wY3Qtdnt2ZXJ9Lnhsc3giKSkKd3JpdHRlbiA8LSB3cml0ZV94bHN4KGRhdGE9ZW9fcGN0X3NpZ1tbImRlc2VxIl1dW1siZG93bnMiXV1bWzFdXSwKICAgICAgICAgICAgICAgICAgICAgIGV4Y2VsPWdsdWU6OmdsdWUoImV4Y2VsL2Vvc2lub3BoaWxfY2xpbmljYWxfc2lnZG93bl9wY3Qtdnt2ZXJ9Lnhsc3giKSkKCmVvX2NwbSA8LSBzbShub3JtYWxpemVfZXhwdChlbywgY29udmVydD0iY3BtIikpCndyaXR0ZW4gPC0gd3JpdGVfeGxzeChkYXRhPWV4cHJzKGVvX2NwbSksCiAgICAgICAgICAgICAgICAgICAgICBleGNlbD1nbHVlOjpnbHVlKCJleGNlbC9lb3Npbm9waGlsX2NwbV9iZWZvcmVfYmF0Y2gtdnt2ZXJ9Lnhsc3giKSkKZW9fYmNwbSA8LSBzbShub3JtYWxpemVfZXhwdChlbywgZmlsdGVyPVRSVUUsIGNvbnZlcnQ9ImNwbSIsIGJhdGNoPSJzdmFzZXEiKSkKd3JpdHRlbiA8LSB3cml0ZV94bHN4KGRhdGE9ZXhwcnMoZW9fYmNwbSksCiAgICAgICAgICAgICAgICAgICAgICBleGNlbD1nbHVlOjpnbHVlKCJleGNlbC9lb3Npbm9waGlsX2NwbV9hZnRlcl9iYXRjaC12e3Zlcn0ueGxzeCIpKQpgYGAKCiMjIEJpb3BzaWVzCgpgYGB7ciBiaW9wc2llc30KYmlvcCA8LSBzdWJzZXRfZXhwdChoc192YWxpZCwgc3Vic2V0PSJ0eXBlb2ZjZWxscz09J0Jpb3BzeSciKQpiaW9wIDwtIHNldF9leHB0X2NvbmRpdGlvbnMoYmlvcCwgZmFjdD0iY2xpbmljYWxvdXRjb21lIikKYmlvcCA8LSBzZXRfZXhwdF9iYXRjaGVzKGJpb3AsIGZhY3Q9ImRvbm9yIikKYmlvcCA8LSBzZXRfZXhwdF9jb2xvcnMoZXhwdD1iaW9wLCBjb2xvcnM9Y2hvc2VuX2NvbG9ycykKc2F2ZV9yZXN1bHQgPC0gc2F2ZShiaW9wLCBmaWxlPSJyZGEvYmlvcHN5X2V4cHQucmRhIikKYmlvcF9ub3JtIDwtIG5vcm1hbGl6ZV9leHB0KGJpb3AsIGZpbHRlcj1UUlVFLCBjb252ZXJ0PSJjcG0iKQpiaW9wX25vcm0gPC0gbm9ybWFsaXplX2V4cHQoYmlvcF9ub3JtLCB0cmFuc2Zvcm09ImxvZzIiKQpwbHQgPC0gcGxvdF9wY2EoYmlvcF9ub3JtLCBwbG90X2xhYmVscyA9IEZBTFNFKSRwbG90CnBwKGZpbGU9Z2x1ZSgiaW1hZ2VzL2Jpb3BfcGNhX25vcm1hbGl6ZWQtdnt2ZXJ9LnBkZiIpLCBpbWFnZT1wbHQpCnBsdApiaW9wX2RlIDwtIHNtKGFsbF9wYWlyd2lzZShiaW9wLCBtb2RlbF9iYXRjaD0ic3Zhc2VxIiwgZmlsdGVyPVRSVUUpKQpiaW9wX3RhYmxlcyA8LSBjb21iaW5lX2RlX3RhYmxlcyhiaW9wX2RlLCBrZWVwZXJzPWtlZXBlcnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VsPWdsdWU6OmdsdWUoImV4Y2VsL2Jpb3BzeV9jbGluaWNhbF9hbGxfdGFibGVzLXZ7dmVyfS54bHN4IikpCndyaXR0ZW4gPC0gd3JpdGVfeGxzeChkYXRhPWJpb3BfdGFibGVzW1siZGF0YSJdXVtbMV1dLAogICAgICAgICAgICAgICAgICAgICAgZXhjZWw9Z2x1ZTo6Z2x1ZSgiZXhjZWwvYmlvcHN5X2NsaW5pY2FsX3RhYmxlLXZ7dmVyfS54bHN4IikpCmJpb3Bfc2lnIDwtIGV4dHJhY3Rfc2lnbmlmaWNhbnRfZ2VuZXMoYmlvcF90YWJsZXMsIGFjY29yZGluZ190bz0iZGVzZXEiKQojI3dyaXR0ZW4gPC0gd3JpdGVfeGxzeChkYXRhPWJpb3Bfc2lnW1siZGVzZXEiXV1bWyJ1cHMiXV1bWzFdXSwKIyMgICAgICAgICAgICAgICAgICAgICAgZXhjZWw9Z2x1ZTo6Z2x1ZSgiZXhjZWwvYmlvcHN5X2NsaW5pY2FsX3NpZ3VwLXZ7dmVyfS54bHN4IikpCndyaXR0ZW4gPC0gd3JpdGVfeGxzeChkYXRhPWJpb3Bfc2lnW1siZGVzZXEiXV1bWyJkb3ducyJdXVtbMV1dLAogICAgICAgICAgICAgICAgICAgICAgZXhjZWw9Z2x1ZTo6Z2x1ZSgiZXhjZWwvYmlvcHN5X2NsaW5pY2FsX3NpZ2Rvd24tdnt2ZXJ9Lnhsc3giKSkKYmlvcF9wY3Rfc2lnIDwtIGV4dHJhY3Rfc2lnbmlmaWNhbnRfZ2VuZXMoYmlvcF90YWJsZXMsIG49MjAwLCBsZmM9TlVMTCwgcD1OVUxMLCBhY2NvcmRpbmdfdG89ImRlc2VxIikKd3JpdHRlbiA8LSB3cml0ZV94bHN4KGRhdGE9YmlvcF9wY3Rfc2lnW1siZGVzZXEiXV1bWyJ1cHMiXV1bWzFdXSwKICAgICAgICAgICAgICAgICAgICAgIGV4Y2VsPWdsdWU6OmdsdWUoImV4Y2VsL2Jpb3BzeV9jbGluaWNhbF9zaWd1cF9wY3Qtdnt2ZXJ9Lnhsc3giKSkKd3JpdHRlbiA8LSB3cml0ZV94bHN4KGRhdGE9YmlvcF9wY3Rfc2lnW1siZGVzZXEiXV1bWyJkb3ducyJdXVtbMV1dLAogICAgICAgICAgICAgICAgICAgICAgZXhjZWw9Z2x1ZTo6Z2x1ZSgiZXhjZWwvYmlvcHN5X2NsaW5pY2FsX3NpZ2Rvd25fcGN0LXZ7dmVyfS54bHN4IikpCgpiaW9wX2NwbSA8LSBzbShub3JtYWxpemVfZXhwdChiaW9wLCBjb252ZXJ0PSJjcG0iKSkKd3JpdHRlbiA8LSB3cml0ZV94bHN4KGRhdGE9ZXhwcnMoYmlvcF9jcG0pLAogICAgICAgICAgICAgICAgICAgICAgZXhjZWw9Z2x1ZTo6Z2x1ZSgiZXhjZWwvYmlvcHN5X2NwbV9iZWZvcmVfYmF0Y2gtdnt2ZXJ9Lnhsc3giKSkKYmlvcF9iY3BtIDwtIHNtKG5vcm1hbGl6ZV9leHB0KGJpb3AsIGZpbHRlcj1UUlVFLCBjb252ZXJ0PSJjcG0iLCBiYXRjaD0ic3Zhc2VxIikpCndyaXR0ZW4gPC0gd3JpdGVfeGxzeChkYXRhPWV4cHJzKGJpb3BfYmNwbSksCiAgICAgICAgICAgICAgICAgICAgICBleGNlbD1nbHVlOjpnbHVlKCJleGNlbC9iaW9wc3lfY3BtX2FmdGVyX2JhdGNoLXZ7dmVyfS54bHN4IikpCmBgYAoKIyMgTWFjcm9waGFnZXMKClRoZXNlIHNhbXBsZXMgYXJlIHJhdGhlciBkaWZmZXJlbnQgZnJvbSBhbGwgb2YgdGhlIG90aGVycy4gIFRoZSBmb2xsb3dpbmcKc2VjdGlvbiBpcyB0aGVyZWZvcmUgd3JpdHRlbiBwcmltYXJpbHkgaW4gcmVzcG9uc2UgdG8gYSBzZXBhcmF0ZSBzZXQgb2YgZW1haWxzCmZyb20gT2xnYSBhbmQgTWFyaWEgQWRlbGFpZGE7IGhlcmUgaXMgYSBzbmlwcGV0OgoKIERlYXIgYWxsLCBhYm91dCB0aGUgc2FtcGxlcyBjb3JyZXNwb25kaW5nIHRvIGluZmVjdGVkIG1hY3JvcGhhZ2VzIHdpdGggdGhyZWUKIHNlbnNpdGl2ZSAoMi4yKSBhbmQgdGhyZWUgcmVzaXN0YW50ICgyLjMpIGNsaW5pY2FsIHN0cmFpbnMgb2YgTC4gKFYuKQogcGFuYW1lbnNpcywgSSBzZW5kIHlvdSB0aGUgcmVzdWx0cyBvZiBwYXJhc2l0ZSBidXJkZW4gYnkgZGV0ZWN0aW9uIG9mIDdTTFJOQS4gSQogdGhpbmsgdGhlc2UgcmVzdWx0cyBhcmUgaW50ZXJlc3RpbmcsIGJ1dCB0aGUgc2FtcGxlIHNpemUgaXMgdmVyeSBzbWFsbC4KRG9jdG9yIE5hamliIG9yIFRyZXkgY291bGQgeW91IHBsZWFzZSBzZW5kIG1lIHRoZSBxdWFsaXR5IGRhdGEgYW5kIFBDQSBhbmFseXNpcwogb2YgdGhlc2Ugc2FtcGxlcz8KCmFuZAoKIEhpIERvY3RvciwgdGhhbmsgeW91LiAgVGhlc2Ugc2FtcGxlcyBjb3JyZXNwb25kaW5nIHRvIHByaW1hcnkgbWFjcm9waGFnZXMKIGluZmVjdGVkIHdpdGggY2xpbmljYWwgc3RyYWlucyAyLjIgKG49MykgYW5kIDIuMyAobiA9IDMpLiBUaGVzZSBpbmZvcm1hdGlvbiBpcwogaW4gdGhlIGZpbGU6IFRNUkMgcHJvamVjdCAzOiBleGNlbCBIb3N0IFRNUkMzIHYxLjEsIHJvd3MgMTM3IHRvIDE1MC4KClRodXMgSSBhZGRlZCAzIGNvbHVtbnMgdG8gdGhlIGVuZCBvZiB0aGUgc2FtcGxlIHNoZWV0IHdoaWNoIHNlZWsgdG8KaW5jbHVkZSB0aGlzIGluZm9ybWF0aW9uLiAgVGhlIGZpcnN0IGlzICdkcnVnJyBhbmQgZW5jb2RlcyBib3RoIHRoZSBpbmZlY3Rpb24Kc3RhdGUgKG5vIGZvciB0aGUgdHdvIGNvbnRyb2xzIGFuZCB5ZXMgZm9yIGV2ZXJ5dGhpbmcgZWxzZSksIHRoZSBzZWNvbmQgaXMKenltb2RlbWUgd2hpY2ggSSB0b29rIGZyb20gdGhlIHRtcmMyIHNhbXBsZSBzaGVldCwgdGhlIGxhc3QgaXMgZHJ1Zywgd2hpY2ggaXMKZWl0aGVyIG5vIG9yIHNiLgoKYGBge3IgbWFjcm9waGFnZV96eW1vZGVtZV9leHBlcmltZW50fQptYWNyIDwtIHN1YnNldF9leHB0KGhzX3ZhbGlkLCBzdWJzZXQ9InR5cGVvZmNlbGxzPT0nTWFjcm9waGFnZXMnIikKbWFjciA8LSBzZXRfZXhwdF9jb25kaXRpb25zKG1hY3IsIGZhY3Q9Inp5bW9kZW1lIikKbWFjciA8LSBzZXRfZXhwdF9iYXRjaGVzKG1hY3IsIGZhY3Q9Im1hY3JkcnVnIikKCm1hY3Jfbm9ybSA8LSBub3JtYWxpemVfZXhwdChtYWNyLCBub3JtPSJxdWFudCIsIGNvbnZlcnQ9ImNwbSIsIGZpbHRlcj1UUlVFKQptYWNyX25vcm0gPC0gbm9ybWFsaXplX2V4cHQobWFjcl9ub3JtLCB0cmFuc2Zvcm09ImxvZzIiKQpwbHQgPC0gcGxvdF9wY2EobWFjcl9ub3JtLCBwbG90X2xhYmVscz1GQUxTRSkkcGxvdApwcChmaWxlPWdsdWUoImltYWdlcy9tYWNyb3BoYWdlX3NpZGVfZXhwZXJpbWVudF9ub3JtX3BjYS12e3Zlcn0ucGRmIiksIGltYWdlPXBsdCkKcGx0CgptYWNyX25iIDwtIG5vcm1hbGl6ZV9leHB0KG1hY3IsIGJhdGNoPSJzdmFzZXEiLCBmaWx0ZXI9VFJVRSkKbWFjcl9uYiA8LSBub3JtYWxpemVfZXhwdChtYWNyX25iLCBub3JtPSJxdWFudCIsIGNvbnZlcnQ9ImNwbSIsIHRyYW5zZm9ybT0ibG9nMiIpCnBsdCA8LSBwbG90X3BjYShtYWNyX25iKSRwbG90CnBwKGZpbGU9Z2x1ZSgiaW1hZ2VzL21hY3JvcGhhZ2Vfc2lkZV9leHBlcmltZW50LXZ7dmVyfS9ub3JtYmF0Y2hfcGNhLnBkZiIpLCBpbWFnZT1wbHQpCnBsdAptYWNyX3dyaXR0ZW4gPC0gd3JpdGVfZXhwdChtYWNyLCBleGNlbD0iZXhjZWwvbWFjcm9waGFnZV9zaWRlX2V4cGVyaW1lbnQvbWFjcm9waGFnZV9leHB0Lnhsc3giKQoKenltb19kZSA8LSBhbGxfcGFpcndpc2UobWFjciwgbW9kZWxfYmF0Y2g9InN2YXNlcSIsIGZpbHRlcj1UUlVFKQp6eW1vX3RhYmxlIDwtIGNvbWJpbmVfZGVfdGFibGVzKHp5bW9fZGUsIGV4Y2VsPSJpbWFnZXMvbWFjcm9waGFnZV9zaWRlX2V4cGVyaW1lbnQvbWFjcm9waGFnZV9kZS54bHN4IikKYGBgCgojIyMgRm9sbG93dXAgZW1haWwgZnJvbSBPbGdhCgotIE1hY3JvcGhhZ2VzIGluZmVjdGVkIHdpdGggMi4zIHZzIG1hY3JvcGhhZ3VlcyBpbmZlY3RlZCB3aXRoIDIuMyArIFNiVgotIE1hY3JvcGhhZ2VzIHVuaW5mZWN0ZWQgKE0wKSB2cyBtYWNyb3BoYWdlcyB1bmluZmVjdGVkICsgU2JWCi0gTWFjcm9waGFnZXMgdW5pbmZlY3RlZCB2cyBtYWNyb3BoYWdlcyBpbmZlY3RlZCB3aXRoIDIuMwotIE1hY3JvcGhhZ2VzIHVuaW5mZWN0ZWQgKyBTYlYgdnMgTWFjcm9waGFndWVzIGluZmVjdGVkIHdpdGggMi4zICsgU2JWCgpXaXRoIHRoaXMgY29tcGFyaXNvbnMgd2UgY2FuIGRlZmluZSB0aGUgZWZmZWN0IG9mIGluZmVjdGlvbiB3aXRoIDIuMyBhbmQgdGhlCmRydWcgZWZmZWN0IHdpdGggYW5kIHdpdGhvdXQgaW5mZWN0aW9uLiBJbiB0aGlzIG1vbWVudCB3ZSBjYW4ndCBldmFsdWF0ZSB0aGUKY29uZGl0aW9ucyB3aXRoIDIuMiBiZWNhdXNlIHRoZSBzYW1wbGVzIGFyZSBpbmNvbXBsZXRlLiBNYXJpYW5hIHdpbGwgY29tcGxldGUgdGhlCnNhbXBsZXMgaW4gdGhlIG5leHQgc2hpcG1lbnQuCgpgYGB7ciBvbGdhX2ZvbGxvd3VwfQpuZXdfZmFjdG9yIDwtIHBhc3RlMChwRGF0YShtYWNyKVtbIm1hY3JkcnVnIl1dLCAiXyIsIHBEYXRhKG1hY3IpW1sienltb2RlbWUiXV0pCm5ld19mYWN0b3IgPC0gZ3N1Yih4PW5ld19mYWN0b3IsIHBhdHRlcm49InVuZGVmIiwgcmVwbGFjZW1lbnQ9InVuaW5mIikKbWFjcl92MiA8LSBzZXRfZXhwdF9jb25kaXRpb25zKG1hY3IsIGZhY3Q9bmV3X2ZhY3RvcikKbWFjcl92MiRjb25kaXRpb25zCm1hY3JfdjJfbm9ybSA8LSBub3JtYWxpemVfZXhwdChtYWNyX3YyLCBvbnZlcnQ9ImNwbSIsIGZpbHRlcj1UUlVFLCBub3JtPSJxdWFudCIpCm1hY3JfdjJfbm9ybSA8LSBub3JtYWxpemVfZXhwdChtYWNyX3YyX25vcm0sIHRyYW5zZm9ybT0ibG9nMiIpCnBsb3RfcGNhKG1hY3JfdjJfbm9ybSkkcGxvdAprZWVwZXJzIDwtIGxpc3QoCiAgInp5bW9fc2J2IiA9IGMoInNiX3oyMiIsICJzYl96MjMiKSwKICAidW5pbmZfZHJ1ZyIgPSBjKCJub191bmluZiIsICJzYl91bmluZiIpLAogICJ1bmluZm5vZHJ1Z196MjMiID0gYygibm9fdW5pbmYiLCAibm9fejIzIiksCiAgInVuaW5mZHJ1Z196MjMiID0gYygic2JfdW5pbmYiLCAic2JfejIzIiksCiAgInoyM19kcnVnX25vZHJ1ZyIgPSBjKCJzYl96MjMiLCAibm9fejIzIiksCiAgInoyMl9kcnVnX25vZHJ1ZyIgPSBjKCJzYl96MjIiLCAibm9fejIyIikKKQpvbGdhX3BhaXJ3aXNlIDwtIGFsbF9wYWlyd2lzZShtYWNyX3YyLCBkb19kZXNlcT1GQUxTRSwgZG9fZWRnZXI9RkFMU0UsIGRvX2Vic2VxPUZBTFNFKQoKb2xnYV96eW1vX3NiIDwtIG9sZ2FfcGFpcndpc2VbWyJsaW1tYSJdXVtbImFsbF90YWJsZXMiXV1bWyJzYl96MjNfdnNfc2JfejIyIl1dCm9sZ2Ffenltb19zYiA8LSBtZXJnZShvbGdhX3p5bW9fc2IsIGZEYXRhKG1hY3JfdjIpLCBieT0icm93Lm5hbWVzIikKcm93bmFtZXMob2xnYV96eW1vX3NiKSA8LSBvbGdhX3p5bW9fc2JbWyJSb3cubmFtZXMiXV0Kb2xnYV96eW1vX3NiW1siUm93Lm5hbWVzIl1dIDwtIE5VTEwKb2xnYV96eW1vX3NiW1sidHJhbnNjcmlwdCJdXSA8LSBOVUxMCndyaXR0ZW4gPC0gd3JpdGVfeGxzeChkYXRhPW9sZ2Ffenltb19zYiwKICAgICAgICAgICAgICAgICAgICAgIGV4Y2VsPWdsdWU6OmdsdWUoImV4Y2VsL3NiXzIzX3ZzMjItdnt2ZXJ9Lnhsc3giKSkKCm9sZ2FfdW5pbmZfZHJ1ZyA8LSBvbGdhX3BhaXJ3aXNlW1sibGltbWEiXV1bWyJhbGxfdGFibGVzIl1dW1sic2JfdW5pbmZfdnNfbm9fdW5pbmYiXV0Kb2xnYV91bmluZl9kcnVnIDwtIG1lcmdlKG9sZ2FfdW5pbmZfZHJ1ZywgZkRhdGEobWFjcl92MiksIGJ5PSJyb3cubmFtZXMiKQpyb3duYW1lcyhvbGdhX3VuaW5mX2RydWcpIDwtIG9sZ2FfdW5pbmZfZHJ1Z1tbIlJvdy5uYW1lcyJdXQpvbGdhX3VuaW5mX2RydWdbWyJSb3cubmFtZXMiXV0gPC0gTlVMTAp3cml0dGVuIDwtIHdyaXRlX3hsc3goZGF0YT1vbGdhX3VuaW5mX2RydWcsCiAgICAgICAgICAgICAgICAgICAgICBleGNlbD1nbHVlOjpnbHVlKCJleGNlbC91bmluZl9zYl92c19ub3NiLXZ7dmVyfS54bHN4IikpCgpvbGdhX3VuaW5mbm9kcnVnX3oyMyA8LSBvbGdhX3BhaXJ3aXNlW1sibGltbWEiXV1bWyJhbGxfdGFibGVzIl1dW1sibm9fejIzX3ZzX25vX3VuaW5mIl1dCm9sZ2FfdW5pbmZub2RydWdfejIzIDwtIG1lcmdlKG9sZ2FfdW5pbmZub2RydWdfejIzLCBmRGF0YShtYWNyX3YyKSwgYnk9InJvdy5uYW1lcyIpCnJvd25hbWVzKG9sZ2FfdW5pbmZub2RydWdfejIzKSA8LSBvbGdhX3VuaW5mbm9kcnVnX3oyM1tbIlJvdy5uYW1lcyJdXQpvbGdhX3VuaW5mbm9kcnVnX3oyM1tbIlJvdy5uYW1lcyJdXSA8LSBOVUxMCndyaXR0ZW4gPC0gd3JpdGVfeGxzeChkYXRhPW9sZ2FfdW5pbmZub2RydWdfejIzLAogICAgICAgICAgICAgICAgICAgICAgZXhjZWw9Z2x1ZTo6Z2x1ZSgiZXhjZWwvbm9fejIzX3ZzX25vc2JfdW5pbmYtdnt2ZXJ9Lnhsc3giKSkKCm9sZ2FfdW5pbmZkcnVnX3oyMyA8LSBvbGdhX3BhaXJ3aXNlW1sibGltbWEiXV1bWyJhbGxfdGFibGVzIl1dW1sic2JfejIzX3ZzX3NiX3VuaW5mIl1dCm9sZ2FfdW5pbmZkcnVnX3oyMyA8LSBtZXJnZShvbGdhX3VuaW5mZHJ1Z196MjMsIGZEYXRhKG1hY3JfdjIpLCBieT0icm93Lm5hbWVzIikKcm93bmFtZXMob2xnYV91bmluZmRydWdfejIzKSA8LSBvbGdhX3VuaW5mZHJ1Z196MjNbWyJSb3cubmFtZXMiXV0Kb2xnYV91bmluZmRydWdfejIzW1siUm93Lm5hbWVzIl1dIDwtIE5VTEwKd3JpdHRlbiA8LSB3cml0ZV94bHN4KGRhdGE9b2xnYV91bmluZmRydWdfejIzLAogICAgICAgICAgICAgICAgICAgICAgZXhjZWw9Z2x1ZTo6Z2x1ZSgiZXhjZWwvc2JfejIzX3ZzX3NiX3VuaW5mLXZ7dmVyfS54bHN4IikpCgpvbGdhX3oyM19kcnVnbm9kcnVnIDwtIG9sZ2FfcGFpcndpc2VbWyJsaW1tYSJdXVtbImFsbF90YWJsZXMiXV1bWyJzYl96MjNfdnNfbm9fejIzIl1dCm9sZ2FfejIzX2RydWdub2RydWcgPC0gbWVyZ2Uob2xnYV96MjNfZHJ1Z25vZHJ1ZywgZkRhdGEobWFjcl92MiksIGJ5PSJyb3cubmFtZXMiKQpyb3duYW1lcyhvbGdhX3oyM19kcnVnbm9kcnVnKSA8LSBvbGdhX3oyM19kcnVnbm9kcnVnW1siUm93Lm5hbWVzIl1dCm9sZ2FfejIzX2RydWdub2RydWdbWyJSb3cubmFtZXMiXV0gPC0gTlVMTApvbGdhX3oyM19kcnVnbm9kcnVnW1sidHJhbnNjcmlwdCJdXSA8LSBOVUxMCndyaXR0ZW4gPC0gd3JpdGVfeGxzeChkYXRhPW9sZ2FfejIzX2RydWdub2RydWcsCiAgICAgICAgICAgICAgICAgICAgICBleGNlbD1nbHVlOjpnbHVlKCJleGNlbC96MjNfZHJ1Z192c19ub2RydWctdnt2ZXJ9Lnhsc3giKSkKCm9sZ2FfejIyX2RydWdub2RydWcgPC0gb2xnYV9wYWlyd2lzZVtbImxpbW1hIl1dW1siYWxsX3RhYmxlcyJdXVtbInNiX3oyMl92c19ub196MjIiXV0Kb2xnYV96MjJfZHJ1Z25vZHJ1ZyA8LSBtZXJnZShvbGdhX3oyMl9kcnVnbm9kcnVnLCBmRGF0YShtYWNyX3YyKSwgYnk9InJvdy5uYW1lcyIpCnJvd25hbWVzKG9sZ2FfejIyX2RydWdub2RydWcpIDwtIG9sZ2FfejIyX2RydWdub2RydWdbWyJSb3cubmFtZXMiXV0Kb2xnYV96MjJfZHJ1Z25vZHJ1Z1tbIlJvdy5uYW1lcyJdXSA8LSBOVUxMCm9sZ2FfejIyX2RydWdub2RydWdbWyJ0cmFuc2NyaXB0Il1dIDwtIE5VTEwKd3JpdHRlbiA8LSB3cml0ZV94bHN4KGRhdGE9b2xnYV96MjJfZHJ1Z25vZHJ1ZywKICAgICAgICAgICAgICAgICAgICAgIGV4Y2VsPWdsdWU6OmdsdWUoImV4Y2VsL3oyMl9kcnVnX3ZzX25vZHJ1Zy12e3Zlcn0ueGxzeCIpKQpgYGAKCiMjIERvbm9yIGVmZmVjdAoKYGBge3IgZG9ub3J9CmRvbm9yIDwtIHNldF9leHB0X2NvbmRpdGlvbnMoaHNfZXhwdCwgZmFjdD0iZG9ub3IiKQpkb25vciA8LSBzZXRfZXhwdF9iYXRjaGVzKGRvbm9yLCBmYWN0PSJ0aW1lIikKc2F2ZV9yZXN1bHQgPC0gc2F2ZShkb25vciwgZmlsZT0icmRhL2Rvbm9yX2V4cHQucmRhIikKdGVzdCA8LSBub3JtYWxpemVfZXhwdChkb25vciwgZmlsdGVyPVRSVUUsIHRyYW5zZm9ybT0ibG9nMiIsIGNvbnZlcnQ9ImNwbSIsIG5vcm09InF1YW50IikKcGxvdF9wY2EodGVzdCkkcGxvdApgYGAKCiMjIFF1ZXN0aW9uIDEKCkkgaW50ZXJwcmV0ZWQgcXVlc3Rpb24gMSBhczogcHVsbCBvdXQgdG1yYzMwMDBbMS02XSBhbmQgbG9vayBhdCB0aGVtLgoKSSBhbSBub3QgZW50aXJlbHkgY2VydGFpbiB3aGF0IGlzIG1lYW50IGJ5IHRoZSBoZWlyYXJjaGljYWwgY2x1c3RlcmluZyByZXF1ZXN0LgpJIGNhbiBzZWUgYSBjb3VwbGUgb2YgcG9zc2liaWxpdGllcyBmb3Igd2hhdCB0aGlzIG1lYW5zLiAgVGhlIG1vc3Qgc2ltaWxhciB0aGluZwpJIHJlY2FsbCBpbiB0aGUgY3J1emkgY29udGV4dCB3YXMgYSBwb3N0LURFIHZpc3VhbGl6YXRpb24gb2Ygc29tZSBmYWlybHkKc3BlY2lmaWMgZ2VuZXMuCgpgYGB7ciBxdWVzdGlvbjF9CmhzX3ExIDwtIHN1YnNldF9leHB0KGhzX3ZhbGlkLCBzdWJzZXQ9ImRvbm9yPT0nZDEwMTAnfGRvbm9yPT0nZDEwMTEnIikKcTFfbm9ybSA8LSBzbShub3JtYWxpemVfZXhwdChoc19xMSwgbm9ybT0icXVhbnQiLCB0cmFuc2Zvcm09ImxvZzIiLCBjb252ZXJ0PSJjcG0iLCBiYXRjaD1GQUxTRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyPVRSVUUpKQpxMV9wY2EgPC0gcGxvdF9wY2EocTFfbm9ybSkKcTFfcGNhJHBsb3QKCmtuaXRyOjprYWJsZShxMV9wY2EkdGFibGUpCndyaXRlLmNzdihxMV9wY2EkdGFibGUsIGZpbGU9ImNvb3Jkcy9xMV9wY2FfY29vcmRzLmNzdiIpCgojIyBMb29rcyBsaWtlIFBDMSA9PSBUaW1lIGFuZCBQQzIgaXMgZG9ub3IsIGFuZCB0aGV5IGhhdmUgcHJldHR5IG11Y2ggdGhlIHNhbWUgYW1vdW50IG9mIHZhcmlhbmNlCgpoc190aW1lIDwtIHNldF9leHB0X2NvbmRpdGlvbnMoaHNfcTEsIGZhY3Q9InRpbWUiKQp0aW1lX25vcm0gPC0gc20obm9ybWFsaXplX2V4cHQoaHNfdGltZSwgYmF0Y2g9InN2YXNlcSIsIGZpbHRlcj1UUlVFKSkKdGltZV9ub3JtIDwtIG5vcm1hbGl6ZV9leHB0KHRpbWVfbm9ybSwgdHJhbnNmb3JtPSJsb2cyIikKIyMgR2V0IGEgc2V0IG9mIGdlbmVzIHdpdGggaGlnaCBQQyBsb2FkcyBmb3IgUEMxKHRpbWUpLCBhbmQgUEMyKGRvbm9yKToKaGlnaF9zY29yZXMgPC0gcGNhX2hpZ2hzY29yZXModGltZV9ub3JtLCBuPTQwKQp0aW1lX3N0dWZmIDwtIGhpZ2hfc2NvcmVzJGhpZ2hlc3RbLCBjKDEsIDIpXQp0aW1lX3N0dWZmCiMjIENvbHVtbiAxIHNob3VsZCBiZSB3aW5uZXJzIHZzLiB0aW1lIGFuZCBjb2x1bW4gMiBieSBkb25vci4KdGltZV9nZW5lcyA8LSBnc3ViKHg9dGltZV9zdHVmZlssICJDb21wLjEiXSwgcGF0dGVybj0iXi4qOiguKikkIiwgcmVwbGFjZW1lbnQ9IlxcMSIpCmhlYWQodGltZV9nZW5lcykKdGltZV9zdWJzZXQgPC0gZXhwcnModGltZV9ub3JtKVt0aW1lX2dlbmVzLCBdCnBsb3Rfc2FtcGxlX2hlYXRtYXAodGltZV9ub3JtLCByb3dfbGFiZWw9cm93bmFtZXModGltZV9ub3JtKSkKCmhzX2Rvbm9yIDwtIHNldF9leHB0X2NvbmRpdGlvbnMoaHNfcTEsIGZhY3Q9ImRvbm9yIikKZG9ub3Jfbm9ybSA8LSBzbShub3JtYWxpemVfZXhwdChoc19kb25vciwgY29udmVydD0iY3BtIiwgYmF0Y2g9InN2YXNlcSIsIGZpbHRlcj1UUlVFKSkKZG9ub3Jfbm9ybSA8LSBub3JtYWxpemVfZXhwdChkb25vcl9ub3JtLCB0cmFuc2Zvcm09ImxvZzIiKQojIyBHZXQgYSBzZXQgb2YgZ2VuZXMgd2l0aCBoaWdoIFBDIGxvYWRzIGZvciBQQzEoZG9ub3IpLCBhbmQgUEMyKGRvbm9yKToKaGlnaF9zY29yZXMgPC0gcGNhX2hpZ2hzY29yZXMoZG9ub3Jfbm9ybSwgbj00MCkKZG9ub3Jfc3R1ZmYgPC0gaGlnaF9zY29yZXMkaGlnaGVzdFssIGMoMSwgMildCmRvbm9yX3N0dWZmCiMjIENvbHVtbiAxIHNob3VsZCBiZSB3aW5uZXJzIHZzLiBkb25vciBhbmQgY29sdW1uIDIgYnkgZG9ub3IuCmRvbm9yX2dlbmVzIDwtIGdzdWIoeD1kb25vcl9zdHVmZlssICJDb21wLjEiXSwgcGF0dGVybj0iXi4qOiguKikkIiwgcmVwbGFjZW1lbnQ9IlxcMSIpCmhlYWQoZG9ub3JfZ2VuZXMpCmRvbm9yX3N1YnNldCA8LSBleHBycyhkb25vcl9ub3JtKVtkb25vcl9nZW5lcywgXQpwbG90X3NhbXBsZV9oZWF0bWFwKGRvbm9yX25vcm0sIHJvd19sYWJlbD1yb3duYW1lcyhkb25vcl9ub3JtKSkKYGBgCgpgYGB7ciB0aW1lX2Rvbm9yX2RlLCBmaWcuc2hvdz0iaGlkZSJ9CnRpbWVfa2VlcGVycyA8LSBsaXN0KAogICIyaHJfdnNfN2hyIiA9IGMoInQyaHIiLCAidDdociIpLAogICIyaHJfdnNfMTJociIgPSBjKCJ0MmhyIiwgInQxMmhyIiksCiAgIjdocl92c18xMmhyIiA9IGMoInQ3aHIiLCAidDEyaHIiKSkKCnExX3RpbWUgPC0gc2V0X2V4cHRfY29uZGl0aW9ucyhoc19xMSwgZmFjdD0idGltZSIpCnRpbWVfZGUgPC0gc20oYWxsX3BhaXJ3aXNlKHExX3RpbWUsIG1vZGVsX2JhdGNoPUZBTFNFLCBwYXJhbGxlbD1GQUxTRSkpCnRpbWVfYWxsX3RhYmxlcyA8LSBzbShjb21iaW5lX2RlX3RhYmxlcyh0aW1lX2RlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjZWw9Z2x1ZTo6Z2x1ZSgiZXhjZWwvdGltZV9kZV90YWJsZXMtdnt2ZXJ9Lnhsc3giKSkpCnNhdmVfcmVzdWx0IDwtIHNhdmUodGltZV9hbGxfdGFibGVzLCBmaWxlPSJyZGEvdGltZV9hbGxfdGFibGVzLnJkYSIpCgp0aW1lX2FsbF90YWJsZXNfYWxsIDwtIHNtKGNvbWJpbmVfZGVfdGFibGVzKAogIHRpbWVfZGUsCiAga2VlcGVycz0iYWxsIiwKICBleGNlbD1nbHVlOjpnbHVlKCJleGNlbC90aW1lX2RlX2FsbF90YWJsZXMtdnt2ZXJ9Lnhsc3giKSkpCgp0aW1lX2FsbF90YWJsZXMgPC0gc20oY29tYmluZV9kZV90YWJsZXMoCiAgdGltZV9kZSwKICBrZWVwZXJzPXRpbWVfa2VlcGVycywKICBleGNlbD1nbHVlOjpnbHVlKCJleGNlbC97cnVuZGF0ZX0tdGltZV9kZV90YWJsZXMtdnt2ZXJ9Lnhsc3giKSkpCgpxMV9kb25vciA8LSBzZXRfZXhwdF9jb25kaXRpb25zKGhzX3ExLCBmYWN0PSJkb25vciIpCmRvbm9yX2RlIDwtIHNtKGFsbF9wYWlyd2lzZShxMV9kb25vciwgbW9kZWxfYmF0Y2g9RkFMU0UpKQpkb25vcl90YWJsZXMgPC0gc20oY29tYmluZV9kZV90YWJsZXMoCiAgICAgICAgICAgICAgICAgICAgIGRvbm9yX2RlLCBleGNlbD1nbHVlOjpnbHVlKCJleGNlbC9kb25vcl9kZV90YWJsZXMtdnt2ZXJ9Lnhsc3giKSkpCnNhdmVfcmVzdWx0IDwtIHNhdmUoZG9ub3JfdGFibGVzLCBmaWxlPSJyZGEvZG9ub3JfdGFibGVzLnJkYSIpCmBgYAoKYGBge3IgcXVlc3Rpb24yfQpoc19xMiA8LSBzdWJzZXRfZXhwdChoc192YWxpZCwgc3Vic2V0PSJkb25vciE9J2QxMDEwJyZkb25vciE9J2QxMDExJyIpCnEyX25vcm0gPC0gc20obm9ybWFsaXplX2V4cHQoaHNfcTIsIHRyYW5zZm9ybT0ibG9nMiIsIGNvbnZlcnQ9ImNwbSIsIG5vcm09InF1YW50IiwgZmlsdGVyPVRSVUUpKQoKcTJfcGNhIDwtIHBsb3RfcGNhKHEyX25vcm0pCmtuaXRyOjprYWJsZShxMl9wY2EkdGFibGUpCndyaXRlLmNzdihxMl9wY2EkdGFibGUsIGZpbGU9ImNvb3Jkcy9xMl9wY2FfY29vcmRzLmNzdiIpCmBgYAoKIyBSZXF1ZXN0IG9uIDIwMjEwMQoKTWFyaWEgQWRlbGFpZGEgc2VudCBhbiBlbWFpbCB3aGljaCBzYWlkOiAiSSBoYXZlIGJlZW4gd29ya2luZyBvbiB0aGUgZ2VuZSBsaXN0cwphbmQgdGhlIGVhc2llc3QgYW5kIGNsZWFuZXN0IHdheSBJIGZvdW5kIHdhcyB0byBnZXQgdGhlIEdTRUEgaGFsbG1hcmsgZ2VuZSBzZXRzCnRoYXQgbWF5IGJlIG9mIGludGVyZXN0IHRvIHVzLiAgVGhlIGlkZWEgaXMgdGhhdCB3ZSB1c2Ugc29tZSBvZiB0aGVzZSBnZW5lIGxpc3RzCih0byBzdGFyIHRoZSB4ZW5vYmlvdGljIGxpc3QpIHRvIG1hcCB0aGUgY2hhbmdlcyBpbiBnZW5lIGV4cHJlc3Npb24gb3ZlciB0aGUKY291cnNlIG9mIHRyZWF0bWVudCBhbmQgaW4gdGhlIGRpZmZlcmVudCBjZWxsIHBvcHVsYXRpb25zLiIKClVwb24gc3BlYWtpbmcgd2l0aCBoZXIsIEkgdGhpbmsgdGhlIGdvYWwgaXMgdG8gaGF2ZSBhIHBsb3Qgd2l0aCBvbmUgbGluZSBwZXIKTVNpZ0RCIEhhbGxtYXJrIGNhdGVnb3J5IGdlbmUuICBUaGUgeC1heGlzIHdpbGwgdGhlcmVmb3JlIGJlIHRoZSB0aHJlZSB0aW1lCnBvaW50cyBmb3IgdGhvc2UgcGF0aWVudHMgZm9yIHdob20gd2UgaGF2ZSAzIHZpc2l0czsgdGhlIHktYXhpcyB3aWxsIGJlCm5vcm1hbGl6ZWQgY3BtLiAgRWFjaCBkb3Qgd2lsbCBiZSBhIHNpbmdsZSBIYWxsbWFyayBnZW5lLgoKV2l0aCB0aGF0IGluIG1pbmQsIHRoZSBtb3N0IGRpZmZpY3VsdCBjaGFsbGVuZ2UgaXMgcGlja2luZyBvdXQgdGhlIHNhbXBsZXMgZm9yCndoaWNoIHdlIGhhdmUgdGhlIHRocmVlIHRpbWUgcG9pbnRzLgoKYGBge3IgdGhyZWVfdGltZXBvaW50X2xpbmV9Cm1ldGEgPC0gaHBnbHRvb2xzOjpleHRyYWN0X21ldGFkYXRhKHNhbXBsZXNoZWV0KQpuYV9pZHggPC0gaXMubmEobWV0YSkKbWV0YVtuYV9pZHhdIDwtICIiCgp2aXNpdF8zX3NhbXBsZXMgPC0gbWV0YVtbInZpc2l0bnVtYmVyIl1dID09IDMKdGhyZWVzIDwtIG1ldGFbdmlzaXRfM19zYW1wbGVzLCBdCnZpc2l0XzJfc2FtcGxlcyA8LSBtZXRhW1sidmlzaXRudW1iZXIiXV0gPT0gMgp0d29zIDwtIG1ldGFbdmlzaXRfMl9zYW1wbGVzLCBdCnZpc2l0XzFfc2FtcGxlcyA8LSBtZXRhW1sidmlzaXRudW1iZXIiXV0gPT0gMQpvbmVzIDwtIG1ldGFbdmlzaXRfMV9zYW1wbGVzLCBdCgpvbmVzW1sidHViZWxhYmVsb3JpZ2luIl1dICVpbiUgdHdvc1tbInR1YmVsYWJlbG9yaWdpbiJdXQpvbmVzX3R3b3MgPC0gb25lc1tbInR1YmVsYWJlbG9yaWdpbiJdXSAlaW4lIHR3b3NbWyJ0dWJlbGFiZWxvcmlnaW4iXV0Kb25lX3R3byA8LSBtZXRhW29uZXNfdHdvcywgXQphbGxfdGhyZWVfaWR4IDwtIHRocmVlc1tbInR1YmVsYWJlbG9yaWdpbiJdXSAlaW4lIG9uZV90d29bWyJ0dWJlbGFiZWxvcmlnaW4iXV0KYWxsX3RocmVlIDwtIHRocmVlc1thbGxfdGhyZWVfaWR4LCBdCndhbnRlZF9wYXRpZW50cyA8LSBsZXZlbHMoYXMuZmFjdG9yKGFsbF90aHJlZVtbInR1YmVsYWJlbG9yaWdpbiJdXSkpCgojIyBTbywgaXQgYXBwZWFycyB3ZSBoYXZlIDMgdmlzaXRzIGZvciBwYXRpZW50czogc3UyMDY4LCBzdTIwNzIsIGFuZCBzdTIwNzMuCnBsb3RfZXhwdCA8LSBzdWJzZXRfZXhwdChleHB0PWFsbF9ub3JtLCBzdWJzZXQ9InR1YmVsYWJlbG9yaWdpbj09J3N1MjA2OCd8dHViZWxhYmVsb3JpZ2luPT0nc3UyMDcyJ3x0dWJlbGFiZWxvcmlnaW49PSdzdTIwNzMnIikKcGxvdF9wY2EocGxvdF9leHB0KSRwbG90CgpwbG90X21vbm9jeXRlIDwtIHN1YnNldF9leHB0KHBsb3RfZXhwdCwgc3Vic2V0PSJ0eXBlb2ZjZWxscz09J01vbm9jeXRlcycmdHViZWxhYmVsb3JpZ2luIT0nc3UyMDcyJyIpCnVwX21vbm9jeXRlX2dlbmVzIDwtIHJvd25hbWVzKG1vbm9fc2lnW1siZGVzZXEiXV1bWyJ1cHMiXV1bWyJmYWlsX3ZzX2N1cmUiXV0pCmRvd25fbW9ub2N5dGVfZ2VuZXMgPC0gcm93bmFtZXMobW9ub19zaWdbWyJkZXNlcSJdXVtbImRvd25zIl1dW1siZmFpbF92c19jdXJlIl1dKQpwbG90X21vbm9jeXRlIDwtIGV4Y2x1ZGVfZ2VuZXNfZXhwdChwbG90X21vbm9jeXRlLCBpZHM9ZG93bl9tb25vY3l0ZV9nZW5lcywgbWV0aG9kPSJrZWVwIikKCmhhbGxtYXJrX3RhYmxlIDwtIG9wZW54bHN4OjpyZWFkLnhsc3goeGxzeEZpbGU9InJlZmVyZW5jZS9nZW5lc2V0X3NlbGVjdGlvbl9HU0VBX0hhbGxtYXJrX21vZGlmaWVkLnhsc3giKQpmaXJzdF9jYXRlZ29yeSA8LSBoYWxsbWFya190YWJsZVtbMV1dCgpoYWxsbWFya19nZW5lc19pZHggPC0gZkRhdGEocGxvdF9tb25vY3l0ZSlbWyJoZ25jX3N5bWJvbCJdXSAlaW4lIGZpcnN0X2NhdGVnb3J5CmhhbGxtYXJrX2dlbmVzIDwtIGZEYXRhKHBsb3RfbW9ub2N5dGUpW2hhbGxtYXJrX2dlbmVzX2lkeCwgXQp3YW50ZWQgPC0gcm93bmFtZXMoaGFsbG1hcmtfZ2VuZXMpCgpwbG90dGVkIDwtIGV4cHJzKHBsb3RfbW9ub2N5dGUpW3dhbnRlZCwgXQpwbG90X2xvbmcgPC0gcmVzaGFwZTI6Om1lbHQocGxvdHRlZCkKY29sbmFtZXMocGxvdF9sb25nKSA8LSBjKCJnZW5lIiwgInNhbXBsZW5hbWUiLCAiZXhwcnMiKQpkaW0ocGxvdF9sb25nKQpwbG90X2xvbmcgPC0gbWVyZ2UocGxvdF9sb25nLCBmRGF0YShwbG90X21vbm9jeXRlKSwgYnkueD0iZ2VuZSIsIGJ5Lnk9InJvdy5uYW1lcyIpCmRpbShwbG90X2xvbmcpCnBsb3RfbG9uZyA8LSBtZXJnZShwbG90X2xvbmcsIHBEYXRhKHBsb3RfbW9ub2N5dGUpLCBieT0ic2FtcGxlbmFtZSIpCmRpbShwbG90X2xvbmcpCmxpYnJhcnkoZ2dwbG90MikKCnBsb3RfMjA2OF9pZHggPC0gcGxvdF9sb25nW1sidHViZWxhYmVsb3JpZ2luIl1dID09ICJzdTIwNjgiCnBsb3RfMjA2OCA8LSBwbG90X2xvbmdbcGxvdF8yMDY4X2lkeCwgXQpwbHQgPC0gZ2dwbG90KGRhdGE9cGxvdF8yMDY4LCBtYXBwaW5nPWFlc19zdHJpbmcoeD0idmlzaXRudW1iZXIiLCB5PSJleHBycyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvdXI9ImdlbmUiKSkgKwogIGdlb21fbGluZSgpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb249Im5vbmUiKQpwbHQKcHJvYmFibHlfbm90IDwtIGdncGxvdGx5X3VybChwbHQsICJwcm9iYWJseV90ZXJyaWJsZV9zdTIwNjguaHRtbCIpCgpwbG90XzIwNzNfaWR4IDwtIHBsb3RfbG9uZ1tbInR1YmVsYWJlbG9yaWdpbiJdXSA9PSAic3UyMDczIgpwbG90XzIwNzMgPC0gcGxvdF9sb25nW3Bsb3RfMjA3M19pZHgsIF0KcGx0IDwtIGdncGxvdChkYXRhPXBsb3RfMjA3MywgbWFwcGluZz1hZXNfc3RyaW5nKHg9InZpc2l0bnVtYmVyIiwgeT0iZXhwcnMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3VyPSJnZW5lIikpICsKICBnZW9tX2xpbmUoKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJub25lIikKcGx0CnByb2JhYmx5X25vdCA8LSBnZ3Bsb3RseV91cmwocGx0LCAiaW1hZ2VzL3Byb2JhYmx5X3RlcnJpYmxlX3N1MjA3My5odG1sIikKYGBgCgpgYGB7ciBzYXZlbWV9CmlmICghaXNUUlVFKGdldDAoInNraXBfbG9hZCIpKSkgewogIHBhbmRlcjo6cGFuZGVyKHNlc3Npb25JbmZvKCkpCiAgbWVzc2FnZShwYXN0ZTAoIlRoaXMgaXMgaHBnbHRvb2xzIGNvbW1pdDogIiwgZ2V0X2dpdF9jb21taXQoKSkpCiAgbWVzc2FnZShwYXN0ZTAoIlNhdmluZyB0byAiLCBzYXZlZmlsZSkpCiAgdG1wIDwtIHNtKHNhdmVtZShmaWxlbmFtZT1zYXZlZmlsZSkpCn0KYGBgCgpgYGB7ciBsb2FkbWVfYWZ0ZXIsIGV2YWw9RkFMU0V9CnRtcCA8LSBsb2FkbWUoZmlsZW5hbWU9c2F2ZWZpbGUpCmBgYAo=