library(tidyverse)
library(openintro)
download.file("http://www.openintro.org/stat/data/ames.RData", destfile = "ames.RData")
load("ames.RData")
Exercise 1
Describe:
Shape: The shape seems fairly skew right (there is a long right
tail)
Center: The mean area of the houses sold is at 1500 square feet Spread:
The standard deviation is 505.509 square feet
area <- ames$Gr.Liv.Area
price <- ames$SalePrice
summary(area)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 334 1126 1442 1500 1743 5642
## [1] 505.5089

# area is the living area of the house in sq. ft.
# price is the sale price of the house
Exercise 2
This distribution has a similar shape, a mean of 1455, and a sd of
516.833, which are all very similar.
set.seed(27)
samp1 <- sample(area, 50)
summary(samp1)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 672 1041 1394 1455 1678 2978
## [1] 516.8332

Exercise 3
The mean of samp2 is 1432, which is different, but still pretty close
to samp1. I believe that the samples would provide estimates of the
population mean with increasing accuracy as the sample size increases
due to Bernoulli’s weak law of large numbers.
set.seed(36)
samp2 <- sample(area,50)
summary(samp2)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 800 1155 1380 1432 1621 3082
## [1] 423.2572

Exercise 4
I believe that there are 5000 “num” elements in the variable
sample_means50 as shown in the global environment.
Interestingly, the sampling distribution has a mean of exactly 1500,
which is the exact same as the population mean. The shape is
approximately normal, which the Q-Q plot confirms, but I’m not sure how
to interpret the Shapiro-Wilk test results. The standard error is 70.773
square feet.
set.seed(64)
sample_means50 <- rep(NA, 5000)
for(i in 1:5000){
samp <- sample(area, 50)
sample_means50[i] <- mean(samp)
}
hist(sample_means50, breaks = 25)

## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 1240 1452 1498 1500 1546 1807
## [1] 70.77322
qqnorm(sample_means50)
qqline(sample_means50)

shapiro.test(sample_means50)
##
## Shapiro-Wilk normality test
##
## data: sample_means50
## W = 0.99785, p-value = 1.894e-06
Exercise 5
There are 100 elements in the object sample_means_small. Each element
is a sample mean for one of the repeated samples. I’m really loving this
because now I can see how we use for loops similarly with Matlab and get
similar outputs in the console (they have almost the exact same syntax)!
Also the Shapiro-Wilk test is a lot easier to interpret here because p
is clearly greater than .1 and theres no confusing exponents.
set.seed(81)
sample_means_small <- rep(NA, 100)
for(i in 1:100){
samp_small <- sample(area, 50)
sample_means_small[i] <- mean(samp_small)
}
hist(sample_means_small)

summary(sample_means_small)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 1311 1451 1498 1503 1543 1690
## [1] 73.74528
qqnorm(sample_means_small)
qqline(sample_means_small)

shapiro.test(sample_means_small)
##
## Shapiro-Wilk normality test
##
## data: sample_means_small
## W = 0.98353, p-value = 0.2475
## [1] 1486.88 1540.52 1489.26 1632.34 1451.76 1604.18 1503.50 1506.98 1514.54
## [10] 1311.80 1558.92 1571.30 1445.48 1605.98 1480.08 1413.84 1490.52 1537.26
## [19] 1502.78 1512.12 1470.42 1412.34 1438.30 1431.26 1525.14 1676.58 1528.06
## [28] 1624.14 1379.60 1444.98 1547.58 1534.58 1415.74 1446.96 1463.58 1520.32
## [37] 1531.34 1377.74 1534.64 1479.54 1618.58 1588.56 1440.40 1494.06 1451.64
## [46] 1377.28 1490.90 1518.68 1392.26 1543.64 1551.36 1450.10 1450.92 1472.82
## [55] 1447.52 1494.48 1642.68 1689.90 1447.24 1506.62 1418.18 1498.94 1496.38
## [64] 1520.06 1461.86 1517.52 1499.44 1504.64 1455.50 1459.68 1518.86 1687.42
## [73] 1443.04 1496.46 1559.64 1466.38 1434.30 1506.20 1442.78 1634.88 1470.22
## [82] 1604.10 1513.72 1484.30 1473.96 1546.74 1570.26 1467.96 1472.14 1591.70
## [91] 1311.40 1586.04 1435.74 1512.52 1472.14 1542.28 1609.42 1577.94 1403.20
## [100] 1583.56
Exercise 6
The means weren’t significantly different between the distributions:
at 1502 ft^2, then 1500 ft^2, then 1499 ft^2. It actually was less
accurate on the final larger sample size. I believe this is because
regardless of the sample size, the mean of a sampling distribution
(sampling mean) is relatively close to the population mean when iterated
sufficiently (and each of theses were iterated 5000 times).
The spreads, however, do drastically decrease, and clearly the
standard error is decreasing as the sample size is increasing.
set.seed(121)
sample_means10 <- rep(NA, 5000)
sample_means100 <- rep(NA, 5000)
for(i in 1:5000){
samp <- sample(area, 10)
sample_means10[i] <- mean(samp)
samp <- sample(area, 100)
sample_means100[i] <- mean(samp)
}
par(mfrow = c(3, 1))
xlimits <- range(sample_means10)
hist(sample_means10, breaks = 20, xlim = xlimits)
hist(sample_means50, breaks = 20, xlim = xlimits)
hist(sample_means100, breaks = 20, xlim = xlimits)

## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 1018 1390 1493 1502 1600 2190
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 1240 1452 1498 1500 1546 1807
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 1329 1466 1498 1499 1533 1723
On Your Own
- The best estimate I have is $180,043 for the mean sale price.
set.seed(144)
samp_price <- sample(price, 50)
mean(samp_price)
## [1] 180042.5
- The sampling mean (which estimates the population mean) is $180,994.
The true population mean is $180,796, which is really close to our
estimate!
set.seed(169)
sample_means_again <- rep(NA, 5000)
for(i in 1:5000){
samp_price_again <- sample(price, 50)
sample_means_again[i] <- mean(samp_price_again)
}
hist(sample_means_again)

## [1] 180993.5
## [1] 180796.1
## [1] 11069.74
- This sampling distribution predicts the mean price to be $180,650,
which is even closer than time, but not by a significant margin. I
suppose this illustrates why once you reach a “sufficiently large”
sample size, you don’t need to take samples of any larger size,
otherwise it may either be more effort than its worth, or mess up your
data by being non-random.
set.seed(196)
sample_means_again_again <- rep(NA, 5000)
for(i in 1:5000){
samp_price_again_again <- sample(price, 150)
sample_means_again_again[i] <- mean(samp_price_again_again)
}
hist(sample_means_again_again)

