1 Question (a): Bootstrap Sampling Distribution of \(\widehat{E[X]}\)

To estimate the sampling distribution of \(\widehat{E[X]}\), we apply the bootstrap procedure. The key idea is to treat the observed sample as an approximation of the population and repeatedly resample from it with replacement.

# Input data (Pb concentrations)
data <- c(
  0.85, 1.23, 0.92, 3.45, 2.11, 1.56, 4.89, 2.34, 1.78, 6.72, 0.95, 1.34, 8.91,
  2.67, 1.89, 5.43, 1.12, 3.78, 2.45, 7.65, 1.05, 1.45, 12.34, 2.89, 2.01, 4.56,
  1.23, 4.32, 2.67, 9.87, 0.99, 1.56, 15.23, 3.12, 2.34, 3.89, 1.34, 5.67, 2.89,
  11.45, 1.12, 1.67, 18.90, 3.45, 2.56, 3.45, 1.45, 6.78, 3.12, 14.56, 1.23, 1.78,
  22.34, 3.78, 2.78
)

# Number of bootstrap samples
B <- 5000
n <- length(data)

# Function to compute E[X] using log-normal MLE
estimate_mean_lognormal <- function(x) {
  log_x <- log(x)
  mu_hat <- mean(log_x)
  sigma2_hat <- mean((log_x - mu_hat)^2)
  
  # Plug-in estimator for E[X]
  exp(mu_hat + sigma2_hat / 2)
}

# Store bootstrap estimates
boot_estimates <- numeric(B)

set.seed(123)  # for reproducibility

# Bootstrap loop
for (b in 1:B) {
  sample_b <- sample(data, size = n, replace = TRUE)  # resample with replacement
  boot_estimates[b] <- estimate_mean_lognormal(sample_b)
}

# Plot histogram with density scaling
hist(boot_estimates,
     breaks = 30,
     probability = TRUE,   # ensures histogram is on density scale
     main = "Bootstrap Distribution of E[X]",
     xlab = "Bootstrap Estimates",
     border = "black")

# Add smooth density curve on top
lines(density(boot_estimates),
      lwd = 2)  # thicker line for visibility

The resulting bootstrap distribution appears approximately unimodal and roughly symmetric, with a slight right skew. The peak of the distribution is centered around values between 4 and 5, indicating that most bootstrap estimates of \(\widehat{E[X]}\) fall within this range.

In terms of variability, the distribution shows moderate spread, suggesting a reasonable level of uncertainty in estimating \(E[X]\). While there is a mild right tail extending toward larger values, extreme values are relatively infrequent, indicating that the estimator is fairly stable across resamples.

Overall, the bootstrap sampling distribution is well-behaved, with no severe skewness or irregular patterns, supporting the reliability of the bootstrap procedure in this setting.

2 Question (b) 95% Percentile Bootstrap Confidence Interval for \(\mu_{LN} = E[X]\)

The percentile bootstrap confidence interval is constructed directly from the empirical distribution of the bootstrap estimates. This method does not impose any assumptions about symmetry or normality and instead uses the observed distribution of \(\widehat{E[X]}\).

After generating \(B = 5000\) bootstrap estimates, we sort these values in ascending order. The 95% confidence interval is then obtained by selecting the empirical quantiles corresponding to the lower and upper tails of the distribution.

Specifically, for a \((1 - \alpha) = 0.95\) confidence level, we take:

  • the \(2.5%\) percentile as the lower bound
  • the \(97.5%\) percentile as the upper bound

This yields the interval: [ ]

Conceptually, this interval represents the central 95% of the bootstrap distribution, meaning that 95% of the resampled estimates fall within this range. Since this method relies entirely on the empirical distribution, it naturally adapts to any skewness or asymmetry present in the data.

Thus, the percentile bootstrap confidence interval provides a simple and intuitive estimate of uncertainty for \(\mu_{LN} = E[X]\) based on the observed data.

# --- Manual Percentile CI ---
alpha <- 0.05

lower_perc <- quantile(boot_estimates, probs = alpha / 2)
upper_perc <- quantile(boot_estimates, probs = 1 - alpha / 2)

ci_percentile <- c(lower = lower_perc, upper = upper_perc)
ci_percentile
 lower.2.5% upper.97.5% 
   3.093880    5.643249 
# --- Using boot package for verification ---
library(boot)

# Define statistic function for boot()
boot_stat <- function(data, indices) {
  sample_data <- data[indices]
  
  log_x <- log(sample_data)
  mu_hat <- mean(log_x)
  sigma2_hat <- mean((log_x - mu_hat)^2)
  
  # Return E[X] estimator
  exp(mu_hat + sigma2_hat / 2)
}

set.seed(123)

boot_result <- boot(data, statistic = boot_stat, R = 5000)

# Percentile CI using boot package
boot_ci <- boot.ci(boot_result, type = "perc")

boot_ci
BOOTSTRAP CONFIDENCE INTERVAL CALCULATIONS
Based on 5000 bootstrap replicates

CALL : 
boot.ci(boot.out = boot_result, type = "perc")

Intervals : 
Level     Percentile     
95%   ( 3.097,  5.598 )  
Calculations and Intervals on Original Scale

3 Question (c) 95% BCa Bootstrap Confidence Interval for \(\mu_{LN} = E[X]\)

The bias-corrected and accelerated (BCa) bootstrap confidence interval improves upon the percentile method by adjusting for both bias and skewness in the bootstrap distribution.

Conceptually, the BCa method modifies the percentile cutoffs based on two factors:

  • A bias correction term, which accounts for whether the bootstrap distribution is centered around the original estimate
  • An acceleration term, which adjusts for skewness by measuring how sensitive the estimator is to individual observations

These adjustments lead to modified percentile levels, which are then used to determine the confidence interval from the bootstrap distribution.

Compared to the percentile interval, the BCa interval may exhibit slight asymmetry, reflecting adjustments for bias and skewness in the bootstrap distribution. This makes the BCa method more reliable, particularly when the distribution is not perfectly symmetric.

# --- Manual BCa CI ---

alpha <- 0.05
B <- length(boot_estimates)

# Original estimate
theta_hat <- estimate_mean_lognormal(data)

# ---- Bias correction (z0) ----
prop_less <- mean(boot_estimates < theta_hat)
z0 <- qnorm(prop_less)

# ---- Jackknife for acceleration ----
n <- length(data)
jack_vals <- numeric(n)

for (i in 1:n) {
  jack_sample <- data[-i]  # leave-one-out
  jack_vals[i] <- estimate_mean_lognormal(jack_sample)
}

theta_jack_mean <- mean(jack_vals)

numerator <- sum((theta_jack_mean - jack_vals)^3)
denominator <- sum((theta_jack_mean - jack_vals)^2)

