1 A version of Kajal’s R markdown document with some more minor changes

1.1 Libraries

In this version of Kajal’s document, I will repeat each step with some changes to see if I can make things a little easier for future modification.

I will therefore leave Kajal’s work unchanged and follow each block with an alternative.

1.4 Create counts table

## Note: importing `abundance.h5` is typically faster than `abundance.tsv`
## reading in files with read_tsv
## 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 
## transcripts missing from tx2gene: 14613
## summarizing abundance
## summarizing counts
## summarizing length
## [1] 34431

This is a potentially important difference in how I and Kajal treated the data. This is because I created the expressionset without using ‘lengthScaledTPM’, but let tximport use the raw counts so that the various normalizations are not affected. E.g. using these scaled numbers results in less variance in the data and may lead to some confusion for the downstream tools (edger/limma/deseq/etc). On the other hand, it may lead to cleaner plots, I am not sure.

1.5 Create DESeqDataSet

Not sure what this is actually doing

## Warning in DESeqDataSet(se, design = design, ignoreRank): some variables in
## design formula are characters, converting to factors
## using just counts from tximport
## [1] 34431

1.6 My version of the above

## The biomart annotations file already exists, loading from it.
## Reading the sample metadata.
## The sample definitions comprises: 39 rows(samples) and 8 columns(metadata fields).
## Reading count tables.
## Using the transcript to gene mapping.
## Reading kallisto data with tximport.
## Finished reading count data.
## Matched 34431 annotations and counts.
## Bringing together the count matrix and gene information.
## The mapped IDs are not the rownames of your gene information, changing them now.
## Some annotations were lost in merging, setting them to 'undefined'.
## Saving the expressionset to 'expt.rda'.
## The final expressionset has 34431 rows and 39 columns.
## Using a subset expression.
## There were 39, now there are 30 samples.

1.8 My Barplot of counts

##    condition      min      1st   median     mean      3rd      max
## 1:        NS 14327794 16797487 17086171 18433743 17427077 25536756
## 2:       LPS 14788518 17005543 18507594 19201561 20567000 26005826
## 3:        LA 16014957 18662352 19800400 21804785 23207183 35215275
## 4:        LP 15864738 17917203 19813259 20710341 22113833 28681140

1.12 Median Pairwise Correlation

## Performing correlation.

## Performing correlation.

1.13 PCA

##   propVar cumPropVar cond.R2 batch.R2
## 1   28.82      28.82   69.66    25.21
## 2   13.93      42.75   41.92    44.39
## 3   10.96      53.71   73.10    18.68
## 4    7.39      61.10    9.06    75.08
## 5    5.80      66.90    5.43    78.47
##   propVar cumPropVar cond.R2 batch.R2
## 1   28.82      28.82   69.66    30.95
## 2   13.93      42.75   41.92    46.07
## 3   10.96      53.71   73.10    20.98
## 4    7.39      61.10    9.06    80.68
## 5    5.80      66.90    5.43    91.16
##   propVar cumPropVar cond.R2 batch.R2
## 1   19.48      19.48   63.12    32.88
## 2   11.01      30.49   26.93    54.19
## 3    6.91      37.40    1.42    70.89
## 4    5.79      43.19    2.32    70.10
## 5    5.08      48.27    4.32    81.90
##   propVar cumPropVar cond.R2 batch.R2
## 1   19.48      19.48   63.12    35.52
## 2   11.01      30.49   26.93    53.86
## 3    6.91      37.40    1.42    88.21
## 4    5.79      43.19    2.32    94.87
## 5    5.08      48.27    4.32    82.44

1.14 Euclidian Distance Heat Map

1.15 Plot PC1 v PC2

## This function will replace the expt$expressionset slot with:
## log2(quant(cbcb(data)))
## It will save copies of each step along the way
##  in expt$normalized with the corresponding libsizes. Keep libsizes in mind
##  when invoking limma.  The appropriate libsize is non-log(cpm(normalized)).
##  This is most likely kept at:
##  'new_expt$normalized$intermediate_counts$normalization$libsizes'
##  A copy of this may also be found at:
##  new_expt$best_libsize
## Leaving the data unconverted.  It is often advisable to cpm/rpkm
##  the data to normalize for sampling differences, keep in mind though that rpkm
##  has some annoying biases, and voom() by default does a cpm (though hpgl_voom()
##  will try to detect this).
## Not correcting the count-data for batch effects.  If batch is
##  included in EdgerR/limma's model, then this is probably wise; but in extreme
##  batch effects this is a good parameter to play with.
## Step 1: performing count filter with option: cbcb
## Removing 21885 low-count genes (12546 remaining).
## Step 2: normalizing the data with quant.
## Step 3: not converting the data.
## Step 4: transforming the data with log2.
## transform_counts: Found 841 values equal to 0, adding 1 to the matrix.
## Step 5: not doing batch correction.
## Not putting labels on the plot.

## This function will replace the expt$expressionset slot with:
## log2(quant(cbcb(data)))
## It will save copies of each step along the way
##  in expt$normalized with the corresponding libsizes. Keep libsizes in mind
##  when invoking limma.  The appropriate libsize is non-log(cpm(normalized)).
##  This is most likely kept at:
##  'new_expt$normalized$intermediate_counts$normalization$libsizes'
##  A copy of this may also be found at:
##  new_expt$best_libsize
## Leaving the data unconverted.  It is often advisable to cpm/rpkm
##  the data to normalize for sampling differences, keep in mind though that rpkm
##  has some annoying biases, and voom() by default does a cpm (though hpgl_voom()
##  will try to detect this).
## Not correcting the count-data for batch effects.  If batch is
##  included in EdgerR/limma's model, then this is probably wise; but in extreme
##  batch effects this is a good parameter to play with.
## Step 1: performing count filter with option: cbcb
## Removing 22066 low-count genes (12365 remaining).
## Step 2: normalizing the data with quant.
## Step 3: not converting the data.
## Step 4: transforming the data with log2.
## transform_counts: Found 644 values equal to 0, adding 1 to the matrix.
## Step 5: not doing batch correction.
## Not putting labels on the plot.

1.16 Correct for Patient in Limma model

##   propVar cumPropVar cond.R2 batch.R2
## 1   36.04      36.04   95.47     5.38
## 2   17.81      53.85   91.87     6.83
## 3    8.05      61.90   29.00    25.52
## 4    5.39      67.29   78.12    21.01
## 5    3.06      70.35    9.63     8.75
##   propVar cumPropVar cond.R2 batch.R2
## 1   36.04      36.04   95.47        0
## 2   17.81      53.85   91.87        0
## 3    8.05      61.90   29.00        0
## 4    5.39      67.29   78.12        0
## 5    3.06      70.35    9.63        0
## [1] 34431    30
##   propVar cumPropVar cond.R2 batch.R2
## 1   23.26      23.26   95.02    13.72
## 2    8.03      31.29   18.28    26.78
## 3    6.01      37.30   81.15    22.10
## 4    4.60      41.90   13.36     4.61
## 5    4.35      46.25    6.15    28.65
##   propVar cumPropVar cond.R2 batch.R2
## 1   23.26      23.26   95.02        0
## 2    8.03      31.29   18.28        0
## 3    6.01      37.30   81.15        0
## 4    4.60      41.90   13.36        0
## 5    4.35      46.25    6.15        0

1.17 Plot PC1 and PC2 with patient correction

1.21 M_LPS v M_NS

eBayes finds an F-statistic from the set of t-statistics for that gene

Limit list to genes with an adjusted p value < 0.05

## [1] 4840

Filter out rows with less than 2-fold change (log2 fold change of > 1)

## [1] 1350

Filter out rows with less than 4-fold change (log2 fold change of > 2)

## [1] 431

Make an MA plot

Annotate sigGenes list using Biomart

## Cache found

1.22 M_LPS v M_LA

## [1] 955
## [1] 256
## [1] 57

## pdf 
##   3
## png 
##   2
## png 
##   3
## png 
##   2
## Cache found

1.23 M_LPS v M_LP

## [1] 1993
## [1] 489
## [1] 91

## pdf 
##   3
## png 
##   2
## png 
##   3
## png 
##   2
## Cache found

1.24 M_LP v M_NS

## [1] 4603
## [1] 1422
## [1] 448

## pdf 
##   3
## png 
##   2
## png 
##   3
## png 
##   2
## Cache found

1.25 M_LA v M_NS

## [1] 4922
## [1] 1493
## [1] 478

## pdf 
##   3
## png 
##   2
## png 
##   3
## png 
##   2
## Cache found

1.26 GM_LPS v. GM_NS

## [1] 653
## [1] 260
## [1] 99

## pdf 
##   3
## png 
##   2
## png 
##   3
## png 
##   2
## Cache found

1.27 GM_LPS v GM_LP

This contrast was written in the opposite order as the others, I think this is the reason some of my plots keep looking backwards/upsidedown… I am going to comment out the original line and rewrite it so that it is identical in order to what I found in: M_LP.M_LP.contr.mat.

## [1] 350
## [1] 126
## [1] 28

## pdf 
##   3
## png 
##   2
## png 
##   3
## png 
##   2
## Cache found

1.28 GM_LPS v GM_LA

I think I observe the same flipping here.

## [1] 12
## [1] 7
## [1] 1

## pdf 
##   3
## png 
##   2
## png 
##   3
## png 
##   2
## Cache found

1.29 Barplots of Fold-Changes, e.g. Figure 3C/D

It appears to me that these figures are created by merging the M/GM tables for the LP-LPS and LA-LPS contrasts, taking the top ~20 for the M table, and plotting the log2FC on the linear scale. I believe I can trivially modify this to add the logFC / t-stat. The caveat will be that doing this gives me a log2 error bar, not linear… My inclination therefore is to just plot the logFC rather than convert it to linear, but whatever.

1.29.1 Figure 3C top-left

Kajal’s variables to create this are…

  1. M_LPS.M_LP.topTab
  2. GM_LPS.GM_LP.topTab

These were passed to biomart to get the gene names rather than ensembl IDs. I am going to be lazy and just copy/paste Kajal’s code for these tasks.

Having done the top-left piece of this, it seems to me that if you are going to take the top 20 genes and exclude based on the M-CSF adjusted p-value, perhaps you should also exclude based on the GM-CSF adjusted p-value, but the way this was done, only the M is used. In its current state, I am only using the M as per the figures in their current state.

Note, that if you want error bars from the standard error, then it is waaaay easier to stay on the log2 scale rather than convert back to linear because the math for converting the standard error back to linear is weird. If the table had a few more parameters in it, I could do it without struggling, but it doesn’t.

## Cache found
colnames(desc)=c("ID", "Symbol", "Description", "Type")
fig3c_lp_df <- merge(fig3c_lp_df, desc, by="ID", all.x=TRUE)

tl_order_idx <- order(fig3c_lp_df[["logFC.x"]], decreasing=TRUE)
fig3c_tl_df <- fig3c_lp_df[tl_order_idx, ]
sig_idx <- fig3c_tl_df[["adj.P.Val.x"]] <= 0.05
fig3c_tl_df <- head(fig3c_tl_df[sig_idx, ], n=25)
fig3c_tl_df <- fig3c_tl_df[, wanted_columns]
colnames(fig3c_tl_df) <- renamed_columns
rownames(fig3c_tl_df) <- fig3c_tl_df[["ID"]]
fig3c_tl_df[["ID"]] <- NULL
fig3c_tl_df[["m_lfcerr"]] <- fig3c_tl_df[["m_logfc"]] / fig3c_tl_df[["m_t"]]
fig3c_tl_df[["gm_lfcerr"]] <- fig3c_tl_df[["gm_logfc"]] / fig3c_tl_df[["gm_t"]]

fig3c_tl_m <- fig3c_tl_df[, c("m_logfc", "symbol", "m_lfcerr")]
fig3c_tl_m[["type"]] <- "m"
colnames(fig3c_tl_m) <- c("logfc", "symbol", "lfcerr", "type")
fig3c_tl_gm <- fig3c_tl_df[, c("gm_logfc", "symbol", "gm_lfcerr")]
fig3c_tl_gm[["type"]] <- "gm"
colnames(fig3c_tl_gm) <- c("logfc", "symbol", "lfcerr", "type")
melted_fig3c_tl <- rbind(fig3c_tl_m, fig3c_tl_gm)
melted_fig3c_tl[["symbol"]] <- factor(melted_fig3c_tl[["symbol"]],
                                      levels=fig3c_tl_m[["symbol"]])
melted_fig3c_tl[["type"]] <- factor(melted_fig3c_tl[["type"]],
                                    levels=c("m", "gm"))

p <- ggplot(data=melted_fig3c_tl, aes(x=symbol, y=logfc, fill=type)) +
  geom_bar(stat="identity", color="black", position=position_dodge())+
  scale_fill_manual(values=c("cornflowerblue", "darkgrey")) +
  geom_errorbar(aes(ymin=logfc - (lfcerr / 2), ymax=logfc + (lfcerr / 2)), width=.2,
                position=position_dodge(.9)) +
  theme_minimal() +
  theme(axis.text.x=element_text(angle=45, hjust=1, vjust=0.5))
p

1.29.2 Figure 2A

Kajal responded to my query about this figure, and I am a little embarrassed to say that I should have seen what it is. It seems to me that it is a bit redundant though with 3c, as it is precisely a subset of that data, though slightly reordered.

1.29.3 Figure 2D

I created a table of shared DEG between L+PGE2/LPS and L+Ado/LPS (table attached below) by merging the 2 DE tables based on common gene symbol. In this table, logFC.x corresponds to L+Ado/LPS and logFC.y corresponds to L+PGE2/LPS. I averaged the fold changes between logFC.x and logFC.y in order to determine the rank order of the genes in the figure but plotted the fold changes individually. Instead of plotting log2FC I manually converted those values to just FC. I don’t know how to calculate standard error if I am plotting just FC. It would be nice if this could all be done in R.

1.29.5 Figure 3C top-right

The right side of the plot is LA rather than LP, otherwise this is the same.

## Cache found
colnames(desc)=c("ID", "Symbol", "Description", "Type")
fig3c_la_df <- merge(fig3c_la_df, desc, by="ID", all.x=TRUE)

tr_order_idx <- order(fig3c_la_df[["logFC.x"]], decreasing=TRUE)
fig3c_tr_df <- fig3c_la_df[tr_order_idx, ]
sig_idx <- fig3c_tr_df[["adj.P.Val.x"]] <= 0.05
fig3c_tr_df <- head(fig3c_tr_df[sig_idx, ], n=25)
fig3c_tr_df <- fig3c_tr_df[, wanted_columns]
colnames(fig3c_tr_df) <- renamed_columns
rownames(fig3c_tr_df) <- fig3c_tr_df[["ID"]]
fig3c_tr_df[["ID"]] <- NULL
fig3c_tr_df[["m_lfcerr"]] <- fig3c_tr_df[["m_logfc"]] / fig3c_tr_df[["m_t"]]
fig3c_tr_df[["gm_lfcerr"]] <- fig3c_tr_df[["gm_logfc"]] / fig3c_tr_df[["gm_t"]]

fig3c_tr_m <- fig3c_tr_df[, c("m_logfc", "symbol", "m_lfcerr")]
fig3c_tr_m[["type"]] <- "m"
colnames(fig3c_tr_m) <- c("logfc", "symbol", "lfcerr", "type")
fig3c_tr_gm <- fig3c_tr_df[, c("gm_logfc", "symbol", "gm_lfcerr")]
fig3c_tr_gm[["type"]] <- "gm"
colnames(fig3c_tr_gm) <- c("logfc", "symbol", "lfcerr", "type")
melted_fig3c_tr <- rbind(fig3c_tr_m, fig3c_tr_gm)
melted_fig3c_tr[["symbol"]] <- factor(melted_fig3c_tr[["symbol"]],
                                      levels=fig3c_tr_m[["symbol"]])
melted_fig3c_tr[["type"]] <- factor(melted_fig3c_tr[["type"]],
                                    levels=c("m", "gm"))

p <- ggplot(data=melted_fig3c_tr, aes(x=symbol, y=logfc, fill=type)) +
  geom_bar(stat="identity", color="black", position=position_dodge())+
  scale_fill_manual(values=c("cornflowerblue", "darkgrey")) +
  geom_errorbar(aes(ymin=logfc-lfcerr, ymax=logfc+lfcerr), width=.2,
                position=position_dodge(.9)) +
  theme_minimal() +
  theme(axis.text.x=element_text(angle=45, hjust=1, vjust=0.5))
p

1.31 Volcano Plots

M_LPS v M_LA

##                ID  logFC AveExpr      t   P.Value adj.P.Val     B
## 1 ENSG00000139112  1.346   6.583 11.281 1.346e-12 1.730e-08 18.74
## 2 ENSG00000095794  2.802   6.009 10.697 5.130e-12 3.298e-08 17.42
## 3 ENSG00000132906  2.466   4.467  9.520 8.693e-11 2.235e-07 14.62
## 4 ENSG00000124466  5.662   1.526  9.775 4.642e-11 1.492e-07 14.59
## 5 ENSG00000163235  2.390   4.942  9.241 1.745e-10 3.739e-07 13.98
## 6 ENSG00000068305 -1.155   6.819 -9.117 2.391e-10 4.392e-07 13.67

## png 
##   3
## png 
##   2
## [1] 128
## [1] 128

2 M_LPS v M_LP

##                ID logFC AveExpr     t   P.Value adj.P.Val     B
## 1 ENSG00000121966 4.167   5.148 13.64 9.189e-15 1.182e-10 23.50
## 2 ENSG00000182568 2.467   3.922 13.00 3.316e-14 2.132e-10 22.23
## 3 ENSG00000176595 4.467   1.729 11.43 9.698e-13 4.157e-09 18.60
## 4 ENSG00000198814 2.443   6.435 11.18 1.695e-12 4.986e-09 18.53
## 5 ENSG00000112394 2.502   5.836 10.96 2.791e-12 5.982e-09 18.04
## 6 ENSG00000109321 4.500   1.516 11.12 1.939e-12 4.986e-09 17.86

## png 
##   3
## png 
##   2

2.1 Rich Factor Graphs

2.2 GO terms shared LA LP

3 Volcano plot M_LPS_4 v M_LP_4

3.1 Figure 3B top-left

##                ID logFC AveExpr     t   P.Value adj.P.Val     B
## 1 ENSG00000121966 4.167   5.148 13.64 9.189e-15 1.182e-10 23.50
## 2 ENSG00000182568 2.467   3.922 13.00 3.316e-14 2.132e-10 22.23
## 3 ENSG00000176595 4.467   1.729 11.43 9.698e-13 4.157e-09 18.60
## 4 ENSG00000198814 2.443   6.435 11.18 1.695e-12 4.986e-09 18.53
## 5 ENSG00000112394 2.502   5.836 10.96 2.791e-12 5.982e-09 18.04
## 6 ENSG00000109321 4.500   1.516 11.12 1.939e-12 4.986e-09 17.86

## png 
##   3
## png 
##   2

3.1.1 The number of up significant genes

## [1] 232
## [1] "ENSG00000121966" "ENSG00000182568" "ENSG00000176595" "ENSG00000198814"
## [5] "ENSG00000112394" "ENSG00000109321"

3.1.2 The number of down significant genes

## [1] 257
## [1] "ENSG00000166068" "ENSG00000089041" "ENSG00000140968" "ENSG00000196449"
## [5] "ENSG00000181915" "ENSG00000104549"

4 Volcano plot M_LPS_4 v M_LA_4

4.1 Figure 3B top-right

##                ID  logFC AveExpr      t   P.Value adj.P.Val     B
## 1 ENSG00000139112  1.346   6.583 11.281 1.346e-12 1.730e-08 18.74
## 2 ENSG00000095794  2.802   6.009 10.697 5.130e-12 3.298e-08 17.42
## 3 ENSG00000132906  2.466   4.467  9.520 8.693e-11 2.235e-07 14.62
## 4 ENSG00000124466  5.662   1.526  9.775 4.642e-11 1.492e-07 14.59
## 5 ENSG00000163235  2.390   4.942  9.241 1.745e-10 3.739e-07 13.98
## 6 ENSG00000068305 -1.155   6.819 -9.117 2.391e-10 4.392e-07 13.67

## png 
##   3
## png 
##   2

4.1.1 The number of up significant genes

## [1] 128
## [1] "ENSG00000139112" "ENSG00000095794" "ENSG00000132906" "ENSG00000124466"
## [5] "ENSG00000163235" "ENSG00000164674"

4.1.2 The number of down significant genes

## [1] 128
## [1] "ENSG00000068305" "ENSG00000140968" "ENSG00000125657" "ENSG00000089041"
## [5] "ENSG00000149635" "ENSG00000117525"

5 Volcano plot GM_LPS_4 v GM_LA_4

5.1 Figure 3B bottom-right

##                ID   logFC AveExpr      t   P.Value adj.P.Val     B
## 1 ENSG00000163235  1.6278  4.9419  6.048 1.005e-06  0.006463 5.477
## 2 ENSG00000099625  1.9849  0.7463  6.726 1.459e-07  0.001876 4.817
## 3 ENSG00000108702 -1.4830  2.3455 -5.497 4.914e-06  0.021061 4.032
## 4 ENSG00000095794  1.3592  6.0086  5.201 1.155e-05  0.026752 3.310
## 5 ENSG00000071205 -0.6386  5.8815 -5.174 1.248e-05  0.026752 3.245
## 6 ENSG00000166886 -1.0612  4.2945 -5.092 1.584e-05  0.029088 2.971

## png 
##   3
## png 
##   2

5.1.1 The number of up significant genes

## [1] 5
## [1] "ENSG00000163235" "ENSG00000099625" "ENSG00000095794" "ENSG00000197555"
## [5] "ENSG00000128422"

5.1.2 The number of down significant genes

## [1] 2
## [1] "ENSG00000108702" "ENSG00000166886"

6 Volcano plot GM_LPS_4 v GM_LP_4

6.1 Figure 3B bottom-left

So, it appears I get the inverse of what is in the figure. Did the contrast get reversed?

I went back to the section which defines this, it has the heading ‘GM_LPS_v_GM_LP’ and the contrast appears to me to be correct. At least it is written like this:

GM_LPS.GM_LP.contr.mat <- makeContrasts(GM_LPSvGM_LP=((condGM_LPS-condGM_NS)-(condGM_LP-condGM_NS)), levels=v$design)

My inclination is therefore that this got flipped?

##                ID logFC AveExpr     t   P.Value adj.P.Val      B
## 1 ENSG00000163235 2.244  4.9419 8.405 1.501e-09 1.609e-05 11.866
## 2 ENSG00000095794 2.099  6.0086 8.059 3.753e-09 1.609e-05 10.995
## 3 ENSG00000099625 2.359  0.7463 8.098 3.377e-09 1.609e-05  9.933
## 4 ENSG00000120875 3.357  4.0494 7.671 1.065e-08 3.425e-05  9.931
## 5 ENSG00000188042 2.337  5.0272 6.987 7.011e-08 1.663e-04  8.154
## 6 ENSG00000197872 1.919  5.9633 6.909 8.739e-08 1.663e-04  7.939

## png 
##   3
## png 
##   2

6.1.1 The number of up significant genes

## [1] 104
## [1] "ENSG00000163235" "ENSG00000095794" "ENSG00000099625" "ENSG00000120875"
## [5] "ENSG00000188042" "ENSG00000197872"

6.1.2 The number of down significant genes

## [1] 22
## [1] "ENSG00000089041" "ENSG00000108702" "ENSG00000136997" "ENSG00000105810"
## [5] "ENSG00000181856" "ENSG00000244398"

6.1.3 Figure 2B

I think the code I used for the venn diagrams is in the Rmarkdown file towards the end. However, I have 2 files saved for the venn diagrams that are different from what I have in figure 2B. I think I need to swap the current 2B with the venn diagrams I have attached below because the numbers here match with the volcano plots. Are these the numbers you are getting also?

