Let us continue getting started with R as we start discussing
important statistical concepts.
Solution
Given that \(x_1 = 71, x_2 = 69, x_3 =
79\)
we want to find \(x_4\) such that
the mean (average) grade is \(\bar{x} >=
70\)
Notice that in this case \(n =
4\).
According to the information above: \(70
\times 4 = 71 + 69 + 79 + x_4\)
so when \(x_4 = 61\), the quiz
average will be 70.
# Grades so far
grades_before <- c(71, 69, 79)
# Average quiz grade wanted
wanted_grade <- 70
# Number of quizzes
n_quizzes <- 4
# Needed grade on quiz 4
x_4 <- n_quizzes*wanted_grade - sum(grades_before)
# Minimum grade needed by Kate
x_4
[1] 61
We can see we create a variable storing the current grades of kate as
“grades_before” and the overal mean grade she desires as “wanted_grade”.
We also create a variable storing the number of quizes. Then we store
the value of the the number of quizes multiplied by the wanted grade,
from which we subtract the sum of the grades before. Very satisfying
working through this equation it was very practical and made me feel
somewhat more confident in my math skills.
According to the calculations above, Kate must score 61 or better on
the final quiz to get an average quiz grade of at least 70.
We could confirm this, by using the function mean() in
R
# Quiz grades
kate_grades <- c(71, 69, 79,61)
# Find mean
mean(kate_grades)
[1] 70
# Find standard deviation
sd(kate_grades)
[1] 7.393691
# Find maximum grade
max(kate_grades)
[1] 79
# Find minimum grade
min(kate_grades)
[1] 61
We can see that kates mean grade is 70 when including her final
minimal score of 61. We also see that the standard deviation is 7.39 of
her new grade total. We also see that her maximum grade is 79 and her
minimum grade is 61
#We can also use the summary() function to find basic
statistics, including the median!
summary(kate_grades)
Min. 1st Qu. Median Mean 3rd Qu. Max.
61 67 70 70 73 79
#Next, I would like you to explain in detail every single task we
completed above. In addition, let us deal with a similar case scenario
and complete every single task we execute in Case-scenario 1.
We see that we have the min and max amount of kates grades listed as
the first and last values of the summary. we also see the 1st and 3rd
quantiles which we find in the next step in this summary, and the median
value in the middle of the list.
Frank must take six quizzes in a Physics class. If his scores on the
first five quizzes are 41, 69,63,94, and 99, what score does he need on
the final quiz for his overall mean to be at least 70?s
Frnk_Grds_bfr <- c(41,69,63,94,99)
fn_Quizzes <- 6
x_6 <- wanted_grade*fn_Quizzes - sum(Frnk_Grds_bfr)
x_6
[1] 54
Frnk_Grds <- c(41,69,63,94,99,54)
mean(Frnk_Grds)
[1] 70
sd(Frnk_Grds)
[1] 22.64509
max(Frnk_Grds)
[1] 99
min(Frnk_Grds)
[1] 41
#We can see that frank needs a grade of 54% on his final quiz to
recieve an overal mean score of 70.
Now let us go back to Case-scenario 1
Another useful function is quantile to find
# the 25%
quantile(kate_grades, 1/4)
25%
67
# the 75%
quantile(kate_grades, 3/4)
75%
73
# the function IQR finds the interquantile range
# IQR(x) = quantile(x, 3/4) - quantile(x, 1/4)
IQR(kate_grades)
[1] 6
quantile(kate_grades, 2/4)
50%
70
Using the quantile function we can select which quantiles we want to
be displayed, here we display the two quantiles which are standardly
displayed using the summary() function. The IQR function displays the
percentage difference between the first and third quantile which is 6% I
also included the 2nd quantile percent of kates_grades at the end. which
we see is 70%, which is 3% more or less of the first and third quantile,
respectively.
Make comments about the output and run a similar query using
Frank_grades
Case-scenario 2
# the 25%
quantile(Frnk_Grds, 1/4)
25%
56.25
# the 75%
quantile(Frnk_Grds, 3/4)
75%
87.75
# the function IQR finds the interquantile range
# IQR(x) = quantile(x, 3/4) - quantile(x, 1/4)
IQR(Frnk_Grds)
[1] 31.5
The average salary of 10 men is 72,000 and the average salary of 4
women is 84,000. Find the mean salary of all 14 people.
Solution
We can easily find the joined mean by adding both mean and dividing
by the total number of people.
Let \(n_1 = 10\) denote the number
of men, and \(y_1 = 72000\) their mean
salary. Let \(n_2 = 4\) the number of
women and \(y_2 = 84000\) their mean
salary. Then the mean salary of all 16 individuals is: \(\frac{n_1 x_1 + n_2 x_2}{n_1 + n_2}\)
We can compute this in R as follows:
n_1 <- 10
n_2 <- 4
y_1 <- 72000
y_2 <- 84000
# Mean salary overall
salary_ave <- (n_1*y_1 + n_2*y_2)/(n_1+n_2)
salary_ave
[1] 75428.57
We can see that the average salary of these 14 men and woman is
$75,428.57 dollars. very interesting and simple equation.
Solve a similar problem by changing number of men and women as well
as the average income for each group. Make comments about the
output.
n_1 <- 12
n_2 <- 6
y_1 <- 99000
y_2 <- 78000
# Mean salary overall
salary_ave <- (n_1*y_1 + n_2*y_2)/(n_1+n_2)
salary_ave
[1] 92000
After I changed the total count of men and women to 18 and their
salaries to 99k and 78k, the average salaries changed to 92k
Case-scenario 3
The frequency distribution below lists the results of a test given in
Professor Wang’s String theory class.
| 10 |
5 |
| 9 |
10 |
| 8 |
6 |
| 7 |
8 |
| 6 |
3 |
| 5 |
2 |
Find the mean,the median and the standard deviation of the
scores.
What percentage of the data lies within one standard deviation of
the mean?
What percentage of the data lies within two standard deviations
of the mean?
What percent of the data lies within three standard deviations of
the mean?
Draw a histogram to illustrate the data.
Solution
The allScores.csv file contains all the students’ scores
in the quiz. We can read this file in R using the
read.csv() function (hint:First create a csv file with 6
rows and 2 columns)
getwd()
[1] "C:/Users/antho/OneDrive/Documents/School/4.DataSecurity&Governance"
scores <- read.table("allScores.csv", header = TRUE, sep = ",")
WangScores <- scores$Score
WangScores
[1] 10 9 8 7 6 5 10 10 10 10 9 9 9 9 9 9 9 9 9 8 8 8 8 8 7 7 7 7 7 7 7 6 6 5
View(scores)
View(WangScores)
Make comments about the code we just ran above.
Here we find the mean(8), median(8), and the standard
deviation(1.44)
# Mean
Scores_mean <- mean(WangScores)
Scores_mean
[1] 8
# Median
Scores_median <- median(WangScores)
Scores_median
[1] 8
# Find number of observations
Scores_n <- length(WangScores)
# Find standard deviation
Scores_sd <- sd(WangScores)
Scores_sd
[1] 1.435481
We can see that both the mean and median of the wang scores is 8 and
the standard deviation is 1.435
#2. What percentage of the data lies within one standard deviation of
the mean?
scores_w1sd <- sum((WangScores - Scores_mean)/Scores_sd < 1)/ Scores_n
# Percentage of observation within one standard deviation of the mean
scores_w1sd
[1] 0.8529412
## Difference from empirical
scores_w1sd - 0.68
[1] 0.1729412
We can see that 85% of the scores fall within one standard deviation
of the mean?
#3. What percentage of the data lies within two standard deviations
of the mean?
## Within 2 sd
scores_w2sd <- sum((WangScores - Scores_mean)/ Scores_sd < 2)/Scores_n
scores_w2sd
[1] 1
## Difference from empirical
scores_w2sd - 0.95
[1] 0.05
We can see that 100% of the scores fall within three standard
deviation of the mean
#4. What percent of the data lies within three standard deviations of
the mean?
## Within 3 sd
scores_w3sd <- sum((WangScores - Scores_mean)/ Scores_sd < 3)/Scores_n
scores_w3sd
[1] 1
## Difference from empirical
scores_w3sd - 0.9973
[1] 0.0027
We can see that 100% of the scores fall within three standard
deviation of the mean
Explain the implications of the results obtained in this problem. In
addition, create a similar query but this time addressing
Frank_Scores
# Mean
FrScores_mean <- mean(Frnk_Grds)
FrScores_mean
[1] 70
# Median
FrScores_median <- median(Frnk_Grds)
FrScores_median
[1] 66
# Find number of observations
FrScores_n <- length(Frnk_Grds)
# Find standard deviation
FrScores_sd <- sd(Frnk_Grds)
FrScores_sd
[1] 22.64509
Frscores_w1sd <- sum((Frnk_Grds - FrScores_mean)/FrScores_sd < 1)/ FrScores_n
# Percentage of observation within one standard deviation of the mean
Frscores_w1sd
[1] 0.6666667
## Difference from empirical
Frscores_w1sd - 0.68
[1] -0.01333333
Frscores_w1sd <- sum((Frnk_Grds - FrScores_mean)/FrScores_sd < 2)/ FrScores_n
# Percentage of observation within one standard deviation of the mean
Frscores_w1sd
[1] 1
## Difference from empirical
Frscores_w1sd - 0.95
[1] 0.05
Frscores_w1sd <- sum((Frnk_Grds - FrScores_mean)/FrScores_sd < 3)/ FrScores_n
# Percentage of observation within one standard deviation of the mean
Frscores_w1sd
[1] 1
## Difference from empirical
Frscores_w1sd - 0.9973
[1] 0.0027
- Draw a histogram
# Create histogram
hist(WangScores)

