1 Annotation version: 20190205

1.1 Genome annotation input

There are a few methods of importing annotation data into R. The following are two attempts, the second is currently being used in these analyses.

1.2 OrganismDb

Since this document was originally written, I have made substantial changes to how I create, load, and manipulate the eupathdb annotation data. As a result, this needs to be significantly reworked.

AnnotationHub is the new and fancier version of what OrganismDb does. Keith already made these for the parasites though, lets try and use one of those.

Assuming the above packages got created, we may load them and extract the annotation data.

## Starting metadata download.
## Finished metadata download.
## Found the following hits: Leishmania major strain Friedlin, Leishmania major strain LV39c5, Leishmania major strain SD 75.1, choosing the first.
## org.Lmajor.Friedlin.v41.eg.db
## Starting metadata download.
## Finished metadata download.
## Found the following hits: Leishmania panamensis MHOM/COL/81/L13, Leishmania panamensis strain MHOM/PA/94/PSC-1, choosing the first.
## org.Lpanamensis.MHOMCOL81L13.v41.eg.db
## Starting metadata download.
## Finished metadata download.
## Found the following hits: Leishmania braziliensis MHOM/BR/75/M2903, Leishmania braziliensis MHOM/BR/75/M2904, choosing the first.
## org.Lbraziliensis.MHOMBR75M2903.v41.eg.db

1.4 Extracting Cell Types

Maria Adelaida requested adding the xCell cell types to the data.

##             Length Class             Mode     
## spill           3  -none-            list     
## spill.array     3  -none-            list     
## signatures    489  GeneSetCollection list     
## genes       10808  -none-            character
## Loading required package: annotate
## Loading required package: XML
## Loading required package: graph
## 
## Attaching package: 'graph'
## The following object is masked from 'package:XML':
## 
##     addNode
## setName: aDC%HPCA%1.txt 
## geneIds: C1QA, C1QB, ..., CCL22 (total: 8)
## geneIdType: Null
## collectionType: Null 
## setIdentifier: PEDS-092FVH8-LT:623:Tue Jun  6 14:36:33 2017:2
## description: 
## organism: 
## pubMedIds: 
## urls: 
## contributor: 
## setVersion: 0.0.1
## creationDate:
##  [1] "aDC%HPCA%1.txt"          "aDC%HPCA%2.txt"         
##  [3] "aDC%HPCA%3.txt"          "aDC%IRIS%1.txt"         
##  [5] "aDC%IRIS%2.txt"          "aDC%IRIS%3.txt"         
##  [7] "Adipocytes%ENCODE%1.txt" "Adipocytes%ENCODE%2.txt"
##  [9] "Adipocytes%ENCODE%3.txt" "Adipocytes%FANTOM%1.txt"

2 Putting the pieces together

The macrophage experiment has samples across 2 contexts, the host and parasite. The following block sets up one experiment for each. If you open the all_samples-species.xlsx files, you will note immediately that a few different attempts were made at ascertaining the most likely experimental factors that contributed to the readily apparent batch effects.

2.1 The human transcriptome mappings

Keep in mind that if I change the experimental design with new annotations, I must therefore regenerate the following.

sampleid pathogenstrain experimentname tubelabel alias condition batch anotherbatch snpclade snpcladev2 snpcladev3 pathogenstrain.1 label donor time pctmappedparasite pctcategory state sourcelab expperson pathogen host hostcelltype noofhostcells infectionperiodhpitimeofharvest moiexposure parasitespercell pctinf rnangul rnaqcpassed libraryconst libqcpassed index descriptonandremarks observation lowercaseid humanfile parasitefile file
HPGL0241 HPGL0241 none macrophage TM130-Nil (Blue label) Nil uninf a a undef undef undef none uninf_1 d130 undef undef 0 uninfected Ade Adriana none Human Human macs Max 2 mill 2h - 24h chase period NA unknown unknown 468 Y Wanderson Y 1 Uninfected human macrophages NA hpgl0241 preprocessing/hpgl0241/outputs/tophat_hsapiens/accepted_paired.count.xz undef null

2.2 The parasite transcriptome mappings

The first three rows of the parasite experimental design.
sampleid pathogenstrain experimentname tubelabel alias condition batch anotherbatch snpclade snpcladev2 snpcladev3 pathogenstrain.1 label donor time pctmappedparasite pctcategory state sourcelab expperson pathogen host hostcelltype noofhostcells infectionperiodhpitimeofharvest moiexposure parasitespercell pctinf rnangul rnaqcpassed libraryconst libqcpassed index descriptonandremarks observation lowercaseid humanfile parasitefile file
HPGL0242 HPGL0242 s2271 macrophage TM130-2271 Self-Healing sh a a white whitepink right s2271 sh_2271 d130 undef 30 3 self_heal Ade Adriana Lp Human Human macs Max 2 mill 2h - 24h chase period 0.0486111111111111 unknown unknown 276 Y Wanderson Y 8 Infected human macrophages. NA hpgl0242 preprocessing/hpgl0242/outputs/tophat_hsapiens/accepted_paired.count.xz preprocessing/hpgl0242/outputs/tophat_lpanamensis/accepted_paired.count.xz null
HPGL0244 HPGL0244 s5433 macrophage TM130-5433 Chronic chr a a blue_self blue left s5433 chr_5433 d130 undef 15 1 chronic Ade Adriana Lp Human Human macs Max 2 mill 2h - 24h chase period 0.0486111111111111 unknown unknown 261 Y Wanderson Y 27 Infected human macrophages NA hpgl0244 preprocessing/hpgl0244/outputs/tophat_hsapiens/accepted_paired.count.xz preprocessing/hpgl0244/outputs/tophat_lpanamensis/accepted_paired.count.xz null
HPGL0245 HPGL0245 s1320 macrophage TM130-1320 Chronic chr a a multicolor yellowbrownmulti right s1320 chr_1320 d130 undef 40 4 chronic Ade Adriana Lp Human Human macs Max 2 mill 2h - 24h chase period 0.0486111111111111 unknown unknown 199 Y Wanderson Y 11 Infected human macrophages NA hpgl0245 preprocessing/hpgl0245/outputs/tophat_hsapiens/accepted_paired.count.xz preprocessing/hpgl0245/outputs/tophat_lpanamensis/accepted_paired.count.xz null

3 Supplemental Table 1

Table S1 is going to be a summary of the metadata in all_samples-combined This may also include some of the numbers regarding mapping %, etc.