LS0tCnRpdGxlOiAiSHVtYW4gTWFjcm9waGFnZXM6IE0tQ1NGIHYgR00tQ1NGOiBMUFMsIExQUytBZGVub3NpbmUsIExQUytQR0UyIgphdXRob3I6ICJLYWphbCBIYW1pZHphZGVoIGFuZCBhdGIiCmRhdGU6ICJgciBTeXMuRGF0ZSgpYCIKb3V0cHV0OgogIGh0bWxfZG9jdW1lbnQ6CiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlCiAgICBjb2RlX2ZvbGRpbmc6IHNob3cKICAgIGZpZ19jYXB0aW9uOiB0cnVlCiAgICBmaWdfaGVpZ2h0OiA3CiAgICBmaWdfd2lkdGg6IDcKICAgIGhpZ2hsaWdodDogdGFuZ28KICAgIGtlZXBfbWQ6IGZhbHNlCiAgICBtb2RlOiBzZWxmY29udGFpbmVkCiAgICBudW1iZXJfc2VjdGlvbnM6IHRydWUKICAgIHNlbGZfY29udGFpbmVkOiB0cnVlCiAgICB0aGVtZTogcmVhZGFibGUKICAgIHRvYzogdHJ1ZQogICAgdG9jX2Zsb2F0OgogICAgICBjb2xsYXBzZWQ6IGZhbHNlCiAgICAgIHNtb290aF9zY3JvbGw6IGZhbHNlCiAgICAgIHJtZGZvcm1hdHM6OnJlYWR0aGVkb3duOgogICAgICAgIGNvZGVfZG93bmxvYWQ6IHRydWUKICAgICAgICBjb2RlX2ZvbGRpbmc6IHNob3cKICAgICAgICBkZl9wcmludDogcGFnZWQKICAgICAgICBmaWdfY2FwdGlvbjogdHJ1ZQogICAgICAgIGZpZ19oZWlnaHQ6IDcKICAgICAgICBmaWdfd2lkdGg6IDcKICAgICAgICBoaWdobGlnaHQ6IHRhbmdvCiAgICAgICAgd2lkdGg6IDMwMAogICAgICAgIGtlZXBfbWQ6IGZhbHNlCiAgICAgICAgbW9kZTogc2VsZmNvbnRhaW5lZAogICAgICAgIHRvY19mbG9hdDogdHJ1ZQogICAgICAgIEJpb2NTdHlsZTo6aHRtbF9kb2N1bWVudDoKICAgICAgICAgIGNvZGVfZG93bmxvYWQ6IHRydWUKICAgICAgICAgIGNvZGVfZm9sZGluZzogc2hvdwogICAgICAgICAgZmlnX2NhcHRpb246IHRydWUKICAgICAgICAgIGZpZ19oZWlnaHQ6IDcKICAgICAgICAgIGZpZ193aWR0aDogNwogICAgICAgICAgaGlnaGxpZ2h0OiB0YW5nbwogICAgICAgICAga2VlcF9tZDogZmFsc2UKICAgICAgICAgIG1vZGU6IHNlbGZjb250YWluZWQKICAgICAgICAgIHRvY19mbG9hdDogdHJ1ZQotLS0KCjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CmJvZHksIHRkIHsKZm9udC1zaXplOiAxNnB4Owp9CmNvZGUucnsKZm9udC1zaXplOiAxNnB4Owp9CnByZSB7CmZvbnQtc2l6ZTogMTZweAp9Cjwvc3R5bGU+CgpgYGB7ciBvcHRpb25zLCBpbmNsdWRlPUZBTFNFfQpsaWJyYXJ5KCJocGdsdG9vbHMiKQp0dCA8LSBkZXZ0b29sczo6bG9hZF9hbGwoIi9kYXRhL2hwZ2x0b29scyIpCmtuaXRyOjpvcHRzX2tuaXQkc2V0KHdpZHRoPTEyMCwKICAgICAgICAgICAgICAgICAgICAgcHJvZ3Jlc3M9VFJVRSwKICAgICAgICAgICAgICAgICAgICAgdmVyYm9zZT1UUlVFLAogICAgICAgICAgICAgICAgICAgICBlY2hvPVRSVUUpCmtuaXRyOjpvcHRzX2NodW5rJHNldChlcnJvcj1UUlVFLAogICAgICAgICAgICAgICAgICAgICAgZHBpPTk2KQpvbGRfb3B0aW9ucyA8LSBvcHRpb25zKGRpZ2l0cz00LAogICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ3NBc0ZhY3RvcnM9RkFMU0UsCiAgICAgICAgICAgICAgICAgICAgICAga25pdHIuZHVwbGljYXRlLmxhYmVsPSJhbGxvdyIpCmdncGxvdDI6OnRoZW1lX3NldChnZ3Bsb3QyOjp0aGVtZV9idyhiYXNlX3NpemU9MTApKQpydW5kYXRlIDwtIGZvcm1hdChTeXMuRGF0ZSgpLCBmb3JtYXQ9IiVZJW0lZCIpCnByZXZpb3VzX2ZpbGUgPC0gIiIKdmVyIDwtICIyMDIwMDMzMCIKCiMjdG1wIDwtIHNtKGxvYWRtZShmaWxlbmFtZT1wYXN0ZTAoZ3N1YihwYXR0ZXJuPSJcXC5SbWQiLCByZXBsYWNlPSIiLCB4PXByZXZpb3VzX2ZpbGUpLCAiLXYiLCB2ZXIsICIucmRhLnh6IikpKQojI3JtZF9maWxlIDwtICIwM19leHByZXNzaW9uX2luZmVjdGlvbl8yMDE4MDgyMi5SbWQiCmBgYAoKIyBBIHZlcnNpb24gb2YgS2FqYWwncyBSIG1hcmtkb3duIGRvY3VtZW50IHdpdGggc29tZSBtb3JlIG1pbm9yIGNoYW5nZXMKCiMjIExpYnJhcmllcwoKYGBge3IgbGlicmFyaWVzLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCBpbmNsdWRlPUZBTFNFfQpsaWJyYXJ5KGRldnRvb2xzKQpsaWJyYXJ5KHR4aW1wb3J0KQpsaWJyYXJ5KGJpb21hUnQpCmxpYnJhcnkoaHBnbHRvb2xzKQpsaWJyYXJ5KERFU2VxMikKbGlicmFyeShncGxvdHMpCmxpYnJhcnkoZ2dwbG90MikKbGlicmFyeShjYmNiU0VRKQpsaWJyYXJ5KFJDb2xvckJyZXdlcikKbGlicmFyeShWZW5uZXJhYmxlKQpsaWJyYXJ5KGVkZ2VSKQpsaWJyYXJ5KGNhbGlicmF0ZSkKbGlicmFyeShzY2FsZXMpCmBgYAoKSW4gdGhpcyB2ZXJzaW9uIG9mIEthamFsJ3MgZG9jdW1lbnQsIEkgd2lsbCByZXBlYXQgZWFjaCBzdGVwIHdpdGggc29tZSBjaGFuZ2VzCnRvIHNlZSBpZiBJIGNhbiBtYWtlIHRoaW5ncyBhIGxpdHRsZSBlYXNpZXIgZm9yIGZ1dHVyZSBtb2RpZmljYXRpb24uCgpJIHdpbGwgdGhlcmVmb3JlIGxlYXZlIEthamFsJ3Mgd29yayB1bmNoYW5nZWQgYW5kIGZvbGxvdyBlYWNoIGJsb2NrIHdpdGggYW4gYWx0ZXJuYXRpdmUuCgojIyBTZXQgd29ya2luZyBkaXJlY3RvcnksIGltcG9ydCBtZXRhZGF0YSBhbmQgYWJ1bmRhbmNlIGZpbGVzCgpgYGB7ciByZWFkX2RhdGF9CmRlc2lnbiA8LSByZWFkLnRhYmxlKCJzYW1wbGVfc2hlZXRzL01ldGFEYXRhIG9ubHkgNCBob3VyLnR4dCIsIGhlYWRlcj1UUlVFLCBzZXA9J1x0JykKZGVzaWduW1siUGF0aWVudCJdXSA8LSBhcy5mYWN0b3IoZGVzaWduW1siUGF0aWVudCJdXSkKZGVzaWduW1siU3RpbXVsYXRpb24iXV0gPC0gYXMuZmFjdG9yKGRlc2lnbltbIlN0aW11bGF0aW9uIl1dKQpkZXNpZ25bWyJCYXRjaCJdXSA8LSBhcy5mYWN0b3IoZGVzaWduW1siQmF0Y2giXV0pCmRlc2lnbltbIkdyb3d0aCJdXSA8LSBhcy5mYWN0b3IoZGVzaWduW1siR3Jvd3RoIl1dKQpmaWxlcyA8LSBmaWxlLnBhdGgoImthbGxpc3RvIGFidW5kYW5jZSBmaWxlcy8iLCBkZXNpZ24kSFBHTC5JZGVudGlmaWVyLCAiYWJ1bmRhbmNlLnRzdiIpCm5hbWVzKGZpbGVzKSA8LSBwYXN0ZTAoIkhQR0wwOSIsIGMoMTI6MzEsIDQyOjYwKSkKcm93bmFtZXMoZGVzaWduKSA8LSBkZXNpZ25bWzFdXQoKc3RpbV9kZXNpZ25faWR4IDwtIGRlc2lnbltbIlN0aW11bGF0aW9uIl1dICE9ICJOUyIKc3RpbV9kZXNpZ24gPC0gZGVzaWduW3N0aW1fZGVzaWduX2lkeCwgXQpgYGAKCiMjIENvbnZlcnQgdHJhbnNjcmlwdCBJRCB0byBnZW5lIElECgpgYGB7ciBlbnNlbWJsfQplbnNlbWJsIDwtIHVzZU1hcnQoIkVOU0VNQkxfTUFSVF9FTlNFTUJMIiwgZGF0YXNldD0iaHNhcGllbnNfZ2VuZV9lbnNlbWJsIiwKICAgICAgICAgICAgICAgICAgIGhvc3Q9InVzZWFzdC5lbnNlbWJsLm9yZyIpCnR4MmdlbmUgPC0gZ2V0Qk0oYXR0cmlidXRlcz1jKCJlbnNlbWJsX3RyYW5zY3JpcHRfaWQiLCAiZW5zZW1ibF9nZW5lX2lkIiwgImNocm9tb3NvbWVfbmFtZSIpLAogICAgICAgICAgICAgICAgIG1hcnQ9ZW5zZW1ibCkKZ29vZF9pZHggPC0gZ3JlcGwoeD10eDJnZW5lW1siY2hyb21vc29tZV9uYW1lIl1dLCBwYXR0ZXJuPSJeW1s6YWxudW06XV17MSwyfSQiKQpnb29kX29uZXMgPC0gdHgyZ2VuZVtnb29kX2lkeCwgLTNdCmBgYAoKIyMgQ3JlYXRlIGNvdW50cyB0YWJsZQoKYGBge3J9CnR4aS5rYWxsaXN0by50c3YgPC0gdHhpbXBvcnQoZmlsZXMsIHR5cGU9ImthbGxpc3RvIiwgdHgyZ2VuZT1nb29kX29uZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnRzRnJvbUFidW5kYW5jZT0ibGVuZ3RoU2NhbGVkVFBNIikKbnJvdyh0eGkua2FsbGlzdG8udHN2JGNvdW50cykKCndyaXRlLnRhYmxlKHR4aS5rYWxsaXN0by50c3YkY291bnRzLCAiVFBNX012R01fQ0RTXzIwMTgwNzExLnR4dCIsCiAgICAgICAgICAgIGNvbC5uYW1lcz1UUlVFLCByb3cubmFtZXM9RkFMU0UsIHF1b3RlPUZBTFNFKQp3cml0ZS5jc3YodHhpLmthbGxpc3RvLnRzdiRjb3VudHMsICJjc3YvVFBNX012R01fMjAxODA3MTEuY3N2IiwKICAgICAgICAgIHJvdy5uYW1lcz1UUlVFLCBxdW90ZT1GQUxTRSkKCnN0aW1fY291bnRzIDwtIHR4aS5rYWxsaXN0by50c3YkY291bnRzCnN0aW1fY291bnRzX2lkeCA8LSBjb2xuYW1lcyhzdGltX2NvdW50cykgJWluJSByb3duYW1lcyhzdGltX2Rlc2lnbikKc3RpbV9jb3VudHMgPC0gc3RpbV9jb3VudHNbLCBzdGltX2NvdW50c19pZHhdCmBgYAoKVGhpcyBpcyBhIHBvdGVudGlhbGx5IGltcG9ydGFudCBkaWZmZXJlbmNlIGluIGhvdyBJIGFuZCBLYWphbCB0cmVhdGVkIHRoZSBkYXRhLgpUaGlzIGlzIGJlY2F1c2UgSSBjcmVhdGVkIHRoZSBleHByZXNzaW9uc2V0IHdpdGhvdXQgdXNpbmcgJ2xlbmd0aFNjYWxlZFRQTScsCmJ1dCBsZXQgdHhpbXBvcnQgdXNlIHRoZSByYXcgY291bnRzIHNvIHRoYXQgdGhlIHZhcmlvdXMgbm9ybWFsaXphdGlvbnMgYXJlIG5vdAphZmZlY3RlZC4gIEUuZy4gdXNpbmcgdGhlc2Ugc2NhbGVkIG51bWJlcnMgcmVzdWx0cyBpbiBsZXNzIHZhcmlhbmNlIGluIHRoZSBkYXRhCmFuZCBtYXkgbGVhZCB0byBzb21lIGNvbmZ1c2lvbiBmb3IgdGhlIGRvd25zdHJlYW0gdG9vbHMKKGVkZ2VyL2xpbW1hL2Rlc2VxL2V0YykuICBPbiB0aGUgb3RoZXIgaGFuZCwgaXQgbWF5IGxlYWQgdG8gY2xlYW5lciBwbG90cywgSSBhbQpub3Qgc3VyZS4KCiMjIENyZWF0ZSBERVNlcURhdGFTZXQKCk5vdCBzdXJlIHdoYXQgdGhpcyBpcyBhY3R1YWxseSBkb2luZwoKYGBge3IgZGVzZXFfZGRzfQpkZiA8LSBkYXRhLmZyYW1lKGNvbmRpdGlvbj1wYXN0ZShkZXNpZ24kSFBHTC5JZGVudGlmaWVyLCBkZXNpZ24kR3Jvd3RoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNpZ24kU3RpbXVsYXRpb24sIGRlc2lnbiRQYXRpZW50LCBzZXA9Il8iKSkKcm93bmFtZXMoZGYpPWNvbG5hbWVzKHR4aS5rYWxsaXN0by50c3YkY291bnRzKQpkZHMgPC0gREVTZXFEYXRhU2V0RnJvbVR4aW1wb3J0KHR4aS5rYWxsaXN0by50c3YsIGRmLCB+Y29uZGl0aW9uKQpucm93KGRkcykKCmRkc19zdGltIDwtIGRkc1ssIHJvd25hbWVzKHN0aW1fZGVzaWduKV0KYGBgCgojIyBNeSB2ZXJzaW9uIG9mIHRoZSBhYm92ZQoKYGBge3IgYXRiX3JlYWRfZGF0YX0KbXlfZGVzaWduIDwtIGRlc2lnbgpyb3duYW1lcyhteV9kZXNpZ24pIDwtIGRlc2lnbltbMV1dCm15X2Rlc2lnbltbImNvbmRpdGlvbiJdXSA8LSBteV9kZXNpZ25bWyJTdGltdWxhdGlvbiJdXQpteV9kZXNpZ25bWyJmaWxlIl1dIDwtIGdsdWU6OmdsdWUoInByZXByb2Nlc3Npbmcve3Jvd25hbWVzKG15X2Rlc2lnbil9L2FidW5kYW5jZS50c3YiKQpjb2xuYW1lcyhteV9kZXNpZ24pIDwtIHRvbG93ZXIoY29sbmFtZXMobXlfZGVzaWduKSkKZ2VuZV9pbmZvIDwtIGxvYWRfYmlvbWFydF9hbm5vdGF0aW9ucyhob3N0PSJ1c2Vhc3QuZW5zZW1ibC5vcmciKSRhbm5vdGF0aW9uCnJvd25hbWVzKGdlbmVfaW5mbykgPC0gbWFrZS5uYW1lcyhnZW5lX2luZm9bWyJlbnNlbWJsX2dlbmVfaWQiXV0sIHVuaXF1ZT1UUlVFKQp0eF9nZW5lX21hcCA8LSBnZW5lX2luZm9bLCBjKCJlbnNlbWJsX3RyYW5zY3JpcHRfaWQiLCAiZW5zZW1ibF9nZW5lX2lkIildCmhzX2V4cHQgPC0gY3JlYXRlX2V4cHQobWV0YWRhdGE9bXlfZGVzaWduLCBnZW5lX2luZm89Z2VuZV9pbmZvLCB0eF9nZW5lX21hcD10eF9nZW5lX21hcCkKaHNfZXhwdCA8LSBzZXRfZXhwdF9iYXRjaGVzKGhzX2V4cHQsIGZhY3Q9Imdyb3d0aCIpCgpzdGltX2V4cHQgPC0gc3Vic2V0X2V4cHQoaHNfZXhwdCwgc3Vic2V0PSJzdGltdWxhdGlvbiE9J05TJyIpCmBgYAoKIyMgQmFyIFBsb3Qgb2YgQ291bnRzCgpgYGB7ciBiYXJwbG90fQpwYXIobWFyPWMoMTAsIDQuNSwgMy41LCAxKSkKcGFyKG9tYT1jKDAsIDAsIDAsIDApKQpiYXJwbG90KGNvbFN1bXModHhpLmthbGxpc3RvLnRzdiRjb3VudHMpLCBsYXM9MywgbWFpbj0nUmF3IENvdW50cyBCeSBTYW1wbGUnKQoKYmFycGxvdChjb2xTdW1zKHN0aW1fY291bnRzKSwgbGFzPTMsIG1haW49J1JhdyBDb3VudHMgQnkgU2FtcGxlJykKYGBgCgojIyBNeSBCYXJwbG90IG9mIGNvdW50cwoKYGBge3IgbXlfYmFycGxvdH0KbGlic2l6ZSA8LSBwbG90X2xpYnNpemUoaHNfZXhwdCkKbGlic2l6ZSRwbG90CmxpYnNpemUkc3VtbWFyeQoKcGxvdF9saWJzaXplKHN0aW1fZXhwdCkkcGxvdApgYGAKCiMjIEJveCBQbG90IG9mIENvdW50cwoKYGBge3IgY291bnRfYmFycGxvdH0KZGRzIDwtIGVzdGltYXRlU2l6ZUZhY3RvcnMoZGRzKQpuY3RzIDwtIGNvdW50cyhkZHMsIG5vcm1hbGl6ZWQ9VFJVRSkKeSA8LSBsb2cobmN0cyArIDEpCgpwYXIobWFyPWMoNSwgNSwgMiwgMSkpCnBhcihvbWE9YygwLCAwLCAwLCAwKSkKYm94cGxvdCh5LCBuYW1lcz1jb2xuYW1lcyh0eGkua2FsbGlzdG8udHN2JGNvdW50cyksIGxhcz0zLCBtYWluPSdQZXIgU2FtcGxlIExvZyBvZiBTaXplLWZhY3RvciBDb3VudHMnKQoKZGRzX3N0aW0gPC0gZXN0aW1hdGVTaXplRmFjdG9ycyhkZHNfc3RpbSkKc3RpbV9uY3RzIDwtIGNvdW50cyhkZHNfc3RpbSwgbm9ybWFsaXplZD1UUlVFKQpzdGltX3kgPC0gbG9nKHN0aW1fbmN0cyArIDEpCgpwYXIobWFyPWMoNSwgNSwgMiwgMSkpCnBhcihvbWE9YygwLCAwLCAwLCAwKSkKYm94cGxvdChzdGltX3ksIG5hbWVzPWNvbG5hbWVzKHN0aW1fY291bnRzKSwgbGFzPTMsCiAgICAgICAgbWFpbj0nUGVyIFNhbXBsZSBMb2cgb2YgU2l6ZS1mYWN0b3IgQ291bnRzJykKYGBgCgpgYGB7ciBteV9ib3hwbG90fQpib3hwbG90IDwtIHBsb3RfYm94cGxvdChoc19leHB0KQpib3hwbG90CmBgYAoKIyMgSGVhdG1hcCBvZiBQZWFyc29uIENvcnJlbGF0aW9uCgpgYGB7ciBjb3JoZWF0fQpkYXRDb3IgPC0gY29yKHR4aS5rYWxsaXN0by50c3YkY291bnRzKQpoZWF0bWFwLjIoZGF0Q29yLCBSb3d2PU5BLCBDb2x2PU5BLAogICAgICAgICAgbWFyZ2lucz1jKDEwLCAxMCksCiAgICAgICAgICBsYWJSb3c9ZGYkY29uZGl0aW9uLAogICAgICAgICAgbGFiQ29sPWRmJGNvbmRpdGlvbiwKICAgICAgICAgIGRlbmRyb2dyYW09Im5vbmUiLAogICAgICAgICAgc2NhbGU9Im5vbmUiLAogICAgICAgICAgdHJhY2U9Im5vbmUiLAogICAgICAgICAgc3J0Q29sPTQ1LCBtYWluPSdQZWFyc29uIENvcnJlbGF0aW9uJykKCnN0aW1fZGF0Q29yIDwtIGNvcihzdGltX2NvdW50cykKaGVhdG1hcC4yKHN0aW1fZGF0Q29yLCBSb3d2PU5BLCBDb2x2PU5BLAogICAgICAgICAgbWFyZ2lucz1jKDEwLCAxMCksCiAgICAgICAgICBsYWJSb3c9ZGYkY29uZGl0aW9uLAogICAgICAgICAgbGFiQ29sPWRmJGNvbmRpdGlvbiwKICAgICAgICAgIGRlbmRyb2dyYW09Im5vbmUiLAogICAgICAgICAgc2NhbGU9Im5vbmUiLAogICAgICAgICAgdHJhY2U9Im5vbmUiLAogICAgICAgICAgc3J0Q29sPTQ1LCBtYWluPSdQZWFyc29uIENvcnJlbGF0aW9uJykKYGBgCgpgYGB7ciBteV9jb3JoZWF0fQpwbG90X2NvcmhlYXQoaHNfZXhwdCkkcGxvdAoKcGxvdF9jb3JoZWF0KHN0aW1fZXhwdCkkcGxvdApgYGAKCiMjIEZpbHRlciBhbmQgTm9ybWFsaXplIENvdW50cwoKYGBge3J9CmZpbHRlckNvdW50cyA8LSBmdW5jdGlvbiAoY291bnRzLCBsaWIuc2l6ZT1OVUxMLCB0aHJlc2g9MSwgbWluU2FtcGxlcz0yKSB7CiAgY3BtcyA8LSAyIF4gbG9nMkNQTShjb3VudHMsIGxpYi5zaXplID0gbGliLnNpemUpJHkKICBrZWVwIDwtIHJvd1N1bXMoY3BtcyA+IHRocmVzaCkgPj0gbWluU2FtcGxlcwogIGNvdW50cyA8LSBjb3VudHNba2VlcCwgXQogIGNvdW50cwp9Cgp4X3RhYmxlIDwtIHRhYmxlKGRlc2lnbiRTdGltdWxhdGlvbikKZGltKHR4aS5rYWxsaXN0by50c3YkY291bnRzKQoKY291bnRzIDwtIGZpbHRlckNvdW50cyh0eGkua2FsbGlzdG8udHN2JGNvdW50cywgdGhyZXNoPTEsIG1pblNhbXBsZXM9bWluKHhfdGFibGUpKQpkaW0oY291bnRzKQpjb3VudHNTdWJRIDwtIHFOb3JtKGNvdW50cykKeCA8LSBsb2cyQ1BNKGNvdW50c1N1YlEpCnMgPC0gbWFrZVNWRCh4JHkpCgpzdGltX3RhYmxlIDwtIHRhYmxlKHN0aW1fZGVzaWduJFN0aW11bGF0aW9uKQpzdGltX2NvdW50cyA8LSBmaWx0ZXJDb3VudHMoc3RpbV9jb3VudHMsIHRocmVzaD0xLCBtaW5TYW1wbGVzPW1pbihzdGltX3RhYmxlKSkKZGltKHN0aW1fY291bnRzKQpzdGltX2NvdW50c1N1YlEgPC0gcU5vcm0oc3RpbV9jb3VudHMpCnN0aW1feCA8LSBsb2cyQ1BNKHN0aW1fY291bnRzU3ViUSkKc3RpbV9zIDwtIG1ha2VTVkQoc3RpbV94JHkpCmBgYAoKIyMgTWVkaWFuIFBhaXJ3aXNlIENvcnJlbGF0aW9uCgpgYGB7ciBzbWN9CmNvck0gPC0gbWF0cml4U3RhdHM6OnJvd01lZGlhbnMoY29yKHR4aS5rYWxsaXN0by50c3YkY291bnRzKSkKcXMgPC0gcXVhbnRpbGUoY29yTSwgcD1jKDEsIDMpLzQpCmlxciA8LSBkaWZmKHFzKQpvdXRMaW1pdCA8LSBxc1sxXSAtIDEuNSAqIGlxcgp5bGltIDwtIGMocG1pbihtaW4oY29yTSksIG91dExpbWl0KSwgbWF4KGNvck0pKQpjb25kIDwtIHBhc3RlKGRlc2lnbiRHcm93dGgsIGRlc2lnbiRTdGltdWxhdGlvbiwgc2VwPSJfIikKY29sIDwtIGlmZWxzZShjb25kPT0iTV9OUyIsICJncmF5NjAiLAogICAgICAgaWZlbHNlKGNvbmQ9PSJNX0xQUyIsICJkZWVwcGluazMiLAogICAgICAgaWZlbHNlKGNvbmQ9PSJNX0xBIiwgImRhcmtzZWFncmVlbjIiLAogICAgICAgaWZlbHNlKGNvbmQ9PSJNX0xQIiwgImxhdmVuZGVyIiwKICAgICAgIGlmZWxzZShjb25kPT0iR01fTlMiLCAibGlnaHRwaW5rMSIsCiAgICAgICBpZmVsc2UoY29uZD09IkdNX0xQUyIsICJtb2NjYXNpbiIsCiAgICAgICBpZmVsc2UoY29uZD09IkdNX0xBIiwgImJsYWNrIiwKICAgICAgIGlmZWxzZShjb25kPT0iR01fTFAiLCAic3ByaW5nZ3JlZW40IiwKICAgICAgICAgICAgICAiYmx1ZTIiKSkpKSkpKSkKcGFyKG1hcj1jKDUsIDQuNSwgMiwgMSkpCnBsb3QoY29yTSwgeGF4dD0ibiIsIHlsaW09eWxpbSwgeWxhYj0iTWVkaWFuIFBhaXJ3aXNlIENvcnJlbGF0aW9uIiwgeGxhYj0iIiwgbWFpbj0iIiwgY29sPWNvbCwgcGNoPTE2LCBjZXg9MS41KQpheGlzKHNpZGU9MSwgYXQ9c2VxKGFsb25nPWNvck0pLCBsYWJlbHM9Y29sbmFtZXModHhpLmthbGxpc3RvLnRzdiRjb3VudHMpLCBsYXM9MikKYWJsaW5lKGg9b3V0TGltaXQsIGx0eT0yKQphYmxpbmUodj0xOm5jb2wodHhpLmthbGxpc3RvLnRzdiRjb3VudHMpLCBsdHk9MywgY29sPSJibGFjayIpCgpzdGltX2Nvck0gPC0gbWF0cml4U3RhdHM6OnJvd01lZGlhbnMoY29yKHN0aW1fY291bnRzKSkKc3RpbV9xcyA8LSBxdWFudGlsZShzdGltX2Nvck0sIHA9YygxLCAzKS80KQpzdGltX2lxciA8LSBkaWZmKHN0aW1fcXMpCnN0aW1fb3V0TGltaXQgPC0gc3RpbV9xc1sxXSAtICgxLjUgKiBpcXIpCnN0aW1feWxpbSA8LSBjKHBtaW4obWluKHN0aW1fY29yTSksIHN0aW1fb3V0TGltaXQpLCBtYXgoc3RpbV9jb3JNKSkKc3RpbV9jb25kIDwtIHBhc3RlKHN0aW1fZGVzaWduJEdyb3d0aCwgc3RpbV9kZXNpZ24kU3RpbXVsYXRpb24sIHNlcD0iXyIpCmNvbCA8LSBpZmVsc2UoY29uZD09Ik1fTlMiLCAiZ3JheTYwIiwKICAgICAgIGlmZWxzZShjb25kPT0iTV9MUFMiLCAiZGVlcHBpbmszIiwKICAgICAgIGlmZWxzZShjb25kPT0iTV9MQSIsICJkYXJrc2VhZ3JlZW4yIiwKICAgICAgIGlmZWxzZShjb25kPT0iTV9MUCIsICJsYXZlbmRlciIsCiAgICAgICBpZmVsc2UoY29uZD09IkdNX05TIiwgImxpZ2h0cGluazEiLAogICAgICAgaWZlbHNlKGNvbmQ9PSJHTV9MUFMiLCAibW9jY2FzaW4iLAogICAgICAgaWZlbHNlKGNvbmQ9PSJHTV9MQSIsICJibGFjayIsCiAgICAgICBpZmVsc2UoY29uZD09IkdNX0xQIiwgInNwcmluZ2dyZWVuNCIsCiAgICAgICAgICAgICAgImJsdWUyIikpKSkpKSkpCnBhcihtYXI9Yyg1LCA0LjUsIDIsIDEpKQpwbG90KHN0aW1fY29yTSwgeGF4dD0ibiIsIHlsaW09eWxpbSwgeWxhYj0iTWVkaWFuIFBhaXJ3aXNlIENvcnJlbGF0aW9uIiwgeGxhYj0iIiwgbWFpbj0iIiwgY29sPWNvbCwgcGNoPTE2LCBjZXg9MS41KQpheGlzKHNpZGU9MSwgYXQ9c2VxKGFsb25nPXN0aW1fY29yTSksIGxhYmVscz1jb2xuYW1lcyhzdGltX2NvdW50cyksIGxhcz0yKQphYmxpbmUoaD1zdGltX291dExpbWl0LCBsdHk9MikKYWJsaW5lKHY9MTpuY29sKHN0aW1fY291bnRzKSwgbHR5PTMsIGNvbD0iYmxhY2siKQpgYGAKCmBgYHtyIG15X3NtY30KcGxvdF9zbShoc19leHB0KSRwbG90CgpwbG90X3NtKHN0aW1fZXhwdCkkcGxvdApgYGAKCiMjIFBDQQoKYGBge3J9CmNiY2JTRVE6OnBjUmVzKHMkdiwgcyRkLCBjb25kLCBkZXNpZ24kQmF0Y2gpWzE6NSwgXQpjYmNiU0VROjpwY1JlcyhzJHYsIHMkZCwgY29uZCwgZGVzaWduJFBhdGllbnQpWzE6NSwgXQoKY2JjYlNFUTo6cGNSZXMoc3RpbV9zJHYsIHN0aW1fcyRkLCBzdGltX2NvbmQsIHN0aW1fZGVzaWduJEJhdGNoKVsxOjUsIF0KY2JjYlNFUTo6cGNSZXMoc3RpbV9zJHYsIHN0aW1fcyRkLCBzdGltX2NvbmQsIHN0aW1fZGVzaWduJFBhdGllbnQpWzE6NSwgXQpgYGAKCiMjIEV1Y2xpZGlhbiBEaXN0YW5jZSBIZWF0IE1hcAoKYGBge3IgZGlzaGVhdH0KZGlzdHMgPC0gZGlzdCh0KGNvdW50cykpCm1hdCA8LSBhcy5tYXRyaXgoZGlzdHMpCnJvd25hbWVzKG1hdCkgPC0gY29sbmFtZXMobWF0KSA8LSBjb25kCmhtY29sIDwtIGNvbG9yUmFtcFBhbGV0dGUoYnJld2VyLnBhbCg5LCAiR25CdSIpKSgxMDApCnZlYy5wYXRpZW50IDwtIHJhaW5ib3cobmxldmVscyhkZXNpZ24kUGF0aWVudCksIHN0YXJ0PTAsIGVuZD0uOCkKcGF0aWVudC5jb2xvciA8LSByZXAoMCwgbGVuZ3RoKGRlc2lnbiRQYXRpZW50KSkKZm9yIChpIGluIDE6bGVuZ3RoKGRlc2lnbiRQYXRpZW50KSkgewogIHBhdGllbnQuY29sb3JbaV0gPC0gdmVjLnBhdGllbnRbZGVzaWduJFBhdGllbnRbaV09PWxldmVscyhkZXNpZ24kUGF0aWVudCldCn0KdmVjLmNvbmRpdGlvbiA8LSBjKCJncmVlbiIsICJsaWdodGJsdWUiLCAicGluayIsICJwdXJwbGUiKQpjb25kaXRpb24uY29sb3IgPC0gcmVwKDAsIGxlbmd0aChkZXNpZ24kU3RpbXVsYXRpb24pKQpmb3IgKGkgaW4gMTpsZW5ndGgoZGVzaWduJFN0aW11bGF0aW9uKSkgewogIGNvbmRpdGlvbi5jb2xvcltpXSA8LSB2ZWMuY29uZGl0aW9uW2Rlc2lnbiRTdGltdWxhdGlvbltpXT09bGV2ZWxzKGRlc2lnbiRTdGltdWxhdGlvbildCn0KCmhlYXRtYXAgPC0gaGVhdG1hcC4yKG1hdCwgdHJhY2U9Im5vbmUiLCBjb2wgPSByZXYoaG1jb2wpLCBtYXJnaW49YygxMSwgMTEpLCBDb2xTaWRlQ29sb3JzPWNvbmRpdGlvbi5jb2xvciwKICAgICAgICAgICAgICAgICAgICAgUm93U2lkZUNvbG9ycz1wYXRpZW50LmNvbG9yLCBrZXk9IkZBTFNFIiwgc3J0Q29sPTQ1KQoKc3RpbV9kaXN0cyA8LSBkaXN0KHQoc3RpbV9jb3VudHMpKQpzdGltX21hdCA8LSBhcy5tYXRyaXgoc3RpbV9kaXN0cykKcm93bmFtZXMoc3RpbV9tYXQpIDwtIGNvbG5hbWVzKHN0aW1fbWF0KSA8LSBzdGltX2NvbmQKc3RpbV9obWNvbCA8LSBjb2xvclJhbXBQYWxldHRlKGJyZXdlci5wYWwoOSwgIkduQnUiKSkoMTAwKQpzdGltX3ZlYy5wYXRpZW50IDwtIHJhaW5ib3cobmxldmVscyhzdGltX2Rlc2lnbiRQYXRpZW50KSwgc3RhcnQ9MCwgZW5kPS44KQpzdGltX3BhdGllbnQuY29sb3IgPC0gcmVwKDAsIGxlbmd0aChzdGltX2Rlc2lnbiRQYXRpZW50KSkKZm9yIChpIGluIDE6bGVuZ3RoKHN0aW1fZGVzaWduJFBhdGllbnQpKSB7CiAgaWR4IDwtIHN0aW1fZGVzaWduJFBhdGllbnRbaV0gPT0gbGV2ZWxzKHN0aW1fZGVzaWduJFBhdGllbnQpCiAgc3RpbV9wYXRpZW50LmNvbG9yW2ldIDwtIHN0aW1fdmVjLnBhdGllbnRbaWR4XQp9CnN0aW1fdmVjLmNvbmRpdGlvbiA8LSBjKCJncmVlbiIsICJsaWdodGJsdWUiLCAicGluayIsICJwdXJwbGUiKQpzdGltX2NvbmRpdGlvbi5jb2xvciA8LSByZXAoMCwgbGVuZ3RoKHN0aW1fZGVzaWduJFN0aW11bGF0aW9uKSkKZm9yIChpIGluIDE6bGVuZ3RoKHN0aW1fZGVzaWduJFN0aW11bGF0aW9uKSkgewogIGlkeCA8LSBzdGltX2Rlc2lnbiRTdGltdWxhdGlvbltpXSA9PSBsZXZlbHMoc3RpbV9kZXNpZ24kU3RpbXVsYXRpb24pCiAgc3RpbV9jb25kaXRpb24uY29sb3JbaV0gPC0gc3RpbV92ZWMuY29uZGl0aW9uW2lkeF0KfQpoZWF0bWFwIDwtIGhlYXRtYXAuMihzdGltX21hdCwgdHJhY2U9Im5vbmUiLCBjb2wgPSByZXYoaG1jb2wpLCBtYXJnaW49YygxMSwgMTEpLAogICAgICAgICAgICAgICAgICAgICBDb2xTaWRlQ29sb3JzPXN0aW1fY29uZGl0aW9uLmNvbG9yLAogICAgICAgICAgICAgICAgICAgICBSb3dTaWRlQ29sb3JzPXN0aW1fcGF0aWVudC5jb2xvciwga2V5PUZBTFNFLCBzcnRDb2w9NDUpCmBgYAoKYGBge3IgbXlfZGlzaGVhdH0KbXlfZGlzaGVhdCA8LSBwbG90X2Rpc2hlYXQoaHNfZXhwdCkKCnN0aW1fZGlzaGVhdCA8LSBwbG90X2Rpc2hlYXQoc3RpbV9leHB0KQpgYGAKCiMjIFBsb3QgUEMxIHYgUEMyCgpgYGB7ciBvcmlnaW5hbF9wY2F9CmNvbmRudW0gPC0gYXMubnVtZXJpYyhhcy5mYWN0b3IoZGVzaWduJFN0aW11bGF0aW9uKSkKY29uZG51bSA8LSBpZmVsc2UoY29uZG51bT09NCwgImdyZWVuIiwKICAgICAgICAgICBpZmVsc2UoY29uZG51bT09MywgImxpZ2h0Ymx1ZSIsCiAgICAgICAgICAgaWZlbHNlKGNvbmRudW09PTIsICJwaW5rIiwKICAgICAgICAgICBpZmVsc2UoY29uZG51bT09MSwgInB1cnBsZSIsICJibGFjayIpKSkpCnBhdG51bSA8LSBhcy5udW1lcmljKGFzLmZhY3RvcihkZXNpZ24kUGF0aWVudCkpCnBhdG51bSA8LSBpZmVsc2UocGF0bnVtPT00LCAyMSwKICAgICAgICAgIGlmZWxzZShwYXRudW09PTMsIDIyLAogICAgICAgICAgaWZlbHNlKHBhdG51bT09MiwgMjMsCiAgICAgICAgICBpZmVsc2UocGF0bnVtPT0xLCAyNCwKICAgICAgICAgIGlmZWxzZShwYXRudW09PTUsIDI1LCAxKSkpKSkKY2JjYlNFUTo6cGxvdFBDKHMkdiwgcyRkLCBjb2w9ImJsYWNrIiwgcGNoPXBhdG51bSwgYmc9Y29uZG51bSkKbGVnZW5kKHg9MC4yLCB5PTAuMiwgbGVnZW5kPXVuaXF1ZShkZXNpZ24kU3RpbXVsYXRpb24pLCBwY2g9MjIsIGNvbD0wLAogICAgICAgcHQuYmc9YygiZ3JlZW4iLCJsaWdodGJsdWUiLCJwaW5rIiwicHVycGxlIiksIHB0LmNleD0xLjUsIGNleD0wLjUsIGJ0eT0ibiIpCmxlZ2VuZCh4PTAuMiwgeT0tMC4xLCBsZWdlbmQ9dW5pcXVlKGRlc2lnbiRQYXRpZW50KSwgcGNoPXVuaXF1ZShwYXRudW0pLCBjb2w9MCwKICAgICAgIHB0LmJnPSJncmF5OTAiLCBwdC5jZXg9MS41LCBjZXg9MC41LCBidHk9Im4iKQoKc3RpbV9jb25kbnVtIDwtIGFzLm51bWVyaWMoYXMuZmFjdG9yKHN0aW1fZGVzaWduJFN0aW11bGF0aW9uKSkKc3RpbV9jb25kbnVtIDwtIGlmZWxzZShzdGltX2NvbmRudW09PTQsICJncmVlbiIsCiAgICAgICAgICAgICAgICBpZmVsc2Uoc3RpbV9jb25kbnVtPT0zLCAibGlnaHRibHVlIiwKICAgICAgICAgICAgICAgIGlmZWxzZShzdGltX2NvbmRudW09PTIsICJwaW5rIiwKICAgICAgICAgICAgICAgIGlmZWxzZShzdGltX2NvbmRudW09PTEsICJwdXJwbGUiLCAiYmxhY2siKSkpKQpzdGltX3BhdG51bSA8LSBhcy5udW1lcmljKGFzLmZhY3RvcihzdGltX2Rlc2lnbiRQYXRpZW50KSkKc3RpbV9wYXRudW0gPC0gaWZlbHNlKHN0aW1fcGF0bnVtPT00LCAyMSwKICAgICAgICAgICAgICAgaWZlbHNlKHN0aW1fcGF0bnVtPT0zLCAyMiwKICAgICAgICAgICAgICAgaWZlbHNlKHN0aW1fcGF0bnVtPT0yLCAyMywKICAgICAgICAgICAgICAgaWZlbHNlKHN0aW1fcGF0bnVtPT0xLCAyNCwKICAgICAgICAgICAgICAgaWZlbHNlKHN0aW1fcGF0bnVtPT01LCAyNSwgMSkpKSkpCmNiY2JTRVE6OnBsb3RQQyhzdGltX3Mkdiwgc3RpbV9zJGQsIGNvbD0iYmxhY2siLCBwY2g9c3RpbV9wYXRudW0sIGJnPXN0aW1fY29uZG51bSkKbGVnZW5kKHg9MC4yLCB5PTAuMiwgbGVnZW5kPXVuaXF1ZShzdGltX2Rlc2lnbiRTdGltdWxhdGlvbiksIHBjaD0yMiwgY29sPTAsCiAgICAgICBwdC5iZz1jKCJncmVlbiIsImxpZ2h0Ymx1ZSIsInBpbmsiLCJwdXJwbGUiKSwgcHQuY2V4PTEuNSwgY2V4PTAuNSwgYnR5PSJuIikKbGVnZW5kKHg9MC4yLCB5PS0wLjEsIGxlZ2VuZD11bmlxdWUoc3RpbV9kZXNpZ24kUGF0aWVudCksIHBjaD11bmlxdWUoc3RpbV9wYXRudW0pLCBjb2w9MCwKICAgICAgIHB0LmJnPSJncmF5OTAiLCBwdC5jZXg9MS41LCBjZXg9MC41LCBidHk9Im4iKQpgYGAKCmBgYHtyIG15X3BjYX0KaHNfbm9ybSA8LSBub3JtYWxpemVfZXhwdChoc19leHB0LCBub3JtPSJxdWFudCIsIGZpbHRlcj0iY2JjYiIsIHRyYW5zZm9ybT0ibG9nMiIpCm15X3BjYSA8LSBwbG90X3BjYShoc19ub3JtLCBwbG90X2xhYmVscz1GQUxTRSwgY2lzPU5VTEwpCm15X3BjYSRwbG90Cgpoc3N0aW1fbm9ybSA8LSBub3JtYWxpemVfZXhwdChzdGltX2V4cHQsIG5vcm09InF1YW50IiwgZmlsdGVyPSJjYmNiIiwgdHJhbnNmb3JtPSJsb2cyIikKc3RpbV9wY2EgPC0gcGxvdF9wY2EoaHNzdGltX25vcm0sIHBsb3RfbGFiZWxzPUZBTFNFLCBjaXM9TlVMTCkKc3RpbV9wY2EkcGxvdApgYGAKCiMjIENvcnJlY3QgZm9yIFBhdGllbnQgaW4gTGltbWEgbW9kZWwKCmBgYHtyfQptb2QgPC0gbW9kZWwubWF0cml4KH5kZXNpZ24kUGF0aWVudCkKdiA8LSB2b29tKGNvdW50c1N1YlEsIG1vZCkKZml0IDwtIGxtRml0KHYpCm5ld0RhdGEgPC0gcmVzaWR1YWxzKGZpdCwgdikKcyA8LSBtYWtlU1ZEKG5ld0RhdGEpCnBjUmVzKHMkdiwgcyRkLCBjb25kLCBkZXNpZ24kQmF0Y2gpWzE6NSwgXQpwY1JlcyhzJHYsIHMkZCwgY29uZCwgZGVzaWduJFBhdGllbnQpWzE6NSwgXQoKc3RpbV90YWJsZSA8LSB0YWJsZShzdGltX2Rlc2lnbiRTdGltdWxhdGlvbikKc3RpbV9jb3VudHMgPC0gZmlsdGVyQ291bnRzKHN0aW1fY291bnRzLCB0aHJlc2g9MiwgbWluU2FtcGxlcz1taW4oc3RpbV90YWJsZSkpCmRpbShzdGltX2NvdW50cykKc3RpbV9jb3VudHNTdWJRIDwtIHFOb3JtKHN0aW1fY291bnRzKQpzdGltX21vZCA8LSBtb2RlbC5tYXRyaXgofnN0aW1fZGVzaWduJFBhdGllbnQpCnN0aW1fdiA8LSB2b29tKHN0aW1fY291bnRzU3ViUSwgc3RpbV9tb2QpCnN0aW1fZml0IDwtIGxtRml0KHN0aW1fdikKc3RpbV9uZXdEYXRhIDwtIHJlc2lkdWFscyhzdGltX2ZpdCwgc3RpbV92KQpzdGltX3MgPC0gbWFrZVNWRChzdGltX25ld0RhdGEpCnBjUmVzKHN0aW1fcyR2LCBzdGltX3MkZCwgc3RpbV9jb25kLCBzdGltX2Rlc2lnbiRCYXRjaClbMTo1LCBdCnBjUmVzKHN0aW1fcyR2LCBzdGltX3MkZCwgc3RpbV9jb25kLCBzdGltX2Rlc2lnbiRQYXRpZW50KVsxOjUsIF0KYGBgCgojIyBQbG90IFBDMSBhbmQgUEMyIHdpdGggcGF0aWVudCBjb3JyZWN0aW9uCgpgYGB7cn0KZ3JvbnVtIDwtIGFzLm51bWVyaWMoYXMuZmFjdG9yKGRlc2lnbiRHcm93dGgpKQpncm9udW0gPC0gaWZlbHNlKGdyb251bSA9PSAyLCAxOSwKICAgICAgICAgIGlmZWxzZShncm9udW0gPT0gMSwgMTUsIDEpKQpwYXRudW0gPC0gYXMubnVtZXJpYyhhcy5mYWN0b3IoZGVzaWduJFBhdGllbnQpKQpwYXRudW0gPC0gaWZlbHNlKHBhdG51bSA9PSAxLCAicGluayIsCiAgICAgICAgICBpZmVsc2UocGF0bnVtID09IDIsICJncmVlbiIsCiAgICAgICAgICBpZmVsc2UocGF0bnVtID09IDMsICJibHVlIiwKICAgICAgICAgIGlmZWxzZShwYXRudW0gPT0gNCwgInllbGxvdyIsCiAgICAgICAgICBpZmVsc2UocGF0bnVtID09IDUsICJibGFjayIsICJvcmFuZ2UiKSkpKSkKc2FtcGxlbnVtIDwtIGFzLm51bWVyaWMoYXMuZmFjdG9yKGRlc2lnbiRTdGltdWxhdGlvbikpCnNhbXBsZW51bSA8LSBpZmVsc2Uoc2FtcGxlbnVtID09IDQsICJncmVlbiIsCiAgICAgICAgICAgICBpZmVsc2Uoc2FtcGxlbnVtID09IDMsICJibHVlIiwKICAgICAgICAgICAgIGlmZWxzZShzYW1wbGVudW0gPT0gMSwgImJsYWNrIiwKICAgICAgICAgICAgIGlmZWxzZShzYW1wbGVudW0gPT0gMiwgInllbGxvdyIsICJncmV5IikpKSkKcGxvdFBDKHMkdiwgcyRkLCBwY2g9Z3JvbnVtLCBjb2w9c2FtcGxlbnVtLCBjZXg9MikKbGVnZW5kKHg9MC4wNSwgeT0wLjMsIGxlZ2VuZD1jKCJOUyIsICJMUFMiLCAiTFAiLCAiTEEiKSwgcGNoPTIyLCBjb2w9MCwKICAgICAgIHB0LmJnPWMoImdyZWVuIiwgImJsdWUiLCAiYmxhY2siLCAieWVsbG93IiksIHB0LmNleD0xLjUsIGNleD0xLCBidHk9Im4iKQpsZWdlbmQoeD0wLjA1LCB5PTAuMSwgbGVnZW5kPXVuaXF1ZShkZXNpZ24kR3Jvd3RoKSwgcGNoPXVuaXF1ZShncm9udW0pLCBjb2w9ImJsYWNrIiwKICAgICAgIHB0LmJnPSJibGFjayIsIHB0LmNleD0xLjAsIGNleD0xLCBidHk9Im4iKQoKc3RpbV9ncm9udW0gPC0gYXMubnVtZXJpYyhhcy5mYWN0b3Ioc3RpbV9kZXNpZ24kR3Jvd3RoKSkKc3RpbV9ncm9udW0gPC0gaWZlbHNlKHN0aW1fZ3JvbnVtID09IDIsIDE5LAogICAgICAgICAgICAgICBpZmVsc2Uoc3RpbV9ncm9udW0gPT0gMSwgMTUsIDEpKQpzdGltX3BhdG51bSA8LSBhcy5udW1lcmljKGFzLmZhY3RvcihzdGltX2Rlc2lnbiRQYXRpZW50KSkKc3RpbV9wYXRudW0gPC0gaWZlbHNlKHN0aW1fcGF0bnVtID09IDEsICJwaW5rIiwKICAgICAgICAgICAgICAgaWZlbHNlKHN0aW1fcGF0bnVtID09IDIsICJncmVlbiIsCiAgICAgICAgICAgICAgIGlmZWxzZShzdGltX3BhdG51bSA9PSAzLCAiYmx1ZSIsCiAgICAgICAgICAgICAgIGlmZWxzZShzdGltX3BhdG51bSA9PSA0LCAieWVsbG93IiwKICAgICAgICAgICAgICAgaWZlbHNlKHN0aW1fcGF0bnVtID09IDUsICJibGFjayIsICJvcmFuZ2UiKSkpKSkKc3RpbV9zYW1wbGVudW0gPC0gYXMubnVtZXJpYyhhcy5mYWN0b3Ioc3RpbV9kZXNpZ24kU3RpbXVsYXRpb24pKQpzdGltX3NhbXBsZW51bSA8LSBpZmVsc2Uoc3RpbV9zYW1wbGVudW0gPT0gMywgImdyZWVuIiwKICAgICAgICAgICAgICAgICAgaWZlbHNlKHN0aW1fc2FtcGxlbnVtID09IDIsICJibHVlIiwKICAgICAgICAgICAgICAgICAgaWZlbHNlKHN0aW1fc2FtcGxlbnVtID09IDEsICJibGFjayIsICJncmV5IikpKQpwbG90UEMoc3RpbV9zJHYsIHN0aW1fcyRkLCBwY2g9c3RpbV9ncm9udW0sIGNvbD1zdGltX3NhbXBsZW51bSwgY2V4PTIpCmxlZ2VuZCh4PTAuMDUsIHk9MC4zLCBsZWdlbmQ9YygiTFBTIiwgIkxQIiwgIkxBIiksIHBjaD0yMiwgY29sPTAsCiAgICAgICBwdC5iZz1jKCJncmVlbiIsICJibHVlIiwgImJsYWNrIiwgInllbGxvdyIpLCBwdC5jZXg9MS41LCBjZXg9MSwgYnR5PSJuIikKbGVnZW5kKHg9MC4wNSwgeT0wLjEsIGxlZ2VuZD11bmlxdWUoc3RpbV9kZXNpZ24kR3Jvd3RoKSwgcGNoPXVuaXF1ZShzdGltX2dyb251bSksCiAgICAgICBjb2w9ImJsYWNrIiwgcHQuYmc9ImJsYWNrIiwgcHQuY2V4PTEuMCwgY2V4PTEsIGJ0eT0ibiIpCmBgYAoKIyMgTXkgRmlndXJlIDNBCgpgYGB7ciBteV9wY2EyfQojI3N0aW1fY291bnRzIDwtIGZpbHRlckNvdW50cyhzdGltX2NvdW50cywgdGhyZXNoPTEsIG1pblNhbXBsZXM9bWluKHgpKQojI2RpbShzdGltX2NvdW50cykKIyNzdGltX2NvdW50c1N1YlEgPC0gcU5vcm0oc3RpbV9jb3VudHMpCiMjc3RpbV94IDwtIGxvZzJDUE0oc3RpbV9jb3VudHNTdWJRKQojI3N0aW1fcyA8LSBtYWtlU1ZEKHN0aW1feCR5KQpoc3MgPC0gc2V0X2V4cHRfYmF0Y2hlcyhzdGltX2V4cHQsIGZhY3Q9InBhdGllbnQiKQpoc3MgPC0gc20obm9ybWFsaXplX2V4cHQoaHNzLCBmaWx0ZXI9VFJVRSkpCmhzcyA8LSBzbShub3JtYWxpemVfZXhwdChoc3MsIG5vcm09InF1YW50IikpCmhzcyA8LSBzbShub3JtYWxpemVfZXhwdChoc3MsIGNvbnZlcnQ9ImNwbSIpKQpoc3MgPC0gc20obm9ybWFsaXplX2V4cHQoaHNzLCB0cmFuc2Zvcm09ImxvZzIiKSkKaHNzIDwtIHNtKG5vcm1hbGl6ZV9leHB0KGhzcywgYmF0Y2g9ImxpbW1hIikpCmhzcyA8LSBzbShzZXRfZXhwdF9iYXRjaGVzKGhzcywgZmFjdD0iZ3Jvd3RoIikpCnBsb3RfcGNhKGhzcywgcGxvdF9sYWJlbHM9RkFMU0UpJHBsb3QKYGBgCgojIyBIZWF0bWFwIHdpdGggcGF0aWVudCBjb3JyZWN0aW9uPz8KCmBgYHtyfQpkaXN0cyA8LSBkaXN0KHQobmV3RGF0YSkpCm1hdCA8LSBhcy5tYXRyaXgoZGlzdHMpCnJvd25hbWVzKG1hdCkgPC0gY29sbmFtZXMobWF0KSA8LSBjb25kCmhlYXRtYXAgPC0gaGVhdG1hcC4yKG1hdCwgdHJhY2U9Im5vbmUiLCBjb2wgPSByZXYoaG1jb2wpLCBtYXJnaW49YygxMSwgMTEpLAogICAgICAgICAgICAgICAgICAgICBDb2xTaWRlQ29sb3JzPWNvbmRpdGlvbi5jb2xvciwKICAgICAgICAgICAgICAgICAgICAgUm93U2lkZUNvbG9ycz1wYXRpZW50LmNvbG9yLCBrZXk9RkFMU0UsIHNydENvbD00NSkKYGBgCgojIyBERSBhbmFseXNpcwoKYGBge3J9CmNvdW50c1N1YlEgPC0gcU5vcm0oY291bnRzKQpwYXRpZW50IDwtIGRlc2lnbiRQYXRpZW50Cm1vZCA8LSBtb2RlbC5tYXRyaXgofjArY29uZCtwYXRpZW50LCBkYXRhPWRlc2lnbikKdiA8LSB2b29tKGNvdW50c1N1YlEsIG1vZCwgcGxvdD1UUlVFKQpmaXQgPC0gbG1GaXQodikKYGBgCgojIyBNX0xQUyB2IE1fTlMKCmVCYXllcyBmaW5kcyBhbiBGLXN0YXRpc3RpYyBmcm9tIHRoZSBzZXQgb2YgdC1zdGF0aXN0aWNzIGZvciB0aGF0IGdlbmUKCmBgYHtyfQpNX0xQUy5NX05TLmNvbnRyLm1hdCA8LSBtYWtlQ29udHJhc3RzKE1fTFBTdk1fTlM9KGNvbmRNX0xQUy1jb25kTV9OUyksIGxldmVscz12JGRlc2lnbikKTV9MUFMuTV9OUy5maXQgPC0gY29udHJhc3RzLmZpdChmaXQsIE1fTFBTLk1fTlMuY29udHIubWF0KQpNX0xQUy5NX05TLmViIDwtIGVCYXllcyhNX0xQUy5NX05TLmZpdCkKTV9MUFMuTV9OUy50b3BUYWIgPC0gdG9wVGFibGUoTV9MUFMuTV9OUy5lYiwgY29lZj0iTV9MUFN2TV9OUyIsIG51bWJlcj1ucm93KHYkRSkpCk1fTFBTLk1fTlMudG9wVGFiIDwtIGNiaW5kKHJvd25hbWVzKE1fTFBTLk1fTlMudG9wVGFiKSwgTV9MUFMuTV9OUy50b3BUYWIpCmNvbG5hbWVzKE1fTFBTLk1fTlMudG9wVGFiKSA8LSBjKCJJRCIsICJsb2dGQyIsICJBdmVFeHByIiwgInQiLCAiUC5WYWx1ZSIsICJhZGouUC5WYWwiLCAiQiIpCnJvd25hbWVzKE1fTFBTLk1fTlMudG9wVGFiKSA8LSBjKDE6bnJvdyhNX0xQUy5NX05TLnRvcFRhYikpCgpscHNfbnNfdGFibGUgPC0gImNzdi90b3BUYWJfTV9MUFN2TV9OU19DRFNfbGltbWFiYXRjaGNvcnJlY3Rpb25fMjAxNzExMjAuY3N2Igp3cml0ZS5jc3YoTV9MUFMuTV9OUy50b3BUYWIsIGZpbGU9bHBzX25zX3RhYmxlLAogICAgICAgICAgcm93Lm5hbWVzPUZBTFNFLCBxdW90ZT1GQUxTRSkKYGBgCgpMaW1pdCBsaXN0IHRvIGdlbmVzIHdpdGggYW4gYWRqdXN0ZWQgcCB2YWx1ZSA8IDAuMDUKCmBgYHtyfQpNX0xQUy5NX05TLnNpZ0dlbmVzIDwtIE1fTFBTLk1fTlMudG9wVGFiW01fTFBTLk1fTlMudG9wVGFiJGFkai5QLlZhbCA8IDAuMDUsIF0KbGVuZ3RoKE1fTFBTLk1fTlMuc2lnR2VuZXMkSUQpCmBgYAoKRmlsdGVyIG91dCByb3dzIHdpdGggbGVzcyB0aGFuIDItZm9sZCBjaGFuZ2UgKGxvZzIgZm9sZCBjaGFuZ2Ugb2YgPiAxKQoKYGBge3J9Ck1fTFBTLk1fTlMuc2lnR2VuZXNGb2xkMSA8LSBzdWJzZXQoTV9MUFMuTV9OUy5zaWdHZW5lcywgYWJzKGxvZ0ZDKSA+IDEpCmxlbmd0aChNX0xQUy5NX05TLnNpZ0dlbmVzRm9sZDEkSUQpCmBgYAoKRmlsdGVyIG91dCByb3dzIHdpdGggbGVzcyB0aGFuIDQtZm9sZCBjaGFuZ2UgKGxvZzIgZm9sZCBjaGFuZ2Ugb2YgPiAyKQoKYGBge3J9Ck1fTFBTLk1fTlMuc2lnR2VuZXNGb2xkMiA8LSBzdWJzZXQoTV9MUFMuTV9OUy5zaWdHZW5lcywgYWJzKGxvZ0ZDKSA+IDIpCmxlbmd0aChNX0xQUy5NX05TLnNpZ0dlbmVzRm9sZDIkSUQpCmBgYAoKTWFrZSBhbiBNQSBwbG90CgpgYGB7cn0Kc2VsIDwtIE1fTFBTLk1fTlMudG9wVGFiJGFkai5QLlZhbCA8IDAuMDUKdG9wIDwtIE1fTFBTLk1fTlMudG9wVGFiCnN1YiA8LSBwYXN0ZSgiTm8uIG9mIHNpZy4gZ2VuZXM6ICIsIHN1bShzZWwpLCAiLyIsIGxlbmd0aChzZWwpKQpjcG0gPC0gdiRFCgpwbG90KHJvd01lYW5zKGNwbVt0b3AkSUQsXSksIHRvcCRsb2dGQywgcGNoPTE2LCBjZXg9MC41LCBjb2w9ImRhcmtncmV5IiwKICAgICBtYWluPSJNX0xQU3ZNX05TIGFkanVzdGVkIiwKICAgICB5bGFiPSJsb2cgRkMiLCB4bGFiPSJBdmVyYWdlIEV4cHJlc3Npb24iLAogICAgIHN1Yj1zdWIpCnBvaW50cyhyb3dNZWFucyhjcG1bdG9wJElELCBdKVtzZWxdLCB0b3AkbG9nRkNbc2VsXSwgY29sPSJyZWQiLCBjZXg9MC41KQphYmxpbmUoaD1jKC0xLCAwLCAxKSwgY29sPSJyZWQiKQpgYGAKCkFubm90YXRlIHNpZ0dlbmVzIGxpc3QgdXNpbmcgQmlvbWFydAoKYGBge3J9Ck1fTFBTLk1fTlMuc2lnR2VuZXMgPC0gTV9MUFMuTV9OUy5zaWdHZW5lc1tvcmRlcigtTV9MUFMuTV9OUy5zaWdHZW5lcyRsb2dGQyksIF0KCnNpZ0dlbmVzIDwtIE1fTFBTLk1fTlMuc2lnR2VuZXMKaWRzIDwtIHNpZ0dlbmVzJElECgpkZXNjIDwtIGdldEJNKGF0dHJpYnV0ZXM9YygiZW5zZW1ibF9nZW5lX2lkIiwgImhnbmNfc3ltYm9sIiwgImRlc2NyaXB0aW9uIiwgImdlbmVfYmlvdHlwZSIpLAogICAgICAgICAgICAgIGZpbHRlcnM9ImVuc2VtYmxfZ2VuZV9pZCIsIHZhbHVlcz1pZHMsIG1hcnQ9ZW5zZW1ibCkKY29sbmFtZXMoZGVzYyk9YygiSUQiLCAiU3ltYm9sIiwgIkRlc2NyaXB0aW9uIiwgIlR5cGUiKQoKZGVzYyREZXNjcmlwdGlvbiA8LSBnc3ViKCIsIiwgIiIsIGRlc2MkRGVzY3JpcHRpb24pCgpERUdfTFBTIDwtIG1lcmdlKHNpZ0dlbmVzLCBkZXNjLCBieT0iSUQiLCBhbGw9VFJVRSkKREVHX0xQUyA8LSBzdWJzZXQoREVHX0xQUywgc2VsZWN0PWMoSUQsIFN5bWJvbCwgRGVzY3JpcHRpb24sIGxvZ0ZDLCBhZGouUC5WYWwsIEF2ZUV4cHIsIFR5cGUpLCBGUz0iL3QiKQpERUdfTFBTIDwtIERFR19MUFNbb3JkZXIoLURFR19MUFMkbG9nRkMpLCBdCgojI0ZpbHRlciBvdXQgR2VuZXMgLTE8RkM8MQpERUdfTFBTIDwtIHN1YnNldChERUdfTFBTLCBhYnMoREVHX0xQUyRsb2dGQyk+MSkKCiMjU2F2ZSBERSBnZW5lcwp3cml0ZS50YWJsZShERUdfTFBTLCAiY3N2L0RFR19NX0xQU3ZNX05TX0NEU19saW1tYWJhdGNoY29ycmVjdGlvbl8yMDE3MTEyMC50eHQiLAogICAgICAgICAgICBjb2wubmFtZXM9VFJVRSwgcm93Lm5hbWVzPUZBTFNFLCBxdW90ZT1GQUxTRSkKd3JpdGUuY3N2KERFR19MUFMsICJjc3YvREVHX01fTFBTdk1fTlNfQ0RTX2xpbW1hYmF0Y2hjb3JyZWN0aW9uXzIwMTcxMTIwLmNzdiIsCiAgICAgICAgICByb3cubmFtZXM9RkFMU0UsIHF1b3RlPUZBTFNFKQpgYGAKCiMjIE1fTFBTIHYgTV9MQQoKYGBge3J9CiNlQmF5ZXMgZmluZHMgYW4gRi1zdGF0aXN0aWMgZnJvbSB0aGUgc2V0IG9mIHQtc3RhdGlzdGljcyBmb3IgdGhhdCBnZW5lCk1fTFBTLk1fTEEuY29udHIubWF0IDwtIG1ha2VDb250cmFzdHMoTV9MUFN2TV9MQT0oKGNvbmRNX0xBLWNvbmRNX05TKS0oY29uZE1fTFBTLWNvbmRNX05TKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzPXYkZGVzaWduKQpNX0xQUy5NX0xBLmZpdCA8LSBjb250cmFzdHMuZml0KGZpdCwgTV9MUFMuTV9MQS5jb250ci5tYXQpCk1fTFBTLk1fTEEuZWIgPC0gZUJheWVzKE1fTFBTLk1fTEEuZml0KQpNX0xQUy5NX0xBLnRvcFRhYiA8LSB0b3BUYWJsZShNX0xQUy5NX0xBLmViLCBjb2VmPSJNX0xQU3ZNX0xBIiwgbnVtYmVyPW5yb3codiRFKSkKTV9MUFMuTV9MQS50b3BUYWIgPC0gY2JpbmQocm93bmFtZXMoTV9MUFMuTV9MQS50b3BUYWIpLCBNX0xQUy5NX0xBLnRvcFRhYikKY29sbmFtZXMoTV9MUFMuTV9MQS50b3BUYWIpIDwtIGMoIklEIiwgImxvZ0ZDIiwgIkF2ZUV4cHIiLCAidCIsICJQLlZhbHVlIiwgImFkai5QLlZhbCIsICJCIikKcm93bmFtZXMoTV9MUFMuTV9MQS50b3BUYWIpIDwtIGMoMTpucm93KE1fTFBTLk1fTEEudG9wVGFiKSkKCmxwc19sYV90YWJsZSA8LSAiY3N2L3RvcFRhYl9NX0xQU3ZNX0xBX0NEU19saW1tYWJhdGNoY29ycmVjdGlvbl8yMDE3MTEyMHJldi5jc3YiCndyaXRlLmNzdihNX0xQUy5NX0xBLnRvcFRhYiwgZmlsZT1scHNfbGFfdGFibGUsIHJvdy5uYW1lcz1GQUxTRSwgcXVvdGU9RkFMU0UpCgojI0xpbWl0IGxpc3QgdG8gZ2VuZXMgd2l0aCBhbiBhZGp1c3RlZCBwIHZhbHVlIDwgMC4wNQpNX0xQUy5NX0xBLnNpZ0dlbmVzIDwtIE1fTFBTLk1fTEEudG9wVGFiW01fTFBTLk1fTEEudG9wVGFiJGFkai5QLlZhbCA8IDAuMDUsIF0KbGVuZ3RoKE1fTFBTLk1fTEEuc2lnR2VuZXMkSUQpCiMjWzFdIDYxNwoKIyNGaWx0ZXIgb3V0IHJvd3Mgd2l0aCBsZXNzIHRoYW4gMi1mb2xkIGNoYW5nZSAobG9nMiBmb2xkIGNoYW5nZSBvZiA+IDEpCk1fTFBTLk1fTEEuc2lnR2VuZXNGb2xkMSA8LSBzdWJzZXQoTV9MUFMuTV9MQS5zaWdHZW5lcywgYWJzKGxvZ0ZDKSA+IDEpCmxlbmd0aChNX0xQUy5NX0xBLnNpZ0dlbmVzRm9sZDEkSUQpCiMjWzFdIDI0MAoKIyNGaWx0ZXIgb3V0IHJvd3Mgd2l0aCBsZXNzIHRoYW4gNC1mb2xkIGNoYW5nZSAobG9nMiBmb2xkIGNoYW5nZSBvZiA+IDIpCk1fTFBTLk1fTEEuc2lnR2VuZXNGb2xkMiA8LSBzdWJzZXQoTV9MUFMuTV9MQS5zaWdHZW5lcywgYWJzKGxvZ0ZDKSA+IDIpCmxlbmd0aChNX0xQUy5NX0xBLnNpZ0dlbmVzRm9sZDIkSUQpCiMjWzFdIDY5CgojI01ha2UgYW4gTUEgcGxvdApzZWwgPC0gTV9MUFMuTV9MQS50b3BUYWIkYWRqLlAuVmFsIDwgMC4wNQp0b3AgPC0gTV9MUFMuTV9MQS50b3BUYWIKc3ViIDwtIHBhc3RlKCJOby4gb2Ygc2lnLiBnZW5lczogIiwgc3VtKHNlbCksICIvIiwgbGVuZ3RoKHNlbCkpCmNwbSA8LSB2JEUKCnBsb3Qocm93TWVhbnMoY3BtW3RvcCRJRCxdKSwgdG9wJGxvZ0ZDLCBwY2g9MTYsIGNleD0wLjUsIGNvbD0iZGFya2dyZXkiLAogICAgIG1haW49Ik1fTFBTdk1fTEEgYWRqdXN0ZWQiLAogICAgIHlsYWI9ImxvZyBGQyIsIHhsYWI9IkF2ZXJhZ2UgRXhwcmVzc2lvbiIsCiAgICAgc3ViPXN1YikKcG9pbnRzKHJvd01lYW5zKGNwbVt0b3AkSUQsIF0pW3NlbF0sIHRvcCRsb2dGQ1tzZWxdLCBjb2w9InJlZCIsIGNleD0wLjUpCmFibGluZShoPWMoLTEsIDAsIDEpLCBjb2w9InJlZCIpCgpkZXYuY29weShwZGYsICJpbWFnZXMvTUFwbG90X01fTFBTdk1fTEFfQ0RTX2xpbW1hYmF0Y2hjb3JyZWN0aW9uXzIwMTcxMTIwcmV2LnBkZiIsIHdpZHRoPTgsIGhlaWdodD04KQpkZXYub2ZmKCkKZGV2LmNvcHkocG5nLCAiaW1hZ2VzL01BcGxvdF9NX0xQU3ZNX0xBX0NEU19saW1tYWJhdGNoY29ycmVjdGlvbl8yMDE3MTEyMHJldi5wbmciLCB3aWR0aD03MDAsCiAgICAgICAgIGhlaWdodD03MDApCmRldi5vZmYoKQoKTV9MUFMuTV9MQS5zaWdHZW5lcyA8LSBNX0xQUy5NX0xBLnNpZ0dlbmVzW29yZGVyKC1NX0xQUy5NX0xBLnNpZ0dlbmVzJGxvZ0ZDKSwgXQoKIyNBbm5vdGF0ZSBzaWdHZW5lcyBsaXN0IHVzaW5nIEJpb21hcnQKc2lnR2VuZXMgPC0gTV9MUFMuTV9MQS5zaWdHZW5lcwppZHMgPC0gc2lnR2VuZXMkSUQKCmRlc2MgPC0gZ2V0Qk0oYXR0cmlidXRlcz1jKCJlbnNlbWJsX2dlbmVfaWQiLCAiaGduY19zeW1ib2wiLCAiZGVzY3JpcHRpb24iLCAiZ2VuZV9iaW90eXBlIiksCiAgICAgICAgICAgICAgZmlsdGVycz0iZW5zZW1ibF9nZW5lX2lkIiwKICAgICAgICAgICAgICB2YWx1ZXM9aWRzLCBtYXJ0PWVuc2VtYmwpCmNvbG5hbWVzKGRlc2MpPWMoIklEIiwgIlN5bWJvbCIsICJEZXNjcmlwdGlvbiIsICJUeXBlIikKCiMjUmVtb3ZlIGNvbW1hcyBmcm9tIGRlc2NyaXB0aW9uCmRlc2MkRGVzY3JpcHRpb24gPC0gZ3N1YigiLCIsICIiLCBkZXNjJERlc2NyaXB0aW9uKQoKREVHIDwtIG1lcmdlKHNpZ0dlbmVzLCBkZXNjLCBieT0iSUQiLCBhbGw9VFJVRSkKREVHIDwtIHN1YnNldChERUcsIHNlbGVjdD1jKElELCBTeW1ib2wsIERlc2NyaXB0aW9uLCBsb2dGQywgYWRqLlAuVmFsLCBBdmVFeHByLCBUeXBlKSwgRlM9Ii90IikKREVHIDwtIERFR1tvcmRlcigtREVHJGxvZ0ZDKSwgXQoKIyNGaWx0ZXIgb3V0IEdlbmVzIC0xPEZDPDEKREVHIDwtIHN1YnNldChERUcsIGFicyhERUckbG9nRkMpPjEpCgojI1NhdmUgREUgZ2VuZXMKd3JpdGUudGFibGUoREVHLCAiY3N2L0RFR19NX0xQU3ZNX0xBX0NEU19saW1tYWJhdGNoY29ycmVjdGlvbl8yMDE3MTEyMHJldi50eHQiLAogICAgICAgICAgICBjb2wubmFtZXM9VFJVRSwgcm93Lm5hbWVzPUZBTFNFLCBxdW90ZT1GQUxTRSkKd3JpdGUuY3N2KERFRywgImNzdi9ERUdfTV9MUFN2TV9MQV9DRFNfbGltbWFiYXRjaGNvcnJlY3Rpb25fMjAxNzExMjByZXYuY3N2Iiwgcm93Lm5hbWVzPUYsIHF1b3RlPUYpCmBgYAoKIyMgTV9MUFMgdiBNX0xQCgpgYGB7cn0KI2VCYXllcyBmaW5kcyBhbiBGLXN0YXRpc3RpYyBmcm9tIHRoZSBzZXQgb2YgdC1zdGF0aXN0aWNzIGZvciB0aGF0IGdlbmUKTV9MUFMuTV9MUC5jb250ci5tYXQgPC0gbWFrZUNvbnRyYXN0cyhNX0xQU3ZNX0xQPSgoY29uZE1fTFAtY29uZE1fTlMpLShjb25kTV9MUFMtY29uZE1fTlMpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHM9diRkZXNpZ24pCk1fTFBTLk1fTFAuZml0IDwtIGNvbnRyYXN0cy5maXQoZml0LCBNX0xQUy5NX0xQLmNvbnRyLm1hdCkKTV9MUFMuTV9MUC5lYiA8LSBlQmF5ZXMoTV9MUFMuTV9MUC5maXQpCk1fTFBTLk1fTFAudG9wVGFiIDwtIHRvcFRhYmxlKE1fTFBTLk1fTFAuZWIsIGNvZWY9Ik1fTFBTdk1fTFAiLCBudW1iZXI9bnJvdyh2JEUpKQpNX0xQUy5NX0xQLnRvcFRhYiA8LSBjYmluZChyb3duYW1lcyhNX0xQUy5NX0xQLnRvcFRhYiksIE1fTFBTLk1fTFAudG9wVGFiKQpjb2xuYW1lcyhNX0xQUy5NX0xQLnRvcFRhYikgPC0gYygiSUQiLCAibG9nRkMiLCAiQXZlRXhwciIsICJ0IiwgIlAuVmFsdWUiLCAiYWRqLlAuVmFsIiwgIkIiKQpyb3duYW1lcyhNX0xQUy5NX0xQLnRvcFRhYikgPC0gYygxOm5yb3coTV9MUFMuTV9MUC50b3BUYWIpKQoKbHBzX2xwX3RhYmxlIDwtICJjc3YvdG9wVGFiX01fTFBTdk1fTFBfQ0RTX2xpbW1hYmF0Y2hjb3JyZWN0aW9uXzIwMTcxMTIwcmV2LmNzdiIKd3JpdGUuY3N2KE1fTFBTLk1fTFAudG9wVGFiLCBmaWxlPWxwc19scF90YWJsZSwgcm93Lm5hbWVzPUZBTFNFLCBxdW90ZT1GQUxTRSkKCiMjTGltaXQgbGlzdCB0byBnZW5lcyB3aXRoIGFuIGFkanVzdGVkIHAgdmFsdWUgPCAwLjA1Ck1fTFBTLk1fTFAuc2lnR2VuZXMgPC0gTV9MUFMuTV9MUC50b3BUYWJbTV9MUFMuTV9MUC50b3BUYWIkYWRqLlAuVmFsIDwgMC4wNSwgXQpsZW5ndGgoTV9MUFMuTV9MUC5zaWdHZW5lcyRJRCkKIyNbMV0gMTQ3MwoKIyNGaWx0ZXIgb3V0IHJvd3Mgd2l0aCBsZXNzIHRoYW4gMi1mb2xkIGNoYW5nZSAobG9nMiBmb2xkIGNoYW5nZSBvZiA+IDEpCk1fTFBTLk1fTFAuc2lnR2VuZXNGb2xkMSA8LSBzdWJzZXQoTV9MUFMuTV9MUC5zaWdHZW5lcywgYWJzKGxvZ0ZDKSA+IDEpCmxlbmd0aChNX0xQUy5NX0xQLnNpZ0dlbmVzRm9sZDEkSUQpCiMjWzFdIDQ2NwoKIyNGaWx0ZXIgb3V0IHJvd3Mgd2l0aCBsZXNzIHRoYW4gNC1mb2xkIGNoYW5nZSAobG9nMiBmb2xkIGNoYW5nZSBvZiA+IDIpCk1fTFBTLk1fTFAuc2lnR2VuZXNGb2xkMiA8LSBzdWJzZXQoTV9MUFMuTV9MUC5zaWdHZW5lcywgYWJzKGxvZ0ZDKSA+IDIpCmxlbmd0aChNX0xQUy5NX0xQLnNpZ0dlbmVzRm9sZDIkSUQpCiMjWzFdIDEyNQoKIyNNYWtlIGFuIE1BIHBsb3QKc2VsIDwtIE1fTFBTLk1fTFAudG9wVGFiJGFkai5QLlZhbCA8IDAuMDUKdG9wIDwtIE1fTFBTLk1fTFAudG9wVGFiCnN1YiA8LSBwYXN0ZSgiTm8uIG9mIHNpZy4gZ2VuZXM6ICIsIHN1bShzZWwpLCAiLyIsIGxlbmd0aChzZWwpKQpjcG0gPC0gdiRFCgpwbG90KHJvd01lYW5zKGNwbVt0b3AkSUQsXSksIHRvcCRsb2dGQywgcGNoPTE2LCBjZXg9MC41LCBjb2w9ImRhcmtncmV5IiwKICAgICBtYWluPSJNX0xQU3ZNX0xQIGFkanVzdGVkIiwKICAgICB5bGFiPSJsb2cgRkMiLCB4bGFiPSJBdmVyYWdlIEV4cHJlc3Npb24iLAogICAgIHN1Yj1zdWIpCnBvaW50cyhyb3dNZWFucyhjcG1bdG9wJElELCBdKVtzZWxdLCB0b3AkbG9nRkNbc2VsXSwgY29sPSJyZWQiLCBjZXg9MC41KQphYmxpbmUoaD1jKC0xLCAwLCAxKSwgY29sPSJyZWQiKQoKZGV2LmNvcHkocGRmLCAiaW1hZ2VzL01BcGxvdF9NX0xQU3ZNX0xQX0NEU19saW1tYWJhdGNoY29ycmVjdGlvbl8yMDE3MTEyMHJldi5wZGYiLCB3aWR0aD04LCBoZWlnaHQ9OCkKZGV2Lm9mZigpCmRldi5jb3B5KHBuZywgImltYWdlcy9NQXBsb3RfTV9MUFN2TV9MUF9DRFNfbGltbWFiYXRjaGNvcnJlY3Rpb25fMjAxNzExMjByZXYucG5nIiwgd2lkdGg9NzAwLAogICAgICAgICBoZWlnaHQ9NzAwKQpkZXYub2ZmKCkKCk1fTFBTLk1fTFAuc2lnR2VuZXMgPC0gTV9MUFMuTV9MUC5zaWdHZW5lc1tvcmRlcigtTV9MUFMuTV9MUC5zaWdHZW5lcyRsb2dGQyksIF0KCiMjQW5ub3RhdGUgc2lnR2VuZXMgbGlzdCB1c2luZyBCaW9tYXJ0CnNpZ0dlbmVzIDwtIE1fTFBTLk1fTFAuc2lnR2VuZXMKaWRzIDwtIHNpZ0dlbmVzJElECgojI1RvIHNlZSBwb3NzaWJpbGl0aWVzIGZvciBhdHRyaWJ1dGVzLCB1c2UgaGVhZChsaXN0QXR0cmlidXRlcyhlbnNlbWJsKSwgbj0yMEwpCmRlc2MgPC0gZ2V0Qk0oYXR0cmlidXRlcz1jKCJlbnNlbWJsX2dlbmVfaWQiLCAiaGduY19zeW1ib2wiLCAiZGVzY3JpcHRpb24iLCAiZ2VuZV9iaW90eXBlIiksCiAgICAgICAgICAgICAgZmlsdGVycz0iZW5zZW1ibF9nZW5lX2lkIiwKICAgICAgICAgICAgICB2YWx1ZXM9aWRzLCBtYXJ0PWVuc2VtYmwpCmNvbG5hbWVzKGRlc2MpPWMoIklEIiwgIlN5bWJvbCIsICJEZXNjcmlwdGlvbiIsICJUeXBlIikKCiMjUmVtb3ZlIGNvbW1hcyBmcm9tIGRlc2NyaXB0aW9uCmRlc2MkRGVzY3JpcHRpb24gPC0gZ3N1YigiLCIsICIiLCBkZXNjJERlc2NyaXB0aW9uKQoKREVHIDwtIG1lcmdlKHNpZ0dlbmVzLCBkZXNjLCBieT0iSUQiLCBhbGw9VFJVRSkKREVHIDwtIHN1YnNldChERUcsIHNlbGVjdD1jKElELCBTeW1ib2wsIERlc2NyaXB0aW9uLCBsb2dGQywgYWRqLlAuVmFsLCBBdmVFeHByLCBUeXBlKSwgRlM9Ii90IikKREVHIDwtIERFR1tvcmRlcigtREVHJGxvZ0ZDKSwgXQoKIyNGaWx0ZXIgb3V0IEdlbmVzIC0xPEZDPDEKREVHIDwtIHN1YnNldChERUcsIGFicyhERUckbG9nRkMpID4gMSkKCiMjU2F2ZSBERSBnZW5lcwp3cml0ZS50YWJsZShERUcsICJjc3YvREVHX01fTFBTdk1fTFBfQ0RTX2xpbW1hYmF0Y2hjb3JyZWN0aW9uXzIwMTcxMTIwcmV2LnR4dCIsCiAgICAgICAgICAgIGNvbC5uYW1lcz1UUlVFLCByb3cubmFtZXM9RkFMU0UsIHF1b3RlPUZBTFNFKQp3cml0ZS5jc3YoREVHLCAiY3N2L0RFR19NX0xQU3ZNX0xQX0NEU19saW1tYWJhdGNoY29ycmVjdGlvbl8yMDE3MTEyMHJldi5jc3YiLAogICAgICAgICAgcm93Lm5hbWVzPUZBTFNFLCBxdW90ZT1GQUxTRSkKYGBgCgojIyBNX0xQIHYgTV9OUwoKYGBge3J9CiMjZUJheWVzIGZpbmRzIGFuIEYtc3RhdGlzdGljIGZyb20gdGhlIHNldCBvZiB0LXN0YXRpc3RpY3MgZm9yIHRoYXQgZ2VuZQpNX0xQLk1fTlMuY29udHIubWF0IDwtIG1ha2VDb250cmFzdHMoTV9MUHZNX05TPShjb25kTV9MUC1jb25kTV9OUyksIGxldmVscz12JGRlc2lnbikKTV9MUC5NX05TLmZpdCA8LSBjb250cmFzdHMuZml0KGZpdCwgTV9MUC5NX05TLmNvbnRyLm1hdCkKTV9MUC5NX05TLmViIDwtIGVCYXllcyhNX0xQLk1fTlMuZml0KQpNX0xQLk1fTlMudG9wVGFiIDwtIHRvcFRhYmxlKE1fTFAuTV9OUy5lYiwgY29lZj0iTV9MUHZNX05TIiwgbnVtYmVyPW5yb3codiRFKSkKTV9MUC5NX05TLnRvcFRhYiA8LSBjYmluZChyb3duYW1lcyhNX0xQLk1fTlMudG9wVGFiKSwgTV9MUC5NX05TLnRvcFRhYikKY29sbmFtZXMoTV9MUC5NX05TLnRvcFRhYikgPC0gYygiSUQiLCAibG9nRkMiLCAiQXZlRXhwciIsICJ0IiwgIlAuVmFsdWUiLCAiYWRqLlAuVmFsIiwgIkIiKQpyb3duYW1lcyhNX0xQLk1fTlMudG9wVGFiKSA8LSBjKDE6bnJvdyhNX0xQLk1fTlMudG9wVGFiKSkKCmxwX25zX3RhYmxlIDwtICJjc3YvdG9wVGFiX01fTFB2TV9OU19DRFNfbGltbWFiYXRjaGNvcnJlY3Rpb25fMjAxNzEwMTguY3N2Igp3cml0ZS5jc3YoTV9MUC5NX05TLnRvcFRhYiwgZmlsZT1scF9uc190YWJsZSwgcm93Lm5hbWVzPUZBTFNFLCBxdW90ZT1GQUxTRSkKCiMjTGltaXQgbGlzdCB0byBnZW5lcyB3aXRoIGFuIGFkanVzdGVkIHAgdmFsdWUgPCAwLjA1Ck1fTFAuTV9OUy5zaWdHZW5lcyA8LSBNX0xQLk1fTlMudG9wVGFiW01fTFAuTV9OUy50b3BUYWIkYWRqLlAuVmFsIDwgMC4wNSwgXQpsZW5ndGgoTV9MUC5NX05TLnNpZ0dlbmVzJElEKQojI1sxXSA0Mzg2CgojI0ZpbHRlciBvdXQgcm93cyB3aXRoIGxlc3MgdGhhbiAyLWZvbGQgY2hhbmdlIChsb2cyIGZvbGQgY2hhbmdlIG9mID4gMSkKTV9MUC5NX05TLnNpZ0dlbmVzRm9sZDEgPC0gc3Vic2V0KE1fTFAuTV9OUy5zaWdHZW5lcywgYWJzKGxvZ0ZDKSA+IDEpCmxlbmd0aChNX0xQLk1fTlMuc2lnR2VuZXNGb2xkMSRJRCkKIyNbMV0gMTQ1NQoKIyNGaWx0ZXIgb3V0IHJvd3Mgd2l0aCBsZXNzIHRoYW4gNC1mb2xkIGNoYW5nZSAobG9nMiBmb2xkIGNoYW5nZSBvZiA+IDIpCk1fTFAuTV9OUy5zaWdHZW5lc0ZvbGQyIDwtIHN1YnNldChNX0xQLk1fTlMuc2lnR2VuZXMsIGFicyhsb2dGQykgPiAyKQpsZW5ndGgoTV9MUC5NX05TLnNpZ0dlbmVzRm9sZDIkSUQpCiMjWzFdIDUxOQoKIyNNYWtlIGFuIE1BIHBsb3QKc2VsIDwtIE1fTFAuTV9OUy50b3BUYWIkYWRqLlAuVmFsIDwgMC4wNQp0b3AgPC0gTV9MUC5NX05TLnRvcFRhYgpzdWIgPC0gcGFzdGUoIk5vLiBvZiBzaWcuIGdlbmVzOiAiLCBzdW0oc2VsKSwgIi8iLCBsZW5ndGgoc2VsKSkKY3BtIDwtIHYkRQoKcGxvdChyb3dNZWFucyhjcG1bdG9wJElELF0pLCB0b3AkbG9nRkMsIHBjaD0xNiwgY2V4PTAuNSwgY29sPSJkYXJrZ3JleSIsCiAgICAgbWFpbj0iTV9MUHZNX05TIGFkanVzdGVkIiwKICAgICB5bGFiPSJsb2cgRkMiLCB4bGFiPSJBdmVyYWdlIEV4cHJlc3Npb24iLAogICAgIHN1Yj1zdWIpCnBvaW50cyhyb3dNZWFucyhjcG1bdG9wJElELF0pW3NlbF0sIHRvcCRsb2dGQ1tzZWxdLCBjb2w9InJlZCIsIGNleD0wLjUpCmFibGluZShoPWMoLTEsIDAsIDEpLCBjb2w9InJlZCIpCgpkZXYuY29weShwZGYsICJpbWFnZXMvTUFwbG90X01fTFB2TV9OU19DRFNfbGltbWFiYXRjaGNvcnJlY3Rpb25fMjAxNzEwMTgucGRmIiwgd2lkdGg9OCwgaGVpZ2h0PTgpCmRldi5vZmYoKQpkZXYuY29weShwbmcsICJpbWFnZXMvTUFwbG90X01fTFB2TV9OU19DRFNfbGltbWFiYXRjaGNvcnJlY3Rpb25fMjAxNzEwMTgucG5nIiwgd2lkdGg9NzAwLCBoZWlnaHQ9NzAwKQpkZXYub2ZmKCkKCk1fTFAuTV9OUy5zaWdHZW5lcyA8LSBNX0xQLk1fTlMuc2lnR2VuZXNbb3JkZXIoLU1fTFAuTV9OUy5zaWdHZW5lcyRsb2dGQyksIF0KCiMjQW5ub3RhdGUgc2lnR2VuZXMgbGlzdCB1c2luZyBCaW9tYXJ0CnNpZ0dlbmVzIDwtIE1fTFAuTV9OUy5zaWdHZW5lcwppZHMgPC0gc2lnR2VuZXMkSUQKCiMjVG8gc2VlIHBvc3NpYmlsaXRpZXMgZm9yIGF0dHJpYnV0ZXMsIHVzZSBoZWFkKGxpc3RBdHRyaWJ1dGVzKGVuc2VtYmwpLCBuPTIwTCkKZGVzYyA8LSBnZXRCTShhdHRyaWJ1dGVzPWMoImVuc2VtYmxfZ2VuZV9pZCIsICJoZ25jX3N5bWJvbCIsICJkZXNjcmlwdGlvbiIsICJnZW5lX2Jpb3R5cGUiKSwKICAgICAgICAgICAgICBmaWx0ZXJzPSJlbnNlbWJsX2dlbmVfaWQiLAogICAgICAgICAgICAgIHZhbHVlcz1pZHMsIG1hcnQ9ZW5zZW1ibCkKY29sbmFtZXMoZGVzYyk9YygiSUQiLCAiU3ltYm9sIiwgIkRlc2NyaXB0aW9uIiwgIlR5cGUiKQoKIyNSZW1vdmUgY29tbWFzIGZyb20gZGVzY3JpcHRpb24KZGVzYyREZXNjcmlwdGlvbiA8LSBnc3ViKCIsIiwgIiIsIGRlc2MkRGVzY3JpcHRpb24pCgpERUdfTFA0IDwtIG1lcmdlKHNpZ0dlbmVzLCBkZXNjLCBieT0iSUQiLCBhbGw9VFJVRSkKREVHX0xQNCA8LSBzdWJzZXQoREVHX0xQNCwgc2VsZWN0PWMoSUQsIFN5bWJvbCwgRGVzY3JpcHRpb24sIGxvZ0ZDLCBhZGouUC5WYWwsIEF2ZUV4cHIsIFR5cGUpLAogICAgICAgICAgICAgICAgICBGUz0iL3QiKQpERUdfTFA0IDwtIERFR19MUDRbb3JkZXIoLURFR19MUDQkbG9nRkMpLCBdCgojI0ZpbHRlciBvdXQgR2VuZXMgLTE8RkM8MQpERUdfTFA0IDwtIHN1YnNldChERUdfTFA0LCBhYnMoREVHX0xQNCRsb2dGQykgPiAxKQoKIyNTYXZlIERFIGdlbmVzCndyaXRlLnRhYmxlKERFR19MUDQsICJjc3YvREVHX01fTFB2TV9OU19DRFNfbGltbWFiYXRjaGNvcnJlY3Rpb25fMjAxNzEwMTgudHh0IiwKICAgICAgICAgICAgY29sLm5hbWVzPVRSVUUsIHJvdy5uYW1lcz1GQUxTRSwgcXVvdGU9RkFMU0UpCndyaXRlLmNzdihERUdfTFA0LCAiY3N2L0RFR19NX0xQdk1fTlNfQ0RTX2xpbW1hYmF0Y2hjb3JyZWN0aW9uXzIwMTcxMDE4LmNzdiIsCiAgICAgICAgICByb3cubmFtZXM9RkFMU0UsIHF1b3RlPUZBTFNFKQpgYGAKCiMjIE1fTEEgdiBNX05TCgpgYGB7cn0KI2VCYXllcyBmaW5kcyBhbiBGLXN0YXRpc3RpYyBmcm9tIHRoZSBzZXQgb2YgdC1zdGF0aXN0aWNzIGZvciB0aGF0IGdlbmUKTV9MQS5NX05TLmNvbnRyLm1hdCA8LSBtYWtlQ29udHJhc3RzKE1fTEF2TV9OUz0oY29uZE1fTEEtY29uZE1fTlMpLCBsZXZlbHM9diRkZXNpZ24pCk1fTEEuTV9OUy5maXQgPC0gY29udHJhc3RzLmZpdChmaXQsIE1fTEEuTV9OUy5jb250ci5tYXQpCk1fTEEuTV9OUy5lYiA8LSBlQmF5ZXMoTV9MQS5NX05TLmZpdCkKTV9MQS5NX05TLnRvcFRhYiA8LSB0b3BUYWJsZShNX0xBLk1fTlMuZWIsIGNvZWY9Ik1fTEF2TV9OUyIsIG51bWJlcj1ucm93KHYkRSkpCk1fTEEuTV9OUy50b3BUYWIgPC0gY2JpbmQocm93bmFtZXMoTV9MQS5NX05TLnRvcFRhYiksIE1fTEEuTV9OUy50b3BUYWIpCmNvbG5hbWVzKE1fTEEuTV9OUy50b3BUYWIpIDwtIGMoIklEIiwgImxvZ0ZDIiwgIkF2ZUV4cHIiLCAidCIsICJQLlZhbHVlIiwgImFkai5QLlZhbCIsICJCIikKcm93bmFtZXMoTV9MQS5NX05TLnRvcFRhYikgPC0gYygxOm5yb3coTV9MQS5NX05TLnRvcFRhYikpCgpsYV9uc190YWJsZSA8LSAiY3N2L3RvcFRhYl9NX0xBdk1fTlNfQ0RTX2xpbW1hYmF0Y2hjb3JyZWN0aW9uXzIwMTcxMTIwLmNzdiIKd3JpdGUuY3N2KE1fTEEuTV9OUy50b3BUYWIsIGZpbGU9bGFfbnNfdGFibGUsIHJvdy5uYW1lcz1GQUxTRSwgcXVvdGU9RkFMU0UpCgojI0xpbWl0IGxpc3QgdG8gZ2VuZXMgd2l0aCBhbiBhZGp1c3RlZCBwIHZhbHVlIDwgMC4wNQpNX0xBLk1fTlMuc2lnR2VuZXMgPC0gTV9MQS5NX05TLnRvcFRhYltNX0xBLk1fTlMudG9wVGFiJGFkai5QLlZhbCA8IDAuMDUsIF0KbGVuZ3RoKE1fTEEuTV9OUy5zaWdHZW5lcyRJRCkKIyNbMV0gNjE3CgojI0ZpbHRlciBvdXQgcm93cyB3aXRoIGxlc3MgdGhhbiAyLWZvbGQgY2hhbmdlIChsb2cyIGZvbGQgY2hhbmdlIG9mID4gMSkKTV9MQS5NX05TLnNpZ0dlbmVzRm9sZDEgPC0gc3Vic2V0KE1fTEEuTV9OUy5zaWdHZW5lcywgYWJzKGxvZ0ZDKSA+IDEpCmxlbmd0aChNX0xBLk1fTlMuc2lnR2VuZXNGb2xkMSRJRCkKIyNbMV0gMjQwCgojI0ZpbHRlciBvdXQgcm93cyB3aXRoIGxlc3MgdGhhbiA0LWZvbGQgY2hhbmdlIChsb2cyIGZvbGQgY2hhbmdlIG9mID4gMikKTV9MQS5NX05TLnNpZ0dlbmVzRm9sZDIgPC0gc3Vic2V0KE1fTEEuTV9OUy5zaWdHZW5lcywgYWJzKGxvZ0ZDKSA+IDIpCmxlbmd0aChNX0xBLk1fTlMuc2lnR2VuZXNGb2xkMiRJRCkKIyNbMV0gNjkKCiMjTWFrZSBhbiBNQSBwbG90CnNlbCA8LSBNX0xBLk1fTlMudG9wVGFiJGFkai5QLlZhbCA8IDAuMDUKdG9wIDwtIE1fTEEuTV9OUy50b3BUYWIKc3ViIDwtIHBhc3RlKCJOby4gb2Ygc2lnLiBnZW5lczogIiwgc3VtKHNlbCksICIvIiwgbGVuZ3RoKHNlbCkpCmNwbSA8LSB2JEUKCnBsb3Qocm93TWVhbnMoY3BtW3RvcCRJRCxdKSwgdG9wJGxvZ0ZDLCBwY2g9MTYsIGNleD0wLjUsIGNvbD0iZGFya2dyZXkiLAogICAgIG1haW49Ik1fTEF2TV9OUyBhZGp1c3RlZCIsCiAgICAgeWxhYj0ibG9nIEZDIiwgeGxhYj0iQXZlcmFnZSBFeHByZXNzaW9uIiwKICAgICBzdWI9c3ViKQpwb2ludHMocm93TWVhbnMoY3BtW3RvcCRJRCwgXSlbc2VsXSwgdG9wJGxvZ0ZDW3NlbF0sIGNvbD0icmVkIiwgY2V4PTAuNSkKYWJsaW5lKGg9YygtMSwgMCwgMSksIGNvbD0icmVkIikKCmRldi5jb3B5KHBkZiwgImltYWdlcy9NQXBsb3RfTV9MQXZNX05TX0NEU19saW1tYWJhdGNoY29ycmVjdGlvbl8yMDE3MTEyMC5wZGYiLCB3aWR0aD04LCBoZWlnaHQ9OCkKZGV2Lm9mZigpCmRldi5jb3B5KHBuZywgImltYWdlcy9NQXBsb3RfTV9MQXZNX05TX0NEU19saW1tYWJhdGNoY29ycmVjdGlvbl8yMDE3MTEyMC5wbmciLCB3aWR0aD03MDAsIGhlaWdodD03MDApCmRldi5vZmYoKQoKTV9MQS5NX05TLnNpZ0dlbmVzIDwtIE1fTEEuTV9OUy5zaWdHZW5lc1tvcmRlcigtTV9MQS5NX05TLnNpZ0dlbmVzJGxvZ0ZDKSwgXQoKIyNBbm5vdGF0ZSBzaWdHZW5lcyBsaXN0IHVzaW5nIEJpb21hcnQKc2lnR2VuZXMgPC0gTV9MQS5NX05TLnNpZ0dlbmVzCmlkcyA8LSBzaWdHZW5lcyRJRAoKIyNUbyBzZWUgcG9zc2liaWxpdGllcyBmb3IgYXR0cmlidXRlcywgdXNlIGhlYWQobGlzdEF0dHJpYnV0ZXMoZW5zZW1ibCksIG49MjBMKQpkZXNjIDwtIGdldEJNKGF0dHJpYnV0ZXM9YygiZW5zZW1ibF9nZW5lX2lkIiwgImhnbmNfc3ltYm9sIiwgImRlc2NyaXB0aW9uIiwgImdlbmVfYmlvdHlwZSIpLAogICAgICAgICAgICAgIGZpbHRlcnM9ImVuc2VtYmxfZ2VuZV9pZCIsCiAgICAgICAgICAgICAgdmFsdWVzPWlkcywgbWFydD1lbnNlbWJsKQpjb2xuYW1lcyhkZXNjKT1jKCJJRCIsICJTeW1ib2wiLCAiRGVzY3JpcHRpb24iLCAiVHlwZSIpCgojI1JlbW92ZSBjb21tYXMgZnJvbSBkZXNjcmlwdGlvbgpkZXNjJERlc2NyaXB0aW9uIDwtIGdzdWIoIiwiLCAiIiwgZGVzYyREZXNjcmlwdGlvbikKCkRFR19MQTQgPC0gbWVyZ2Uoc2lnR2VuZXMsIGRlc2MsIGJ5PSJJRCIsIGFsbD1UUlVFKQpERUdfTEE0IDwtIHN1YnNldChERUdfTEE0LCBzZWxlY3Q9YyhJRCwgU3ltYm9sLCBEZXNjcmlwdGlvbiwgbG9nRkMsIGFkai5QLlZhbCwgQXZlRXhwciwgVHlwZSksCiAgICAgICAgICAgICAgICAgIEZTPSIvdCIpCkRFR19MQTQgPC0gREVHX0xBNFtvcmRlcigtREVHX0xBNCRsb2dGQyksIF0KCiMjRmlsdGVyIG91dCBHZW5lcyAtMTxGQzwxCkRFR19MQTQgPC0gc3Vic2V0KERFR19MQTQsIGFicyhERUdfTEE0JGxvZ0ZDKSA+IDEpCgojI1NhdmUgREUgZ2VuZXMKd3JpdGUudGFibGUoREVHX0xBNCwgImNzdi9ERUdfTV9MQXZNX05TX0NEU19saW1tYWJhdGNoY29ycmVjdGlvbl8yMDE3MTEyMC50eHQiLAogICAgICAgICAgICBjb2wubmFtZXM9VFJVRSwgcm93Lm5hbWVzPUZBTFNFLCBxdW90ZT1GQUxTRSkKd3JpdGUuY3N2KERFR19MQTQsICJjc3YvREVHX01fTEF2TV9OU19DRFNfbGltbWFiYXRjaGNvcnJlY3Rpb25fMjAxNzExMjAuY3N2IiwKICAgICAgICAgIHJvdy5uYW1lcz1GQUxTRSwgcXVvdGU9RkFMU0UpCmBgYAoKIyMgR01fTFBTIHYuIEdNX05TCgpgYGB7cn0KI2VCYXllcyBmaW5kcyBhbiBGLXN0YXRpc3RpYyBmcm9tIHRoZSBzZXQgb2YgdC1zdGF0aXN0aWNzIGZvciB0aGF0IGdlbmUKR01fTFBTLkdNX05TLmNvbnRyLm1hdCA8LSBtYWtlQ29udHJhc3RzKEdNX0xQU3ZHTV9OUz0oY29uZEdNX0xQUy1jb25kR01fTlMpLCBsZXZlbHM9diRkZXNpZ24pCkdNX0xQUy5HTV9OUy5maXQgPC0gY29udHJhc3RzLmZpdChmaXQsIEdNX0xQUy5HTV9OUy5jb250ci5tYXQpCkdNX0xQUy5HTV9OUy5lYiA8LSBlQmF5ZXMoR01fTFBTLkdNX05TLmZpdCkKR01fTFBTLkdNX05TLnRvcFRhYiA8LSB0b3BUYWJsZShHTV9MUFMuR01fTlMuZWIsIGNvZWY9IkdNX0xQU3ZHTV9OUyIsIG51bWJlcj1ucm93KHYkRSkpCkdNX0xQUy5HTV9OUy50b3BUYWIgPC0gY2JpbmQocm93bmFtZXMoR01fTFBTLkdNX05TLnRvcFRhYiksIEdNX0xQUy5HTV9OUy50b3BUYWIpCmNvbG5hbWVzKEdNX0xQUy5HTV9OUy50b3BUYWIpIDwtIGMoIklEIiwgImxvZ0ZDIiwgIkF2ZUV4cHIiLCAidCIsICJQLlZhbHVlIiwgImFkai5QLlZhbCIsICJCIikKcm93bmFtZXMoR01fTFBTLkdNX05TLnRvcFRhYikgPC0gYygxOm5yb3coR01fTFBTLkdNX05TLnRvcFRhYikpCgpnbV9scHNfbnNfdGFibGUgPC0gImNzdi90b3BUYWJfR01fTFBTdkdNX05TX0NEU19saW1tYWJhdGNoY29ycmVjdGlvbl8yMDE3MTEyMC5jc3YiCndyaXRlLmNzdihHTV9MUFMuR01fTlMudG9wVGFiLCBmaWxlPSBnbV9scHNfbnNfdGFibGUsIHJvdy5uYW1lcz1GQUxTRSwgcXVvdGU9RkFMU0UpCgojI0xpbWl0IGxpc3QgdG8gZ2VuZXMgd2l0aCBhbiBhZGp1c3RlZCBwIHZhbHVlIDwgMC4wNQpHTV9MUFMuR01fTlMuc2lnR2VuZXMgPC0gR01fTFBTLkdNX05TLnRvcFRhYltHTV9MUFMuR01fTlMudG9wVGFiJGFkai5QLlZhbCA8IDAuMDUsIF0KbGVuZ3RoKEdNX0xQUy5HTV9OUy5zaWdHZW5lcyRJRCkKIyNbMV0gMzAyCgojI0ZpbHRlciBvdXQgcm93cyB3aXRoIGxlc3MgdGhhbiAyLWZvbGQgY2hhbmdlIChsb2cyIGZvbGQgY2hhbmdlIG9mID4gMSkKR01fTFBTLkdNX05TLnNpZ0dlbmVzRm9sZDEgPC0gc3Vic2V0KEdNX0xQUy5HTV9OUy5zaWdHZW5lcywgYWJzKGxvZ0ZDKSA+IDEpCmxlbmd0aChHTV9MUFMuR01fTlMuc2lnR2VuZXNGb2xkMSRJRCkKIyNbMV0gMTk3CgojI0ZpbHRlciBvdXQgcm93cyB3aXRoIGxlc3MgdGhhbiA0LWZvbGQgY2hhbmdlIChsb2cyIGZvbGQgY2hhbmdlIG9mID4gMikKR01fTFBTLkdNX05TLnNpZ0dlbmVzRm9sZDIgPC0gc3Vic2V0KEdNX0xQUy5HTV9OUy5zaWdHZW5lcywgYWJzKGxvZ0ZDKSA+IDIpCmxlbmd0aChHTV9MUFMuR01fTlMuc2lnR2VuZXNGb2xkMiRJRCkKIyNbMV0gMTAxCgojI01ha2UgYW4gTUEgcGxvdApzZWwgPC0gR01fTFBTLkdNX05TLnRvcFRhYiRhZGouUC5WYWwgPCAwLjA1CnRvcCA8LSBHTV9MUFMuR01fTlMudG9wVGFiCnN1YiA8LSBwYXN0ZSgiTm8uIG9mIHNpZy4gZ2VuZXM6ICIsIHN1bShzZWwpLCAiLyIsIGxlbmd0aChzZWwpKQpjcG0gPC0gdiRFCgpwbG90KHJvd01lYW5zKGNwbVt0b3AkSUQsXSksIHRvcCRsb2dGQywgcGNoPTE2LCBjZXg9MC41LCBjb2w9ImRhcmtncmV5IiwKICAgICBtYWluPSJHTV9MUFN2R01fTlMgYWRqdXN0ZWQiLAogICAgIHlsYWI9ImxvZyBGQyIsIHhsYWI9IkF2ZXJhZ2UgRXhwcmVzc2lvbiIsCiAgICAgc3ViPXN1YikKcG9pbnRzKHJvd01lYW5zKGNwbVt0b3AkSUQsIF0pW3NlbF0sIHRvcCRsb2dGQ1tzZWxdLCBjb2w9InJlZCIsIGNleD0wLjUpCmFibGluZShoPWMoLTEsIDAsIDEpLCBjb2w9InJlZCIpCgpkZXYuY29weShwZGYsICJpbWFnZXMvTUFwbG90X0dNX0xQU3ZHTV9OU19DRFNfbGltbWFiYXRjaGNvcnJlY3Rpb25fMjAxNzExMjAucGRmIiwgd2lkdGg9OCwgaGVpZ2h0PTgpCmRldi5vZmYoKQpkZXYuY29weShwbmcsICJpbWFnZXMvTUFwbG90X0dNX0xQU3ZHTV9OU19DRFNfbGltbWFiYXRjaGNvcnJlY3Rpb25fMjAxNzExMjAucG5nIiwgd2lkdGg9NzAwLCBoZWlnaHQ9NzAwKQpkZXYub2ZmKCkKCkdNX0xQUy5HTV9OUy5zaWdHZW5lcyA8LSBHTV9MUFMuR01fTlMuc2lnR2VuZXNbb3JkZXIoLUdNX0xQUy5HTV9OUy5zaWdHZW5lcyRsb2dGQyksIF0KCiMjQW5ub3RhdGUgc2lnR2VuZXMgbGlzdCB1c2luZyBCaW9tYXJ0CnNpZ0dlbmVzIDwtIEdNX0xQUy5HTV9OUy5zaWdHZW5lcwppZHMgPC0gc2lnR2VuZXMkSUQKCiMjVG8gc2VlIHBvc3NpYmlsaXRpZXMgZm9yIGF0dHJpYnV0ZXMsIHVzZSBoZWFkKGxpc3RBdHRyaWJ1dGVzKGVuc2VtYmwpLCBuPTIwTCkKZGVzYyA8LSBnZXRCTShhdHRyaWJ1dGVzPWMoImVuc2VtYmxfZ2VuZV9pZCIsICJoZ25jX3N5bWJvbCIsICJkZXNjcmlwdGlvbiIsICJnZW5lX2Jpb3R5cGUiKSwKICAgICAgICAgICAgICBmaWx0ZXJzPSJlbnNlbWJsX2dlbmVfaWQiLAogICAgICAgICAgICAgIHZhbHVlcz1pZHMsIG1hcnQ9ZW5zZW1ibCkKY29sbmFtZXMoZGVzYyk9YygiSUQiLCAiU3ltYm9sIiwgIkRlc2NyaXB0aW9uIiwgIlR5cGUiKQoKIyNSZW1vdmUgY29tbWFzIGZyb20gZGVzY3JpcHRpb24KZGVzYyREZXNjcmlwdGlvbiA8LSBnc3ViKCIsIiwgIiIsIGRlc2MkRGVzY3JpcHRpb24pCgpERUcgPC0gbWVyZ2Uoc2lnR2VuZXMsIGRlc2MsIGJ5PSJJRCIsIGFsbD1UUlVFKQpERUcgPC0gc3Vic2V0KERFRywgc2VsZWN0PWMoSUQsIFN5bWJvbCwgRGVzY3JpcHRpb24sIGxvZ0ZDLCBhZGouUC5WYWwsIEF2ZUV4cHIsIFR5cGUpLCBGUz0iL3QiKQpERUcgPC0gREVHW29yZGVyKC1ERUckbG9nRkMpLCBdCgojI0ZpbHRlciBvdXQgR2VuZXMgLTE8RkM8MQpERUcgPC0gc3Vic2V0KERFRywgYWJzKERFRyRsb2dGQykgPiAxKQoKIyNTYXZlIERFIGdlbmVzCndyaXRlLnRhYmxlKERFRywgImNzdi9ERUdfR01fTFBTdkdNX05TX0NEU19saW1tYWJhdGNoY29ycmVjdGlvbl8yMDE3MTEyMC50eHQiLAogICAgICAgICAgICBjb2wubmFtZXM9VFJVRSwgcm93Lm5hbWVzPUZBTFNFLCBxdW90ZT1GQUxTRSkKd3JpdGUuY3N2KERFRywgImNzdi9ERUdfR01fTFBTdkdNX05TX0NEU19saW1tYWJhdGNoY29ycmVjdGlvbl8yMDE3MTEyMC5jc3YiLAogICAgICAgICAgcm93Lm5hbWVzPUZBTFNFLCBxdW90ZT1GQUxTRSkKYGBgCgojIyBHTV9MUFMgdiBHTV9MUAoKVGhpcyBjb250cmFzdCB3YXMgd3JpdHRlbiBpbiB0aGUgb3Bwb3NpdGUgb3JkZXIgYXMgdGhlIG90aGVycywgSSB0aGluayB0aGlzIGlzCnRoZSByZWFzb24gc29tZSBvZiBteSBwbG90cyBrZWVwIGxvb2tpbmcgYmFja3dhcmRzL3Vwc2lkZWRvd24uLi4gIEkgYW0gZ29pbmcgdG8KY29tbWVudCBvdXQgdGhlIG9yaWdpbmFsIGxpbmUgYW5kIHJld3JpdGUgaXQgc28gdGhhdCBpdCBpcyBpZGVudGljYWwgaW4gb3JkZXIgdG8Kd2hhdCBJIGZvdW5kIGluOiBNX0xQLk1fTFAuY29udHIubWF0LgoKYGBge3J9CiNlQmF5ZXMgZmluZHMgYW4gRi1zdGF0aXN0aWMgZnJvbSB0aGUgc2V0IG9mIHQtc3RhdGlzdGljcyBmb3IgdGhhdCBnZW5lCgojIyBIZXJlIGlzIHRoZSBvcmlnaW5hbCBsaW5lCiMjIGxvb2sgaGVyZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT4gICB2ICAgICAgICAgICAgICAgICAgICAgdgojI0dNX0xQUy5HTV9MUC5jb250ci5tYXQgPC0gbWFrZUNvbnRyYXN0cyhHTV9MUFN2R01fTFA9KChjb25kR01fTFBTLWNvbmRHTV9OUyktKGNvbmRHTV9MUC1jb25kR01fTlMpKSwKIyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzPXYkZGVzaWduKQojIwoKIyMgQW5kIGhlcmUgaXMgbXkgdmVyc2lvbjoKIyMgbG9vayBoZXJlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPiAgdiAgICAgICAgICAgICAgICAgICAgIHYKR01fTFBTLkdNX0xQLmNvbnRyLm1hdCA8LSBtYWtlQ29udHJhc3RzKEdNX0xQU3ZHTV9MUD0oKGNvbmRHTV9MUC1jb25kR01fTlMpLShjb25kR01fTFBTLWNvbmRHTV9OUykpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzPXYkZGVzaWduKQojIyBFbmQgb2YgbXkgY2hhbmdlLgoKR01fTFBTLkdNX0xQLmZpdCA8LSBjb250cmFzdHMuZml0KGZpdCwgR01fTFBTLkdNX0xQLmNvbnRyLm1hdCkKR01fTFBTLkdNX0xQLmViIDwtIGVCYXllcyhHTV9MUFMuR01fTFAuZml0KQpHTV9MUFMuR01fTFAudG9wVGFiIDwtIHRvcFRhYmxlKEdNX0xQUy5HTV9MUC5lYiwgY29lZj0iR01fTFBTdkdNX0xQIiwgbnVtYmVyPW5yb3codiRFKSkKR01fTFBTLkdNX0xQLnRvcFRhYiA8LSBjYmluZChyb3duYW1lcyhHTV9MUFMuR01fTFAudG9wVGFiKSwgR01fTFBTLkdNX0xQLnRvcFRhYikKY29sbmFtZXMoR01fTFBTLkdNX0xQLnRvcFRhYikgPC0gYygiSUQiLCAibG9nRkMiLCAiQXZlRXhwciIsICJ0IiwgIlAuVmFsdWUiLCAiYWRqLlAuVmFsIiwgIkIiKQpyb3duYW1lcyhHTV9MUFMuR01fTFAudG9wVGFiKSA8LSBjKDE6bnJvdyhHTV9MUFMuR01fTFAudG9wVGFiKSkKCmdtX2xwc19scF90YWJsZSA8LSAiY3N2L3RvcFRhYl9HTV9MUFN2R01fTFBfQ0RTX2xpbW1hYmF0Y2hjb3JyZWN0aW9uXzIwMTcxMDIzLmNzdiIKd3JpdGUuY3N2KEdNX0xQUy5HTV9MUC50b3BUYWIsIGZpbGU9Z21fbHBzX2xwX3RhYmxlLCByb3cubmFtZXM9RkFMU0UsIHF1b3RlPUZBTFNFKQoKIyNMaW1pdCBsaXN0IHRvIGdlbmVzIHdpdGggYW4gYWRqdXN0ZWQgcCB2YWx1ZSA8IDAuMDUKR01fTFBTLkdNX0xQLnNpZ0dlbmVzIDwtIEdNX0xQUy5HTV9MUC50b3BUYWJbR01fTFBTLkdNX0xQLnRvcFRhYiRhZGouUC5WYWwgPCAwLjA1LCBdCmxlbmd0aChHTV9MUFMuR01fTFAuc2lnR2VuZXMkSUQpCiMjWzFdIDE5NAoKIyNGaWx0ZXIgb3V0IHJvd3Mgd2l0aCBsZXNzIHRoYW4gMi1mb2xkIGNoYW5nZSAobG9nMiBmb2xkIGNoYW5nZSBvZiA+IDEpCkdNX0xQUy5HTV9MUC5zaWdHZW5lc0ZvbGQxIDwtIHN1YnNldChHTV9MUFMuR01fTFAuc2lnR2VuZXMsIGFicyhsb2dGQykgPiAxKQpsZW5ndGgoR01fTFBTLkdNX0xQLnNpZ0dlbmVzRm9sZDEkSUQpCiMjWzFdIDExNAoKIyNGaWx0ZXIgb3V0IHJvd3Mgd2l0aCBsZXNzIHRoYW4gNC1mb2xkIGNoYW5nZSAobG9nMiBmb2xkIGNoYW5nZSBvZiA+IDIpCkdNX0xQUy5HTV9MUC5zaWdHZW5lc0ZvbGQyIDwtIHN1YnNldChHTV9MUFMuR01fTFAuc2lnR2VuZXMsIGFicyhsb2dGQykgPiAyKQpsZW5ndGgoR01fTFBTLkdNX0xQLnNpZ0dlbmVzRm9sZDIkSUQpCiMjWzFdIDI3CgojI01ha2UgYW4gTUEgcGxvdApzZWwgPC0gR01fTFBTLkdNX0xQLnRvcFRhYiRhZGouUC5WYWwgPCAwLjA1CnRvcCA8LSBHTV9MUFMuR01fTFAudG9wVGFiCnN1YiA8LSBwYXN0ZSgiTm8uIG9mIHNpZy4gZ2VuZXM6ICIsIHN1bShzZWwpLCAiLyIsIGxlbmd0aChzZWwpKQpjcG0gPC0gdiRFCgpwbG90KHJvd01lYW5zKGNwbVt0b3AkSUQsXSksIHRvcCRsb2dGQywgcGNoPTE2LCBjZXg9MC41LCBjb2w9ImRhcmtncmV5IiwKICAgICBtYWluPSJHTV9MUFN2R01fTFAgYWRqdXN0ZWQiLAogICAgIHlsYWI9ImxvZyBGQyIsIHhsYWI9IkF2ZXJhZ2UgRXhwcmVzc2lvbiIsCiAgICAgc3ViPXN1YikKcG9pbnRzKHJvd01lYW5zKGNwbVt0b3AkSUQsIF0pW3NlbF0sIHRvcCRsb2dGQ1tzZWxdLCBjb2w9InJlZCIsIGNleD0wLjUpCmFibGluZShoPWMoLTEsIDAsIDEpLCBjb2w9InJlZCIpCgpkZXYuY29weShwZGYsICJpbWFnZXMvTUFwbG90X0dNX0xQU3ZHTV9MUF9DRFNfbGltbWFiYXRjaGNvcnJlY3Rpb25fMjAxNzExMjAucGRmIiwgd2lkdGg9OCwgaGVpZ2h0PTgpCmRldi5vZmYoKQpkZXYuY29weShwbmcsICJpbWFnZXMvTUFwbG90X0dNX0xQU3ZHTV9MUF9DRFNfbGltbWFiYXRjaGNvcnJlY3Rpb25fMjAxNzExMjAucG5nIiwgd2lkdGg9NzAwLAogICAgICAgICBoZWlnaHQ9NzAwKQpkZXYub2ZmKCkKCkdNX0xQUy5HTV9MUC5zaWdHZW5lcyA8LSBHTV9MUFMuR01fTFAuc2lnR2VuZXNbb3JkZXIoLUdNX0xQUy5HTV9MUC5zaWdHZW5lcyRsb2dGQyksIF0KCiMjQW5ub3RhdGUgc2lnR2VuZXMgbGlzdCB1c2luZyBCaW9tYXJ0CnNpZ0dlbmVzIDwtIEdNX0xQUy5HTV9MUC5zaWdHZW5lcwppZHMgPC0gc2lnR2VuZXMkSUQKCiMjVG8gc2VlIHBvc3NpYmlsaXRpZXMgZm9yIGF0dHJpYnV0ZXMsIHVzZSBoZWFkKGxpc3RBdHRyaWJ1dGVzKGVuc2VtYmwpLCBuPTIwTCkKZGVzYyA8LSBnZXRCTShhdHRyaWJ1dGVzPWMoImVuc2VtYmxfZ2VuZV9pZCIsICJoZ25jX3N5bWJvbCIsICJkZXNjcmlwdGlvbiIsICJnZW5lX2Jpb3R5cGUiKSwKICAgICAgICAgICAgICBmaWx0ZXJzPSJlbnNlbWJsX2dlbmVfaWQiLAogICAgICAgICAgICAgIHZhbHVlcz1pZHMsIG1hcnQ9ZW5zZW1ibCkKY29sbmFtZXMoZGVzYyk9YygiSUQiLCAiU3ltYm9sIiwgIkRlc2NyaXB0aW9uIiwgIlR5cGUiKQoKIyNSZW1vdmUgY29tbWFzIGZyb20gZGVzY3JpcHRpb24KZGVzYyREZXNjcmlwdGlvbiA8LSBnc3ViKCIsIiwgIiIsIGRlc2MkRGVzY3JpcHRpb24pCgpERUcgPC0gbWVyZ2Uoc2lnR2VuZXMsIGRlc2MsIGJ5PSJJRCIsIGFsbD1UUlVFKQpERUcgPC0gc3Vic2V0KERFRywgc2VsZWN0PWMoSUQsIFN5bWJvbCwgRGVzY3JpcHRpb24sIGxvZ0ZDLCBhZGouUC5WYWwsIEF2ZUV4cHIsIFR5cGUpLCBGUz0iL3QiKQpERUcgPC0gREVHW29yZGVyKC1ERUckbG9nRkMpLCBdCgojI0ZpbHRlciBvdXQgR2VuZXMgLTE8RkM8MQpERUcgPC0gc3Vic2V0KERFRywgYWJzKERFRyRsb2dGQykgPiAxKQoKIyNTYXZlIERFIGdlbmVzCndyaXRlLnRhYmxlKERFRywgImNzdi9ERUdfR01fTFBTdkdNX0xQX0NEU19saW1tYWJhdGNoY29ycmVjdGlvbl8yMDE3MTEyMC50eHQiLAogICAgICAgICAgICBjb2wubmFtZXM9VFJVRSwgcm93Lm5hbWVzPUZBTFNFLCBxdW90ZT1GQUxTRSkKd3JpdGUuY3N2KERFRywgImNzdi9ERUdfR01fTFBTdkdNX0xQX0NEU19saW1tYWJhdGNoY29ycmVjdGlvbl8yMDE3MTEyMC5jc3YiLAogICAgICAgICAgcm93Lm5hbWVzPUZBTFNFLCBxdW90ZT1GQUxTRSkKYGBgCgojIyBHTV9MUFMgdiBHTV9MQQoKSSB0aGluayBJIG9ic2VydmUgdGhlIHNhbWUgZmxpcHBpbmcgaGVyZS4KCmBgYHtyfQojZUJheWVzIGZpbmRzIGFuIEYtc3RhdGlzdGljIGZyb20gdGhlIHNldCBvZiB0LXN0YXRpc3RpY3MgZm9yIHRoYXQgZ2VuZQojI0dNX0xQUy5HTV9MQS5jb250ci5tYXQgPC0gbWFrZUNvbnRyYXN0cyhHTV9MUFN2R01fTEE9KChjb25kR01fTFBTLWNvbmRHTV9OUyktKGNvbmRHTV9MQS1jb25kR01fTlMpKSwKIyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzPXYkZGVzaWduKQpHTV9MUFMuR01fTEEuY29udHIubWF0IDwtIG1ha2VDb250cmFzdHMoR01fTFBTdkdNX0xBPSgoY29uZEdNX0xBLWNvbmRHTV9OUyktKGNvbmRHTV9MUFMtY29uZEdNX05TKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHM9diRkZXNpZ24pCiMjIEVuZCBvZiBteSBjaGFuZ2UKR01fTFBTLkdNX0xBLmZpdCA8LSBjb250cmFzdHMuZml0KGZpdCwgR01fTFBTLkdNX0xBLmNvbnRyLm1hdCkKR01fTFBTLkdNX0xBLmViIDwtIGVCYXllcyhHTV9MUFMuR01fTEEuZml0KQpHTV9MUFMuR01fTEEudG9wVGFiIDwtIHRvcFRhYmxlKEdNX0xQUy5HTV9MQS5lYiwgY29lZj0iR01fTFBTdkdNX0xBIiwgbnVtYmVyPW5yb3codiRFKSkKR01fTFBTLkdNX0xBLnRvcFRhYiA8LSBjYmluZChyb3duYW1lcyhHTV9MUFMuR01fTEEudG9wVGFiKSwgR01fTFBTLkdNX0xBLnRvcFRhYikKY29sbmFtZXMoR01fTFBTLkdNX0xBLnRvcFRhYikgPC0gYygiSUQiLCAibG9nRkMiLCAiQXZlRXhwciIsICJ0IiwgIlAuVmFsdWUiLCAiYWRqLlAuVmFsIiwgIkIiKQpyb3duYW1lcyhHTV9MUFMuR01fTEEudG9wVGFiKSA8LSBjKDE6bnJvdyhHTV9MUFMuR01fTEEudG9wVGFiKSkKCmdtX2xwc19sYV90YWJsZSA8LSAiY3N2L3RvcFRhYl9HTV9MUFN2R01fTEFfQ0RTX2xpbW1hYmF0Y2hjb3JyZWN0aW9uXzIwMTcxMDIzLmNzdiIKd3JpdGUuY3N2KEdNX0xQUy5HTV9MQS50b3BUYWIsIGZpbGU9Z21fbHBzX2xhX3RhYmxlLCByb3cubmFtZXM9RkFMU0UsIHF1b3RlPUZBTFNFKQoKIyNMaW1pdCBsaXN0IHRvIGdlbmVzIHdpdGggYW4gYWRqdXN0ZWQgcCB2YWx1ZSA8IDAuMDUKR01fTFBTLkdNX0xBLnNpZ0dlbmVzIDwtIEdNX0xQUy5HTV9MQS50b3BUYWJbR01fTFBTLkdNX0xBLnRvcFRhYiRhZGouUC5WYWwgPCAwLjA1LCBdCmxlbmd0aChHTV9MUFMuR01fTEEuc2lnR2VuZXMkSUQpCiMjWzFdIDE3CgojI0ZpbHRlciBvdXQgcm93cyB3aXRoIGxlc3MgdGhhbiAyLWZvbGQgY2hhbmdlIChsb2cyIGZvbGQgY2hhbmdlIG9mID4gMSkKR01fTFBTLkdNX0xBLnNpZ0dlbmVzRm9sZDEgPC0gc3Vic2V0KEdNX0xQUy5HTV9MQS5zaWdHZW5lcywgYWJzKGxvZ0ZDKSA+IDEpCmxlbmd0aChHTV9MUFMuR01fTEEuc2lnR2VuZXNGb2xkMSRJRCkKIyNbMV0gMTUKCiMjRmlsdGVyIG91dCByb3dzIHdpdGggbGVzcyB0aGFuIDQtZm9sZCBjaGFuZ2UgKGxvZzIgZm9sZCBjaGFuZ2Ugb2YgPiAyKQpHTV9MUFMuR01fTEEuc2lnR2VuZXNGb2xkMiA8LSBzdWJzZXQoR01fTFBTLkdNX0xBLnNpZ0dlbmVzLCBhYnMobG9nRkMpID4gMikKbGVuZ3RoKEdNX0xQUy5HTV9MQS5zaWdHZW5lc0ZvbGQyJElEKQojI1sxXSA3CgojI01ha2UgYW4gTUEgcGxvdApzZWwgPC0gR01fTFBTLkdNX0xBLnRvcFRhYiRhZGouUC5WYWwgPCAwLjA1CnRvcCA8LSBHTV9MUFMuR01fTEEudG9wVGFiCnN1YiA8LSBwYXN0ZSgiTm8uIG9mIHNpZy4gZ2VuZXM6ICIsIHN1bShzZWwpLCIvIiwgbGVuZ3RoKHNlbCkpCmNwbSA8LSB2JEUKCnBsb3Qocm93TWVhbnMoY3BtW3RvcCRJRCxdKSwgdG9wJGxvZ0ZDLCBwY2g9MTYsIGNleD0wLjUsIGNvbD0iZGFya2dyZXkiLAogICAgIG1haW49IkdNX0xQU3ZHTV9MQSBhZGp1c3RlZCIsCiAgICAgeWxhYj0ibG9nIEZDIiwgeGxhYj0iQXZlcmFnZSBFeHByZXNzaW9uIiwKICAgICBzdWI9c3ViKQpwb2ludHMocm93TWVhbnMoY3BtW3RvcCRJRCxdKVtzZWxdLCB0b3AkbG9nRkNbc2VsXSwgY29sPSJyZWQiLCBjZXg9MC41KQphYmxpbmUoaD1jKC0xLCAwLCAxKSwgY29sPSJyZWQiKQoKZGV2LmNvcHkocGRmLCAiaW1hZ2VzL01BcGxvdF9HTV9MUFN2R01fTEFfQ0RTX2xpbW1hYmF0Y2hjb3JyZWN0aW9uXzIwMTcxMTIwLnBkZiIsIHdpZHRoPTgsIGhlaWdodD04KQpkZXYub2ZmKCkKZGV2LmNvcHkocG5nLCAiaW1hZ2VzL01BcGxvdF9HTV9MUFN2R01fTEFfQ0RTX2xpbW1hYmF0Y2hjb3JyZWN0aW9uXzIwMTcxMTIwLnBuZyIsIHdpZHRoPTcwMCwgaGVpZ2h0PTcwMCkKZGV2Lm9mZigpCgpHTV9MUFMuR01fTEEuc2lnR2VuZXMgPC0gR01fTFBTLkdNX0xBLnNpZ0dlbmVzW29yZGVyKC1HTV9MUFMuR01fTEEuc2lnR2VuZXMkbG9nRkMpLCBdCgojI0Fubm90YXRlIHNpZ0dlbmVzIGxpc3QgdXNpbmcgQmlvbWFydApzaWdHZW5lcyA8LSBHTV9MUFMuR01fTEEuc2lnR2VuZXMKaWRzIDwtIHNpZ0dlbmVzJElECgojI1RvIHNlZSBwb3NzaWJpbGl0aWVzIGZvciBhdHRyaWJ1dGVzLCB1c2UgaGVhZChsaXN0QXR0cmlidXRlcyhlbnNlbWJsKSwgbj0yMEwpCmRlc2MgPC0gZ2V0Qk0oYXR0cmlidXRlcz1jKCJlbnNlbWJsX2dlbmVfaWQiLCAiaGduY19zeW1ib2wiLCAiZGVzY3JpcHRpb24iLCAiZ2VuZV9iaW90eXBlIiksCiAgICAgICAgICAgICAgZmlsdGVycz0iZW5zZW1ibF9nZW5lX2lkIiwKICAgICAgICAgICAgICB2YWx1ZXM9aWRzLCBtYXJ0PWVuc2VtYmwpCmNvbG5hbWVzKGRlc2MpPWMoIklEIiwgIlN5bWJvbCIsICJEZXNjcmlwdGlvbiIsICJUeXBlIikKCiMjUmVtb3ZlIGNvbW1hcyBmcm9tIGRlc2NyaXB0aW9uCmRlc2MkRGVzY3JpcHRpb24gPC0gZ3N1YigiLCIsICIiLCBkZXNjJERlc2NyaXB0aW9uKQoKREVHIDwtIG1lcmdlKHNpZ0dlbmVzLCBkZXNjLCBieT0iSUQiLCBhbGw9VFJVRSkKREVHIDwtIHN1YnNldChERUcsIHNlbGVjdD1jKElELCBTeW1ib2wsIERlc2NyaXB0aW9uLCBsb2dGQywgYWRqLlAuVmFsLCBBdmVFeHByLCBUeXBlKSwgRlM9Ii90IikKREVHIDwtIERFR1tvcmRlcigtREVHJGxvZ0ZDKSwgXQoKIyNGaWx0ZXIgb3V0IEdlbmVzIC0xPEZDPDEKREVHIDwtIHN1YnNldChERUcsIGFicyhERUckbG9nRkMpID4gMSkKCiMjU2F2ZSBERSBnZW5lcwp3cml0ZS50YWJsZShERUcsICJjc3YvREVHX0dNX0xQU3ZHTV9MQV9DRFNfbGltbWFiYXRjaGNvcnJlY3Rpb25fMjAxNzExMjAudHh0IiwKICAgICAgICAgICAgY29sLm5hbWVzPVRSVUUsIHJvdy5uYW1lcz1GQUxTRSwgcXVvdGU9RkFMU0UpCndyaXRlLmNzdihERUcsICJjc3YvREVHX0dNX0xQU3ZHTV9MQV9DRFNfbGltbWFiYXRjaGNvcnJlY3Rpb25fMjAxNzExMjAuY3N2IiwKICAgICAgICAgIHJvdy5uYW1lcz1GQUxTRSwgcXVvdGU9RkFMU0UpCmBgYAoKIyMgQmFycGxvdHMgb2YgRm9sZC1DaGFuZ2VzLCBlLmcuIEZpZ3VyZSAzQy9ECgpJdCBhcHBlYXJzIHRvIG1lIHRoYXQgdGhlc2UgZmlndXJlcyBhcmUgY3JlYXRlZCBieSBtZXJnaW5nIHRoZSBNL0dNIHRhYmxlcyBmb3IKdGhlIExQLUxQUyBhbmQgTEEtTFBTIGNvbnRyYXN0cywgdGFraW5nIHRoZSB0b3AgfjIwIGZvciB0aGUgTSB0YWJsZSwgYW5kCnBsb3R0aW5nIHRoZSBsb2cyRkMgb24gdGhlIGxpbmVhciBzY2FsZS4gIEkgYmVsaWV2ZSBJIGNhbiB0cml2aWFsbHkgbW9kaWZ5IHRoaXMKdG8gYWRkIHRoZSBsb2dGQyAvIHQtc3RhdC4gIFRoZSBjYXZlYXQgd2lsbCBiZSB0aGF0IGRvaW5nIHRoaXMgZ2l2ZXMgbWUgYSBsb2cyCmVycm9yIGJhciwgbm90IGxpbmVhci4uLiAgTXkgaW5jbGluYXRpb24gdGhlcmVmb3JlIGlzIHRvIGp1c3QgcGxvdCB0aGUgbG9nRkMKcmF0aGVyIHRoYW4gY29udmVydCBpdCB0byBsaW5lYXIsIGJ1dCB3aGF0ZXZlci4KCiMjIyBGaWd1cmUgM0MgdG9wLWxlZnQKCkthamFsJ3MgdmFyaWFibGVzIHRvIGNyZWF0ZSB0aGlzIGFyZS4uLgoKMS4gIE1fTFBTLk1fTFAudG9wVGFiCjIuICBHTV9MUFMuR01fTFAudG9wVGFiCgpUaGVzZSB3ZXJlIHBhc3NlZCB0byBiaW9tYXJ0IHRvIGdldCB0aGUgZ2VuZSBuYW1lcyByYXRoZXIgdGhhbiBlbnNlbWJsIElEcy4KSSBhbSBnb2luZyB0byBiZSBsYXp5IGFuZCBqdXN0IGNvcHkvcGFzdGUgS2FqYWwncyBjb2RlIGZvciB0aGVzZSB0YXNrcy4KCkhhdmluZyBkb25lIHRoZSB0b3AtbGVmdCBwaWVjZSBvZiB0aGlzLCBpdCBzZWVtcyB0byBtZSB0aGF0IGlmIHlvdSBhcmUgZ29pbmcgdG8KdGFrZSB0aGUgdG9wIDIwIGdlbmVzIGFuZCBleGNsdWRlIGJhc2VkIG9uIHRoZSBNLUNTRiBhZGp1c3RlZCBwLXZhbHVlLCBwZXJoYXBzCnlvdSBzaG91bGQgYWxzbyBleGNsdWRlIGJhc2VkIG9uIHRoZSBHTS1DU0YgYWRqdXN0ZWQgcC12YWx1ZSwgYnV0IHRoZSB3YXkgdGhpcwp3YXMgZG9uZSwgb25seSB0aGUgTSBpcyB1c2VkLiAgSW4gaXRzIGN1cnJlbnQgc3RhdGUsIEkgYW0gb25seSB1c2luZyB0aGUgTSBhcwpwZXIgdGhlIGZpZ3VyZXMgaW4gdGhlaXIgY3VycmVudCBzdGF0ZS4KCk5vdGUsIHRoYXQgaWYgeW91IHdhbnQgZXJyb3IgYmFycyBmcm9tIHRoZSBzdGFuZGFyZCBlcnJvciwgdGhlbiBpdCBpcyB3YWFhYXkKZWFzaWVyIHRvIHN0YXkgb24gdGhlIGxvZzIgc2NhbGUgcmF0aGVyIHRoYW4gY29udmVydCBiYWNrIHRvIGxpbmVhciBiZWNhdXNlIHRoZQptYXRoIGZvciBjb252ZXJ0aW5nIHRoZSBzdGFuZGFyZCBlcnJvciBiYWNrIHRvIGxpbmVhciBpcyB3ZWlyZC4gIElmIHRoZSB0YWJsZQpoYWQgYSBmZXcgbW9yZSBwYXJhbWV0ZXJzIGluIGl0LCBJIGNvdWxkIGRvIGl0IHdpdGhvdXQgc3RydWdnbGluZywgYnV0IGl0IGRvZXNuJ3QuCgpgYGB7ciBmaWczY190b3BsZWZ0fQp3YW50ZWRfY29sdW1ucyA8LSBjKCJJRCIsICJsb2dGQy54IiwgImxvZ0ZDLnkiLCAidC54IiwgInQueSIsICJTeW1ib2wiKQpyZW5hbWVkX2NvbHVtbnMgPC0gYygiSUQiLCAibV9sb2dmYyIsICJnbV9sb2dmYyIsICJtX3QiLCAiZ21fdCIsICJzeW1ib2wiKQoKZmlnM2NfbHBfZGYgPC0gbWVyZ2UoTV9MUFMuTV9MUC50b3BUYWIsIEdNX0xQUy5HTV9MUC50b3BUYWIsIGJ5PSJJRCIpCmRlc2MgPC0gZ2V0Qk0oYXR0cmlidXRlcz1jKCJlbnNlbWJsX2dlbmVfaWQiLCAiaGduY19zeW1ib2wiLCAiZGVzY3JpcHRpb24iLCAiZ2VuZV9iaW90eXBlIiksCiAgICAgICAgICAgICAgZmlsdGVycz0iZW5zZW1ibF9nZW5lX2lkIiwKICAgICAgICAgICAgICB2YWx1ZXM9ZmlnM2NfbHBfZGZbWyJJRCJdXSwgbWFydD1lbnNlbWJsKQpjb2xuYW1lcyhkZXNjKT1jKCJJRCIsICJTeW1ib2wiLCAiRGVzY3JpcHRpb24iLCAiVHlwZSIpCmZpZzNjX2xwX2RmIDwtIG1lcmdlKGZpZzNjX2xwX2RmLCBkZXNjLCBieT0iSUQiLCBhbGwueD1UUlVFKQoKdGxfb3JkZXJfaWR4IDwtIG9yZGVyKGZpZzNjX2xwX2RmW1sibG9nRkMueCJdXSwgZGVjcmVhc2luZz1UUlVFKQpmaWczY190bF9kZiA8LSBmaWczY19scF9kZlt0bF9vcmRlcl9pZHgsIF0Kc2lnX2lkeCA8LSBmaWczY190bF9kZltbImFkai5QLlZhbC54Il1dIDw9IDAuMDUKZmlnM2NfdGxfZGYgPC0gaGVhZChmaWczY190bF9kZltzaWdfaWR4LCBdLCBuPTI1KQpmaWczY190bF9kZiA8LSBmaWczY190bF9kZlssIHdhbnRlZF9jb2x1bW5zXQpjb2xuYW1lcyhmaWczY190bF9kZikgPC0gcmVuYW1lZF9jb2x1bW5zCnJvd25hbWVzKGZpZzNjX3RsX2RmKSA8LSBmaWczY190bF9kZltbIklEIl1dCmZpZzNjX3RsX2RmW1siSUQiXV0gPC0gTlVMTApmaWczY190bF9kZltbIm1fbGZjZXJyIl1dIDwtIGZpZzNjX3RsX2RmW1sibV9sb2dmYyJdXSAvIGZpZzNjX3RsX2RmW1sibV90Il1dCmZpZzNjX3RsX2RmW1siZ21fbGZjZXJyIl1dIDwtIGZpZzNjX3RsX2RmW1siZ21fbG9nZmMiXV0gLyBmaWczY190bF9kZltbImdtX3QiXV0KCmZpZzNjX3RsX20gPC0gZmlnM2NfdGxfZGZbLCBjKCJtX2xvZ2ZjIiwgInN5bWJvbCIsICJtX2xmY2VyciIpXQpmaWczY190bF9tW1sidHlwZSJdXSA8LSAibSIKY29sbmFtZXMoZmlnM2NfdGxfbSkgPC0gYygibG9nZmMiLCAic3ltYm9sIiwgImxmY2VyciIsICJ0eXBlIikKZmlnM2NfdGxfZ20gPC0gZmlnM2NfdGxfZGZbLCBjKCJnbV9sb2dmYyIsICJzeW1ib2wiLCAiZ21fbGZjZXJyIildCmZpZzNjX3RsX2dtW1sidHlwZSJdXSA8LSAiZ20iCmNvbG5hbWVzKGZpZzNjX3RsX2dtKSA8LSBjKCJsb2dmYyIsICJzeW1ib2wiLCAibGZjZXJyIiwgInR5cGUiKQptZWx0ZWRfZmlnM2NfdGwgPC0gcmJpbmQoZmlnM2NfdGxfbSwgZmlnM2NfdGxfZ20pCm1lbHRlZF9maWczY190bFtbInN5bWJvbCJdXSA8LSBmYWN0b3IobWVsdGVkX2ZpZzNjX3RsW1sic3ltYm9sIl1dLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscz1maWczY190bF9tW1sic3ltYm9sIl1dKQptZWx0ZWRfZmlnM2NfdGxbWyJ0eXBlIl1dIDwtIGZhY3RvcihtZWx0ZWRfZmlnM2NfdGxbWyJ0eXBlIl1dLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHM9YygibSIsICJnbSIpKQoKcCA8LSBnZ3Bsb3QoZGF0YT1tZWx0ZWRfZmlnM2NfdGwsIGFlcyh4PXN5bWJvbCwgeT1sb2dmYywgZmlsbD10eXBlKSkgKwogIGdlb21fYmFyKHN0YXQ9ImlkZW50aXR5IiwgY29sb3I9ImJsYWNrIiwgcG9zaXRpb249cG9zaXRpb25fZG9kZ2UoKSkrCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPWMoImNvcm5mbG93ZXJibHVlIiwgImRhcmtncmV5IikpICsKICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluPWxvZ2ZjIC0gKGxmY2VyciAvIDIpLCB5bWF4PWxvZ2ZjICsgKGxmY2VyciAvIDIpKSwgd2lkdGg9LjIsCiAgICAgICAgICAgICAgICBwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSguOSkpICsKICB0aGVtZV9taW5pbWFsKCkgKwogIHRoZW1lKGF4aXMudGV4dC54PWVsZW1lbnRfdGV4dChhbmdsZT00NSwgaGp1c3Q9MSwgdmp1c3Q9MC41KSkKcApgYGAKCiMjIyBGaWd1cmUgMkEKCkthamFsIHJlc3BvbmRlZCB0byBteSBxdWVyeSBhYm91dCB0aGlzIGZpZ3VyZSwgYW5kIEkgYW0gYSBsaXR0bGUgZW1iYXJyYXNzZWQgdG8Kc2F5IHRoYXQgSSBzaG91bGQgaGF2ZSBzZWVuIHdoYXQgaXQgaXMuICBJdCBzZWVtcyB0byBtZSB0aGF0IGl0IGlzIGEgYml0CnJlZHVuZGFudCB0aG91Z2ggd2l0aCAzYywgYXMgaXQgaXMgcHJlY2lzZWx5IGEgc3Vic2V0IG9mIHRoYXQgZGF0YSwgdGhvdWdoCnNsaWdodGx5IHJlb3JkZXJlZC4KCiMjIyMgRmlndXJlIDJBIExlZnQKCmBgYHtyIGZpZzJhMX0KZmlnMmFfZGYgPC0gTV9MUFMuTV9MUC5zaWdHZW5lcwpvcmRlcl9pZHggPC0gb3JkZXIoZmlnMmFfZGZbWyJsb2dGQyJdXSwgZGVjcmVhc2luZz1GQUxTRSkKZmlnMmFfZGYgPC0gZmlnMmFfZGZbb3JkZXJfaWR4LCBdCnRvcCA8LSBoZWFkKGZpZzJhX2RmLCBuPTEwKQpib3QgPC0gdGFpbChmaWcyYV9kZiwgbj0xMCkKcGxvdHRlZCA8LSByYmluZCh0b3AsIGJvdCkKcm93bmFtZXMocGxvdHRlZCkgPC0gcGxvdHRlZFtbIklEIl1dCmRlc2NfaWR4IDwtIGRlc2NbWyJJRCJdXSAlaW4lIHBsb3R0ZWRbWyJJRCJdXQp0aGlzX2Rlc2MgPC0gZGVzY1tkZXNjX2lkeCwgXQpjdXJyZW50IDwtIHJvd25hbWVzKHBsb3R0ZWQpCnBsb3R0ZWQgPC0gbWVyZ2UodGhpc19kZXNjLCBwbG90dGVkLCBieS54PSJJRCIsIGJ5Lnk9IklEIiwgYWxsPVRSVUUpCnJvd25hbWVzKHBsb3R0ZWQpIDwtIG1ha2UubmFtZXMocGxvdHRlZFtbIklEIl1dLCB1bmlxdWU9VFJVRSkKcGxvdHRlZCA8LSBwbG90dGVkW2N1cnJlbnQsIF0KcGxvdHRlZFtbImxmY2VyciJdXSA8LSBwbG90dGVkW1sibG9nRkMiXV0gLyBwbG90dGVkW1sidCJdXQpwbG90dGVkW1siU3ltYm9sIl1dIDwtIGZhY3RvcihwbG90dGVkW1siU3ltYm9sIl1dLCBsZXZlbHM9cGxvdHRlZFtbIlN5bWJvbCJdXSkKCnAgPC0gZ2dwbG90KGRhdGE9cGxvdHRlZCwgYWVzKHg9U3ltYm9sLCB5PWxvZ0ZDKSkgKwogIGdlb21fYmFyKHN0YXQ9ImlkZW50aXR5IiwgZmlsbD0iIzg5QThERCIsIGNvbG9yPSJibGFjayIsIHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKCkpKwogIGdlb21fZXJyb3JiYXIoYWVzKHltaW49bG9nRkMgLSAobGZjZXJyIC8gMiksIHltYXg9bG9nRkMgKyAobGZjZXJyIC8gMikpLCB3aWR0aD0wLjIsCiAgICAgICAgICAgICAgICBwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSgwLjkpKSArCiAgY29vcmRfZmxpcCgpICsKICB0aGVtZV9taW5pbWFsKCkgKwogIHRoZW1lKGF4aXMudGV4dC54PWVsZW1lbnRfdGV4dChhbmdsZT00NSwgaGp1c3Q9MSwgdmp1c3Q9MC41KSkKcApgYGAKCiMjIyMgRmlndXJlIDJBIFJpZ2h0CgpgYGB7ciBmaWcyYX0KZmlnMmFfZGYgPC0gTV9MUFMuTV9MQS5zaWdHZW5lcwpvcmRlcl9pZHggPC0gb3JkZXIoZmlnMmFfZGZbWyJsb2dGQyJdXSwgZGVjcmVhc2luZz1GQUxTRSkKZmlnMmFfZGYgPC0gZmlnMmFfZGZbb3JkZXJfaWR4LCBdCnRvcCA8LSBoZWFkKGZpZzJhX2RmLCBuPTEwKQpib3QgPC0gdGFpbChmaWcyYV9kZiwgbj0xMCkKcGxvdHRlZCA8LSByYmluZCh0b3AsIGJvdCkKcm93bmFtZXMocGxvdHRlZCkgPC0gcGxvdHRlZFtbIklEIl1dCmRlc2NfaWR4IDwtIGRlc2NbWyJJRCJdXSAlaW4lIHBsb3R0ZWRbWyJJRCJdXQp0aGlzX2Rlc2MgPC0gZGVzY1tkZXNjX2lkeCwgXQpjdXJyZW50IDwtIHJvd25hbWVzKHBsb3R0ZWQpCnBsb3R0ZWQgPC0gbWVyZ2UodGhpc19kZXNjLCBwbG90dGVkLCBieS54PSJJRCIsIGJ5Lnk9IklEIiwgYWxsPVRSVUUpCnJvd25hbWVzKHBsb3R0ZWQpIDwtIG1ha2UubmFtZXMocGxvdHRlZFtbIklEIl1dLCB1bmlxdWU9VFJVRSkKcGxvdHRlZCA8LSBwbG90dGVkW2N1cnJlbnQsIF0KcGxvdHRlZFtbImxmY2VyciJdXSA8LSBwbG90dGVkW1sibG9nRkMiXV0gLyBwbG90dGVkW1sidCJdXQpwbG90dGVkW1siU3ltYm9sIl1dIDwtIGZhY3RvcihwbG90dGVkW1siU3ltYm9sIl1dLCBsZXZlbHM9cGxvdHRlZFtbIlN5bWJvbCJdXSkKCnAgPC0gZ2dwbG90KGRhdGE9cGxvdHRlZCwgYWVzKHg9U3ltYm9sLCB5PWxvZ0ZDKSkgKwogIGdlb21fYmFyKHN0YXQ9ImlkZW50aXR5IiwgZmlsbD0iIzdCRDE5QyIsIGNvbG9yPSJibGFjayIsIHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKCkpKwogIGdlb21fZXJyb3JiYXIoYWVzKHltaW49bG9nRkMgLSAobGZjZXJyIC8gMiksIHltYXg9bG9nRkMgKyAobGZjZXJyIC8gMikpLCB3aWR0aD0wLjIsCiAgICAgICAgICAgICAgICBwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSgwLjkpKSArCiAgY29vcmRfZmxpcCgpICsKICB0aGVtZV9taW5pbWFsKCkgKwogIHRoZW1lKGF4aXMudGV4dC54PWVsZW1lbnRfdGV4dChhbmdsZT00NSwgaGp1c3Q9MSwgdmp1c3Q9MC41KSkKcApgYGAKCgojIyMgRmlndXJlIDJECgpJIGNyZWF0ZWQgYSB0YWJsZSBvZiBzaGFyZWQgREVHIGJldHdlZW4gTCtQR0UyL0xQUyBhbmQgTCtBZG8vTFBTICh0YWJsZSBhdHRhY2hlZApiZWxvdykgYnkgbWVyZ2luZyB0aGUgMiBERSB0YWJsZXMgYmFzZWQgb24gY29tbW9uIGdlbmUgc3ltYm9sLiAgSW4gdGhpcyB0YWJsZSwKbG9nRkMueCBjb3JyZXNwb25kcyB0byBMK0Fkby9MUFMgYW5kIGxvZ0ZDLnkgY29ycmVzcG9uZHMgdG8gTCtQR0UyL0xQUy4gIEkKYXZlcmFnZWQgdGhlIGZvbGQgY2hhbmdlcyBiZXR3ZWVuIGxvZ0ZDLnggYW5kIGxvZ0ZDLnkgaW4gb3JkZXIgdG8gZGV0ZXJtaW5lIHRoZQpyYW5rIG9yZGVyIG9mIHRoZSBnZW5lcyBpbiB0aGUgZmlndXJlIGJ1dCBwbG90dGVkIHRoZSBmb2xkIGNoYW5nZXMKaW5kaXZpZHVhbGx5LiAgSW5zdGVhZCBvZiBwbG90dGluZyBsb2cyRkMgSSBtYW51YWxseSBjb252ZXJ0ZWQgdGhvc2UgdmFsdWVzIHRvCmp1c3QgRkMuIEkgZG9u4oCZdCBrbm93IGhvdyB0byBjYWxjdWxhdGUgc3RhbmRhcmQgZXJyb3IgaWYgSSBhbSBwbG90dGluZyBqdXN0IEZDLgpJdCB3b3VsZCBiZSBuaWNlIGlmIHRoaXMgY291bGQgYWxsIGJlIGRvbmUgaW4gUi4KCmBgYHtyIGZpZzJkdH0KZmlnMmRfZGYgPC0gbWVyZ2UoTV9MUFMuTV9MUC5zaWdHZW5lcywgTV9MUFMuTV9MQS5zaWdHZW5lcywgYnk9IklEIikKZmlnMmRfZGYgPC0gbWVyZ2UoZmlnMmRfZGYsIGRlc2MsIGJ5PSJJRCIpCmZpZzJkX2RmW1siYXZnIl1dIDwtIChmaWcyZF9kZltbImxvZ0ZDLngiXV0gKyBmaWcyZF9kZltbImxvZ0ZDLnkiXV0pIC8gMgoKb3JkZXJfaWR4IDwtIG9yZGVyKGZpZzJkX2RmW1siYXZnIl1dLCBkZWNyZWFzaW5nPVRSVUUpCmZpZzJkdF9kZiA8LSBoZWFkKGZpZzJkX2RmW29yZGVyX2lkeCwgXSwgbj0yMikKZmlnMmR0X2RmW1sibHBfbGZjZXJyIl1dIDwtIGZpZzJkdF9kZltbImxvZ0ZDLngiXV0gLyBmaWcyZHRfZGZbWyJ0LngiXV0KZmlnMmR0X2RmW1sibGFfbGZjZXJyIl1dIDwtIGZpZzJkdF9kZltbImxvZ0ZDLnkiXV0gLyBmaWcyZHRfZGZbWyJ0LnkiXV0KCmZpZzJkdF9scCA8LSBmaWcyZHRfZGZbLCBjKCJTeW1ib2wiLCAibG9nRkMueCIsICJscF9sZmNlcnIiKV0KY29sbmFtZXMoZmlnMmR0X2xwKSA8LSBjKCJzeW1ib2wiLCAibG9nZmMiLCAibGZjZXJyIikKZmlnMmR0X2xwW1sidHlwZSJdXSA8LSAiTFBTK1BHRSIKZmlnMmR0X2xhIDwtIGZpZzJkdF9kZlssIGMoIlN5bWJvbCIsICJsb2dGQy55IiwgImxhX2xmY2VyciIpXQpjb2xuYW1lcyhmaWcyZHRfbGEpIDwtIGMoInN5bWJvbCIsICJsb2dmYyIsICJsZmNlcnIiKQpmaWcyZHRfbGFbWyJ0eXBlIl1dIDwtICJMUFMrQWRvIgptZWx0ZWRfZmlnMmR0IDwtIHJiaW5kKGZpZzJkdF9sYSwgZmlnMmR0X2xwKQptZWx0ZWRfZmlnMmR0W1sic3ltYm9sIl1dIDwtIGZhY3RvcihtZWx0ZWRfZmlnMmR0W1sic3ltYm9sIl1dLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHM9dW5pcXVlKG1lbHRlZF9maWcyZHRbWyJzeW1ib2wiXV0pKQptZWx0ZWRfZmlnMmR0W1sidHlwZSJdXSA8LSBmYWN0b3IobWVsdGVkX2ZpZzJkdFtbInR5cGUiXV0sIGxldmVscz1jKCJMUFMrQWRvIiwgIkxQUytQR0UiKSkKCnAgPC0gZ2dwbG90KGRhdGE9bWVsdGVkX2ZpZzJkdCwgYWVzKHg9c3ltYm9sLCB5PWxvZ2ZjLCBmaWxsPXR5cGUpKSArCiAgZ2VvbV9iYXIoc3RhdD0iaWRlbnRpdHkiLCBjb2xvcj0iYmxhY2siLCBwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSgpKSsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9YygiIzdCRDE5QyIsICIjODlBOEREIikpICsKICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluPWxvZ2ZjIC0gKGxmY2VyciAvIDIpLCB5bWF4PWxvZ2ZjICsgKGxmY2VyciAvIDIpKSwgd2lkdGg9MC4yLAogICAgICAgICAgICAgICAgcG9zaXRpb249cG9zaXRpb25fZG9kZ2UoMC45KSkgKwogIHRoZW1lX21pbmltYWwoKSArCiAgdGhlbWUoYXhpcy50ZXh0Lng9ZWxlbWVudF90ZXh0KGFuZ2xlPTQ1LCBoanVzdD0xLCB2anVzdD0wLjUpKQpwCmBgYAoKYGBge3IgZmlnMmRifQpmaWcyZF9kZiA8LSBtZXJnZShNX0xQUy5NX0xQLnNpZ0dlbmVzLCBNX0xQUy5NX0xBLnNpZ0dlbmVzLCBieT0iSUQiKQpmaWcyZF9kZiA8LSBtZXJnZShmaWcyZF9kZiwgZGVzYywgYnk9IklEIikKZmlnMmRfZGZbWyJhdmciXV0gPC0gKGZpZzJkX2RmW1sibG9nRkMueCJdXSArIGZpZzJkX2RmW1sibG9nRkMueSJdXSkgLyAyCgpvcmRlcl9pZHggPC0gb3JkZXIoZmlnMmRfZGZbWyJhdmciXV0sIGRlY3JlYXNpbmc9RkFMU0UpCmZpZzJkYl9kZiA8LSBoZWFkKGZpZzJkX2RmW29yZGVyX2lkeCwgXSwgbj0yMikKZmlnMmRiX2RmW1sibHBfbGZjZXJyIl1dIDwtIGZpZzJkYl9kZltbImxvZ0ZDLngiXV0gLyBmaWcyZGJfZGZbWyJ0LngiXV0KZmlnMmRiX2RmW1sibGFfbGZjZXJyIl1dIDwtIGZpZzJkYl9kZltbImxvZ0ZDLnkiXV0gLyBmaWcyZGJfZGZbWyJ0LnkiXV0KCmZpZzJkYl9scCA8LSBmaWcyZGJfZGZbLCBjKCJTeW1ib2wiLCAibG9nRkMueCIsICJscF9sZmNlcnIiKV0KY29sbmFtZXMoZmlnMmRiX2xwKSA8LSBjKCJzeW1ib2wiLCAibG9nZmMiLCAibGZjZXJyIikKZmlnMmRiX2xwW1sidHlwZSJdXSA8LSAiTFBTK1BHRSIKZmlnMmRiX2xhIDwtIGZpZzJkYl9kZlssIGMoIlN5bWJvbCIsICJsb2dGQy55IiwgImxhX2xmY2VyciIpXQpjb2xuYW1lcyhmaWcyZGJfbGEpIDwtIGMoInN5bWJvbCIsICJsb2dmYyIsICJsZmNlcnIiKQpmaWcyZGJfbGFbWyJ0eXBlIl1dIDwtICJMUFMrQWRvIgptZWx0ZWRfZmlnMmRiIDwtIHJiaW5kKGZpZzJkYl9sYSwgZmlnMmRiX2xwKQptZWx0ZWRfZmlnMmRiW1sic3ltYm9sIl1dIDwtIGZhY3RvcihtZWx0ZWRfZmlnMmRiW1sic3ltYm9sIl1dLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHM9dW5pcXVlKG1lbHRlZF9maWcyZGJbWyJzeW1ib2wiXV0pKQptZWx0ZWRfZmlnMmRiW1sidHlwZSJdXSA8LSBmYWN0b3IobWVsdGVkX2ZpZzJkYltbInR5cGUiXV0sIGxldmVscz1jKCJMUFMrQWRvIiwgIkxQUytQR0UiKSkKCnAgPC0gZ2dwbG90KGRhdGE9bWVsdGVkX2ZpZzJkYiwgYWVzKHg9c3ltYm9sLCB5PWxvZ2ZjLCBmaWxsPXR5cGUpKSArCiAgZ2VvbV9iYXIoc3RhdD0iaWRlbnRpdHkiLCBjb2xvcj0iYmxhY2siLCBwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSgpKSsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9YygiIzdCRDE5QyIsICIjODlBOEREIikpICsKICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluPWxvZ2ZjIC0gKGxmY2VyciAvIDIpLCB5bWF4PWxvZ2ZjICsgKGxmY2VyciAvIDIpKSwgd2lkdGg9MC4yLAogICAgICAgICAgICAgICAgcG9zaXRpb249cG9zaXRpb25fZG9kZ2UoMC45KSkgKwogIHRoZW1lX21pbmltYWwoKSArCiAgdGhlbWUoYXhpcy50ZXh0Lng9ZWxlbWVudF90ZXh0KGFuZ2xlPTQ1LCBoanVzdD0xLCB2anVzdD0wLjUpKQpwCmBgYAoKIyMjIEZpZ3VyZSAzQyBib3R0b20tbGVmdAoKYGBge3IgZmlnM0NfYm90dG9tbGVmdH0KYmxfb3JkZXJfaWR4IDwtIG9yZGVyKGZpZzNjX2xwX2RmW1sibG9nRkMueCJdXSwgZGVjcmVhc2luZz1GQUxTRSkKZmlnM2NfYmxfZGYgPC0gZmlnM2NfbHBfZGZbYmxfb3JkZXJfaWR4LCBdCnNpZ19pZHggPC0gZmlnM2NfYmxfZGZbWyJhZGouUC5WYWwueCJdXSA8PSAwLjA1CmZpZzNjX2JsX2RmIDwtIGhlYWQoZmlnM2NfYmxfZGZbc2lnX2lkeCwgXSwgbj0yMCkKZmlnM2NfYmxfZGYgPC0gZmlnM2NfYmxfZGZbLCB3YW50ZWRfY29sdW1uc10KY29sbmFtZXMoZmlnM2NfYmxfZGYpIDwtIHJlbmFtZWRfY29sdW1ucwojI3Jvd25hbWVzKGZpZzNjX2JsX2RmKSA8LSBmaWczY19ibF9kZltbIklEIl1dCmZpZzNjX2JsX2RmW1siSUQiXV0gPC0gTlVMTApmaWczY19ibF9kZltbIm1fbGZjZXJyIl1dIDwtIGZpZzNjX2JsX2RmW1sibV9sb2dmYyJdXSAvIGZpZzNjX2JsX2RmW1sibV90Il1dCmZpZzNjX2JsX2RmW1siZ21fbGZjZXJyIl1dIDwtIGZpZzNjX2JsX2RmW1siZ21fbG9nZmMiXV0gLyBmaWczY19ibF9kZltbImdtX3QiXV0KCmZpZzNjX2JsX20gPC0gZmlnM2NfYmxfZGZbLCBjKCJtX2xvZ2ZjIiwgInN5bWJvbCIsICJtX2xmY2VyciIpXQpmaWczY19ibF9tW1sidHlwZSJdXSA8LSAibSIKY29sbmFtZXMoZmlnM2NfYmxfbSkgPC0gYygibG9nZmMiLCAic3ltYm9sIiwgImxmY2VyciIsICJ0eXBlIikKZmlnM2NfYmxfZ20gPC0gZmlnM2NfYmxfZGZbLCBjKCJnbV9sb2dmYyIsICJzeW1ib2wiLCAiZ21fbGZjZXJyIildCmZpZzNjX2JsX2dtW1sidHlwZSJdXSA8LSAiZ20iCmNvbG5hbWVzKGZpZzNjX2JsX2dtKSA8LSBjKCJsb2dmYyIsICJzeW1ib2wiLCAibGZjZXJyIiwgInR5cGUiKQptZWx0ZWRfZmlnM2NfYmwgPC0gcmJpbmQoZmlnM2NfYmxfbSwgZmlnM2NfYmxfZ20pCm1lbHRlZF9maWczY19ibFtbInN5bWJvbCJdXSA8LSBmYWN0b3IobWVsdGVkX2ZpZzNjX2JsW1sic3ltYm9sIl1dLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscz1maWczY19ibF9tW1sic3ltYm9sIl1dKQptZWx0ZWRfZmlnM2NfYmxbWyJ0eXBlIl1dIDwtIGZhY3RvcihtZWx0ZWRfZmlnM2NfYmxbWyJ0eXBlIl1dLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHM9YygibSIsICJnbSIpKQoKcCA8LSBnZ3Bsb3QoZGF0YT1tZWx0ZWRfZmlnM2NfYmwsIGFlcyh4PXN5bWJvbCwgeT1sb2dmYywgZmlsbD10eXBlKSkgKwogIGdlb21fYmFyKHN0YXQ9ImlkZW50aXR5IiwgY29sb3I9ImJsYWNrIiwgcG9zaXRpb249cG9zaXRpb25fZG9kZ2UoKSkrCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPWMoImNvcm5mbG93ZXJibHVlIiwgImRhcmtncmV5IikpICsKICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluPWxvZ2ZjLWxmY2VyciwgeW1heD1sb2dmYytsZmNlcnIpLCB3aWR0aD0uMiwKICAgICAgICAgICAgICAgIHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKC45KSkgKwogIHRoZW1lX21pbmltYWwoKSArCiAgdGhlbWUoYXhpcy50ZXh0Lng9ZWxlbWVudF90ZXh0KGFuZ2xlPTQ1LCBoanVzdD0xLCB2anVzdD0wLjUpKQpwCmBgYAoKIyMjIEZpZ3VyZSAzQyB0b3AtcmlnaHQKClRoZSByaWdodCBzaWRlIG9mIHRoZSBwbG90IGlzIExBIHJhdGhlciB0aGFuIExQLCBvdGhlcndpc2UgdGhpcyBpcyB0aGUgc2FtZS4KCmBgYHtyIGZpZzNjX3RvcHJpZ2h0fQp3YW50ZWRfY29sdW1ucyA8LSBjKCJJRCIsICJsb2dGQy54IiwgImxvZ0ZDLnkiLCAidC54IiwgInQueSIsICJTeW1ib2wiKQpyZW5hbWVkX2NvbHVtbnMgPC0gYygiSUQiLCAibV9sb2dmYyIsICJnbV9sb2dmYyIsICJtX3QiLCAiZ21fdCIsICJzeW1ib2wiKQoKZmlnM2NfbGFfZGYgPC0gbWVyZ2UoTV9MUFMuTV9MQS50b3BUYWIsIEdNX0xQUy5HTV9MQS50b3BUYWIsIGJ5PSJJRCIpCmRlc2MgPC0gZ2V0Qk0oYXR0cmlidXRlcz1jKCJlbnNlbWJsX2dlbmVfaWQiLCAiaGduY19zeW1ib2wiLCAiZGVzY3JpcHRpb24iLCAiZ2VuZV9iaW90eXBlIiksCiAgICAgICAgICAgICAgZmlsdGVycz0iZW5zZW1ibF9nZW5lX2lkIiwKICAgICAgICAgICAgICB2YWx1ZXM9ZmlnM2NfbGFfZGZbWyJJRCJdXSwgbWFydD1lbnNlbWJsKQpjb2xuYW1lcyhkZXNjKT1jKCJJRCIsICJTeW1ib2wiLCAiRGVzY3JpcHRpb24iLCAiVHlwZSIpCmZpZzNjX2xhX2RmIDwtIG1lcmdlKGZpZzNjX2xhX2RmLCBkZXNjLCBieT0iSUQiLCBhbGwueD1UUlVFKQoKdHJfb3JkZXJfaWR4IDwtIG9yZGVyKGZpZzNjX2xhX2RmW1sibG9nRkMueCJdXSwgZGVjcmVhc2luZz1UUlVFKQpmaWczY190cl9kZiA8LSBmaWczY19sYV9kZlt0cl9vcmRlcl9pZHgsIF0Kc2lnX2lkeCA8LSBmaWczY190cl9kZltbImFkai5QLlZhbC54Il1dIDw9IDAuMDUKZmlnM2NfdHJfZGYgPC0gaGVhZChmaWczY190cl9kZltzaWdfaWR4LCBdLCBuPTI1KQpmaWczY190cl9kZiA8LSBmaWczY190cl9kZlssIHdhbnRlZF9jb2x1bW5zXQpjb2xuYW1lcyhmaWczY190cl9kZikgPC0gcmVuYW1lZF9jb2x1bW5zCnJvd25hbWVzKGZpZzNjX3RyX2RmKSA8LSBmaWczY190cl9kZltbIklEIl1dCmZpZzNjX3RyX2RmW1siSUQiXV0gPC0gTlVMTApmaWczY190cl9kZltbIm1fbGZjZXJyIl1dIDwtIGZpZzNjX3RyX2RmW1sibV9sb2dmYyJdXSAvIGZpZzNjX3RyX2RmW1sibV90Il1dCmZpZzNjX3RyX2RmW1siZ21fbGZjZXJyIl1dIDwtIGZpZzNjX3RyX2RmW1siZ21fbG9nZmMiXV0gLyBmaWczY190cl9kZltbImdtX3QiXV0KCmZpZzNjX3RyX20gPC0gZmlnM2NfdHJfZGZbLCBjKCJtX2xvZ2ZjIiwgInN5bWJvbCIsICJtX2xmY2VyciIpXQpmaWczY190cl9tW1sidHlwZSJdXSA8LSAibSIKY29sbmFtZXMoZmlnM2NfdHJfbSkgPC0gYygibG9nZmMiLCAic3ltYm9sIiwgImxmY2VyciIsICJ0eXBlIikKZmlnM2NfdHJfZ20gPC0gZmlnM2NfdHJfZGZbLCBjKCJnbV9sb2dmYyIsICJzeW1ib2wiLCAiZ21fbGZjZXJyIildCmZpZzNjX3RyX2dtW1sidHlwZSJdXSA8LSAiZ20iCmNvbG5hbWVzKGZpZzNjX3RyX2dtKSA8LSBjKCJsb2dmYyIsICJzeW1ib2wiLCAibGZjZXJyIiwgInR5cGUiKQptZWx0ZWRfZmlnM2NfdHIgPC0gcmJpbmQoZmlnM2NfdHJfbSwgZmlnM2NfdHJfZ20pCm1lbHRlZF9maWczY190cltbInN5bWJvbCJdXSA8LSBmYWN0b3IobWVsdGVkX2ZpZzNjX3RyW1sic3ltYm9sIl1dLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscz1maWczY190cl9tW1sic3ltYm9sIl1dKQptZWx0ZWRfZmlnM2NfdHJbWyJ0eXBlIl1dIDwtIGZhY3RvcihtZWx0ZWRfZmlnM2NfdHJbWyJ0eXBlIl1dLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHM9YygibSIsICJnbSIpKQoKcCA8LSBnZ3Bsb3QoZGF0YT1tZWx0ZWRfZmlnM2NfdHIsIGFlcyh4PXN5bWJvbCwgeT1sb2dmYywgZmlsbD10eXBlKSkgKwogIGdlb21fYmFyKHN0YXQ9ImlkZW50aXR5IiwgY29sb3I9ImJsYWNrIiwgcG9zaXRpb249cG9zaXRpb25fZG9kZ2UoKSkrCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPWMoImNvcm5mbG93ZXJibHVlIiwgImRhcmtncmV5IikpICsKICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluPWxvZ2ZjLWxmY2VyciwgeW1heD1sb2dmYytsZmNlcnIpLCB3aWR0aD0uMiwKICAgICAgICAgICAgICAgIHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKC45KSkgKwogIHRoZW1lX21pbmltYWwoKSArCiAgdGhlbWUoYXhpcy50ZXh0Lng9ZWxlbWVudF90ZXh0KGFuZ2xlPTQ1LCBoanVzdD0xLCB2anVzdD0wLjUpKQpwCmBgYAoKIyMjIEZpZ3VyZSAzQyBib3R0b20tcmlnaHQKCmBgYHtyIGZpZzNDX2JvdHRvbXJpZ2h0fQpicl9vcmRlcl9pZHggPC0gb3JkZXIoZmlnM2NfbGFfZGZbWyJsb2dGQy54Il1dLCBkZWNyZWFzaW5nPUZBTFNFKQpmaWczY19icl9kZiA8LSBmaWczY19sYV9kZlticl9vcmRlcl9pZHgsIF0Kc2lnX2lkeCA8LSBmaWczY19icl9kZltbImFkai5QLlZhbC54Il1dIDw9IDAuMDUKZmlnM2NfYnJfZGYgPC0gaGVhZChmaWczY19icl9kZltzaWdfaWR4LCBdLCBuPTIwKQpmaWczY19icl9kZiA8LSBmaWczY19icl9kZlssIHdhbnRlZF9jb2x1bW5zXQpjb2xuYW1lcyhmaWczY19icl9kZikgPC0gcmVuYW1lZF9jb2x1bW5zCiMjcm93bmFtZXMoZmlnM2NfYmxfZGYpIDwtIGZpZzNjX2JsX2RmW1siSUQiXV0KZmlnM2NfYnJfZGZbWyJJRCJdXSA8LSBOVUxMCmZpZzNjX2JyX2RmW1sibV9sZmNlcnIiXV0gPC0gZmlnM2NfYnJfZGZbWyJtX2xvZ2ZjIl1dIC8gZmlnM2NfYnJfZGZbWyJtX3QiXV0KZmlnM2NfYnJfZGZbWyJnbV9sZmNlcnIiXV0gPC0gZmlnM2NfYnJfZGZbWyJnbV9sb2dmYyJdXSAvIGZpZzNjX2JyX2RmW1siZ21fdCJdXQoKZmlnM2NfYnJfbSA8LSBmaWczY19icl9kZlssIGMoIm1fbG9nZmMiLCAic3ltYm9sIiwgIm1fbGZjZXJyIildCmZpZzNjX2JyX21bWyJ0eXBlIl1dIDwtICJtIgpjb2xuYW1lcyhmaWczY19icl9tKSA8LSBjKCJsb2dmYyIsICJzeW1ib2wiLCAibGZjZXJyIiwgInR5cGUiKQpmaWczY19icl9nbSA8LSBmaWczY19icl9kZlssIGMoImdtX2xvZ2ZjIiwgInN5bWJvbCIsICJnbV9sZmNlcnIiKV0KZmlnM2NfYnJfZ21bWyJ0eXBlIl1dIDwtICJnbSIKY29sbmFtZXMoZmlnM2NfYnJfZ20pIDwtIGMoImxvZ2ZjIiwgInN5bWJvbCIsICJsZmNlcnIiLCAidHlwZSIpCm1lbHRlZF9maWczY19iciA8LSByYmluZChmaWczY19icl9tLCBmaWczY19icl9nbSkKbWVsdGVkX2ZpZzNjX2JyW1sic3ltYm9sIl1dIDwtIGZhY3RvcihtZWx0ZWRfZmlnM2NfYnJbWyJzeW1ib2wiXV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzPWZpZzNjX2JyX21bWyJzeW1ib2wiXV0pCm1lbHRlZF9maWczY19icltbInR5cGUiXV0gPC0gZmFjdG9yKG1lbHRlZF9maWczY19icltbInR5cGUiXV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscz1jKCJtIiwgImdtIikpCgpwIDwtIGdncGxvdChkYXRhPW1lbHRlZF9maWczY19iciwgYWVzKHg9c3ltYm9sLCB5PWxvZ2ZjLCBmaWxsPXR5cGUpKSArCiAgZ2VvbV9iYXIoc3RhdD0iaWRlbnRpdHkiLCBjb2xvcj0iYmxhY2siLCBwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSgpKSsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9YygiY29ybmZsb3dlcmJsdWUiLCAiZGFya2dyZXkiKSkgKwogIGdlb21fZXJyb3JiYXIoYWVzKHltaW49bG9nZmMtbGZjZXJyLCB5bWF4PWxvZ2ZjK2xmY2VyciksIHdpZHRoPS4yLAogICAgICAgICAgICAgICAgcG9zaXRpb249cG9zaXRpb25fZG9kZ2UoLjkpKSArCiAgdGhlbWVfbWluaW1hbCgpICsKICB0aGVtZShheGlzLnRleHQueD1lbGVtZW50X3RleHQoYW5nbGU9NDUsIGhqdXN0PTEsIHZqdXN0PTAuNSkpCnAKYGBgCgojIyBWZW5uIERpYWdyYW0gb2Ygc2hhcmVkIERFRyBiZXR3ZWVuIE0tQ1NGIExQUyB2IExBIHYgTFAKClVwcmVndWxhdGVkIGdlbmVzIGNvbXBhcmVkIHRvIE5TCgpgYGB7cn0Kdl9kYXRhIDwtIGxpc3QoREVHX0xBNFtERUdfTEE0JGxvZ0ZDID4gMCwgXSRJRCwKICAgICAgICAgICAgICAgREVHX0xQNFtERUdfTFA0JGxvZ0ZDID4gMCwgXSRJRCwKICAgICAgICAgICAgICAgREVHX0xQU1tERUdfTFBTJGxvZ0ZDID4gMCwgXSRJRCkKdl9kYXRhIDwtIFZlbm4odl9kYXRhLCBTZXROYW1lcz1jKCJMUFMrQWRvIiwgIkxQUytQR0UyIiwgIkxQUyIpLCBudW1iZXJPZlNldHM9MykKVmVubmVyYWJsZTo6cGxvdCh2X2RhdGEsIGRvV2VpZ2h0cz1GQUxTRSkKIyNkZXYuY29weShwbmcsICJWZW5uRGlhZ3JhbSBVcHJlZ3VsYXRlZCBMUFMgTEEgTFAiLCB3aWR0aD03MDAsIGhlaWdodD03MDApCiMjZGV2Lm9mZigpOwpgYGAKCkRvd25yZWd1bGF0ZWQgZ2VuZXMgY29tcGFyZWQgdG8gTlMKCmBgYHtyfQp2X2RhdGEgPC0gbGlzdChERUdfTEE0W0RFR19MQTQkbG9nRkMgPCAwLCBdJElELAogICAgICAgICAgICAgICBERUdfTFA0W0RFR19MUDQkbG9nRkMgPCAwLCBdJElELAogICAgICAgICAgICAgICBERUdfTFBTW0RFR19MUFMkbG9nRkMgPCAwLCBdJElEKQp2X2RhdGEgPC0gVmVubih2X2RhdGEsIFNldE5hbWVzPWMoIkxQUytBZG8iLCAiTFBTK1BHRTIiLCAiTFBTIiksIG51bWJlck9mU2V0cz0zKQpWZW5uZXJhYmxlOjpwbG90KHZfZGF0YSwgZG9XZWlnaHRzPUZBTFNFKQojI2Rldi5jb3B5KHBuZywgIlZlbm5EaWFncmFtIERvd25yZWd1bGF0ZWQgTFBTIExBIExQIiwgd2lkdGg9NzAwLCBoZWlnaHQ9NzAwKQojI2Rldi5vZmYoKTsKYGBgCgojIyBWb2xjYW5vIFBsb3RzCgpNX0xQUyB2IE1fTEEKCgpgYGB7ciBwcmV2aW91c192b2xjYW5vfQpyZXMgPC0gcmVhZC5jc3YobHBzX2xhX3RhYmxlKQojI3JlcyA8LSByZWFkLnRhYmxlKCJ0b3BUYWJfTV9MUFN2TV9MQV9DRFNfbGltbWFiYXRjaGNvcnJlY3Rpb25fMjAxNzExMjAudHh0IiwgaGVhZGVyPVRSVUUpCmhlYWQocmVzKQp3aXRoKHJlcywgcGxvdChsb2dGQywgLWxvZzEwKFAuVmFsdWUpLCBjZXg9MC44LCBwY2g9MjAsCiAgICAgICAgICAgICAgIG1haW49IlZvbGNhbm8gcGxvdCBNX0xQUyB2IE1fTEEiLCB4bGltPWMoLTcsIDcpKSkKIyMgQWRkIGNvbG9yZWQgcG9pbnRzOiByZWQgaWYgcGFkajwwLjA1LCBvcmFuZ2Ugb2YgbG9nMkZDPjEsIGdyZWVuIGlmIGJvdGgpCndpdGgoc3Vic2V0KHJlcywgYWRqLlAuVmFsIDwgMC4wNSApLAogICAgIHBvaW50cyhsb2dGQywgLWxvZzEwKFAuVmFsdWUpLCBjZXg9MC44LCBwY2g9MjAsIGNvbD0idmlvbGV0cmVkMiIpKQp3aXRoKHN1YnNldChyZXMsIGFicyhsb2dGQykgPiAxKSwKICAgICBwb2ludHMobG9nRkMsIC1sb2cxMChQLlZhbHVlKSwgY2V4PTAuOCwgcGNoPTIwLCBjb2w9Im9yYW5nZSIpKQp3aXRoKHN1YnNldChyZXMsIGFkai5QLlZhbCA8IDAuMDUgJiBhYnMobG9nRkMpID4gMSksCiAgICAgcG9pbnRzKGxvZ0ZDLCAtbG9nMTAoUC5WYWx1ZSksIGNleD0wLjgsIHBjaD0yMCwgY29sPSJ0dXJxdW9pc2UzIikpCmRldi5jb3B5KHBuZywgImltYWdlcy9Wb2xjYW5vUGxvdF9NX0xQU192X01fTEEucG5nIiwgd2lkdGg9NzAwLCBoZWlnaHQ9NzAwKQpkZXYub2ZmKCkKYGBgCgpgYGB7ciBwcmludF9udW1iZXJzX2Rvd25sYX0Kc2lnX3VwX2lkeCA8LSByZXNbLCAiYWRqLlAuVmFsIl0gPCAwLjA1ICYgcmVzWywgImxvZ0ZDIl0gPiAxCnN1bShzaWdfdXBfaWR4KQpzaWdfdXBfaWRzIDwtIHJlc1tzaWdfdXBfaWR4LCAiSUQiXQptX2xwc19tX2xhX3VwX2lkcyA8LSBzaWdfdXBfaWRzCgpzaWdfZG93bl9pZHggPC0gcmVzWywgImFkai5QLlZhbCJdIDwgMC4wNSAmIHJlc1ssICJsb2dGQyJdIDwgLTEKc3VtKHNpZ19kb3duX2lkeCkKc2lnX2Rvd25faWRzIDwtIHJlc1tzaWdfZG93bl9pZHgsICJJRCJdCm1fbHBzX21fbGFfZG93bl9pZHMgPC0gc2lnX2Rvd25faWRzCmBgYAoKIyBNX0xQUyB2IE1fTFAKCmBgYHtyIHVuZXZhbF92b2xjYW5vfQpyZXMgPC0gcmVhZC5jc3YoImNzdi90b3BUYWJfTV9MUFN2TV9MUF9DRFNfbGltbWFiYXRjaGNvcnJlY3Rpb25fMjAxNzExMjByZXYuY3N2IiwgaGVhZGVyPVRSVUUpCmhlYWQocmVzKQp3aXRoKHJlcywgcGxvdChsb2dGQywgLWxvZzEwKFAuVmFsdWUpLCBjZXg9MC44LCBwY2g9MjAsCiAgICAgICAgICAgICAgIG1haW49IlZvbGNhbm8gcGxvdCBNX0xQUyB2IE1fTFAiLCB4bGltPWMoLTcsIDcpKSkKCiMjIEFkZCBjb2xvcmVkIHBvaW50czogcmVkIGlmIHBhZGo8MC4wNSwgb3JhbmdlIG9mIGxvZzJGQz4xLCBncmVlbiBpZiBib3RoKQp3aXRoKHN1YnNldChyZXMsIGFkai5QLlZhbCA8IDAuMDUgKSwKICAgICBwb2ludHMobG9nRkMsIC1sb2cxMChQLlZhbHVlKSwgY2V4PTAuOCwgcGNoPTIwLCBjb2w9InZpb2xldHJlZDIiKSkKd2l0aChzdWJzZXQocmVzLCBhYnMobG9nRkMpID4gMSksCiAgICAgcG9pbnRzKGxvZ0ZDLCAtbG9nMTAoUC5WYWx1ZSksIGNleD0wLjgsIHBjaD0yMCwgY29sPSJvcmFuZ2UiKSkKd2l0aChzdWJzZXQocmVzLCBhZGouUC5WYWwgPCAwLjA1ICYgYWJzKGxvZ0ZDKSA+IDEpLAogICAgIHBvaW50cyhsb2dGQywgLWxvZzEwKFAuVmFsdWUpLCBjZXg9MC44LCBwY2g9MjAsIGNvbD0idHVycXVvaXNlMyIpKQpkZXYuY29weShwbmcsICJpbWFnZXMvVm9sY2Fub1Bsb3RfTV9MUFNfdl9NX0xQLnBuZyIsIHdpZHRoPTcwMCwgaGVpZ2h0PTcwMCkKZGV2Lm9mZigpCmBgYAoKIyMgUmljaCBGYWN0b3IgR3JhcGhzCgojIyBHTyB0ZXJtcyBzaGFyZWQgTEEgTFAKCmBgYHtyfQpHT1NoYXJlZHBhdGh3YXlzIDwtIHJlYWQudGFibGUoImNzdi9HTyBNRiBGRFIgLjA1IFRPUCA1IG9ubHktMi50eHQiLCBoZWFkZXI9VFJVRSwgc2VwPSdcdCcpCkdPU2hhcmVkcGF0aHdheXMgPC0gR09TaGFyZWRwYXRod2F5c1tvcmRlcihHT1NoYXJlZHBhdGh3YXlzJHAuVmFsdWUsIGRlY3JlYXNpbmc9VFJVRSksIF0KCmNvbG9yUmFtcCA8LSBjb2xvclJhbXBQYWxldHRlKGMoInR1cnF1b2lzZTEiLCAibWVkaXVtYmx1ZSIpKSg1MCkKcGFyKG1hcj1jKDUsIDE4LCAzLCA4KSkKcGxvdChHT1NoYXJlZHBhdGh3YXlzJFJpY2guRmFjdG9yLCBjKDE6NSksIGF4ZXM9RkFMU0UsCiAgICAgcGFuZWwuZmlyc3Q9YWJsaW5lKGg9MTo1LCB2PXNlcSgwLjEsIDAuNiwgMC4xKSwgY29sPSJncmV5OTAiKSwKICAgICBjZXg9YXMubnVtZXJpYyhHT1NoYXJlZHBhdGh3YXlzJEdlbmUuTnVtYmVyKSAvIDQsCiAgICAgY29sPWNvbG9yUmFtcFtjdXQoYXMubnVtZXJpYyhHT1NoYXJlZHBhdGh3YXlzJHAuVmFsdWUpLCBicmVha3M9NTApXSwKICAgICBwY2g9MjAsIHlsYWI9IiAiLCB4bGFiPSJSaWNoIEZhY3RvciIsIG1haW49IlBhdGh3YXlzIEVucmljaGVkIiwKICAgICB4bGltPWMoMCwgMC4wNCkpCmF4aXMoc2lkZT0yLCBhdD0xOjUsIGxhYmVscz1hcy5jaGFyYWN0ZXIoR09TaGFyZWRwYXRod2F5cyRHZW5lU2V0KSwgbGFzPTIsIGNleC5heGlzPTAuNSkKYXhpcyhzaWRlPTEsIHRpY2s9R09TaGFyZWRwYXRod2F5c1tbIlJpY2guRmFjdG9yIl1dKQpgYGAKCiMjIyBLRUdHIExBCgpgYGB7ciwgZXZhbD1GQUxTRX0KTEFwYXRod2F5cyA8LSByZWFkLnRhYmxlKCJjc3YvQ3l0b3NjYXBlIFBhdGh3YXlzL0xBIHYgTFBTLnR4dCIsIGhlYWRlcj1UUlVFLCBzZXA9J1x0JykKTEFwYXRod2F5cyA8LSBMQXBhdGh3YXlzW29yZGVyKExBcGF0aHdheXMkcC5WYWx1ZSwgZGVjcmVhc2luZz1UUlVFKSwgXQojIyBwbG90IHggdi4geSwgY2hhbmdlIHNpemUsIGFzc2lnbiBjb2xvciB0byBwLXZhbHVlCmNvbG9yUmFtcCA8LSBjb2xvclJhbXBQYWxldHRlKGMoInR1cnF1b2lzZTEiLCAibWVkaXVtYmx1ZSIpKSg1MCkKcGFyKG1hcj1jKDUsIDE4LCAzLCA4KSkKcGxvdChMQXBhdGh3YXlzJFJpY2guRmFjdG9yLCBjKDE6MjgpLCBheGVzPUYsCiAgICAgcGFuZWwuZmlyc3Q9YWJsaW5lKGg9MToyOCwgdj1zZXEoMC4xLCAwLjQsIDAuMSksIGNvbD0iZ3JleTkwIiksCiAgICAgY2V4PWFzLm51bWVyaWMoTEFwYXRod2F5cyRHZW5lLk51bWJlcikvMTAsCiAgICAgY29sPWNvbG9yUmFtcFtjdXQoYXMubnVtZXJpYyhMQXBhdGh3YXlzJHAuVmFsdWUpLCBicmVha3M9NTApXSwKICAgICBwY2g9MjAsIHlsYWI9IiAiLCB4bGFiPSJSaWNoIEZhY3RvciIsIG1haW49IlBhdGh3YXlzIEVucmljaGVkIiwKICAgICB4bGltPWMoMCwgMC40KSkKYXhpcyhzaWRlPTIsIGF0PTE6MjgsIGxhYmVscz1hcy5jaGFyYWN0ZXIoTEFwYXRod2F5cyRQYXRod2F5KSwgbGFzPTIsIGNleC5heGlzPTAuOCkKYXhpcyhzaWRlPTEsIHRpY2s9TEFwYXRod2F5cyRSaWNoLkZhY3RvciwgcG9zPTAuNCkKYGBgCgojIyMgR08gTEEKCmBgYHtyLCBldmFsPUZBTFNFfQpHT0xBcGF0aHdheXMgPC0gcmVhZC50YWJsZSgiY3N2L0N5dG9zY2FwZSBQYXRod2F5cy9HTyBCUCBMQSB3aG9sZSBuZXR3b3JrLnR4dCIsIGhlYWRlcj1UUlVFLCBzZXA9J1x0JykKR09MQXBhdGh3YXlzIDwtIEdPTEFwYXRod2F5c1tvcmRlcihHT0xBcGF0aHdheXMkcC5WYWx1ZSwgZGVjcmVhc2luZz1UUlVFKSwgXQojI3Bsb3QgeCB2LiB5LCBjaGFuZ2Ugc2l6ZSwgYXNzaWduIGNvbG9yIHRvIHAtdmFsdWUKY29sb3JSYW1wIDwtIGNvbG9yUmFtcFBhbGV0dGUoYygidHVycXVvaXNlMSIsICJtZWRpdW1ibHVlIikpKDUwKQpwYXIobWFyPWMoNSwgMjAsIDMsIDgpKQpwbG90KEdPTEFwYXRod2F5cyRSaWNoLkZhY3RvciwgYygxOjU3KSwgYXhlcz1GLAogICAgIHBhbmVsLmZpcnN0PWFibGluZShoPTE6NTcsIHY9c2VxKDAuMSwgMC41LCAwLjEpLCBjb2w9ImdyZXk5MCIpLAogICAgIGNleD1hcy5udW1lcmljKEdPTEFwYXRod2F5cyRHZW5lLk51bWJlcikvMTAsCiAgICAgY29sPWNvbG9yUmFtcFtjdXQoYXMubnVtZXJpYyhHT0xBcGF0aHdheXMkcC5WYWx1ZSksIGJyZWFrcz01MCldLAogICAgIHBjaD0yMCwgeWxhYj0iICIsIHhsYWI9IlJpY2ggRmFjdG9yIiwgbWFpbj0iUGF0aHdheXMgRW5yaWNoZWQiLAogICAgIHhsaW09YygwLCAwLjUpKQpheGlzKHNpZGU9MixhdD0xOjU3LCBsYWJlbHM9YXMuY2hhcmFjdGVyKEdPTEFwYXRod2F5cyRQYXRod2F5KSwgbGFzPTIsIGNleC5heGlzPTAuOCkKYXhpcyhzaWRlPTEsIHRpY2s9R09MQXBhdGh3YXlzJFJpY2guRmFjdG9yLCBwb3M9MC40KQpgYGAKCiMjIyBHTyBMUAoKYGBge3IsIGV2YWw9RkFMU0V9CkdPTFBwYXRod2F5cyA8LSByZWFkLnRhYmxlKCJjc3YvQ3l0b3NjYXBlIFBhdGh3YXlzL0dPX0JQX0xQdkxQUy50eHQiLCBoZWFkZXI9VFJVRSwgc2VwPSdcdCcpCkdPTFBwYXRod2F5cyA8LSBHT0xQcGF0aHdheXNbb3JkZXIoR09MUHBhdGh3YXlzJHAuVmFsdWUsIGRlY3JlYXNpbmc9VFJVRSksIF0KCmNvbG9yUmFtcCA8LSBjb2xvclJhbXBQYWxldHRlKGMoInR1cnF1b2lzZTEiLCAibWVkaXVtYmx1ZSIpKSg1MCkKcGFyKG1hcj1jKDUsIDE4LCAzLCA4KSkKcGxvdChHT0xQcGF0aHdheXMkUmljaC5GYWN0b3IsIGMoMTozNSksIGF4ZXM9RiwKICAgICBwYW5lbC5maXJzdD1hYmxpbmUoaD0xOjM1LCB2PXNlcSgwLjEsIDAuNiwgMC4xKSwgY29sPSJncmV5OTAiKSwKICAgICBjZXg9YXMubnVtZXJpYyhHT0xQcGF0aHdheXMkR2VuZS5OdW1iZXIpLzIwLAogICAgIGNvbD1jb2xvclJhbXBbY3V0KGFzLm51bWVyaWMoR09MUHBhdGh3YXlzJHAuVmFsdWUpLCBicmVha3M9NTApXSwKICAgICBwY2g9MjAsIHlsYWI9IiAiLCB4bGFiPSJSaWNoIEZhY3RvciIsIG1haW49IlBhdGh3YXlzIEVucmljaGVkIiwKICAgICB4bGltPWMoMCwgMC42KSkKYXhpcyhzaWRlPTIsIGF0PTE6MzUsIGxhYmVscz1hcy5jaGFyYWN0ZXIoR09MUHBhdGh3YXlzJFBhdGh3YXkpLCBsYXM9MiwgY2V4LmF4aXM9MC41KQpheGlzKHNpZGU9MSwgdGljaz1HT0xQcGF0aHdheXMkUmljaC5GYWN0b3IsIHBvcz0wLjQpCmBgYAoKIyBWb2xjYW5vIHBsb3QgTV9MUFNfNCB2IE1fTFBfNAoKIyMgRmlndXJlIDNCIHRvcC1sZWZ0CgpgYGB7ciBmaXJzdF92b2xjYW5vfQpyZXMgPC0gcmVhZC5jc3YoImNzdi90b3BUYWJfTV9MUFN2TV9MUF9DRFNfbGltbWFiYXRjaGNvcnJlY3Rpb25fMjAxNzExMjByZXYuY3N2IiwKICAgICAgICAgICAgICAgIGhlYWRlcj1UUlVFKQpoZWFkKHJlcykKd2l0aChyZXMsIHBsb3QobG9nRkMsIC1sb2cxMChQLlZhbHVlKSwgY2V4PTAuOCwKICAgICAgICAgICAgICAgcGNoPTIwLCBtYWluPSJWb2xjYW5vIHBsb3QgTV9MUFMgdiBNX0xQIiwgeGxpbT1jKC03LCA3KSkpCiMjIEFkZCBjb2xvcmVkIHBvaW50czogcmVkIGlmIHBhZGo8MC4wNSwgb3JhbmdlIG9mIGxvZzJGQz4xLCBncmVlbiBpZiBib3RoKQp3aXRoKHN1YnNldChyZXMsIGFkai5QLlZhbCA8IDAuMDUgKSwgcG9pbnRzKGxvZ0ZDLCAtbG9nMTAoUC5WYWx1ZSksIGNleD0wLjgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGNoPTIwLCBjb2w9InZpb2xldHJlZDIiKSkKd2l0aChzdWJzZXQocmVzLCBhYnMobG9nRkMpID4gMSksIHBvaW50cyhsb2dGQywgLWxvZzEwKFAuVmFsdWUpLCBjZXg9MC44LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBjaD0yMCwgY29sPSJvcmFuZ2UiKSkKd2l0aChzdWJzZXQocmVzLCBhZGouUC5WYWwgPCAwLjA1ICYgYWJzKGxvZ0ZDKSA+IDEpLAogICAgIHBvaW50cyhsb2dGQywgLWxvZzEwKFAuVmFsdWUpLAogICAgICAgICAgICBjZXg9MC44LCBwY2g9MjAsIGNvbD0idHVycXVvaXNlMyIpKQpkZXYuY29weShwbmcsICJpbWFnZXMvVm9sY2Fub1Bsb3RfTV9MUFNfdnNfTV9MUC5wbmciLCB3aWR0aD03MDAsIGhlaWdodD03MDApCmRldi5vZmYoKQpgYGAKCiMjIyBUaGUgbnVtYmVyIG9mIHVwIHNpZ25pZmljYW50IGdlbmVzCgpgYGB7ciBwcmludF9udW1iZXJzX3VwMX0Kc2lnX3VwX2lkeCA8LSByZXNbLCAiYWRqLlAuVmFsIl0gPCAwLjA1ICYgcmVzWywgImxvZ0ZDIl0gPiAxCnN1bShzaWdfdXBfaWR4KQpzaWdfdXBfaWRzIDwtIHJlc1tzaWdfdXBfaWR4LCAiSUQiXQpoZWFkKHNpZ191cF9pZHMpCm1fbHBzX21fbHBfdXBfaWRzIDwtIHNpZ191cF9pZHMKYGBgCgojIyMgVGhlIG51bWJlciBvZiBkb3duIHNpZ25pZmljYW50IGdlbmVzCgpgYGB7ciBwcmludF9udW1iZXJzX2Rvd24xfQpzaWdfZG93bl9pZHggPC0gcmVzWywgImFkai5QLlZhbCJdIDwgMC4wNSAmIHJlc1ssICJsb2dGQyJdIDwgLTEKc3VtKHNpZ19kb3duX2lkeCkKc2lnX2Rvd25faWRzIDwtIHJlc1tzaWdfZG93bl9pZHgsICJJRCJdCmhlYWQoc2lnX2Rvd25faWRzKQptX2xwc19tX2xwX2Rvd25faWRzIDwtIHNpZ19kb3duX2lkcwpgYGAKCiMgVm9sY2FubyBwbG90IE1fTFBTXzQgdiBNX0xBXzQKCiMjIEZpZ3VyZSAzQiB0b3AtcmlnaHQKCmBgYHtyIHNlY29uZF92b2xjYW5vfQojI3JlcyA8LSByZWFkLnRhYmxlKCJ0b3BUYWJfTV9MUFN2TV9MQV9DRFNfbGltbWFiYXRjaGNvcnJlY3Rpb25fMjAxNzExMjAudHh0IiwKIyMgICAgICAgICAgICAgICAgICBoZWFkZXI9VFJVRSkKcmVzIDwtIHJlYWQuY3N2KGxwc19sYV90YWJsZSkKaGVhZChyZXMpCndpdGgocmVzLCBwbG90KGxvZ0ZDLCAtbG9nMTAoUC5WYWx1ZSksIGNleD0wLjgsIHBjaD0yMCwKICAgICAgICAgICAgICAgbWFpbj0iVm9sY2FubyBwbG90IE1fTFBTIHYgTV9MQSIsIHhsaW09YygtNywgNykpKQojIyBBZGQgY29sb3JlZCBwb2ludHM6IHJlZCBpZiBwYWRqPDAuMDUsIG9yYW5nZSBvZiBsb2cyRkM+MSwgZ3JlZW4gaWYgYm90aCkKd2l0aChzdWJzZXQocmVzLCBhZGouUC5WYWwgPCAwLjA1ICksIHBvaW50cyhsb2dGQywgLWxvZzEwKFAuVmFsdWUpLCBjZXg9MC44LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBjaD0yMCwgY29sPSJ2aW9sZXRyZWQyIikpCndpdGgoc3Vic2V0KHJlcywgYWJzKGxvZ0ZDKSA+IDEpLCBwb2ludHMobG9nRkMsIC1sb2cxMChQLlZhbHVlKSwgY2V4PTAuOCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwY2g9MjAsIGNvbD0ib3JhbmdlIikpCndpdGgoc3Vic2V0KHJlcywgYWRqLlAuVmFsPC4wNSAmIGFicyhsb2dGQykgPiAxKSwKICAgICBwb2ludHMobG9nRkMsIC1sb2cxMChQLlZhbHVlKSwKICAgICAgICAgICAgY2V4PTAuOCwgcGNoPTIwLCBjb2w9InR1cnF1b2lzZTMiKSkKZGV2LmNvcHkocG5nLCAiaW1hZ2VzL1ZvbGNhbm9QbG90X01fTFBTX3ZfTV9MQS5wbmciLCB3aWR0aD03MDAsIGhlaWdodD03MDApCmRldi5vZmYoKQpgYGAKCiMjIyBUaGUgbnVtYmVyIG9mIHVwIHNpZ25pZmljYW50IGdlbmVzCgpgYGB7ciBwcmludF9udW1iZXJzX3VwMn0Kc2lnX3VwX2lkeCA8LSByZXNbLCAiYWRqLlAuVmFsIl0gPCAwLjA1ICYgcmVzWywgImxvZ0ZDIl0gPiAxCnN1bShzaWdfdXBfaWR4KQpzaWdfdXBfaWRzIDwtIHJlc1tzaWdfdXBfaWR4LCAiSUQiXQpoZWFkKHNpZ191cF9pZHMpCm1fbHBzX21fbGFfc2lnX2lkcyA8LSBzaWdfdXBfaWRzCmBgYAoKIyMjIFRoZSBudW1iZXIgb2YgZG93biBzaWduaWZpY2FudCBnZW5lcwoKYGBge3IgcHJpbnRfbnVtYmVyc19kb3duMn0Kc2lnX2Rvd25faWR4IDwtIHJlc1ssICJhZGouUC5WYWwiXSA8IDAuMDUgJiByZXNbLCAibG9nRkMiXSA8IC0xCnN1bShzaWdfZG93bl9pZHgpCnNpZ19kb3duX2lkcyA8LSByZXNbc2lnX2Rvd25faWR4LCAiSUQiXQpoZWFkKHNpZ19kb3duX2lkcykKYGBgCgojIFZvbGNhbm8gcGxvdCBHTV9MUFNfNCB2IEdNX0xBXzQKCiMjIEZpZ3VyZSAzQiBib3R0b20tcmlnaHQKCmBgYHtyIHRoaXJkX3ZvbGNhbm99CnJlcyA8LSByZWFkLmNzdihnbV9scHNfbGFfdGFibGUpCiMjcmVzIDwtIHJlYWQudGFibGUoIkdNX0xQUyB2IEdNX0xBL3RvcFRhYl9HTV9MUFN2R01fTEFfQ0RTX2xpbW1hYmF0Y2hjb3JyZWN0aW9uXzIwMTcxMDIzLnR4dCIsCiMjaGVhZGVyPVRSVUUpCmhlYWQocmVzKQp3aXRoKHJlcywgcGxvdChsb2dGQywgLWxvZzEwKFAuVmFsdWUpLCBjZXg9MC44LCBwY2g9MjAsCiAgICAgICAgICAgICAgIG1haW49IlZvbGNhbm8gcGxvdCBHTV9MUFNfNCB2IEdNX0xBXzQiLCB4bGltPWMoLTcsIDcpKSkKIyMgQWRkIGNvbG9yZWQgcG9pbnRzOiByZWQgaWYgcGFkajwwLjA1LCBvcmFuZ2Ugb2YgbG9nMkZDPjEsIGdyZWVuIGlmIGJvdGgpCndpdGgoc3Vic2V0KHJlcywgYWRqLlAuVmFsIDwgMC4wNSksIHBvaW50cyhsb2dGQywgLWxvZzEwKFAuVmFsdWUpLCBjZXg9MC44LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGNoPTIwLCBjb2w9InZpb2xldHJlZDIiKSkKd2l0aChzdWJzZXQocmVzLCBhYnMobG9nRkMpID4gMSksIHBvaW50cyhsb2dGQywgLWxvZzEwKFAuVmFsdWUpLCBjZXg9MC44LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBjaD0yMCwgY29sPSJvcmFuZ2UiKSkKd2l0aChzdWJzZXQocmVzLCBhZGouUC5WYWwgPCAwLjA1ICYgYWJzKGxvZ0ZDKSA+IDEpLAogICAgIHBvaW50cyhsb2dGQywgLWxvZzEwKFAuVmFsdWUpLCBjZXg9MC44LCBwY2g9MjAsIGNvbD0idHVycXVvaXNlMyIpKQpkZXYuY29weShwbmcsICJpbWFnZXMvVm9sY2Fub1Bsb3QgR01fTFBTIHYgR01fTEEiLCB3aWR0aD03MDAsIGhlaWdodD03MDApCmRldi5vZmYoKQpgYGAKCiMjIyBUaGUgbnVtYmVyIG9mIHVwIHNpZ25pZmljYW50IGdlbmVzCgpgYGB7ciBwcmludF9udW1iZXJzX3VwM30Kc2lnX3VwX2lkeCA8LSByZXNbLCAiYWRqLlAuVmFsIl0gPCAwLjA1ICYgcmVzWywgImxvZ0ZDIl0gPiAxCnN1bShzaWdfdXBfaWR4KQpzaWdfdXBfaWRzIDwtIHJlc1tzaWdfdXBfaWR4LCAiSUQiXQpoZWFkKHNpZ191cF9pZHMpCmBgYAoKIyMjIFRoZSBudW1iZXIgb2YgZG93biBzaWduaWZpY2FudCBnZW5lcwoKYGBge3IgcHJpbnRfbnVtYmVyc19kb3duM30Kc2lnX2Rvd25faWR4IDwtIHJlc1ssICJhZGouUC5WYWwiXSA8IDAuMDUgJiByZXNbLCAibG9nRkMiXSA8IC0xCnN1bShzaWdfZG93bl9pZHgpCnNpZ19kb3duX2lkcyA8LSByZXNbc2lnX2Rvd25faWR4LCAiSUQiXQpoZWFkKHNpZ19kb3duX2lkcykKYGBgCgojIFZvbGNhbm8gcGxvdCBHTV9MUFNfNCB2IEdNX0xQXzQKCiMjIEZpZ3VyZSAzQiBib3R0b20tbGVmdAoKU28sIGl0IGFwcGVhcnMgSSBnZXQgdGhlIGludmVyc2Ugb2Ygd2hhdCBpcyBpbiB0aGUgZmlndXJlLiAgRGlkIHRoZSBjb250cmFzdCBnZXQgcmV2ZXJzZWQ/CgpJIHdlbnQgYmFjayB0byB0aGUgc2VjdGlvbiB3aGljaCBkZWZpbmVzIHRoaXMsIGl0IGhhcyB0aGUgaGVhZGluZwonR01fTFBTX3ZfR01fTFAnIGFuZCB0aGUgY29udHJhc3QgYXBwZWFycyB0byBtZSB0byBiZSBjb3JyZWN0LiAgQXQgbGVhc3QgaXQgaXMKd3JpdHRlbiBsaWtlIHRoaXM6Cgo8Y29kZT4KR01fTFBTLkdNX0xQLmNvbnRyLm1hdCA8LSBtYWtlQ29udHJhc3RzKEdNX0xQU3ZHTV9MUD0oKGNvbmRHTV9MUFMtY29uZEdNX05TKS0oY29uZEdNX0xQLWNvbmRHTV9OUykpLApsZXZlbHM9diRkZXNpZ24pCjwvY29kZT4KCk15IGluY2xpbmF0aW9uIGlzIHRoZXJlZm9yZSB0aGF0IHRoaXMgZ290IGZsaXBwZWQ/CgpgYGB7ciBmb3VydGhfdm9sY2Fub30KIyNyZXMgPC0gcmVhZC50YWJsZSgidG9wVGFiX0dNX0xQU3ZHTV9MUF9DRFNfbGltbWFiYXRjaGNvcnJlY3Rpb25fMjAxNzEwMjMudHh0IiwKIyMgICAgICAgICAgICAgICAgICBoZWFkZXI9VFJVRSkKcmVzIDwtIHJlYWQuY3N2KGdtX2xwc19scF90YWJsZSkKaGVhZChyZXMpCndpdGgocmVzLCBwbG90KGxvZ0ZDLCAtbG9nMTAoUC5WYWx1ZSksIGNleD0wLjgsIHBjaD0yMCwKICAgICAgICAgICAgICAgbWFpbj0iVm9sY2FubyBwbG90IEdNX0xQUyB2IEdNX0xQIiwgeGxpbT1jKC03LCA3KSkpCiMjIEFkZCBjb2xvcmVkIHBvaW50czogcmVkIGlmIHBhZGo8MC4wNSwgb3JhbmdlIG9mIGxvZzJGQz4xLCBncmVlbiBpZiBib3RoKQp3aXRoKHN1YnNldChyZXMsIGFkai5QLlZhbCA8IDAuMDUgKSwgcG9pbnRzKGxvZ0ZDLCAtbG9nMTAoUC5WYWx1ZSksIGNleD0wLjgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGNoPTIwLCBjb2w9InZpb2xldHJlZDIiKSkKd2l0aChzdWJzZXQocmVzLCBhYnMobG9nRkMpID4gMSksIHBvaW50cyhsb2dGQywgLWxvZzEwKFAuVmFsdWUpLCBjZXg9MC44LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBjaD0yMCwgY29sPSJvcmFuZ2UiKSkKd2l0aChzdWJzZXQocmVzLCBhZGouUC5WYWw8LjA1ICYgYWJzKGxvZ0ZDKSA+IDEpLAogICAgIHBvaW50cyhsb2dGQywgLWxvZzEwKFAuVmFsdWUpLCBjZXg9MC44LCBwY2g9MjAsIGNvbD0idHVycXVvaXNlMyIpKQpkZXYuY29weShwbmcsICJpbWFnZXMvVm9sY2Fub1Bsb3QgR01fTFBTIHYgR01fTFAiLCB3aWR0aD03MDAsIGhlaWdodD03MDApCmRldi5vZmYoKQpgYGAKCiMjIyBUaGUgbnVtYmVyIG9mIHVwIHNpZ25pZmljYW50IGdlbmVzCgpgYGB7ciBwcmludF9udW1iZXJzX3VwNH0Kc2lnX3VwX2lkeCA8LSByZXNbLCAiYWRqLlAuVmFsIl0gPCAwLjA1ICYgcmVzWywgImxvZ0ZDIl0gPiAxCnN1bShzaWdfdXBfaWR4KQpzaWdfdXBfaWRzIDwtIHJlc1tzaWdfdXBfaWR4LCAiSUQiXQpoZWFkKHNpZ191cF9pZHMpCmBgYAoKIyMjIFRoZSBudW1iZXIgb2YgZG93biBzaWduaWZpY2FudCBnZW5lcwoKYGBge3IgcHJpbnRfbnVtYmVyc19kb3duNH0Kc2lnX2Rvd25faWR4IDwtIHJlc1ssICJhZGouUC5WYWwiXSA8IDAuMDUgJiByZXNbLCAibG9nRkMiXSA8IC0xCnN1bShzaWdfZG93bl9pZHgpCnNpZ19kb3duX2lkcyA8LSByZXNbc2lnX2Rvd25faWR4LCAiSUQiXQpoZWFkKHNpZ19kb3duX2lkcykKYGBgCgojIyMgRmlndXJlIDJCCgpJIHRoaW5rIHRoZSBjb2RlIEkgdXNlZCBmb3IgdGhlIHZlbm4gZGlhZ3JhbXMgaXMgaW4gdGhlIFJtYXJrZG93biBmaWxlIHRvd2FyZHMKdGhlIGVuZC4gIEhvd2V2ZXIsIEkgaGF2ZSAyIGZpbGVzIHNhdmVkIGZvciB0aGUgdmVubiBkaWFncmFtcyB0aGF0IGFyZSBkaWZmZXJlbnQKZnJvbSB3aGF0IEkgaGF2ZSBpbiBmaWd1cmUgMkIuICBJIHRoaW5rIEkgbmVlZCB0byBzd2FwIHRoZSBjdXJyZW50IDJCIHdpdGggdGhlCnZlbm4gZGlhZ3JhbXMgSSBoYXZlIGF0dGFjaGVkIGJlbG93IGJlY2F1c2UgdGhlIG51bWJlcnMgaGVyZSBtYXRjaCB3aXRoIHRoZQp2b2xjYW5vIHBsb3RzLiAgQXJlIHRoZXNlIHRoZSBudW1iZXJzIHlvdSBhcmUgZ2V0dGluZyBhbHNvPwoKIyMjIyBBdHRlbXB0IDEKClRoaXMgaXMganVzdCBwdWxsaW5nIHRoZSBNIExQL0xQUyBMQS9MUFMgc2lnbmlmaWNhbnQgZ2VuZXMuClRoaXMgYXBwZWFycyB0byBub3QgYmUgdGhlIGFuc3dlci4KCmBgYHtyIGZpZzJifQpscHNfcGdlX3NpZyA8LSBNX0xQUy5NX0xQLnNpZ0dlbmVzCnVwX2lkeCA8LSBscHNfcGdlX3NpZ1tbImxvZ0ZDIl1dID4gMApkb3duX2lkeCA8LSBscHNfcGdlX3NpZ1tbImxvZ0ZDIl1dIDwgMApscHNfcGdlX3VwX2lkcyA8LSBscHNfcGdlX3NpZ1t1cF9pZHgsICJJRCJdCmxwc19wZ2VfZG93bl9pZHMgPC0gbHBzX3BnZV9zaWdbZG93bl9pZHgsICJJRCJdCmxwc19hX3NpZyA8LSBNX0xQUy5NX0xBLnNpZ0dlbmVzCnVwX2lkeCA8LSBscHNfYV9zaWdbWyJsb2dGQyJdXSA+IDAKZG93bl9pZHggPC0gbHBzX2Ffc2lnW1sibG9nRkMiXV0gPCAwCmxwc19hX3VwX2lkcyA8LSBscHNfYV9zaWdbdXBfaWR4LCAiSUQiXQpscHNfYV9kb3duX2lkcyA8LSBscHNfYV9zaWdbZG93bl9pZHgsICJJRCJdCgp2X2RhdGEgPC0gbGlzdChscHNfcGdlX3VwX2lkcywgbHBzX2FfdXBfaWRzKQp2X2RhdGEgPC0gVmVubih2X2RhdGEsIFNldE5hbWVzPWMoIkxQUytQR0UyIiwgIkxQUytBZG8iKSwgbnVtYmVyT2ZTZXRzPTIpClZlbm5lcmFibGU6OnBsb3Qodl9kYXRhLCBkb1dlaWdodHM9RkFMU0UpCgp2X2RhdGEgPC0gbGlzdChscHNfcGdlX2Rvd25faWRzLCBscHNfYV9kb3duX2lkcykKdl9kYXRhIDwtIFZlbm4odl9kYXRhLCBTZXROYW1lcz1jKCJMUFMrUEdFMiIsICJMUFMrQWRvIiksIG51bWJlck9mU2V0cz0yKQpWZW5uZXJhYmxlOjpwbG90KHZfZGF0YSwgZG9XZWlnaHRzPUZBTFNFKQpgYGAKCiMjIyMgQXR0ZW1wdCAyCgpMZXRzIGFzc3VtZSB0aGVyZSBpcyBhIGhpbnQgaW4gdGhlIHRleHQgYW5kIHRoYXQgSSBzaG91bGQgcHVsbCBmcm9tIHRoZSB2b2xjYW5vCnBsb3QgbnVtYmVycyBmb3IgTSBMUC9MUFMgYW5kIE0gTEEvTFBTCgpgYGB7ciBhdHRlbXB0Mn0Kdl9kYXRhIDwtIFZlbm4obGlzdChtX2xwc19tX2xwX3VwX2lkcywgbV9scHNfbV9sYV91cF9pZHMpLAogICAgICAgICAgICAgICBTZXROYW1lcz1jKCJMUFMrUEdFMiIsICJMUFMrQWRvIikpClZlbm5lcmFibGU6OnBsb3Qodl9kYXRhKQoKdl9kYXRhIDwtIFZlbm4obGlzdChtX2xwc19tX2xwX2Rvd25faWRzLCBtX2xwc19tX2xhX2Rvd25faWRzKSwKICAgICAgICAgICAgICAgU2V0TmFtZXM9YygiTFBTK1BHRTIiLCAiTFBTK0FkbyIpKQpWZW5uZXJhYmxlOjpwbG90KHZfZGF0YSkKYGBgCg==