Part A: Methodological Derivations
Problem A1:
Show that the density function of the Kumaraswamy distribution is
\[
f(x; a, b) = ab \, x^{a-1} (1 - x^a)^{b-1}.
\]
In order to get the probability density function (pdf) for the
Kumaraswamy distribution we must take the derivative of the cdf: \[
f(x; a, b) = \frac{d}{dx} F(x; a, b) = \frac{d}{dx} [1 - (1 - x^a)^b]
\]
Using the chain rule, we obtain:
\[
f(x; a, b) = -b(1 - x^a)^{b-1} \cdot -ax^{a-1}
\]
Once simplified, the pdf is: \[
f(x; a, b) = abx^{a-1}(1 - x^a)^{b-1}
\]
Problem A2:
Let \(\{x_1, x_2, \cdots, x_n \}\)
be an i.i.d. random sample taken from a population that follows the aove
2-parameter Kumaraswamy distribution. Write out the loglikelihood
function of \(a\) and \(b\), denoted by \(\ell(a,b)\), based on the above random
sample and derive the gradient vector \([\ell_a^\prime(a,b), \ell_b^\prime(a,b)]\),
the first order partial derivative of the log-likelihood with respect to
parameters \(a\) and \(b\).
From Problem A1, the PDF is: \[
f(x) = abx^{a-1}(1 - x^a)^{b-1}, \quad 0 < x < 1, a > 0, b >
0
\]
The likelihood function \(L(a, b)\)
is: \[
L(a, b) = \prod_{i=1}^n f(x_i; a, b) = \prod_{i=1}^n abx_i^{a-1}(1 -
x_i^a)^{b-1}
\]
Rewriting the equation, we get: \[
\prod_{i=1}^n ab \cdot \prod_{i=1}^n x_i^{a-1} \cdot \prod_{i=1}^n (1 -
x_i^a)^{b-1}
\] \[
= a^n b^n \cdot \prod_{i=1}^n x_i^{a-1} \prod_{i=1}^n (1 - x_i^a)^{b-1}
\]
To get the log-likelihood function, \(\ell(a, b)\), we take the natural log of
the likelihood function. The log-likelihood function is: \[
\ell(a, b) = \ln L(a, b) = n \ln a + n \ln b + (a-1) \sum_{i=1}^n \ln
x_i + (b-1) \sum_{i=1}^n \ln(1 - x_i^a)
\]
To build our gradient vector, we need the first-order partial
derivatives: \[
\ell'_a(a, b) = \frac{\partial \ell}{\partial a} = \frac{n}{a} +
\sum \ln x + (b-1) \sum \frac{x_i^a \ln x_i}{1 - x_i^a}
\] \[
\ell'_b = \frac{\partial \ell}{\partial b} = \frac{n}{b} + \sum
\ln(1 - x_i^a)
\]
The gradient vector \(\nabla \ell\)
is: \[
\nabla \ell = \left[ \frac{n}{a} + \sum \ln x + \sum \frac{(b-1) x_i^a
\ln x_i}{1 - x_i^a}, \frac{n}{b} + \sum \ln(1 - x_i^a) \right]
\]
Problem A3:
Based on the gradients functions obtained in the above problem A2,
derive the observed Fisher Information matrix (i.e, the
negative Hessian Matrix).
In order to obtain the Fisher matrix, we need to get our second order
partial derivatives.
The second-order partial derivatives are: \[
\frac{\partial^2 \ell}{\partial a^2} = -\frac{n}{a^2} + \sum \frac{(b-1)
x_i^a (\ln x_i)^2}{1 - x_i^a}
\] \[
\frac{\partial^2 \ell}{\partial a \partial b} = \sum \frac{x_i^a \ln
x_i}{1 - x_i^a}
\] \[
\frac{\partial^2 \ell}{\partial b \partial a} = \sum \frac{x_i^a \ln
x_i}{1 - x_i^a}
\] \[
\frac{\partial^2 \ell}{\partial b^2} = -\frac{n}{b^2}
\]
If we were to build the matrix as is, we would get the hessian
matrix. But there’s good news: the Fisher information matrix is just the
hessian matrix multiplied by a scalar of -1. So, we can multiply each
partial derivative by -1 and then build the matrix.
The Fisher Matrix ends up as: \[
\begin{bmatrix} \frac{n}{a^2} - \sum \frac{(b-1)x^a(\ln x)^2}{1-x^a}
& -\sum \frac{x^a \ln x}{1-x^a} \\ -\sum \frac{x^a \ln x}{1-x^a}
& \frac{n}{b^2} \end{bmatrix}
\]
Â
Problem A4:
Consider power distribution \(F(x) = x^a,
(a >0 \quad \text{ and }\quad x \in (0,1))\), a special case
of the Kumaraswamy distribution with \(b =
1\), and a random sample from this distribution \(\{ x_1, x_2, \cdots, x_n\}\).
Derive the MLE and MME of \(a\) respectively. [Hint: To find the
MME, you need to compute the moment of the power distribution; that is,
\(E[X^k] = \int_0^1 x^k F'(x) dx\).
Note that both the MLE and the MME have closed-form
expressions.]
In order to derive either estimate for a, we need the pdf of the
distribution. To get the pdf from the cdf, we need to take the
derivative of the cdf: \[
f(x; a) \frac{d}{dx} F(x; a) = \frac{d}{dx} = x^a
\] \[
f(x; a) = ax^{a-1}, \quad 0 < x < 1, \quad a > 0
\]
From here, let’s first derive the MLE for a. Once the pdf is
obtained, we can get the likelihood function: \[
L(a) = \prod_{i=1}^n f(x_i; a) = \prod_{i=1}^n ax_i^{a-1} = a^n
\prod_{i=1}^n x_i^{a-1}
\]
And then the Log-likelihood function: \[
\ell(a) = \ln L = n \ln a + (a-1) \sum_{i=1}^n \ln x_i
\]
Next, we can take the derivative with respect to a and obtain the
score function: \[
\frac{d\ell}{da} = \frac{n}{a} + \sum_{i=1}^n \ln x_i
\] Unlike before, we didn’t need to solve for any parameters, as
we were just building a vector of the score functions. But, now we do
need to solve for a parameter.
To do so, we need to set the derivative equal to 0 and solve for a.
\[
\frac{n}{a} + \sum_{i=1}^n \ln x_i = 0
\]
Solving for a, we get our maximum likelihood estimator for a: \[
\hat{a} = -\frac{n}{\sum_{i=1}^n \ln x_i}
\]
Next, we can get the method of moments estimator for a. To do so, we
must set the population moment equal to the sample moment. Since we are
only estimating one parameter, we only need the first population and
sample moments.
The first moment for either a population or sample is the mean. To
get the population mean, we need to compute the expected value of x. The
expected value of x is: \[
\mu_x = \int_0^1 x \cdot ax^{a-1} \, dx = \int_0^1 ax^a \, dx = \left[
\frac{ax^{a+1}}{a+1} \right]_0^1 = \frac{a}{a+1}
\]
Once we get the population mean, we can set it equal to the sample
mean: \[
\mu_x = \bar{x} \implies \bar{x} = \frac{a}{a+1}
\]
Solving for a, we get the method of moments estimator for a: \[
\hat{a} = \frac{\bar{x}}{1 - \bar{x}}
\]
Problem A5:
Using the same setting as in Problem A4, find the
asymptotic (Wald) confidence interval for \(a\). [Hint: Compute the Fisher
information for \(a\), then take its
reciprocal to obtain the variance.]
A Wald confidence interval looks like: \[
\text{Wald CI} = \hat{a} \pm z_{1-\alpha/2}*se,
\]
where \(\hat{a}\) is the maximum
likelihood estimate for a, \(z_{1-\alpha/2}\) is the critical value of
the \((1 - \alpha)*100%\) confidence
level, and se is the standard error.
Assuming we’re building a 95% Wald Confidence Interval, which would
mean that \(\alpha = 0.05\):
\[
95\% \text{ CI} = \left( \hat{a} - z_{0.975}*se, \hat{a} + 1.96*se
\right)
\]
We already have the maximum likelihood estimate from problem A4. But
what is the critical z value and the standard error? Getting the
critical z value is easy: that can just be looked up. The critical z
value for a 95% confidence interval is 1.96. Getting the standard error
is a little more difficult because that requires some math.
To get the standard error, we need to go back to the log likelihood
function of a. We will first obtain the variance of a by taking the
second derivative of the log-likelihood function (or the derivative of
the score function we already obtained in problem A4). Regardless, we
should get: \[
\frac{d^2\ell}{da^2} = -\frac{n}{a^2}
\]
From here, we can compute the Fisher information, which is just the
negative expected value of the second derivative. Since the second
derivative is just a constant, the expected value will just be that
derivative. Multiply it by -1, we get the fisher information.
\[
I(a) = -E\left(\frac{d^2 \ell}{da^2}\right) = \frac{n}{a^2}$
\]
To get the variance, we just take the reciprocal of the fisher
information. \[
Var(a) = \frac{a^2}{n}
\]
To get the standard error, we just take the square root of the
variance: \[
{se}(a) = \frac{a}{\sqrt{n}}
\]
And now we can build the 95% Wald Confidence Interval: \[
95\% \text{Wald CI} = \left( \hat{a} - 1.96 \frac{\hat{a}}{\sqrt{n}},
\hat{a} + 1.96 \frac{\hat{a}}{\sqrt{n}} \right)
\]
Problem A6:
Using the same setting as in Problem A4, perform a
likelihood ratio test for the hypothesis \(H_0
:a=1\) (i.e., the power distribution reduces to a uniform
distribution). [Hint: Evaluate the log-likelihood function at the
maximum likelihood estimate \(\hat{a}\)
and at \(a=1\), then use these values
to construct the LRT test statistic.]
When doing a likelihood ratio test, we are comparing the fitness of
two models: a simpler restricted model, or a more complex unrestricted
model. In this case, we are going to test whether or not a power
distribution or another Kumaraswamy based distribution will fit the data
better. In other words, is this sample more likely to come from a
population that is modeled with a power distribution or another
Kumaraswamy based distribution?
\[
H_0: a = 1 (Power Distribution)
H_a: a \neq 1 (Kumaraswamy Distribution)
\]
To conduct our test, we need to evalute the log likelihood of the
power distribution at two points: the first is when a is set to 1, which
gives us our restricted model and the second is when a is set to the
maximum likelihood estimator, which gives us our unrestricted model.
The null hypothesis, \(H_0\): \[
a = 1 \implies \ell(1) = 0
\]
The alternative hypothesis, \(H_a\):
\[
a=\hat{a} \implies \ell(\hat{a}) = n \ln \hat{a} + (\hat{a}-1)
\sum_{i=1}^n \ln x_i
\]
The test statistic will be: \[
LR = 2[\ell(\hat{a}) - \ell(1)] = 2 \left[ n \ln \hat{a} + (\hat{a}-1)
\sum_{i=1}^n \ln x_i \right]
\]
There are several important things to note here: The first is that
this test will work better if the sample size is large enough. The
second is that if the sample size is large enough, then the test
statistic will asymptotically follow a \(\chi^2\) distribution with 1 degree of
freedom. The the third is that this is a two tailed test. Which means
that there are two rejection regions: if the \(\chi^2\) statistic you obtain is less than
the critical value associated with \(\frac{\alpha}{2}\) or greater than the
critical value associated with \(\{frac{1-\alpha}{2}\). If \(n\) is large enough (\(n > 30\)), then \(LR \sim \chi_1^2\). For example, if the
level of significance is 0.05, then you’d reject the null hypothesis if
your test statistic was less than 0.000982 (and so on) or greater than
5.023886. But at least the p-value doesn’t change for rejection; you
reject the null if the p-value is less than the level of
significance.
Part B: Numerical Analysis
All code must be well commented and adhere to best coding
practices
Working Dataset: A small reservoir supplies water to
a town. During the dry season (50 days), engineers record the fraction
of usable storage filled each morning. Values near 0 mean the reservoir
is nearly empty; values near 1 mean it’s full. The distribution tends to
be right‑skewed (mostly low levels due to drought) but with occasional
replenishment.
The following 50 data points (ordered for clarity) represent the
daily proportion of usable storage:
0.12, 0.14, 0.15, 0.16, 0.17, 0.18, 0.19, 0.20, 0.21, 0.22,
0.23, 0.24, 0.25, 0.26, 0.27, 0.28, 0.29, 0.30, 0.31, 0.32,
0.33, 0.34, 0.35, 0.36, 0.37, 0.38, 0.39, 0.40, 0.41, 0.42,
0.43, 0.44, 0.45, 0.46, 0.47, 0.48, 0.49, 0.50, 0.51, 0.52,
0.53, 0.54, 0.55, 0.56, 0.57, 0.58, 0.59, 0.60, 0.61, 0.78
# Putting Data Into An Object
water <- c(0.12, 0.14, 0.15, 0.16, 0.17, 0.18, 0.19, 0.20, 0.21, 0.22,
0.23, 0.24, 0.25, 0.26, 0.27, 0.28, 0.29, 0.30, 0.31, 0.32,
0.33, 0.34, 0.35, 0.36, 0.37, 0.38, 0.39, 0.40, 0.41, 0.42,
0.43, 0.44, 0.45, 0.46, 0.47, 0.48, 0.49, 0.50, 0.51, 0.52,
0.53, 0.54, 0.55, 0.56, 0.57, 0.58, 0.59, 0.60, 0.61, 0.78)
Problem B1:
Fit the Kumaraswamy distribution to the above data. Use the
derivations in Problem A2 to find the MLE of \(a\) and \(b\). Please copy the key formulas before
coding.
# Manual MLE implementation for Kumaraswamy distribution
# Kumaraswamy log-likelihood function
kuma.loglik <- function(params, data) {
shape1 <- params[1] # passing the parameters
shape2 <- params[2]
n <- length(data) # sample size
# Log-likelihood for Kumaraswamy distribution
loglik <- n*log(shape1) + n*log(shape2) + (shape1 - 1)*sum(log(data)) +
(shape2 - 1)*sum(log(1 - data^shape1))
return(loglik) # Return negative for minimization
}
## Score (gradient) equation
kuma.score <- function(params, data) {
shape1 <- params[1]
shape2 <- params[2]
n <- length(data)
# Gradient for Parameter a
grad_shape1 <- n/shape1 + sum(log(data)) -
(shape2 - 1)*sum((log(data)*data^shape1)/(1-data^shape1))
# Gradient for Parameter b
grad_shape2 <- (n/shape2) + sum(log(1-data^shape1))
return(c(grad_shape1, grad_shape2))
}
# Need to provide initial values for parameters
initial.params <- c(shape1 = 2.2, shape2 = 1.5) # Reasonable starting values
# Using optim with Nelder-Mead method
mle.result.kuma <- optim(
par = initial.params,
fn = kuma.loglik,
gr = kuma.score,
data = water,
method = "L-BFGS-B",
hessian = TRUE,
control = list(trace = FALSE,
fnscale = -1,
maxit = 500,
abstol = 1e-8)
)
##
mle.result.kuma$par
shape1 shape2
2.529602 7.883386
According to the output, the first shape parameter, a, is equal to
2.529602, and the second shape parameter, b, is equal to 7.883386.
For future use, the estimates will be extracted and put into
objects.
# Extracting the Parameter Estimates for Future Use
shape1.est <- mle.result.kuma$par[1]
shape2.est <- mle.result.kuma$par[2]
kuma.est <- c(shape1.est, shape2.est)
kuma.est
shape1 shape2
2.529602 7.883386
Problem B2:
Fit the power distribution to the above data using
the derived of \(a\) obtained in
Problem A4 to test the following hypothesis using
likelihood ratio procedure ar significance level \(\alpha = 0.05\):
\[
H_0: b = 1 \quad \text{ versus } \quad H_a: b \ne 1.
\]
State the statistical decision clearly. What is the practical
implication of the testing result?
The hypotheses of our test are as follows: \[
H_0: b = 1 (Kumaraswamy becomes a Power Distribution) /
H_a: b \neq 1 (Data follows another Kumaraswamy Distribution)
\]
The following code chunk is for the likelihood ratio test:
# Likelihood Ratio Test For Power vs Kumaraswamy distribution
# MLE Of Power Distribution Parameter from Part A4
n <- length(water)
shape3.mle <- -n / sum(log(water))
# Kumaraswamy Log-Likelihood Function
loglike.kuma <- function(data, a, b) {
n <- length(data)
n*log(a) + n*log(b) + (a - 1)*sum(log(data)) +
(b - 1)*sum(log(1 - data^a))
}
# Power Log-Likelihood Function
loglike.power <- function(data, a) {
n <- length(data)
n*log(a) + (a - 1)*sum(log(data))
}
# Unrestricted and Restricted MLEs for LR Test
loglike.alt1 <- loglike.kuma(water, shape1.est, shape2.est)
loglike.null1 <- loglike.power(water, shape3.mle)
# Likelihood ratio test statistic
LR1 <- 2*(loglike.alt1 - loglike.null1)
# p-value from chi-square(1)
pvalue.LR1 <- 1 - pchisq(LR1, df = 1)
# Test Statistic and P-value
LR1
shape1
48.92533
shape1
2.658984e-12
According to the output, the test statistic is \(\chi^2 = 48.92533\), and the corresponding
p-value is \(2.65x10^-12\). Since the
p-value is less than the level of significance, we can reject the null
hypothesis and conclude that there is sufficient evidence to conclude
that this data comes from another Kumaraswamy based distribution. To put
it in practical terms, the power distribution is not a good fit for this
data, meaning this sample is unlikely to come from a population modeled
by a power distribution. This sample more than likely comes from a
different Kumaraswamy based distribution.
Problem B3:
Use the procedure and code from Problem B1 to
estimate the MLEs of \(a\) and \(b\), and then complete the following
analyses:
(1). Obtain the bootstrap sampling distributions of \(\hat{a}\) and \(\hat{b}\) and plot each distribution using
Gaussian kernel density curves.
First, let’s get our bootstrap samples:
# Bootstrap Sampling Distributions of Kumaraswamy MLEs
# Set Seed to Keep Same Sample
set.seed(1)
# Choose Number of Bootstrap Samples
B <- 5000
# Store bootstrap estimates
boot.a <- NULL
boot.b <- NULL
for(i in 1:B) {
# Bootstrap sample
bootstrap.sample <- sample(water, size = n, replace = TRUE)
# Refit Kumaraswamy model to bootstrap sample
boot.fit <- optim(
par = c(shape1.est, shape2.est),
fn = kuma.loglik,
gr = kuma.score,
data = bootstrap.sample,
method = "L-BFGS-B",
lower = c(1e-8, 1e-8),
control = list(
maxit = 1000,
fnscale = -1,
trace = FALSE,
abstol = 1e-8
)
)
# Save bootstrap estimates
boot.a[i] <- boot.fit$par[1]
boot.b[i] <- boot.fit$par[2]
}
Let’s plot both of the sampling distributions for the estimates of
a
# Plot bootstrap distribution of a_hat
hist(boot.a,
probability = TRUE,
breaks = 20,
col = "lightblue",
main = "Bootstrap Sampling Distribution for Parameter a",
xlab = expression(paste("Estimates for ", hat(a))))
lines(density(boot.a), col = "red", lwd = 2)

# Plot bootstrap distribution of b_hat
hist(boot.b,
probability = TRUE,
breaks = 20,
col = "lightblue",
main = "Bootstrap Sampling Distribution for Parameter b",
xlab = expression(paste("Estimates for ", (hat(b)))))
lines(density(boot.b), col = "red", lwd = 2)
The plot for \(\hat{a}\) appears to
roughly resemble a normal curve. The kernel density curve also does fit
relatively well. As for the plot for \(\hat{b}\), it does not resemble a normal
curve. There is some very obvious skew.
If we take a look at a summary of the distributions, we can clearly
see that there is not too much spread for the distribution of \(\hat{a}\). And the mean is relatively close
to the median. But there is much more spread in the distribution for
\(\hat{b}\), and mean is farther from
the median.
Min. 1st Qu. Median Mean 3rd Qu. Max.
1.767 2.387 2.586 2.622 2.820 4.208
Min. 1st Qu. Median Mean 3rd Qu. Max.
3.756 6.956 8.412 9.022 10.452 32.424
(2). Construct both the \(95\%\)
bootstrap confidence interval and the Wald
confidence interval for \(b\).
Do these intervals agree with the results obtained in Problem
B2? [Compute the standard error of \(\hat{b}\) using the observed Fisher
information matrix, i.e., the inverse of the negative Hessian obtained
from optim()]
# Find Bootstrap and Wald Confidence Intervals for b
# 95% Percentile Bootstrap Confidence Interval
bootci.perc.b <- quantile(boot.b, probs = c(0.025, 0.975))
# Pieces to Build 95% Wald Confidence Interval
hessian <- mle.result.kuma$hessian
fisher <- solve(-hessian)
se.b.est <- sqrt(fisher[2, 2])
z <- qnorm(0.975)
error <- z*se.b.est
# Build Wald Confidence Interval
waldci.b <- c(shape2.est - error, shape2.est + error)
bootci.perc.b
2.5% 97.5%
5.006674 16.188918
shape2 shape2
3.484033 12.282739
The 95% Bootstrap Confidence Interval is (5.0066, 16.1889), and the
95% Wald confidence interval is (3,.484, 12.2827). Neither confidence
interval contains 1, which suggests that the results agree with what we
got in Part B2.
(3). Based on the bootstrap sampling distributions from part (1) of
this problem, assess whether the validity of the Wald confidence
interval is supported.
Since the wald confidence interval is based on asymptotic normality,
the distribution should resemble a normal distribution. However, it did
not. There was considerable skew, and the summary pointed out that there
is considerable spread in the distribution. Based on this criteria, we
can conclude that the Wald confidence interval is not a good confidence
interval to use in this case.
Problem B4:
In the introduction to the working model for this exam, the
Kumaraswamy distribution reduces to the uniform distribution on (0,1).
In this problem, we perform a likelihood ratio test for
the following hypothesis to assess whether the data come from the
uniform distribution on (0,1):
\[
H_0: a = 1\quad \& \quad b = 1\quad \text{ versus } \quad H_a: a \ne
1 \quad \text{or} \quad b \ne 1 \quad \text{or}\quad (a \ne 1 \quad
\& \quad b \ne 1).
\]
Provide a practical interpretation of the above test result.
[Hint: \(H_a\) basically says that
there is no constraints for \(a\) and
\(b\). Please review the lecture note
for module 11 on the likelihood ratio test before coding.]
# Likelihood Ratio test for Uniform vs Kumaraswamy Distribution
# Using Kumaraswamy Likelihood From Part B2
loglike.alt2 <- loglike.kuma(water, shape1.est, shape2.est)
loglike.null2 <- loglike.kuma(water, 1, 1)
# Likelihood ratio test statistic
LR2 <- 2*(loglike.alt2 - loglike.null2)
# p-value from Chi-Square(1)
pvalue.LR2 <- 1 - pchisq(LR2, df = 1)
# Test Statistic and P-value
LR2
shape1
49.12542
shape1
2.401079e-12
The test statistic is \(\chi^2 =
49.12542\), and the corresponding p-value is \(2.4x10^{-12}\). Since the p-value is
smaller than 0.05, then we can reject the null hypothesis, and can
conclude that there is sufficient evidence to conclude that this data
comes from another Kumaraswamy based distribution. In other words, this
sample is unlikely to have originated from a population modeled by a
uniform distribution. To put into practical terms, the measurements are
all not equally likely to occur.
LS0tDQp0aXRsZTogIlNUQSA1MDYgRmluYWwgRXhhbWluYXRpb24iDQphdXRob3I6ICJJYW4gVmFuV3JpZ2h0Ig0KZGF0ZTogIiBEdWU6IDA1LzA1LzIwMjYiDQpvdXRwdXQ6DQogIGh0bWxfZG9jdW1lbnQ6IA0KICAgIHRvYzogeWVzDQogICAgdG9jX2RlcHRoOiA0DQogICAgdG9jX2Zsb2F0OiB5ZXMNCiAgICBudW1iZXJfc2VjdGlvbnM6IG5vDQogICAgdG9jX2NvbGxhcHNlZDogeWVzDQogICAgY29kZV9mb2xkaW5nOiBoaWRlDQogICAgY29kZV9kb3dubG9hZDogeWVzDQogICAgc21vb3RoX3Njcm9sbDogeWVzDQogICAgaGlnaGxpZ2h0OiBtb25vY2hyb21lDQogICAgdGhlbWU6IHNwYWNlbGFiDQogIHBkZl9kb2N1bWVudDogDQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZGVwdGg6IDQNCiAgICBmaWdfY2FwdGlvbjogeWVzDQogICAgbnVtYmVyX3NlY3Rpb25zOiBubw0KICAgIGZpZ193aWR0aDogMw0KICAgIGZpZ19oZWlnaHQ6IDMNCiAgd29yZF9kb2N1bWVudDogDQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZGVwdGg6IDQNCiAgICBmaWdfY2FwdGlvbjogeWVzDQogICAga2VlcF9tZDogeWVzDQplZGl0b3Jfb3B0aW9uczogDQogIGNodW5rX291dHB1dF90eXBlOiBpbmxpbmUNCi0tLQ0KDQpgYGB7Y3NzLCBlY2hvID0gRkFMU0V9DQojVE9DOjpiZWZvcmUgew0KICBjb250ZW50OiAiVGFibGUgb2YgQ29udGVudHMiOw0KICBmb250LXdlaWdodDogYm9sZDsNCiAgZm9udC1zaXplOiAxLjJlbTsNCiAgZGlzcGxheTogYmxvY2s7DQogIGNvbG9yOiBuYXZ5Ow0KICBtYXJnaW4tYm90dG9tOiAxMHB4Ow0KfQ0KDQoNCmRpdiNUT0MgbGkgeyAgICAgLyogdGFibGUgb2YgY29udGVudCAgKi8NCiAgICBsaXN0LXN0eWxlOnVwcGVyLXJvbWFuOw0KICAgIGJhY2tncm91bmQtaW1hZ2U6bm9uZTsNCiAgICBiYWNrZ3JvdW5kLXJlcGVhdDpub25lOw0KICAgIGJhY2tncm91bmQtcG9zaXRpb246MDsNCn0NCg0KaDEudGl0bGUgeyAgICAvKiBsZXZlbCAxIGhlYWRlciBvZiB0aXRsZSAgKi8NCiAgZm9udC1zaXplOiAyMnB4Ow0KICBmb250LXdlaWdodDogYm9sZDsNCiAgY29sb3I6IERhcmtSZWQ7DQogIHRleHQtYWxpZ246IGNlbnRlcjsNCiAgZm9udC1mYW1pbHk6ICJHaWxsIFNhbnMiLCBzYW5zLXNlcmlmOw0KfQ0KDQpoNC5hdXRob3IgeyAvKiBIZWFkZXIgNCAtIGFuZCB0aGUgYXV0aG9yIGFuZCBkYXRhIGhlYWRlcnMgdXNlIHRoaXMgdG9vICAqLw0KICBmb250LXNpemU6IDE1cHg7DQogIGZvbnQtd2VpZ2h0OiBib2xkOw0KICBmb250LWZhbWlseTogc3lzdGVtLXVpOw0KICBjb2xvcjogbmF2eTsNCiAgdGV4dC1hbGlnbjogY2VudGVyOw0KfQ0KDQpoNC5kYXRlIHsgLyogSGVhZGVyIDQgLSBhbmQgdGhlIGF1dGhvciBhbmQgZGF0YSBoZWFkZXJzIHVzZSB0aGlzIHRvbyAgKi8NCiAgZm9udC1zaXplOiAxOHB4Ow0KICBmb250LXdlaWdodDogYm9sZDsNCiAgZm9udC1mYW1pbHk6ICJHaWxsIFNhbnMiLCBzYW5zLXNlcmlmOw0KICBjb2xvcjogRGFya0JsdWU7DQogIHRleHQtYWxpZ246IGNlbnRlcjsNCn0NCg0KaDEgeyAvKiBIZWFkZXIgMSAtIGFuZCB0aGUgYXV0aG9yIGFuZCBkYXRhIGhlYWRlcnMgdXNlIHRoaXMgdG9vICAqLw0KICAgIGZvbnQtc2l6ZTogMjBweDsNCiAgICBmb250LXdlaWdodDogYm9sZDsNCiAgICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsNCiAgICBjb2xvcjogZGFya3JlZDsNCiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7DQp9DQoNCmgyIHsgLyogSGVhZGVyIDIgLSBhbmQgdGhlIGF1dGhvciBhbmQgZGF0YSBoZWFkZXJzIHVzZSB0aGlzIHRvbyAgKi8NCiAgICBmb250LXNpemU6IDE4cHg7DQogICAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogICAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7DQogICAgY29sb3I6IG5hdnk7DQogICAgdGV4dC1hbGlnbjogbGVmdDsNCn0NCg0KaDMgeyAvKiBIZWFkZXIgMyAtIGFuZCB0aGUgYXV0aG9yIGFuZCBkYXRhIGhlYWRlcnMgdXNlIHRoaXMgdG9vICAqLw0KICAgIGZvbnQtc2l6ZTogMTZweDsNCiAgICBmb250LXdlaWdodDogYm9sZDsNCiAgICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsNCiAgICBjb2xvcjogbmF2eTsNCiAgICB0ZXh0LWFsaWduOiBsZWZ0Ow0KfQ0KDQpoNCB7IC8qIEhlYWRlciA0IC0gYW5kIHRoZSBhdXRob3IgYW5kIGRhdGEgaGVhZGVycyB1c2UgdGhpcyB0b28gICovDQogICAgZm9udC1zaXplOiAxNHB4Ow0KICBmb250LXdlaWdodDogYm9sZDsNCiAgICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsNCiAgICBjb2xvcjogZGFya3JlZDsNCiAgICB0ZXh0LWFsaWduOiBsZWZ0Ow0KfQ0KDQovKiBBZGQgZG90cyBhZnRlciBudW1iZXJlZCBoZWFkZXJzICovDQouaGVhZGVyLXNlY3Rpb24tbnVtYmVyOjphZnRlciB7DQogIGNvbnRlbnQ6ICIuIjsNCg0KYm9keSB7IGJhY2tncm91bmQtY29sb3I6d2hpdGU7IH0NCg0KLmhpZ2hsaWdodG1lIHsgYmFja2dyb3VuZC1jb2xvcjp5ZWxsb3c7IH0NCg0KcCB7IGJhY2tncm91bmQtY29sb3I6d2hpdGU7IH0NCg0KfQ0KYGBgDQoNCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQ0KIyBjb2RlIGNodW5rIHNwZWNpZmllcyB3aGV0aGVyIHRoZSBSIGNvZGUsIHdhcm5pbmdzLCBhbmQgb3V0cHV0IA0KIyB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSBvdXRwdXQgZmlsZXMuDQppZiAoIXJlcXVpcmUoImtuaXRyIikpIHsNCiAgIGluc3RhbGwucGFja2FnZXMoImtuaXRyIikNCiAgIGxpYnJhcnkoa25pdHIpDQp9DQppZiAoIXJlcXVpcmUoInBhbmRlciIpKSB7DQogICBpbnN0YWxsLnBhY2thZ2VzKCJwYW5kZXIiKQ0KICAgbGlicmFyeShwYW5kZXIpDQp9DQppZiAoIXJlcXVpcmUoImdncGxvdDIiKSkgew0KICBpbnN0YWxsLnBhY2thZ2VzKCJnZ3Bsb3QyIikNCiAgbGlicmFyeShnZ3Bsb3QyKQ0KfQ0KaWYgKCFyZXF1aXJlKCJ0aWR5dmVyc2UiKSkgew0KICBpbnN0YWxsLnBhY2thZ2VzKCJ0aWR5dmVyc2UiKQ0KICBsaWJyYXJ5KHRpZHl2ZXJzZSkNCn0NCg0KaWYgKCFyZXF1aXJlKCJwbG90bHkiKSkgew0KICBpbnN0YWxsLnBhY2thZ2VzKCJwbG90bHkiKQ0KICBsaWJyYXJ5KHBsb3RseSkNCn0NCiMjIyMNCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSwgICAgICAgIyBpbmNsdWRlIGNvZGUgY2h1bmsgaW4gdGhlIG91dHB1dCBmaWxlDQogICAgICAgICAgICAgICAgICAgICAgd2FybmluZyA9IEZBTFNFLCAgICMgc29tZXRpbWVzLCB5b3UgY29kZSBtYXkgcHJvZHVjZSB3YXJuaW5nIG1lc3NhZ2VzLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHlvdSBjYW4gY2hvb3NlIHRvIGluY2x1ZGUgdGhlIHdhcm5pbmcgbWVzc2FnZXMgaW4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyB0aGUgb3V0cHV0IGZpbGUuIA0KICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMgPSBUUlVFLCAgICAjIHlvdSBjYW4gYWxzbyBkZWNpZGUgd2hldGhlciB0byBpbmNsdWRlIHRoZSBvdXRwdXQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBpbiB0aGUgb3V0cHV0IGZpbGUuDQogICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IEZBTFNFLA0KICAgICAgICAgICAgICAgICAgICAgIGNvbW1lbnQgPSBOQQ0KICAgICAgICAgICAgICAgICAgICAgICkgIA0KYGBgDQogDQpcDQogDQojIyAqKkZpbmFsIEV4YW0gR3VpZGVsaW5lcyoqIA0KDQoqICoqQ292ZXJhZ2UqKjogVGhlIG1ham9yIGNvbmNlcHRzIGFuZCBpbmZlcmVuY2UgcHJvY2VkdXJlc+KAlHN1Y2ggYXMgc2FtcGxpbmcgZGlzdHJpYnV0aW9ucywgY29uZmlkZW5jZSBpbnRlcnZhbHMsIGFuZCBoeXBvdGhlc2lzIHRlc3RpbmfigJRhcmUgY292ZXJlZCBhbmQgaW1wbGVtZW50ZWQgdXNpbmcgYm90aCBjbGFzc2ljYWwgcGFyYW1ldHJpYyBsaWtlbGlob29kLWJhc2VkIG1ldGhvZHMgYW5kIG1vZGVybiBub24tcGFyYW1ldHJpYyBhcHByb2FjaGVzLCBpbmNsdWRpbmcgdGhlIGJvb3RzdHJhcCBhbmQga2VybmVsIGRlbnNpdHkgZXN0aW1hdGlvbi4NCg0KKiAqKlBhcnQgQSoqIHJlcXVpcmVzIGRlcml2YXRpb24gb2Ygc2VsZWN0ZWQgbGlrZWxpaG9vZC1iYXNlZCBmdW5jdGlvbnMgZm9yIHBlcmZvcm1pbmcgdmFyaW91cyB0eXBlcyBvZiBpbmZlcmVuY2UsIHdpdGggc3VmZmljaWVudCBkZXRhaWwgdG8gZW5hYmxlIHRyYW5zbGF0aW9uIG9mIHRoZXNlIGRlcml2YXRpb25zIGludG8gY29kZSBmb3IgbnVtZXJpY2FsIGFuYWx5c2lzLg0KDQoqIFlvdXIgY29kZSBmb3IgdGhlIHByb2JsZW1zIGluICoqUGFydCBCKiogbXVzdCBhbGlnbiB3aXRoIHlvdXIgZGVyaXZhdGlvbnMgaW4gKipQYXJ0IEEqKiBhbmQgYmUgd2VsbCBjb21tZW50ZWQgd2hlcmUgbmVjZXNzYXJ5Lg0KDQoqIEluICoqUGFydCBCKiosIGFsbCBudW1lcmljYWwgcmVzdWx0cyBtdXN0IGJlIGludGVycHJldGVkIGZyb20gYSBwcmFjdGljYWwgcGVyc3BlY3RpdmUuDQoNCg0KXA0KDQojIyAqKlBvbGljaWVzIG9mIFVzaW5nIEFJIFRvb2xzKioNCg0KKiAqKlBvbGljeSBvbiBBSSBUb29sIFVzZSoqOiBTdHVkZW50cyBtdXN0IGFkaGVyZSB0byB0aGUgQUkgdG9vbCBwb2xpY3kgc3BlY2lmaWVkIGluIHRoZSBjb3Vyc2Ugc3lsbGFidXMuIFRoZSBkaXJlY3QgY29weWluZyBvZiBBSS1nZW5lcmF0ZWQgY29udGVudCBpcyBzdHJpY3RseSBwcm9oaWJpdGVkLiBBbGwgc3VibWl0dGVkIHdvcmsgbXVzdCByZWZsZWN0IHlvdXIgb3duIHVuZGVyc3RhbmRpbmc7IHdoZXJlIGV4dGVybmFsIHRvb2xzIGFyZSBjb25zdWx0ZWQsIGNvbnRlbnQgbXVzdCBiZSB0aG9yb3VnaGx5IHJlcGhyYXNlZCBhbmQgc3ludGhlc2l6ZWQgaW4geW91ciBvd24gd29yZHMuDQoNCiogKipDb2RlIEluY2x1c2lvbiBSZXF1aXJlbWVudCoqOiBBbnkgY29kZSBpbmNsdWRlZCBpbiB5b3VyIGVzc2F5IG11c3QgYmUgcHJvcGVybHkgY29tbWVudGVkIHRvIGV4cGxhaW4gdGhlIHB1cnBvc2UgYW5kL29yIGV4cGVjdGVkIG91dHB1dCBvZiBrZXkgY29kZSBsaW5lcy4gU3VibWl0dGluZyBBSS1nZW5lcmF0ZWQgY29kZSB3aXRob3V0IG1lYW5pbmdmdWwsIHN0dWRlbnQtYWRkZWQgY29tbWVudHMgd2lsbCBub3QgYmUgYWNjZXB0ZWQuDQoNClwNCg0KIyMgKipXb3JraW5nIE1vZGVsIGZvciB0aGUgRmluYWwgRXhhbSoqDQoNCjxmb250IGNvbG9yID0gIm9yYW5nZSI+KipDYXV0aW9uKio6ICpQbGVhc2UgZm9sbG93IHRoZSBzdWdnZXN0ZWQgZXhwcmVzc2lvbnMgYW5kIGd1aWRlZCBzdGVwcyB0byBjb21wbGV0ZSB0aGUgZXhhbS4gT3RoZXIgYXBwcm9hY2hlcyBzdWNoIGFzIHRyYW5zZm9ybWF0aW9uIGZvciB0cml2aWFsaXplIHRoZSBwcm9ibGVtcyB0aGF0IHdpbGwgbm90IG1lZXQgdGhlIGV4YW0gb2JqZWN0aXZlcy4qPC9mb250Pg0KDQoNClRoZSAqKkt1bWFyYXN3YW15IGRpc3RyaWJ1dGlvbioqIGlzIGEgdHdvLXBhcmFtZXRlciBjb250aW51b3VzIHByb2JhYmlsaXR5IGRpc3RyaWJ1dGlvbiBkZWZpbmVkIG9uIHRoZSBpbnRlcnZhbCAoMCwgMSkuIEl0IGlzIG9mdGVuIHVzZWQgYXMgYW4gYWx0ZXJuYXRpdmUgdG8gdGhlIEJldGEgZGlzdHJpYnV0aW9uIGR1ZSB0byBpdHMgc2ltcGxlIGNsb3NlZC1mb3JtIGV4cHJlc3Npb25zIGZvciB0aGUgY3VtdWxhdGl2ZSBkaXN0cmlidXRpb24gZnVuY3Rpb24gKENERikgYW5kIHF1YW50aWxlIGZ1bmN0aW9uLiBJdCBpcyBjb21tb25seSB1c2VkIGluIA0KDQoqICoqSHlkcm9sb2d5Kio6IE1vZGVsaW5nIHJhaW5mYWxsLCBzdHJlYW1mbG93LCBvciBvdGhlciBib3VuZGVkIG5hdHVyYWwgcGhlbm9tZW5hDQoNCiogKipFY29ub21pY3MqKjogSW5jb21lIHNoYXJlcywgcHJvcG9ydGlvbnMsIG9yIGJvdW5kZWQgaW5kaWNlcw0KDQoqICoqTW9udGUgQ2FybG8gc2ltdWxhdGlvbioqOiBFZmZpY2llbnQgcmFuZG9tIHZhcmlhdGUgZ2VuZXJhdGlvbiAodmlhIGludmVyc2UgdHJhbnNmb3JtKQ0KDQoqICoqTWFjaGluZSBsZWFybmluZyoqOiBPdXRwdXQgbGF5ZXIgZm9yIGJvdW5kZWQgdGFyZ2V0cywgcHJpb3IgZGlzdHJpYnV0aW9ucyBpbiBCYXllc2lhbiBtb2RlbHMNCg0KKiAqKlJlbGlhYmlsaXR5IGVuZ2luZWVyaW5nKio6IE1vZGVsaW5nIGZhaWx1cmUgcmF0ZXMgb2Ygc3lzdGVtcyB3aXRoIGJvdW5kZWQgbGlmZXRpbWVzDQoNClwNCg0KTGV0ICRYJCBiZSB0aGUgS3VtYXJhc3dhbXkgcmFuZG9tIHZhcmlhYmxlIHdpdGggQ3VtdWxhdGl2ZSBEaXN0cmlidXRpb24gRnVuY3Rpb24gKENERikgIA0KDQokJA0KRih4OyBhLCBiKSA9IDEgLSAoMSAtIHheYSleYg0KJCQNCg0Kd2hlcmUgJGEgPiAwJCBhbmQgJGIgPiAwJCB1bmtub3duIHBhcmFtZXRlcnMgYW5kICQwIDwgeCA8IDEkLiANCg0KVGhlIGZvbGxvd2luZyBhcmUgdHdvIHNwZWNpYWwgY2FzZSBvZiB0aGUgS3VtYXJhc3dhbXkgZGlzdHJpYnV0aW9uOg0KDQoxLiAqKlVuaWZvcm0gRGlzdHJpYnV0aW9uKio6IFdoZW4gJGEgPSAxJCBhbmQgJGIgPSAxJCwgdGhlIEt1bWFyYXN3YW15IGRpc3RyaWJ1dGlvbiBiZWNvbWVzIGEgdW5pZm9ybSBkaXN0cmlidXRpb24gb3ZlciAkWzAsIDFdJCB3aXRoIENERiAkRih4KSA9IHgkLg0KDQoNCjIuICoqUG93ZXIgRGlzdHJpYnV0aW9uKio6IHdoZW4gJGIgPSAxJCBhbmQgJGEgPiAwJCwgdGhlIEt1bWFyYXN3YW15IGRpc3RyaWJ1dGlvbiBiZWNvbWVzIGEgcG93ZXIgZGlzdHJpYnV0aW9uIG92ZXIgJFswLCAxXSQgd2l0aCBDREYgJEYoeCkgPSB4XmEkLiANCg0KVGhpcyBmaW5hbCBleGFtIGZvY3VzZXMgb24gaW5mZXJlbmNlcyBvZiBLdW1hcmFzd2FteSBkaXN0cmlidXRpb24gYW5kIHJlbGF0ZWQgZGF0YSBhbmFseXNpcy4NCg0KDQojIyBQYXJ0IEE6IE1ldGhvZG9sb2dpY2FsIERlcml2YXRpb25zDQoNClwNCg0KIyMjICoqUHJvYmxlbSBBMSoqOiANClNob3cgdGhhdCB0aGUgZGVuc2l0eSBmdW5jdGlvbiBvZiB0aGUgS3VtYXJhc3dhbXkgZGlzdHJpYnV0aW9uIGlzDQoNCiQkDQpmKHg7IGEsIGIpID0gYWIgXCwgeF57YS0xfSAoMSAtIHheYSlee2ItMX0uDQokJA0KDQpJbiBvcmRlciB0byBnZXQgdGhlIHByb2JhYmlsaXR5IGRlbnNpdHkgZnVuY3Rpb24gKHBkZikgZm9yIHRoZSBLdW1hcmFzd2FteSBkaXN0cmlidXRpb24gd2UgbXVzdCB0YWtlIHRoZSBkZXJpdmF0aXZlIG9mIHRoZSBjZGY6DQokJA0KZih4OyBhLCBiKSA9IFxmcmFje2R9e2R4fSBGKHg7IGEsIGIpID0gXGZyYWN7ZH17ZHh9IFsxIC0gKDEgLSB4XmEpXmJdIA0KJCQNCg0KVXNpbmcgdGhlIGNoYWluIHJ1bGUsIHdlIG9idGFpbjoNCg0KJCQNCmYoeDsgYSwgYikgPSAtYigxIC0geF5hKV57Yi0xfSBcY2RvdCAtYXhee2EtMX0gDQokJA0KDQpPbmNlIHNpbXBsaWZpZWQsIHRoZSBwZGYgaXM6DQokJA0KZih4OyBhLCBiKSA9IGFieF57YS0xfSgxIC0geF5hKV57Yi0xfSANCiQkDQoNClwNCg0KIyMjICoqUHJvYmxlbSBBMioqOiANCkxldCAkXHt4XzEsIHhfMiwgXGNkb3RzLCB4X24gXH0kIGJlIGFuIGkuaS5kLiByYW5kb20gc2FtcGxlIHRha2VuIGZyb20gYSBwb3B1bGF0aW9uIHRoYXQgZm9sbG93cyB0aGUgYW92ZSAyLXBhcmFtZXRlciBLdW1hcmFzd2FteSBkaXN0cmlidXRpb24uIFdyaXRlIG91dCB0aGUgbG9nbGlrZWxpaG9vZCBmdW5jdGlvbiBvZiAkYSQgYW5kICRiJCwgZGVub3RlZCBieSAkXGVsbChhLGIpJCwgYmFzZWQgb24gdGhlIGFib3ZlIHJhbmRvbSBzYW1wbGUgYW5kICoqZGVyaXZlKiogdGhlIGdyYWRpZW50IHZlY3RvciAkW1xlbGxfYV5ccHJpbWUoYSxiKSwgXGVsbF9iXlxwcmltZShhLGIpXSQsIHRoZSBmaXJzdCBvcmRlciBwYXJ0aWFsIGRlcml2YXRpdmUgb2YgdGhlIGxvZy1saWtlbGlob29kIHdpdGggcmVzcGVjdCB0byBwYXJhbWV0ZXJzICRhJCBhbmQgJGIkLg0KDQpGcm9tIFByb2JsZW0gQTEsIHRoZSBQREYgaXM6DQokJA0KZih4KSA9IGFieF57YS0xfSgxIC0geF5hKV57Yi0xfSwgXHF1YWQgMCA8IHggPCAxLCBhID4gMCwgYiA+IDANCiQkDQoNClRoZSBsaWtlbGlob29kIGZ1bmN0aW9uICRMKGEsIGIpJCBpczoNCiQkDQpMKGEsIGIpID0gXHByb2Rfe2k9MX1ebiBmKHhfaTsgYSwgYikgPSBccHJvZF97aT0xfV5uIGFieF9pXnthLTF9KDEgLSB4X2leYSlee2ItMX0gDQokJA0KDQpSZXdyaXRpbmcgdGhlIGVxdWF0aW9uLCB3ZSBnZXQ6DQokJA0KXHByb2Rfe2k9MX1ebiBhYiBcY2RvdCBccHJvZF97aT0xfV5uIHhfaV57YS0xfSBcY2RvdCBccHJvZF97aT0xfV5uICgxIC0geF9pXmEpXntiLTF9IA0KJCQNCiQkDQo9IGFebiBiXm4gXGNkb3QgXHByb2Rfe2k9MX1ebiB4X2lee2EtMX0gXHByb2Rfe2k9MX1ebiAoMSAtIHhfaV5hKV57Yi0xfSANCiQkDQoNClRvIGdldCB0aGUgbG9nLWxpa2VsaWhvb2QgZnVuY3Rpb24sICRcZWxsKGEsIGIpJCwgd2UgdGFrZSB0aGUgbmF0dXJhbCBsb2cgb2YgdGhlIGxpa2VsaWhvb2QgZnVuY3Rpb24uIFRoZSBsb2ctbGlrZWxpaG9vZCBmdW5jdGlvbiBpczoNCiQkDQpcZWxsKGEsIGIpID0gXGxuIEwoYSwgYikgPSBuIFxsbiBhICsgbiBcbG4gYiArIChhLTEpIFxzdW1fe2k9MX1ebiBcbG4geF9pICsgKGItMSkgXHN1bV97aT0xfV5uIFxsbigxIC0geF9pXmEpDQokJA0KDQpUbyBidWlsZCBvdXIgZ3JhZGllbnQgdmVjdG9yLCB3ZSBuZWVkIHRoZSBmaXJzdC1vcmRlciBwYXJ0aWFsIGRlcml2YXRpdmVzOg0KJCQNClxlbGwnX2EoYSwgYikgPSBcZnJhY3tccGFydGlhbCBcZWxsfXtccGFydGlhbCBhfSA9IFxmcmFje259e2F9ICsgXHN1bSBcbG4geCArIChiLTEpIFxzdW0gXGZyYWN7eF9pXmEgXGxuIHhfaX17MSAtIHhfaV5hfQ0KJCQNCiQkDQpcZWxsJ19iID0gXGZyYWN7XHBhcnRpYWwgXGVsbH17XHBhcnRpYWwgYn0gPSBcZnJhY3tufXtifSArIFxzdW0gXGxuKDEgLSB4X2leYSkNCiQkDQoNClRoZSBncmFkaWVudCB2ZWN0b3IgJFxuYWJsYSBcZWxsJCBpczoNCiQkDQpcbmFibGEgXGVsbCA9IFxsZWZ0WyBcZnJhY3tufXthfSArIFxzdW0gXGxuIHggKyBcc3VtIFxmcmFjeyhiLTEpIHhfaV5hIFxsbiB4X2l9ezEgLSB4X2leYX0sIFxmcmFje259e2J9ICsgXHN1bSBcbG4oMSAtIHhfaV5hKSBccmlnaHRdIA0KJCQNCg0KXA0KDQojIyMgKipQcm9ibGVtIEEzKio6IA0KQmFzZWQgb24gdGhlIGdyYWRpZW50cyBmdW5jdGlvbnMgb2J0YWluZWQgaW4gdGhlIGFib3ZlIHByb2JsZW0gQTIsICoqZGVyaXZlKiogdGhlIG9ic2VydmVkIEZpc2hlciBJbmZvcm1hdGlvbiBtYXRyaXggKGkuZSwgdGhlIG5lZ2F0aXZlIEhlc3NpYW4gTWF0cml4KS4NCg0KSW4gb3JkZXIgdG8gb2J0YWluIHRoZSBGaXNoZXIgbWF0cml4LCB3ZSBuZWVkIHRvIGdldCBvdXIgc2Vjb25kIG9yZGVyIHBhcnRpYWwgZGVyaXZhdGl2ZXMuDQoNClRoZSBzZWNvbmQtb3JkZXIgcGFydGlhbCBkZXJpdmF0aXZlcyBhcmU6DQokJA0KXGZyYWN7XHBhcnRpYWxeMiBcZWxsfXtccGFydGlhbCBhXjJ9ID0gLVxmcmFje259e2FeMn0gKyBcc3VtIFxmcmFjeyhiLTEpIHhfaV5hIChcbG4geF9pKV4yfXsxIC0geF9pXmF9IA0KJCQNCiQkDQpcZnJhY3tccGFydGlhbF4yIFxlbGx9e1xwYXJ0aWFsIGEgXHBhcnRpYWwgYn0gPSBcc3VtIFxmcmFje3hfaV5hIFxsbiB4X2l9ezEgLSB4X2leYX0gDQokJA0KJCQNClxmcmFje1xwYXJ0aWFsXjIgXGVsbH17XHBhcnRpYWwgYiBccGFydGlhbCBhfSA9IFxzdW0gXGZyYWN7eF9pXmEgXGxuIHhfaX17MSAtIHhfaV5hfQ0KJCQNCiQkDQpcZnJhY3tccGFydGlhbF4yIFxlbGx9e1xwYXJ0aWFsIGJeMn0gPSAtXGZyYWN7bn17Yl4yfQ0KJCQNCg0KSWYgd2Ugd2VyZSB0byBidWlsZCB0aGUgbWF0cml4IGFzIGlzLCB3ZSB3b3VsZCBnZXQgdGhlIGhlc3NpYW4gbWF0cml4LiBCdXQgdGhlcmUncyBnb29kIG5ld3M6IHRoZSBGaXNoZXIgaW5mb3JtYXRpb24gbWF0cml4IGlzIGp1c3QgdGhlIGhlc3NpYW4gbWF0cml4IG11bHRpcGxpZWQgYnkgYSBzY2FsYXIgb2YgLTEuIFNvLCB3ZSBjYW4gbXVsdGlwbHkgZWFjaCBwYXJ0aWFsIGRlcml2YXRpdmUgYnkgLTEgYW5kIHRoZW4gYnVpbGQgdGhlIG1hdHJpeC4NCg0KVGhlIEZpc2hlciBNYXRyaXggZW5kcyB1cCBhczoNCiQkDQpcYmVnaW57Ym1hdHJpeH0gXGZyYWN7bn17YV4yfSAtIFxzdW0gXGZyYWN7KGItMSl4XmEoXGxuIHgpXjJ9ezEteF5hfSAmIC1cc3VtIFxmcmFje3heYSBcbG4geH17MS14XmF9IFxcIC1cc3VtIFxmcmFje3heYSBcbG4geH17MS14XmF9ICYgXGZyYWN7bn17Yl4yfSBcZW5ke2JtYXRyaXh9DQokJA0KDQpcIA0KDQojIyMgKipQcm9ibGVtIEE0Kio6IA0KDQpDb25zaWRlciBwb3dlciBkaXN0cmlidXRpb24gJEYoeCkgPSB4XmEsIChhID4wIFxxdWFkIFx0ZXh0eyBhbmQgfVxxdWFkIHggXGluICgwLDEpKSQsIGEgc3BlY2lhbCBjYXNlIG9mIHRoZSBLdW1hcmFzd2FteSBkaXN0cmlidXRpb24gd2l0aCAkYiA9IDEkLCBhbmQgYSByYW5kb20gc2FtcGxlIGZyb20gdGhpcyBkaXN0cmlidXRpb24gJFx7IHhfMSwgeF8yLCBcY2RvdHMsIHhfblx9JC4gKipEZXJpdmUqKiB0aGUgTUxFIGFuZCBNTUUgb2YgJGEkIHJlc3BlY3RpdmVseS4gWypIaW50OiBUbyBmaW5kIHRoZSBNTUUsIHlvdSBuZWVkIHRvIGNvbXB1dGUgdGhlIG1vbWVudCBvZiB0aGUgcG93ZXIgZGlzdHJpYnV0aW9uOyB0aGF0IGlzLCAkRVtYXmtdID0gXGludF8wXjEgeF5rIEYnKHgpIGR4JC4gTm90ZSB0aGF0IGJvdGggdGhlIE1MRSBhbmQgdGhlIE1NRSBoYXZlIGNsb3NlZC1mb3JtIGV4cHJlc3Npb25zLipdDQoNCkluIG9yZGVyIHRvIGRlcml2ZSBlaXRoZXIgZXN0aW1hdGUgZm9yIGEsIHdlIG5lZWQgdGhlIHBkZiBvZiB0aGUgZGlzdHJpYnV0aW9uLiBUbyBnZXQgdGhlIHBkZiBmcm9tIHRoZSBjZGYsIHdlIG5lZWQgdG8gdGFrZSB0aGUgZGVyaXZhdGl2ZSBvZiB0aGUgY2RmOg0KJCQNCmYoeDsgYSkgXGZyYWN7ZH17ZHh9IEYoeDsgYSkgPSBcZnJhY3tkfXtkeH0gPSB4XmENCiQkDQokJA0KZih4OyBhKSA9IGF4XnthLTF9LCBccXVhZCAwIDwgeCA8IDEsIFxxdWFkIGEgPiAwDQokJA0KDQpGcm9tIGhlcmUsIGxldCdzIGZpcnN0IGRlcml2ZSB0aGUgTUxFIGZvciBhLiBPbmNlIHRoZSBwZGYgaXMgb2J0YWluZWQsIHdlIGNhbiBnZXQgdGhlIGxpa2VsaWhvb2QgZnVuY3Rpb246DQokJA0KTChhKSA9IFxwcm9kX3tpPTF9Xm4gZih4X2k7IGEpID0gXHByb2Rfe2k9MX1ebiBheF9pXnthLTF9ID0gYV5uIFxwcm9kX3tpPTF9Xm4geF9pXnthLTF9DQokJA0KDQpBbmQgdGhlbiB0aGUgTG9nLWxpa2VsaWhvb2QgZnVuY3Rpb246DQokJA0KXGVsbChhKSA9IFxsbiBMID0gbiBcbG4gYSArIChhLTEpIFxzdW1fe2k9MX1ebiBcbG4geF9pDQokJA0KDQpOZXh0LCB3ZSBjYW4gdGFrZSB0aGUgZGVyaXZhdGl2ZSB3aXRoIHJlc3BlY3QgdG8gYSBhbmQgb2J0YWluIHRoZSBzY29yZSBmdW5jdGlvbjoNCiQkDQpcZnJhY3tkXGVsbH17ZGF9ID0gXGZyYWN7bn17YX0gKyBcc3VtX3tpPTF9Xm4gXGxuIHhfaQ0KJCQNClVubGlrZSBiZWZvcmUsIHdlIGRpZG4ndCBuZWVkIHRvIHNvbHZlIGZvciBhbnkgcGFyYW1ldGVycywgYXMgd2Ugd2VyZSBqdXN0IGJ1aWxkaW5nIGEgdmVjdG9yIG9mIHRoZSBzY29yZSBmdW5jdGlvbnMuIEJ1dCwgbm93IHdlIGRvIG5lZWQgdG8gc29sdmUgZm9yIGEgcGFyYW1ldGVyLg0KDQpUbyBkbyBzbywgd2UgbmVlZCB0byBzZXQgdGhlIGRlcml2YXRpdmUgZXF1YWwgdG8gMCBhbmQgc29sdmUgZm9yIGEuDQokJA0KXGZyYWN7bn17YX0gKyBcc3VtX3tpPTF9Xm4gXGxuIHhfaSA9IDANCiQkDQoNClNvbHZpbmcgZm9yIGEsIHdlIGdldCBvdXIgbWF4aW11bSBsaWtlbGlob29kIGVzdGltYXRvciBmb3IgYToNCiQkDQpcaGF0e2F9ID0gLVxmcmFje259e1xzdW1fe2k9MX1ebiBcbG4geF9pfQ0KJCQNCg0KTmV4dCwgd2UgY2FuIGdldCB0aGUgbWV0aG9kIG9mIG1vbWVudHMgZXN0aW1hdG9yIGZvciBhLiBUbyBkbyBzbywgd2UgbXVzdCBzZXQgdGhlIHBvcHVsYXRpb24gbW9tZW50IGVxdWFsIHRvIHRoZSBzYW1wbGUgbW9tZW50LiBTaW5jZSB3ZSBhcmUgb25seSBlc3RpbWF0aW5nIG9uZSBwYXJhbWV0ZXIsIHdlIG9ubHkgbmVlZCB0aGUgZmlyc3QgcG9wdWxhdGlvbiBhbmQgc2FtcGxlIG1vbWVudHMuIA0KDQpUaGUgZmlyc3QgbW9tZW50IGZvciBlaXRoZXIgYSBwb3B1bGF0aW9uIG9yIHNhbXBsZSBpcyB0aGUgbWVhbi4gVG8gZ2V0IHRoZSBwb3B1bGF0aW9uIG1lYW4sIHdlIG5lZWQgdG8gY29tcHV0ZSB0aGUgZXhwZWN0ZWQgdmFsdWUgb2YgeC4gVGhlIGV4cGVjdGVkIHZhbHVlIG9mIHggaXM6DQokJA0KXG11X3ggPSBcaW50XzBeMSB4IFxjZG90IGF4XnthLTF9IFwsIGR4ID0gXGludF8wXjEgYXheYSBcLCBkeCA9IFxsZWZ0WyBcZnJhY3theF57YSsxfX17YSsxfSBccmlnaHRdXzBeMSA9IFxmcmFje2F9e2ErMX0gDQokJA0KDQpPbmNlIHdlIGdldCB0aGUgcG9wdWxhdGlvbiBtZWFuLCB3ZSBjYW4gc2V0IGl0IGVxdWFsIHRvIHRoZSBzYW1wbGUgbWVhbjoNCiQkDQpcbXVfeCA9IFxiYXJ7eH0gXGltcGxpZXMgXGJhcnt4fSA9IFxmcmFje2F9e2ErMX0NCiQkDQoNClNvbHZpbmcgZm9yIGEsIHdlIGdldCB0aGUgbWV0aG9kIG9mIG1vbWVudHMgZXN0aW1hdG9yIGZvciBhOg0KJCQNClxoYXR7YX0gPSBcZnJhY3tcYmFye3h9fXsxIC0gXGJhcnt4fX0NCiQkDQoNClwNCg0KIyMjICoqUHJvYmxlbSBBNSoqOg0KDQpVc2luZyB0aGUgc2FtZSBzZXR0aW5nIGFzIGluICoqUHJvYmxlbSBBNCoqLCBmaW5kIHRoZSBhc3ltcHRvdGljIChXYWxkKSBjb25maWRlbmNlIGludGVydmFsIGZvciAkYSQuIFsqSGludDogQ29tcHV0ZSB0aGUgRmlzaGVyIGluZm9ybWF0aW9uIGZvciAkYSQsIHRoZW4gdGFrZSBpdHMgcmVjaXByb2NhbCB0byBvYnRhaW4gdGhlIHZhcmlhbmNlKi5dDQoNCkEgV2FsZCBjb25maWRlbmNlIGludGVydmFsIGxvb2tzIGxpa2U6DQokJA0KXHRleHR7V2FsZCBDSX0gPSBcaGF0e2F9IFxwbSB6X3sxLVxhbHBoYS8yfSpzZSwgDQokJA0KDQp3aGVyZSAkXGhhdHthfSQgaXMgdGhlIG1heGltdW0gbGlrZWxpaG9vZCBlc3RpbWF0ZSBmb3IgYSwgJHpfezEtXGFscGhhLzJ9JCBpcyB0aGUgY3JpdGljYWwgdmFsdWUgb2YgdGhlICQoMSAtIFxhbHBoYSkqMTAwJSQgY29uZmlkZW5jZSBsZXZlbCwgYW5kIHNlIGlzIHRoZSBzdGFuZGFyZCBlcnJvci4NCg0KQXNzdW1pbmcgd2UncmUgYnVpbGRpbmcgYSA5NSUgV2FsZCBDb25maWRlbmNlIEludGVydmFsLCB3aGljaCB3b3VsZCBtZWFuIHRoYXQgJFxhbHBoYSA9IDAuMDUkOg0KDQokJA0KOTVcJSBcdGV4dHsgQ0l9ID0gXGxlZnQoIFxoYXR7YX0gLSB6X3swLjk3NX0qc2UsIFxoYXR7YX0gKyAxLjk2KnNlIFxyaWdodCkNCiQkDQoNCldlIGFscmVhZHkgaGF2ZSB0aGUgbWF4aW11bSBsaWtlbGlob29kIGVzdGltYXRlIGZyb20gcHJvYmxlbSBBNC4gQnV0IHdoYXQgaXMgdGhlIGNyaXRpY2FsIHogdmFsdWUgYW5kIHRoZSBzdGFuZGFyZCBlcnJvcj8gR2V0dGluZyB0aGUgY3JpdGljYWwgeiB2YWx1ZSBpcyBlYXN5OiB0aGF0IGNhbiBqdXN0IGJlIGxvb2tlZCB1cC4gVGhlIGNyaXRpY2FsIHogdmFsdWUgZm9yIGEgOTUlIGNvbmZpZGVuY2UgaW50ZXJ2YWwgaXMgMS45Ni4gR2V0dGluZyB0aGUgc3RhbmRhcmQgZXJyb3IgaXMgYSBsaXR0bGUgbW9yZSBkaWZmaWN1bHQgYmVjYXVzZSB0aGF0IHJlcXVpcmVzIHNvbWUgbWF0aC4gDQoNClRvIGdldCB0aGUgc3RhbmRhcmQgZXJyb3IsIHdlIG5lZWQgdG8gZ28gYmFjayB0byB0aGUgbG9nIGxpa2VsaWhvb2QgZnVuY3Rpb24gb2YgYS4gV2Ugd2lsbCBmaXJzdCBvYnRhaW4gdGhlIHZhcmlhbmNlIG9mIGEgYnkgdGFraW5nIHRoZSBzZWNvbmQgZGVyaXZhdGl2ZSBvZiB0aGUgbG9nLWxpa2VsaWhvb2QgZnVuY3Rpb24gKG9yIHRoZSBkZXJpdmF0aXZlIG9mIHRoZSBzY29yZSBmdW5jdGlvbiB3ZSBhbHJlYWR5IG9idGFpbmVkIGluIHByb2JsZW0gQTQpLiBSZWdhcmRsZXNzLCB3ZSBzaG91bGQgZ2V0Og0KJCQNClxmcmFje2ReMlxlbGx9e2RhXjJ9ID0gLVxmcmFje259e2FeMn0gDQokJA0KDQpGcm9tIGhlcmUsIHdlIGNhbiBjb21wdXRlIHRoZSBGaXNoZXIgaW5mb3JtYXRpb24sIHdoaWNoIGlzIGp1c3QgdGhlIG5lZ2F0aXZlIGV4cGVjdGVkIHZhbHVlIG9mIHRoZSBzZWNvbmQgZGVyaXZhdGl2ZS4gU2luY2UgdGhlIHNlY29uZCBkZXJpdmF0aXZlIGlzIGp1c3QgYSBjb25zdGFudCwgdGhlIGV4cGVjdGVkIHZhbHVlIHdpbGwganVzdCBiZSB0aGF0IGRlcml2YXRpdmUuIE11bHRpcGx5IGl0IGJ5IC0xLCB3ZSBnZXQgdGhlIGZpc2hlciBpbmZvcm1hdGlvbi4NCg0KJCQNCkkoYSkgPSAtRVxsZWZ0KFxmcmFje2ReMiBcZWxsfXtkYV4yfVxyaWdodCkgPSBcZnJhY3tufXthXjJ9JA0KJCQNCg0KVG8gZ2V0IHRoZSB2YXJpYW5jZSwgd2UganVzdCB0YWtlIHRoZSByZWNpcHJvY2FsIG9mIHRoZSBmaXNoZXIgaW5mb3JtYXRpb24uIA0KJCQNClZhcihhKSA9IFxmcmFje2FeMn17bn0NCiQkDQoNClRvIGdldCB0aGUgc3RhbmRhcmQgZXJyb3IsIHdlIGp1c3QgdGFrZSB0aGUgc3F1YXJlIHJvb3Qgb2YgdGhlIHZhcmlhbmNlOg0KJCQNCntzZX0oYSkgPSBcZnJhY3thfXtcc3FydHtufX0NCiQkDQoNCkFuZCBub3cgd2UgY2FuIGJ1aWxkIHRoZSA5NSUgV2FsZCBDb25maWRlbmNlIEludGVydmFsOg0KJCQNCjk1XCUgXHRleHR7V2FsZCBDSX0gPSBcbGVmdCggXGhhdHthfSAtIDEuOTYgXGZyYWN7XGhhdHthfX17XHNxcnR7bn19LCBcaGF0e2F9ICsgMS45NiBcZnJhY3tcaGF0e2F9fXtcc3FydHtufX0gXHJpZ2h0KQ0KJCQNCg0KXA0KDQojIyMgKipQcm9ibGVtIEE2Kio6DQoNClVzaW5nIHRoZSBzYW1lIHNldHRpbmcgYXMgaW4gKipQcm9ibGVtIEE0KiosIHBlcmZvcm0gYSBsaWtlbGlob29kIHJhdGlvIHRlc3QgZm9yIHRoZSBoeXBvdGhlc2lzICRIXzAgOmE9MSQgKGkuZS4sIHRoZSBwb3dlciBkaXN0cmlidXRpb24gcmVkdWNlcyB0byBhIHVuaWZvcm0gZGlzdHJpYnV0aW9uKS4gWypIaW50OiBFdmFsdWF0ZSB0aGUgbG9nLWxpa2VsaWhvb2QgZnVuY3Rpb24gYXQgdGhlIG1heGltdW0gbGlrZWxpaG9vZCBlc3RpbWF0ZSAkXGhhdHthfSQgYW5kIGF0ICRhPTEkLCB0aGVuIHVzZSB0aGVzZSB2YWx1ZXMgdG8gY29uc3RydWN0IHRoZSBMUlQgdGVzdCBzdGF0aXN0aWMuKl0NCg0KV2hlbiBkb2luZyBhIGxpa2VsaWhvb2QgcmF0aW8gdGVzdCwgd2UgYXJlIGNvbXBhcmluZyB0aGUgZml0bmVzcyBvZiB0d28gbW9kZWxzOiBhIHNpbXBsZXIgcmVzdHJpY3RlZCBtb2RlbCwgb3IgYSBtb3JlIGNvbXBsZXggdW5yZXN0cmljdGVkIG1vZGVsLiBJbiB0aGlzIGNhc2UsIHdlIGFyZSBnb2luZyB0byB0ZXN0IHdoZXRoZXIgb3Igbm90IGEgcG93ZXIgZGlzdHJpYnV0aW9uIG9yIGFub3RoZXIgS3VtYXJhc3dhbXkgYmFzZWQgZGlzdHJpYnV0aW9uIHdpbGwgZml0IHRoZSBkYXRhIGJldHRlci4gSW4gb3RoZXIgd29yZHMsIGlzIHRoaXMgc2FtcGxlIG1vcmUgbGlrZWx5IHRvIGNvbWUgZnJvbSBhIHBvcHVsYXRpb24gdGhhdCBpcyBtb2RlbGVkIHdpdGggYSBwb3dlciBkaXN0cmlidXRpb24gb3IgYW5vdGhlciBLdW1hcmFzd2FteSBiYXNlZCBkaXN0cmlidXRpb24/IA0KDQokJA0KSF8wOiBhID0gMSAoUG93ZXIgRGlzdHJpYnV0aW9uKSANCkhfYTogYSBcbmVxIDEgKEt1bWFyYXN3YW15IERpc3RyaWJ1dGlvbikNCiQkDQoNCg0KVG8gY29uZHVjdCBvdXIgdGVzdCwgd2UgbmVlZCB0byBldmFsdXRlIHRoZSBsb2cgbGlrZWxpaG9vZCBvZiB0aGUgcG93ZXIgZGlzdHJpYnV0aW9uIGF0IHR3byBwb2ludHM6IHRoZSBmaXJzdCBpcyB3aGVuIGEgaXMgc2V0IHRvIDEsIHdoaWNoIGdpdmVzIHVzIG91ciByZXN0cmljdGVkIG1vZGVsIGFuZCB0aGUgc2Vjb25kIGlzIHdoZW4gYSBpcyBzZXQgdG8gdGhlIG1heGltdW0gbGlrZWxpaG9vZCBlc3RpbWF0b3IsIHdoaWNoIGdpdmVzIHVzIG91ciB1bnJlc3RyaWN0ZWQgbW9kZWwuIA0KDQpUaGUgbnVsbCBoeXBvdGhlc2lzLCAkSF8wJDoNCiQkDQphID0gMSBcaW1wbGllcyBcZWxsKDEpID0gMA0KJCQNCg0KVGhlIGFsdGVybmF0aXZlIGh5cG90aGVzaXMsICRIX2EkOiANCiQkDQphPVxoYXR7YX0gXGltcGxpZXMgXGVsbChcaGF0e2F9KSA9IG4gXGxuIFxoYXR7YX0gKyAoXGhhdHthfS0xKSBcc3VtX3tpPTF9Xm4gXGxuIHhfaQ0KJCQNCg0KVGhlIHRlc3Qgc3RhdGlzdGljIHdpbGwgYmU6DQokJA0KTFIgPSAyW1xlbGwoXGhhdHthfSkgLSBcZWxsKDEpXSA9IDIgXGxlZnRbIG4gXGxuIFxoYXR7YX0gKyAoXGhhdHthfS0xKSBcc3VtX3tpPTF9Xm4gXGxuIHhfaSBccmlnaHRdDQokJA0KDQpUaGVyZSBhcmUgc2V2ZXJhbCBpbXBvcnRhbnQgdGhpbmdzIHRvIG5vdGUgaGVyZTogVGhlIGZpcnN0IGlzIHRoYXQgdGhpcyB0ZXN0IHdpbGwgd29yayBiZXR0ZXIgaWYgdGhlIHNhbXBsZSBzaXplIGlzIGxhcmdlIGVub3VnaC4gVGhlIHNlY29uZCBpcyB0aGF0IGlmIHRoZSBzYW1wbGUgc2l6ZSBpcyBsYXJnZSBlbm91Z2gsIHRoZW4gdGhlIHRlc3Qgc3RhdGlzdGljIHdpbGwgYXN5bXB0b3RpY2FsbHkgZm9sbG93IGEgJFxjaGleMiQgZGlzdHJpYnV0aW9uIHdpdGggMSBkZWdyZWUgb2YgZnJlZWRvbS4gVGhlIHRoZSB0aGlyZCBpcyB0aGF0IHRoaXMgaXMgYSB0d28gdGFpbGVkIHRlc3QuIFdoaWNoIG1lYW5zIHRoYXQgdGhlcmUgYXJlIHR3byByZWplY3Rpb24gcmVnaW9uczogaWYgdGhlICRcY2hpXjIkIHN0YXRpc3RpYyB5b3Ugb2J0YWluIGlzIGxlc3MgdGhhbiB0aGUgY3JpdGljYWwgdmFsdWUgYXNzb2NpYXRlZCB3aXRoICRcZnJhY3tcYWxwaGF9ezJ9JCBvciBncmVhdGVyIHRoYW4gdGhlIGNyaXRpY2FsIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCAkXHtmcmFjezEtXGFscGhhfXsyfSQuDQpJZiAkbiQgaXMgbGFyZ2UgZW5vdWdoICgkbiA+IDMwJCksIHRoZW4gJExSIFxzaW0gXGNoaV8xXjIkLiBGb3IgZXhhbXBsZSwgaWYgdGhlIGxldmVsIG9mIHNpZ25pZmljYW5jZSBpcyAwLjA1LCB0aGVuIHlvdSdkIHJlamVjdCB0aGUgbnVsbCBoeXBvdGhlc2lzIGlmIHlvdXIgdGVzdCBzdGF0aXN0aWMgd2FzIGxlc3MgdGhhbiAwLjAwMDk4MiAoYW5kIHNvIG9uKSBvciBncmVhdGVyIHRoYW4gNS4wMjM4ODYuIEJ1dCBhdCBsZWFzdCB0aGUgcC12YWx1ZSBkb2Vzbid0IGNoYW5nZSBmb3IgcmVqZWN0aW9uOyB5b3UgcmVqZWN0IHRoZSBudWxsIGlmIHRoZSBwLXZhbHVlIGlzIGxlc3MgdGhhbiB0aGUgbGV2ZWwgb2Ygc2lnbmlmaWNhbmNlLg0KDQpcDQoNCiMjIFBhcnQgQjogTnVtZXJpY2FsIEFuYWx5c2lzDQoNCioqQWxsIGNvZGUgbXVzdCBiZSB3ZWxsIGNvbW1lbnRlZCBhbmQgYWRoZXJlIHRvIGJlc3QgY29kaW5nIHByYWN0aWNlcyoqDQoNCioqV29ya2luZyBEYXRhc2V0Kio6IEEgc21hbGwgcmVzZXJ2b2lyIHN1cHBsaWVzIHdhdGVyIHRvIGEgdG93bi4gRHVyaW5nIHRoZSBkcnkgc2Vhc29uICg1MCBkYXlzKSwgZW5naW5lZXJzIHJlY29yZCB0aGUgZnJhY3Rpb24gb2YgdXNhYmxlIHN0b3JhZ2UgZmlsbGVkIGVhY2ggbW9ybmluZy4gVmFsdWVzIG5lYXIgMCBtZWFuIHRoZSByZXNlcnZvaXIgaXMgbmVhcmx5IGVtcHR5OyB2YWx1ZXMgbmVhciAxIG1lYW4gaXQncyBmdWxsLiBUaGUgZGlzdHJpYnV0aW9uIHRlbmRzIHRvIGJlIHJpZ2h04oCRc2tld2VkIChtb3N0bHkgbG93IGxldmVscyBkdWUgdG8gZHJvdWdodCkgYnV0IHdpdGggb2NjYXNpb25hbCByZXBsZW5pc2htZW50Lg0KDQpUaGUgZm9sbG93aW5nIDUwIGRhdGEgcG9pbnRzIChvcmRlcmVkIGZvciBjbGFyaXR5KSByZXByZXNlbnQgdGhlIGRhaWx5IHByb3BvcnRpb24gb2YgdXNhYmxlIHN0b3JhZ2U6DQoNCmBgYA0KMC4xMiwgMC4xNCwgMC4xNSwgMC4xNiwgMC4xNywgMC4xOCwgMC4xOSwgMC4yMCwgMC4yMSwgMC4yMiwNCjAuMjMsIDAuMjQsIDAuMjUsIDAuMjYsIDAuMjcsIDAuMjgsIDAuMjksIDAuMzAsIDAuMzEsIDAuMzIsDQowLjMzLCAwLjM0LCAwLjM1LCAwLjM2LCAwLjM3LCAwLjM4LCAwLjM5LCAwLjQwLCAwLjQxLCAwLjQyLA0KMC40MywgMC40NCwgMC40NSwgMC40NiwgMC40NywgMC40OCwgMC40OSwgMC41MCwgMC41MSwgMC41MiwNCjAuNTMsIDAuNTQsIDAuNTUsIDAuNTYsIDAuNTcsIDAuNTgsIDAuNTksIDAuNjAsIDAuNjEsIDAuNzgNCmBgYA0KDQpgYGB7cn0NCiMgUHV0dGluZyBEYXRhIEludG8gQW4gT2JqZWN0DQoNCndhdGVyIDwtIGMoMC4xMiwgMC4xNCwgMC4xNSwgMC4xNiwgMC4xNywgMC4xOCwgMC4xOSwgMC4yMCwgMC4yMSwgMC4yMiwNCjAuMjMsIDAuMjQsIDAuMjUsIDAuMjYsIDAuMjcsIDAuMjgsIDAuMjksIDAuMzAsIDAuMzEsIDAuMzIsDQowLjMzLCAwLjM0LCAwLjM1LCAwLjM2LCAwLjM3LCAwLjM4LCAwLjM5LCAwLjQwLCAwLjQxLCAwLjQyLA0KMC40MywgMC40NCwgMC40NSwgMC40NiwgMC40NywgMC40OCwgMC40OSwgMC41MCwgMC41MSwgMC41MiwNCjAuNTMsIDAuNTQsIDAuNTUsIDAuNTYsIDAuNTcsIDAuNTgsIDAuNTksIDAuNjAsIDAuNjEsIDAuNzgpDQpgYGANCg0KXA0KDQojIyMgKipQcm9ibGVtIEIxKio6DQoNCkZpdCB0aGUgS3VtYXJhc3dhbXkgZGlzdHJpYnV0aW9uIHRvIHRoZSBhYm92ZSBkYXRhLiBVc2UgdGhlIGRlcml2YXRpb25zIGluICoqUHJvYmxlbSBBMioqIHRvIGZpbmQgdGhlIE1MRSBvZiAkYSQgYW5kICRiJC4gUGxlYXNlIGNvcHkgdGhlIGtleSBmb3JtdWxhcyBiZWZvcmUgY29kaW5nLg0KDQpgYGB7cn0NCiMgTWFudWFsIE1MRSBpbXBsZW1lbnRhdGlvbiBmb3IgS3VtYXJhc3dhbXkgZGlzdHJpYnV0aW9uDQoNCiMgS3VtYXJhc3dhbXkgbG9nLWxpa2VsaWhvb2QgZnVuY3Rpb24NCmt1bWEubG9nbGlrIDwtIGZ1bmN0aW9uKHBhcmFtcywgZGF0YSkgew0KICBzaGFwZTEgPC0gcGFyYW1zWzFdICAjIHBhc3NpbmcgdGhlIHBhcmFtZXRlcnMNCiAgc2hhcGUyIDwtIHBhcmFtc1syXQ0KDQpuIDwtIGxlbmd0aChkYXRhKSAgICMgc2FtcGxlIHNpemUNCiAgDQojIExvZy1saWtlbGlob29kIGZvciBLdW1hcmFzd2FteSBkaXN0cmlidXRpb24NCmxvZ2xpayA8LSBuKmxvZyhzaGFwZTEpICsgbipsb2coc2hhcGUyKSArIChzaGFwZTEgLSAxKSpzdW0obG9nKGRhdGEpKSArIA0KICAgICAgICAgICAgKHNoYXBlMiAtIDEpKnN1bShsb2coMSAtIGRhdGFec2hhcGUxKSkgDQogIA0KICByZXR1cm4obG9nbGlrKSAgICAjIFJldHVybiBuZWdhdGl2ZSBmb3IgbWluaW1pemF0aW9uDQp9DQoNCg0KIyMgU2NvcmUgKGdyYWRpZW50KSBlcXVhdGlvbg0Ka3VtYS5zY29yZSA8LSBmdW5jdGlvbihwYXJhbXMsIGRhdGEpIHsNCiAgc2hhcGUxIDwtIHBhcmFtc1sxXQ0KICBzaGFwZTIgPC0gcGFyYW1zWzJdDQogIG4gPC0gbGVuZ3RoKGRhdGEpDQogIA0KIyBHcmFkaWVudCBmb3IgUGFyYW1ldGVyIGENCiAgZ3JhZF9zaGFwZTEgPC0gbi9zaGFwZTEgKyBzdW0obG9nKGRhdGEpKSAtDQogICAgICAgICAgICAgICAgKHNoYXBlMiAtIDEpKnN1bSgobG9nKGRhdGEpKmRhdGFec2hhcGUxKS8oMS1kYXRhXnNoYXBlMSkpDQogIA0KIyBHcmFkaWVudCBmb3IgUGFyYW1ldGVyIGINCiAgZ3JhZF9zaGFwZTIgPC0gKG4vc2hhcGUyKSArIHN1bShsb2coMS1kYXRhXnNoYXBlMSkpDQogICAgICAgICAgICAgICAgDQogIA0KICByZXR1cm4oYyhncmFkX3NoYXBlMSwgZ3JhZF9zaGFwZTIpKQ0KfQ0KDQoNCiMgTmVlZCB0byBwcm92aWRlIGluaXRpYWwgdmFsdWVzIGZvciBwYXJhbWV0ZXJzDQppbml0aWFsLnBhcmFtcyA8LSBjKHNoYXBlMSA9IDIuMiwgc2hhcGUyID0gMS41KSAgIyBSZWFzb25hYmxlIHN0YXJ0aW5nIHZhbHVlcw0KDQojIFVzaW5nIG9wdGltIHdpdGggTmVsZGVyLU1lYWQgbWV0aG9kDQptbGUucmVzdWx0Lmt1bWEgPC0gb3B0aW0oDQogIHBhciA9IGluaXRpYWwucGFyYW1zLA0KICBmbiA9IGt1bWEubG9nbGlrLA0KICBnciA9IGt1bWEuc2NvcmUsDQogIGRhdGEgPSB3YXRlciwNCiAgbWV0aG9kID0gIkwtQkZHUy1CIiwNCiAgaGVzc2lhbiA9IFRSVUUsDQogIGNvbnRyb2wgPSBsaXN0KHRyYWNlID0gRkFMU0UsDQogICAgICAgICAgICAgICAgIGZuc2NhbGUgPSAtMSwNCiAgICAgICAgICAgICAgICAgbWF4aXQgPSA1MDAsDQogICAgICAgICAgICAgICAgIGFic3RvbCA9IDFlLTgpDQopDQojIw0KbWxlLnJlc3VsdC5rdW1hJHBhcg0KYGBgDQoNCkFjY29yZGluZyB0byB0aGUgb3V0cHV0LCB0aGUgZmlyc3Qgc2hhcGUgcGFyYW1ldGVyLCBhLCBpcyBlcXVhbCB0bw0KMi41Mjk2MDIsIGFuZCB0aGUgc2Vjb25kIHNoYXBlIHBhcmFtZXRlciwgYiwgaXMgZXF1YWwgdG8gNy44ODMzODYuDQoNCkZvciBmdXR1cmUgdXNlLCB0aGUgZXN0aW1hdGVzIHdpbGwgYmUgZXh0cmFjdGVkIGFuZCBwdXQgaW50byBvYmplY3RzLg0KDQpgYGB7cn0NCiMgRXh0cmFjdGluZyB0aGUgUGFyYW1ldGVyIEVzdGltYXRlcyBmb3IgRnV0dXJlIFVzZQ0KDQpzaGFwZTEuZXN0IDwtIG1sZS5yZXN1bHQua3VtYSRwYXJbMV0NCnNoYXBlMi5lc3QgPC0gbWxlLnJlc3VsdC5rdW1hJHBhclsyXQ0Ka3VtYS5lc3QgPC0gYyhzaGFwZTEuZXN0LCBzaGFwZTIuZXN0KQ0Ka3VtYS5lc3QNCmBgYA0KDQpcDQoNCiMjIyAqKlByb2JsZW0gQjIqKjoNCg0KRml0IHRoZSAqKnBvd2VyIGRpc3RyaWJ1dGlvbioqIHRvIHRoZSBhYm92ZSBkYXRhIHVzaW5nIHRoZSBkZXJpdmVkICBvZiAkYSQgb2J0YWluZWQgaW4gKipQcm9ibGVtIEE0KiogdG8gdGVzdCB0aGUgZm9sbG93aW5nIGh5cG90aGVzaXMgdXNpbmcgbGlrZWxpaG9vZCByYXRpbyBwcm9jZWR1cmUgYXIgc2lnbmlmaWNhbmNlIGxldmVsICRcYWxwaGEgPSAwLjA1JDoNCg0KJCQNCkhfMDogYiA9IDEgXHF1YWQgXHRleHR7IHZlcnN1cyB9IFxxdWFkIEhfYTogYiBcbmUgMS4NCiQkDQoNClN0YXRlIHRoZSBzdGF0aXN0aWNhbCBkZWNpc2lvbiBjbGVhcmx5LiBXaGF0IGlzIHRoZSBwcmFjdGljYWwgaW1wbGljYXRpb24gb2YgdGhlIHRlc3RpbmcgcmVzdWx0Pw0KDQpUaGUgaHlwb3RoZXNlcyBvZiBvdXIgdGVzdCBhcmUgYXMgZm9sbG93czoNCiQkIA0KSF8wOiBiID0gMSAoS3VtYXJhc3dhbXkgYmVjb21lcyBhIFBvd2VyIERpc3RyaWJ1dGlvbikgLw0KSF9hOiBiIFxuZXEgMSAoRGF0YSBmb2xsb3dzIGFub3RoZXIgS3VtYXJhc3dhbXkgRGlzdHJpYnV0aW9uKQ0KJCQNCg0KVGhlIGZvbGxvd2luZyBjb2RlIGNodW5rIGlzIGZvciB0aGUgbGlrZWxpaG9vZCByYXRpbyB0ZXN0Og0KDQpgYGB7cn0NCiMgTGlrZWxpaG9vZCBSYXRpbyBUZXN0IEZvciBQb3dlciB2cyBLdW1hcmFzd2FteSBkaXN0cmlidXRpb24NCg0KIyBNTEUgT2YgUG93ZXIgRGlzdHJpYnV0aW9uIFBhcmFtZXRlciBmcm9tIFBhcnQgQTQNCm4gPC0gbGVuZ3RoKHdhdGVyKQ0Kc2hhcGUzLm1sZSA8LSAtbiAvIHN1bShsb2cod2F0ZXIpKQ0KDQojIEt1bWFyYXN3YW15IExvZy1MaWtlbGlob29kIEZ1bmN0aW9uDQpsb2dsaWtlLmt1bWEgPC0gZnVuY3Rpb24oZGF0YSwgYSwgYikgew0KICBuIDwtIGxlbmd0aChkYXRhKQ0KIG4qbG9nKGEpICsgbipsb2coYikgKyAoYSAtIDEpKnN1bShsb2coZGF0YSkpICsgDQogICAgICAgICAgICAoYiAtIDEpKnN1bShsb2coMSAtIGRhdGFeYSkpIA0KfQ0KDQojIFBvd2VyIExvZy1MaWtlbGlob29kIEZ1bmN0aW9uDQpsb2dsaWtlLnBvd2VyIDwtIGZ1bmN0aW9uKGRhdGEsIGEpIHsgDQogIG4gPC0gbGVuZ3RoKGRhdGEpDQogIG4qbG9nKGEpICsgKGEgLSAxKSpzdW0obG9nKGRhdGEpKQ0KfQ0KDQojIFVucmVzdHJpY3RlZCBhbmQgUmVzdHJpY3RlZCBNTEVzIGZvciBMUiBUZXN0DQpsb2dsaWtlLmFsdDEgPC0gbG9nbGlrZS5rdW1hKHdhdGVyLCBzaGFwZTEuZXN0LCBzaGFwZTIuZXN0KQ0KbG9nbGlrZS5udWxsMSA8LSBsb2dsaWtlLnBvd2VyKHdhdGVyLCBzaGFwZTMubWxlKQ0KDQojIExpa2VsaWhvb2QgcmF0aW8gdGVzdCBzdGF0aXN0aWMNCkxSMSA8LSAyKihsb2dsaWtlLmFsdDEgLSBsb2dsaWtlLm51bGwxKQ0KDQojIHAtdmFsdWUgZnJvbSBjaGktc3F1YXJlKDEpDQpwdmFsdWUuTFIxIDwtIDEgLSBwY2hpc3EoTFIxLCBkZiA9IDEpDQoNCiMgVGVzdCBTdGF0aXN0aWMgYW5kIFAtdmFsdWUNCkxSMQ0KcHZhbHVlLkxSMQ0KYGBgDQpBY2NvcmRpbmcgdG8gdGhlIG91dHB1dCwgdGhlIHRlc3Qgc3RhdGlzdGljIGlzICRcY2hpXjIgPSA0OC45MjUzMyQsIGFuZCB0aGUgY29ycmVzcG9uZGluZyBwLXZhbHVlIGlzICQyLjY1eDEwXi0xMiQuIFNpbmNlIHRoZSBwLXZhbHVlIGlzIGxlc3MgdGhhbiB0aGUgbGV2ZWwgb2Ygc2lnbmlmaWNhbmNlLCB3ZSBjYW4gcmVqZWN0IHRoZSBudWxsIGh5cG90aGVzaXMgYW5kIGNvbmNsdWRlIHRoYXQgdGhlcmUgaXMgc3VmZmljaWVudCBldmlkZW5jZSB0byBjb25jbHVkZSB0aGF0IHRoaXMgZGF0YSBjb21lcyBmcm9tIGFub3RoZXIgS3VtYXJhc3dhbXkgYmFzZWQgZGlzdHJpYnV0aW9uLiBUbyBwdXQgaXQgaW4gcHJhY3RpY2FsIHRlcm1zLCB0aGUgcG93ZXIgZGlzdHJpYnV0aW9uIGlzIG5vdCBhIGdvb2QgZml0IGZvciB0aGlzIGRhdGEsIG1lYW5pbmcgdGhpcyBzYW1wbGUgaXMgdW5saWtlbHkgdG8gY29tZSBmcm9tIGEgcG9wdWxhdGlvbiBtb2RlbGVkIGJ5IGEgcG93ZXIgZGlzdHJpYnV0aW9uLiBUaGlzIHNhbXBsZSBtb3JlIHRoYW4gbGlrZWx5IGNvbWVzIGZyb20gYSBkaWZmZXJlbnQgS3VtYXJhc3dhbXkgYmFzZWQgZGlzdHJpYnV0aW9uLg0KDQpcDQoNCiMjIyAqKlByb2JsZW0gQjMqKjoNCg0KVXNlIHRoZSBwcm9jZWR1cmUgYW5kIGNvZGUgZnJvbSAqKlByb2JsZW0gQjEqKiB0byBlc3RpbWF0ZSB0aGUgTUxFcyBvZiAkYSQgYW5kICRiJCwgYW5kIHRoZW4gY29tcGxldGUgdGhlIGZvbGxvd2luZyBhbmFseXNlczoNCg0KKDEpLiBPYnRhaW4gdGhlIGJvb3RzdHJhcCBzYW1wbGluZyBkaXN0cmlidXRpb25zIG9mICRcaGF0e2F9JCBhbmQgJFxoYXR7Yn0kIGFuZCBwbG90IGVhY2ggZGlzdHJpYnV0aW9uIHVzaW5nICoqR2F1c3NpYW4ga2VybmVsIGRlbnNpdHkgY3VydmVzKiouDQoNCkZpcnN0LCBsZXQncyBnZXQgb3VyIGJvb3RzdHJhcCBzYW1wbGVzOg0KYGBge3J9DQojIEJvb3RzdHJhcCBTYW1wbGluZyBEaXN0cmlidXRpb25zIG9mIEt1bWFyYXN3YW15IE1MRXMNCg0KIyBTZXQgU2VlZCB0byBLZWVwIFNhbWUgU2FtcGxlDQpzZXQuc2VlZCgxKQ0KDQojIENob29zZSBOdW1iZXIgb2YgQm9vdHN0cmFwIFNhbXBsZXMgDQpCIDwtIDUwMDANCg0KIyBTdG9yZSBib290c3RyYXAgZXN0aW1hdGVzDQpib290LmEgPC0gTlVMTA0KYm9vdC5iIDwtIE5VTEwNCg0KZm9yKGkgaW4gMTpCKSB7DQogIA0KICAjIEJvb3RzdHJhcCBzYW1wbGUNCiAgYm9vdHN0cmFwLnNhbXBsZSA8LSBzYW1wbGUod2F0ZXIsIHNpemUgPSBuLCByZXBsYWNlID0gVFJVRSkNCiAgDQogICMgUmVmaXQgS3VtYXJhc3dhbXkgbW9kZWwgdG8gYm9vdHN0cmFwIHNhbXBsZQ0KICBib290LmZpdCA8LSBvcHRpbSgNCiAgICBwYXIgPSBjKHNoYXBlMS5lc3QsIHNoYXBlMi5lc3QpLA0KICAgIGZuID0ga3VtYS5sb2dsaWssDQogICAgZ3IgPSBrdW1hLnNjb3JlLA0KICAgIGRhdGEgPSBib290c3RyYXAuc2FtcGxlLA0KICAgIG1ldGhvZCA9ICJMLUJGR1MtQiIsDQogICAgbG93ZXIgPSBjKDFlLTgsIDFlLTgpLA0KICAgIGNvbnRyb2wgPSBsaXN0KA0KICAgICAgbWF4aXQgPSAxMDAwLA0KICAgICAgZm5zY2FsZSA9IC0xLA0KICAgICAgdHJhY2UgPSBGQUxTRSwNCiAgICAgIGFic3RvbCA9IDFlLTgNCiAgICApDQogICkNCiAgDQogICMgU2F2ZSBib290c3RyYXAgZXN0aW1hdGVzDQogIGJvb3QuYVtpXSA8LSBib290LmZpdCRwYXJbMV0NCiAgYm9vdC5iW2ldIDwtIGJvb3QuZml0JHBhclsyXQ0KfQ0KYGBgDQoNCkxldCdzIHBsb3QgYm90aCBvZiB0aGUgc2FtcGxpbmcgZGlzdHJpYnV0aW9ucyBmb3IgdGhlIGVzdGltYXRlcyBvZiBhDQpgYGB7cn0NCiMgUGxvdCBib290c3RyYXAgZGlzdHJpYnV0aW9uIG9mIGFfaGF0DQpoaXN0KGJvb3QuYSwNCiAgICAgcHJvYmFiaWxpdHkgPSBUUlVFLA0KICAgICBicmVha3MgPSAyMCwgDQogICAgIGNvbCA9ICJsaWdodGJsdWUiLA0KICAgICBtYWluID0gIkJvb3RzdHJhcCBTYW1wbGluZyBEaXN0cmlidXRpb24gZm9yIFBhcmFtZXRlciBhIiwNCiAgICAgeGxhYiA9IGV4cHJlc3Npb24ocGFzdGUoIkVzdGltYXRlcyBmb3IgIiwgaGF0KGEpKSkpDQpsaW5lcyhkZW5zaXR5KGJvb3QuYSksIGNvbCA9ICJyZWQiLCBsd2QgPSAyKQ0KDQojIFBsb3QgYm9vdHN0cmFwIGRpc3RyaWJ1dGlvbiBvZiBiX2hhdA0KaGlzdChib290LmIsDQogICAgIHByb2JhYmlsaXR5ID0gVFJVRSwNCiAgICAgYnJlYWtzID0gMjAsIA0KICAgICBjb2wgPSAibGlnaHRibHVlIiwNCiAgICAgbWFpbiA9ICJCb290c3RyYXAgU2FtcGxpbmcgRGlzdHJpYnV0aW9uIGZvciBQYXJhbWV0ZXIgYiIsDQogICAgIHhsYWIgPSBleHByZXNzaW9uKHBhc3RlKCJFc3RpbWF0ZXMgZm9yICIsIChoYXQoYikpKSkpDQogICAgIGxpbmVzKGRlbnNpdHkoYm9vdC5iKSwgY29sID0gInJlZCIsIGx3ZCA9IDIpDQpgYGANClRoZSBwbG90IGZvciAkXGhhdHthfSQgYXBwZWFycyB0byByb3VnaGx5IHJlc2VtYmxlIGEgbm9ybWFsIGN1cnZlLiBUaGUga2VybmVsIGRlbnNpdHkgY3VydmUgYWxzbyBkb2VzIGZpdCByZWxhdGl2ZWx5IHdlbGwuIEFzIGZvciB0aGUgcGxvdCBmb3IgJFxoYXR7Yn0kLCBpdCBkb2VzIG5vdCByZXNlbWJsZSBhIG5vcm1hbCBjdXJ2ZS4gVGhlcmUgaXMgc29tZSB2ZXJ5IG9idmlvdXMgc2tldy4NCg0KSWYgd2UgdGFrZSBhIGxvb2sgYXQgYSBzdW1tYXJ5IG9mIHRoZSBkaXN0cmlidXRpb25zLCB3ZSBjYW4gY2xlYXJseSBzZWUgdGhhdCB0aGVyZSBpcyBub3QgdG9vIG11Y2ggc3ByZWFkIGZvciB0aGUgZGlzdHJpYnV0aW9uIG9mICRcaGF0e2F9JC4gQW5kIHRoZSBtZWFuIGlzIHJlbGF0aXZlbHkgY2xvc2UgdG8gdGhlIG1lZGlhbi4gQnV0IHRoZXJlIGlzIG11Y2ggbW9yZSBzcHJlYWQgaW4gdGhlIGRpc3RyaWJ1dGlvbiBmb3IgJFxoYXR7Yn0kLCBhbmQgbWVhbiBpcyBmYXJ0aGVyIGZyb20gdGhlIG1lZGlhbi4NCmBgYHtyfQ0Kc3VtbWFyeShib290LmEpDQpzdW1tYXJ5KGJvb3QuYikNCmBgYA0KDQoNCigyKS4gIENvbnN0cnVjdCBib3RoIHRoZSAkOTVcJSQgKipib290c3RyYXAgY29uZmlkZW5jZSBpbnRlcnZhbCoqIGFuZCB0aGUgKipXYWxkIGNvbmZpZGVuY2UgaW50ZXJ2YWwqKiBmb3IgJGIkLiBEbyB0aGVzZSBpbnRlcnZhbHMgYWdyZWUgd2l0aCB0aGUgcmVzdWx0cyBvYnRhaW5lZCBpbiAqKlByb2JsZW0gQjIqKj8gWypDb21wdXRlIHRoZSBzdGFuZGFyZCBlcnJvciBvZiAkXGhhdHtifSQgdXNpbmcgdGhlIG9ic2VydmVkIEZpc2hlciBpbmZvcm1hdGlvbiBtYXRyaXgsIGkuZS4sIHRoZSBpbnZlcnNlIG9mIHRoZSBuZWdhdGl2ZSBIZXNzaWFuIG9idGFpbmVkIGZyb20gb3B0aW0oKSpdDQoNCmBgYHtyfQ0KIyBGaW5kIEJvb3RzdHJhcCBhbmQgV2FsZCBDb25maWRlbmNlIEludGVydmFscyBmb3IgYg0KDQojIDk1JSBQZXJjZW50aWxlIEJvb3RzdHJhcCBDb25maWRlbmNlIEludGVydmFsIA0KYm9vdGNpLnBlcmMuYiA8LSBxdWFudGlsZShib290LmIsIHByb2JzID0gYygwLjAyNSwgMC45NzUpKQ0KDQojIFBpZWNlcyB0byBCdWlsZCA5NSUgV2FsZCBDb25maWRlbmNlIEludGVydmFsDQpoZXNzaWFuIDwtIG1sZS5yZXN1bHQua3VtYSRoZXNzaWFuDQpmaXNoZXIgPC0gc29sdmUoLWhlc3NpYW4pDQpzZS5iLmVzdCA8LSBzcXJ0KGZpc2hlclsyLCAyXSkNCnogPC0gcW5vcm0oMC45NzUpDQplcnJvciA8LSB6KnNlLmIuZXN0DQoNCiMgQnVpbGQgV2FsZCBDb25maWRlbmNlIEludGVydmFsDQp3YWxkY2kuYiA8LSBjKHNoYXBlMi5lc3QgLSBlcnJvciwgc2hhcGUyLmVzdCArIGVycm9yKQ0KDQoNCmJvb3RjaS5wZXJjLmINCndhbGRjaS5iDQpgYGANClRoZSA5NSUgQm9vdHN0cmFwIENvbmZpZGVuY2UgSW50ZXJ2YWwgaXMgKDUuMDA2NiwgMTYuMTg4OSksIGFuZCB0aGUgOTUlIFdhbGQgY29uZmlkZW5jZSBpbnRlcnZhbCBpcyAoMywuNDg0LCAxMi4yODI3KS4gTmVpdGhlciBjb25maWRlbmNlIGludGVydmFsIGNvbnRhaW5zIDEsIHdoaWNoIHN1Z2dlc3RzIHRoYXQgdGhlIHJlc3VsdHMgYWdyZWUgd2l0aCB3aGF0IHdlIGdvdCBpbiBQYXJ0IEIyLiANCg0KDQooMykuIEJhc2VkIG9uIHRoZSBib290c3RyYXAgc2FtcGxpbmcgZGlzdHJpYnV0aW9ucyBmcm9tIHBhcnQgKDEpIG9mIHRoaXMgcHJvYmxlbSwgYXNzZXNzIHdoZXRoZXIgdGhlIHZhbGlkaXR5IG9mIHRoZSBXYWxkIGNvbmZpZGVuY2UgaW50ZXJ2YWwgaXMgc3VwcG9ydGVkLg0KDQpTaW5jZSB0aGUgd2FsZCBjb25maWRlbmNlIGludGVydmFsIGlzIGJhc2VkIG9uIGFzeW1wdG90aWMgbm9ybWFsaXR5LCB0aGUgZGlzdHJpYnV0aW9uIHNob3VsZCByZXNlbWJsZSBhIG5vcm1hbCBkaXN0cmlidXRpb24uIEhvd2V2ZXIsIGl0IGRpZCBub3QuIFRoZXJlIHdhcyBjb25zaWRlcmFibGUgc2tldywgYW5kIHRoZSBzdW1tYXJ5IHBvaW50ZWQgb3V0IHRoYXQgdGhlcmUgaXMgY29uc2lkZXJhYmxlIHNwcmVhZCBpbiB0aGUgZGlzdHJpYnV0aW9uLiBCYXNlZCBvbiB0aGlzIGNyaXRlcmlhLCB3ZSBjYW4gY29uY2x1ZGUgdGhhdCB0aGUgV2FsZCBjb25maWRlbmNlIGludGVydmFsIGlzIG5vdCBhIGdvb2QgY29uZmlkZW5jZSBpbnRlcnZhbCB0byB1c2UgaW4gdGhpcyBjYXNlLg0KDQpcDQoNCiMjIyAqKlByb2JsZW0gQjQqKjoNCg0KSW4gdGhlIGludHJvZHVjdGlvbiB0byB0aGUgd29ya2luZyBtb2RlbCBmb3IgdGhpcyBleGFtLCB0aGUgS3VtYXJhc3dhbXkgZGlzdHJpYnV0aW9uIHJlZHVjZXMgdG8gdGhlIHVuaWZvcm0gZGlzdHJpYnV0aW9uIG9uICgwLDEpLiBJbiB0aGlzIHByb2JsZW0sIHdlIHBlcmZvcm0gYSAqKmxpa2VsaWhvb2QgcmF0aW8gdGVzdCoqIGZvciB0aGUgZm9sbG93aW5nIGh5cG90aGVzaXMgdG8gYXNzZXNzIHdoZXRoZXIgdGhlIGRhdGEgY29tZSBmcm9tIHRoZSB1bmlmb3JtIGRpc3RyaWJ1dGlvbiBvbiAoMCwxKToNCg0KJCQNCkhfMDogYSA9IDFccXVhZCBcJiBccXVhZCBiID0gMVxxdWFkIFx0ZXh0eyB2ZXJzdXMgfSBccXVhZCBIX2E6IGEgXG5lIDEgXHF1YWQgXHRleHR7b3J9IFxxdWFkIGIgXG5lIDEgXHF1YWQgXHRleHR7b3J9XHF1YWQgKGEgXG5lIDEgXHF1YWQgXCYgXHF1YWQgYiBcbmUgMSkuDQokJA0KDQpQcm92aWRlIGEgcHJhY3RpY2FsIGludGVycHJldGF0aW9uIG9mIHRoZSBhYm92ZSB0ZXN0IHJlc3VsdC4gWypIaW50OiAkSF9hJCBiYXNpY2FsbHkgc2F5cyB0aGF0IHRoZXJlIGlzIG5vIGNvbnN0cmFpbnRzIGZvciAkYSQgYW5kICRiJC4gUGxlYXNlIHJldmlldyB0aGUgbGVjdHVyZSBub3RlIGZvciBtb2R1bGUgMTEgIG9uIHRoZSBsaWtlbGlob29kIHJhdGlvIHRlc3QgYmVmb3JlIGNvZGluZy4qXQ0KDQpgYGB7cn0NCiMgTGlrZWxpaG9vZCBSYXRpbyB0ZXN0IGZvciBVbmlmb3JtIHZzIEt1bWFyYXN3YW15IERpc3RyaWJ1dGlvbg0KDQojIFVzaW5nIEt1bWFyYXN3YW15IExpa2VsaWhvb2QgRnJvbSBQYXJ0IEIyIA0KbG9nbGlrZS5hbHQyIDwtIGxvZ2xpa2Uua3VtYSh3YXRlciwgc2hhcGUxLmVzdCwgc2hhcGUyLmVzdCkNCmxvZ2xpa2UubnVsbDIgPC0gbG9nbGlrZS5rdW1hKHdhdGVyLCAxLCAxKQ0KDQojIExpa2VsaWhvb2QgcmF0aW8gdGVzdCBzdGF0aXN0aWMNCkxSMiA8LSAyKihsb2dsaWtlLmFsdDIgLSBsb2dsaWtlLm51bGwyKQ0KDQojIHAtdmFsdWUgZnJvbSBDaGktU3F1YXJlKDEpDQpwdmFsdWUuTFIyIDwtIDEgLSBwY2hpc3EoTFIyLCBkZiA9IDEpDQoNCiMgVGVzdCBTdGF0aXN0aWMgYW5kIFAtdmFsdWUNCkxSMg0KcHZhbHVlLkxSMg0KYGBgDQpUaGUgdGVzdCBzdGF0aXN0aWMgaXMgJFxjaGleMiA9IDQ5LjEyNTQyJCwgYW5kIHRoZSBjb3JyZXNwb25kaW5nIHAtdmFsdWUgaXMgJDIuNHgxMF57LTEyfSQuIFNpbmNlIHRoZSBwLXZhbHVlIGlzIHNtYWxsZXIgdGhhbiAwLjA1LCB0aGVuIHdlIGNhbiByZWplY3QgdGhlIG51bGwgaHlwb3RoZXNpcywgYW5kIGNhbiBjb25jbHVkZSB0aGF0IHRoZXJlIGlzIHN1ZmZpY2llbnQgZXZpZGVuY2UgdG8gY29uY2x1ZGUgdGhhdCB0aGlzIGRhdGEgY29tZXMgZnJvbSBhbm90aGVyIEt1bWFyYXN3YW15IGJhc2VkIGRpc3RyaWJ1dGlvbi4gSW4gb3RoZXIgd29yZHMsIHRoaXMgc2FtcGxlIGlzIHVubGlrZWx5IHRvIGhhdmUgb3JpZ2luYXRlZCBmcm9tIGEgcG9wdWxhdGlvbiBtb2RlbGVkIGJ5IGEgdW5pZm9ybSBkaXN0cmlidXRpb24uIFRvIHB1dCBpbnRvIHByYWN0aWNhbCB0ZXJtcywgdGhlIG1lYXN1cmVtZW50cyBhcmUgYWxsIG5vdCBlcXVhbGx5IGxpa2VseSB0byBvY2N1ci4NCg0KDQoNCg==