1 PROBLEM A

1.1 Problem A1

1.1.1 Derivation of the PDF

The probability density function (PDF) is obtained by differentiating the cumulative distribution function (CDF) with respect to \(x\).

Given the Kumaraswamy CDF:

\[F(x; a, b) = 1 - (1 - x^a)^b\]

we apply the chain rule to find \(f(x; a, b) = \frac{d}{dx}F(x; a, b)\).

Step 1: Differentiate the outer function, treating \(u = 1 - x^a\):

\[\frac{d}{dx}\left[1 - (1 - x^a)^b\right] = -b(1 - x^a)^{b-1} \cdot \frac{d}{dx}(1 - x^a)\]

Step 2: Differentiate the inner function \(u = 1 - x^a\):

\[\frac{d}{dx}(1 - x^a) = -ax^{a-1}\]

Step 3: Substitute back and simplify:

\[f(x; a, b) = -b(1 - x^a)^{b-1} \cdot (-ax^{a-1})\]

\[\boxed{f(x; a, b) = ab\, x^{a-1}(1 - x^a)^{b-1}}\]

This result is valid for \(0 < x < 1\), with shape parameters \(a > 0\) and \(b > 0\). The two negatives cancel, confirming that \(f(x; a, b) \geq 0\) over its support,as required for a valid PDF.

1.2 Problem A2

1.2.1 Log-Likelihood Function

Given an i.i.d. random sample \(\{x_1, x_2, \dots, x_n\}\) from the Kumaraswamy distribution with PDF \(f(x; a, b) = ab\,x^{a-1}(1-x^a)^{b-1}\), the joint likelihood function is the product of the individual densities:

\[L(a, b) = \prod_{i=1}^{n} ab\, x_i^{a-1}(1 - x_i^a)^{b-1}\]

Taking the natural logarithm and applying log rules (\(\ln(ABC) = \ln A + \ln B + \ln C\)), the log-likelihood function is:

\[\ell(a, b) = \sum_{i=1}^{n} \left[\ln a + \ln b + (a-1)\ln x_i + (b-1)\ln(1 - x_i^a)\right]\]

Which simplifies to:

\[\ell(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)\]

1.2.2 Gradient Vector

We derive the first-order partial derivatives with respect to each parameter.

Partial derivative with respect to \(a\):

Differentiating term by term, the first two terms contribute \(\frac{n}{a}\), the third contributes \(\sum_{i=1}^{n}\ln x_i\), and the fourth requires the chain rule since \(x_i^a\) depends on \(a\), noting that \(\frac{\partial}{\partial a}(1 - x_i^a) = -x_i^a \ln x_i\):

