library(binom)
library(car)
library(collapsibleTree)
library(dbplyr)
library(dplyr)
library(EnvStats)
library(ggformula)
library(ggplot2)
library(gmodels)
library(htmltools)
library(ISLR)
library(knitr)
library(lawstat)
library(markdown)
library(mosaic)
library(mdsr)
library(mosaicData)
library(nycflights13)
library(olsrr)
library(plyr)
library(purrr)
library(plotly)
library(resampledata)
library(rmarkdown)
library(rpart)
library(rpart.plot)
library(rvest)
library(SDaA)
library(shiny)
library(stringi)
library(tibble)
library(tidyr)
library(tidyselect)
library(tinytex)
library(yaml)
library(shiny)
  1. A pharmaceutical company conducted an experiment to compare the mean amount of time (in days) necessary for a patient to recover from the effects and complications that follow the onset of the common cold. In this experiment, thirty-one healthy females between the ages of 25 and 34 years of age were randomly divided into two groups.

In the first group, nVitC=15 females received a daily dose of 500 milligrams of Vitamin C. The second group consisted of nPlacebo=16 females, each of which was given a placebo, or rather a “fake” Vitamin C tablet. The recovery time - the time until the common cold symptoms had disappeared - for each of the thirty-one females was observed (in days). The data are provided below.

Received 500 mgs of Vitamin C: 6, 7, 7, 7, 8, 7, 7, 8, 7, 8, 10, 6, 8, 5, 6

Received a placebo: 10, 12, 8, 6, 9, 8, 11, 9, 11, 8, 12, 11, 9, 8, 10, 9

  1. Do these data indicate that the recovery time is quicker with Vitamin C than without? Carry out the appropriate statistical investigation with a permutation test. Ensure you show “where” your permutation test statistic lies on the distribution. Report your (empirical) P-value and your statistical inference. For the number of permutation tests, use 2999.

Prepare data, display boxplot, run basic stats

time = c(6, 7, 7, 7, 8, 7, 7, 8, 7, 8, 10, 6, 8, 5, 6, 10, 12, 8, 6, 9, 8, 11, 9, 11, 8, 12, 11, 9, 8, 10, 9)
ttment = c('vc','vc','vc','vc','vc','vc','vc','vc','vc','vc','vc','vc','vc','vc','vc', 'n','n','n','n','n','n','n','n','n','n','n','n','n','n','n','n')

df = data.frame(time, ttment)
head(df, 3)
ggplot(df, aes(x=ttment, y=time)) + geom_boxplot(col='red', fill='blue', width=0.5) + ggtitle('Cold recovery time comparing treatment vs no treatment') + coord_flip()

stats = favstats(~time | ttment, data = df)
stats

State Hypotheses H0: recovery time without treatment = recovery time with treatment –> recovery time without treatment - recovery time with treatment = 0 HA: recovery time without treatment != recovery time with treatment –> recovery time without treatment - recovery time with treatment > 0

Possible permutations of 31 people choosing 15 at the time

choose(31, 15)
[1] 300540195

proceed to do a random distribution of difference of means by conducting a permutation test by sampling 15 data point without replacement as treatment and the other 16 to the no treatment, calculate the means difference between the groups and store this difference into a vector for further calculations after we replicate this process 4999 more times as the first difference in means correspond to the observed values. Total permutations 5000

Determine the mean difference between the groups

ttmentMeanDiff = stats$mean[1] - stats$mean[2]
ttmentMeanDiff
[1] 2.304167
N = 2999
meanDiff.Per = numeric(N) #create a vector to store differences of means
index = sample(31, 15, replace=FALSE) #randomly pick 15 out of 31
index
 [1] 13 18  9  5 19 24 15 31 29 20 27 28 26 16  7
for(i in 1:N)
{ index = sample(31, 15, replace=FALSE) #randomly pick 15 numbers out of 31
  meanDiff.Per[i] = mean(df$time[index]) - mean(df$time[-index]) #mean difference between recovery time no treatment and treatment
}

Now we convert the meanDiff vecto into a dataframe

perm.df = data.frame(meanDiff.Per)
head(perm.df, 4)
tail(perm.df, 4)

Display the distribution of man difference and the value for the observed difference

hist(meanDiff.Per, xlab='Difference in recovery time between treated and untreated patients', ylab='Frequency', main='Permutation Test (3000) outcome', col='darkgreen')
abline(v=ttmentMeanDiff, col='red')

Compute Empirical P-value

pval = (1 + sum(meanDiff.Per >= (ttmentMeanDiff))) / (N + 1)
pval
[1] 0.0003333333

Getting a Pvalue of 0.00033 leads us to reject the hypothesis null indicating that the observed difference in means is larger than expected if it was just random plus the observed difference in recovery times is greater the values obtained in the permutation test. In conclusion we rehect H0 and conclude that there is a relation between treatment with Vit C and faster recovery times.

t.test(~time|ttment, alternative="greater", data=df)

    Welch Two Sample t-test

data:  time by ttment
t = 4.445, df = 27.08, p-value = 6.723e-05
alternative hypothesis: true difference in means between group n and group vc is greater than 0
95 percent confidence interval:
 1.421325      Inf
sample estimates:
 mean in group n mean in group vc 
        9.437500         7.133333 

Pvalue from T test is smaller than Empirical Pvalue.

  1. Re-test your statistical hypothesis in part (a) using the t-test. In doing so, state any assumptions about these data or conditions you are imposing on these data and conduct the necessary diagnostics to either confirm or refute such assumptions. Ensure you provide both the P-value and its interpretation related to these data.

We assumed the observed data (both Vit C treatment and placebo) have a normal distribution. We will display the Normal probability plot to confirm this assumption on both Vitamin c treatment and Placebo groups of observed values

ggplot(filter(df, ttment=="vc"), aes(sample= time)) + stat_qq(col='blue') + stat_qqline(col='red') + ggtitle('Normal Probability Distribution of Cold recovery Time: Vitamin c treatment')

ggplot(filter(df, ttment=="n"), aes(sample= time)) + stat_qq(col='blue') + stat_qqline(col='red') + ggtitle('Normal Probability Distribution of Cold recovery Time: Placebo')

  1. In a 1981 case , McCleskey v. Zant, lawyers for the defendent demonstrated that amongst all African-American convicted murderers in the state of Georgia, 35% were found guilty of killing caucasians and 6% of those who killed African-Americans received the death penalty. As a result, the lawyers claimed that racial discrimination was a factor in sentencing. This was contested by lawyers for the State of Georgia. They argued that “murders of black victims were more likely to be unaggravated bar-room brawls, liquor-induced arguments, or lovers quarrels” - crimes that rarely result in a death sentence. But, amongst white-victims, there was a higher proportion of killings committed in the course of an armed robbery or involving torture - which more often result in death sentences.

The table below summarizes data for all African-American convicted murders in Georgia, resulting from difference categories of crime. (For example, Aggravation Level 1 consists of bar-room brawls, liquor-induced arguments, etc., Aggravation Level 6 includes the most vicious, cold-blooded, unprovoked crimes).

                                          Sentenced to Death        Not Sentenced to Death
                 v  Victim was Caucasian          45                          85
             Victim was African-American          14                         218
             
  1. Visualize these data with a bar-graph (see Assignment One) that appropriately summarizes these counts.

conviction = rbind(c(45, 85), c(14, 218))
conviction
     [,1] [,2]
[1,]   45   85
[2,]   14  218
rownames(conviction) = c("Victim was Caucasian", "Victim as African American")
colnames(conviction) = c("Sentenced to Death", "Not Sentenced to Death")
conviction
                           Sentenced to Death Not Sentenced to Death
Victim was Caucasian                       45                     85
Victim as African American                 14                    218

barplot(conviction, main="Convictions based on the  victim's race", col=c("darkblue", "darkred"), legend=rownames(conviction)) 

  1. Do these data suggest that the race of the victim does appear to affect whether an African-American convicted of murder in Georgia will receive a death sentence? Interpret your findings. Should you reject the null hypothesis, provide an interval with 95% coverage/confidence.

Hypotheses H0: The race of the victim and the sentence are independent HA: the race of the victim and the sentence are not independent

xchisq.test(conviction, correct=FALSE)

    Pearson's Chi-squared test

data:  x
X-squared = 49.888, df = 1, p-value = 1.628e-12

  45.00    85.00 
( 21.19) (108.81)
[26.76]  [ 5.21] 
< 5.17>  <-2.28> 
   
  14.00   218.00 
( 37.81) (194.19)
[15.00]  [ 2.92] 
<-3.87>  < 1.71> 
   
key:
    observed
    (expected)
    [contribution to X-squared]
    <Pearson residual>
prop.test(c(45, 14), c(130, 232), alternative="greater", correct=FALSE)

    2-sample test for equality of proportions without continuity correction

data:  c out of c45 out of 13014 out of 232
X-squared = 49.888, df = 1, p-value = 8.138e-13
alternative hypothesis: greater
95 percent confidence interval:
 0.2125175 1.0000000
sample estimates:
    prop 1     prop 2 
0.34615385 0.06034483 

through chisq test, we get a Pvalue that is very small, 8.138e-13, which is confirmed through the prop test with Pvalue of 8.14e-13; the confidence interval found through the prop test gives us 0.2125 - 1. We got a confidence interval betweeen 0.2125 and 1. These results leads us to reject the H) and conclude that there is a relation between the race of the victim and the sentence.

Zobs = sqrt(49.888)
Zobs
[1] 7.063144
  1. Refer to a question from Assignment 1, where you were asked to refer to certain variables of the General Society Survey of 2002. For your convenience, the data file is linked below.
