1 Introduction

Though there is no fundamental reason to separate the likelihood ratio testing and GSVA from the differential expression analyses, they are both tasks which reach back to the primary expression data, unlike GSEA. Therefore I chose to separate these two tasks into a their own document.

2 LRT

The likelihood ratio testing performed on the TMRC3 data is intended to look for shared patterns of expression across some known, constant factor. This may be time (are there patterns across the visits of each person), or cell type (do some genes act consistently across type). We could also ask this question of our two clinics, or indeed across the cure/fail samples.

2.1 Patterns across clinic

tc_clinical_filt <- normalize_expt(tc_clinical, filter = TRUE)
## Removing 5633 low-count genes (14290 remaining).
tc_lrt_clinic <- deseq_lrt(tc_clinical_filt, transform = "vst", interaction = FALSE,
                           interactor_column = "visitnumber",
                           interest_column = "clinic")
## Warning in deseq_lrt(tc_clinical_filt, transform = "vst", interaction = FALSE, :
## The clinic should probably be a factor, set it with the 'factors' arg.
## converting counts to integer mode
## Warning in DESeqDataSet(se, design = design, ignoreRank): some variables in
## design formula are characters, converting to factors
## estimating size factors
## estimating dispersions
## gene-wise dispersion estimates
## mean-dispersion relationship
## final dispersion estimates
## fitting model and testing
## -- replacing outliers and refitting for 169 genes
## -- DESeq argument 'minReplicatesForReplace' = 7 
## -- original counts are preserved in counts(dds)
## estimating dispersions
## fitting model and testing
## A large number of genes was given-- please, make sure this is not an error. Normally, only DE genes will be useful for this function.
## Working with 6272 genes.
## Working with 6269 genes after filtering: minc > 3
## Joining, by = "merge"
## Joining, by = "merge"

summary(lrt_visit[["favorite_genes"]])
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'summary': object 'lrt_visit' not found
t_clinical_filt <- normalize_expt(t_clinical, filter=TRUE)
## Removing 5774 low-count genes (14149 remaining).
lrt_visit <- deseq_lrt(t_clinical_filt, transform = "vst", interaction = FALSE,
                       interactor_column = "visitnumber",
                       interest_column = "finaloutcome")
## converting counts to integer mode
## estimating size factors
## estimating dispersions
## gene-wise dispersion estimates
## mean-dispersion relationship
## final dispersion estimates
## fitting model and testing
## -- replacing outliers and refitting for 120 genes
## -- DESeq argument 'minReplicatesForReplace' = 7 
## -- original counts are preserved in counts(dds)
## estimating dispersions
## fitting model and testing
## A large number of genes was given-- please, make sure this is not an error. Normally, only DE genes will be useful for this function.
## Working with 5439 genes.
## Working with 5435 genes after filtering: minc > 3
## Joining, by = "merge"
## Joining, by = "merge"

summary(lrt_visit[["favorite_genes"]])
##     genes              cluster     
##  Length:5435        Min.   : 1.00  
##  Class :character   1st Qu.: 2.00  
##  Mode  :character   Median : 3.00  
##                     Mean   : 3.46  
##                     3rd Qu.: 3.00  
##                     Max.   :11.00
written <- write_xlsx(data=as.data.frame(lrt_visit[["deseq_table"]]),
                      excel=glue::glue("excel/lrt_clinical_visit-v{ver}.xlsx"))
## Deleting the file excel/lrt_clinical_visit-v202207.xlsx before writing the tables.
lrt_monocyte_visit <- deseq_lrt(t_visitcf_monocyte, transform = "vst",
                                interaction = FALSE,
                                interactor_column = "visitnumber",
                                interest_column = "finaloutcome")
## converting counts to integer mode
## estimating size factors
## estimating dispersions
## gene-wise dispersion estimates
## mean-dispersion relationship
## final dispersion estimates
## fitting model and testing
## -- replacing outliers and refitting for 68 genes
## -- DESeq argument 'minReplicatesForReplace' = 7 
## -- original counts are preserved in counts(dds)
## estimating dispersions
## fitting model and testing
## Working with 12 genes.
## Working with 12 genes after filtering: minc > 3
## Joining, by = "merge"Joining, by = "merge"

