1 Introduction

This dataset contains multiple experiments.

2 Annotations

pa14_gff <- load_gff_annotations("reference/paeruginosa_pa14.gff", id_col="gene_id")
## Trying attempt: rtracklayer::import.gff3(gff, sequenceRegionsAsSeqinfo = TRUE)
## Had a successful gff import with rtracklayer::import.gff3(gff, sequenceRegionsAsSeqinfo = TRUE)
## Returning a df with 16 columns and 11946 rows.
rownames(pa14_gff) <- pa14_gff[["gene_id"]]
## The Alias column has PA14_00010

pa14_microbes <- as.data.frame(load_microbesonline_annotations("PA14"))
## Found 1 entry.
## Pseudomonas aeruginosa UCBPP-PA14Proteobacteria2006-11-22yes105972208963
## The species being downloaded is: Pseudomonas aeruginosa UCBPP-PA14
## Downloading: http://www.microbesonline.org/cgi-bin/genomeInfo.cgi?tId=208963;export=tab
## The sysName column has PA14_0010

pa14_annot <- merge(pa14_gff, pa14_microbes, by.x="Alias", by.y="sysName")
rownames(pa14_annot) <- pa14_annot[["gene_id"]]

## The identifiers are a bit odd, so we need to do a little work
pa14_length <- pa14_annot[, c("gene_id", "width", "Alias")]
pa14_go <- load_microbesonline_go(species="PA14", id_column="sysName")
## Found 1 entry.
## Pseudomonas aeruginosa UCBPP-PA14Proteobacteria2006-11-22yes105972208963
## The species being downloaded is: Pseudomonas aeruginosa UCBPP-PA14 and is being downloaded as 208963.tab.
pa14_go_length <- merge(pa14_go, pa14_length, by.x="sysName", by.y="Alias")
pa14_go <- pa14_go_length[, c("gene_id", "GO")]
colnames(pa14_go) <- c("ID", "GO")
pa14_length <- pa14_go_length[, c("gene_id", "width")]
pa14_length_ids <- unique(pa14_length)[["gene_id"]]
pa14_length <- pa14_length[pa14_length_ids, ]
rownames(pa14_length) <- make.names(pa14_length[["gene_id"]], unique=TRUE)
colnames(pa14_length) <- c("ID", "width")

3 Make the expressionset

Given the above annotations, now lets pull in the counts.

I am switching to the sheet all_samples_modified_gcd.xlsx for the moment because I added a space in the strain name for the gcd sampl

pa14_expt <- create_expt("sample_sheets/all_samples_modified_gcd.xlsx",
                         gene_info=pa14_annot, file_column="hisatcounttable")
## Reading the sample metadata.
## Did not find the condition column in the sample sheet.
## Filling it in as undefined.
## Did not find the batch column in the sample sheet.
## Filling it in as undefined.
## The sample definitions comprises: 105 rows(samples) and 31 columns(metadata fields).
## Matched 5972 annotations and counts.
## Bringing together the count matrix and gene information.
## Some annotations were lost in merging, setting them to 'undefined'.
## Saving the expressionset to 'expt.rda'.
## The final expressionset has 5979 features and 105 samples.

4 Quick global look at the data

While we are at it, lets drop the two sad samples.

pa14_libsize <- plot_libsize(pa14_expt)
pa14_libsize$plot

pa14_nonzero <- plot_nonzero(pa14_expt)
pa14_nonzero$plot
## Warning: ggrepel: 100 unlabeled data points (too many overlaps). Consider
## increasing max.overlaps

pa14_expt <- subset_expt(pa14_expt, nonzero=5500)
## The samples (and read coverage) removed when filtering 5500 non-zero genes are:
##  SM040  SM048 
##  43984 316632
## subset_expt(): There were 105, now there are 103 samples.

4.1 A few queries

I know a priori that April is interested to see how the 4 library preparations look with respect to each other. Let us therefore create a data structure to look explicitly at that.

pa14_libprep <- set_expt_conditions(pa14_expt, fact="libraryprepbatch") %>%
  set_expt_batches(fact="organisms")

pa14_lib_norm <- normalize_expt(pa14_libprep, filter=TRUE,
                                convert="cpm", norm="quant", transform="log2")
## Removing 6 low-count genes (5973 remaining).
## transform_counts: Found 35 values equal to 0, adding 1 to the matrix.
plot_pca(pa14_lib_norm)$plot
## plot labels was not set and there are more than 100 samples, disabling it.
## Error: Continuous value supplied to discrete scale

plot_corheat(pa14_lib_norm)$plot

libprep_pca_info <- pca_information(
    pa14_lib_norm, plot_pcas=TRUE,
    expt_factors=c("libraryprepbatch", "organisms", "strains", "media", "bioreplicate"))
## plot labels was not set and there are more than 100 samples, disabling it.
libprep_pca_info$anova_f_heatmap

libprep_pca_info$pca_plots[[2]]
## Error: Continuous value supplied to discrete scale
libprep_pca_info$pca_plots[[3]]
## Error: Continuous value supplied to discrete scale
libprep_pca_info$pca_plots[[4]]
## Error: Continuous value supplied to discrete scale
libprep_pca_info$pca_plots[[5]]
## Error: Continuous value supplied to discrete scale

To my eyes they look reasonably mixed, suggesting that library prep batch is not a dominant factor in the data.

At this point, I am thinking that we should separate the data by the experiments, but I will first just show the relationships among all the data.

5 Looking at other factors

As far as I see, there are three factors which are of primary interest:

  1. PA14 strain
  2. Media used
  3. Bioreplicate

The last will be used as batch in the following plots.

pa14_media <- set_expt_conditions(pa14_expt, fact="media") %>%
  set_expt_batches(fact="bioreplicate")
pa14_media_norm <- normalize_expt(pa14_media, transform="log2", convert="cpm",
                                  filter=TRUE, norm="quant")
## Removing 6 low-count genes (5973 remaining).
## transform_counts: Found 35 values equal to 0, adding 1 to the matrix.
plot_pca(pa14_media_norm)$plot
## plot labels was not set and there are more than 100 samples, disabling it.

pa14_strains <- set_expt_conditions(pa14_expt, fact="strains") %>%
  set_expt_batches(fact="bioreplicate")
pa14_strains_norm <- normalize_expt(pa14_strains, transform="log2", convert="cpm",
                                  filter=TRUE, norm="quant")
## Removing 6 low-count genes (5973 remaining).
## transform_counts: Found 35 values equal to 0, adding 1 to the matrix.
plot_pca(pa14_strains_norm)$plot
## plot labels was not set and there are more than 100 samples, disabling it.

Disregarding the various experiments performed, I think we can state that media separates the data in a fashion which is more interesting than strain. Given the number of (what I assume are) closely related strains, I am thinking it might prove to be a good idea to perform my variant search tool on this data and see how well they held up with respect to the reference strain.

6 Separate the experiments

I have been told repeatedly that there are multiple experiments in this data, but apparently I have not paid proper attention because I cannot remember which is which, and to my eyes it is not obvious in the sample sheet.

With this in mind, I spoke with Solomon briefly and have an idea of the 3 logical groups in his data. Let us therefore separate and examine those first.

6.1 Metabolism and infection

For the moment, I am going to call Solomon’s samples ‘metabolism and infection.’ I will also complicate the ‘condition’ of the data by combining the media and strain, but shortly thereafter will split that back. I think the reason why will become clear.

initials_factor <- gsub(x=rownames(pData(pa14_expt)), pattern="^(..).*$", replacement="\\1")
pData(pa14_expt)[["initials"]] <- as.factor(initials_factor)
strain_media <- paste0(pData(pa14_expt)[["strains"]], "_",
                       pData(pa14_expt)[["media"]])
pData(pa14_expt)[["strain_media"]] <- strain_media

## Lets set some colors
## WT: grayscale, eda: blue, edd: green, gcd: purple, pgl: red, zwf: yellow
colors_by_strain <- list(
    "PA14 WT" = "#000000",
    "PA14 eda" = "#0000dd",
    "PA14 edd" = "#00dd00",
    "PA14 gcd" = "#dd00dd",
    "PA14 pgl" = "#dd0000",
    "PA14 zwf" = "#dddd00")

infect_metabolism <- subset_expt(pa14_expt, subset="initials=='SM'") %>%
  set_expt_conditions(fact="strains") %>%
  set_expt_batches(fact="media")
## subset_expt(): There were 103, now there are 58 samples.
plot_legend(infect_metabolism)$plot

metabolism_control <- subset_expt(infect_metabolism,
                                  subset="media=='LB'|media=='LB + 0.5 M urea'") %>%
  set_expt_conditions(fact="media") %>%
  set_expt_batches("bioreplicate")
## subset_expt(): There were 58, now there are 6 samples.
metabolism_starvation <- subset_expt(infect_metabolism,
                                     subset="media=='PBST'|media=='Urine'") %>%
  set_expt_colors(colors=colors_by_strain) %>%
  set_expt_conditions(fact="media") %>%
  set_expt_batches(fact="strains")
## subset_expt(): There were 58, now there are 35 samples.
metabolism_starvation_strain <- set_expt_conditions(metabolism_starvation, fact="strains") %>%
  set_expt_batches(fact="media")

metabolism_exudate <- subset_expt(infect_metabolism,
                                  subset="media=='Instilled'")
## subset_expt(): There were 58, now there are 17 samples.

6.2 Glance at these 4 subsets

As a whole group, these samples are a bit confusing. The mouse instiled samples are prety obvious, but the other sources of variance remain a bit of a mystery to me.

global_norm <- normalize_expt(infect_metabolism, filter=TRUE, convert="cpm",
                              norm="quant", transform="log2") %>%
  set_expt_conditions(fact="media")
## Removing 13 low-count genes (5966 remaining).
## transform_counts: Found 1 values equal to 0, adding 1 to the matrix.
plot_pca(global_norm)$plot
## Warning: ggrepel: 16 unlabeled data points (too many overlaps). Consider
## increasing max.overlaps

tmp <- global_norm %>%
  set_expt_conditions(fact="strains")
plot_pca(tmp)$plot
## Warning: ggrepel: 48 unlabeled data points (too many overlaps). Consider
## increasing max.overlaps

7 The smallest experiment: LB vs. LB+urea

This is a group of 6 samples, 3 in LB and three in LB+urea. This should therefore be the most straight forward comparison.

mc_norm <- normalize_expt(metabolism_control, transform="log2",
                          convert="cpm", norm="quant", filter=TRUE)
## Removing 73 low-count genes (5906 remaining).
plot_pca(mc_norm)$plot

