Assignment Objectives

  • Enhance understanding the logic and procedure of hypothesis testing .

  • Implement the procedures for power and sample size calculation for basic hypothesis testing procedures using nuilt-in function and manual calculation.

Policies of Using AI Tools

Policy on AI Tool Use: Please adhere to the AI tool policy specified in the course syllabus. The direct copying of AI-generated content is strictly prohibited. All submitted work must reflect your own understanding; where external tools are consulted, content must be thoroughly rephrased and synthesized in your own words.

Code Inclusion Requirement: Any code included in your essay must be properly commented to explain the purpose and/or expected output of key code lines. Submitting AI-generated code without meaningful, student-added comments will not be accepted.

**Simple versus Composite Hypothesis*

Simple Hypothesis

  • Simple Hypothesis Test is a hypothesis that completely specifies the population distribution. Mathematically, simple hypothesis fixes all parameters to specific values. For example, The simple hypotheses are: \(H_0: \mu = 5\) (if \(\alpha\) is known), \(H_0: \mu = 100, \sigma^2 = 25\), and \(H_1: p = 0.7\) for a Bernoulli distribution.

  • Example Scenario Test if a coin is fair:

\[\begin{aligned} H_0&: p = 0.5 \quad \text{(completely specified)} \\ H_1&: p = 0.6 \quad \text{(also completely specified)} \end{aligned}\]

Both are simple hypotheses.

Composite Hypothesis

  • Composite Hypothesis is a hypothesis that does not completely specify the distribution. Mathematically, it allows a range of values for at least one parameter. For example, in one-sided: \(\mu >5\); in two-sided: \(\mu \le 5\).

  • Example Scenarios

\[\begin{aligned} &H_0: \mu = 5 && \text{(simple)} \\ &H_1: \mu > 5 && \text{(composite)} \end{aligned}\] \[\begin{aligned} &H_0: \mu \leq 5 && \text{(composite)} \\ &H_1: \mu > 5 && \text{(composite)} \end{aligned}\] \[\begin{aligned} &H_0: \text{data follows } N(\mu, 1), \mu = 0 && \text{(simple)} \\ &H_1: \text{data follows Poisson}(\lambda) && \text{(composite – different family)} \end{aligned}\]

This assignment focuses on performing performing a test of mean (\(\mu\)) a normal population and calculating the power and sample size based on various assumptions


Question: New Cholesterol Medication

A pharmaceutical company develops “CholestFix” to reduce Low-Density Lipoprotein (LDL, fat carrier that’s low in density) cholesterol. The current standard drug lowers LDL by an average of 25 mg/dL with a standard deviation of 15 mg/dL. A clinical trial with 5 participants were recruited in the study for three months. At the end of the study, the mean reduction is 29 mg/dL. Assume that the variance of LDL reduction of new drug is the same as that of the standard drugs.

Based on the results in the clinical trial, researchers in the company believe CholestFix is more effective.

a). Perform a formal hypothesis test of the researchers’ belief regarding LDL reduction, using a significance level of \(\alpha = 0.05\).

Claim: Ha: \(\mu\) > 25 mg/dL

Hypothesis: \(H_o\) : \(\mu\) \(le\) 25 mg/dL \(H_a\) : \(\mu\) \(gt\) 25 mg/dL

#Current drug standard:
    # Current Drug: Lowers LDL by average of 25 mg/dL
    # sd=15
    # n=5
# New drug
  # new drug mu = 29 mg/dL

# Company believe CholestFix is more effective

# a). Perform a formal hypothesis test of the researchers’ belief regarding LDL reduction, using a significance level of α=0.05


# One-sample t-test in R
# Note this is a random comparative sample with same descriptive of the prompt. Use Manual Calculations for more precisness 
set.seed(123)
simulated_iq <- rnorm(n=5, mean = 29, sd = 15)
result <- t.test(simulated_iq, mu = 25, 
                 alternative = "greater")

# Output
print(result)

    One Sample t-test

data:  simulated_iq
t = 1.2689, df = 4, p-value = 0.1366
alternative hypothesis: true mean is greater than 25
95 percent confidence interval:
 20.30524      Inf
sample estimates:
mean of x 
 31.90355 
###
cat("\nManual t-value:" ,
    "\nR t-value:", round(result$statistic, 3),
    "\nCritical t-value (0.05):",
    "\nR p-value:", round(result$p.value, 4))

Manual t-value: 
R t-value: 1.269 
Critical t-value (0.05): 
R p-value: 0.1366
#Manual Check 

x_bar = 29
mu_0 = 25
sd = 15
n = 5
alpha = 0.05


#calculate the t statistic

#what is tcrit

t = (29-25)/(15/sqrt(5))
t
[1] 0.5962848
#Find the t crit of a one-tailed test specifically

t_crit = qt(1 - alpha, df = n - 1)

t > t_crit
[1] FALSE
cat("t > t_crit outputs: ", t > t_crit)
t > t_crit outputs:  FALSE
#False

#p_val = pt(t, df = n - 1, lower.tail = FALSE)

cat("There is not statistically evidence that CholestFix out performs the standard drug", "( t =", t, "p>0.05).")
There is not statistically evidence that CholestFix out performs the standard drug ( t = 0.5962848 p>0.05).

The t-statistic is less than t-crit, therefore there is not statistical evidence the new drug CholesFix out performs the standard drug (0.5962848 < 2.1318468). CholesFix should not be advertised as a better performing drug.

The analysis is justified as valid

A one sample t-test with a one-tail test was used because the analysis compared an already known drug demographic mean of 25 to an unknown new drug performance of CholesFix. As the researchers claim the new drug, CholesFix, performs greater than the existing drug, this is a one tail, one direction of interest, analysis.

Although the raw means of the new drug reduction, CholesFix, is greater than the mean of the standard drug reduction, the characteristics of the CholesFix distribution, for example a how standard deviation of 15, statistically lead to higher variability in an already, small dataset (n=5) contributing to a statistically non-significant greater mean.

b). Given \(n = 50, \sigma = 15, \alpha = 0.05\), and an effect size we wish to detect \(\delta = 4\) mg/dL (corresponding to a reduction from 29 mg/dL to 25 mg/dL). What is the probability that we’d detect a true improvement?

One tailed test

n = 50

sd = 15

alpha = 0.05

delta = 4

lam = (delta) / ( sd/ sqrt(n))

power_calc <- power.t.test(n = 50, 
                          delta = 4,    # true difference between the means in H0 and Ha
                          sd = 15,      
                          sig.level = 0.05,
                          type = "one.sample",
                          alternative = "two.sided")