\[\ell'_a(a, b) = \frac{n}{a} + \sum_{i=1}^{n}\ln x_i + (b-1)\sum_{i=1}^{n}\frac{-x_i^a \ln x_i}{1 - x_i^a}\]

Partial derivative with respect to \(b\):

Only the second and fourth terms depend on \(b\):

\[\ell'_b(a, b) = \frac{n}{b} + \sum_{i=1}^{n}\ln(1 - x_i^a)\]

The gradient vector is therefore:

\[\nabla \ell(a,b) = \left[\ell'_a(a,b),\ \ell'_b(a,b)\right] = \left[\frac{n}{a} + \sum_{i=1}^{n}\ln x_i - (b-1)\sum_{i=1}^{n}\frac{x_i^a \ln x_i}{1 - x_i^a},\ \frac{n}{b} + \sum_{i=1}^{n}\ln(1 - x_i^a)\right]\]

1.3 Problem A3

1.3.1 Observed Fisher Information Matrix

The observed Fisher Information Matrix is the negative of the Hessian matrix of the log-likelihood function, i.e.:

\[\mathcal{I}(a,b) = -\mathbf{H} = -\begin{bmatrix} \frac{\partial^2 \ell}{\partial a^2} & \frac{\partial^2 \ell}{\partial a \partial b} \\ \frac{\partial^2 \ell}{\partial b \partial a} & \frac{\partial^2 \ell}{\partial b^2} \end{bmatrix}\]

We differentiate each component of the gradient vector derived in Problem A2.

Second derivative with respect to \(a\):

Differentiating \(\ell'_a(a,b) = \frac{n}{a} + \sum_{i=1}^{n}\ln x_i - (b-1)\sum_{i=1}^{n}\frac{x_i^a \ln x_i}{1 - x_i^a}\) with respect to \(a\), and applying the quotient rule to the last term with \(\frac{\partial}{\partial a}(x_i^a \ln x_i) = x_i^a(\ln x_i)^2\):

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

Second derivative with respect to \(b\):

Differentiating \(\ell'_b(a,b) = \frac{n}{b} + \sum_{i=1}^{n}\ln(1 - x_i^a)\) with respect to \(b\):

\[\frac{\partial^2 \ell}{\partial b^2} = -\frac{n}{b^2}\]

Mixed partial derivative:

Differentiating \(\ell'_a(a,b)\) with respect to \(b\), only the last term depends on \(b\):

\[\frac{\partial^2 \ell}{\partial a \partial b} = -\sum_{i=1}^{n}\frac{x_i^a \ln x_i}{1 - x_i^a}\]

1.3.2 The Fisher Information Matrix

Negating all second derivatives to form \(\mathcal{I}(a,b) = -\mathbf{H}\):

\[\mathcal{I}(a,b) = \begin{bmatrix} \frac{n}{a^2} + (b-1)\displaystyle\sum_{i=1}^{n}\frac{x_i^a(\ln x_i)^2}{(1-x_i^a)^2} & \displaystyle\sum_{i=1}^{n}\frac{x_i^a \ln x_i}{1-x_i^a} \\[10pt] \displaystyle\sum_{i=1}^{n}\frac{x_i^a \ln x_i}{1-x_i^a} & \frac{n}{b^2} \end{bmatrix}\]

Note that the matrix is symmetric, as expected, since \(\frac{\partial^2 \ell}{\partial a \partial b} = \frac{\partial^2 \ell}{\partial b \partial a}\). The diagonal entries represent the curvature of the log-likelihood with respect to each parameter individually, while the off-diagonal entries capture the cross-parameter curvature.

1.4 Problem A4

1.4.1 MLE and MME of \(a\) for the Power Distribution

When \(b = 1\), the Kumaraswamy distribution reduces to the power distribution with CDF \(F(x) = x^a\), \(a > 0\), \(x \in (0,1)\).

1.4.2 Maximum Likelihood Estimator (MLE)

Substituting \(b = 1\) into the log-likelihood derived in Problem A2, the last term vanishes since \((b-1) = 0\), giving:

\[\ell(a) = n\ln a + (a-1)\sum_{i=1}^{n}\ln x_i\]

Taking the first derivative and setting it equal to zero:

\[\ell'_a(a) = \frac{n}{a} + \sum_{i=1}^{n}\ln x_i = 0\]

Solving for \(a\):

\[\hat{a}_{MLE} = \frac{-n}{\sum_{i=1}^{n}\ln x_i}\]

Since \(0 < x_i < 1\), each \(\ln x_i < 0\), ensuring \(\hat{a}_{MLE} > 0\) as required.

1.4.3 Method of Moments Estimator (MME)

The \(k\)-th theoretical moment of the power distribution is:

\[E[X^k] = \int_0^1 x^k F'(x)\,dx = \int_0^1 x^k \cdot ax^{a-1}\,dx = a\int_0^1 x^{k+a-1}\,dx = \frac{a}{k+a}\]

Setting \(k = 1\) to obtain the first moment:

\[E[X] = \frac{a}{1+a}\]

Matching this to the sample mean \(\bar{x}\) and solving for \(a\):

\[\frac{a}{1+a} = \bar{x} \implies a = \bar{x} + \bar{x}a \implies a(1-\bar{x}) = \bar{x}\]

\[\hat{a}_{MME} = \frac{\bar{x}}{1-\bar{x}}\]

Both estimators have closed-form expressions, making them computationally straightforward to evaluate.

1.5 Problem A5

1.5.1 Asymptotic (Wald) Confidence Interval for \(a\)

1.5.2 Fisher Information for \(a\)

Under the power distribution setting (\(b = 1\)), we have a single parameter \(a\). From the second derivative derived in Problem A3, setting \(b = 1\) causes the second term to vanish:

\[\frac{\partial^2 \ell}{\partial a^2}\Bigg|_{b=1} = -\frac{n}{a^2}\]

The observed Fisher Information is the negative of this second derivative:

\[\mathcal{I}(a) = -\frac{\partial^2 \ell}{\partial a^2} = \frac{n}{a^2}\]

1.5.3 Asymptotic Variance

By the asymptotic theory of MLEs, the asymptotic variance of \(\hat{a}_{MLE}\) is the reciprocal of the Fisher Information:

\[Var(\hat{a}_{MLE}) = \frac{1}{\mathcal{I}(a)} = \frac{a^2}{n}\]

In practice, we substitute \(\hat{a}_{MLE}\) for the unknown \(a\):

\[\widehat{Var}(\hat{a}_{MLE}) = \frac{\hat{a}_{MLE}^2}{n}\]

1.5.4 Wald Confidence Interval

By the asymptotic normality of the MLE, the \(95\%\) Wald confidence interval for \(a\) is:

\[\hat{a}_{MLE} \pm z_{\alpha/2} \cdot \sqrt{\widehat{Var}(\hat{a}_{MLE})}\]

Substituting the estimated variance:

\[\hat{a}_{MLE} \pm z_{\alpha/2} \cdot \frac{\hat{a}_{MLE}}{\sqrt{n}}\]

where \(z_{\alpha/2} = 1.96\) for a \(95\%\) confidence level. This interval is valid asymptotically, relying on the MLE being approximately normally distributed for large \(n\).

1.6 Problem A6

1.6.1 Likelihood Ratio Test Statistic for \(H_0: a = 1\)

The likelihood ratio test statistic is defined as:

\[\Lambda = 2\left[\ell(\hat{a}) - \ell(a_0)\right]\]

where \(\hat{a}_{MLE}\) is the unrestricted MLE derived in Problem A4, and \(a_0 = 1\) is the restricted value under \(H_0\).

1.6.2 Log-likelihood at \(\hat{a}_{MLE}\)

Let \(S = \sum_{i=1}^{n}\ln x_i\) for notational convenience. Substituting \(\hat{a}_{MLE} = \frac{-n}{S}\) into the log-likelihood:

\[\ell(\hat{a}) = n\ln\left(\frac{-n}{S}\right) + \left(\frac{-n}{S} - 1\right)S = n\ln\left(\frac{-n}{S}\right) - n - S\]

1.6.3 Log-likelihood at \(a_0 = 1\)

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

1.6.4 LRT Statistic

Substituting both values:

\[\Lambda = 2\left[n\ln\left(\frac{-n}{S}\right) - n - S\right]\]

where \(S = \sum_{i=1}^{n}\ln x_i\). At a significance level of \(\alpha = 0.05\), the critical value from the \(\chi^2_1\) distribution is \(\chi^2_{1,\, 0.05} = 3.841\), so we compare \(\Lambda\) against this value.

2 Problem B

2.1 Problem B1

2.1.1 Fitting the Kumaraswamy Distribution via MLE

From Problem A2, the log-likelihood function for the Kumaraswamy distribution is:

\[\ell(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)\]

with gradient vector:

\[\ell'_a(a, b) = \frac{n}{a} + \sum_{i=1}^{n}\ln x_i - (b-1)\sum_{i=1}^{n}\frac{x_i^a \ln x_i}{1 - x_i^a}\]

\[\ell'_b(a, b) = \frac{n}{b} + \sum_{i=1}^{n}\ln(1 - x_i^a)\]

We use optim() in R to numerically maximize the log-likelihood, supplying the gradient vector to improve optimization accuracy.

# Data: daily proportion of usable reservoir storage over 50 days
x <- 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)

n <- length(x)

# Log-likelihood function for the Kumaraswamy distribution (from Problem A2)
kuma_loglik <- function(params) {
  a <- params[1]
  b <- params[2]
  
  # Return a large penalty if parameters are non-positive
  if (a <= 0 | b <= 0) return(1e10)
  
  # Log-likelihood components
  ll <- n * log(a) + n * log(b) +
        (a - 1) * sum(log(x)) +
        (b - 1) * sum(log(1 - x^a))
  
  return(-ll)  # Negative because optim() minimizes
}

# Gradient vector (from Problem A2) — supplied to optim() for accuracy
kuma_grad <- function(params) {
  a <- params[1]
  b <- params[2]
  
  # Partial derivative with respect to a
  dl_da <- n/a + sum(log(x)) - (b - 1) * sum((x^a * log(x)) / (1 - x^a))
  
  # Partial derivative with respect to b
  dl_db <- n/b + sum(log(1 - x^a))
  
  # Return negative gradient since we are minimizing
  return(c(-dl_da, -dl_db))
}

# Optimize using BFGS method with gradient supplied
# Initial values set to 1 (uniform distribution starting point)
fit <- optim(par = c(1, 1),
             fn  = kuma_loglik,
             gr  = kuma_grad,
             method = "BFGS")

# Extract MLEs
a_hat <- fit$par[1]
b_hat <- fit$par[2]

cat("MLE of a:", round(a_hat, 4), "\n")
MLE of a: 2.5296 
cat("MLE of b:", round(b_hat, 4), "\n")
MLE of b: 7.8838 

2.2 Problem B2

2.2.1 Likelihood Ratio Test for \(H_0: b = 1\)

We test whether the power distribution (\(b = 1\)) is sufficient to describe the data against the full Kumaraswamy distribution using the LRT at significance level \(\alpha = 0.05\):

\[H_0: b = 1 \quad \text{versus} \quad H_a: b \neq 1\]

The LRT statistic compares the log-likelihood of the unrestricted Kumaraswamy model (from Problem B1) against the restricted power distribution model (using \(\hat{a}_{MLE}\) from Problem A4):

\[\Lambda = 2\left[\ell(\hat{a}, \hat{b}) - \ell(\hat{a}_{power}, 1)\right]\]

Under \(H_0\), \(\Lambda \overset{d}{\to} \chi^2_1\). We reject \(H_0\) at \(\alpha = 0.05\) if \(\Lambda > \chi^2_{1,\, 0.05} = 3.841\).

# Data already defined in Problem B1

# ------- Unrestricted Model (Full Kumaraswamy from B1) -------
# Log-likelihood at MLEs from B1
ll_unrestricted <- -fit$value  # optim() returns the minimized negative log-likelihood

# ------- Restricted Model (Power Distribution, b = 1) -------
# MLE of a for power distribution from Problem A4
a_hat_power <- -n / sum(log(x))

# Log-likelihood for power distribution at a_hat_power
ll_restricted <- n * log(a_hat_power) + (a_hat_power - 1) * sum(log(x))

# ------- LRT Statistic -------
Lambda <- 2 * (ll_unrestricted - ll_restricted)

# ------- Critical Value and Decision -------
critical_value <- qchisq(0.95, df = 1)  # chi-squared critical value at alpha = 0.05

cat("Log-likelihood (Unrestricted):", round(ll_unrestricted, 4), "\n")
Log-likelihood (Unrestricted): 24.5627 
cat("Log-likelihood (Restricted)  :", round(ll_restricted, 4), "\n")
Log-likelihood (Restricted)  : 0.1 
cat("LRT Statistic (Lambda)       :", round(Lambda, 4), "\n")
LRT Statistic (Lambda)       : 48.9253 
cat("Critical Value (chi^2_1,0.05):", round(critical_value, 4), "\n")
Critical Value (chi^2_1,0.05): 3.8415 
cat("Decision: ", ifelse(Lambda > critical_value, 
                         "Reject H0 - data favours full Kumaraswamy", 
                         "Fail to reject H0 - power distribution is sufficient"), "\n")
Decision:  Reject H0 - data favours full Kumaraswamy 

2.2.2 Statistical Decision and Practical Implication

At \(\alpha = 0.05\), we compare \(\Lambda\) to the critical value \(\chi^2_{1,\, 0.05} = 3.841\). If \(\Lambda > 3.841\), we reject \(H_0\), concluding that \(b \neq 1\) and the full Kumaraswamy distribution provides a significantly better fit than the power distribution. Practically, this would mean that the reservoir storage data has a more complex shape than what the simpler power distribution can capture, requiring both shape parameters \(a\) and \(b\) to adequately model the daily storage proportions during the dry season.

2.3 Problem B3

2.3.1 Bootstrap and Wald Inference for \(\hat{a}\) and \(\hat{b}\)

2.3.2 Part (1): Bootstrap Sampling Distributions

We obtain the bootstrap sampling distributions of \(\hat{a}\) and \(\hat{b}\) by resampling the data with replacement \(B = 1000\) times, refitting the Kumaraswamy distribution each time using the same optim() procedure from Problem B1, and plotting the resulting distributions using Gaussian kernel density curves.

set.seed(123)  # For reproducibility

B <- 1000  # Number of bootstrap resamples

# Store bootstrap estimates
boot_a <- numeric(B)
boot_b <- numeric(B)

for (i in 1:B) {
  # Resample data with replacement
  x_boot <- sample(x, size = n, replace = TRUE)
  
  # Negative log-likelihood for bootstrap sample
  kuma_loglik_boot <- function(params) {
    a <- params[1]
    b <- params[2]
    if (a <= 0 | b <= 0) return(1e10)
    ll <- n * log(a) + n * log(b) +
          (a - 1) * sum(log(x_boot)) +
          (b - 1) * sum(log(1 - x_boot^a))
    return(-ll)
  }
  
  # Gradient for bootstrap sample
  kuma_grad_boot <- function(params) {
    a <- params[1]
    b <- params[2]
    dl_da <- n/a + sum(log(x_boot)) - 
             (b - 1) * sum((x_boot^a * log(x_boot)) / (1 - x_boot^a))
    dl_db <- n/b + sum(log(1 - x_boot^a))
    return(c(-dl_da, -dl_db))
  }
  
  # Fit model to bootstrap sample
  fit_boot <- tryCatch(
    optim(par = c(a_hat, b_hat),   # Use original MLEs as starting values
          fn  = kuma_loglik_boot,
          gr  = kuma_grad_boot,
          method = "BFGS"),
    error = function(e) NULL
  )
  
  # Store estimates if optimization converged
  if (!is.null(fit_boot) && fit_boot$convergence == 0) {
    boot_a[i] <- fit_boot$par[1]
    boot_b[i] <- fit_boot$par[2]
  } else {
    boot_a[i] <- NA
    boot_b[i] <- NA
  }
}

# Remove any failed iterations
boot_a <- boot_a[!is.na(boot_a)]
boot_b <- boot_b[!is.na(boot_b)]

# ---- Plot 1: Bootstrap distribution of a_hat ----
plot(density(boot_a, kernel = "gaussian"),
     main = expression("Bootstrap Sampling Distribution of " * hat(a)),
     xlab = expression(hat(a)),
     ylab = "Density",
     col  = "steelblue",
     lwd  = 3,
     cex.main = 1.5,
     cex.lab  = 1.3,
     cex.axis = 1.2)
abline(v = a_hat, col = "red", lty = 2, lwd = 2)  # Original MLE
legend("topright", 
       legend = c("Gaussian KDE", "MLE"), 
       col    = c("steelblue", "red"), 
       lty    = c(1, 2), 
       lwd    = 2,
       cex    = 1.2)

# ---- Plot 2: Bootstrap distribution of b_hat ----
plot(density(boot_b, kernel = "gaussian"),
     main = expression("Bootstrap Sampling Distribution of " * hat(b)),
     xlab = expression(hat(b)),
     ylab = "Density",
     col  = "darkgreen",
     lwd  = 3,
     cex.main = 1.5,
     cex.lab  = 1.3,
     cex.axis = 1.2)
abline(v = b_hat, col = "red", lty = 2, lwd = 2)  # Original MLE
legend("topright", 
       legend = c("Gaussian KDE", "MLE"), 
       col    = c("darkgreen", "red"), 
       lty    = c(1, 2), 
       lwd    = 2,
       cex    = 1.2)

2.3.3 Part (2): Bootstrap CI and Wald CI for \(b\)

The \(95\%\) bootstrap confidence interval for \(b\) is obtained by taking the \(2.5\)th and \(97.5\)th percentiles of the bootstrap distribution of \(\hat{b}\).

The Wald CI requires the standard error of \(\hat{b}\), obtained from the inverse of the observed Fisher Information matrix (i.e., the inverse of the negative Hessian returned by optim()).

# ------- Bootstrap CI for b -------
boot_ci_b <- quantile(boot_b, probs = c(0.025, 0.975))
cat("95% Bootstrap CI for b: [", round(boot_ci_b[1], 4), 
    ",", round(boot_ci_b[2], 4), "]\n")
95% Bootstrap CI for b: [ 5.1266 , 16.2958 ]
# ------- Wald CI for b -------
# The observed Fisher Information matrix is the inverse of the negative Hessian
# optim() with hessian = TRUE returns the Hessian of the objective function
# (negative log-likelihood), so it is already the negative Hessian of the log-likelihood

fit_hess <- optim(par     = c(a_hat, b_hat),
                  fn      = kuma_loglik,
                  gr      = kuma_grad,
                  method  = "BFGS",
                  hessian = TRUE)

# Variance-covariance matrix is the inverse of the Hessian
vcov_matrix <- solve(fit_hess$hessian)

# Standard error of b_hat is the square root of the (2,2) entry
se_b <- sqrt(vcov_matrix[2, 2])

# 95% Wald CI for b
wald_ci_b <- c(b_hat - 1.96 * se_b, b_hat + 1.96 * se_b)
cat("95% Wald CI for b     : [", round(wald_ci_b[1], 4), 
    ",", round(wald_ci_b[2], 4), "]\n")
95% Wald CI for b     : [ 3.4842 , 12.2833 ]
# Compare with B2 result - does the CI contain 1?
cat("Bootstrap CI contains 1:", boot_ci_b[1] <= 1 & 1 <= boot_ci_b[2], "\n")
Bootstrap CI contains 1: FALSE 
cat("Wald CI contains 1     :", wald_ci_b[1] <= 1 & 1 <= wald_ci_b[2], "\n")
Wald CI contains 1     : FALSE 

2.3.4 Part (3): Validity of the Wald Confidence Interval

The Wald confidence interval for \(b\) constructed in Part (2) relies on the assumption that \(\hat{b}\) is approximately normally distributed. We can assess this assumption by examining the shape of the bootstrap sampling distribution of \(\hat{b}\) from Part (1).

The bootstrap distribution of \(\hat{b}\) is clearly right-skewed, with a long tail extending well beyond the bulk of the distribution. This departure from normality suggests that the Wald CI for \(b\) is not well supported, and the bootstrap confidence interval would be the more reliable choice for inference on \(b\) in this setting.

2.4 Problem B4

2.4.1 Likelihood Ratio Test for Uniformity

We perform a likelihood ratio test to assess whether the reservoir storage data follows a uniform distribution on \((0,1)\), which corresponds to the Kumaraswamy distribution with \(a = 1\) and \(b = 1\):

\[H_0: a = 1 \ \& \ b = 1 \quad \text{versus} \quad H_a: a \neq 1 \ \text{or} \ b \neq 1 \ \text{or} \ (a \neq 1 \ \& \ b \neq 1)\]

The LRT statistic compares the log-likelihood of the unrestricted Kumaraswamy model (from Problem B1) against the restricted uniform model where \(a = 1\) and \(b = 1\):

\[\Lambda = 2\left[\ell(\hat{a}, \hat{b}) - \ell(1, 1)\right]\]

Since two parameters are simultaneously restricted under \(H_0\), by Wilks’ theorem \(\Lambda \overset{d}{\to} \chi^2_2\) asymptotically.

# ------- Restricted Model (Uniform Distribution, a = 1, b = 1) -------
# Log-likelihood simplifies to 0 since log(1) = 0 and remaining terms vanish
ll_uniform <- 0

# ------- LRT Statistic -------
Lambda_b4 <- 2 * (ll_unrestricted - ll_uniform)

# ------- Critical Value and Decision -------
# Two parameters restricted simultaneously, so chi-squared with df = 2
critical_value_b4 <- qchisq(0.95, df = 2)

cat("LRT Statistic (Lambda)         :", round(Lambda_b4, 4), "\n")
LRT Statistic (Lambda)         : 49.1254 
cat("Critical Value (chi^2_2, 0.05) :", round(critical_value_b4, 4), "\n")
Critical Value (chi^2_2, 0.05) : 5.9915 
cat("Decision:", ifelse(Lambda_b4 > critical_value_b4,
                        "Reject H0 - data does not follow uniform distribution",
                        "Fail to reject H0 - data is consistent with uniform distribution"), "\n")
Decision: Reject H0 - data does not follow uniform distribution 

2.4.2 Practical Interpretation

At \(\alpha = 0.05\), the LRT statistic \(\Lambda = 49.1254\) far exceeds the critical value \(\chi^2_{2,\, 0.05} = 5.9915\), leading us to strongly reject \(H_0\). This provides overwhelming evidence that the reservoir storage data does not follow a uniform distribution on \((0,1)\).

Practically, this means that during the dry season, not all storage levels are equally likely. The data tends to concentrate at lower storage levels, consistent with the right skewed pattern described in the working dataset where drought conditions dominate and occasional replenishment events push storage higher only temporarily. The full Kumaraswamy distribution with both shape parameters \(\hat{a}\) and \(\hat{b}\) is therefore necessary to adequately model the daily reservoir storage proportions.

LS0tDQp0aXRsZTogJ0ZJTkFMIEVYQU0nDQphdXRob3I6ICdHZXJhcmQgSWtlJw0KZGF0ZTogIjIwMjYtMDUtMDMiDQpvdXRwdXQ6DQogIGh0bWxfZG9jdW1lbnQ6ICAgICAgICAgICAgICAjIG91dHB1dCBkb2N1bWVudCBmb3JtYXQNCiAgICB0b2M6IHllcyAgICAgICAgICAgICAgICAgICMgYWRkIHRhYmxlIGNvbnRlbnRzDQogICAgdG9jX2Zsb2F0OiB5ZXMgICAgICAgICAgICAjIHRvY19wcm9wZXJ0eTogZmxvYXRpbmcNCiAgICB0b2NfZGVwdGg6IDQgICAgICAgICAgICAgICMgZGVwdGggb2YgVE9DIGhlYWRpbmdzDQogICAgZmlnX3dpZHRoOiA2ICAgICAgICAgICAgICAjIGdsb2JhbCBmaWd1cmUgd2lkdGgNCiAgICBmaWdfaGVpZ2h0OiA0ICAgICAgICAgICAgICMgZ2xvYmFsIGZpZ3VyZSBoZWlnaHQNCiAgICBmaWdfY2FwdGlvbjogeWVzICAgICAgICAgICMgYWRkIGZpZ3VyZSBjYXB0aW9uDQogICAgbnVtYmVyX3NlY3Rpb25zOiB5ZXMgICAgICAjIG51bWJlcmluZyBzZWN0aW9uIGhlYWRpbmdzDQogICAgdG9jX2NvbGxhcHNlZDogeWVzICAgICAgICAjIFRPQyBzdWJoZWFkaW5nIGNsYXBzaW5nDQogICAgY29kZV9mb2xkaW5nOiBoaWRlICAgICAgICAjIGZvbGRpbmcvc2hvd2luZyBjb2RlDQogICAgY29kZV9kb3dubG9hZDogeWVzICAgICAgICAjIGFsbG93IHRvIGRvd25sb2FkIGNvbXBsZXRlIFJNYXJrZG93biBzb3VyY2UgY29kZQ0KICAgIHNtb290aF9zY3JvbGw6IHllcyAgICAgICAgIyBzY3JvbGxpbmcgdGV4dCBvZiB0aGUgZG9jdW1lbnQNCiAgICB0aGVtZTogbHVtZW4gICAgICAgICAgICAgICMgdmlzdWFsIHRoZW1lIGZvciBIVE1MIGRvY3VtZW50IG9ubHkNCiAgICBoaWdobGlnaHQ6IHRhbmdvICAgICAgICAgICMgY29kZSBzeW50YXggaGlnaGxpZ2h0aW5nIHN0eWxlcw0KICBwZGZfZG9jdW1lbnQ6DQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZGVwdGg6IDQNCiAgICBmaWdfY2FwdGlvbjogeWVzDQogICAgbnVtYmVyX3NlY3Rpb25zOiB5ZXMNCiAgd29yZF9kb2N1bWVudDoNCiAgICB0b2M6IHllcw0KICAgIHRvY19kZXB0aDogJzQnDQotLS0NCg0KYGBge2NzcywgZWNobyA9IEZBTFNFfQ0KZGl2I1RPQyBsaSB7ICAgICAvKiB0YWJsZSBvZiBjb250ZW50ICAqLw0KICAgIGxpc3Qtc3R5bGU6dXBwZXItcm9tYW47DQogICAgYmFja2dyb3VuZC1pbWFnZTpub25lOw0KICAgIGJhY2tncm91bmQtcmVwZWF0Om5vbmU7DQogICAgYmFja2dyb3VuZC1wb3NpdGlvbjowOw0KfQ0KDQpoMS50aXRsZSB7ICAgIC8qIGxldmVsIDEgaGVhZGVyIG9mIHRpdGxlICAqLw0KICBmb250LXNpemU6IDI0cHg7DQogIGZvbnQtd2VpZ2h0OiBib2xkOw0KICBjb2xvcjogRGFya1JlZDsNCiAgdGV4dC1hbGlnbjogY2VudGVyOw0KfQ0KDQpoNC5hdXRob3IgeyAvKiBIZWFkZXIgNCAtIGFuZCB0aGUgYXV0aG9yIGFuZCBkYXRhIGhlYWRlcnMgdXNlIHRoaXMgdG9vICAqLw0KICBmb250LXNpemU6IDE4cHg7DQogIGZvbnQtd2VpZ2h0OiBib2xkOw0KICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsNCiAgY29sb3I6IERhcmtSZWQ7DQogIHRleHQtYWxpZ246IGNlbnRlcjsNCn0NCg0KaDQuZGF0ZSB7IC8qIEhlYWRlciA0IC0gYW5kIHRoZSBhdXRob3IgYW5kIGRhdGEgaGVhZGVycyB1c2UgdGhpcyB0b28gICovDQogIGZvbnQtc2l6ZTogMThweDsNCiAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICBjb2xvcjogRGFya0JsdWU7DQogIHRleHQtYWxpZ246IGNlbnRlcjsNCn0NCg0KaDEgeyAvKiBIZWFkZXIgMSAtIGFuZCB0aGUgYXV0aG9yIGFuZCBkYXRhIGhlYWRlcnMgdXNlIHRoaXMgdG9vICAqLw0KICAgIGZvbnQtc2l6ZTogMjBweDsNCiAgICBmb250LXdlaWdodDogYm9sZDsNCiAgICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsNCiAgICBjb2xvcjogZGFya3JlZDsNCiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7DQp9DQoNCmgyIHsgLyogSGVhZGVyIDIgLSBhbmQgdGhlIGF1dGhvciBhbmQgZGF0YSBoZWFkZXJzIHVzZSB0aGlzIHRvbyAgKi8NCiAgICBmb250LXNpemU6IDE4cHg7DQogICAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogICAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7DQogICAgY29sb3I6IG5hdnk7DQogICAgdGV4dC1hbGlnbjogbGVmdDsNCn0NCg0KaDMgeyAvKiBIZWFkZXIgMyAtIGFuZCB0aGUgYXV0aG9yIGFuZCBkYXRhIGhlYWRlcnMgdXNlIHRoaXMgdG9vICAqLw0KICAgIGZvbnQtc2l6ZTogMTZweDsNCiAgICBmb250LXdlaWdodDogYm9sZDsNCiAgICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsNCiAgICBjb2xvcjogbmF2eTsNCiAgICB0ZXh0LWFsaWduOiBsZWZ0Ow0KfQ0KDQpoNCB7IC8qIEhlYWRlciA0IC0gYW5kIHRoZSBhdXRob3IgYW5kIGRhdGEgaGVhZGVycyB1c2UgdGhpcyB0b28gICovDQogICAgZm9udC1zaXplOiAxNHB4Ow0KICBmb250LXdlaWdodDogYm9sZDsNCiAgICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsNCiAgICBjb2xvcjogZGFya3JlZDsNCiAgICB0ZXh0LWFsaWduOiBsZWZ0Ow0KfQ0KDQovKiBBZGQgZG90cyBhZnRlciBudW1iZXJlZCBoZWFkZXJzICovDQouaGVhZGVyLXNlY3Rpb24tbnVtYmVyOjphZnRlciB7DQogIGNvbnRlbnQ6ICIuIjsNCn0NCmBgYA0KDQpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0NCiMgY29kZSBjaHVuayBzcGVjaWZpZXMgd2hldGhlciB0aGUgUiBjb2RlLCB3YXJuaW5ncywgYW5kIG91dHB1dCANCiMgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgb3V0cHV0IGZpbGVzLg0KDQppZiAoIXJlcXVpcmUoImtuaXRyIikpIHsgICAgICAgICAgICAgICAgICAgICAgIyB1c2UgY29uZGl0aW9uYWwgc3RhdGVtZW50IHRvIGRldGVjdA0KICAgaW5zdGFsbC5wYWNrYWdlcygia25pdHIiKSAgICAgICAgICAgICAgICAgICMgd2hldGhlciBhIHBhY2thZ2Ugd2FzIGluc3RhbGxlZCBpbg0KICAgbGlicmFyeShrbml0cikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgeW91ciBtYWNoaW5lLiBJZiBub3QsIGluc3RhbGwgaXQgYW5kDQp9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBsb2FkIGl0IHRvIHRoZSB3b3JraW5nIGRpcmVjdG9yeS4NCiMNCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSwgICAgICAgICAgICAjIGluY2x1ZGUgY29kZSBjaHVuayBpbiB0aGUgb3V0cHV0IGZpbGUNCiAgICAgICAgICAgICAgICAgICAgICB3YXJuaW5nID0gRkFMU0UsICAgICAgICAjIHNvbWV0aW1lcywgeW91IGNvZGUgbWF5IHByb2R1Y2Ugd2FybmluZyBtZXNzYWdlcywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHlvdSBjYW4gY2hvb3NlIHRvIGluY2x1ZGUgdGhlIHdhcm5pbmcgbWVzc2FnZXMgaW4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHRoZSBvdXRwdXQgZmlsZS4gDQogICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cyA9IFRSVUUsICAgICAgICAgIyB5b3UgY2FuIGFsc28gZGVjaWRlIHdoZXRoZXIgdG8gaW5jbHVkZSB0aGUgb3V0cHV0DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBpbiB0aGUgb3V0cHV0IGZpbGUuDQogICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IEZBTFNFLCAgICAgICAgIyBzdXBwcmVzcyBtZXNzYWdlcyANCiAgICAgICAgICAgICAgICAgICAgICBjb21tZW50ID0gTkEgICAgICAgICAgICAjIHJlbW92ZSB0aGUgZGVmYXVsdCBsZWFkaW5nIGhhc2ggdGFncyBpbiB0aGUgb3V0cHV0DQogICAgICAgICAgICAgICAgICAgICAgKSAgIA0KYGBgDQoNCiMgUFJPQkxFTSBBDQojIyBQcm9ibGVtIEExDQoNCiMjIyBEZXJpdmF0aW9uIG9mIHRoZSBQREYNCg0KVGhlIHByb2JhYmlsaXR5IGRlbnNpdHkgZnVuY3Rpb24gKFBERikgaXMgb2J0YWluZWQgYnkgZGlmZmVyZW50aWF0aW5nIHRoZQ0KY3VtdWxhdGl2ZSBkaXN0cmlidXRpb24gZnVuY3Rpb24gKENERikgd2l0aCByZXNwZWN0IHRvICR4JC4NCg0KR2l2ZW4gdGhlIEt1bWFyYXN3YW15IENERjoNCg0KJCRGKHg7IGEsIGIpID0gMSAtICgxIC0geF5hKV5iJCQNCg0Kd2UgYXBwbHkgdGhlICoqY2hhaW4gcnVsZSoqIHRvIGZpbmQgJGYoeDsgYSwgYikgPSBcZnJhY3tkfXtkeH1GKHg7IGEsIGIpJC4NCg0KKipTdGVwIDE6KiogRGlmZmVyZW50aWF0ZSB0aGUgb3V0ZXIgZnVuY3Rpb24sIHRyZWF0aW5nICR1ID0gMSAtIHheYSQ6DQoNCiQkXGZyYWN7ZH17ZHh9XGxlZnRbMSAtICgxIC0geF5hKV5iXHJpZ2h0XSA9IC1iKDEgLSB4XmEpXntiLTF9IFxjZG90IFxmcmFje2R9e2R4fSgxIC0geF5hKSQkDQoNCioqU3RlcCAyOioqIERpZmZlcmVudGlhdGUgdGhlIGlubmVyIGZ1bmN0aW9uICR1ID0gMSAtIHheYSQ6DQoNCiQkXGZyYWN7ZH17ZHh9KDEgLSB4XmEpID0gLWF4XnthLTF9JCQNCg0KKipTdGVwIDM6KiogU3Vic3RpdHV0ZSBiYWNrIGFuZCBzaW1wbGlmeToNCg0KJCRmKHg7IGEsIGIpID0gLWIoMSAtIHheYSlee2ItMX0gXGNkb3QgKC1heF57YS0xfSkkJA0KDQokJFxib3hlZHtmKHg7IGEsIGIpID0gYWJcLCB4XnthLTF9KDEgLSB4XmEpXntiLTF9fSQkDQoNClRoaXMgcmVzdWx0IGlzIHZhbGlkIGZvciAkMCA8IHggPCAxJCwgd2l0aCBzaGFwZSBwYXJhbWV0ZXJzICRhID4gMCQgYW5kICRiID4gMCQuDQpUaGUgdHdvIG5lZ2F0aXZlcyBjYW5jZWwsIGNvbmZpcm1pbmcgdGhhdCAkZih4OyBhLCBiKSBcZ2VxIDAkIG92ZXIgaXRzIHN1cHBvcnQsYXMgcmVxdWlyZWQgZm9yIGEgdmFsaWQgUERGLg0KDQoNCiMjIFByb2JsZW0gQTINCg0KIyMjIExvZy1MaWtlbGlob29kIEZ1bmN0aW9uDQoNCkdpdmVuIGFuIGkuaS5kLiByYW5kb20gc2FtcGxlICRce3hfMSwgeF8yLCBcZG90cywgeF9uXH0kIGZyb20gdGhlIEt1bWFyYXN3YW15IGRpc3RyaWJ1dGlvbiB3aXRoIFBERiAkZih4OyBhLCBiKSA9IGFiXCx4XnthLTF9KDEteF5hKV57Yi0xfSQsIHRoZSBqb2ludCBsaWtlbGlob29kIGZ1bmN0aW9uIGlzIHRoZSBwcm9kdWN0IG9mIHRoZSBpbmRpdmlkdWFsIGRlbnNpdGllczoNCg0KJCRMKGEsIGIpID0gXHByb2Rfe2k9MX1ee259IGFiXCwgeF9pXnthLTF9KDEgLSB4X2leYSlee2ItMX0kJA0KDQpUYWtpbmcgdGhlIG5hdHVyYWwgbG9nYXJpdGhtIGFuZCBhcHBseWluZyBsb2cgcnVsZXMNCigkXGxuKEFCQykgPSBcbG4gQSArIFxsbiBCICsgXGxuIEMkKSwgdGhlIGxvZy1saWtlbGlob29kIGZ1bmN0aW9uIGlzOg0KDQokJFxlbGwoYSwgYikgPSBcc3VtX3tpPTF9XntufSBcbGVmdFtcbG4gYSArIFxsbiBiICsgKGEtMSlcbG4geF9pICsgKGItMSlcbG4oMSAtIHhfaV5hKVxyaWdodF0kJA0KDQpXaGljaCBzaW1wbGlmaWVzIHRvOg0KDQokJFxlbGwoYSwgYikgPSBuXGxuIGEgKyBuXGxuIGIgKyAoYS0xKVxzdW1fe2k9MX1ee259XGxuIHhfaSArIChiLTEpXHN1bV97aT0xfV57bn1cbG4oMSAtIHhfaV5hKSQkDQoNCiMjIyBHcmFkaWVudCBWZWN0b3INCg0KV2UgZGVyaXZlIHRoZSBmaXJzdC1vcmRlciBwYXJ0aWFsIGRlcml2YXRpdmVzIHdpdGggcmVzcGVjdCB0byBlYWNoIHBhcmFtZXRlci4NCg0KKipQYXJ0aWFsIGRlcml2YXRpdmUgd2l0aCByZXNwZWN0IHRvICRhJDoqKg0KDQpEaWZmZXJlbnRpYXRpbmcgdGVybSBieSB0ZXJtLCB0aGUgZmlyc3QgdHdvIHRlcm1zIGNvbnRyaWJ1dGUgJFxmcmFje259e2F9JCwgdGhlIHRoaXJkIGNvbnRyaWJ1dGVzICRcc3VtX3tpPTF9XntufVxsbiB4X2kkLCBhbmQgdGhlIGZvdXJ0aCByZXF1aXJlcyB0aGUgY2hhaW4gcnVsZSBzaW5jZSAkeF9pXmEkIGRlcGVuZHMgb24gJGEkLCBub3RpbmcgdGhhdCAkXGZyYWN7XHBhcnRpYWx9e1xwYXJ0aWFsIGF9KDEgLSB4X2leYSkgPSAteF9pXmEgXGxuIHhfaSQ6DQoNCiQkXGVsbCdfYShhLCBiKSA9IFxmcmFje259e2F9ICsgXHN1bV97aT0xfV57bn1cbG4geF9pICsgKGItMSlcc3VtX3tpPTF9XntufVxmcmFjey14X2leYSBcbG4geF9pfXsxIC0geF9pXmF9JCQNCg0KKipQYXJ0aWFsIGRlcml2YXRpdmUgd2l0aCByZXNwZWN0IHRvICRiJDoqKg0KDQpPbmx5IHRoZSBzZWNvbmQgYW5kIGZvdXJ0aCB0ZXJtcyBkZXBlbmQgb24gJGIkOg0KDQokJFxlbGwnX2IoYSwgYikgPSBcZnJhY3tufXtifSArIFxzdW1fe2k9MX1ee259XGxuKDEgLSB4X2leYSkkJA0KDQpUaGUgKipncmFkaWVudCB2ZWN0b3IqKiBpcyB0aGVyZWZvcmU6DQoNCiQkXG5hYmxhIFxlbGwoYSxiKSA9IFxsZWZ0W1xlbGwnX2EoYSxiKSxcIFxlbGwnX2IoYSxiKVxyaWdodF0gPSBcbGVmdFtcZnJhY3tufXthfSArIFxzdW1fe2k9MX1ee259XGxuIHhfaSAtIChiLTEpXHN1bV97aT0xfV57bn1cZnJhY3t4X2leYSBcbG4geF9pfXsxIC0geF9pXmF9LFwgXGZyYWN7bn17Yn0gKyBcc3VtX3tpPTF9XntufVxsbigxIC0geF9pXmEpXHJpZ2h0XSQkDQoNCg0KDQoNCiMjIFByb2JsZW0gQTMNCg0KIyMjIE9ic2VydmVkIEZpc2hlciBJbmZvcm1hdGlvbiBNYXRyaXgNCg0KVGhlIG9ic2VydmVkIEZpc2hlciBJbmZvcm1hdGlvbiBNYXRyaXggaXMgdGhlIG5lZ2F0aXZlIG9mIHRoZSBIZXNzaWFuIG1hdHJpeCBvZiB0aGUgbG9nLWxpa2VsaWhvb2QgZnVuY3Rpb24sIGkuZS46DQoNCiQkXG1hdGhjYWx7SX0oYSxiKSA9IC1cbWF0aGJme0h9ID0gLVxiZWdpbntibWF0cml4fSBcZnJhY3tccGFydGlhbF4yIFxlbGx9e1xwYXJ0aWFsIGFeMn0gJiBcZnJhY3tccGFydGlhbF4yIFxlbGx9e1xwYXJ0aWFsIGEgXHBhcnRpYWwgYn0gXFwgXGZyYWN7XHBhcnRpYWxeMiBcZWxsfXtccGFydGlhbCBiIFxwYXJ0aWFsIGF9ICYgXGZyYWN7XHBhcnRpYWxeMiBcZWxsfXtccGFydGlhbCBiXjJ9IFxlbmR7Ym1hdHJpeH0kJA0KDQpXZSBkaWZmZXJlbnRpYXRlIGVhY2ggY29tcG9uZW50IG9mIHRoZSBncmFkaWVudCB2ZWN0b3IgZGVyaXZlZCBpbiBQcm9ibGVtIEEyLg0KDQoqKlNlY29uZCBkZXJpdmF0aXZlIHdpdGggcmVzcGVjdCB0byAkYSQ6KioNCg0KRGlmZmVyZW50aWF0aW5nICRcZWxsJ19hKGEsYikgPSBcZnJhY3tufXthfSArIFxzdW1fe2k9MX1ee259XGxuIHhfaSAtIChiLTEpXHN1bV97aT0xfV57bn1cZnJhY3t4X2leYSBcbG4geF9pfXsxIC0geF9pXmF9JCB3aXRoIHJlc3BlY3QgdG8gJGEkLCBhbmQgYXBwbHlpbmcgdGhlIHF1b3RpZW50IHJ1bGUgdG8gdGhlIGxhc3QgdGVybSB3aXRoICRcZnJhY3tccGFydGlhbH17XHBhcnRpYWwgYX0oeF9pXmEgXGxuIHhfaSkgPSB4X2leYShcbG4geF9pKV4yJDoNCg0KJCRcZnJhY3tccGFydGlhbF4yIFxlbGx9e1xwYXJ0aWFsIGFeMn0gPSAtXGZyYWN7bn17YV4yfSAtIChiLTEpXHN1bV97aT0xfV57bn1cZnJhY3t4X2leYShcbG4geF9pKV4yfXsoMSAtIHhfaV5hKV4yfSQkDQoNCioqU2Vjb25kIGRlcml2YXRpdmUgd2l0aCByZXNwZWN0IHRvICRiJDoqKg0KDQpEaWZmZXJlbnRpYXRpbmcgJFxlbGwnX2IoYSxiKSA9IFxmcmFje259e2J9ICsgXHN1bV97aT0xfV57bn1cbG4oMSAtIHhfaV5hKSQgd2l0aCByZXNwZWN0IHRvICRiJDoNCg0KJCRcZnJhY3tccGFydGlhbF4yIFxlbGx9e1xwYXJ0aWFsIGJeMn0gPSAtXGZyYWN7bn17Yl4yfSQkDQoNCioqTWl4ZWQgcGFydGlhbCBkZXJpdmF0aXZlOioqDQoNCkRpZmZlcmVudGlhdGluZyAkXGVsbCdfYShhLGIpJCB3aXRoIHJlc3BlY3QgdG8gJGIkLCBvbmx5IHRoZSBsYXN0IHRlcm0gZGVwZW5kcyBvbiAkYiQ6DQoNCiQkXGZyYWN7XHBhcnRpYWxeMiBcZWxsfXtccGFydGlhbCBhIFxwYXJ0aWFsIGJ9ID0gLVxzdW1fe2k9MX1ee259XGZyYWN7eF9pXmEgXGxuIHhfaX17MSAtIHhfaV5hfSQkDQoNCiMjIyBUaGUgRmlzaGVyIEluZm9ybWF0aW9uIE1hdHJpeA0KDQpOZWdhdGluZyBhbGwgc2Vjb25kIGRlcml2YXRpdmVzIHRvIGZvcm0gJFxtYXRoY2Fse0l9KGEsYikgPSAtXG1hdGhiZntIfSQ6DQoNCiQkXG1hdGhjYWx7SX0oYSxiKSA9IFxiZWdpbntibWF0cml4fSBcZnJhY3tufXthXjJ9ICsgKGItMSlcZGlzcGxheXN0eWxlXHN1bV97aT0xfV57bn1cZnJhY3t4X2leYShcbG4geF9pKV4yfXsoMS14X2leYSleMn0gJiBcZGlzcGxheXN0eWxlXHN1bV97aT0xfV57bn1cZnJhY3t4X2leYSBcbG4geF9pfXsxLXhfaV5hfSBcXFsxMHB0XSBcZGlzcGxheXN0eWxlXHN1bV97aT0xfV57bn1cZnJhY3t4X2leYSBcbG4geF9pfXsxLXhfaV5hfSAmIFxmcmFje259e2JeMn0gXGVuZHtibWF0cml4fSQkDQoNCk5vdGUgdGhhdCB0aGUgbWF0cml4IGlzIHN5bW1ldHJpYywgYXMgZXhwZWN0ZWQsIHNpbmNlDQokXGZyYWN7XHBhcnRpYWxeMiBcZWxsfXtccGFydGlhbCBhIFxwYXJ0aWFsIGJ9ID0gXGZyYWN7XHBhcnRpYWxeMiBcZWxsfXtccGFydGlhbCBiIFxwYXJ0aWFsIGF9JC4NClRoZSBkaWFnb25hbCBlbnRyaWVzIHJlcHJlc2VudCB0aGUgY3VydmF0dXJlIG9mIHRoZSBsb2ctbGlrZWxpaG9vZCB3aXRoIHJlc3BlY3QgdG8gZWFjaCBwYXJhbWV0ZXIgaW5kaXZpZHVhbGx5LCB3aGlsZSB0aGUgb2ZmLWRpYWdvbmFsIGVudHJpZXMgY2FwdHVyZSB0aGUgY3Jvc3MtcGFyYW1ldGVyIGN1cnZhdHVyZS4NCg0KDQojIyBQcm9ibGVtIEE0DQoNCiMjIyBNTEUgYW5kIE1NRSBvZiAkYSQgZm9yIHRoZSBQb3dlciBEaXN0cmlidXRpb24NCg0KV2hlbiAkYiA9IDEkLCB0aGUgS3VtYXJhc3dhbXkgZGlzdHJpYnV0aW9uIHJlZHVjZXMgdG8gdGhlIHBvd2VyIGRpc3RyaWJ1dGlvbg0Kd2l0aCBDREYgJEYoeCkgPSB4XmEkLCAkYSA+IDAkLCAkeCBcaW4gKDAsMSkkLg0KDQojIyMgTWF4aW11bSBMaWtlbGlob29kIEVzdGltYXRvciAoTUxFKQ0KDQpTdWJzdGl0dXRpbmcgJGIgPSAxJCBpbnRvIHRoZSBsb2ctbGlrZWxpaG9vZCBkZXJpdmVkIGluIFByb2JsZW0gQTIsIHRoZSBsYXN0DQp0ZXJtIHZhbmlzaGVzIHNpbmNlICQoYi0xKSA9IDAkLCBnaXZpbmc6DQoNCiQkXGVsbChhKSA9IG5cbG4gYSArIChhLTEpXHN1bV97aT0xfV57bn1cbG4geF9pJCQNCg0KVGFraW5nIHRoZSBmaXJzdCBkZXJpdmF0aXZlIGFuZCBzZXR0aW5nIGl0IGVxdWFsIHRvIHplcm86DQoNCiQkXGVsbCdfYShhKSA9IFxmcmFje259e2F9ICsgXHN1bV97aT0xfV57bn1cbG4geF9pID0gMCQkDQoNClNvbHZpbmcgZm9yICRhJDoNCg0KJCRcaGF0e2F9X3tNTEV9ID0gXGZyYWN7LW59e1xzdW1fe2k9MX1ee259XGxuIHhfaX0kJA0KDQpTaW5jZSAkMCA8IHhfaSA8IDEkLCBlYWNoICRcbG4geF9pIDwgMCQsIGVuc3VyaW5nICRcaGF0e2F9X3tNTEV9ID4gMCQgYXMgcmVxdWlyZWQuDQoNCiMjIyBNZXRob2Qgb2YgTW9tZW50cyBFc3RpbWF0b3IgKE1NRSkNCg0KVGhlICRrJC10aCB0aGVvcmV0aWNhbCBtb21lbnQgb2YgdGhlIHBvd2VyIGRpc3RyaWJ1dGlvbiBpczoNCg0KJCRFW1hea10gPSBcaW50XzBeMSB4XmsgRicoeClcLGR4ID0gXGludF8wXjEgeF5rIFxjZG90IGF4XnthLTF9XCxkeCA9IGFcaW50XzBeMSB4XntrK2EtMX1cLGR4ID0gXGZyYWN7YX17aythfSQkDQoNClNldHRpbmcgJGsgPSAxJCB0byBvYnRhaW4gdGhlIGZpcnN0IG1vbWVudDoNCg0KJCRFW1hdID0gXGZyYWN7YX17MSthfSQkDQoNCk1hdGNoaW5nIHRoaXMgdG8gdGhlIHNhbXBsZSBtZWFuICRcYmFye3h9JCBhbmQgc29sdmluZyBmb3IgJGEkOg0KDQokJFxmcmFje2F9ezErYX0gPSBcYmFye3h9IFxpbXBsaWVzIGEgPSBcYmFye3h9ICsgXGJhcnt4fWEgXGltcGxpZXMgYSgxLVxiYXJ7eH0pID0gXGJhcnt4fSQkDQoNCiQkXGhhdHthfV97TU1FfSA9IFxmcmFje1xiYXJ7eH19ezEtXGJhcnt4fX0kJA0KDQpCb3RoIGVzdGltYXRvcnMgaGF2ZSBjbG9zZWQtZm9ybSBleHByZXNzaW9ucywgbWFraW5nIHRoZW0gY29tcHV0YXRpb25hbGx5DQpzdHJhaWdodGZvcndhcmQgdG8gZXZhbHVhdGUuDQoNCg0KDQojIyBQcm9ibGVtIEE1DQoNCiMjIyBBc3ltcHRvdGljIChXYWxkKSBDb25maWRlbmNlIEludGVydmFsIGZvciAkYSQNCg0KIyMjIEZpc2hlciBJbmZvcm1hdGlvbiBmb3IgJGEkDQoNClVuZGVyIHRoZSBwb3dlciBkaXN0cmlidXRpb24gc2V0dGluZyAoJGIgPSAxJCksIHdlIGhhdmUgYSBzaW5nbGUgcGFyYW1ldGVyICRhJC4NCkZyb20gdGhlIHNlY29uZCBkZXJpdmF0aXZlIGRlcml2ZWQgaW4gUHJvYmxlbSBBMywgc2V0dGluZyAkYiA9IDEkIGNhdXNlcyB0aGUNCnNlY29uZCB0ZXJtIHRvIHZhbmlzaDoNCg0KJCRcZnJhY3tccGFydGlhbF4yIFxlbGx9e1xwYXJ0aWFsIGFeMn1cQmlnZ3xfe2I9MX0gPSAtXGZyYWN7bn17YV4yfSQkDQoNClRoZSBvYnNlcnZlZCBGaXNoZXIgSW5mb3JtYXRpb24gaXMgdGhlIG5lZ2F0aXZlIG9mIHRoaXMgc2Vjb25kIGRlcml2YXRpdmU6DQoNCiQkXG1hdGhjYWx7SX0oYSkgPSAtXGZyYWN7XHBhcnRpYWxeMiBcZWxsfXtccGFydGlhbCBhXjJ9ID0gXGZyYWN7bn17YV4yfSQkDQoNCiMjIyBBc3ltcHRvdGljIFZhcmlhbmNlDQoNCkJ5IHRoZSBhc3ltcHRvdGljIHRoZW9yeSBvZiBNTEVzLCB0aGUgYXN5bXB0b3RpYyB2YXJpYW5jZSBvZiAkXGhhdHthfV97TUxFfSQNCmlzIHRoZSByZWNpcHJvY2FsIG9mIHRoZSBGaXNoZXIgSW5mb3JtYXRpb246DQoNCiQkVmFyKFxoYXR7YX1fe01MRX0pID0gXGZyYWN7MX17XG1hdGhjYWx7SX0oYSl9ID0gXGZyYWN7YV4yfXtufSQkDQoNCkluIHByYWN0aWNlLCB3ZSBzdWJzdGl0dXRlICRcaGF0e2F9X3tNTEV9JCBmb3IgdGhlIHVua25vd24gJGEkOg0KDQokJFx3aWRlaGF0e1Zhcn0oXGhhdHthfV97TUxFfSkgPSBcZnJhY3tcaGF0e2F9X3tNTEV9XjJ9e259JCQNCg0KIyMjIFdhbGQgQ29uZmlkZW5jZSBJbnRlcnZhbA0KDQpCeSB0aGUgYXN5bXB0b3RpYyBub3JtYWxpdHkgb2YgdGhlIE1MRSwgdGhlICQ5NVwlJCBXYWxkIGNvbmZpZGVuY2UgaW50ZXJ2YWwNCmZvciAkYSQgaXM6DQoNCiQkXGhhdHthfV97TUxFfSBccG0gel97XGFscGhhLzJ9IFxjZG90IFxzcXJ0e1x3aWRlaGF0e1Zhcn0oXGhhdHthfV97TUxFfSl9JCQNCg0KU3Vic3RpdHV0aW5nIHRoZSBlc3RpbWF0ZWQgdmFyaWFuY2U6DQoNCiQkXGhhdHthfV97TUxFfSBccG0gel97XGFscGhhLzJ9IFxjZG90IFxmcmFje1xoYXR7YX1fe01MRX19e1xzcXJ0e259fSQkDQoNCndoZXJlICR6X3tcYWxwaGEvMn0gPSAxLjk2JCBmb3IgYSAkOTVcJSQgY29uZmlkZW5jZSBsZXZlbC4gVGhpcyBpbnRlcnZhbCBpcw0KdmFsaWQgYXN5bXB0b3RpY2FsbHksIHJlbHlpbmcgb24gdGhlIE1MRSBiZWluZyBhcHByb3hpbWF0ZWx5IG5vcm1hbGx5DQpkaXN0cmlidXRlZCBmb3IgbGFyZ2UgJG4kLg0KDQoNCg0KIyMgUHJvYmxlbSBBNg0KDQojIyMgTGlrZWxpaG9vZCBSYXRpbyBUZXN0IFN0YXRpc3RpYyBmb3IgJEhfMDogYSA9IDEkDQoNClRoZSBsaWtlbGlob29kIHJhdGlvIHRlc3Qgc3RhdGlzdGljIGlzIGRlZmluZWQgYXM6DQoNCiQkXExhbWJkYSA9IDJcbGVmdFtcZWxsKFxoYXR7YX0pIC0gXGVsbChhXzApXHJpZ2h0XSQkDQoNCndoZXJlICRcaGF0e2F9X3tNTEV9JCBpcyB0aGUgdW5yZXN0cmljdGVkIE1MRSBkZXJpdmVkIGluIFByb2JsZW0gQTQsIGFuZA0KJGFfMCA9IDEkIGlzIHRoZSByZXN0cmljdGVkIHZhbHVlIHVuZGVyICRIXzAkLg0KDQojIyMgTG9nLWxpa2VsaWhvb2QgYXQgJFxoYXR7YX1fe01MRX0kDQoNCkxldCAkUyA9IFxzdW1fe2k9MX1ee259XGxuIHhfaSQgZm9yIG5vdGF0aW9uYWwgY29udmVuaWVuY2UuIFN1YnN0aXR1dGluZw0KJFxoYXR7YX1fe01MRX0gPSBcZnJhY3stbn17U30kIGludG8gdGhlIGxvZy1saWtlbGlob29kOg0KDQokJFxlbGwoXGhhdHthfSkgPSBuXGxuXGxlZnQoXGZyYWN7LW59e1N9XHJpZ2h0KSArIFxsZWZ0KFxmcmFjey1ufXtTfSAtIDFccmlnaHQpUyA9IG5cbG5cbGVmdChcZnJhY3stbn17U31ccmlnaHQpIC0gbiAtIFMkJA0KDQojIyMgTG9nLWxpa2VsaWhvb2QgYXQgJGFfMCA9IDEkDQoNCiQkXGVsbCgxKSA9IG5cbG4oMSkgKyAoMS0xKVxzdW1fe2k9MX1ee259XGxuIHhfaSA9IDAkJA0KDQojIyMgTFJUIFN0YXRpc3RpYw0KDQpTdWJzdGl0dXRpbmcgYm90aCB2YWx1ZXM6DQoNCiQkXExhbWJkYSA9IDJcbGVmdFtuXGxuXGxlZnQoXGZyYWN7LW59e1N9XHJpZ2h0KSAtIG4gLSBTXHJpZ2h0XSQkDQoNCndoZXJlICRTID0gXHN1bV97aT0xfV57bn1cbG4geF9pJC4gQXQgYSBzaWduaWZpY2FuY2UgbGV2ZWwgb2YgJFxhbHBoYSA9IDAuMDUkLA0KdGhlIGNyaXRpY2FsIHZhbHVlIGZyb20gdGhlICRcY2hpXjJfMSQgZGlzdHJpYnV0aW9uIGlzICRcY2hpXjJfezEsXCwgMC4wNX0gPSAzLjg0MSQsDQpzbyB3ZSBjb21wYXJlICRcTGFtYmRhJCBhZ2FpbnN0IHRoaXMgdmFsdWUuDQoNCg0KIyBQcm9ibGVtIEINCg0KIyMgUHJvYmxlbSBCMQ0KDQojIyMgRml0dGluZyB0aGUgS3VtYXJhc3dhbXkgRGlzdHJpYnV0aW9uIHZpYSBNTEUNCg0KRnJvbSBQcm9ibGVtIEEyLCB0aGUgbG9nLWxpa2VsaWhvb2QgZnVuY3Rpb24gZm9yIHRoZSBLdW1hcmFzd2FteSBkaXN0cmlidXRpb24gaXM6DQoNCiQkXGVsbChhLCBiKSA9IG5cbG4gYSArIG5cbG4gYiArIChhLTEpXHN1bV97aT0xfV57bn1cbG4geF9pICsgKGItMSlcc3VtX3tpPTF9XntufVxsbigxIC0geF9pXmEpJCQNCg0Kd2l0aCBncmFkaWVudCB2ZWN0b3I6DQoNCiQkXGVsbCdfYShhLCBiKSA9IFxmcmFje259e2F9ICsgXHN1bV97aT0xfV57bn1cbG4geF9pIC0gKGItMSlcc3VtX3tpPTF9XntufVxmcmFje3hfaV5hIFxsbiB4X2l9ezEgLSB4X2leYX0kJA0KDQokJFxlbGwnX2IoYSwgYikgPSBcZnJhY3tufXtifSArIFxzdW1fe2k9MX1ee259XGxuKDEgLSB4X2leYSkkJA0KDQpXZSB1c2UgYG9wdGltKClgIGluIFIgdG8gbnVtZXJpY2FsbHkgbWF4aW1pemUgdGhlIGxvZy1saWtlbGlob29kLCBzdXBwbHlpbmcNCnRoZSBncmFkaWVudCB2ZWN0b3IgdG8gaW1wcm92ZSBvcHRpbWl6YXRpb24gYWNjdXJhY3kuDQoNCmBgYHtyIGIxLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFfQ0KIyBEYXRhOiBkYWlseSBwcm9wb3J0aW9uIG9mIHVzYWJsZSByZXNlcnZvaXIgc3RvcmFnZSBvdmVyIDUwIGRheXMNCnggPC0gYygwLjEyLCAwLjE0LCAwLjE1LCAwLjE2LCAwLjE3LCAwLjE4LCAwLjE5LCAwLjIwLCAwLjIxLCAwLjIyLA0KICAgICAgIDAuMjMsIDAuMjQsIDAuMjUsIDAuMjYsIDAuMjcsIDAuMjgsIDAuMjksIDAuMzAsIDAuMzEsIDAuMzIsDQogICAgICAgMC4zMywgMC4zNCwgMC4zNSwgMC4zNiwgMC4zNywgMC4zOCwgMC4zOSwgMC40MCwgMC40MSwgMC40MiwNCiAgICAgICAwLjQzLCAwLjQ0LCAwLjQ1LCAwLjQ2LCAwLjQ3LCAwLjQ4LCAwLjQ5LCAwLjUwLCAwLjUxLCAwLjUyLA0KICAgICAgIDAuNTMsIDAuNTQsIDAuNTUsIDAuNTYsIDAuNTcsIDAuNTgsIDAuNTksIDAuNjAsIDAuNjEsIDAuNzgpDQoNCm4gPC0gbGVuZ3RoKHgpDQoNCiMgTG9nLWxpa2VsaWhvb2QgZnVuY3Rpb24gZm9yIHRoZSBLdW1hcmFzd2FteSBkaXN0cmlidXRpb24gKGZyb20gUHJvYmxlbSBBMikNCmt1bWFfbG9nbGlrIDwtIGZ1bmN0aW9uKHBhcmFtcykgew0KICBhIDwtIHBhcmFtc1sxXQ0KICBiIDwtIHBhcmFtc1syXQ0KICANCiAgIyBSZXR1cm4gYSBsYXJnZSBwZW5hbHR5IGlmIHBhcmFtZXRlcnMgYXJlIG5vbi1wb3NpdGl2ZQ0KICBpZiAoYSA8PSAwIHwgYiA8PSAwKSByZXR1cm4oMWUxMCkNCiAgDQogICMgTG9nLWxpa2VsaWhvb2QgY29tcG9uZW50cw0KICBsbCA8LSBuICogbG9nKGEpICsgbiAqIGxvZyhiKSArDQogICAgICAgIChhIC0gMSkgKiBzdW0obG9nKHgpKSArDQogICAgICAgIChiIC0gMSkgKiBzdW0obG9nKDEgLSB4XmEpKQ0KICANCiAgcmV0dXJuKC1sbCkgICMgTmVnYXRpdmUgYmVjYXVzZSBvcHRpbSgpIG1pbmltaXplcw0KfQ0KDQojIEdyYWRpZW50IHZlY3RvciAoZnJvbSBQcm9ibGVtIEEyKSDigJQgc3VwcGxpZWQgdG8gb3B0aW0oKSBmb3IgYWNjdXJhY3kNCmt1bWFfZ3JhZCA8LSBmdW5jdGlvbihwYXJhbXMpIHsNCiAgYSA8LSBwYXJhbXNbMV0NCiAgYiA8LSBwYXJhbXNbMl0NCiAgDQogICMgUGFydGlhbCBkZXJpdmF0aXZlIHdpdGggcmVzcGVjdCB0byBhDQogIGRsX2RhIDwtIG4vYSArIHN1bShsb2coeCkpIC0gKGIgLSAxKSAqIHN1bSgoeF5hICogbG9nKHgpKSAvICgxIC0geF5hKSkNCiAgDQogICMgUGFydGlhbCBkZXJpdmF0aXZlIHdpdGggcmVzcGVjdCB0byBiDQogIGRsX2RiIDwtIG4vYiArIHN1bShsb2coMSAtIHheYSkpDQogIA0KICAjIFJldHVybiBuZWdhdGl2ZSBncmFkaWVudCBzaW5jZSB3ZSBhcmUgbWluaW1pemluZw0KICByZXR1cm4oYygtZGxfZGEsIC1kbF9kYikpDQp9DQoNCiMgT3B0aW1pemUgdXNpbmcgQkZHUyBtZXRob2Qgd2l0aCBncmFkaWVudCBzdXBwbGllZA0KIyBJbml0aWFsIHZhbHVlcyBzZXQgdG8gMSAodW5pZm9ybSBkaXN0cmlidXRpb24gc3RhcnRpbmcgcG9pbnQpDQpmaXQgPC0gb3B0aW0ocGFyID0gYygxLCAxKSwNCiAgICAgICAgICAgICBmbiAgPSBrdW1hX2xvZ2xpaywNCiAgICAgICAgICAgICBnciAgPSBrdW1hX2dyYWQsDQogICAgICAgICAgICAgbWV0aG9kID0gIkJGR1MiKQ0KDQojIEV4dHJhY3QgTUxFcw0KYV9oYXQgPC0gZml0JHBhclsxXQ0KYl9oYXQgPC0gZml0JHBhclsyXQ0KDQpjYXQoIk1MRSBvZiBhOiIsIHJvdW5kKGFfaGF0LCA0KSwgIlxuIikNCmNhdCgiTUxFIG9mIGI6Iiwgcm91bmQoYl9oYXQsIDQpLCAiXG4iKQ0KYGBgDQoNCg0KIyMgUHJvYmxlbSBCMg0KDQojIyMgTGlrZWxpaG9vZCBSYXRpbyBUZXN0IGZvciAkSF8wOiBiID0gMSQNCg0KV2UgdGVzdCB3aGV0aGVyIHRoZSBwb3dlciBkaXN0cmlidXRpb24gKCRiID0gMSQpIGlzIHN1ZmZpY2llbnQgdG8gZGVzY3JpYmUNCnRoZSBkYXRhIGFnYWluc3QgdGhlIGZ1bGwgS3VtYXJhc3dhbXkgZGlzdHJpYnV0aW9uIHVzaW5nIHRoZSBMUlQgYXQNCnNpZ25pZmljYW5jZSBsZXZlbCAkXGFscGhhID0gMC4wNSQ6DQoNCiQkSF8wOiBiID0gMSBccXVhZCBcdGV4dHt2ZXJzdXN9IFxxdWFkIEhfYTogYiBcbmVxIDEkJA0KDQpUaGUgTFJUIHN0YXRpc3RpYyBjb21wYXJlcyB0aGUgbG9nLWxpa2VsaWhvb2Qgb2YgdGhlIHVucmVzdHJpY3RlZCBLdW1hcmFzd2FteQ0KbW9kZWwgKGZyb20gUHJvYmxlbSBCMSkgYWdhaW5zdCB0aGUgcmVzdHJpY3RlZCBwb3dlciBkaXN0cmlidXRpb24gbW9kZWwNCih1c2luZyAkXGhhdHthfV97TUxFfSQgZnJvbSBQcm9ibGVtIEE0KToNCg0KJCRcTGFtYmRhID0gMlxsZWZ0W1xlbGwoXGhhdHthfSwgXGhhdHtifSkgLSBcZWxsKFxoYXR7YX1fe3Bvd2VyfSwgMSlccmlnaHRdJCQNCg0KVW5kZXIgJEhfMCQsICRcTGFtYmRhIFxvdmVyc2V0e2R9e1x0b30gXGNoaV4yXzEkLiBXZSByZWplY3QgJEhfMCQgYXQNCiRcYWxwaGEgPSAwLjA1JCBpZiAkXExhbWJkYSA+IFxjaGleMl97MSxcLCAwLjA1fSA9IDMuODQxJC4NCg0KYGBge3IgYjIsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0V9DQojIERhdGEgYWxyZWFkeSBkZWZpbmVkIGluIFByb2JsZW0gQjENCg0KIyAtLS0tLS0tIFVucmVzdHJpY3RlZCBNb2RlbCAoRnVsbCBLdW1hcmFzd2FteSBmcm9tIEIxKSAtLS0tLS0tDQojIExvZy1saWtlbGlob29kIGF0IE1MRXMgZnJvbSBCMQ0KbGxfdW5yZXN0cmljdGVkIDwtIC1maXQkdmFsdWUgICMgb3B0aW0oKSByZXR1cm5zIHRoZSBtaW5pbWl6ZWQgbmVnYXRpdmUgbG9nLWxpa2VsaWhvb2QNCg0KIyAtLS0tLS0tIFJlc3RyaWN0ZWQgTW9kZWwgKFBvd2VyIERpc3RyaWJ1dGlvbiwgYiA9IDEpIC0tLS0tLS0NCiMgTUxFIG9mIGEgZm9yIHBvd2VyIGRpc3RyaWJ1dGlvbiBmcm9tIFByb2JsZW0gQTQNCmFfaGF0X3Bvd2VyIDwtIC1uIC8gc3VtKGxvZyh4KSkNCg0KIyBMb2ctbGlrZWxpaG9vZCBmb3IgcG93ZXIgZGlzdHJpYnV0aW9uIGF0IGFfaGF0X3Bvd2VyDQpsbF9yZXN0cmljdGVkIDwtIG4gKiBsb2coYV9oYXRfcG93ZXIpICsgKGFfaGF0X3Bvd2VyIC0gMSkgKiBzdW0obG9nKHgpKQ0KDQojIC0tLS0tLS0gTFJUIFN0YXRpc3RpYyAtLS0tLS0tDQpMYW1iZGEgPC0gMiAqIChsbF91bnJlc3RyaWN0ZWQgLSBsbF9yZXN0cmljdGVkKQ0KDQojIC0tLS0tLS0gQ3JpdGljYWwgVmFsdWUgYW5kIERlY2lzaW9uIC0tLS0tLS0NCmNyaXRpY2FsX3ZhbHVlIDwtIHFjaGlzcSgwLjk1LCBkZiA9IDEpICAjIGNoaS1zcXVhcmVkIGNyaXRpY2FsIHZhbHVlIGF0IGFscGhhID0gMC4wNQ0KDQpjYXQoIkxvZy1saWtlbGlob29kIChVbnJlc3RyaWN0ZWQpOiIsIHJvdW5kKGxsX3VucmVzdHJpY3RlZCwgNCksICJcbiIpDQpjYXQoIkxvZy1saWtlbGlob29kIChSZXN0cmljdGVkKSAgOiIsIHJvdW5kKGxsX3Jlc3RyaWN0ZWQsIDQpLCAiXG4iKQ0KY2F0KCJMUlQgU3RhdGlzdGljIChMYW1iZGEpICAgICAgIDoiLCByb3VuZChMYW1iZGEsIDQpLCAiXG4iKQ0KY2F0KCJDcml0aWNhbCBWYWx1ZSAoY2hpXjJfMSwwLjA1KToiLCByb3VuZChjcml0aWNhbF92YWx1ZSwgNCksICJcbiIpDQpjYXQoIkRlY2lzaW9uOiAiLCBpZmVsc2UoTGFtYmRhID4gY3JpdGljYWxfdmFsdWUsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICJSZWplY3QgSDAgLSBkYXRhIGZhdm91cnMgZnVsbCBLdW1hcmFzd2FteSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICJGYWlsIHRvIHJlamVjdCBIMCAtIHBvd2VyIGRpc3RyaWJ1dGlvbiBpcyBzdWZmaWNpZW50IiksICJcbiIpDQpgYGANCg0KIyMjIFN0YXRpc3RpY2FsIERlY2lzaW9uIGFuZCBQcmFjdGljYWwgSW1wbGljYXRpb24NCg0KQXQgJFxhbHBoYSA9IDAuMDUkLCB3ZSBjb21wYXJlICRcTGFtYmRhJCB0byB0aGUgY3JpdGljYWwgdmFsdWUNCiRcY2hpXjJfezEsXCwgMC4wNX0gPSAzLjg0MSQuIElmICRcTGFtYmRhID4gMy44NDEkLCB3ZSByZWplY3QgJEhfMCQsDQpjb25jbHVkaW5nIHRoYXQgJGIgXG5lcSAxJCBhbmQgdGhlIGZ1bGwgS3VtYXJhc3dhbXkgZGlzdHJpYnV0aW9uIHByb3ZpZGVzDQphIHNpZ25pZmljYW50bHkgYmV0dGVyIGZpdCB0aGFuIHRoZSBwb3dlciBkaXN0cmlidXRpb24uIFByYWN0aWNhbGx5LCB0aGlzDQp3b3VsZCBtZWFuIHRoYXQgdGhlIHJlc2Vydm9pciBzdG9yYWdlIGRhdGEgaGFzIGEgbW9yZSBjb21wbGV4IHNoYXBlIHRoYW4NCndoYXQgdGhlIHNpbXBsZXIgcG93ZXIgZGlzdHJpYnV0aW9uIGNhbiBjYXB0dXJlLCByZXF1aXJpbmcgYm90aCBzaGFwZQ0KcGFyYW1ldGVycyAkYSQgYW5kICRiJCB0byBhZGVxdWF0ZWx5IG1vZGVsIHRoZSBkYWlseSBzdG9yYWdlIHByb3BvcnRpb25zDQpkdXJpbmcgdGhlIGRyeSBzZWFzb24uDQoNCg0KDQojIyBQcm9ibGVtIEIzDQoNCiMjIyBCb290c3RyYXAgYW5kIFdhbGQgSW5mZXJlbmNlIGZvciAkXGhhdHthfSQgYW5kICRcaGF0e2J9JA0KDQojIyMgUGFydCAoMSk6IEJvb3RzdHJhcCBTYW1wbGluZyBEaXN0cmlidXRpb25zDQoNCldlIG9idGFpbiB0aGUgYm9vdHN0cmFwIHNhbXBsaW5nIGRpc3RyaWJ1dGlvbnMgb2YgJFxoYXR7YX0kIGFuZCAkXGhhdHtifSQgYnkNCnJlc2FtcGxpbmcgdGhlIGRhdGEgd2l0aCByZXBsYWNlbWVudCAkQiA9IDEwMDAkIHRpbWVzLCByZWZpdHRpbmcgdGhlDQpLdW1hcmFzd2FteSBkaXN0cmlidXRpb24gZWFjaCB0aW1lIHVzaW5nIHRoZSBzYW1lIGBvcHRpbSgpYCBwcm9jZWR1cmUgZnJvbQ0KUHJvYmxlbSBCMSwgYW5kIHBsb3R0aW5nIHRoZSByZXN1bHRpbmcgZGlzdHJpYnV0aW9ucyB1c2luZyBHYXVzc2lhbiBrZXJuZWwNCmRlbnNpdHkgY3VydmVzLg0KDQpgYGB7ciBiM19wYXJ0MSwgd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRX0NCnNldC5zZWVkKDEyMykgICMgRm9yIHJlcHJvZHVjaWJpbGl0eQ0KDQpCIDwtIDEwMDAgICMgTnVtYmVyIG9mIGJvb3RzdHJhcCByZXNhbXBsZXMNCg0KIyBTdG9yZSBib290c3RyYXAgZXN0aW1hdGVzDQpib290X2EgPC0gbnVtZXJpYyhCKQ0KYm9vdF9iIDwtIG51bWVyaWMoQikNCg0KZm9yIChpIGluIDE6Qikgew0KICAjIFJlc2FtcGxlIGRhdGEgd2l0aCByZXBsYWNlbWVudA0KICB4X2Jvb3QgPC0gc2FtcGxlKHgsIHNpemUgPSBuLCByZXBsYWNlID0gVFJVRSkNCiAgDQogICMgTmVnYXRpdmUgbG9nLWxpa2VsaWhvb2QgZm9yIGJvb3RzdHJhcCBzYW1wbGUNCiAga3VtYV9sb2dsaWtfYm9vdCA8LSBmdW5jdGlvbihwYXJhbXMpIHsNCiAgICBhIDwtIHBhcmFtc1sxXQ0KICAgIGIgPC0gcGFyYW1zWzJdDQogICAgaWYgKGEgPD0gMCB8IGIgPD0gMCkgcmV0dXJuKDFlMTApDQogICAgbGwgPC0gbiAqIGxvZyhhKSArIG4gKiBsb2coYikgKw0KICAgICAgICAgIChhIC0gMSkgKiBzdW0obG9nKHhfYm9vdCkpICsNCiAgICAgICAgICAoYiAtIDEpICogc3VtKGxvZygxIC0geF9ib290XmEpKQ0KICAgIHJldHVybigtbGwpDQogIH0NCiAgDQogICMgR3JhZGllbnQgZm9yIGJvb3RzdHJhcCBzYW1wbGUNCiAga3VtYV9ncmFkX2Jvb3QgPC0gZnVuY3Rpb24ocGFyYW1zKSB7DQogICAgYSA8LSBwYXJhbXNbMV0NCiAgICBiIDwtIHBhcmFtc1syXQ0KICAgIGRsX2RhIDwtIG4vYSArIHN1bShsb2coeF9ib290KSkgLSANCiAgICAgICAgICAgICAoYiAtIDEpICogc3VtKCh4X2Jvb3ReYSAqIGxvZyh4X2Jvb3QpKSAvICgxIC0geF9ib290XmEpKQ0KICAgIGRsX2RiIDwtIG4vYiArIHN1bShsb2coMSAtIHhfYm9vdF5hKSkNCiAgICByZXR1cm4oYygtZGxfZGEsIC1kbF9kYikpDQogIH0NCiAgDQogICMgRml0IG1vZGVsIHRvIGJvb3RzdHJhcCBzYW1wbGUNCiAgZml0X2Jvb3QgPC0gdHJ5Q2F0Y2goDQogICAgb3B0aW0ocGFyID0gYyhhX2hhdCwgYl9oYXQpLCAgICMgVXNlIG9yaWdpbmFsIE1MRXMgYXMgc3RhcnRpbmcgdmFsdWVzDQogICAgICAgICAgZm4gID0ga3VtYV9sb2dsaWtfYm9vdCwNCiAgICAgICAgICBnciAgPSBrdW1hX2dyYWRfYm9vdCwNCiAgICAgICAgICBtZXRob2QgPSAiQkZHUyIpLA0KICAgIGVycm9yID0gZnVuY3Rpb24oZSkgTlVMTA0KICApDQogIA0KICAjIFN0b3JlIGVzdGltYXRlcyBpZiBvcHRpbWl6YXRpb24gY29udmVyZ2VkDQogIGlmICghaXMubnVsbChmaXRfYm9vdCkgJiYgZml0X2Jvb3QkY29udmVyZ2VuY2UgPT0gMCkgew0KICAgIGJvb3RfYVtpXSA8LSBmaXRfYm9vdCRwYXJbMV0NCiAgICBib290X2JbaV0gPC0gZml0X2Jvb3QkcGFyWzJdDQogIH0gZWxzZSB7DQogICAgYm9vdF9hW2ldIDwtIE5BDQogICAgYm9vdF9iW2ldIDwtIE5BDQogIH0NCn0NCg0KIyBSZW1vdmUgYW55IGZhaWxlZCBpdGVyYXRpb25zDQpib290X2EgPC0gYm9vdF9hWyFpcy5uYShib290X2EpXQ0KYm9vdF9iIDwtIGJvb3RfYlshaXMubmEoYm9vdF9iKV0NCg0KIyAtLS0tIFBsb3QgMTogQm9vdHN0cmFwIGRpc3RyaWJ1dGlvbiBvZiBhX2hhdCAtLS0tDQpwbG90KGRlbnNpdHkoYm9vdF9hLCBrZXJuZWwgPSAiZ2F1c3NpYW4iKSwNCiAgICAgbWFpbiA9IGV4cHJlc3Npb24oIkJvb3RzdHJhcCBTYW1wbGluZyBEaXN0cmlidXRpb24gb2YgIiAqIGhhdChhKSksDQogICAgIHhsYWIgPSBleHByZXNzaW9uKGhhdChhKSksDQogICAgIHlsYWIgPSAiRGVuc2l0eSIsDQogICAgIGNvbCAgPSAic3RlZWxibHVlIiwNCiAgICAgbHdkICA9IDMsDQogICAgIGNleC5tYWluID0gMS41LA0KICAgICBjZXgubGFiICA9IDEuMywNCiAgICAgY2V4LmF4aXMgPSAxLjIpDQphYmxpbmUodiA9IGFfaGF0LCBjb2wgPSAicmVkIiwgbHR5ID0gMiwgbHdkID0gMikgICMgT3JpZ2luYWwgTUxFDQpsZWdlbmQoInRvcHJpZ2h0IiwgDQogICAgICAgbGVnZW5kID0gYygiR2F1c3NpYW4gS0RFIiwgIk1MRSIpLCANCiAgICAgICBjb2wgICAgPSBjKCJzdGVlbGJsdWUiLCAicmVkIiksIA0KICAgICAgIGx0eSAgICA9IGMoMSwgMiksIA0KICAgICAgIGx3ZCAgICA9IDIsDQogICAgICAgY2V4ICAgID0gMS4yKQ0KDQojIC0tLS0gUGxvdCAyOiBCb290c3RyYXAgZGlzdHJpYnV0aW9uIG9mIGJfaGF0IC0tLS0NCnBsb3QoZGVuc2l0eShib290X2IsIGtlcm5lbCA9ICJnYXVzc2lhbiIpLA0KICAgICBtYWluID0gZXhwcmVzc2lvbigiQm9vdHN0cmFwIFNhbXBsaW5nIERpc3RyaWJ1dGlvbiBvZiAiICogaGF0KGIpKSwNCiAgICAgeGxhYiA9IGV4cHJlc3Npb24oaGF0KGIpKSwNCiAgICAgeWxhYiA9ICJEZW5zaXR5IiwNCiAgICAgY29sICA9ICJkYXJrZ3JlZW4iLA0KICAgICBsd2QgID0gMywNCiAgICAgY2V4Lm1haW4gPSAxLjUsDQogICAgIGNleC5sYWIgID0gMS4zLA0KICAgICBjZXguYXhpcyA9IDEuMikNCmFibGluZSh2ID0gYl9oYXQsIGNvbCA9ICJyZWQiLCBsdHkgPSAyLCBsd2QgPSAyKSAgIyBPcmlnaW5hbCBNTEUNCmxlZ2VuZCgidG9wcmlnaHQiLCANCiAgICAgICBsZWdlbmQgPSBjKCJHYXVzc2lhbiBLREUiLCAiTUxFIiksIA0KICAgICAgIGNvbCAgICA9IGMoImRhcmtncmVlbiIsICJyZWQiKSwgDQogICAgICAgbHR5ICAgID0gYygxLCAyKSwgDQogICAgICAgbHdkICAgID0gMiwNCiAgICAgICBjZXggICAgPSAxLjIpDQpgYGANCg0KIyMjIFBhcnQgKDIpOiBCb290c3RyYXAgQ0kgYW5kIFdhbGQgQ0kgZm9yICRiJA0KDQpUaGUgJDk1XCUkIGJvb3RzdHJhcCBjb25maWRlbmNlIGludGVydmFsIGZvciAkYiQgaXMgb2J0YWluZWQgYnkgdGFraW5nIHRoZQ0KJDIuNSR0aCBhbmQgJDk3LjUkdGggcGVyY2VudGlsZXMgb2YgdGhlIGJvb3RzdHJhcCBkaXN0cmlidXRpb24gb2YgJFxoYXR7Yn0kLg0KDQpUaGUgV2FsZCBDSSByZXF1aXJlcyB0aGUgc3RhbmRhcmQgZXJyb3Igb2YgJFxoYXR7Yn0kLCBvYnRhaW5lZCBmcm9tIHRoZQ0KaW52ZXJzZSBvZiB0aGUgb2JzZXJ2ZWQgRmlzaGVyIEluZm9ybWF0aW9uIG1hdHJpeCAoaS5lLiwgdGhlIGludmVyc2Ugb2YgdGhlDQpuZWdhdGl2ZSBIZXNzaWFuIHJldHVybmVkIGJ5IGBvcHRpbSgpYCkuDQoNCmBgYHtyIGIzX3BhcnQyLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFfQ0KIyAtLS0tLS0tIEJvb3RzdHJhcCBDSSBmb3IgYiAtLS0tLS0tDQpib290X2NpX2IgPC0gcXVhbnRpbGUoYm9vdF9iLCBwcm9icyA9IGMoMC4wMjUsIDAuOTc1KSkNCmNhdCgiOTUlIEJvb3RzdHJhcCBDSSBmb3IgYjogWyIsIHJvdW5kKGJvb3RfY2lfYlsxXSwgNCksIA0KICAgICIsIiwgcm91bmQoYm9vdF9jaV9iWzJdLCA0KSwgIl1cbiIpDQoNCiMgLS0tLS0tLSBXYWxkIENJIGZvciBiIC0tLS0tLS0NCiMgVGhlIG9ic2VydmVkIEZpc2hlciBJbmZvcm1hdGlvbiBtYXRyaXggaXMgdGhlIGludmVyc2Ugb2YgdGhlIG5lZ2F0aXZlIEhlc3NpYW4NCiMgb3B0aW0oKSB3aXRoIGhlc3NpYW4gPSBUUlVFIHJldHVybnMgdGhlIEhlc3NpYW4gb2YgdGhlIG9iamVjdGl2ZSBmdW5jdGlvbg0KIyAobmVnYXRpdmUgbG9nLWxpa2VsaWhvb2QpLCBzbyBpdCBpcyBhbHJlYWR5IHRoZSBuZWdhdGl2ZSBIZXNzaWFuIG9mIHRoZSBsb2ctbGlrZWxpaG9vZA0KDQpmaXRfaGVzcyA8LSBvcHRpbShwYXIgICAgID0gYyhhX2hhdCwgYl9oYXQpLA0KICAgICAgICAgICAgICAgICAgZm4gICAgICA9IGt1bWFfbG9nbGlrLA0KICAgICAgICAgICAgICAgICAgZ3IgICAgICA9IGt1bWFfZ3JhZCwNCiAgICAgICAgICAgICAgICAgIG1ldGhvZCAgPSAiQkZHUyIsDQogICAgICAgICAgICAgICAgICBoZXNzaWFuID0gVFJVRSkNCg0KIyBWYXJpYW5jZS1jb3ZhcmlhbmNlIG1hdHJpeCBpcyB0aGUgaW52ZXJzZSBvZiB0aGUgSGVzc2lhbg0KdmNvdl9tYXRyaXggPC0gc29sdmUoZml0X2hlc3MkaGVzc2lhbikNCg0KIyBTdGFuZGFyZCBlcnJvciBvZiBiX2hhdCBpcyB0aGUgc3F1YXJlIHJvb3Qgb2YgdGhlICgyLDIpIGVudHJ5DQpzZV9iIDwtIHNxcnQodmNvdl9tYXRyaXhbMiwgMl0pDQoNCiMgOTUlIFdhbGQgQ0kgZm9yIGINCndhbGRfY2lfYiA8LSBjKGJfaGF0IC0gMS45NiAqIHNlX2IsIGJfaGF0ICsgMS45NiAqIHNlX2IpDQpjYXQoIjk1JSBXYWxkIENJIGZvciBiICAgICA6IFsiLCByb3VuZCh3YWxkX2NpX2JbMV0sIDQpLCANCiAgICAiLCIsIHJvdW5kKHdhbGRfY2lfYlsyXSwgNCksICJdXG4iKQ0KDQojIENvbXBhcmUgd2l0aCBCMiByZXN1bHQgLSBkb2VzIHRoZSBDSSBjb250YWluIDE/DQpjYXQoIkJvb3RzdHJhcCBDSSBjb250YWlucyAxOiIsIGJvb3RfY2lfYlsxXSA8PSAxICYgMSA8PSBib290X2NpX2JbMl0sICJcbiIpDQpjYXQoIldhbGQgQ0kgY29udGFpbnMgMSAgICAgOiIsIHdhbGRfY2lfYlsxXSA8PSAxICYgMSA8PSB3YWxkX2NpX2JbMl0sICJcbiIpDQpgYGANCg0KIyMjIFBhcnQgKDMpOiBWYWxpZGl0eSBvZiB0aGUgV2FsZCBDb25maWRlbmNlIEludGVydmFsDQoNClRoZSBXYWxkIGNvbmZpZGVuY2UgaW50ZXJ2YWwgZm9yICRiJCBjb25zdHJ1Y3RlZCBpbiBQYXJ0ICgyKSByZWxpZXMgb24gdGhlDQphc3N1bXB0aW9uIHRoYXQgJFxoYXR7Yn0kIGlzIGFwcHJveGltYXRlbHkgbm9ybWFsbHkgZGlzdHJpYnV0ZWQuIFdlIGNhbg0KYXNzZXNzIHRoaXMgYXNzdW1wdGlvbiBieSBleGFtaW5pbmcgdGhlIHNoYXBlIG9mIHRoZSBib290c3RyYXAgc2FtcGxpbmcNCmRpc3RyaWJ1dGlvbiBvZiAkXGhhdHtifSQgZnJvbSBQYXJ0ICgxKS4NCg0KVGhlIGJvb3RzdHJhcCBkaXN0cmlidXRpb24gb2YgJFxoYXR7Yn0kIGlzIGNsZWFybHkgcmlnaHQtc2tld2VkLCB3aXRoIGEgbG9uZw0KdGFpbCBleHRlbmRpbmcgd2VsbCBiZXlvbmQgdGhlIGJ1bGsgb2YgdGhlIGRpc3RyaWJ1dGlvbi4gVGhpcyBkZXBhcnR1cmUgZnJvbQ0Kbm9ybWFsaXR5IHN1Z2dlc3RzIHRoYXQgdGhlIFdhbGQgQ0kgZm9yICRiJCBpcyAqKm5vdCB3ZWxsIHN1cHBvcnRlZCoqLCBhbmQNCnRoZSBib290c3RyYXAgY29uZmlkZW5jZSBpbnRlcnZhbCB3b3VsZCBiZSB0aGUgbW9yZSByZWxpYWJsZSBjaG9pY2UgZm9yDQppbmZlcmVuY2Ugb24gJGIkIGluIHRoaXMgc2V0dGluZy4NCg0KDQojIyBQcm9ibGVtIEI0DQoNCiMjIyBMaWtlbGlob29kIFJhdGlvIFRlc3QgZm9yIFVuaWZvcm1pdHkNCg0KV2UgcGVyZm9ybSBhIGxpa2VsaWhvb2QgcmF0aW8gdGVzdCB0byBhc3Nlc3Mgd2hldGhlciB0aGUgcmVzZXJ2b2lyIHN0b3JhZ2UNCmRhdGEgZm9sbG93cyBhIHVuaWZvcm0gZGlzdHJpYnV0aW9uIG9uICQoMCwxKSQsIHdoaWNoIGNvcnJlc3BvbmRzIHRvIHRoZQ0KS3VtYXJhc3dhbXkgZGlzdHJpYnV0aW9uIHdpdGggJGEgPSAxJCBhbmQgJGIgPSAxJDoNCg0KJCRIXzA6IGEgPSAxIFwgXCYgXCBiID0gMSBccXVhZCBcdGV4dHt2ZXJzdXN9IFxxdWFkIEhfYTogYSBcbmVxIDEgXCBcdGV4dHtvcn0gXCBiIFxuZXEgMSBcIFx0ZXh0e29yfSBcIChhIFxuZXEgMSBcIFwmIFwgYiBcbmVxIDEpJCQNCg0KVGhlIExSVCBzdGF0aXN0aWMgY29tcGFyZXMgdGhlIGxvZy1saWtlbGlob29kIG9mIHRoZSB1bnJlc3RyaWN0ZWQgS3VtYXJhc3dhbXkNCm1vZGVsIChmcm9tIFByb2JsZW0gQjEpIGFnYWluc3QgdGhlIHJlc3RyaWN0ZWQgdW5pZm9ybSBtb2RlbCB3aGVyZSAkYSA9IDEkDQphbmQgJGIgPSAxJDoNCg0KJCRcTGFtYmRhID0gMlxsZWZ0W1xlbGwoXGhhdHthfSwgXGhhdHtifSkgLSBcZWxsKDEsIDEpXHJpZ2h0XSQkDQoNClNpbmNlIHR3byBwYXJhbWV0ZXJzIGFyZSBzaW11bHRhbmVvdXNseSByZXN0cmljdGVkIHVuZGVyICRIXzAkLCBieSBXaWxrcycNCnRoZW9yZW0gJFxMYW1iZGEgXG92ZXJzZXR7ZH17XHRvfSBcY2hpXjJfMiQgYXN5bXB0b3RpY2FsbHkuDQoNCmBgYHtyIGI0LCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFfQ0KIyAtLS0tLS0tIFJlc3RyaWN0ZWQgTW9kZWwgKFVuaWZvcm0gRGlzdHJpYnV0aW9uLCBhID0gMSwgYiA9IDEpIC0tLS0tLS0NCiMgTG9nLWxpa2VsaWhvb2Qgc2ltcGxpZmllcyB0byAwIHNpbmNlIGxvZygxKSA9IDAgYW5kIHJlbWFpbmluZyB0ZXJtcyB2YW5pc2gNCmxsX3VuaWZvcm0gPC0gMA0KDQojIC0tLS0tLS0gTFJUIFN0YXRpc3RpYyAtLS0tLS0tDQpMYW1iZGFfYjQgPC0gMiAqIChsbF91bnJlc3RyaWN0ZWQgLSBsbF91bmlmb3JtKQ0KDQojIC0tLS0tLS0gQ3JpdGljYWwgVmFsdWUgYW5kIERlY2lzaW9uIC0tLS0tLS0NCiMgVHdvIHBhcmFtZXRlcnMgcmVzdHJpY3RlZCBzaW11bHRhbmVvdXNseSwgc28gY2hpLXNxdWFyZWQgd2l0aCBkZiA9IDINCmNyaXRpY2FsX3ZhbHVlX2I0IDwtIHFjaGlzcSgwLjk1LCBkZiA9IDIpDQoNCmNhdCgiTFJUIFN0YXRpc3RpYyAoTGFtYmRhKSAgICAgICAgIDoiLCByb3VuZChMYW1iZGFfYjQsIDQpLCAiXG4iKQ0KY2F0KCJDcml0aWNhbCBWYWx1ZSAoY2hpXjJfMiwgMC4wNSkgOiIsIHJvdW5kKGNyaXRpY2FsX3ZhbHVlX2I0LCA0KSwgIlxuIikNCmNhdCgiRGVjaXNpb246IiwgaWZlbHNlKExhbWJkYV9iNCA+IGNyaXRpY2FsX3ZhbHVlX2I0LA0KICAgICAgICAgICAgICAgICAgICAgICAgIlJlamVjdCBIMCAtIGRhdGEgZG9lcyBub3QgZm9sbG93IHVuaWZvcm0gZGlzdHJpYnV0aW9uIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICJGYWlsIHRvIHJlamVjdCBIMCAtIGRhdGEgaXMgY29uc2lzdGVudCB3aXRoIHVuaWZvcm0gZGlzdHJpYnV0aW9uIiksICJcbiIpDQpgYGANCg0KDQojIyMgUHJhY3RpY2FsIEludGVycHJldGF0aW9uDQoNCkF0ICRcYWxwaGEgPSAwLjA1JCwgdGhlIExSVCBzdGF0aXN0aWMgJFxMYW1iZGEgPSA0OS4xMjU0JCBmYXIgZXhjZWVkcyB0aGUNCmNyaXRpY2FsIHZhbHVlICRcY2hpXjJfezIsXCwgMC4wNX0gPSA1Ljk5MTUkLCBsZWFkaW5nIHVzIHRvIHN0cm9uZ2x5IHJlamVjdA0KJEhfMCQuIFRoaXMgcHJvdmlkZXMgb3ZlcndoZWxtaW5nIGV2aWRlbmNlIHRoYXQgdGhlIHJlc2Vydm9pciBzdG9yYWdlIGRhdGENCmRvZXMgbm90IGZvbGxvdyBhIHVuaWZvcm0gZGlzdHJpYnV0aW9uIG9uICQoMCwxKSQuDQoNClByYWN0aWNhbGx5LCB0aGlzIG1lYW5zIHRoYXQgZHVyaW5nIHRoZSBkcnkgc2Vhc29uLCBub3QgYWxsIHN0b3JhZ2UgbGV2ZWxzDQphcmUgZXF1YWxseSBsaWtlbHkuIFRoZSBkYXRhIHRlbmRzIHRvIGNvbmNlbnRyYXRlIGF0IGxvd2VyIHN0b3JhZ2UgbGV2ZWxzLA0KY29uc2lzdGVudCB3aXRoIHRoZSByaWdodCBza2V3ZWQgcGF0dGVybiBkZXNjcmliZWQgaW4gdGhlIHdvcmtpbmcgZGF0YXNldA0Kd2hlcmUgZHJvdWdodCBjb25kaXRpb25zIGRvbWluYXRlIGFuZCBvY2Nhc2lvbmFsIHJlcGxlbmlzaG1lbnQgZXZlbnRzIHB1c2gNCnN0b3JhZ2UgaGlnaGVyIG9ubHkgdGVtcG9yYXJpbHkuIFRoZSBmdWxsIEt1bWFyYXN3YW15IGRpc3RyaWJ1dGlvbiB3aXRoIGJvdGgNCnNoYXBlIHBhcmFtZXRlcnMgJFxoYXR7YX0kIGFuZCAkXGhhdHtifSQgaXMgdGhlcmVmb3JlIG5lY2Vzc2FyeSB0byBhZGVxdWF0ZWx5DQptb2RlbCB0aGUgZGFpbHkgcmVzZXJ2b2lyIHN0b3JhZ2UgcHJvcG9ydGlvbnMu