library(tidyverse)
library(openintro)
library(infer)

global_monitor <- tibble(
  scientist_work = c(rep("Benefits", 80000), rep("Doesn't benefit", 20000))
)

global_monitor %>%
  count(scientist_work) %>%
  mutate(p = n /sum(n))
## # A tibble: 2 x 3
##   scientist_work      n     p
##   <chr>           <int> <dbl>
## 1 Benefits        80000   0.8
## 2 Doesn't benefit 20000   0.2

Exercise 1

samp1 <- global_monitor %>%
  sample_n(50)
samp1 %>%
  count(scientist_work) %>%
  mutate(pct = n /sum(n))
## # A tibble: 2 x 3
##   scientist_work      n   pct
##   <chr>           <int> <dbl>
## 1 Benefits           35   0.7
## 2 Doesn't benefit    15   0.3

Based on the results, the distribution of responses in the sample is very similar to (in a case it was the same as) the distribution of responses in the population.

Exercise 2

I would expect the sample proportion to be very close to another student’s sample proportion. There is a probability that they could match but I would expect the sample proportions to be distributed in a normal fashion.

Exercise 3

samp2 <- global_monitor %>%
  sample_n(50)
samp2 %>%
  count(scientist_work) %>%
  mutate(pct = n /sum(n))
## # A tibble: 2 x 3
##   scientist_work      n   pct
##   <chr>           <int> <dbl>
## 1 Benefits           43  0.86
## 2 Doesn't benefit     7  0.14

Both proportions are close but not the same. If we took two other samples, one of size 100 and another of size 1000, I would expect the bigger sample proportions to be closer to the population’s.

sample_props50 <- global_monitor %>%
                    rep_sample_n(size = 50, reps = 15000, replace = TRUE) %>%
                    count(scientist_work) %>%
                    mutate(p_hat = n /sum(n)) %>%
                    filter(scientist_work == "Doesn't benefit")

ggplot(data = sample_props50, aes(x = p_hat)) +
  geom_histogram(binwidth = 0.02, fill="blue") +
  labs(
    x = "p_hat (Doesn't benefit)",
    title = "Sampling distribution of p_hat",
    subtitle = "Sample size = 50, Number of samples = 15000"
  )

Exercise 4

There are 15000 samples in sampl50, the sample size for each is 50 and it shows a normal distribution, unimodal.

Exercise 5

sample_props_small <- global_monitor %>%
                    rep_sample_n(size = 10, reps = 25, replace = TRUE) %>%
                    count(scientist_work) %>%
                    mutate(p_hat = n /sum(n)) %>%
                    filter(scientist_work == "Doesn't benefit")

sample_props_small
## # A tibble: 21 x 4
## # Groups:   replicate [21]
##    replicate scientist_work      n p_hat
##        <int> <chr>           <int> <dbl>
##  1         1 Doesn't benefit     1   0.1
##  2         2 Doesn't benefit     4   0.4
##  3         3 Doesn't benefit     3   0.3
##  4         4 Doesn't benefit     1   0.1
##  5         5 Doesn't benefit     3   0.3
##  6         6 Doesn't benefit     3   0.3
##  7         8 Doesn't benefit     1   0.1
##  8         9 Doesn't benefit     2   0.2
##  9        11 Doesn't benefit     2   0.2
## 10        12 Doesn't benefit     2   0.2
## # ... with 11 more rows
ggplot(data = sample_props_small, aes(x = p_hat)) +
  geom_histogram(binwidth = 0.02, fill="green") +
  labs(
    x = "p_hat (Doesn't benefit)",
    title = "Sampling distribution of props_small",
    subtitle = "Sample size = 10, Number of samples = 25"
  )

There are ~22 observations. Each observation represent a sample size of 10 values from the population.

ggplot(data = sample_props50, aes(x = p_hat)) +
  geom_histogram(binwidth = 0.02)

Exercise 6

Use the app below to create sampling distributions of proportions of Doesn’t benefit from samples of size 10, 50, and 100. Use 5,000 simulations. What does each observation in the sampling distribution represent? How does the mean, standard error, and shape of the sampling distribution change as the sample size increases? How (if at all) do these values change if you increase the number of simulations? (You do not need to include plots in your answer.)