7.1 Metabolism control experiment, DE

mc_san <- sanitize_expt(metabolism_control)
mc_de <- all_pairwise(mc_san, model_batch=TRUE, filter=TRUE)
## Using limma's removeBatchEffect to visualize with(out) batch inclusion.
## Finished running DE analyses, collecting outputs.
## Comparing analyses.
mc_tables <- combine_de_tables(
    mc_de,
    excel=glue::glue("excel/metabolism_control_tables-v{ver}.xlsx"))
## Deleting the file excel/metabolism_control_tables-v20220512.xlsx before writing the tables.
mc_sig <- extract_significant_genes(
    mc_tables,
    excel=glue::glue("excel/metabolism_control_sig-v{ver}.xlsx"))
## Deleting the file excel/metabolism_control_sig-v20220512.xlsx before writing the tables.

8 Starving strains

The second group is a little more complex, it seeks to simultaneously compare the strains (WT vs. mutants) and the environment (PBS vs. urine).

This design is complex enough that I think we need to choose colors more carefully.

Here is a query from Solomon:

Could you please generate me a table for the metabolism starvation strain analyses where the urine is the numerator and the PBST is the denominator?

I am interpreting this to mean we should have an experimental design in which we ignore the strains and just compare all urine and pbst samples. When I ran the following block, it looks to me that we currently return this in the following block:

ms_norm <- normalize_expt(metabolism_starvation, filter=TRUE, norm="quant",
                          convert="cpm", transform="log2")
## Removing 30 low-count genes (5949 remaining).
plot_pca(ms_norm)$plot

ms_de <- all_pairwise(metabolism_starvation, model_batch=TRUE)
## Using limma's removeBatchEffect to visualize with(out) batch inclusion.
## Finished running DE analyses, collecting outputs.
## Comparing analyses.
ms_de$comparison$comp
##                Urine_vs_PBST
## limma_vs_deseq        0.9830
## limma_vs_edger        0.9829
## limma_vs_ebseq        0.9772
## limma_vs_basic        0.9996
## deseq_vs_edger        0.9999
## deseq_vs_ebseq        0.9953
## deseq_vs_basic        0.9833
## edger_vs_ebseq        0.9963
## edger_vs_basic        0.9833
## ebseq_vs_basic        0.9810
ms_tables <- combine_de_tables(
    ms_de,
    excel=glue::glue("excel/metabolism_starvation_tables-v{ver}.xlsx"))
## Deleting the file excel/metabolism_starvation_tables-v20220512.xlsx before writing the tables.
ms_sig <- extract_significant_genes(
    ms_tables,
    excel=glue::glue("excel/metabolism_starvation_sig-v{ver}.xlsx"))
## Deleting the file excel/metabolism_starvation_sig-v20220512.xlsx before writing the tables.

9 Metabolism Starvation GO

ms_up <- ms_tables[["significant"]][["deseq"]][["ups"]][[1]]
ms_down <- ms_tables[["significant"]][["deseq"]][["downs"]][[1]]

## The go data from microbesonline is keyed by the gene name
## (e.g. dnaA), not gene ID or PA id or whatever.
pa14_lengths <- pa14_annot[, c("name.x", "width")]
colnames(pa14_lengths) <- c("ID", "width")

rownames(ms_up) <- make.names(ms_up[["namex"]], unique=TRUE)
## Error in `rownames<-`(`*tmp*`, value = character(0)): attempt to set 'rownames' on an object with no dimensions
ms_up_goseq <- simple_goseq(ms_up, go_db=pa14_go, length_db=pa14_lengths)
## Error in simple_goseq(ms_up, go_db = pa14_go, length_db = pa14_lengths): Not sure how to handle your set of significant gene ids.
ms_up_goseq[["pvalue_plots"]][["bpp_plot_over"]]
## Error in eval(expr, envir, enclos): object 'ms_up_goseq' not found
ms_up_goseq[["pvalue_plots"]][["mfp_plot_over"]]
## Error in eval(expr, envir, enclos): object 'ms_up_goseq' not found
rownames(ms_down) <- make.names(ms_down[["namex"]], unique=TRUE)
## Error in `rownames<-`(`*tmp*`, value = character(0)): attempt to set 'rownames' on an object with no dimensions
ms_down_goseq <- simple_goseq(ms_down, go_db=pa14_go, length_db=pa14_lengths)
## Error in simple_goseq(ms_down, go_db = pa14_go, length_db = pa14_lengths): Not sure how to handle your set of significant gene ids.
ms_down_goseq[["pvalue_plots"]][["bpp_plot_over"]]
## Error in eval(expr, envir, enclos): object 'ms_down_goseq' not found
ms_down_goseq[["pvalue_plots"]][["mfp_plot_over"]]
## Error in eval(expr, envir, enclos): object 'ms_down_goseq' not found

9.1 Compare strains

This time let us compare the strains and lower the variance from media.

mss_norm <- normalize_expt(metabolism_starvation_strain, filter=TRUE, convert="cpm", norm="quant",
                           transform="log2")
## Removing 30 low-count genes (5949 remaining).
plot_pca(mss_norm)$plot

mss_urine <- subset_expt(metabolism_starvation_strain, subset="batch=='Urine'")
## subset_expt(): There were 35, now there are 18 samples.
mss_urine_norm <- normalize_expt(mss_urine, filter=TRUE, convert="cpm", norm="quant",
                                 batch="svaseq", transform="log2")
## Warning in normalize_expt(mss_urine, filter = TRUE, convert = "cpm", norm =
## "quant", : Quantile normalization and sva do not always play well together.
## Removing 38 low-count genes (5941 remaining).
## Setting 5 low elements to zero.
## transform_counts: Found 5 values equal to 0, adding 1 to the matrix.
plot_pca(mss_urine_norm)$plot

mss_pbst <- subset_expt(metabolism_starvation_strain, subset="batch=='PBST'")
## subset_expt(): There were 35, now there are 17 samples.
mss_pbst_norm <- normalize_expt(mss_pbst, filter=TRUE, convert="cpm",
                                batch="svaseq", transform="log2")
## Removing 57 low-count genes (5922 remaining).
## Setting 14 low elements to zero.
## transform_counts: Found 14 values equal to 0, adding 1 to the matrix.
plot_pca(mss_pbst_norm)$plot

interesting <- list(
    "eda_vs_wt" = c("PA14eda", "PA14WT"),
    "edd_vs_wt" = c("PA14edd", "PA14WT"),
    "gcd_vs_wt" = c("PA14gcd", "PA14WT"),
    "pgl_vs_wt" = c("PA14pgl", "PA14WT"),
    "zfw_vs_wt" = c("PA14zwf", "PA14WT"))
mss_urine_de <- all_pairwise(mss_urine, model_batch="svaseq", filter=TRUE)
## Removing 0 low-count genes (5941 remaining).
## Setting 11 low elements to zero.
## transform_counts: Found 11 values equal to 0, adding 1 to the matrix.
## Finished running DE analyses, collecting outputs.
## Comparing analyses.

mss_urine_table <- combine_de_tables(
    mss_urine_de, keepers=interesting,
    excel=glue::glue("excel/metabolism_starvation_strain_tables-v{ver}.xlsx"))
## Deleting the file excel/metabolism_starvation_strain_tables-v20220512.xlsx before writing the tables.
mss_urine_sig <- extract_significant_genes(
    mss_urine_table,
    excel=glue::glue("excel/metabolism_starvation_strain_sig-v{ver}.xlsx"))
## Deleting the file excel/metabolism_starvation_strain_sig-v20220512.xlsx before writing the tables.

Given that the strains are so similar, we can comfortably compare them across media (PBST/urine).

msm <- set_expt_conditions(metabolism_starvation_strain, fact="batch") %>%
  set_expt_batches(fact="bioreplicate")
msm_norm <- normalize_expt(msm, filter=TRUE, convert="cpm", norm="quant",
                           transform="log2")
## Removing 30 low-count genes (5949 remaining).
plot_pca(msm_norm)$plot

10 Exudate

Compare the strains during the instillation process

exudate_norm <- normalize_expt(metabolism_exudate, filter=TRUE, convert="cpm",
                               norm="quant", transform="log2")
## Removing 69 low-count genes (5910 remaining).
## transform_counts: Found 76 values equal to 0, adding 1 to the matrix.
pp(file="images/compare_strains_exudate.pdf", image=plot_pca(exudate_norm)$plot)

exudate_nb <- normalize_expt(metabolism_exudate, filter=TRUE, convert="cpm",
                             transform="log2", batch="svaseq")
## Removing 69 low-count genes (5910 remaining).
## Setting 393 low elements to zero.
## transform_counts: Found 393 values equal to 0, adding 1 to the matrix.
plot_pca(exudate_nb)$plot

pp(file="images/compare_strains_exudate_sva.pdf", image=plot_pca(exudate_nb)$plot)

10.1 Exudate DE

exudate_de <- all_pairwise(metabolism_exudate, model_batch=TRUE, filter=TRUE)
## Using limma's removeBatchEffect to visualize with(out) batch inclusion.
## Finished running DE analyses, collecting outputs.
## Comparing analyses.

exudate_tables <- combine_de_tables(
    exudate_de, keepers=interesting,
    excel=glue::glue("excel/exudate_tables-v{ver}.xlsx"))
exudate_sig <- extract_significant_genes(
    exudate_tables,
    excel=glue::glue("excel/exudate_sig-v{ver}.xlsx"))

wanted_table <- exudate_tables[["data"]][["eda_vs_wt"]]
eda_wt_volcano <- plot_volcano_de(wanted_table, logfc=2, fc_col="deseq_logfc", p_col="deseq_adjp")
pp(file="images/wt_vs_eda_de_volcano_instilled.pdf",
   image=eda_wt_volcano$plot)

11 Instilled vs. PBST/Urine

Vince and Najib are interested in a slightly different question:

instilled_vs <- subset_expt(
    pa14_expt,
    subset='media=="PBST"|media=="Urine"|media=="Instilled"') %>%
  set_expt_conditions(fact="media") %>%
  set_expt_batches(fact="bioreplicate")
## subset_expt(): There were 103, now there are 52 samples.
instilled_vs_norm <- normalize_expt(instilled_vs, transform="log2", convert="cpm",
                                    norm="quant", filter=TRUE)
## Removing 13 low-count genes (5966 remaining).
## transform_counts: Found 1 values equal to 0, adding 1 to the matrix.
inst_pca <- plot_pca(instilled_vs_norm)$plot
pp(file="images/instilled_vs_pca.pdf", image=inst_pca)
## Warning: ggrepel: 10 unlabeled data points (too many overlaps). Consider increasing max.overlaps
## ggrepel: 10 unlabeled data points (too many overlaps). Consider increasing max.overlaps