Wanted columns:

  • Sample ID: HPGLxxxx
  • Donor Code: TM130 or PG1xx
  • Cell Type: Macrophage or PBMC
  • Infection Status: Infected or Uninfected
  • Disease Outcome: Chronic or Self-Healing or NA
  • Batch: A or B (macrophage); NA for PBMC
  • Number of reads that passed Illumina filter
  • Number of reads after trimming
  • Number of reads mapped - human
  • % reads mapped - human
  • Number of reads mapped - L.panamensis
  • % reads mapped - L.panamensis

Use the Tcruzi colors.

  • A1 is a large title: “Macrophage Samples”
  • Row 2 is the blue column headings
  • 3-m contains Macrophage metadata
  • m+1 is blank
  • m+2 is a large title: “PBMC Samples”
  • m+3-n contains PBMC metadata

4 End

At this point, we should have everything necessary to perform the various analyses of the 4 sub-experiments. So save the current data for reuse elsewhere.

The experimental design is available here.

## If you wish to reproduce this exact build of hpgltools, invoke the following:
## > git clone http://github.com/abelew/hpgltools.git
## > git reset 45b7ec8bad3682886965df63000dc4e98bcbf69f
## This is hpgltools commit: Wed Feb 6 16:38:23 2019 -0500: 45b7ec8bad3682886965df63000dc4e98bcbf69f
## Saving to 01_annotation_20190205-v20190205.rda.xz
## The savefile is: /cbcb/nelsayed-scratch/atb/rnaseq/lpanamensis_2016/savefiles/01_annotation_20190205-v20190205.rda.xz
## Renaming /cbcb/nelsayed-scratch/atb/rnaseq/lpanamensis_2016/savefiles/01_annotation_20190205-v20190205.rda.xz to /cbcb/nelsayed-scratch/atb/rnaseq/lpanamensis_2016/savefiles/01_annotation_20190205-v20190205.rda.xz.01.
## The save string is: con <- pipe(paste0('pxz -T6 > /cbcb/nelsayed-scratch/atb/rnaseq/lpanamensis_2016/savefiles/01_annotation_20190205-v20190205.rda.xz'), 'wb'); save(list=ls(all.names=TRUE, envir=globalenv()),
##      envir=globalenv(), file=con, compress=FALSE); close(con)

R version 3.5.2 (2018-12-20)

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

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

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

other attached packages: Homo.sapiens(v.1.3.1), TxDb.Hsapiens.UCSC.hg19.knownGene(v.3.2.2), org.Hs.eg.db(v.3.7.0), GO.db(v.3.7.0), OrganismDbi(v.1.24.0), GenomicFeatures(v.1.34.1), GenomicRanges(v.1.34.0), GenomeInfoDb(v.1.18.1), GSEABase(v.1.44.0), graph(v.1.60.0), annotate(v.1.60.0), XML(v.3.98-1.16), xCell(v.1.1.0), org.Lbraziliensis.MHOMBR75M2903.v38.eg.db(v.2018.08), org.Lpanamensis.MHOMCOL81L13.v38.eg.db(v.2018.08), org.Lmajor.Friedlin.v38.eg.db(v.2018.08), AnnotationDbi(v.1.44.0), IRanges(v.2.16.0), S4Vectors(v.0.20.1), AnnotationHub(v.2.14.2), hpgltools(v.2018.11), Biobase(v.2.42.0) and BiocGenerics(v.0.28.0)

loaded via a namespace (and not attached): tidyselect(v.0.2.5), lme4(v.1.1-19), RSQLite(v.2.1.1), grid(v.3.5.2), BiocParallel(v.1.16.5), devtools(v.2.0.1), munsell(v.0.5.0), codetools(v.0.2-16), units(v.0.6-2), withr(v.2.1.2), colorspace(v.1.4-0), GOSemSim(v.2.8.0), highr(v.0.7), knitr(v.1.21), rstudioapi(v.0.9.0), DOSE(v.3.8.2), labeling(v.0.3), urltools(v.1.7.1), GenomeInfoDbData(v.1.2.0), bit64(v.0.9-7), farver(v.1.1.0), rprojroot(v.1.3-2), xfun(v.0.4), R6(v.2.3.0), doParallel(v.1.0.14), bitops(v.1.0-6), fgsea(v.1.8.0), gridGraphics(v.0.3-0), DelayedArray(v.0.8.0), assertthat(v.0.2.0), promises(v.1.0.1), scales(v.1.0.0), ggraph(v.1.0.2), enrichplot(v.1.2.0), gtable(v.0.2.0), sva(v.3.30.1), processx(v.3.2.1), rlang(v.0.3.1), genefilter(v.1.64.0), splines(v.3.5.2), rtracklayer(v.1.42.1), lazyeval(v.0.2.1), europepmc(v.0.3), BiocManager(v.1.30.4), yaml(v.2.2.0), reshape2(v.1.4.3), backports(v.1.1.3), httpuv(v.1.4.5.1), qvalue(v.2.14.1), RBGL(v.1.58.1), clusterProfiler(v.3.10.1), tools(v.3.5.2), usethis(v.1.4.0), ggplotify(v.0.0.3), ggplot2(v.3.1.0), gplots(v.3.0.1), RColorBrewer(v.1.1-2), sessioninfo(v.1.1.1), ggridges(v.0.5.1), Rcpp(v.1.0.0), plyr(v.1.8.4), base64enc(v.0.1-3), progress(v.1.2.0), zlibbioc(v.1.28.0), purrr(v.0.2.5), RCurl(v.1.95-4.11), ps(v.1.3.0), prettyunits(v.1.0.2), viridis(v.0.5.1), cowplot(v.0.9.4), SummarizedExperiment(v.1.12.0), ggrepel(v.0.8.0), colorRamps(v.2.3), fs(v.1.2.6), variancePartition(v.1.12.1), magrittr(v.1.5), data.table(v.1.12.0), openxlsx(v.4.1.0), DO.db(v.2.9), triebeard(v.0.3.0), packrat(v.0.5.0), matrixStats(v.0.54.0), pkgload(v.1.0.2), hms(v.0.4.2), mime(v.0.6), evaluate(v.0.12), GSVA(v.1.30.0), xtable(v.1.8-3), pbkrtest(v.0.4-7), gridExtra(v.2.3), testthat(v.2.0.1), compiler(v.3.5.2), biomaRt(v.2.38.0), tibble(v.2.0.1), KernSmooth(v.2.23-15), crayon(v.1.3.4), minqa(v.1.2.4), htmltools(v.0.3.6), mgcv(v.1.8-26), later(v.0.7.5.9000), tidyr(v.0.8.2), geneplotter(v.1.60.0), DBI(v.1.0.0), tweenr(v.1.0.1), MASS(v.7.3-51.1), Matrix(v.1.2-15), cli(v.1.0.1), gdata(v.2.18.0), bindr(v.0.1.1), igraph(v.1.2.2), pkgconfig(v.2.0.2), rvcheck(v.0.1.3), GenomicAlignments(v.1.18.1), xml2(v.1.2.0), foreach(v.1.4.4), XVector(v.0.22.0), rvest(v.0.3.2), stringr(v.1.3.1), callr(v.3.1.1), digest(v.0.6.18), pracma(v.2.2.2), Biostrings(v.2.50.2), EuPathDB(v.1.0.1), rmarkdown(v.1.11), fastmatch(v.1.1-0), curl(v.3.3), shiny(v.1.2.0), Rsamtools(v.1.34.0), gtools(v.3.8.1), nloptr(v.1.2.1), nlme(v.3.1-137), jsonlite(v.1.6), bindrcpp(v.0.2.2), desc(v.1.2.0), viridisLite(v.0.3.0), limma(v.3.38.3), pillar(v.1.3.1), lattice(v.0.20-38), httr(v.1.4.0), pkgbuild(v.1.0.2), survival(v.2.43-3), interactiveDisplayBase(v.1.20.0), glue(v.1.3.0), remotes(v.2.0.2), zip(v.1.0.0), UpSetR(v.1.3.3), shinythemes(v.1.1.2), iterators(v.1.0.10), pander(v.0.6.3), bit(v.1.1-14), ggforce(v.0.1.3), stringi(v.1.2.4), blob(v.1.1.1), caTools(v.1.17.1.1), memoise(v.1.1.0) and dplyr(v.0.7.8)