lrt_monocyte_visit$cluster_data$plot

lrt_monocyte_visit_v2 <- deseq_lrt(t_visitcf_monocyte, transform = "vst",
                                   interaction = FALSE, minc = 1,
                                   interactor_column = "visitnumber",
                                   interest_column = "finaloutcome")
## converting counts to integer mode
## estimating size factors
## estimating dispersions
## gene-wise dispersion estimates
## mean-dispersion relationship
## final dispersion estimates
## fitting model and testing
## -- replacing outliers and refitting for 68 genes
## -- DESeq argument 'minReplicatesForReplace' = 7 
## -- original counts are preserved in counts(dds)
## estimating dispersions
## fitting model and testing
## Working with 12 genes.
## Working with 12 genes after filtering: minc > 1
## Joining, by = "merge"Joining, by = "merge"

2.2 Shared patterns across cell types

lrt_celltype_clinical_test <- deseq_lrt(tc_clinical, transform = "vst",
                                        interactor_column = "typeofcells",
                                        interest_column = "finaloutcome")
## converting counts to integer mode
## estimating size factors
## estimating dispersions
## gene-wise dispersion estimates
## mean-dispersion relationship
## final dispersion estimates
## fitting model and testing
## -- replacing outliers and refitting for 15 genes
## -- DESeq argument 'minReplicatesForReplace' = 7 
## -- original counts are preserved in counts(dds)
## estimating dispersions
## fitting model and testing
## Working with 552 genes.
## Working with 551 genes after filtering: minc > 3
## Joining, by = "merge"
## Joining, by = "merge"

hs_annot <- fData(hs_expt)
deseq_lrt_df <- merge(hs_annot, as.data.frame(lrt_celltype_clinical_test[["deseq_table"]]), all.y=TRUE,
                      by="row.names")
rownames(deseq_lrt_df) <- deseq_lrt_df[["Row.names"]]
deseq_lrt_df[["Row.names"]] <- NULL
written <- write_xlsx(data=deseq_lrt_df,
                      excel=glue::glue("excel/lrt_clinical_celltype-v{ver}.xlsx"))
## Deleting the file excel/lrt_clinical_celltype-v202207.xlsx before writing the tables.
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))
}

3 GSVA

3.0.1 Clinical samples

hs_celltype_gsva_c2 <- simple_gsva(tc_valid)
## Converting the rownames() of the expressionset to ENTREZID.
## 526 ENSEMBL ID's didn't have a matching ENTEREZ ID. Dropping them now.
## Before conversion, the expressionset has 19923 entries.
## After conversion, the expressionset has 19549 entries.
hs_celltype_gsva_c2_sig <- get_sig_gsva_categories(
    hs_celltype_gsva_c2,
    excel="excel/individual_celltypes_gsva_c2.xlsx")
## Starting limma pairwise comparison.
## libsize was not specified, this parameter has profound effects on limma's result.
## Using the libsize from expt$libsize.
## Limma step 1/6: choosing model.
## Choosing the non-intercept containing model.
## Assuming this data is similar to a micro array and not performign voom.
## Limma step 3/6: running lmFit with method: ls.
## Limma step 4/6: making and fitting contrasts with no intercept. (~ 0 + factors)
## Limma step 5/6: Running eBayes with robust = FALSE and trend = FALSE.
## Limma step 6/6: Writing limma outputs.
## Limma step 6/6: 1/1: Creating table: failure_vs_cure.  Adjust = BH
## Limma step 6/6: 1/2: Creating table: cure.  Adjust = BH
## Limma step 6/6: 2/2: Creating table: failure.  Adjust = BH
## The factor cure has 122 rows.
## The factor failure has 62 rows.
## plot labels was not set and there are more than 100 samples, disabling it.
## Testing each factor against the others.
## Scoring cure against everything else.
## Scoring failure against everything else.
## Deleting the file excel/individual_celltypes_gsva_c2.xlsx before writing the tables.
hs_celltype_gsva_c2_sig$subset_plot
hs_celltype_gsva_c2_sig$score_plot
broad_c7 <- load_gmt_signatures(signatures="reference/msigdb/c7.all.v7.2.entrez.gmt",
                                signature_category="c7")
