Part 1: Samples from a population
For this part of the lab you must work in a small group.
There are several bins of beads in the classroom. Right now, join a
group around one of the beads (aim for the same amount of students in
each group), and introduce yourself. You will be working together for
part 1.
Premise
The bin of beads represents a small town, with each bead representing
a person in town with a specific opinion. The green beads support a
ballot initiative to increase sales tax to fund bicycle trails, and the
white beads oppose the initiative. Your group of students are pollsters
- you want to determine how much support the initiative has in your
town.
The sampling paddle is your tool to take simple random samples from
the town’s population.
TASK 1.1 What is the population parameter you are
interested in learning about? Use correct notation.
**Response** The proportion of citizens in the town that support the bill.
TASK 1.2 Using the sampling paddle, take a sample of
the population and answer the below questions. Each person in the
group must take their own sample.
**Response**
- What is n, the sample size? 40
- What is your sample statistic, both notation and value? 17/40=.425 (p^).
TASK 1.3 With your group, discuss the differences
between your individual sample estimates. Summarize your conversation in
a sentence or two here.
**Response** Half of our group had a sample statistic that was greater than .5 within .03 (.5-.53), and the other half had a sample statistic that was less than .5 within .125 (.375-.5).
TASK 1.4 Working together, take at least 30 samples
(more if you’d like!) and make a vector of the sample statistics in R.
Make a dotplot of your sample statistics and discuss the center and
spread of the dotplot.
**Response** The range of the dotplot goes from 3.25-.575 and the center is around .5.
SampleStatistics <- c(.375, .425, .51, .53, .45, .5, .475, .45, .55, .575, .475, .475, .5, .525, 22/40, 19/40, 21/40, 23/40, 20/40, 22/40, 18/40, 21/40, 20/40, 20/40, 13/40, 17/40, 22/40, 20/40, 17/40, 23/40)
gf_dotplot( ~ SampleStatistics)
TASK 1.5 Based on everything you’ve done so far,
what do you think is the best guess for the population parameter in your
town? Write a sentence justifying your answer.
**Response** Based on our sample statistics, our best guess is that the population parameter is .5 because our sample distribution is a normal curve centered about .5.
TASK 1.6 Calculate the standard deviation of your
sample statistics. The specific name for this value is the standard
error. Whenever we discuss the standard error of a statistic, it
describes the how variable statistics are when they are calculated from
different samples drawn from the same population.
**Response** SE = .05902488
sd(~SampleStatistics)
Part 2: Baseball Player Salaries
We can also create sampling distributions for the rest of the ‘big 5’
parameters. In this section, you will create several sampling
distributions for means of different populations and of different
sizes.
Sampling Distribution
To create a sampling distribution from simple random samples, we must
have access to the entire population. For this section we have access to
all opening day salaries for major league baseball players in 2019 (in
millions of dollar). We can load the dataset, called
BaseballSalaries2019, from our textbook using the code below:
data("BaseballSalaries2019")
head(BaseballSalaries2019)
TASK 2.1 Find the mean and standard deviation of
salary in the population. Recall that the commands mean(~Y, data =
DataSetName) and sd(~Y, data = DataSetName) can help you accomplish this
task. include proper notation for each quantity
**Response** Mu = 4.509924 and Sigma = 6.334217
mean(~Salary, data = BaseballSalaries2019)
sd(~Salary, data = BaseballSalaries2019)
TASK 2.2 Create a histogram of the salaries and
describe the shape of the distribution. Hint: remember
gf_histogram()
**Response** The histogram is asymmetric and skewed right.
gf_histogram(~Salary, data = BaseballSalaries2019)
TASK 2.3 Use the code below to generate 2000 samples
of size 100, saving the sample mean salary for each sample, and creating
a histogram. What does an observation plotted in the histogram
represent?
**Response** The mean salary (x bar) of a random sample of 100 players.
# save space for the means
SalaryMeans <- rep(NA, 2000)
# generate 200 samples, saving the mean of each one
for(i in 1:2000){
# take a sample
TemporarySample <- sample_n(BaseballSalaries2019, 100)
# save the mean
SalaryMeans[i] <- mean(~Salary, data = TemporarySample)
}
gf_histogram(~SalaryMeans)
TASK 2.4 Describe the shape of your sampling
distribution, and compare it to the shape of the population.
**Response** The sampling distribution is symmetric and centered around 4.5, and the sampling distribution is a normal curve while the population was completely skewed right.
TASK 2.5 Calculate the center of your sampling
distribution, as measured by the mean of the vector of sample means. How
does this value compare to the population mean?
**Response** x bar = 4.503148 is within less than 7 one thousandths of mu.
mean(SalaryMeans)
TASK 2.6 Calculate the standard error of the sample
mean using your vector of sample means. Recall that the standard error
of a statistic is the standard deviation of the sampling
distribution.
**Response** s = 0.6054506
sd(SalaryMeans)
TASK 2.7 Hopefully the standard error you calculated
in 2.6 roughly matches the standard error you could estimate from the
histogram in 2.3. Explain how you could estimate the SE from the
histogram, and show how it is roughly the same.
**Response** You can estimate the SE from the histogram by eyeballing the range in which 95% of the samples fall and dividing that range by 4. For instance, if I take 5.75(approximate upper bound for the 95th percentile) and subtract 3.25 (approximate 5th percentile) then divide the difference by 4, I get .625. This value is quite close to the true standard deviation of the population which is 6.334217.
Confidence intervals
TASK 2.8 Directions For each of the sample means
below (assumed to be means for samples of baseball player salaries)
calculate the corresponding 95% confidence interval. You will need to
use the standard error you calculated from 2.6. Indicate whether the
confidence interval successfully captures the true population mean
salary.
TASK 2.8.1 \(\bar{X}\)= 4
TASK 2.8.2 \(\bar{X}\)= 3.1
TASK 2.8.3 \(\bar{X}\)= 5.2
Part 3: Sample size and confidence intervals
For this activity we will use the dataset ‘AllCountries’ from the
Lock5Data package. These data consist of measurements from all
countries. We will study the variable ‘FemaleLabor’, which provides the
percentage of females aged 15-64 that participate in the countries
workforce. Our goal will be to build sampling distributions from samples
of various sizes for the mean of this variable.
TASK 3.0 Modify the code below to generate a
sampling distribution of the mean with 2000 samples, using a sample size
of n=10.
# load the dataset
data("AllCountries")
# wrangle the data a little bit to select only a couple variables and to remove missing (NA) values
AllCountries <- AllCountries %>%
dplyr::select(Country,FemaleLabor,LifeExpectancy) %>%
na.omit()
# allocate space to store your sample means
SampleMeans <- rep(NA, 2000)
# draw the correct number of samples, and for each of them save the sample mean
for(i in 1:2000){
TemporarySample <- sample_n(AllCountries, size = 10)
SampleMeans[i] <- mean(~FemaleLabor, data = TemporarySample)
}
TASK 3.1 Use your vector of sample means to create a
histogram of your sampling distribution, and to calculate the standard
error of the sample mean. Answer the questions below.
sd(SampleMeans)
mean(SampleMeans)
A. Where is the center of the distribution?
**Response** 58.12275
B. What is the standard error?
**Response** 5.329335
- If we were to build a 95% confidence interval using one of the
sample means, how wide would it be?
**Response** [47.4641, 68.7841]
TASK 3.2 Now generate a sampling distribution for
the mean using samples of size n=50. Again, you’ll need to calculate the
means for 2000 samples and save them as a vector. Then produce the
histogram, calculate the standard error, and answer the questions below.
You should copy and paste the code from 3-1, changing the relative
numbers.
# load the dataset
data("AllCountries")
# wrangle the data a little bit to select only a couple variables and to remove missing (NA) values
AllCountries <- AllCountries %>%
dplyr::select(Country,FemaleLabor,LifeExpectancy) %>%
na.omit()
# allocate space to store your sample means
SampleMeans <- rep(NA, 2000)
# draw the correct number of samples, and for each of them save the sample mean
for(i in 1:2000){
TemporarySample <- sample_n(AllCountries, size = 50)
SampleMeans[i] <- mean(~FemaleLabor, data = TemporarySample)
}
gf_histogram(~SampleMeans)
mean(SampleMeans)
sd(SampleMeans)
A. Where is the center of the distribution?
**Response** 57.98732
B. What is the standard error?
**Response** 2.03178
- If we were to build a 95% confidence interval using one of the
sample means, how wide would it be?
**Response** [53.9238, 62.0509]
TASK 3.3 Finally, generate a sampling distribution
for the mean using samples of size n=100. Again, you’ll need to
calculate the means for 2000 samples and save them as a vector. Then
produce the histogram, calculate the standard error, and answer the
questions below.
# load the dataset
data("AllCountries")
# wrangle the data a little bit to select only a couple variables and to remove missing (NA) values
AllCountries <- AllCountries %>%
dplyr::select(Country,FemaleLabor,LifeExpectancy) %>%
na.omit()
# allocate space to store your sample means
SampleMeans <- rep(NA, 2000)
# draw the correct number of samples, and for each of them save the sample mean
for(i in 1:2000){
TemporarySample <- sample_n(AllCountries, size = 100)
SampleMeans[i] <- mean(~FemaleLabor, data = TemporarySample)
}
gf_histogram(~SampleMeans)
mean(SampleMeans)
sd(SampleMeans)
A. Where is the center of the distribution?
**Response** 57.9323
B. What is the standard error?
**Response** 1.169775
- If we were to build a 95% confidence interval using one of the
sample means, how wide would it be?
**Response** [55.5928,60.2719]
TASK 3.4 What happens to the center of the
distribution as the sample size increases?
**Response** It remains nearly unchanged.
TASK 3.5 What happens to the standard error, and the
width of confidence intervals as the sample size increases?
**Response** The standard error decreases significantly and the range of the confidence interval narrows as the size increases.
LS0tDQp0aXRsZTogIkxhYiAxLTI6IFNhbXBsaW5nIGFuZCAgZXhwZXJpbWVudHMiDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQpgYGB7ciwgZWNobyA9IEYsIG1lc3NhZ2UgPSBGfQ0KIyBDbGVhciB3b3Jrc3BhY2UNCnJtKGxpc3QgPSBscygpKSANCg0KIyB5b3VyIGNvZGUgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgaHRtbCBmb3IgdGhpcyBhc3NpZ25tZW50DQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobz1UUlVFKSANCg0KIyBsb2FkIHBhY2thZ2VzIHdlIG5lZWQgZm9yIHRoaXMgbGFiDQpsaWJyYXJ5KG1vc2FpYywgd2Fybi5jb25mbGljdHMgPSBGQUxTRSkgDQpsaWJyYXJ5KGdnZm9ybXVsYSwgd2Fybi5jb25mbGljdHMgPSBGQUxTRSkNCmxpYnJhcnkoTG9jazVEYXRhLCB3YXJuLmNvbmZsaWN0cyA9IEZBTFNFKQ0KbGlicmFyeShkcGx5ciwgd2Fybi5jb25mbGljdHMgPSBGQUxTRSkNCg0KYGBgDQoNCiMjIyBPYmplY3RpdmVzOg0KDQpGb3IgdGhpcyBsYWIgeW91IHNob3VsZC4uLg0KDQotICAgVXNlIG1hbmlwdWxhdGl2ZXMgdG8gZXhwbG9yZSBzYW1wbGluZyB2YXJpYWJpbGl0eSBhbmQgY3JlYXRlIGEgc2FtcGxpbmcgZGlzdHJpYnV0aW9uDQotICAgVXNlIHRlY2hub2xvZ3kgdG8gY3JlYXRlIGEgc2FtcGxpbmcgZGlzdHJpYnV0aW9uDQotICAgQ2FsY3VsYXRlIHN0YW5kYXJkIGVycm9yIG9mIGEgc3RhdGlzdGljIGZyb20gYSBzYW1wbGluZyBkaXN0cmlidXRpb24NCi0gICBCdWlsZCBhbmQgaW50ZXJwcmV0IGNvbmZpZGVuY2UgaW50ZXJ2YWxzIHVzaW5nIHRoZSBzdGFuZGFyZCBlcnJvciBmcm9tIGEgc2FtcGxpbmcgZGlzdHJpYnV0aW9uLg0KLSAgIFVzZSBjb25maWRlbmNlIGludGVydmFscyB0byBtYWtlIGNvbmNsdXNpb25zIGFib3V0IGEgcG9wdWxhdGlvbiBwYXJhbWV0ZXIuDQoNCiMgUGFydCAxOiBTYW1wbGVzIGZyb20gYSBwb3B1bGF0aW9uDQoNCkZvciB0aGlzIHBhcnQgb2YgdGhlIGxhYiAqeW91IG11c3Qgd29yayBpbiBhIHNtYWxsIGdyb3VwKi4gVGhlcmUgYXJlIHNldmVyYWwgYmlucyBvZiBiZWFkcyBpbiB0aGUgY2xhc3Nyb29tLiBSaWdodCBub3csIGpvaW4gYSBncm91cCBhcm91bmQgb25lIG9mIHRoZSBiZWFkcyAoYWltIGZvciB0aGUgc2FtZSBhbW91bnQgb2Ygc3R1ZGVudHMgaW4gZWFjaCBncm91cCksIGFuZCBpbnRyb2R1Y2UgeW91cnNlbGYuIFlvdSB3aWxsIGJlIHdvcmtpbmcgdG9nZXRoZXIgZm9yIHBhcnQgMS4NCg0KIyMjIFByZW1pc2UNCg0KVGhlIGJpbiBvZiBiZWFkcyByZXByZXNlbnRzIGEgc21hbGwgdG93biwgd2l0aCBlYWNoIGJlYWQgcmVwcmVzZW50aW5nIGEgcGVyc29uIGluIHRvd24gd2l0aCBhIHNwZWNpZmljIG9waW5pb24uIFRoZSBncmVlbiBiZWFkcyBzdXBwb3J0IGEgYmFsbG90IGluaXRpYXRpdmUgdG8gaW5jcmVhc2Ugc2FsZXMgdGF4IHRvIGZ1bmQgYmljeWNsZSB0cmFpbHMsIGFuZCB0aGUgd2hpdGUgYmVhZHMgb3Bwb3NlIHRoZSBpbml0aWF0aXZlLiBZb3VyIGdyb3VwIG9mIHN0dWRlbnRzIGFyZSBwb2xsc3RlcnMgLSB5b3Ugd2FudCB0byBkZXRlcm1pbmUgaG93IG11Y2ggc3VwcG9ydCB0aGUgaW5pdGlhdGl2ZSBoYXMgaW4geW91ciB0b3duLg0KDQpUaGUgc2FtcGxpbmcgcGFkZGxlIGlzIHlvdXIgdG9vbCB0byB0YWtlIHNpbXBsZSByYW5kb20gc2FtcGxlcyBmcm9tIHRoZSB0b3duJ3MgcG9wdWxhdGlvbi4NCg0KKipUQVNLIDEuMSoqIFdoYXQgaXMgdGhlIHBvcHVsYXRpb24gcGFyYW1ldGVyIHlvdSBhcmUgaW50ZXJlc3RlZCBpbiBsZWFybmluZyBhYm91dD8gVXNlIGNvcnJlY3Qgbm90YXRpb24uDQoNCiAgICAqKlJlc3BvbnNlKiogVGhlIHByb3BvcnRpb24gb2YgY2l0aXplbnMgaW4gdGhlIHRvd24gdGhhdCBzdXBwb3J0IHRoZSBiaWxsLg0KDQoqKlRBU0sgMS4yKiogVXNpbmcgdGhlIHNhbXBsaW5nIHBhZGRsZSwgdGFrZSBhIHNhbXBsZSBvZiB0aGUgcG9wdWxhdGlvbiBhbmQgYW5zd2VyIHRoZSBiZWxvdyBxdWVzdGlvbnMuICpFYWNoIHBlcnNvbiBpbiB0aGUgZ3JvdXAgbXVzdCB0YWtlIHRoZWlyIG93biBzYW1wbGUqLg0KDQogICAgKipSZXNwb25zZSoqDQogICAgLSBXaGF0IGlzIG4sIHRoZSBzYW1wbGUgc2l6ZT8gNDANCiAgICAtIFdoYXQgaXMgeW91ciBzYW1wbGUgc3RhdGlzdGljLCBib3RoIG5vdGF0aW9uIGFuZCB2YWx1ZT8gMTcvNDA9LjQyNSAocF4pLg0KDQoqKlRBU0sgMS4zKiogV2l0aCB5b3VyIGdyb3VwLCBkaXNjdXNzIHRoZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIHlvdXIgaW5kaXZpZHVhbCBzYW1wbGUgZXN0aW1hdGVzLiBTdW1tYXJpemUgeW91ciBjb252ZXJzYXRpb24gaW4gYSBzZW50ZW5jZSBvciB0d28gaGVyZS4NCg0KICAgICoqUmVzcG9uc2UqKiBIYWxmIG9mIG91ciBncm91cCBoYWQgYSBzYW1wbGUgc3RhdGlzdGljIHRoYXQgd2FzIGdyZWF0ZXIgdGhhbiAuNSB3aXRoaW4gLjAzICguNS0uNTMpLCBhbmQgdGhlIG90aGVyIGhhbGYgaGFkIGEgc2FtcGxlIHN0YXRpc3RpYyB0aGF0IHdhcyBsZXNzIHRoYW4gLjUgd2l0aGluIC4xMjUgKC4zNzUtLjUpLg0KDQoqKlRBU0sgMS40KiogV29ya2luZyB0b2dldGhlciwgdGFrZSBhdCBsZWFzdCAzMCBzYW1wbGVzIChtb3JlIGlmIHlvdSdkIGxpa2UhKSBhbmQgbWFrZSBhIHZlY3RvciBvZiB0aGUgc2FtcGxlIHN0YXRpc3RpY3MgaW4gUi4gTWFrZSBhIGRvdHBsb3Qgb2YgeW91ciBzYW1wbGUgc3RhdGlzdGljcyBhbmQgZGlzY3VzcyB0aGUgY2VudGVyIGFuZCBzcHJlYWQgb2YgdGhlIGRvdHBsb3QuDQoNCiAgICAqKlJlc3BvbnNlKiogVGhlIHJhbmdlIG9mIHRoZSBkb3RwbG90IGdvZXMgZnJvbSAzLjI1LS41NzUgYW5kIHRoZSBjZW50ZXIgaXMgYXJvdW5kIC41Lg0KDQpgYGB7cn0NClNhbXBsZVN0YXRpc3RpY3MgPC0gYyguMzc1LCAuNDI1LCAuNTEsIC41MywgLjQ1LCAuNSwgLjQ3NSwgLjQ1LCAuNTUsIC41NzUsIC40NzUsIC40NzUsIC41LCAuNTI1LCAyMi80MCwgMTkvNDAsIDIxLzQwLCAyMy80MCwgMjAvNDAsIDIyLzQwLCAxOC80MCwgMjEvNDAsIDIwLzQwLCAyMC80MCwgMTMvNDAsIDE3LzQwLCAyMi80MCwgMjAvNDAsIDE3LzQwLCAyMy80MCkNCg0KZ2ZfZG90cGxvdCggfiBTYW1wbGVTdGF0aXN0aWNzKQ0KYGBgDQoNCioqVEFTSyAxLjUqKiBCYXNlZCBvbiBldmVyeXRoaW5nIHlvdSd2ZSBkb25lIHNvIGZhciwgd2hhdCBkbyB5b3UgdGhpbmsgaXMgdGhlIGJlc3QgZ3Vlc3MgZm9yIHRoZSBwb3B1bGF0aW9uIHBhcmFtZXRlciBpbiB5b3VyIHRvd24/IFdyaXRlIGEgc2VudGVuY2UganVzdGlmeWluZyB5b3VyIGFuc3dlci4NCg0KICAgICoqUmVzcG9uc2UqKiBCYXNlZCBvbiBvdXIgc2FtcGxlIHN0YXRpc3RpY3MsIG91ciBiZXN0IGd1ZXNzIGlzIHRoYXQgdGhlIHBvcHVsYXRpb24gcGFyYW1ldGVyIGlzIC41IGJlY2F1c2Ugb3VyIHNhbXBsZSBkaXN0cmlidXRpb24gaXMgYSBub3JtYWwgY3VydmUgY2VudGVyZWQgYWJvdXQgLjUuDQoNCioqVEFTSyAxLjYqKiBDYWxjdWxhdGUgdGhlIHN0YW5kYXJkIGRldmlhdGlvbiBvZiB5b3VyIHNhbXBsZSBzdGF0aXN0aWNzLiBUaGUgc3BlY2lmaWMgbmFtZSBmb3IgdGhpcyB2YWx1ZSBpcyB0aGUgKnN0YW5kYXJkIGVycm9yKi4gV2hlbmV2ZXIgd2UgZGlzY3VzcyB0aGUgc3RhbmRhcmQgZXJyb3Igb2YgYSBzdGF0aXN0aWMsIGl0IGRlc2NyaWJlcyB0aGUgaG93IHZhcmlhYmxlIHN0YXRpc3RpY3MgYXJlIHdoZW4gdGhleSBhcmUgY2FsY3VsYXRlZCBmcm9tIGRpZmZlcmVudCBzYW1wbGVzIGRyYXduIGZyb20gdGhlIHNhbWUgcG9wdWxhdGlvbi4NCg0KICAgICoqUmVzcG9uc2UqKiBTRSA9IC4wNTkwMjQ4OA0KDQpgYGB7cn0NCnNkKH5TYW1wbGVTdGF0aXN0aWNzKQ0KYGBgDQoNCiMgUGFydCAyOiBCYXNlYmFsbCBQbGF5ZXIgU2FsYXJpZXMNCg0KV2UgY2FuIGFsc28gY3JlYXRlIHNhbXBsaW5nIGRpc3RyaWJ1dGlvbnMgZm9yIHRoZSByZXN0IG9mIHRoZSAnYmlnIDUnIHBhcmFtZXRlcnMuIEluIHRoaXMgc2VjdGlvbiwgeW91IHdpbGwgY3JlYXRlIHNldmVyYWwgc2FtcGxpbmcgZGlzdHJpYnV0aW9ucyBmb3IgbWVhbnMgb2YgZGlmZmVyZW50IHBvcHVsYXRpb25zIGFuZCBvZiBkaWZmZXJlbnQgc2l6ZXMuDQoNCiMjIyBTYW1wbGluZyBEaXN0cmlidXRpb24NCg0KVG8gY3JlYXRlIGEgc2FtcGxpbmcgZGlzdHJpYnV0aW9uIGZyb20gc2ltcGxlIHJhbmRvbSBzYW1wbGVzLCB3ZSBtdXN0IGhhdmUgYWNjZXNzIHRvIHRoZSBlbnRpcmUgcG9wdWxhdGlvbi4gRm9yIHRoaXMgc2VjdGlvbiB3ZSBoYXZlIGFjY2VzcyB0byBhbGwgb3BlbmluZyBkYXkgc2FsYXJpZXMgZm9yIG1ham9yIGxlYWd1ZSBiYXNlYmFsbCBwbGF5ZXJzIGluIDIwMTkgKGluIG1pbGxpb25zIG9mIGRvbGxhcikuIFdlIGNhbiBsb2FkIHRoZSBkYXRhc2V0LCBjYWxsZWQgQmFzZWJhbGxTYWxhcmllczIwMTksIGZyb20gb3VyIHRleHRib29rIHVzaW5nIHRoZSBjb2RlIGJlbG93Og0KDQpgYGB7cn0NCmRhdGEoIkJhc2ViYWxsU2FsYXJpZXMyMDE5IikNCg0KaGVhZChCYXNlYmFsbFNhbGFyaWVzMjAxOSkNCmBgYA0KDQoqKlRBU0sgMi4xKiogRmluZCB0aGUgbWVhbiBhbmQgc3RhbmRhcmQgZGV2aWF0aW9uIG9mIHNhbGFyeSBpbiB0aGUgcG9wdWxhdGlvbi4gUmVjYWxsIHRoYXQgdGhlIGNvbW1hbmRzIG1lYW4oXH5ZLCBkYXRhID0gRGF0YVNldE5hbWUpIGFuZCBzZChcflksIGRhdGEgPSBEYXRhU2V0TmFtZSkgY2FuIGhlbHAgeW91IGFjY29tcGxpc2ggdGhpcyB0YXNrLiAqaW5jbHVkZSBwcm9wZXIgbm90YXRpb24gZm9yIGVhY2ggcXVhbnRpdHkqDQoNCiAgICAqKlJlc3BvbnNlKiogTXUgPSA0LjUwOTkyNCBhbmQgU2lnbWEgPSA2LjMzNDIxNw0KDQpgYGB7cn0NCm1lYW4oflNhbGFyeSwgZGF0YSA9IEJhc2ViYWxsU2FsYXJpZXMyMDE5KQ0Kc2QoflNhbGFyeSwgZGF0YSA9IEJhc2ViYWxsU2FsYXJpZXMyMDE5KQ0KDQpgYGANCg0KKipUQVNLIDIuMioqIENyZWF0ZSBhIGhpc3RvZ3JhbSBvZiB0aGUgc2FsYXJpZXMgYW5kIGRlc2NyaWJlIHRoZSBzaGFwZSBvZiB0aGUgZGlzdHJpYnV0aW9uLiBIaW50OiByZW1lbWJlciBnZl9oaXN0b2dyYW0oKQ0KDQogICAgKipSZXNwb25zZSoqIFRoZSBoaXN0b2dyYW0gaXMgYXN5bW1ldHJpYyBhbmQgc2tld2VkIHJpZ2h0Lg0KDQpgYGB7cn0NCmdmX2hpc3RvZ3JhbSh+U2FsYXJ5LCBkYXRhID0gQmFzZWJhbGxTYWxhcmllczIwMTkpDQoNCmBgYA0KDQoqKlRBU0sgMi4zKiogVXNlIHRoZSBjb2RlIGJlbG93IHRvIGdlbmVyYXRlIDIwMDAgc2FtcGxlcyBvZiBzaXplIDEwMCwgc2F2aW5nIHRoZSBzYW1wbGUgbWVhbiBzYWxhcnkgZm9yIGVhY2ggc2FtcGxlLCBhbmQgY3JlYXRpbmcgYSBoaXN0b2dyYW0uIFdoYXQgZG9lcyBhbiBvYnNlcnZhdGlvbiBwbG90dGVkIGluIHRoZSBoaXN0b2dyYW0gcmVwcmVzZW50Pw0KDQogICAgKipSZXNwb25zZSoqIFRoZSBtZWFuIHNhbGFyeSAoeCBiYXIpIG9mIGEgcmFuZG9tIHNhbXBsZSBvZiAxMDAgcGxheWVycy4NCg0KYGBge3J9DQojIHNhdmUgc3BhY2UgZm9yIHRoZSBtZWFucw0KU2FsYXJ5TWVhbnMgPC0gcmVwKE5BLCAyMDAwKQ0KDQojIGdlbmVyYXRlIDIwMCBzYW1wbGVzLCBzYXZpbmcgdGhlIG1lYW4gb2YgZWFjaCBvbmUNCmZvcihpIGluIDE6MjAwMCl7DQogICMgdGFrZSBhIHNhbXBsZQ0KICBUZW1wb3JhcnlTYW1wbGUgPC0gc2FtcGxlX24oQmFzZWJhbGxTYWxhcmllczIwMTksIDEwMCkNCiAgIyBzYXZlIHRoZSBtZWFuDQogIFNhbGFyeU1lYW5zW2ldIDwtIG1lYW4oflNhbGFyeSwgZGF0YSA9IFRlbXBvcmFyeVNhbXBsZSkNCn0NCg0KZ2ZfaGlzdG9ncmFtKH5TYWxhcnlNZWFucykNCmBgYA0KDQoqKlRBU0sgMi40KiogRGVzY3JpYmUgdGhlIHNoYXBlIG9mIHlvdXIgc2FtcGxpbmcgZGlzdHJpYnV0aW9uLCBhbmQgY29tcGFyZSBpdCB0byB0aGUgc2hhcGUgb2YgdGhlIHBvcHVsYXRpb24uDQoNCiAgICAqKlJlc3BvbnNlKiogVGhlIHNhbXBsaW5nIGRpc3RyaWJ1dGlvbiBpcyBzeW1tZXRyaWMgYW5kIGNlbnRlcmVkIGFyb3VuZCA0LjUsIGFuZCB0aGUgc2FtcGxpbmcgZGlzdHJpYnV0aW9uIGlzIGEgbm9ybWFsIGN1cnZlIHdoaWxlIHRoZSBwb3B1bGF0aW9uIHdhcyBjb21wbGV0ZWx5IHNrZXdlZCByaWdodC4NCg0KKipUQVNLIDIuNSoqIENhbGN1bGF0ZSB0aGUgY2VudGVyIG9mIHlvdXIgc2FtcGxpbmcgZGlzdHJpYnV0aW9uLCBhcyBtZWFzdXJlZCBieSB0aGUgbWVhbiBvZiB0aGUgdmVjdG9yIG9mIHNhbXBsZSBtZWFucy4gSG93IGRvZXMgdGhpcyB2YWx1ZSBjb21wYXJlIHRvIHRoZSBwb3B1bGF0aW9uIG1lYW4/DQoNCiAgICAqKlJlc3BvbnNlKiogeCBiYXIgPSA0LjUwMzE0OCBpcyB3aXRoaW4gbGVzcyB0aGFuIDcgb25lIHRob3VzYW5kdGhzIG9mIG11Lg0KDQpgYGB7cn0NCm1lYW4oU2FsYXJ5TWVhbnMpDQoNCmBgYA0KDQoqKlRBU0sgMi42KiogQ2FsY3VsYXRlIHRoZSBzdGFuZGFyZCBlcnJvciBvZiB0aGUgc2FtcGxlIG1lYW4gdXNpbmcgeW91ciB2ZWN0b3Igb2Ygc2FtcGxlIG1lYW5zLiBSZWNhbGwgdGhhdCB0aGUgc3RhbmRhcmQgZXJyb3Igb2YgYSBzdGF0aXN0aWMgaXMgdGhlIHN0YW5kYXJkIGRldmlhdGlvbiBvZiB0aGUgc2FtcGxpbmcgZGlzdHJpYnV0aW9uLg0KDQogICAgKipSZXNwb25zZSoqIHMgPSAwLjYwNTQ1MDYNCg0KYGBge3J9DQpzZChTYWxhcnlNZWFucykNCg0KYGBgDQoNCioqVEFTSyAyLjcqKiBIb3BlZnVsbHkgdGhlIHN0YW5kYXJkIGVycm9yIHlvdSBjYWxjdWxhdGVkIGluIDIuNiByb3VnaGx5IG1hdGNoZXMgdGhlIHN0YW5kYXJkIGVycm9yIHlvdSBjb3VsZCBlc3RpbWF0ZSBmcm9tIHRoZSBoaXN0b2dyYW0gaW4gMi4zLiBFeHBsYWluIGhvdyB5b3UgY291bGQgZXN0aW1hdGUgdGhlIFNFIGZyb20gdGhlIGhpc3RvZ3JhbSwgYW5kIHNob3cgaG93IGl0IGlzIHJvdWdobHkgdGhlIHNhbWUuDQoNCiAgICAqKlJlc3BvbnNlKiogWW91IGNhbiBlc3RpbWF0ZSB0aGUgU0UgZnJvbSB0aGUgaGlzdG9ncmFtIGJ5IGV5ZWJhbGxpbmcgdGhlIHJhbmdlIGluIHdoaWNoIDk1JSBvZiB0aGUgc2FtcGxlcyBmYWxsIGFuZCBkaXZpZGluZyB0aGF0IHJhbmdlIGJ5IDQuIEZvciBpbnN0YW5jZSwgaWYgSSB0YWtlIDUuNzUoYXBwcm94aW1hdGUgdXBwZXIgYm91bmQgZm9yIHRoZSA5NXRoIHBlcmNlbnRpbGUpIGFuZCBzdWJ0cmFjdCAzLjI1IChhcHByb3hpbWF0ZSA1dGggcGVyY2VudGlsZSkgdGhlbiBkaXZpZGUgdGhlIGRpZmZlcmVuY2UgYnkgNCwgSSBnZXQgLjYyNS4gVGhpcyB2YWx1ZSBpcyBxdWl0ZSBjbG9zZSB0byB0aGUgdHJ1ZSBzdGFuZGFyZCBkZXZpYXRpb24gb2YgdGhlIHBvcHVsYXRpb24gd2hpY2ggaXMgNi4zMzQyMTcuDQoNCiMjIyBDb25maWRlbmNlIGludGVydmFscw0KDQoqKlRBU0sgMi44IERpcmVjdGlvbnMqKiBGb3IgZWFjaCBvZiB0aGUgc2FtcGxlIG1lYW5zIGJlbG93IChhc3N1bWVkIHRvIGJlIG1lYW5zIGZvciBzYW1wbGVzIG9mIGJhc2ViYWxsIHBsYXllciBzYWxhcmllcykgY2FsY3VsYXRlIHRoZSBjb3JyZXNwb25kaW5nIDk1JSBjb25maWRlbmNlIGludGVydmFsLiBZb3Ugd2lsbCBuZWVkIHRvIHVzZSB0aGUgc3RhbmRhcmQgZXJyb3IgeW91IGNhbGN1bGF0ZWQgZnJvbSAyLjYuIEluZGljYXRlIHdoZXRoZXIgdGhlIGNvbmZpZGVuY2UgaW50ZXJ2YWwgc3VjY2Vzc2Z1bGx5IGNhcHR1cmVzIHRoZSB0cnVlIHBvcHVsYXRpb24gbWVhbiBzYWxhcnkuDQoNCioqVEFTSyAyLjguMSoqICRcYmFye1h9JD0gNA0KDQotICAgKipDb25maWRlbmNlIEludGVydmFsKiogWzIuNzg5MSwgNS4yMTA5XQ0KDQotICAgKipDYXB0dXJlZCBtdT8qKiBZZXMNCg0KKipUQVNLIDIuOC4yKiogJFxiYXJ7WH0kPSAzLjENCg0KLSAgICoqQ29uZmlkZW5jZSBJbnRlcnZhbCoqIFsxLjg4OTEsIDQuMzEwOV0NCg0KLSAgICoqQ2FwdHVyZWQgbXU/KiogTm8NCg0KKipUQVNLIDIuOC4zKiogJFxiYXJ7WH0kPSA1LjINCg0KLSAgICoqQ29uZmlkZW5jZSBJbnRlcnZhbCoqIFszLjk4OTEsIDYuNDEwOV0NCg0KLSAgICoqQ2FwdHVyZWQgbXU/KiogWWVzDQoNCiMgUGFydCAzOiBTYW1wbGUgc2l6ZSBhbmQgY29uZmlkZW5jZSBpbnRlcnZhbHMNCg0KRm9yIHRoaXMgYWN0aXZpdHkgd2Ugd2lsbCB1c2UgdGhlIGRhdGFzZXQgJ0FsbENvdW50cmllcycgZnJvbSB0aGUgTG9jazVEYXRhIHBhY2thZ2UuIFRoZXNlIGRhdGEgY29uc2lzdCBvZiBtZWFzdXJlbWVudHMgZnJvbSBhbGwgY291bnRyaWVzLiBXZSB3aWxsIHN0dWR5IHRoZSB2YXJpYWJsZSAnRmVtYWxlTGFib3InLCB3aGljaCBwcm92aWRlcyB0aGUgcGVyY2VudGFnZSBvZiBmZW1hbGVzIGFnZWQgMTUtNjQgdGhhdCBwYXJ0aWNpcGF0ZSBpbiB0aGUgY291bnRyaWVzIHdvcmtmb3JjZS4gT3VyIGdvYWwgd2lsbCBiZSB0byBidWlsZCBzYW1wbGluZyBkaXN0cmlidXRpb25zIGZyb20gc2FtcGxlcyBvZiB2YXJpb3VzIHNpemVzIGZvciB0aGUgbWVhbiBvZiB0aGlzIHZhcmlhYmxlLg0KDQoqKlRBU0sgMy4wKiogTW9kaWZ5IHRoZSBjb2RlIGJlbG93IHRvIGdlbmVyYXRlIGEgc2FtcGxpbmcgZGlzdHJpYnV0aW9uIG9mIHRoZSBtZWFuIHdpdGggMjAwMCBzYW1wbGVzLCB1c2luZyBhIHNhbXBsZSBzaXplIG9mIG49MTAuDQoNCmBgYHtyfQ0KIyBsb2FkIHRoZSBkYXRhc2V0DQpkYXRhKCJBbGxDb3VudHJpZXMiKQ0KDQojIHdyYW5nbGUgdGhlIGRhdGEgYSBsaXR0bGUgYml0IHRvIHNlbGVjdCBvbmx5IGEgY291cGxlIHZhcmlhYmxlcyBhbmQgdG8gcmVtb3ZlIG1pc3NpbmcgKE5BKSB2YWx1ZXMNCkFsbENvdW50cmllcyA8LSBBbGxDb3VudHJpZXMgJT4lIA0KICBkcGx5cjo6c2VsZWN0KENvdW50cnksRmVtYWxlTGFib3IsTGlmZUV4cGVjdGFuY3kpICU+JQ0KICBuYS5vbWl0KCkNCg0KIyBhbGxvY2F0ZSBzcGFjZSB0byBzdG9yZSB5b3VyIHNhbXBsZSBtZWFucw0KU2FtcGxlTWVhbnMgPC0gcmVwKE5BLCAyMDAwKQ0KDQojIGRyYXcgdGhlIGNvcnJlY3QgbnVtYmVyIG9mIHNhbXBsZXMsIGFuZCBmb3IgZWFjaCBvZiB0aGVtIHNhdmUgdGhlIHNhbXBsZSBtZWFuDQpmb3IoaSBpbiAxOjIwMDApew0KICBUZW1wb3JhcnlTYW1wbGUgPC0gc2FtcGxlX24oQWxsQ291bnRyaWVzLCBzaXplID0gMTApDQogIFNhbXBsZU1lYW5zW2ldIDwtIG1lYW4ofkZlbWFsZUxhYm9yLCBkYXRhID0gVGVtcG9yYXJ5U2FtcGxlKQ0KfQ0KYGBgDQoNCioqVEFTSyAzLjEqKiBVc2UgeW91ciB2ZWN0b3Igb2Ygc2FtcGxlIG1lYW5zIHRvIGNyZWF0ZSBhIGhpc3RvZ3JhbSBvZiB5b3VyIHNhbXBsaW5nIGRpc3RyaWJ1dGlvbiwgYW5kIHRvIGNhbGN1bGF0ZSB0aGUgc3RhbmRhcmQgZXJyb3Igb2YgdGhlIHNhbXBsZSBtZWFuLiBBbnN3ZXIgdGhlIHF1ZXN0aW9ucyBiZWxvdy4NCg0KYGBge3J9DQpzZChTYW1wbGVNZWFucykNCm1lYW4oU2FtcGxlTWVhbnMpDQpgYGANCg0KQS4gV2hlcmUgaXMgdGhlIGNlbnRlciBvZiB0aGUgZGlzdHJpYnV0aW9uPw0KDQogICAgKipSZXNwb25zZSoqIDU4LjEyMjc1DQoNCkIuIFdoYXQgaXMgdGhlIHN0YW5kYXJkIGVycm9yPw0KDQogICAgKipSZXNwb25zZSoqIDUuMzI5MzM1DQoNCkMuICBJZiB3ZSB3ZXJlIHRvIGJ1aWxkIGEgOTUlIGNvbmZpZGVuY2UgaW50ZXJ2YWwgdXNpbmcgb25lIG9mIHRoZSBzYW1wbGUgbWVhbnMsIGhvdyB3aWRlIHdvdWxkIGl0IGJlPw0KDQpgYGB7PWh0bWx9DQo8IS0tIC0tPg0KYGBgDQogICAgKipSZXNwb25zZSoqIFs0Ny40NjQxLCA2OC43ODQxXQ0KDQoqKlRBU0sgMy4yKiogTm93IGdlbmVyYXRlIGEgc2FtcGxpbmcgZGlzdHJpYnV0aW9uIGZvciB0aGUgbWVhbiB1c2luZyBzYW1wbGVzIG9mIHNpemUgbj01MC4gQWdhaW4sIHlvdSdsbCBuZWVkIHRvIGNhbGN1bGF0ZSB0aGUgbWVhbnMgZm9yIDIwMDAgc2FtcGxlcyBhbmQgc2F2ZSB0aGVtIGFzIGEgdmVjdG9yLiBUaGVuIHByb2R1Y2UgdGhlIGhpc3RvZ3JhbSwgY2FsY3VsYXRlIHRoZSBzdGFuZGFyZCBlcnJvciwgYW5kIGFuc3dlciB0aGUgcXVlc3Rpb25zIGJlbG93LiBZb3Ugc2hvdWxkIGNvcHkgYW5kIHBhc3RlIHRoZSBjb2RlIGZyb20gMy0xLCBjaGFuZ2luZyB0aGUgcmVsYXRpdmUgbnVtYmVycy4NCg0KYGBge3J9DQojIGxvYWQgdGhlIGRhdGFzZXQNCmRhdGEoIkFsbENvdW50cmllcyIpDQoNCiMgd3JhbmdsZSB0aGUgZGF0YSBhIGxpdHRsZSBiaXQgdG8gc2VsZWN0IG9ubHkgYSBjb3VwbGUgdmFyaWFibGVzIGFuZCB0byByZW1vdmUgbWlzc2luZyAoTkEpIHZhbHVlcw0KQWxsQ291bnRyaWVzIDwtIEFsbENvdW50cmllcyAlPiUgDQogIGRwbHlyOjpzZWxlY3QoQ291bnRyeSxGZW1hbGVMYWJvcixMaWZlRXhwZWN0YW5jeSkgJT4lDQogIG5hLm9taXQoKQ0KDQojIGFsbG9jYXRlIHNwYWNlIHRvIHN0b3JlIHlvdXIgc2FtcGxlIG1lYW5zDQpTYW1wbGVNZWFucyA8LSByZXAoTkEsIDIwMDApDQoNCiMgZHJhdyB0aGUgY29ycmVjdCBudW1iZXIgb2Ygc2FtcGxlcywgYW5kIGZvciBlYWNoIG9mIHRoZW0gc2F2ZSB0aGUgc2FtcGxlIG1lYW4NCmZvcihpIGluIDE6MjAwMCl7DQogIFRlbXBvcmFyeVNhbXBsZSA8LSBzYW1wbGVfbihBbGxDb3VudHJpZXMsIHNpemUgPSA1MCkNCiAgU2FtcGxlTWVhbnNbaV0gPC0gbWVhbih+RmVtYWxlTGFib3IsIGRhdGEgPSBUZW1wb3JhcnlTYW1wbGUpDQp9DQoNCmdmX2hpc3RvZ3JhbSh+U2FtcGxlTWVhbnMpDQoNCm1lYW4oU2FtcGxlTWVhbnMpDQpzZChTYW1wbGVNZWFucykNCmBgYA0KDQpBLiBXaGVyZSBpcyB0aGUgY2VudGVyIG9mIHRoZSBkaXN0cmlidXRpb24/DQoNCiAgICAqKlJlc3BvbnNlKiogNTcuOTg3MzINCg0KQi4gV2hhdCBpcyB0aGUgc3RhbmRhcmQgZXJyb3I/DQoNCiAgICAqKlJlc3BvbnNlKiogMi4wMzE3OA0KDQpDLiAgSWYgd2Ugd2VyZSB0byBidWlsZCBhIDk1JSBjb25maWRlbmNlIGludGVydmFsIHVzaW5nIG9uZSBvZiB0aGUgc2FtcGxlIG1lYW5zLCBob3cgd2lkZSB3b3VsZCBpdCBiZT8NCg0KYGBgez1odG1sfQ0KPCEtLSAtLT4NCmBgYA0KICAgICoqUmVzcG9uc2UqKiBbNTMuOTIzOCwgNjIuMDUwOV0NCg0KKipUQVNLIDMuMyoqIEZpbmFsbHksIGdlbmVyYXRlIGEgc2FtcGxpbmcgZGlzdHJpYnV0aW9uIGZvciB0aGUgbWVhbiB1c2luZyBzYW1wbGVzIG9mIHNpemUgbj0xMDAuIEFnYWluLCB5b3UnbGwgbmVlZCB0byBjYWxjdWxhdGUgdGhlIG1lYW5zIGZvciAyMDAwIHNhbXBsZXMgYW5kIHNhdmUgdGhlbSBhcyBhIHZlY3Rvci4gVGhlbiBwcm9kdWNlIHRoZSBoaXN0b2dyYW0sIGNhbGN1bGF0ZSB0aGUgc3RhbmRhcmQgZXJyb3IsIGFuZCBhbnN3ZXIgdGhlIHF1ZXN0aW9ucyBiZWxvdy4NCg0KYGBge3J9DQojIGxvYWQgdGhlIGRhdGFzZXQNCmRhdGEoIkFsbENvdW50cmllcyIpDQoNCiMgd3JhbmdsZSB0aGUgZGF0YSBhIGxpdHRsZSBiaXQgdG8gc2VsZWN0IG9ubHkgYSBjb3VwbGUgdmFyaWFibGVzIGFuZCB0byByZW1vdmUgbWlzc2luZyAoTkEpIHZhbHVlcw0KQWxsQ291bnRyaWVzIDwtIEFsbENvdW50cmllcyAlPiUgDQogIGRwbHlyOjpzZWxlY3QoQ291bnRyeSxGZW1hbGVMYWJvcixMaWZlRXhwZWN0YW5jeSkgJT4lDQogIG5hLm9taXQoKQ0KDQojIGFsbG9jYXRlIHNwYWNlIHRvIHN0b3JlIHlvdXIgc2FtcGxlIG1lYW5zDQpTYW1wbGVNZWFucyA8LSByZXAoTkEsIDIwMDApDQoNCiMgZHJhdyB0aGUgY29ycmVjdCBudW1iZXIgb2Ygc2FtcGxlcywgYW5kIGZvciBlYWNoIG9mIHRoZW0gc2F2ZSB0aGUgc2FtcGxlIG1lYW4NCmZvcihpIGluIDE6MjAwMCl7DQogIFRlbXBvcmFyeVNhbXBsZSA8LSBzYW1wbGVfbihBbGxDb3VudHJpZXMsIHNpemUgPSAxMDApDQogIFNhbXBsZU1lYW5zW2ldIDwtIG1lYW4ofkZlbWFsZUxhYm9yLCBkYXRhID0gVGVtcG9yYXJ5U2FtcGxlKQ0KfQ0KDQpnZl9oaXN0b2dyYW0oflNhbXBsZU1lYW5zKQ0KDQptZWFuKFNhbXBsZU1lYW5zKQ0Kc2QoU2FtcGxlTWVhbnMpDQoNCmBgYA0KDQpBLiBXaGVyZSBpcyB0aGUgY2VudGVyIG9mIHRoZSBkaXN0cmlidXRpb24/DQoNCiAgICAqKlJlc3BvbnNlKiogNTcuOTMyMw0KDQpCLiBXaGF0IGlzIHRoZSBzdGFuZGFyZCBlcnJvcj8NCg0KICAgICoqUmVzcG9uc2UqKiAxLjE2OTc3NQ0KDQpDLiAgSWYgd2Ugd2VyZSB0byBidWlsZCBhIDk1JSBjb25maWRlbmNlIGludGVydmFsIHVzaW5nIG9uZSBvZiB0aGUgc2FtcGxlIG1lYW5zLCBob3cgd2lkZSB3b3VsZCBpdCBiZT8NCg0KYGBgez1odG1sfQ0KPCEtLSAtLT4NCmBgYA0KICAgICoqUmVzcG9uc2UqKiBbNTUuNTkyOCw2MC4yNzE5XQ0KDQoqKlRBU0sgMy40KiogV2hhdCBoYXBwZW5zIHRvIHRoZSBjZW50ZXIgb2YgdGhlIGRpc3RyaWJ1dGlvbiBhcyB0aGUgc2FtcGxlIHNpemUgaW5jcmVhc2VzPw0KDQogICAgKipSZXNwb25zZSoqIEl0IHJlbWFpbnMgbmVhcmx5IHVuY2hhbmdlZC4NCg0KKipUQVNLIDMuNSoqIFdoYXQgaGFwcGVucyB0byB0aGUgc3RhbmRhcmQgZXJyb3IsIGFuZCB0aGUgd2lkdGggb2YgY29uZmlkZW5jZSBpbnRlcnZhbHMgYXMgdGhlIHNhbXBsZSBzaXplIGluY3JlYXNlcz8NCg0KICAgICoqUmVzcG9uc2UqKiBUaGUgc3RhbmRhcmQgZXJyb3IgZGVjcmVhc2VzIHNpZ25pZmljYW50bHkgYW5kIHRoZSByYW5nZSBvZiB0aGUgY29uZmlkZW5jZSBpbnRlcnZhbCBuYXJyb3dzIGFzIHRoZSBzaXplIGluY3JlYXNlcy4NCg0KIyBQYXJ0IDQ6IEludGVycHJldGluZyBhIGNvbmZpZGVuY2UgaW50ZXJ2YWwuDQoNClVzaW5nIGEgc2FtcGxlIG9mIDI0IGRlbGl2ZXJpZXMgZGVzY3JpYmVkIGluICJEaWFyeSBvZiBhIFBpenphIEdpcmwiIG9uIHRoZSBTbGljZSB3ZWJzaXRlLCB3ZSBmaW5kIGEgOTUlIGNvbmZpZGVuY2UgaW50ZXJ2YWwgZm9yIHRoZSBtZWFuIHRpcCBnaXZlbiBmb3IgYSBwaXp6YSBkZWxpdmVyeSB0byBiZSBcJDIuMTggdG8gXCQzLjkwLiBXaGljaCBvZiB0aGUgZm9sbG93aW5nIGlzIGEgY29ycmVjdCBpbnRlcnByZXRhdGlvbiBvZiB0aGlzIGludGVydmFsP1wNCjV0MjMgYS4gSSBhbSA5NSUgc3VyZSB0aGF0IGFsbCBwaXp6YSBkZWxpdmVyeSB0aXBzIHdpbGwgYmUgYmV0d2VlbiBcJDIuMTggYW5kIFwkMy45MC4gYi4gOTUlIG9mIGFsbCBwaXp6YSBkZWxpdmVyeSB0aXBzIHdpbGwgYmUgYmV0d2VlbiBcJDIuMTggYW5kIFwkMy45MC4gYy4gSSBhbSA5NSUgc3VyZSB0aGF0IHRoZSBtZWFuIHBpenphIGRlbGl2ZXJ5IHRpcCBmb3IgdGhpcyBzYW1wbGUgd2lsbCBiZSBiZXR3ZWVuIFwkMi4xOCBhbmQgXCQzLjkwLiBkLiBJIGFtIDk1JSBzdXJlIHRoYXQgdGhlIG1lYW4gdGlwIGZvciBhbGwgcGl6emEgZGVsaXZlcmllcyBpbiB0aGlzIGFyZWEgd2lsbCBiZSBiZXR3ZWVuIFwkMi4xOCBhbmQgXCQzLjkwLiBlLiBJIGFtIDk1JSBzdXJlIHRoYXQgdGhlIGNvbmZpZGVuY2UgaW50ZXJ2YWwgZm9yIHRoZSBtZWFuIHBpenphIGRlbGl2ZXJ5IHRpcCB3aWxsIGJlIGJldHdlZW4gXCQyLjE4IGFuZCBcJDMuOTAuDQoNCiAgICAqKlJlc3BvbnNlKiogVGhlIGFuc3dlciBpcyBhLCBiZWNhdXNlIHRoZSBwb3B1bGF0aW9uIG11c3QgYmUgYWxsIHBpenphIGRpbGl2ZXJpZXMgYmVjYXVzZSB0aGUgbG9jYXRpb24gaXMgdW5yZXN0cmljdGVkIGFuZCBhIGNvbmZpZGVuY2UgaW50ZXJ2YWwgeWllbGRzIGEgY2VydGFpbiBsZXZlbCBvZiBjb25maWRlbmNlIHRoYXQgdGhlIHN0YXRpc3RpYyB3aXRoaW4gdGhlIHBvcHVsYXRpb24gd2lsbCBmYWxsIHdpdGhpbiBhIGNlcnRhaW4gaW50ZXJ2YWwuIEQgYWxtb3N0IG1ha2VzIHNlbnNlLCBob3dldmVyIHRoZSAiYXJlYSIgaXMgbm90IGRlZmluZWQuDQo=