This is an R Markdown Notebook. When you execute code within the notebook, the results appear beneath the code.

Try executing this chunk by clicking the Run button within the chunk or by placing your cursor inside it and pressing Ctrl+Shift+Enter.

set.seed(1)
coin_flips <- rbinom(100, 1, .5)
coin_flips
  [1] 0 0 1 1 0 1 1 1 1 0 0 0 1 0 1 0 1 1 0 1 1 0 1 0 0 0 0 0 1 0 0 1 0 0 1 1 1 0 1 0 1 1 1 1 1 1 0 0 1 1
 [51] 0 1 0 0 0 0 0 1 1 0 1 0 0 0 1 0 0 1 0 1 0 1 0 0 0 1 1 0 1 1 0 1 0 0 1 0 1 0 0 0 0 0 1 1 1 1 0 0 1 1
Data <- data.frame(toss_number = (1:length(coin_flips)) , toss_result = coin_flips)
head(Data, 5)

frequencies <- function(vec) {
  len_vec <- length(vec)
  avg <- 1:len_vec
  
  for (i in 1:len_vec) {
    avg[i] <- length(which(vec[1:i]==1))/i
  }
  return(avg)
}

freq <-frequencies(coin_flips)
Data$avgs <- freq
head(Data, 5)

library(ggplot2)

ggplot(data=Data, aes(x=toss_number, y=avgs, group=1)) +
  geom_line() +
  geom_point()

set.seed(1)

sum <- runif(10000, min = 0, max = 1)

mean(sum)
[1] 0.500168
estimate_pi <-function(seed = 1, iterations = 100000000){
  set.seed(seed)
  x <- runif(n = iterations, min = 0, max = 1)
  val_of_g = sqrt(1-x^2)
  pi_over_four = mean(val_of_g)
  pi <- 4*pi_over_four
  return(pi)
}
estimate_pi()
[1] 3.141566
library('tidyverse')
Registered S3 methods overwritten by 'dbplyr':
  method         from
  print.tbl_lazy     
  print.tbl_sql      
── Attaching packages ───────────────────────────────────────────────────────────────── tidyverse 1.3.2 ──✔ tibble  3.1.8     ✔ dplyr   1.1.0
✔ tidyr   1.3.0     ✔ stringr 1.5.0
✔ readr   2.1.3     ✔ forcats 1.0.0
✔ purrr   1.0.1     ── Conflicts ──────────────────────────────────────────────────────────────────── tidyverse_conflicts() ──
✖ dplyr::filter() masks stats::filter()
✖ dplyr::lag()    masks stats::lag()
lottery <- function(seed = 1, iterations = 15000) {
  set.seed(seed)
  num1 <- floor(runif(n = iterations, min = 1, max = 4))
  num2 <- floor(runif(n = iterations, min = 1, max = 4))
  num3 <- floor(runif(n = iterations, min = 1, max = 4))
  
  sum <- num1 + num2 + num3
  
  ticket <- 100*num1 + 10*num2 + num3
  ticket <- as.data.frame(ticket)
  
  df <- ticket %>%
    group_by(ticket) %>%
    summarise(counts = n())
  
  df$ticket <- as.factor(df$ticket)
  p <- ggplot(df, aes(x = ticket, y = counts)) +
    geom_bar(fill = "#0073C2FF", stat='identity') +
    theme_bw()
  print(p)
  
  return(list(df, table(sum)))
}

lottery()
[[1]]

[[2]]
sum
   3    4    5    6    7    8    9 
 539 1707 3251 3940 3346 1662  555 

set.seed(40)

#Problem 1
#coin_flips <- rbinom(12, 1, .5)
#coin_flips

a <- (choose(12,7)*(.5^7)*(1-.5)^(12-7))
print(a)
[1] 0.1933594
#a) -> 0.1933594

coin_flips <- rbinom(1000000, 12, .5)
Data <- data.frame(toss_number = (1:length(coin_flips)) , toss_result = coin_flips)
head(Data, 5)

#B

Data_2 <- as.data.frame(table(coin_flips))
head(Data_2, 12)


library(ggplot2)

