1 Question 1

1.1 (a) Deriving the Method of Moments Equations

Assume the random variable \(X\) follows a lognormal distribution

\[ X \sim LN(\mu, \sigma^2) \]

The \(k\)-th moment of the lognormal distribution is

\[ E[X^k] = \exp\left(k\mu + \frac{1}{2}k^2\sigma^2\right) \]

1.1.0.1 First Moment

Setting \(k = 1\),

\[ E[X] = \exp\left(\mu + \frac{1}{2}\sigma^2\right) \]

The corresponding sample moment is the sample mean

\[ m_1 = \bar{X} \]

Equating the population and sample moments yields

\[ \bar{X} = \exp\left(\mu + \frac{1}{2}\sigma^2\right) \]

1.1.0.2 Second Moment

Setting \(k = 2\),

\[ E[X^2] = \exp\left(2\mu + 2\sigma^2\right) \]

The second sample moment is

\[ m_2 = \frac{1}{n}\sum_{i=1}^{n}X_i^2 \]

Equating the moments gives

\[ \frac{1}{n}\sum_{i=1}^{n}X_i^2 = \exp(2\mu + 2\sigma^2) \]

1.1.0.3 System of Moment Equations

Therefore, the Method of Moments estimators for \(\mu\) and \(\sigma^2\) are obtained by solving the following system

\[ \bar{X} = \exp\left(\mu + \frac{1}{2}\sigma^2\right) \]

\[ \frac{1}{n}\sum_{i=1}^{n}X_i^2 = \exp(2\mu + 2\sigma^2) \]

1.2 (b) Closed-form Expressions for the MME Estimators

From part (a), the Method of Moments equations are

\[ \bar{X} = \exp\left(\mu + \frac{1}{2}\sigma^2\right) \]

\[ m_2 = \frac{1}{n}\sum_{i=1}^{n}X_i^2 = \exp(2\mu + 2\sigma^2) \]

Taking natural logarithms,

\[ \ln(\bar{X}) = \mu + \frac{1}{2}\sigma^2 \]

\[ \ln(m_2) = 2\mu + 2\sigma^2 \]

Multiplying the first equation by 2 and subtracting from the second yields the estimator for \(\sigma^2\):

\[ \tilde{\sigma}^2 = \ln(m_2) - 2\ln(\bar{X}) \]

Substituting this result into the first equation and solving for \(\mu\) gives

\[ \tilde{\mu} = \ln(\bar{X}) - \frac{1}{2}\tilde{\sigma}^2 \]

Substituting \(\tilde{\sigma}^2 = \ln(m_2) - 2\ln(\bar{X})\),

\[ \tilde{\mu} = \ln(\bar{X}) - \frac{1}{2}(\ln(m_2) - 2\ln(\bar{X})) \]

which simplifies to

\[ \tilde{\mu} = 2\ln(\bar{X}) - \frac{1}{2}\ln(m_2) \]

1.2.0.1 Method of Moments Estimator for the Lognormal Mean

The mean of a lognormal distribution is

\[ \mu_{LN} = E[X] = \exp\left(\mu + \frac{1}{2}\sigma^2\right) \]

Applying the plug-in principle,

\[ \tilde{\mu}_{LN} = \exp\left(\tilde{\mu} + \frac{1}{2}\tilde{\sigma}^2\right) \]

From the first moment equation,

\[ \bar{X} = \exp\left(\mu + \frac{1}{2}\sigma^2\right) \]

therefore

\[ \tilde{\mu}_{LN} = \bar{X} \]

1.2.1 Final Method of Moments Estimators

\[ \tilde{\sigma}^2 = \ln(m_2) - 2\ln(\bar{X}) \]

\[ \tilde{\mu} = 2\ln(\bar{X}) - \frac{1}{2}\ln(m_2) \]

\[ \tilde{\mu}_{LN} = \bar{X} \]

1.3 (c) R Function for the Method of Moments Estimators

Using the results derived in part (b), the estimators are

\[ \tilde{\sigma}^2 = \ln(m_2) - 2\ln(\bar{X}) \]

\[ \tilde{\mu} = 2\ln(\bar{X}) - \frac{1}{2}\ln(m_2) \]

\[ \tilde{\mu}_{LN} = \bar{X} \]

The following function computes these estimators for our given dataset

mme_lognormal <- function(X) {

  # Compute the sample size
  n <- length(X)

  # Compute the sample mean (first sample moment)
  x_bar <- mean(X)

  # Compute the second sample moment
  m2 <- mean(X^2)

  # Compute the MME for sigma^2 using the formula derived in Question 1(b)
  sigma2_hat <- log(m2) - 2*log(x_bar)

  # Compute the MME for mu using the simplified closed-form expression
  mu_hat <- 2*log(x_bar) - 0.5*log(m2)

  # Compute the MME for the lognormal population mean
  # From the moment equation this simplifies to the sample mean
  muLN_hat <- x_bar

  # Return the three estimators as a named list
  return(list(
    mu_hat = mu_hat,
    sigma2_hat = sigma2_hat,
    muLN_hat = muLN_hat
  ))
}


wells <- c(
52.5, 57.7, 68.6, 70.5, 71.8, 72.4, 74.6, 75.1, 75.4, 76.1,
76.3, 77.2, 77.8, 78.1, 78.6, 79.2, 80.1, 80.4, 80.9, 81.3,
81.7, 82.2, 82.6, 83.1, 83.5, 84.2, 84.6, 85.1, 85.7, 86.3,
86.8, 87.4, 88.2, 88.9, 89.4, 90.1, 90.7, 91.2, 92.0, 92.6,
93.4, 94.1, 95.3, 96.8, 97.5, 98.9, 100.3, 101.7, 103.2, 105.4
)


mme_lognormal(wells)
$mu_hat
[1] 4.424698

$sigma2_hat
[1] 0.01580615

$muLN_hat
[1] 84.15

2 Question 2: Finding the MLE of \(\mu\) and \(\sigma^2\)

Assume that \(\{x_1,x_2,\dots,x_n\}\) follow a lognormal distribution \(LN(\mu,\sigma^2)\) with log-likelihood

\[ \ell(\mu,\sigma^2) = -\frac{n}{2}\ln(2\pi) - n\ln\sigma - \sum_{i=1}^{n}\ln x_i - \frac{1}{2\sigma^2}\sum_{i=1}^{n}(\ln x_i-\mu)^2 \]

To simplify differentiation, let \(\beta = \sigma^2\). The log-likelihood becomes

\[ \ell(\mu,\beta) = -\frac{n}{2}\ln(2\pi) - \frac{n}{2}\ln\beta - \sum_{i=1}^{n}\ln x_i - \frac{1}{2\beta}\sum_{i=1}^{n}(\ln x_i-\mu)^2 \]

2.1 (a) Derivation of the Score Functions

The score functions are obtained by taking partial derivatives of the log-likelihood.

2.1.1 Score function for \(\mu\)

\[ \frac{\partial \ell}{\partial \mu} = \frac{1}{\beta} \sum_{i=1}^{n}(\ln x_i-\mu) \]

Setting the score equation equal to zero,

\[ \frac{1}{\beta}\sum_{i=1}^{n}(\ln x_i-\mu)=0 \]

2.1.2 Score function for \(\beta = \sigma^2\)

\[ \frac{\partial \ell}{\partial \beta} = -\frac{n}{2\beta} + \frac{1}{2\beta^2} \sum_{i=1}^{n}(\ln x_i-\mu)^2 \]

Setting the score equation equal to zero,

