1 Rework DIA-Umpire to feed OpenSWATH.

In the following blocks I want to use DIA Umpire to create transition libraries for openswath, then I want to run openswath and score the runs.

1.5 Combine the statistics

## Rerunning because writing the file failed.
spectrast \
    -cNSpecLib -cICID-QTOF \
    -cf "Protein! ~ DECOY_" \
    -cP0.4237 \
    -c_IRTreference/irt.txt \
    -c_IRR results/05_dia_umpire_prophet/iProphet.pep.xml

spectrast \
    -cNSpecLib_cons \
    -cICID-QTOF \
    -cAC SpecLib.splib

spectrast2tsv.py \
    -l 350,2000 \
    -s b,y \
    -x 1,2 \
    -o 6 \
    -n 6 \
    -p 0.05 \
    -d -e \
    -k openswath \
    -w windows/2018_0817BrikenTrypsinDIA19.txt \
    -a SpecLib_cons_openswath.tsv \
    SpecLib_cons.sptxt

TargetedFileConverter \
    -in SpecLib_cons_openswath.tsv \
    -in_type tsv \
    -out SpecLib_cons_openswath.TraML \
    -out_type TraML

OpenSwathDecoyGenerator \
    -in SpecLib_cons_openswath.TraML \
    -out SpecLib_cons_openswath_decoy.TraML \
    -method shuffle
##    -exclude_similar \
##    -similarity_threshold 0.05 \
##    -identity_threshold 0.7

TargetedFileConverter \
    -in SpecLib_cons_openswath_decoy.TraML \
    -in_type TraML \
    -out SpecLib_cons_openswath_decoy.tsv \
    -out_type tsv

TargetedFileConverter \
    -in SpecLib_cons_openswath_decoy.TraML \
    -in_type TraML \
    -out SpecLib_cons_openswath_decoy.pqp \
    -out_type pqp

export VERSION=${VERSION:-20190327}
echo "Loading environment modules and parameters for version: ${VERSION}."
source "parameters/${VERSION}_settings.sh"

echo "Invoking the OpenSwathWorkflow using local comet-derived transitions."
type="diaumpire"
input_type="mzXML"
export TRANSITION_PREFIX="SpecLib_cons_openswath_decoy"
echo "Checking in, the transition library is: ${TRANSITION_PREFIX}.pqp"
base_mzxmldir="results/01${input_type}/dia/${VERSION}"
swath_inputs=$(/usr/bin/find "${base_mzxmldir}" -name *.${input_type} -print | sort)
echo "Checking in, the inputs are: ${swath_inputs}"
mkdir -p "${SWATH_OUTDIR}_${type}"
pypdir="${PYPROPHET_OUTDIR}_${type}"
mkdir -p "${pypdir}"
for input in ${swath_inputs}
do
    name=$(basename "${input}" ".${input_type}")
    echo "Starting openswath run, library type ${type} for ${name} using ${MZ_WINDOWS} windows at $(date)."
    swath_output_prefix="${SWATH_OUTDIR}_${type}/${name}_${DDA_METHOD}"
    pyprophet_output_prefix="${PYPROPHET_OUTDIR}_${type}/${name}_${DDA_METHOD}"
    echo "Deleting previous swath output file: ${swath_output_prefix}.osw"
    rm -f "${swath_output_prefix}.osw"
    rm -f "${swath_output_prefix}.tsv"
    OpenSwathWorkflow \
        -in "${input}" \
        -force \
        -sort_swath_maps \
        -min_upper_edge_dist 1 \
        -mz_correction_function "quadratic_regression_delta_ppm" \
        -Scoring:TransitionGroupPicker:background_subtraction "original" \
        -Scoring:stop_report_after_feature "5" \
        -swath_windows_file "windows/openswath_${name}.txt" \
        -tr "${TRANSITION_PREFIX}.pqp" \
        -out_tsv "${swath_output_prefix}.tsv"
    OpenSwathWorkflow \
        -in "${input}" \
        -force \
        -sort_swath_maps \
        -min_upper_edge_dist 1 \
        -mz_correction_function "quadratic_regression_delta_ppm" \
        -Scoring:TransitionGroupPicker:background_subtraction "original" \
        -Scoring:stop_report_after_feature "5" \
        -swath_windows_file "windows/openswath_${name}.txt" \
        -tr "${TRANSITION_PREFIX}.pqp" \
        -out_osw "${swath_output_prefix}.osw"
    ##2>"${swath_output_prefix}_osw.log" 1>&2
