Summary of Findings:
As far as the TMB comparisons go, it doesn’t matter if we use Variant_Classification
filters or not. They are highly correlated no matter what and the same general TCGA to PBTA differences seem to persist.
Setup
# Magrittr pipe
`%>%` <- dplyr::`%>%`
source(file.path("..", "..", "tmb-compare-tcga", "util", "cdf-plot-function.R"))
dir.create("plots", showWarnings = FALSE)
Read in the TMB files
Read in PBTA data
tmb_pbta_no_filter <- data.table::fread(file.path(
"..",
"results",
"no_filter",
"pbta-snv-mutation-tmb-coding.tsv"
)) %>%
# This variable is weird when binding but we don't need it for the plot so we'll just remove it.
dplyr::select(-region_size) %>%
dplyr::filter(experimental_strategy != "Panel") %>%
dplyr::mutate(filter = "no filter")
tmb_pbta_with_filter <- data.table::fread(file.path(
"..",
"results",
"consensus",
"pbta-snv-mutation-tmb-coding.tsv"
)) %>%
# This variable is weird when binding but we don't need it for the plot so we'll just remove it.
dplyr::select(-region_size) %>%
dplyr::filter(experimental_strategy != "Panel") %>%
dplyr::mutate(filter = "filter")
tmb_pbta <- dplyr::inner_join(tmb_pbta_no_filter,
dplyr::select(tmb_pbta_with_filter, Tumor_Sample_Barcode, tmb),
by = "Tumor_Sample_Barcode",
suffix = c("_no_filter", "_filter")
)
Read in TCGA data
tmb_tcga_no_filter <- data.table::fread(file.path(
"..",
"results",
"no_filter",
"tcga-snv-mutation-tmb-coding.tsv"
)) %>%
dplyr::select(-region_size) %>%
dplyr::mutate(filter = "no filter")
tmb_tcga_with_filter <- data.table::fread(file.path(
"..",
"results",
"consensus",
"tcga-snv-mutation-tmb-coding.tsv"
)) %>%
dplyr::select(-region_size) %>%
dplyr::mutate(filter = "filter")
Join these together.
tmb_tcga <- dplyr::inner_join(tmb_tcga_no_filter,
dplyr::select(tmb_tcga_with_filter, Tumor_Sample_Barcode, tmb),
by = "Tumor_Sample_Barcode",
suffix = c("_no_filter", "_filter")
)
Does the filter change a participant’s TMB?
Plot PBTA data
cor.test(tmb_tcga$tmb_filter, tmb_tcga$tmb_no_filter)
Pearson's product-moment correlation
data: tmb_tcga$tmb_filter and tmb_tcga$tmb_no_filter
t = 4296.2, df = 316, p-value < 2.2e-16
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
0.9999893 0.9999931
sample estimates:
cor
0.9999914
tcga_cor_plot <- ggplot2::ggplot(
tmb_tcga,
ggplot2::aes(x = tmb_no_filter, y = tmb_filter, color = short_histology)
) +
ggplot2::geom_point() +
ggplot2::xlim(0, 5) +
ggplot2::ylim(0, 5) +
ggplot2::theme_classic() +
ggplot2::theme(legend.position = "none")
tcga_cor_plot

Plot TCGA data
cor.test(tmb_tcga$tmb_filter, tmb_tcga$tmb_no_filter)
Pearson's product-moment correlation
data: tmb_tcga$tmb_filter and tmb_tcga$tmb_no_filter
t = 4296.2, df = 316, p-value < 2.2e-16
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
0.9999893 0.9999931
sample estimates:
cor
0.9999914
all_data <- dplyr::bind_rows(list(tcga = tmb_tcga, pbta = tmb_pbta), .id = "dataset") %>%
dplyr::select(tmb_filter, tmb_no_filter, dataset, Tumor_Sample_Barcode, short_histology) %>%
tidyr::gather("filter", "tmb", -Tumor_Sample_Barcode, -dataset, -short_histology)
Are some histologies affected more than others?
pbta_cor_plot +
ggplot2::facet_wrap(~short_histology)

tcga_cor_plot +
ggplot2::facet_wrap(~short_histology)

