index.html

This document is concerned with analyzing RNAseq data of human and parasite during the infection of human macrophages. A few different strains of L. panamensis were used; the experiment is therefore segregated into groups named ‘self-healing’, ‘chronic’, and ‘uninfected’. Two separate sets of libraries were generated, one earlier set with greater coverage, and a later set including only 1 uninfected sample, and 2-3 chronic samples.

1 Sample metrics

I just realized that what I need to do is to take the surrogate estimates from the human experiment. Using those I think I will be able to get a more realistic estimate of what is going on.

1.1 But first, attempt a normal estimation

macrophage_parasite <- expt_subset(parasite_expt, subset="experimentname=='macrophage'")
chosen_colors <- c("#990000", "#000099")
names(chosen_colors) <- c("macro_ch", "macro_sh")
macrophage_parasite <- set_expt_colors(macrophage_parasite, colors=chosen_colors)
testing <- sm(write_expt(macrophage_parasite,
                         excel=paste0("excel/macrophage_parasite_data-v", ver, ".xlsx"),
                         violin=TRUE)
## Error: <text>:8:0: unexpected end of input
## 6:                          excel=paste0("excel/macrophage_parasite_data-v", ver, ".xlsx"),
## 7:                          violin=TRUE)
##   ^

Now lets try removing some of the surrogates, the two primary candidates are the strains which I proxy with 3 columns: snpclade, snpcladev2, and snpcladev3; and the batch. In this data set batch is either a or b.

In theory, sva should pick up both of those in one invocation.

## Perform a 'normal' sva
macrophage_sva_norm <- sm(normalize_expt(macrophage_parasite, batch="svaseq", filter=TRUE))
## Error in normalize_expt(macrophage_parasite, batch = "svaseq", filter = TRUE): object 'macrophage_parasite' not found
## Play with the normalization of it
macrophage_sva_norm <- sm(normalize_expt(macrophage_sva_norm, filter=TRUE, convert="cpm",
                                         norm="quant", transform="log2"))
## Error in normalize_expt(macrophage_sva_norm, filter = TRUE, convert = "cpm", : object 'macrophage_sva_norm' not found
macrophage_sva_met <- sm(graph_metrics(macrophage_sva_norm))
## Error in corheat$plot: $ operator is invalid for atomic vectors
## Try limma's method
macrophage_limma_norm <- sm(normalize_expt(macrophage_parasite, batch="limma", filter=TRUE,
                                           batch2="snpcladev3", convert="cpm", norm="quant"))
## Error in normalize_expt(macrophage_parasite, batch = "limma", filter = TRUE, : object 'macrophage_parasite' not found
macrophage_limma_norm <- sm(normalize_expt(macrophage_limma_norm, convert="cpm",
                                           norm="quant", filter=TRUE))
## Error in normalize_expt(macrophage_limma_norm, convert = "cpm", norm = "quant", : object 'macrophage_limma_norm' not found
macrophage_limma_met <- sm(graph_metrics(macrophage_limma_norm))
## Error in corheat$plot: $ operator is invalid for atomic vectors

1.2 Start with a pca from sva

macrophage_sva_met$pcaplot
## Error in eval(expr, envir, enclos): object 'macrophage_sva_met' not found

1.3 Try limma’s removebatcheffect

Another method might be to try using limmaresid to explicitly pull both columns.

macrophage_limma_met$pcaplot
## Error in eval(expr, envir, enclos): object 'macrophage_limma_met' not found

Another method might be to try pca on two separate invocations.

macrophage_pca_norm <- sm(normalize_expt(macrophage_parasite, batch="pca", filter=TRUE))
## Error in normalize_expt(macrophage_parasite, batch = "pca", filter = TRUE): object 'macrophage_parasite' not found
macrophage_pca_norm <- set_expt_batch(expt=macrophage_pca_norm, fact="snpcladev3")
## Error in set_expt_batch(expt = macrophage_pca_norm, fact = "snpcladev3"): object 'macrophage_pca_norm' not found
macrophage_pca_norm <- sm(normalize_expt(macrophage_pca_norm, batch="pca"))
## Error in normalize_expt(macrophage_pca_norm, batch = "pca"): object 'macrophage_pca_norm' not found
macrophage_pca_norm <- sm(normalize_expt(macrophage_pca_norm, convert="cpm",
                                         norm="quant", transform="log2",
                                         filter=TRUE))
## Error in normalize_expt(macrophage_pca_norm, convert = "cpm", norm = "quant", : object 'macrophage_pca_norm' not found
macrophage_pca_met <- sm(graph_metrics(macrophage_pca_norm))
## Error in corheat$plot: $ operator is invalid for atomic vectors
macrophage_pca_met$pcaplot
## Error in eval(expr, envir, enclos): object 'macrophage_pca_met' not found

1.4 Attempting count extraction from human surrogates

If indeed the human surrogates are a primary determinant in the parasite data, then we should be able to see that in some sample estimations of the parasite data. Let us try!

surrogate_estimations <- new.env()
load("savefiles/macrophage_estimation_human.rda.xz", envir=surrogate_estimations)
surrogate_estimations <- surrogate_estimations$surrogate_estimations
summary(surrogate_estimations)
##                         Length Class        Mode   
## pca_adjust               7     -none-       list   
## sva_supervised_adjust    7     -none-       list   
## sva_unsupervised_adjust  7     -none-       list   
## ruv_supervised_adjust    7     -none-       list   
## ruv_residual_adjust      7     -none-       list   
## ruv_empirical_adjust     7     -none-       list   
## adjustments              8     -none-       list   
## correlations            64     -none-       numeric
## plot                     3     recordedplot list   
## pca_plots                7     -none-       list   
## catplots                 0     -none-       NULL
adjusts <- surrogate_estimations$sva_supervised_adjust$model_adjust
## Remove surrogate estimates #1 and #9
new_adjusts <- as.matrix(adjusts[c(-1, -9), ])
## The question of course,  how do I use these estimations to adjust the data?

test_adjusted <- counts_from_surrogates(macrophage_parasite, new_adjusts)
## Error in counts_from_surrogates(macrophage_parasite, new_adjusts): object 'macrophage_parasite' not found
sv_adjusted <- macrophage_parasite
## Error in eval(expr, envir, enclos): object 'macrophage_parasite' not found
Biobase::exprs(sv_adjusted$expressionset) <- test_adjusted
## Error in eval(expr, envir, enclos): object 'test_adjusted' not found
human_adjusted <- subset_expt(sv_adjusted, subset="sampleid!='HPGL0248'")
## Error in expt_subset(...): object 'sv_adjusted' not found
human_adjusted_norm <- sm(normalize_expt(human_adjusted, convert="cpm", filter="simple",
                                         batch="sva", norm="quant", transform="log2"))
## Error in normalize_expt(human_adjusted, convert = "cpm", filter = "simple", : object 'human_adjusted' not found
human_adjusted_norm_metrics <- graph_metrics(human_adjusted_norm)
## Graphing number of non-zero genes with respect to CPM by library.
## Graphing library sizes.
## Warning in plot_libsize(expt, title = libsize_title, ...): restarting
## interrupted promise evaluation
## Graphing a boxplot.
## Warning in plot_boxplot(expt, title = boxplot_title, ...): restarting
## interrupted promise evaluation
## Graphing a correlation heatmap.
## Warning in plot_heatmap(expt_data, expt_colors = expt_colors, expt_design =
## expt_design, : restarting interrupted promise evaluation
## Graphing a standard median correlation.
## Warning in plot_sm(expt, method = cormethod, title = smc_title, ...):
## restarting interrupted promise evaluation
## Graphing a distance heatmap.
## Warning in plot_heatmap(expt_data, expt_colors = expt_colors, expt_design =
## expt_design, : restarting interrupted promise evaluation
## Graphing a standard median distance.
## Warning in plot_sm(expt, method = distmethod, title = smd_title, ...):
## restarting interrupted promise evaluation
## Graphing a PCA plot.
## Warning in plot_pca(expt, title = pca_title, ...): restarting interrupted
## promise evaluation
## Plotting a density plot.
## Warning in plot_density(expt, title = dens_title): restarting interrupted
## promise evaluation
## Printing a color to condition legend.
## Error in corheat$plot: $ operator is invalid for atomic vectors
sv_adjusted <- subset_expt(sv_adjusted, subset="sampleid!='HPGL0248'")
## Error in expt_subset(...): object 'sv_adjusted' not found
sv_adjusted_norm <- sm(normalize_expt(sv_adjusted, convert="cpm", filter="simple",
                                      batch="sva", norm="quant", transform="log2"))
## Error in normalize_expt(sv_adjusted, convert = "cpm", filter = "simple", : object 'sv_adjusted' not found
sv_adjusted_norm_metrics <- sm(graph_metrics(sv_adjusted_norm))
## Error in corheat$plot: $ operator is invalid for atomic vectors
macropara_metrics <- sm(graph_metrics(macrophage_parasite))
## Error in corheat$plot: $ operator is invalid for atomic vectors
macropara_norm <- sm(normalize_expt(macrophage_parasite, convert="cpm", filter=TRUE, norm="quant"))
## Error in normalize_expt(macrophage_parasite, convert = "cpm", filter = TRUE, : object 'macrophage_parasite' not found
macropara_norm_metrics <- sm(graph_metrics(macropara_norm))
## Error in corheat$plot: $ operator is invalid for atomic vectors
macropara_normsva <- sm(normalize_expt(macrophage_parasite, convert="cpm", filter=TRUE, norm="quant",
                                       batch="fsva", transform="log2"))
## Error in normalize_expt(macrophage_parasite, convert = "cpm", filter = TRUE, : object 'macrophage_parasite' not found
macropara_normsva_metrics <- sm(graph_metrics(macropara_normsva))
## Error in corheat$plot: $ operator is invalid for atomic vectors
macropara_normcombat <- sm(normalize_expt(macrophage_parasite, convert="cpm", filter=TRUE,
                                          norm="quant", batch="combat_scale", transform="log2"))
## Error in normalize_expt(macrophage_parasite, convert = "cpm", filter = TRUE, : object 'macrophage_parasite' not found
macropara_normcombat_metrics <- sm(graph_metrics(macropara_normcombat))
## Error in corheat$plot: $ operator is invalid for atomic vectors
macropara_normsvaseq <- sm(normalize_expt(macrophage_parasite, convert="cpm", filter="cbcbseq",
                                          transform="log2", batch="svaseq"))
## Error in normalize_expt(macrophage_parasite, convert = "cpm", filter = "cbcbseq", : object 'macrophage_parasite' not found
macropara_normsvaseq_metrics <- sm(graph_metrics(macropara_normsvaseq))
## Error in corheat$plot: $ operator is invalid for atomic vectors

2 Compare results

Now lets compare the results of using the human data to inform the parasite estimations.

2.1 Before including the new estimates

Lets first print a few using different metrics before using the human SV estimates. It looks like sva etc are not too bad.

macropara_norm_metrics$pcaplot
## Error in eval(expr, envir, enclos): object 'macropara_norm_metrics' not found
## Just normalizing shows the central concern.
macropara_normsva_metrics$pcaplot
## Error in eval(expr, envir, enclos): object 'macropara_normsva_metrics' not found
## Not too bad
macropara_normcombat_metrics$pcaplot
## Error in eval(expr, envir, enclos): object 'macropara_normcombat_metrics' not found
## Combat cannot deal with this data very well.
macropara_normsvaseq_metrics$pcaplot
## Error in eval(expr, envir, enclos): object 'macropara_normsvaseq_metrics' not found
## svaseq gets a little confused, but not bad.
macropara_normsvaseq_metrics$pcaplot
## Error in eval(expr, envir, enclos): object 'macropara_normsvaseq_metrics' not found

2.2 Using human SVA data

Seems pretty good to me.

sv_adjusted_norm_metrics$pcaplot
## Error in eval(expr, envir, enclos): object 'sv_adjusted_norm_metrics' not found
## This is at least as good as the other methods.

index.html

3 Variance Partition

In the following, I will attempt to find the variance associated with different experimental factors in the macrophage data with mappings against the parasite transcriptome.

3.1 Setting up

As in macrophage_estimation_parasite.html, I need to pull out the relevant samples:

4 Perform variancePartition analyses

4.1 Condition + batch

Start out with just condition and batch

## The default arguments are to query ~ condition + (1|batch)
## Which, because condition is categorical, will end badly.
vp_cb <- sm(varpart(macrophage_parasite, predictor=NULL, factors=c("condition","batch")))
## Error in is.factor(x): object 'macrophage_parasite' not found
vp_cb$percent_plot
## Error in eval(expr, envir, enclos): object 'vp_cb' not found
vp_cb$partition_plot
## Error in eval(expr, envir, enclos): object 'vp_cb' not found
vp_norm <- sm(varpart(macropara_norm, predictor=NULL, factors=c("condition","batch")))
## Error in is.factor(x): object 'macropara_norm' not found
vp_norm$percent_plot
## Error in eval(expr, envir, enclos): object 'vp_norm' not found
vp_norm$partition_plot
## Error in eval(expr, envir, enclos): object 'vp_norm' not found
vp_normsva <- sm(varpart(macropara_normsva, predictor=NULL, factors=c("condition","batch")))
## Error in is.factor(x): object 'macropara_normsva' not found
vp_normsva$percent_plot
## Error in eval(expr, envir, enclos): object 'vp_normsva' not found
vp_normsva$partition_plot
## Error in eval(expr, envir, enclos): object 'vp_normsva' not found

index.html annotation.html infection_estimation.html

LS0tCnRpdGxlOiAiUk5Bc2VxIG9mIEwucGFuYW1lbnNpczogIFBhcmFzaXRlIE1hY3JvcGhhZ2UgU2FtcGxlIEVzdGltYXRpb24uIgphdXRob3I6ICJhdGIgYWJlbGV3QGdtYWlsLmNvbSIKZGF0ZTogImByIFN5cy5EYXRlKClgIgpvdXRwdXQ6CiBodG1sX2RvY3VtZW50OgogIGNvZGVfZG93bmxvYWQ6IHRydWUKICBjb2RlX2ZvbGRpbmc6IHNob3cKICBmaWdfY2FwdGlvbjogdHJ1ZQogIGZpZ19oZWlnaHQ6IDcKICBmaWdfd2lkdGg6IDcKICBoaWdobGlnaHQ6IHRhbmdvCiAga2VlcF9tZDogZmFsc2UKICBtb2RlOiBzZWxmY29udGFpbmVkCiAgbnVtYmVyX3NlY3Rpb25zOiB0cnVlCiAgc2VsZl9jb250YWluZWQ6IHRydWUKICB0aGVtZTogY29zbW8KICB0b2M6IHRydWUKICB0b2NfZmxvYXQ6CiAgIGNvbGxhcHNlZDogZmFsc2UKICAgc21vb3RoX3Njcm9sbDogZmFsc2UKLS0tCgo8c3R5bGU+CiAgPCEtLSBEb2N1bWVudCBwcmVsdWRlIHJldmlzaW9uIDIwMTYtMTAgLS0+CiAgYm9keSAubWFpbi1jb250YWluZXIgewogICAgbWF4LXdpZHRoOiAxNjAwcHg7Cn0KPC9zdHlsZT4KCmBgYHtyIG9wdGlvbnMsIGluY2x1ZGU9RkFMU0V9CiMjIFRoZXNlIGFyZSB0aGUgb3B0aW9ucyBJIHRlbmQgdG8gZmF2b3IKbGlicmFyeSgiaHBnbHRvb2xzIikKdHQgPC0gc20oZGV2dG9vbHM6OmxvYWRfYWxsKCJ+L2hwZ2x0b29scyIpKQprbml0cjo6b3B0c19rbml0JHNldCgKICAgIHByb2dyZXNzID0gVFJVRSwKICAgIHZlcmJvc2UgPSBUUlVFLAogICAgd2lkdGggPSA5MCwKICAgIGVjaG8gPSBUUlVFKQprbml0cjo6b3B0c19jaHVuayRzZXQoCiAgICBlcnJvciA9IFRSVUUsCiAgICBmaWcud2lkdGggPSA4LAogICAgZmlnLmhlaWdodCA9IDgsCiAgICBkcGkgPSA5NikKb3B0aW9ucygKICAgIGRpZ2l0cyA9IDQsCiAgICBzdHJpbmdzQXNGYWN0b3JzID0gRkFMU0UsCiAgICBrbml0ci5kdXBsaWNhdGUubGFiZWwgPSAiYWxsb3ciKQpnZ3Bsb3QyOjp0aGVtZV9zZXQoZ2dwbG90Mjo6dGhlbWVfYncoYmFzZV9zaXplPTEwKSkKc2V0LnNlZWQoMSkKcm1kX2ZpbGUgPC0gIm1hY3JvcGhhZ2VfZXN0aW1hdGlvbl9wYXJhc2l0ZS5SbWQiCnZlciA8LSAiMjAxNzAyMDIiCmBgYAoKW2luZGV4Lmh0bWxdKGluZGV4Lmh0bWwpCgpgYGB7ciByZW5kZXJpbmcsIGluY2x1ZGU9RkFMU0UsIGV2YWw9RkFMU0V9CiMjIFRoaXMgYmxvY2sgaXMgdXNlZCB0byByZW5kZXIgYSBkb2N1bWVudCBmcm9tIHdpdGhpbiBpdC4Kcm1hcmtkb3duOjpyZW5kZXIocm1kX2ZpbGUpCgojIyBBbiBleHRyYSByZW5kZXJlciBmb3IgcGRmIG91dHB1dApybWFya2Rvd246OnJlbmRlcihybWRfZmlsZSwgb3V0cHV0X2Zvcm1hdD0icGRmX2RvY3VtZW50Iiwgb3V0cHV0X29wdGlvbnM9Yygic2tpcF9odG1sIikpCiMjIE9yIHRvIHNhdmUvbG9hZCBsYXJnZSBSZGF0YSBmaWxlcy4KaHBnbHRvb2xzOjo6c2F2ZW1lKCkKaHBnbHRvb2xzOjo6bG9hZG1lKCkKcm0obGlzdD1scygpKQpgYGAKClRoaXMgZG9jdW1lbnQgaXMgY29uY2VybmVkIHdpdGggYW5hbHl6aW5nIFJOQXNlcSBkYXRhIG9mIGh1bWFuIGFuZCBwYXJhc2l0ZSBkdXJpbmcgdGhlIGluZmVjdGlvbiBvZgpodW1hbiBtYWNyb3BoYWdlcy4gIEEgZmV3IGRpZmZlcmVudCBzdHJhaW5zIG9mIEwuIHBhbmFtZW5zaXMgd2VyZSB1c2VkOyB0aGUgZXhwZXJpbWVudCBpcyB0aGVyZWZvcmUKc2VncmVnYXRlZCBpbnRvIGdyb3VwcyBuYW1lZCAnc2VsZi1oZWFsaW5nJywgJ2Nocm9uaWMnLCBhbmQgJ3VuaW5mZWN0ZWQnLiAgVHdvIHNlcGFyYXRlIHNldHMgb2YKbGlicmFyaWVzIHdlcmUgZ2VuZXJhdGVkLCBvbmUgZWFybGllciBzZXQgd2l0aCBncmVhdGVyIGNvdmVyYWdlLCBhbmQgYSBsYXRlciBzZXQgaW5jbHVkaW5nIG9ubHkgMQp1bmluZmVjdGVkIHNhbXBsZSwgYW5kIDItMyBjaHJvbmljIHNhbXBsZXMuCgpgYGB7ciBsb2FkbWUsIGluY2x1ZGU9RkFMU0V9CnRtcCA8LSBzbShsb2FkbWUoZmlsZW5hbWU9ImFubm90YXRpb24ucmRhLnh6IikpCmBgYAoKIyBTYW1wbGUgbWV0cmljcwoKSSBqdXN0IHJlYWxpemVkIHRoYXQgd2hhdCBJIG5lZWQgdG8gZG8gaXMgdG8gdGFrZSB0aGUgc3Vycm9nYXRlIGVzdGltYXRlcyBmcm9tIHRoZSBodW1hbiBleHBlcmltZW50LgpVc2luZyB0aG9zZSBJIHRoaW5rIEkgd2lsbCBiZSBhYmxlIHRvIGdldCBhIG1vcmUgcmVhbGlzdGljIGVzdGltYXRlIG9mIHdoYXQgaXMgZ29pbmcgb24uCgojIyBCdXQgZmlyc3QsIGF0dGVtcHQgYSBub3JtYWwgZXN0aW1hdGlvbgoKYGBge3IgcGFyYXNpdGVfZXN0aW1hdGVzX25vcm1hbCwgZmlnLnNob3c9ImhpZGUifQptYWNyb3BoYWdlX3BhcmFzaXRlIDwtIGV4cHRfc3Vic2V0KHBhcmFzaXRlX2V4cHQsIHN1YnNldD0iZXhwZXJpbWVudG5hbWU9PSdtYWNyb3BoYWdlJyIpCmNob3Nlbl9jb2xvcnMgPC0gYygiIzk5MDAwMCIsICIjMDAwMDk5IikKbmFtZXMoY2hvc2VuX2NvbG9ycykgPC0gYygibWFjcm9fY2giLCAibWFjcm9fc2giKQptYWNyb3BoYWdlX3BhcmFzaXRlIDwtIHNldF9leHB0X2NvbG9ycyhtYWNyb3BoYWdlX3BhcmFzaXRlLCBjb2xvcnM9Y2hvc2VuX2NvbG9ycykKdGVzdGluZyA8LSBzbSh3cml0ZV9leHB0KG1hY3JvcGhhZ2VfcGFyYXNpdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICBleGNlbD1wYXN0ZTAoImV4Y2VsL21hY3JvcGhhZ2VfcGFyYXNpdGVfZGF0YS12IiwgdmVyLCAiLnhsc3giKSwKICAgICAgICAgICAgICAgICAgICAgICAgIHZpb2xpbj1UUlVFKQpgYGAKCk5vdyBsZXRzIHRyeSByZW1vdmluZyBzb21lIG9mIHRoZSBzdXJyb2dhdGVzLCB0aGUgdHdvIHByaW1hcnkgY2FuZGlkYXRlcyBhcmUgdGhlIHN0cmFpbnMKd2hpY2ggSSBwcm94eSB3aXRoIDMgY29sdW1uczogc25wY2xhZGUsIHNucGNsYWRldjIsIGFuZCBzbnBjbGFkZXYzOyBhbmQgdGhlIGJhdGNoLiAgSW4gdGhpcwpkYXRhIHNldCBiYXRjaCBpcyBlaXRoZXIgYSBvciBiLgoKSW4gdGhlb3J5LCBzdmEgc2hvdWxkIHBpY2sgdXAgYm90aCBvZiB0aG9zZSBpbiBvbmUgaW52b2NhdGlvbi4KCmBgYHtyIGdlbmVyYXRlX2dyYXBocywgZmlnLnNob3c9ImhpZGUifQojIyBQZXJmb3JtIGEgJ25vcm1hbCcgc3ZhCm1hY3JvcGhhZ2Vfc3ZhX25vcm0gPC0gc20obm9ybWFsaXplX2V4cHQobWFjcm9waGFnZV9wYXJhc2l0ZSwgYmF0Y2g9InN2YXNlcSIsIGZpbHRlcj1UUlVFKSkKIyMgUGxheSB3aXRoIHRoZSBub3JtYWxpemF0aW9uIG9mIGl0Cm1hY3JvcGhhZ2Vfc3ZhX25vcm0gPC0gc20obm9ybWFsaXplX2V4cHQobWFjcm9waGFnZV9zdmFfbm9ybSwgZmlsdGVyPVRSVUUsIGNvbnZlcnQ9ImNwbSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9ybT0icXVhbnQiLCB0cmFuc2Zvcm09ImxvZzIiKSkKbWFjcm9waGFnZV9zdmFfbWV0IDwtIHNtKGdyYXBoX21ldHJpY3MobWFjcm9waGFnZV9zdmFfbm9ybSkpCiMjIFRyeSBsaW1tYSdzIG1ldGhvZAptYWNyb3BoYWdlX2xpbW1hX25vcm0gPC0gc20obm9ybWFsaXplX2V4cHQobWFjcm9waGFnZV9wYXJhc2l0ZSwgYmF0Y2g9ImxpbW1hIiwgZmlsdGVyPVRSVUUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXRjaDI9InNucGNsYWRldjMiLCBjb252ZXJ0PSJjcG0iLCBub3JtPSJxdWFudCIpKQptYWNyb3BoYWdlX2xpbW1hX25vcm0gPC0gc20obm9ybWFsaXplX2V4cHQobWFjcm9waGFnZV9saW1tYV9ub3JtLCBjb252ZXJ0PSJjcG0iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9ybT0icXVhbnQiLCBmaWx0ZXI9VFJVRSkpCm1hY3JvcGhhZ2VfbGltbWFfbWV0IDwtIHNtKGdyYXBoX21ldHJpY3MobWFjcm9waGFnZV9saW1tYV9ub3JtKSkKYGBgCgojIyBTdGFydCB3aXRoIGEgcGNhIGZyb20gc3ZhCgpgYGB7ciBzdmFfYXR0ZW1wdH0KbWFjcm9waGFnZV9zdmFfbWV0JHBjYXBsb3QKYGBgCgojIyBUcnkgbGltbWEncyByZW1vdmViYXRjaGVmZmVjdAoKQW5vdGhlciBtZXRob2QgbWlnaHQgYmUgdG8gdHJ5IHVzaW5nIGxpbW1hcmVzaWQgdG8gZXhwbGljaXRseSBwdWxsIGJvdGggY29sdW1ucy4KCmBgYHtyIHJlc2lkX2F0dGVtcHR9Cm1hY3JvcGhhZ2VfbGltbWFfbWV0JHBjYXBsb3QKYGBgCgpBbm90aGVyIG1ldGhvZCBtaWdodCBiZSB0byB0cnkgcGNhIG9uIHR3byBzZXBhcmF0ZSBpbnZvY2F0aW9ucy4KCmBgYHtyIHBlcmZvcm1fcmVzaWR1YWxzLCBmaWcuc2hvdz1GQUxTRX0KbWFjcm9waGFnZV9wY2Ffbm9ybSA8LSBzbShub3JtYWxpemVfZXhwdChtYWNyb3BoYWdlX3BhcmFzaXRlLCBiYXRjaD0icGNhIiwgZmlsdGVyPVRSVUUpKQptYWNyb3BoYWdlX3BjYV9ub3JtIDwtIHNldF9leHB0X2JhdGNoKGV4cHQ9bWFjcm9waGFnZV9wY2Ffbm9ybSwgZmFjdD0ic25wY2xhZGV2MyIpCm1hY3JvcGhhZ2VfcGNhX25vcm0gPC0gc20obm9ybWFsaXplX2V4cHQobWFjcm9waGFnZV9wY2Ffbm9ybSwgYmF0Y2g9InBjYSIpKQptYWNyb3BoYWdlX3BjYV9ub3JtIDwtIHNtKG5vcm1hbGl6ZV9leHB0KG1hY3JvcGhhZ2VfcGNhX25vcm0sIGNvbnZlcnQ9ImNwbSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9ybT0icXVhbnQiLCB0cmFuc2Zvcm09ImxvZzIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcj1UUlVFKSkKbWFjcm9waGFnZV9wY2FfbWV0IDwtIHNtKGdyYXBoX21ldHJpY3MobWFjcm9waGFnZV9wY2Ffbm9ybSkpCmBgYAoKYGBge3IgcGNhX2F0dGVtcHR9Cm1hY3JvcGhhZ2VfcGNhX21ldCRwY2FwbG90CmBgYAoKIyMgQXR0ZW1wdGluZyBjb3VudCBleHRyYWN0aW9uIGZyb20gaHVtYW4gc3Vycm9nYXRlcwoKSWYgaW5kZWVkIHRoZSBodW1hbiBzdXJyb2dhdGVzIGFyZSBhIHByaW1hcnkgZGV0ZXJtaW5hbnQgaW4gdGhlIHBhcmFzaXRlIGRhdGEsIHRoZW4gd2Ugc2hvdWxkCmJlIGFibGUgdG8gc2VlIHRoYXQgaW4gc29tZSBzYW1wbGUgZXN0aW1hdGlvbnMgb2YgdGhlIHBhcmFzaXRlIGRhdGEuICBMZXQgdXMgdHJ5IQoKYGBge3IgcGFyYXNpdGVfZXN0aW1hdGlvbl9odW1hbl9zdXJyb2dhdGVzLCBmaWcuc2hvdz0iaGlkZSJ9CnN1cnJvZ2F0ZV9lc3RpbWF0aW9ucyA8LSBuZXcuZW52KCkKbG9hZCgic2F2ZWZpbGVzL21hY3JvcGhhZ2VfZXN0aW1hdGlvbl9odW1hbi5yZGEueHoiLCBlbnZpcj1zdXJyb2dhdGVfZXN0aW1hdGlvbnMpCnN1cnJvZ2F0ZV9lc3RpbWF0aW9ucyA8LSBzdXJyb2dhdGVfZXN0aW1hdGlvbnMkc3Vycm9nYXRlX2VzdGltYXRpb25zCnN1bW1hcnkoc3Vycm9nYXRlX2VzdGltYXRpb25zKQphZGp1c3RzIDwtIHN1cnJvZ2F0ZV9lc3RpbWF0aW9ucyRzdmFfc3VwZXJ2aXNlZF9hZGp1c3QkbW9kZWxfYWRqdXN0CiMjIFJlbW92ZSBzdXJyb2dhdGUgZXN0aW1hdGVzICMxIGFuZCAjOQpuZXdfYWRqdXN0cyA8LSBhcy5tYXRyaXgoYWRqdXN0c1tjKC0xLCAtOSksIF0pCiMjIFRoZSBxdWVzdGlvbiBvZiBjb3Vyc2UsICBob3cgZG8gSSB1c2UgdGhlc2UgZXN0aW1hdGlvbnMgdG8gYWRqdXN0IHRoZSBkYXRhPwoKdGVzdF9hZGp1c3RlZCA8LSBjb3VudHNfZnJvbV9zdXJyb2dhdGVzKG1hY3JvcGhhZ2VfcGFyYXNpdGUsIG5ld19hZGp1c3RzKQpzdl9hZGp1c3RlZCA8LSBtYWNyb3BoYWdlX3BhcmFzaXRlCkJpb2Jhc2U6OmV4cHJzKHN2X2FkanVzdGVkJGV4cHJlc3Npb25zZXQpIDwtIHRlc3RfYWRqdXN0ZWQKCmh1bWFuX2FkanVzdGVkIDwtIHN1YnNldF9leHB0KHN2X2FkanVzdGVkLCBzdWJzZXQ9InNhbXBsZWlkIT0nSFBHTDAyNDgnIikKaHVtYW5fYWRqdXN0ZWRfbm9ybSA8LSBzbShub3JtYWxpemVfZXhwdChodW1hbl9hZGp1c3RlZCwgY29udmVydD0iY3BtIiwgZmlsdGVyPSJzaW1wbGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhdGNoPSJzdmEiLCBub3JtPSJxdWFudCIsIHRyYW5zZm9ybT0ibG9nMiIpKQpodW1hbl9hZGp1c3RlZF9ub3JtX21ldHJpY3MgPC0gZ3JhcGhfbWV0cmljcyhodW1hbl9hZGp1c3RlZF9ub3JtKQoKc3ZfYWRqdXN0ZWQgPC0gc3Vic2V0X2V4cHQoc3ZfYWRqdXN0ZWQsIHN1YnNldD0ic2FtcGxlaWQhPSdIUEdMMDI0OCciKQpzdl9hZGp1c3RlZF9ub3JtIDwtIHNtKG5vcm1hbGl6ZV9leHB0KHN2X2FkanVzdGVkLCBjb252ZXJ0PSJjcG0iLCBmaWx0ZXI9InNpbXBsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmF0Y2g9InN2YSIsIG5vcm09InF1YW50IiwgdHJhbnNmb3JtPSJsb2cyIikpCnN2X2FkanVzdGVkX25vcm1fbWV0cmljcyA8LSBzbShncmFwaF9tZXRyaWNzKHN2X2FkanVzdGVkX25vcm0pKQoKbWFjcm9wYXJhX21ldHJpY3MgPC0gc20oZ3JhcGhfbWV0cmljcyhtYWNyb3BoYWdlX3BhcmFzaXRlKSkKbWFjcm9wYXJhX25vcm0gPC0gc20obm9ybWFsaXplX2V4cHQobWFjcm9waGFnZV9wYXJhc2l0ZSwgY29udmVydD0iY3BtIiwgZmlsdGVyPVRSVUUsIG5vcm09InF1YW50IikpCm1hY3JvcGFyYV9ub3JtX21ldHJpY3MgPC0gc20oZ3JhcGhfbWV0cmljcyhtYWNyb3BhcmFfbm9ybSkpCgptYWNyb3BhcmFfbm9ybXN2YSA8LSBzbShub3JtYWxpemVfZXhwdChtYWNyb3BoYWdlX3BhcmFzaXRlLCBjb252ZXJ0PSJjcG0iLCBmaWx0ZXI9VFJVRSwgbm9ybT0icXVhbnQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXRjaD0iZnN2YSIsIHRyYW5zZm9ybT0ibG9nMiIpKQptYWNyb3BhcmFfbm9ybXN2YV9tZXRyaWNzIDwtIHNtKGdyYXBoX21ldHJpY3MobWFjcm9wYXJhX25vcm1zdmEpKQoKbWFjcm9wYXJhX25vcm1jb21iYXQgPC0gc20obm9ybWFsaXplX2V4cHQobWFjcm9waGFnZV9wYXJhc2l0ZSwgY29udmVydD0iY3BtIiwgZmlsdGVyPVRSVUUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vcm09InF1YW50IiwgYmF0Y2g9ImNvbWJhdF9zY2FsZSIsIHRyYW5zZm9ybT0ibG9nMiIpKQptYWNyb3BhcmFfbm9ybWNvbWJhdF9tZXRyaWNzIDwtIHNtKGdyYXBoX21ldHJpY3MobWFjcm9wYXJhX25vcm1jb21iYXQpKQoKbWFjcm9wYXJhX25vcm1zdmFzZXEgPC0gc20obm9ybWFsaXplX2V4cHQobWFjcm9waGFnZV9wYXJhc2l0ZSwgY29udmVydD0iY3BtIiwgZmlsdGVyPSJjYmNic2VxIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtPSJsb2cyIiwgYmF0Y2g9InN2YXNlcSIpKQptYWNyb3BhcmFfbm9ybXN2YXNlcV9tZXRyaWNzIDwtIHNtKGdyYXBoX21ldHJpY3MobWFjcm9wYXJhX25vcm1zdmFzZXEpKQpgYGAKCiMgQ29tcGFyZSByZXN1bHRzCgpOb3cgbGV0cyBjb21wYXJlIHRoZSByZXN1bHRzIG9mIHVzaW5nIHRoZSBodW1hbiBkYXRhIHRvIGluZm9ybSB0aGUgcGFyYXNpdGUgZXN0aW1hdGlvbnMuCgojIyBCZWZvcmUgaW5jbHVkaW5nIHRoZSBuZXcgZXN0aW1hdGVzCgpMZXRzIGZpcnN0IHByaW50IGEgZmV3IHVzaW5nIGRpZmZlcmVudCBtZXRyaWNzIGJlZm9yZSB1c2luZyB0aGUgaHVtYW4gU1YgZXN0aW1hdGVzLgpJdCBsb29rcyBsaWtlIHN2YSBldGMgYXJlIG5vdCB0b28gYmFkLgoKYGBge3IgY29tcGFyZV9wY2FfYW1vbmdfZXN0aW1hdGVzfQptYWNyb3BhcmFfbm9ybV9tZXRyaWNzJHBjYXBsb3QKIyMgSnVzdCBub3JtYWxpemluZyBzaG93cyB0aGUgY2VudHJhbCBjb25jZXJuLgptYWNyb3BhcmFfbm9ybXN2YV9tZXRyaWNzJHBjYXBsb3QKIyMgTm90IHRvbyBiYWQKbWFjcm9wYXJhX25vcm1jb21iYXRfbWV0cmljcyRwY2FwbG90CiMjIENvbWJhdCBjYW5ub3QgZGVhbCB3aXRoIHRoaXMgZGF0YSB2ZXJ5IHdlbGwuCm1hY3JvcGFyYV9ub3Jtc3Zhc2VxX21ldHJpY3MkcGNhcGxvdAojIyBzdmFzZXEgZ2V0cyBhIGxpdHRsZSBjb25mdXNlZCwgYnV0IG5vdCBiYWQuCm1hY3JvcGFyYV9ub3Jtc3Zhc2VxX21ldHJpY3MkcGNhcGxvdApgYGAKCiMjIFVzaW5nIGh1bWFuIFNWQSBkYXRhCgpTZWVtcyBwcmV0dHkgZ29vZCB0byBtZS4KCmBgYHtyIHVzaW5nIGh1bWFuIHN2YX0Kc3ZfYWRqdXN0ZWRfbm9ybV9tZXRyaWNzJHBjYXBsb3QKIyMgVGhpcyBpcyBhdCBsZWFzdCBhcyBnb29kIGFzIHRoZSBvdGhlciBtZXRob2RzLgpgYGAKCmBgYHtyIHNhdmVtZSwgaW5jbHVkZT1GQUxTRX0KdG1wIDwtIHNtKHNhdmVtZShmaWxlbmFtZT0ibWFjcm9waGFnZV9lc3RpbWF0aW9uX3BhcmFzaXRlLnJkYS54eiIpKQpgYGAKCltpbmRleC5odG1sXShpbmRleC5odG1sKQoKIyBWYXJpYW5jZSBQYXJ0aXRpb24KCkluIHRoZSBmb2xsb3dpbmcsIEkgd2lsbCBhdHRlbXB0IHRvIGZpbmQgdGhlIHZhcmlhbmNlIGFzc29jaWF0ZWQgd2l0aCBkaWZmZXJlbnQgZXhwZXJpbWVudGFsIGZhY3RvcnMKaW4gdGhlIG1hY3JvcGhhZ2UgZGF0YSB3aXRoIG1hcHBpbmdzIGFnYWluc3QgdGhlIHBhcmFzaXRlIHRyYW5zY3JpcHRvbWUuCgojIyBTZXR0aW5nIHVwCgpBcyBpbiBbbWFjcm9waGFnZV9lc3RpbWF0aW9uX3BhcmFzaXRlLmh0bWxdKG1hY3JvcGhhZ2VfZXN0aW1hdGlvbl9wYXJhc2l0ZS5odG1sKSwgSSBuZWVkIHRvIHB1bGwgb3V0IHRoZQpyZWxldmFudCBzYW1wbGVzOgoKIyBQZXJmb3JtIHZhcmlhbmNlUGFydGl0aW9uIGFuYWx5c2VzCgojIyBDb25kaXRpb24gKyBiYXRjaAoKU3RhcnQgb3V0IHdpdGgganVzdCBjb25kaXRpb24gYW5kIGJhdGNoCgpgYGB7ciB2YXJwYXJ0X2NvbmRiYXRjaH0KIyMgVGhlIGRlZmF1bHQgYXJndW1lbnRzIGFyZSB0byBxdWVyeSB+IGNvbmRpdGlvbiArICgxfGJhdGNoKQojIyBXaGljaCwgYmVjYXVzZSBjb25kaXRpb24gaXMgY2F0ZWdvcmljYWwsIHdpbGwgZW5kIGJhZGx5Lgp2cF9jYiA8LSBzbSh2YXJwYXJ0KG1hY3JvcGhhZ2VfcGFyYXNpdGUsIHByZWRpY3Rvcj1OVUxMLCBmYWN0b3JzPWMoImNvbmRpdGlvbiIsImJhdGNoIikpKQp2cF9jYiRwZXJjZW50X3Bsb3QKdnBfY2IkcGFydGl0aW9uX3Bsb3QKCnZwX25vcm0gPC0gc20odmFycGFydChtYWNyb3BhcmFfbm9ybSwgcHJlZGljdG9yPU5VTEwsIGZhY3RvcnM9YygiY29uZGl0aW9uIiwiYmF0Y2giKSkpCnZwX25vcm0kcGVyY2VudF9wbG90CnZwX25vcm0kcGFydGl0aW9uX3Bsb3QKCnZwX25vcm1zdmEgPC0gc20odmFycGFydChtYWNyb3BhcmFfbm9ybXN2YSwgcHJlZGljdG9yPU5VTEwsIGZhY3RvcnM9YygiY29uZGl0aW9uIiwiYmF0Y2giKSkpCnZwX25vcm1zdmEkcGVyY2VudF9wbG90CnZwX25vcm1zdmEkcGFydGl0aW9uX3Bsb3QKYGBgCgpbaW5kZXguaHRtbF0oaW5kZXguaHRtbCkgW2Fubm90YXRpb24uaHRtbF0oYW5ub3RhdGlvbi5odG1sKSBbaW5mZWN0aW9uX2VzdGltYXRpb24uaHRtbF0oaW5mZWN0aW9uX2VzdGltYXRpb24uaHRtbCkK