inst_vs_de <- all_pairwise(instilled_vs, filter=TRUE)
## Using limma's removeBatchEffect to visualize with(out) batch inclusion.
## Finished running DE analyses, collecting outputs.
## Comparing analyses.

inst_vs_tables <- combine_de_tables(
    inst_vs_de,
    excel=glue::glue("excel/instilled_vs_tables-v{ver}.xlsx"))
inst_vs_sig <- extract
## Error in eval(expr, envir, enclos): object 'extract' not found
pp(file="images/pbst_vs_instilled_de_volcano.pdf",
   image=inst_vs_tables[["plots"]][["PBST_vs_Instilled"]][["deseq_vol_plots"]][["plot"]])

12 Check mouse counts

mm_expt <- create_expt("sample_sheets/all_samples_modified2.xlsx",
                       gene_info=pa14_annot, file_column="mousetable")
## Reading the sample metadata.
## Did not find the condition column in the sample sheet.
## Filling it in as undefined.
## Did not find the batch column in the sample sheet.
## Filling it in as undefined.
## The sample definitions comprises: 105 rows(samples) and 32 columns(metadata fields).
## Warning in create_expt("sample_sheets/all_samples_modified2.xlsx", gene_info
## = pa14_annot, : Some samples were removed when cross referencing the samples
## against the count data.
## Warning in create_expt("sample_sheets/all_samples_modified2.xlsx", gene_info =
## pa14_annot, : Even after changing the rownames in gene info, they do not match
## the count table.
## Even after changing the rownames in gene info, they do not match the count table.
## Here are the first few rownames from the count tables:
## gene:ENSMUSG00000000001, gene:ENSMUSG00000000003, gene:ENSMUSG00000000028, gene:ENSMUSG00000000037, gene:ENSMUSG00000000049, gene:ENSMUSG00000000056
## Here are the first few rownames from the gene information table:
## gene1650835, gene1650837, gene1650839, gene1650841, gene1650843, gene1650845
## Bringing together the count matrix and gene information.
## Some annotations were lost in merging, setting them to 'undefined'.
## Warning in create_expt("sample_sheets/all_samples_modified2.xlsx", gene_info =
## pa14_annot, : The following samples have no counts! SM029SM032SM038SM040
## Saving the expressionset to 'expt.rda'.
## The final expressionset has 25753 features and 35 samples.
plot_libsize(mm_expt)$plot
## Warning: Transformation introduced infinite values in continuous y-axis
## Warning: Transformation introduced infinite values in continuous y-axis
## Warning: Removed 4 rows containing missing values (geom_bar).

13 Fun with circos

control_table <- mc_tables[["data"]][["LB05Murea_vs_LB"]]
urine_eda <- mss_urine_table[["data"]][["eda_vs_wt"]]
urine_edd <- mss_urine_table[["data"]][["edd_vs_wt"]]
urine_gcd <- mss_urine_table[["data"]][["gcd_vs_wt"]]
urine_pgl <- mss_urine_table[["data"]][["pgl_vs_wt"]]
urine_zfw <- mss_urine_table[["data"]][["zfw_vs_wt"]]

exudate_eda <- exudate_tables[["data"]][["eda_vs_wt"]]
exudate_edd <- exudate_tables[["data"]][["edd_vs_wt"]]
exudate_gcd <- exudate_tables[["data"]][["gcd_vs_wt"]]
exudate_pgl <- exudate_tables[["data"]][["pgl_vs_wt"]]
exudate_zfw <- exudate_tables[["data"]][["zfw_vs_wt"]]

pa14_annot[["chromosome"]] <- "Pseudomonas_aeruginosa_UCBPP_PA14"

sm_cfg <- circos_prefix(pa14_annot, name="sm", cog_column = "COGFun",
                        start_column="start.x", end_column="end", strand_column="strand.x",
                        chr_column="chromosome", id_column="gene_id")
## This assumes you have a colors.conf in circos/colors/ and fonts.conf in circos/fonts/
## It also assumes you have conf/ideogram.conf, conf/ticks.conf, and conf/housekeeping.conf
## It will write circos/conf/sm.conf with a reasonable first approximation config file.
## Wrote karyotype to circos/conf/ideograms/sm.conf
## This should match the ideogram= line in sm.conf
## Wrote ticks to circos/conf/ticks_sm.conf
sm_kary <- circos_karyotype(sm_cfg, fasta="reference/paeruginosah_pa14.fasta")
## Error in .Call2("new_input_filexp", filepath, PACKAGE = "XVector"): cannot open file 'reference/paeruginosah_pa14.fasta'
sm_plus_minus <- circos_plus_minus(sm_cfg, width=0.06, thickness=40)
## Writing data file: circos/data/sm_plus_go.txt with the + strand GO data.
## Writing data file: circos/data/sm_minus_go.txt with the - strand GO data.
## Wrote the +/- config files.  Appending their inclusion to the master file.
## Returning the inner width: 0.88.  Use it as the outer for the next ring.
## Put the plots here
sm_first_heat <- circos_heatmap(sm_cfg, control_table, colname="deseq_logfc",
                                basename="control", outer=sm_plus_minus, width=0.05)
