One-sample means with the normal distribution
We’ve taken a random sample of 100 runners from a race called the Cherry Blossom Run in Washington, DC, which was a race with 16,924 participants. The sample data for the 100 runners is summarized in Table 4.1, histograms of the run time and age of participants are in Figure 4.2, and summary statistics are available in Table 4.3.
Goal: create a 95% confidence interval for the average time it takes runners in the Cherry Blossom Run to complete the race.
First, we import the dataset summarizing the finishing times, age, gender, state, and other data about each runner:
run10 <- read.delim("run10.txt")
View(run10)
For the case of a single mean, the standard error of the sample mean can be calculated as \[SE = \frac{\sigma}{\sqrt{n}}\]
where \(\sigma\) is the population standard deviation and \(n\) is the sample size. Generally we use the sample standard deviation, denoted by \(s\), in place of the population standard deviation when we compute the standard error: \[SE = \frac{s}{\sqrt{n}}.\]
Is the typical US runner getting faster or slower over time? We consider this question in the context of the Cherry Blossom Run, comparing runners in 2006 and 2012. Technological advances in shoes, training, and diet might suggest runners would be faster in 2012. An opposing viewpoint might say that with the average body mass index on the rise, people tend to run slower. In fact, all of these components might be influencing run time. The average time for all runners who finished the Cherry Blossom Run in 2006 was \(93.29\) minutes (\(93\) minutes and about \(17\) seconds). We want to determine using data from 100 participants in the 2012 Cherry Blossom Run whether runners in this race are getting faster or slower, versus the other possibility that there has been no change
- What are appropriate hypotheses for this context?
Unknown standard errors
If we want to run a hypothesis test, we will have a null hypothesis about the true value of the population mean \(\mu\). For example,
\[H_{0}: \mu = 93.29\text{ minutes}\]
Now we gather a sample and compute the sample mean:
mean(run10$time)
[1] 94.51919
We would like to be able to compare the sample mean \(\bar{y}\) to the hypothesized value 93.29 using a z score:
\[z = \frac{(\bar{y} - \mu)}{\sigma/\sqrt{n}} = \frac{(94.519 - 93.29)}{\sigma/\sqrt{16924}}.\]
However, we have a problem: we don’t know the true value of \(\sigma\). We just know the standard deviation of our sample, not of all US runners.
The best we can do with a sample is calculate this z score replacing the unknown \(\sigma\) with the sample standard deviation \(s\), 15.9271567.
sd(run10$time)
[1] 15.92716
\[z = \frac{(\bar{y} - \mu)}{s/\sqrt{n}} = \frac{(94.519-93.29)}{15.93/\sqrt{16924}} = 10.04.\]
- Using this z-score, decide whether to reject or fail to reject the null hypothesis.
Introducing the \(t\) distribution
The problem is that \(s\) is not a perfect estimate of \(\sigma\). We saw earlier that \(s\) is usually close to \(\sigma\), but \(s\) has its own sampling variability. That means that our test above in which we assumed that \(\sigma\) was known and equal to 15.93 was wrong for the type of situation that will arise when we run a hypothesis test.
In order to address this issue, we’ll use a distribution that’s similar to a normal distribution (it looks like a bell curve) but has a somewhat different shape. This distribution is called the \(t\) distribution and is especially useful for smaller datasets.
Since time is a numerical variable, we can also summarize it using favstats:
library(mosaic)
favstats(~ time, data = run10)
Here is a histogram.
ggplot(run10, aes(x = time)) +
geom_histogram(binwidth = 5)

And here is a QQ plot.
ggplot(run10, aes(sample = time)) +
geom_qq()