Does the filter affect the TCGA-PBTA comparison change?
all_data <- dplyr::bind_rows(list(tcga = tmb_tcga, pbta = tmb_pbta), .id = "dataset") %>%
dplyr::select(tmb_filter, tmb_no_filter, dataset, Tumor_Sample_Barcode, short_histology) %>%
tidyr::gather("filter", "tmb", -Tumor_Sample_Barcode, -dataset, -short_histology)
ggplot2::ggplot(all_data, ggplot2::aes(x = dataset, y = tmb)) +
ggforce::geom_sina() +
ggplot2::theme_classic() +
ggplot2::ylim(0, 10) +
ggplot2::theme(legend.position = "none") +
ggplot2::facet_wrap("filter")

Plot the TMB plot with no filter data
This code is directly copied from tmb-compare-tcga/tmb-compare-tcga.Rmd
.
pbta_plot <- cdf_plot(
df = tmb_pbta_no_filter,
plot_title = "PBTA",
num_col = "tmb",
group_col = "short_histology",
color = "#3BC8A2",
n_group = 5,
x_lim = c(-1.2, 1.2),
y_lim = c(0, 400),
x_lab = "",
y_lab = "Coding Mutations per Mb",
breaks = c(0, 3, 10, 30, 100, 300)
) +
ggplot2::theme(
strip.text.x = ggplot2::element_text(size = 12),
plot.margin = grid::unit(c(0.5, 0, 0.6, 0.5), "cm")
)
the condition has length > 1 and only the first element will be used
tcga_plot <- cdf_plot(
df = tmb_tcga_no_filter,
plot_title = "TCGA (Adult)",
num_col = "tmb",
group_col = "short_histology",
color = "#630882",
n_group = 5,
x_lim = c(-1.2, 1.2),
y_lim = c(0, 400),
x_lab = "",
y_lab = "Coding Mutations per Mb",
breaks = c()
) +
ggplot2::theme(
axis.title.y = ggplot2::element_blank(),
axis.text.y = ggplot2::element_blank(),
axis.ticks.y = ggplot2::element_blank(),
strip.text.x = ggplot2::element_text(size = 9),
plot.margin = grid::unit(c(0.5, 1, 0.1, 0), "cm")
)
the condition has length > 1 and only the first element will be used
# Put the plots together
tmb_plot <- cowplot::plot_grid(pbta_plot, tcga_plot,
align = "v",
axis = "left",
rel_widths = c(2.5, 1),
label_size = 12
)
Removed 3 rows containing missing values (geom_point).Removed 1 rows containing missing values (geom_point).
# Save the plot to a png
cowplot::save_plot(file.path("plots", "no_filter_tmb-cdf-pbta-tcga.png"),
plot = tmb_plot, base_width = 35, base_height = 20, unit = "cm"
)
Print from png
No filter TMB Plot

