1 OpenSwathWorkflow against the Tuberculist transitions

The following invocations of OpenMS/pyprophet/tric are included in:

dia_invocation_20180913.sh

This script includes the process for generating a local, comet-based transition library from DDA samples generated locally as well as the steps used when processing the downloaded transition libraries.

2 Gathering parameters

In this first block, I will set a couple of variables and source a file containing the parameters for the rest of the script.

3 Plotting metrics of the raw data

The raw data files provide opportunities to make sure that the later invocations of openMS/etc will actually work; for example, if there are too few transitions observed here, one should not be surprised if pyprophet and tric fail later.

sampleid TubeID tubelabel FigureReplicate Figure.Name Sample.Description Bio.Replicate LC.Run MS.Run Technical.Replicate Replicate.State rep run expt_id Genotype Collection.Type Condition batch windowsize enzyme harvestdate prepdate rundate runinfo rawfile Filename mzmlfile dia_scored tuberculist_scored include_exclude Run_note
2019_0709Briken01 6.24.19–4 WT H37Rv Culture Filtrate NA NA NA b20190610 l20190709 m20190709 t20190709 NA a 2019_0709Briken01 NA NA NA wt_cf early 8mz NA NA NA NA NA preprocessing/00_raw/2019_0709Briken01.raw preprocessing/01mzXML/dia/20190718/2019_0709Briken01.mzXML preprocessing/01mzML/dia/20190718/2019_0709Briken01.mzML preprocessing/08pyprophet/20190718/whole_8mz_tuberculist/2019_0709Briken01_vs_20190718_whole_HCD_dia_scored.tsv NA NA NA
2019_0709Briken02 6.24.19–5 H37Rv ΔEsx-5A; Culture Filtrate NA NA NA b20190610 l20190709 m20190709 t20190709 NA a 2019_0709Briken02 NA NA NA dt_cf early 8mz NA NA NA NA NA preprocessing/00_raw/2019_0709Briken02.raw preprocessing/01mzXML/dia/20190718/2019_0709Briken02.mzXML preprocessing/01mzML/dia/20190718/2019_0709Briken02.mzML preprocessing/08pyprophet/20190718/whole_8mz_tuberculist/2019_0709Briken02_vs_20190718_whole_HCD_dia_scored.tsv NA NA NA
2019_0709Briken03 6.24.19–6 H37Rv ΔEsx-5A Complement; Culture Filtrate NA NA NA b20190610 l20190709 m20190709 t20190709 NA a 2019_0709Briken03 NA NA NA cp_cf early 8mz NA NA NA NA NA preprocessing/00_raw/2019_0709Briken03.raw preprocessing/01mzXML/dia/20190718/2019_0709Briken03.mzXML preprocessing/01mzML/dia/20190718/2019_0709Briken03.mzML preprocessing/08pyprophet/20190718/whole_8mz_tuberculist/2019_0709Briken03_vs_20190718_whole_HCD_dia_scored.tsv NA NA NA
2019_0709Briken04 6.24.19–10 WT H37Rv Culture Filtrate NA NA NA b20190610 l20190709 m20190709 t20190709 NA a 2019_0709Briken04 NA NA NA wt_cf early 8mz NA NA NA NA NA preprocessing/00_raw/2019_0709Briken04.raw preprocessing/01mzXML/dia/20190718/2019_0709Briken04.mzXML preprocessing/01mzML/dia/20190718/2019_0709Briken04.mzML preprocessing/08pyprophet/20190718/whole_8mz_tuberculist/2019_0709Briken04_vs_20190718_whole_HCD_dia_scored.tsv NA NA NA
2019_0709Briken05 6.24.19–11 H37Rv ΔEsx-5A; Culture Filtrate NA NA NA b20190610 l20190709 m20190709 t20190709 NA a 2019_0709Briken05 NA NA NA dt_cf early 8mz NA NA NA NA NA preprocessing/00_raw/2019_0709Briken05.raw preprocessing/01mzXML/dia/20190718/2019_0709Briken05.mzXML preprocessing/01mzML/dia/20190718/2019_0709Briken05.mzML preprocessing/08pyprophet/20190718/whole_8mz_tuberculist/2019_0709Briken05_vs_20190718_whole_HCD_dia_scored.tsv NA NA NA
2019_0709Briken06 6.24.19–12 H37Rv ΔEsx-5A Complement; Culture Filtrate NA NA NA b20190610 l20190709 m20190709 t20190709 NA a 2019_0709Briken06 NA NA NA cp_cf early 8mz NA NA NA NA NA preprocessing/00_raw/2019_0709Briken06.raw preprocessing/01mzXML/dia/20190718/2019_0709Briken06.mzXML preprocessing/01mzML/dia/20190718/2019_0709Briken06.mzML preprocessing/08pyprophet/20190718/whole_8mz_tuberculist/2019_0709Briken06_vs_20190718_whole_HCD_dia_scored.tsv NA NA NA
2019_0709Briken07 6.24.19–16 WT H37Rv Culture Filtrate NA NA NA b20190610 l20190709 m20190709 t20190709 NA a 2019_0709Briken07 NA NA NA wt_cf early 8mz NA NA NA NA NA preprocessing/00_raw/2019_0709Briken07.raw preprocessing/01mzXML/dia/20190718/2019_0709Briken07.mzXML preprocessing/01mzML/dia/20190718/2019_0709Briken07.mzML preprocessing/08pyprophet/20190718/whole_8mz_tuberculist/2019_0709Briken07_vs_20190718_whole_HCD_dia_scored.tsv NA NA NA
2019_0709Briken08 6.24.19–17 H37Rv ΔEsx-5A; Culture Filtrate NA NA NA b20190610 l20190709 m20190709 t20190709 NA a 2019_0709Briken08 NA NA NA dt_cf early 8mz NA NA NA NA NA preprocessing/00_raw/2019_0709Briken08.raw preprocessing/01mzXML/dia/20190718/2019_0709Briken08.mzXML preprocessing/01mzML/dia/20190718/2019_0709Briken08.mzML preprocessing/08pyprophet/20190718/whole_8mz_tuberculist/2019_0709Briken08_vs_20190718_whole_HCD_dia_scored.tsv NA NA NA
2019_0709Briken09 6.24.19–18 H37Rv ΔEsx-5A Complement; Culture Filtrate NA NA NA b20190610 l20190709 m20190709 t20190709 NA a 2019_0709Briken09 NA NA NA cp_cf early 8mz NA NA NA NA NA preprocessing/00_raw/2019_0709Briken09.raw preprocessing/01mzXML/dia/20190718/2019_0709Briken09.mzXML preprocessing/01mzML/dia/20190718/2019_0709Briken09.mzML preprocessing/08pyprophet/20190718/whole_8mz_tuberculist/2019_0709Briken09_vs_20190718_whole_HCD_dia_scored.tsv NA NA NA
2019_0709Briken10 6.24.19–22 WT H37Rv Culture Filtrate NA NA NA b20190610 l20190709 m20190709 t20190709 NA a 2019_0709Briken10 NA NA NA wt_cf late 8mz NA NA NA NA NA preprocessing/00_raw/2019_0709Briken10.raw preprocessing/01mzXML/dia/20190718/2019_0709Briken10.mzXML preprocessing/01mzML/dia/20190718/2019_0709Briken10.mzML preprocessing/08pyprophet/20190718/whole_8mz_tuberculist/2019_0709Briken10_vs_20190718_whole_HCD_dia_scored.tsv NA NA NA
2019_0709Briken11 6.24.19–23 H37Rv ΔEsx-5A; Culture Filtrate NA NA NA b20190610 l20190709 m20190709 t20190709 NA a 2019_0709Briken11 NA NA NA dt_cf late 8mz NA NA NA NA NA preprocessing/00_raw/2019_0709Briken11.raw preprocessing/01mzXML/dia/20190718/2019_0709Briken11.mzXML preprocessing/01mzML/dia/20190718/2019_0709Briken11.mzML preprocessing/08pyprophet/20190718/whole_8mz_tuberculist/2019_0709Briken11_vs_20190718_whole_HCD_dia_scored.tsv NA NA NA
2019_0709Briken12 6.24.19–24 H37Rv ΔEsx-5A Complement; Culture Filtrate NA NA NA b20190610 l20190709 m20190709 t20190709 NA a 2019_0709Briken12 NA NA NA cp_cf late 8mz NA NA NA NA NA preprocessing/00_raw/2019_0709Briken12.raw preprocessing/01mzXML/dia/20190718/2019_0709Briken12.mzXML preprocessing/01mzML/dia/20190718/2019_0709Briken12.mzML preprocessing/08pyprophet/20190718/whole_8mz_tuberculist/2019_0709Briken12_vs_20190718_whole_HCD_dia_scored.tsv NA NA NA
2019_0709Briken13 6.24.19–28 WT H37Rv Culture Filtrate NA NA NA b20190610 l20190709 m20190709 t20190709 NA a 2019_0709Briken13 NA NA NA wt_cf late 8mz NA NA NA NA NA preprocessing/00_raw/2019_0709Briken13.raw preprocessing/01mzXML/dia/20190718/2019_0709Briken13.mzXML preprocessing/01mzML/dia/20190718/2019_0709Briken13.mzML preprocessing/08pyprophet/20190718/whole_8mz_tuberculist/2019_0709Briken13_vs_20190718_whole_HCD_dia_scored.tsv NA NA NA
2019_0709Briken14 6.24.19–29 H37Rv ΔEsx-5A; Culture Filtrate NA NA NA b20190610 l20190709 m20190709 t20190709 NA a 2019_0709Briken14 NA NA NA dt_cf late 8mz NA NA NA NA NA preprocessing/00_raw/2019_0709Briken14.raw preprocessing/01mzXML/dia/20190718/2019_0709Briken14.mzXML preprocessing/01mzML/dia/20190718/2019_0709Briken14.mzML preprocessing/08pyprophet/20190718/whole_8mz_tuberculist/2019_0709Briken14_vs_20190718_whole_HCD_dia_scored.tsv NA NA NA
2019_0709Briken15 6.24.19–30 H37Rv ΔEsx-5A Complement; Culture Filtrate NA NA NA b20190610 l20190709 m20190709 t20190709 NA a 2019_0709Briken15 NA NA NA cp_cf late 8mz NA NA NA NA NA preprocessing/00_raw/2019_0709Briken15.raw preprocessing/01mzXML/dia/20190718/2019_0709Briken15.mzXML preprocessing/01mzML/dia/20190718/2019_0709Briken15.mzML preprocessing/08pyprophet/20190718/whole_8mz_tuberculist/2019_0709Briken15_vs_20190718_whole_HCD_dia_scored.tsv NA NA NA
2019_0709Briken16 6.24.19–34 WT H37Rv Culture Filtrate NA NA NA b20190610 l20190709 m20190709 t20190709 NA a 2019_0709Briken16 NA NA NA wt_cf late 8mz NA NA NA NA NA preprocessing/00_raw/2019_0709Briken16.raw preprocessing/01mzXML/dia/20190718/2019_0709Briken16.mzXML preprocessing/01mzML/dia/20190718/2019_0709Briken16.mzML preprocessing/08pyprophet/20190718/whole_8mz_tuberculist/2019_0709Briken16_vs_20190718_whole_HCD_dia_scored.tsv NA NA NA
2019_0709Briken17 6.24.19–35 H37Rv ΔEsx-5A; Culture Filtrate NA NA NA b20190610 l20190709 m20190709 t20190709 NA a 2019_0709Briken17 NA NA NA dt_cf late 8mz NA NA NA NA NA preprocessing/00_raw/2019_0709Briken17.raw preprocessing/01mzXML/dia/20190718/2019_0709Briken17.mzXML preprocessing/01mzML/dia/20190718/2019_0709Briken17.mzML preprocessing/08pyprophet/20190718/whole_8mz_tuberculist/2019_0709Briken17_vs_20190718_whole_HCD_dia_scored.tsv NA NA NA
2019_0709Briken18 6.24.19–36 H37Rv ΔEsx-5A Complement; Culture Filtrate NA NA NA b20190610 l20190709 m20190709 t20190709 NA a 2019_0709Briken18 NA NA NA cp_cf late 8mz NA NA NA NA NA preprocessing/00_raw/2019_0709Briken18.raw preprocessing/01mzXML/dia/20190718/2019_0709Briken18.mzXML preprocessing/01mzML/dia/20190718/2019_0709Briken18.mzML preprocessing/08pyprophet/20190718/whole_8mz_tuberculist/2019_0709Briken18_vs_20190718_whole_HCD_dia_scored.tsv NA NA NA
## Adding 2019_0709Briken01
## Adding 2019_0709Briken02
## Adding 2019_0709Briken03
## Adding 2019_0709Briken04
## Adding 2019_0709Briken05
## Adding 2019_0709Briken06
## Adding 2019_0709Briken07
## Adding 2019_0709Briken08
## Adding 2019_0709Briken09
## Adding 2019_0709Briken10
## Adding 2019_0709Briken11
## Adding 2019_0709Briken12
## Adding 2019_0709Briken13
## Adding 2019_0709Briken14
## Adding 2019_0709Briken15
## Adding 2019_0709Briken16
## Adding 2019_0709Briken17
## Adding 2019_0709Briken18
## This data will benefit from being displayed on the log scale.
## If this is not desired, set scale='raw'
## Some entries are 0.  We are on log scale, adding 1 to the data.
## Changed 86349 zero count features.
## Writing the image to: images/20180913_dia_mzxml_intensities-v20190718.png and calling dev.off().