\[ -\frac{n}{2\beta} + \frac{1}{2\beta^2} \sum_{i=1}^{n}(\ln x_i-\mu)^2 =0 \]

2.2 (b) Closed-form Maximum Likelihood Estimators

Solving the first score equation,

Multiplying both sides by \(\beta\),

\[ \beta \left(\frac{1}{\beta}\sum_{i=1}^{n}(\ln x_i-\mu)\right) = \beta \cdot 0 \]

which simplifies to

\[ \sum_{i=1}^{n}(\ln x_i-\mu)=0 \]

\[ \sum_{i=1}^{n}\ln x_i-n\mu=0 \]

\[ \hat{\mu}=\frac{1}{n}\sum_{i=1}^{n}\ln x_i \]

Solving the second score equation,

\[ -\frac{n}{2\beta} + \frac{1}{2\beta^2} \sum_{i=1}^{n}(\ln x_i-\mu)^2 =0 \]

Multiplying by \(2\beta^2\) gives

\[ -n\beta+\sum_{i=1}^{n}(\ln x_i-\mu)^2=0 \]

Solving for \(\beta\),

\[ \beta=\frac{1}{n}\sum_{i=1}^{n}(\ln x_i-\mu)^2 \]

Substituting \(\beta=\sigma^2\) and \(\mu=\hat{\mu}\),

\[ \hat{\sigma}^2= \frac{1}{n} \sum_{i=1}^{n}(\ln x_i-\hat{\mu})^2 \]

2.2.1 Final Maximum Likelihood Estimators

\[ \hat{\mu}=\frac{1}{n}\sum_{i=1}^{n}\ln x_i \]

\[ \hat{\sigma}^2= \frac{1}{n} \sum_{i=1}^{n}(\ln x_i-\hat{\mu})^2 \]

2.3 (c) Variance of the Lognormal Distribution

Recall that the lognormal population mean is

\[ \mu_{LN}=E[X]=\exp\left(\mu+\frac{1}{2}\sigma^2\right) \]

Using the relationship between the first and second moments,

\[ Var(X)=E[X^2]-(E[X])^2 \]

From the \(k\)-th moment formula of the lognormal distribution,

\[ E[X^k]=\exp\left(k\mu+\frac{1}{2}k^2\sigma^2\right) \]

Setting \(k=2\) gives

\[ E[X^2]=\exp(2\mu+2\sigma^2) \]

Substituting into the variance formula,

\[ Var(X) = \exp(2\mu+2\sigma^2) - \left(\exp\left(\mu+\frac{1}{2}\sigma^2\right)\right)^2 \]

Simplifying,

\[ \sigma^2_{LN} = \exp(2\mu+2\sigma^2) - \exp(2\mu+\sigma^2) \]

Factoring yields

\[ \sigma^2_{LN} = (\exp(\sigma^2)-1)\exp(2\mu+\sigma^2) \]

3 Question 3: Sampling Distribution of Lognormal Sample Mean \(\hat{\mu}_{LN}\)

3.1 (a) Function to compute \(\hat{\mu}\), \(\hat{\sigma}^2\), and \(\hat{\mu}_{LN}\)

mle_lognormal <- function(x){

  # Take the natural logarithm of the data since ln(X) ~ N(mu, sigma^2)
  logx <- log(x)

  # Compute the MLE of mu, which is the sample mean of the log-transformed data
  mu_hat <- mean(logx)

  # Compute the MLE of sigma^2
  sigma2_hat <- mean((logx - mu_hat)^2)

  # Compute the MLE of the lognormal population mean 
  muLN_hat <- exp(mu_hat + 0.5 * sigma2_hat)

  return(list(mu_hat = mu_hat,
              sigma2_hat = sigma2_hat,
              muLN_hat = muLN_hat))
}

3.2 (b) Generate 1000 bootstrap samples and compute bootstrap MLEs

# Enter the dataset of 50 observations
data <- c(
17.3,24.8,8.2,31.5,14.1,42.7,11.9,55.3,21.4,9.7,
36.2,18.6,63.1,13.2,28.9,47.5,19.8,7.5,33.4,52.1,
16.0,25.9,38.7,10.3,44.2,22.5,58.6,12.8,30.3,48.9,
20.1,35.4,15.7,60.2,26.7,41.3,18.1,53.8,23.9,46.2,
29.4,37.6,14.9,50.5,32.8,19.3,56.7,11.2,39.5,27.1
)

# Set the random seed results are the same each time the code is run
set.seed(123)

B <- 1000

bootstrap_muLN <- numeric(B)

for(b in 1:B){

  # Draw a bootstrap sample of size n with replacement from the dataset
  sample_b <- sample(data, replace = TRUE)

  # Apply the MLE function to the bootstrap sample
  result <- mle_lognormal(sample_b)

  # Store the bootstrap estimate of the lognormal mean
  bootstrap_muLN[b] <- result$muLN_hat
}

3.3 (c) and (d) Kernel Density Estimate of Bootstrap MLEs and the asymptotic normal density using plug-in estimates

# Compute the kernel density estimate of the bootstrap estimates
boot_density <- density(bootstrap_muLN)

# Plot the bootstrap sampling distribution using the KDE
plot(boot_density,
     main="Bootstrap Sampling Distribution of mu_LN",
     xlab="Estimated lognormal mean")


## (d) Add asymptotic normal density using plug-in estimates

n <- length(data)

# Use the MLE function on the original dataset to obtain the estimates
result <- mle_lognormal(data)

# Extract the MLEs of mu, sigma^2, and the lognormal mean
mu_hat <- result$mu_hat
sigma2_hat <- result$sigma2_hat
muLN_hat <- result$muLN_hat

# Compute the plug-in estimate of the lognormal population variance
sigma2_LN_hat <- (exp(sigma2_hat)-1)*exp(2*mu_hat + sigma2_hat)

# Compute the standard deviation of the asymptotic sampling distribution
sd_CLT <- sqrt(sigma2_LN_hat/n)

# Add the asymptotic normal density curve to the existing bootstrap KDE plot
curve(dnorm(x, mean=muLN_hat, sd=sd_CLT),
      add=TRUE,
      col="red",
      lwd=2)

# Add a legend identifying the two curves
legend("bottomleft",
       legend=c("Bootstrap KDE","CLT Normal Approximation"),
       col=c("black","red"),
       lwd=2)

3.4 (e) Comparison

The bootstrap kernel density estimate provides an empirical approximation of the sampling distribution of the MLE of the lognormal mean based on repeated resampling from the observed dataset. The asymptotic normal distribution obtained from the Central Limit Theorem represents the theoretical large-sample approximation of the sampling distribution of the estimator.

From the plot, the bootstrap density and the asymptotic normal curve are centered around similar values, indicating that both methods estimate a similar mean for the sampling distribution. The overall shapes of the two curves are also fairly similar, although the bootstrap distribution appears slightly more peaked and exhibits mild asymmetry compared to the normal approximation. In contrast, the CLT approximation is perfectly symmetric.

Overall, the two distributions are reasonably close, suggesting that the normal approximation provided by the Central Limit Theorem offers a good approximation to the sampling distribution of the estimator for this sample size, although the bootstrap distribution captures slight deviations from normality.