cat("The probability that we detect the true improvement of the new drug CholesFix compared to the standard drug is",  round(power_calc$power, 4))
The probability that we detect the true improvement of the new drug CholesFix compared to the standard drug is 0.4557
#using one-sided in alternative line instead to check
power_calc_one_alt <- power.t.test(n = 50, 
                          delta = 4,    # true difference between the means in H0 and Ha
                          sd = 15,      
                          sig.level = 0.05,
                          type = "one.sample",
                          alternative = "one.sided")

Analysis is valid

The probability we detect the true improvement is based on the power which is 0.4557. We base power on the level of significance (0.05), sample size (n=50), and distance between the means of the null and alternative hypothesis (effect size) to assign the likelihood of being able to detect an improvement by identifying the change between the comparative \(H_o\) and \(H_a\) outcomes in this case is 4. Since our power is almost 1/2 it suggests a lower level of power that may be improved through a larger sample size.

c). Determine the minimum sample size required to detect an effect size of 4 mg/dL with a power of \(1 - \beta = 0.8\) and a significance level of \(\alpha = 0.05\). Assume the standard deviation of LDL reduction is 15 mg/dL.

# The minimumal n
  #effect size = 4
  #power 0.8
  # sd = 15



sample_size = power.t.test(power = .80,
                           delta = 4,
                           sd = 15,
                           sig.level = 0.05,
                           type= "one.sample",
                           alternative = "two.sided")



c_sample=ceiling(sample_size$n)

cat("Required sample size for 80% power is ", ceiling(sample_size$n))
Required sample size for 80% power is  113

Validity Assessment

To determine the sample size required for 80% power we we consider the alpha level (\(\alpha\) = .05), difference between \(H_a\) and \(H_o\) (\(\delta = 4\)) with the designated power level, to solve for n, the sample size. Again we use a one sample test because the population parameter was known, and was being compared to an unknown, actively investigated, sample. To ensure our sample is not underpowered and has a power level of 80% we recommend a sample size of 113.

d). Power curve: To assess the impact of sample size on power, we can create a power function in terms of the sample size \(n\) and use the remaining information from part (b). Plot the power curve by selecting a sequence of sample sizes.

#DEFINE the range of sample sizes to test
n_range = seq(10, 200, by = 5)


#use sapply to calculate power for every 'n' in range
#We keep delta

power = sapply(n_range, function(n_val)
{
  
  p_out = power.t.test(n= n_val,
                       delta =4 ,
                       sd= 15,
                       sig.level= 0.05,
                       type = "one.sample",
                       alternative = "two.sided") #should this be two.sided too?

  return(p_out$power)
  
})

plot(n_range, power, type = "b", pch = 16, 
     main = "Power Curve CholestFix",
     xlab= "Sample Size (n)",
     ylab = "Power (Probability of Detecting Effect)")
# Horizontal line at 80% (the standard goal for power)
abline(h = 0.80, col = "red", lty = 2)
abline(v = 112, col = "blue", lty = 3) # The n you found in 1c

This is a graphical summary for power considering sample size options. Detailing out interest in a 0.80 power level we use see the sample size is the 113. This information graphically represents the information listed in 1c, leaving the same interpretation for validity. By analyzing the curvature of the line, we see the sample size for the 0.8 power level covers the majority of the curve, suggesting some strength in the calculated 113 sample size. We see the sample sizes above 150 do not assist the analysis as much as a smaller sample does at lower probabilities, so by eye 0.8 probability is a good financial balance between a large sample size with a stronger effect size.

Note: For each of the questions above, write a short summary of what you observed, justify why your analysis is valid, and interpret the results.