LS0tCnRpdGxlOiAiTC4gcGFuYW1lbnNpcyAyMDE4MDgyMjogQW5ub3RhdGlvbiBkYXRhLiIKYXV0aG9yOiAiYXRiIGFiZWxld0BnbWFpbC5jb20iCmRhdGU6ICJgciBTeXMuRGF0ZSgpYCIKb3V0cHV0OgogIHJtZGZvcm1hdHM6OnJlYWR0aGVkb3duOgogICAgY29kZV9kb3dubG9hZDogdHJ1ZQogICAgY29kZV9mb2xkaW5nOiBzaG93CiAgICBkZl9wcmludDogcGFnZWQKICAgIGZpZ19jYXB0aW9uOiB0cnVlCiAgICBmaWdfaGVpZ2h0OiA3CiAgICBmaWdfd2lkdGg6IDcKICAgIGhpZ2hsaWdodDogdGFuZ28KICAgIHdpZHRoOiAzMDAKICAgIGtlZXBfbWQ6IGZhbHNlCiAgICBtb2RlOiBzZWxmY29udGFpbmVkCiAgICB0b2NfZmxvYXQ6IHRydWUKICBCaW9jU3R5bGU6Omh0bWxfZG9jdW1lbnQ6CiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlCiAgICBjb2RlX2ZvbGRpbmc6IHNob3cKICAgIGZpZ19jYXB0aW9uOiB0cnVlCiAgICBmaWdfaGVpZ2h0OiA3CiAgICBmaWdfd2lkdGg6IDcKICAgIGhpZ2hsaWdodDogdGFuZ28KICAgIGtlZXBfbWQ6IGZhbHNlCiAgICBtb2RlOiBzZWxmY29udGFpbmVkCiAgICB0b2NfZmxvYXQ6IHRydWUKICBodG1sX2RvY3VtZW50OgogICAgY29kZV9kb3dubG9hZDogdHJ1ZQogICAgY29kZV9mb2xkaW5nOiBzaG93CiAgICBmaWdfY2FwdGlvbjogdHJ1ZQogICAgZmlnX2hlaWdodDogNwogICAgZmlnX3dpZHRoOiA3CiAgICBoaWdobGlnaHQ6IHRhbmdvCiAgICBrZWVwX21kOiBmYWxzZQogICAgbW9kZTogc2VsZmNvbnRhaW5lZAogICAgbnVtYmVyX3NlY3Rpb25zOiB0cnVlCiAgICBzZWxmX2NvbnRhaW5lZDogdHJ1ZQogICAgdGhlbWU6IHJlYWRhYmxlCiAgICB0b2M6IHRydWUKICAgIHRvY19mbG9hdDoKICAgICAgY29sbGFwc2VkOiBmYWxzZQogICAgICBzbW9vdGhfc2Nyb2xsOiBmYWxzZQotLS0KCjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CmJvZHksIHRkIHsKICBmb250LXNpemU6IDE2cHg7Cn0KY29kZS5yewogIGZvbnQtc2l6ZTogMTZweDsKfQpwcmUgewogZm9udC1zaXplOiAxNnB4Cn0KPC9zdHlsZT4KCmBgYHtyIG9wdGlvbnMsIGluY2x1ZGU9RkFMU0V9CmxpYnJhcnkoImhwZ2x0b29scyIpCnR0IDwtIGRldnRvb2xzOjpsb2FkX2FsbCgifi9ocGdsdG9vbHMiKQprbml0cjo6b3B0c19rbml0JHNldCh3aWR0aD0xMjAsCiAgICAgICAgICAgICAgICAgICAgIHByb2dyZXNzPVRSVUUsCiAgICAgICAgICAgICAgICAgICAgIHZlcmJvc2U9VFJVRSwKICAgICAgICAgICAgICAgICAgICAgZWNobz1UUlVFKQprbml0cjo6b3B0c19jaHVuayRzZXQoZXJyb3I9VFJVRSwKICAgICAgICAgICAgICAgICAgICAgIGRwaT05NikKb2xkX29wdGlvbnMgPC0gb3B0aW9ucyhkaWdpdHM9NCwKICAgICAgICAgICAgICAgICAgICAgICBtYXgucHJpbnQ9MTIwLAogICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ3NBc0ZhY3RvcnM9RkFMU0UsCiAgICAgICAgICAgICAgICAgICAgICAga25pdHIuZHVwbGljYXRlLmxhYmVsPSJhbGxvdyIpCmdncGxvdDI6OnRoZW1lX3NldChnZ3Bsb3QyOjp0aGVtZV9idyhiYXNlX3NpemU9MTApKQp2ZXIgPC0gIjIwMTkwMjA1IgpwcmV2aW91c19maWxlIDwtICJpbmRleC5SbWQiCgp0bXAgPC0gdHJ5KHNtKGxvYWRtZShmaWxlbmFtZT1wYXN0ZTAoZ3N1YihwYXR0ZXJuPSJcXC5SbWQiLCByZXBsYWNlPSIiLCB4PXByZXZpb3VzX2ZpbGUpLCAiLXYiLCB2ZXIsICIucmRhLnh6IikpKSkKcm1kX2ZpbGUgPC0gIjAxX2Fubm90YXRpb25fMjAxOTAyMDUuUm1kIgpgYGAKCiMgQW5ub3RhdGlvbiB2ZXJzaW9uOiBgciB2ZXJgCgojIyBHZW5vbWUgYW5ub3RhdGlvbiBpbnB1dAoKVGhlcmUgYXJlIGEgZmV3IG1ldGhvZHMgb2YgaW1wb3J0aW5nIGFubm90YXRpb24gZGF0YSBpbnRvIFIuICBUaGUgZm9sbG93aW5nIGFyZQp0d28gYXR0ZW1wdHMsIHRoZSBzZWNvbmQgaXMgY3VycmVudGx5IGJlaW5nIHVzZWQgaW4gdGhlc2UgYW5hbHlzZXMuCgojIyMgQW5ub3RhdGlvbkh1YgoKQW5ub3RhdGlvbkh1YiBpcyBhIG5ld2VyIHNlcnZpY2UgYW5kIGhhcyBwcm9taXNlIHRvIGJlIGFuIGV4Y2VsbGVudCB0b3AtbGV2ZWwKcmVzb3VyY2UgZm9yIGdhdGhlcmluZyBhbm5vdGF0aW9uIGRhdGEuCgpgYGB7ciBkYXRhX2lucHV0X2dlbm9tZX0KdHQgPC0gc20obGlicmFyeShBbm5vdGF0aW9uSHViKSkKYWggPC0gc20oQW5ub3RhdGlvbkh1YigpKQpvcmdkYnMgPC0gcXVlcnkoYWgsICJPcmdEQiIpCmFubm90X2xtIDwtIHF1ZXJ5KGFoLCBjKCJPcmdEQiIsICJGcmllZGxpbiIpKQpsbV9uYW1lIDwtIG5hbWVzKGFubm90X2xtKQphbm5vdF9sbSA8LSBzbShhbm5vdF9sbVtbbG1fbmFtZVtbMl1dXV0pCnR4dGRicyA8LSBxdWVyeShhaCwgIlR4RGIiKQoKIyMgQUg0ODQyOSBhcHBlYXJzIHRvIGJlIHBhbmFtZW5zaXMKIyNhbm5vdF9scCA8LSBhbm5vdF9scFtbIkFINDg0MjkiXV0KYW5ub3RfbHAgPC0gcXVlcnkoYWgsIGMoIk9yZ0RCIiwgInBhbmFtZW5zaXMiKSkKbHBfbmFtZSA8LSBuYW1lcyhhbm5vdF9scCkKYW5ub3RfbHAgPC0gc20oYW5ub3RfbHBbW2xwX25hbWVbWzJdXV1dKQpgYGAKCiMjIE9yZ2FuaXNtRGIKClNpbmNlIHRoaXMgZG9jdW1lbnQgd2FzIG9yaWdpbmFsbHkgd3JpdHRlbiwgSSBoYXZlIG1hZGUgc3Vic3RhbnRpYWwgY2hhbmdlcyB0bwpob3cgSSBjcmVhdGUsIGxvYWQsIGFuZCBtYW5pcHVsYXRlIHRoZSBldXBhdGhkYiBhbm5vdGF0aW9uIGRhdGEuICBBcyBhIHJlc3VsdCwKdGhpcyBuZWVkcyB0byBiZSBzaWduaWZpY2FudGx5IHJld29ya2VkLgoKQW5ub3RhdGlvbkh1YiBpcyB0aGUgbmV3IGFuZCBmYW5jaWVyIHZlcnNpb24gb2Ygd2hhdCBPcmdhbmlzbURiIGRvZXMuICBLZWl0aAphbHJlYWR5IG1hZGUgdGhlc2UgZm9yIHRoZSBwYXJhc2l0ZXMgdGhvdWdoLCBsZXRzIHRyeSBhbmQgdXNlIG9uZSBvZiB0aG9zZS4KCmBgYHtyIG1ha2Vfb3JnZGIsIGV2YWw9RkFMU0V9CnRyaXRyeXBfbWV0YWRhdGEgPC0gRXVQYXRoREI6OmRvd25sb2FkX2V1cGF0aF9tZXRhZGF0YSh3ZWJzZXJ2aWNlPSJ0cml0cnlwZGIiKQp0ZXN0aW5nX3BhbmFtZW5zaXMgPC0gRXVQYXRoREI6Om1ha2VfZXVwYXRoX29yZ2FuaXNtZGJpKCJwYW5hbWVuc2lzIikKdGVzdGluZ19icmF6aWxpZW5zaXMgPC0gRXVQYXRoREI6Om1ha2VfZXVwYXRoX29yZ2FuaXNtZGJpKCJicmF6aWxpZW5zaXMiKQp0ZXN0aW5nX2Rvbm92YW5pIDwtIEV1UGF0aERCOjptYWtlX2V1cGF0aF9vcmdhbmlzbWRiaSgiZG9ub3ZhbmkiKQp0ZXN0aW5nX21leGljYW5hIDwtIEV1UGF0aERCOjptYWtlX2V1cGF0aF9vcmdhbmlzbWRiaSgibWV4aWNhbmEiKQp0ZXN0aW5nX21ham9yIDwtIEV1UGF0aERCOjptYWtlX2V1cGF0aF9vcmdhbmlzbWRiaSgibWFqb3IiKQp0ZXN0aW5nX2NyaXRoIDwtIEV1UGF0aERCOjptYWtlX2V1cGF0aF9vcmdhbmlzbWRiaSgiQ3JpdCIsIG1ldGFkYXRhPXRyaXRyeXBfbWV0YWRhdGEpCmBgYAoKQXNzdW1pbmcgdGhlIGFib3ZlIHBhY2thZ2VzIGdvdCBjcmVhdGVkLCB3ZSBtYXkgbG9hZCB0aGVtIGFuZCBleHRyYWN0IHRoZQphbm5vdGF0aW9uIGRhdGEuCgpgYGB7ciBscGFuYW1lbnNpc19vcmdkYn0KdHJpdHJ5cF9tZXRhZGF0YSA8LSBFdVBhdGhEQjo6ZG93bmxvYWRfZXVwYXRoX21ldGFkYXRhKHdlYnNlcnZpY2U9InRyaXRyeXBkYiIpCm1ham9yX25hbWVzIDwtIEV1UGF0aERCOjpnZXRfZXVwYXRoX3BrZ25hbWVzKCJtYWpvciIpCm1ham9yX25hbWVzJG9yZ2RiCgp3YW50ZWRfZmllbGRzIDwtIGMoImFubm90X2Nkc19sZW5ndGgiLCAiYW5ub3RfY2hyb21vc29tZSIsICJhbm5vdF9nZW5lX2VudHJlel9pZCIsCiAgICAgICAgICAgICAgICAgICAiYW5ub3RfZ2VuZV9uYW1lIiwgImFubm90X3N0cmFuZCIsICJnaWQiLCAiZ29fZ29faWQiLAogICAgICAgICAgICAgICAgICAgImdvX2dvX3Rlcm1fbmFtZSIsICJnb19vbnRvbG9neSIsCiAgICAgICAgICAgICAgICAgICAiaW50ZXJwcm9fZGVzY3JpcHRpb24iICwiaW50ZXJwcm9fZV92YWx1ZSIsICJ0eXBlX2dlbmVfdHlwZSIpCgpvbGRfbmFtZSA8LSAib3JnLkxtYWpvci5GcmllZGxpbi52MzguZWcuZGIiCmxtX29yZyA8LSBzbShFdVBhdGhEQjo6bG9hZF9vcmdkYl9hbm5vdGF0aW9ucyhvbGRfbmFtZSwga2V5dHlwZT0iZ2lkIiwgZmllbGRzPXdhbnRlZF9maWVsZHMpKQoKcGFuYW1lbnNpc19uYW1lcyA8LSBFdVBhdGhEQjo6Z2V0X2V1cGF0aF9wa2duYW1lcygicGFuYW1lbnNpcyIpCnBhbmFtZW5zaXNfbmFtZXMkb3JnZGIKb2xkX25hbWUgPC0gIm9yZy5McGFuYW1lbnNpcy5NSE9NQ09MODFMMTMudjM4LmVnLmRiIgpscF9vcmcgPC0gc20oRXVQYXRoREI6OmxvYWRfb3JnZGJfYW5ub3RhdGlvbnMob2xkX25hbWUsIGtleXR5cGU9ImdpZCIsIGZpZWxkcz13YW50ZWRfZmllbGRzKSkKCmJyYXppbGllbnNpc19uYW1lcyA8LSBFdVBhdGhEQjo6Z2V0X2V1cGF0aF9wa2duYW1lcygiYnJhemlsaWVuc2lzIikKYnJhemlsaWVuc2lzX25hbWVzJG9yZ2RiCm9sZF9uYW1lIDwtICJvcmcuTGJyYXppbGllbnNpcy5NSE9NQlI3NU0yOTAzLnYzOC5lZy5kYiIKbGJfb3JnIDwtIHNtKEV1UGF0aERCOjpsb2FkX29yZ2RiX2Fubm90YXRpb25zKG9sZF9uYW1lLCBrZXl0eXBlPSJnaWQiLCBmaWVsZHM9d2FudGVkX2ZpZWxkcykpCgojI2Rvbm92YW5pX25hbWVzIDwtIGdldF9ldXBhdGhfcGtnbmFtZXMoImRvbm92YW5pIikKIyNkb25vdmFuaV9uYW1lcyRvcmdkYgojI2xkX29yZyA8LSBsb2FkX29yZ2RiX2Fubm90YXRpb25zKGRvbm92YW5pX25hbWVzJG9yZ2RiLCBrZXl0eXBlPSJnaWQiLCBmaWVsZHM9d2FudGVkX2ZpZWxkcykKIyMKIyNtZXhpY2FuYV9uYW1lcyA8LSBnZXRfZXVwYXRoX3BrZ25hbWVzKCJtZXhpY2FuYSIpCiMjbWV4aWNhbmFfbmFtZXMkb3JnZGIKIyNsbWV4X29yZyA8LSBsb2FkX29yZ2RiX2Fubm90YXRpb25zKG1leGljYW5hX25hbWVzJG9yZ2RiLCBrZXl0eXBlPSJnaWQiLCBmaWVsZHM9d2FudGVkX2ZpZWxkcykKIyMKIyNmYXNjaWN1bGF0YV9uYW1lcyA8LSBnZXRfZXVwYXRoX3BrZ25hbWVzKCJyaXRoaWRpYSIsIG1ldGFkYXRhPXRyaXRyeXBfbWV0YWRhdGEpCiMjZmFzY2ljdWxhdGFfbmFtZXMkb3JnZGIKIyNjZl9vcmcgPC0gbG9hZF9vcmdkYl9hbm5vdGF0aW9ucyhmYXNjaWN1bGF0YV9uYW1lcyRvcmdkYiwga2V5dHlwZT0iZ2lkIiwgZmllbGRzPXdhbnRlZF9maWVsZHMpCmBgYAoKIyMgUmVhZCBhIGdmZiBmaWxlCgpJbiBjb250cmFzdCwgaXQgaXMgcG9zc2libGUgdG8gbG9hZCBtb3N0IGFubm90YXRpb25zIG9mIGludGVyZXN0IGRpcmVjdGx5IGZyb20KdGhlIGdmZiBmaWxlcyB1c2VkIGluIHRoZSBhbGlnbm1lbnRzLiAgTW9yZSBpbi1kZXB0aCBpbmZvcm1hdGlvbiBmb3IgdGhlIGh1bWFuCnRyYW5zY3JpcHRvbWUgbWF5IGJlIGV4dHJhY3RlZCBmcm9tIGJpb21hcnQuCgpgYGB7ciBnZW5vbWVfaW5wdXR9CiMjIFRoZSBvbGQgd2F5IG9mIGdldHRpbmcgZ2Vub21lL2Fubm90YXRpb24gZGF0YQpscF9nZmYgPC0gInJlZmVyZW5jZS9scGFuYW1lbnNpcy5nZmYiCmxiX2dmZiA8LSAicmVmZXJlbmNlL2xicmF6aWxpZW5zaXMuZ2ZmIgpoc19nZmYgPC0gInJlZmVyZW5jZS9oc2FwaWVucy5ndGYiCgpscF9mYXN0YSA8LSAicmVmZXJlbmNlL2xwYW5hbWVuc2lzLmZhc3RhLnh6IgpsYl9mYXN0YSA8LSAicmVmZXJlbmNlL2xicmF6aWxpZW5zaXMuZmFzdGEueHoiCmhzX2Zhc3RhIDwtICJyZWZlcmVuY2UvaHNhcGllbnMuZmFzdGEueHoiCgpscF9hbm5vdGF0aW9ucyA8LSBzbShsb2FkX2dmZl9hbm5vdGF0aW9ucyhscF9nZmYsIHR5cGU9ImdlbmUiKSkKcm93bmFtZXMobHBfYW5ub3RhdGlvbnMpIDwtIHBhc3RlMCgiZXhvbl8iLCBscF9hbm5vdGF0aW9ucyR3ZWJfaWQsICIuMSIpCgpsYl9hbm5vdGF0aW9ucyA8LSBzbShsb2FkX2dmZl9hbm5vdGF0aW9ucyhsYl9nZmYsIHR5cGU9ImdlbmUiKSkKaHNfZ2ZmX2Fubm90IDwtIHNtKGxvYWRfZ2ZmX2Fubm90YXRpb25zKGhzX2dmZiwgaWRfY29sPSJnZW5lX2lkIikpCgpoc19hbm5vdGF0aW9ucyA8LSBzbShsb2FkX2Jpb21hcnRfYW5ub3RhdGlvbnMoKSkkYW5ub3RhdGlvbgpoc19hbm5vdGF0aW9ucyRJRCA8LSBoc19hbm5vdGF0aW9ucyRnZW5lSUQKcm93bmFtZXMoaHNfYW5ub3RhdGlvbnMpIDwtIG1ha2UubmFtZXMoaHNfYW5ub3RhdGlvbnNbWyJlbnNlbWJsX2dlbmVfaWQiXV0sIHVuaXF1ZT1UUlVFKQpkaW0oaHNfYW5ub3RhdGlvbnMpCgpscF9zaXplX2Rpc3QgPC0gcGxvdF9oaXN0b2dyYW0obHBfYW5ub3RhdGlvbnNbWyJ3aWR0aCJdXSkKbHBfc2l6ZV9kaXN0CmhzX3NpemVfZGlzdCA8LSBwbG90X2hpc3RvZ3JhbShoc19hbm5vdGF0aW9uc1tbImNkc19sZW5ndGgiXV0pCmhzX3NpemVfZGlzdCArCiAgZ2dwbG90Mjo6c2NhbGVfeF9jb250aW51b3VzKGxpbWl0cz1jKDAsIDIwMDAwKSkKYGBgCgojIyBFeHRyYWN0aW5nIENlbGwgVHlwZXMKCk1hcmlhIEFkZWxhaWRhIHJlcXVlc3RlZCBhZGRpbmcgdGhlIHhDZWxsIGNlbGwgdHlwZXMgdG8gdGhlIGRhdGEuCgpgYGB7ciB4Q2VsbF9kYXRhfQpsaWJyYXJ5KHhDZWxsKQpkYXRhKCJ4Q2VsbC5kYXRhIiwgcGFja2FnZT0ieENlbGwiKQpzdW1tYXJ5KHhDZWxsLmRhdGEpCmxpYnJhcnkoR1NFQUJhc2UpCmRldGFpbHMoeENlbGwuZGF0YSRzaWduYXR1cmVzW1sxXV0pCgpzaWdzIDwtIHhDZWxsLmRhdGEkc2lnbmF0dXJlcwpoZWFkKG5hbWVzKHNpZ3MpLCBuPTEwKQojIyBIZXJlIHdlIHNlZSB0aGF0IHRoZSBzaWduYXR1cmVzIGFyZSBlbmNvZGVkIGFzIDMgZWxlbWVudCBsaXN0cywgdGhlIGZpcnN0IGVsZW1lbnQgaXMgdGhlCiMjIGNlbGwgdHlwZSwgZm9sbG93ZWQgYnkgc291cmNlLCBmb2xsb3dlZCBieSByZXBsaWNhdGUudHh0LgpjZWxsX3R5cGVzIDwtIHVubGlzdChsYXBwbHkoc3Ryc3BsaXQoeD1uYW1lcyhzaWdzKSwgc3BsaXQ9IiUiKSwgZnVuY3Rpb24oeCkgeyB4W1sxXV0gfSkpCmNlbGxfc291cmNlcyA8LSB1bmxpc3QobGFwcGx5KHN0cnNwbGl0KHg9bmFtZXMoc2lncyksIHNwbGl0PSIlIiksIGZ1bmN0aW9uKHgpIHsgeFtbMl1dIH0pKQp0eXBlX2ZhY3QgPC0gYXMuZmFjdG9yKGNlbGxfdHlwZXMpCnR5cGVzIDwtIGxldmVscyh0eXBlX2ZhY3QpCgpjZWxsdHlwZXNfdG9fZ2VuZXMgPC0gbGlzdCgpCmZvciAoYyBpbiAxOmxlbmd0aCh0eXBlcykpIHsKICB0eXBlIDwtIHR5cGVzW2NdCiAgaWR4IDwtIGNlbGxfdHlwZXMgPT0gdHlwZQogIHNldCA8LSBzaWdzW2lkeF0KICBnZW5lcyA8LSBzZXQgJT4lCiAgICBnZW5lSWRzKCkgJT4lCiAgICB1bmxpc3QoKQogIGNlbGx0eXBlc190b19nZW5lc1tbdHlwZV1dIDwtIGFzLmNoYXJhY3RlcihnZW5lcykKfQpnZW5lc190b19jZWxsdHlwZXMgPC0gQmlvYmFzZTo6cmV2ZXJzZVNwbGl0KGNlbGx0eXBlc190b19nZW5lcykKZm9yIChjIGluIDE6bGVuZ3RoKGdlbmVzX3RvX2NlbGx0eXBlcykpIHsKICBnZW5lc190b19jZWxsdHlwZXNbW2NdXSA8LSB0b1N0cmluZyh1bmlxdWUoZ2VuZXNfdG9fY2VsbHR5cGVzW1tjXV0pKQp9CnhjZWxsX3R5cGVzIDwtIHQoYXMuZGF0YS5mcmFtZShnZW5lc190b19jZWxsdHlwZXMpKQpjb2xuYW1lcyh4Y2VsbF90eXBlcykgPC0gInhjZWxsX3R5cGVzIgpgYGAKCiMjIEdldHRpbmcgb250b2xvZ3kgZGF0YQoKQW5ub3RhdGlvbiBmb3IgZ2VuZSBvbnRvbG9naWVzIG1heSBiZSBnYXRoZXJlZCBmcm9tIGEgc2ltaWxhcmx5IGxhcmdlIG51bWJlciBvZgpzb3VyY2VzLiBUaGUgZm9sbG93aW5nIGFyZSBhIGNvdXBsZS4KCmBgYHtyIG9udG9sb2d5fQojIyBUcnkgdXNpbmcgYmlvbWFydApoc19nb19iaW9tYXJ0IDwtIHNtKGxvYWRfYmlvbWFydF9nbygpKQojIyBvciB0aGUgb3JnLkhzLmVnLmRiIHNxbGl0ZSBkYXRhYmFzZQp0dCA8LSBzbShsaWJyYXJ5KCJIb21vLnNhcGllbnMiKSkKaHMgPC0gSG9tby5zYXBpZW5zCiMjaHNfZ29fZW5zZW1ibCA8LSBsb2FkX29yZ2RiX2dvKGhzLCBoc19hbm5vdGF0aW9ucyRnZW5lSUQpCiMjZGltKGhzX2dvX2Jpb21hcnQpCiMjZGltKGhzX2dvX2Vuc2VtYmwpCiMjaHNfZ29pZHMgPC0gaHNfZ29fYmlvbWFydAoKIyMgV2hpbGUgdGVzdGluZywgSSBjYWxsZWQgdGhpcyBkZXNjLCB0aGF0IHdpbGwgbmVlZCB0byBjaGFuZ2UuCiMjbHBfdG9vbHRpcHMgPC0gbWFrZV90b29sdGlwcyhscF9hbm5vdGF0aW9ucykKIyNsYl90b29sdGlwcyA8LSBtYWtlX3Rvb2x0aXBzKGxiX2Fubm90YXRpb25zKQoKbHBfbGVuZ3RocyA8LSBscF9hbm5vdGF0aW9uc1ssIGMoIklEIiwgIndpZHRoIildCmxiX2xlbmd0aHMgPC0gbGJfYW5ub3RhdGlvbnNbLCBjKCJJRCIsICJ3aWR0aCIpXQpoc19sZW5ndGhzIDwtIGhzX2Fubm90YXRpb25zWywgYygiZW5zZW1ibF9nZW5lX2lkIiwgImNkc19sZW5ndGgiKV0KY29sbmFtZXMoaHNfbGVuZ3RocykgPC0gYygiSUQiLCAid2lkdGgiKQoKbHBfZ29pZHMgPC0gcmVhZC5jc3YoZmlsZT0icmVmZXJlbmNlL2xwYW5fZ28udHh0Lnh6Iiwgc2VwPSJcdCIsIGhlYWRlcj1GQUxTRSkKbGJfZ29pZHMgPC0gcmVhZC5jc3YoZmlsZT0icmVmZXJlbmNlL2xicmF6X2dvLnR4dC54eiIsIHNlcD0iXHQiLCBoZWFkZXI9RkFMU0UpCmNvbG5hbWVzKGxwX2dvaWRzKSA8LSBjKCJJRCIsIkdPIiwib250IiwibmFtZSIsInNvdXJjZSIsInRhZyIpCmNvbG5hbWVzKGxiX2dvaWRzKSA8LSBjKCJJRCIsIkdPIiwib250IiwibmFtZSIsInNvdXJjZSIsInRhZyIpCmBgYAoKIyBQdXR0aW5nIHRoZSBwaWVjZXMgdG9nZXRoZXIKClRoZSBtYWNyb3BoYWdlIGV4cGVyaW1lbnQgaGFzIHNhbXBsZXMgYWNyb3NzIDIgY29udGV4dHMsIHRoZSBob3N0IGFuZCBwYXJhc2l0ZS4KVGhlIGZvbGxvd2luZyBibG9jayBzZXRzIHVwIG9uZSBleHBlcmltZW50IGZvciBlYWNoLiAgSWYgeW91IG9wZW4gdGhlCmFsbF9zYW1wbGVzLXNwZWNpZXMueGxzeCBmaWxlcywgeW91IHdpbGwgbm90ZSBpbW1lZGlhdGVseSB0aGF0IGEgZmV3IGRpZmZlcmVudAphdHRlbXB0cyB3ZXJlIG1hZGUgYXQgYXNjZXJ0YWluaW5nIHRoZSBtb3N0IGxpa2VseSBleHBlcmltZW50YWwgZmFjdG9ycyB0aGF0CmNvbnRyaWJ1dGVkIHRvIHRoZSByZWFkaWx5IGFwcGFyZW50IGJhdGNoIGVmZmVjdHMuCgojIyBUaGUgaHVtYW4gdHJhbnNjcmlwdG9tZSBtYXBwaW5ncwoKS2VlcCBpbiBtaW5kIHRoYXQgaWYgSSBjaGFuZ2UgdGhlIGV4cGVyaW1lbnRhbCBkZXNpZ24gd2l0aCBuZXcgYW5ub3RhdGlvbnMsIEkKbXVzdCB0aGVyZWZvcmUgcmVnZW5lcmF0ZSB0aGUgZm9sbG93aW5nLgoKYGBge3IgaHNfZXhwdH0KaHNfZmluYWxfYW5ub3RhdGlvbnMgPC0gaHNfYW5ub3RhdGlvbnMKaHNfZmluYWxfYW5ub3RhdGlvbnMgPC0gaHNfZmluYWxfYW5ub3RhdGlvbnNbLCBjKCJlbnNlbWJsX3RyYW5zY3JpcHRfaWQiLCAiZW5zZW1ibF9nZW5lX2lkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJoZ25jX3N5bWJvbCIsICJkZXNjcmlwdGlvbiIsICJnZW5lX2Jpb3R5cGUiKV0KaHNfZmluYWxfYW5ub3RhdGlvbnMkcm4gPC0gcm93bmFtZXMoaHNfZmluYWxfYW5ub3RhdGlvbnMpCm5vdGUgPC0gIk5ldyBleHBlcmltZW50YWwgZGVzaWduIGZhY3RvcnMgYnkgc25wIGFkZGVkIDIwMTYtMDktMjAiCmhzX2ZpbmFsX2Fubm90YXRpb25zIDwtIG1lcmdlKGhzX2ZpbmFsX2Fubm90YXRpb25zLCB4Y2VsbF90eXBlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnkueD0iaGduY19zeW1ib2wiLCBieS55PSJyb3cubmFtZXMiLCBhbGwueD1UUlVFKQpyb3duYW1lcyhoc19maW5hbF9hbm5vdGF0aW9ucykgPC0gaHNfZmluYWxfYW5ub3RhdGlvbnMkcm4KaHNfZmluYWxfYW5ub3RhdGlvbnMkcm4gPC0gTlVMTApuYV9pZHggPC0gaXMubmEoaHNfZmluYWxfYW5ub3RhdGlvbnMkeGNlbGxfdHlwZXMpCmhzX2ZpbmFsX2Fubm90YXRpb25zW25hX2lkeCwgInhjZWxsX3R5cGVzIl0gPC0gIiIKCmhzX2V4cHQgPC0gc20oY3JlYXRlX2V4cHQoInNhbXBsZV9zaGVldHMvYWxsX3NhbXBsZXMtY29tYmluZWQueGxzeCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZV9pbmZvPWhzX2ZpbmFsX2Fubm90YXRpb25zLAogICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVfY29sdW1uPSJodW1hbmZpbGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgIG5vdGVzPW5vdGUpKQprbml0cjo6a2FibGUoaGVhZChoc19leHB0JGRlc2lnbiwgbj0xKSkKCmNkc19lbnRyaWVzIDwtIGZEYXRhKGhzX2V4cHQpCmNkc19lbnRyaWVzIDwtIGNkc19lbnRyaWVzW1siZ2VuZV9iaW90eXBlIl1dID09ICJwcm90ZWluX2NvZGluZyIKaHNfY2RzX2V4cHQgPC0gaHNfZXhwdApoc19jZHNfZXhwdCRleHByZXNzaW9uc2V0IDwtIGhzX2Nkc19leHB0JGV4cHJlc3Npb25zZXRbY2RzX2VudHJpZXMsIF0KbmV3X2Nkc19lbnRyaWVzIDwtIGZEYXRhKGhzX2Nkc19leHB0KQpgYGAKCiMjIFRoZSBwYXJhc2l0ZSB0cmFuc2NyaXB0b21lIG1hcHBpbmdzCgpgYGB7ciBwYXJhc2l0ZV9leHB0fQpwYXJhc2l0ZV9leHB0IDwtIHNtKGNyZWF0ZV9leHB0KCJzYW1wbGVfc2hlZXRzL2FsbF9zYW1wbGVzLWNvbWJpbmVkLnhsc3giLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVfaW5mbz1scF9hbm5vdGF0aW9ucywgZmlsZV9jb2x1bW49InBhcmFzaXRlZmlsZSIpKQprbml0cjo6a2FibGUoaGVhZChwYXJhc2l0ZV9leHB0JGRlc2lnbiwgbj0zKSwKICAgICAgICAgICAgIGNhcHRpb249IlRoZSBmaXJzdCB0aHJlZSByb3dzIG9mIHRoZSBwYXJhc2l0ZSBleHBlcmltZW50YWwgZGVzaWduLiIpCmBgYAoKIyBTdXBwbGVtZW50YWwgVGFibGUgMQoKVGFibGUgUzEgaXMgZ29pbmcgdG8gYmUgYSBzdW1tYXJ5IG9mIHRoZSBtZXRhZGF0YSBpbiBhbGxfc2FtcGxlcy1jb21iaW5lZApUaGlzIG1heSBhbHNvIGluY2x1ZGUgc29tZSBvZiB0aGUgbnVtYmVycyByZWdhcmRpbmcgbWFwcGluZyAlLCBldGMuCgpXYW50ZWQgY29sdW1uczoKCiogU2FtcGxlIElEOiAgSFBHTHh4eHgKKiBEb25vciBDb2RlOiBUTTEzMCBvciBQRzF4eAoqIENlbGwgVHlwZTogIE1hY3JvcGhhZ2Ugb3IgUEJNQwoqIEluZmVjdGlvbiBTdGF0dXM6ICBJbmZlY3RlZCBvciBVbmluZmVjdGVkCiogRGlzZWFzZSBPdXRjb21lOiAgQ2hyb25pYyBvciBTZWxmLUhlYWxpbmcgb3IgTkEKKiBCYXRjaDogQSBvciBCIChtYWNyb3BoYWdlKTsgTkEgZm9yIFBCTUMKKiBOdW1iZXIgb2YgcmVhZHMgdGhhdCBwYXNzZWQgSWxsdW1pbmEgZmlsdGVyCiogTnVtYmVyIG9mIHJlYWRzIGFmdGVyIHRyaW1taW5nCiogTnVtYmVyIG9mIHJlYWRzIG1hcHBlZCAtIGh1bWFuCiogJSByZWFkcyBtYXBwZWQgLSBodW1hbgoqIE51bWJlciBvZiByZWFkcyBtYXBwZWQgLSBMLnBhbmFtZW5zaXMKKiAlIHJlYWRzIG1hcHBlZCAtIEwucGFuYW1lbnNpcwoKVXNlIHRoZSBUY3J1emkgY29sb3JzLgoKKiBBMSBpcyBhIGxhcmdlIHRpdGxlOiAiTWFjcm9waGFnZSBTYW1wbGVzIgoqIFJvdyAyIGlzIHRoZSBibHVlIGNvbHVtbiBoZWFkaW5ncwoqIDMtbSBjb250YWlucyBNYWNyb3BoYWdlIG1ldGFkYXRhCiogbSsxIGlzIGJsYW5rCiogbSsyIGlzIGEgbGFyZ2UgdGl0bGU6ICJQQk1DIFNhbXBsZXMiCiogbSszLW4gY29udGFpbnMgUEJNQyBtZXRhZGF0YQoKIyBFbmQKCkF0IHRoaXMgcG9pbnQsIHdlIHNob3VsZCBoYXZlIGV2ZXJ5dGhpbmcgbmVjZXNzYXJ5IHRvIHBlcmZvcm0gdGhlIHZhcmlvdXMKYW5hbHlzZXMgb2YgdGhlIDQgc3ViLWV4cGVyaW1lbnRzLiAgU28gc2F2ZSB0aGUgY3VycmVudCBkYXRhIGZvciByZXVzZQplbHNld2hlcmUuCgpUaGUgZXhwZXJpbWVudGFsIGRlc2lnbiBpcyBhdmFpbGFibGUKW2hlcmVdKHNhbXBsZV9zaGVldHMvYWxsX3NhbXBsZXMtY29tYmluZWQueGxzeCIpLgoKYGBge3Igc2F2ZW1lfQptZXNzYWdlKHBhc3RlMCgiVGhpcyBpcyBocGdsdG9vbHMgY29tbWl0OiAiLCBnZXRfZ2l0X2NvbW1pdCgpKSkKdGhpc19zYXZlIDwtIHBhc3RlMChnc3ViKHBhdHRlcm49IlxcLlJtZCIsIHJlcGxhY2U9IiIsIHg9cm1kX2ZpbGUpLCAiLXYiLCB2ZXIsICIucmRhLnh6IikKbWVzc2FnZShwYXN0ZTAoIlNhdmluZyB0byAiLCB0aGlzX3NhdmUpKQp0bXAgPC0gc2F2ZW1lKGZpbGVuYW1lPXRoaXNfc2F2ZSkKcGFuZGVyOjpwYW5kZXIoc2Vzc2lvbkluZm8oKSkKYGBgCg==