## Adding 2019_0709Briken01
## Adding 2019_0709Briken02
## Adding 2019_0709Briken03
## Adding 2019_0709Briken04
## Adding 2019_0709Briken05
## Adding 2019_0709Briken06
## Adding 2019_0709Briken07
## Adding 2019_0709Briken08
## Adding 2019_0709Briken09
## Adding 2019_0709Briken10
## Adding 2019_0709Briken11
## Adding 2019_0709Briken12
## Adding 2019_0709Briken13
## Adding 2019_0709Briken14
## Adding 2019_0709Briken15
## Adding 2019_0709Briken16
## Adding 2019_0709Briken17
## Adding 2019_0709Briken18
## Writing the image to: images/20180913_dia_mzxml_retention-v20190718.png and calling dev.off().

## Adding 2019_0709Briken01
## Adding 2019_0709Briken02
## Adding 2019_0709Briken03
## Adding 2019_0709Briken04
## Adding 2019_0709Briken05
## Adding 2019_0709Briken06
## Adding 2019_0709Briken07
## Adding 2019_0709Briken08
## Adding 2019_0709Briken09
## Adding 2019_0709Briken10
## Adding 2019_0709Briken11
## Adding 2019_0709Briken12
## Adding 2019_0709Briken13
## Adding 2019_0709Briken14
## Adding 2019_0709Briken15
## Adding 2019_0709Briken16
## Adding 2019_0709Briken17
## Adding 2019_0709Briken18
## Writing the image to: images/20180913_dia_mzxml_mzbase-v20190718.png and calling dev.off().