mean(sample_means_again_again)
## [1] 180649.6
## [1] 180796.1
sd(sample_means_again_again)
## [1] 6274.747
- The sampling distribution with n=150 has sd = 6274.747, whereas the
sampling distribution with n=50 has sd = 11069.74, and therefore the
sampling distribution with the larger sample size has the smaller
spread. If we want to make estimates that are more often close to the
true value, we prefer a sampling distribution with a smaller spread,
because that means that the likelihood that we will be farther away from
the true population mean is less.
LS0tDQp0aXRsZTogIk9wZW5JbnRybyBCYXNlIFIgTGFiIDUiDQphdXRob3I6ICJBZGkgVmVybWEiDQpkYXRlOiAiYHIgU3lzLkRhdGUoKWAiDQpvdXRwdXQ6IG9wZW5pbnRybzo6bGFiX3JlcG9ydA0KLS0tDQoNCmBgYHtyIGxvYWQtcGFja2FnZXMsIG1lc3NhZ2U9RkFMU0V9DQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkob3BlbmludHJvKQ0KZG93bmxvYWQuZmlsZSgiaHR0cDovL3d3dy5vcGVuaW50cm8ub3JnL3N0YXQvZGF0YS9hbWVzLlJEYXRhIiwgZGVzdGZpbGUgPSAiYW1lcy5SRGF0YSIpDQpsb2FkKCJhbWVzLlJEYXRhIikNCmBgYA0KDQojIyMgRXhlcmNpc2UgMQ0KDQpEZXNjcmliZTogIA0KU2hhcGU6IFRoZSBzaGFwZSBzZWVtcyBmYWlybHkgc2tldyByaWdodCAodGhlcmUgaXMgYSBsb25nIHJpZ2h0IHRhaWwpICANCkNlbnRlcjogVGhlIG1lYW4gYXJlYSBvZiB0aGUgaG91c2VzIHNvbGQgaXMgYXQgMTUwMCBzcXVhcmUgZmVldA0KU3ByZWFkOiBUaGUgc3RhbmRhcmQgZGV2aWF0aW9uIGlzIDUwNS41MDkgc3F1YXJlIGZlZXQNCg0KYGBge3IgY29kZS1jaHVuay0xfQ0KYXJlYSA8LSBhbWVzJEdyLkxpdi5BcmVhDQpwcmljZSA8LSBhbWVzJFNhbGVQcmljZQ0KDQpzdW1tYXJ5KGFyZWEpDQpzZChhcmVhKQ0KaGlzdChhcmVhKQ0KDQojIGFyZWEgaXMgdGhlIGxpdmluZyBhcmVhIG9mIHRoZSBob3VzZSBpbiBzcS4gZnQuDQojIHByaWNlIGlzIHRoZSBzYWxlIHByaWNlIG9mIHRoZSBob3VzZQ0KYGBgDQoNCiMjIyBFeGVyY2lzZSAyDQoNClRoaXMgZGlzdHJpYnV0aW9uIGhhcyBhIHNpbWlsYXIgc2hhcGUsIGEgbWVhbiBvZiAxNDU1LCBhbmQgYSBzZCBvZiA1MTYuODMzLA0Kd2hpY2ggYXJlIGFsbCB2ZXJ5IHNpbWlsYXIuDQoNCmBgYHtyIGNvZGUtY2h1bmstMn0NCnNldC5zZWVkKDI3KQ0Kc2FtcDEgPC0gc2FtcGxlKGFyZWEsIDUwKQ0Kc3VtbWFyeShzYW1wMSkNCnNkKHNhbXAxKQ0KaGlzdChzYW1wMSkNCmBgYA0KDQojIyMgRXhlcmNpc2UgMw0KDQpUaGUgbWVhbiBvZiBzYW1wMiBpcyAxNDMyLCB3aGljaCBpcyBkaWZmZXJlbnQsIGJ1dCBzdGlsbCBwcmV0dHkgY2xvc2UgdG8gc2FtcDEuDQpJIGJlbGlldmUgdGhhdCB0aGUgc2FtcGxlcyB3b3VsZCBwcm92aWRlIGVzdGltYXRlcyBvZiB0aGUgcG9wdWxhdGlvbiBtZWFuDQp3aXRoIGluY3JlYXNpbmcgYWNjdXJhY3kgYXMgdGhlIHNhbXBsZSBzaXplIGluY3JlYXNlcyBkdWUgdG8gQmVybm91bGxpJ3Mgd2Vhaw0KbGF3IG9mIGxhcmdlIG51bWJlcnMuDQoNCmBgYHtyIGNvZGUtY2h1bmstM30NCnNldC5zZWVkKDM2KQ0Kc2FtcDIgPC0gc2FtcGxlKGFyZWEsNTApDQpzdW1tYXJ5KHNhbXAyKQ0Kc2Qoc2FtcDIpDQpoaXN0KHNhbXAyKQ0KYGBgDQoNCiMjIyBFeGVyY2lzZSA0DQoNCkkgYmVsaWV2ZSB0aGF0IHRoZXJlIGFyZSA1MDAwICJudW0iIGVsZW1lbnRzIGluIHRoZSB2YXJpYWJsZSBzYW1wbGVfbWVhbnM1MA0KYXMgc2hvd24gaW4gdGhlIGdsb2JhbCBlbnZpcm9ubWVudC4NCg0KSW50ZXJlc3RpbmdseSwgdGhlIHNhbXBsaW5nIGRpc3RyaWJ1dGlvbiBoYXMgYSBtZWFuIG9mIGV4YWN0bHkgMTUwMCwgd2hpY2ggaXMNCnRoZSBleGFjdCBzYW1lIGFzIHRoZSBwb3B1bGF0aW9uIG1lYW4uIFRoZSBzaGFwZSBpcyBhcHByb3hpbWF0ZWx5IG5vcm1hbCwgd2hpY2gNCnRoZSBRLVEgcGxvdCBjb25maXJtcywgYnV0IEknbSBub3Qgc3VyZSBob3cgdG8gaW50ZXJwcmV0IHRoZSBTaGFwaXJvLVdpbGsgdGVzdA0KcmVzdWx0cy4gVGhlIHN0YW5kYXJkIGVycm9yIGlzIDcwLjc3MyBzcXVhcmUgZmVldC4NCg0KYGBge3IgY29kZS1jaHVuay00fQ0Kc2V0LnNlZWQoNjQpDQpzYW1wbGVfbWVhbnM1MCA8LSByZXAoTkEsIDUwMDApDQoNCmZvcihpIGluIDE6NTAwMCl7DQogICBzYW1wIDwtIHNhbXBsZShhcmVhLCA1MCkNCiAgIHNhbXBsZV9tZWFuczUwW2ldIDwtIG1lYW4oc2FtcCkNCiAgIH0NCg0KaGlzdChzYW1wbGVfbWVhbnM1MCwgYnJlYWtzID0gMjUpDQoNCnN1bW1hcnkoc2FtcGxlX21lYW5zNTApDQpzZChzYW1wbGVfbWVhbnM1MCkNCnFxbm9ybShzYW1wbGVfbWVhbnM1MCkNCnFxbGluZShzYW1wbGVfbWVhbnM1MCkNCnNoYXBpcm8udGVzdChzYW1wbGVfbWVhbnM1MCkNCmBgYA0KDQojIyMgRXhlcmNpc2UgNQ0KDQpUaGVyZSBhcmUgMTAwIGVsZW1lbnRzIGluIHRoZSBvYmplY3Qgc2FtcGxlX21lYW5zX3NtYWxsLiBFYWNoDQplbGVtZW50IGlzIGEgc2FtcGxlIG1lYW4gZm9yIG9uZSBvZiB0aGUgcmVwZWF0ZWQgc2FtcGxlcy4gSSdtIHJlYWxseSBsb3ZpbmcNCnRoaXMgYmVjYXVzZSBub3cgSSBjYW4gc2VlIGhvdyB3ZSB1c2UgZm9yIGxvb3BzIHNpbWlsYXJseSB3aXRoIE1hdGxhYiBhbmQNCmdldCBzaW1pbGFyIG91dHB1dHMgaW4gdGhlIGNvbnNvbGUgKHRoZXkgaGF2ZSBhbG1vc3QgdGhlIGV4YWN0IHNhbWUgc3ludGF4KSENCkFsc28gdGhlIFNoYXBpcm8tV2lsayB0ZXN0IGlzIGEgbG90IGVhc2llciB0byBpbnRlcnByZXQgaGVyZSBiZWNhdXNlIHAgaXMNCmNsZWFybHkgZ3JlYXRlciB0aGFuIC4xIGFuZCB0aGVyZXMgbm8gY29uZnVzaW5nIGV4cG9uZW50cy4NCg0KYGBge3IgY29kZS1jaHVuay01fQ0Kc2V0LnNlZWQoODEpDQpzYW1wbGVfbWVhbnNfc21hbGwgPC0gcmVwKE5BLCAxMDApDQoNCmZvcihpIGluIDE6MTAwKXsNCiAgc2FtcF9zbWFsbCA8LSBzYW1wbGUoYXJlYSwgNTApDQogIHNhbXBsZV9tZWFuc19zbWFsbFtpXSA8LSBtZWFuKHNhbXBfc21hbGwpDQp9DQoNCmhpc3Qoc2FtcGxlX21lYW5zX3NtYWxsKQ0KDQpzdW1tYXJ5KHNhbXBsZV9tZWFuc19zbWFsbCkNCnNkKHNhbXBsZV9tZWFuc19zbWFsbCkNCnFxbm9ybShzYW1wbGVfbWVhbnNfc21hbGwpDQpxcWxpbmUoc2FtcGxlX21lYW5zX3NtYWxsKQ0Kc2hhcGlyby50ZXN0KHNhbXBsZV9tZWFuc19zbWFsbCkNCg0Kc2FtcGxlX21lYW5zX3NtYWxsDQpgYGANCg0KIyMjIEV4ZXJjaXNlIDYNCg0KVGhlIG1lYW5zIHdlcmVuJ3Qgc2lnbmlmaWNhbnRseSBkaWZmZXJlbnQgYmV0d2VlbiB0aGUgZGlzdHJpYnV0aW9uczogYXQgMTUwMiBmdF4yLA0KdGhlbiAxNTAwIGZ0XjIsIHRoZW4gMTQ5OSBmdF4yLiBJdCBhY3R1YWxseSB3YXMgbGVzcyBhY2N1cmF0ZSBvbiB0aGUgZmluYWwgbGFyZ2VyIHNhbXBsZQ0Kc2l6ZS4gSSBiZWxpZXZlIHRoaXMgaXMgYmVjYXVzZSByZWdhcmRsZXNzIG9mIHRoZSBzYW1wbGUgc2l6ZSwgdGhlIG1lYW4gb2YNCmEgc2FtcGxpbmcgZGlzdHJpYnV0aW9uIChzYW1wbGluZyBtZWFuKSBpcyByZWxhdGl2ZWx5IGNsb3NlIHRvIHRoZSBwb3B1bGF0aW9uIA0KbWVhbiB3aGVuIGl0ZXJhdGVkIHN1ZmZpY2llbnRseSAoYW5kIGVhY2ggb2YgdGhlc2VzIHdlcmUgaXRlcmF0ZWQgNTAwMCB0aW1lcykuICANCg0KVGhlIHNwcmVhZHMsIGhvd2V2ZXIsIGRvIGRyYXN0aWNhbGx5IGRlY3JlYXNlLCBhbmQgY2xlYXJseSB0aGUgc3RhbmRhcmQNCmVycm9yIGlzIGRlY3JlYXNpbmcgYXMgdGhlIHNhbXBsZSBzaXplIGlzIGluY3JlYXNpbmcuDQoNCmBgYHtyIGNvZGUtY2h1bmstNn0NCnNldC5zZWVkKDEyMSkNCg0Kc2FtcGxlX21lYW5zMTAgPC0gcmVwKE5BLCA1MDAwKQ0Kc2FtcGxlX21lYW5zMTAwIDwtIHJlcChOQSwgNTAwMCkNCg0KZm9yKGkgaW4gMTo1MDAwKXsNCiAgc2FtcCA8LSBzYW1wbGUoYXJlYSwgMTApDQogIHNhbXBsZV9tZWFuczEwW2ldIDwtIG1lYW4oc2FtcCkNCiAgc2FtcCA8LSBzYW1wbGUoYXJlYSwgMTAwKQ0KICBzYW1wbGVfbWVhbnMxMDBbaV0gPC0gbWVhbihzYW1wKQ0KfQ0KDQpwYXIobWZyb3cgPSBjKDMsIDEpKQ0KDQp4bGltaXRzIDwtIHJhbmdlKHNhbXBsZV9tZWFuczEwKQ0KDQpoaXN0KHNhbXBsZV9tZWFuczEwLCBicmVha3MgPSAyMCwgeGxpbSA9IHhsaW1pdHMpDQpoaXN0KHNhbXBsZV9tZWFuczUwLCBicmVha3MgPSAyMCwgeGxpbSA9IHhsaW1pdHMpDQpoaXN0KHNhbXBsZV9tZWFuczEwMCwgYnJlYWtzID0gMjAsIHhsaW0gPSB4bGltaXRzKQ0KDQpzdW1tYXJ5KHNhbXBsZV9tZWFuczEwKQ0Kc3VtbWFyeShzYW1wbGVfbWVhbnM1MCkNCnN1bW1hcnkoc2FtcGxlX21lYW5zMTAwKQ0KYGBgDQoNCiMjIyBPbiBZb3VyIE93bg0KDQoxLiBUaGUgYmVzdCBlc3RpbWF0ZSBJIGhhdmUgaXMgJDE4MCwwNDMgZm9yIHRoZSBtZWFuIHNhbGUgcHJpY2UuDQoNCmBgYHtyIGNvZGUtY2h1bmstb3lvMX0NCnNldC5zZWVkKDE0NCkNCnNhbXBfcHJpY2UgPC0gc2FtcGxlKHByaWNlLCA1MCkNCm1lYW4oc2FtcF9wcmljZSkNCmBgYA0KDQoyLiBUaGUgc2FtcGxpbmcgbWVhbiAod2hpY2ggZXN0aW1hdGVzIHRoZSBwb3B1bGF0aW9uIG1lYW4pIGlzICQxODAsOTk0Lg0KICAgIFRoZSB0cnVlIHBvcHVsYXRpb24gbWVhbiBpcyAkMTgwLDc5Niwgd2hpY2ggaXMgcmVhbGx5IGNsb3NlIHRvIG91ciBlc3RpbWF0ZSENCg0KYGBge3IgY29kZS1jaHVuay1veW8yfQ0Kc2V0LnNlZWQoMTY5KQ0KDQpzYW1wbGVfbWVhbnNfYWdhaW4gPC0gcmVwKE5BLCA1MDAwKQ0KDQpmb3IoaSBpbiAxOjUwMDApew0KICBzYW1wX3ByaWNlX2FnYWluIDwtIHNhbXBsZShwcmljZSwgNTApDQogIHNhbXBsZV9tZWFuc19hZ2FpbltpXSA8LSBtZWFuKHNhbXBfcHJpY2VfYWdhaW4pDQp9DQoNCmhpc3Qoc2FtcGxlX21lYW5zX2FnYWluKQ0KbWVhbihzYW1wbGVfbWVhbnNfYWdhaW4pDQptZWFuKHByaWNlKQ0Kc2Qoc2FtcGxlX21lYW5zX2FnYWluKQ0KYGBgDQoNCjMuIFRoaXMgc2FtcGxpbmcgZGlzdHJpYnV0aW9uIHByZWRpY3RzIHRoZSBtZWFuIHByaWNlIHRvIGJlICQxODAsNjUwLCB3aGljaA0KICAgIGlzIGV2ZW4gY2xvc2VyIHRoYW4gdGltZSwgYnV0IG5vdCBieSBhIHNpZ25pZmljYW50IG1hcmdpbi4gSSBzdXBwb3NlIHRoaXMNCiAgICBpbGx1c3RyYXRlcyB3aHkgb25jZSB5b3UgcmVhY2ggYSAic3VmZmljaWVudGx5IGxhcmdlIiBzYW1wbGUgc2l6ZSwgeW91DQogICAgZG9uJ3QgbmVlZCB0byB0YWtlIHNhbXBsZXMgb2YgYW55IGxhcmdlciBzaXplLCBvdGhlcndpc2UgaXQgbWF5IGVpdGhlcg0KICAgIGJlIG1vcmUgZWZmb3J0IHRoYW4gaXRzIHdvcnRoLCBvciBtZXNzIHVwIHlvdXIgZGF0YSBieSBiZWluZyBub24tcmFuZG9tLg0KDQpgYGB7ciBjb2RlLWNodW5rLW95bzN9DQpzZXQuc2VlZCgxOTYpDQoNCnNhbXBsZV9tZWFuc19hZ2Fpbl9hZ2FpbiA8LSByZXAoTkEsIDUwMDApDQoNCmZvcihpIGluIDE6NTAwMCl7DQogIHNhbXBfcHJpY2VfYWdhaW5fYWdhaW4gPC0gc2FtcGxlKHByaWNlLCAxNTApDQogIHNhbXBsZV9tZWFuc19hZ2Fpbl9hZ2FpbltpXSA8LSBtZWFuKHNhbXBfcHJpY2VfYWdhaW5fYWdhaW4pDQp9DQoNCmhpc3Qoc2FtcGxlX21lYW5zX2FnYWluX2FnYWluKQ0KbWVhbihzYW1wbGVfbWVhbnNfYWdhaW5fYWdhaW4pDQptZWFuKHByaWNlKQ0Kc2Qoc2FtcGxlX21lYW5zX2FnYWluX2FnYWluKQ0KYGBgDQoNCjQuIFRoZSBzYW1wbGluZyBkaXN0cmlidXRpb24gd2l0aCBuPTE1MCBoYXMgc2QgPSA2Mjc0Ljc0Nywgd2hlcmVhcyB0aGUgc2FtcGxpbmcNCiAgICBkaXN0cmlidXRpb24gd2l0aCBuPTUwIGhhcyBzZCA9IDExMDY5Ljc0LCBhbmQgdGhlcmVmb3JlIHRoZSBzYW1wbGluZw0KICAgIGRpc3RyaWJ1dGlvbiB3aXRoIHRoZSBsYXJnZXIgc2FtcGxlIHNpemUgaGFzIHRoZSBzbWFsbGVyIHNwcmVhZC4gSWYgd2Ugd2FudA0KICAgIHRvIG1ha2UgZXN0aW1hdGVzIHRoYXQgYXJlIG1vcmUgb2Z0ZW4gY2xvc2UgdG8gdGhlIHRydWUgdmFsdWUsIHdlIHByZWZlcg0KICAgIGEgc2FtcGxpbmcgZGlzdHJpYnV0aW9uIHdpdGggYSBzbWFsbGVyIHNwcmVhZCwgYmVjYXVzZSB0aGF0IG1lYW5zIHRoYXQgdGhlDQogICAgbGlrZWxpaG9vZCB0aGF0IHdlIHdpbGwgYmUgZmFydGhlciBhd2F5IGZyb20gdGhlIHRydWUgcG9wdWxhdGlvbiBtZWFuIGlzIGxlc3Mu