done
swath_out=$(dirname ${swath_output_prefix})
pyprophet_out="$(dirname "${pyprophet_output_prefix}")/openswath_merged.osw"
echo "Merging osw files to ${pyprophet_out}"
pyprophet merge \
          --template "${TRANSITION_PREFIX}.pqp" \
          --out="${pyprophet_out}" \
          ${swath_out}/*.osw
pyprophet score --in="${pyprophet_out}"
pyprophet export --in="${pyprophet_out}" --out "test.tsv"
## pyprophet always exports to the current working directory.
final_name="$(dirname ${pyprophet_out})/$(basename ${pyprophet_out} ".osw").tsv"
echo $final_name
mv "test.tsv"
ls -ld "${pyprophet_out}"

tric_tb="${TRIC_OUTDIR}_tuberculist"
mkdir -p "${tric_tb}"
feature_alignment.py \
    --force \
    --in "./${pypdir}/"*.tsv \
    --out "${tric_tb}/${SEARCH_METHOD}_${DDA_METHOD}.tsv" \
    --out_matrix "${tric_tb}/${DDA_METHOD}_outmatrix.tsv" \
    --out_meta "${tric_tb}/${DDA_METHOD}_meta.tsv"
2>"${tric_tb}/feature_alignment.err" \
 1>"${tric_tb}/feature_alignment.out"
echo "Wrote final output to ${tric_tb}/${SEARCH_METHOD}_${DDA_METHOD}.tsv"

2 DEP usage

Thanks to Vivek, I now am aware of DEP, which does everything I wish MSstats did. The matrix given to me by tric’s feature_alignment.py I think gives me what DEP requires, along with my annotations and sample sheet.

Let us see if this is true.

2.2 Preprocess intensities in preparation for DEP

##  [1] "s2018_0315Briken01"           "s2018_0315Briken02"          
##  [3] "s2018_0315Briken03"           "s2018_0315Briken04"          
##  [5] "s2018_0315Briken05"           "s2018_0315Briken06"          
##  [7] "s2018_0315Briken21"           "s2018_0315Briken22"          
##  [9] "s2018_0315Briken23"           "s2018_0315Briken24"          
## [11] "s2018_0315Briken25"           "s2018_0315Briken26"          
## [13] "s2018_0502BrikenDIA01"        "s2018_0502BrikenDIA02"       
## [15] "s2018_0502BrikenDIA03"        "s2018_0502BrikenDIA04"       
## [17] "s2018_0502BrikenDIA05"        "s2018_0502BrikenDIA06"       
## [19] "s2018_0502BrikenDIA07"        "s2018_0502BrikenDIA08"       
## [21] "s2018_0502BrikenDIA09"        "s2018_0502BrikenDIA10"       
## [23] "s2018_0502BrikenDIA11"        "s2018_0502BrikenDIA12"       
## [25] "s2018_0726Briken01"           "s2018_0726Briken02"          
## [27] "s2018_0726Briken03"           "s2018_0726Briken04"          
## [29] "s2018_0726Briken05"           "s2018_0726Briken06"          
## [31] "s2018_0726Briken07"           "s2018_0726Briken08"          
## [33] "s2018_0726Briken09"           "s2018_0726Briken11"          
## [35] "s2018_0726Briken12"           "s2018_0726Briken13"          
## [37] "s2018_0726Briken14"           "s2018_0726Briken15"          
## [39] "s2018_0726Briken16"           "s2018_0726Briken17"          
## [41] "s2018_0726Briken18"           "s2018_0726Briken19"          
## [43] "s2018_0817BrikenTrypsinDIA01" "s2018_0817BrikenTrypsinDIA02"
## [45] "s2018_0817BrikenTrypsinDIA03" "s2018_0817BrikenTrypsinDIA04"
## [47] "s2018_0817BrikenTrypsinDIA05" "s2018_0817BrikenTrypsinDIA06"
## [49] "s2018_0817BrikenTrypsinDIA07" "s2018_0817BrikenTrypsinDIA08"
## [51] "s2018_0817BrikenTrypsinDIA09" "s2018_0817BrikenTrypsinDIA11"
## [53] "s2018_0817BrikenTrypsinDIA12" "s2018_0817BrikenTrypsinDIA13"
## [55] "s2018_0817BrikenTrypsinDIA14" "s2018_0817BrikenTrypsinDIA15"
## [57] "s2018_0817BrikenTrypsinDIA16" "s2018_0817BrikenTrypsinDIA17"
## [59] "s2018_0817BrikenTrypsinDIA18" "s2018_0817BrikenTrypsinDIA19"
## Loading SWATH2stats
## Found the same mzXML files in the annotations and data.
## results/01mzXML/dia/20190327/2018_0315Briken01.mzXML
## results/01mzXML/dia/20190327/2018_0315Briken02.mzXML
## results/01mzXML/dia/20190327/2018_0315Briken03.mzXML
## results/01mzXML/dia/20190327/2018_0315Briken04.mzXML
## results/01mzXML/dia/20190327/2018_0315Briken05.mzXML
## results/01mzXML/dia/20190327/2018_0315Briken06.mzXML
## results/01mzXML/dia/20190327/2018_0315Briken21.mzXML
## results/01mzXML/dia/20190327/2018_0315Briken22.mzXML
## results/01mzXML/dia/20190327/2018_0315Briken23.mzXML
## results/01mzXML/dia/20190327/2018_0315Briken24.mzXML
## results/01mzXML/dia/20190327/2018_0315Briken25.mzXML
## results/01mzXML/dia/20190327/2018_0315Briken26.mzXML
## results/01mzXML/dia/20190327/2018_0502BrikenDIA01.mzXML
## results/01mzXML/dia/20190327/2018_0502BrikenDIA02.mzXML
## results/01mzXML/dia/20190327/2018_0502BrikenDIA03.mzXML
## results/01mzXML/dia/20190327/2018_0502BrikenDIA04.mzXML
## results/01mzXML/dia/20190327/2018_0502BrikenDIA05.mzXML
## results/01mzXML/dia/20190327/2018_0502BrikenDIA06.mzXML
## results/01mzXML/dia/20190327/2018_0502BrikenDIA07.mzXML
## results/01mzXML/dia/20190327/2018_0502BrikenDIA08.mzXML
## results/01mzXML/dia/20190327/2018_0502BrikenDIA09.mzXML
## results/01mzXML/dia/20190327/2018_0502BrikenDIA10.mzXML
## results/01mzXML/dia/20190327/2018_0502BrikenDIA11.mzXML
## results/01mzXML/dia/20190327/2018_0502BrikenDIA12.mzXML
## results/01mzXML/dia/20190327/2018_0726Briken01.mzXML
## results/01mzXML/dia/20190327/2018_0726Briken02.mzXML
## results/01mzXML/dia/20190327/2018_0726Briken03.mzXML
## results/01mzXML/dia/20190327/2018_0726Briken04.mzXML
## results/01mzXML/dia/20190327/2018_0726Briken05.mzXML
## results/01mzXML/dia/20190327/2018_0726Briken06.mzXML
## results/01mzXML/dia/20190327/2018_0726Briken07.mzXML
## results/01mzXML/dia/20190327/2018_0726Briken08.mzXML
## results/01mzXML/dia/20190327/2018_0726Briken09.mzXML
## results/01mzXML/dia/20190327/2018_0726Briken11.mzXML
## results/01mzXML/dia/20190327/2018_0726Briken12.mzXML
## results/01mzXML/dia/20190327/2018_0726Briken13.mzXML
## results/01mzXML/dia/20190327/2018_0726Briken14.mzXML
## results/01mzXML/dia/20190327/2018_0726Briken15.mzXML
## results/01mzXML/dia/20190327/2018_0726Briken16.mzXML
## results/01mzXML/dia/20190327/2018_0726Briken17.mzXML
## results/01mzXML/dia/20190327/2018_0726Briken18.mzXML
## results/01mzXML/dia/20190327/2018_0726Briken19.mzXML
## results/01mzXML/dia/20190327/2018_0817BrikenTrypsinDIA01.mzXML
## results/01mzXML/dia/20190327/2018_0817BrikenTrypsinDIA02.mzXML
## results/01mzXML/dia/20190327/2018_0817BrikenTrypsinDIA03.mzXML
## results/01mzXML/dia/20190327/2018_0817BrikenTrypsinDIA04.mzXML
## results/01mzXML/dia/20190327/2018_0817BrikenTrypsinDIA05.mzXML
## results/01mzXML/dia/20190327/2018_0817BrikenTrypsinDIA06.mzXML
## results/01mzXML/dia/20190327/2018_0817BrikenTrypsinDIA07.mzXML
## results/01mzXML/dia/20190327/2018_0817BrikenTrypsinDIA08.mzXML
## results/01mzXML/dia/20190327/2018_0817BrikenTrypsinDIA09.mzXML
## results/01mzXML/dia/20190327/2018_0817BrikenTrypsinDIA11.mzXML
## results/01mzXML/dia/20190327/2018_0817BrikenTrypsinDIA12.mzXML
## results/01mzXML/dia/20190327/2018_0817BrikenTrypsinDIA13.mzXML
## results/01mzXML/dia/20190327/2018_0817BrikenTrypsinDIA14.mzXML
## results/01mzXML/dia/20190327/2018_0817BrikenTrypsinDIA15.mzXML
## results/01mzXML/dia/20190327/2018_0817BrikenTrypsinDIA16.mzXML
## results/01mzXML/dia/20190327/2018_0817BrikenTrypsinDIA17.mzXML
## results/01mzXML/dia/20190327/2018_0817BrikenTrypsinDIA18.mzXML
## results/01mzXML/dia/20190327/2018_0817BrikenTrypsinDIA19.mzXML
## 60 samples were read from the annotations.
## 224796 transitions were read from the data and merged with the annotations.
## Number of non-decoy peptides: 17081
## Number of decoy peptides: 1801
## Decoy rate: 0.1054
## The average FDR by run on assay level is 0.015
## The average FDR by run on peptide level is 0.016
## The average FDR by run on protein level is 0.001
## Target assay FDR: 0.02
## Required overall m-score cutoff: 0.0031623
## achieving assay FDR: 0.0194
## Target protein FDR: 0.02
## Required overall m-score cutoff: 0.01
## achieving protein FDR: 0.00115
## Original dimension: 221952, new dimension: 211415, difference: 10537.
## Peptides need to have been quantified in more conditions than: 48 in order to pass this percentage-based threshold.
## Fraction of peptides selected: 0.00058
## Original dimension: 224796, new dimension: 680, difference: 224116.
## Target protein FDR: 0.01
## Required overall m-score cutoff: 0.01
## achieving protein FDR: 0
## filter_mscore_fdr is filtering the data...
## finding m-score cutoff to achieve desired protein FDR in protein master list..
## finding m-score cutoff to achieve desired global peptide FDR..
## Target peptide FDR: 0.05
## Required overall m-score cutoff: 0.01
## Achieving peptide FDR: 0
## Proteins selected: 
## Total proteins selected: 2412
## Final target proteins: 2412
## Final decoy proteins: 0
## Peptides mapping to these protein entries selected:
## Total mapping peptides: 16868
## Final target peptides: 16868
## Final decoy peptides: 0
## Total peptides selected from:
## Total peptides: 16868
## Final target peptides: 16868
## Final decoy peptides: 0
## Individual run FDR quality of the peptides was not calculated
## as not every run contains a decoy.
## The decoys have been removed from the returned data.
## Number of proteins detected: 2363
## Protein identifiers: Rv0577, Rv0242c, Rv3012c, Rv2467, Rv3715c, Rv2220
## Number of proteins detected that are supported by a proteotypic peptide: 2337
## Number of proteotypic peptides detected: 16728
## Number of proteins detected: 2337
## First 6 protein identifiers: Rv0577, Rv0242c, Rv3012c, Rv2467, Rv3715c, Rv2220
## Before filtering:
##   Number of proteins: 2337
##   Number of peptides: 16728
## 
## Percentage of peptides removed: 25.94%
## 
## After filtering:
##   Number of proteins: 2331
##   Number of peptides: 12388
## Before filtering:
##   Number of proteins: 2331
##   Number of peptides: 12388
## 
## Percentage of peptides removed: 0%
## 
## After filtering:
##   Number of proteins: 2284
##   Number of peptides: 12388
## Protein overview matrix results/swath2stats/20190327/protein_all.csv written to working folder.
## [1] 2434   61
## Protein overview matrix results/swath2stats/20190327/protein_matrix_mscore.csv written to working folder.
## [1] 2412   61
## Peptide overview matrix results/swath2stats/20190327/peptide_matrix_mscore.csv written to working folder.
## [1] 16868    61
## Protein overview matrix results/swath2stats/20190327/protein_matrix_filtered.csv written to working folder.
## [1] 2284   61
## Peptide overview matrix results/swath2stats/20190327/peptide_matrix_filtered.csv written to working folder.
## [1] 144819     61
##  [1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [15] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [29] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [43] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [57] TRUE TRUE TRUE TRUE
##  [1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [15] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [29] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [43] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [57] TRUE TRUE TRUE TRUE
## Reading the sample metadata.
## Warning in `[<-.factor`(`*tmp*`, iseq, value = c("undefined",
## "undefined", : invalid factor level, NA generated

## Warning in `[<-.factor`(`*tmp*`, iseq, value = c("undefined",
## "undefined", : invalid factor level, NA generated
## The sample definitions comprises: 60 rows(samples) and 28 columns(metadata fields).
## Matched 2268 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 2284 rows and 60 columns.
## 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 8 low-count genes (2276 remaining).
## Step 2: normalizing the data with quant.
## Using normalize.quantiles.robust due to a thread error in preprocessCore.
## Step 3: converting the data with cpm.
## Step 4: transforming the data with log2.
## transform_counts: Found 11255 values equal to 0, adding 1 to the matrix.
## Step 5: not doing batch correction.
## There were 60, now there are 48 samples.
## There were 48, now there are 36 samples.
## This function will replace the expt$expressionset slot with:
## log2(svaseq(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
## Warning in normalize_expt(protein_sub, transform = "log2", convert =
## "cpm", : Quantile normalization and sva do not always play well together.
## Step 1: performing count filter with option: cbcb
## Removing 0 low-count genes (2276 remaining).
## Step 2: normalizing the data with quant.
## Using normalize.quantiles.robust due to a thread error in preprocessCore.
## Step 3: converting the data with cpm.
## Step 4: transforming the data with log2.
## Step 5: doing batch correction with svaseq.
## Note to self:  If you get an error like 'x contains missing values' The data has too many 0's and needs a stronger low-count filter applied.
## Passing off to all_adjusters.
## batch_counts: Before batch/surrogate estimation, 81936 entries are x>1: 100%.
## batch_counts: Before batch/surrogate estimation, 0 entries are x==0: 0%.
## The be method chose 4 surrogate variable(s).
## Attempting svaseq estimation with 4 surrogates.

3 Pass the data to DEP and see what happens.

## Loading DEP
wtf <- function (proteins_unique, columns, expdesign) {
  assertthat::assert_that(is.data.frame(proteins_unique), is.integer(columns),
                          is.data.frame(expdesign))
  if (any(!c("name", "ID") %in% colnames(proteins_unique))) {
    stop("'name' and/or 'ID' columns are not present in '",
         deparse(substitute(proteins_unique)), "'.\nRun make_unique() to obtain the required columns",
         call. = FALSE)
  }
  if (any(!c("label", "condition", "replicate") %in% colnames(expdesign))) {
    stop("'label', 'condition' and/or 'replicate' columns",
         "are not present in the experimental design", call. = FALSE)
  }
  if (any(!apply(proteins_unique[, columns], 2, is.numeric))) {
    stop("specified 'columns' should be numeric", "\nRun make_se_parse() with the appropriate columns as argument",
         call. = FALSE)
  }
  if (tibble::is.tibble(proteins_unique))
    proteins_unique <- as.data.frame(proteins_unique)
  if (tibble::is.tibble(expdesign))
    expdesign <- as.data.frame(expdesign)
  rownames(proteins_unique) <- proteins_unique$name
  raw <- proteins_unique[, columns]
  raw[raw == 0] <- NA
  raw <- log2(raw)
  expdesign <- mutate(expdesign, condition = make.names(condition))
  ## I changed the following because it didn't make sense to me.
  if (is.null(expdesign[["ID"]])) {
    expdesign <- expdesign %>%
      tidyr::unite(condition, replicate, remove=FALSE)
  }

  rownames(expdesign) <- expdesign$ID
  matched <- match(make.names(delete_prefix(expdesign$label)),
                   make.names(delete_prefix(colnames(raw))))
  if (any(is.na(matched))) {
    stop("None of the labels in the experimental design match ",
         "with column names in 'proteins_unique'", "\nRun make_se() with the correct labels in the experimental design",
         "and/or correct columns specification")
  }
  colnames(raw)[matched] <- expdesign$ID
  raw <- raw[, !is.na(colnames(raw))][rownames(expdesign)]
  row_data <- proteins_unique[, -columns]
  rownames(row_data) <- row_data$name
  se <- SummarizedExperiment(assays = as.matrix(raw), colData = expdesign,
                             rowData = row_data)
  return(se)
}
## Loading required package: GenomicRanges
## Loading required package: stats4
## Loading required package: S4Vectors
## 
## Attaching package: 'S4Vectors'
## The following objects are masked from 'package:DEP':
## 
##     first, rename
## The following object is masked from 'package:base':
## 
##     expand.grid
## Loading required package: IRanges
## 
## Attaching package: 'IRanges'
## The following objects are masked from 'package:DEP':
## 
##     collapse, desc, slice
## Loading required package: GenomeInfoDb
## Loading required package: DelayedArray
## Loading required package: matrixStats
## 
## Attaching package: 'matrixStats'
## The following objects are masked from 'package:DEP':
## 
##     count, rowRanges
## The following objects are masked from 'package:hpgltools':
## 
##     anyMissing, rowMedians
## The following objects are masked from 'package:Biobase':
## 
##     anyMissing, rowMedians
## Loading required package: BiocParallel
## 
## Attaching package: 'DelayedArray'
## The following objects are masked from 'package:matrixStats':
## 
##     colMaxs, colMins, colRanges, rowMaxs, rowMins, rowRanges
## The following objects are masked from 'package:base':
## 
##     aperm, apply

## [1] 2284   60
## [1] 848  60

## vsn2: 2284 x 60 matrix (1 stratum).
## Please use 'meanSdPlot' to verify the fit.

## Loading required package: imputeLCMD
## Loading required package: tmvtnorm
## Loading required package: mvtnorm
## Loading required package: Matrix
## 
## Attaching package: 'Matrix'
## The following object is masked from 'package:S4Vectors':
## 
##     expand
## Loading required package: gmm
## Loading required package: sandwich
## Loading required package: norm
## Loading required package: pcaMethods
## 
## Attaching package: 'pcaMethods'
## The following object is masked from 'package:stats':
## 
##     loadings
## Loading required package: impute
## [1] 1.708

## Tested contrasts: wt_filtrate_vs_wt_whole, wt_filtrate_vs_delta_filtrate, wt_filtrate_vs_comp_filtrate, wt_filtrate_vs_delta_whole, wt_filtrate_vs_comp_whole, wt_whole_vs_delta_filtrate, wt_whole_vs_comp_filtrate, wt_whole_vs_delta_whole, wt_whole_vs_comp_whole, delta_filtrate_vs_comp_filtrate, delta_filtrate_vs_delta_whole, delta_filtrate_vs_comp_whole, comp_filtrate_vs_delta_whole, comp_filtrate_vs_comp_whole, delta_whole_vs_comp_whole
## Tested contrasts: wt_filtrate_vs_wt_whole, delta_filtrate_vs_wt_filtrate, comp_filtrate_vs_wt_filtrate, wt_filtrate_vs_delta_filtrate, wt_filtrate_vs_comp_filtrate, wt_whole_vs_delta_whole, wt_whole_vs_comp_whole

## Saving to: excel/dep_result.xlsx
## Note: zip::zip() is deprecated, please use zip::zipr() instead

4 Take the imputed matrix into hpgltools

## [1] 2284   60
## 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 0 low-count genes (2284 remaining).
## Step 2: normalizing the data with quant.
## Using normalize.quantiles.robust due to a thread error in preprocessCore.
## Step 3: converting the data with cpm.
## Step 4: transforming the data with log2.
## Step 5: not doing batch correction.

5 Minor change to plot_missval

DEP has a neat function to plot missing values. Sadly, it does not return the actual matrix, only the plot. This is nice and all, but I need the matrix, ergo this minor change.

##  wt_filtrate_2018_0315Briken01 wt_filtrate_2018_0315Briken02
##  Min.   :0.000                 Min.   :0.000                
##  1st Qu.:0.000                 1st Qu.:0.000                
##  Median :0.000                 Median :0.000                
##  Mean   :0.355                 Mean   :0.374                
##  3rd Qu.:1.000                 3rd Qu.:1.000                
##  Max.   :1.000                 Max.   :1.000                
##  wt_filtrate_2018_0315Briken03 wt_whole_2018_0315Briken04
##  Min.   :0.000                 Min.   :0.000             
##  1st Qu.:0.000                 1st Qu.:0.000             
##  Median :0.000                 Median :1.000             
##  Mean   :0.403                 Mean   :0.731             
##  3rd Qu.:1.000                 3rd Qu.:1.000             
##  Max.   :1.000                 Max.   :1.000             
##  wt_whole_2018_0315Briken05 wt_whole_2018_0315Briken06
##  Min.   :0.000              Min.   :0.000             
##  1st Qu.:1.000              1st Qu.:1.000             
##  Median :1.000              Median :1.000             
##  Mean   :0.783              Mean   :0.757             
##  3rd Qu.:1.000              3rd Qu.:1.000             
##  Max.   :1.000              Max.   :1.000             
##  wt_whole_2018_0315Briken21 wt_whole_2018_0315Briken22
##  Min.   :0.000              Min.   :0.000             
##  1st Qu.:1.000              1st Qu.:1.000             
##  Median :1.000              Median :1.000             
##  Mean   :0.795              Mean   :0.817             
##  3rd Qu.:1.000              3rd Qu.:1.000             
##  Max.   :1.000              Max.   :1.000             
##  wt_filtrate_2018_0315Briken23 wt_filtrate_2018_0315Briken24
##  Min.   :0.00                  Min.   :0.000                
##  1st Qu.:0.00                  1st Qu.:0.000                
##  Median :0.00                  Median :0.000                
##  Mean   :0.39                  Mean   :0.412                
##  3rd Qu.:1.00                  3rd Qu.:1.000                
##  Max.   :1.00                  Max.   :1.000                
##  wt_filtrate_2018_0315Briken25 wt_whole_2018_0315Briken26
##  Min.   :0.000                 Min.   :0.000             
##  1st Qu.:0.000                 1st Qu.:1.000             
##  Median :0.000                 Median :1.000             
##  Mean   :0.362                 Mean   :0.799             
##  3rd Qu.:1.000                 3rd Qu.:1.000             
##  Max.   :1.000                 Max.   :1.000             
##  delta_filtrate_2018_0502BrikenDIA01 delta_filtrate_2018_0502BrikenDIA02
##  Min.   :0.000                       Min.   :0.00                       
##  1st Qu.:0.000                       1st Qu.:0.00                       
##  Median :0.000                       Median :0.00                       
##  Mean   :0.305                       Mean   :0.35                       
##  3rd Qu.:1.000                       3rd Qu.:1.00                       
##  Max.   :1.000                       Max.   :1.00                       
##  delta_filtrate_2018_0502BrikenDIA03 comp_filtrate_2018_0502BrikenDIA04
##  Min.   :0.000                       Min.   :0.000                     
##  1st Qu.:0.000                       1st Qu.:0.000                     
##  Median :0.000                       Median :0.000                     
##  Mean   :0.296                       Mean   :0.366                     
##  3rd Qu.:1.000                       3rd Qu.:1.000                     
##  Max.   :1.000                       Max.   :1.000                     
##  comp_filtrate_2018_0502BrikenDIA05 comp_filtrate_2018_0502BrikenDIA06
##  Min.   :0.000                      Min.   :0.000                     
##  1st Qu.:0.000                      1st Qu.:0.000                     
##  Median :0.000                      Median :0.000                     
##  Mean   :0.401                      Mean   :0.359                     
##  3rd Qu.:1.000                      3rd Qu.:1.000                     
##  Max.   :1.000                      Max.   :1.000                     
##  delta_whole_2018_0502BrikenDIA07 delta_whole_2018_0502BrikenDIA08
##  Min.   :0.000                    Min.   :0.000                   
##  1st Qu.:0.000                    1st Qu.:0.000                   
##  Median :1.000                    Median :1.000                   
##  Mean   :0.747                    Mean   :0.738                   
##  3rd Qu.:1.000                    3rd Qu.:1.000                   
##  Max.   :1.000                    Max.   :1.000                   
##  delta_whole_2018_0502BrikenDIA09 comp_whole_2018_0502BrikenDIA10
##  Min.   :0.000                    Min.   :0.0000                 
##  1st Qu.:0.000                    1st Qu.:0.0000                 
##  Median :1.000                    Median :0.0000                 
##  Mean   :0.535                    Mean   :0.0814                 
##  3rd Qu.:1.000                    3rd Qu.:0.0000                 
##  Max.   :1.000                    Max.   :1.0000                 
##  comp_whole_2018_0502BrikenDIA11 comp_whole_2018_0502BrikenDIA12
##  Min.   :0.00                    Min.   :0.000                  
##  1st Qu.:1.00                    1st Qu.:0.000                  
##  Median :1.00                    Median :1.000                  
##  Mean   :0.75                    Mean   :0.679                  
##  3rd Qu.:1.00                    3rd Qu.:1.000                  
##  Max.   :1.00                    Max.   :1.000                  
##  delta_filtrate_2018_0726Briken01 delta_filtrate_2018_0726Briken02
##  Min.   :0.000                    Min.   :0.000                   
##  1st Qu.:0.000                    1st Qu.:0.000                   
##  Median :0.000                    Median :0.000                   
##  Mean   :0.063                    Mean   :0.102                   
##  3rd Qu.:0.000                    3rd Qu.:0.000                   
##  Max.   :1.000                    Max.   :1.000                   
##  delta_filtrate_2018_0726Briken03 comp_filtrate_2018_0726Briken04
##  Min.   :0.0000                   Min.   :0.0000                 
##  1st Qu.:0.0000                   1st Qu.:0.0000                 
##  Median :0.0000                   Median :0.0000                 
##  Mean   :0.0517                   Mean   :0.0517                 
##  3rd Qu.:0.0000                   3rd Qu.:0.0000                 
##  Max.   :1.0000                   Max.   :1.0000                 
##  comp_filtrate_2018_0726Briken05 comp_filtrate_2018_0726Briken06
##  Min.   :0.0000                  Min.   :0.000                  
##  1st Qu.:0.0000                  1st Qu.:0.000                  
##  Median :0.0000                  Median :0.000                  
##  Mean   :0.0823                  Mean   :0.113                  
##  3rd Qu.:0.0000                  3rd Qu.:0.000                  
##  Max.   :1.0000                  Max.   :1.000                  
##  wt_filtrate_2018_0726Briken07 wt_filtrate_2018_0726Briken08
##  Min.   :0.000                 Min.   :0.000                
##  1st Qu.:0.000                 1st Qu.:0.000                
##  Median :0.000                 Median :0.000                
##  Mean   :0.115                 Mean   :0.109                
##  3rd Qu.:0.000                 3rd Qu.:0.000                
##  Max.   :1.000                 Max.   :1.000                
##  wt_filtrate_2018_0726Briken09 delta_whole_2018_0726Briken11
##  Min.   :0.00                  Min.   :0.000                
##  1st Qu.:0.00                  1st Qu.:0.000                
##  Median :0.00                  Median :0.000                
##  Mean   :0.14                  Mean   :0.255                
##  3rd Qu.:0.00                  3rd Qu.:1.000                
##  Max.   :1.00                  Max.   :1.000                
##  delta_whole_2018_0726Briken12 delta_whole_2018_0726Briken13
##  Min.   :0.000                 Min.   :0.00                 
##  1st Qu.:0.000                 1st Qu.:0.00                 
##  Median :0.000                 Median :0.00                 
##  Mean   :0.304                 Mean   :0.23                 
##  3rd Qu.:1.000                 3rd Qu.:0.00                 
##  Max.   :1.000                 Max.   :1.00                 
##  comp_whole_2018_0726Briken14 comp_whole_2018_0726Briken15
##  Min.   :0.000                Min.   :0.000               
##  1st Qu.:0.000                1st Qu.:0.000               
##  Median :0.000                Median :0.000               
##  Mean   :0.226                Mean   :0.255               
##  3rd Qu.:0.000                3rd Qu.:1.000               
##  Max.   :1.000                Max.   :1.000               
##  comp_whole_2018_0726Briken16 wt_whole_2018_0726Briken17
##  Min.   :0.000                Min.   :0.000             
##  1st Qu.:0.000                1st Qu.:0.000             
##  Median :0.000                Median :0.000             
##  Mean   :0.288                Mean   :0.262             
##  3rd Qu.:1.000                3rd Qu.:1.000             
##  Max.   :1.000                Max.   :1.000             
##  wt_whole_2018_0726Briken18 wt_whole_2018_0726Briken19
##  Min.   :0.00               Min.   :0.000             
##  1st Qu.:0.00               1st Qu.:0.000             
##  Median :0.00               Median :0.000             
##  Mean   :0.35               Mean   :0.186             
##  3rd Qu.:1.00               3rd Qu.:0.000             
##  Max.   :1.00               Max.   :1.000             
##  delta_filtrate_2018_0817BrikenTrypsinDIA01
##  Min.   :0.000                             
##  1st Qu.:0.000                             
##  Median :0.000                             
##  Mean   :0.246                             
##  3rd Qu.:0.000                             
##  Max.   :1.000                             
##  delta_filtrate_2018_0817BrikenTrypsinDIA02
##  Min.   :0.000                             
##  1st Qu.:0.000                             
##  Median :0.000                             
##  Mean   :0.254                             
##  3rd Qu.:1.000                             
##  Max.   :1.000                             
##  delta_filtrate_2018_0817BrikenTrypsinDIA03
##  Min.   :0.000                             
##  1st Qu.:0.000                             
##  Median :0.000                             
##  Mean   :0.251                             
##  3rd Qu.:1.000                             
##  Max.   :1.000                             
##  comp_filtrate_2018_0817BrikenTrypsinDIA04
##  Min.   :0.000                            
##  1st Qu.:0.000                            
##  Median :0.000                            
##  Mean   :0.311                            
##  3rd Qu.:1.000                            
##  Max.   :1.000                            
##  comp_filtrate_2018_0817BrikenTrypsinDIA05
##  Min.   :0.000                            
##  1st Qu.:0.000                            
##  Median :0.000                            
##  Mean   :0.283                            
##  3rd Qu.:1.000                            
##  Max.   :1.000                            
##  comp_filtrate_2018_0817BrikenTrypsinDIA06
##  Min.   :0.00                             
##  1st Qu.:0.00                             
##  Median :0.00                             
##  Mean   :0.29                             
##  3rd Qu.:1.00                             
##  Max.   :1.00                             
##  wt_filtrate_2018_0817BrikenTrypsinDIA07
##  Min.   :0.000                          
##  1st Qu.:0.000                          
##  Median :0.000                          
##  Mean   :0.201                          
##  3rd Qu.:0.000                          
##  Max.   :1.000                          
##  wt_filtrate_2018_0817BrikenTrypsinDIA08
##  Min.   :0.000                          
##  1st Qu.:0.000                          
##  Median :0.000                          
##  Mean   :0.222                          
##  3rd Qu.:0.000                          
##  Max.   :1.000                          
##  wt_filtrate_2018_0817BrikenTrypsinDIA09
##  Min.   :0.000                          
##  1st Qu.:0.000                          
##  Median :0.000                          
##  Mean   :0.236                          
##  3rd Qu.:0.000                          
##  Max.   :1.000                          
##  delta_whole_2018_0817BrikenTrypsinDIA11
##  Min.   :0.000                          
##  1st Qu.:0.000                          
##  Median :1.000                          
##  Mean   :0.656                          
##  3rd Qu.:1.000                          
##  Max.   :1.000                          
##  delta_whole_2018_0817BrikenTrypsinDIA12
##  Min.   :0.000                          
##  1st Qu.:0.000                          
##  Median :1.000                          
##  Mean   :0.655                          
##  3rd Qu.:1.000                          
##  Max.   :1.000                          
##  delta_whole_2018_0817BrikenTrypsinDIA13
##  Min.   :0.000                          
##  1st Qu.:0.000                          
##  Median :1.000                          
##  Mean   :0.697                          
##  3rd Qu.:1.000                          
##  Max.   :1.000                          
##  comp_whole_2018_0817BrikenTrypsinDIA14
##  Min.   :0.000                         
##  1st Qu.:0.000                         
##  Median :1.000                         
##  Mean   :0.671                         
##  3rd Qu.:1.000                         
##  Max.   :1.000                         
##  comp_whole_2018_0817BrikenTrypsinDIA15
##  Min.   :0.000                         
##  1st Qu.:0.000                         
##  Median :1.000                         
##  Mean   :0.723                         
##  3rd Qu.:1.000                         
##  Max.   :1.000                         
##  comp_whole_2018_0817BrikenTrypsinDIA16
##  Min.   :0.000                         
##  1st Qu.:0.000                         
##  Median :1.000                         
##  Mean   :0.719                         
##  3rd Qu.:1.000                         
##  Max.   :1.000                         
##  wt_filtrate_2018_0817BrikenTrypsinDIA17
##  Min.   :0.000                          
##  1st Qu.:0.000                          
##  Median :0.000                          
##  Mean   :0.499                          
##  3rd Qu.:1.000                          
##  Max.   :1.000                          
##  wt_whole_2018_0817BrikenTrypsinDIA18 wt_whole_2018_0817BrikenTrypsinDIA19
##  Min.   :0.00                         Min.   :0.000                       
##  1st Qu.:0.00                         1st Qu.:0.000                       
##  Median :1.00                         Median :1.000                       
##  Mean   :0.65                         Mean   :0.654                       
##  3rd Qu.:1.00                         3rd Qu.:1.000                       
##  Max.   :1.00                         Max.   :1.000
## iRT_Kit  Rv0001  Rv0002  Rv0003  Rv0005  Rv0006 
##      35      22      57      16      50      57
##              wt_filtrate_2018_0315Briken01 
##                                        810 
##              wt_filtrate_2018_0315Briken02 
##                                        855 
##              wt_filtrate_2018_0315Briken03 
##                                        920 
##                 wt_whole_2018_0315Briken04 
##                                       1669 
##                 wt_whole_2018_0315Briken05 
##                                       1789 
##                 wt_whole_2018_0315Briken06 
##                                       1728 
##                 wt_whole_2018_0315Briken21 
##                                       1817 
##                 wt_whole_2018_0315Briken22 
##                                       1867 
##              wt_filtrate_2018_0315Briken23 
##                                        891 
##              wt_filtrate_2018_0315Briken24 
##                                        941 
##              wt_filtrate_2018_0315Briken25 
##                                        828 
##                 wt_whole_2018_0315Briken26 
##                                       1825 
##        delta_filtrate_2018_0502BrikenDIA01 
##                                        697 
##        delta_filtrate_2018_0502BrikenDIA02 
##                                        799 
##        delta_filtrate_2018_0502BrikenDIA03 
##                                        677 
##         comp_filtrate_2018_0502BrikenDIA04 
##                                        835 
##         comp_filtrate_2018_0502BrikenDIA05 
##                                        915 
##         comp_filtrate_2018_0502BrikenDIA06 
##                                        819 
##           delta_whole_2018_0502BrikenDIA07 
##                                       1706 
##           delta_whole_2018_0502BrikenDIA08 
##                                       1685 
##           delta_whole_2018_0502BrikenDIA09 
##                                       1223 
##            comp_whole_2018_0502BrikenDIA10 
##                                        186 
##            comp_whole_2018_0502BrikenDIA11 
##                                       1714 
##            comp_whole_2018_0502BrikenDIA12 
##                                       1552 
##           delta_filtrate_2018_0726Briken01 
##                                        144 
##           delta_filtrate_2018_0726Briken02 
##                                        233 
##           delta_filtrate_2018_0726Briken03 
##                                        118 
##            comp_filtrate_2018_0726Briken04 
##                                        118 
##            comp_filtrate_2018_0726Briken05 
##                                        188 
##            comp_filtrate_2018_0726Briken06 
##                                        259 
##              wt_filtrate_2018_0726Briken07 
##                                        263 
##              wt_filtrate_2018_0726Briken08 
##                                        248 
##              wt_filtrate_2018_0726Briken09 
##                                        319 
##              delta_whole_2018_0726Briken11 
##                                        583 
##              delta_whole_2018_0726Briken12 
##                                        694 
##              delta_whole_2018_0726Briken13 
##                                        526 
##               comp_whole_2018_0726Briken14 
##                                        516 
##               comp_whole_2018_0726Briken15 
##                                        582 
##               comp_whole_2018_0726Briken16 
##                                        658 
##                 wt_whole_2018_0726Briken17 
##                                        598 
##                 wt_whole_2018_0726Briken18 
##                                        800 
##                 wt_whole_2018_0726Briken19 
##                                        426 
## delta_filtrate_2018_0817BrikenTrypsinDIA01 
##                                        561 
## delta_filtrate_2018_0817BrikenTrypsinDIA02 
##                                        580 
## delta_filtrate_2018_0817BrikenTrypsinDIA03 
##                                        574 
##  comp_filtrate_2018_0817BrikenTrypsinDIA04 
##                                        711 
##  comp_filtrate_2018_0817BrikenTrypsinDIA05 
##                                        646 
##  comp_filtrate_2018_0817BrikenTrypsinDIA06 
##                                        662 
##    wt_filtrate_2018_0817BrikenTrypsinDIA07 
##                                        459 
##    wt_filtrate_2018_0817BrikenTrypsinDIA08 
##                                        508 
##    wt_filtrate_2018_0817BrikenTrypsinDIA09 
##                                        538 
##    delta_whole_2018_0817BrikenTrypsinDIA11 
##                                       1498 
##    delta_whole_2018_0817BrikenTrypsinDIA12 
##                                       1495 
##    delta_whole_2018_0817BrikenTrypsinDIA13 
##                                       1592 
##     comp_whole_2018_0817BrikenTrypsinDIA14 
##                                       1532 
##     comp_whole_2018_0817BrikenTrypsinDIA15 
##                                       1652 
##     comp_whole_2018_0817BrikenTrypsinDIA16 
##                                       1642 
##    wt_filtrate_2018_0817BrikenTrypsinDIA17 
##                                       1139 
##       wt_whole_2018_0817BrikenTrypsinDIA18 
##                                       1485 
##       wt_whole_2018_0817BrikenTrypsinDIA19 
##                                       1494
## If you wish to reproduce this exact build of hpgltools, invoke the following:
## > git clone http://github.com/abelew/hpgltools.git
## > git reset 0abc58e173be7300595d30d407b7efd4e4a512d6
## This is hpgltools commit: Thu May 9 14:56:34 2019 -0400: 0abc58e173be7300595d30d407b7efd4e4a512d6
## Saving to dia_umpire_20190308-v20190327.rda.xz

R version 3.5.3 (2019-03-11)

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

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

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

other attached packages: imputeLCMD(v.2.0), impute(v.1.56.0), pcaMethods(v.1.74.0), norm(v.1.0-9.5), tmvtnorm(v.1.4-10), gmm(v.1.6-2), sandwich(v.2.5-1), Matrix(v.1.2-17), mvtnorm(v.1.0-10), SummarizedExperiment(v.1.12.0), DelayedArray(v.0.8.0), BiocParallel(v.1.16.6), matrixStats(v.0.54.0), GenomicRanges(v.1.34.0), GenomeInfoDb(v.1.18.2), IRanges(v.2.16.0), S4Vectors(v.0.20.1), DEP(v.1.5.3), ruv(v.0.9.7), SWATH2stats(v.1.13.5), testthat(v.2.1.1), hpgltools(v.1.0), Biobase(v.2.42.0) and BiocGenerics(v.0.28.0)

loaded via a namespace (and not attached): shinydashboard(v.0.7.1), tidyselect(v.0.2.5), lme4(v.1.1-21), htmlwidgets(v.1.3), RSQLite(v.2.1.1), AnnotationDbi(v.1.44.0), grid(v.3.5.3), devtools(v.2.0.2), munsell(v.0.5.0), codetools(v.0.2-16), preprocessCore(v.1.44.0), DT(v.0.6), withr(v.2.1.2), colorspace(v.1.4-1), GOSemSim(v.2.8.0), knitr(v.1.23), rstudioapi(v.0.10), DOSE(v.3.8.2), mzID(v.1.20.1), labeling(v.0.3), urltools(v.1.7.3), GenomeInfoDbData(v.1.2.0), polyclip(v.1.10-0), bit64(v.0.9-7), farver(v.1.1.0), rprojroot(v.1.3-2), xfun(v.0.7), R6(v.2.4.0), doParallel(v.1.0.14), locfit(v.1.5-9.1), bitops(v.1.0-6), fgsea(v.1.8.0), gridGraphics(v.0.4-1), assertthat(v.0.2.1), promises(v.1.0.1), scales(v.1.0.0), ggraph(v.1.0.2), enrichplot(v.1.2.0), gtable(v.0.3.0), affy(v.1.60.0), sva(v.3.30.1), processx(v.3.3.1), rlang(v.0.3.4), genefilter(v.1.64.0), mzR(v.2.16.2), GlobalOptions(v.0.1.0), splines(v.3.5.3), rtracklayer(v.1.42.2), lazyeval(v.0.2.2), selectr(v.0.4-1), europepmc(v.0.3), BiocManager(v.1.30.4), yaml(v.2.2.0), reshape2(v.1.4.3), GenomicFeatures(v.1.34.8), backports(v.1.1.4), httpuv(v.1.5.1), qvalue(v.2.14.1), clusterProfiler(v.3.10.1), tools(v.3.5.3), usethis(v.1.5.0), ggplotify(v.0.0.3), ggplot2(v.3.1.1), affyio(v.1.52.0), gplots(v.3.0.1.1), RColorBrewer(v.1.1-2), sessioninfo(v.1.1.1), MSnbase(v.2.8.3), ggridges(v.0.5.1), Rcpp(v.1.0.1), plyr(v.1.8.4), base64enc(v.0.1-3), progress(v.1.2.2), zlibbioc(v.1.28.0), purrr(v.0.3.2), RCurl(v.1.95-4.12), ps(v.1.3.0), prettyunits(v.1.0.2), GetoptLong(v.0.1.7), viridis(v.0.5.1), cowplot(v.0.9.4), zoo(v.1.8-5), cluster(v.2.0.9), ggrepel(v.0.8.1), colorRamps(v.2.3), fs(v.1.3.1), variancePartition(v.1.12.3), magrittr(v.1.5), data.table(v.1.12.2), DO.db(v.2.9), openxlsx(v.4.1.0), circlize(v.0.4.6), triebeard(v.0.3.0), packrat(v.0.5.0), ProtGenerics(v.1.14.0), pkgload(v.1.0.2), mime(v.0.6), hms(v.0.4.2), evaluate(v.0.13), xtable(v.1.8-4), pbkrtest(v.0.4-7), XML(v.3.98-1.19), shape(v.1.4.4), gridExtra(v.2.3), compiler(v.3.5.3), biomaRt(v.2.38.0), tibble(v.2.1.1), KernSmooth(v.2.23-15), ncdf4(v.1.16.1), crayon(v.1.3.4), minqa(v.1.2.4), htmltools(v.0.3.6), later(v.0.8.0), mgcv(v.1.8-28), corpcor(v.1.6.9), tidyr(v.0.8.3), DBI(v.1.0.0), tweenr(v.1.0.1), ComplexHeatmap(v.1.20.0), MASS(v.7.3-51.4), boot(v.1.3-22), readr(v.1.3.1), cli(v.1.1.0), vsn(v.3.50.0), gdata(v.2.18.0), igraph(v.1.2.4.1), pkgconfig(v.2.0.2), rvcheck(v.0.1.3), GenomicAlignments(v.1.18.1), MALDIquant(v.1.19.3), xml2(v.1.2.0), foreach(v.1.4.4), annotate(v.1.60.1), XVector(v.0.22.0), rvest(v.0.3.4), stringr(v.1.4.0), callr(v.3.2.0), digest(v.0.6.19), Biostrings(v.2.50.2), rmarkdown(v.1.12), fastmatch(v.1.1-0), edgeR(v.3.24.3), curl(v.3.3), shiny(v.1.3.2), Rsamtools(v.1.34.1), gtools(v.3.8.1), rjson(v.0.2.20), nloptr(v.1.2.1), nlme(v.3.1-140), jsonlite(v.1.6), desc(v.1.2.0), viridisLite(v.0.3.0), limma(v.3.38.3), pillar(v.1.4.0), lattice(v.0.20-38), httr(v.1.4.0), pkgbuild(v.1.0.3), survival(v.2.44-1.1), GO.db(v.3.7.0), glue(v.1.3.1), remotes(v.2.0.4), fdrtool(v.1.2.15), zip(v.2.0.2), UpSetR(v.1.3.3), iterators(v.1.0.10), pander(v.0.6.3), bit(v.1.1-14), ggforce(v.0.2.2), stringi(v.1.4.3), blob(v.1.1.1), caTools(v.1.17.1.2), memoise(v.1.1.0) and dplyr(v.0.8.1)

LS0tCnRpdGxlOiAiTS4gdHViZXJjdWxvc2lzIDIwMTkwMzI3OiBESUEtVW1waXJlIGJhc2VkIE9wZW5TV0FUSCB3b3JrZmxvdy4iCmF1dGhvcjogImF0YiBhYmVsZXdAZ21haWwuY29tIgpkYXRlOiAiYHIgU3lzLkRhdGUoKWAiCm91dHB1dDoKICBodG1sX2RvY3VtZW50OgogICAgY29kZV9kb3dubG9hZDogdHJ1ZQogICAgY29kZV9mb2xkaW5nOiBzaG93CiAgICBmaWdfY2FwdGlvbjogdHJ1ZQogICAgZmlnX2hlaWdodDogNwogICAgZmlnX3dpZHRoOiA3CiAgICBoaWdobGlnaHQ6IHRhbmdvCiAgICBrZWVwX21kOiBmYWxzZQogICAgbW9kZTogc2VsZmNvbnRhaW5lZAogICAgbnVtYmVyX3NlY3Rpb25zOiB0cnVlCiAgICBzZWxmX2NvbnRhaW5lZDogdHJ1ZQogICAgdGhlbWU6IHJlYWRhYmxlCiAgICB0b2M6IHRydWUKICAgIHRvY19mbG9hdDoKICAgICAgY29sbGFwc2VkOiBmYWxzZQogICAgICBzbW9vdGhfc2Nyb2xsOiBmYWxzZQogIHJtZGZvcm1hdHM6OnJlYWR0aGVkb3duOgogICAgY29kZV9kb3dubG9hZDogdHJ1ZQogICAgY29kZV9mb2xkaW5nOiBzaG93CiAgICBkZl9wcmludDogcGFnZWQKICAgIGZpZ19jYXB0aW9uOiB0cnVlCiAgICBmaWdfaGVpZ2h0OiA3CiAgICBmaWdfd2lkdGg6IDcKICAgIGhpZ2hsaWdodDogdGFuZ28KICAgIHdpZHRoOiAzMDAKICAgIGtlZXBfbWQ6IGZhbHNlCiAgICBtb2RlOiBzZWxmY29udGFpbmVkCiAgICB0b2NfZmxvYXQ6IHRydWUKICBCaW9jU3R5bGU6Omh0bWxfZG9jdW1lbnQ6CiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlCiAgICBjb2RlX2ZvbGRpbmc6IHNob3cKICAgIGZpZ19jYXB0aW9uOiB0cnVlCiAgICBmaWdfaGVpZ2h0OiA3CiAgICBmaWdfd2lkdGg6IDcKICAgIGhpZ2hsaWdodDogdGFuZ28KICAgIGtlZXBfbWQ6IGZhbHNlCiAgICBtb2RlOiBzZWxmY29udGFpbmVkCiAgICB0b2NfZmxvYXQ6IHRydWUKLS0tCgo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgpib2R5LCB0ZCB7CiAgZm9udC1zaXplOiAxNnB4Owp9CmNvZGUucnsKICBmb250LXNpemU6IDE2cHg7Cn0KcHJlIHsKIGZvbnQtc2l6ZTogMTZweAp9Cjwvc3R5bGU+CgpgYGB7ciBvcHRpb25zLCBpbmNsdWRlPUZBTFNFfQpsaWJyYXJ5KCJocGdsdG9vbHMiKQp0dCA8LSBkZXZ0b29sczo6bG9hZF9hbGwoIi9kYXRhL2hwZ2x0b29scyIpCmtuaXRyOjpvcHRzX2tuaXQkc2V0KHdpZHRoPTEyMCwKICAgICAgICAgICAgICAgICAgICAgcHJvZ3Jlc3M9VFJVRSwKICAgICAgICAgICAgICAgICAgICAgdmVyYm9zZT1UUlVFLAogICAgICAgICAgICAgICAgICAgICBlY2hvPVRSVUUpCmtuaXRyOjpvcHRzX2NodW5rJHNldChlcnJvcj1UUlVFLAogICAgICAgICAgICAgICAgICAgICAgZHBpPTk2KQpvbGRfb3B0aW9ucyA8LSBvcHRpb25zKGRpZ2l0cz00LAogICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ3NBc0ZhY3RvcnM9RkFMU0UsCiAgICAgICAgICAgICAgICAgICAgICAga25pdHIuZHVwbGljYXRlLmxhYmVsPSJhbGxvdyIpCmdncGxvdDI6OnRoZW1lX3NldChnZ3Bsb3QyOjp0aGVtZV9idyhiYXNlX3NpemU9MTApKQpydW5kYXRlIDwtIGZvcm1hdChTeXMuRGF0ZSgpLCBmb3JtYXQ9IiVZJW0lZCIpCnByZXZpb3VzX2ZpbGUgPC0gIjAyX2VzdGltYXRpb25faW5mZWN0aW9uXzIwMTgwODIyLlJtZCIKdmVyIDwtICIyMDE5MDMyNyIKCiMjdG1wIDwtIHNtKGxvYWRtZShmaWxlbmFtZT1wYXN0ZTAoZ3N1YihwYXR0ZXJuPSJcXC5SbWQiLCByZXBsYWNlPSIiLCB4PXByZXZpb3VzX2ZpbGUpLCAiLXYiLCB2ZXIsICIucmRhLnh6IikpKQpybWRfZmlsZSA8LSAiZGlhX3VtcGlyZV8yMDE5MDMwOC5SbWQiCmBgYAoKIyBSZXdvcmsgRElBLVVtcGlyZSB0byBmZWVkIE9wZW5TV0FUSC4KCkluIHRoZSBmb2xsb3dpbmcgYmxvY2tzIEkgd2FudCB0byB1c2UgRElBIFVtcGlyZSB0byBjcmVhdGUgdHJhbnNpdGlvbiBsaWJyYXJpZXMgZm9yIG9wZW5zd2F0aCwKdGhlbiBJIHdhbnQgdG8gcnVuIG9wZW5zd2F0aCBhbmQgc2NvcmUgdGhlIHJ1bnMuCgojIyBJbnZva2UgRElBIFVtcGlyZQoKYGBge2Jhc2ggdW1waXJlLCBldmFsPUZBTFNFfQpjZCB+L3NjcmF0Y2gvcHJvdGVvbWljcy9teWNvYmFjdGVyaXVtX3R1YmVyY3Vsb3Npc18yMDE4Cm1vZHVsZSBhZGQgb3Blbm1zCgp0eXBlPSJtelhNTCIKZXhwb3J0IFZFUlNJT049IjIwMTkwMjI4IgpiYXNlZGlyPSIke0hPTUV9L3NjcmF0Y2gvcHJvdGVvbWljcy9teWNvYmFjdGVyaXVtX3R1YmVyY3Vsb3Npc18yMDE4IgpiYXNlX2lucHV0PSIke2Jhc2VkaXJ9L3Jlc3VsdHMvMDEke3R5cGV9L2RpYS8ke1ZFUlNJT059LyIKdW1waXJlX2lucHV0cz0kKC91c3IvYmluL2ZpbmQgIiR7YmFzZV9pbnB1dH0iIC1uYW1lICIqLiR7dHlwZX0iIHwgc29ydCkKZWNobyAiQ2hlY2tpbmcgaW46ICR7dW1waXJlX2lucHV0c30iCmZvciBpbnB1dCBpbiAke3VtcGlyZV9pbnB1dHN9OwpkbwogICAgaW5fbmFtZT0kKGJhc2VuYW1lICRpbnB1dCAiLiR7dHlwZX0iKQogICAgb3V0X25hbWU9IiR7aW5fbmFtZX1fUTEubWdmIgogICAgaWYgW1sgISAtZiAiJHtiYXNlX2lucHV0fS8ke291dF9uYW1lfSIgXV07IHRoZW4KICAgICAgICBlY2hvICJUaGUgb3V0cHV0IGZpbGU6ICR7b3V0X25hbWV9IGFscmVhZHkgZXhpc3RzLiIKICAgIGVsc2UKICAgICAgICBqYXZhIC1qYXIgRElBX1VtcGlyZV9TRS5qYXIgJHtpbnB1dH0gZGlhdW1waXJlX3NlLnBhcmFtcwogICAgZmkKZG9uZQpgYGAKCiMjIENvbnZlcnQgRElBIFVtcGlyZSByZXN1bHRzCgpgYGB7YmFzaCBjb252ZXJ0LCBldmFsPUZBTFNFfQptc2NvbnZlcnQgLS1telhNTCByZXN1bHRzLzAybWdmLyoubWdmCm12ICoubXpYTUwgcmVzdWx0cy8wM19kaWFfdW1waXJlX216eG1sCmBgYAoKIyMgU2VhcmNoIHRoZSBVbXBpcmUgcmVzdWx0cwoKYGBge2Jhc2ggc2VhcmNoX3VtcGlyZSwgZXZhbD1GQUxTRX0KY29tZXQgXAogICAgLVBwYXJhbWV0ZXJzL2NvbWV0X2RpYV91bXBpcmVfcGFyYW1zLnR4dCBcCiAgICByZXN1bHRzLzAzX2RpYV91bXBpcmVfbXp4bWwvKi5telhNTApgYGAKCiMjIE1lcmdlIHRoZW0KCmBgYHtiYXNoIG1lcmdlX3hpbnRlcmFjdCwgZXZhbD1GQUxTRX0KeGludGVyYWN0IFwKICAgIC1kREVDT1lfIFwKICAgIC1PQVJQZCBcCiAgICAtTmludGVyYWN0LmNvbWV0LnBlcC54bWwgXAogICAgcmVzdWx0cy8wM19kaWFfdW1waXJlX216eG1sLyoucGVwLnhtbAoKbXYgaW50ZXJhY3QuY29tZXQucGVwLnhtbCByZXN1bHRzLzA0X2RpYV91bXBpcmVfeGludGVyYWN0CmBgYAoKIyMgQ29tYmluZSB0aGUgc3RhdGlzdGljcwoKYGBge2Jhc2ggcHJvdGVpbl9wcm9waGV0LCBldmFsPUZBTFNFfQpQcm90ZWluUHJvcGhldCBcCiAgICByZXN1bHRzLzA0X2RpYV91bXBpcmVfeGludGVyYWN0L2ludGVyYWN0LmNvbWV0LnBlcC54bWwgXAogICAgcmVzdWx0cy8wNV9kaWFfdW1waXJlX3Byb3BoZXQvY29tYmluZWQucHJvdC54bWwKCkludGVyUHJvcGhldFBhcnNlciBcCiAgICBERUNPWT1ERUNPWSBcCiAgICByZXN1bHRzLzA0X2RpYV91bXBpcmVfeGludGVyYWN0L2ludGVyYWN0LmNvbWV0LnBlcC54bWwgXAogICAgcmVzdWx0cy8wNV9kaWFfdW1waXJlX3Byb3BoZXQvaVByb3BoZXQucGVwLnhtbAoKTWF5dS5wbCBcCiAgICAtQSByZXN1bHRzLzA1X2RpYV91bXBpcmVfcHJvcGhldC9pUHJvcGhldC5wZXAueG1sIFwKICAgIC1DIHJlZmVyZW5jZS9tdGJfaXJ0LmZhc3RhIFwKICAgIC1FIERFQ09ZCmBgYAoKYGBge3IgZXh0cmFjdF9wY3RfbWF5dSwgZXZhbD1GQUxTRX0KbWF5dV9vdXRwdXQgPC0gIi4uLzIwMTktMDUtMTJfMTIuMzcuMDNfbWFpbl8xLjA3LmNzdiIKbnVtYmVyIDwtIGhwZ2x0b29sczo6ZXh0cmFjdF9tYXl1X3Bwc19mZHIobWF5dV9vdXRwdXQpCm1lc3NhZ2UoIlRoZSBudW1iZXIgaXM6ICIsIG51bWJlcikKIyMgMC40MzI5MQpgYGAKCgpgYGB7YmFzaCB1bXBpcmVfY29udGQsIGV2YWw9RkFMU0V9CiMjIFJlcnVubmluZyBiZWNhdXNlIHdyaXRpbmcgdGhlIGZpbGUgZmFpbGVkLgpzcGVjdHJhc3QgXAogICAgLWNOU3BlY0xpYiAtY0lDSUQtUVRPRiBcCiAgICAtY2YgIlByb3RlaW4hIH4gREVDT1lfIiBcCiAgICAtY1AwLjQyMzcgXAogICAgLWNfSVJUcmVmZXJlbmNlL2lydC50eHQgXAogICAgLWNfSVJSIHJlc3VsdHMvMDVfZGlhX3VtcGlyZV9wcm9waGV0L2lQcm9waGV0LnBlcC54bWwKCnNwZWN0cmFzdCBcCiAgICAtY05TcGVjTGliX2NvbnMgXAogICAgLWNJQ0lELVFUT0YgXAogICAgLWNBQyBTcGVjTGliLnNwbGliCgpzcGVjdHJhc3QydHN2LnB5IFwKICAgIC1sIDM1MCwyMDAwIFwKICAgIC1zIGIseSBcCiAgICAteCAxLDIgXAogICAgLW8gNiBcCiAgICAtbiA2IFwKICAgIC1wIDAuMDUgXAogICAgLWQgLWUgXAogICAgLWsgb3BlbnN3YXRoIFwKICAgIC13IHdpbmRvd3MvMjAxOF8wODE3QnJpa2VuVHJ5cHNpbkRJQTE5LnR4dCBcCiAgICAtYSBTcGVjTGliX2NvbnNfb3BlbnN3YXRoLnRzdiBcCiAgICBTcGVjTGliX2NvbnMuc3B0eHQKClRhcmdldGVkRmlsZUNvbnZlcnRlciBcCiAgICAtaW4gU3BlY0xpYl9jb25zX29wZW5zd2F0aC50c3YgXAogICAgLWluX3R5cGUgdHN2IFwKICAgIC1vdXQgU3BlY0xpYl9jb25zX29wZW5zd2F0aC5UcmFNTCBcCiAgICAtb3V0X3R5cGUgVHJhTUwKCk9wZW5Td2F0aERlY295R2VuZXJhdG9yIFwKICAgIC1pbiBTcGVjTGliX2NvbnNfb3BlbnN3YXRoLlRyYU1MIFwKICAgIC1vdXQgU3BlY0xpYl9jb25zX29wZW5zd2F0aF9kZWNveS5UcmFNTCBcCiAgICAtbWV0aG9kIHNodWZmbGUKIyMgICAgLWV4Y2x1ZGVfc2ltaWxhciBcCiMjICAgIC1zaW1pbGFyaXR5X3RocmVzaG9sZCAwLjA1IFwKIyMgICAgLWlkZW50aXR5X3RocmVzaG9sZCAwLjcKClRhcmdldGVkRmlsZUNvbnZlcnRlciBcCiAgICAtaW4gU3BlY0xpYl9jb25zX29wZW5zd2F0aF9kZWNveS5UcmFNTCBcCiAgICAtaW5fdHlwZSBUcmFNTCBcCiAgICAtb3V0IFNwZWNMaWJfY29uc19vcGVuc3dhdGhfZGVjb3kudHN2IFwKICAgIC1vdXRfdHlwZSB0c3YKClRhcmdldGVkRmlsZUNvbnZlcnRlciBcCiAgICAtaW4gU3BlY0xpYl9jb25zX29wZW5zd2F0aF9kZWNveS5UcmFNTCBcCiAgICAtaW5fdHlwZSBUcmFNTCBcCiAgICAtb3V0IFNwZWNMaWJfY29uc19vcGVuc3dhdGhfZGVjb3kucHFwIFwKICAgIC1vdXRfdHlwZSBwcXAKCmV4cG9ydCBWRVJTSU9OPSR7VkVSU0lPTjotMjAxOTAzMjd9CmVjaG8gIkxvYWRpbmcgZW52aXJvbm1lbnQgbW9kdWxlcyBhbmQgcGFyYW1ldGVycyBmb3IgdmVyc2lvbjogJHtWRVJTSU9OfS4iCnNvdXJjZSAicGFyYW1ldGVycy8ke1ZFUlNJT059X3NldHRpbmdzLnNoIgoKZWNobyAiSW52b2tpbmcgdGhlIE9wZW5Td2F0aFdvcmtmbG93IHVzaW5nIGxvY2FsIGNvbWV0LWRlcml2ZWQgdHJhbnNpdGlvbnMuIgp0eXBlPSJkaWF1bXBpcmUiCmlucHV0X3R5cGU9Im16WE1MIgpleHBvcnQgVFJBTlNJVElPTl9QUkVGSVg9IlNwZWNMaWJfY29uc19vcGVuc3dhdGhfZGVjb3kiCmVjaG8gIkNoZWNraW5nIGluLCB0aGUgdHJhbnNpdGlvbiBsaWJyYXJ5IGlzOiAke1RSQU5TSVRJT05fUFJFRklYfS5wcXAiCmJhc2VfbXp4bWxkaXI9InJlc3VsdHMvMDEke2lucHV0X3R5cGV9L2RpYS8ke1ZFUlNJT059Igpzd2F0aF9pbnB1dHM9JCgvdXNyL2Jpbi9maW5kICIke2Jhc2VfbXp4bWxkaXJ9IiAtbmFtZSAqLiR7aW5wdXRfdHlwZX0gLXByaW50IHwgc29ydCkKZWNobyAiQ2hlY2tpbmcgaW4sIHRoZSBpbnB1dHMgYXJlOiAke3N3YXRoX2lucHV0c30iCm1rZGlyIC1wICIke1NXQVRIX09VVERJUn1fJHt0eXBlfSIKcHlwZGlyPSIke1BZUFJPUEhFVF9PVVRESVJ9XyR7dHlwZX0iCm1rZGlyIC1wICIke3B5cGRpcn0iCmZvciBpbnB1dCBpbiAke3N3YXRoX2lucHV0c30KZG8KICAgIG5hbWU9JChiYXNlbmFtZSAiJHtpbnB1dH0iICIuJHtpbnB1dF90eXBlfSIpCiAgICBlY2hvICJTdGFydGluZyBvcGVuc3dhdGggcnVuLCBsaWJyYXJ5IHR5cGUgJHt0eXBlfSBmb3IgJHtuYW1lfSB1c2luZyAke01aX1dJTkRPV1N9IHdpbmRvd3MgYXQgJChkYXRlKS4iCiAgICBzd2F0aF9vdXRwdXRfcHJlZml4PSIke1NXQVRIX09VVERJUn1fJHt0eXBlfS8ke25hbWV9XyR7RERBX01FVEhPRH0iCiAgICBweXByb3BoZXRfb3V0cHV0X3ByZWZpeD0iJHtQWVBST1BIRVRfT1VURElSfV8ke3R5cGV9LyR7bmFtZX1fJHtEREFfTUVUSE9EfSIKICAgIGVjaG8gIkRlbGV0aW5nIHByZXZpb3VzIHN3YXRoIG91dHB1dCBmaWxlOiAke3N3YXRoX291dHB1dF9wcmVmaXh9Lm9zdyIKICAgIHJtIC1mICIke3N3YXRoX291dHB1dF9wcmVmaXh9Lm9zdyIKICAgIHJtIC1mICIke3N3YXRoX291dHB1dF9wcmVmaXh9LnRzdiIKICAgIE9wZW5Td2F0aFdvcmtmbG93IFwKICAgICAgICAtaW4gIiR7aW5wdXR9IiBcCiAgICAgICAgLWZvcmNlIFwKICAgICAgICAtc29ydF9zd2F0aF9tYXBzIFwKICAgICAgICAtbWluX3VwcGVyX2VkZ2VfZGlzdCAxIFwKICAgICAgICAtbXpfY29ycmVjdGlvbl9mdW5jdGlvbiAicXVhZHJhdGljX3JlZ3Jlc3Npb25fZGVsdGFfcHBtIiBcCiAgICAgICAgLVNjb3Jpbmc6VHJhbnNpdGlvbkdyb3VwUGlja2VyOmJhY2tncm91bmRfc3VidHJhY3Rpb24gIm9yaWdpbmFsIiBcCiAgICAgICAgLVNjb3Jpbmc6c3RvcF9yZXBvcnRfYWZ0ZXJfZmVhdHVyZSAiNSIgXAogICAgICAgIC1zd2F0aF93aW5kb3dzX2ZpbGUgIndpbmRvd3Mvb3BlbnN3YXRoXyR7bmFtZX0udHh0IiBcCiAgICAgICAgLXRyICIke1RSQU5TSVRJT05fUFJFRklYfS5wcXAiIFwKICAgICAgICAtb3V0X3RzdiAiJHtzd2F0aF9vdXRwdXRfcHJlZml4fS50c3YiCiAgICBPcGVuU3dhdGhXb3JrZmxvdyBcCiAgICAgICAgLWluICIke2lucHV0fSIgXAogICAgICAgIC1mb3JjZSBcCiAgICAgICAgLXNvcnRfc3dhdGhfbWFwcyBcCiAgICAgICAgLW1pbl91cHBlcl9lZGdlX2Rpc3QgMSBcCiAgICAgICAgLW16X2NvcnJlY3Rpb25fZnVuY3Rpb24gInF1YWRyYXRpY19yZWdyZXNzaW9uX2RlbHRhX3BwbSIgXAogICAgICAgIC1TY29yaW5nOlRyYW5zaXRpb25Hcm91cFBpY2tlcjpiYWNrZ3JvdW5kX3N1YnRyYWN0aW9uICJvcmlnaW5hbCIgXAogICAgICAgIC1TY29yaW5nOnN0b3BfcmVwb3J0X2FmdGVyX2ZlYXR1cmUgIjUiIFwKICAgICAgICAtc3dhdGhfd2luZG93c19maWxlICJ3aW5kb3dzL29wZW5zd2F0aF8ke25hbWV9LnR4dCIgXAogICAgICAgIC10ciAiJHtUUkFOU0lUSU9OX1BSRUZJWH0ucHFwIiBcCiAgICAgICAgLW91dF9vc3cgIiR7c3dhdGhfb3V0cHV0X3ByZWZpeH0ub3N3IgogICAgIyMyPiIke3N3YXRoX291dHB1dF9wcmVmaXh9X29zdy5sb2ciIDE+JjIKZG9uZQpzd2F0aF9vdXQ9JChkaXJuYW1lICR7c3dhdGhfb3V0cHV0X3ByZWZpeH0pCnB5cHJvcGhldF9vdXQ9IiQoZGlybmFtZSAiJHtweXByb3BoZXRfb3V0cHV0X3ByZWZpeH0iKS9vcGVuc3dhdGhfbWVyZ2VkLm9zdyIKZWNobyAiTWVyZ2luZyBvc3cgZmlsZXMgdG8gJHtweXByb3BoZXRfb3V0fSIKcHlwcm9waGV0IG1lcmdlIFwKICAgICAgICAgIC0tdGVtcGxhdGUgIiR7VFJBTlNJVElPTl9QUkVGSVh9LnBxcCIgXAogICAgICAgICAgLS1vdXQ9IiR7cHlwcm9waGV0X291dH0iIFwKICAgICAgICAgICR7c3dhdGhfb3V0fS8qLm9zdwpweXByb3BoZXQgc2NvcmUgLS1pbj0iJHtweXByb3BoZXRfb3V0fSIKcHlwcm9waGV0IGV4cG9ydCAtLWluPSIke3B5cHJvcGhldF9vdXR9IiAtLW91dCAidGVzdC50c3YiCiMjIHB5cHJvcGhldCBhbHdheXMgZXhwb3J0cyB0byB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeS4KZmluYWxfbmFtZT0iJChkaXJuYW1lICR7cHlwcm9waGV0X291dH0pLyQoYmFzZW5hbWUgJHtweXByb3BoZXRfb3V0fSAiLm9zdyIpLnRzdiIKZWNobyAkZmluYWxfbmFtZQptdiAidGVzdC50c3YiCmxzIC1sZCAiJHtweXByb3BoZXRfb3V0fSIKCnRyaWNfdGI9IiR7VFJJQ19PVVRESVJ9X3R1YmVyY3VsaXN0Igpta2RpciAtcCAiJHt0cmljX3RifSIKZmVhdHVyZV9hbGlnbm1lbnQucHkgXAogICAgLS1mb3JjZSBcCiAgICAtLWluICIuLyR7cHlwZGlyfS8iKi50c3YgXAogICAgLS1vdXQgIiR7dHJpY190Yn0vJHtTRUFSQ0hfTUVUSE9EfV8ke0REQV9NRVRIT0R9LnRzdiIgXAogICAgLS1vdXRfbWF0cml4ICIke3RyaWNfdGJ9LyR7RERBX01FVEhPRH1fb3V0bWF0cml4LnRzdiIgXAogICAgLS1vdXRfbWV0YSAiJHt0cmljX3RifS8ke0REQV9NRVRIT0R9X21ldGEudHN2IgoyPiIke3RyaWNfdGJ9L2ZlYXR1cmVfYWxpZ25tZW50LmVyciIgXAogMT4iJHt0cmljX3RifS9mZWF0dXJlX2FsaWdubWVudC5vdXQiCmVjaG8gIldyb3RlIGZpbmFsIG91dHB1dCB0byAke3RyaWNfdGJ9LyR7U0VBUkNIX01FVEhPRH1fJHtEREFfTUVUSE9EfS50c3YiCmBgYAoKIyBERVAgdXNhZ2UKClRoYW5rcyB0byBWaXZlaywgSSBub3cgYW0gYXdhcmUgb2YgREVQLCB3aGljaCBkb2VzIGV2ZXJ5dGhpbmcgSSB3aXNoIE1Tc3RhdHMgZGlkLgpUaGUgbWF0cml4IGdpdmVuIHRvIG1lIGJ5IHRyaWMncyBmZWF0dXJlX2FsaWdubWVudC5weSBJIHRoaW5rIGdpdmVzIG1lIHdoYXQgREVQCnJlcXVpcmVzLCBhbG9uZyB3aXRoIG15IGFubm90YXRpb25zIGFuZCBzYW1wbGUgc2hlZXQuCgpMZXQgdXMgc2VlIGlmIHRoaXMgaXMgdHJ1ZS4KCiMjIFByb3RlaW4gYW5ub3RhdGlvbnMKCmBgYHtyIHByb3RlaW5fYW5ub3RhdGlvbnN9Cm10Yl9nZmYgPC0gInJlZmVyZW5jZS9teWNvYmFjdGVyaXVtX3R1YmVyY3Vsb3Npc19oMzdydl8yLmdmZi5neiIKbXRiX2dlbm9tZSA8LSAicmVmZXJlbmNlL210dWJlcmN1bG9zaXNfaDM3cnZfZ2VuYmFuay5mYXN0YSIKbXRiX2NkcyA8LSAicmVmZXJlbmNlL210Yl9jZHMuZmFzdGEiCgptdGJfYW5ub3RhdGlvbnMgPC0gc20obG9hZF9nZmZfYW5ub3RhdGlvbnMobXRiX2dmZiwgdHlwZT0iZ2VuZSIpKQpjb2xuYW1lcyhtdGJfYW5ub3RhdGlvbnMpIDwtIGdzdWIocGF0dGVybj0iXFwuIiwgcmVwbGFjZW1lbnQ9IiIsIHg9Y29sbmFtZXMobXRiX2Fubm90YXRpb25zKSkKbXRiX2Fubm90YXRpb25zW1siZGVzY3JpcHRpb24iXV0gPC0gZ3N1YihwYXR0ZXJuPSJcXCsiLCByZXBsYWNlbWVudD0iICIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeD1tdGJfYW5ub3RhdGlvbnNbWyJkZXNjcmlwdGlvbiJdXSkKbXRiX2Fubm90YXRpb25zW1siZnVuY3Rpb24iXV0gPC0gZ3N1YihwYXR0ZXJuPSJcXCsiLCByZXBsYWNlbWVudD0iICIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeD1tdGJfYW5ub3RhdGlvbnNbWyJmdW5jdGlvbiJdXSkKcm93bmFtZXMobXRiX2Fubm90YXRpb25zKSA8LSBtdGJfYW5ub3RhdGlvbnNbWyJJRCJdXQoKbXRiX21pY3JvYmVzIDwtIGxvYWRfbWljcm9iZXNvbmxpbmVfYW5ub3RhdGlvbnMoaWQ9ODMzMzIpCmBgYAoKIyMgUHJlcHJvY2VzcyBpbnRlbnNpdGllcyBpbiBwcmVwYXJhdGlvbiBmb3IgREVQCgpgYGB7ciBzd2F0aDJzdGF0cywgZmlnLnNob3c9ImhpZGUifQp0cmljX2RhdGEgPC0gcmVhZC5jc3YoCiAgcGFzdGUwKCJyZXN1bHRzL3RyaWMvIiwgdmVyLCAiL3dob2xlXzhtel9kaWFfdW1waXJlL2NvbWV0X0hDRC50c3YiKSwgc2VwPSJcdCIpCnRyaWNfZGF0YVtbIlByb3RlaW5OYW1lIl1dIDwtIGdzdWIocGF0dGVybj0iXiguKilfLiokIiwgcmVwbGFjZW1lbnQ9IlxcMSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeD10cmljX2RhdGFbWyJQcm90ZWluTmFtZSJdXSkKc2FtcGxlX2Fubm90IDwtIGV4dHJhY3RfbWV0YWRhdGEocGFzdGUwKCJzYW1wbGVfc2hlZXRzL010Yl9kaWFfc2FtcGxlc18yMDE5MDUyMS54bHN4IikpCnJvd25hbWVzKHNhbXBsZV9hbm5vdCkKCmRldnRvb2xzOjpsb2FkX2FsbCgifi9zY3JhdGNoL2dpdC9TV0FUSDJzdGF0c19teWZvcmtlZCIpCnMyc19leHAgPC0gU1dBVEgyc3RhdHM6OnNhbXBsZV9hbm5vdGF0aW9uKGRhdGE9dHJpY19kYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZV9hbm5vdGF0aW9uPXNhbXBsZV9hbm5vdCwgdmVyYm9zZT1UUlVFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bGxwZXB0aWRlbmFtZV9jb2x1bW49ImZ1bGxwZXB0aWRlbmFtZSIpCgpkZWNveV9saXN0cyA8LSBhc3Nlc3NfZGVjb3lfcmF0ZShzMnNfZXhwKQojIyBUaGlzIHNlZW1zIGEgYml0IGhpZ2ggdG8gbWUsIHllc25vPwpmZHJfb3ZlcmFsbCA8LSBhc3Nlc3NfZmRyX292ZXJhbGwoczJzX2V4cCwgb3V0cHV0PSJSY29uc29sZSIsIHBsb3Q9VFJVRSkKCmJ5cnVuX2ZkciA8LSBhc3Nlc3NfZmRyX2J5cnVuKHMyc19leHAsIEZGVD0wLjcsIHBsb3Q9VFJVRSwgb3V0cHV0PSJSY29uc29sZSIpCmNob3Nlbl9tc2NvcmUgPC0gbXNjb3JlNGFzc2F5ZmRyKHMyc19leHAsIEZGVD0wLjcsIGZkcl90YXJnZXQ9MC4wMikKcHJvdF9zY29yZSA8LSBtc2NvcmU0cHJvdGZkcihzMnNfZXhwLCBGRlQ9MC43LCBmZHJfdGFyZ2V0PTAuMDIpCgpmaWx0ZXJlZF9tcyA8LSBmaWx0ZXJfbXNjb3JlKHMyc19leHAsIGNob3Nlbl9tc2NvcmUpCmZpbHRlcmVkX2ZxIDwtIGZpbHRlcl9tc2NvcmVfZnJlcW9icyhzMnNfZXhwLCAwLjAxLCAwLjgsIHJtLmRlY295PUZBTFNFKQpmaWx0ZXJlZF9tc19mZHIgPC0gZmlsdGVyX21zY29yZV9mZHIoZmlsdGVyZWRfbXMsIEZGVD0wLjcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdmVyYWxsX3Byb3RlaW5fZmRyX3RhcmdldD1wcm90X3Njb3JlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBwZXJfb3ZlcmFsbF9wZXB0aWRlX2Zkcl9saW1pdD0wLjA1KQpmaWx0ZXJlZF9tc19mZHJfcHIgPC0gZmlsdGVyX3Byb3Rlb3R5cGljX3BlcHRpZGVzKGZpbHRlcmVkX21zX2ZkcikKZmlsdGVyZWRfbXNfZmRyX3ByX2FsbCA8LSBmaWx0ZXJfYWxsX3BlcHRpZGVzKGZpbHRlcmVkX21zX2Zkcl9wcikKZmlsdGVyZWRfbXNfZmRyX3ByX2FsbF9zdHIgPC0gZmlsdGVyX29uX21heF9wZXB0aWRlcyhkYXRhPWZpbHRlcmVkX21zX2Zkcl9wcl9hbGwsIG5fcGVwdGlkZXM9MTApCmZpbHRlcmVkX2FsbF9maWx0ZXJzIDwtIGZpbHRlcl9vbl9taW5fcGVwdGlkZXMoZGF0YT1maWx0ZXJlZF9tc19mZHJfcHJfYWxsX3N0ciwgbl9wZXB0aWRlcz0zKQoKbWF0cml4X3ByZWZpeCA8LSBmaWxlLnBhdGgoInJlc3VsdHMiLCAic3dhdGgyc3RhdHMiLCB2ZXIpCmlmICghZmlsZS5leGlzdHMobWF0cml4X3ByZWZpeCkpIHsKICBkaXIuY3JlYXRlKG1hdHJpeF9wcmVmaXgpCn0KcHJvdGVpbl9tYXRyaXhfYWxsIDwtIHdyaXRlX21hdHJpeF9wcm90ZWlucygKICBzMnNfZXhwLCB3cml0ZS5jc3Y9VFJVRSwKICBmaWxlbmFtZT1maWxlLnBhdGgobWF0cml4X3ByZWZpeCwgInByb3RlaW5fYWxsLmNzdiIpKQpkaW0ocHJvdGVpbl9tYXRyaXhfYWxsKQpwcm90ZWluX21hdHJpeF9tc2NvcmUgPC0gd3JpdGVfbWF0cml4X3Byb3RlaW5zKAogIGZpbHRlcmVkX21zLCB3cml0ZS5jc3Y9VFJVRSwKICBmaWxlbmFtZT1maWxlLnBhdGgobWF0cml4X3ByZWZpeCwgInByb3RlaW5fbWF0cml4X21zY29yZS5jc3YiKSkKZGltKHByb3RlaW5fbWF0cml4X21zY29yZSkKcGVwdGlkZV9tYXRyaXhfbXNjb3JlIDwtIHdyaXRlX21hdHJpeF9wZXB0aWRlcygKICBmaWx0ZXJlZF9tcywgd3JpdGUuY3N2PVRSVUUsCiAgZmlsZW5hbWU9ZmlsZS5wYXRoKG1hdHJpeF9wcmVmaXgsICJwZXB0aWRlX21hdHJpeF9tc2NvcmUuY3N2IikpCmRpbShwZXB0aWRlX21hdHJpeF9tc2NvcmUpCnByb3RlaW5fbWF0cml4X2ZpbHRlcmVkIDwtIHdyaXRlX21hdHJpeF9wcm90ZWlucygKICBmaWx0ZXJlZF9hbGxfZmlsdGVycywgd3JpdGUuY3N2PVRSVUUsCiAgZmlsZW5hbWU9ZmlsZS5wYXRoKG1hdHJpeF9wcmVmaXgsICJwcm90ZWluX21hdHJpeF9maWx0ZXJlZC5jc3YiKSkKZGltKHByb3RlaW5fbWF0cml4X2ZpbHRlcmVkKQpwZXB0aWRlX21hdHJpeF9maWx0ZXJlZCA8LSB3cml0ZV9tYXRyaXhfcGVwdGlkZXMoCiAgZmlsdGVyZWRfYWxsX2ZpbHRlcnMsIHdyaXRlLmNzdj1UUlVFLAogIGZpbGVuYW1lPWZpbGUucGF0aChtYXRyaXhfcHJlZml4LCAicGVwdGlkZV9tYXRyaXhfZmlsdGVyZWQuY3N2IikpCmRpbShwZXB0aWRlX21hdHJpeF9maWx0ZXJlZCkKYGBgCgpgYGB7ciB0Yl9leHB0LCBmaWcuc2hvdz0iaGlkZSJ9CmludGVuc2l0aWVzIDwtIHByb3RlaW5fbWF0cml4X2ZpbHRlcmVkCmNvbHMgPC0gZ3N1Yih4PWNvbG5hbWVzKGludGVuc2l0aWVzKSwgcGF0dGVybj0iXi4qKDIwMTguKiQpIiwgcmVwbGFjZW1lbnQ9InNcXDEiKQpjb2xzW1sxXV0gPC0gIlByb3RlaW4iCmNvbG5hbWVzKGludGVuc2l0aWVzKSA8LSBjb2xzCnJvd25hbWVzKGludGVuc2l0aWVzKSA8LSBpbnRlbnNpdGllc1tbIlByb3RlaW4iXV0KaW50ZW5zaXRpZXNbWyJQcm90ZWluIl1dIDwtIE5VTEwKCiMjIENoZWNrIHRoZSBzYW1wbGUgbmFtZXMgb2YgdGhlIGludGVuc2l0eSBtYXRyaXggYW5kIHNhbXBsZSBhbm5vdGF0aW9ucy4KY29sbmFtZXMoaW50ZW5zaXRpZXMpICVpbiUgcm93bmFtZXMoc2FtcGxlX2Fubm90KQpyb3duYW1lcyhzYW1wbGVfYW5ub3QpICVpbiUgY29sbmFtZXMoaW50ZW5zaXRpZXMpCiMjcm93bmFtZXMoc2FtcGxlX2Fubm90KQojI2NvbG5hbWVzKGludGVuc2l0aWVzKQoKcmVvcmRlcmVkIDwtIGNvbG5hbWVzKGludGVuc2l0aWVzKQptZXRhZGF0YSA8LSBzYW1wbGVfYW5ub3RbcmVvcmRlcmVkLCBdCnByb3RlaW5fZXhwdCA8LSBjcmVhdGVfZXhwdChzYW1wbGVfYW5ub3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudF9kYXRhZnJhbWU9aW50ZW5zaXRpZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lX2luZm89bXRiX2Fubm90YXRpb25zKQoKcHJvdGVpbl9ub3JtIDwtIG5vcm1hbGl6ZV9leHB0KHByb3RlaW5fZXhwdCwgdHJhbnNmb3JtPSJsb2cyIiwgY29udmVydD0iY3BtIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcj1UUlVFLCBub3JtPSJxdWFudCIpCmhwZ2x0b29sczo6cGxvdF9wY2EocHJvdGVpbl9ub3JtKSRwbG90Cgpwcm90ZWluX3N1YiA8LSBzdWJzZXRfZXhwdChwcm90ZWluX25vcm0sIHN1YnNldD0iYmF0Y2ghPSdtYXJjaDIwMTgnIikKcHJvdGVpbl9zdWIgPC0gc3Vic2V0X2V4cHQocHJvdGVpbl9zdWIsIHN1YnNldD0iYmF0Y2ghPSdtYXkyMDE4JyIpCnByb3RlaW5fbm9ybSA8LSBub3JtYWxpemVfZXhwdChwcm90ZWluX3N1YiwgdHJhbnNmb3JtPSJsb2cyIiwgY29udmVydD0iY3BtIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcj1UUlVFLCBub3JtPSJxdWFudCIsIGJhdGNoPSJzdmFzZXEiKQpocGdsdG9vbHM6OnBsb3RfcGNhKHByb3RlaW5fbm9ybSkkcGxvdApgYGAKCgojIFBhc3MgdGhlIGRhdGEgdG8gREVQIGFuZCBzZWUgd2hhdCBoYXBwZW5zLgoKYGBge3IgbWFrZV9zZV9zaGVuYW5pZ2Fuc30KZGV2dG9vbHM6OmxvYWRfYWxsKCJ+L3NjcmF0Y2gvZ2l0L0RFUCIpCnd0ZiA8LSBmdW5jdGlvbiAocHJvdGVpbnNfdW5pcXVlLCBjb2x1bW5zLCBleHBkZXNpZ24pIHsKICBhc3NlcnR0aGF0Ojphc3NlcnRfdGhhdChpcy5kYXRhLmZyYW1lKHByb3RlaW5zX3VuaXF1ZSksIGlzLmludGVnZXIoY29sdW1ucyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgaXMuZGF0YS5mcmFtZShleHBkZXNpZ24pKQogIGlmIChhbnkoIWMoIm5hbWUiLCAiSUQiKSAlaW4lIGNvbG5hbWVzKHByb3RlaW5zX3VuaXF1ZSkpKSB7CiAgICBzdG9wKCInbmFtZScgYW5kL29yICdJRCcgY29sdW1ucyBhcmUgbm90IHByZXNlbnQgaW4gJyIsCiAgICAgICAgIGRlcGFyc2Uoc3Vic3RpdHV0ZShwcm90ZWluc191bmlxdWUpKSwgIicuXG5SdW4gbWFrZV91bmlxdWUoKSB0byBvYnRhaW4gdGhlIHJlcXVpcmVkIGNvbHVtbnMiLAogICAgICAgICBjYWxsLiA9IEZBTFNFKQogIH0KICBpZiAoYW55KCFjKCJsYWJlbCIsICJjb25kaXRpb24iLCAicmVwbGljYXRlIikgJWluJSBjb2xuYW1lcyhleHBkZXNpZ24pKSkgewogICAgc3RvcCgiJ2xhYmVsJywgJ2NvbmRpdGlvbicgYW5kL29yICdyZXBsaWNhdGUnIGNvbHVtbnMiLAogICAgICAgICAiYXJlIG5vdCBwcmVzZW50IGluIHRoZSBleHBlcmltZW50YWwgZGVzaWduIiwgY2FsbC4gPSBGQUxTRSkKICB9CiAgaWYgKGFueSghYXBwbHkocHJvdGVpbnNfdW5pcXVlWywgY29sdW1uc10sIDIsIGlzLm51bWVyaWMpKSkgewogICAgc3RvcCgic3BlY2lmaWVkICdjb2x1bW5zJyBzaG91bGQgYmUgbnVtZXJpYyIsICJcblJ1biBtYWtlX3NlX3BhcnNlKCkgd2l0aCB0aGUgYXBwcm9wcmlhdGUgY29sdW1ucyBhcyBhcmd1bWVudCIsCiAgICAgICAgIGNhbGwuID0gRkFMU0UpCiAgfQogIGlmICh0aWJibGU6OmlzLnRpYmJsZShwcm90ZWluc191bmlxdWUpKQogICAgcHJvdGVpbnNfdW5pcXVlIDwtIGFzLmRhdGEuZnJhbWUocHJvdGVpbnNfdW5pcXVlKQogIGlmICh0aWJibGU6OmlzLnRpYmJsZShleHBkZXNpZ24pKQogICAgZXhwZGVzaWduIDwtIGFzLmRhdGEuZnJhbWUoZXhwZGVzaWduKQogIHJvd25hbWVzKHByb3RlaW5zX3VuaXF1ZSkgPC0gcHJvdGVpbnNfdW5pcXVlJG5hbWUKICByYXcgPC0gcHJvdGVpbnNfdW5pcXVlWywgY29sdW1uc10KICByYXdbcmF3ID09IDBdIDwtIE5BCiAgcmF3IDwtIGxvZzIocmF3KQogIGV4cGRlc2lnbiA8LSBtdXRhdGUoZXhwZGVzaWduLCBjb25kaXRpb24gPSBtYWtlLm5hbWVzKGNvbmRpdGlvbikpCiAgIyMgSSBjaGFuZ2VkIHRoZSBmb2xsb3dpbmcgYmVjYXVzZSBpdCBkaWRuJ3QgbWFrZSBzZW5zZSB0byBtZS4KICBpZiAoaXMubnVsbChleHBkZXNpZ25bWyJJRCJdXSkpIHsKICAgIGV4cGRlc2lnbiA8LSBleHBkZXNpZ24gJT4lCiAgICAgIHRpZHlyOjp1bml0ZShjb25kaXRpb24sIHJlcGxpY2F0ZSwgcmVtb3ZlPUZBTFNFKQogIH0KCiAgcm93bmFtZXMoZXhwZGVzaWduKSA8LSBleHBkZXNpZ24kSUQKICBtYXRjaGVkIDwtIG1hdGNoKG1ha2UubmFtZXMoZGVsZXRlX3ByZWZpeChleHBkZXNpZ24kbGFiZWwpKSwKICAgICAgICAgICAgICAgICAgIG1ha2UubmFtZXMoZGVsZXRlX3ByZWZpeChjb2xuYW1lcyhyYXcpKSkpCiAgaWYgKGFueShpcy5uYShtYXRjaGVkKSkpIHsKICAgIHN0b3AoIk5vbmUgb2YgdGhlIGxhYmVscyBpbiB0aGUgZXhwZXJpbWVudGFsIGRlc2lnbiBtYXRjaCAiLAogICAgICAgICAid2l0aCBjb2x1bW4gbmFtZXMgaW4gJ3Byb3RlaW5zX3VuaXF1ZSciLCAiXG5SdW4gbWFrZV9zZSgpIHdpdGggdGhlIGNvcnJlY3QgbGFiZWxzIGluIHRoZSBleHBlcmltZW50YWwgZGVzaWduIiwKICAgICAgICAgImFuZC9vciBjb3JyZWN0IGNvbHVtbnMgc3BlY2lmaWNhdGlvbiIpCiAgfQogIGNvbG5hbWVzKHJhdylbbWF0Y2hlZF0gPC0gZXhwZGVzaWduJElECiAgcmF3IDwtIHJhd1ssICFpcy5uYShjb2xuYW1lcyhyYXcpKV1bcm93bmFtZXMoZXhwZGVzaWduKV0KICByb3dfZGF0YSA8LSBwcm90ZWluc191bmlxdWVbLCAtY29sdW1uc10KICByb3duYW1lcyhyb3dfZGF0YSkgPC0gcm93X2RhdGEkbmFtZQogIHNlIDwtIFN1bW1hcml6ZWRFeHBlcmltZW50KGFzc2F5cyA9IGFzLm1hdHJpeChyYXcpLCBjb2xEYXRhID0gZXhwZGVzaWduLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvd0RhdGEgPSByb3dfZGF0YSkKICByZXR1cm4oc2UpCn0KYGBgCgpgYGB7ciBzdGFydF9ERVB9CmxpYnJhcnkoREVQKQpsaWJyYXJ5KFN1bW1hcml6ZWRFeHBlcmltZW50KQoKZGVzaWduIDwtIHBEYXRhKHByb3RlaW5fZXhwdCkKZGVzaWduW1sibGFiZWwiXV0gPC0gZGVzaWduW1sic2FtcGxlaWQiXV0KZGVzaWduW1sicmVwbGljYXRlIl1dIDwtIGRlc2lnbltbInNhbXBsZWlkIl1dCgpteV9zZSA8LSBTdW1tYXJpemVkRXhwZXJpbWVudCgKICBhc3NheXM9ZXhwcnMocHJvdGVpbl9leHB0KSwKICBjb2xEYXRhPWRlc2lnbiwKICByb3dEYXRhPWZEYXRhKHByb3RlaW5fZXhwdCkpCgptdGJfdW5pcXVlIDwtIGFzLmRhdGEuZnJhbWUoZXhwcnMocHJvdGVpbl9leHB0KSkKbXRiX3VuaXF1ZVtbIm5hbWUiXV0gPC0gcm93bmFtZXMobXRiX3VuaXF1ZSkKbXRiX3VuaXF1ZVtbIklEIl1dIDwtIHJvd25hbWVzKG10Yl91bmlxdWUpCmludGVuc2l0eV9jb2x1bW5zIDwtIDE6NjAKIyMgbXRiX3NlIDwtIHd0ZihtdGJfdW5pcXVlLCBpbnRlbnNpdHlfY29sdW1ucywgZGVzaWduKQptdGJfc2UgPC0gbWFrZV9zZShtdGJfdW5pcXVlLCBpbnRlbnNpdHlfY29sdW1ucywgZGVzaWduKQoKREVQOjpwbG90X2ZyZXF1ZW5jeShtdGJfc2UpCmRpbShhc3NheShtdGJfc2UpKQptdGJfZmlsdCA8LSBERVA6OmZpbHRlcl9taXNzdmFsKG10Yl9zZSwgdGhyPTIpCmRpbShhc3NheShtdGJfZmlsdCkpCkRFUDo6cGxvdF9udW1iZXJzKG10Yl9zZSkKREVQOjpwbG90X2NvdmVyYWdlKG10Yl9zZSkKCm10Yl9ub3JtIDwtIERFUDo6bm9ybWFsaXplX3ZzbihtdGJfc2UpCkRFUDo6cGxvdF9ub3JtYWxpemF0aW9uKG10Yl9zZSwgbXRiX25vcm0pCgpERVA6OnBsb3RfbWlzc3ZhbChtdGJfc2UpCkRFUDo6cGxvdF9kZXRlY3QobXRiX3NlKQoKbXRiX2ltcCA8LSBERVA6OmltcHV0ZShtdGJfbm9ybSwgZnVuPSJNaW5Qcm9iIiwgcT0wLjAxKQptdGJfaW1wX21hbiA8LSBERVA6OmltcHV0ZShtdGJfbm9ybSwgZnVuPSJtYW4iLCBzaGlmdD0xLjgsIHNjYWxlPTAuMykKREVQOjpwbG90X2ltcHV0YXRpb24obXRiX25vcm0sIG10Yl9pbXApCgptdGJfZGlmZiA8LSBERVA6OnRlc3RfZGlmZihtdGJfaW1wLCB0eXBlPSJhbGwiKQptdGJfZGlmZiA8LSBERVA6OnRlc3RfZGlmZihtdGJfaW1wLCB0eXBlPSJtYW51YWwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0PWMoInd0X2ZpbHRyYXRlX3ZzX3d0X3dob2xlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZWx0YV9maWx0cmF0ZV92c193dF9maWx0cmF0ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29tcF9maWx0cmF0ZV92c193dF9maWx0cmF0ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAid3RfZmlsdHJhdGVfdnNfZGVsdGFfZmlsdHJhdGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInd0X2ZpbHRyYXRlX3ZzX2NvbXBfZmlsdHJhdGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInd0X3dob2xlX3ZzX2RlbHRhX3dob2xlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3dF93aG9sZV92c19jb21wX3dob2xlIikpCgptdGJfZGVwIDwtIERFUDo6YWRkX3JlamVjdGlvbnMobXRiX2RpZmYsIGFscGhhPTAuMDUsIGxmYz0wLjYpCiMjIG10Yl9wY2EgPC0gREVQOjpwbG90X3BjYShtdGJfZGVwKQojIyBUaGUgUENBIHBsb3R0ZXIgcHJvdmlkZWQgYnkgREVQIGhhcyBzb21lIHByb2JsZW1zLgoKREVQOjpwbG90X2NvcihtdGJfZGVwKQpERVA6OnBsb3RfaGVhdG1hcChtdGJfZGVwLCB0eXBlPSJjZW50ZXJlZCIsIGttZWFucz1UUlVFKQpERVA6OnBsb3RfaGVhdG1hcChtdGJfZGVwLCB0eXBlPSJjb250cmFzdCIsIGttZWFucz1UUlVFKQoKREVQOjpwbG90X3ZvbGNhbm8obXRiX2RlcCwgY29udHJhc3Q9Ind0X3dob2xlX3ZzX2RlbHRhX3dob2xlIikKREVQOjpwbG90X3ZvbGNhbm8obXRiX2RlcCwgY29udHJhc3Q9Ind0X2ZpbHRyYXRlX3ZzX2RlbHRhX2ZpbHRyYXRlIikKREVQOjpwbG90X2NvbmQobXRiX2RlcCkKbXRiX3Jlc3VsdCA8LSBERVA6OmdldF9yZXN1bHRzKG10Yl9kZXApCnBsb3Rfc2luZ2xlKG10Yl9kZXAsIHByb3RlaW5zID0gYygiUnYwMjg3IiwgIlJ2MDI4OCIpKQp3cml0dGVuX2RlcCA8LSBocGdsdG9vbHM6OndyaXRlX3hscyhkYXRhPW10Yl9yZXN1bHQsIGV4Y2VsPSJleGNlbC9kZXBfcmVzdWx0Lnhsc3giKQpgYGAKCiMgVGFrZSB0aGUgaW1wdXRlZCBtYXRyaXggaW50byBocGdsdG9vbHMKCmBgYHtyIGhwZ2x0b29sc19pbXB1dGVkfQppbXB1dGVkX210cnggPC0gYXNzYXkobXRiX2ltcCkKY29sbmFtZXMoaW1wdXRlZF9tdHJ4KSA8LSBnc3ViKHg9Y29sbmFtZXMoaW1wdXRlZF9tdHJ4KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdHRlcm49Il4uKigyMDE4LiokKSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsYWNlbWVudD0ic1xcMSIpCmltcHV0ZWRfbXRyeCA8LSAyIF4gaW1wdXRlZF9tdHJ4CmRpbShpbXB1dGVkX210cngpCgpleHByc2V0IDwtIHByb3RlaW5fZXhwdFtbImV4cHJlc3Npb25zZXQiXV0KZXhwcnNldF9yb3dzIDwtIHJvd25hbWVzKGV4cHJzKGV4cHJzZXQpKQppbXB1dGVkX210cnggPC0gaW1wdXRlZF9tdHJ4W2V4cHJzZXRfcm93cywgXQpleHBycyhleHByc2V0KSA8LSBpbXB1dGVkX210cngKcHJvdGVpbl9leHB0W1siZXhwcmVzc2lvbnNldCJdXSA8LSBleHByc2V0CgpteV9ub3JtIDwtIG5vcm1hbGl6ZV9leHB0KHByb3RlaW5fZXhwdCwgZmlsdGVyPVRSVUUsIGNvbnZlcnQ9ImNwbSIsIG5vcm09InF1YW50IiwgdHJhbnNmb3JtPSJsb2cyIikKbXlfcGNhIDwtIGhwZ2x0b29sczo6cGxvdF9wY2EobXlfbm9ybSkKbXlfcGNhJHBsb3QKYGBgCgoKIyBNaW5vciBjaGFuZ2UgdG8gcGxvdF9taXNzdmFsCgpERVAgaGFzIGEgbmVhdCBmdW5jdGlvbiB0byBwbG90IG1pc3NpbmcgdmFsdWVzLiAgU2FkbHksIGl0IGRvZXMgbm90IHJldHVybiB0aGUKYWN0dWFsIG1hdHJpeCwgb25seSB0aGUgcGxvdC4gIFRoaXMgaXMgbmljZSBhbmQgYWxsLCBidXQgSSBuZWVkIHRoZSBtYXRyaXgsIGVyZ28KdGhpcyBtaW5vciBjaGFuZ2UuCgpgYGB7ciBteV9wbG90X21pc3Npbmd9CmNvdW50X2RlZmluZWQgPC0gZnVuY3Rpb24oc2UpIHsKICBkZiA8LSBhcy5kYXRhLmZyYW1lKGFzc2F5KHNlKSkKICBuYV9pZHggPC0gaXMubmEoZGYpCiAgZGVmaW5lZF9tdHJ4IDwtIGlmZWxzZShpcy5uYShkZiksIDAsIDEpCiAgcmV0dXJuKGRlZmluZWRfbXRyeCkKfQoKZGVmX210cnggPC0gY291bnRfZGVmaW5lZChtdGJfc2UpCnN1bW1hcnkoZGVmX210cngpCmRlZmluZWRfYnlfcHJvdGVpbiA8LSByb3dTdW1zKGRlZl9tdHJ4KQpoZWFkKGRlZmluZWRfYnlfcHJvdGVpbikKZGVmaW5lZF9ieV9zYW1wbGUgPC0gY29sU3VtcyhkZWZfbXRyeCkKZGVmaW5lZF9ieV9zYW1wbGUKYGBgCgoKYGBge3Igc2F2ZW1lfQppZiAoIWlzVFJVRShnZXQwKCJza2lwX2xvYWQiKSkpIHsKICBtZXNzYWdlKHBhc3RlMCgiVGhpcyBpcyBocGdsdG9vbHMgY29tbWl0OiAiLCBnZXRfZ2l0X2NvbW1pdCgpKSkKICB0aGlzX3NhdmUgPC0gcGFzdGUwKGdzdWIocGF0dGVybj0iXFwuUm1kIiwgcmVwbGFjZT0iIiwgeD1ybWRfZmlsZSksICItdiIsIHZlciwgIi5yZGEueHoiKQogIG1lc3NhZ2UocGFzdGUwKCJTYXZpbmcgdG8gIiwgdGhpc19zYXZlKSkKICB0bXAgPC0gc20oc2F2ZW1lKGZpbGVuYW1lPXRoaXNfc2F2ZSkpCiAgcGFuZGVyOjpwYW5kZXIoc2Vzc2lvbkluZm8oKSkKfQpgYGAKCmBgYHtyIGxvYWRtZSwgZXZhbD1GQUxTRX0KdG1wIDwtIGxvYWRtZShmaWxlbmFtZT10aGlzX3NhdmUpCmBgYAo=