- Does it appear that the time it took for runners to complete the Cherry Blossom Run follows a normal distribution? Explain your answer.
Even though the time seems to follow a normal distribution, it’s safest to use a \(t\) distribution as our sampling distribution in order to account for our error in estimating the population standard deviation \(\sigma\) using the sample standard deviation \(s\).
The \(t\) distribution has only one defining characteristic: the number of degrees of freedom \(df\). The number of degrees of freedom is one less than the sample size:
\[ df=n-1 \]
Compute and report the test statistic.
library(broom)
time_test <- t.test(~ time, data = run10, mu = 93.29)
time_test_tidy <- tidy(time_test)
time_test_tidy
Our test statistic (the equivalent of a z-score in a \(t\) distribution, called a \(t\) score) is:
t1 <- time_test_tidy$statistic
t1
[1] 10.03999
The t score is 10.0399853.
Commentary: In addition to identifying the variable of interest (using the tilde) and the data frame, the t.test command requires the null value with the argument mu. We then tidy the results as usual.
The tidy output stores the following numbers: the sample mean (estimate), the test statistic (statistic), the P-value (p.value), the degrees of freedom (parameter), and limits for the confidence interval (conf.low and conf.high). The test statistic is the t score that we stored above as t1.
Plot the null distribution.
pdist("t", df = time_test_tidy$parameter,
q = c(-t1, t1),
invisible = TRUE)