LS0tDQp0aXRsZTogJ1NUQSA1MDYgTUlELVRFUk0gRVhBTScNCmF1dGhvcjogJ0dlcmFyZCBJa2UnDQpkYXRlOiAiMjAyNi0wMy0wNyINCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDogICAgICAgICAgICAgICMgb3V0cHV0IGRvY3VtZW50IGZvcm1hdA0KICAgIHRvYzogeWVzICAgICAgICAgICAgICAgICAgIyBhZGQgdGFibGUgY29udGVudHMNCiAgICB0b2NfZmxvYXQ6IHllcyAgICAgICAgICAgICMgdG9jX3Byb3BlcnR5OiBmbG9hdGluZw0KICAgIHRvY19kZXB0aDogNCAgICAgICAgICAgICAgIyBkZXB0aCBvZiBUT0MgaGVhZGluZ3MNCiAgICBmaWdfd2lkdGg6IDYgICAgICAgICAgICAgICMgZ2xvYmFsIGZpZ3VyZSB3aWR0aA0KICAgIGZpZ19oZWlnaHQ6IDQgICAgICAgICAgICAgIyBnbG9iYWwgZmlndXJlIGhlaWdodA0KICAgIGZpZ19jYXB0aW9uOiB5ZXMgICAgICAgICAgIyBhZGQgZmlndXJlIGNhcHRpb24NCiAgICBudW1iZXJfc2VjdGlvbnM6IHllcyAgICAgICMgbnVtYmVyaW5nIHNlY3Rpb24gaGVhZGluZ3MNCiAgICB0b2NfY29sbGFwc2VkOiB5ZXMgICAgICAgICMgVE9DIHN1YmhlYWRpbmcgY2xhcHNpbmcNCiAgICBjb2RlX2ZvbGRpbmc6IGhpZGUgICAgICAgICMgZm9sZGluZy9zaG93aW5nIGNvZGUNCiAgICBjb2RlX2Rvd25sb2FkOiB5ZXMgICAgICAgICMgYWxsb3cgdG8gZG93bmxvYWQgY29tcGxldGUgUk1hcmtkb3duIHNvdXJjZSBjb2RlDQogICAgc21vb3RoX3Njcm9sbDogeWVzICAgICAgICAjIHNjcm9sbGluZyB0ZXh0IG9mIHRoZSBkb2N1bWVudA0KICAgIHRoZW1lOiBsdW1lbiAgICAgICAgICAgICAgIyB2aXN1YWwgdGhlbWUgZm9yIEhUTUwgZG9jdW1lbnQgb25seQ0KICAgIGhpZ2hsaWdodDogdGFuZ28gICAgICAgICAgIyBjb2RlIHN5bnRheCBoaWdobGlnaHRpbmcgc3R5bGVzDQogIHBkZl9kb2N1bWVudDoNCiAgICB0b2M6IHllcw0KICAgIHRvY19kZXB0aDogNA0KICAgIGZpZ19jYXB0aW9uOiB5ZXMNCiAgICBudW1iZXJfc2VjdGlvbnM6IHllcw0KICB3b3JkX2RvY3VtZW50Og0KICAgIHRvYzogeWVzDQogICAgdG9jX2RlcHRoOiAnNCcNCi0tLQ0KDQpgYGB7Y3NzLCBlY2hvID0gRkFMU0V9DQpkaXYjVE9DIGxpIHsgICAgIC8qIHRhYmxlIG9mIGNvbnRlbnQgICovDQogICAgbGlzdC1zdHlsZTp1cHBlci1yb21hbjsNCiAgICBiYWNrZ3JvdW5kLWltYWdlOm5vbmU7DQogICAgYmFja2dyb3VuZC1yZXBlYXQ6bm9uZTsNCiAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOjA7DQp9DQoNCmgxLnRpdGxlIHsgICAgLyogbGV2ZWwgMSBoZWFkZXIgb2YgdGl0bGUgICovDQogIGZvbnQtc2l6ZTogMjRweDsNCiAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogIGNvbG9yOiBEYXJrUmVkOw0KICB0ZXh0LWFsaWduOiBjZW50ZXI7DQp9DQoNCmg0LmF1dGhvciB7IC8qIEhlYWRlciA0IC0gYW5kIHRoZSBhdXRob3IgYW5kIGRhdGEgaGVhZGVycyB1c2UgdGhpcyB0b28gICovDQogIGZvbnQtc2l6ZTogMThweDsNCiAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICBjb2xvcjogRGFya1JlZDsNCiAgdGV4dC1hbGlnbjogY2VudGVyOw0KfQ0KDQpoNC5kYXRlIHsgLyogSGVhZGVyIDQgLSBhbmQgdGhlIGF1dGhvciBhbmQgZGF0YSBoZWFkZXJzIHVzZSB0aGlzIHRvbyAgKi8NCiAgZm9udC1zaXplOiAxOHB4Ow0KICBmb250LXdlaWdodDogYm9sZDsNCiAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7DQogIGNvbG9yOiBEYXJrQmx1ZTsNCiAgdGV4dC1hbGlnbjogY2VudGVyOw0KfQ0KDQpoMSB7IC8qIEhlYWRlciAxIC0gYW5kIHRoZSBhdXRob3IgYW5kIGRhdGEgaGVhZGVycyB1c2UgdGhpcyB0b28gICovDQogICAgZm9udC1zaXplOiAyMHB4Ow0KICAgIGZvbnQtd2VpZ2h0OiBib2xkOw0KICAgIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICAgIGNvbG9yOiBkYXJrcmVkOw0KICAgIHRleHQtYWxpZ246IGNlbnRlcjsNCn0NCg0KaDIgeyAvKiBIZWFkZXIgMiAtIGFuZCB0aGUgYXV0aG9yIGFuZCBkYXRhIGhlYWRlcnMgdXNlIHRoaXMgdG9vICAqLw0KICAgIGZvbnQtc2l6ZTogMThweDsNCiAgICBmb250LXdlaWdodDogYm9sZDsNCiAgICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsNCiAgICBjb2xvcjogbmF2eTsNCiAgICB0ZXh0LWFsaWduOiBsZWZ0Ow0KfQ0KDQpoMyB7IC8qIEhlYWRlciAzIC0gYW5kIHRoZSBhdXRob3IgYW5kIGRhdGEgaGVhZGVycyB1c2UgdGhpcyB0b28gICovDQogICAgZm9udC1zaXplOiAxNnB4Ow0KICAgIGZvbnQtd2VpZ2h0OiBib2xkOw0KICAgIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICAgIGNvbG9yOiBuYXZ5Ow0KICAgIHRleHQtYWxpZ246IGxlZnQ7DQp9DQoNCmg0IHsgLyogSGVhZGVyIDQgLSBhbmQgdGhlIGF1dGhvciBhbmQgZGF0YSBoZWFkZXJzIHVzZSB0aGlzIHRvbyAgKi8NCiAgICBmb250LXNpemU6IDE0cHg7DQogIGZvbnQtd2VpZ2h0OiBib2xkOw0KICAgIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICAgIGNvbG9yOiBkYXJrcmVkOw0KICAgIHRleHQtYWxpZ246IGxlZnQ7DQp9DQoNCi8qIEFkZCBkb3RzIGFmdGVyIG51bWJlcmVkIGhlYWRlcnMgKi8NCi5oZWFkZXItc2VjdGlvbi1udW1iZXI6OmFmdGVyIHsNCiAgY29udGVudDogIi4iOw0KfQ0KYGBgDQoNCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQ0KIyBjb2RlIGNodW5rIHNwZWNpZmllcyB3aGV0aGVyIHRoZSBSIGNvZGUsIHdhcm5pbmdzLCBhbmQgb3V0cHV0IA0KIyB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSBvdXRwdXQgZmlsZXMuDQoNCmlmICghcmVxdWlyZSgia25pdHIiKSkgeyAgICAgICAgICAgICAgICAgICAgICAjIHVzZSBjb25kaXRpb25hbCBzdGF0ZW1lbnQgdG8gZGV0ZWN0DQogICBpbnN0YWxsLnBhY2thZ2VzKCJrbml0ciIpICAgICAgICAgICAgICAgICAgIyB3aGV0aGVyIGEgcGFja2FnZSB3YXMgaW5zdGFsbGVkIGluDQogICBsaWJyYXJ5KGtuaXRyKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyB5b3VyIG1hY2hpbmUuIElmIG5vdCwgaW5zdGFsbCBpdCBhbmQNCn0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGxvYWQgaXQgdG8gdGhlIHdvcmtpbmcgZGlyZWN0b3J5Lg0KIw0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFLCAgICAgICAgICAgICMgaW5jbHVkZSBjb2RlIGNodW5rIGluIHRoZSBvdXRwdXQgZmlsZQ0KICAgICAgICAgICAgICAgICAgICAgIHdhcm5pbmcgPSBGQUxTRSwgICAgICAgICMgc29tZXRpbWVzLCB5b3UgY29kZSBtYXkgcHJvZHVjZSB3YXJuaW5nIG1lc3NhZ2VzLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgeW91IGNhbiBjaG9vc2UgdG8gaW5jbHVkZSB0aGUgd2FybmluZyBtZXNzYWdlcyBpbg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgdGhlIG91dHB1dCBmaWxlLiANCiAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzID0gVFJVRSwgICAgICAgICAjIHlvdSBjYW4gYWxzbyBkZWNpZGUgd2hldGhlciB0byBpbmNsdWRlIHRoZSBvdXRwdXQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGluIHRoZSBvdXRwdXQgZmlsZS4NCiAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gRkFMU0UsICAgICAgICAjIHN1cHByZXNzIG1lc3NhZ2VzIA0KICAgICAgICAgICAgICAgICAgICAgIGNvbW1lbnQgPSBOQSAgICAgICAgICAgICMgcmVtb3ZlIHRoZSBkZWZhdWx0IGxlYWRpbmcgaGFzaCB0YWdzIGluIHRoZSBvdXRwdXQNCiAgICAgICAgICAgICAgICAgICAgICApICAgDQpgYGANCg0KIyBRdWVzdGlvbiAxDQoNCiMjIChhKSBEZXJpdmluZyB0aGUgTWV0aG9kIG9mIE1vbWVudHMgRXF1YXRpb25zDQoNCkFzc3VtZSB0aGUgcmFuZG9tIHZhcmlhYmxlICRYJCBmb2xsb3dzIGEgbG9nbm9ybWFsIGRpc3RyaWJ1dGlvbg0KDQokJA0KWCBcc2ltIExOKFxtdSwgXHNpZ21hXjIpDQokJA0KDQpUaGUgJGskLXRoIG1vbWVudCBvZiB0aGUgbG9nbm9ybWFsIGRpc3RyaWJ1dGlvbiBpcw0KDQokJA0KRVtYXmtdID0gXGV4cFxsZWZ0KGtcbXUgKyBcZnJhY3sxfXsyfWteMlxzaWdtYV4yXHJpZ2h0KQ0KJCQNCg0KIyMjIyBGaXJzdCBNb21lbnQNCg0KU2V0dGluZyAkayA9IDEkLA0KDQokJA0KRVtYXSA9IFxleHBcbGVmdChcbXUgKyBcZnJhY3sxfXsyfVxzaWdtYV4yXHJpZ2h0KQ0KJCQNCg0KVGhlIGNvcnJlc3BvbmRpbmcgc2FtcGxlIG1vbWVudCBpcyB0aGUgc2FtcGxlIG1lYW4NCg0KJCQNCm1fMSA9IFxiYXJ7WH0NCiQkDQoNCkVxdWF0aW5nIHRoZSBwb3B1bGF0aW9uIGFuZCBzYW1wbGUgbW9tZW50cyB5aWVsZHMNCg0KJCQNClxiYXJ7WH0gPSBcZXhwXGxlZnQoXG11ICsgXGZyYWN7MX17Mn1cc2lnbWFeMlxyaWdodCkNCiQkDQoNCiMjIyMgU2Vjb25kIE1vbWVudA0KDQpTZXR0aW5nICRrID0gMiQsDQoNCiQkDQpFW1heMl0gPSBcZXhwXGxlZnQoMlxtdSArIDJcc2lnbWFeMlxyaWdodCkNCiQkDQoNClRoZSBzZWNvbmQgc2FtcGxlIG1vbWVudCBpcw0KDQokJA0KbV8yID0gXGZyYWN7MX17bn1cc3VtX3tpPTF9XntufVhfaV4yDQokJA0KDQpFcXVhdGluZyB0aGUgbW9tZW50cyBnaXZlcw0KDQokJA0KXGZyYWN7MX17bn1cc3VtX3tpPTF9XntufVhfaV4yID0gXGV4cCgyXG11ICsgMlxzaWdtYV4yKQ0KJCQNCg0KIyMjIyBTeXN0ZW0gb2YgTW9tZW50IEVxdWF0aW9ucw0KDQpUaGVyZWZvcmUsIHRoZSBNZXRob2Qgb2YgTW9tZW50cyBlc3RpbWF0b3JzIGZvciAkXG11JCBhbmQgJFxzaWdtYV4yJCBhcmUgb2J0YWluZWQgYnkgc29sdmluZyB0aGUgZm9sbG93aW5nIHN5c3RlbQ0KDQokJA0KXGJhcntYfSA9IFxleHBcbGVmdChcbXUgKyBcZnJhY3sxfXsyfVxzaWdtYV4yXHJpZ2h0KQ0KJCQNCg0KJCQNClxmcmFjezF9e259XHN1bV97aT0xfV57bn1YX2leMiA9IFxleHAoMlxtdSArIDJcc2lnbWFeMikNCiQkDQoNCiMjIChiKSBDbG9zZWQtZm9ybSBFeHByZXNzaW9ucyBmb3IgdGhlIE1NRSBFc3RpbWF0b3JzDQoNCkZyb20gcGFydCAoYSksIHRoZSBNZXRob2Qgb2YgTW9tZW50cyBlcXVhdGlvbnMgYXJlDQoNCiQkDQpcYmFye1h9ID0gXGV4cFxsZWZ0KFxtdSArIFxmcmFjezF9ezJ9XHNpZ21hXjJccmlnaHQpDQokJA0KDQokJA0KbV8yID0gXGZyYWN7MX17bn1cc3VtX3tpPTF9XntufVhfaV4yID0gXGV4cCgyXG11ICsgMlxzaWdtYV4yKQ0KJCQNCg0KVGFraW5nIG5hdHVyYWwgbG9nYXJpdGhtcywNCg0KJCQNClxsbihcYmFye1h9KSA9IFxtdSArIFxmcmFjezF9ezJ9XHNpZ21hXjINCiQkDQoNCiQkDQpcbG4obV8yKSA9IDJcbXUgKyAyXHNpZ21hXjINCiQkDQoNCk11bHRpcGx5aW5nIHRoZSBmaXJzdCBlcXVhdGlvbiBieSAyIGFuZCBzdWJ0cmFjdGluZyBmcm9tIHRoZSBzZWNvbmQgeWllbGRzIHRoZSBlc3RpbWF0b3IgZm9yICRcc2lnbWFeMiQ6DQoNCiQkDQpcdGlsZGV7XHNpZ21hfV4yID0gXGxuKG1fMikgLSAyXGxuKFxiYXJ7WH0pDQokJA0KDQpTdWJzdGl0dXRpbmcgdGhpcyByZXN1bHQgaW50byB0aGUgZmlyc3QgZXF1YXRpb24gYW5kIHNvbHZpbmcgZm9yICRcbXUkIGdpdmVzDQoNCiQkDQpcdGlsZGV7XG11fSA9IFxsbihcYmFye1h9KSAtIFxmcmFjezF9ezJ9XHRpbGRle1xzaWdtYX1eMg0KJCQNCg0KU3Vic3RpdHV0aW5nICRcdGlsZGV7XHNpZ21hfV4yID0gXGxuKG1fMikgLSAyXGxuKFxiYXJ7WH0pJCwNCg0KJCQNClx0aWxkZXtcbXV9DQo9DQpcbG4oXGJhcntYfSkNCi0NClxmcmFjezF9ezJ9KFxsbihtXzIpIC0gMlxsbihcYmFye1h9KSkNCiQkDQoNCndoaWNoIHNpbXBsaWZpZXMgdG8NCg0KJCQNClx0aWxkZXtcbXV9DQo9DQoyXGxuKFxiYXJ7WH0pIC0gXGZyYWN7MX17Mn1cbG4obV8yKQ0KJCQNCg0KIyMjIyBNZXRob2Qgb2YgTW9tZW50cyBFc3RpbWF0b3IgZm9yIHRoZSBMb2dub3JtYWwgTWVhbg0KDQpUaGUgbWVhbiBvZiBhIGxvZ25vcm1hbCBkaXN0cmlidXRpb24gaXMNCg0KJCQNClxtdV97TE59ID0gRVtYXSA9IFxleHBcbGVmdChcbXUgKyBcZnJhY3sxfXsyfVxzaWdtYV4yXHJpZ2h0KQ0KJCQNCg0KQXBwbHlpbmcgdGhlIHBsdWctaW4gcHJpbmNpcGxlLA0KDQokJA0KXHRpbGRle1xtdX1fe0xOfSA9DQpcZXhwXGxlZnQoXHRpbGRle1xtdX0gKyBcZnJhY3sxfXsyfVx0aWxkZXtcc2lnbWF9XjJccmlnaHQpDQokJA0KDQpGcm9tIHRoZSBmaXJzdCBtb21lbnQgZXF1YXRpb24sDQoNCiQkDQpcYmFye1h9ID0gXGV4cFxsZWZ0KFxtdSArIFxmcmFjezF9ezJ9XHNpZ21hXjJccmlnaHQpDQokJA0KDQp0aGVyZWZvcmUNCg0KJCQNClx0aWxkZXtcbXV9X3tMTn0gPSBcYmFye1h9DQokJA0KDQojIyMgRmluYWwgTWV0aG9kIG9mIE1vbWVudHMgRXN0aW1hdG9ycw0KDQokJA0KXHRpbGRle1xzaWdtYX1eMiA9IFxsbihtXzIpIC0gMlxsbihcYmFye1h9KQ0KJCQNCg0KJCQNClx0aWxkZXtcbXV9ID0gMlxsbihcYmFye1h9KSAtIFxmcmFjezF9ezJ9XGxuKG1fMikNCiQkDQoNCiQkDQpcdGlsZGV7XG11fV97TE59ID0gXGJhcntYfQ0KJCQNCg0KIyMgKGMpIFIgRnVuY3Rpb24gZm9yIHRoZSBNZXRob2Qgb2YgTW9tZW50cyBFc3RpbWF0b3JzDQoNClVzaW5nIHRoZSByZXN1bHRzIGRlcml2ZWQgaW4gcGFydCAoYiksIHRoZSBlc3RpbWF0b3JzIGFyZQ0KDQokJA0KXHRpbGRle1xzaWdtYX1eMiA9IFxsbihtXzIpIC0gMlxsbihcYmFye1h9KQ0KJCQNCg0KJCQNClx0aWxkZXtcbXV9ID0gMlxsbihcYmFye1h9KSAtIFxmcmFjezF9ezJ9XGxuKG1fMikNCiQkDQoNCiQkDQpcdGlsZGV7XG11fV97TE59ID0gXGJhcntYfQ0KJCQNCg0KVGhlIGZvbGxvd2luZyBmdW5jdGlvbiBjb21wdXRlcyB0aGVzZSBlc3RpbWF0b3JzIGZvciBvdXIgZ2l2ZW4gZGF0YXNldA0KDQpgYGB7cn0NCg0KbW1lX2xvZ25vcm1hbCA8LSBmdW5jdGlvbihYKSB7DQoNCiAgIyBDb21wdXRlIHRoZSBzYW1wbGUgc2l6ZQ0KICBuIDwtIGxlbmd0aChYKQ0KDQogICMgQ29tcHV0ZSB0aGUgc2FtcGxlIG1lYW4gKGZpcnN0IHNhbXBsZSBtb21lbnQpDQogIHhfYmFyIDwtIG1lYW4oWCkNCg0KICAjIENvbXB1dGUgdGhlIHNlY29uZCBzYW1wbGUgbW9tZW50DQogIG0yIDwtIG1lYW4oWF4yKQ0KDQogICMgQ29tcHV0ZSB0aGUgTU1FIGZvciBzaWdtYV4yIHVzaW5nIHRoZSBmb3JtdWxhIGRlcml2ZWQgaW4gUXVlc3Rpb24gMShiKQ0KICBzaWdtYTJfaGF0IDwtIGxvZyhtMikgLSAyKmxvZyh4X2JhcikNCg0KICAjIENvbXB1dGUgdGhlIE1NRSBmb3IgbXUgdXNpbmcgdGhlIHNpbXBsaWZpZWQgY2xvc2VkLWZvcm0gZXhwcmVzc2lvbg0KICBtdV9oYXQgPC0gMipsb2coeF9iYXIpIC0gMC41KmxvZyhtMikNCg0KICAjIENvbXB1dGUgdGhlIE1NRSBmb3IgdGhlIGxvZ25vcm1hbCBwb3B1bGF0aW9uIG1lYW4NCiAgIyBGcm9tIHRoZSBtb21lbnQgZXF1YXRpb24gdGhpcyBzaW1wbGlmaWVzIHRvIHRoZSBzYW1wbGUgbWVhbg0KICBtdUxOX2hhdCA8LSB4X2Jhcg0KDQogICMgUmV0dXJuIHRoZSB0aHJlZSBlc3RpbWF0b3JzIGFzIGEgbmFtZWQgbGlzdA0KICByZXR1cm4obGlzdCgNCiAgICBtdV9oYXQgPSBtdV9oYXQsDQogICAgc2lnbWEyX2hhdCA9IHNpZ21hMl9oYXQsDQogICAgbXVMTl9oYXQgPSBtdUxOX2hhdA0KICApKQ0KfQ0KDQoNCndlbGxzIDwtIGMoDQo1Mi41LCA1Ny43LCA2OC42LCA3MC41LCA3MS44LCA3Mi40LCA3NC42LCA3NS4xLCA3NS40LCA3Ni4xLA0KNzYuMywgNzcuMiwgNzcuOCwgNzguMSwgNzguNiwgNzkuMiwgODAuMSwgODAuNCwgODAuOSwgODEuMywNCjgxLjcsIDgyLjIsIDgyLjYsIDgzLjEsIDgzLjUsIDg0LjIsIDg0LjYsIDg1LjEsIDg1LjcsIDg2LjMsDQo4Ni44LCA4Ny40LCA4OC4yLCA4OC45LCA4OS40LCA5MC4xLCA5MC43LCA5MS4yLCA5Mi4wLCA5Mi42LA0KOTMuNCwgOTQuMSwgOTUuMywgOTYuOCwgOTcuNSwgOTguOSwgMTAwLjMsIDEwMS43LCAxMDMuMiwgMTA1LjQNCikNCg0KDQptbWVfbG9nbm9ybWFsKHdlbGxzKQ0KYGBgDQoNCiMgUXVlc3Rpb24gMjogRmluZGluZyB0aGUgTUxFIG9mICRcbXUkIGFuZCAkXHNpZ21hXjIkDQoNCkFzc3VtZSB0aGF0ICRce3hfMSx4XzIsXGRvdHMseF9uXH0kIGZvbGxvdyBhIGxvZ25vcm1hbCBkaXN0cmlidXRpb24gJExOKFxtdSxcc2lnbWFeMikkIHdpdGggbG9nLWxpa2VsaWhvb2QNCg0KJCQNClxlbGwoXG11LFxzaWdtYV4yKQ0KPQ0KLVxmcmFje259ezJ9XGxuKDJccGkpDQotDQpuXGxuXHNpZ21hDQotDQpcc3VtX3tpPTF9XntufVxsbiB4X2kNCi0NClxmcmFjezF9ezJcc2lnbWFeMn1cc3VtX3tpPTF9XntufShcbG4geF9pLVxtdSleMg0KJCQNCg0KVG8gc2ltcGxpZnkgZGlmZmVyZW50aWF0aW9uLCBsZXQgJFxiZXRhID0gXHNpZ21hXjIkLiBUaGUgbG9nLWxpa2VsaWhvb2QgYmVjb21lcw0KDQokJA0KXGVsbChcbXUsXGJldGEpDQo9DQotXGZyYWN7bn17Mn1cbG4oMlxwaSkNCi0NClxmcmFje259ezJ9XGxuXGJldGENCi0NClxzdW1fe2k9MX1ee259XGxuIHhfaQ0KLQ0KXGZyYWN7MX17MlxiZXRhfVxzdW1fe2k9MX1ee259KFxsbiB4X2ktXG11KV4yDQokJA0KDQoNCiMjIChhKSBEZXJpdmF0aW9uIG9mIHRoZSBTY29yZSBGdW5jdGlvbnMNCg0KVGhlIHNjb3JlIGZ1bmN0aW9ucyBhcmUgb2J0YWluZWQgYnkgdGFraW5nIHBhcnRpYWwgZGVyaXZhdGl2ZXMgb2YgdGhlIGxvZy1saWtlbGlob29kLg0KDQojIyMgU2NvcmUgZnVuY3Rpb24gZm9yICRcbXUkDQoNCiQkDQpcZnJhY3tccGFydGlhbCBcZWxsfXtccGFydGlhbCBcbXV9DQo9DQpcZnJhY3sxfXtcYmV0YX0NClxzdW1fe2k9MX1ee259KFxsbiB4X2ktXG11KQ0KJCQNCg0KU2V0dGluZyB0aGUgc2NvcmUgZXF1YXRpb24gZXF1YWwgdG8gemVybywNCg0KJCQNClxmcmFjezF9e1xiZXRhfVxzdW1fe2k9MX1ee259KFxsbiB4X2ktXG11KT0wDQokJA0KDQoNCiMjIyBTY29yZSBmdW5jdGlvbiBmb3IgJFxiZXRhID0gXHNpZ21hXjIkDQoNCiQkDQpcZnJhY3tccGFydGlhbCBcZWxsfXtccGFydGlhbCBcYmV0YX0NCj0NCi1cZnJhY3tufXsyXGJldGF9DQorDQpcZnJhY3sxfXsyXGJldGFeMn0NClxzdW1fe2k9MX1ee259KFxsbiB4X2ktXG11KV4yDQokJA0KDQpTZXR0aW5nIHRoZSBzY29yZSBlcXVhdGlvbiBlcXVhbCB0byB6ZXJvLA0KDQokJA0KLVxmcmFje259ezJcYmV0YX0NCisNClxmcmFjezF9ezJcYmV0YV4yfQ0KXHN1bV97aT0xfV57bn0oXGxuIHhfaS1cbXUpXjINCj0wDQokJA0KDQoNCiMjIChiKSBDbG9zZWQtZm9ybSBNYXhpbXVtIExpa2VsaWhvb2QgRXN0aW1hdG9ycw0KDQpTb2x2aW5nIHRoZSBmaXJzdCBzY29yZSBlcXVhdGlvbiwNCg0KTXVsdGlwbHlpbmcgYm90aCBzaWRlcyBieSAkXGJldGEkLA0KDQokJA0KXGJldGEgXGxlZnQoXGZyYWN7MX17XGJldGF9XHN1bV97aT0xfV57bn0oXGxuIHhfaS1cbXUpXHJpZ2h0KSA9IFxiZXRhIFxjZG90IDANCiQkDQoNCndoaWNoIHNpbXBsaWZpZXMgdG8NCg0KJCQNClxzdW1fe2k9MX1ee259KFxsbiB4X2ktXG11KT0wDQokJA0KDQokJA0KXHN1bV97aT0xfV57bn1cbG4geF9pLW5cbXU9MA0KJCQNCg0KJCQNClxoYXR7XG11fT1cZnJhY3sxfXtufVxzdW1fe2k9MX1ee259XGxuIHhfaQ0KJCQNCg0KU29sdmluZyB0aGUgc2Vjb25kIHNjb3JlIGVxdWF0aW9uLA0KDQokJA0KLVxmcmFje259ezJcYmV0YX0NCisNClxmcmFjezF9ezJcYmV0YV4yfQ0KXHN1bV97aT0xfV57bn0oXGxuIHhfaS1cbXUpXjINCj0wDQokJA0KDQpNdWx0aXBseWluZyBieSAkMlxiZXRhXjIkIGdpdmVzDQoNCiQkDQotblxiZXRhK1xzdW1fe2k9MX1ee259KFxsbiB4X2ktXG11KV4yPTANCiQkDQoNClNvbHZpbmcgZm9yICRcYmV0YSQsDQoNCiQkDQpcYmV0YT1cZnJhY3sxfXtufVxzdW1fe2k9MX1ee259KFxsbiB4X2ktXG11KV4yDQokJA0KDQpTdWJzdGl0dXRpbmcgJFxiZXRhPVxzaWdtYV4yJCBhbmQgJFxtdT1caGF0e1xtdX0kLA0KDQokJA0KXGhhdHtcc2lnbWF9XjI9DQpcZnJhY3sxfXtufQ0KXHN1bV97aT0xfV57bn0oXGxuIHhfaS1caGF0e1xtdX0pXjINCiQkDQoNCg0KIyMjIEZpbmFsIE1heGltdW0gTGlrZWxpaG9vZCBFc3RpbWF0b3JzDQoNCiQkDQpcaGF0e1xtdX09XGZyYWN7MX17bn1cc3VtX3tpPTF9XntufVxsbiB4X2kNCiQkDQoNCiQkDQpcaGF0e1xzaWdtYX1eMj0NClxmcmFjezF9e259DQpcc3VtX3tpPTF9XntufShcbG4geF9pLVxoYXR7XG11fSleMg0KJCQNCg0KDQojIyAoYykgVmFyaWFuY2Ugb2YgdGhlIExvZ25vcm1hbCBEaXN0cmlidXRpb24NCg0KUmVjYWxsIHRoYXQgdGhlIGxvZ25vcm1hbCBwb3B1bGF0aW9uIG1lYW4gaXMNCg0KJCQNClxtdV97TE59PUVbWF09XGV4cFxsZWZ0KFxtdStcZnJhY3sxfXsyfVxzaWdtYV4yXHJpZ2h0KQ0KJCQNCg0KVXNpbmcgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHRoZSBmaXJzdCBhbmQgc2Vjb25kIG1vbWVudHMsDQoNCiQkDQpWYXIoWCk9RVtYXjJdLShFW1hdKV4yDQokJA0KDQpGcm9tIHRoZSAkayQtdGggbW9tZW50IGZvcm11bGEgb2YgdGhlIGxvZ25vcm1hbCBkaXN0cmlidXRpb24sDQoNCiQkDQpFW1hea109XGV4cFxsZWZ0KGtcbXUrXGZyYWN7MX17Mn1rXjJcc2lnbWFeMlxyaWdodCkNCiQkDQoNClNldHRpbmcgJGs9MiQgZ2l2ZXMNCg0KJCQNCkVbWF4yXT1cZXhwKDJcbXUrMlxzaWdtYV4yKQ0KJCQNCg0KU3Vic3RpdHV0aW5nIGludG8gdGhlIHZhcmlhbmNlIGZvcm11bGEsDQoNCiQkDQpWYXIoWCkNCj0NClxleHAoMlxtdSsyXHNpZ21hXjIpDQotDQpcbGVmdChcZXhwXGxlZnQoXG11K1xmcmFjezF9ezJ9XHNpZ21hXjJccmlnaHQpXHJpZ2h0KV4yDQokJA0KDQpTaW1wbGlmeWluZywNCg0KJCQNClxzaWdtYV4yX3tMTn0NCj0NClxleHAoMlxtdSsyXHNpZ21hXjIpDQotDQpcZXhwKDJcbXUrXHNpZ21hXjIpDQokJA0KDQpGYWN0b3JpbmcgeWllbGRzDQoNCiQkDQpcc2lnbWFeMl97TE59DQo9DQooXGV4cChcc2lnbWFeMiktMSlcZXhwKDJcbXUrXHNpZ21hXjIpDQokJA0KDQojIFF1ZXN0aW9uIDM6IFNhbXBsaW5nIERpc3RyaWJ1dGlvbiBvZiBMb2dub3JtYWwgU2FtcGxlIE1lYW4gJFxoYXR7XG11fV97TE59JA0KDQojIyAoYSkgRnVuY3Rpb24gdG8gY29tcHV0ZSAkXGhhdHtcbXV9JCwgJFxoYXR7XHNpZ21hfV4yJCwgYW5kICRcaGF0e1xtdX1fe0xOfSQNCg0KYGBge3J9DQoNCm1sZV9sb2dub3JtYWwgPC0gZnVuY3Rpb24oeCl7DQoNCiAgIyBUYWtlIHRoZSBuYXR1cmFsIGxvZ2FyaXRobSBvZiB0aGUgZGF0YSBzaW5jZSBsbihYKSB+IE4obXUsIHNpZ21hXjIpDQogIGxvZ3ggPC0gbG9nKHgpDQoNCiAgIyBDb21wdXRlIHRoZSBNTEUgb2YgbXUsIHdoaWNoIGlzIHRoZSBzYW1wbGUgbWVhbiBvZiB0aGUgbG9nLXRyYW5zZm9ybWVkIGRhdGENCiAgbXVfaGF0IDwtIG1lYW4obG9neCkNCg0KICAjIENvbXB1dGUgdGhlIE1MRSBvZiBzaWdtYV4yDQogIHNpZ21hMl9oYXQgPC0gbWVhbigobG9neCAtIG11X2hhdCleMikNCg0KICAjIENvbXB1dGUgdGhlIE1MRSBvZiB0aGUgbG9nbm9ybWFsIHBvcHVsYXRpb24gbWVhbiANCiAgbXVMTl9oYXQgPC0gZXhwKG11X2hhdCArIDAuNSAqIHNpZ21hMl9oYXQpDQoNCiAgcmV0dXJuKGxpc3QobXVfaGF0ID0gbXVfaGF0LA0KICAgICAgICAgICAgICBzaWdtYTJfaGF0ID0gc2lnbWEyX2hhdCwNCiAgICAgICAgICAgICAgbXVMTl9oYXQgPSBtdUxOX2hhdCkpDQp9DQpgYGANCg0KDQojIyAoYikgR2VuZXJhdGUgMTAwMCBib290c3RyYXAgc2FtcGxlcyBhbmQgY29tcHV0ZSBib290c3RyYXAgTUxFcw0KDQpgYGB7cn0NCiMgRW50ZXIgdGhlIGRhdGFzZXQgb2YgNTAgb2JzZXJ2YXRpb25zDQpkYXRhIDwtIGMoDQoxNy4zLDI0LjgsOC4yLDMxLjUsMTQuMSw0Mi43LDExLjksNTUuMywyMS40LDkuNywNCjM2LjIsMTguNiw2My4xLDEzLjIsMjguOSw0Ny41LDE5LjgsNy41LDMzLjQsNTIuMSwNCjE2LjAsMjUuOSwzOC43LDEwLjMsNDQuMiwyMi41LDU4LjYsMTIuOCwzMC4zLDQ4LjksDQoyMC4xLDM1LjQsMTUuNyw2MC4yLDI2LjcsNDEuMywxOC4xLDUzLjgsMjMuOSw0Ni4yLA0KMjkuNCwzNy42LDE0LjksNTAuNSwzMi44LDE5LjMsNTYuNywxMS4yLDM5LjUsMjcuMQ0KKQ0KDQojIFNldCB0aGUgcmFuZG9tIHNlZWQgcmVzdWx0cyBhcmUgdGhlIHNhbWUgZWFjaCB0aW1lIHRoZSBjb2RlIGlzIHJ1bg0Kc2V0LnNlZWQoMTIzKQ0KDQpCIDwtIDEwMDANCg0KYm9vdHN0cmFwX211TE4gPC0gbnVtZXJpYyhCKQ0KDQpmb3IoYiBpbiAxOkIpew0KDQogICMgRHJhdyBhIGJvb3RzdHJhcCBzYW1wbGUgb2Ygc2l6ZSBuIHdpdGggcmVwbGFjZW1lbnQgZnJvbSB0aGUgZGF0YXNldA0KICBzYW1wbGVfYiA8LSBzYW1wbGUoZGF0YSwgcmVwbGFjZSA9IFRSVUUpDQoNCiAgIyBBcHBseSB0aGUgTUxFIGZ1bmN0aW9uIHRvIHRoZSBib290c3RyYXAgc2FtcGxlDQogIHJlc3VsdCA8LSBtbGVfbG9nbm9ybWFsKHNhbXBsZV9iKQ0KDQogICMgU3RvcmUgdGhlIGJvb3RzdHJhcCBlc3RpbWF0ZSBvZiB0aGUgbG9nbm9ybWFsIG1lYW4NCiAgYm9vdHN0cmFwX211TE5bYl0gPC0gcmVzdWx0JG11TE5faGF0DQp9DQpgYGANCg0KIyMgKGMpIGFuZCAoZCkgS2VybmVsIERlbnNpdHkgRXN0aW1hdGUgb2YgQm9vdHN0cmFwIE1MRXMgYW5kIHRoZSBhc3ltcHRvdGljIG5vcm1hbCBkZW5zaXR5IHVzaW5nIHBsdWctaW4gZXN0aW1hdGVzDQoNCmBgYHtyIGZpZy5oZWlnaHQ9Nn0NCg0KIyBDb21wdXRlIHRoZSBrZXJuZWwgZGVuc2l0eSBlc3RpbWF0ZSBvZiB0aGUgYm9vdHN0cmFwIGVzdGltYXRlcw0KYm9vdF9kZW5zaXR5IDwtIGRlbnNpdHkoYm9vdHN0cmFwX211TE4pDQoNCiMgUGxvdCB0aGUgYm9vdHN0cmFwIHNhbXBsaW5nIGRpc3RyaWJ1dGlvbiB1c2luZyB0aGUgS0RFDQpwbG90KGJvb3RfZGVuc2l0eSwNCiAgICAgbWFpbj0iQm9vdHN0cmFwIFNhbXBsaW5nIERpc3RyaWJ1dGlvbiBvZiBtdV9MTiIsDQogICAgIHhsYWI9IkVzdGltYXRlZCBsb2dub3JtYWwgbWVhbiIpDQoNCg0KIyMgKGQpIEFkZCBhc3ltcHRvdGljIG5vcm1hbCBkZW5zaXR5IHVzaW5nIHBsdWctaW4gZXN0aW1hdGVzDQoNCm4gPC0gbGVuZ3RoKGRhdGEpDQoNCiMgVXNlIHRoZSBNTEUgZnVuY3Rpb24gb24gdGhlIG9yaWdpbmFsIGRhdGFzZXQgdG8gb2J0YWluIHRoZSBlc3RpbWF0ZXMNCnJlc3VsdCA8LSBtbGVfbG9nbm9ybWFsKGRhdGEpDQoNCiMgRXh0cmFjdCB0aGUgTUxFcyBvZiBtdSwgc2lnbWFeMiwgYW5kIHRoZSBsb2dub3JtYWwgbWVhbg0KbXVfaGF0IDwtIHJlc3VsdCRtdV9oYXQNCnNpZ21hMl9oYXQgPC0gcmVzdWx0JHNpZ21hMl9oYXQNCm11TE5faGF0IDwtIHJlc3VsdCRtdUxOX2hhdA0KDQojIENvbXB1dGUgdGhlIHBsdWctaW4gZXN0aW1hdGUgb2YgdGhlIGxvZ25vcm1hbCBwb3B1bGF0aW9uIHZhcmlhbmNlDQpzaWdtYTJfTE5faGF0IDwtIChleHAoc2lnbWEyX2hhdCktMSkqZXhwKDIqbXVfaGF0ICsgc2lnbWEyX2hhdCkNCg0KIyBDb21wdXRlIHRoZSBzdGFuZGFyZCBkZXZpYXRpb24gb2YgdGhlIGFzeW1wdG90aWMgc2FtcGxpbmcgZGlzdHJpYnV0aW9uDQpzZF9DTFQgPC0gc3FydChzaWdtYTJfTE5faGF0L24pDQoNCiMgQWRkIHRoZSBhc3ltcHRvdGljIG5vcm1hbCBkZW5zaXR5IGN1cnZlIHRvIHRoZSBleGlzdGluZyBib290c3RyYXAgS0RFIHBsb3QNCmN1cnZlKGRub3JtKHgsIG1lYW49bXVMTl9oYXQsIHNkPXNkX0NMVCksDQogICAgICBhZGQ9VFJVRSwNCiAgICAgIGNvbD0icmVkIiwNCiAgICAgIGx3ZD0yKQ0KDQojIEFkZCBhIGxlZ2VuZCBpZGVudGlmeWluZyB0aGUgdHdvIGN1cnZlcw0KbGVnZW5kKCJib3R0b21sZWZ0IiwNCiAgICAgICBsZWdlbmQ9YygiQm9vdHN0cmFwIEtERSIsIkNMVCBOb3JtYWwgQXBwcm94aW1hdGlvbiIpLA0KICAgICAgIGNvbD1jKCJibGFjayIsInJlZCIpLA0KICAgICAgIGx3ZD0yKQ0KYGBgDQoNCg0KIyMgKGUpIENvbXBhcmlzb24NCg0KVGhlIGJvb3RzdHJhcCBrZXJuZWwgZGVuc2l0eSBlc3RpbWF0ZSBwcm92aWRlcyBhbiBlbXBpcmljYWwgYXBwcm94aW1hdGlvbiBvZiB0aGUgc2FtcGxpbmcgZGlzdHJpYnV0aW9uIG9mIHRoZSBNTEUgb2YgdGhlIGxvZ25vcm1hbCBtZWFuIGJhc2VkIG9uIHJlcGVhdGVkIHJlc2FtcGxpbmcgZnJvbSB0aGUgb2JzZXJ2ZWQgZGF0YXNldC4gVGhlIGFzeW1wdG90aWMgbm9ybWFsIGRpc3RyaWJ1dGlvbiBvYnRhaW5lZCBmcm9tIHRoZSBDZW50cmFsIExpbWl0IFRoZW9yZW0gcmVwcmVzZW50cyB0aGUgdGhlb3JldGljYWwgbGFyZ2Utc2FtcGxlIGFwcHJveGltYXRpb24gb2YgdGhlIHNhbXBsaW5nIGRpc3RyaWJ1dGlvbiBvZiB0aGUgZXN0aW1hdG9yLg0KDQpGcm9tIHRoZSBwbG90LCB0aGUgYm9vdHN0cmFwIGRlbnNpdHkgYW5kIHRoZSBhc3ltcHRvdGljIG5vcm1hbCBjdXJ2ZSBhcmUgY2VudGVyZWQgYXJvdW5kIHNpbWlsYXIgdmFsdWVzLCBpbmRpY2F0aW5nIHRoYXQgYm90aCBtZXRob2RzIGVzdGltYXRlIGEgc2ltaWxhciBtZWFuIGZvciB0aGUgc2FtcGxpbmcgZGlzdHJpYnV0aW9uLiBUaGUgb3ZlcmFsbCBzaGFwZXMgb2YgdGhlIHR3byBjdXJ2ZXMgYXJlIGFsc28gZmFpcmx5IHNpbWlsYXIsIGFsdGhvdWdoIHRoZSBib290c3RyYXAgZGlzdHJpYnV0aW9uIGFwcGVhcnMgc2xpZ2h0bHkgbW9yZSBwZWFrZWQgYW5kIGV4aGliaXRzIG1pbGQgYXN5bW1ldHJ5IGNvbXBhcmVkIHRvIHRoZSBub3JtYWwgYXBwcm94aW1hdGlvbi4gSW4gY29udHJhc3QsIHRoZSBDTFQgYXBwcm94aW1hdGlvbiBpcyBwZXJmZWN0bHkgc3ltbWV0cmljLg0KDQpPdmVyYWxsLCB0aGUgdHdvIGRpc3RyaWJ1dGlvbnMgYXJlIHJlYXNvbmFibHkgY2xvc2UsIHN1Z2dlc3RpbmcgdGhhdCB0aGUgbm9ybWFsIGFwcHJveGltYXRpb24gcHJvdmlkZWQgYnkgdGhlIENlbnRyYWwgTGltaXQgVGhlb3JlbSBvZmZlcnMgYSBnb29kIGFwcHJveGltYXRpb24gdG8gdGhlIHNhbXBsaW5nIGRpc3RyaWJ1dGlvbiBvZiB0aGUgZXN0aW1hdG9yIGZvciB0aGlzIHNhbXBsZSBzaXplLCBhbHRob3VnaCB0aGUgYm9vdHN0cmFwIGRpc3RyaWJ1dGlvbiBjYXB0dXJlcyBzbGlnaHQgZGV2aWF0aW9ucyBmcm9tIG5vcm1hbGl0eS4=