Explain the output and create a similar histogram for Frank_Scores.
We can see that a histogram is produced that shows the distributions of
Wangs scores, of which most frequently fall between 6 and 8. I dont find
this histogram visual pleasing and some what misleading since there are
5 bars in this chart yet 6 X variables which range from 5 - 10.
hist(Frnk_Grds)

hist(Frnk_Grds_bfr)

Notice in the two graphs above once we add the lowest minimum grade
required by frank too the grades from before we see that the
distribution is flat. Maybe we can change this by assuming that franks
6th grade would be the mean(73) of his original grades and not the
minimum required(54).
mean(Frnk_Grds_bfr)
[1] 73.2
Frnk_Grds_bfr
[1] 41 69 63 94 99
Frnk_Grds_Bst <- c(41,69,63,94,99,73)
Frnk_Grds_Bst
[1] 41 69 63 94 99 73
After we make this change we can see in the graph below that the
distribution leans more to the higher values than havung the low
value.
hist(Frnk_Grds_Bst)

LS0tDQp0aXRsZTogIkdldHRpbmcgU3RhcnRlZCB3aXRoIFIsUGFydCBJSSINCm91dHB1dDoNCiAgaHRtbF9ub3RlYm9vazogZGVmYXVsdA0KICBwZGZfZG9jdW1lbnQ6IGRlZmF1bHQNCi0tLQ0KDQpMZXQgdXMgY29udGludWUgZ2V0dGluZyBzdGFydGVkIHdpdGggUiBhcyB3ZSBzdGFydCBkaXNjdXNzaW5nIGltcG9ydGFudCBzdGF0aXN0aWNhbCBjb25jZXB0cy4NCg0KDQojIyBDYXNlLXNjZW5hcmlvIDENCkthdGUgbXVzdCB0YWtlIGZvdXIgcXVpenplcyBpbiBhIG1hdGggY2xhc3MuIElmIGhlciBzY29yZXMgb24gdGhlIGZpcnN0IHRocmVlIHF1aXp6ZXMgYXJlIDcxLCA2OSwgYW5kIDc5LCB3aGF0IHNjb3JlIGRvZXMgc2hlIG5lZWQgb24gdGhlIGZpbmFsIHF1aXogZm9yIGhlciBvdmVyYWxsIG1lYW4gdG8gYmUgYXQgbGVhc3QgNzA/DQoNCiMjIFNvbHV0aW9uDQoNCkdpdmVuIHRoYXQgDQokeF8xID0gNzEsIHhfMiA9IDY5LCB4XzMgPSA3OSQNCg0Kd2Ugd2FudCB0byBmaW5kICR4XzQkIHN1Y2ggdGhhdCB0aGUgbWVhbiAoYXZlcmFnZSkgZ3JhZGUgaXMgDQokXGJhcnt4fSA+PSA3MCQNCg0KTm90aWNlIHRoYXQgaW4gdGhpcyBjYXNlICRuID0gNCQuDQoNCkFjY29yZGluZyB0byB0aGUgaW5mb3JtYXRpb24gYWJvdmU6DQokNzAgXHRpbWVzIDQgPSA3MSArIDY5ICsgNzkgKyB4XzQkDQoNCnNvIHdoZW4gJHhfNCA9IDYxJCwgdGhlIHF1aXogYXZlcmFnZSB3aWxsIGJlIDcwLg0KDQoNCmBgYHtyfQ0KIyBHcmFkZXMgc28gZmFyDQpncmFkZXNfYmVmb3JlIDwtIGMoNzEsIDY5LCA3OSkNCiMgQXZlcmFnZSBxdWl6IGdyYWRlIHdhbnRlZA0Kd2FudGVkX2dyYWRlIDwtIDcwDQojIE51bWJlciBvZiBxdWl6emVzDQpuX3F1aXp6ZXMgPC0gNA0KIyBOZWVkZWQgZ3JhZGUgb24gcXVpeiA0DQp4XzQgPC0gbl9xdWl6emVzKndhbnRlZF9ncmFkZSAtIHN1bShncmFkZXNfYmVmb3JlKQ0KIyBNaW5pbXVtIGdyYWRlIG5lZWRlZCBieSBLYXRlDQp4XzQNCmBgYA0KV2UgY2FuIHNlZSB3ZSBjcmVhdGUgYSB2YXJpYWJsZSBzdG9yaW5nIHRoZSBjdXJyZW50IGdyYWRlcyBvZiBrYXRlIGFzICJncmFkZXNfYmVmb3JlIiBhbmQgdGhlIG92ZXJhbCBtZWFuIGdyYWRlIHNoZSBkZXNpcmVzIGFzICJ3YW50ZWRfZ3JhZGUiLiBXZSBhbHNvIGNyZWF0ZSBhIHZhcmlhYmxlIHN0b3JpbmcgdGhlIG51bWJlciBvZiBxdWl6ZXMuDQpUaGVuIHdlIHN0b3JlIHRoZSB2YWx1ZSBvZiB0aGUgdGhlIG51bWJlciBvZiBxdWl6ZXMgbXVsdGlwbGllZCBieSB0aGUgd2FudGVkIGdyYWRlLCBmcm9tIHdoaWNoIHdlIHN1YnRyYWN0IHRoZSBzdW0gb2YgdGhlIGdyYWRlcyBiZWZvcmUuDQpWZXJ5IHNhdGlzZnlpbmcgd29ya2luZyB0aHJvdWdoIHRoaXMgZXF1YXRpb24gaXQgd2FzIHZlcnkgcHJhY3RpY2FsIGFuZCBtYWRlIG1lIGZlZWwgc29tZXdoYXQgbW9yZSBjb25maWRlbnQgaW4gbXkgbWF0aCBza2lsbHMuIA0KDQpBY2NvcmRpbmcgdG8gdGhlIGNhbGN1bGF0aW9ucyBhYm92ZSwgS2F0ZSBtdXN0IHNjb3JlIDYxIG9yIGJldHRlciBvbiB0aGUgZmluYWwgcXVpeiB0byBnZXQgYW4gYXZlcmFnZSBxdWl6IGdyYWRlIG9mIGF0IGxlYXN0IDcwLg0KDQoNCldlIGNvdWxkIGNvbmZpcm0gdGhpcywgYnkgdXNpbmcgdGhlIGZ1bmN0aW9uIGBtZWFuKClgIGluIGBSYA0KDQpgYGB7cn0NCiMgUXVpeiBncmFkZXMNCmthdGVfZ3JhZGVzIDwtIGMoNzEsIDY5LCA3OSw2MSkNCiMgRmluZCBtZWFuDQptZWFuKGthdGVfZ3JhZGVzKQ0KIyBGaW5kIHN0YW5kYXJkIGRldmlhdGlvbg0Kc2Qoa2F0ZV9ncmFkZXMpDQojIEZpbmQgbWF4aW11bSBncmFkZQ0KbWF4KGthdGVfZ3JhZGVzKQ0KIyBGaW5kIG1pbmltdW0gZ3JhZGUNCm1pbihrYXRlX2dyYWRlcykNCmBgYA0KV2UgY2FuIHNlZSB0aGF0IGthdGVzIG1lYW4gZ3JhZGUgaXMgNzAgd2hlbiBpbmNsdWRpbmcgaGVyIGZpbmFsIG1pbmltYWwgc2NvcmUgb2YgNjEuIA0KV2UgYWxzbyBzZWUgdGhhdCB0aGUgc3RhbmRhcmQgZGV2aWF0aW9uIGlzIDcuMzkgb2YgaGVyIG5ldyBncmFkZSB0b3RhbC4NCldlIGFsc28gc2VlIHRoYXQgaGVyIG1heGltdW0gZ3JhZGUgaXMgNzkgYW5kIGhlciBtaW5pbXVtIGdyYWRlIGlzIDYxDQoNCiNXZSBjYW4gYWxzbyB1c2UgdGhlIGBzdW1tYXJ5KClgIGZ1bmN0aW9uIHRvIGZpbmQgYmFzaWMgc3RhdGlzdGljcywgaW5jbHVkaW5nIHRoZSBtZWRpYW4hDQoNCmBgYHtyfQ0Kc3VtbWFyeShrYXRlX2dyYWRlcykNCmBgYA0KDQojTmV4dCwgSSB3b3VsZCBsaWtlIHlvdSB0byBleHBsYWluIGluIGRldGFpbCBldmVyeSBzaW5nbGUgdGFzayB3ZSBjb21wbGV0ZWQgYWJvdmUuIEluIGFkZGl0aW9uLCBsZXQgdXMgZGVhbCB3aXRoIGEgc2ltaWxhciBjYXNlIHNjZW5hcmlvIGFuZCBjb21wbGV0ZSBldmVyeSBzaW5nbGUgdGFzayB3ZSBleGVjdXRlIGluIENhc2Utc2NlbmFyaW8gMS4NCg0KV2Ugc2VlIHRoYXQgd2UgaGF2ZSB0aGUgbWluIGFuZCBtYXggYW1vdW50IG9mIGthdGVzIGdyYWRlcyBsaXN0ZWQgYXMgdGhlIGZpcnN0IGFuZCBsYXN0IHZhbHVlcyBvZiB0aGUgc3VtbWFyeS4NCndlIGFsc28gc2VlIHRoZSAxc3QgYW5kIDNyZCBxdWFudGlsZXMgd2hpY2ggd2UgZmluZCBpbiB0aGUgbmV4dCBzdGVwIGluIHRoaXMgc3VtbWFyeSwgYW5kIHRoZSBtZWRpYW4gdmFsdWUgaW4gdGhlIG1pZGRsZSBvZiB0aGUgbGlzdC4gDQoNCkZyYW5rIG11c3QgdGFrZSBzaXggcXVpenplcyBpbiBhIFBoeXNpY3MgY2xhc3MuIElmIGhpcyBzY29yZXMgb24gdGhlIGZpcnN0IGZpdmUgcXVpenplcyBhcmUgNDEsIDY5LDYzLDk0LCBhbmQgOTksIHdoYXQgc2NvcmUgZG9lcyBoZSBuZWVkIG9uIHRoZSBmaW5hbCBxdWl6IGZvciBoaXMgb3ZlcmFsbCBtZWFuIHRvIGJlIGF0IGxlYXN0IDcwP3MNCg0KYGBge3J9DQpGcm5rX0dyZHNfYmZyIDwtIGMoNDEsNjksNjMsOTQsOTkpDQpmbl9RdWl6emVzIDwtIDYNCnhfNiA8LSB3YW50ZWRfZ3JhZGUqZm5fUXVpenplcyAtIHN1bShGcm5rX0dyZHNfYmZyKQ0KeF82DQpGcm5rX0dyZHMgPC0gYyg0MSw2OSw2Myw5NCw5OSw1NCkNCm1lYW4oRnJua19HcmRzKQ0Kc2QoRnJua19HcmRzKQ0KbWF4KEZybmtfR3JkcykNCm1pbihGcm5rX0dyZHMpDQpgYGANCiNXZSBjYW4gc2VlIHRoYXQgZnJhbmsgbmVlZHMgYSBncmFkZSBvZiA1NCUgb24gaGlzIGZpbmFsIHF1aXogdG8gcmVjaWV2ZSBhbiBvdmVyYWwgbWVhbiBzY29yZSBvZiA3MC4NCg0KTm93IGxldCB1cyBnbyBiYWNrIHRvIENhc2Utc2NlbmFyaW8gMQ0KDQpBbm90aGVyIHVzZWZ1bCBmdW5jdGlvbiBpcyBgcXVhbnRpbGVgIHRvIGZpbmQgDQpgYGB7cn0NCiMgdGhlIDI1JSANCnF1YW50aWxlKGthdGVfZ3JhZGVzLCAxLzQpDQojIHRoZSA3NSUNCnF1YW50aWxlKGthdGVfZ3JhZGVzLCAzLzQpDQojIHRoZSBmdW5jdGlvbiBJUVIgZmluZHMgdGhlIGludGVycXVhbnRpbGUgcmFuZ2UNCiMgSVFSKHgpID0gcXVhbnRpbGUoeCwgMy80KSAtIHF1YW50aWxlKHgsIDEvNCkNCklRUihrYXRlX2dyYWRlcykNCnF1YW50aWxlKGthdGVfZ3JhZGVzLCAyLzQpDQpgYGANClVzaW5nIHRoZSBxdWFudGlsZSBmdW5jdGlvbiB3ZSBjYW4gc2VsZWN0IHdoaWNoIHF1YW50aWxlcyB3ZSB3YW50IHRvIGJlIGRpc3BsYXllZCwgaGVyZSB3ZSBkaXNwbGF5IHRoZSB0d28gcXVhbnRpbGVzIHdoaWNoIGFyZSBzdGFuZGFyZGx5IGRpc3BsYXllZCB1c2luZyB0aGUgc3VtbWFyeSgpIGZ1bmN0aW9uLiANClRoZSBJUVIgZnVuY3Rpb24gZGlzcGxheXMgdGhlIHBlcmNlbnRhZ2UgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBmaXJzdCBhbmQgdGhpcmQgcXVhbnRpbGUgd2hpY2ggaXMgNiUNCkkgYWxzbyBpbmNsdWRlZCB0aGUgMm5kIHF1YW50aWxlIHBlcmNlbnQgb2Yga2F0ZXNfZ3JhZGVzIGF0IHRoZSBlbmQuIHdoaWNoIHdlIHNlZSBpcyA3MCUsIHdoaWNoIGlzIDMlIG1vcmUgb3IgbGVzcyBvZiB0aGUgZmlyc3QgYW5kIHRoaXJkIHF1YW50aWxlLCByZXNwZWN0aXZlbHkuIA0KDQpNYWtlIGNvbW1lbnRzIGFib3V0IHRoZSBvdXRwdXQgYW5kIHJ1biBhIHNpbWlsYXIgcXVlcnkgdXNpbmcgRnJhbmtfZ3JhZGVzDQoNCg0KIyBDYXNlLXNjZW5hcmlvIDINCmBgYHtyfQ0KIyB0aGUgMjUlIA0KcXVhbnRpbGUoRnJua19HcmRzLCAxLzQpDQojIHRoZSA3NSUNCnF1YW50aWxlKEZybmtfR3JkcywgMy80KQ0KIyB0aGUgZnVuY3Rpb24gSVFSIGZpbmRzIHRoZSBpbnRlcnF1YW50aWxlIHJhbmdlDQojIElRUih4KSA9IHF1YW50aWxlKHgsIDMvNCkgLSBxdWFudGlsZSh4LCAxLzQpDQpJUVIoRnJua19HcmRzKQ0KYGBgDQoNCg0KVGhlIGF2ZXJhZ2Ugc2FsYXJ5IG9mIDEwIG1lbiBpcyA3MiwwMDAgYW5kIHRoZSBhdmVyYWdlIHNhbGFyeSBvZiA0IHdvbWVuIGlzIDg0LDAwMC4gRmluZCB0aGUgbWVhbiBzYWxhcnkgb2YgYWxsIDE0IHBlb3BsZS4NCg0KIyMgU29sdXRpb24NCg0KV2UgY2FuIGVhc2lseSBmaW5kIHRoZSBqb2luZWQgbWVhbiBieSBhZGRpbmcgYm90aCBtZWFuIGFuZCBkaXZpZGluZyBieSB0aGUgdG90YWwgbnVtYmVyIG9mIHBlb3BsZS4NCg0KTGV0ICRuXzEgPSAxMCQgZGVub3RlIHRoZSBudW1iZXIgb2YgbWVuLCBhbmQgJHlfMSA9IDcyMDAwJCB0aGVpciBtZWFuIHNhbGFyeS4gTGV0ICRuXzIgPSA0JCB0aGUgbnVtYmVyIG9mIHdvbWVuIGFuZCAkeV8yID0gODQwMDAkIHRoZWlyIG1lYW4gc2FsYXJ5Lg0KVGhlbiB0aGUgbWVhbiBzYWxhcnkgb2YgYWxsIDE2IGluZGl2aWR1YWxzIGlzOg0KJFxmcmFje25fMSB4XzEgKyBuXzIgeF8yfXtuXzEgKyBuXzJ9JA0KDQpXZSBjYW4gY29tcHV0ZSB0aGlzIGluIFIgYXMgZm9sbG93czoNCg0KYGBge3J9DQpuXzEgPC0gMTANCm5fMiA8LSA0DQp5XzEgPC0gNzIwMDANCnlfMiA8LSA4NDAwMA0KIyBNZWFuIHNhbGFyeSBvdmVyYWxsDQpzYWxhcnlfYXZlIDwtICAobl8xKnlfMSArIG5fMip5XzIpLyhuXzErbl8yKQ0Kc2FsYXJ5X2F2ZQ0KYGBgDQpXZSBjYW4gc2VlIHRoYXQgdGhlIGF2ZXJhZ2Ugc2FsYXJ5IG9mIHRoZXNlIDE0IG1lbiBhbmQgd29tYW4gaXMgJDc1LDQyOC41NyBkb2xsYXJzLiB2ZXJ5IGludGVyZXN0aW5nIGFuZCBzaW1wbGUgZXF1YXRpb24uIA0KDQpTb2x2ZSBhIHNpbWlsYXIgcHJvYmxlbSBieSBjaGFuZ2luZyBudW1iZXIgb2YgbWVuIGFuZCB3b21lbiBhcyB3ZWxsIGFzIHRoZSBhdmVyYWdlIGluY29tZSBmb3IgZWFjaCBncm91cC4gTWFrZSBjb21tZW50cyBhYm91dCB0aGUgb3V0cHV0Lg0KDQpgYGB7cn0NCm5fMSA8LSAxMg0Kbl8yIDwtIDYNCnlfMSA8LSA5OTAwMA0KeV8yIDwtIDc4MDAwDQojIE1lYW4gc2FsYXJ5IG92ZXJhbGwNCnNhbGFyeV9hdmUgPC0gIChuXzEqeV8xICsgbl8yKnlfMikvKG5fMStuXzIpDQpzYWxhcnlfYXZlDQpgYGANCkFmdGVyIEkgY2hhbmdlZCB0aGUgdG90YWwgY291bnQgb2YgbWVuIGFuZCB3b21lbiB0byAxOCBhbmQgdGhlaXIgc2FsYXJpZXMgdG8gOTlrIGFuZCA3OGssIHRoZSBhdmVyYWdlIHNhbGFyaWVzIGNoYW5nZWQgdG8gOTJrDQoNCiMgQ2FzZS1zY2VuYXJpbyAzDQoNClRoZSBmcmVxdWVuY3kgZGlzdHJpYnV0aW9uIGJlbG93IGxpc3RzIHRoZSByZXN1bHRzIG9mIGEgdGVzdCBnaXZlbiBpbiBQcm9mZXNzb3IgV2FuZydzIFN0cmluZyB0aGVvcnkgY2xhc3MuDQoNClNjb3JlICAgfCAgIE51bWJlciBvZiBzdHVkZW50cw0KLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KMTAgICAgICB8IDUNCjkgICAgICAgfCAxMA0KOCAgICAgICB8IDYNCjcgICAgICAgfCA4DQo2ICAgICAgIHwgMw0KNSAgICAgICB8IDINCg0KDQoNCjEuIEZpbmQgdGhlIG1lYW4sdGhlIG1lZGlhbiBhbmQgdGhlIHN0YW5kYXJkIGRldmlhdGlvbiBvZiB0aGUgc2NvcmVzLg0KDQoyLiBXaGF0IHBlcmNlbnRhZ2Ugb2YgdGhlIGRhdGEgbGllcyB3aXRoaW4gb25lIHN0YW5kYXJkIGRldmlhdGlvbiBvZiB0aGUgbWVhbj8NCg0KMy4gV2hhdCBwZXJjZW50YWdlIG9mIHRoZSBkYXRhIGxpZXMgd2l0aGluIHR3byBzdGFuZGFyZCBkZXZpYXRpb25zIG9mIHRoZSBtZWFuPw0KDQo0LiBXaGF0IHBlcmNlbnQgb2YgdGhlIGRhdGEgbGllcyB3aXRoaW4gdGhyZWUgc3RhbmRhcmQgZGV2aWF0aW9ucyBvZiB0aGUgbWVhbj8gDQoNCjUuIERyYXcgYSBoaXN0b2dyYW0gdG8gaWxsdXN0cmF0ZSB0aGUgZGF0YS4gDQoNCiMjIFNvbHV0aW9uDQoNClRoZSBgYWxsU2NvcmVzLmNzdmAgZmlsZSBjb250YWlucyBhbGwgdGhlIHN0dWRlbnRzJyBzY29yZXMgaW4gdGhlIHF1aXouIFdlIGNhbiByZWFkIHRoaXMgZmlsZSBpbiBgUmAgdXNpbmcgdGhlIGByZWFkLmNzdigpYCBmdW5jdGlvbiAoaGludDpGaXJzdCBjcmVhdGUgYSBjc3YgZmlsZSB3aXRoIDYgcm93cyBhbmQgMiBjb2x1bW5zKQ0KYGBge3J9DQpnZXR3ZCgpDQpgYGANCg0KDQpgYGB7cn0NCnNjb3JlcyA8LSByZWFkLnRhYmxlKCJhbGxTY29yZXMuY3N2IiwgaGVhZGVyID0gVFJVRSwgc2VwID0gIiwiKQ0KV2FuZ1Njb3JlcyA8LSBzY29yZXMkU2NvcmUNCldhbmdTY29yZXMNCmBgYA0KYGBge3J9DQpWaWV3KHNjb3JlcykNCmBgYA0KDQpgYGB7cn0NClZpZXcoV2FuZ1Njb3JlcykNCmBgYA0KDQoNCk1ha2UgY29tbWVudHMgYWJvdXQgdGhlIGNvZGUgd2UganVzdCByYW4gYWJvdmUuICANCg0KDQpIZXJlIHdlIGZpbmQgdGhlIG1lYW4oOCksIG1lZGlhbig4KSwgYW5kIHRoZSBzdGFuZGFyZCBkZXZpYXRpb24oMS40NCkNCg0KYGBge3J9DQojIE1lYW4gDQpTY29yZXNfbWVhbiAgPC0gbWVhbihXYW5nU2NvcmVzKQ0KU2NvcmVzX21lYW4NCiMgTWVkaWFuDQpTY29yZXNfbWVkaWFuIDwtIG1lZGlhbihXYW5nU2NvcmVzKQ0KU2NvcmVzX21lZGlhbg0KIyBGaW5kIG51bWJlciBvZiBvYnNlcnZhdGlvbnMNClNjb3Jlc19uIDwtIGxlbmd0aChXYW5nU2NvcmVzKQ0KIyBGaW5kIHN0YW5kYXJkIGRldmlhdGlvbg0KU2NvcmVzX3NkIDwtIHNkKFdhbmdTY29yZXMpDQpTY29yZXNfc2QNCmBgYA0KV2UgY2FuIHNlZSB0aGF0IGJvdGggdGhlIG1lYW4gYW5kIG1lZGlhbiBvZiB0aGUgd2FuZyBzY29yZXMgaXMgOCBhbmQgdGhlIHN0YW5kYXJkIGRldmlhdGlvbiBpcyAxLjQzNQ0KDQojMi4gV2hhdCBwZXJjZW50YWdlIG9mIHRoZSBkYXRhIGxpZXMgd2l0aGluIG9uZSBzdGFuZGFyZCBkZXZpYXRpb24gb2YgdGhlIG1lYW4/DQoNCmBgYHtyfQ0Kc2NvcmVzX3cxc2QgPC0gc3VtKChXYW5nU2NvcmVzIC0gU2NvcmVzX21lYW4pL1Njb3Jlc19zZCA8IDEpLyBTY29yZXNfbg0KIyBQZXJjZW50YWdlIG9mIG9ic2VydmF0aW9uIHdpdGhpbiBvbmUgc3RhbmRhcmQgZGV2aWF0aW9uIG9mIHRoZSBtZWFuDQpzY29yZXNfdzFzZA0KIyMgRGlmZmVyZW5jZSBmcm9tIGVtcGlyaWNhbCANCnNjb3Jlc193MXNkIC0gMC42OA0KYGBgDQpXZSBjYW4gc2VlIHRoYXQgODUlIG9mIHRoZSBzY29yZXMgZmFsbCB3aXRoaW4gb25lIHN0YW5kYXJkIGRldmlhdGlvbiBvZiB0aGUgbWVhbj8NCg0KIzMuIFdoYXQgcGVyY2VudGFnZSBvZiB0aGUgZGF0YSBsaWVzIHdpdGhpbiB0d28gc3RhbmRhcmQgZGV2aWF0aW9ucyBvZiB0aGUgbWVhbj8NCg0KYGBge3J9DQojIyBXaXRoaW4gMiBzZA0Kc2NvcmVzX3cyc2QgPC0gc3VtKChXYW5nU2NvcmVzIC0gU2NvcmVzX21lYW4pLyBTY29yZXNfc2QgPCAyKS9TY29yZXNfbg0Kc2NvcmVzX3cyc2QNCiMjIERpZmZlcmVuY2UgZnJvbSBlbXBpcmljYWwgDQpzY29yZXNfdzJzZCAtIDAuOTUNCmBgYA0KV2UgY2FuIHNlZSB0aGF0IDEwMCUgb2YgdGhlIHNjb3JlcyBmYWxsIHdpdGhpbiB0aHJlZSBzdGFuZGFyZCBkZXZpYXRpb24gb2YgdGhlIG1lYW4NCg0KIzQuIFdoYXQgcGVyY2VudCBvZiB0aGUgZGF0YSBsaWVzIHdpdGhpbiB0aHJlZSBzdGFuZGFyZCBkZXZpYXRpb25zIG9mIHRoZSBtZWFuPw0KDQpgYGB7cn0NCiMjIFdpdGhpbiAzIHNkIA0Kc2NvcmVzX3czc2QgPC0gc3VtKChXYW5nU2NvcmVzIC0gU2NvcmVzX21lYW4pLyBTY29yZXNfc2QgPCAzKS9TY29yZXNfbg0Kc2NvcmVzX3czc2QNCiMjIERpZmZlcmVuY2UgZnJvbSBlbXBpcmljYWwgDQpzY29yZXNfdzNzZCAtIDAuOTk3Mw0KYGBgDQpXZSBjYW4gc2VlIHRoYXQgMTAwJSBvZiB0aGUgc2NvcmVzIGZhbGwgd2l0aGluIHRocmVlIHN0YW5kYXJkIGRldmlhdGlvbiBvZiB0aGUgbWVhbg0KDQoNCkV4cGxhaW4gdGhlIGltcGxpY2F0aW9ucyBvZiB0aGUgcmVzdWx0cyBvYnRhaW5lZCBpbiB0aGlzIHByb2JsZW0uIEluIGFkZGl0aW9uLCBjcmVhdGUgYSBzaW1pbGFyIHF1ZXJ5IGJ1dCB0aGlzIHRpbWUgYWRkcmVzc2luZyBGcmFua19TY29yZXMNCg0KYGBge3J9DQojIE1lYW4gDQpGclNjb3Jlc19tZWFuICA8LSBtZWFuKEZybmtfR3JkcykNCkZyU2NvcmVzX21lYW4NCiMgTWVkaWFuDQpGclNjb3Jlc19tZWRpYW4gPC0gbWVkaWFuKEZybmtfR3JkcykNCkZyU2NvcmVzX21lZGlhbg0KIyBGaW5kIG51bWJlciBvZiBvYnNlcnZhdGlvbnMNCkZyU2NvcmVzX24gPC0gbGVuZ3RoKEZybmtfR3JkcykNCiMgRmluZCBzdGFuZGFyZCBkZXZpYXRpb24NCkZyU2NvcmVzX3NkIDwtIHNkKEZybmtfR3JkcykNCkZyU2NvcmVzX3NkDQoNCmBgYA0KYGBge3J9DQpGcnNjb3Jlc193MXNkIDwtIHN1bSgoRnJua19HcmRzIC0gRnJTY29yZXNfbWVhbikvRnJTY29yZXNfc2QgPCAxKS8gRnJTY29yZXNfbg0KIyBQZXJjZW50YWdlIG9mIG9ic2VydmF0aW9uIHdpdGhpbiBvbmUgc3RhbmRhcmQgZGV2aWF0aW9uIG9mIHRoZSBtZWFuDQpGcnNjb3Jlc193MXNkDQojIyBEaWZmZXJlbmNlIGZyb20gZW1waXJpY2FsIA0KRnJzY29yZXNfdzFzZCAtIDAuNjgNCmBgYA0KDQoNCmBgYHtyfQ0KRnJzY29yZXNfdzFzZCA8LSBzdW0oKEZybmtfR3JkcyAtIEZyU2NvcmVzX21lYW4pL0ZyU2NvcmVzX3NkIDwgMikvIEZyU2NvcmVzX24NCiMgUGVyY2VudGFnZSBvZiBvYnNlcnZhdGlvbiB3aXRoaW4gb25lIHN0YW5kYXJkIGRldmlhdGlvbiBvZiB0aGUgbWVhbg0KRnJzY29yZXNfdzFzZA0KIyMgRGlmZmVyZW5jZSBmcm9tIGVtcGlyaWNhbCANCkZyc2NvcmVzX3cxc2QgLSAwLjk1DQpgYGANCg0KYGBge3J9DQpGcnNjb3Jlc193MXNkIDwtIHN1bSgoRnJua19HcmRzIC0gRnJTY29yZXNfbWVhbikvRnJTY29yZXNfc2QgPCAzKS8gRnJTY29yZXNfbg0KIyBQZXJjZW50YWdlIG9mIG9ic2VydmF0aW9uIHdpdGhpbiBvbmUgc3RhbmRhcmQgZGV2aWF0aW9uIG9mIHRoZSBtZWFuDQpGcnNjb3Jlc193MXNkDQojIyBEaWZmZXJlbmNlIGZyb20gZW1waXJpY2FsIA0KRnJzY29yZXNfdzFzZCAtIDAuOTk3Mw0KYGBgDQoNCjUuIERyYXcgYSBoaXN0b2dyYW0NCg0KYGBge3J9DQojIENyZWF0ZSBoaXN0b2dyYW0NCmhpc3QoV2FuZ1Njb3JlcykNCmBgYA0KDQpFeHBsYWluIHRoZSBvdXRwdXQgYW5kIGNyZWF0ZSBhIHNpbWlsYXIgaGlzdG9ncmFtIGZvciBGcmFua19TY29yZXMuDQpXZSBjYW4gc2VlIHRoYXQgYSBoaXN0b2dyYW0gaXMgcHJvZHVjZWQgdGhhdCBzaG93cyB0aGUgZGlzdHJpYnV0aW9ucyBvZiBXYW5ncyBzY29yZXMsIG9mIHdoaWNoIG1vc3QgZnJlcXVlbnRseSBmYWxsIGJldHdlZW4gNiBhbmQgOC4gSSBkb250IGZpbmQgdGhpcyBoaXN0b2dyYW0gdmlzdWFsIHBsZWFzaW5nIGFuZCBzb21lIHdoYXQgbWlzbGVhZGluZyBzaW5jZSB0aGVyZSBhcmUgNSBiYXJzIGluIHRoaXMgY2hhcnQgeWV0IDYgWCB2YXJpYWJsZXMgd2hpY2ggcmFuZ2UgZnJvbSA1IC0gMTAuDQoNCmBgYHtyfQ0KaGlzdChGcm5rX0dyZHMpDQpgYGANCg0KDQpgYGB7cn0NCmhpc3QoRnJua19HcmRzX2JmcikNCg0KYGBgDQpOb3RpY2UgaW4gdGhlIHR3byBncmFwaHMgYWJvdmUgb25jZSB3ZSBhZGQgdGhlIGxvd2VzdCBtaW5pbXVtIGdyYWRlIHJlcXVpcmVkIGJ5IGZyYW5rIHRvbyB0aGUgZ3JhZGVzIGZyb20gYmVmb3JlIHdlIHNlZSB0aGF0IHRoZSBkaXN0cmlidXRpb24gaXMgZmxhdC4gDQpNYXliZSB3ZSBjYW4gY2hhbmdlIHRoaXMgYnkgYXNzdW1pbmcgdGhhdCBmcmFua3MgNnRoIGdyYWRlIHdvdWxkIGJlIHRoZSBtZWFuKDczKSBvZiBoaXMgb3JpZ2luYWwgZ3JhZGVzIGFuZCBub3QgdGhlIG1pbmltdW0gcmVxdWlyZWQoNTQpLg0KDQpgYGB7cn0NCm1lYW4oRnJua19HcmRzX2JmcikNCkZybmtfR3Jkc19iZnINCkZybmtfR3Jkc19Cc3QgPC0gYyg0MSw2OSw2Myw5NCw5OSw3MykNCkZybmtfR3Jkc19Cc3QNCmBgYA0KQWZ0ZXIgd2UgbWFrZSB0aGlzIGNoYW5nZSB3ZSBjYW4gc2VlIGluIHRoZSBncmFwaCBiZWxvdyB0aGF0IHRoZSBkaXN0cmlidXRpb24gbGVhbnMgbW9yZSB0byB0aGUgaGlnaGVyIHZhbHVlcyB0aGFuIGhhdnVuZyB0aGUgbG93IHZhbHVlLiANCg0KYGBge3J9DQpoaXN0KEZybmtfR3Jkc19Cc3QpDQpgYGANCg0K