- Would you choose to reject or fail to reject the null hypothesis based on the histogram above? Explain your answer.
Notice that pretty much all the data is less extreme than the test statistic \(t = 10.03999\). This backs up our decision to reject the null hypothesis.
Commentary: The pdist command is the same as always except now we use a "t" model. We know there are 1.692310^{4} degrees of freedom, but we might as well use the value stored in the tidy output (the parameter variable) to make our code reusable. Finally, note that q = c(-t1, t1) will plot in both tails of the distribution since we’re running a two-sided test. Of course, since the t score is crazy huge, it doesn’t actually appear in the resulting graph.
Calculate and interpret the P-value.
P1 <- time_test_tidy$p.value
P1
[1] 1.18438e-23
\(P < 0.001\). If US runners truly averaged a time of \(93.29\) minutes, there would be a 1.1843810^{-21}% chance of seeing data at least as extreme as what we saw.
Commentary: When the P-value is this small, remember that it is traditional to report simply \(P < 0.001\).
Conclusion
State the statistical conclusion.
We reject the null hypothesis.
State (but do not overstate) a contextually meaningful conclusion.
Identify the possibility of either a Type I or Type II error and state what making such an error means in the context of the hypotheses.
Confidence interval
Check the relevant conditions to ensure that model assumptions are met.
Conditions for using the t distribution
Random
10%
Nearly normal: satisfied if either
We expect to see at least 10 successes/failures in each category, and there isn’t much skew; or
Our sample size is at least 30, and there’s no more than moderate amounts of skew.
- Are the conditions for using a \(t\) distribution satisfied for this dataset?
Calculate the confidence interval.
time_test_tidy$conf.low
[1] 94.27922
time_test_tidy$conf.high
[1] 94.75917
State (but do not overstate) a contextually meaningful interpretation.
Explain how the confidence interval reinforces the conclusion of the hypothesis test.
LS0tCnRpdGxlOiAiREFUQSAyMjAgRGF5IDE4IgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKLS0tCgojIE9uZS1zYW1wbGUgbWVhbnMgd2l0aCB0aGUgbm9ybWFsIGRpc3RyaWJ1dGlvbgoKV2XigJl2ZSB0YWtlbiBhIHJhbmRvbSBzYW1wbGUgb2YgMTAwIHJ1bm5lcnMgZnJvbSBhIHJhY2UgY2FsbGVkIHRoZSBDaGVycnkgQmxvc3NvbSBSdW4gaW4gV2FzaGluZ3RvbiwgREMsIHdoaWNoIHdhcyBhIHJhY2Ugd2l0aCAxNiw5MjQgcGFydGljaXBhbnRzLiBUaGUgc2FtcGxlIGRhdGEgZm9yIHRoZSAxMDAgcnVubmVycyBpcyBzdW1tYXJpemVkIGluIFRhYmxlIDQuMSwgaGlzdG9ncmFtcyBvZiB0aGUgcnVuIHRpbWUgYW5kIGFnZSBvZiBwYXJ0aWNpcGFudHMgYXJlIGluIEZpZ3VyZSA0LjIsIGFuZCBzdW1tYXJ5IHN0YXRpc3RpY3MgYXJlIGF2YWlsYWJsZSBpbiBUYWJsZSA0LjMuIAoKR29hbDogY3JlYXRlIGEgOTUlIGNvbmZpZGVuY2UgaW50ZXJ2YWwgZm9yIHRoZSBhdmVyYWdlIHRpbWUgaXQgdGFrZXMgcnVubmVycyBpbiB0aGUgQ2hlcnJ5IEJsb3Nzb20gUnVuIHRvIGNvbXBsZXRlIHRoZSByYWNlLgoKRmlyc3QsIHdlIGltcG9ydCB0aGUgZGF0YXNldCBzdW1tYXJpemluZyB0aGUgZmluaXNoaW5nIHRpbWVzLCBhZ2UsIGdlbmRlciwgc3RhdGUsIGFuZCBvdGhlciBkYXRhIGFib3V0IGVhY2ggcnVubmVyOgoKYGBge3IgaW1wb3J0LCBtZXNzYWdlID0gRkFMU0UsIHdhcm5pbmc9RkFMU0V9CnJ1bjEwIDwtIHJlYWQuZGVsaW0oInJ1bjEwLnR4dCIpClZpZXcocnVuMTApCmBgYAoKRm9yIHRoZSBjYXNlIG9mIGEgc2luZ2xlIG1lYW4sIHRoZSBzdGFuZGFyZCBlcnJvciBvZiB0aGUgc2FtcGxlIG1lYW4gY2FuIGJlIGNhbGN1bGF0ZWQgYXMKJCRTRSA9IFxmcmFje1xzaWdtYX17XHNxcnR7bn19JCQKCndoZXJlICRcc2lnbWEkIGlzIHRoZSBwb3B1bGF0aW9uIHN0YW5kYXJkIGRldmlhdGlvbiBhbmQgJG4kIGlzIHRoZSBzYW1wbGUgc2l6ZS4gR2VuZXJhbGx5IHdlIHVzZSB0aGUgc2FtcGxlIHN0YW5kYXJkIGRldmlhdGlvbiwgZGVub3RlZCBieSAkcyQsIGluIHBsYWNlIG9mIHRoZSBwb3B1bGF0aW9uIHN0YW5kYXJkIGRldmlhdGlvbiB3aGVuIHdlIGNvbXB1dGUgdGhlIHN0YW5kYXJkIGVycm9yOgokJFNFID0gXGZyYWN7c317XHNxcnR7bn19LiQkCgpJcyB0aGUgdHlwaWNhbCBVUyBydW5uZXIgZ2V0dGluZyBmYXN0ZXIgb3Igc2xvd2VyIG92ZXIgdGltZT8gV2UgY29uc2lkZXIgdGhpcyBxdWVzdGlvbiBpbiB0aGUgY29udGV4dCBvZiB0aGUgQ2hlcnJ5IEJsb3Nzb20gUnVuLCBjb21wYXJpbmcgcnVubmVycyBpbiAyMDA2IGFuZCAyMDEyLiBUZWNobm9sb2dpY2FsIGFkdmFuY2VzIGluIHNob2VzLCB0cmFpbmluZywgYW5kIGRpZXQgbWlnaHQgc3VnZ2VzdCBydW5uZXJzIHdvdWxkIGJlIGZhc3RlciBpbiAyMDEyLiBBbiBvcHBvc2luZyB2aWV3cG9pbnQgbWlnaHQgc2F5IHRoYXQgd2l0aCB0aGUgYXZlcmFnZSBib2R5IG1hc3MgaW5kZXggb24gdGhlIHJpc2UsIHBlb3BsZSB0ZW5kIHRvIHJ1biBzbG93ZXIuIEluIGZhY3QsIGFsbCBvZiB0aGVzZSBjb21wb25lbnRzIG1pZ2h0IGJlIGluZmx1ZW5jaW5nIHJ1biB0aW1lLiBUaGUgYXZlcmFnZSB0aW1lIGZvciBhbGwgcnVubmVycyB3aG8gZmluaXNoZWQgdGhlIENoZXJyeSBCbG9zc29tIFJ1biBpbiAyMDA2IHdhcyAkOTMuMjkkIG1pbnV0ZXMgKCQ5MyQgbWludXRlcyBhbmQgYWJvdXQgJDE3JCBzZWNvbmRzKS4gV2Ugd2FudCB0byBkZXRlcm1pbmUgdXNpbmcgZGF0YSBmcm9tIDEwMCBwYXJ0aWNpcGFudHMgaW4gdGhlIDIwMTIgQ2hlcnJ5IEJsb3Nzb20gUnVuIHdoZXRoZXIgcnVubmVycyBpbiB0aGlzIHJhY2UgYXJlIGdldHRpbmcgZmFzdGVyIG9yIHNsb3dlciwgdmVyc3VzIHRoZSBvdGhlciBwb3NzaWJpbGl0eSB0aGF0IHRoZXJlIGhhcyBiZWVuIG5vIGNoYW5nZQoKMS4gV2hhdCBhcmUgYXBwcm9wcmlhdGUgaHlwb3RoZXNlcyBmb3IgdGhpcyBjb250ZXh0PwoKIyMgVW5rbm93biBzdGFuZGFyZCBlcnJvcnMKCklmIHdlIHdhbnQgdG8gcnVuIGEgaHlwb3RoZXNpcyB0ZXN0LCB3ZSB3aWxsIGhhdmUgYSBudWxsIGh5cG90aGVzaXMgYWJvdXQgdGhlIHRydWUgdmFsdWUgb2YgdGhlIHBvcHVsYXRpb24gbWVhbiAkXG11JC4gRm9yIGV4YW1wbGUsCgokJEhfezB9OiBcbXUgPSA5My4yOVx0ZXh0eyBtaW51dGVzfSQkCgpOb3cgd2UgZ2F0aGVyIGEgc2FtcGxlIGFuZCBjb21wdXRlIHRoZSBzYW1wbGUgbWVhbjoKCmBgYHtyIHNhbXBsZW1lYW59Cm1lYW4ocnVuMTAkdGltZSkKYGBgCgpXZSB3b3VsZCBsaWtlIHRvIGJlIGFibGUgdG8gY29tcGFyZSB0aGUgc2FtcGxlIG1lYW4gJFxiYXJ7eX0kIHRvIHRoZSBoeXBvdGhlc2l6ZWQgdmFsdWUgOTMuMjkgdXNpbmcgYSB6IHNjb3JlOgoKJCR6ID0gXGZyYWN7KFxiYXJ7eX0gLSBcbXUpfXtcc2lnbWEvXHNxcnR7bn19ID0gXGZyYWN7KDk0LjUxOSAtIDkzLjI5KX17XHNpZ21hL1xzcXJ0ezE2OTI0fX0uJCQKCkhvd2V2ZXIsIHdlIGhhdmUgYSBwcm9ibGVtOiB3ZSBkb24ndCBrbm93IHRoZSB0cnVlIHZhbHVlIG9mICRcc2lnbWEkLiBXZSBqdXN0IGtub3cgdGhlIHN0YW5kYXJkIGRldmlhdGlvbiBvZiBvdXIgc2FtcGxlLCBub3Qgb2YgYWxsIFVTIHJ1bm5lcnMuCgpUaGUgYmVzdCB3ZSBjYW4gZG8gd2l0aCBhIHNhbXBsZSBpcyBjYWxjdWxhdGUgdGhpcyB6IHNjb3JlIHJlcGxhY2luZyB0aGUgdW5rbm93biAkXHNpZ21hJCB3aXRoIHRoZSBzYW1wbGUgc3RhbmRhcmQgZGV2aWF0aW9uICRzJCwgYHIgc2QocnVuMTAkdGltZSlgLiAKCmBgYHtyIHNhbXBsZXNkfQpzZChydW4xMCR0aW1lKQpgYGAKCiQkeiA9IFxmcmFjeyhcYmFye3l9IC0gXG11KX17cy9cc3FydHtufX0gPSBcZnJhY3soOTQuNTE5LTkzLjI5KX17MTUuOTMvXHNxcnR7MTY5MjR9fSA9IDEwLjA0LiQkCgoyLiBVc2luZyB0aGlzIHotc2NvcmUsIGRlY2lkZSB3aGV0aGVyIHRvIHJlamVjdCBvciBmYWlsIHRvIHJlamVjdCB0aGUgbnVsbCBoeXBvdGhlc2lzLgoKIyBJbnRyb2R1Y2luZyB0aGUgJHQkIGRpc3RyaWJ1dGlvbgoKVGhlIHByb2JsZW0gaXMgdGhhdCAkcyQgaXMgbm90IGEgcGVyZmVjdCBlc3RpbWF0ZSBvZiAkXHNpZ21hJC4gV2Ugc2F3IGVhcmxpZXIgdGhhdCAkcyQgaXMgdXN1YWxseSBjbG9zZSB0byAkXHNpZ21hJCwgYnV0ICRzJCBoYXMgaXRzIG93biBzYW1wbGluZyB2YXJpYWJpbGl0eS4gVGhhdCBtZWFucyB0aGF0IG91ciB0ZXN0IGFib3ZlIGluIHdoaWNoIHdlIGFzc3VtZWQgdGhhdCAkXHNpZ21hJCB3YXMga25vd24gYW5kIGVxdWFsIHRvIDE1LjkzIHdhcyB3cm9uZyBmb3IgdGhlIHR5cGUgb2Ygc2l0dWF0aW9uIHRoYXQgd2lsbCBhcmlzZSB3aGVuIHdlIHJ1biBhIGh5cG90aGVzaXMgdGVzdC4gCgpJbiBvcmRlciB0byBhZGRyZXNzIHRoaXMgaXNzdWUsIHdlJ2xsIHVzZSBhIGRpc3RyaWJ1dGlvbiB0aGF0J3Mgc2ltaWxhciB0byBhIG5vcm1hbCBkaXN0cmlidXRpb24gKGl0IGxvb2tzIGxpa2UgYSBiZWxsIGN1cnZlKSBidXQgaGFzIGEgc29tZXdoYXQgZGlmZmVyZW50IHNoYXBlLiBUaGlzIGRpc3RyaWJ1dGlvbiBpcyBjYWxsZWQgdGhlICR0JCBkaXN0cmlidXRpb24gYW5kIGlzIGVzcGVjaWFsbHkgdXNlZnVsIGZvciBzbWFsbGVyIGRhdGFzZXRzLgoKU2luY2UgYHRpbWVgIGlzIGEgbnVtZXJpY2FsIHZhcmlhYmxlLCB3ZSBjYW4gYWxzbyBzdW1tYXJpemUgaXQgdXNpbmcgYGZhdnN0YXRzYDoKCmBgYHtyfQpsaWJyYXJ5KG1vc2FpYykKZmF2c3RhdHMofiB0aW1lLCBkYXRhID0gcnVuMTApCmBgYAoKSGVyZSBpcyBhIGhpc3RvZ3JhbS4KCmBgYHtyfQpnZ3Bsb3QocnVuMTAsIGFlcyh4ID0gdGltZSkpICsKICAgIGdlb21faGlzdG9ncmFtKGJpbndpZHRoID0gNSkKYGBgCgpBbmQgaGVyZSBpcyBhIFFRIHBsb3QuCgpgYGB7cn0KZ2dwbG90KHJ1bjEwLCBhZXMoc2FtcGxlID0gdGltZSkpICsKICAgIGdlb21fcXEoKQpgYGAKCjMuIERvZXMgaXQgYXBwZWFyIHRoYXQgdGhlIHRpbWUgaXQgdG9vayBmb3IgcnVubmVycyB0byBjb21wbGV0ZSB0aGUgQ2hlcnJ5IEJsb3Nzb20gUnVuIGZvbGxvd3MgYSBub3JtYWwgZGlzdHJpYnV0aW9uPyBFeHBsYWluIHlvdXIgYW5zd2VyLgoKRXZlbiB0aG91Z2ggdGhlIHRpbWUgc2VlbXMgdG8gZm9sbG93IGEgbm9ybWFsIGRpc3RyaWJ1dGlvbiwgaXQncyBzYWZlc3QgdG8gdXNlIGEgJHQkIGRpc3RyaWJ1dGlvbiBhcyBvdXIgc2FtcGxpbmcgZGlzdHJpYnV0aW9uIGluIG9yZGVyIHRvIGFjY291bnQgZm9yIG91ciBlcnJvciBpbiBlc3RpbWF0aW5nIHRoZSBwb3B1bGF0aW9uIHN0YW5kYXJkIGRldmlhdGlvbiAkXHNpZ21hJCB1c2luZyB0aGUgc2FtcGxlIHN0YW5kYXJkIGRldmlhdGlvbiAkcyQuCgpUaGUgJHQkIGRpc3RyaWJ1dGlvbiBoYXMgb25seSBvbmUgZGVmaW5pbmcgY2hhcmFjdGVyaXN0aWM6IHRoZSBudW1iZXIgb2YgZGVncmVlcyBvZiBmcmVlZG9tICRkZiQuIFRoZSBudW1iZXIgb2YgZGVncmVlcyBvZiBmcmVlZG9tIGlzIG9uZSBsZXNzIHRoYW4gdGhlIHNhbXBsZSBzaXplOgoKJCQgZGY9bi0xICQkCgojIyMgQ29tcHV0ZSBhbmQgcmVwb3J0IHRoZSB0ZXN0IHN0YXRpc3RpYy4KCmBgYHtyfQpsaWJyYXJ5KGJyb29tKQp0aW1lX3Rlc3QgPC0gdC50ZXN0KH4gdGltZSwgZGF0YSA9IHJ1bjEwLCBtdSA9IDkzLjI5KQp0aW1lX3Rlc3RfdGlkeSA8LSB0aWR5KHRpbWVfdGVzdCkKdGltZV90ZXN0X3RpZHkKYGBgCgpPdXIgdGVzdCBzdGF0aXN0aWMgKHRoZSBlcXVpdmFsZW50IG9mIGEgei1zY29yZSBpbiBhICR0JCBkaXN0cmlidXRpb24sIGNhbGxlZCBhICR0JCBzY29yZSkgaXM6CgpgYGB7cn0KdDEgPC0gdGltZV90ZXN0X3RpZHkkc3RhdGlzdGljCnQxCmBgYAoKVGhlIHQgc2NvcmUgaXMgYHIgdDFgLgoKQ29tbWVudGFyeTogSW4gYWRkaXRpb24gdG8gaWRlbnRpZnlpbmcgdGhlIHZhcmlhYmxlIG9mIGludGVyZXN0ICh1c2luZyB0aGUgdGlsZGUpIGFuZCB0aGUgZGF0YSBmcmFtZSwgdGhlIGB0LnRlc3RgIGNvbW1hbmQgcmVxdWlyZXMgdGhlIG51bGwgdmFsdWUgd2l0aCB0aGUgYXJndW1lbnQgYG11YC4gV2UgdGhlbiB0aWR5IHRoZSByZXN1bHRzIGFzIHVzdWFsLiAKClRoZSB0aWR5IG91dHB1dCBzdG9yZXMgdGhlIGZvbGxvd2luZyBudW1iZXJzOiB0aGUgc2FtcGxlIG1lYW4gKGBlc3RpbWF0ZWApLCB0aGUgdGVzdCBzdGF0aXN0aWMgKGBzdGF0aXN0aWNgKSwgdGhlIFAtdmFsdWUgKGBwLnZhbHVlYCksIHRoZSBkZWdyZWVzIG9mIGZyZWVkb20gKGBwYXJhbWV0ZXJgKSwgYW5kIGxpbWl0cyBmb3IgdGhlIGNvbmZpZGVuY2UgaW50ZXJ2YWwgKGBjb25mLmxvd2AgYW5kIGBjb25mLmhpZ2hgKS4gVGhlIHRlc3Qgc3RhdGlzdGljIGlzIHRoZSB0IHNjb3JlIHRoYXQgd2Ugc3RvcmVkIGFib3ZlIGFzIGB0MWAuCgojIyMgUGxvdCB0aGUgbnVsbCBkaXN0cmlidXRpb24uCgpgYGB7cn0KcGRpc3QoInQiLCBkZiA9IHRpbWVfdGVzdF90aWR5JHBhcmFtZXRlciwgCiAgICAgIHEgPSBjKC10MSwgdDEpLCAKICAgICAgaW52aXNpYmxlID0gVFJVRSkKYGBgCgo0LiBXb3VsZCB5b3UgY2hvb3NlIHRvIHJlamVjdCBvciBmYWlsIHRvIHJlamVjdCB0aGUgbnVsbCBoeXBvdGhlc2lzIGJhc2VkIG9uIHRoZSBoaXN0b2dyYW0gYWJvdmU/IEV4cGxhaW4geW91ciBhbnN3ZXIuCgpOb3RpY2UgdGhhdCBwcmV0dHkgbXVjaCBhbGwgdGhlIGRhdGEgaXMgbGVzcyBleHRyZW1lIHRoYW4gdGhlIHRlc3Qgc3RhdGlzdGljICR0ID0gMTAuMDM5OTkkLiBUaGlzIGJhY2tzIHVwIG91ciBkZWNpc2lvbiB0byByZWplY3QgdGhlIG51bGwgaHlwb3RoZXNpcy4KCkNvbW1lbnRhcnk6IFRoZSBgcGRpc3RgIGNvbW1hbmQgaXMgdGhlIHNhbWUgYXMgYWx3YXlzIGV4Y2VwdCBub3cgd2UgdXNlIGEgYCJ0ImAgbW9kZWwuIFdlIGtub3cgdGhlcmUgYXJlIGByIE5ST1cocnVuMTApIC0gMWAgZGVncmVlcyBvZiBmcmVlZG9tLCBidXQgd2UgbWlnaHQgYXMgd2VsbCB1c2UgdGhlIHZhbHVlIHN0b3JlZCBpbiB0aGUgdGlkeSBvdXRwdXQgKHRoZSBgcGFyYW1ldGVyYCB2YXJpYWJsZSkgdG8gbWFrZSBvdXIgY29kZSByZXVzYWJsZS4gRmluYWxseSwgbm90ZSB0aGF0IGBxID0gYygtdDEsIHQxKWAgd2lsbCBwbG90IGluIGJvdGggdGFpbHMgb2YgdGhlIGRpc3RyaWJ1dGlvbiBzaW5jZSB3ZSdyZSBydW5uaW5nIGEgdHdvLXNpZGVkIHRlc3QuIE9mIGNvdXJzZSwgc2luY2UgdGhlIHQgc2NvcmUgaXMgY3JhenkgaHVnZSwgaXQgZG9lc24ndCBhY3R1YWxseSBhcHBlYXIgaW4gdGhlIHJlc3VsdGluZyBncmFwaC4KCiMjIyBDYWxjdWxhdGUgYW5kIGludGVycHJldCB0aGUgUC12YWx1ZS4KCmBgYHtyfQpQMSA8LSB0aW1lX3Rlc3RfdGlkeSRwLnZhbHVlClAxCmBgYAoKJFAgPCAwLjAwMSQuIElmIFVTIHJ1bm5lcnMgdHJ1bHkgYXZlcmFnZWQgYSB0aW1lIG9mICQ5My4yOSQgbWludXRlcywgdGhlcmUgd291bGQgYmUgYSBgciAxMDAgKiBQMWAlIGNoYW5jZSBvZiBzZWVpbmcgZGF0YSBhdCBsZWFzdCBhcyBleHRyZW1lIGFzIHdoYXQgd2Ugc2F3LgoKQ29tbWVudGFyeTogV2hlbiB0aGUgUC12YWx1ZSBpcyB0aGlzIHNtYWxsLCByZW1lbWJlciB0aGF0IGl0IGlzIHRyYWRpdGlvbmFsIHRvIHJlcG9ydCBzaW1wbHkgJFAgPCAwLjAwMSQuCgoKIyMgQ29uY2x1c2lvbgoKIyMjIFN0YXRlIHRoZSBzdGF0aXN0aWNhbCBjb25jbHVzaW9uLgoKV2UgcmVqZWN0IHRoZSBudWxsIGh5cG90aGVzaXMuCgo1LiBTdGF0ZSAoYnV0IGRvIG5vdCBvdmVyc3RhdGUpIGEgY29udGV4dHVhbGx5IG1lYW5pbmdmdWwgY29uY2x1c2lvbi4KCjYuIElkZW50aWZ5IHRoZSBwb3NzaWJpbGl0eSBvZiBlaXRoZXIgYSBUeXBlIEkgb3IgVHlwZSBJSSBlcnJvciBhbmQgc3RhdGUgd2hhdCBtYWtpbmcgc3VjaCBhbiBlcnJvciBtZWFucyBpbiB0aGUgY29udGV4dCBvZiB0aGUgaHlwb3RoZXNlcy4KCgojIyBDb25maWRlbmNlIGludGVydmFsCgojIyMgQ2hlY2sgdGhlIHJlbGV2YW50IGNvbmRpdGlvbnMgdG8gZW5zdXJlIHRoYXQgbW9kZWwgYXNzdW1wdGlvbnMgYXJlIG1ldC4KCiMjIyMgQ29uZGl0aW9ucyBmb3IgdXNpbmcgdGhlIHQgZGlzdHJpYnV0aW9uCgphLiBSYW5kb20KCmIuIDEwXCUKCmMuIE5lYXJseSBub3JtYWw6IHNhdGlzZmllZCBpZiBlaXRoZXIKCihpKSBXZSBleHBlY3QgdG8gc2VlIGF0IGxlYXN0IDEwIHN1Y2Nlc3Nlcy9mYWlsdXJlcyBpbiBlYWNoIGNhdGVnb3J5LCBhbmQgdGhlcmUgaXNuJ3QgbXVjaCBza2V3OyBvcgoKKGlpKSBPdXIgc2FtcGxlIHNpemUgaXMgYXQgbGVhc3QgMzAsIGFuZCB0aGVyZSdzIG5vIG1vcmUgdGhhbiBtb2RlcmF0ZSBhbW91bnRzIG9mIHNrZXcuCgo3LiBBcmUgdGhlIGNvbmRpdGlvbnMgZm9yIHVzaW5nIGEgJHQkIGRpc3RyaWJ1dGlvbiBzYXRpc2ZpZWQgZm9yIHRoaXMgZGF0YXNldD8KCiMjIyBDYWxjdWxhdGUgdGhlIGNvbmZpZGVuY2UgaW50ZXJ2YWwuCgpgYGB7cn0KdGltZV90ZXN0X3RpZHkkY29uZi5sb3cKYGBgCgpgYGB7cn0KdGltZV90ZXN0X3RpZHkkY29uZi5oaWdoCmBgYAoKOC4gU3RhdGUgKGJ1dCBkbyBub3Qgb3ZlcnN0YXRlKSBhIGNvbnRleHR1YWxseSBtZWFuaW5nZnVsIGludGVycHJldGF0aW9uLgoKOS4gRXhwbGFpbiBob3cgdGhlIGNvbmZpZGVuY2UgaW50ZXJ2YWwgcmVpbmZvcmNlcyB0aGUgY29uY2x1c2lvbiBvZiB0aGUgaHlwb3RoZXNpcyB0ZXN0Lg==