ggplot(data=Data_2, aes(x=coin_flips, y=Freq, group=1)) +
  geom_line() +
  geom_point()


#C
#This aligns with the frequentist view of probability because we see that over a large number of trials, the frequency of 7 was 193733. 193733/1000000 is .193733. This is close to the number we saw earlier, proving this view.
#D
e_of_x <- 1000000 * .5
ob_avg <- function(vec) {
  len_vec <- length(vec)
  avg <- 0
  
  for (i in 1:len_vec) {
    avg <- vec[i] + avg
  }
  return(avg/len_vec)
}
print(e_of_x/length(coin_flips))
[1] 0.5
ob_avg(coin_flips)
[1] 5.999175
#E
#These observations do match up with the law of large numbers. We can see that these value are very similar, meaning that over a large sample size, the actual mean = expected value, which is the law of large numbers.
#Problem 2

normal_dis <- rnorm(1000000, 4, 1)

Data_n <- data.frame(Number = (1:length(normal_dis)), Result = normal_dis)
head(Data, 10)

#E(x) = 4 by definition of normal distributions
ob_avg(normal_dis)
[1] 4.000485
#These values are very similar, verifying again the law of large numbers for normal distribution

exp_dis <- rexp(1000000, 4)
Data_n <- data.frame(Number = (1:length(exp_dis)), Result = exp_dis)
head(Data, 10)

#E(x) = the integral from 0 to infinity x*lambda*e^-(lambda*x)
#In this case, evaluates to 1/4 or .25
ob_avg(exp_dis)
[1] 0.2503367
#Once again, we have verified the law of large numbers, by acheiving a number very close to the expected value.
#Problem 3-- relative frequency

library('tidyverse')

lottery <- function(seed = 1, iterations = 15000) {
  set.seed(seed)
  num1 <- floor(runif(n = iterations, min = 1, max = 4))
  num2 <- floor(runif(n = iterations, min = 1, max = 4))
  num3 <- floor(runif(n = iterations, min = 1, max = 4))
  
  sum <- num1 + num2 + num3
  
  ticket <- 100*num1 + 10*num2 + num3
  ticket <- as.data.frame(ticket)
  
  df <- ticket %>%
    group_by(ticket) %>%
    summarise(counts = n()/15000)
  
  df$ticket <- as.factor(df$ticket)
  p <- ggplot(df, aes(x = ticket, y = counts)) +
    geom_bar(fill = "#0073C2FF", stat='identity') +
    theme_bw()
  print(p)
  
  return(list(df, table(sum)))
}

lottery()
[[1]]

[[2]]
sum
   3    4    5    6    7    8    9 
 539 1707 3251 3940 3346 1662  555 

set.seed(40)

#problem 4
estimate_pi <-function(seed = 40, iterations = 100000000){
  set.seed(seed)
  x <- runif(n = iterations, min = -1, max = 1)
  val_of_g = sqrt(1-(x^2))
  
  pi_over_two = 2 * mean(val_of_g)
  
  pi <- 2*pi_over_two
  
  return(pi)
}
estimate_pi()
[1] 3.141513
#Problem 5
set.seed(40)

X <- rbinom(10000, 12, .25)
Y <- rbinom(10000, 18, .25)

Z <- rbinom(10000, 30, .25)

Data_x <- as.data.frame(table(X))
head(Data_x, 12)

Data_y <- as.data.frame(table(Y))
head(Data_y, 12)

Data_z <- as.data.frame(table(Z))
head(Data_z, 12)

p <- ggplot(Data_x, aes(x = X, y = Freq/10000)) +
  geom_bar(fill = "#0073C2FF", stat='identity') +
  theme_bw()
print(p)


p2 <- ggplot(Data_y, aes(x = Y, y = Freq/10000)) +
  geom_bar(fill = "#0073C2FF", stat='identity') +
  theme_bw()
print(p2)


p3 <- ggplot(Data_z, aes(x = Z, y = Freq/10000)) +
  geom_bar(fill = "#0073C2FF", stat='identity') +
  theme_bw()
print(p3)

#X has the highest frequency at 3, Y at 4, and Z (ie rbinom(10000, 30, .25)) at 7. 
# By law of large numbers, X and Y will even out to 3 and 4, and so X+Y = 7 = Z. Thus, these frequencies show that they are roughly equivalent.