gss = read.csv("https://raw.githubusercontent.com/Statman44/Data602/main/GSS2002.csv")
head(gss, 3)
gss.df = gss[complete.cases(gss),]
gss.df
  1. Is there a relationship between one’s support for gun laws (variable name is GunLaw) and their opinion about current government spending on Science (variable name is SpendSci)? State the appropriate statistical hypotheses.
tableGss = tally(~GunLaw + SpendSci, data=gss.df)
tableGss
        SpendSci
GunLaw   About right Too little Too much
  Favor           39         24        6
  Oppose           9         11        3

Hypotheses H0: Gun Law and Spending on Science support are Independent of each other HA: Gun Law and Spending on Science support are not independent of each other

  1. Carry out the appropriate statistical test, providing both the test statistic and the P-value.
xchisq.test(tableGss, simulate.p.value=TRUE)

    Pearson's Chi-squared test with simulated p-value (based on 2000 replicates)

data:  x
X-squared = 2.1048, df = NA, p-value = 0.3793

   39       24        6   
(36.00)  (26.25)  ( 6.75) 
[0.250]  [0.193]  [0.083] 
< 0.50>  <-0.44>  <-0.29> 
     
    9       11        3   
(12.00)  ( 8.75)  ( 2.25) 
[0.750]  [0.579]  [0.250] 
<-0.87>  < 0.76>  < 0.50> 
     
key:
    observed
    (expected)
    [contribution to X-squared]
    <Pearson residual>

According to the chi squared test we get a Pvalue of 0.918 and Chi-squared of 2.1048

  1. What can you conclude? Do these data support your null hypothesis in part (a)? State your decision and conclusion. According to the results we got, we fail to reject the hypothesis null. We can say that there is no relation between the support of Gun Law and Spending on Science.

  2. Re-trace your result, in the form of a bar-graph, that was provided in Assignment 1, Question 9. Can you infer from these data that one’s level of Education is independent of their Race? Present your findings in the form of a paragraph, outlining the decision you have made, why you made the decision you made, and the P -value.

ggplot(data=gss) + geom_bar(aes(x = Education, fill = Race), position = "fill")

ggplot(data=gss) + geom_bar(aes(x = Education, fill=Race), position = "dodge", na.rm=TRUE)

tableGss1 = tally(~Education + Race, data=gss.df)
tableGss1
           Race
Education   Black Other White
  Bachelors     2     1    24
  Graduate      1     1    15
  HS            5     2    29
  Jr Col        1     0     7
  Left HS       0     0     4

Hypotheses: H0: the level of education and Race are independent HA: the level of education and race are not independent

xchisq.test(tableGss1, simulate.p.value=TRUE)

    Pearson's Chi-squared test with simulated p-value (based on 2000 replicates)

data:  x
X-squared = 2.5062, df = NA, p-value = 0.979

    2        1       24   
( 2.64)  ( 1.17)  (23.18) 
[0.1557] [0.0258] [0.0287]
<-0.39>  <-0.16>  < 0.17> 
     
    1        1       15   
( 1.66)  ( 0.74)  (14.60) 
[0.2644] [0.0921] [0.0111]
<-0.51>  < 0.30>  < 0.11> 
     
    5        2       29   
( 3.52)  ( 1.57)  (30.91) 
[0.6205] [0.1208] [0.1184]
< 0.79>  < 0.35>  <-0.34> 
     
    1        0        7   
( 0.78)  ( 0.35)  ( 6.87) 
[0.0604] [0.3478] [0.0025]
< 0.25>  <-0.59>  < 0.05> 
     
    0        0        4   
( 0.39)  ( 0.17)  ( 3.43) 
[0.3913] [0.1739] [0.0930]
<-0.63>  <-0.42>  < 0.30> 
     
key:
    observed
    (expected)
    [contribution to X-squared]
    <Pearson residual>

According to the results, Pvalue=0.759 so we fail to reject the hypothesis null and conclude that there is no relation between one’s level of education and race.

  1. A group of patients with a binge-eating disorder were randomly assigned to take either the experimental drug fluvoxamine or the placebo in a nine-week-long, double-blinded clinical trial. At the end of the trial the condition of each patient was classified into one of four categories: no response, moderate response, marked response, or remission. The table below shows a cross-classification, or contingency table, of these data.

           No Response        Moderate Response       Marked response     Remission     

    Fluvoxamine 15 7 3 15 Placebo 22 7 3 11

Do these data provide statistically significant evidence to conclude that there is an association between the type of treatment received and a patient’s response?

Hypotheses H0: The patient’s response to treatment and the use of Fluvoxamine are independent HA: The patient’s response to treatment and the use of Fluvoxamine are not independent

bingeTable = rbind(c(15, 7, 3, 15), c(22, 7, 3, 11))
rownames(bingeTable) = c("Fluvoxamine", "Placebo")
colnames(bingeTable) = c("No Response", "Moderate Response", "Marked Response", "Remission")
bingeTable
            No Response Moderate Response Marked Response Remission
Fluvoxamine          15                 7               3        15
Placebo              22                 7               3        11
xchisq.test(bingeTable, simulate.p.value=TRUE)

    Pearson's Chi-squared test with simulated p-value (based on 2000 replicates)

data:  x
X-squared = 1.8337, df = NA, p-value = 0.6332

 15.00     7.00     3.00    15.00  
(17.83)  ( 6.75)  ( 2.89)  (12.53) 
[0.4496] [0.0095] [0.0041] [0.4869]
<-0.670> < 0.097> < 0.064> < 0.698>
       
 22.00     7.00     3.00    11.00  
(19.17)  ( 7.25)  ( 3.11)  (13.47) 
[0.4182] [0.0088] [0.0038] [0.4529]
< 0.647> <-0.094> <-0.062> <-0.673>
       
key:
    observed
    (expected)
    [contribution to X-squared]
    <Pearson residual>

We got a Pvalue of 0.6082 we fail to reject the hypothesis null and therefore we can say that there is no relation between the treatment with Fluvoxamine and the response of the patients.

  1. A study conducted by Youmans and Jee2 looked at students who took a research methods class in psychology. Two lecture sections of the same course were taught by the same instructor. Students in each lecture section were required to register in one of two Friday afternoon discussion sections, or a tutorial. During the ninth week of instruction, all students were asked to fill out an informal midsemester evaluation in their Friday afternoon discussion session.

In half of the Friday afternoon discussion sections, the experimenter (not the professor/instructor!) passed around a bag containing small bars of chocolate that he simply had ‘left-over’ and ‘wanted to get rid of’ so that students would not think the chocolate was a gift from their professor/instructor. The evaluation was a survey that contained nine questions. For each question the student provided a rating from 1 (very poor) to 5 (excellent).

Question 9 posed the following: ``Compared to other instructors you have had at this university, this instrutor is:’’ 1 (very poor) to 5 (excellent)

Compliments to the authors, they have provided me with the data in this particular study. In the file you will find the raw data providing the student responses for Question 9 (Q9) and the overall average response for Questions 1 through 9 (Overall) for each student. Note: To easily read this into your R session, select the “Raw” button prior, then use the resulting URL.

Ssurvey = read.csv("https://raw.githubusercontent.com/Statman44/Data602/main/chocnochocratings.csv")
head(Ssurvey, 3)
  1. Pertaining to Question 9: Do these data suggest there is a treatment effect? Test the existence of a treatment effect using a permutation test. If a treatment effect is discovered, explain its meaning in the context of these data. Carry out a permutation test, using 1999 iterations.

(You will have to carefully consider “what a treatment effect” is in this scenario.)

The treatment here is the administration of chocolate. By looking at the data we can see that they all were offered the chocolate but some took it some others didn’t take the chocolate. Did the administration of chocolate influence their survey response to Q9?

Hypotheses H0: The responses to Q9 in the survey and the treatment are independent Q9 treatment = Q9 no treatment HA: the responses to Q9 in the survey and the treatment are not independent Q9 treatment > Q9 no treatment

Exploring the data

ggplot(Ssurvey, aes(x = GroupName, y = Q9)) + geom_boxplot(col="red", fill="blue", width=0.5) + ggtitle("Q9 Student Survey: treatment effect") + coord_flip()

favstats(~Q9|GroupName, data= Ssurvey)
obsdiff.ttmt = mean(~Q9, data = filter(Ssurvey, GroupName == "Chocolate")) - mean(~Q9, data = filter(Ssurvey, GroupName == "NOChoc"))
obsdiff.ttmt
[1] 0.2033333

Performing 1999 permutations

N = 1999 
perms = numeric(N) 
for(i in 1:N)
{ index = sample(98, 50, replace=FALSE) 
  perms[i] = mean(Ssurvey$Q9[index]) - mean(Ssurvey$Q9[-index]) 
}
perms.df = data.frame(perms)
head(perms.df,4)
tail(perms.df, 3)

Display a histogram to understand the distribution of the permutations

hist(perms, xlab="Difference Between Mean answer to Q9 (Chocolate - NoChocolate)", ylab="Frequency", main="Outcome of 2000 Permutation Tests", col='blue')
abline(v = obsdiff.ttmt, col="red")

Find the Empirical Pvalue

(sum(perms >= obsdiff.ttmt) + 1 )/(N + 1)  #computes empirical P-value
[1] 0.161
  1. Consider the variable Overall. Is there a treatment effect with respect to the professor’s overall rating as a teacher? Apply the t-test to these data. Interpret the meaning of the P-value. (chitest and xchitest)

Hypotheses H0: the overall score and the treatment are independent HA: the overall score and the treatment are not independent

tableSsurvey = tally(~Overall + GroupName, data=Ssurvey)
tableSsurvey
       GroupName
Overall Chocolate NOChoc
   2            0      1
   2.44         1      0
   2.56         1      1
   2.67         1      0
   2.78         0      1
   2.89         2      1
   3            2      3
   3.11         0      2
   3.33         0      2
   3.44         1      1
   3.56         1      2
   3.67         6      2
   3.78         2      4
   3.89         2      6
   4            3      3
   4.11         3      0
   4.22         3      8
   4.33         2      2
   4.44         3      2
   4.56         6      3
   4.67         3      2
   4.78         1      0
   4.89         3      0
   5            4      2