library(plotrix)
sample_props <- global_monitor %>%
                    rep_sample_n(size = 10, reps = 5000, replace = TRUE) %>%
                    count(scientist_work) %>%
                    mutate(p_hat = n /sum(n)) %>%
                    filter(scientist_work == "Doesn't benefit") 

values <- c( avg = mean(sample_props$p_hat), sd = sd(sample_props$p_hat, na.rm = TRUE), se = std.error(sample_props$p_hat, na.rm = TRUE))
values
##         avg          sd          se 
## 0.223213888 0.111582951 0.001664676
sample_props <- global_monitor %>%
                    rep_sample_n(size = 50, reps = 5000, replace = TRUE) %>%
                    count(scientist_work) %>%
                    mutate(p_hat = n /sum(n)) %>%
                    filter(scientist_work == "Doesn't benefit") 

values <- c( avg = mean(sample_props$p_hat), sd = sd(sample_props$p_hat, na.rm = TRUE), se = std.error(sample_props$p_hat, na.rm = TRUE))
values
##          avg           sd           se 
## 0.1989040000 0.0559619972 0.0007914222
sample_props <- global_monitor %>%
                    rep_sample_n(size = 100, reps = 5000, replace = TRUE) %>%
                    count(scientist_work) %>%
                    mutate(p_hat = n /sum(n)) %>%
                    filter(scientist_work == "Doesn't benefit") 

values <- c( avg = mean(sample_props$p_hat), sd = sd(sample_props$p_hat, na.rm = TRUE), se = std.error(sample_props$p_hat, na.rm = TRUE))
values
##          avg           sd           se 
## 0.1999720000 0.0400674468 0.0005666393

As we increase the sample size, the mean gets closer to 0.20 and the standard error gets smaller, approaching 0.

Exercise 7

Take a sample of size 15 from the population and calculate the proportion of people in this sample who think the work scientists do enchances their lives. Using this sample, what is your best point estimate of the population proportion of people who think the work scientists do enchances their lives?

set.seed(50)
sampl_15 <- global_monitor %>%
  sample_n(15) %>%
  count(scientist_work) %>%
  mutate(pct = n /sum(n))

sampl_15
## # A tibble: 2 x 3
##   scientist_work      n   pct
##   <chr>           <int> <dbl>
## 1 Benefits           11 0.733
## 2 Doesn't benefit     4 0.267

Using these values, I would estimate that 73% of the population think the work scientists do enhances their lives.

Exercise 8

Since you have access to the population, simulate the sampling distribution of proportion of those who think the work scientists do enchances their lives for samples of size 15 by taking 2000 samples from the population of size 15 and computing 2000 sample proportions. Store these proportions in as sample_props15.

set.seed(Sys.time())  #remove previous seed 
sample_props15 <- global_monitor %>%
                    rep_sample_n(size = 15, reps = 2000, replace = TRUE) %>%
                    count(scientist_work) %>%
                    mutate(p_hat = n /sum(n)) %>%
                    filter(scientist_work == "Benefits") 

Plot the data, then describe the shape of this sampling distribution.

ggplot(data = sample_props15, aes(x = p_hat)) +
  geom_histogram(binwidth = 0.02, fill="orange") 

The resulting histogram is left skewed, unimodal and approximates a normal distribution.

Based on this sampling distribution, what would you guess the true proportion of those who think the work scientists do enchances their lives to be? Finally, calculate and report the population proportion.

By looking at this sampling distribution, I would guess 80% is the true proportion.

global_monitor %>%
  count(scientist_work) %>%
  mutate(pct = n /sum(n))
## # A tibble: 2 x 3
##   scientist_work      n   pct
##   <chr>           <int> <dbl>
## 1 Benefits        80000   0.8
## 2 Doesn't benefit 20000   0.2

Exercise 9

Change your sample size from 15 to 150, then compute the sampling distribution using the same method as above, and store these proportions in a new object called sample_props150.

sample_props150 <- global_monitor %>%
                    rep_sample_n(size = 150, reps = 2000, replace = TRUE) %>%
                    count(scientist_work) %>%
                    mutate(p_hat = n /sum(n)) %>%
                    filter(scientist_work == "Benefits") 

Describe the shape of this sampling distribution and compare it to the sampling distribution for a sample size of 15.

