In this handout, I use ChatGPT 4.0 and the KeyMate.AI Search plugin
to synthesize the information from the textbook, give examples, and
create R code. All prompts are exact, but some of the output may be
modified for correctness.
Hanck, Arnold, Gerber, and Schmelzer (2023). Introduction to
Econometrics with R. https://www.econometrics-with-r.org/index.html. This
book is licensed under the Creative Commons
Attribution-NonCommercial-ShareAlike 4.0 International License.
Prompt
Synthesize the information in this website. Include all relevant
formulas and definitions. https://www.econometrics-with-r.org/2.2-RSATDOSA.html
Content
- Random Sampling:
- A random sample is a subset of data points from a larger population,
chosen randomly.
- In R, the
sample() function is used to draw random
samples.
- Distribution of Sample Averages:
- The distribution of sample averages is the distribution of the means
of different random samples of the same size from the same
population.
- The Central Limit Theorem (CLT) states that, for a sufficiently
large sample size, the distribution of the sample average will be
approximately normal, regardless of the distribution of the population
from which the sample is drawn.
- Formulas:
- Sample Average: \(\bar{X}
= \frac{1}{n} \sum_{i=1}^{n} X_i\)
- Where:
- \(\bar{X}\) is the sample
average.
- \(n\) is the sample size.
- \(X_i\) is the value of the i-th
observation in the sample.
- Variance of Sample Average: \(Var(\bar{X}) = \frac{\sigma^2}{n}\)
- Where:
- \(Var(\bar{X})\) is the variance of
the sample average.
- \(\sigma^2\) is the population
variance.
- \(n\) is the sample size.
- Standard Deviation of Sample Average: \(SD(\bar{X}) = \frac{\sigma}{\sqrt{n}}\)
- Where:
- \(SD(\bar{X})\) is the standard
deviation of the sample average.
- \(\sigma\) is the population
standard deviation.
- \(n\) is the sample size.
- Simulation in R:
- The website provides R code snippets to simulate the distribution of
sample averages and visualize the results. This helps in understanding
the Central Limit Theorem in practice.
- Key Takeaways:
- The distribution of sample averages is a fundamental concept in
statistics.
- The Central Limit Theorem is a powerful tool that allows us to make
inferences about populations based on sample data.
- As the sample size increases, the distribution of the sample average
becomes more normal and its variance decreases.
This synthesis covers the main concepts, formulas, and takeaways from
the website. If you need further details or have any other questions,
please let me know!
Prompt
Please give examples of calculating sample average, standard
deviation, and variance using these formulas.
1. Sample Average
Formula: \[ \bar{X} =
\frac{1}{n} \sum_{i=1}^{n} X_i \]
Example: Suppose we have a sample of 5 observations:
2, 4, 6, 8, 10.
\[ \bar{X} = \frac{1}{5} (2 + 4 + 6 + 8 +
10) \] \[ \bar{X} = \frac{1}{5} (30)
\] \[ \bar{X} = 6 \]
The sample average is 6.
2. Variance of Sample Average
Formula: \[ Var(\bar{X})
= \frac{\sigma^2}{n} \]
To calculate the variance of the sample average, we first need to
find the population variance (\(\sigma^2\)).
Population Variance Formula: \[ \sigma^2 = \frac{1}{n} \sum_{i=1}^{n} (X_i -
\mu)^2 \] Where \(\mu\) is the
population mean.
Using the same sample: \[ \mu = 6
\] (from our previous calculation)
\[ \sigma^2 = \frac{1}{5} [(2-6)^2 +
(4-6)^2 + (6-6)^2 + (8-6)^2 + (10-6)^2] \] \[ \sigma^2 = \frac{1}{5} [16 + 4 + 0 + 4 + 16]
\] \[ \sigma^2 = \frac{1}{5} (40)
\] \[ \sigma^2 = 8 \]
Now, using the formula for the variance of the sample average: \[ Var(\bar{X}) = \frac{8}{5} \] \[ Var(\bar{X}) = 1.6 \]
The variance of the sample average is 1.6.
3. Standard Deviation of Sample Average
Formula: \[ SD(\bar{X}) =
\frac{\sigma}{\sqrt{n}} \]
Using the population standard deviation (\(\sigma\)) which is the square root of the
population variance: \[ \sigma = \sqrt{8}
\] \[ \sigma \approx 2.83
\]
Now, using the formula for the standard deviation of the sample
average: \[ SD(\bar{X}) =
\frac{2.83}{\sqrt{5}} \] \[
SD(\bar{X}) \approx 1.27 \]
The standard deviation of the sample average is approximately
1.27.
Prompt
Go into a bit more detail about the difference between population and
samples. Support the discussion with simplified examples.
Population:
Definition: A population includes all members of
a defined group that we are studying or collecting information on for
data-driven decisions. It represents the entire group as a
whole.
Characteristics:
- It encompasses the entire group.
- Parameters like the population mean (μ) and population standard
deviation (σ) describe the population.
- Studying the entire population can be time-consuming, expensive, or
even impossible in some cases.
Example: Imagine a large pond with 10,000 fish.
If we were to measure the average weight of fish in this pond,
considering all 10,000 fish would mean we’re dealing with the
population.
Sample:
Definition: A sample is a subset of the
population. It is a small portion drawn from the population that
represents the population. We use samples to make inferences or
predictions about the population.
Characteristics:
- It’s a fraction or part of the population.
- Statistics like the sample mean (x̄) and sample standard deviation
(s) describe the sample.
- Sampling is more feasible and cost-effective than studying an entire
population.
- The accuracy of inferences made from a sample depends on the
sample’s size and randomness.
Example: From the same pond with 10,000 fish, if
we were to randomly select 100 fish and measure their average weight,
we’re dealing with a sample.
Differences Illustrated with a Simplified Example:
Imagine a big jar filled with red and blue marbles. The entire jar,
with all its marbles, represents the population. If you
wanted to know the exact proportion of red to blue marbles, you’d have
to count each one, which might be tedious if there are thousands of
marbles.
Instead, you decide to take a handful of marbles out of the jar. This
handful is your sample. By examining the proportion of
red to blue marbles in your hand, you can make an educated guess (or
inference) about the proportion in the entire jar.
However, there’s a catch:
- If you only take marbles from the top of the jar, your sample might
not be representative, especially if all the blue marbles settled at the
bottom. This is an example of a biased sample.
- If you shake the jar and then take a handful, ensuring a random mix,
your sample is more likely to be representative of the entire
population.
In real-world scenarios, researchers aim to ensure that their samples
are as representative as possible of the population to make accurate
predictions or inferences. This is why the method of sampling and the
sample size are crucial in statistics.
Prompt
Create some examples of how to use R to sample data and calculate the
sample average, standard deviation, and variance.
1. Sampling Data in R:
R provides the sample() function to draw random samples
from a dataset.
# Create a dataset
data <- c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
# Draw a random sample of size 5 from the dataset
sample_data <- sample(data, size = 5)
print(sample_data)
[1] 5 4 6 8 1
2. Calculate Sample Average:
To calculate the sample average (mean), you can use the
mean() function.
# Calculate the sample average
sample_average <- mean(sample_data)
print(sample_average)
[1] 4.8
3. Calculate Sample Standard Deviation:
The sd() function in R calculates the sample standard
deviation.
# Calculate the sample standard deviation
sample_sd <- sd(sample_data)
print(sample_sd)
[1] 2.588436
4. Calculate Sample Variance:
Variance is the square of the standard deviation. While R doesn’t
have a direct function to calculate sample variance, you can square the
result from sd() or use the var()
function.
# Calculate the sample variance using sd() function
sample_variance <- sd(sample_data)^2
print(sample_variance)
[1] 6.7
# Alternatively, using the var() function
sample_variance_alt <- var(sample_data)
print(sample_variance_alt)
[1] 6.7
Full Example:
Combining all the above steps, here’s a full R script:
# Create a dataset
data <- c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
# Draw a random sample of size 5 from the dataset
sample_data <- sample(data, size = 5)
print(paste("Sampled Data:", toString(sample_data)))
[1] "Sampled Data: 10, 5, 3, 8, 1"
# Calculate the sample average
sample_average <- mean(sample_data)
print(paste("Sample Average:", sample_average))
[1] "Sample Average: 5.4"
# Calculate the sample standard deviation
sample_sd <- sd(sample_data)
print(paste("Sample Standard Deviation:", sample_sd))
[1] "Sample Standard Deviation: 3.64691650576209"
# Calculate the sample variance
sample_variance <- var(sample_data)
print(paste("Sample Variance:", sample_variance))
[1] "Sample Variance: 13.3"
When you run the script, you’ll get different sampled data and
statistics each time due to the randomness introduced by the
sample() function.
Prompt
Explain how and why to use the set.seed() function in R
and give an example of use.
set.seed() in R:
The set.seed() function in R is used to set the starting
number (seed) for the random number generator algorithm. This is
particularly useful when you want your random processes to be
reproducible.
Why use set.seed()?
Reproducibility: In data analysis and research,
reproducibility is crucial. If you share your code with someone else or
run the same code at a later time, using set.seed() ensures
that you get the same results. This is especially important when you’re
sampling data, randomizing datasets, or initializing random weights in
machine learning algorithms.
Consistency in Results: When debugging or
fine-tuning algorithms, having consistent results between runs can help
in understanding the changes or impacts of modifications made to the
code.
Sharing & Collaboration: If you’re
collaborating on a project, using set.seed() ensures that
all collaborators will get the same results when they run the code,
making discussions and troubleshooting more straightforward.
How to use set.seed():
You simply call the function with an integer argument before any
operation that involves randomness.
Example:
Let’s use set.seed() in conjunction with the
sample() function:
# Without set.seed()
print(sample(1:10, 5)) # This will produce different results each time you run it
[1] 9 10 5 3 2
# With set.seed()
set.seed(123) # Setting the seed
print(sample(1:10, 5)) # This will produce the same results every time you run it after setting the seed
[1] 3 10 2 8 6
In the above example, the first sample() call without
set.seed() will give different results every time you run
the code. However, after setting the seed with
set.seed(123), the second sample() call will
always produce the same set of numbers, ensuring reproducibility.
LS0tDQp0aXRsZTogIklFUiBDaGFwdGVyIDIuMiBTdW1tYXJ5Ig0KYXV0aG9yOiAiRHIuIFNlbGJ5LUxlYWNoIg0KZGF0ZTogImByIFN5cy5EYXRlKClgIg0Kb3V0cHV0OiBodG1sX25vdGVib29rIA0KLS0tDQoNCjxzdHlsZT4NCiAgICAvKiBTdHlsaW5nIGZvciBoMSBoZWFkZXJzICovDQogICAgaDEgew0KICAgICAgICBmb250LXdlaWdodDogYm9sZDsgICAgICAgLyogQm9sZCAqLw0KICAgICAgICBjb2xvcjogZGFya2JsdWU7ICAgICAgICAvKiBEYXJrIGJsdWUgY29sb3IgKi8NCiAgICB9DQogICAgLyogU3R5bGluZyBmb3IgaDIgaGVhZGVycyAqLw0KICAgIGgyIHsNCiAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7IA0KICAgIH0NCg0KICAgIC8qIFN0eWxpbmcgZm9yIGgzIGhlYWRlcnMgKi8NCiAgICBoMyB7DQogICAgICAgIGZvbnQtc3R5bGU6IGl0YWxpYzsgICAgIC8qIEl0YWxpYyAqLw0KICAgIH0NCjwvc3R5bGU+DQoNCg0KSW4gdGhpcyBoYW5kb3V0LCBJIHVzZSBDaGF0R1BUIDQuMCBhbmQgdGhlIEtleU1hdGUuQUkgU2VhcmNoIHBsdWdpbiB0byBzeW50aGVzaXplIHRoZSBpbmZvcm1hdGlvbiBmcm9tIHRoZSB0ZXh0Ym9vaywgZ2l2ZSBleGFtcGxlcywgYW5kIGNyZWF0ZSBSIGNvZGUuIEFsbCBwcm9tcHRzIGFyZSBleGFjdCwgYnV0IHNvbWUgb2YgdGhlIG91dHB1dCBtYXkgYmUgbW9kaWZpZWQgZm9yIGNvcnJlY3RuZXNzLiANCg0KSGFuY2ssIEFybm9sZCwgR2VyYmVyLCBhbmQgU2NobWVsemVyICgyMDIzKS4gSW50cm9kdWN0aW9uIHRvIEVjb25vbWV0cmljcyB3aXRoIFIuIGh0dHBzOi8vd3d3LmVjb25vbWV0cmljcy13aXRoLXIub3JnL2luZGV4Lmh0bWwuIFRoaXMgYm9vayBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQ3JlYXRpdmUgQ29tbW9ucyBBdHRyaWJ1dGlvbi1Ob25Db21tZXJjaWFsLVNoYXJlQWxpa2UgNC4wIEludGVybmF0aW9uYWwgTGljZW5zZS4NCg0KIyMgUHJvbXB0DQpTeW50aGVzaXplIHRoZSBpbmZvcm1hdGlvbiBpbiB0aGlzIHdlYnNpdGUuIEluY2x1ZGUgYWxsIHJlbGV2YW50IGZvcm11bGFzIGFuZCBkZWZpbml0aW9ucy4gaHR0cHM6Ly93d3cuZWNvbm9tZXRyaWNzLXdpdGgtci5vcmcvMi4yLVJTQVRET1NBLmh0bWwNCg0KDQojIyMgQ29udGVudA0KDQoxLiAqKlJhbmRvbSBTYW1wbGluZyoqOg0KICAgLSBBIHJhbmRvbSBzYW1wbGUgaXMgYSBzdWJzZXQgb2YgZGF0YSBwb2ludHMgZnJvbSBhIGxhcmdlciBwb3B1bGF0aW9uLCBjaG9zZW4gcmFuZG9tbHkuDQogICAtIEluIFIsIHRoZSBgc2FtcGxlKClgIGZ1bmN0aW9uIGlzIHVzZWQgdG8gZHJhdyByYW5kb20gc2FtcGxlcy4NCg0KMi4gKipEaXN0cmlidXRpb24gb2YgU2FtcGxlIEF2ZXJhZ2VzKio6DQogICAtIFRoZSBkaXN0cmlidXRpb24gb2Ygc2FtcGxlIGF2ZXJhZ2VzIGlzIHRoZSBkaXN0cmlidXRpb24gb2YgdGhlIG1lYW5zIG9mIGRpZmZlcmVudCByYW5kb20gc2FtcGxlcyBvZiB0aGUgc2FtZSBzaXplIGZyb20gdGhlIHNhbWUgcG9wdWxhdGlvbi4NCiAgIC0gVGhlIENlbnRyYWwgTGltaXQgVGhlb3JlbSAoQ0xUKSBzdGF0ZXMgdGhhdCwgZm9yIGEgc3VmZmljaWVudGx5IGxhcmdlIHNhbXBsZSBzaXplLCB0aGUgZGlzdHJpYnV0aW9uIG9mIHRoZSBzYW1wbGUgYXZlcmFnZSB3aWxsIGJlIGFwcHJveGltYXRlbHkgbm9ybWFsLCByZWdhcmRsZXNzIG9mIHRoZSBkaXN0cmlidXRpb24gb2YgdGhlIHBvcHVsYXRpb24gZnJvbSB3aGljaCB0aGUgc2FtcGxlIGlzIGRyYXduLg0KDQozLiAqKkZvcm11bGFzKio6DQogICAtICoqU2FtcGxlIEF2ZXJhZ2UqKjogXCggXGJhcntYfSA9IFxmcmFjezF9e259IFxzdW1fe2k9MX1ee259IFhfaSBcKQ0KICAgICAtIFdoZXJlOg0KICAgICAgIC0gXCggXGJhcntYfSBcKSBpcyB0aGUgc2FtcGxlIGF2ZXJhZ2UuDQogICAgICAgLSBcKCBuIFwpIGlzIHRoZSBzYW1wbGUgc2l6ZS4NCiAgICAgICAtIFwoIFhfaSBcKSBpcyB0aGUgdmFsdWUgb2YgdGhlIGktdGggb2JzZXJ2YXRpb24gaW4gdGhlIHNhbXBsZS4NCg0KICAgLSAqKlZhcmlhbmNlIG9mIFNhbXBsZSBBdmVyYWdlKio6IFwoIFZhcihcYmFye1h9KSA9IFxmcmFje1xzaWdtYV4yfXtufSBcKQ0KICAgICAtIFdoZXJlOg0KICAgICAgIC0gXCggVmFyKFxiYXJ7WH0pIFwpIGlzIHRoZSB2YXJpYW5jZSBvZiB0aGUgc2FtcGxlIGF2ZXJhZ2UuDQogICAgICAgLSBcKCBcc2lnbWFeMiBcKSBpcyB0aGUgcG9wdWxhdGlvbiB2YXJpYW5jZS4NCiAgICAgICAtIFwoIG4gXCkgaXMgdGhlIHNhbXBsZSBzaXplLg0KDQogICAtICoqU3RhbmRhcmQgRGV2aWF0aW9uIG9mIFNhbXBsZSBBdmVyYWdlKio6IFwoIFNEKFxiYXJ7WH0pID0gXGZyYWN7XHNpZ21hfXtcc3FydHtufX0gXCkNCiAgICAgLSBXaGVyZToNCiAgICAgICAtIFwoIFNEKFxiYXJ7WH0pIFwpIGlzIHRoZSBzdGFuZGFyZCBkZXZpYXRpb24gb2YgdGhlIHNhbXBsZSBhdmVyYWdlLg0KICAgICAgIC0gXCggXHNpZ21hIFwpIGlzIHRoZSBwb3B1bGF0aW9uIHN0YW5kYXJkIGRldmlhdGlvbi4NCiAgICAgICAtIFwoIG4gXCkgaXMgdGhlIHNhbXBsZSBzaXplLg0KDQo0LiAqKlNpbXVsYXRpb24gaW4gUioqOg0KICAgLSBUaGUgd2Vic2l0ZSBwcm92aWRlcyBSIGNvZGUgc25pcHBldHMgdG8gc2ltdWxhdGUgdGhlIGRpc3RyaWJ1dGlvbiBvZiBzYW1wbGUgYXZlcmFnZXMgYW5kIHZpc3VhbGl6ZSB0aGUgcmVzdWx0cy4gVGhpcyBoZWxwcyBpbiB1bmRlcnN0YW5kaW5nIHRoZSBDZW50cmFsIExpbWl0IFRoZW9yZW0gaW4gcHJhY3RpY2UuDQoNCjUuICoqS2V5IFRha2Vhd2F5cyoqOg0KICAgLSBUaGUgZGlzdHJpYnV0aW9uIG9mIHNhbXBsZSBhdmVyYWdlcyBpcyBhIGZ1bmRhbWVudGFsIGNvbmNlcHQgaW4gc3RhdGlzdGljcy4NCiAgIC0gVGhlIENlbnRyYWwgTGltaXQgVGhlb3JlbSBpcyBhIHBvd2VyZnVsIHRvb2wgdGhhdCBhbGxvd3MgdXMgdG8gbWFrZSBpbmZlcmVuY2VzIGFib3V0IHBvcHVsYXRpb25zIGJhc2VkIG9uIHNhbXBsZSBkYXRhLg0KICAgLSBBcyB0aGUgc2FtcGxlIHNpemUgaW5jcmVhc2VzLCB0aGUgZGlzdHJpYnV0aW9uIG9mIHRoZSBzYW1wbGUgYXZlcmFnZSBiZWNvbWVzIG1vcmUgbm9ybWFsIGFuZCBpdHMgdmFyaWFuY2UgZGVjcmVhc2VzLg0KDQpUaGlzIHN5bnRoZXNpcyBjb3ZlcnMgdGhlIG1haW4gY29uY2VwdHMsIGZvcm11bGFzLCBhbmQgdGFrZWF3YXlzIGZyb20gdGhlIHdlYnNpdGUuIElmIHlvdSBuZWVkIGZ1cnRoZXIgZGV0YWlscyBvciBoYXZlIGFueSBvdGhlciBxdWVzdGlvbnMsIHBsZWFzZSBsZXQgbWUga25vdyENCg0KIyMgUHJvbXB0DQpQbGVhc2UgZ2l2ZSBleGFtcGxlcyBvZiBjYWxjdWxhdGluZyBzYW1wbGUgYXZlcmFnZSwgc3RhbmRhcmQgZGV2aWF0aW9uLCBhbmQgdmFyaWFuY2UgdXNpbmcgdGhlc2UgZm9ybXVsYXMuIA0KDQojIyMgMS4gU2FtcGxlIEF2ZXJhZ2UNCg0KKipGb3JtdWxhKio6IA0KXFsgXGJhcntYfSA9IFxmcmFjezF9e259IFxzdW1fe2k9MX1ee259IFhfaSBcXQ0KDQoqKkV4YW1wbGUqKjoNClN1cHBvc2Ugd2UgaGF2ZSBhIHNhbXBsZSBvZiA1IG9ic2VydmF0aW9uczogMiwgNCwgNiwgOCwgMTAuDQoNClxbIFxiYXJ7WH0gPSBcZnJhY3sxfXs1fSAoMiArIDQgKyA2ICsgOCArIDEwKSBcXQ0KXFsgXGJhcntYfSA9IFxmcmFjezF9ezV9ICgzMCkgXF0NClxbIFxiYXJ7WH0gPSA2IFxdDQoNClRoZSBzYW1wbGUgYXZlcmFnZSBpcyA2Lg0KDQojIyMgMi4gVmFyaWFuY2Ugb2YgU2FtcGxlIEF2ZXJhZ2UNCg0KKipGb3JtdWxhKio6IA0KXFsgVmFyKFxiYXJ7WH0pID0gXGZyYWN7XHNpZ21hXjJ9e259IFxdDQoNClRvIGNhbGN1bGF0ZSB0aGUgdmFyaWFuY2Ugb2YgdGhlIHNhbXBsZSBhdmVyYWdlLCB3ZSBmaXJzdCBuZWVkIHRvIGZpbmQgdGhlIHBvcHVsYXRpb24gdmFyaWFuY2UgKFwoIFxzaWdtYV4yIFwpKS4gDQoNCioqUG9wdWxhdGlvbiBWYXJpYW5jZSBGb3JtdWxhKio6DQpcWyBcc2lnbWFeMiA9IFxmcmFjezF9e259IFxzdW1fe2k9MX1ee259IChYX2kgLSBcbXUpXjIgXF0NCldoZXJlIFwoIFxtdSBcKSBpcyB0aGUgcG9wdWxhdGlvbiBtZWFuLg0KDQpVc2luZyB0aGUgc2FtZSBzYW1wbGU6IA0KXFsgXG11ID0gNiBcXSAoZnJvbSBvdXIgcHJldmlvdXMgY2FsY3VsYXRpb24pDQoNClxbIFxzaWdtYV4yID0gXGZyYWN7MX17NX0gWygyLTYpXjIgKyAoNC02KV4yICsgKDYtNileMiArICg4LTYpXjIgKyAoMTAtNileMl0gXF0NClxbIFxzaWdtYV4yID0gXGZyYWN7MX17NX0gWzE2ICsgNCArIDAgKyA0ICsgMTZdIFxdDQpcWyBcc2lnbWFeMiA9IFxmcmFjezF9ezV9ICg0MCkgXF0NClxbIFxzaWdtYV4yID0gOCBcXQ0KDQpOb3csIHVzaW5nIHRoZSBmb3JtdWxhIGZvciB0aGUgdmFyaWFuY2Ugb2YgdGhlIHNhbXBsZSBhdmVyYWdlOg0KXFsgVmFyKFxiYXJ7WH0pID0gXGZyYWN7OH17NX0gXF0NClxbIFZhcihcYmFye1h9KSA9IDEuNiBcXQ0KDQpUaGUgdmFyaWFuY2Ugb2YgdGhlIHNhbXBsZSBhdmVyYWdlIGlzIDEuNi4NCg0KIyMjIDMuIFN0YW5kYXJkIERldmlhdGlvbiBvZiBTYW1wbGUgQXZlcmFnZQ0KDQoqKkZvcm11bGEqKjogDQpcWyBTRChcYmFye1h9KSA9IFxmcmFje1xzaWdtYX17XHNxcnR7bn19IFxdDQoNClVzaW5nIHRoZSBwb3B1bGF0aW9uIHN0YW5kYXJkIGRldmlhdGlvbiAoXCggXHNpZ21hIFwpKSB3aGljaCBpcyB0aGUgc3F1YXJlIHJvb3Qgb2YgdGhlIHBvcHVsYXRpb24gdmFyaWFuY2U6DQpcWyBcc2lnbWEgPSBcc3FydHs4fSBcXQ0KXFsgXHNpZ21hIFxhcHByb3ggMi44MyBcXQ0KDQpOb3csIHVzaW5nIHRoZSBmb3JtdWxhIGZvciB0aGUgc3RhbmRhcmQgZGV2aWF0aW9uIG9mIHRoZSBzYW1wbGUgYXZlcmFnZToNClxbIFNEKFxiYXJ7WH0pID0gXGZyYWN7Mi44M317XHNxcnR7NX19IFxdDQpcWyBTRChcYmFye1h9KSBcYXBwcm94IDEuMjcgXF0NCg0KVGhlIHN0YW5kYXJkIGRldmlhdGlvbiBvZiB0aGUgc2FtcGxlIGF2ZXJhZ2UgaXMgYXBwcm94aW1hdGVseSAxLjI3Lg0KDQoNCiMjIFByb21wdCANCkdvIGludG8gYSBiaXQgbW9yZSBkZXRhaWwgYWJvdXQgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBwb3B1bGF0aW9uIGFuZCBzYW1wbGVzLiBTdXBwb3J0IHRoZSBkaXNjdXNzaW9uIHdpdGggc2ltcGxpZmllZCBleGFtcGxlcy4gDQoNCiMjIyBQb3B1bGF0aW9uOg0KDQotICoqRGVmaW5pdGlvbioqOiBBIHBvcHVsYXRpb24gaW5jbHVkZXMgYWxsIG1lbWJlcnMgb2YgYSBkZWZpbmVkIGdyb3VwIHRoYXQgd2UgYXJlIHN0dWR5aW5nIG9yIGNvbGxlY3RpbmcgaW5mb3JtYXRpb24gb24gZm9yIGRhdGEtZHJpdmVuIGRlY2lzaW9ucy4gSXQgcmVwcmVzZW50cyB0aGUgZW50aXJlIGdyb3VwIGFzIGEgd2hvbGUuDQogIA0KLSAqKkNoYXJhY3RlcmlzdGljcyoqOg0KICAtIEl0IGVuY29tcGFzc2VzIHRoZSBlbnRpcmUgZ3JvdXAuDQogIC0gUGFyYW1ldGVycyBsaWtlIHRoZSBwb3B1bGF0aW9uIG1lYW4gKM68KSBhbmQgcG9wdWxhdGlvbiBzdGFuZGFyZCBkZXZpYXRpb24gKM+DKSBkZXNjcmliZSB0aGUgcG9wdWxhdGlvbi4NCiAgLSBTdHVkeWluZyB0aGUgZW50aXJlIHBvcHVsYXRpb24gY2FuIGJlIHRpbWUtY29uc3VtaW5nLCBleHBlbnNpdmUsIG9yIGV2ZW4gaW1wb3NzaWJsZSBpbiBzb21lIGNhc2VzLg0KDQotICoqRXhhbXBsZSoqOiBJbWFnaW5lIGEgbGFyZ2UgcG9uZCB3aXRoIDEwLDAwMCBmaXNoLiBJZiB3ZSB3ZXJlIHRvIG1lYXN1cmUgdGhlIGF2ZXJhZ2Ugd2VpZ2h0IG9mIGZpc2ggaW4gdGhpcyBwb25kLCBjb25zaWRlcmluZyBhbGwgMTAsMDAwIGZpc2ggd291bGQgbWVhbiB3ZSdyZSBkZWFsaW5nIHdpdGggdGhlIHBvcHVsYXRpb24uDQoNCiMjIyBTYW1wbGU6DQoNCi0gKipEZWZpbml0aW9uKio6IEEgc2FtcGxlIGlzIGEgc3Vic2V0IG9mIHRoZSBwb3B1bGF0aW9uLiBJdCBpcyBhIHNtYWxsIHBvcnRpb24gZHJhd24gZnJvbSB0aGUgcG9wdWxhdGlvbiB0aGF0IHJlcHJlc2VudHMgdGhlIHBvcHVsYXRpb24uIFdlIHVzZSBzYW1wbGVzIHRvIG1ha2UgaW5mZXJlbmNlcyBvciBwcmVkaWN0aW9ucyBhYm91dCB0aGUgcG9wdWxhdGlvbi4NCg0KLSAqKkNoYXJhY3RlcmlzdGljcyoqOg0KICAtIEl0J3MgYSBmcmFjdGlvbiBvciBwYXJ0IG9mIHRoZSBwb3B1bGF0aW9uLg0KICAtIFN0YXRpc3RpY3MgbGlrZSB0aGUgc2FtcGxlIG1lYW4gKHjMhCkgYW5kIHNhbXBsZSBzdGFuZGFyZCBkZXZpYXRpb24gKHMpIGRlc2NyaWJlIHRoZSBzYW1wbGUuDQogIC0gU2FtcGxpbmcgaXMgbW9yZSBmZWFzaWJsZSBhbmQgY29zdC1lZmZlY3RpdmUgdGhhbiBzdHVkeWluZyBhbiBlbnRpcmUgcG9wdWxhdGlvbi4NCiAgLSBUaGUgYWNjdXJhY3kgb2YgaW5mZXJlbmNlcyBtYWRlIGZyb20gYSBzYW1wbGUgZGVwZW5kcyBvbiB0aGUgc2FtcGxlJ3Mgc2l6ZSBhbmQgcmFuZG9tbmVzcy4NCg0KLSAqKkV4YW1wbGUqKjogRnJvbSB0aGUgc2FtZSBwb25kIHdpdGggMTAsMDAwIGZpc2gsIGlmIHdlIHdlcmUgdG8gcmFuZG9tbHkgc2VsZWN0IDEwMCBmaXNoIGFuZCBtZWFzdXJlIHRoZWlyIGF2ZXJhZ2Ugd2VpZ2h0LCB3ZSdyZSBkZWFsaW5nIHdpdGggYSBzYW1wbGUuDQoNCiMjIyBEaWZmZXJlbmNlcyBJbGx1c3RyYXRlZCB3aXRoIGEgU2ltcGxpZmllZCBFeGFtcGxlOg0KDQpJbWFnaW5lIGEgYmlnIGphciBmaWxsZWQgd2l0aCByZWQgYW5kIGJsdWUgbWFyYmxlcy4gVGhlIGVudGlyZSBqYXIsIHdpdGggYWxsIGl0cyBtYXJibGVzLCByZXByZXNlbnRzIHRoZSAqKnBvcHVsYXRpb24qKi4gSWYgeW91IHdhbnRlZCB0byBrbm93IHRoZSBleGFjdCBwcm9wb3J0aW9uIG9mIHJlZCB0byBibHVlIG1hcmJsZXMsIHlvdSdkIGhhdmUgdG8gY291bnQgZWFjaCBvbmUsIHdoaWNoIG1pZ2h0IGJlIHRlZGlvdXMgaWYgdGhlcmUgYXJlIHRob3VzYW5kcyBvZiBtYXJibGVzLg0KDQpJbnN0ZWFkLCB5b3UgZGVjaWRlIHRvIHRha2UgYSBoYW5kZnVsIG9mIG1hcmJsZXMgb3V0IG9mIHRoZSBqYXIuIFRoaXMgaGFuZGZ1bCBpcyB5b3VyICoqc2FtcGxlKiouIEJ5IGV4YW1pbmluZyB0aGUgcHJvcG9ydGlvbiBvZiByZWQgdG8gYmx1ZSBtYXJibGVzIGluIHlvdXIgaGFuZCwgeW91IGNhbiBtYWtlIGFuIGVkdWNhdGVkIGd1ZXNzIChvciBpbmZlcmVuY2UpIGFib3V0IHRoZSBwcm9wb3J0aW9uIGluIHRoZSBlbnRpcmUgamFyLg0KDQpIb3dldmVyLCB0aGVyZSdzIGEgY2F0Y2g6DQoNCjEuIElmIHlvdSBvbmx5IHRha2UgbWFyYmxlcyBmcm9tIHRoZSB0b3Agb2YgdGhlIGphciwgeW91ciBzYW1wbGUgbWlnaHQgbm90IGJlIHJlcHJlc2VudGF0aXZlLCBlc3BlY2lhbGx5IGlmIGFsbCB0aGUgYmx1ZSBtYXJibGVzIHNldHRsZWQgYXQgdGhlIGJvdHRvbS4gVGhpcyBpcyBhbiBleGFtcGxlIG9mIGEgYmlhc2VkIHNhbXBsZS4NCjIuIElmIHlvdSBzaGFrZSB0aGUgamFyIGFuZCB0aGVuIHRha2UgYSBoYW5kZnVsLCBlbnN1cmluZyBhIHJhbmRvbSBtaXgsIHlvdXIgc2FtcGxlIGlzIG1vcmUgbGlrZWx5IHRvIGJlIHJlcHJlc2VudGF0aXZlIG9mIHRoZSBlbnRpcmUgcG9wdWxhdGlvbi4NCg0KSW4gcmVhbC13b3JsZCBzY2VuYXJpb3MsIHJlc2VhcmNoZXJzIGFpbSB0byBlbnN1cmUgdGhhdCB0aGVpciBzYW1wbGVzIGFyZSBhcyByZXByZXNlbnRhdGl2ZSBhcyBwb3NzaWJsZSBvZiB0aGUgcG9wdWxhdGlvbiB0byBtYWtlIGFjY3VyYXRlIHByZWRpY3Rpb25zIG9yIGluZmVyZW5jZXMuIFRoaXMgaXMgd2h5IHRoZSBtZXRob2Qgb2Ygc2FtcGxpbmcgYW5kIHRoZSBzYW1wbGUgc2l6ZSBhcmUgY3J1Y2lhbCBpbiBzdGF0aXN0aWNzLg0KDQojIyBQcm9tcHQNCkNyZWF0ZSBzb21lIGV4YW1wbGVzIG9mIGhvdyB0byB1c2UgUiB0byBzYW1wbGUgZGF0YSBhbmQgY2FsY3VsYXRlIHRoZSBzYW1wbGUgYXZlcmFnZSwgc3RhbmRhcmQgZGV2aWF0aW9uLCBhbmQgdmFyaWFuY2UuIA0KDQojIyMgMS4gU2FtcGxpbmcgRGF0YSBpbiBSOg0KDQpSIHByb3ZpZGVzIHRoZSBgc2FtcGxlKClgIGZ1bmN0aW9uIHRvIGRyYXcgcmFuZG9tIHNhbXBsZXMgZnJvbSBhIGRhdGFzZXQuDQoNCmBgYHtSfQ0KIyBDcmVhdGUgYSBkYXRhc2V0DQpkYXRhIDwtIGMoMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTApDQoNCiMgRHJhdyBhIHJhbmRvbSBzYW1wbGUgb2Ygc2l6ZSA1IGZyb20gdGhlIGRhdGFzZXQNCnNhbXBsZV9kYXRhIDwtIHNhbXBsZShkYXRhLCBzaXplID0gNSkNCnByaW50KHNhbXBsZV9kYXRhKQ0KYGBgDQoNCiMjIyAyLiBDYWxjdWxhdGUgU2FtcGxlIEF2ZXJhZ2U6DQoNClRvIGNhbGN1bGF0ZSB0aGUgc2FtcGxlIGF2ZXJhZ2UgKG1lYW4pLCB5b3UgY2FuIHVzZSB0aGUgYG1lYW4oKWAgZnVuY3Rpb24uDQoNCmBgYHtSfQ0KIyBDYWxjdWxhdGUgdGhlIHNhbXBsZSBhdmVyYWdlDQpzYW1wbGVfYXZlcmFnZSA8LSBtZWFuKHNhbXBsZV9kYXRhKQ0KcHJpbnQoc2FtcGxlX2F2ZXJhZ2UpDQpgYGANCg0KIyMjIDMuIENhbGN1bGF0ZSBTYW1wbGUgU3RhbmRhcmQgRGV2aWF0aW9uOg0KDQpUaGUgYHNkKClgIGZ1bmN0aW9uIGluIFIgY2FsY3VsYXRlcyB0aGUgc2FtcGxlIHN0YW5kYXJkIGRldmlhdGlvbi4NCg0KYGBge1J9DQojIENhbGN1bGF0ZSB0aGUgc2FtcGxlIHN0YW5kYXJkIGRldmlhdGlvbg0Kc2FtcGxlX3NkIDwtIHNkKHNhbXBsZV9kYXRhKQ0KcHJpbnQoc2FtcGxlX3NkKQ0KYGBgDQoNCiMjIyA0LiBDYWxjdWxhdGUgU2FtcGxlIFZhcmlhbmNlOg0KDQpWYXJpYW5jZSBpcyB0aGUgc3F1YXJlIG9mIHRoZSBzdGFuZGFyZCBkZXZpYXRpb24uIFdoaWxlIFIgZG9lc24ndCBoYXZlIGEgZGlyZWN0IGZ1bmN0aW9uIHRvIGNhbGN1bGF0ZSBzYW1wbGUgdmFyaWFuY2UsIHlvdSBjYW4gc3F1YXJlIHRoZSByZXN1bHQgZnJvbSBgc2QoKWAgb3IgdXNlIHRoZSBgdmFyKClgIGZ1bmN0aW9uLg0KDQpgYGB7Un0NCiMgQ2FsY3VsYXRlIHRoZSBzYW1wbGUgdmFyaWFuY2UgdXNpbmcgc2QoKSBmdW5jdGlvbg0Kc2FtcGxlX3ZhcmlhbmNlIDwtIHNkKHNhbXBsZV9kYXRhKV4yDQpwcmludChzYW1wbGVfdmFyaWFuY2UpDQoNCiMgQWx0ZXJuYXRpdmVseSwgdXNpbmcgdGhlIHZhcigpIGZ1bmN0aW9uDQpzYW1wbGVfdmFyaWFuY2VfYWx0IDwtIHZhcihzYW1wbGVfZGF0YSkNCnByaW50KHNhbXBsZV92YXJpYW5jZV9hbHQpDQpgYGANCg0KIyMjIEZ1bGwgRXhhbXBsZToNCg0KQ29tYmluaW5nIGFsbCB0aGUgYWJvdmUgc3RlcHMsIGhlcmUncyBhIGZ1bGwgUiBzY3JpcHQ6DQoNCmBgYHtSfQ0KIyBDcmVhdGUgYSBkYXRhc2V0DQpkYXRhIDwtIGMoMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTApDQoNCiMgRHJhdyBhIHJhbmRvbSBzYW1wbGUgb2Ygc2l6ZSA1IGZyb20gdGhlIGRhdGFzZXQNCnNhbXBsZV9kYXRhIDwtIHNhbXBsZShkYXRhLCBzaXplID0gNSkNCnByaW50KHBhc3RlKCJTYW1wbGVkIERhdGE6IiwgdG9TdHJpbmcoc2FtcGxlX2RhdGEpKSkNCg0KIyBDYWxjdWxhdGUgdGhlIHNhbXBsZSBhdmVyYWdlDQpzYW1wbGVfYXZlcmFnZSA8LSBtZWFuKHNhbXBsZV9kYXRhKQ0KcHJpbnQocGFzdGUoIlNhbXBsZSBBdmVyYWdlOiIsIHNhbXBsZV9hdmVyYWdlKSkNCg0KIyBDYWxjdWxhdGUgdGhlIHNhbXBsZSBzdGFuZGFyZCBkZXZpYXRpb24NCnNhbXBsZV9zZCA8LSBzZChzYW1wbGVfZGF0YSkNCnByaW50KHBhc3RlKCJTYW1wbGUgU3RhbmRhcmQgRGV2aWF0aW9uOiIsIHNhbXBsZV9zZCkpDQoNCiMgQ2FsY3VsYXRlIHRoZSBzYW1wbGUgdmFyaWFuY2UNCnNhbXBsZV92YXJpYW5jZSA8LSB2YXIoc2FtcGxlX2RhdGEpDQpwcmludChwYXN0ZSgiU2FtcGxlIFZhcmlhbmNlOiIsIHNhbXBsZV92YXJpYW5jZSkpDQpgYGANCg0KV2hlbiB5b3UgcnVuIHRoZSBzY3JpcHQsIHlvdSdsbCBnZXQgZGlmZmVyZW50IHNhbXBsZWQgZGF0YSBhbmQgc3RhdGlzdGljcyBlYWNoIHRpbWUgZHVlIHRvIHRoZSByYW5kb21uZXNzIGludHJvZHVjZWQgYnkgdGhlIGBzYW1wbGUoKWAgZnVuY3Rpb24uDQoNCiMjIFByb21wdA0KRXhwbGFpbiBob3cgYW5kIHdoeSB0byB1c2UgdGhlIGBzZXQuc2VlZCgpYCBmdW5jdGlvbiBpbiBSIGFuZCBnaXZlIGFuIGV4YW1wbGUgb2YgdXNlLiANCg0KIyMjIGBzZXQuc2VlZCgpYCBpbiBSOg0KDQpUaGUgYHNldC5zZWVkKClgIGZ1bmN0aW9uIGluIFIgaXMgdXNlZCB0byBzZXQgdGhlIHN0YXJ0aW5nIG51bWJlciAoc2VlZCkgZm9yIHRoZSByYW5kb20gbnVtYmVyIGdlbmVyYXRvciBhbGdvcml0aG0uIFRoaXMgaXMgcGFydGljdWxhcmx5IHVzZWZ1bCB3aGVuIHlvdSB3YW50IHlvdXIgcmFuZG9tIHByb2Nlc3NlcyB0byBiZSByZXByb2R1Y2libGUuDQoNCiMjIyBXaHkgdXNlIGBzZXQuc2VlZCgpYD8NCg0KMS4gKipSZXByb2R1Y2liaWxpdHkqKjogSW4gZGF0YSBhbmFseXNpcyBhbmQgcmVzZWFyY2gsIHJlcHJvZHVjaWJpbGl0eSBpcyBjcnVjaWFsLiBJZiB5b3Ugc2hhcmUgeW91ciBjb2RlIHdpdGggc29tZW9uZSBlbHNlIG9yIHJ1biB0aGUgc2FtZSBjb2RlIGF0IGEgbGF0ZXIgdGltZSwgdXNpbmcgYHNldC5zZWVkKClgIGVuc3VyZXMgdGhhdCB5b3UgZ2V0IHRoZSBzYW1lIHJlc3VsdHMuIFRoaXMgaXMgZXNwZWNpYWxseSBpbXBvcnRhbnQgd2hlbiB5b3UncmUgc2FtcGxpbmcgZGF0YSwgcmFuZG9taXppbmcgZGF0YXNldHMsIG9yIGluaXRpYWxpemluZyByYW5kb20gd2VpZ2h0cyBpbiBtYWNoaW5lIGxlYXJuaW5nIGFsZ29yaXRobXMuDQoNCjIuICoqQ29uc2lzdGVuY3kgaW4gUmVzdWx0cyoqOiBXaGVuIGRlYnVnZ2luZyBvciBmaW5lLXR1bmluZyBhbGdvcml0aG1zLCBoYXZpbmcgY29uc2lzdGVudCByZXN1bHRzIGJldHdlZW4gcnVucyBjYW4gaGVscCBpbiB1bmRlcnN0YW5kaW5nIHRoZSBjaGFuZ2VzIG9yIGltcGFjdHMgb2YgbW9kaWZpY2F0aW9ucyBtYWRlIHRvIHRoZSBjb2RlLg0KDQozLiAqKlNoYXJpbmcgJiBDb2xsYWJvcmF0aW9uKio6IElmIHlvdSdyZSBjb2xsYWJvcmF0aW5nIG9uIGEgcHJvamVjdCwgdXNpbmcgYHNldC5zZWVkKClgIGVuc3VyZXMgdGhhdCBhbGwgY29sbGFib3JhdG9ycyB3aWxsIGdldCB0aGUgc2FtZSByZXN1bHRzIHdoZW4gdGhleSBydW4gdGhlIGNvZGUsIG1ha2luZyBkaXNjdXNzaW9ucyBhbmQgdHJvdWJsZXNob290aW5nIG1vcmUgc3RyYWlnaHRmb3J3YXJkLg0KDQojIyMgSG93IHRvIHVzZSBgc2V0LnNlZWQoKWA6DQoNCllvdSBzaW1wbHkgY2FsbCB0aGUgZnVuY3Rpb24gd2l0aCBhbiBpbnRlZ2VyIGFyZ3VtZW50IGJlZm9yZSBhbnkgb3BlcmF0aW9uIHRoYXQgaW52b2x2ZXMgcmFuZG9tbmVzcy4NCg0KIyMjIEV4YW1wbGU6DQoNCkxldCdzIHVzZSBgc2V0LnNlZWQoKWAgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgYHNhbXBsZSgpYCBmdW5jdGlvbjoNCg0KYGBge1J9DQojIFdpdGhvdXQgc2V0LnNlZWQoKQ0KcHJpbnQoc2FtcGxlKDE6MTAsIDUpKSAgIyBUaGlzIHdpbGwgcHJvZHVjZSBkaWZmZXJlbnQgcmVzdWx0cyBlYWNoIHRpbWUgeW91IHJ1biBpdA0KDQojIFdpdGggc2V0LnNlZWQoKQ0Kc2V0LnNlZWQoMTIzKSAgIyBTZXR0aW5nIHRoZSBzZWVkDQpwcmludChzYW1wbGUoMToxMCwgNSkpICAjIFRoaXMgd2lsbCBwcm9kdWNlIHRoZSBzYW1lIHJlc3VsdHMgZXZlcnkgdGltZSB5b3UgcnVuIGl0IGFmdGVyIHNldHRpbmcgdGhlIHNlZWQNCmBgYA0KDQpJbiB0aGUgYWJvdmUgZXhhbXBsZSwgdGhlIGZpcnN0IGBzYW1wbGUoKWAgY2FsbCB3aXRob3V0IGBzZXQuc2VlZCgpYCB3aWxsIGdpdmUgZGlmZmVyZW50IHJlc3VsdHMgZXZlcnkgdGltZSB5b3UgcnVuIHRoZSBjb2RlLiBIb3dldmVyLCBhZnRlciBzZXR0aW5nIHRoZSBzZWVkIHdpdGggYHNldC5zZWVkKDEyMylgLCB0aGUgc2Vjb25kIGBzYW1wbGUoKWAgY2FsbCB3aWxsIGFsd2F5cyBwcm9kdWNlIHRoZSBzYW1lIHNldCBvZiBudW1iZXJzLCBlbnN1cmluZyByZXByb2R1Y2liaWxpdHku