## Adding 2019_0709Briken01
## Adding 2019_0709Briken02
## Adding 2019_0709Briken03
## Adding 2019_0709Briken04
## Adding 2019_0709Briken05
## Adding 2019_0709Briken06
## Adding 2019_0709Briken07
## Adding 2019_0709Briken08
## Adding 2019_0709Briken09
## Adding 2019_0709Briken10
## Adding 2019_0709Briken11
## Adding 2019_0709Briken12
## Adding 2019_0709Briken13
## Adding 2019_0709Briken14
## Adding 2019_0709Briken15
## Adding 2019_0709Briken16
## Adding 2019_0709Briken17
## Adding 2019_0709Briken18
## Writing the image to: images/20180913_dia_mzxml_scanintensity-v20190718.png and calling dev.off().

5 OpenSwathWorkflow invocation

block 16 contains the commands used to run openswathworkflow and pyprophet. Those are repeated here in order to test them interactively when needed.

echo "Invoking the OpenSwathWorkflow using the tuberculist transitions."
base_mzxmldir="preprocessing/01mzXML/dia/${VERSION}"
swath_inputs=$(/bin/ls "${base_mzxmldir}")
echo "Checking in, the inputs are: ${swath_inputs}"
mkdir -p "${TUBERCULIST_OUTDIR}"
pypdir="${PYPROPHET_OUTDIR}_tuberculist"
echo "Creating pyprophet output directory: ${pypdir}."
mkdir -p "${pypdir}"
for input in ${swath_inputs}
do
    in_mzxml="${base_mzxmldir}/${input}"
    name=$(basename "${input}" .mzXML)
    echo "Starting openswath run of ${name} using ${MZ_WINDOWS} windows at $(date)."
    tb_output_prefix="${TUBERCULIST_OUTDIR}/${name}_vs_${VERSION}_${TYPE}_${DDA_METHOD}_dia"
    pyprophet_output_prefix="${pypdir}/${name}_vs_${VERSION}_${TYPE}_${DDA_METHOD}_dia"
    echo "Deleting previous swath output file: ${tb_output_prefix}.osw"
    rm -f "${tb_output_prefix}.osw"
    OpenSwathWorkflow \
        -force \
        -ini "parameters/openms_${VERSION}.ini" \
        -in "${in_mzxml}" \
        -swath_windows_file "windows/openswath_${name}.txt" \
        -tr "${TUBERCULIST_PQP}" \
        -out_osw "${tb_output_prefix}.osw" \
        2>"${tb_output_prefix}_osw.log" 1>&2
    if [[ "$?" -ne "0" ]]; then
        echo "OpenSwathWorkflow for ${name} failed."
    fi

    rm -f "${tb_output_prefix}_scored.osw"
    echo "Scoring individual swath run: ${tb_output_prefix}"
    pyprophet \
        score \
        --in "${tb_output_prefix}.osw" \
        --out "${pyprophet_output_prefix}_scored.osw" \
    2>>"${pyprophet_output_prefix}_pyprophet_all.log" 1>&2
    rm -f "${pyprophet_output_prefix}_scored.tsv"
    echo "Exporting individual swath run: to ${pyprophet_output_prefix}_scored.tsv"
    pyprophet \
        export \
        --in "${pyprophet_output_prefix}_scored.osw" \
        --out "${pyprophet_output_prefix}_scored.tsv" \
        2>>"${pyprophet_output_prefix}_pyprophet_export.log" 1>&2
    ## ok something is fubar, the stupid tsv files are being written in the cwd as run_filename.tsv
    ## No matter what I do!
    mv "${input}.tsv" "${pyprophet_output_prefix}_scored.tsv"
    if [[ "$?" -ne "0" ]]; then
        echo "Exporting ${pyprophet_output_prefix}_scored.tsv failed."
    fi
done

6 Merging the Tuberculist-derived data with TRIC

Finally, block 17 of the invocation script provides the command used to make the final, feature-aligned data which is used by SWATH2stats and friends. In addition, it generates a matrix of intensities by sample and some metadata. Once again, it is copy/pasted here to allow interactive testing.

7 Index version: 20190718

8 TODO