ggplot(data = sample_props150, aes(x = p_hat)) +
  geom_histogram(binwidth = 0.02, fill="purple") 

This distribution is normal, unimodal.

Based on this sampling distribution, what would you guess to be the true proportion of those who think the work scientists do enchances their lives?

Around 80%

Exercise 10

Of the sampling distributions from 2 and 3, which has a smaller spread? If you’re concerned with making estimates that are more often close to the true value, would you prefer a sampling distribution with a large or small spread?

The bigger sample size has a smaller spread. I would prefer a sampling distribution with a small spread.

LS0tDQp0aXRsZTogIkRTNjA2IC0gTGFiNSINCmF1dGhvcjogIkdlb3JnZSBDcnV6Ig0KZGF0ZTogImByIFN5cy5EYXRlKClgIg0Kb3V0cHV0OiBvcGVuaW50cm86OmxhYl9yZXBvcnQNCi0tLQ0KDQpgYGB7ciBsb2FkLXBhY2thZ2VzLCBtZXNzYWdlPUZBTFNFfQ0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KG9wZW5pbnRybykNCmxpYnJhcnkoaW5mZXIpDQoNCmdsb2JhbF9tb25pdG9yIDwtIHRpYmJsZSgNCiAgc2NpZW50aXN0X3dvcmsgPSBjKHJlcCgiQmVuZWZpdHMiLCA4MDAwMCksIHJlcCgiRG9lc24ndCBiZW5lZml0IiwgMjAwMDApKQ0KKQ0KDQpnbG9iYWxfbW9uaXRvciAlPiUNCiAgY291bnQoc2NpZW50aXN0X3dvcmspICU+JQ0KICBtdXRhdGUocCA9IG4gL3N1bShuKSkNCg0KYGBgDQoNCiMjIyBFeGVyY2lzZSAxDQoNCg0KYGBge3IgY29kZS1jaHVuay1sYWJlbH0NCnNhbXAxIDwtIGdsb2JhbF9tb25pdG9yICU+JQ0KICBzYW1wbGVfbig1MCkNCnNhbXAxICU+JQ0KICBjb3VudChzY2llbnRpc3Rfd29yaykgJT4lDQogIG11dGF0ZShwY3QgPSBuIC9zdW0obikpDQpgYGANCg0KQmFzZWQgb24gdGhlIHJlc3VsdHMsIHRoZSBkaXN0cmlidXRpb24gb2YgcmVzcG9uc2VzIGluIHRoZSBzYW1wbGUgaXMgdmVyeSBzaW1pbGFyIHRvIChpbiBhIGNhc2UgaXQgd2FzIHRoZSBzYW1lIGFzKSB0aGUgZGlzdHJpYnV0aW9uIG9mIHJlc3BvbnNlcyBpbiB0aGUgcG9wdWxhdGlvbi4gDQoNCiMjIyBFeGVyY2lzZSAyDQpJIHdvdWxkIGV4cGVjdCB0aGUgc2FtcGxlIHByb3BvcnRpb24gdG8gYmUgdmVyeSBjbG9zZSB0byBhbm90aGVyIHN0dWRlbnQncyBzYW1wbGUgcHJvcG9ydGlvbi4gVGhlcmUgaXMgYSBwcm9iYWJpbGl0eSB0aGF0IHRoZXkgY291bGQgbWF0Y2ggYnV0IEkgd291bGQgZXhwZWN0IHRoZSBzYW1wbGUgcHJvcG9ydGlvbnMgdG8gYmUgZGlzdHJpYnV0ZWQgaW4gYSBub3JtYWwgZmFzaGlvbi4NCg0KDQojIyMgRXhlcmNpc2UgMw0KYGBge3J9DQpzYW1wMiA8LSBnbG9iYWxfbW9uaXRvciAlPiUNCiAgc2FtcGxlX24oNTApDQpzYW1wMiAlPiUNCiAgY291bnQoc2NpZW50aXN0X3dvcmspICU+JQ0KICBtdXRhdGUocGN0ID0gbiAvc3VtKG4pKQ0KYGBgDQoNCkJvdGggcHJvcG9ydGlvbnMgYXJlIGNsb3NlIGJ1dCBub3QgdGhlIHNhbWUuICBJZiB3ZSB0b29rIHR3byBvdGhlciBzYW1wbGVzLCBvbmUgb2Ygc2l6ZSAxMDAgYW5kIGFub3RoZXIgb2Ygc2l6ZSAxMDAwLCBJIHdvdWxkIGV4cGVjdCB0aGUgYmlnZ2VyIHNhbXBsZSBwcm9wb3J0aW9ucyB0byBiZSBjbG9zZXIgdG8gdGhlIHBvcHVsYXRpb24ncy4NCg0KYGBge3J9DQpzYW1wbGVfcHJvcHM1MCA8LSBnbG9iYWxfbW9uaXRvciAlPiUNCiAgICAgICAgICAgICAgICAgICAgcmVwX3NhbXBsZV9uKHNpemUgPSA1MCwgcmVwcyA9IDE1MDAwLCByZXBsYWNlID0gVFJVRSkgJT4lDQogICAgICAgICAgICAgICAgICAgIGNvdW50KHNjaWVudGlzdF93b3JrKSAlPiUNCiAgICAgICAgICAgICAgICAgICAgbXV0YXRlKHBfaGF0ID0gbiAvc3VtKG4pKSAlPiUNCiAgICAgICAgICAgICAgICAgICAgZmlsdGVyKHNjaWVudGlzdF93b3JrID09ICJEb2Vzbid0IGJlbmVmaXQiKQ0KDQpnZ3Bsb3QoZGF0YSA9IHNhbXBsZV9wcm9wczUwLCBhZXMoeCA9IHBfaGF0KSkgKw0KICBnZW9tX2hpc3RvZ3JhbShiaW53aWR0aCA9IDAuMDIsIGZpbGw9ImJsdWUiKSArDQogIGxhYnMoDQogICAgeCA9ICJwX2hhdCAoRG9lc24ndCBiZW5lZml0KSIsDQogICAgdGl0bGUgPSAiU2FtcGxpbmcgZGlzdHJpYnV0aW9uIG9mIHBfaGF0IiwNCiAgICBzdWJ0aXRsZSA9ICJTYW1wbGUgc2l6ZSA9IDUwLCBOdW1iZXIgb2Ygc2FtcGxlcyA9IDE1MDAwIg0KICApDQpgYGANCg0KIyMjIEV4ZXJjaXNlIDQNClRoZXJlIGFyZSAxNTAwMCBzYW1wbGVzIGluIHNhbXBsNTAsIHRoZSBzYW1wbGUgc2l6ZSBmb3IgZWFjaCBpcyA1MCBhbmQgaXQgc2hvd3MgYSBub3JtYWwgZGlzdHJpYnV0aW9uLCB1bmltb2RhbC4NCg0KIyMjIEV4ZXJjaXNlIDUNCmBgYHtyfQ0Kc2FtcGxlX3Byb3BzX3NtYWxsIDwtIGdsb2JhbF9tb25pdG9yICU+JQ0KICAgICAgICAgICAgICAgICAgICByZXBfc2FtcGxlX24oc2l6ZSA9IDEwLCByZXBzID0gMjUsIHJlcGxhY2UgPSBUUlVFKSAlPiUNCiAgICAgICAgICAgICAgICAgICAgY291bnQoc2NpZW50aXN0X3dvcmspICU+JQ0KICAgICAgICAgICAgICAgICAgICBtdXRhdGUocF9oYXQgPSBuIC9zdW0obikpICU+JQ0KICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoc2NpZW50aXN0X3dvcmsgPT0gIkRvZXNuJ3QgYmVuZWZpdCIpDQoNCnNhbXBsZV9wcm9wc19zbWFsbA0KDQpnZ3Bsb3QoZGF0YSA9IHNhbXBsZV9wcm9wc19zbWFsbCwgYWVzKHggPSBwX2hhdCkpICsNCiAgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGggPSAwLjAyLCBmaWxsPSJncmVlbiIpICsNCiAgbGFicygNCiAgICB4ID0gInBfaGF0IChEb2Vzbid0IGJlbmVmaXQpIiwNCiAgICB0aXRsZSA9ICJTYW1wbGluZyBkaXN0cmlidXRpb24gb2YgcHJvcHNfc21hbGwiLA0KICAgIHN1YnRpdGxlID0gIlNhbXBsZSBzaXplID0gMTAsIE51bWJlciBvZiBzYW1wbGVzID0gMjUiDQogICkNCmBgYA0KDQoNClRoZXJlIGFyZSB+MjIgb2JzZXJ2YXRpb25zLiAgRWFjaCBvYnNlcnZhdGlvbiByZXByZXNlbnQgYSBzYW1wbGUgc2l6ZSBvZiAxMCB2YWx1ZXMgZnJvbSB0aGUgcG9wdWxhdGlvbi4gDQoNCmBgYHtyfQ0KZ2dwbG90KGRhdGEgPSBzYW1wbGVfcHJvcHM1MCwgYWVzKHggPSBwX2hhdCkpICsNCiAgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGggPSAwLjAyKQ0KYGBgDQoNCg0KIyMjIEV4ZXJjaXNlIDYNClVzZSB0aGUgYXBwIGJlbG93IHRvIGNyZWF0ZSBzYW1wbGluZyBkaXN0cmlidXRpb25zIG9mIHByb3BvcnRpb25zIG9mIERvZXNu4oCZdCBiZW5lZml0IGZyb20gc2FtcGxlcyBvZiBzaXplIDEwLCA1MCwgYW5kIDEwMC4gVXNlIDUsMDAwIHNpbXVsYXRpb25zLiBXaGF0IGRvZXMgZWFjaCBvYnNlcnZhdGlvbiBpbiB0aGUgc2FtcGxpbmcgZGlzdHJpYnV0aW9uIHJlcHJlc2VudD8gSG93IGRvZXMgdGhlIG1lYW4sIHN0YW5kYXJkIGVycm9yLCBhbmQgc2hhcGUgb2YgdGhlIHNhbXBsaW5nIGRpc3RyaWJ1dGlvbiBjaGFuZ2UgYXMgdGhlIHNhbXBsZSBzaXplIGluY3JlYXNlcz8gSG93IChpZiBhdCBhbGwpIGRvIHRoZXNlIHZhbHVlcyBjaGFuZ2UgaWYgeW91IGluY3JlYXNlIHRoZSBudW1iZXIgb2Ygc2ltdWxhdGlvbnM/IChZb3UgZG8gbm90IG5lZWQgdG8gaW5jbHVkZSBwbG90cyBpbiB5b3VyIGFuc3dlci4pDQpgYGB7cn0NCmxpYnJhcnkocGxvdHJpeCkNCnNhbXBsZV9wcm9wcyA8LSBnbG9iYWxfbW9uaXRvciAlPiUNCiAgICAgICAgICAgICAgICAgICAgcmVwX3NhbXBsZV9uKHNpemUgPSAxMCwgcmVwcyA9IDUwMDAsIHJlcGxhY2UgPSBUUlVFKSAlPiUNCiAgICAgICAgICAgICAgICAgICAgY291bnQoc2NpZW50aXN0X3dvcmspICU+JQ0KICAgICAgICAgICAgICAgICAgICBtdXRhdGUocF9oYXQgPSBuIC9zdW0obikpICU+JQ0KICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoc2NpZW50aXN0X3dvcmsgPT0gIkRvZXNuJ3QgYmVuZWZpdCIpIA0KDQp2YWx1ZXMgPC0gYyggYXZnID0gbWVhbihzYW1wbGVfcHJvcHMkcF9oYXQpLCBzZCA9IHNkKHNhbXBsZV9wcm9wcyRwX2hhdCwgbmEucm0gPSBUUlVFKSwgc2UgPSBzdGQuZXJyb3Ioc2FtcGxlX3Byb3BzJHBfaGF0LCBuYS5ybSA9IFRSVUUpKQ0KdmFsdWVzDQpgYGANCg0KYGBge3J9DQpzYW1wbGVfcHJvcHMgPC0gZ2xvYmFsX21vbml0b3IgJT4lDQogICAgICAgICAgICAgICAgICAgIHJlcF9zYW1wbGVfbihzaXplID0gNTAsIHJlcHMgPSA1MDAwLCByZXBsYWNlID0gVFJVRSkgJT4lDQogICAgICAgICAgICAgICAgICAgIGNvdW50KHNjaWVudGlzdF93b3JrKSAlPiUNCiAgICAgICAgICAgICAgICAgICAgbXV0YXRlKHBfaGF0ID0gbiAvc3VtKG4pKSAlPiUNCiAgICAgICAgICAgICAgICAgICAgZmlsdGVyKHNjaWVudGlzdF93b3JrID09ICJEb2Vzbid0IGJlbmVmaXQiKSANCg0KdmFsdWVzIDwtIGMoIGF2ZyA9IG1lYW4oc2FtcGxlX3Byb3BzJHBfaGF0KSwgc2QgPSBzZChzYW1wbGVfcHJvcHMkcF9oYXQsIG5hLnJtID0gVFJVRSksIHNlID0gc3RkLmVycm9yKHNhbXBsZV9wcm9wcyRwX2hhdCwgbmEucm0gPSBUUlVFKSkNCnZhbHVlcw0KYGBgDQoNCmBgYHtyfQ0Kc2FtcGxlX3Byb3BzIDwtIGdsb2JhbF9tb25pdG9yICU+JQ0KICAgICAgICAgICAgICAgICAgICByZXBfc2FtcGxlX24oc2l6ZSA9IDEwMCwgcmVwcyA9IDUwMDAsIHJlcGxhY2UgPSBUUlVFKSAlPiUNCiAgICAgICAgICAgICAgICAgICAgY291bnQoc2NpZW50aXN0X3dvcmspICU+JQ0KICAgICAgICAgICAgICAgICAgICBtdXRhdGUocF9oYXQgPSBuIC9zdW0obikpICU+JQ0KICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoc2NpZW50aXN0X3dvcmsgPT0gIkRvZXNuJ3QgYmVuZWZpdCIpIA0KDQp2YWx1ZXMgPC0gYyggYXZnID0gbWVhbihzYW1wbGVfcHJvcHMkcF9oYXQpLCBzZCA9IHNkKHNhbXBsZV9wcm9wcyRwX2hhdCwgbmEucm0gPSBUUlVFKSwgc2UgPSBzdGQuZXJyb3Ioc2FtcGxlX3Byb3BzJHBfaGF0LCBuYS5ybSA9IFRSVUUpKQ0KdmFsdWVzDQpgYGANCg0KQXMgd2UgaW5jcmVhc2UgdGhlIHNhbXBsZSBzaXplLCB0aGUgbWVhbiBnZXRzIGNsb3NlciB0byAwLjIwIGFuZCB0aGUgc3RhbmRhcmQgZXJyb3IgZ2V0cyBzbWFsbGVyLCBhcHByb2FjaGluZyAwLiANCg0KIyMjIEV4ZXJjaXNlIDcNClRha2UgYSBzYW1wbGUgb2Ygc2l6ZSAxNSBmcm9tIHRoZSBwb3B1bGF0aW9uIGFuZCBjYWxjdWxhdGUgdGhlIHByb3BvcnRpb24gb2YgcGVvcGxlIGluIHRoaXMgc2FtcGxlIHdobyB0aGluayB0aGUgd29yayBzY2llbnRpc3RzIGRvIGVuY2hhbmNlcyB0aGVpciBsaXZlcy4gVXNpbmcgdGhpcyBzYW1wbGUsIHdoYXQgaXMgeW91ciBiZXN0IHBvaW50IGVzdGltYXRlIG9mIHRoZSBwb3B1bGF0aW9uIHByb3BvcnRpb24gb2YgcGVvcGxlIHdobyB0aGluayB0aGUgd29yayBzY2llbnRpc3RzIGRvIGVuY2hhbmNlcyB0aGVpciBsaXZlcz8NCg0KYGBge3J9DQpzZXQuc2VlZCg1MCkNCnNhbXBsXzE1IDwtIGdsb2JhbF9tb25pdG9yICU+JQ0KICBzYW1wbGVfbigxNSkgJT4lDQogIGNvdW50KHNjaWVudGlzdF93b3JrKSAlPiUNCiAgbXV0YXRlKHBjdCA9IG4gL3N1bShuKSkNCg0Kc2FtcGxfMTUNCmBgYA0KDQpVc2luZyB0aGVzZSB2YWx1ZXMsIEkgd291bGQgZXN0aW1hdGUgdGhhdCA3MyUgb2YgdGhlIHBvcHVsYXRpb24gdGhpbmsgdGhlIHdvcmsgc2NpZW50aXN0cyBkbyBlbmhhbmNlcyB0aGVpciBsaXZlcy4gDQoNCiMjIyBFeGVyY2lzZSA4DQpTaW5jZSB5b3UgaGF2ZSBhY2Nlc3MgdG8gdGhlIHBvcHVsYXRpb24sIHNpbXVsYXRlIHRoZSBzYW1wbGluZyBkaXN0cmlidXRpb24gb2YgcHJvcG9ydGlvbiBvZiB0aG9zZSB3aG8gdGhpbmsgdGhlIHdvcmsgc2NpZW50aXN0cyBkbyBlbmNoYW5jZXMgdGhlaXIgbGl2ZXMgZm9yIHNhbXBsZXMgb2Ygc2l6ZSAxNSBieSB0YWtpbmcgMjAwMCBzYW1wbGVzIGZyb20gdGhlIHBvcHVsYXRpb24gb2Ygc2l6ZSAxNSBhbmQgY29tcHV0aW5nIDIwMDAgc2FtcGxlIHByb3BvcnRpb25zLiBTdG9yZSB0aGVzZSBwcm9wb3J0aW9ucyBpbiBhcyBzYW1wbGVfcHJvcHMxNS4gDQpgYGB7cn0NCnNldC5zZWVkKFN5cy50aW1lKCkpICAjcmVtb3ZlIHByZXZpb3VzIHNlZWQgDQpzYW1wbGVfcHJvcHMxNSA8LSBnbG9iYWxfbW9uaXRvciAlPiUNCiAgICAgICAgICAgICAgICAgICAgcmVwX3NhbXBsZV9uKHNpemUgPSAxNSwgcmVwcyA9IDIwMDAsIHJlcGxhY2UgPSBUUlVFKSAlPiUNCiAgICAgICAgICAgICAgICAgICAgY291bnQoc2NpZW50aXN0X3dvcmspICU+JQ0KICAgICAgICAgICAgICAgICAgICBtdXRhdGUocF9oYXQgPSBuIC9zdW0obikpICU+JQ0KICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoc2NpZW50aXN0X3dvcmsgPT0gIkJlbmVmaXRzIikgDQpgYGANCg0KDQpQbG90IHRoZSBkYXRhLCB0aGVuIGRlc2NyaWJlIHRoZSBzaGFwZSBvZiB0aGlzIHNhbXBsaW5nIGRpc3RyaWJ1dGlvbi4gDQpgYGB7cn0NCg0KZ2dwbG90KGRhdGEgPSBzYW1wbGVfcHJvcHMxNSwgYWVzKHggPSBwX2hhdCkpICsNCiAgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGggPSAwLjAyLCBmaWxsPSJvcmFuZ2UiKSANCmBgYA0KDQoqVGhlIHJlc3VsdGluZyBoaXN0b2dyYW0gaXMgbGVmdCBza2V3ZWQsIHVuaW1vZGFsIGFuZCBhcHByb3hpbWF0ZXMgYSBub3JtYWwgZGlzdHJpYnV0aW9uLioNCg0KKipCYXNlZCBvbiB0aGlzIHNhbXBsaW5nIGRpc3RyaWJ1dGlvbiwgd2hhdCB3b3VsZCB5b3UgZ3Vlc3MgdGhlIHRydWUgcHJvcG9ydGlvbiBvZiB0aG9zZSB3aG8gdGhpbmsgdGhlIHdvcmsgc2NpZW50aXN0cyBkbyBlbmNoYW5jZXMgdGhlaXIgbGl2ZXMgdG8gYmU/IEZpbmFsbHksIGNhbGN1bGF0ZSBhbmQgcmVwb3J0IHRoZSBwb3B1bGF0aW9uIHByb3BvcnRpb24uKioNCg0KQnkgbG9va2luZyBhdCB0aGlzIHNhbXBsaW5nIGRpc3RyaWJ1dGlvbiwgSSB3b3VsZCBndWVzcyA4MCUgaXMgdGhlIHRydWUgcHJvcG9ydGlvbi4NCg0KYGBge3J9DQpnbG9iYWxfbW9uaXRvciAlPiUNCiAgY291bnQoc2NpZW50aXN0X3dvcmspICU+JQ0KICBtdXRhdGUocGN0ID0gbiAvc3VtKG4pKQ0KYGBgDQojIyMgRXhlcmNpc2UgOQ0KKipDaGFuZ2UgeW91ciBzYW1wbGUgc2l6ZSBmcm9tIDE1IHRvIDE1MCwgdGhlbiBjb21wdXRlIHRoZSBzYW1wbGluZyBkaXN0cmlidXRpb24gdXNpbmcgdGhlIHNhbWUgbWV0aG9kIGFzIGFib3ZlLCBhbmQgc3RvcmUgdGhlc2UgcHJvcG9ydGlvbnMgaW4gYSBuZXcgb2JqZWN0IGNhbGxlZCBzYW1wbGVfcHJvcHMxNTAuKiogDQpgYGB7cn0NCnNhbXBsZV9wcm9wczE1MCA8LSBnbG9iYWxfbW9uaXRvciAlPiUNCiAgICAgICAgICAgICAgICAgICAgcmVwX3NhbXBsZV9uKHNpemUgPSAxNTAsIHJlcHMgPSAyMDAwLCByZXBsYWNlID0gVFJVRSkgJT4lDQogICAgICAgICAgICAgICAgICAgIGNvdW50KHNjaWVudGlzdF93b3JrKSAlPiUNCiAgICAgICAgICAgICAgICAgICAgbXV0YXRlKHBfaGF0ID0gbiAvc3VtKG4pKSAlPiUNCiAgICAgICAgICAgICAgICAgICAgZmlsdGVyKHNjaWVudGlzdF93b3JrID09ICJCZW5lZml0cyIpIA0KYGBgDQoNCg0KKipEZXNjcmliZSB0aGUgc2hhcGUgb2YgdGhpcyBzYW1wbGluZyBkaXN0cmlidXRpb24gYW5kIGNvbXBhcmUgaXQgdG8gdGhlIHNhbXBsaW5nIGRpc3RyaWJ1dGlvbiBmb3IgYSBzYW1wbGUgc2l6ZSBvZiAxNS4qKiANCmBgYHtyfQ0KZ2dwbG90KGRhdGEgPSBzYW1wbGVfcHJvcHMxNTAsIGFlcyh4ID0gcF9oYXQpKSArDQogIGdlb21faGlzdG9ncmFtKGJpbndpZHRoID0gMC4wMiwgZmlsbD0icHVycGxlIikgDQoNCmBgYA0KDQpUaGlzIGRpc3RyaWJ1dGlvbiBpcyBub3JtYWwsIHVuaW1vZGFsLiAgDQoNCioqQmFzZWQgb24gdGhpcyBzYW1wbGluZyBkaXN0cmlidXRpb24sIHdoYXQgd291bGQgeW91IGd1ZXNzIHRvIGJlIHRoZSB0cnVlIHByb3BvcnRpb24gb2YgdGhvc2Ugd2hvIHRoaW5rIHRoZSB3b3JrIHNjaWVudGlzdHMgZG8gZW5jaGFuY2VzIHRoZWlyIGxpdmVzPyoqDQoNCkFyb3VuZCA4MCUNCg0KIyMjIEV4ZXJjaXNlIDEwDQoqKk9mIHRoZSBzYW1wbGluZyBkaXN0cmlidXRpb25zIGZyb20gMiBhbmQgMywgd2hpY2ggaGFzIGEgc21hbGxlciBzcHJlYWQ/IElmIHlvdeKAmXJlIGNvbmNlcm5lZCB3aXRoIG1ha2luZyBlc3RpbWF0ZXMgdGhhdCBhcmUgbW9yZSBvZnRlbiBjbG9zZSB0byB0aGUgdHJ1ZSB2YWx1ZSwgd291bGQgeW91IHByZWZlciBhIHNhbXBsaW5nIGRpc3RyaWJ1dGlvbiB3aXRoIGEgbGFyZ2Ugb3Igc21hbGwgc3ByZWFkPyoqDQoNClRoZSBiaWdnZXIgc2FtcGxlIHNpemUgaGFzIGEgc21hbGxlciBzcHJlYWQuICBJIHdvdWxkIHByZWZlciBhIHNhbXBsaW5nIGRpc3RyaWJ1dGlvbiB3aXRoIGEgc21hbGwgc3ByZWFkLiANCg0KLi4uDQoNCg==