a_hat <- numerator / (6 * denominator^(3/2))

# ---- Adjusted percentiles ----
z_alpha <- qnorm(alpha / 2)
z_1_alpha <- qnorm(1 - alpha / 2)

alpha1 <- pnorm(z0 + (z0 + z_alpha) / (1 - a_hat * (z0 + z_alpha)))
alpha2 <- pnorm(z0 + (z0 + z_1_alpha) / (1 - a_hat * (z0 + z_1_alpha)))

# ---- BCa interval ----
lower_bca <- quantile(boot_estimates, probs = alpha1)
upper_bca <- quantile(boot_estimates, probs = alpha2)

ci_bca <- c(lower = lower_bca, upper = upper_bca)
ci_bca
lower.4.130304% upper.98.67843% 
       3.222668        5.850080 
# BCa CI using boot package
boot_ci_bca <- boot.ci(boot_result, type = "bca")

boot_ci_bca
BOOTSTRAP CONFIDENCE INTERVAL CALCULATIONS
Based on 5000 bootstrap replicates

CALL : 
boot.ci(boot.out = boot_result, type = "bca")

Intervals : 
Level       BCa          
95%   ( 3.225,  5.865 )  
Calculations and Intervals on Original Scale

4 Question (d) Asymptotic (CLT-Based) Confidence Interval for \(\mu_{LN} = E[X]\)

An alternative to bootstrap-based confidence intervals is the asymptotic confidence interval based on the Central Limit Theorem (CLT). This approach assumes that the estimator \(\widehat{E[X]}\) is approximately normally distributed for sufficiently large sample sizes.

Under this assumption, a 95% confidence interval is constructed as: [ \(\widehat{E[X]} ;\pm\); z_{0.975} \(\cdot \widehat{\mathrm{SE}}(\widehat{E[X]})\),] where \(z_{0.975}\) is the standard normal critical value and \(\widehat{\mathrm{SE}}(\widehat{E[X]})\) is the estimated standard error of the estimator.

In this problem, the standard error is approximated using the bootstrap distribution. Specifically, the standard deviation of the bootstrap estimates is used as an estimate of \(\widehat{\mathrm{SE}}(\widehat{E[X]})\).

Conceptually, this method constructs a symmetric interval around the estimate, unlike the percentile and BCa methods which adapt to the shape of the bootstrap distribution. As a result, if the bootstrap distribution exhibits slight skewness, the CLT-based interval may not fully capture that asymmetry.

Unlike parts (b) and (c), there is no direct implementation of the CLT-based interval in the \(\texttt{boot}\) package. Instead, the bootstrap is used here only to estimate the standard error, and the interval is constructed using the normal approximation.

# --- CLT / Normal-based CI ---

# Original estimate
theta_hat <- estimate_mean_lognormal(data)

# Bootstrap standard error (std dev of bootstrap estimates)
se_boot <- sd(boot_estimates)

# Critical value for 95% CI
z <- qnorm(0.975)

# Construct CI
lower_clt <- theta_hat - z * se_boot
upper_clt <- theta_hat + z * se_boot

ci_clt <- c(lower = lower_clt, upper = upper_clt)
ci_clt
   lower    upper 
2.959686 5.476512 

5 Question (e) Comparison of Confidence Intervals

We compare the three confidence intervals constructed for \(\mu_{LN} = E[X]\): the percentile bootstrap interval, the BCa bootstrap interval, and the asymptotic (CLT-based) interval.

The percentile bootstrap interval is: [3.094, 5.643], while the BCa interval is: [3.223, 5.850]. These two intervals are similar in width, but the BCa interval is slightly shifted upward and extends further on the upper end. This reflects the bias and skewness corrections applied by the BCa method.

The CLT-based interval is: [2.960, 5.477], which is symmetric around \(\widehat{E[X]}\). Compared to the bootstrap intervals, it has a lower lower-bound and a slightly smaller upper-bound, indicating that it does not fully capture the asymmetry present in the bootstrap distribution.

In terms of performance:

  • The percentile and BCa intervals are data-driven and reflect the empirical distribution.
  • The BCa interval provides additional correction for bias and skewness, making it more robust.
  • The CLT interval relies on a normality assumption and may be less accurate when the distribution is not perfectly symmetric.

Overall, the BCa interval is the most appropriate choice in this setting due to its ability to account for both bias and skewness. The percentile interval provides a reasonable approximation, while the CLT interval serves as a useful but more assumption-dependent benchmark.