## If you wish to reproduce this exact build of hpgltools, invoke the following:
## > git clone http://github.com/abelew/hpgltools.git
## > git reset 083922869a37724ece10beed7b0bb758a179fdfb
## This is hpgltools commit: Thu Oct 17 11:43:00 2019 -0400: 083922869a37724ece10beed7b0bb758a179fdfb
## Saving to 02_preprocessing-v20190718-v20190718.rda.xz

R version 3.6.1 (2019-07-05)

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

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

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

other attached packages: hpgltools(v.1.0), Biobase(v.2.45.1) and BiocGenerics(v.0.31.6)

loaded via a namespace (and not attached): backports(v.1.1.5), fastmatch(v.1.1-0), BiocFileCache(v.1.9.1), plyr(v.1.8.4), igraph(v.1.2.4.1), lazyeval(v.0.2.2), splines(v.3.6.1), BiocParallel(v.1.19.3), usethis(v.1.5.1), GenomeInfoDb(v.1.21.2), ggplot2(v.3.2.1), urltools(v.1.7.3), sva(v.3.33.1), digest(v.0.6.21), foreach(v.1.4.7), htmltools(v.0.4.0), GOSemSim(v.2.11.0), viridis(v.0.5.1), GO.db(v.3.8.2), gdata(v.2.18.0), magrittr(v.1.5), memoise(v.1.1.0), doParallel(v.1.0.15), openxlsx(v.4.1.0.1), limma(v.3.41.18), remotes(v.2.1.0), graphlayouts(v.0.5.0), Biostrings(v.2.53.2), annotate(v.1.63.0), matrixStats(v.0.55.0), askpass(v.1.1), enrichplot(v.1.5.2), prettyunits(v.1.0.2), colorspace(v.1.4-1), blob(v.1.2.0), rappdirs(v.0.3.1), ggrepel(v.0.8.1), xfun(v.0.10), dplyr(v.0.8.3), jsonlite(v.1.6), callr(v.3.3.2), crayon(v.1.3.4), RCurl(v.1.95-4.12), genefilter(v.1.67.1), lme4(v.1.1-21), zeallot(v.0.1.0), survival(v.2.44-1.1), iterators(v.1.0.12), glue(v.1.3.1), polyclip(v.1.10-0), gtable(v.0.3.0), zlibbioc(v.1.31.0), XVector(v.0.25.0), DelayedArray(v.0.11.8), pkgbuild(v.1.0.6), scales(v.1.0.0), DOSE(v.3.11.2), DBI(v.1.0.0), Rcpp(v.1.0.2), viridisLite(v.0.3.0), xtable(v.1.8-4), progress(v.1.2.2), gridGraphics(v.0.4-1), europepmc(v.0.3), bit(v.1.1-14), stats4(v.3.6.1), httr(v.1.4.1), fgsea(v.1.11.1), RColorBrewer(v.1.1-2), gplots(v.3.0.1.1), ellipsis(v.0.3.0), pkgconfig(v.2.0.3), XML(v.3.98-1.20), farver(v.1.1.0), dbplyr(v.1.4.2), ggplotify(v.0.0.4), tidyselect(v.0.2.5), rlang(v.0.4.0), reshape2(v.1.4.3), AnnotationDbi(v.1.47.1), munsell(v.0.5.0), tools(v.3.6.1), cli(v.1.1.0), RSQLite(v.2.1.2), ggridges(v.0.5.1), devtools(v.2.2.1), evaluate(v.0.14), stringr(v.1.4.0), yaml(v.2.2.0), processx(v.3.4.1), knitr(v.1.25), bit64(v.0.9-7), fs(v.1.3.1), tidygraph(v.1.1.2), pander(v.0.6.3), zip(v.2.0.4), caTools(v.1.17.1.2), purrr(v.0.3.2), ggraph(v.2.0.0), nlme(v.3.1-141), xml2(v.1.2.2), DO.db(v.2.9), biomaRt(v.2.41.9), compiler(v.3.6.1), pbkrtest(v.0.4-7), rstudioapi(v.0.10), curl(v.4.2), variancePartition(v.1.15.8), testthat(v.2.2.1), tibble(v.2.1.3), tweenr(v.1.0.1), stringi(v.1.4.3), highr(v.0.8), ps(v.1.3.0), GenomicFeatures(v.1.37.4), desc(v.1.2.0), lattice(v.0.20-38), Matrix(v.1.2-17), nloptr(v.1.2.1), vctrs(v.0.2.0), pillar(v.1.4.2), lifecycle(v.0.1.0), BiocManager(v.1.30.8), triebeard(v.0.3.0), cowplot(v.1.0.0), data.table(v.1.12.4), bitops(v.1.0-6), rtracklayer(v.1.45.6), GenomicRanges(v.1.37.17), qvalue(v.2.17.0), colorRamps(v.2.3), R6(v.2.4.0), KernSmooth(v.2.23-16), gridExtra(v.2.3), IRanges(v.2.19.17), sessioninfo(v.1.1.1), codetools(v.0.2-16), boot(v.1.3-23), MASS(v.7.3-51.4), gtools(v.3.8.1), assertthat(v.0.2.1), pkgload(v.1.0.2), SummarizedExperiment(v.1.15.9), openssl(v.1.4.1), rprojroot(v.1.3-2), withr(v.2.1.2), GenomicAlignments(v.1.21.7), Rsamtools(v.2.1.7), S4Vectors(v.0.23.25), GenomeInfoDbData(v.1.2.1), mgcv(v.1.8-29), hms(v.0.5.1), clusterProfiler(v.3.13.0), grid(v.3.6.1), tidyr(v.1.0.0), minqa(v.1.2.4), rvcheck(v.0.1.5), rmarkdown(v.1.16), ggforce(v.0.3.1) and base64enc(v.0.1-3)