## Assuming the input is a dataframe.
## Writing data file: circos/data/smdeseq_logfc_heatmap.txt with the controldeseq_logfc column.
## Returning the inner width: 0.81.  Use it as the outer for the next ring.
##sm_eda_hist <- circos_hist(sm_cfg, urine_eda, colname="deseq_logfc",
##                           basename="ureda", outer=sm_first_hist, spacing=-0.05)
##sm_edd_hist <- circos_hist(sm_cfg, urine_edd, colname="deseq_logfc",
##                           basename="uredd", outer=sm_eda_hist, spacing=-0.05)
##sm_gcd_hist <- circos_hist(sm_cfg, urine_gcd, colname="deseq_logfc",
##                           basename="urgcd", outer=sm_edd_hist, spacing=-0.05)
##sm_pgl_hist <- circos_hist(sm_cfg, urine_pgl, colname="deseq_logfc",
##                           basename="urpgl", outer=sm_gcd_hist, spacing=-0.05)
##sm_zfw_hist <- circos_hist(sm_cfg, urine_zfw, colname="deseq_logfc",
##                           basename="urzfw", outer=sm_pgl_hist, spacing=-0.05)
##ex_eda_hist <- circos_hist(sm_cfg, exudate_eda, colname="deseq_logfc",
##                           basename="exeda", outer=sm_zfw_hist, spacing=-0.05)
##ex_edd_hist <- circos_hist(sm_cfg, exudate_edd, colname="deseq_logfc",
##                           basename="exedd", outer=ex_eda_hist, spacing=-0.05)
##ex_gcd_hist <- circos_hist(sm_cfg, exudate_gcd, colname="deseq_logfc",
##                           basename="exgcd", outer=ex_edd_hist, spacing=-0.05)
##ex_pgl_hist <- circos_hist(sm_cfg, exudate_pgl, colname="deseq_logfc",
##                           basename="expgl", outer=ex_gcd_hist, spacing=-0.05)
##ex_zfw_hist <- circos_hist(sm_cfg, exudate_zfw, colname="deseq_logfc",
##                           basename="exzfw", outer=ex_pgl_hist, spacing=-0.05)
sm_finish <- circos_suffix(sm_cfg)
sm_made <- circos_make(sm_cfg, target="sm")
pander::pander(sessionInfo())
message(paste0("This is hpgltools commit: ", get_git_commit()))
this_save <- paste0(gsub(pattern="\\.Rmd", replace="", x=rmd_file), "-v", ver, ".rda.xz")
message(paste0("Saving to ", this_save))
tmp <- sm(saveme(filename=this_save))
LS0tCnRpdGxlOiAiRUQgUHJvamVjdDogUHNldWRvbW9uYXMgUk5BU2VxIGRhdGFzZXQuIgphdXRob3I6ICJhdGIgYWJlbGV3QGdtYWlsLmNvbSIKZGF0ZTogImByIFN5cy5EYXRlKClgIgpvdXRwdXQ6CiAgaHRtbF9kb2N1bWVudDoKICAgIGNvZGVfZG93bmxvYWQ6IHRydWUKICAgIGNvZGVfZm9sZGluZzogc2hvdwogICAgZmlnX2NhcHRpb246IHRydWUKICAgIGZpZ19oZWlnaHQ6IDcKICAgIGZpZ193aWR0aDogNwogICAgaGlnaGxpZ2h0OiB0YW5nbwogICAga2VlcF9tZDogZmFsc2UKICAgIG1vZGU6IHNlbGZjb250YWluZWQKICAgIG51bWJlcl9zZWN0aW9uczogdHJ1ZQogICAgc2VsZl9jb250YWluZWQ6IHRydWUKICAgIHRoZW1lOiByZWFkYWJsZQogICAgdG9jOiB0cnVlCiAgICB0b2NfZmxvYXQ6CiAgICAgIGNvbGxhcHNlZDogZmFsc2UKICAgICAgc21vb3RoX3Njcm9sbDogZmFsc2UKICBybWRmb3JtYXRzOjpyZWFkdGhlZG93bjoKICAgIGNvZGVfZG93bmxvYWQ6IHRydWUKICAgIGNvZGVfZm9sZGluZzogc2hvdwogICAgZGZfcHJpbnQ6IHBhZ2VkCiAgICBmaWdfY2FwdGlvbjogdHJ1ZQogICAgZmlnX2hlaWdodDogNwogICAgZmlnX3dpZHRoOiA3CiAgICBoaWdobGlnaHQ6IHRhbmdvCiAgICB3aWR0aDogMzAwCiAgICBrZWVwX21kOiBmYWxzZQogICAgbW9kZTogc2VsZmNvbnRhaW5lZAogICAgdG9jX2Zsb2F0OiB0cnVlCiAgQmlvY1N0eWxlOjpodG1sX2RvY3VtZW50OgogICAgY29kZV9kb3dubG9hZDogdHJ1ZQogICAgY29kZV9mb2xkaW5nOiBzaG93CiAgICBmaWdfY2FwdGlvbjogdHJ1ZQogICAgZmlnX2hlaWdodDogNwogICAgZmlnX3dpZHRoOiA3CiAgICBoaWdobGlnaHQ6IHRhbmdvCiAgICBrZWVwX21kOiBmYWxzZQogICAgbW9kZTogc2VsZmNvbnRhaW5lZAogICAgdG9jX2Zsb2F0OiB0cnVlCi0tLQoKPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KYm9keSwgdGQgewogIGZvbnQtc2l6ZTogMTZweDsKfQpjb2RlLnJ7CiAgZm9udC1zaXplOiAxNnB4Owp9CnByZSB7CiBmb250LXNpemU6IDE2cHgKfQo8L3N0eWxlPgoKYGBge3Igb3B0aW9ucywgaW5jbHVkZT1GQUxTRX0KbGlicmFyeSgiaHBnbHRvb2xzIikKdHQgPC0gZGV2dG9vbHM6OmxvYWRfYWxsKCJ+L2hwZ2x0b29scyIpCmtuaXRyOjpvcHRzX2tuaXQkc2V0KHdpZHRoPTEyMCwKICAgICAgICAgICAgICAgICAgICAgcHJvZ3Jlc3M9VFJVRSwKICAgICAgICAgICAgICAgICAgICAgdmVyYm9zZT1UUlVFLAogICAgICAgICAgICAgICAgICAgICBlY2hvPVRSVUUpCmtuaXRyOjpvcHRzX2NodW5rJHNldChlcnJvcj1UUlVFLAogICAgICAgICAgICAgICAgICAgICAgZHBpPTk2KQpvbGRfb3B0aW9ucyA8LSBvcHRpb25zKGRpZ2l0cz00LAogICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ3NBc0ZhY3RvcnM9RkFMU0UsCiAgICAgICAgICAgICAgICAgICAgICAga25pdHIuZHVwbGljYXRlLmxhYmVsPSJhbGxvdyIpCmdncGxvdDI6OnRoZW1lX3NldChnZ3Bsb3QyOjp0aGVtZV9idyhiYXNlX3NpemU9MTApKQpydW5kYXRlIDwtIGZvcm1hdChTeXMuRGF0ZSgpLCBmb3JtYXQ9IiVZJW0lZCIpCnByZXZpb3VzX2ZpbGUgPC0gIiIKdmVyIDwtIGZvcm1hdChTeXMuRGF0ZSgpLCAiJVklbSVkIikKCiMjdG1wIDwtIHNtKGxvYWRtZShmaWxlbmFtZT1wYXN0ZTAoZ3N1YihwYXR0ZXJuPSJcXC5SbWQiLCByZXBsYWNlPSIiLCB4PXByZXZpb3VzX2ZpbGUpLCAiLXYiLCB2ZXIsICIucmRhLnh6IikpKQpybWRfZmlsZSA8LSAiaW5kZXhfc20uUm1kIgpgYGAKCiMgSW50cm9kdWN0aW9uCgpUaGlzIGRhdGFzZXQgY29udGFpbnMgbXVsdGlwbGUgZXhwZXJpbWVudHMuCgojIEFubm90YXRpb25zCgpgYGB7ciBhbm5vdGF0aW9ufQpwYTE0X2dmZiA8LSBsb2FkX2dmZl9hbm5vdGF0aW9ucygicmVmZXJlbmNlL3BhZXJ1Z2lub3NhX3BhMTQuZ2ZmIiwgaWRfY29sPSJnZW5lX2lkIikKcm93bmFtZXMocGExNF9nZmYpIDwtIHBhMTRfZ2ZmW1siZ2VuZV9pZCJdXQojIyBUaGUgQWxpYXMgY29sdW1uIGhhcyBQQTE0XzAwMDEwCgpwYTE0X21pY3JvYmVzIDwtIGFzLmRhdGEuZnJhbWUobG9hZF9taWNyb2Jlc29ubGluZV9hbm5vdGF0aW9ucygiUEExNCIpKQojIyBUaGUgc3lzTmFtZSBjb2x1bW4gaGFzIFBBMTRfMDAxMAoKcGExNF9hbm5vdCA8LSBtZXJnZShwYTE0X2dmZiwgcGExNF9taWNyb2JlcywgYnkueD0iQWxpYXMiLCBieS55PSJzeXNOYW1lIikKcm93bmFtZXMocGExNF9hbm5vdCkgPC0gcGExNF9hbm5vdFtbImdlbmVfaWQiXV0KCiMjIFRoZSBpZGVudGlmaWVycyBhcmUgYSBiaXQgb2RkLCBzbyB3ZSBuZWVkIHRvIGRvIGEgbGl0dGxlIHdvcmsKcGExNF9sZW5ndGggPC0gcGExNF9hbm5vdFssIGMoImdlbmVfaWQiLCAid2lkdGgiLCAiQWxpYXMiKV0KcGExNF9nbyA8LSBsb2FkX21pY3JvYmVzb25saW5lX2dvKHNwZWNpZXM9IlBBMTQiLCBpZF9jb2x1bW49InN5c05hbWUiKQpwYTE0X2dvX2xlbmd0aCA8LSBtZXJnZShwYTE0X2dvLCBwYTE0X2xlbmd0aCwgYnkueD0ic3lzTmFtZSIsIGJ5Lnk9IkFsaWFzIikKcGExNF9nbyA8LSBwYTE0X2dvX2xlbmd0aFssIGMoImdlbmVfaWQiLCAiR08iKV0KY29sbmFtZXMocGExNF9nbykgPC0gYygiSUQiLCAiR08iKQpwYTE0X2xlbmd0aCA8LSBwYTE0X2dvX2xlbmd0aFssIGMoImdlbmVfaWQiLCAid2lkdGgiKV0KcGExNF9sZW5ndGhfaWRzIDwtIHVuaXF1ZShwYTE0X2xlbmd0aClbWyJnZW5lX2lkIl1dCnBhMTRfbGVuZ3RoIDwtIHBhMTRfbGVuZ3RoW3BhMTRfbGVuZ3RoX2lkcywgXQpyb3duYW1lcyhwYTE0X2xlbmd0aCkgPC0gbWFrZS5uYW1lcyhwYTE0X2xlbmd0aFtbImdlbmVfaWQiXV0sIHVuaXF1ZT1UUlVFKQpjb2xuYW1lcyhwYTE0X2xlbmd0aCkgPC0gYygiSUQiLCAid2lkdGgiKQpgYGAKCiMgTWFrZSB0aGUgZXhwcmVzc2lvbnNldAoKR2l2ZW4gdGhlIGFib3ZlIGFubm90YXRpb25zLCBub3cgbGV0cyBwdWxsIGluIHRoZSBjb3VudHMuCgpJIGFtIHN3aXRjaGluZyB0byB0aGUgc2hlZXQgYWxsX3NhbXBsZXNfbW9kaWZpZWRfZ2NkLnhsc3ggZm9yIHRoZQptb21lbnQgYmVjYXVzZSBJIGFkZGVkIGEgc3BhY2UgaW4gdGhlIHN0cmFpbiBuYW1lIGZvciB0aGUgZ2NkIHNhbXBsCgpgYGB7ciBleHByZXNzaW9uc2V0fQpwYTE0X2V4cHQgPC0gY3JlYXRlX2V4cHQoInNhbXBsZV9zaGVldHMvYWxsX3NhbXBsZXNfbW9kaWZpZWRfZ2NkLnhsc3giLAogICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZV9pbmZvPXBhMTRfYW5ub3QsIGZpbGVfY29sdW1uPSJoaXNhdGNvdW50dGFibGUiKQpgYGAKCiMgUXVpY2sgZ2xvYmFsIGxvb2sgYXQgdGhlIGRhdGEKCldoaWxlIHdlIGFyZSBhdCBpdCwgbGV0cyBkcm9wIHRoZSB0d28gc2FkIHNhbXBsZXMuCgpgYGB7ciBtZXRyaWNzfQpwYTE0X2xpYnNpemUgPC0gcGxvdF9saWJzaXplKHBhMTRfZXhwdCkKcGExNF9saWJzaXplJHBsb3QKCnBhMTRfbm9uemVybyA8LSBwbG90X25vbnplcm8ocGExNF9leHB0KQpwYTE0X25vbnplcm8kcGxvdAoKcGExNF9leHB0IDwtIHN1YnNldF9leHB0KHBhMTRfZXhwdCwgbm9uemVybz01NTAwKQpgYGAKCiMjIEEgZmV3IHF1ZXJpZXMKCkkga25vdyBhIHByaW9yaSB0aGF0IEFwcmlsIGlzIGludGVyZXN0ZWQgdG8gc2VlIGhvdyB0aGUgNCBsaWJyYXJ5CnByZXBhcmF0aW9ucyBsb29rIHdpdGggcmVzcGVjdCB0byBlYWNoIG90aGVyLiAgTGV0IHVzIHRoZXJlZm9yZSBjcmVhdGUKYSBkYXRhIHN0cnVjdHVyZSB0byBsb29rIGV4cGxpY2l0bHkgYXQgdGhhdC4KCmBgYHtyIGxpYnByZXB9CnBhMTRfbGlicHJlcCA8LSBzZXRfZXhwdF9jb25kaXRpb25zKHBhMTRfZXhwdCwgZmFjdD0ibGlicmFyeXByZXBiYXRjaCIpICU+JQogIHNldF9leHB0X2JhdGNoZXMoZmFjdD0ib3JnYW5pc21zIikKCnBhMTRfbGliX25vcm0gPC0gbm9ybWFsaXplX2V4cHQocGExNF9saWJwcmVwLCBmaWx0ZXI9VFJVRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb252ZXJ0PSJjcG0iLCBub3JtPSJxdWFudCIsIHRyYW5zZm9ybT0ibG9nMiIpCnBsb3RfcGNhKHBhMTRfbGliX25vcm0pJHBsb3QKcGxvdF9jb3JoZWF0KHBhMTRfbGliX25vcm0pJHBsb3QKCmxpYnByZXBfcGNhX2luZm8gPC0gcGNhX2luZm9ybWF0aW9uKAogICAgcGExNF9saWJfbm9ybSwgcGxvdF9wY2FzPVRSVUUsCiAgICBleHB0X2ZhY3RvcnM9YygibGlicmFyeXByZXBiYXRjaCIsICJvcmdhbmlzbXMiLCAic3RyYWlucyIsICJtZWRpYSIsICJiaW9yZXBsaWNhdGUiKSkKbGlicHJlcF9wY2FfaW5mbyRhbm92YV9mX2hlYXRtYXAKbGlicHJlcF9wY2FfaW5mbyRwY2FfcGxvdHNbWzJdXQpsaWJwcmVwX3BjYV9pbmZvJHBjYV9wbG90c1tbM11dCmxpYnByZXBfcGNhX2luZm8kcGNhX3Bsb3RzW1s0XV0KbGlicHJlcF9wY2FfaW5mbyRwY2FfcGxvdHNbWzVdXQpgYGAKClRvIG15IGV5ZXMgdGhleSBsb29rIHJlYXNvbmFibHkgbWl4ZWQsIHN1Z2dlc3RpbmcgdGhhdCBsaWJyYXJ5IHByZXAKYmF0Y2ggaXMgbm90IGEgZG9taW5hbnQgZmFjdG9yIGluIHRoZSBkYXRhLgoKQXQgdGhpcyBwb2ludCwgSSBhbSB0aGlua2luZyB0aGF0IHdlIHNob3VsZCBzZXBhcmF0ZSB0aGUgZGF0YSBieSB0aGUKZXhwZXJpbWVudHMsIGJ1dCBJIHdpbGwgZmlyc3QganVzdCBzaG93IHRoZSByZWxhdGlvbnNoaXBzIGFtb25nIGFsbAp0aGUgZGF0YS4KCiMgTG9va2luZyBhdCBvdGhlciBmYWN0b3JzCgpBcyBmYXIgYXMgSSBzZWUsIHRoZXJlIGFyZSB0aHJlZSBmYWN0b3JzIHdoaWNoIGFyZSBvZiBwcmltYXJ5CmludGVyZXN0OgoKMS4gUEExNCBzdHJhaW4KMi4gTWVkaWEgdXNlZAozLiBCaW9yZXBsaWNhdGUKClRoZSBsYXN0IHdpbGwgYmUgdXNlZCBhcyBiYXRjaCBpbiB0aGUgZm9sbG93aW5nIHBsb3RzLgoKYGBge3Igb3RoZXJfZmFjdG9yc30KcGExNF9tZWRpYSA8LSBzZXRfZXhwdF9jb25kaXRpb25zKHBhMTRfZXhwdCwgZmFjdD0ibWVkaWEiKSAlPiUKICBzZXRfZXhwdF9iYXRjaGVzKGZhY3Q9ImJpb3JlcGxpY2F0ZSIpCnBhMTRfbWVkaWFfbm9ybSA8LSBub3JtYWxpemVfZXhwdChwYTE0X21lZGlhLCB0cmFuc2Zvcm09ImxvZzIiLCBjb252ZXJ0PSJjcG0iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyPVRSVUUsIG5vcm09InF1YW50IikKcGxvdF9wY2EocGExNF9tZWRpYV9ub3JtKSRwbG90CgpwYTE0X3N0cmFpbnMgPC0gc2V0X2V4cHRfY29uZGl0aW9ucyhwYTE0X2V4cHQsIGZhY3Q9InN0cmFpbnMiKSAlPiUKICBzZXRfZXhwdF9iYXRjaGVzKGZhY3Q9ImJpb3JlcGxpY2F0ZSIpCnBhMTRfc3RyYWluc19ub3JtIDwtIG5vcm1hbGl6ZV9leHB0KHBhMTRfc3RyYWlucywgdHJhbnNmb3JtPSJsb2cyIiwgY29udmVydD0iY3BtIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcj1UUlVFLCBub3JtPSJxdWFudCIpCnBsb3RfcGNhKHBhMTRfc3RyYWluc19ub3JtKSRwbG90CmBgYAoKRGlzcmVnYXJkaW5nIHRoZSB2YXJpb3VzIGV4cGVyaW1lbnRzIHBlcmZvcm1lZCwgSSB0aGluayB3ZSBjYW4gc3RhdGUKdGhhdCBtZWRpYSBzZXBhcmF0ZXMgdGhlIGRhdGEgaW4gYSBmYXNoaW9uIHdoaWNoIGlzIG1vcmUgaW50ZXJlc3RpbmcKdGhhbiBzdHJhaW4uICBHaXZlbiB0aGUgbnVtYmVyIG9mICh3aGF0IEkgYXNzdW1lIGFyZSkgY2xvc2VseSByZWxhdGVkCnN0cmFpbnMsIEkgYW0gdGhpbmtpbmcgaXQgbWlnaHQgcHJvdmUgdG8gYmUgYSBnb29kIGlkZWEgdG8gcGVyZm9ybSBteQp2YXJpYW50IHNlYXJjaCB0b29sIG9uIHRoaXMgZGF0YSBhbmQgc2VlIGhvdyB3ZWxsIHRoZXkgaGVsZCB1cCB3aXRoCnJlc3BlY3QgdG8gdGhlIHJlZmVyZW5jZSBzdHJhaW4uCgojIFNlcGFyYXRlIHRoZSBleHBlcmltZW50cwoKSSBoYXZlIGJlZW4gdG9sZCByZXBlYXRlZGx5IHRoYXQgdGhlcmUgYXJlIG11bHRpcGxlIGV4cGVyaW1lbnRzIGluCnRoaXMgZGF0YSwgYnV0IGFwcGFyZW50bHkgSSBoYXZlIG5vdCBwYWlkIHByb3BlciBhdHRlbnRpb24gYmVjYXVzZSBJCmNhbm5vdCByZW1lbWJlciB3aGljaCBpcyB3aGljaCwgYW5kIHRvIG15IGV5ZXMgaXQgaXMgbm90IG9idmlvdXMgaW4KdGhlIHNhbXBsZSBzaGVldC4KCldpdGggdGhpcyBpbiBtaW5kLCBJIHNwb2tlIHdpdGggU29sb21vbiBicmllZmx5IGFuZCBoYXZlIGFuIGlkZWEgb2YKdGhlIDMgbG9naWNhbCBncm91cHMgaW4gaGlzIGRhdGEuICBMZXQgdXMgdGhlcmVmb3JlIHNlcGFyYXRlIGFuZApleGFtaW5lIHRob3NlIGZpcnN0LgoKIyMgTWV0YWJvbGlzbSBhbmQgaW5mZWN0aW9uCgpGb3IgdGhlIG1vbWVudCwgSSBhbSBnb2luZyB0byBjYWxsIFNvbG9tb24ncyBzYW1wbGVzICdtZXRhYm9saXNtIGFuZAppbmZlY3Rpb24uJyAgSSB3aWxsIGFsc28gY29tcGxpY2F0ZSB0aGUgJ2NvbmRpdGlvbicgb2YgdGhlIGRhdGEgYnkKY29tYmluaW5nIHRoZSBtZWRpYSBhbmQgc3RyYWluLCBidXQgc2hvcnRseSB0aGVyZWFmdGVyIHdpbGwgc3BsaXQgdGhhdApiYWNrLiAgSSB0aGluayB0aGUgcmVhc29uIHdoeSB3aWxsIGJlY29tZSBjbGVhci4KCmBgYHtyIG1ldGFib2xpc219CmluaXRpYWxzX2ZhY3RvciA8LSBnc3ViKHg9cm93bmFtZXMocERhdGEocGExNF9leHB0KSksIHBhdHRlcm49Il4oLi4pLiokIiwgcmVwbGFjZW1lbnQ9IlxcMSIpCnBEYXRhKHBhMTRfZXhwdClbWyJpbml0aWFscyJdXSA8LSBhcy5mYWN0b3IoaW5pdGlhbHNfZmFjdG9yKQpzdHJhaW5fbWVkaWEgPC0gcGFzdGUwKHBEYXRhKHBhMTRfZXhwdClbWyJzdHJhaW5zIl1dLCAiXyIsCiAgICAgICAgICAgICAgICAgICAgICAgcERhdGEocGExNF9leHB0KVtbIm1lZGlhIl1dKQpwRGF0YShwYTE0X2V4cHQpW1sic3RyYWluX21lZGlhIl1dIDwtIHN0cmFpbl9tZWRpYQoKIyMgTGV0cyBzZXQgc29tZSBjb2xvcnMKIyMgV1Q6IGdyYXlzY2FsZSwgZWRhOiBibHVlLCBlZGQ6IGdyZWVuLCBnY2Q6IHB1cnBsZSwgcGdsOiByZWQsIHp3ZjogeWVsbG93CmNvbG9yc19ieV9zdHJhaW4gPC0gbGlzdCgKICAgICJQQTE0IFdUIiA9ICIjMDAwMDAwIiwKICAgICJQQTE0IGVkYSIgPSAiIzAwMDBkZCIsCiAgICAiUEExNCBlZGQiID0gIiMwMGRkMDAiLAogICAgIlBBMTQgZ2NkIiA9ICIjZGQwMGRkIiwKICAgICJQQTE0IHBnbCIgPSAiI2RkMDAwMCIsCiAgICAiUEExNCB6d2YiID0gIiNkZGRkMDAiKQoKaW5mZWN0X21ldGFib2xpc20gPC0gc3Vic2V0X2V4cHQocGExNF9leHB0LCBzdWJzZXQ9ImluaXRpYWxzPT0nU00nIikgJT4lCiAgc2V0X2V4cHRfY29uZGl0aW9ucyhmYWN0PSJzdHJhaW5zIikgJT4lCiAgc2V0X2V4cHRfYmF0Y2hlcyhmYWN0PSJtZWRpYSIpCnBsb3RfbGVnZW5kKGluZmVjdF9tZXRhYm9saXNtKSRwbG90CgptZXRhYm9saXNtX2NvbnRyb2wgPC0gc3Vic2V0X2V4cHQoaW5mZWN0X21ldGFib2xpc20sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJzZXQ9Im1lZGlhPT0nTEInfG1lZGlhPT0nTEIgKyAwLjUgTSB1cmVhJyIpICU+JQogIHNldF9leHB0X2NvbmRpdGlvbnMoZmFjdD0ibWVkaWEiKSAlPiUKICBzZXRfZXhwdF9iYXRjaGVzKCJiaW9yZXBsaWNhdGUiKQoKbWV0YWJvbGlzbV9zdGFydmF0aW9uIDwtIHN1YnNldF9leHB0KGluZmVjdF9tZXRhYm9saXNtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Vic2V0PSJtZWRpYT09J1BCU1QnfG1lZGlhPT0nVXJpbmUnIikgJT4lCiAgc2V0X2V4cHRfY29sb3JzKGNvbG9ycz1jb2xvcnNfYnlfc3RyYWluKSAlPiUKICBzZXRfZXhwdF9jb25kaXRpb25zKGZhY3Q9Im1lZGlhIikgJT4lCiAgc2V0X2V4cHRfYmF0Y2hlcyhmYWN0PSJzdHJhaW5zIikKCm1ldGFib2xpc21fc3RhcnZhdGlvbl9zdHJhaW4gPC0gc2V0X2V4cHRfY29uZGl0aW9ucyhtZXRhYm9saXNtX3N0YXJ2YXRpb24sIGZhY3Q9InN0cmFpbnMiKSAlPiUKICBzZXRfZXhwdF9iYXRjaGVzKGZhY3Q9Im1lZGlhIikKCm1ldGFib2xpc21fZXh1ZGF0ZSA8LSBzdWJzZXRfZXhwdChpbmZlY3RfbWV0YWJvbGlzbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnNldD0ibWVkaWE9PSdJbnN0aWxsZWQnIikKYGBgCgojIyBHbGFuY2UgYXQgdGhlc2UgNCBzdWJzZXRzCgpBcyBhIHdob2xlIGdyb3VwLCB0aGVzZSBzYW1wbGVzIGFyZSBhIGJpdCBjb25mdXNpbmcuICBUaGUgbW91c2UKaW5zdGlsZWQgc2FtcGxlcyBhcmUgcHJldHkgb2J2aW91cywgYnV0IHRoZSBvdGhlciBzb3VyY2VzIG9mIHZhcmlhbmNlCnJlbWFpbiBhIGJpdCBvZiBhIG15c3RlcnkgdG8gbWUuCgpgYGB7ciBtZXRhYm9saXNtX3N1YnNldHN9Cmdsb2JhbF9ub3JtIDwtIG5vcm1hbGl6ZV9leHB0KGluZmVjdF9tZXRhYm9saXNtLCBmaWx0ZXI9VFJVRSwgY29udmVydD0iY3BtIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9ybT0icXVhbnQiLCB0cmFuc2Zvcm09ImxvZzIiKSAlPiUKICBzZXRfZXhwdF9jb25kaXRpb25zKGZhY3Q9Im1lZGlhIikKcGxvdF9wY2EoZ2xvYmFsX25vcm0pJHBsb3QKCnRtcCA8LSBnbG9iYWxfbm9ybSAlPiUKICBzZXRfZXhwdF9jb25kaXRpb25zKGZhY3Q9InN0cmFpbnMiKQpwbG90X3BjYSh0bXApJHBsb3QKYGBgCgojIFRoZSBzbWFsbGVzdCBleHBlcmltZW50OiBMQiB2cy4gTEIrdXJlYQoKVGhpcyBpcyBhIGdyb3VwIG9mIDYgc2FtcGxlcywgMyBpbiBMQiBhbmQgdGhyZWUgaW4gTEIrdXJlYS4gIFRoaXMKc2hvdWxkIHRoZXJlZm9yZSBiZSB0aGUgbW9zdCBzdHJhaWdodCBmb3J3YXJkIGNvbXBhcmlzb24uCgpgYGB7ciBjb250cm9sfQptY19ub3JtIDwtIG5vcm1hbGl6ZV9leHB0KG1ldGFib2xpc21fY29udHJvbCwgdHJhbnNmb3JtPSJsb2cyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBjb252ZXJ0PSJjcG0iLCBub3JtPSJxdWFudCIsIGZpbHRlcj1UUlVFKQpwbG90X3BjYShtY19ub3JtKSRwbG90CmBgYAoKIyMgTWV0YWJvbGlzbSBjb250cm9sIGV4cGVyaW1lbnQsIERFCgpgYGB7ciBtY19kZX0KbWNfc2FuIDwtIHNhbml0aXplX2V4cHQobWV0YWJvbGlzbV9jb250cm9sKQptY19kZSA8LSBhbGxfcGFpcndpc2UobWNfc2FuLCBtb2RlbF9iYXRjaD1UUlVFLCBmaWx0ZXI9VFJVRSkKbWNfdGFibGVzIDwtIGNvbWJpbmVfZGVfdGFibGVzKAogICAgbWNfZGUsCiAgICBleGNlbD1nbHVlOjpnbHVlKCJleGNlbC9tZXRhYm9saXNtX2NvbnRyb2xfdGFibGVzLXZ7dmVyfS54bHN4IikpCm1jX3NpZyA8LSBleHRyYWN0X3NpZ25pZmljYW50X2dlbmVzKAogICAgbWNfdGFibGVzLAogICAgZXhjZWw9Z2x1ZTo6Z2x1ZSgiZXhjZWwvbWV0YWJvbGlzbV9jb250cm9sX3NpZy12e3Zlcn0ueGxzeCIpKQpgYGAKCiMgU3RhcnZpbmcgc3RyYWlucwoKVGhlIHNlY29uZCBncm91cCBpcyBhIGxpdHRsZSBtb3JlIGNvbXBsZXgsIGl0IHNlZWtzIHRvIHNpbXVsdGFuZW91c2x5CmNvbXBhcmUgdGhlIHN0cmFpbnMgKFdUIHZzLiBtdXRhbnRzKSBhbmQgdGhlIGVudmlyb25tZW50IChQQlMKdnMuIHVyaW5lKS4KClRoaXMgZGVzaWduIGlzIGNvbXBsZXggZW5vdWdoIHRoYXQgSSB0aGluayB3ZSBuZWVkIHRvIGNob29zZSBjb2xvcnMKbW9yZSBjYXJlZnVsbHkuCgpIZXJlIGlzIGEgcXVlcnkgZnJvbSBTb2xvbW9uOgoKQ291bGQgeW91IHBsZWFzZSBnZW5lcmF0ZSBtZSBhIHRhYmxlIGZvciB0aGUgbWV0YWJvbGlzbSBzdGFydmF0aW9uIHN0cmFpbiBhbmFseXNlcyB3aGVyZQp0aGUgdXJpbmUgaXMgdGhlIG51bWVyYXRvciBhbmQgdGhlIFBCU1QgaXMgdGhlIGRlbm9taW5hdG9yPwoKSSBhbSBpbnRlcnByZXRpbmcgdGhpcyB0byBtZWFuIHdlIHNob3VsZCBoYXZlIGFuIGV4cGVyaW1lbnRhbCBkZXNpZ24gaW4gd2hpY2ggd2UgaWdub3JlIHRoZSBzdHJhaW5zCmFuZCBqdXN0IGNvbXBhcmUgYWxsIHVyaW5lIGFuZCBwYnN0IHNhbXBsZXMuICBXaGVuIEkgcmFuIHRoZSBmb2xsb3dpbmcgYmxvY2ssIGl0IGxvb2tzIHRvIG1lIHRoYXQKd2UgY3VycmVudGx5IHJldHVybiB0aGlzIGluIHRoZSBmb2xsb3dpbmcgYmxvY2s6CgpgYGB7ciBzdGFydmluZ19zdHJhaW5zfQptc19ub3JtIDwtIG5vcm1hbGl6ZV9leHB0KG1ldGFib2xpc21fc3RhcnZhdGlvbiwgZmlsdGVyPVRSVUUsIG5vcm09InF1YW50IiwKICAgICAgICAgICAgICAgICAgICAgICAgICBjb252ZXJ0PSJjcG0iLCB0cmFuc2Zvcm09ImxvZzIiKQpwbG90X3BjYShtc19ub3JtKSRwbG90Cgptc19kZSA8LSBhbGxfcGFpcndpc2UobWV0YWJvbGlzbV9zdGFydmF0aW9uLCBtb2RlbF9iYXRjaD1UUlVFKQptc19kZSRjb21wYXJpc29uJGNvbXAKbXNfdGFibGVzIDwtIGNvbWJpbmVfZGVfdGFibGVzKAogICAgbXNfZGUsCiAgICBleGNlbD1nbHVlOjpnbHVlKCJleGNlbC9tZXRhYm9saXNtX3N0YXJ2YXRpb25fdGFibGVzLXZ7dmVyfS54bHN4IikpCm1zX3NpZyA8LSBleHRyYWN0X3NpZ25pZmljYW50X2dlbmVzKAogICAgbXNfdGFibGVzLAogICAgZXhjZWw9Z2x1ZTo6Z2x1ZSgiZXhjZWwvbWV0YWJvbGlzbV9zdGFydmF0aW9uX3NpZy12e3Zlcn0ueGxzeCIpKQpgYGAKCiMgTWV0YWJvbGlzbSBTdGFydmF0aW9uIEdPCgpgYGB7ciBtc19nb30KbXNfdXAgPC0gbXNfdGFibGVzW1sic2lnbmlmaWNhbnQiXV1bWyJkZXNlcSJdXVtbInVwcyJdXVtbMV1dCm1zX2Rvd24gPC0gbXNfdGFibGVzW1sic2lnbmlmaWNhbnQiXV1bWyJkZXNlcSJdXVtbImRvd25zIl1dW1sxXV0KCiMjIFRoZSBnbyBkYXRhIGZyb20gbWljcm9iZXNvbmxpbmUgaXMga2V5ZWQgYnkgdGhlIGdlbmUgbmFtZQojIyAoZS5nLiBkbmFBKSwgbm90IGdlbmUgSUQgb3IgUEEgaWQgb3Igd2hhdGV2ZXIuCnBhMTRfbGVuZ3RocyA8LSBwYTE0X2Fubm90WywgYygibmFtZS54IiwgIndpZHRoIildCmNvbG5hbWVzKHBhMTRfbGVuZ3RocykgPC0gYygiSUQiLCAid2lkdGgiKQoKcm93bmFtZXMobXNfdXApIDwtIG1ha2UubmFtZXMobXNfdXBbWyJuYW1leCJdXSwgdW5pcXVlPVRSVUUpCm1zX3VwX2dvc2VxIDwtIHNpbXBsZV9nb3NlcShtc191cCwgZ29fZGI9cGExNF9nbywgbGVuZ3RoX2RiPXBhMTRfbGVuZ3RocykKbXNfdXBfZ29zZXFbWyJwdmFsdWVfcGxvdHMiXV1bWyJicHBfcGxvdF9vdmVyIl1dCm1zX3VwX2dvc2VxW1sicHZhbHVlX3Bsb3RzIl1dW1sibWZwX3Bsb3Rfb3ZlciJdXQoKcm93bmFtZXMobXNfZG93bikgPC0gbWFrZS5uYW1lcyhtc19kb3duW1sibmFtZXgiXV0sIHVuaXF1ZT1UUlVFKQptc19kb3duX2dvc2VxIDwtIHNpbXBsZV9nb3NlcShtc19kb3duLCBnb19kYj1wYTE0X2dvLCBsZW5ndGhfZGI9cGExNF9sZW5ndGhzKQptc19kb3duX2dvc2VxW1sicHZhbHVlX3Bsb3RzIl1dW1siYnBwX3Bsb3Rfb3ZlciJdXQptc19kb3duX2dvc2VxW1sicHZhbHVlX3Bsb3RzIl1dW1sibWZwX3Bsb3Rfb3ZlciJdXQpgYGAKCiMjIENvbXBhcmUgc3RyYWlucwoKVGhpcyB0aW1lIGxldCB1cyBjb21wYXJlIHRoZSBzdHJhaW5zIGFuZCBsb3dlciB0aGUgdmFyaWFuY2UgZnJvbQptZWRpYS4KCmBgYHtyIHN0YXJ2YXRpb25fYnlfc3RyYWlufQptc3Nfbm9ybSA8LSBub3JtYWxpemVfZXhwdChtZXRhYm9saXNtX3N0YXJ2YXRpb25fc3RyYWluLCBmaWx0ZXI9VFJVRSwgY29udmVydD0iY3BtIiwgbm9ybT0icXVhbnQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm09ImxvZzIiKQpwbG90X3BjYShtc3Nfbm9ybSkkcGxvdAoKbXNzX3VyaW5lIDwtIHN1YnNldF9leHB0KG1ldGFib2xpc21fc3RhcnZhdGlvbl9zdHJhaW4sIHN1YnNldD0iYmF0Y2g9PSdVcmluZSciKQptc3NfdXJpbmVfbm9ybSA8LSBub3JtYWxpemVfZXhwdChtc3NfdXJpbmUsIGZpbHRlcj1UUlVFLCBjb252ZXJ0PSJjcG0iLCBub3JtPSJxdWFudCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhdGNoPSJzdmFzZXEiLCB0cmFuc2Zvcm09ImxvZzIiKQpwbG90X3BjYShtc3NfdXJpbmVfbm9ybSkkcGxvdAoKbXNzX3Bic3QgPC0gc3Vic2V0X2V4cHQobWV0YWJvbGlzbV9zdGFydmF0aW9uX3N0cmFpbiwgc3Vic2V0PSJiYXRjaD09J1BCU1QnIikKbXNzX3Bic3Rfbm9ybSA8LSBub3JtYWxpemVfZXhwdChtc3NfcGJzdCwgZmlsdGVyPVRSVUUsIGNvbnZlcnQ9ImNwbSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmF0Y2g9InN2YXNlcSIsIHRyYW5zZm9ybT0ibG9nMiIpCnBsb3RfcGNhKG1zc19wYnN0X25vcm0pJHBsb3QKCmludGVyZXN0aW5nIDwtIGxpc3QoCiAgICAiZWRhX3ZzX3d0IiA9IGMoIlBBMTRlZGEiLCAiUEExNFdUIiksCiAgICAiZWRkX3ZzX3d0IiA9IGMoIlBBMTRlZGQiLCAiUEExNFdUIiksCiAgICAiZ2NkX3ZzX3d0IiA9IGMoIlBBMTRnY2QiLCAiUEExNFdUIiksCiAgICAicGdsX3ZzX3d0IiA9IGMoIlBBMTRwZ2wiLCAiUEExNFdUIiksCiAgICAiemZ3X3ZzX3d0IiA9IGMoIlBBMTR6d2YiLCAiUEExNFdUIikpCm1zc191cmluZV9kZSA8LSBhbGxfcGFpcndpc2UobXNzX3VyaW5lLCBtb2RlbF9iYXRjaD0ic3Zhc2VxIiwgZmlsdGVyPVRSVUUpCm1zc191cmluZV90YWJsZSA8LSBjb21iaW5lX2RlX3RhYmxlcygKICAgIG1zc191cmluZV9kZSwga2VlcGVycz1pbnRlcmVzdGluZywKICAgIGV4Y2VsPWdsdWU6OmdsdWUoImV4Y2VsL21ldGFib2xpc21fc3RhcnZhdGlvbl9zdHJhaW5fdGFibGVzLXZ7dmVyfS54bHN4IikpCm1zc191cmluZV9zaWcgPC0gZXh0cmFjdF9zaWduaWZpY2FudF9nZW5lcygKICAgIG1zc191cmluZV90YWJsZSwKICAgIGV4Y2VsPWdsdWU6OmdsdWUoImV4Y2VsL21ldGFib2xpc21fc3RhcnZhdGlvbl9zdHJhaW5fc2lnLXZ7dmVyfS54bHN4IikpCmBgYAoKR2l2ZW4gdGhhdCB0aGUgc3RyYWlucyBhcmUgc28gc2ltaWxhciwgd2UgY2FuIGNvbWZvcnRhYmx5IGNvbXBhcmUgdGhlbSBhY3Jvc3MgbWVkaWEgKFBCU1QvdXJpbmUpLgoKYGBge3IgY29tcGFyZV9wYnN0X3VyaW5lfQptc20gPC0gc2V0X2V4cHRfY29uZGl0aW9ucyhtZXRhYm9saXNtX3N0YXJ2YXRpb25fc3RyYWluLCBmYWN0PSJiYXRjaCIpICU+JQogIHNldF9leHB0X2JhdGNoZXMoZmFjdD0iYmlvcmVwbGljYXRlIikKbXNtX25vcm0gPC0gbm9ybWFsaXplX2V4cHQobXNtLCBmaWx0ZXI9VFJVRSwgY29udmVydD0iY3BtIiwgbm9ybT0icXVhbnQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm09ImxvZzIiKQpwbG90X3BjYShtc21fbm9ybSkkcGxvdApgYGAKCiMgRXh1ZGF0ZQoKQ29tcGFyZSB0aGUgc3RyYWlucyBkdXJpbmcgdGhlIGluc3RpbGxhdGlvbiBwcm9jZXNzCgpgYGB7ciBleHVkYXRlX2V4cGVyaW1lbnR9CmV4dWRhdGVfbm9ybSA8LSBub3JtYWxpemVfZXhwdChtZXRhYm9saXNtX2V4dWRhdGUsIGZpbHRlcj1UUlVFLCBjb252ZXJ0PSJjcG0iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9ybT0icXVhbnQiLCB0cmFuc2Zvcm09ImxvZzIiKQpwcChmaWxlPSJpbWFnZXMvY29tcGFyZV9zdHJhaW5zX2V4dWRhdGUucGRmIiwgaW1hZ2U9cGxvdF9wY2EoZXh1ZGF0ZV9ub3JtKSRwbG90KQoKZXh1ZGF0ZV9uYiA8LSBub3JtYWxpemVfZXhwdChtZXRhYm9saXNtX2V4dWRhdGUsIGZpbHRlcj1UUlVFLCBjb252ZXJ0PSJjcG0iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybT0ibG9nMiIsIGJhdGNoPSJzdmFzZXEiKQpwbG90X3BjYShleHVkYXRlX25iKSRwbG90CnBwKGZpbGU9ImltYWdlcy9jb21wYXJlX3N0cmFpbnNfZXh1ZGF0ZV9zdmEucGRmIiwgaW1hZ2U9cGxvdF9wY2EoZXh1ZGF0ZV9uYikkcGxvdCkKYGBgCgojIyBFeHVkYXRlIERFCgpgYGB7ciBleHVkYXRlX2RlfQpleHVkYXRlX2RlIDwtIGFsbF9wYWlyd2lzZShtZXRhYm9saXNtX2V4dWRhdGUsIG1vZGVsX2JhdGNoPVRSVUUsIGZpbHRlcj1UUlVFKQoKZXh1ZGF0ZV90YWJsZXMgPC0gY29tYmluZV9kZV90YWJsZXMoCiAgICBleHVkYXRlX2RlLCBrZWVwZXJzPWludGVyZXN0aW5nLAogICAgZXhjZWw9Z2x1ZTo6Z2x1ZSgiZXhjZWwvZXh1ZGF0ZV90YWJsZXMtdnt2ZXJ9Lnhsc3giKSkKZXh1ZGF0ZV9zaWcgPC0gZXh0cmFjdF9zaWduaWZpY2FudF9nZW5lcygKICAgIGV4dWRhdGVfdGFibGVzLAogICAgZXhjZWw9Z2x1ZTo6Z2x1ZSgiZXhjZWwvZXh1ZGF0ZV9zaWctdnt2ZXJ9Lnhsc3giKSkKCndhbnRlZF90YWJsZSA8LSBleHVkYXRlX3RhYmxlc1tbImRhdGEiXV1bWyJlZGFfdnNfd3QiXV0KZWRhX3d0X3ZvbGNhbm8gPC0gcGxvdF92b2xjYW5vX2RlKHdhbnRlZF90YWJsZSwgbG9nZmM9MiwgZmNfY29sPSJkZXNlcV9sb2dmYyIsIHBfY29sPSJkZXNlcV9hZGpwIikKcHAoZmlsZT0iaW1hZ2VzL3d0X3ZzX2VkYV9kZV92b2xjYW5vX2luc3RpbGxlZC5wZGYiLAogICBpbWFnZT1lZGFfd3Rfdm9sY2FubyRwbG90KQpgYGAKCiMgSW5zdGlsbGVkIHZzLiBQQlNUL1VyaW5lCgpWaW5jZSBhbmQgTmFqaWIgYXJlIGludGVyZXN0ZWQgaW4gYSBzbGlnaHRseSBkaWZmZXJlbnQgcXVlc3Rpb246CgpgYGB7ciBpbnN0aWxsZWRfdnNfb3RoZXJzfQppbnN0aWxsZWRfdnMgPC0gc3Vic2V0X2V4cHQoCiAgICBwYTE0X2V4cHQsCiAgICBzdWJzZXQ9J21lZGlhPT0iUEJTVCJ8bWVkaWE9PSJVcmluZSJ8bWVkaWE9PSJJbnN0aWxsZWQiJykgJT4lCiAgc2V0X2V4cHRfY29uZGl0aW9ucyhmYWN0PSJtZWRpYSIpICU+JQogIHNldF9leHB0X2JhdGNoZXMoZmFjdD0iYmlvcmVwbGljYXRlIikKCmluc3RpbGxlZF92c19ub3JtIDwtIG5vcm1hbGl6ZV9leHB0KGluc3RpbGxlZF92cywgdHJhbnNmb3JtPSJsb2cyIiwgY29udmVydD0iY3BtIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9ybT0icXVhbnQiLCBmaWx0ZXI9VFJVRSkKaW5zdF9wY2EgPC0gcGxvdF9wY2EoaW5zdGlsbGVkX3ZzX25vcm0pJHBsb3QKcHAoZmlsZT0iaW1hZ2VzL2luc3RpbGxlZF92c19wY2EucGRmIiwgaW1hZ2U9aW5zdF9wY2EpCgppbnN0X3ZzX2RlIDwtIGFsbF9wYWlyd2lzZShpbnN0aWxsZWRfdnMsIGZpbHRlcj1UUlVFKQppbnN0X3ZzX3RhYmxlcyA8LSBjb21iaW5lX2RlX3RhYmxlcygKICAgIGluc3RfdnNfZGUsCiAgICBleGNlbD1nbHVlOjpnbHVlKCJleGNlbC9pbnN0aWxsZWRfdnNfdGFibGVzLXZ7dmVyfS54bHN4IikpCmluc3RfdnNfc2lnIDwtIGV4dHJhY3QKcHAoZmlsZT0iaW1hZ2VzL3Bic3RfdnNfaW5zdGlsbGVkX2RlX3ZvbGNhbm8ucGRmIiwKICAgaW1hZ2U9aW5zdF92c190YWJsZXNbWyJwbG90cyJdXVtbIlBCU1RfdnNfSW5zdGlsbGVkIl1dW1siZGVzZXFfdm9sX3Bsb3RzIl1dW1sicGxvdCJdXSkKYGBgCgojIENoZWNrIG1vdXNlIGNvdW50cwoKYGBge3IgbW91c2VfY291bnRzfQptbV9leHB0IDwtIGNyZWF0ZV9leHB0KCJzYW1wbGVfc2hlZXRzL2FsbF9zYW1wbGVzX21vZGlmaWVkMi54bHN4IiwKICAgICAgICAgICAgICAgICAgICAgICBnZW5lX2luZm89cGExNF9hbm5vdCwgZmlsZV9jb2x1bW49Im1vdXNldGFibGUiKQpwbG90X2xpYnNpemUobW1fZXhwdCkkcGxvdApgYGAKCiMgRnVuIHdpdGggY2lyY29zCgpgYGB7ciBzbV9jaXJjb3N9CmNvbnRyb2xfdGFibGUgPC0gbWNfdGFibGVzW1siZGF0YSJdXVtbIkxCMDVNdXJlYV92c19MQiJdXQp1cmluZV9lZGEgPC0gbXNzX3VyaW5lX3RhYmxlW1siZGF0YSJdXVtbImVkYV92c193dCJdXQp1cmluZV9lZGQgPC0gbXNzX3VyaW5lX3RhYmxlW1siZGF0YSJdXVtbImVkZF92c193dCJdXQp1cmluZV9nY2QgPC0gbXNzX3VyaW5lX3RhYmxlW1siZGF0YSJdXVtbImdjZF92c193dCJdXQp1cmluZV9wZ2wgPC0gbXNzX3VyaW5lX3RhYmxlW1siZGF0YSJdXVtbInBnbF92c193dCJdXQp1cmluZV96ZncgPC0gbXNzX3VyaW5lX3RhYmxlW1siZGF0YSJdXVtbInpmd192c193dCJdXQoKZXh1ZGF0ZV9lZGEgPC0gZXh1ZGF0ZV90YWJsZXNbWyJkYXRhIl1dW1siZWRhX3ZzX3d0Il1dCmV4dWRhdGVfZWRkIDwtIGV4dWRhdGVfdGFibGVzW1siZGF0YSJdXVtbImVkZF92c193dCJdXQpleHVkYXRlX2djZCA8LSBleHVkYXRlX3RhYmxlc1tbImRhdGEiXV1bWyJnY2RfdnNfd3QiXV0KZXh1ZGF0ZV9wZ2wgPC0gZXh1ZGF0ZV90YWJsZXNbWyJkYXRhIl1dW1sicGdsX3ZzX3d0Il1dCmV4dWRhdGVfemZ3IDwtIGV4dWRhdGVfdGFibGVzW1siZGF0YSJdXVtbInpmd192c193dCJdXQoKcGExNF9hbm5vdFtbImNocm9tb3NvbWUiXV0gPC0gIlBzZXVkb21vbmFzX2FlcnVnaW5vc2FfVUNCUFBfUEExNCIKCnNtX2NmZyA8LSBjaXJjb3NfcHJlZml4KHBhMTRfYW5ub3QsIG5hbWU9InNtIiwgY29nX2NvbHVtbiA9ICJDT0dGdW4iLAogICAgICAgICAgICAgICAgICAgICAgICBzdGFydF9jb2x1bW49InN0YXJ0LngiLCBlbmRfY29sdW1uPSJlbmQiLCBzdHJhbmRfY29sdW1uPSJzdHJhbmQueCIsCiAgICAgICAgICAgICAgICAgICAgICAgIGNocl9jb2x1bW49ImNocm9tb3NvbWUiLCBpZF9jb2x1bW49ImdlbmVfaWQiKQpzbV9rYXJ5IDwtIGNpcmNvc19rYXJ5b3R5cGUoc21fY2ZnLCBmYXN0YT0icmVmZXJlbmNlL3BhZXJ1Z2lub3NhaF9wYTE0LmZhc3RhIikKc21fcGx1c19taW51cyA8LSBjaXJjb3NfcGx1c19taW51cyhzbV9jZmcsIHdpZHRoPTAuMDYsIHRoaWNrbmVzcz00MCkKIyMgUHV0IHRoZSBwbG90cyBoZXJlCnNtX2ZpcnN0X2hlYXQgPC0gY2lyY29zX2hlYXRtYXAoc21fY2ZnLCBjb250cm9sX3RhYmxlLCBjb2xuYW1lPSJkZXNlcV9sb2dmYyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZW5hbWU9ImNvbnRyb2wiLCBvdXRlcj1zbV9wbHVzX21pbnVzLCB3aWR0aD0wLjA1KQojI3NtX2VkYV9oaXN0IDwtIGNpcmNvc19oaXN0KHNtX2NmZywgdXJpbmVfZWRhLCBjb2xuYW1lPSJkZXNlcV9sb2dmYyIsCiMjICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZW5hbWU9InVyZWRhIiwgb3V0ZXI9c21fZmlyc3RfaGlzdCwgc3BhY2luZz0tMC4wNSkKIyNzbV9lZGRfaGlzdCA8LSBjaXJjb3NfaGlzdChzbV9jZmcsIHVyaW5lX2VkZCwgY29sbmFtZT0iZGVzZXFfbG9nZmMiLAojIyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2VuYW1lPSJ1cmVkZCIsIG91dGVyPXNtX2VkYV9oaXN0LCBzcGFjaW5nPS0wLjA1KQojI3NtX2djZF9oaXN0IDwtIGNpcmNvc19oaXN0KHNtX2NmZywgdXJpbmVfZ2NkLCBjb2xuYW1lPSJkZXNlcV9sb2dmYyIsCiMjICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZW5hbWU9InVyZ2NkIiwgb3V0ZXI9c21fZWRkX2hpc3QsIHNwYWNpbmc9LTAuMDUpCiMjc21fcGdsX2hpc3QgPC0gY2lyY29zX2hpc3Qoc21fY2ZnLCB1cmluZV9wZ2wsIGNvbG5hbWU9ImRlc2VxX2xvZ2ZjIiwKIyMgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlbmFtZT0idXJwZ2wiLCBvdXRlcj1zbV9nY2RfaGlzdCwgc3BhY2luZz0tMC4wNSkKIyNzbV96ZndfaGlzdCA8LSBjaXJjb3NfaGlzdChzbV9jZmcsIHVyaW5lX3pmdywgY29sbmFtZT0iZGVzZXFfbG9nZmMiLAojIyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2VuYW1lPSJ1cnpmdyIsIG91dGVyPXNtX3BnbF9oaXN0LCBzcGFjaW5nPS0wLjA1KQojI2V4X2VkYV9oaXN0IDwtIGNpcmNvc19oaXN0KHNtX2NmZywgZXh1ZGF0ZV9lZGEsIGNvbG5hbWU9ImRlc2VxX2xvZ2ZjIiwKIyMgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlbmFtZT0iZXhlZGEiLCBvdXRlcj1zbV96ZndfaGlzdCwgc3BhY2luZz0tMC4wNSkKIyNleF9lZGRfaGlzdCA8LSBjaXJjb3NfaGlzdChzbV9jZmcsIGV4dWRhdGVfZWRkLCBjb2xuYW1lPSJkZXNlcV9sb2dmYyIsCiMjICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZW5hbWU9ImV4ZWRkIiwgb3V0ZXI9ZXhfZWRhX2hpc3QsIHNwYWNpbmc9LTAuMDUpCiMjZXhfZ2NkX2hpc3QgPC0gY2lyY29zX2hpc3Qoc21fY2ZnLCBleHVkYXRlX2djZCwgY29sbmFtZT0iZGVzZXFfbG9nZmMiLAojIyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2VuYW1lPSJleGdjZCIsIG91dGVyPWV4X2VkZF9oaXN0LCBzcGFjaW5nPS0wLjA1KQojI2V4X3BnbF9oaXN0IDwtIGNpcmNvc19oaXN0KHNtX2NmZywgZXh1ZGF0ZV9wZ2wsIGNvbG5hbWU9ImRlc2VxX2xvZ2ZjIiwKIyMgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlbmFtZT0iZXhwZ2wiLCBvdXRlcj1leF9nY2RfaGlzdCwgc3BhY2luZz0tMC4wNSkKIyNleF96ZndfaGlzdCA8LSBjaXJjb3NfaGlzdChzbV9jZmcsIGV4dWRhdGVfemZ3LCBjb2xuYW1lPSJkZXNlcV9sb2dmYyIsCiMjICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZW5hbWU9ImV4emZ3Iiwgb3V0ZXI9ZXhfcGdsX2hpc3QsIHNwYWNpbmc9LTAuMDUpCnNtX2ZpbmlzaCA8LSBjaXJjb3Nfc3VmZml4KHNtX2NmZykKc21fbWFkZSA8LSBjaXJjb3NfbWFrZShzbV9jZmcsIHRhcmdldD0ic20iKQpgYGAKCmBgYHtyIHNhdmVtZSwgZXZhbD1GQUxTRX0KcGFuZGVyOjpwYW5kZXIoc2Vzc2lvbkluZm8oKSkKbWVzc2FnZShwYXN0ZTAoIlRoaXMgaXMgaHBnbHRvb2xzIGNvbW1pdDogIiwgZ2V0X2dpdF9jb21taXQoKSkpCnRoaXNfc2F2ZSA8LSBwYXN0ZTAoZ3N1YihwYXR0ZXJuPSJcXC5SbWQiLCByZXBsYWNlPSIiLCB4PXJtZF9maWxlKSwgIi12IiwgdmVyLCAiLnJkYS54eiIpCm1lc3NhZ2UocGFzdGUwKCJTYXZpbmcgdG8gIiwgdGhpc19zYXZlKSkKdG1wIDwtIHNtKHNhdmVtZShmaWxlbmFtZT10aGlzX3NhdmUpKQpgYGAK