With filter TMB Plot
## Session Info
sessionInfo()
R version 3.6.0 (2019-04-26)
Platform: x86_64-pc-linux-gnu (64-bit)
Running under: Debian GNU/Linux 9 (stretch)
Matrix products: default
BLAS/LAPACK: /usr/lib/libopenblasp-r0.2.19.so
locale:
[1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C LC_TIME=en_US.UTF-8
[4] LC_COLLATE=en_US.UTF-8 LC_MONETARY=en_US.UTF-8 LC_MESSAGES=C
[7] LC_PAPER=en_US.UTF-8 LC_NAME=C LC_ADDRESS=C
[10] LC_TELEPHONE=C LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C
attached base packages:
[1] stats graphics grDevices utils datasets methods base
loaded via a namespace (and not attached):
[1] Rcpp_1.0.1 pillar_1.4.2 compiler_3.6.0 base64enc_0.1-3 tools_3.6.0
[6] digest_0.6.20 jsonlite_1.6 evaluate_0.14 tibble_2.1.3 gtable_0.3.0
[11] pkgconfig_2.0.2 rlang_0.4.0 cli_1.1.0 rstudioapi_0.10 yaml_2.2.0
[16] xfun_0.8 withr_2.1.2 styler_1.1.1 stringr_1.4.0 dplyr_0.8.3
[21] knitr_1.23 cowplot_0.9.4 grid_3.6.0 tidyselect_0.2.5 glue_1.3.1
[26] data.table_1.12.2 R6_2.4.0 rmarkdown_1.13 polyclip_1.10-0 rematch2_2.0.1
[31] ggplot2_3.2.0 purrr_0.3.2 tidyr_0.8.3 tweenr_1.0.1 farver_1.1.0
[36] magrittr_1.5 backports_1.1.4 scales_1.0.0 htmltools_0.3.6 MASS_7.3-51.4
[41] assertthat_0.2.1 ggforce_0.2.2 colorspace_1.4-1 labeling_0.3 stringi_1.4.3
[46] lazyeval_0.2.2 munsell_0.5.0 crayon_1.3.4
LS0tCnRpdGxlOiAiRXhwbG9yZSBpbXBhY3Qgb2YgTm9uIFN5bm9ueW1vdXMgRmlsdGVycyIKb3V0cHV0OiAKICBodG1sX25vdGVib29rOgogICAgdG9jOiBUUlVFCiAgICB0b2NfZmxvYXQ6IFRSVUUKYXV0aG9yOiBDLiBTYXZvbmVuIGZvciBBTFNGIENDREwKZGF0ZTogMjAyMAotLS0KCiMjIyBTdW1tYXJ5IG9mIEZpbmRpbmdzOgoKQXMgZmFyIGFzIHRoZSBUTUIgY29tcGFyaXNvbnMgZ28sIGl0IGRvZXNuJ3QgbWF0dGVyIGlmIHdlIHVzZSBgVmFyaWFudF9DbGFzc2lmaWNhdGlvbmAgZmlsdGVycyBvciBub3QuIApUaGV5IGFyZSBoaWdobHkgY29ycmVsYXRlZCBubyBtYXR0ZXIgd2hhdCBhbmQgdGhlIHNhbWUgZ2VuZXJhbCBUQ0dBIHRvIFBCVEEgZGlmZmVyZW5jZXMgc2VlbSB0byBwZXJzaXN0LiAKCiMjIyBVc2FnZQoKT24gQVdTLCBpZiBib3RoIGBydW5fY2FsbGVyX2NvbnNlbnN1c19hbmFseXNpcy10Y2dhLnNoYCBhbmQgYHJ1bl9jYWxsZXJfY29uc2Vuc3VzX2FuYWx5c2lzLXBidGEuc2hgIGhhdmUgYmVlbiBydW4sIHlvdSBjYW4gcnVuIHRoaXMgdG8gZ2V0IHRoaXMgYW5hbHlzaXMgcmFuLgoKYGBgCiMgYmFzaCBydW5fZXhwbG9yYXRpb25zLnNoCmBgYAoKPCEtLSBTVEFSVCBkb2N0b2MgZ2VuZXJhdGVkIFRPQyBwbGVhc2Uga2VlcCBjb21tZW50IGhlcmUgdG8gYWxsb3cgYXV0byB1cGRhdGUgLS0+CjwhLS0gRE9OJ1QgRURJVCBUSElTIFNFQ1RJT04sIElOU1RFQUQgUkUtUlVOIGRvY3RvYyBUTyBVUERBVEUgLS0+CioqVGFibGUgb2YgQ29udGVudHMqKiAgKmdlbmVyYXRlZCB3aXRoIFtEb2NUb2NdKGh0dHBzOi8vZ2l0aHViLmNvbS90aGxvcmVuei9kb2N0b2MpKgotIFtTZXR1cF0oI3NldHVwKQotIFtSZWFkIGluIHRoZSBUTUIgZmlsZXNdKCNyZWFkLWluLXRoZS10bWItZmlsZXMpCiAgLSBbUmVhZCBpbiBQQlRBIGRhdGFdKCNyZWFkLWluLXBidGEtZGF0YSkKICAtIFtSZWFkIGluIFRDR0EgZGF0YV0oI3JlYWQtaW4tdGNnYS1kYXRhKQotIFtEb2VzIHRoZSBmaWx0ZXIgY2hhbmdlIGEgcGFydGljaXBhbnQncyBUTUI/XSgjZG9lcy10aGUtZmlsdGVyLWNoYW5nZS1hLXBhcnRpY2lwYW50cy10bWIpCiAgLSBbUGxvdCBQQlRBIGRhdGFdKCNwbG90LXBidGEtZGF0YSkKICAtIFtQbG90IFRDR0EgZGF0YV0oI3Bsb3QtdGNnYS1kYXRhKQotIFtBcmUgc29tZSBoaXN0b2xvZ2llcyBhZmZlY3RlZCBtb3JlIHRoYW4gb3RoZXJzP10oI2FyZS1zb21lLWhpc3RvbG9naWVzLWFmZmVjdGVkLW1vcmUtdGhhbi1vdGhlcnMpCi0gW0RvZXMgdGhlIGZpbHRlciBhZmZlY3QgdGhlIFRDR0EtUEJUQSBjb21wYXJpc29uIGNoYW5nZT9dKCNkb2VzLXRoZS1maWx0ZXItYWZmZWN0LXRoZS10Y2dhLXBidGEtY29tcGFyaXNvbi1jaGFuZ2UpCi0gW1Bsb3QgdGhlIFRNQiBwbG90IHdpdGggbm8gZmlsdGVyIGRhdGFdKCNwbG90LXRoZS10bWItcGxvdC13aXRoLW5vLWZpbHRlci1kYXRhKQotIFtTZXNzaW9uIEluZm9dKCNzZXNzaW9uLWluZm8pCgo8IS0tIEVORCBkb2N0b2MgZ2VuZXJhdGVkIFRPQyBwbGVhc2Uga2VlcCBjb21tZW50IGhlcmUgdG8gYWxsb3cgYXV0byB1cGRhdGUgLS0+CgojIyBTZXR1cAoKYGBge3J9CiMgTWFncml0dHIgcGlwZQpgJT4lYCA8LSBkcGx5cjo6YCU+JWAKYGBgCgpgYGB7cn0Kc291cmNlKGZpbGUucGF0aCgiLi4iLCAiLi4iLCAidG1iLWNvbXBhcmUtdGNnYSIsICJ1dGlsIiwgImNkZi1wbG90LWZ1bmN0aW9uLlIiKSkKYGBgCgpgYGB7cn0KZGlyLmNyZWF0ZSgicGxvdHMiLCBzaG93V2FybmluZ3MgPSBGQUxTRSkKYGBgCgojIyBSZWFkIGluIHRoZSBUTUIgZmlsZXMKCiMjIyBSZWFkIGluIFBCVEEgZGF0YQoKYGBge3J9CnRtYl9wYnRhX25vX2ZpbHRlciA8LSBkYXRhLnRhYmxlOjpmcmVhZChmaWxlLnBhdGgoCiAgIi4uIiwKICAicmVzdWx0cyIsCiAgIm5vX2ZpbHRlciIsCiAgInBidGEtc252LW11dGF0aW9uLXRtYi1jb2RpbmcudHN2IgopKSAlPiUKICAjIFRoaXMgdmFyaWFibGUgaXMgd2VpcmQgd2hlbiBiaW5kaW5nIGJ1dCB3ZSBkb24ndCBuZWVkIGl0IGZvciB0aGUgcGxvdCBzbyB3ZSdsbCBqdXN0IHJlbW92ZSBpdC4KICBkcGx5cjo6c2VsZWN0KC1yZWdpb25fc2l6ZSkgJT4lCiAgZHBseXI6OmZpbHRlcihleHBlcmltZW50YWxfc3RyYXRlZ3kgIT0gIlBhbmVsIikgJT4lCiAgZHBseXI6Om11dGF0ZShmaWx0ZXIgPSAibm8gZmlsdGVyIikKYGBgCgpgYGB7cn0KdG1iX3BidGFfd2l0aF9maWx0ZXIgPC0gZGF0YS50YWJsZTo6ZnJlYWQoZmlsZS5wYXRoKAogICIuLiIsCiAgInJlc3VsdHMiLAogICJjb25zZW5zdXMiLAogICJwYnRhLXNudi1tdXRhdGlvbi10bWItY29kaW5nLnRzdiIKKSkgJT4lCiAgIyBUaGlzIHZhcmlhYmxlIGlzIHdlaXJkIHdoZW4gYmluZGluZyBidXQgd2UgZG9uJ3QgbmVlZCBpdCBmb3IgdGhlIHBsb3Qgc28gd2UnbGwganVzdCByZW1vdmUgaXQuCiAgZHBseXI6OnNlbGVjdCgtcmVnaW9uX3NpemUpICU+JQogIGRwbHlyOjpmaWx0ZXIoZXhwZXJpbWVudGFsX3N0cmF0ZWd5ICE9ICJQYW5lbCIpICU+JQogIGRwbHlyOjptdXRhdGUoZmlsdGVyID0gImZpbHRlciIpCmBgYAoKYGBge3J9CnRtYl9wYnRhIDwtIGRwbHlyOjppbm5lcl9qb2luKHRtYl9wYnRhX25vX2ZpbHRlciwKICBkcGx5cjo6c2VsZWN0KHRtYl9wYnRhX3dpdGhfZmlsdGVyLCBUdW1vcl9TYW1wbGVfQmFyY29kZSwgdG1iKSwKICBieSA9ICJUdW1vcl9TYW1wbGVfQmFyY29kZSIsCiAgc3VmZml4ID0gYygiX25vX2ZpbHRlciIsICJfZmlsdGVyIikKKQpgYGAKCiMjIyBSZWFkIGluIFRDR0EgZGF0YQoKYGBge3J9CnRtYl90Y2dhX25vX2ZpbHRlciA8LSBkYXRhLnRhYmxlOjpmcmVhZChmaWxlLnBhdGgoCiAgIi4uIiwKICAicmVzdWx0cyIsCiAgIm5vX2ZpbHRlciIsCiAgInRjZ2Etc252LW11dGF0aW9uLXRtYi1jb2RpbmcudHN2IgopKSAlPiUKICBkcGx5cjo6c2VsZWN0KC1yZWdpb25fc2l6ZSkgJT4lCiAgZHBseXI6Om11dGF0ZShmaWx0ZXIgPSAibm8gZmlsdGVyIikKYGBgCgpgYGB7cn0KdG1iX3RjZ2Ffd2l0aF9maWx0ZXIgPC0gZGF0YS50YWJsZTo6ZnJlYWQoZmlsZS5wYXRoKAogICIuLiIsCiAgInJlc3VsdHMiLAogICJjb25zZW5zdXMiLAogICJ0Y2dhLXNudi1tdXRhdGlvbi10bWItY29kaW5nLnRzdiIKKSkgJT4lCiAgZHBseXI6OnNlbGVjdCgtcmVnaW9uX3NpemUpICU+JQogIGRwbHlyOjptdXRhdGUoZmlsdGVyID0gImZpbHRlciIpCmBgYAoKSm9pbiB0aGVzZSB0b2dldGhlci4gCgpgYGB7cn0KdG1iX3RjZ2EgPC0gZHBseXI6OmlubmVyX2pvaW4odG1iX3RjZ2Ffbm9fZmlsdGVyLAogIGRwbHlyOjpzZWxlY3QodG1iX3RjZ2Ffd2l0aF9maWx0ZXIsIFR1bW9yX1NhbXBsZV9CYXJjb2RlLCB0bWIpLAogIGJ5ID0gIlR1bW9yX1NhbXBsZV9CYXJjb2RlIiwKICBzdWZmaXggPSBjKCJfbm9fZmlsdGVyIiwgIl9maWx0ZXIiKQopCmBgYAoKIyMgRG9lcyB0aGUgZmlsdGVyIGNoYW5nZSBhIHBhcnRpY2lwYW50J3MgVE1CPwoKIyMjIFBsb3QgUEJUQSBkYXRhCgpgYGB7cn0KY29yLnRlc3QodG1iX3BidGEkdG1iX2ZpbHRlciwgdG1iX3BidGEkdG1iX25vX2ZpbHRlcikKYGBgCgpgYGB7cn0KcGJ0YV9jb3JfcGxvdCA8LSBnZ3Bsb3QyOjpnZ3Bsb3QoCiAgdG1iX3BidGEsCiAgZ2dwbG90Mjo6YWVzKHggPSB0bWJfbm9fZmlsdGVyLCB5ID0gdG1iX2ZpbHRlciwgY29sb3IgPSBzaG9ydF9oaXN0b2xvZ3kpCikgKwogIGdncGxvdDI6Omdlb21fcG9pbnQoKSArCiAgZ2dwbG90Mjo6eGxpbSgwLCA1KSArCiAgZ2dwbG90Mjo6eWxpbSgwLCA1KSArCiAgZ2dwbG90Mjo6dGhlbWVfY2xhc3NpYygpICsKICBnZ3Bsb3QyOjp0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpCgpwYnRhX2Nvcl9wbG90CmBgYAoKIyMjIFBsb3QgVENHQSBkYXRhCgpgYGB7cn0KY29yLnRlc3QodG1iX3RjZ2EkdG1iX2ZpbHRlciwgdG1iX3RjZ2EkdG1iX25vX2ZpbHRlcikKYGBgCgpgYGB7cn0KdGNnYV9jb3JfcGxvdCA8LSBnZ3Bsb3QyOjpnZ3Bsb3QoCiAgdG1iX3RjZ2EsCiAgZ2dwbG90Mjo6YWVzKHggPSB0bWJfbm9fZmlsdGVyLCB5ID0gdG1iX2ZpbHRlciwgY29sb3IgPSBzaG9ydF9oaXN0b2xvZ3kpCikgKwogIGdncGxvdDI6Omdlb21fcG9pbnQoKSArCiAgZ2dwbG90Mjo6eGxpbSgwLCA1KSArCiAgZ2dwbG90Mjo6eWxpbSgwLCA1KSArCiAgZ2dwbG90Mjo6dGhlbWVfY2xhc3NpYygpICsKICBnZ3Bsb3QyOjp0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpCgp0Y2dhX2Nvcl9wbG90CmBgYAoKIyMgQXJlIHNvbWUgaGlzdG9sb2dpZXMgYWZmZWN0ZWQgbW9yZSB0aGFuIG90aGVycz8gCgpgYGB7cn0KcGJ0YV9jb3JfcGxvdCArIAogIGdncGxvdDI6OmZhY2V0X3dyYXAofnNob3J0X2hpc3RvbG9neSkKYGBgCgpgYGB7cn0KdGNnYV9jb3JfcGxvdCArIAogIGdncGxvdDI6OmZhY2V0X3dyYXAofnNob3J0X2hpc3RvbG9neSkKYGBgCgojIyBEb2VzIHRoZSBmaWx0ZXIgYWZmZWN0IHRoZSBUQ0dBLVBCVEEgY29tcGFyaXNvbiBjaGFuZ2U/CgpgYGB7cn0KYWxsX2RhdGEgPC0gZHBseXI6OmJpbmRfcm93cyhsaXN0KHRjZ2EgPSB0bWJfdGNnYSwgcGJ0YSA9IHRtYl9wYnRhKSwgLmlkID0gImRhdGFzZXQiKSAlPiUKICBkcGx5cjo6c2VsZWN0KHRtYl9maWx0ZXIsIHRtYl9ub19maWx0ZXIsIGRhdGFzZXQsIFR1bW9yX1NhbXBsZV9CYXJjb2RlLCBzaG9ydF9oaXN0b2xvZ3kpICU+JQogIHRpZHlyOjpnYXRoZXIoImZpbHRlciIsICJ0bWIiLCAtVHVtb3JfU2FtcGxlX0JhcmNvZGUsIC1kYXRhc2V0LCAtc2hvcnRfaGlzdG9sb2d5KQpgYGAKCmBgYHtyfQpnZ3Bsb3QyOjpnZ3Bsb3QoYWxsX2RhdGEsIGdncGxvdDI6OmFlcyh4ID0gZGF0YXNldCwgeSA9IHRtYikpICsKICBnZ2ZvcmNlOjpnZW9tX3NpbmEoKSArCiAgZ2dwbG90Mjo6dGhlbWVfY2xhc3NpYygpICsKICBnZ3Bsb3QyOjp5bGltKDAsIDEwKSArCiAgZ2dwbG90Mjo6dGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArCiAgZ2dwbG90Mjo6ZmFjZXRfd3JhcCgiZmlsdGVyIikKYGBgCgojIyBQbG90IHRoZSBUTUIgcGxvdCB3aXRoIG5vIGZpbHRlciBkYXRhCgpUaGlzIGNvZGUgaXMgZGlyZWN0bHkgY29waWVkIGZyb20gYHRtYi1jb21wYXJlLXRjZ2EvdG1iLWNvbXBhcmUtdGNnYS5SbWRgLgoKYGBge3J9CnBidGFfcGxvdCA8LSBjZGZfcGxvdCgKICBkZiA9IHRtYl9wYnRhX25vX2ZpbHRlciwKICBwbG90X3RpdGxlID0gIlBCVEEiLAogIG51bV9jb2wgPSAidG1iIiwKICBncm91cF9jb2wgPSAic2hvcnRfaGlzdG9sb2d5IiwKICBjb2xvciA9ICIjM0JDOEEyIiwKICBuX2dyb3VwID0gNSwKICB4X2xpbSA9IGMoLTEuMiwgMS4yKSwKICB5X2xpbSA9IGMoMCwgNDAwKSwKICB4X2xhYiA9ICIiLAogIHlfbGFiID0gIkNvZGluZyBNdXRhdGlvbnMgcGVyIE1iIiwgCiAgYnJlYWtzID0gYygwLCAzLCAxMCwgMzAsIDEwMCwgMzAwKQopICsKICBnZ3Bsb3QyOjp0aGVtZSgKICAgIHN0cmlwLnRleHQueCA9IGdncGxvdDI6OmVsZW1lbnRfdGV4dChzaXplID0gMTIpLCAKICAgIHBsb3QubWFyZ2luID0gZ3JpZDo6dW5pdChjKDAuNSwgMCwgMC42LCAwLjUpLCAiY20iKQogICkKYGBgCgpgYGB7cn0KdGNnYV9wbG90IDwtIGNkZl9wbG90KAogIGRmID0gdG1iX3RjZ2Ffbm9fZmlsdGVyLAogIHBsb3RfdGl0bGUgPSAiVENHQSAoQWR1bHQpIiwKICBudW1fY29sID0gInRtYiIsCiAgZ3JvdXBfY29sID0gInNob3J0X2hpc3RvbG9neSIsCiAgY29sb3IgPSAiIzYzMDg4MiIsCiAgbl9ncm91cCA9IDUsCiAgeF9saW0gPSBjKC0xLjIsIDEuMiksCiAgeV9saW0gPSBjKDAsIDQwMCksCiAgeF9sYWIgPSAiIiwKICB5X2xhYiA9ICJDb2RpbmcgTXV0YXRpb25zIHBlciBNYiIsCiAgYnJlYWtzID0gYygpCikgKwogIGdncGxvdDI6OnRoZW1lKAogICAgYXhpcy50aXRsZS55ID0gZ2dwbG90Mjo6ZWxlbWVudF9ibGFuaygpLAogICAgYXhpcy50ZXh0LnkgPSBnZ3Bsb3QyOjplbGVtZW50X2JsYW5rKCksCiAgICBheGlzLnRpY2tzLnkgPSBnZ3Bsb3QyOjplbGVtZW50X2JsYW5rKCksCiAgICBzdHJpcC50ZXh0LnggPSBnZ3Bsb3QyOjplbGVtZW50X3RleHQoc2l6ZSA9IDkpLCAKICAgIHBsb3QubWFyZ2luID0gZ3JpZDo6dW5pdChjKDAuNSwgMSwgMC4xLCAwKSwgImNtIikKICApCmBgYAoKYGBge3J9CiMgUHV0IHRoZSBwbG90cyB0b2dldGhlcgp0bWJfcGxvdCA8LSBjb3dwbG90OjpwbG90X2dyaWQocGJ0YV9wbG90LCB0Y2dhX3Bsb3QsCiAgYWxpZ24gPSAidiIsCiAgYXhpcyA9ICJsZWZ0IiwKICByZWxfd2lkdGhzID0gYygyLjUsIDEpLAogIGxhYmVsX3NpemUgPSAxMgopCmBgYAoKYGBge3J9CiMgU2F2ZSB0aGUgcGxvdCB0byBhIHBuZwpjb3dwbG90OjpzYXZlX3Bsb3QoZmlsZS5wYXRoKCJwbG90cyIsICJub19maWx0ZXJfdG1iLWNkZi1wYnRhLXRjZ2EucG5nIiksCiAgcGxvdCA9IHRtYl9wbG90LCBiYXNlX3dpZHRoID0gMzUsIGJhc2VfaGVpZ2h0ID0gMjAsIHVuaXQgPSAiY20iCikKYGBgCgpQcmludCBmcm9tIHBuZwoKIyMjIE5vIGZpbHRlciBUTUIgUGxvdAohW10oLi9wbG90cy9ub19maWx0ZXJfdG1iLWNkZi1wYnRhLXRjZ2EucG5nKQoKIyMjIFdpdGggZmlsdGVyIFRNQiBQbG90CiFbXSguLi8uLi90bWItY29tcGFyZS10Y2dhL3Bsb3RzL3RtYi1jZGYtcGJ0YS10Y2dhLnBuZykKIyMgU2Vzc2lvbiBJbmZvCgpgYGB7cn0Kc2Vzc2lvbkluZm8oKQpgYGAK