LS0tCnRpdGxlOiAiTS50dWJlcmN1bG9zaXMgMjAxODA5MTM6IFByZXByb2Nlc3NpbmcgRElBIGRhdGEgd2l0aCB0d28gbGlicmFyaWVzLiIKYXV0aG9yOiAiYXRiIGFiZWxld0BnbWFpbC5jb20iCmRhdGU6ICJgciBTeXMuRGF0ZSgpYCIKb3V0cHV0OgogIHJtZGZvcm1hdHM6OnJlYWR0aGVkb3duOgogICAgY29kZV9kb3dubG9hZDogdHJ1ZQogICAgY29kZV9mb2xkaW5nOiBzaG93CiAgICBkZl9wcmludDogcGFnZWQKICAgIGZpZ19jYXB0aW9uOiB0cnVlCiAgICBmaWdfaGVpZ2h0OiA3CiAgICBmaWdfd2lkdGg6IDcKICAgIGhpZ2hsaWdodDogdGFuZ28KICAgIHdpZHRoOiAzMDAKICAgIGtlZXBfbWQ6IGZhbHNlCiAgICBtb2RlOiBzZWxmY29udGFpbmVkCiAgICB0b2NfZmxvYXQ6IHRydWUKICBCaW9jU3R5bGU6Omh0bWxfZG9jdW1lbnQ6CiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlCiAgICBjb2RlX2ZvbGRpbmc6IHNob3cKICAgIGZpZ19jYXB0aW9uOiB0cnVlCiAgICBmaWdfaGVpZ2h0OiA3CiAgICBmaWdfd2lkdGg6IDcKICAgIGhpZ2hsaWdodDogdGFuZ28KICAgIGtlZXBfbWQ6IGZhbHNlCiAgICBtb2RlOiBzZWxmY29udGFpbmVkCiAgICB0b2NfZmxvYXQ6IHRydWUKICBodG1sX2RvY3VtZW50OgogICAgY29kZV9kb3dubG9hZDogdHJ1ZQogICAgY29kZV9mb2xkaW5nOiBzaG93CiAgICBmaWdfY2FwdGlvbjogdHJ1ZQogICAgZmlnX2hlaWdodDogNwogICAgZmlnX3dpZHRoOiA3CiAgICBoaWdobGlnaHQ6IHRhbmdvCiAgICBrZWVwX21kOiBmYWxzZQogICAgbW9kZTogc2VsZmNvbnRhaW5lZAogICAgbnVtYmVyX3NlY3Rpb25zOiB0cnVlCiAgICBzZWxmX2NvbnRhaW5lZDogdHJ1ZQogICAgdGhlbWU6IHJlYWRhYmxlCiAgICB0b2M6IHRydWUKICAgIHRvY19mbG9hdDoKICAgICAgY29sbGFwc2VkOiBmYWxzZQogICAgICBzbW9vdGhfc2Nyb2xsOiBmYWxzZQotLS0KCjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CmJvZHksIHRkIHsKICBmb250LXNpemU6IDE2cHg7Cn0KY29kZS5yewogIGZvbnQtc2l6ZTogMTZweDsKfQpwcmUgewogZm9udC1zaXplOiAxNnB4Cn0KPC9zdHlsZT4KCmBgYHtyIG9wdGlvbnMsIGluY2x1ZGU9RkFMU0V9CmxpYnJhcnkoImhwZ2x0b29scyIpCnR0IDwtIGRldnRvb2xzOjpsb2FkX2FsbCgifi9ocGdsdG9vbHMiKQprbml0cjo6b3B0c19rbml0JHNldCh3aWR0aD0xMjAsCiAgICAgICAgICAgICAgICAgICAgIHByb2dyZXNzPVRSVUUsCiAgICAgICAgICAgICAgICAgICAgIHZlcmJvc2U9VFJVRSwKICAgICAgICAgICAgICAgICAgICAgZWNobz1UUlVFKQprbml0cjo6b3B0c19jaHVuayRzZXQoZXJyb3I9VFJVRSwKICAgICAgICAgICAgICAgICAgICAgIGRwaT05NikKb2xkX29wdGlvbnMgPC0gb3B0aW9ucyhkaWdpdHM9NCwKICAgICAgICAgICAgICAgICAgICAgICBtYXgucHJpbnQ9MTIwLAogICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ3NBc0ZhY3RvcnM9RkFMU0UsCiAgICAgICAgICAgICAgICAgICAgICAga25pdHIuZHVwbGljYXRlLmxhYmVsPSJhbGxvdyIpCmdncGxvdDI6OnRoZW1lX3NldChnZ3Bsb3QyOjp0aGVtZV9idyhiYXNlX3NpemU9MTApKQp2ZXIgPC0gIjIwMTkwNzE4IgpwcmV2aW91c19maWxlIDwtICIwMV9hbm5vdGF0aW9uXzIwMTgwOTEzLlJtZCIKCnRtcCA8LSB0cnkoc20obG9hZG1lKGZpbGVuYW1lPXBhc3RlMChnc3ViKHBhdHRlcm49IlxcLlJtZCIsIHJlcGxhY2U9IiIsIHg9cHJldmlvdXNfZmlsZSksICItdiIsIHZlciwgIi5yZGEueHoiKSkpKQpybWRfZmlsZSA8LSBnbHVlOjpnbHVlKCIwMl9wcmVwcm9jZXNzaW5nLXZ7dmVyfS5SbWQiKQpgYGAKCiMgT3BlblN3YXRoV29ya2Zsb3cgYWdhaW5zdCB0aGUgVHViZXJjdWxpc3QgdHJhbnNpdGlvbnMKClRoZSBmb2xsb3dpbmcgaW52b2NhdGlvbnMgb2YgT3Blbk1TL3B5cHJvcGhldC90cmljIGFyZSBpbmNsdWRlZCBpbjoKCltkaWFfaW52b2NhdGlvbl8yMDE4MDkxMy5zaF0oZGlhX2ludm9jYXRpb25fMjAxODA5MTMuc2gpCgpUaGlzIHNjcmlwdCBpbmNsdWRlcyB0aGUgcHJvY2VzcyBmb3IgZ2VuZXJhdGluZyBhIGxvY2FsLCBjb21ldC1iYXNlZCB0cmFuc2l0aW9uCmxpYnJhcnkgZnJvbSBEREEgc2FtcGxlcyBnZW5lcmF0ZWQgbG9jYWxseSBhcyB3ZWxsIGFzIHRoZSBzdGVwcyB1c2VkIHdoZW4KcHJvY2Vzc2luZyB0aGUgZG93bmxvYWRlZCB0cmFuc2l0aW9uIGxpYnJhcmllcy4KCiMgR2F0aGVyaW5nIHBhcmFtZXRlcnMKCkluIHRoaXMgZmlyc3QgYmxvY2ssIEkgd2lsbCBzZXQgYSBjb3VwbGUgb2YgdmFyaWFibGVzIGFuZCBzb3VyY2UgYSBmaWxlCmNvbnRhaW5pbmcgdGhlIHBhcmFtZXRlcnMgZm9yIHRoZSByZXN0IG9mIHRoZSBzY3JpcHQuCgpgYGB7YmFzaCBwYXJhbWV0ZXJzLCBldmFsPUZBTFNFfQpleHBvcnQgVkVSU0lPTj0iMjAxODA5MTMiCnNvdXJjZSBwYXJhbWV0ZXJzLzIwMTgwOTEzX3NldHRpbmdzLnNoCmBgYAoKIyBQbG90dGluZyBtZXRyaWNzIG9mIHRoZSByYXcgZGF0YQoKVGhlIHJhdyBkYXRhIGZpbGVzIHByb3ZpZGUgb3Bwb3J0dW5pdGllcyB0byBtYWtlIHN1cmUgdGhhdCB0aGUgbGF0ZXIgaW52b2NhdGlvbnMKb2Ygb3Blbk1TL2V0YyB3aWxsIGFjdHVhbGx5IHdvcms7IGZvciBleGFtcGxlLCBpZiB0aGVyZSBhcmUgdG9vIGZldyB0cmFuc2l0aW9ucwpvYnNlcnZlZCBoZXJlLCBvbmUgc2hvdWxkIG5vdCBiZSBzdXJwcmlzZWQgaWYgcHlwcm9waGV0IGFuZCB0cmljIGZhaWwgbGF0ZXIuCgpgYGB7ciBkaWFfbWV0cmljc30Kc2FtcGxlX3NoZWV0IDwtIGdsdWU6OmdsdWUoInNhbXBsZV9zaGVldHMvTXRiX2RpYV9zYW1wbGVzX3t2ZXJ9Lnhsc3giKQpzYXZlZmlsZSA8LSAibXp4bWxfZGlhX2RhdGFfMjAxODA5MTMucmRhIgoKbWV0YWRhdGEgPC0gb3Blbnhsc3g6OnJlYWQueGxzeChzYW1wbGVfc2hlZXQpCmtlZXBlcl9pZHggPC0gIWdyZXBsKHBhdHRlcm49Il4jIiwgeD1tZXRhZGF0YVtbInNhbXBsZWlkIl1dKQptZXRhZGF0YSA8LSBtZXRhZGF0YVtrZWVwZXJfaWR4LCBdCmtuaXRyOjprYWJsZShtZXRhZGF0YSkKCmlmIChmaWxlLmV4aXN0cyhzYXZlZmlsZSkpIHsKICBsb2FkKHNhdmVmaWxlKQp9IGVsc2UgewogIG16eG1sX2RhdGEgPC0gZXh0cmFjdF9tc3Jhd19kYXRhKG1ldGFkYXRhLCBwYXJhbGxlbD1GQUxTRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd193aW5kb3dfb3ZlcmxhcD1GQUxTRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlX2NvbHVtbj0iRmlsZW5hbWUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhdmVmaWxlPXNhdmVmaWxlKQogIG16bWxfZGF0YSA8LSBleHRyYWN0X21zcmF3X2RhdGEobWV0YWRhdGEsIHBhcmFsbGVsPUZBTFNFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0PSJtek1MIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3dpbmRvd19vdmVybGFwPUZBTFNFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZV9jb2x1bW49Im16bWxmaWxlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhdmVmaWxlPSJ0ZXN0aW5nLnJkYSIpCn0KCmludGVuc2l0eV9ib3hwbG90IDwtIHBsb3RfbXp4bWxfYm94cGxvdChtenhtbF9kYXRhKQpwcChmaWxlPXBhc3RlMCgiaW1hZ2VzLzIwMTgwOTEzX2RpYV9tenhtbF9pbnRlbnNpdGllcy12IiwgdmVyLCAiLnBuZyIpLCBpbWFnZT1pbnRlbnNpdHlfYm94cGxvdCkKCnJldGVudGlvbl9ib3hwbG90IDwtIHBsb3RfbXp4bWxfYm94cGxvdChtenhtbF9kYXRhLCB0YWJsZT0ic2NhbnMiLCBjb2x1bW49InBlYWtzY291bnQiKQpwcChmaWxlPXBhc3RlMCgiaW1hZ2VzLzIwMTgwOTEzX2RpYV9tenhtbF9yZXRlbnRpb24tdiIsIHZlciwgIi5wbmciKSwgaW1hZ2U9cmV0ZW50aW9uX2JveHBsb3QpCgptel9ib3hwbG90IDwtIHBsb3RfbXp4bWxfYm94cGxvdChtenhtbF9kYXRhLCB0YWJsZT0ic2NhbnMiLCBjb2x1bW49ImJhc2VwZWFrbXoiKQpwcChmaWxlPXBhc3RlMCgiaW1hZ2VzLzIwMTgwOTEzX2RpYV9tenhtbF9temJhc2UtdiIsIHZlciwgIi5wbmciKSwgaW1hZ2U9bXpfYm94cGxvdCkKCnNjYW5pbnRlbnNpdHlfYm94cGxvdCA8LSBwbG90X216eG1sX2JveHBsb3QobXp4bWxfZGF0YSwgdGFibGU9InNjYW5zIiwgY29sdW1uPSJiYXNlcGVha2ludGVuc2l0eSIpCnBwKGZpbGU9cGFzdGUwKCJpbWFnZXMvMjAxODA5MTNfZGlhX216eG1sX3NjYW5pbnRlbnNpdHktdiIsIHZlciwgIi5wbmciKSwgaW1hZ2U9c2NhbmludGVuc2l0eV9ib3hwbG90KQoKIyNpbnRlbnNpdHlfd3J0X216IDwtIHBsb3RfaW50ZW5zaXR5X216KG16eG1sX2RhdGEsIHhfc2NhbGU9ImxvZyIsIHlfc2NhbGU9ImxvZyIpCiMjcHAoZmlsZT1wYXN0ZTAoImltYWdlcy8yMDE4MDVfZGlhX2ludGVuc2l0eV93cnRfbXpfZGlhLXYiLCB2ZXIsICIucG5nIiksIGltYWdlPWludGVuc2l0eV93cnRfbXopCmBgYAoKIyBDb252ZXJ0aW5nIGRvd25sb2FkZWQgdHJhbnNpdGlvbnMKCkluIGJsb2NrIDE1IG9mIGRpYV9pbnZvY2F0aW9uXzIwMTgwOTEzLnNoIHRoZSBjb21tYW5kIHVzZWQgaXMgcHJlc3RlZCBhbmQgY29waWVkCmhlcmUgZm9yIGludGVyYWN0aXZlIHJ1bm5pbmcuCgpgYGB7YmFzaCB0dWJlcmN1bGlzdF9jb252ZXJzaW9uLCBldmFsPUZBTFNFfQplY2hvICJDb252ZXJ0aW5nIHRoZSBUdWJlcmN1bGlzdCBsaWJyYXJpZXMgdG8gcHFwLiIKVFVCRVJDVUxJU1RfVFJBTUw9InByZXByb2Nlc3NpbmcvMDVzcGVjdHJhbF9saWJyYXJpZXMvTXRiX1R1YmVyY3VMaXN0LVIyN19pUlRfVVBTX25vTW94X25vTUNfc2FsbF9vc3dfZGVjb3kuVHJhTUwiCmVjaG8gIlRoZSBpbnB1dCBpczogJHtUVUJFUkNVTElTVF9UUkFNTH0iCmVjaG8gIlRoZSBvdXRwdXQgaXM6ICR7VFVCRVJDVUxJU1RfUFFQfSIKbWtkaXIgLXAgJChkaXJuYW1lICR7VFVCRVJDVUxJU1RfUFFQfSkKVGFyZ2V0ZWRGaWxlQ29udmVydGVyIFwKICAgIC1pbiAiJHtUVUJFUkNVTElTVF9UUkFNTH0iIFwKICAgIC1pbl90eXBlIFRyYU1MIFwKICAgIC1vdXQgIiR7VFVCRVJDVUxJU1RfUFFQfSIgXAogICAgLW91dF90eXBlIHBxcCBcCiAgICAyPiIke1RVQkVSQ1VMSVNUX1BRUH1fY29udmVydC5sb2ciIDE+JjIKYGBgCgojIE9wZW5Td2F0aFdvcmtmbG93IGludm9jYXRpb24KCmJsb2NrIDE2IGNvbnRhaW5zIHRoZSBjb21tYW5kcyB1c2VkIHRvIHJ1biBvcGVuc3dhdGh3b3JrZmxvdyBhbmQgcHlwcm9waGV0LgpUaG9zZSBhcmUgcmVwZWF0ZWQgaGVyZSBpbiBvcmRlciB0byB0ZXN0IHRoZW0gaW50ZXJhY3RpdmVseSB3aGVuIG5lZWRlZC4KCmBgYHtiYXNoIG9wZW5zd2F0aF90dWJlcmN1bGlzdCwgZXZhbD1GQUxTRX0KZWNobyAiSW52b2tpbmcgdGhlIE9wZW5Td2F0aFdvcmtmbG93IHVzaW5nIHRoZSB0dWJlcmN1bGlzdCB0cmFuc2l0aW9ucy4iCmJhc2VfbXp4bWxkaXI9InByZXByb2Nlc3NpbmcvMDFtelhNTC9kaWEvJHtWRVJTSU9OfSIKc3dhdGhfaW5wdXRzPSQoL2Jpbi9scyAiJHtiYXNlX216eG1sZGlyfSIpCmVjaG8gIkNoZWNraW5nIGluLCB0aGUgaW5wdXRzIGFyZTogJHtzd2F0aF9pbnB1dHN9Igpta2RpciAtcCAiJHtUVUJFUkNVTElTVF9PVVRESVJ9IgpweXBkaXI9IiR7UFlQUk9QSEVUX09VVERJUn1fdHViZXJjdWxpc3QiCmVjaG8gIkNyZWF0aW5nIHB5cHJvcGhldCBvdXRwdXQgZGlyZWN0b3J5OiAke3B5cGRpcn0uIgpta2RpciAtcCAiJHtweXBkaXJ9Igpmb3IgaW5wdXQgaW4gJHtzd2F0aF9pbnB1dHN9CmRvCiAgICBpbl9tenhtbD0iJHtiYXNlX216eG1sZGlyfS8ke2lucHV0fSIKICAgIG5hbWU9JChiYXNlbmFtZSAiJHtpbnB1dH0iIC5telhNTCkKICAgIGVjaG8gIlN0YXJ0aW5nIG9wZW5zd2F0aCBydW4gb2YgJHtuYW1lfSB1c2luZyAke01aX1dJTkRPV1N9IHdpbmRvd3MgYXQgJChkYXRlKS4iCiAgICB0Yl9vdXRwdXRfcHJlZml4PSIke1RVQkVSQ1VMSVNUX09VVERJUn0vJHtuYW1lfV92c18ke1ZFUlNJT059XyR7VFlQRX1fJHtEREFfTUVUSE9EfV9kaWEiCiAgICBweXByb3BoZXRfb3V0cHV0X3ByZWZpeD0iJHtweXBkaXJ9LyR7bmFtZX1fdnNfJHtWRVJTSU9OfV8ke1RZUEV9XyR7RERBX01FVEhPRH1fZGlhIgogICAgZWNobyAiRGVsZXRpbmcgcHJldmlvdXMgc3dhdGggb3V0cHV0IGZpbGU6ICR7dGJfb3V0cHV0X3ByZWZpeH0ub3N3IgogICAgcm0gLWYgIiR7dGJfb3V0cHV0X3ByZWZpeH0ub3N3IgogICAgT3BlblN3YXRoV29ya2Zsb3cgXAogICAgICAgIC1mb3JjZSBcCiAgICAgICAgLWluaSAicGFyYW1ldGVycy9vcGVubXNfJHtWRVJTSU9OfS5pbmkiIFwKICAgICAgICAtaW4gIiR7aW5fbXp4bWx9IiBcCiAgICAgICAgLXN3YXRoX3dpbmRvd3NfZmlsZSAid2luZG93cy9vcGVuc3dhdGhfJHtuYW1lfS50eHQiIFwKICAgICAgICAtdHIgIiR7VFVCRVJDVUxJU1RfUFFQfSIgXAogICAgICAgIC1vdXRfb3N3ICIke3RiX291dHB1dF9wcmVmaXh9Lm9zdyIgXAogICAgICAgIDI+IiR7dGJfb3V0cHV0X3ByZWZpeH1fb3N3LmxvZyIgMT4mMgogICAgaWYgW1sgIiQ/IiAtbmUgIjAiIF1dOyB0aGVuCiAgICAgICAgZWNobyAiT3BlblN3YXRoV29ya2Zsb3cgZm9yICR7bmFtZX0gZmFpbGVkLiIKICAgIGZpCgogICAgcm0gLWYgIiR7dGJfb3V0cHV0X3ByZWZpeH1fc2NvcmVkLm9zdyIKICAgIGVjaG8gIlNjb3JpbmcgaW5kaXZpZHVhbCBzd2F0aCBydW46ICR7dGJfb3V0cHV0X3ByZWZpeH0iCiAgICBweXByb3BoZXQgXAogICAgICAgIHNjb3JlIFwKICAgICAgICAtLWluICIke3RiX291dHB1dF9wcmVmaXh9Lm9zdyIgXAogICAgICAgIC0tb3V0ICIke3B5cHJvcGhldF9vdXRwdXRfcHJlZml4fV9zY29yZWQub3N3IiBcCiAgICAyPj4iJHtweXByb3BoZXRfb3V0cHV0X3ByZWZpeH1fcHlwcm9waGV0X2FsbC5sb2ciIDE+JjIKICAgIHJtIC1mICIke3B5cHJvcGhldF9vdXRwdXRfcHJlZml4fV9zY29yZWQudHN2IgogICAgZWNobyAiRXhwb3J0aW5nIGluZGl2aWR1YWwgc3dhdGggcnVuOiB0byAke3B5cHJvcGhldF9vdXRwdXRfcHJlZml4fV9zY29yZWQudHN2IgogICAgcHlwcm9waGV0IFwKICAgICAgICBleHBvcnQgXAogICAgICAgIC0taW4gIiR7cHlwcm9waGV0X291dHB1dF9wcmVmaXh9X3Njb3JlZC5vc3ciIFwKICAgICAgICAtLW91dCAiJHtweXByb3BoZXRfb3V0cHV0X3ByZWZpeH1fc2NvcmVkLnRzdiIgXAogICAgICAgIDI+PiIke3B5cHJvcGhldF9vdXRwdXRfcHJlZml4fV9weXByb3BoZXRfZXhwb3J0LmxvZyIgMT4mMgogICAgIyMgb2sgc29tZXRoaW5nIGlzIGZ1YmFyLCB0aGUgc3R1cGlkIHRzdiBmaWxlcyBhcmUgYmVpbmcgd3JpdHRlbiBpbiB0aGUgY3dkIGFzIHJ1bl9maWxlbmFtZS50c3YKICAgICMjIE5vIG1hdHRlciB3aGF0IEkgZG8hCiAgICBtdiAiJHtpbnB1dH0udHN2IiAiJHtweXByb3BoZXRfb3V0cHV0X3ByZWZpeH1fc2NvcmVkLnRzdiIKICAgIGlmIFtbICIkPyIgLW5lICIwIiBdXTsgdGhlbgogICAgICAgIGVjaG8gIkV4cG9ydGluZyAke3B5cHJvcGhldF9vdXRwdXRfcHJlZml4fV9zY29yZWQudHN2IGZhaWxlZC4iCiAgICBmaQpkb25lCmBgYAoKIyBNZXJnaW5nIHRoZSBUdWJlcmN1bGlzdC1kZXJpdmVkIGRhdGEgd2l0aCBUUklDCgpGaW5hbGx5LCBibG9jayAxNyBvZiB0aGUgaW52b2NhdGlvbiBzY3JpcHQgcHJvdmlkZXMgdGhlIGNvbW1hbmQgdXNlZCB0byBtYWtlIHRoZQpmaW5hbCwgZmVhdHVyZS1hbGlnbmVkIGRhdGEgd2hpY2ggaXMgdXNlZCBieSBTV0FUSDJzdGF0cyBhbmQgZnJpZW5kcy4gIEluCmFkZGl0aW9uLCBpdCBnZW5lcmF0ZXMgYSBtYXRyaXggb2YgaW50ZW5zaXRpZXMgYnkgc2FtcGxlIGFuZCBzb21lIG1ldGFkYXRhLgpPbmNlIGFnYWluLCBpdCBpcyBjb3B5L3Bhc3RlZCBoZXJlIHRvIGFsbG93IGludGVyYWN0aXZlIHRlc3RpbmcuCgpgYGB7YmFzaCB0dWJfdHJpYywgZXZhbD1GQUxTRX0KdHJpY190Yj0iJHtUUklDX09VVERJUn1fdHViZXJjdWxpc3QiCm1rZGlyIC1wICIke3RyaWNfdGJ9IgpmZWF0dXJlX2FsaWdubWVudC5weSBcCiAgLS1mb3JjZSBcCiAgLS1pbiAiLi8ke3B5cGRpcn0vIioudHN2IFwKICAtLW91dCAiJHt0cmljX3RifS8ke1NFQVJDSF9NRVRIT0R9XyR7RERBX01FVEhPRH0udHN2IiBcCiAgLS1vdXRfbWF0cml4ICIke3RyaWNfdGJ9LyR7RERBX01FVEhPRH1fb3V0bWF0cml4LnRzdiIgXAogIC0tb3V0X21ldGEgIiR7dHJpY190Yn0vJHtEREFfTUVUSE9EfV9tZXRhLnRzdiIgXAogIDI+IiR7dHJpY190Yn0vZmVhdHVyZV9hbGlnbm1lbnQuZXJyIiBcCiAgMT4iJHt0cmljX3RifS9mZWF0dXJlX2FsaWdubWVudC5vdXQiCmVjaG8gIldyb3RlIGZpbmFsIG91dHB1dCB0byAke3RyaWNfdGJ9LyR7U0VBUkNIX01FVEhPRH1fJHtEREFfTUVUSE9EfS50c3YiCmBgYAoKIyBJbmRleCB2ZXJzaW9uOiBgciB2ZXJgCgojIFRPRE8KCmBgYHtyIHNhdmVtZX0KaWYgKCFpc1RSVUUoZ2V0MCgic2tpcF9sb2FkIikpKSB7CiAgbWVzc2FnZShwYXN0ZTAoIlRoaXMgaXMgaHBnbHRvb2xzIGNvbW1pdDogIiwgZ2V0X2dpdF9jb21taXQoKSkpCiAgdGhpc19zYXZlIDwtIHBhc3RlMChnc3ViKHBhdHRlcm49IlxcLlJtZCIsIHJlcGxhY2U9IiIsIHg9cm1kX2ZpbGUpLCAiLXYiLCB2ZXIsICIucmRhLnh6IikKICBtZXNzYWdlKHBhc3RlMCgiU2F2aW5nIHRvICIsIHRoaXNfc2F2ZSkpCiAgdG1wIDwtIHNtKHNhdmVtZShmaWxlbmFtZT10aGlzX3NhdmUpKQogIHBhbmRlcjo6cGFuZGVyKHNlc3Npb25JbmZvKCkpCn0KYGBgCg==