LS0tDQp0aXRsZTogJ1NUQSA1MDYgSE9NRVdPUksgNycNCmF1dGhvcjogJ0dlcmFyZCBJa2UnDQpkYXRlOiAiMjAyNi0wMy0yNCINCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDogICAgICAgICAgICAgICMgb3V0cHV0IGRvY3VtZW50IGZvcm1hdA0KICAgIHRvYzogeWVzICAgICAgICAgICAgICAgICAgIyBhZGQgdGFibGUgY29udGVudHMNCiAgICB0b2NfZmxvYXQ6IHllcyAgICAgICAgICAgICMgdG9jX3Byb3BlcnR5OiBmbG9hdGluZw0KICAgIHRvY19kZXB0aDogNCAgICAgICAgICAgICAgIyBkZXB0aCBvZiBUT0MgaGVhZGluZ3MNCiAgICBmaWdfd2lkdGg6IDYgICAgICAgICAgICAgICMgZ2xvYmFsIGZpZ3VyZSB3aWR0aA0KICAgIGZpZ19oZWlnaHQ6IDQgICAgICAgICAgICAgIyBnbG9iYWwgZmlndXJlIGhlaWdodA0KICAgIGZpZ19jYXB0aW9uOiB5ZXMgICAgICAgICAgIyBhZGQgZmlndXJlIGNhcHRpb24NCiAgICBudW1iZXJfc2VjdGlvbnM6IHllcyAgICAgICMgbnVtYmVyaW5nIHNlY3Rpb24gaGVhZGluZ3MNCiAgICB0b2NfY29sbGFwc2VkOiB5ZXMgICAgICAgICMgVE9DIHN1YmhlYWRpbmcgY2xhcHNpbmcNCiAgICBjb2RlX2ZvbGRpbmc6IGhpZGUgICAgICAgICMgZm9sZGluZy9zaG93aW5nIGNvZGUNCiAgICBjb2RlX2Rvd25sb2FkOiB5ZXMgICAgICAgICMgYWxsb3cgdG8gZG93bmxvYWQgY29tcGxldGUgUk1hcmtkb3duIHNvdXJjZSBjb2RlDQogICAgc21vb3RoX3Njcm9sbDogeWVzICAgICAgICAjIHNjcm9sbGluZyB0ZXh0IG9mIHRoZSBkb2N1bWVudA0KICAgIHRoZW1lOiBsdW1lbiAgICAgICAgICAgICAgIyB2aXN1YWwgdGhlbWUgZm9yIEhUTUwgZG9jdW1lbnQgb25seQ0KICAgIGhpZ2hsaWdodDogdGFuZ28gICAgICAgICAgIyBjb2RlIHN5bnRheCBoaWdobGlnaHRpbmcgc3R5bGVzDQogIHBkZl9kb2N1bWVudDoNCiAgICB0b2M6IHllcw0KICAgIHRvY19kZXB0aDogNA0KICAgIGZpZ19jYXB0aW9uOiB5ZXMNCiAgICBudW1iZXJfc2VjdGlvbnM6IHllcw0KICB3b3JkX2RvY3VtZW50Og0KICAgIHRvYzogeWVzDQogICAgdG9jX2RlcHRoOiAnNCcNCi0tLQ0KDQpgYGB7Y3NzLCBlY2hvID0gRkFMU0V9DQpkaXYjVE9DIGxpIHsgICAgIC8qIHRhYmxlIG9mIGNvbnRlbnQgICovDQogICAgbGlzdC1zdHlsZTp1cHBlci1yb21hbjsNCiAgICBiYWNrZ3JvdW5kLWltYWdlOm5vbmU7DQogICAgYmFja2dyb3VuZC1yZXBlYXQ6bm9uZTsNCiAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOjA7DQp9DQoNCmgxLnRpdGxlIHsgICAgLyogbGV2ZWwgMSBoZWFkZXIgb2YgdGl0bGUgICovDQogIGZvbnQtc2l6ZTogMjRweDsNCiAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogIGNvbG9yOiBEYXJrUmVkOw0KICB0ZXh0LWFsaWduOiBjZW50ZXI7DQp9DQoNCmg0LmF1dGhvciB7IC8qIEhlYWRlciA0IC0gYW5kIHRoZSBhdXRob3IgYW5kIGRhdGEgaGVhZGVycyB1c2UgdGhpcyB0b28gICovDQogIGZvbnQtc2l6ZTogMThweDsNCiAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICBjb2xvcjogRGFya1JlZDsNCiAgdGV4dC1hbGlnbjogY2VudGVyOw0KfQ0KDQpoNC5kYXRlIHsgLyogSGVhZGVyIDQgLSBhbmQgdGhlIGF1dGhvciBhbmQgZGF0YSBoZWFkZXJzIHVzZSB0aGlzIHRvbyAgKi8NCiAgZm9udC1zaXplOiAxOHB4Ow0KICBmb250LXdlaWdodDogYm9sZDsNCiAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7DQogIGNvbG9yOiBEYXJrQmx1ZTsNCiAgdGV4dC1hbGlnbjogY2VudGVyOw0KfQ0KDQpoMSB7IC8qIEhlYWRlciAxIC0gYW5kIHRoZSBhdXRob3IgYW5kIGRhdGEgaGVhZGVycyB1c2UgdGhpcyB0b28gICovDQogICAgZm9udC1zaXplOiAyMHB4Ow0KICAgIGZvbnQtd2VpZ2h0OiBib2xkOw0KICAgIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICAgIGNvbG9yOiBkYXJrcmVkOw0KICAgIHRleHQtYWxpZ246IGNlbnRlcjsNCn0NCg0KaDIgeyAvKiBIZWFkZXIgMiAtIGFuZCB0aGUgYXV0aG9yIGFuZCBkYXRhIGhlYWRlcnMgdXNlIHRoaXMgdG9vICAqLw0KICAgIGZvbnQtc2l6ZTogMThweDsNCiAgICBmb250LXdlaWdodDogYm9sZDsNCiAgICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsNCiAgICBjb2xvcjogbmF2eTsNCiAgICB0ZXh0LWFsaWduOiBsZWZ0Ow0KfQ0KDQpoMyB7IC8qIEhlYWRlciAzIC0gYW5kIHRoZSBhdXRob3IgYW5kIGRhdGEgaGVhZGVycyB1c2UgdGhpcyB0b28gICovDQogICAgZm9udC1zaXplOiAxNnB4Ow0KICAgIGZvbnQtd2VpZ2h0OiBib2xkOw0KICAgIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICAgIGNvbG9yOiBuYXZ5Ow0KICAgIHRleHQtYWxpZ246IGxlZnQ7DQp9DQoNCmg0IHsgLyogSGVhZGVyIDQgLSBhbmQgdGhlIGF1dGhvciBhbmQgZGF0YSBoZWFkZXJzIHVzZSB0aGlzIHRvbyAgKi8NCiAgICBmb250LXNpemU6IDE0cHg7DQogIGZvbnQtd2VpZ2h0OiBib2xkOw0KICAgIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICAgIGNvbG9yOiBkYXJrcmVkOw0KICAgIHRleHQtYWxpZ246IGxlZnQ7DQp9DQoNCi8qIEFkZCBkb3RzIGFmdGVyIG51bWJlcmVkIGhlYWRlcnMgKi8NCi5oZWFkZXItc2VjdGlvbi1udW1iZXI6OmFmdGVyIHsNCiAgY29udGVudDogIi4iOw0KfQ0KYGBgDQoNCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQ0KIyBjb2RlIGNodW5rIHNwZWNpZmllcyB3aGV0aGVyIHRoZSBSIGNvZGUsIHdhcm5pbmdzLCBhbmQgb3V0cHV0IA0KIyB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSBvdXRwdXQgZmlsZXMuDQoNCmlmICghcmVxdWlyZSgia25pdHIiKSkgeyAgICAgICAgICAgICAgICAgICAgICAjIHVzZSBjb25kaXRpb25hbCBzdGF0ZW1lbnQgdG8gZGV0ZWN0DQogICBpbnN0YWxsLnBhY2thZ2VzKCJrbml0ciIpICAgICAgICAgICAgICAgICAgIyB3aGV0aGVyIGEgcGFja2FnZSB3YXMgaW5zdGFsbGVkIGluDQogICBsaWJyYXJ5KGtuaXRyKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyB5b3VyIG1hY2hpbmUuIElmIG5vdCwgaW5zdGFsbCBpdCBhbmQNCn0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGxvYWQgaXQgdG8gdGhlIHdvcmtpbmcgZGlyZWN0b3J5Lg0KIw0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFLCAgICAgICAgICAgICMgaW5jbHVkZSBjb2RlIGNodW5rIGluIHRoZSBvdXRwdXQgZmlsZQ0KICAgICAgICAgICAgICAgICAgICAgIHdhcm5pbmcgPSBGQUxTRSwgICAgICAgICMgc29tZXRpbWVzLCB5b3UgY29kZSBtYXkgcHJvZHVjZSB3YXJuaW5nIG1lc3NhZ2VzLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgeW91IGNhbiBjaG9vc2UgdG8gaW5jbHVkZSB0aGUgd2FybmluZyBtZXNzYWdlcyBpbg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgdGhlIG91dHB1dCBmaWxlLiANCiAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzID0gVFJVRSwgICAgICAgICAjIHlvdSBjYW4gYWxzbyBkZWNpZGUgd2hldGhlciB0byBpbmNsdWRlIHRoZSBvdXRwdXQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGluIHRoZSBvdXRwdXQgZmlsZS4NCiAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gRkFMU0UsICAgICAgICAjIHN1cHByZXNzIG1lc3NhZ2VzIA0KICAgICAgICAgICAgICAgICAgICAgIGNvbW1lbnQgPSBOQSAgICAgICAgICAgICMgcmVtb3ZlIHRoZSBkZWZhdWx0IGxlYWRpbmcgaGFzaCB0YWdzIGluIHRoZSBvdXRwdXQNCiAgICAgICAgICAgICAgICAgICAgICApICAgDQpgYGANCg0KIyBRdWVzdGlvbiAoYSk6IEJvb3RzdHJhcCBTYW1wbGluZyBEaXN0cmlidXRpb24gb2YgJFx3aWRlaGF0e0VbWF19JA0KDQpUbyBlc3RpbWF0ZSB0aGUgc2FtcGxpbmcgZGlzdHJpYnV0aW9uIG9mICRcd2lkZWhhdHtFW1hdfSQsIHdlIGFwcGx5IHRoZSBib290c3RyYXAgcHJvY2VkdXJlLiBUaGUga2V5IGlkZWEgaXMgdG8gdHJlYXQgdGhlIG9ic2VydmVkIHNhbXBsZSBhcyBhbiBhcHByb3hpbWF0aW9uIG9mIHRoZSBwb3B1bGF0aW9uIGFuZCByZXBlYXRlZGx5IHJlc2FtcGxlIGZyb20gaXQgd2l0aCByZXBsYWNlbWVudC4NCg0KDQpgYGB7cn0NCiMgSW5wdXQgZGF0YSAoUGIgY29uY2VudHJhdGlvbnMpDQpkYXRhIDwtIGMoDQogIDAuODUsIDEuMjMsIDAuOTIsIDMuNDUsIDIuMTEsIDEuNTYsIDQuODksIDIuMzQsIDEuNzgsIDYuNzIsIDAuOTUsIDEuMzQsIDguOTEsDQogIDIuNjcsIDEuODksIDUuNDMsIDEuMTIsIDMuNzgsIDIuNDUsIDcuNjUsIDEuMDUsIDEuNDUsIDEyLjM0LCAyLjg5LCAyLjAxLCA0LjU2LA0KICAxLjIzLCA0LjMyLCAyLjY3LCA5Ljg3LCAwLjk5LCAxLjU2LCAxNS4yMywgMy4xMiwgMi4zNCwgMy44OSwgMS4zNCwgNS42NywgMi44OSwNCiAgMTEuNDUsIDEuMTIsIDEuNjcsIDE4LjkwLCAzLjQ1LCAyLjU2LCAzLjQ1LCAxLjQ1LCA2Ljc4LCAzLjEyLCAxNC41NiwgMS4yMywgMS43OCwNCiAgMjIuMzQsIDMuNzgsIDIuNzgNCikNCg0KIyBOdW1iZXIgb2YgYm9vdHN0cmFwIHNhbXBsZXMNCkIgPC0gNTAwMA0KbiA8LSBsZW5ndGgoZGF0YSkNCg0KIyBGdW5jdGlvbiB0byBjb21wdXRlIEVbWF0gdXNpbmcgbG9nLW5vcm1hbCBNTEUNCmVzdGltYXRlX21lYW5fbG9nbm9ybWFsIDwtIGZ1bmN0aW9uKHgpIHsNCiAgbG9nX3ggPC0gbG9nKHgpDQogIG11X2hhdCA8LSBtZWFuKGxvZ194KQ0KICBzaWdtYTJfaGF0IDwtIG1lYW4oKGxvZ194IC0gbXVfaGF0KV4yKQ0KICANCiAgIyBQbHVnLWluIGVzdGltYXRvciBmb3IgRVtYXQ0KICBleHAobXVfaGF0ICsgc2lnbWEyX2hhdCAvIDIpDQp9DQoNCiMgU3RvcmUgYm9vdHN0cmFwIGVzdGltYXRlcw0KYm9vdF9lc3RpbWF0ZXMgPC0gbnVtZXJpYyhCKQ0KDQpzZXQuc2VlZCgxMjMpICAjIGZvciByZXByb2R1Y2liaWxpdHkNCg0KIyBCb290c3RyYXAgbG9vcA0KZm9yIChiIGluIDE6Qikgew0KICBzYW1wbGVfYiA8LSBzYW1wbGUoZGF0YSwgc2l6ZSA9IG4sIHJlcGxhY2UgPSBUUlVFKSAgIyByZXNhbXBsZSB3aXRoIHJlcGxhY2VtZW50DQogIGJvb3RfZXN0aW1hdGVzW2JdIDwtIGVzdGltYXRlX21lYW5fbG9nbm9ybWFsKHNhbXBsZV9iKQ0KfQ0KDQojIFBsb3QgaGlzdG9ncmFtIHdpdGggZGVuc2l0eSBzY2FsaW5nDQpoaXN0KGJvb3RfZXN0aW1hdGVzLA0KICAgICBicmVha3MgPSAzMCwNCiAgICAgcHJvYmFiaWxpdHkgPSBUUlVFLCAgICMgZW5zdXJlcyBoaXN0b2dyYW0gaXMgb24gZGVuc2l0eSBzY2FsZQ0KICAgICBtYWluID0gIkJvb3RzdHJhcCBEaXN0cmlidXRpb24gb2YgRVtYXSIsDQogICAgIHhsYWIgPSAiQm9vdHN0cmFwIEVzdGltYXRlcyIsDQogICAgIGJvcmRlciA9ICJibGFjayIpDQoNCiMgQWRkIHNtb290aCBkZW5zaXR5IGN1cnZlIG9uIHRvcA0KbGluZXMoZGVuc2l0eShib290X2VzdGltYXRlcyksDQogICAgICBsd2QgPSAyKSAgIyB0aGlja2VyIGxpbmUgZm9yIHZpc2liaWxpdHkNCmBgYA0KDQoNClRoZSByZXN1bHRpbmcgYm9vdHN0cmFwIGRpc3RyaWJ1dGlvbiBhcHBlYXJzIGFwcHJveGltYXRlbHkgdW5pbW9kYWwgYW5kIHJvdWdobHkgc3ltbWV0cmljLCB3aXRoIGEgc2xpZ2h0IHJpZ2h0IHNrZXcuIFRoZSBwZWFrIG9mIHRoZSBkaXN0cmlidXRpb24gaXMgY2VudGVyZWQgYXJvdW5kIHZhbHVlcyBiZXR3ZWVuIDQgYW5kIDUsIGluZGljYXRpbmcgdGhhdCBtb3N0IGJvb3RzdHJhcCBlc3RpbWF0ZXMgb2YgJFx3aWRlaGF0e0VbWF19JCBmYWxsIHdpdGhpbiB0aGlzIHJhbmdlLg0KDQpJbiB0ZXJtcyBvZiB2YXJpYWJpbGl0eSwgdGhlIGRpc3RyaWJ1dGlvbiBzaG93cyBtb2RlcmF0ZSBzcHJlYWQsIHN1Z2dlc3RpbmcgYSByZWFzb25hYmxlIGxldmVsIG9mIHVuY2VydGFpbnR5IGluIGVzdGltYXRpbmcgJEVbWF0kLiBXaGlsZSB0aGVyZSBpcyBhIG1pbGQgcmlnaHQgdGFpbCBleHRlbmRpbmcgdG93YXJkIGxhcmdlciB2YWx1ZXMsIGV4dHJlbWUgdmFsdWVzIGFyZSByZWxhdGl2ZWx5IGluZnJlcXVlbnQsIGluZGljYXRpbmcgdGhhdCB0aGUgZXN0aW1hdG9yIGlzIGZhaXJseSBzdGFibGUgYWNyb3NzIHJlc2FtcGxlcy4NCg0KT3ZlcmFsbCwgdGhlIGJvb3RzdHJhcCBzYW1wbGluZyBkaXN0cmlidXRpb24gaXMgd2VsbC1iZWhhdmVkLCB3aXRoIG5vIHNldmVyZSBza2V3bmVzcyBvciBpcnJlZ3VsYXIgcGF0dGVybnMsIHN1cHBvcnRpbmcgdGhlIHJlbGlhYmlsaXR5IG9mIHRoZSBib290c3RyYXAgcHJvY2VkdXJlIGluIHRoaXMgc2V0dGluZy4NCg0KDQojIFF1ZXN0aW9uIChiKSA5NSUgUGVyY2VudGlsZSBCb290c3RyYXAgQ29uZmlkZW5jZSBJbnRlcnZhbCBmb3IgJFxtdV97TE59ID0gRVtYXSQNCg0KVGhlIHBlcmNlbnRpbGUgYm9vdHN0cmFwIGNvbmZpZGVuY2UgaW50ZXJ2YWwgaXMgY29uc3RydWN0ZWQgZGlyZWN0bHkgZnJvbSB0aGUgZW1waXJpY2FsIGRpc3RyaWJ1dGlvbiBvZiB0aGUgYm9vdHN0cmFwIGVzdGltYXRlcy4gVGhpcyBtZXRob2QgZG9lcyBub3QgaW1wb3NlIGFueSBhc3N1bXB0aW9ucyBhYm91dCBzeW1tZXRyeSBvciBub3JtYWxpdHkgYW5kIGluc3RlYWQgdXNlcyB0aGUgb2JzZXJ2ZWQgZGlzdHJpYnV0aW9uIG9mICRcd2lkZWhhdHtFW1hdfSQuDQoNCkFmdGVyIGdlbmVyYXRpbmcgJEIgPSA1MDAwJCBib290c3RyYXAgZXN0aW1hdGVzLCB3ZSBzb3J0IHRoZXNlIHZhbHVlcyBpbiBhc2NlbmRpbmcgb3JkZXIuIFRoZSA5NSUgY29uZmlkZW5jZSBpbnRlcnZhbCBpcyB0aGVuIG9idGFpbmVkIGJ5IHNlbGVjdGluZyB0aGUgZW1waXJpY2FsIHF1YW50aWxlcyBjb3JyZXNwb25kaW5nIHRvIHRoZSBsb3dlciBhbmQgdXBwZXIgdGFpbHMgb2YgdGhlIGRpc3RyaWJ1dGlvbi4NCg0KU3BlY2lmaWNhbGx5LCBmb3IgYSAkKDEgLSBcYWxwaGEpID0gMC45NSQgY29uZmlkZW5jZSBsZXZlbCwgd2UgdGFrZToNCg0KKiB0aGUgJDIuNSUkIHBlcmNlbnRpbGUgYXMgdGhlIGxvd2VyIGJvdW5kDQoqIHRoZSAkOTcuNSUkIHBlcmNlbnRpbGUgYXMgdGhlIHVwcGVyIGJvdW5kDQoNClRoaXMgeWllbGRzIHRoZSBpbnRlcnZhbDoNClsNClxsZWZ0WyBcd2lkZWhhdHtFW1hdfSp7KDAuMDI1KX0sIDsgXHdpZGVoYXR7RVtYXX0qeygwLjk3NSl9IFxyaWdodF0NCl0NCg0KQ29uY2VwdHVhbGx5LCB0aGlzIGludGVydmFsIHJlcHJlc2VudHMgdGhlIGNlbnRyYWwgOTUlIG9mIHRoZSBib290c3RyYXAgZGlzdHJpYnV0aW9uLCBtZWFuaW5nIHRoYXQgOTUlIG9mIHRoZSByZXNhbXBsZWQgZXN0aW1hdGVzIGZhbGwgd2l0aGluIHRoaXMgcmFuZ2UuIFNpbmNlIHRoaXMgbWV0aG9kIHJlbGllcyBlbnRpcmVseSBvbiB0aGUgZW1waXJpY2FsIGRpc3RyaWJ1dGlvbiwgaXQgbmF0dXJhbGx5IGFkYXB0cyB0byBhbnkgc2tld25lc3Mgb3IgYXN5bW1ldHJ5IHByZXNlbnQgaW4gdGhlIGRhdGEuDQoNClRodXMsIHRoZSBwZXJjZW50aWxlIGJvb3RzdHJhcCBjb25maWRlbmNlIGludGVydmFsIHByb3ZpZGVzIGEgc2ltcGxlIGFuZCBpbnR1aXRpdmUgZXN0aW1hdGUgb2YgdW5jZXJ0YWludHkgZm9yICRcbXVfe0xOfSA9IEVbWF0kIGJhc2VkIG9uIHRoZSBvYnNlcnZlZCBkYXRhLg0KDQpgYGB7cn0NCiMgLS0tIE1hbnVhbCBQZXJjZW50aWxlIENJIC0tLQ0KYWxwaGEgPC0gMC4wNQ0KDQpsb3dlcl9wZXJjIDwtIHF1YW50aWxlKGJvb3RfZXN0aW1hdGVzLCBwcm9icyA9IGFscGhhIC8gMikNCnVwcGVyX3BlcmMgPC0gcXVhbnRpbGUoYm9vdF9lc3RpbWF0ZXMsIHByb2JzID0gMSAtIGFscGhhIC8gMikNCg0KY2lfcGVyY2VudGlsZSA8LSBjKGxvd2VyID0gbG93ZXJfcGVyYywgdXBwZXIgPSB1cHBlcl9wZXJjKQ0KY2lfcGVyY2VudGlsZQ0KDQoNCiMgLS0tIFVzaW5nIGJvb3QgcGFja2FnZSBmb3IgdmVyaWZpY2F0aW9uIC0tLQ0KbGlicmFyeShib290KQ0KDQojIERlZmluZSBzdGF0aXN0aWMgZnVuY3Rpb24gZm9yIGJvb3QoKQ0KYm9vdF9zdGF0IDwtIGZ1bmN0aW9uKGRhdGEsIGluZGljZXMpIHsNCiAgc2FtcGxlX2RhdGEgPC0gZGF0YVtpbmRpY2VzXQ0KICANCiAgbG9nX3ggPC0gbG9nKHNhbXBsZV9kYXRhKQ0KICBtdV9oYXQgPC0gbWVhbihsb2dfeCkNCiAgc2lnbWEyX2hhdCA8LSBtZWFuKChsb2dfeCAtIG11X2hhdCleMikNCiAgDQogICMgUmV0dXJuIEVbWF0gZXN0aW1hdG9yDQogIGV4cChtdV9oYXQgKyBzaWdtYTJfaGF0IC8gMikNCn0NCg0Kc2V0LnNlZWQoMTIzKQ0KDQpib290X3Jlc3VsdCA8LSBib290KGRhdGEsIHN0YXRpc3RpYyA9IGJvb3Rfc3RhdCwgUiA9IDUwMDApDQoNCiMgUGVyY2VudGlsZSBDSSB1c2luZyBib290IHBhY2thZ2UNCmJvb3RfY2kgPC0gYm9vdC5jaShib290X3Jlc3VsdCwgdHlwZSA9ICJwZXJjIikNCg0KYm9vdF9jaQ0KYGBgDQoNCiMgUXVlc3Rpb24gKGMpIDk1JSBCQ2EgQm9vdHN0cmFwIENvbmZpZGVuY2UgSW50ZXJ2YWwgZm9yICRcbXVfe0xOfSA9IEVbWF0kDQoNClRoZSBiaWFzLWNvcnJlY3RlZCBhbmQgYWNjZWxlcmF0ZWQgKEJDYSkgYm9vdHN0cmFwIGNvbmZpZGVuY2UgaW50ZXJ2YWwgaW1wcm92ZXMgdXBvbiB0aGUgcGVyY2VudGlsZSBtZXRob2QgYnkgYWRqdXN0aW5nIGZvciBib3RoIGJpYXMgYW5kIHNrZXduZXNzIGluIHRoZSBib290c3RyYXAgZGlzdHJpYnV0aW9uLg0KDQpDb25jZXB0dWFsbHksIHRoZSBCQ2EgbWV0aG9kIG1vZGlmaWVzIHRoZSBwZXJjZW50aWxlIGN1dG9mZnMgYmFzZWQgb24gdHdvIGZhY3RvcnM6DQoNCiogQSBiaWFzIGNvcnJlY3Rpb24gdGVybSwgd2hpY2ggYWNjb3VudHMgZm9yIHdoZXRoZXIgdGhlIGJvb3RzdHJhcCBkaXN0cmlidXRpb24gaXMgY2VudGVyZWQgYXJvdW5kIHRoZSBvcmlnaW5hbCBlc3RpbWF0ZQ0KKiBBbiBhY2NlbGVyYXRpb24gdGVybSwgd2hpY2ggYWRqdXN0cyBmb3Igc2tld25lc3MgYnkgbWVhc3VyaW5nIGhvdyBzZW5zaXRpdmUgdGhlIGVzdGltYXRvciBpcyB0byBpbmRpdmlkdWFsIG9ic2VydmF0aW9ucw0KDQpUaGVzZSBhZGp1c3RtZW50cyBsZWFkIHRvIG1vZGlmaWVkIHBlcmNlbnRpbGUgbGV2ZWxzLCB3aGljaCBhcmUgdGhlbiB1c2VkIHRvIGRldGVybWluZSB0aGUgY29uZmlkZW5jZSBpbnRlcnZhbCBmcm9tIHRoZSBib290c3RyYXAgZGlzdHJpYnV0aW9uLg0KDQpDb21wYXJlZCB0byB0aGUgcGVyY2VudGlsZSBpbnRlcnZhbCwgdGhlIEJDYSBpbnRlcnZhbCBtYXkgZXhoaWJpdCBzbGlnaHQgYXN5bW1ldHJ5LCByZWZsZWN0aW5nIGFkanVzdG1lbnRzIGZvciBiaWFzIGFuZCBza2V3bmVzcyBpbiB0aGUgYm9vdHN0cmFwIGRpc3RyaWJ1dGlvbi4gVGhpcyBtYWtlcyB0aGUgQkNhIG1ldGhvZCBtb3JlIHJlbGlhYmxlLCBwYXJ0aWN1bGFybHkgd2hlbiB0aGUgZGlzdHJpYnV0aW9uIGlzIG5vdCBwZXJmZWN0bHkgc3ltbWV0cmljLg0KDQpgYGB7cn0NCiMgLS0tIE1hbnVhbCBCQ2EgQ0kgLS0tDQoNCmFscGhhIDwtIDAuMDUNCkIgPC0gbGVuZ3RoKGJvb3RfZXN0aW1hdGVzKQ0KDQojIE9yaWdpbmFsIGVzdGltYXRlDQp0aGV0YV9oYXQgPC0gZXN0aW1hdGVfbWVhbl9sb2dub3JtYWwoZGF0YSkNCg0KIyAtLS0tIEJpYXMgY29ycmVjdGlvbiAoejApIC0tLS0NCnByb3BfbGVzcyA8LSBtZWFuKGJvb3RfZXN0aW1hdGVzIDwgdGhldGFfaGF0KQ0KejAgPC0gcW5vcm0ocHJvcF9sZXNzKQ0KDQojIC0tLS0gSmFja2tuaWZlIGZvciBhY2NlbGVyYXRpb24gLS0tLQ0KbiA8LSBsZW5ndGgoZGF0YSkNCmphY2tfdmFscyA8LSBudW1lcmljKG4pDQoNCmZvciAoaSBpbiAxOm4pIHsNCiAgamFja19zYW1wbGUgPC0gZGF0YVstaV0gICMgbGVhdmUtb25lLW91dA0KICBqYWNrX3ZhbHNbaV0gPC0gZXN0aW1hdGVfbWVhbl9sb2dub3JtYWwoamFja19zYW1wbGUpDQp9DQoNCnRoZXRhX2phY2tfbWVhbiA8LSBtZWFuKGphY2tfdmFscykNCg0KbnVtZXJhdG9yIDwtIHN1bSgodGhldGFfamFja19tZWFuIC0gamFja192YWxzKV4zKQ0KZGVub21pbmF0b3IgPC0gc3VtKCh0aGV0YV9qYWNrX21lYW4gLSBqYWNrX3ZhbHMpXjIpDQoNCmFfaGF0IDwtIG51bWVyYXRvciAvICg2ICogZGVub21pbmF0b3JeKDMvMikpDQoNCiMgLS0tLSBBZGp1c3RlZCBwZXJjZW50aWxlcyAtLS0tDQp6X2FscGhhIDwtIHFub3JtKGFscGhhIC8gMikNCnpfMV9hbHBoYSA8LSBxbm9ybSgxIC0gYWxwaGEgLyAyKQ0KDQphbHBoYTEgPC0gcG5vcm0oejAgKyAoejAgKyB6X2FscGhhKSAvICgxIC0gYV9oYXQgKiAoejAgKyB6X2FscGhhKSkpDQphbHBoYTIgPC0gcG5vcm0oejAgKyAoejAgKyB6XzFfYWxwaGEpIC8gKDEgLSBhX2hhdCAqICh6MCArIHpfMV9hbHBoYSkpKQ0KDQojIC0tLS0gQkNhIGludGVydmFsIC0tLS0NCmxvd2VyX2JjYSA8LSBxdWFudGlsZShib290X2VzdGltYXRlcywgcHJvYnMgPSBhbHBoYTEpDQp1cHBlcl9iY2EgPC0gcXVhbnRpbGUoYm9vdF9lc3RpbWF0ZXMsIHByb2JzID0gYWxwaGEyKQ0KDQpjaV9iY2EgPC0gYyhsb3dlciA9IGxvd2VyX2JjYSwgdXBwZXIgPSB1cHBlcl9iY2EpDQpjaV9iY2ENCmBgYA0KDQpgYGB7cn0NCiMgQkNhIENJIHVzaW5nIGJvb3QgcGFja2FnZQ0KYm9vdF9jaV9iY2EgPC0gYm9vdC5jaShib290X3Jlc3VsdCwgdHlwZSA9ICJiY2EiKQ0KDQpib290X2NpX2JjYQ0KYGBgDQoNCg0KIyBRdWVzdGlvbiAoZCkgQXN5bXB0b3RpYyAoQ0xULUJhc2VkKSBDb25maWRlbmNlIEludGVydmFsIGZvciAkXG11X3tMTn0gPSBFW1hdJA0KDQpBbiBhbHRlcm5hdGl2ZSB0byBib290c3RyYXAtYmFzZWQgY29uZmlkZW5jZSBpbnRlcnZhbHMgaXMgdGhlIGFzeW1wdG90aWMgY29uZmlkZW5jZSBpbnRlcnZhbCBiYXNlZCBvbiB0aGUgQ2VudHJhbCBMaW1pdCBUaGVvcmVtIChDTFQpLiBUaGlzIGFwcHJvYWNoIGFzc3VtZXMgdGhhdCB0aGUgZXN0aW1hdG9yICRcd2lkZWhhdHtFW1hdfSQgaXMgYXBwcm94aW1hdGVseSBub3JtYWxseSBkaXN0cmlidXRlZCBmb3Igc3VmZmljaWVudGx5IGxhcmdlIHNhbXBsZSBzaXplcy4NCg0KVW5kZXIgdGhpcyBhc3N1bXB0aW9uLCBhIDk1JSBjb25maWRlbmNlIGludGVydmFsIGlzIGNvbnN0cnVjdGVkIGFzOg0KWw0KJFx3aWRlaGF0e0VbWF19IDtccG0kOyB6X3swLjk3NX0gJFxjZG90IFx3aWRlaGF0e1xtYXRocm17U0V9fShcd2lkZWhhdHtFW1hdfSkkLA0KXQ0Kd2hlcmUgJHpfezAuOTc1fSQgaXMgdGhlIHN0YW5kYXJkIG5vcm1hbCBjcml0aWNhbCB2YWx1ZSBhbmQgJFx3aWRlaGF0e1xtYXRocm17U0V9fShcd2lkZWhhdHtFW1hdfSkkIGlzIHRoZSBlc3RpbWF0ZWQgc3RhbmRhcmQgZXJyb3Igb2YgdGhlIGVzdGltYXRvci4NCg0KSW4gdGhpcyBwcm9ibGVtLCB0aGUgc3RhbmRhcmQgZXJyb3IgaXMgYXBwcm94aW1hdGVkIHVzaW5nIHRoZSBib290c3RyYXAgZGlzdHJpYnV0aW9uLiBTcGVjaWZpY2FsbHksIHRoZSBzdGFuZGFyZCBkZXZpYXRpb24gb2YgdGhlIGJvb3RzdHJhcCBlc3RpbWF0ZXMgaXMgdXNlZCBhcyBhbiBlc3RpbWF0ZSBvZiAkXHdpZGVoYXR7XG1hdGhybXtTRX19KFx3aWRlaGF0e0VbWF19KSQuDQoNCkNvbmNlcHR1YWxseSwgdGhpcyBtZXRob2QgY29uc3RydWN0cyBhIHN5bW1ldHJpYyBpbnRlcnZhbCBhcm91bmQgdGhlIGVzdGltYXRlLCB1bmxpa2UgdGhlIHBlcmNlbnRpbGUgYW5kIEJDYSBtZXRob2RzIHdoaWNoIGFkYXB0IHRvIHRoZSBzaGFwZSBvZiB0aGUgYm9vdHN0cmFwIGRpc3RyaWJ1dGlvbi4gQXMgYSByZXN1bHQsIGlmIHRoZSBib290c3RyYXAgZGlzdHJpYnV0aW9uIGV4aGliaXRzIHNsaWdodCBza2V3bmVzcywgdGhlIENMVC1iYXNlZCBpbnRlcnZhbCBtYXkgbm90IGZ1bGx5IGNhcHR1cmUgdGhhdCBhc3ltbWV0cnkuDQoNClVubGlrZSBwYXJ0cyAoYikgYW5kIChjKSwgdGhlcmUgaXMgbm8gZGlyZWN0IGltcGxlbWVudGF0aW9uIG9mIHRoZSBDTFQtYmFzZWQgaW50ZXJ2YWwgaW4gdGhlICRcdGV4dHR0e2Jvb3R9JCBwYWNrYWdlLiBJbnN0ZWFkLCB0aGUgYm9vdHN0cmFwIGlzIHVzZWQgaGVyZSBvbmx5IHRvIGVzdGltYXRlIHRoZSBzdGFuZGFyZCBlcnJvciwgYW5kIHRoZSBpbnRlcnZhbCBpcyBjb25zdHJ1Y3RlZCB1c2luZyB0aGUgbm9ybWFsIGFwcHJveGltYXRpb24uDQoNCmBgYHtyfQ0KIyAtLS0gQ0xUIC8gTm9ybWFsLWJhc2VkIENJIC0tLQ0KDQojIE9yaWdpbmFsIGVzdGltYXRlDQp0aGV0YV9oYXQgPC0gZXN0aW1hdGVfbWVhbl9sb2dub3JtYWwoZGF0YSkNCg0KIyBCb290c3RyYXAgc3RhbmRhcmQgZXJyb3IgKHN0ZCBkZXYgb2YgYm9vdHN0cmFwIGVzdGltYXRlcykNCnNlX2Jvb3QgPC0gc2QoYm9vdF9lc3RpbWF0ZXMpDQoNCiMgQ3JpdGljYWwgdmFsdWUgZm9yIDk1JSBDSQ0KeiA8LSBxbm9ybSgwLjk3NSkNCg0KIyBDb25zdHJ1Y3QgQ0kNCmxvd2VyX2NsdCA8LSB0aGV0YV9oYXQgLSB6ICogc2VfYm9vdA0KdXBwZXJfY2x0IDwtIHRoZXRhX2hhdCArIHogKiBzZV9ib290DQoNCmNpX2NsdCA8LSBjKGxvd2VyID0gbG93ZXJfY2x0LCB1cHBlciA9IHVwcGVyX2NsdCkNCmNpX2NsdA0KYGBgDQoNCg0KIyBRdWVzdGlvbiAoZSkgQ29tcGFyaXNvbiBvZiBDb25maWRlbmNlIEludGVydmFscw0KDQpXZSBjb21wYXJlIHRoZSB0aHJlZSBjb25maWRlbmNlIGludGVydmFscyBjb25zdHJ1Y3RlZCBmb3IgJFxtdV97TE59ID0gRVtYXSQ6IHRoZSBwZXJjZW50aWxlIGJvb3RzdHJhcCBpbnRlcnZhbCwgdGhlIEJDYSBib290c3RyYXAgaW50ZXJ2YWwsIGFuZCB0aGUgYXN5bXB0b3RpYyAoQ0xULWJhc2VkKSBpbnRlcnZhbC4NCg0KVGhlIHBlcmNlbnRpbGUgYm9vdHN0cmFwIGludGVydmFsIGlzOg0KWzMuMDk0LCA1LjY0M10sDQp3aGlsZSB0aGUgQkNhIGludGVydmFsIGlzOg0KWzMuMjIzLCA1Ljg1MF0uDQpUaGVzZSB0d28gaW50ZXJ2YWxzIGFyZSBzaW1pbGFyIGluIHdpZHRoLCBidXQgdGhlIEJDYSBpbnRlcnZhbCBpcyBzbGlnaHRseSBzaGlmdGVkIHVwd2FyZCBhbmQgZXh0ZW5kcyBmdXJ0aGVyIG9uIHRoZSB1cHBlciBlbmQuIFRoaXMgcmVmbGVjdHMgdGhlIGJpYXMgYW5kIHNrZXduZXNzIGNvcnJlY3Rpb25zIGFwcGxpZWQgYnkgdGhlIEJDYSBtZXRob2QuDQoNClRoZSBDTFQtYmFzZWQgaW50ZXJ2YWwgaXM6DQpbMi45NjAsIDUuNDc3XSwNCndoaWNoIGlzIHN5bW1ldHJpYyBhcm91bmQgJFx3aWRlaGF0e0VbWF19JC4gQ29tcGFyZWQgdG8gdGhlIGJvb3RzdHJhcCBpbnRlcnZhbHMsIGl0IGhhcyBhIGxvd2VyIGxvd2VyLWJvdW5kIGFuZCBhIHNsaWdodGx5IHNtYWxsZXIgdXBwZXItYm91bmQsIGluZGljYXRpbmcgdGhhdCBpdCBkb2VzIG5vdCBmdWxseSBjYXB0dXJlIHRoZSBhc3ltbWV0cnkgcHJlc2VudCBpbiB0aGUgYm9vdHN0cmFwIGRpc3RyaWJ1dGlvbi4NCg0KSW4gdGVybXMgb2YgcGVyZm9ybWFuY2U6DQoNCiogVGhlIHBlcmNlbnRpbGUgYW5kIEJDYSBpbnRlcnZhbHMgYXJlIGRhdGEtZHJpdmVuIGFuZCByZWZsZWN0IHRoZSBlbXBpcmljYWwgZGlzdHJpYnV0aW9uLg0KKiBUaGUgQkNhIGludGVydmFsIHByb3ZpZGVzIGFkZGl0aW9uYWwgY29ycmVjdGlvbiBmb3IgYmlhcyBhbmQgc2tld25lc3MsIG1ha2luZyBpdCBtb3JlIHJvYnVzdC4NCiogVGhlIENMVCBpbnRlcnZhbCByZWxpZXMgb24gYSBub3JtYWxpdHkgYXNzdW1wdGlvbiBhbmQgbWF5IGJlIGxlc3MgYWNjdXJhdGUgd2hlbiB0aGUgZGlzdHJpYnV0aW9uIGlzIG5vdCBwZXJmZWN0bHkgc3ltbWV0cmljLg0KDQpPdmVyYWxsLCB0aGUgQkNhIGludGVydmFsIGlzIHRoZSBtb3N0IGFwcHJvcHJpYXRlIGNob2ljZSBpbiB0aGlzIHNldHRpbmcgZHVlIHRvIGl0cyBhYmlsaXR5IHRvIGFjY291bnQgZm9yIGJvdGggYmlhcyBhbmQgc2tld25lc3MuIFRoZSBwZXJjZW50aWxlIGludGVydmFsIHByb3ZpZGVzIGEgcmVhc29uYWJsZSBhcHByb3hpbWF0aW9uLCB3aGlsZSB0aGUgQ0xUIGludGVydmFsIHNlcnZlcyBhcyBhIHVzZWZ1bCBidXQgbW9yZSBhc3N1bXB0aW9uLWRlcGVuZGVudCBiZW5jaG1hcmsuDQoNCg==