hs_celltype_gsva_c7 <- simple_gsva(tc_valid,
                                   signatures="reference/msigdb/c7.all.v7.2.entrez.gmt",
                                   signature_category="c7",
                                   msig_xml="reference/msigdb_v7.2.xml",
                                   cores=10)
## Converting the rownames() of the expressionset to ENTREZID.
## 526 ENSEMBL ID's didn't have a matching ENTEREZ ID. Dropping them now.
## Before conversion, the expressionset has 19923 entries.
## After conversion, the expressionset has 19549 entries.
## Adding annotations from reference/msigdb_v7.2.xml.
hs_celltype_gsva_c7_sig <- get_sig_gsva_categories(
    hs_celltype_gsva_c7,
    excel="excel/individual_celltypes_gsva_c7.xlsx")
## Starting limma pairwise comparison.
## libsize was not specified, this parameter has profound effects on limma's result.
## Using the libsize from expt$libsize.
## Limma step 1/6: choosing model.
## Choosing the non-intercept containing model.
## Assuming this data is similar to a micro array and not performign voom.
## Limma step 3/6: running lmFit with method: ls.
## Limma step 4/6: making and fitting contrasts with no intercept. (~ 0 + factors)
## Limma step 5/6: Running eBayes with robust = FALSE and trend = FALSE.
## Limma step 6/6: Writing limma outputs.
## Limma step 6/6: 1/1: Creating table: failure_vs_cure.  Adjust = BH
## Limma step 6/6: 1/2: Creating table: cure.  Adjust = BH
## Limma step 6/6: 2/2: Creating table: failure.  Adjust = BH
## The factor cure has 122 rows.
## The factor failure has 62 rows.
## plot labels was not set and there are more than 100 samples, disabling it.
## Testing each factor against the others.
## Scoring cure against everything else.
## Scoring failure against everything else.
LS0tCnRpdGxlOiAiTC4gcGFuYW1lbnNpcyAyMDIyMDc6IExpa2VsaWhvb2QgUmF0aW8gVGVzdHMgYW5kIEdTVkEiCmF1dGhvcjogImF0YiBhYmVsZXdAZ21haWwuY29tIgpkYXRlOiAiYHIgU3lzLkRhdGUoKWAiCm91dHB1dDoKICBodG1sX2RvY3VtZW50OgogICAgY29kZV9kb3dubG9hZDogdHJ1ZQogICAgY29kZV9mb2xkaW5nOiBzaG93CiAgICBmaWdfY2FwdGlvbjogdHJ1ZQogICAgZmlnX2hlaWdodDogNwogICAgZmlnX3dpZHRoOiA3CiAgICBoaWdobGlnaHQ6IGRlZmF1bHQKICAgIGtlZXBfbWQ6IGZhbHNlCiAgICBtb2RlOiBzZWxmY29udGFpbmVkCiAgICBudW1iZXJfc2VjdGlvbnM6IHRydWUKICAgIHNlbGZfY29udGFpbmVkOiB0cnVlCiAgICB0aGVtZTogcmVhZGFibGUKICAgIHRvYzogdHJ1ZQogICAgdG9jX2Zsb2F0OgogICAgICBjb2xsYXBzZWQ6IGZhbHNlCiAgICAgIHNtb290aF9zY3JvbGw6IGZhbHNlCi0tLQoKPHN0eWxlPgpib2R5IC5tYWluLWNvbnRhaW5lciB7Cm1heC13aWR0aDogMTYwMHB4Owp9Cjwvc3R5bGU+CgpgYGB7ciBvcHRpb25zLCBpbmNsdWRlPUZBTFNFfQpsaWJyYXJ5KGhwZ2x0b29scykKbGlicmFyeShkcGx5cikKbGlicmFyeShmb3JjYXRzKQp0dCA8LSBzbShkZXZ0b29sczo6bG9hZF9hbGwoIn4vaHBnbHRvb2xzIikpCmtuaXRyOjpvcHRzX2tuaXQkc2V0KHByb2dyZXNzPVRSVUUsCiAgICAgICAgICAgICAgICAgICAgIHZlcmJvc2U9VFJVRSwKICAgICAgICAgICAgICAgICAgICAgd2lkdGg9OTAsCiAgICAgICAgICAgICAgICAgICAgIGVjaG89VFJVRSkKa25pdHI6Om9wdHNfY2h1bmskc2V0KGVycm9yPVRSVUUsCiAgICAgICAgICAgICAgICAgICAgICBmaWcud2lkdGg9OCwKICAgICAgICAgICAgICAgICAgICAgIGZpZy5oZWlnaHQ9OCwKICAgICAgICAgICAgICAgICAgICAgIGRwaT05NikKb2xkX29wdGlvbnMgPC0gb3B0aW9ucyhkaWdpdHM9NCwKICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdzQXNGYWN0b3JzPUZBTFNFLAogICAgICAgICAgICAgICAgICAgICAgIGtuaXRyLmR1cGxpY2F0ZS5sYWJlbD0iYWxsb3ciKQpnZ3Bsb3QyOjp0aGVtZV9zZXQoZ2dwbG90Mjo6dGhlbWVfYncoYmFzZV9zaXplPTEyKSkKdmVyIDwtICIyMDIyMDciCnByZXZpb3VzX2ZpbGUgPC0gIiIKcnVuZGF0ZSA8LSBmb3JtYXQoU3lzLkRhdGUoKSwgZm9ybWF0PSIlWSVtJWQiKQoKIyN0bXAgPC0gdHJ5KHNtKGxvYWRtZShmaWxlbmFtZT1nc3ViKHBhdHRlcm49IlxcLlJtZCIsIHJlcGxhY2U9IlxcLnJkYVxcLnh6IiwgeD1wcmV2aW91c19maWxlKSkpKQpybWRfZmlsZSA8LSBnbHVlOjpnbHVlKCJ0bXJjM19scnRfZ3N2YV97dmVyfS5SbWQiKQpzYXZlZmlsZSA8LSBnc3ViKHBhdHRlcm49IlxcLlJtZCIsIHJlcGxhY2U9IlxcLnJkYVxcLnh6IiwgeD1ybWRfZmlsZSkKbG9hZGVkIDwtIGxvYWQoZmlsZT1nbHVlOjpnbHVlKCJyZGEvdG1yYzNfZGF0YV9zdHJ1Y3R1cmVzLXZ7dmVyfS5yZGEiKSkKYGBgCgojIEludHJvZHVjdGlvbgoKVGhvdWdoIHRoZXJlIGlzIG5vIGZ1bmRhbWVudGFsIHJlYXNvbiB0byBzZXBhcmF0ZSB0aGUgbGlrZWxpaG9vZCByYXRpbwp0ZXN0aW5nIGFuZCBHU1ZBIGZyb20gdGhlIGRpZmZlcmVudGlhbCBleHByZXNzaW9uIGFuYWx5c2VzLCB0aGV5IGFyZQpib3RoIHRhc2tzIHdoaWNoIHJlYWNoIGJhY2sgdG8gdGhlIHByaW1hcnkgZXhwcmVzc2lvbiBkYXRhLCB1bmxpa2UKR1NFQS4gIFRoZXJlZm9yZSBJIGNob3NlIHRvIHNlcGFyYXRlIHRoZXNlIHR3byB0YXNrcyBpbnRvIGEgdGhlaXIgb3duCmRvY3VtZW50LgoKIyBMUlQKClRoZSBsaWtlbGlob29kIHJhdGlvIHRlc3RpbmcgcGVyZm9ybWVkIG9uIHRoZSBUTVJDMyBkYXRhIGlzIGludGVuZGVkCnRvIGxvb2sgZm9yIHNoYXJlZCBwYXR0ZXJucyBvZiBleHByZXNzaW9uIGFjcm9zcyBzb21lIGtub3duLCBjb25zdGFudApmYWN0b3IuICBUaGlzIG1heSBiZSB0aW1lIChhcmUgdGhlcmUgcGF0dGVybnMgYWNyb3NzIHRoZSB2aXNpdHMgb2YKZWFjaCBwZXJzb24pLCBvciBjZWxsIHR5cGUgKGRvIHNvbWUgZ2VuZXMgYWN0IGNvbnNpc3RlbnRseSBhY3Jvc3MKdHlwZSkuICBXZSBjb3VsZCBhbHNvIGFzayB0aGlzIHF1ZXN0aW9uIG9mIG91ciB0d28gY2xpbmljcywgb3IgaW5kZWVkCmFjcm9zcyB0aGUgY3VyZS9mYWlsIHNhbXBsZXMuCgojIyBQYXR0ZXJucyBhY3Jvc3MgY2xpbmljCgpgYGB7ciBscnRfY2xpbmljc30KdGNfY2xpbmljYWxfZmlsdCA8LSBub3JtYWxpemVfZXhwdCh0Y19jbGluaWNhbCwgZmlsdGVyID0gVFJVRSkKCnRjX2xydF9jbGluaWMgPC0gZGVzZXFfbHJ0KHRjX2NsaW5pY2FsX2ZpbHQsIHRyYW5zZm9ybSA9ICJ2c3QiLCBpbnRlcmFjdGlvbiA9IEZBTFNFLAogICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmFjdG9yX2NvbHVtbiA9ICJ2aXNpdG51bWJlciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZXN0X2NvbHVtbiA9ICJjbGluaWMiKQpzdW1tYXJ5KGxydF92aXNpdFtbImZhdm9yaXRlX2dlbmVzIl1dKQpgYGAKCmBgYHtyIGxydF92aXNpdH0KdF9jbGluaWNhbF9maWx0IDwtIG5vcm1hbGl6ZV9leHB0KHRfY2xpbmljYWwsIGZpbHRlcj1UUlVFKQoKbHJ0X3Zpc2l0IDwtIGRlc2VxX2xydCh0X2NsaW5pY2FsX2ZpbHQsIHRyYW5zZm9ybSA9ICJ2c3QiLCBpbnRlcmFjdGlvbiA9IEZBTFNFLAogICAgICAgICAgICAgICAgICAgICAgIGludGVyYWN0b3JfY29sdW1uID0gInZpc2l0bnVtYmVyIiwKICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmVzdF9jb2x1bW4gPSAiZmluYWxvdXRjb21lIikKc3VtbWFyeShscnRfdmlzaXRbWyJmYXZvcml0ZV9nZW5lcyJdXSkKd3JpdHRlbiA8LSB3cml0ZV94bHN4KGRhdGE9YXMuZGF0YS5mcmFtZShscnRfdmlzaXRbWyJkZXNlcV90YWJsZSJdXSksCiAgICAgICAgICAgICAgICAgICAgICBleGNlbD1nbHVlOjpnbHVlKCJleGNlbC9scnRfY2xpbmljYWxfdmlzaXQtdnt2ZXJ9Lnhsc3giKSkKCmxydF9tb25vY3l0ZV92aXNpdCA8LSBkZXNlcV9scnQodF92aXNpdGNmX21vbm9jeXRlLCB0cmFuc2Zvcm0gPSAidnN0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmFjdGlvbiA9IEZBTFNFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyYWN0b3JfY29sdW1uID0gInZpc2l0bnVtYmVyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmVzdF9jb2x1bW4gPSAiZmluYWxvdXRjb21lIikKbHJ0X21vbm9jeXRlX3Zpc2l0JGNsdXN0ZXJfZGF0YSRwbG90CgpscnRfbW9ub2N5dGVfdmlzaXRfdjIgPC0gZGVzZXFfbHJ0KHRfdmlzaXRjZl9tb25vY3l0ZSwgdHJhbnNmb3JtID0gInZzdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJhY3Rpb24gPSBGQUxTRSwgbWluYyA9IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJhY3Rvcl9jb2x1bW4gPSAidmlzaXRudW1iZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZXN0X2NvbHVtbiA9ICJmaW5hbG91dGNvbWUiKQpgYGAKCiMjIFNoYXJlZCBwYXR0ZXJucyBhY3Jvc3MgY2VsbCB0eXBlcwoKYGBge3IgbHJ0X2NlbGx0eXBlfQpscnRfY2VsbHR5cGVfY2xpbmljYWxfdGVzdCA8LSBkZXNlcV9scnQodGNfY2xpbmljYWwsIHRyYW5zZm9ybSA9ICJ2c3QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJhY3Rvcl9jb2x1bW4gPSAidHlwZW9mY2VsbHMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJlc3RfY29sdW1uID0gImZpbmFsb3V0Y29tZSIpCgpoc19hbm5vdCA8LSBmRGF0YShoc19leHB0KQpkZXNlcV9scnRfZGYgPC0gbWVyZ2UoaHNfYW5ub3QsIGFzLmRhdGEuZnJhbWUobHJ0X2NlbGx0eXBlX2NsaW5pY2FsX3Rlc3RbWyJkZXNlcV90YWJsZSJdXSksIGFsbC55PVRSVUUsCiAgICAgICAgICAgICAgICAgICAgICBieT0icm93Lm5hbWVzIikKcm93bmFtZXMoZGVzZXFfbHJ0X2RmKSA8LSBkZXNlcV9scnRfZGZbWyJSb3cubmFtZXMiXV0KZGVzZXFfbHJ0X2RmW1siUm93Lm5hbWVzIl1dIDwtIE5VTEwKd3JpdHRlbiA8LSB3cml0ZV94bHN4KGRhdGE9ZGVzZXFfbHJ0X2RmLAogICAgICAgICAgICAgICAgICAgICAgZXhjZWw9Z2x1ZTo6Z2x1ZSgiZXhjZWwvbHJ0X2NsaW5pY2FsX2NlbGx0eXBlLXZ7dmVyfS54bHN4IikpCmBgYAoKCgpgYGB7ciBzYXZlbWUsIGV2YWw9RkFMU0V9CmlmICghaXNUUlVFKGdldDAoInNraXBfbG9hZCIpKSkgewogIHBhbmRlcjo6cGFuZGVyKHNlc3Npb25JbmZvKCkpCiAgbWVzc2FnZShwYXN0ZTAoIlRoaXMgaXMgaHBnbHRvb2xzIGNvbW1pdDogIiwgZ2V0X2dpdF9jb21taXQoKSkpCiAgbWVzc2FnZShwYXN0ZTAoIlNhdmluZyB0byAiLCBzYXZlZmlsZSkpCiAgdG1wIDwtIHNtKHNhdmVtZShmaWxlbmFtZT1zYXZlZmlsZSkpCn0KYGBgCgojIEdTVkEKCiMjIyBDbGluaWNhbCBzYW1wbGVzCgpgYGB7ciBnc3ZhLCBmaWcuc2hvdz0iaGlkZSJ9CmhzX2NlbGx0eXBlX2dzdmFfYzIgPC0gc2ltcGxlX2dzdmEodGNfdmFsaWQpCmhzX2NlbGx0eXBlX2dzdmFfYzJfc2lnIDwtIGdldF9zaWdfZ3N2YV9jYXRlZ29yaWVzKAogICAgaHNfY2VsbHR5cGVfZ3N2YV9jMiwKICAgIGV4Y2VsPSJleGNlbC9pbmRpdmlkdWFsX2NlbGx0eXBlc19nc3ZhX2MyLnhsc3giKQpoc19jZWxsdHlwZV9nc3ZhX2MyX3NpZyRzdWJzZXRfcGxvdApoc19jZWxsdHlwZV9nc3ZhX2MyX3NpZyRzY29yZV9wbG90Cgpicm9hZF9jNyA8LSBsb2FkX2dtdF9zaWduYXR1cmVzKHNpZ25hdHVyZXM9InJlZmVyZW5jZS9tc2lnZGIvYzcuYWxsLnY3LjIuZW50cmV6LmdtdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lnbmF0dXJlX2NhdGVnb3J5PSJjNyIpCmhzX2NlbGx0eXBlX2dzdmFfYzcgPC0gc2ltcGxlX2dzdmEodGNfdmFsaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lnbmF0dXJlcz0icmVmZXJlbmNlL21zaWdkYi9jNy5hbGwudjcuMi5lbnRyZXouZ210IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWduYXR1cmVfY2F0ZWdvcnk9ImM3IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2lnX3htbD0icmVmZXJlbmNlL21zaWdkYl92Ny4yLnhtbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29yZXM9MTApCmhzX2NlbGx0eXBlX2dzdmFfYzdfc2lnIDwtIGdldF9zaWdfZ3N2YV9jYXRlZ29yaWVzKAogICAgaHNfY2VsbHR5cGVfZ3N2YV9jNywKICAgIGV4Y2VsPSJleGNlbC9pbmRpdmlkdWFsX2NlbGx0eXBlc19nc3ZhX2M3Lnhsc3giKQpgYGAKCiMjIyBQcmludCBzb21lIHBsb3RzIG9mIHRoZSBHU1ZBIG91dHB1dHMKCmBgYHtyIGdzdmFfcGxvdHN9CiMjIFRoZSByYXcgaGVhdG1hcCBvZiB0aGUgQzIgdmFsdWVzCmhzX2NlbGx0eXBlX2dzdmFfYzJfc2lnW1sicmF3X3Bsb3QiXV0KIyMgVGhlICdzaWduaWZpY2FuY2UnIHNjb3JlcyBvZiB0aGUgQzIgdmFsdWVzCmhzX2NlbGx0eXBlX2dzdmFfYzJfc2lnW1sic2NvcmVfcGxvdCJdXQojIyBUaGUgc3Vic2V0IG9mIHNjb3JlcyBmb3IgY2F0ZWdvcmllcyBkZWVtZWQgc2lnbmlmaWNhbnRseSBkaWZmZXJlbnQuCmhzX2NlbGx0eXBlX2dzdmFfYzJfc2lnW1sic3Vic2V0X3Bsb3QiXV0KCiMjIFRoZSByYXcgaGVhdG1hcCBvZiB0aGUgQzcgdmFsdWVzCmhzX2NlbGx0eXBlX2dzdmFfYzdfc2lnW1sicmF3X3Bsb3QiXV0KIyMgVGhlICdzaWduaWZpY2FuY2UnIHNjb3JlcyBvZiB0aGUgQzcgdmFsdWVzCmhzX2NlbGx0eXBlX2dzdmFfYzdfc2lnW1sic2NvcmVfcGxvdCJdXQojIyBUaGUgc3Vic2V0IG9mIHNjb3JlcyBmb3IgY2F0ZWdvcmllcyBkZWVtZWQgc2lnbmlmaWNhbnRseSBkaWZmZXJlbnQuCmhzX2NlbGx0eXBlX2dzdmFfYzdfc2lnW1sic3Vic2V0X3Bsb3QiXV0KYGBgCgoKCmBgYHtyIGxvYWRtZV9hZnRlciwgZXZhbD1GQUxTRX0KdG1wIDwtIGxvYWRtZShmaWxlbmFtZT1zYXZlZmlsZSkKYGBgCg==