Graphing Normal Probability plot for both Treatment and No Treatment

ggplot(filter(Ssurvey, GroupName == "Chocolate"), aes(sample = Overall)) + stat_qq(col="blue") + stat_qqline(col="red") + ggtitle("Normal Probability Plot of Student Survey: Treatment")

ggplot(filter(Ssurvey, GroupName == "NOChoc"), aes(sample = Overall)) + stat_qq(col="blue") + stat_qqline(col="red") + ggtitle("Normal Probability Plot of Student Survey: No Treatment")

t.test(~Overall | GroupName, data = Ssurvey, alternative='greater')

    Welch Two Sample t-test

data:  Overall by GroupName
t = 1.6616, df = 95.93, p-value = 0.04993
alternative hypothesis: true difference in means between group Chocolate and group NOChoc is greater than 0
95 percent confidence interval:
 9.400666e-05          Inf
sample estimates:
mean in group Chocolate    mean in group NOChoc 
               4.072000                3.849792 

According the the Pvalue we get from the t.test of 0.05, and the empirical Pvalue of 0.161, we fail to reject the hypothesis null and conclude that the professor’s overall rating is independent of the student’s treatment with chocolate

chisq.test(tableSsurvey, simulate.p.value=TRUE)

    Pearson's Chi-squared test with simulated p-value (based on 2000 replicates)

data:  tableSsurvey
X-squared = 24.842, df = NA, p-value = 0.3708
  1. Consider the test suggested in part (a). Why would a t-test not be a recommended statistical method to carry out the test in part (a)? Explain your answer in a few sentences.

R./ We can see in the boxplots how similar the stats for the 2 groups are, this is confirmed by the favstats results. The permutation will help magnify the differences between the two groups and give statistical significance to the difference, if any. Permutations are good when we do not know much about the population and we don’t need to do assumptions. The Ttest assumes the data has normal distribution whiche here we have some data skewed.