Add a new chunk by clicking the Insert Chunk button on the toolbar or by pressing Ctrl+Alt+I.

When you save the notebook, an HTML file containing the code and output will be saved alongside it (click the Preview button or press Ctrl+Shift+K to preview the HTML file).

The preview shows you a rendered HTML copy of the contents of the editor. Consequently, unlike Knit, Preview does not run any R code chunks. Instead, the output of the chunk when it was last run in the editor is displayed.

LS0tDQp0aXRsZTogIlIgTm90ZWJvb2siDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQpUaGlzIGlzIGFuIFtSIE1hcmtkb3duXShodHRwOi8vcm1hcmtkb3duLnJzdHVkaW8uY29tKSBOb3RlYm9vay4gV2hlbiB5b3UgZXhlY3V0ZSBjb2RlIHdpdGhpbiB0aGUgbm90ZWJvb2ssIHRoZSByZXN1bHRzIGFwcGVhciBiZW5lYXRoIHRoZSBjb2RlLiANCg0KVHJ5IGV4ZWN1dGluZyB0aGlzIGNodW5rIGJ5IGNsaWNraW5nIHRoZSAqUnVuKiBidXR0b24gd2l0aGluIHRoZSBjaHVuayBvciBieSBwbGFjaW5nIHlvdXIgY3Vyc29yIGluc2lkZSBpdCBhbmQgcHJlc3NpbmcgKkN0cmwrU2hpZnQrRW50ZXIqLiANCg0KYGBge3J9DQpzZXQuc2VlZCgxKQ0KY29pbl9mbGlwcyA8LSByYmlub20oMTAwLCAxLCAuNSkNCmNvaW5fZmxpcHMNCg0KRGF0YSA8LSBkYXRhLmZyYW1lKHRvc3NfbnVtYmVyID0gKDE6bGVuZ3RoKGNvaW5fZmxpcHMpKSAsIHRvc3NfcmVzdWx0ID0gY29pbl9mbGlwcykNCmhlYWQoRGF0YSwgNSkNCg0KZnJlcXVlbmNpZXMgPC0gZnVuY3Rpb24odmVjKSB7DQogIGxlbl92ZWMgPC0gbGVuZ3RoKHZlYykNCiAgYXZnIDwtIDE6bGVuX3ZlYw0KICANCiAgZm9yIChpIGluIDE6bGVuX3ZlYykgew0KICAgIGF2Z1tpXSA8LSBsZW5ndGgod2hpY2godmVjWzE6aV09PTEpKS9pDQogIH0NCiAgcmV0dXJuKGF2ZykNCn0NCg0KZnJlcSA8LWZyZXF1ZW5jaWVzKGNvaW5fZmxpcHMpDQpEYXRhJGF2Z3MgPC0gZnJlcQ0KaGVhZChEYXRhLCA1KQ0KDQpsaWJyYXJ5KGdncGxvdDIpDQoNCmdncGxvdChkYXRhPURhdGEsIGFlcyh4PXRvc3NfbnVtYmVyLCB5PWF2Z3MsIGdyb3VwPTEpKSArDQogIGdlb21fbGluZSgpICsNCiAgZ2VvbV9wb2ludCgpDQoNCmBgYA0KYGBge3J9DQpzZXQuc2VlZCgxKQ0KDQpzdW0gPC0gcnVuaWYoMTAwMDAsIG1pbiA9IDAsIG1heCA9IDEpDQoNCm1lYW4oc3VtKQ0KDQplc3RpbWF0ZV9waSA8LWZ1bmN0aW9uKHNlZWQgPSAxLCBpdGVyYXRpb25zID0gMTAwMDAwMDAwKXsNCiAgc2V0LnNlZWQoc2VlZCkNCiAgeCA8LSBydW5pZihuID0gaXRlcmF0aW9ucywgbWluID0gMCwgbWF4ID0gMSkNCiAgdmFsX29mX2cgPSBzcXJ0KDEteF4yKQ0KICBwaV9vdmVyX2ZvdXIgPSBtZWFuKHZhbF9vZl9nKQ0KICBwaSA8LSA0KnBpX292ZXJfZm91cg0KICByZXR1cm4ocGkpDQp9DQplc3RpbWF0ZV9waSgpDQoNCmBgYA0KYGBge3J9DQpsaWJyYXJ5KCd0aWR5dmVyc2UnKQ0KDQpsb3R0ZXJ5IDwtIGZ1bmN0aW9uKHNlZWQgPSAxLCBpdGVyYXRpb25zID0gMTUwMDApIHsNCiAgc2V0LnNlZWQoc2VlZCkNCiAgbnVtMSA8LSBmbG9vcihydW5pZihuID0gaXRlcmF0aW9ucywgbWluID0gMSwgbWF4ID0gNCkpDQogIG51bTIgPC0gZmxvb3IocnVuaWYobiA9IGl0ZXJhdGlvbnMsIG1pbiA9IDEsIG1heCA9IDQpKQ0KICBudW0zIDwtIGZsb29yKHJ1bmlmKG4gPSBpdGVyYXRpb25zLCBtaW4gPSAxLCBtYXggPSA0KSkNCiAgDQogIHN1bSA8LSBudW0xICsgbnVtMiArIG51bTMNCiAgDQogIHRpY2tldCA8LSAxMDAqbnVtMSArIDEwKm51bTIgKyBudW0zDQogIHRpY2tldCA8LSBhcy5kYXRhLmZyYW1lKHRpY2tldCkNCiAgDQogIGRmIDwtIHRpY2tldCAlPiUNCiAgICBncm91cF9ieSh0aWNrZXQpICU+JQ0KICAgIHN1bW1hcmlzZShjb3VudHMgPSBuKCkpDQogIA0KICBkZiR0aWNrZXQgPC0gYXMuZmFjdG9yKGRmJHRpY2tldCkNCiAgcCA8LSBnZ3Bsb3QoZGYsIGFlcyh4ID0gdGlja2V0LCB5ID0gY291bnRzKSkgKw0KICAgIGdlb21fYmFyKGZpbGwgPSAiIzAwNzNDMkZGIiwgc3RhdD0naWRlbnRpdHknKSArDQogICAgdGhlbWVfYncoKQ0KICBwcmludChwKQ0KICANCiAgcmV0dXJuKGxpc3QoZGYsIHRhYmxlKHN1bSkpKQ0KfQ0KDQpsb3R0ZXJ5KCkNCmBgYA0KYGBge3J9DQpzZXQuc2VlZCg0MCkNCg0KI1Byb2JsZW0gMQ0KI2NvaW5fZmxpcHMgPC0gcmJpbm9tKDEyLCAxLCAuNSkNCiNjb2luX2ZsaXBzDQoNCmEgPC0gKGNob29zZSgxMiw3KSooLjVeNykqKDEtLjUpXigxMi03KSkNCnByaW50KGEpDQojYSkgLT4gMC4xOTMzNTk0DQoNCmNvaW5fZmxpcHMgPC0gcmJpbm9tKDEwMDAwMDAsIDEyLCAuNSkNCkRhdGEgPC0gZGF0YS5mcmFtZSh0b3NzX251bWJlciA9ICgxOmxlbmd0aChjb2luX2ZsaXBzKSkgLCB0b3NzX3Jlc3VsdCA9IGNvaW5fZmxpcHMpDQpoZWFkKERhdGEsIDUpDQoNCiNCDQoNCkRhdGFfMiA8LSBhcy5kYXRhLmZyYW1lKHRhYmxlKGNvaW5fZmxpcHMpKQ0KaGVhZChEYXRhXzIsIDEyKQ0KDQoNCmxpYnJhcnkoZ2dwbG90MikNCg0KZ2dwbG90KGRhdGE9RGF0YV8yLCBhZXMoeD1jb2luX2ZsaXBzLCB5PUZyZXEsIGdyb3VwPTEpKSArDQogIGdlb21fbGluZSgpICsNCiAgZ2VvbV9wb2ludCgpDQoNCiNDDQojVGhpcyBhbGlnbnMgd2l0aCB0aGUgZnJlcXVlbnRpc3QgdmlldyBvZiBwcm9iYWJpbGl0eSBiZWNhdXNlIHdlIHNlZSB0aGF0IG92ZXIgYSBsYXJnZSBudW1iZXIgb2YgdHJpYWxzLCB0aGUgZnJlcXVlbmN5IG9mIDcgd2FzIDE5MzczMy4gMTkzNzMzLzEwMDAwMDAgaXMgLjE5MzczMy4gVGhpcyBpcyBjbG9zZSB0byB0aGUgbnVtYmVyIHdlIHNhdyBlYXJsaWVyLCBwcm92aW5nIHRoaXMgdmlldy4NCg0KDQpgYGANCmBgYHtyfQ0KI0QNCmVfb2ZfeCA8LSAxMDAwMDAwICogLjUNCm9iX2F2ZyA8LSBmdW5jdGlvbih2ZWMpIHsNCiAgbGVuX3ZlYyA8LSBsZW5ndGgodmVjKQ0KICBhdmcgPC0gMA0KICANCiAgZm9yIChpIGluIDE6bGVuX3ZlYykgew0KICAgIGF2ZyA8LSB2ZWNbaV0gKyBhdmcNCiAgfQ0KICByZXR1cm4oYXZnL2xlbl92ZWMpDQp9DQpwcmludChlX29mX3gvbGVuZ3RoKGNvaW5fZmxpcHMpKQ0Kb2JfYXZnKGNvaW5fZmxpcHMpDQoNCiNFDQojVGhlc2Ugb2JzZXJ2YXRpb25zIGRvIG1hdGNoIHVwIHdpdGggdGhlIGxhdyBvZiBsYXJnZSBudW1iZXJzLiBXZSBjYW4gc2VlIHRoYXQgdGhlc2UgdmFsdWUgYXJlIHZlcnkgc2ltaWxhciwgbWVhbmluZyB0aGF0IG92ZXIgYSBsYXJnZSBzYW1wbGUgc2l6ZSwgdGhlIGFjdHVhbCBtZWFuID0gZXhwZWN0ZWQgdmFsdWUsIHdoaWNoIGlzIHRoZSBsYXcgb2YgbGFyZ2UgbnVtYmVycy4NCmBgYA0KYGBge3J9DQojUHJvYmxlbSAyDQoNCm5vcm1hbF9kaXMgPC0gcm5vcm0oMTAwMDAwMCwgNCwgMSkNCg0KRGF0YV9uIDwtIGRhdGEuZnJhbWUoTnVtYmVyID0gKDE6bGVuZ3RoKG5vcm1hbF9kaXMpKSwgUmVzdWx0ID0gbm9ybWFsX2RpcykNCmhlYWQoRGF0YSwgMTApDQoNCiNFKHgpID0gNCBieSBkZWZpbml0aW9uIG9mIG5vcm1hbCBkaXN0cmlidXRpb25zDQpvYl9hdmcobm9ybWFsX2RpcykNCiNUaGVzZSB2YWx1ZXMgYXJlIHZlcnkgc2ltaWxhciwgdmVyaWZ5aW5nIGFnYWluIHRoZSBsYXcgb2YgbGFyZ2UgbnVtYmVycyBmb3Igbm9ybWFsIGRpc3RyaWJ1dGlvbg0KDQpleHBfZGlzIDwtIHJleHAoMTAwMDAwMCwgNCkNCkRhdGFfbiA8LSBkYXRhLmZyYW1lKE51bWJlciA9ICgxOmxlbmd0aChleHBfZGlzKSksIFJlc3VsdCA9IGV4cF9kaXMpDQpoZWFkKERhdGEsIDEwKQ0KDQojRSh4KSA9IHRoZSBpbnRlZ3JhbCBmcm9tIDAgdG8gaW5maW5pdHkgeCpsYW1iZGEqZV4tKGxhbWJkYSp4KQ0KI0luIHRoaXMgY2FzZSwgZXZhbHVhdGVzIHRvIDEvNCBvciAuMjUNCm9iX2F2ZyhleHBfZGlzKQ0KDQojT25jZSBhZ2Fpbiwgd2UgaGF2ZSB2ZXJpZmllZCB0aGUgbGF3IG9mIGxhcmdlIG51bWJlcnMsIGJ5IGFjaGlldmluZyBhIG51bWJlciB2ZXJ5IGNsb3NlIHRvIHRoZSBleHBlY3RlZCB2YWx1ZS4NCg0KYGBgDQpgYGB7cn0NCiNQcm9ibGVtIDMtLSByZWxhdGl2ZSBmcmVxdWVuY3kNCg0KbGlicmFyeSgndGlkeXZlcnNlJykNCg0KbG90dGVyeSA8LSBmdW5jdGlvbihzZWVkID0gMSwgaXRlcmF0aW9ucyA9IDE1MDAwKSB7DQogIHNldC5zZWVkKHNlZWQpDQogIG51bTEgPC0gZmxvb3IocnVuaWYobiA9IGl0ZXJhdGlvbnMsIG1pbiA9IDEsIG1heCA9IDQpKQ0KICBudW0yIDwtIGZsb29yKHJ1bmlmKG4gPSBpdGVyYXRpb25zLCBtaW4gPSAxLCBtYXggPSA0KSkNCiAgbnVtMyA8LSBmbG9vcihydW5pZihuID0gaXRlcmF0aW9ucywgbWluID0gMSwgbWF4ID0gNCkpDQogIA0KICBzdW0gPC0gbnVtMSArIG51bTIgKyBudW0zDQogIA0KICB0aWNrZXQgPC0gMTAwKm51bTEgKyAxMCpudW0yICsgbnVtMw0KICB0aWNrZXQgPC0gYXMuZGF0YS5mcmFtZSh0aWNrZXQpDQogIA0KICBkZiA8LSB0aWNrZXQgJT4lDQogICAgZ3JvdXBfYnkodGlja2V0KSAlPiUNCiAgICBzdW1tYXJpc2UoY291bnRzID0gbigpLzE1MDAwKQ0KICANCiAgZGYkdGlja2V0IDwtIGFzLmZhY3RvcihkZiR0aWNrZXQpDQogIHAgPC0gZ2dwbG90KGRmLCBhZXMoeCA9IHRpY2tldCwgeSA9IGNvdW50cykpICsNCiAgICBnZW9tX2JhcihmaWxsID0gIiMwMDczQzJGRiIsIHN0YXQ9J2lkZW50aXR5JykgKw0KICAgIHRoZW1lX2J3KCkNCiAgcHJpbnQocCkNCiAgDQogIHJldHVybihsaXN0KGRmLCB0YWJsZShzdW0pKSkNCn0NCg0KbG90dGVyeSgpDQoNCmBgYA0KYGBge3J9DQpzZXQuc2VlZCg0MCkNCg0KI3Byb2JsZW0gNA0KZXN0aW1hdGVfcGkgPC1mdW5jdGlvbihzZWVkID0gNDAsIGl0ZXJhdGlvbnMgPSAxMDAwMDAwMDApew0KICBzZXQuc2VlZChzZWVkKQ0KICB4IDwtIHJ1bmlmKG4gPSBpdGVyYXRpb25zLCBtaW4gPSAtMSwgbWF4ID0gMSkNCiAgdmFsX29mX2cgPSBzcXJ0KDEtKHheMikpDQogIA0KICBwaV9vdmVyX3R3byA9IDIgKiBtZWFuKHZhbF9vZl9nKQ0KICANCiAgcGkgPC0gMipwaV9vdmVyX3R3bw0KICANCiAgcmV0dXJuKHBpKQ0KfQ0KZXN0aW1hdGVfcGkoKQ0KYGBgDQpgYGB7cn0NCiNQcm9ibGVtIDUNCnNldC5zZWVkKDQwKQ0KDQpYIDwtIHJiaW5vbSgxMDAwMCwgMTIsIC4yNSkNClkgPC0gcmJpbm9tKDEwMDAwLCAxOCwgLjI1KQ0KDQpaIDwtIHJiaW5vbSgxMDAwMCwgMzAsIC4yNSkNCg0KRGF0YV94IDwtIGFzLmRhdGEuZnJhbWUodGFibGUoWCkpDQpoZWFkKERhdGFfeCwgMTIpDQoNCkRhdGFfeSA8LSBhcy5kYXRhLmZyYW1lKHRhYmxlKFkpKQ0KaGVhZChEYXRhX3ksIDEyKQ0KDQpEYXRhX3ogPC0gYXMuZGF0YS5mcmFtZSh0YWJsZShaKSkNCmhlYWQoRGF0YV96LCAxMikNCg0KcCA8LSBnZ3Bsb3QoRGF0YV94LCBhZXMoeCA9IFgsIHkgPSBGcmVxLzEwMDAwKSkgKw0KICBnZW9tX2JhcihmaWxsID0gIiMwMDczQzJGRiIsIHN0YXQ9J2lkZW50aXR5JykgKw0KICB0aGVtZV9idygpDQpwcmludChwKQ0KDQpwMiA8LSBnZ3Bsb3QoRGF0YV95LCBhZXMoeCA9IFksIHkgPSBGcmVxLzEwMDAwKSkgKw0KICBnZW9tX2JhcihmaWxsID0gIiMwMDczQzJGRiIsIHN0YXQ9J2lkZW50aXR5JykgKw0KICB0aGVtZV9idygpDQpwcmludChwMikNCg0KcDMgPC0gZ2dwbG90KERhdGFfeiwgYWVzKHggPSBaLCB5ID0gRnJlcS8xMDAwMCkpICsNCiAgZ2VvbV9iYXIoZmlsbCA9ICIjMDA3M0MyRkYiLCBzdGF0PSdpZGVudGl0eScpICsNCiAgdGhlbWVfYncoKQ0KcHJpbnQocDMpDQojWCBoYXMgdGhlIGhpZ2hlc3QgZnJlcXVlbmN5IGF0IDMsIFkgYXQgNCwgYW5kIFogKGllIHJiaW5vbSgxMDAwMCwgMzAsIC4yNSkpIGF0IDcuIA0KIyBCeSBsYXcgb2YgbGFyZ2UgbnVtYmVycywgWCBhbmQgWSB3aWxsIGV2ZW4gb3V0IHRvIDMgYW5kIDQsIGFuZCBzbyBYK1kgPSA3ID0gWi4gVGh1cywgdGhlc2UgZnJlcXVlbmNpZXMgc2hvdyB0aGF0IHRoZXkgYXJlIHJvdWdobHkgZXF1aXZhbGVudC4NCg0KDQoNCmBgYA0KDQpBZGQgYSBuZXcgY2h1bmsgYnkgY2xpY2tpbmcgdGhlICpJbnNlcnQgQ2h1bmsqIGJ1dHRvbiBvbiB0aGUgdG9vbGJhciBvciBieSBwcmVzc2luZyAqQ3RybCtBbHQrSSouDQoNCldoZW4geW91IHNhdmUgdGhlIG5vdGVib29rLCBhbiBIVE1MIGZpbGUgY29udGFpbmluZyB0aGUgY29kZSBhbmQgb3V0cHV0IHdpbGwgYmUgc2F2ZWQgYWxvbmdzaWRlIGl0IChjbGljayB0aGUgKlByZXZpZXcqIGJ1dHRvbiBvciBwcmVzcyAqQ3RybCtTaGlmdCtLKiB0byBwcmV2aWV3IHRoZSBIVE1MIGZpbGUpLg0KDQpUaGUgcHJldmlldyBzaG93cyB5b3UgYSByZW5kZXJlZCBIVE1MIGNvcHkgb2YgdGhlIGNvbnRlbnRzIG9mIHRoZSBlZGl0b3IuIENvbnNlcXVlbnRseSwgdW5saWtlICpLbml0KiwgKlByZXZpZXcqIGRvZXMgbm90IHJ1biBhbnkgUiBjb2RlIGNodW5rcy4gSW5zdGVhZCwgdGhlIG91dHB1dCBvZiB0aGUgY2h1bmsgd2hlbiBpdCB3YXMgbGFzdCBydW4gaW4gdGhlIGVkaXRvciBpcyBkaXNwbGF5ZWQuDQo=