LS0tDQp0aXRsZTogIkFzc2lnbm1lbnQgOTogSHlwb3RoZXNpcyBUZXN0aW5nIGFuZCBQb3dlciBhbmQgU2FtcGxlIHNpemUgRGV0ZXJtaW5hdGlvbiINCmF1dGhvcjogIllvdXIgTmFtZSBFemFuYSBSaXZlcnMiDQpkYXRlOiAiIER1ZTogMDQvMDciDQpvdXRwdXQ6DQogIGh0bWxfZG9jdW1lbnQ6IA0KICAgIHRvYzogeWVzDQogICAgdG9jX2RlcHRoOiA0DQogICAgdG9jX2Zsb2F0OiB5ZXMNCiAgICBudW1iZXJfc2VjdGlvbnM6IG5vDQogICAgdG9jX2NvbGxhcHNlZDogeWVzDQogICAgY29kZV9mb2xkaW5nOiBoaWRlDQogICAgY29kZV9kb3dubG9hZDogeWVzDQogICAgc21vb3RoX3Njcm9sbDogeWVzDQogICAgaGlnaGxpZ2h0OiBtb25vY2hyb21lDQogICAgdGhlbWU6IHNwYWNlbGFiDQogIHdvcmRfZG9jdW1lbnQ6IA0KICAgIHRvYzogeWVzDQogICAgdG9jX2RlcHRoOiA0DQogICAgZmlnX2NhcHRpb246IHllcw0KICAgIGtlZXBfbWQ6IHllcw0KICBwZGZfZG9jdW1lbnQ6IA0KICAgIHRvYzogeWVzDQogICAgdG9jX2RlcHRoOiA0DQogICAgZmlnX2NhcHRpb246IHllcw0KICAgIG51bWJlcl9zZWN0aW9uczogeWVzDQogICAgZmlnX3dpZHRoOiAzDQogICAgZmlnX2hlaWdodDogMw0KZWRpdG9yX29wdGlvbnM6IA0KICBjaHVua19vdXRwdXRfdHlwZTogaW5saW5lDQotLS0NCg0KYGBge2NzcywgZWNobyA9IEZBTFNFfQ0KI1RPQzo6YmVmb3JlIHsNCiAgY29udGVudDogIlRhYmxlIG9mIENvbnRlbnRzIjsNCiAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogIGZvbnQtc2l6ZTogMS4yZW07DQogIGRpc3BsYXk6IGJsb2NrOw0KICBjb2xvcjogbmF2eTsNCiAgbWFyZ2luLWJvdHRvbTogMTBweDsNCn0NCg0KDQpkaXYjVE9DIGxpIHsgICAgIC8qIHRhYmxlIG9mIGNvbnRlbnQgICovDQogICAgbGlzdC1zdHlsZTp1cHBlci1yb21hbjsNCiAgICBiYWNrZ3JvdW5kLWltYWdlOm5vbmU7DQogICAgYmFja2dyb3VuZC1yZXBlYXQ6bm9uZTsNCiAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOjA7DQp9DQoNCmgxLnRpdGxlIHsgICAgLyogbGV2ZWwgMSBoZWFkZXIgb2YgdGl0bGUgICovDQogIGZvbnQtc2l6ZTogMjJweDsNCiAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogIGNvbG9yOiBEYXJrUmVkOw0KICB0ZXh0LWFsaWduOiBjZW50ZXI7DQogIGZvbnQtZmFtaWx5OiAiR2lsbCBTYW5zIiwgc2Fucy1zZXJpZjsNCn0NCg0KaDQuYXV0aG9yIHsgLyogSGVhZGVyIDQgLSBhbmQgdGhlIGF1dGhvciBhbmQgZGF0YSBoZWFkZXJzIHVzZSB0aGlzIHRvbyAgKi8NCiAgZm9udC1zaXplOiAxNXB4Ow0KICBmb250LXdlaWdodDogYm9sZDsNCiAgZm9udC1mYW1pbHk6IHN5c3RlbS11aTsNCiAgY29sb3I6IG5hdnk7DQogIHRleHQtYWxpZ246IGNlbnRlcjsNCn0NCg0KaDQuZGF0ZSB7IC8qIEhlYWRlciA0IC0gYW5kIHRoZSBhdXRob3IgYW5kIGRhdGEgaGVhZGVycyB1c2UgdGhpcyB0b28gICovDQogIGZvbnQtc2l6ZTogMThweDsNCiAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogIGZvbnQtZmFtaWx5OiAiR2lsbCBTYW5zIiwgc2Fucy1zZXJpZjsNCiAgY29sb3I6IERhcmtCbHVlOw0KICB0ZXh0LWFsaWduOiBjZW50ZXI7DQp9DQoNCmgxIHsgLyogSGVhZGVyIDEgLSBhbmQgdGhlIGF1dGhvciBhbmQgZGF0YSBoZWFkZXJzIHVzZSB0aGlzIHRvbyAgKi8NCiAgICBmb250LXNpemU6IDIwcHg7DQogICAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogICAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7DQogICAgY29sb3I6IGRhcmtyZWQ7DQogICAgdGV4dC1hbGlnbjogY2VudGVyOw0KfQ0KDQpoMiB7IC8qIEhlYWRlciAyIC0gYW5kIHRoZSBhdXRob3IgYW5kIGRhdGEgaGVhZGVycyB1c2UgdGhpcyB0b28gICovDQogICAgZm9udC1zaXplOiAxOHB4Ow0KICAgIGZvbnQtd2VpZ2h0OiBib2xkOw0KICAgIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICAgIGNvbG9yOiBuYXZ5Ow0KICAgIHRleHQtYWxpZ246IGxlZnQ7DQp9DQoNCmgzIHsgLyogSGVhZGVyIDMgLSBhbmQgdGhlIGF1dGhvciBhbmQgZGF0YSBoZWFkZXJzIHVzZSB0aGlzIHRvbyAgKi8NCiAgICBmb250LXNpemU6IDE2cHg7DQogICAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogICAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7DQogICAgY29sb3I6IG5hdnk7DQogICAgdGV4dC1hbGlnbjogbGVmdDsNCn0NCg0KaDQgeyAvKiBIZWFkZXIgNCAtIGFuZCB0aGUgYXV0aG9yIGFuZCBkYXRhIGhlYWRlcnMgdXNlIHRoaXMgdG9vICAqLw0KICAgIGZvbnQtc2l6ZTogMTRweDsNCiAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogICAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7DQogICAgY29sb3I6IGRhcmtyZWQ7DQogICAgdGV4dC1hbGlnbjogbGVmdDsNCn0NCg0KLyogQWRkIGRvdHMgYWZ0ZXIgbnVtYmVyZWQgaGVhZGVycyAqLw0KLmhlYWRlci1zZWN0aW9uLW51bWJlcjo6YWZ0ZXIgew0KICBjb250ZW50OiAiLiI7DQoNCmJvZHkge2JhY2tncm91bmQtY29sb3I6ICNmZmZmZmY7DQogICAgICBjb2xvcjogIzAwMDAwMDsNCiAgICAgIGZvbnQtZmFtaWx5OiBBcmlhbCwgc2Fucy1zZXJpZjsNCiAgICAgIGZvbnQtc2l6ZTogMXJlbTsNCiAgICAgIGxpbmUtaGVpZ2h0OiAxLjY7DQogICAgICB9DQoNCi5oaWdobGlnaHRtZSB7IGJhY2tncm91bmQtY29sb3I6eWVsbG93OyB9DQoNCnAgeyBiYWNrZ3JvdW5kLWNvbG9yOndoaXRlOyB9DQoNCn0NCmBgYA0KDQpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0NCiMgY29kZSBjaHVuayBzcGVjaWZpZXMgd2hldGhlciB0aGUgUiBjb2RlLCB3YXJuaW5ncywgYW5kIG91dHB1dCANCiMgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgb3V0cHV0IGZpbGVzLg0KaWYgKCFyZXF1aXJlKCJrbml0ciIpKSB7DQogICBpbnN0YWxsLnBhY2thZ2VzKCJrbml0ciIpDQogICBsaWJyYXJ5KGtuaXRyKQ0KfQ0KaWYgKCFyZXF1aXJlKCJwYW5kZXIiKSkgew0KICAgaW5zdGFsbC5wYWNrYWdlcygicGFuZGVyIikNCiAgIGxpYnJhcnkocGFuZGVyKQ0KfQ0KaWYgKCFyZXF1aXJlKCJnZ3Bsb3QyIikpIHsNCiAgaW5zdGFsbC5wYWNrYWdlcygiZ2dwbG90MiIpDQogIGxpYnJhcnkoZ2dwbG90MikNCn0NCmlmICghcmVxdWlyZSgidGlkeXZlcnNlIikpIHsNCiAgaW5zdGFsbC5wYWNrYWdlcygidGlkeXZlcnNlIikNCiAgbGlicmFyeSh0aWR5dmVyc2UpDQp9DQoNCmlmICghcmVxdWlyZSgicGxvdGx5IikpIHsNCiAgaW5zdGFsbC5wYWNrYWdlcygicGxvdGx5IikNCiAgbGlicmFyeShwbG90bHkpDQp9DQoNCmlmICghcmVxdWlyZSgiVkdBTSIpKSB7DQogIGluc3RhbGwucGFja2FnZXMoIlZHQU0iKQ0KICBsaWJyYXJ5KFZHQU0pDQp9DQojIyMjIFZHQU0NCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSwgICAgICAgIyBpbmNsdWRlIGNvZGUgY2h1bmsgaW4gdGhlIG91dHB1dCBmaWxlDQogICAgICAgICAgICAgICAgICAgICAgd2FybmluZyA9IEZBTFNFLCAgICMgc29tZXRpbWVzLCB5b3UgY29kZSBtYXkgcHJvZHVjZSB3YXJuaW5nIG1lc3NhZ2VzLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHlvdSBjYW4gY2hvb3NlIHRvIGluY2x1ZGUgdGhlIHdhcm5pbmcgbWVzc2FnZXMgaW4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyB0aGUgb3V0cHV0IGZpbGUuIA0KICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMgPSBUUlVFLCAgICAjIHlvdSBjYW4gYWxzbyBkZWNpZGUgd2hldGhlciB0byBpbmNsdWRlIHRoZSBvdXRwdXQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBpbiB0aGUgb3V0cHV0IGZpbGUuDQogICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IEZBTFNFLA0KICAgICAgICAgICAgICAgICAgICAgIGNvbW1lbnQgPSBOQQ0KICAgICAgICAgICAgICAgICAgICAgICkgIA0KYGBgDQogDQogXA0KIA0KIyMgKipBc3NpZ25tZW50IE9iamVjdGl2ZXMqKiANCg0KPHA+DQoqIEVuaGFuY2UgdW5kZXJzdGFuZGluZyB0aGUgbG9naWMgYW5kIHByb2NlZHVyZSBvZiBoeXBvdGhlc2lzIHRlc3RpbmcgLg0KDQoqIEltcGxlbWVudCB0aGUgcHJvY2VkdXJlcyBmb3IgcG93ZXIgYW5kIHNhbXBsZSBzaXplIGNhbGN1bGF0aW9uIGZvciBiYXNpYyBoeXBvdGhlc2lzIHRlc3RpbmcgcHJvY2VkdXJlcyB1c2luZyBudWlsdC1pbiBmdW5jdGlvbiBhbmQgbWFudWFsIGNhbGN1bGF0aW9uLg0KPC9wPg0KDQoNCiMjICoqUG9saWNpZXMgb2YgVXNpbmcgQUkgVG9vbHMqKg0KDQo8cD4NCioqUG9saWN5IG9uIEFJIFRvb2wgVXNlKio6IFBsZWFzZSBhZGhlcmUgdG8gdGhlIEFJIHRvb2wgcG9saWN5IHNwZWNpZmllZCBpbiB0aGUgY291cnNlIHN5bGxhYnVzLiBUaGUgZGlyZWN0IGNvcHlpbmcgb2YgQUktZ2VuZXJhdGVkIGNvbnRlbnQgaXMgc3RyaWN0bHkgcHJvaGliaXRlZC4gQWxsIHN1Ym1pdHRlZCB3b3JrIG11c3QgcmVmbGVjdCB5b3VyIG93biB1bmRlcnN0YW5kaW5nOyB3aGVyZSBleHRlcm5hbCB0b29scyBhcmUgY29uc3VsdGVkLCBjb250ZW50IG11c3QgYmUgdGhvcm91Z2hseSByZXBocmFzZWQgYW5kIHN5bnRoZXNpemVkIGluIHlvdXIgb3duIHdvcmRzLg0KPC9wPg0KDQo8cD4NCioqQ29kZSBJbmNsdXNpb24gUmVxdWlyZW1lbnQqKjogQW55IGNvZGUgaW5jbHVkZWQgaW4geW91ciBlc3NheSBtdXN0IGJlIHByb3Blcmx5IGNvbW1lbnRlZCB0byBleHBsYWluIHRoZSBwdXJwb3NlIGFuZC9vciBleHBlY3RlZCBvdXRwdXQgb2Yga2V5IGNvZGUgbGluZXMuIFN1Ym1pdHRpbmcgQUktZ2VuZXJhdGVkIGNvZGUgd2l0aG91dCBtZWFuaW5nZnVsLCBzdHVkZW50LWFkZGVkIGNvbW1lbnRzIHdpbGwgbm90IGJlIGFjY2VwdGVkLg0KPC9wPg0KDQoNCiMjICoqU2ltcGxlIHZlcnN1cyBDb21wb3NpdGUgSHlwb3RoZXNpcyoNCg0KKipTaW1wbGUgSHlwb3RoZXNpcyoqDQoNCiogKipTaW1wbGUgSHlwb3RoZXNpcyBUZXN0KiogaXMgYSBoeXBvdGhlc2lzIHRoYXQgY29tcGxldGVseSBzcGVjaWZpZXMgdGhlIHBvcHVsYXRpb24gZGlzdHJpYnV0aW9uLiBNYXRoZW1hdGljYWxseSwgc2ltcGxlIGh5cG90aGVzaXMgZml4ZXMgYWxsIHBhcmFtZXRlcnMgdG8gc3BlY2lmaWMgdmFsdWVzLiBGb3IgZXhhbXBsZSwgVGhlIHNpbXBsZSBoeXBvdGhlc2VzIGFyZTogJEhfMDogXG11ID0gNSQgKGlmICRcYWxwaGEkIGlzIGtub3duKSwgJEhfMDogXG11ID0gMTAwLCBcc2lnbWFeMiA9IDI1JCwgYW5kICRIXzE6IHAgPSAwLjckIGZvciBhIEJlcm5vdWxsaSBkaXN0cmlidXRpb24uDQoNCiogKipFeGFtcGxlIFNjZW5hcmlvKiogIFRlc3QgaWYgYSBjb2luIGlzIGZhaXI6DQoNClxiZWdpbnthbGlnbmVkfQ0KSF8wJjogcCA9IDAuNSBccXVhZCBcdGV4dHsoY29tcGxldGVseSBzcGVjaWZpZWQpfSBcXA0KSF8xJjogcCA9IDAuNiBccXVhZCBcdGV4dHsoYWxzbyBjb21wbGV0ZWx5IHNwZWNpZmllZCl9DQpcZW5ke2FsaWduZWR9DQoNCkJvdGggYXJlICoqc2ltcGxlKiogaHlwb3RoZXNlcy4NCg0KKipDb21wb3NpdGUgSHlwb3RoZXNpcyoqDQoNCiogKipDb21wb3NpdGUgSHlwb3RoZXNpcyoqIGlzIGEgaHlwb3RoZXNpcyB0aGF0IGRvZXMgbm90IGNvbXBsZXRlbHkgc3BlY2lmeSB0aGUgZGlzdHJpYnV0aW9uLiBNYXRoZW1hdGljYWxseSwgaXQgYWxsb3dzIGEgcmFuZ2Ugb2YgdmFsdWVzIGZvciBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyLiBGb3IgZXhhbXBsZSwgaW4gb25lLXNpZGVkOiAkXG11ID41JDsgaW4gdHdvLXNpZGVkOiAkXG11IFxsZSA1JC4NCg0KKiAqKkV4YW1wbGUgU2NlbmFyaW9zKiogDQoNCg0KXGJlZ2lue2FsaWduZWR9DQomSF8wOiBcbXUgPSA1ICYmIFx0ZXh0eyhzaW1wbGUpfSBcXA0KJkhfMTogXG11ID4gNSAmJiBcdGV4dHsoY29tcG9zaXRlKX0NClxlbmR7YWxpZ25lZH0NCg0KDQoNClxiZWdpbnthbGlnbmVkfQ0KJkhfMDogXG11IFxsZXEgNSAmJiBcdGV4dHsoY29tcG9zaXRlKX0gXFwNCiZIXzE6IFxtdSA+IDUgJiYgXHRleHR7KGNvbXBvc2l0ZSl9DQpcZW5ke2FsaWduZWR9DQoNCg0KXGJlZ2lue2FsaWduZWR9DQomSF8wOiBcdGV4dHtkYXRhIGZvbGxvd3MgfSBOKFxtdSwgMSksIFxtdSA9IDAgJiYgXHRleHR7KHNpbXBsZSl9IFxcDQomSF8xOiBcdGV4dHtkYXRhIGZvbGxvd3MgUG9pc3Nvbn0oXGxhbWJkYSkgJiYgXHRleHR7KGNvbXBvc2l0ZSDigJMgZGlmZmVyZW50IGZhbWlseSl9DQpcZW5ke2FsaWduZWR9DQoNCg0KDQo8cD48Zm9udCBjb2xvciA9ICJkYXJrcmVkIj4qKlRoaXMgYXNzaWdubWVudCBmb2N1c2VzIG9uIHBlcmZvcm1pbmcgcGVyZm9ybWluZyBhIHRlc3Qgb2YgbWVhbiAoJFxtdSQpIGEgbm9ybWFsIHBvcHVsYXRpb24gYW5kIGNhbGN1bGF0aW5nIHRoZSBwb3dlciBhbmQgc2FtcGxlIHNpemUgYmFzZWQgb24gdmFyaW91cyBhc3N1bXB0aW9ucyoqPC9mb250PjwvcD4NCg0KDQpcDQoNCiMjICoqUXVlc3Rpb246IE5ldyBDaG9sZXN0ZXJvbCBNZWRpY2F0aW9uKioNCg0KPHA+DQpBIHBoYXJtYWNldXRpY2FsIGNvbXBhbnkgZGV2ZWxvcHMgKioiQ2hvbGVzdEZpeCIqKiB0byByZWR1Y2UgTG93LURlbnNpdHkgTGlwb3Byb3RlaW4gKExETCwgKmZhdCBjYXJyaWVyIHRoYXQncyBsb3cgaW4gZGVuc2l0eSopIGNob2xlc3Rlcm9sLiBUaGUgKipjdXJyZW50IHN0YW5kYXJkIGRydWcqKiBsb3dlcnMgTERMIGJ5IGFuIGF2ZXJhZ2Ugb2YgMjUgbWcvZEwgd2l0aCBhIHN0YW5kYXJkIGRldmlhdGlvbiBvZiAxNSBtZy9kTC4gQSBjbGluaWNhbCB0cmlhbCB3aXRoIDUgcGFydGljaXBhbnRzIHdlcmUgcmVjcnVpdGVkIGluIHRoZSBzdHVkeSBmb3IgdGhyZWUgbW9udGhzLiBBdCB0aGUgZW5kIG9mIHRoZSBzdHVkeSwgdGhlIG1lYW4gcmVkdWN0aW9uIGlzIDI5IG1nL2RMLiBBc3N1bWUgdGhhdCB0aGUgdmFyaWFuY2Ugb2YgTERMIHJlZHVjdGlvbiBvZiBuZXcgZHJ1ZyBpcyB0aGUgc2FtZSBhcyB0aGF0IG9mIHRoZSBzdGFuZGFyZCBkcnVncy4NCg0KQmFzZWQgb24gdGhlIHJlc3VsdHMgaW4gdGhlIGNsaW5pY2FsIHRyaWFsLCByZXNlYXJjaGVycyBpbiB0aGUgY29tcGFueSBiZWxpZXZlICoqQ2hvbGVzdEZpeCoqIGlzIG1vcmUgZWZmZWN0aXZlLg0KPC9wPg0KDQoNCjxwPg0KYSkuIFBlcmZvcm0gYSBmb3JtYWwgaHlwb3RoZXNpcyB0ZXN0IG9mIHRoZSByZXNlYXJjaGVyc+KAmSBiZWxpZWYgcmVnYXJkaW5nIExETCByZWR1Y3Rpb24sIHVzaW5nIGEgc2lnbmlmaWNhbmNlIGxldmVsIG9mICRcYWxwaGEgPSAwLjA1JC4NCg0KDQpDbGFpbToNCiAgICBIYTogJFxtdSQgPiAyNSBtZy9kTA0KICAgIA0KSHlwb3RoZXNpczoNCiAgICAkSF9vJCA6ICRcbXUkICRsZSQgMjUgbWcvZEwNCiAgICAkSF9hJCA6ICRcbXUkICRndCQgMjUgbWcvZEwNCiAgICANCg0KDQpgYGB7cn0NCg0KI0N1cnJlbnQgZHJ1ZyBzdGFuZGFyZDoNCiAgICAjIEN1cnJlbnQgRHJ1ZzogTG93ZXJzIExETCBieSBhdmVyYWdlIG9mIDI1IG1nL2RMDQogICAgIyBzZD0xNQ0KICAgICMgbj01DQojIE5ldyBkcnVnDQogICMgbmV3IGRydWcgbXUgPSAyOSBtZy9kTA0KDQojIENvbXBhbnkgYmVsaWV2ZSBDaG9sZXN0Rml4IGlzIG1vcmUgZWZmZWN0aXZlDQoNCiMgYSkuIFBlcmZvcm0gYSBmb3JtYWwgaHlwb3RoZXNpcyB0ZXN0IG9mIHRoZSByZXNlYXJjaGVyc+KAmSBiZWxpZWYgcmVnYXJkaW5nIExETCByZWR1Y3Rpb24sIHVzaW5nIGEgc2lnbmlmaWNhbmNlIGxldmVsIG9mIM6xPTAuMDUNCg0KDQojIE9uZS1zYW1wbGUgdC10ZXN0IGluIFINCiMgTm90ZSB0aGlzIGlzIGEgcmFuZG9tIGNvbXBhcmF0aXZlIHNhbXBsZSB3aXRoIHNhbWUgZGVzY3JpcHRpdmUgb2YgdGhlIHByb21wdC4gVXNlIE1hbnVhbCBDYWxjdWxhdGlvbnMgZm9yIG1vcmUgcHJlY2lzbmVzcyANCnNldC5zZWVkKDEyMykNCnNpbXVsYXRlZF9pcSA8LSBybm9ybShuPTUsIG1lYW4gPSAyOSwgc2QgPSAxNSkNCnJlc3VsdCA8LSB0LnRlc3Qoc2ltdWxhdGVkX2lxLCBtdSA9IDI1LCANCiAgICAgICAgICAgICAgICAgYWx0ZXJuYXRpdmUgPSAiZ3JlYXRlciIpDQoNCiMgT3V0cHV0DQpwcmludChyZXN1bHQpDQojIyMNCmNhdCgiXG5NYW51YWwgdC12YWx1ZToiICwNCiAgICAiXG5SIHQtdmFsdWU6Iiwgcm91bmQocmVzdWx0JHN0YXRpc3RpYywgMyksDQogICAgIlxuQ3JpdGljYWwgdC12YWx1ZSAoMC4wNSk6IiwNCiAgICAiXG5SIHAtdmFsdWU6Iiwgcm91bmQocmVzdWx0JHAudmFsdWUsIDQpKQ0KDQoNCg0KDQoNCiNNYW51YWwgQ2hlY2sgDQoNCnhfYmFyID0gMjkNCm11XzAgPSAyNQ0Kc2QgPSAxNQ0KbiA9IDUNCmFscGhhID0gMC4wNQ0KDQoNCiNjYWxjdWxhdGUgdGhlIHQgc3RhdGlzdGljDQoNCiN3aGF0IGlzIHRjcml0DQoNCnQgPSAoMjktMjUpLygxNS9zcXJ0KDUpKQ0KdA0KDQojRmluZCB0aGUgdCBjcml0IG9mIGEgb25lLXRhaWxlZCB0ZXN0IHNwZWNpZmljYWxseQ0KDQp0X2NyaXQgPSBxdCgxIC0gYWxwaGEsIGRmID0gbiAtIDEpDQoNCnQgPiB0X2NyaXQNCg0KY2F0KCJ0ID4gdF9jcml0IG91dHB1dHM6ICIsIHQgPiB0X2NyaXQpDQoNCiNGYWxzZQ0KDQojcF92YWwgPSBwdCh0LCBkZiA9IG4gLSAxLCBsb3dlci50YWlsID0gRkFMU0UpDQoNCmNhdCgiVGhlcmUgaXMgbm90IHN0YXRpc3RpY2FsbHkgZXZpZGVuY2UgdGhhdCBDaG9sZXN0Rml4IG91dCBwZXJmb3JtcyB0aGUgc3RhbmRhcmQgZHJ1ZyIsICIoIHQgPSIsIHQsICJwPjAuMDUpLiIpDQoNCmBgYA0KDQpUaGUgdC1zdGF0aXN0aWMgaXMgbGVzcyB0aGFuIHQtY3JpdCwgdGhlcmVmb3JlIHRoZXJlIGlzIG5vdCBzdGF0aXN0aWNhbCBldmlkZW5jZSB0aGUgbmV3IGRydWcgKkNob2xlc0ZpeCogb3V0IHBlcmZvcm1zIHRoZSBzdGFuZGFyZCBkcnVnIChgciB0YCA8IGByIHRfY3JpdGApLiBDaG9sZXNGaXggc2hvdWxkIG5vdCBiZSBhZHZlcnRpc2VkIGFzIGEgYmV0dGVyIHBlcmZvcm1pbmcgZHJ1Zy4gDQoNCioqVGhlIGFuYWx5c2lzIGlzIGp1c3RpZmllZCBhcyB2YWxpZCoqIA0KDQpBIG9uZSBzYW1wbGUgdC10ZXN0IHdpdGggYSBvbmUtdGFpbCB0ZXN0IHdhcyB1c2VkIGJlY2F1c2UgdGhlIGFuYWx5c2lzIGNvbXBhcmVkIGFuIGFscmVhZHkga25vd24gZHJ1ZyBkZW1vZ3JhcGhpYyBtZWFuIG9mIDI1IHRvIGFuIHVua25vd24gbmV3IGRydWcgcGVyZm9ybWFuY2Ugb2YgQ2hvbGVzRml4LiBBcyB0aGUgcmVzZWFyY2hlcnMgY2xhaW0gdGhlIG5ldyBkcnVnLCBDaG9sZXNGaXgsIHBlcmZvcm1zIGdyZWF0ZXIgdGhhbiB0aGUgZXhpc3RpbmcgZHJ1ZywgdGhpcyBpcyBhIG9uZSB0YWlsLCBvbmUgZGlyZWN0aW9uIG9mIGludGVyZXN0LCBhbmFseXNpcy4gDQoNCkFsdGhvdWdoIHRoZSByYXcgbWVhbnMgb2YgdGhlIG5ldyBkcnVnIHJlZHVjdGlvbiwgQ2hvbGVzRml4LCBpcyBncmVhdGVyIHRoYW4gdGhlIG1lYW4gb2YgdGhlIHN0YW5kYXJkIGRydWcgcmVkdWN0aW9uLCB0aGUgY2hhcmFjdGVyaXN0aWNzIG9mIHRoZSBDaG9sZXNGaXggZGlzdHJpYnV0aW9uLCBmb3IgZXhhbXBsZSBhIGhvdyBzdGFuZGFyZCBkZXZpYXRpb24gb2YgMTUsIHN0YXRpc3RpY2FsbHkgbGVhZCB0byBoaWdoZXIgdmFyaWFiaWxpdHkgaW4gYW4gYWxyZWFkeSwgc21hbGwgZGF0YXNldCAobj01KSBjb250cmlidXRpbmcgdG8gYSBzdGF0aXN0aWNhbGx5IG5vbi1zaWduaWZpY2FudCBncmVhdGVyIG1lYW4uDQoNCg0KDQoNCmIpLiBHaXZlbiAkbiA9IDUwLCBcc2lnbWEgPSAxNSwgXGFscGhhID0gMC4wNSQsIGFuZCBhbiBlZmZlY3Qgc2l6ZSB3ZSB3aXNoIHRvIGRldGVjdCAkXGRlbHRhID0gNCQgbWcvZEwgKGNvcnJlc3BvbmRpbmcgdG8gYSByZWR1Y3Rpb24gZnJvbSAyOSBtZy9kTCB0byAyNSBtZy9kTCkuICBXaGF0IGlzIHRoZSBwcm9iYWJpbGl0eSB0aGF0IHdlJ2QgZGV0ZWN0IGEgdHJ1ZSBpbXByb3ZlbWVudD8NCg0KT25lIHRhaWxlZCB0ZXN0DQoNCmBgYHtyfQ0KDQpuID0gNTANCg0Kc2QgPSAxNQ0KDQphbHBoYSA9IDAuMDUNCg0KZGVsdGEgPSA0DQoNCmxhbSA9IChkZWx0YSkgLyAoIHNkLyBzcXJ0KG4pKQ0KDQpwb3dlcl9jYWxjIDwtIHBvd2VyLnQudGVzdChuID0gNTAsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICBkZWx0YSA9IDQsICAgICMgdHJ1ZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIG1lYW5zIGluIEgwIGFuZCBIYQ0KICAgICAgICAgICAgICAgICAgICAgICAgICBzZCA9IDE1LCAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgICAgICBzaWcubGV2ZWwgPSAwLjA1LA0KICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlID0gIm9uZS5zYW1wbGUiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICBhbHRlcm5hdGl2ZSA9ICJ0d28uc2lkZWQiKQ0KY2F0KCJUaGUgcHJvYmFiaWxpdHkgdGhhdCB3ZSBkZXRlY3QgdGhlIHRydWUgaW1wcm92ZW1lbnQgb2YgdGhlIG5ldyBkcnVnIENob2xlc0ZpeCBjb21wYXJlZCB0byB0aGUgc3RhbmRhcmQgZHJ1ZyBpcyIsICByb3VuZChwb3dlcl9jYWxjJHBvd2VyLCA0KSkNCg0KDQoNCiN1c2luZyBvbmUtc2lkZWQgaW4gYWx0ZXJuYXRpdmUgbGluZSBpbnN0ZWFkIHRvIGNoZWNrDQpwb3dlcl9jYWxjX29uZV9hbHQgPC0gcG93ZXIudC50ZXN0KG4gPSA1MCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgIGRlbHRhID0gNCwgICAgIyB0cnVlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgbWVhbnMgaW4gSDAgYW5kIEhhDQogICAgICAgICAgICAgICAgICAgICAgICAgIHNkID0gMTUsICAgICAgDQogICAgICAgICAgICAgICAgICAgICAgICAgIHNpZy5sZXZlbCA9IDAuMDUsDQogICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPSAib25lLnNhbXBsZSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgIGFsdGVybmF0aXZlID0gIm9uZS5zaWRlZCIpDQoNCmBgYA0KDQoNCioqQW5hbHlzaXMgaXMgdmFsaWQgKioNCg0KVGhlIHByb2JhYmlsaXR5IHdlIGRldGVjdCB0aGUgdHJ1ZSBpbXByb3ZlbWVudCBpcyBiYXNlZCBvbiB0aGUgcG93ZXIgd2hpY2ggaXMgYHIgcm91bmQocG93ZXJfY2FsYyRwb3dlciwgNClgLiBXZSBiYXNlIHBvd2VyIG9uIHRoZSBsZXZlbCBvZiBzaWduaWZpY2FuY2UgKDAuMDUpLCBzYW1wbGUgc2l6ZSAobj01MCksIGFuZCBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBtZWFucyBvZiB0aGUgbnVsbCBhbmQgYWx0ZXJuYXRpdmUgaHlwb3RoZXNpcyAoZWZmZWN0IHNpemUpIHRvIGFzc2lnbiB0aGUgbGlrZWxpaG9vZCBvZiBiZWluZyBhYmxlIHRvIGRldGVjdCBhbiBpbXByb3ZlbWVudCBieSBpZGVudGlmeWluZyB0aGUgY2hhbmdlIGJldHdlZW4gdGhlIGNvbXBhcmF0aXZlICRIX28kIGFuZCAkSF9hJCBvdXRjb21lcyBpbiB0aGlzIGNhc2UgaXMgNC4gU2luY2Ugb3VyIHBvd2VyIGlzIGFsbW9zdCAxLzIgaXQgc3VnZ2VzdHMgYSBsb3dlciBsZXZlbCBvZiBwb3dlciB0aGF0IG1heSBiZSBpbXByb3ZlZCB0aHJvdWdoIGEgbGFyZ2VyIHNhbXBsZSBzaXplLg0KDQoNCmMpLiBEZXRlcm1pbmUgdGhlIG1pbmltdW0gc2FtcGxlIHNpemUgcmVxdWlyZWQgdG8gZGV0ZWN0IGFuIGVmZmVjdCBzaXplIG9mIDQgbWcvZEwgd2l0aCBhIHBvd2VyIG9mICQxIC0gXGJldGEgPSAwLjgkICBhbmQgYSBzaWduaWZpY2FuY2UgbGV2ZWwgb2YgJFxhbHBoYSA9IDAuMDUkLiBBc3N1bWUgdGhlIHN0YW5kYXJkIGRldmlhdGlvbiBvZiBMREwgcmVkdWN0aW9uIGlzIDE1IG1nL2RMLg0KDQoNCmBgYHtyfQ0KDQoNCiMgVGhlIG1pbmltdW1hbCBuDQogICNlZmZlY3Qgc2l6ZSA9IDQNCiAgI3Bvd2VyIDAuOA0KICAjIHNkID0gMTUNCg0KDQoNCnNhbXBsZV9zaXplID0gcG93ZXIudC50ZXN0KHBvd2VyID0gLjgwLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsdGEgPSA0LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgc2QgPSAxNSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpZy5sZXZlbCA9IDAuMDUsDQogICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSAib25lLnNhbXBsZSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBhbHRlcm5hdGl2ZSA9ICJ0d28uc2lkZWQiKQ0KDQoNCg0KY19zYW1wbGU9Y2VpbGluZyhzYW1wbGVfc2l6ZSRuKQ0KDQpjYXQoIlJlcXVpcmVkIHNhbXBsZSBzaXplIGZvciA4MCUgcG93ZXIgaXMgIiwgY2VpbGluZyhzYW1wbGVfc2l6ZSRuKSkNCmBgYA0KKipWYWxpZGl0eSBBc3Nlc3NtZW50KioNCg0KVG8gZGV0ZXJtaW5lIHRoZSBzYW1wbGUgc2l6ZSByZXF1aXJlZCBmb3IgODAlIHBvd2VyIHdlIHdlIGNvbnNpZGVyIHRoZSBhbHBoYSBsZXZlbCAoJFxhbHBoYSQgPSAuMDUpLCBkaWZmZXJlbmNlIGJldHdlZW4gJEhfYSQgYW5kICRIX28kICgkXGRlbHRhID0gNCQpIHdpdGggdGhlIGRlc2lnbmF0ZWQgcG93ZXIgbGV2ZWwsIHRvIHNvbHZlIGZvciBuLCB0aGUgc2FtcGxlIHNpemUuIEFnYWluIHdlIHVzZSBhIG9uZSBzYW1wbGUgdGVzdCBiZWNhdXNlIHRoZSBwb3B1bGF0aW9uIHBhcmFtZXRlciB3YXMga25vd24sIGFuZCB3YXMgYmVpbmcgY29tcGFyZWQgdG8gYW4gdW5rbm93biwgYWN0aXZlbHkgaW52ZXN0aWdhdGVkLCBzYW1wbGUuIFRvIGVuc3VyZSBvdXIgc2FtcGxlIGlzIG5vdCB1bmRlcnBvd2VyZWQgYW5kIGhhcyBhIHBvd2VyIGxldmVsIG9mIDgwJSB3ZSByZWNvbW1lbmQgYSBzYW1wbGUgc2l6ZSBvZiBgciBjZWlsaW5nKGNfc2FtcGxlKWAuIA0KDQoNCg0KZCkuICoqUG93ZXIgY3VydmUqKjogVG8gYXNzZXNzIHRoZSBpbXBhY3Qgb2Ygc2FtcGxlIHNpemUgb24gcG93ZXIsIHdlIGNhbiBjcmVhdGUgYSBwb3dlciBmdW5jdGlvbiBpbiB0ZXJtcyBvZiB0aGUgc2FtcGxlIHNpemUgJG4kIGFuZCB1c2UgdGhlIHJlbWFpbmluZyBpbmZvcm1hdGlvbiBmcm9tIHBhcnQgKGIpLiBQbG90IHRoZSBwb3dlciBjdXJ2ZSBieSBzZWxlY3RpbmcgYSBzZXF1ZW5jZSBvZiBzYW1wbGUgc2l6ZXMuDQo8L3A+DQoNCmBgYHtyfQ0KDQojREVGSU5FIHRoZSByYW5nZSBvZiBzYW1wbGUgc2l6ZXMgdG8gdGVzdA0Kbl9yYW5nZSA9IHNlcSgxMCwgMjAwLCBieSA9IDUpDQoNCg0KI3VzZSBzYXBwbHkgdG8gY2FsY3VsYXRlIHBvd2VyIGZvciBldmVyeSAnbicgaW4gcmFuZ2UNCiNXZSBrZWVwIGRlbHRhDQoNCnBvd2VyID0gc2FwcGx5KG5fcmFuZ2UsIGZ1bmN0aW9uKG5fdmFsKQ0Kew0KICANCiAgcF9vdXQgPSBwb3dlci50LnRlc3Qobj0gbl92YWwsDQogICAgICAgICAgICAgICAgICAgICAgIGRlbHRhID00ICwNCiAgICAgICAgICAgICAgICAgICAgICAgc2Q9IDE1LA0KICAgICAgICAgICAgICAgICAgICAgICBzaWcubGV2ZWw9IDAuMDUsDQogICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPSAib25lLnNhbXBsZSIsDQogICAgICAgICAgICAgICAgICAgICAgIGFsdGVybmF0aXZlID0gInR3by5zaWRlZCIpICNzaG91bGQgdGhpcyBiZSB0d28uc2lkZWQgdG9vPw0KDQogIHJldHVybihwX291dCRwb3dlcikNCiAgDQp9KQ0KDQpwbG90KG5fcmFuZ2UsIHBvd2VyLCB0eXBlID0gImIiLCBwY2ggPSAxNiwgDQogICAgIG1haW4gPSAiUG93ZXIgQ3VydmUgQ2hvbGVzdEZpeCIsDQogICAgIHhsYWI9ICJTYW1wbGUgU2l6ZSAobikiLA0KICAgICB5bGFiID0gIlBvd2VyIChQcm9iYWJpbGl0eSBvZiBEZXRlY3RpbmcgRWZmZWN0KSIpDQojIEhvcml6b250YWwgbGluZSBhdCA4MCUgKHRoZSBzdGFuZGFyZCBnb2FsIGZvciBwb3dlcikNCmFibGluZShoID0gMC44MCwgY29sID0gInJlZCIsIGx0eSA9IDIpDQphYmxpbmUodiA9IDExMiwgY29sID0gImJsdWUiLCBsdHkgPSAzKSAjIFRoZSBuIHlvdSBmb3VuZCBpbiAxYw0KYGBgDQoNClRoaXMgaXMgYSBncmFwaGljYWwgc3VtbWFyeSBmb3IgcG93ZXIgY29uc2lkZXJpbmcgc2FtcGxlIHNpemUgb3B0aW9ucy4gRGV0YWlsaW5nIG91dCBpbnRlcmVzdCBpbiBhIDAuODAgcG93ZXIgbGV2ZWwgd2UgdXNlIHNlZSB0aGUgc2FtcGxlIHNpemUgaXMgdGhlIGByIGNlaWxpbmcoc2FtcGxlX3NpemUkbilgLiBUaGlzIGluZm9ybWF0aW9uIGdyYXBoaWNhbGx5IHJlcHJlc2VudHMgdGhlIGluZm9ybWF0aW9uIGxpc3RlZCBpbiAxYywgbGVhdmluZyB0aGUgc2FtZSBpbnRlcnByZXRhdGlvbiBmb3IgdmFsaWRpdHkuIEJ5IGFuYWx5emluZyB0aGUgY3VydmF0dXJlIG9mIHRoZSBsaW5lLCB3ZSBzZWUgdGhlIHNhbXBsZSBzaXplIGZvciB0aGUgMC44IHBvd2VyIGxldmVsIGNvdmVycyB0aGUgbWFqb3JpdHkgb2YgdGhlIGN1cnZlLCBzdWdnZXN0aW5nIHNvbWUgc3RyZW5ndGggaW4gdGhlIGNhbGN1bGF0ZWQgMTEzIHNhbXBsZSBzaXplLiBXZSBzZWUgdGhlIHNhbXBsZSBzaXplcyBhYm92ZSAxNTAgZG8gbm90IGFzc2lzdCB0aGUgYW5hbHlzaXMgYXMgbXVjaCBhcyBhIHNtYWxsZXIgc2FtcGxlIGRvZXMgYXQgbG93ZXIgcHJvYmFiaWxpdGllcywgc28gYnkgZXllIDAuOCBwcm9iYWJpbGl0eSBpcyBhIGdvb2QgZmluYW5jaWFsIGJhbGFuY2UgYmV0d2VlbiBhIGxhcmdlIHNhbXBsZSBzaXplIHdpdGggYSBzdHJvbmdlciBlZmZlY3Qgc2l6ZS4NCg0KDQo8Zm9udCBjb2xvciA9ICJyZWQiPioqTm90ZSoqOiBGb3IgZWFjaCBvZiB0aGUgcXVlc3Rpb25zIGFib3ZlLCB3cml0ZSBhIHNob3J0IHN1bW1hcnkgb2Ygd2hhdCB5b3Ugb2JzZXJ2ZWQsIGp1c3RpZnkgd2h5IHlvdXIgYW5hbHlzaXMgaXMgdmFsaWQsIGFuZCBpbnRlcnByZXQgdGhlIHJlc3VsdHMuPC9mb250Pg==