LS0tCnRpdGxlOiAiNjAyLUFzc2lnbWVudDQtMSIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKYGBge3J9CmxpYnJhcnkoYmlub20pCmxpYnJhcnkoY2FyKQpsaWJyYXJ5KGNvbGxhcHNpYmxlVHJlZSkKbGlicmFyeShkYnBseXIpCmxpYnJhcnkoZHBseXIpCmxpYnJhcnkoRW52U3RhdHMpCmxpYnJhcnkoZ2dmb3JtdWxhKQpsaWJyYXJ5KGdncGxvdDIpCmxpYnJhcnkoZ21vZGVscykKbGlicmFyeShodG1sdG9vbHMpCmxpYnJhcnkoSVNMUikKbGlicmFyeShrbml0cikKbGlicmFyeShsYXdzdGF0KQpsaWJyYXJ5KG1hcmtkb3duKQpsaWJyYXJ5KG1vc2FpYykKbGlicmFyeShtZHNyKQpsaWJyYXJ5KG1vc2FpY0RhdGEpCmxpYnJhcnkobnljZmxpZ2h0czEzKQpsaWJyYXJ5KG9sc3JyKQpsaWJyYXJ5KHBseXIpCmxpYnJhcnkocHVycnIpCmxpYnJhcnkocGxvdGx5KQpsaWJyYXJ5KHJlc2FtcGxlZGF0YSkKbGlicmFyeShybWFya2Rvd24pCmxpYnJhcnkocnBhcnQpCmxpYnJhcnkocnBhcnQucGxvdCkKbGlicmFyeShydmVzdCkKbGlicmFyeShTRGFBKQpsaWJyYXJ5KHNoaW55KQpsaWJyYXJ5KHN0cmluZ2kpCmxpYnJhcnkodGliYmxlKQpsaWJyYXJ5KHRpZHlyKQpsaWJyYXJ5KHRpZHlzZWxlY3QpCmxpYnJhcnkodGlueXRleCkKbGlicmFyeSh5YW1sKQpsaWJyYXJ5KHNoaW55KQpgYGAKCjEuIEEgcGhhcm1hY2V1dGljYWwgY29tcGFueSBjb25kdWN0ZWQgYW4gZXhwZXJpbWVudCB0byBjb21wYXJlIHRoZSBtZWFuIGFtb3VudCBvZiB0aW1lIChpbiBkYXlzKSBuZWNlc3NhcnkgZm9yIGEgcGF0aWVudCB0byByZWNvdmVyIGZyb20gdGhlIGVmZmVjdHMgYW5kIGNvbXBsaWNhdGlvbnMgdGhhdCBmb2xsb3cgdGhlIG9uc2V0IG9mIHRoZSBjb21tb24gY29sZC4gSW4gdGhpcyBleHBlcmltZW50LCB0aGlydHktb25lIGhlYWx0aHkgZmVtYWxlcyBiZXR3ZWVuIHRoZSBhZ2VzIG9mIDI1IGFuZCAzNCB5ZWFycyBvZiBhZ2Ugd2VyZSByYW5kb21seSBkaXZpZGVkIGludG8gdHdvIGdyb3Vwcy4KCkluIHRoZSBmaXJzdCBncm91cCwgblZpdEM9MTUgIGZlbWFsZXMgcmVjZWl2ZWQgYSBkYWlseSBkb3NlIG9mIDUwMCBtaWxsaWdyYW1zIG9mIFZpdGFtaW4gQy4gVGhlIHNlY29uZCBncm91cCBjb25zaXN0ZWQgb2YgblBsYWNlYm89MTYgZmVtYWxlcywgZWFjaCBvZiB3aGljaCB3YXMgZ2l2ZW4gYSBwbGFjZWJvLCBvciByYXRoZXIgYSDigJxmYWtl4oCdIFZpdGFtaW4gQyB0YWJsZXQuIFRoZSByZWNvdmVyeSB0aW1lIC0gdGhlIHRpbWUgdW50aWwgdGhlIGNvbW1vbiBjb2xkIHN5bXB0b21zIGhhZCBkaXNhcHBlYXJlZCAtIGZvciBlYWNoIG9mIHRoZSB0aGlydHktb25lIGZlbWFsZXMgd2FzIG9ic2VydmVkIChpbiBkYXlzKS4gVGhlIGRhdGEgYXJlIHByb3ZpZGVkIGJlbG93LgoKUmVjZWl2ZWQgNTAwIG1ncyBvZiBWaXRhbWluIEM6IDYsIDcsIDcsIDcsIDgsIDcsIDcsIDgsIDcsIDgsIDEwLCA2LCA4LCA1LCA2CgpSZWNlaXZlZCBhIHBsYWNlYm86IDEwLCAxMiwgOCwgNiwgOSwgOCwgMTEsIDksIDExLCA4LCAxMiwgMTEsIDksIDgsIDEwLCA5CgphLiBEbyB0aGVzZSBkYXRhIGluZGljYXRlIHRoYXQgdGhlIHJlY292ZXJ5IHRpbWUgaXMgcXVpY2tlciB3aXRoIFZpdGFtaW4gQyB0aGFuIHdpdGhvdXQ/IENhcnJ5IG91dCB0aGUgYXBwcm9wcmlhdGUgc3RhdGlzdGljYWwgaW52ZXN0aWdhdGlvbiB3aXRoIGEgcGVybXV0YXRpb24gdGVzdC4gRW5zdXJlIHlvdSBzaG93IOKAnHdoZXJl4oCdIHlvdXIgcGVybXV0YXRpb24gdGVzdCBzdGF0aXN0aWMgbGllcyBvbiB0aGUgZGlzdHJpYnV0aW9uLiBSZXBvcnQgeW91ciAoZW1waXJpY2FsKSBQLXZhbHVlIGFuZCB5b3VyIHN0YXRpc3RpY2FsIGluZmVyZW5jZS4gRm9yIHRoZSBudW1iZXIgb2YgcGVybXV0YXRpb24gdGVzdHMsIHVzZSAyOTk5LgoKUHJlcGFyZSBkYXRhLCBkaXNwbGF5IGJveHBsb3QsIHJ1biBiYXNpYyBzdGF0cwoKYGBge3J9CnRpbWUgPSBjKDYsIDcsIDcsIDcsIDgsIDcsIDcsIDgsIDcsIDgsIDEwLCA2LCA4LCA1LCA2LCAxMCwgMTIsIDgsIDYsIDksIDgsIDExLCA5LCAxMSwgOCwgMTIsIDExLCA5LCA4LCAxMCwgOSkKdHRtZW50ID0gYygndmMnLCd2YycsJ3ZjJywndmMnLCd2YycsJ3ZjJywndmMnLCd2YycsJ3ZjJywndmMnLCd2YycsJ3ZjJywndmMnLCd2YycsJ3ZjJywgJ24nLCduJywnbicsJ24nLCduJywnbicsJ24nLCduJywnbicsJ24nLCduJywnbicsJ24nLCduJywnbicsJ24nKQoKZGYgPSBkYXRhLmZyYW1lKHRpbWUsIHR0bWVudCkKaGVhZChkZiwgMykKYGBgCmBgYHtyfQpnZ3Bsb3QoZGYsIGFlcyh4PXR0bWVudCwgeT10aW1lKSkgKyBnZW9tX2JveHBsb3QoY29sPSdyZWQnLCBmaWxsPSdibHVlJywgd2lkdGg9MC41KSArIGdndGl0bGUoJ0NvbGQgcmVjb3ZlcnkgdGltZSBjb21wYXJpbmcgdHJlYXRtZW50IHZzIG5vIHRyZWF0bWVudCcpICsgY29vcmRfZmxpcCgpCmBgYApgYGB7cn0Kc3RhdHMgPSBmYXZzdGF0cyh+dGltZSB8IHR0bWVudCwgZGF0YSA9IGRmKQpzdGF0cwpgYGAKCgpTdGF0ZSBIeXBvdGhlc2VzCiAgICAgICAgICBIMDogcmVjb3ZlcnkgdGltZSB3aXRob3V0IHRyZWF0bWVudCA9IHJlY292ZXJ5IHRpbWUgd2l0aCB0cmVhdG1lbnQgIC0tPiByZWNvdmVyeSB0aW1lIHdpdGhvdXQgdHJlYXRtZW50IC0gcmVjb3ZlcnkgdGltZSB3aXRoIHRyZWF0bWVudCA9IDAKICAgICAgICAgIEhBOiByZWNvdmVyeSB0aW1lIHdpdGhvdXQgdHJlYXRtZW50ICE9IHJlY292ZXJ5IHRpbWUgd2l0aCB0cmVhdG1lbnQgLS0+IHJlY292ZXJ5IHRpbWUgd2l0aG91dCB0cmVhdG1lbnQgLSByZWNvdmVyeSB0aW1lIHdpdGggdHJlYXRtZW50ID4gMAogICAgICAgICAgClBvc3NpYmxlIHBlcm11dGF0aW9ucyBvZiAzMSBwZW9wbGUgY2hvb3NpbmcgMTUgYXQgdGhlIHRpbWUKYGBge3J9CmNob29zZSgzMSwgMTUpCmBgYApwcm9jZWVkIHRvIGRvIGEgcmFuZG9tIGRpc3RyaWJ1dGlvbiBvZiBkaWZmZXJlbmNlIG9mIG1lYW5zIGJ5IGNvbmR1Y3RpbmcgYSBwZXJtdXRhdGlvbiB0ZXN0IGJ5IHNhbXBsaW5nIDE1IGRhdGEgcG9pbnQgd2l0aG91dCByZXBsYWNlbWVudCBhcyB0cmVhdG1lbnQgYW5kIHRoZSBvdGhlciAxNiB0byB0aGUgbm8gdHJlYXRtZW50LCBjYWxjdWxhdGUgdGhlIG1lYW5zIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgZ3JvdXBzIGFuZCBzdG9yZSB0aGlzIGRpZmZlcmVuY2UgaW50byBhIHZlY3RvciBmb3IgZnVydGhlciBjYWxjdWxhdGlvbnMgYWZ0ZXIgd2UgcmVwbGljYXRlIHRoaXMgcHJvY2VzcyA0OTk5IG1vcmUgdGltZXMgYXMgdGhlIGZpcnN0IGRpZmZlcmVuY2UgaW4gbWVhbnMgY29ycmVzcG9uZCB0byB0aGUgb2JzZXJ2ZWQgdmFsdWVzLiBUb3RhbCBwZXJtdXRhdGlvbnMgNTAwMAoKRGV0ZXJtaW5lIHRoZSBtZWFuIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgZ3JvdXBzCmBgYHtyfQp0dG1lbnRNZWFuRGlmZiA9IHN0YXRzJG1lYW5bMV0gLSBzdGF0cyRtZWFuWzJdCnR0bWVudE1lYW5EaWZmCmBgYApgYGB7cn0KTiA9IDI5OTkKbWVhbkRpZmYuUGVyID0gbnVtZXJpYyhOKSAjY3JlYXRlIGEgdmVjdG9yIHRvIHN0b3JlIGRpZmZlcmVuY2VzIG9mIG1lYW5zCmluZGV4ID0gc2FtcGxlKDMxLCAxNSwgcmVwbGFjZT1GQUxTRSkgI3JhbmRvbWx5IHBpY2sgMTUgb3V0IG9mIDMxCmluZGV4CmZvcihpIGluIDE6TikKeyBpbmRleCA9IHNhbXBsZSgzMSwgMTUsIHJlcGxhY2U9RkFMU0UpICNyYW5kb21seSBwaWNrIDE1IG51bWJlcnMgb3V0IG9mIDMxCiAgbWVhbkRpZmYuUGVyW2ldID0gbWVhbihkZiR0aW1lW2luZGV4XSkgLSBtZWFuKGRmJHRpbWVbLWluZGV4XSkgI21lYW4gZGlmZmVyZW5jZSBiZXR3ZWVuIHJlY292ZXJ5IHRpbWUgbm8gdHJlYXRtZW50IGFuZCB0cmVhdG1lbnQKfQpgYGAKTm93IHdlIGNvbnZlcnQgdGhlIG1lYW5EaWZmIHZlY3RvIGludG8gYSBkYXRhZnJhbWUKYGBge3J9CnBlcm0uZGYgPSBkYXRhLmZyYW1lKG1lYW5EaWZmLlBlcikKaGVhZChwZXJtLmRmLCA0KQpgYGAKYGBge3J9CnRhaWwocGVybS5kZiwgNCkKYGBgCkRpc3BsYXkgdGhlIGRpc3RyaWJ1dGlvbiBvZiBtYW4gZGlmZmVyZW5jZSBhbmQgdGhlIHZhbHVlIGZvciB0aGUgb2JzZXJ2ZWQgZGlmZmVyZW5jZQpgYGB7cn0KaGlzdChtZWFuRGlmZi5QZXIsIHhsYWI9J0RpZmZlcmVuY2UgaW4gcmVjb3ZlcnkgdGltZSBiZXR3ZWVuIHRyZWF0ZWQgYW5kIHVudHJlYXRlZCBwYXRpZW50cycsIHlsYWI9J0ZyZXF1ZW5jeScsIG1haW49J1Blcm11dGF0aW9uIFRlc3QgKDMwMDApIG91dGNvbWUnLCBjb2w9J2RhcmtncmVlbicpCmFibGluZSh2PXR0bWVudE1lYW5EaWZmLCBjb2w9J3JlZCcpCmBgYApDb21wdXRlIEVtcGlyaWNhbCBQLXZhbHVlCmBgYHtyfQpwdmFsID0gKDEgKyBzdW0obWVhbkRpZmYuUGVyID49ICh0dG1lbnRNZWFuRGlmZikpKSAvIChOICsgMSkKcHZhbApgYGAKR2V0dGluZyBhIFB2YWx1ZSBvZiAwLjAwMDMzIGxlYWRzIHVzIHRvIHJlamVjdCB0aGUgaHlwb3RoZXNpcyBudWxsIGluZGljYXRpbmcgdGhhdCAgdGhlIG9ic2VydmVkIGRpZmZlcmVuY2UgaW4gbWVhbnMgaXMgbGFyZ2VyIHRoYW4gZXhwZWN0ZWQgaWYgaXQgd2FzIGp1c3QgcmFuZG9tIHBsdXMgdGhlICBvYnNlcnZlZCBkaWZmZXJlbmNlIGluIHJlY292ZXJ5IHRpbWVzIGlzIGdyZWF0ZXIgdGhlIHZhbHVlcyBvYnRhaW5lZCBpbiB0aGUgcGVybXV0YXRpb24gdGVzdC4gSW4gY29uY2x1c2lvbiB3ZSByZWhlY3QgSDAgYW5kIGNvbmNsdWRlIHRoYXQgdGhlcmUgIGlzIGEgcmVsYXRpb24gYmV0d2VlbiB0cmVhdG1lbnQgd2l0aCBWaXQgQyBhbmQgZmFzdGVyIHJlY292ZXJ5IHRpbWVzLiAKCgpgYGB7cn0KdC50ZXN0KH50aW1lfHR0bWVudCwgYWx0ZXJuYXRpdmU9ImdyZWF0ZXIiLCBkYXRhPWRmKQpgYGAKUHZhbHVlIGZyb20gVCB0ZXN0IGlzIHNtYWxsZXIgdGhhbiBFbXBpcmljYWwgUHZhbHVlLiAgCgpiLiBSZS10ZXN0IHlvdXIgc3RhdGlzdGljYWwgaHlwb3RoZXNpcyBpbiBwYXJ0IChhKSB1c2luZyB0aGUgdC10ZXN0LiBJbiBkb2luZyBzbywgc3RhdGUgYW55IGFzc3VtcHRpb25zIGFib3V0IHRoZXNlIGRhdGEgb3IgY29uZGl0aW9ucyB5b3UgYXJlIGltcG9zaW5nIG9uIHRoZXNlIGRhdGEgYW5kIGNvbmR1Y3QgdGhlIG5lY2Vzc2FyeSBkaWFnbm9zdGljcyB0byBlaXRoZXIgY29uZmlybSBvciByZWZ1dGUgc3VjaCBhc3N1bXB0aW9ucy4gRW5zdXJlIHlvdSBwcm92aWRlIGJvdGggdGhlIFAtdmFsdWUgYW5kIGl0cyBpbnRlcnByZXRhdGlvbiByZWxhdGVkIHRvIHRoZXNlIGRhdGEuCgoKV2UgYXNzdW1lZCB0aGUgb2JzZXJ2ZWQgZGF0YSAoYm90aCBWaXQgQyB0cmVhdG1lbnQgYW5kIHBsYWNlYm8pIGhhdmUgYSBub3JtYWwgZGlzdHJpYnV0aW9uLiBXZSB3aWxsIGRpc3BsYXkgdGhlIE5vcm1hbCBwcm9iYWJpbGl0eSBwbG90IHRvIGNvbmZpcm0gdGhpcyBhc3N1bXB0aW9uIG9uIGJvdGggVml0YW1pbiBjIHRyZWF0bWVudCBhbmQgUGxhY2VibyBncm91cHMgb2Ygb2JzZXJ2ZWQgdmFsdWVzCmBgYHtyfQpnZ3Bsb3QoZmlsdGVyKGRmLCB0dG1lbnQ9PSJ2YyIpLCBhZXMoc2FtcGxlPSB0aW1lKSkgKyBzdGF0X3FxKGNvbD0nYmx1ZScpICsgc3RhdF9xcWxpbmUoY29sPSdyZWQnKSArIGdndGl0bGUoJ05vcm1hbCBQcm9iYWJpbGl0eSBEaXN0cmlidXRpb24gb2YgQ29sZCByZWNvdmVyeSBUaW1lOiBWaXRhbWluIGMgdHJlYXRtZW50JykKYGBgCmBgYHtyfQpnZ3Bsb3QoZmlsdGVyKGRmLCB0dG1lbnQ9PSJuIiksIGFlcyhzYW1wbGU9IHRpbWUpKSArIHN0YXRfcXEoY29sPSdibHVlJykgKyBzdGF0X3FxbGluZShjb2w9J3JlZCcpICsgZ2d0aXRsZSgnTm9ybWFsIFByb2JhYmlsaXR5IERpc3RyaWJ1dGlvbiBvZiBDb2xkIHJlY292ZXJ5IFRpbWU6IFBsYWNlYm8nKQpgYGAKCgoyLiBJbiBhIDE5ODEgY2FzZSAsIE1jQ2xlc2tleSB2LiBaYW50LCBsYXd5ZXJzIGZvciB0aGUgZGVmZW5kZW50IGRlbW9uc3RyYXRlZCB0aGF0IGFtb25nc3QgYWxsIEFmcmljYW4tQW1lcmljYW4gY29udmljdGVkIG11cmRlcmVycyBpbiB0aGUgc3RhdGUgb2YgR2VvcmdpYSwgMzUlIHdlcmUgZm91bmQgZ3VpbHR5IG9mIGtpbGxpbmcgY2F1Y2FzaWFucyBhbmQgNiUgb2YgdGhvc2Ugd2hvIGtpbGxlZCBBZnJpY2FuLUFtZXJpY2FucyByZWNlaXZlZCB0aGUgZGVhdGggcGVuYWx0eS4gQXMgYSByZXN1bHQsIHRoZSBsYXd5ZXJzIGNsYWltZWQgdGhhdCByYWNpYWwgZGlzY3JpbWluYXRpb24gd2FzIGEgZmFjdG9yIGluIHNlbnRlbmNpbmcuIFRoaXMgd2FzIGNvbnRlc3RlZCBieSBsYXd5ZXJzIGZvciB0aGUgU3RhdGUgb2YgR2VvcmdpYS4gVGhleSBhcmd1ZWQgdGhhdCDigJxtdXJkZXJzIG9mIGJsYWNrIHZpY3RpbXMgd2VyZSBtb3JlIGxpa2VseSB0byBiZSB1bmFnZ3JhdmF0ZWQgYmFyLXJvb20gYnJhd2xzLCBsaXF1b3ItaW5kdWNlZCBhcmd1bWVudHMsIG9yIGxvdmVycyBxdWFycmVsc+KAnSAtIGNyaW1lcyB0aGF0IHJhcmVseSByZXN1bHQgaW4gYSBkZWF0aCBzZW50ZW5jZS4gQnV0LCBhbW9uZ3N0IHdoaXRlLXZpY3RpbXMsIHRoZXJlIHdhcyBhIGhpZ2hlciBwcm9wb3J0aW9uIG9mIGtpbGxpbmdzIGNvbW1pdHRlZCBpbiB0aGUgY291cnNlIG9mIGFuIGFybWVkIHJvYmJlcnkgb3IgaW52b2x2aW5nIHRvcnR1cmUgLSB3aGljaCBtb3JlIG9mdGVuIHJlc3VsdCBpbiBkZWF0aCBzZW50ZW5jZXMuCgpUaGUgdGFibGUgYmVsb3cgc3VtbWFyaXplcyBkYXRhIGZvciBhbGwgQWZyaWNhbi1BbWVyaWNhbiBjb252aWN0ZWQgbXVyZGVycyBpbiBHZW9yZ2lhLCByZXN1bHRpbmcgZnJvbSBkaWZmZXJlbmNlIGNhdGVnb3JpZXMgb2YgY3JpbWUuIChGb3IgZXhhbXBsZSwgQWdncmF2YXRpb24gTGV2ZWwgMSBjb25zaXN0cyBvZiBiYXItcm9vbSBicmF3bHMsIGxpcXVvci1pbmR1Y2VkIGFyZ3VtZW50cywgZXRjLiwgQWdncmF2YXRpb24gTGV2ZWwgNiBpbmNsdWRlcyB0aGUgbW9zdCB2aWNpb3VzLCBjb2xkLWJsb29kZWQsIHVucHJvdm9rZWQgY3JpbWVzKS4KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZW50ZW5jZWQgdG8gRGVhdGggICAgICAgIE5vdCBTZW50ZW5jZWQgdG8gRGVhdGgKICAgICAgICAgICAgICAgICAgICAgdiAgVmljdGltIHdhcyBDYXVjYXNpYW4gICAgICAgICAgNDUgICAgICAgICAgICAgICAgICAgICAgICAgIDg1CiAgICAgICAgICAgICAgICAgVmljdGltIHdhcyBBZnJpY2FuLUFtZXJpY2FuICAgICAgICAgIDE0ICAgICAgICAgICAgICAgICAgICAgICAgIDIxOAogICAgICAgICAgICAgICAgIAphLiBWaXN1YWxpemUgdGhlc2UgZGF0YSB3aXRoIGEgYmFyLWdyYXBoIChzZWUgQXNzaWdubWVudCBPbmUpIHRoYXQgYXBwcm9wcmlhdGVseSBzdW1tYXJpemVzIHRoZXNlIGNvdW50cy4KICAKYGBge3J9Cgpjb252aWN0aW9uID0gcmJpbmQoYyg0NSwgODUpLCBjKDE0LCAyMTgpKQpjb252aWN0aW9uCmBgYApgYGB7cn0Kcm93bmFtZXMoY29udmljdGlvbikgPSBjKCJWaWN0aW0gd2FzIENhdWNhc2lhbiIsICJWaWN0aW0gYXMgQWZyaWNhbiBBbWVyaWNhbiIpCmNvbG5hbWVzKGNvbnZpY3Rpb24pID0gYygiU2VudGVuY2VkIHRvIERlYXRoIiwgIk5vdCBTZW50ZW5jZWQgdG8gRGVhdGgiKQpjb252aWN0aW9uCmBgYAogIApgYGB7cn0KCmJhcnBsb3QoY29udmljdGlvbiwgbWFpbj0iQ29udmljdGlvbnMgYmFzZWQgb24gdGhlICB2aWN0aW0ncyByYWNlIiwgY29sPWMoImRhcmtibHVlIiwgImRhcmtyZWQiKSwgbGVnZW5kPXJvd25hbWVzKGNvbnZpY3Rpb24pKSAKYGBgCgpiLiBEbyB0aGVzZSBkYXRhIHN1Z2dlc3QgdGhhdCB0aGUgcmFjZSBvZiB0aGUgdmljdGltIGRvZXMgYXBwZWFyIHRvIGFmZmVjdCB3aGV0aGVyIGFuIEFmcmljYW4tQW1lcmljYW4gY29udmljdGVkIG9mIG11cmRlciBpbiBHZW9yZ2lhIHdpbGwgcmVjZWl2ZSBhIGRlYXRoIHNlbnRlbmNlPyBJbnRlcnByZXQgeW91ciBmaW5kaW5ncy4gU2hvdWxkIHlvdSByZWplY3QgdGhlIG51bGwgaHlwb3RoZXNpcywgcHJvdmlkZSBhbiBpbnRlcnZhbCB3aXRoIDk1JSBjb3ZlcmFnZS9jb25maWRlbmNlLgoKSHlwb3RoZXNlcwpIMDogVGhlIHJhY2Ugb2YgdGhlIHZpY3RpbSBhbmQgdGhlIHNlbnRlbmNlIGFyZSBpbmRlcGVuZGVudApIQTogdGhlIHJhY2Ugb2YgdGhlIHZpY3RpbSBhbmQgdGhlIHNlbnRlbmNlIGFyZSBub3QgaW5kZXBlbmRlbnQKICAKYGBge3J9CnhjaGlzcS50ZXN0KGNvbnZpY3Rpb24sIGNvcnJlY3Q9RkFMU0UpCmBgYApgYGB7cn0KcHJvcC50ZXN0KGMoNDUsIDE0KSwgYygxMzAsIDIzMiksIGFsdGVybmF0aXZlPSJncmVhdGVyIiwgY29ycmVjdD1GQUxTRSkKYGBgCnRocm91Z2ggY2hpc3EgdGVzdCwgd2UgZ2V0IGEgUHZhbHVlIHRoYXQgaXMgdmVyeSBzbWFsbCwgOC4xMzhlLTEzLCB3aGljaCBpcyBjb25maXJtZWQgdGhyb3VnaCB0aGUgcHJvcCB0ZXN0IHdpdGggUHZhbHVlIG9mIDguMTRlLTEzOyB0aGUgY29uZmlkZW5jZSBpbnRlcnZhbCBmb3VuZCB0aHJvdWdoIHRoZSBwcm9wIHRlc3QgZ2l2ZXMgdXMgMC4yMTI1IC0gMS4gV2UgZ290IGEgY29uZmlkZW5jZSBpbnRlcnZhbCBiZXR3ZWVlbiAwLjIxMjUgYW5kIDEuIFRoZXNlIHJlc3VsdHMgbGVhZHMgdXMgdG8gcmVqZWN0IHRoZSBIKSBhbmQgY29uY2x1ZGUgdGhhdCB0aGVyZSBpcyBhIHJlbGF0aW9uIGJldHdlZW4gdGhlIHJhY2Ugb2YgdGhlIHZpY3RpbSBhbmQgdGhlIHNlbnRlbmNlLiAKYGBge3J9ClpvYnMgPSBzcXJ0KDQ5Ljg4OCkKWm9icwpgYGAKCjMuIFJlZmVyIHRvIGEgcXVlc3Rpb24gZnJvbSBBc3NpZ25tZW50IDEsIHdoZXJlIHlvdSB3ZXJlIGFza2VkIHRvIHJlZmVyIHRvIGNlcnRhaW4gdmFyaWFibGVzIG9mIHRoZSBHZW5lcmFsIFNvY2lldHkgU3VydmV5IG9mIDIwMDIuIEZvciB5b3VyIGNvbnZlbmllbmNlLCB0aGUgZGF0YSBmaWxlIGlzIGxpbmtlZCBiZWxvdy4KCmBgYHtyfQpnc3MgPSByZWFkLmNzdigiaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL1N0YXRtYW40NC9EYXRhNjAyL21haW4vR1NTMjAwMi5jc3YiKQpoZWFkKGdzcywgMykKYGBgCmBgYHtyfQpnc3MuZGYgPSBnc3NbY29tcGxldGUuY2FzZXMoZ3NzKSxdCmdzcy5kZgpgYGAKCmEuIElzIHRoZXJlIGEgcmVsYXRpb25zaGlwIGJldHdlZW4gb25l4oCZcyBzdXBwb3J0IGZvciBndW4gbGF3cyAodmFyaWFibGUgbmFtZSBpcyBHdW5MYXcpIGFuZCB0aGVpciBvcGluaW9uIGFib3V0IGN1cnJlbnQgZ292ZXJubWVudCBzcGVuZGluZyBvbiBTY2llbmNlICh2YXJpYWJsZSBuYW1lIGlzIFNwZW5kU2NpKT8gU3RhdGUgdGhlIGFwcHJvcHJpYXRlIHN0YXRpc3RpY2FsIGh5cG90aGVzZXMuCgpgYGB7cn0KdGFibGVHc3MgPSB0YWxseSh+R3VuTGF3ICsgU3BlbmRTY2ksIGRhdGE9Z3NzLmRmKQp0YWJsZUdzcwpgYGAKSHlwb3RoZXNlcwpIMDogR3VuIExhdyBhbmQgU3BlbmRpbmcgb24gU2NpZW5jZSBzdXBwb3J0IGFyZSBJbmRlcGVuZGVudCBvZiBlYWNoIG90aGVyIApIQTogR3VuIExhdyBhbmQgU3BlbmRpbmcgb24gU2NpZW5jZSBzdXBwb3J0IGFyZSBub3QgaW5kZXBlbmRlbnQgb2YgZWFjaCBvdGhlcgoKYi4gQ2Fycnkgb3V0IHRoZSBhcHByb3ByaWF0ZSBzdGF0aXN0aWNhbCB0ZXN0LCBwcm92aWRpbmcgYm90aCB0aGUgdGVzdCBzdGF0aXN0aWMgYW5kIHRoZSBQLXZhbHVlLgoKYGBge3J9CnhjaGlzcS50ZXN0KHRhYmxlR3NzLCBzaW11bGF0ZS5wLnZhbHVlPVRSVUUpCmBgYApBY2NvcmRpbmcgdG8gdGhlIGNoaSBzcXVhcmVkIHRlc3Qgd2UgZ2V0IGEgUHZhbHVlIG9mIDAuOTE4IGFuZCBDaGktc3F1YXJlZCBvZiAyLjEwNDgKCmMuIFdoYXQgY2FuIHlvdSBjb25jbHVkZT8gRG8gdGhlc2UgZGF0YSBzdXBwb3J0IHlvdXIgbnVsbCBoeXBvdGhlc2lzIGluIHBhcnQgKGEpPyBTdGF0ZSB5b3VyIGRlY2lzaW9uIGFuZCBjb25jbHVzaW9uLgpBY2NvcmRpbmcgdG8gdGhlIHJlc3VsdHMgd2UgZ290LCB3ZSBmYWlsIHRvIHJlamVjdCB0aGUgaHlwb3RoZXNpcyBudWxsLiBXZSBjYW4gc2F5IHRoYXQgdGhlcmUgaXMgbm8gcmVsYXRpb24gYmV0d2VlbiB0aGUgc3VwcG9ydCBvZiBHdW4gTGF3IGFuZCBTcGVuZGluZyBvbiBTY2llbmNlLgoKZC4gUmUtdHJhY2UgeW91ciByZXN1bHQsIGluIHRoZSBmb3JtIG9mIGEgYmFyLWdyYXBoLCB0aGF0IHdhcyBwcm92aWRlZCBpbiBBc3NpZ25tZW50IDEsIFF1ZXN0aW9uIDkuIENhbiB5b3UgaW5mZXIgZnJvbSB0aGVzZSBkYXRhIHRoYXQgb25l4oCZcyBsZXZlbCBvZiBFZHVjYXRpb24gaXMgaW5kZXBlbmRlbnQgb2YgdGhlaXIgUmFjZT8gUHJlc2VudCB5b3VyIGZpbmRpbmdzIGluIHRoZSBmb3JtIG9mIGEgcGFyYWdyYXBoLCBvdXRsaW5pbmcgdGhlIGRlY2lzaW9uIHlvdSBoYXZlIG1hZGUsIHdoeSB5b3UgbWFkZSB0aGUgZGVjaXNpb24geW91IG1hZGUsIGFuZCB0aGUgUAotdmFsdWUuCgpgYGB7cn0KZ2dwbG90KGRhdGE9Z3NzKSArIGdlb21fYmFyKGFlcyh4ID0gRWR1Y2F0aW9uLCBmaWxsID0gUmFjZSksIHBvc2l0aW9uID0gImZpbGwiKQpgYGAKYGBge3J9CmdncGxvdChkYXRhPWdzcykgKyBnZW9tX2JhcihhZXMoeCA9IEVkdWNhdGlvbiwgZmlsbD1SYWNlKSwgcG9zaXRpb24gPSAiZG9kZ2UiLCBuYS5ybT1UUlVFKQpgYGAKYGBge3J9CnRhYmxlR3NzMSA9IHRhbGx5KH5FZHVjYXRpb24gKyBSYWNlLCBkYXRhPWdzcy5kZikKdGFibGVHc3MxCmBgYAoKCkh5cG90aGVzZXM6CkgwOiB0aGUgbGV2ZWwgb2YgZWR1Y2F0aW9uIGFuZCBSYWNlIGFyZSBpbmRlcGVuZGVudApIQTogdGhlIGxldmVsIG9mIGVkdWNhdGlvbiBhbmQgcmFjZSBhcmUgbm90IGluZGVwZW5kZW50CgpgYGB7cn0KeGNoaXNxLnRlc3QodGFibGVHc3MxLCBzaW11bGF0ZS5wLnZhbHVlPVRSVUUpCmBgYApBY2NvcmRpbmcgdG8gdGhlIHJlc3VsdHMsIFB2YWx1ZT0wLjc1OSBzbyB3ZSBmYWlsIHRvIHJlamVjdCB0aGUgaHlwb3RoZXNpcyBudWxsIGFuZCBjb25jbHVkZSB0aGF0IHRoZXJlIGlzIG5vIHJlbGF0aW9uIGJldHdlZW4gb25lJ3MgbGV2ZWwgb2YgZWR1Y2F0aW9uIGFuZCByYWNlLiAKCgo0LiBBIGdyb3VwIG9mIHBhdGllbnRzIHdpdGggYSBiaW5nZS1lYXRpbmcgZGlzb3JkZXIgd2VyZSByYW5kb21seSBhc3NpZ25lZCB0byB0YWtlIGVpdGhlciB0aGUgZXhwZXJpbWVudGFsIGRydWcgZmx1dm94YW1pbmUgb3IgdGhlIHBsYWNlYm8gaW4gYSBuaW5lLXdlZWstbG9uZywgZG91YmxlLWJsaW5kZWQgY2xpbmljYWwgdHJpYWwuIEF0IHRoZSBlbmQgb2YgdGhlIHRyaWFsIHRoZSBjb25kaXRpb24gb2YgZWFjaCBwYXRpZW50IHdhcyBjbGFzc2lmaWVkIGludG8gb25lIG9mIGZvdXIgY2F0ZWdvcmllczogbm8gcmVzcG9uc2UsIG1vZGVyYXRlIHJlc3BvbnNlLCBtYXJrZWQgcmVzcG9uc2UsIG9yIHJlbWlzc2lvbi4gVGhlIHRhYmxlIGJlbG93IHNob3dzIGEgY3Jvc3MtY2xhc3NpZmljYXRpb24sIG9yIGNvbnRpbmdlbmN5IHRhYmxlLCBvZiB0aGVzZSBkYXRhLgoKICAgICAgICAgICAgICBObyBSZXNwb25zZSAgICAgICAgTW9kZXJhdGUgUmVzcG9uc2UgICAgICAgTWFya2VkIHJlc3BvbnNlICAgICBSZW1pc3Npb24gICAgIApGbHV2b3hhbWluZSAgICAgICAxNSAgICAgICAgICAgICAgICAgICAgNyAgICAgICAgICAgICAgICAgICAgICAzICAgICAgICAgICAgICAgICAxNQpQbGFjZWJvICAgICAgICAgICAyMiAgICAgICAgICAgICAgICAgICAgNyAgICAgICAgICAgICAgICAgICAgICAzICAgICAgICAgICAgICAgICAxMQoKRG8gdGhlc2UgZGF0YSBwcm92aWRlIHN0YXRpc3RpY2FsbHkgc2lnbmlmaWNhbnQgZXZpZGVuY2UgdG8gY29uY2x1ZGUgdGhhdCB0aGVyZSBpcyBhbiBhc3NvY2lhdGlvbiBiZXR3ZWVuIHRoZSB0eXBlIG9mIHRyZWF0bWVudCByZWNlaXZlZCBhbmQgYSBwYXRpZW504oCZcyByZXNwb25zZT8KCkh5cG90aGVzZXMKSDA6IFRoZSBwYXRpZW50J3MgcmVzcG9uc2UgdG8gdHJlYXRtZW50IGFuZCB0aGUgdXNlIG9mIEZsdXZveGFtaW5lIGFyZSBpbmRlcGVuZGVudApIQTogVGhlIHBhdGllbnQncyByZXNwb25zZSB0byB0cmVhdG1lbnQgYW5kIHRoZSB1c2Ugb2YgRmx1dm94YW1pbmUgYXJlIG5vdCBpbmRlcGVuZGVudAoKYGBge3J9CmJpbmdlVGFibGUgPSByYmluZChjKDE1LCA3LCAzLCAxNSksIGMoMjIsIDcsIDMsIDExKSkKcm93bmFtZXMoYmluZ2VUYWJsZSkgPSBjKCJGbHV2b3hhbWluZSIsICJQbGFjZWJvIikKY29sbmFtZXMoYmluZ2VUYWJsZSkgPSBjKCJObyBSZXNwb25zZSIsICJNb2RlcmF0ZSBSZXNwb25zZSIsICJNYXJrZWQgUmVzcG9uc2UiLCAiUmVtaXNzaW9uIikKYmluZ2VUYWJsZQpgYGAKYGBge3J9CnhjaGlzcS50ZXN0KGJpbmdlVGFibGUsIHNpbXVsYXRlLnAudmFsdWU9VFJVRSkKYGBgCldlIGdvdCBhIFB2YWx1ZSBvZiAwLjYwODIgd2UgZmFpbCB0byByZWplY3QgdGhlIGh5cG90aGVzaXMgbnVsbCBhbmQgdGhlcmVmb3JlIHdlIGNhbiBzYXkgdGhhdCB0aGVyZSBpcyBubyByZWxhdGlvbiBiZXR3ZWVuIHRoZSB0cmVhdG1lbnQgd2l0aCBGbHV2b3hhbWluZSBhbmQgdGhlIHJlc3BvbnNlIG9mIHRoZSBwYXRpZW50cy4KCgoKNS4gQSBzdHVkeSBjb25kdWN0ZWQgYnkgWW91bWFucyBhbmQgSmVlMiBsb29rZWQgYXQgc3R1ZGVudHMgd2hvIHRvb2sgYSByZXNlYXJjaCBtZXRob2RzIGNsYXNzIGluIHBzeWNob2xvZ3kuIFR3byBsZWN0dXJlIHNlY3Rpb25zIG9mIHRoZSBzYW1lIGNvdXJzZSB3ZXJlIHRhdWdodCBieSB0aGUgc2FtZSBpbnN0cnVjdG9yLiBTdHVkZW50cyBpbiBlYWNoIGxlY3R1cmUgc2VjdGlvbiB3ZXJlIHJlcXVpcmVkIHRvIHJlZ2lzdGVyIGluIG9uZSBvZiB0d28gRnJpZGF5IGFmdGVybm9vbiBkaXNjdXNzaW9uIHNlY3Rpb25zLCBvciBhIHR1dG9yaWFsLiBEdXJpbmcgdGhlIG5pbnRoIHdlZWsgb2YgaW5zdHJ1Y3Rpb24sIGFsbCBzdHVkZW50cyB3ZXJlIGFza2VkIHRvIGZpbGwgb3V0IGFuIGluZm9ybWFsIG1pZHNlbWVzdGVyIGV2YWx1YXRpb24gaW4gdGhlaXIgRnJpZGF5IGFmdGVybm9vbiBkaXNjdXNzaW9uIHNlc3Npb24uCgpJbiBoYWxmIG9mIHRoZSBGcmlkYXkgYWZ0ZXJub29uIGRpc2N1c3Npb24gc2VjdGlvbnMsIHRoZSBleHBlcmltZW50ZXIgKG5vdCB0aGUgcHJvZmVzc29yL2luc3RydWN0b3IhKSBwYXNzZWQgYXJvdW5kIGEgYmFnIGNvbnRhaW5pbmcgc21hbGwgYmFycyBvZiBjaG9jb2xhdGUgdGhhdCBoZSBzaW1wbHkgaGFkIOKAmGxlZnQtb3ZlcuKAmSBhbmQg4oCYd2FudGVkIHRvIGdldCByaWQgb2bigJkgc28gdGhhdCBzdHVkZW50cyB3b3VsZCBub3QgdGhpbmsgdGhlIGNob2NvbGF0ZSB3YXMgYSBnaWZ0IGZyb20gdGhlaXIgcHJvZmVzc29yL2luc3RydWN0b3IuIFRoZSBldmFsdWF0aW9uIHdhcyBhIHN1cnZleSB0aGF0IGNvbnRhaW5lZCBuaW5lIHF1ZXN0aW9ucy4gRm9yIGVhY2ggcXVlc3Rpb24gdGhlIHN0dWRlbnQgcHJvdmlkZWQgYSByYXRpbmcgZnJvbSAxICh2ZXJ5IHBvb3IpIHRvIDUgKGV4Y2VsbGVudCkuCgpRdWVzdGlvbiA5IHBvc2VkIHRoZSBmb2xsb3dpbmc6CiAgICAgIGBgQ29tcGFyZWQgdG8gb3RoZXIgaW5zdHJ1Y3RvcnMgeW91IGhhdmUgaGFkIGF0IHRoaXMgdW5pdmVyc2l0eSwgdGhpcyBpbnN0cnV0b3IgaXM64oCZ4oCZIDEgKHZlcnkgcG9vcikgdG8gNSAoZXhjZWxsZW50KQoKQ29tcGxpbWVudHMgdG8gdGhlIGF1dGhvcnMsIHRoZXkgaGF2ZSBwcm92aWRlZCBtZSB3aXRoIHRoZSBkYXRhIGluIHRoaXMgcGFydGljdWxhciBzdHVkeS4gSW4gdGhlIGZpbGUgeW91IHdpbGwgZmluZCB0aGUgcmF3IGRhdGEgcHJvdmlkaW5nIHRoZSBzdHVkZW50IHJlc3BvbnNlcyBmb3IgUXVlc3Rpb24gOSAoUTkpIGFuZCB0aGUgb3ZlcmFsbCBhdmVyYWdlIHJlc3BvbnNlIGZvciBRdWVzdGlvbnMgMSB0aHJvdWdoIDkgKE92ZXJhbGwpIGZvciBlYWNoIHN0dWRlbnQuIE5vdGU6IFRvIGVhc2lseSByZWFkIHRoaXMgaW50byB5b3VyIFIgc2Vzc2lvbiwgc2VsZWN0IHRoZSDigJxSYXfigJ0gYnV0dG9uIHByaW9yLCB0aGVuIHVzZSB0aGUgcmVzdWx0aW5nIFVSTC4KCmBgYHtyfQpTc3VydmV5ID0gcmVhZC5jc3YoImh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9TdGF0bWFuNDQvRGF0YTYwMi9tYWluL2Nob2Nub2Nob2NyYXRpbmdzLmNzdiIpCmhlYWQoU3N1cnZleSwgMykKYGBgCmEuIFBlcnRhaW5pbmcgdG8gUXVlc3Rpb24gOTogRG8gdGhlc2UgZGF0YSBzdWdnZXN0IHRoZXJlIGlzIGEgdHJlYXRtZW50IGVmZmVjdD8gVGVzdCB0aGUgZXhpc3RlbmNlIG9mIGEgdHJlYXRtZW50IGVmZmVjdCB1c2luZyBhIHBlcm11dGF0aW9uIHRlc3QuIElmIGEgdHJlYXRtZW50IGVmZmVjdCBpcyBkaXNjb3ZlcmVkLCBleHBsYWluIGl0cyBtZWFuaW5nIGluIHRoZSBjb250ZXh0IG9mIHRoZXNlIGRhdGEuIENhcnJ5IG91dCBhIHBlcm11dGF0aW9uIHRlc3QsIHVzaW5nIDE5OTkgaXRlcmF0aW9ucy4KCihZb3Ugd2lsbCBoYXZlIHRvIGNhcmVmdWxseSBjb25zaWRlciDigJx3aGF0IGEgdHJlYXRtZW50IGVmZmVjdOKAnSBpcyBpbiB0aGlzIHNjZW5hcmlvLikKClRoZSB0cmVhdG1lbnQgaGVyZSBpcyB0aGUgYWRtaW5pc3RyYXRpb24gb2YgY2hvY29sYXRlLiBCeSBsb29raW5nIGF0IHRoZSBkYXRhIHdlIGNhbiBzZWUgdGhhdCB0aGV5IGFsbCB3ZXJlIG9mZmVyZWQgdGhlIGNob2NvbGF0ZSBidXQgc29tZSB0b29rIGl0IHNvbWUgb3RoZXJzIGRpZG4ndCB0YWtlIHRoZSBjaG9jb2xhdGUuIERpZCB0aGUgYWRtaW5pc3RyYXRpb24gb2YgY2hvY29sYXRlIGluZmx1ZW5jZSB0aGVpciBzdXJ2ZXkgcmVzcG9uc2UgdG8gUTk/CgpIeXBvdGhlc2VzCkgwOiBUaGUgcmVzcG9uc2VzIHRvIFE5IGluIHRoZSBzdXJ2ZXkgYW5kIHRoZSB0cmVhdG1lbnQgYXJlIGluZGVwZW5kZW50ICBROSB0cmVhdG1lbnQgPSBROSBubyB0cmVhdG1lbnQKSEE6IHRoZSByZXNwb25zZXMgdG8gUTkgaW4gdGhlIHN1cnZleSBhbmQgdGhlIHRyZWF0bWVudCBhcmUgbm90IGluZGVwZW5kZW50ICAgICAgIFE5IHRyZWF0bWVudCA+IFE5IG5vIHRyZWF0bWVudAoKCkV4cGxvcmluZyB0aGUgZGF0YQpgYGB7cn0KZ2dwbG90KFNzdXJ2ZXksIGFlcyh4ID0gR3JvdXBOYW1lLCB5ID0gUTkpKSArIGdlb21fYm94cGxvdChjb2w9InJlZCIsIGZpbGw9ImJsdWUiLCB3aWR0aD0wLjUpICsgZ2d0aXRsZSgiUTkgU3R1ZGVudCBTdXJ2ZXk6IHRyZWF0bWVudCBlZmZlY3QiKSArIGNvb3JkX2ZsaXAoKQpgYGAKYGBge3J9CmZhdnN0YXRzKH5ROXxHcm91cE5hbWUsIGRhdGE9IFNzdXJ2ZXkpCmBgYAoKYGBge3J9Cm9ic2RpZmYudHRtdCA9IG1lYW4oflE5LCBkYXRhID0gZmlsdGVyKFNzdXJ2ZXksIEdyb3VwTmFtZSA9PSAiQ2hvY29sYXRlIikpIC0gbWVhbih+UTksIGRhdGEgPSBmaWx0ZXIoU3N1cnZleSwgR3JvdXBOYW1lID09ICJOT0Nob2MiKSkKb2JzZGlmZi50dG10CmBgYApQZXJmb3JtaW5nIDE5OTkgcGVybXV0YXRpb25zCmBgYHtyfQpOID0gMTk5OSAKcGVybXMgPSBudW1lcmljKE4pIApmb3IoaSBpbiAxOk4pCnsgaW5kZXggPSBzYW1wbGUoOTgsIDUwLCByZXBsYWNlPUZBTFNFKSAKICBwZXJtc1tpXSA9IG1lYW4oU3N1cnZleSRROVtpbmRleF0pIC0gbWVhbihTc3VydmV5JFE5Wy1pbmRleF0pIAp9CmBgYAoKYGBge3J9CnBlcm1zLmRmID0gZGF0YS5mcmFtZShwZXJtcykKaGVhZChwZXJtcy5kZiw0KQpgYGAKYGBge3J9CnRhaWwocGVybXMuZGYsIDMpCmBgYAoKRGlzcGxheSBhIGhpc3RvZ3JhbSB0byB1bmRlcnN0YW5kIHRoZSBkaXN0cmlidXRpb24gb2YgdGhlIHBlcm11dGF0aW9ucwpgYGB7cn0KaGlzdChwZXJtcywgeGxhYj0iRGlmZmVyZW5jZSBCZXR3ZWVuIE1lYW4gYW5zd2VyIHRvIFE5IChDaG9jb2xhdGUgLSBOb0Nob2NvbGF0ZSkiLCB5bGFiPSJGcmVxdWVuY3kiLCBtYWluPSJPdXRjb21lIG9mIDIwMDAgUGVybXV0YXRpb24gVGVzdHMiLCBjb2w9J2JsdWUnKQphYmxpbmUodiA9IG9ic2RpZmYudHRtdCwgY29sPSJyZWQiKQpgYGAKRmluZCB0aGUgRW1waXJpY2FsIFB2YWx1ZQpgYGB7cn0KKHN1bShwZXJtcyA+PSBvYnNkaWZmLnR0bXQpICsgMSApLyhOICsgMSkgICNjb21wdXRlcyBlbXBpcmljYWwgUC12YWx1ZQpgYGAKYi4gQ29uc2lkZXIgdGhlIHZhcmlhYmxlIE92ZXJhbGwuIElzIHRoZXJlIGEgdHJlYXRtZW50IGVmZmVjdCB3aXRoIHJlc3BlY3QgdG8gdGhlIHByb2Zlc3NvcuKAmXMgb3ZlcmFsbCByYXRpbmcgYXMgYSB0ZWFjaGVyPyBBcHBseSB0aGUgdC10ZXN0IHRvIHRoZXNlIGRhdGEuIEludGVycHJldCB0aGUgbWVhbmluZyBvZiB0aGUgUC12YWx1ZS4gKGNoaXRlc3QgYW5kIHhjaGl0ZXN0KQoKCkh5cG90aGVzZXMKSDA6IHRoZSBvdmVyYWxsIHNjb3JlIGFuZCB0aGUgdHJlYXRtZW50IGFyZSBpbmRlcGVuZGVudApIQTogdGhlIG92ZXJhbGwgc2NvcmUgYW5kIHRoZSB0cmVhdG1lbnQgYXJlIG5vdCBpbmRlcGVuZGVudAoKCmBgYHtyfQp0YWJsZVNzdXJ2ZXkgPSB0YWxseSh+T3ZlcmFsbCArIEdyb3VwTmFtZSwgZGF0YT1Tc3VydmV5KQp0YWJsZVNzdXJ2ZXkKYGBgCkdyYXBoaW5nIE5vcm1hbCBQcm9iYWJpbGl0eSBwbG90IGZvciBib3RoIFRyZWF0bWVudCBhbmQgTm8gVHJlYXRtZW50CgpgYGB7cn0KZ2dwbG90KGZpbHRlcihTc3VydmV5LCBHcm91cE5hbWUgPT0gIkNob2NvbGF0ZSIpLCBhZXMoc2FtcGxlID0gT3ZlcmFsbCkpICsgc3RhdF9xcShjb2w9ImJsdWUiKSArIHN0YXRfcXFsaW5lKGNvbD0icmVkIikgKyBnZ3RpdGxlKCJOb3JtYWwgUHJvYmFiaWxpdHkgUGxvdCBvZiBTdHVkZW50IFN1cnZleTogVHJlYXRtZW50IikKYGBgCmBgYHtyfQpnZ3Bsb3QoZmlsdGVyKFNzdXJ2ZXksIEdyb3VwTmFtZSA9PSAiTk9DaG9jIiksIGFlcyhzYW1wbGUgPSBPdmVyYWxsKSkgKyBzdGF0X3FxKGNvbD0iYmx1ZSIpICsgc3RhdF9xcWxpbmUoY29sPSJyZWQiKSArIGdndGl0bGUoIk5vcm1hbCBQcm9iYWJpbGl0eSBQbG90IG9mIFN0dWRlbnQgU3VydmV5OiBObyBUcmVhdG1lbnQiKQpgYGAKYGBge3J9CnQudGVzdCh+T3ZlcmFsbCB8IEdyb3VwTmFtZSwgZGF0YSA9IFNzdXJ2ZXksIGFsdGVybmF0aXZlPSdncmVhdGVyJykKYGBgCkFjY29yZGluZyB0aGUgdGhlIFB2YWx1ZSB3ZSBnZXQgZnJvbSB0aGUgdC50ZXN0IG9mIDAuMDUsIGFuZCB0aGUgZW1waXJpY2FsIFB2YWx1ZSBvZiAwLjE2MSwgd2UgZmFpbCB0byByZWplY3QgdGhlIGh5cG90aGVzaXMgbnVsbCBhbmQgY29uY2x1ZGUgdGhhdCB0aGUgcHJvZmVzc29yJ3Mgb3ZlcmFsbCByYXRpbmcgaXMgaW5kZXBlbmRlbnQgb2YgdGhlIHN0dWRlbnQncyB0cmVhdG1lbnQgd2l0aCBjaG9jb2xhdGUgCgoKYGBge3J9CmNoaXNxLnRlc3QodGFibGVTc3VydmV5LCBzaW11bGF0ZS5wLnZhbHVlPVRSVUUpCmBgYApjLiBDb25zaWRlciB0aGUgdGVzdCBzdWdnZXN0ZWQgaW4gcGFydCAoYSkuIFdoeSB3b3VsZCBhIHQtdGVzdCBub3QgYmUgYSByZWNvbW1lbmRlZCBzdGF0aXN0aWNhbCBtZXRob2QgdG8gY2Fycnkgb3V0IHRoZSB0ZXN0IGluIHBhcnQgKGEpPyBFeHBsYWluIHlvdXIgYW5zd2VyIGluIGEgZmV3IHNlbnRlbmNlcy4KClIuLyBXZSBjYW4gc2VlIGluIHRoZSBib3hwbG90cyBob3cgc2ltaWxhciB0aGUgc3RhdHMgZm9yIHRoZSAyIGdyb3VwcyBhcmUsIHRoaXMgaXMgY29uZmlybWVkIGJ5IHRoZSBmYXZzdGF0cyByZXN1bHRzLiBUaGUgcGVybXV0YXRpb24gd2lsbCBoZWxwIG1hZ25pZnkgdGhlIGRpZmZlcmVuY2VzIGJldHdlZW4gdGhlIHR3byBncm91cHMgYW5kIGdpdmUgc3RhdGlzdGljYWwgc2lnbmlmaWNhbmNlIHRvIHRoZSBkaWZmZXJlbmNlLCBpZiBhbnkuIFBlcm11dGF0aW9ucyBhcmUgZ29vZCB3aGVuIHdlIGRvIG5vdCBrbm93IG11Y2ggYWJvdXQgdGhlIHBvcHVsYXRpb24gYW5kIHdlIGRvbid0IG5lZWQgdG8gZG8gYXNzdW1wdGlvbnMuIFRoZSBUdGVzdCBhc3N1bWVzIHRoZSBkYXRhIGhhcyBub3JtYWwgZGlzdHJpYnV0aW9uIHdoaWNoZSBoZXJlIHdlIGhhdmUgc29tZSBkYXRhIHNrZXdlZC4gCgoKCgo=