library(tidyverse)
library(openintro)

The data

library(tidyverse)
library(openintro)
head(fastfood)
## # A tibble: 6 x 17
##   restaurant item  calories cal_fat total_fat sat_fat trans_fat cholesterol
##   <chr>      <chr>    <dbl>   <dbl>     <dbl>   <dbl>     <dbl>       <dbl>
## 1 Mcdonalds  Arti~      380      60         7       2       0            95
## 2 Mcdonalds  Sing~      840     410        45      17       1.5         130
## 3 Mcdonalds  Doub~     1130     600        67      27       3           220
## 4 Mcdonalds  Gril~      750     280        31      10       0.5         155
## 5 Mcdonalds  Cris~      920     410        45      12       0.5         120
## 6 Mcdonalds  Big ~      540     250        28      10       1            80
## # ... with 9 more variables: sodium <dbl>, total_carb <dbl>, fiber <dbl>,
## #   sugar <dbl>, protein <dbl>, vit_a <dbl>, vit_c <dbl>, calcium <dbl>,
## #   salad <chr>
head(fastfood)
## # A tibble: 6 x 17
##   restaurant item  calories cal_fat total_fat sat_fat trans_fat cholesterol
##   <chr>      <chr>    <dbl>   <dbl>     <dbl>   <dbl>     <dbl>       <dbl>
## 1 Mcdonalds  Arti~      380      60         7       2       0            95
## 2 Mcdonalds  Sing~      840     410        45      17       1.5         130
## 3 Mcdonalds  Doub~     1130     600        67      27       3           220
## 4 Mcdonalds  Gril~      750     280        31      10       0.5         155
## 5 Mcdonalds  Cris~      920     410        45      12       0.5         120
## 6 Mcdonalds  Big ~      540     250        28      10       1            80
## # ... with 9 more variables: sodium <dbl>, total_carb <dbl>, fiber <dbl>,
## #   sugar <dbl>, protein <dbl>, vit_a <dbl>, vit_c <dbl>, calcium <dbl>,
## #   salad <chr>
glimpse(fastfood)
## Rows: 515
## Columns: 17
## $ restaurant  <chr> "Mcdonalds", "Mcdonalds", "Mcdonalds", "Mcdonalds", "Mc...
## $ item        <chr> "Artisan Grilled Chicken Sandwich", "Single Bacon Smoke...
## $ calories    <dbl> 380, 840, 1130, 750, 920, 540, 300, 510, 430, 770, 380,...
## $ cal_fat     <dbl> 60, 410, 600, 280, 410, 250, 100, 210, 190, 400, 170, 3...
## $ total_fat   <dbl> 7, 45, 67, 31, 45, 28, 12, 24, 21, 45, 18, 34, 20, 34, ...
## $ sat_fat     <dbl> 2.0, 17.0, 27.0, 10.0, 12.0, 10.0, 5.0, 4.0, 11.0, 21.0...
## $ trans_fat   <dbl> 0.0, 1.5, 3.0, 0.5, 0.5, 1.0, 0.5, 0.0, 1.0, 2.5, 0.0, ...
## $ cholesterol <dbl> 95, 130, 220, 155, 120, 80, 40, 65, 85, 175, 40, 95, 12...
## $ sodium      <dbl> 1110, 1580, 1920, 1940, 1980, 950, 680, 1040, 1040, 129...
## $ total_carb  <dbl> 44, 62, 63, 62, 81, 46, 33, 49, 35, 42, 38, 48, 48, 67,...
## $ fiber       <dbl> 3, 2, 3, 2, 4, 3, 2, 3, 2, 3, 2, 3, 3, 5, 2, 2, 3, 3, 5...
## $ sugar       <dbl> 11, 18, 18, 18, 18, 9, 7, 6, 7, 10, 5, 11, 11, 11, 6, 3...
## $ protein     <dbl> 37, 46, 70, 55, 46, 25, 15, 25, 25, 51, 15, 32, 42, 33,...
## $ vit_a       <dbl> 4, 6, 10, 6, 6, 10, 10, 0, 20, 20, 2, 10, 10, 10, 2, 4,...
## $ vit_c       <dbl> 20, 20, 20, 25, 20, 2, 2, 4, 4, 6, 0, 10, 20, 15, 2, 6,...
## $ calcium     <dbl> 20, 20, 50, 20, 20, 15, 10, 2, 15, 20, 15, 35, 35, 35, ...
## $ salad       <chr> "Other", "Other", "Other", "Other", "Other", "Other", "...
Mcdonalds <- fastfood %>%
  filter(restaurant == "Mcdonalds")
dairy_queen <- fastfood %>%
  filter(restaurant == "Dairy Queen")

Exercise 1

Make a plot (or plots) to visualize the distributions of the amount of calories from fat of the options from these two restaurants. How do their centers, shapes, and spreads compare?

Dairy queen is bimodal. Unlike Mcdonalds it skews to the right and has a higher min, max, and mean. Both have different shapes of distribution but the data sets seem somewhat the same.

hist(Mcdonalds$cal_fat)

hist(dairy_queen$cal_fat)

The normal distribution

dqmean <- mean(dairy_queen$cal_fat)
dqsd   <- sd(dairy_queen$cal_fat)
ggplot(data = dairy_queen, aes(x = cal_fat)) +
        geom_blank() +
        geom_histogram(aes(y = ..density..)) +
        stat_function(fun = dnorm, args = c(mean = dqmean, sd = dqsd), col = "tomato")
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

Exercise 2

Based on the this plot, does it appear that the data follow a nearly normal distribution?

Based in the plot it shows that it’s close to a normal distribution. The part that throws it off a little is because of the large peak and how it spreads out. The peak at 250 cal and the distribution is reaching to 0 on the denisty side because of this. It seems to be a very close normal distribution.

Evaluating the normal distribution

ggplot(data = dairy_queen, aes(sample = cal_fat)) + 
  geom_line(stat = "qq")

sim_norm <- rnorm(n = nrow(dairy_queen), mean = dqmean, sd = dqsd)

Exercise 3

Make a normal probability plot of sim_norm. Do all of the points fall on the line? How does this plot compare to the probability plot for the real data? (Since sim_norm is not a dataframe, it can be put directly into the sample argument and the data argument can be dropped.)

The points do not fall on the line. On the sim_norm plot the slope between -2 to -1 is greater compared to the real data the slope between -2 to -1 is a smaller plot. Both plots do look similar to a certain extent.

ggplot(data = NULL, aes(sample = sim_norm)) +
  geom_line(stat = "qq")

qqnormsim(sample = cal_fat, data = dairy_queen)

Exercise 4

Does the normal probability plot for the calories from fat look similar to the plots created for the simulated data? That is, do the plots provide evidence that the female heights are nearly normal?

Dairy queens fat calorie plot does look nearly normal because it is following the diagonal line. It also has a resemblance to sim 7.

Exercise 5

Using the same technique, determine whether or not the calories from McDonald’s menu appear to come from a normal distribution.

Mcdonalds is also nearly normal. It does follow the diagonal line. It does also look like the dairy queen fat calorie plot But this plot for mcdonalds has a somewhat of a resemblance to sim 1 and sim 3 at the begining.

ggplot(data = Mcdonalds, aes(sample = cal_fat)) + 
  geom_line(stat = "qq")

qqnormsim(sample = cal_fat, data = Mcdonalds)

Normal probabilities

1 - pnorm(q = 600, mean = dqmean, sd = dqsd)
## [1] 0.01501523
  dairy_queen %>% 
    filter(cal_fat > 600) %>%
    summarise(percent = n() / nrow(dairy_queen))
## # A tibble: 1 x 1
##   percent
##     <dbl>
## 1  0.0476

Exercise 6

Write out two probability questions that you would like to answer about any of the restaurants in this dataset. Calculate those probabilities using both the theoretical normal distribution as well as the empirical distribution (four probabilities in all). Which one had a closer agreement between the two methods?

What is the probability that a randomly chosen mcdonalds a product has more less 300 calories from fat?

Mcdonalds <- fastfood %>%
  filter(restaurant == "Mcdonalds")

mcmean <- mean(Mcdonalds$cal_fat)
mcsd   <- sd(Mcdonalds$cal_fat)

1 - pnorm(q = 300, mean = dqmean, sd = dqsd)
## [1] 0.4002993
Mcdonalds %>% 
  filter(cal_fat < 300) %>%
  summarise(percent = n() / nrow(Mcdonalds))
## # A tibble: 1 x 1
##   percent
##     <dbl>
## 1   0.632

What is the probability that any random fast food restaurant has more than 800 calories from fat?

ffmean <- mean(fastfood$cal_fat)
ffsd   <- sd(fastfood$cal_fat)

1 - pnorm(q = 800, mean = dqmean, sd = ffsd)
## [1] 0.0005930865
fastfood %>% 
  filter(cal_fat > 800) %>%
  summarise(percent = n() / nrow(fastfood))
## # A tibble: 1 x 1
##   percent
##     <dbl>
## 1 0.00971

The probability of mcdonalds having a product less than 300 had a closer agreement to the question I asked.

Exercise 7

Now let’s consider some of the other variables in the dataset. Out of all the different restaurants, which ones’ distribution is the closest to normal for sodium?

dq <- fastfood %>%
  filter(restaurant == "Dairy Queen")

qqnorm(dq$sodium, main = "Dairy Queen")

mcd <- fastfood %>%
  filter(restaurant == "Mcdonalds")

qqnorm(mcd$sodium, main = "Mcdonald's")

Based on the date from the plots, dairy queens distribution is the closets to a normal for sodium.

Exercise 8

Note that some of the normal probability plots for sodium distributions seem to have a stepwise pattern. why do you think this might be the case?

Most likely there’s a stepwise pattern because of the variety of food that mcdonalds and dairy queen offers. Both of these fast food restaurants will have different sodium levels depending whats on the menu.Their fries or burgers most likely have a different amount of sodium in them.

Exercise 9

As you can see, normal probability plots can be used both to assess normality and visualize skewness. Make a normal probability plot for the total carbohydrates from a restaurant of your choice. Based on this normal probability plot, is this variable left skewed, symmetric, or right skewed? Use a histogram to confirm your findings

Based on the plot and histogram the variable is right skewed. Both plots have a strong concentration in the middle which confirms my findings for me.

qqnorm(mcd$total_carb, main = "Mcdonalds Carbs")

hist(mcd$total_carb)

LS0tDQp0aXRsZTogIkxhYiA0Ig0KYXV0aG9yOiAiRGF2aWQgRnVuZXMiDQpkYXRlOiAiYDA5LzIyLzIwKWAiDQpvdXRwdXQ6IG9wZW5pbnRybzo6bGFiX3JlcG9ydA0KLS0tDQoNCmBgYHtyIGxvYWQtcGFja2FnZXMsIG1lc3NhZ2U9RkFMU0V9DQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkob3BlbmludHJvKQ0KYGBgDQoNCiMjIFRoZSBkYXRhDQoNCmBgYHtyfQ0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KG9wZW5pbnRybykNCmhlYWQoZmFzdGZvb2QpDQpgYGANCg0KYGBge3J9DQpoZWFkKGZhc3Rmb29kKQ0KZ2xpbXBzZShmYXN0Zm9vZCkNCk1jZG9uYWxkcyA8LSBmYXN0Zm9vZCAlPiUNCiAgZmlsdGVyKHJlc3RhdXJhbnQgPT0gIk1jZG9uYWxkcyIpDQpkYWlyeV9xdWVlbiA8LSBmYXN0Zm9vZCAlPiUNCiAgZmlsdGVyKHJlc3RhdXJhbnQgPT0gIkRhaXJ5IFF1ZWVuIikNCmBgYA0KDQoNCg0KIyMgRXhlcmNpc2UgMQ0KDQpNYWtlIGEgcGxvdCAob3IgcGxvdHMpIHRvIHZpc3VhbGl6ZSB0aGUgZGlzdHJpYnV0aW9ucyBvZiB0aGUgYW1vdW50IG9mIGNhbG9yaWVzIGZyb20gZmF0IG9mIHRoZSBvcHRpb25zIGZyb20gdGhlc2UgdHdvIHJlc3RhdXJhbnRzLiBIb3cgZG8gdGhlaXIgY2VudGVycywgc2hhcGVzLCBhbmQgc3ByZWFkcyBjb21wYXJlPw0KDQpEYWlyeSBxdWVlbiBpcyBiaW1vZGFsLiBVbmxpa2UgTWNkb25hbGRzIGl0IHNrZXdzIHRvIHRoZSByaWdodCBhbmQgaGFzIGEgaGlnaGVyIG1pbiwgbWF4LCBhbmQgbWVhbi4gQm90aCBoYXZlIGRpZmZlcmVudCBzaGFwZXMgb2YgZGlzdHJpYnV0aW9uIGJ1dCB0aGUgZGF0YSBzZXRzIHNlZW0gc29tZXdoYXQgdGhlIHNhbWUuIA0KDQpgYGB7cn0NCmhpc3QoTWNkb25hbGRzJGNhbF9mYXQpDQpgYGANCg0KYGBge3J9DQpoaXN0KGRhaXJ5X3F1ZWVuJGNhbF9mYXQpDQpgYGANCg0KIyMgVGhlIG5vcm1hbCBkaXN0cmlidXRpb24NCg0KDQpgYGB7cn0NCmRxbWVhbiA8LSBtZWFuKGRhaXJ5X3F1ZWVuJGNhbF9mYXQpDQpkcXNkICAgPC0gc2QoZGFpcnlfcXVlZW4kY2FsX2ZhdCkNCmBgYA0KDQpgYGB7cn0NCmdncGxvdChkYXRhID0gZGFpcnlfcXVlZW4sIGFlcyh4ID0gY2FsX2ZhdCkpICsNCiAgICAgICAgZ2VvbV9ibGFuaygpICsNCiAgICAgICAgZ2VvbV9oaXN0b2dyYW0oYWVzKHkgPSAuLmRlbnNpdHkuLikpICsNCiAgICAgICAgc3RhdF9mdW5jdGlvbihmdW4gPSBkbm9ybSwgYXJncyA9IGMobWVhbiA9IGRxbWVhbiwgc2QgPSBkcXNkKSwgY29sID0gInRvbWF0byIpDQpgYGANCg0KIyMgRXhlcmNpc2UgMg0KDQpCYXNlZCBvbiB0aGUgdGhpcyBwbG90LCBkb2VzIGl0IGFwcGVhciB0aGF0IHRoZSBkYXRhIGZvbGxvdyBhIG5lYXJseSBub3JtYWwgZGlzdHJpYnV0aW9uPw0KDQpCYXNlZCBpbiB0aGUgcGxvdCBpdCBzaG93cyB0aGF0IGl0J3MgY2xvc2UgdG8gYSBub3JtYWwgZGlzdHJpYnV0aW9uLiBUaGUgcGFydCB0aGF0IHRocm93cyBpdCBvZmYgYSBsaXR0bGUgaXMgYmVjYXVzZSBvZiB0aGUgbGFyZ2UgcGVhayBhbmQgaG93IGl0IHNwcmVhZHMgb3V0LiBUaGUgcGVhayBhdCAyNTAgY2FsIGFuZCB0aGUgZGlzdHJpYnV0aW9uIGlzIHJlYWNoaW5nIHRvIDAgb24gdGhlIGRlbmlzdHkgc2lkZSBiZWNhdXNlIG9mIHRoaXMuIEl0IHNlZW1zIHRvIGJlIGEgdmVyeSBjbG9zZSBub3JtYWwgZGlzdHJpYnV0aW9uLg0KDQojIyBFdmFsdWF0aW5nIHRoZSBub3JtYWwgZGlzdHJpYnV0aW9uDQoNCmBgYHtyfQ0KZ2dwbG90KGRhdGEgPSBkYWlyeV9xdWVlbiwgYWVzKHNhbXBsZSA9IGNhbF9mYXQpKSArIA0KICBnZW9tX2xpbmUoc3RhdCA9ICJxcSIpDQpgYGANCg0KYGBge3J9DQpzaW1fbm9ybSA8LSBybm9ybShuID0gbnJvdyhkYWlyeV9xdWVlbiksIG1lYW4gPSBkcW1lYW4sIHNkID0gZHFzZCkNCmBgYA0KDQojIyBFeGVyY2lzZSAzDQoNCk1ha2UgYSBub3JtYWwgcHJvYmFiaWxpdHkgcGxvdCBvZiBzaW1fbm9ybS4gRG8gYWxsIG9mIHRoZSBwb2ludHMgZmFsbCBvbiB0aGUgbGluZT8gSG93IGRvZXMgdGhpcyBwbG90IGNvbXBhcmUgdG8gdGhlIHByb2JhYmlsaXR5IHBsb3QgZm9yIHRoZSByZWFsIGRhdGE/IChTaW5jZSBzaW1fbm9ybSBpcyBub3QgYSBkYXRhZnJhbWUsIGl0IGNhbiBiZSBwdXQgZGlyZWN0bHkgaW50byB0aGUgc2FtcGxlIGFyZ3VtZW50IGFuZCB0aGUgZGF0YSBhcmd1bWVudCBjYW4gYmUgZHJvcHBlZC4pDQoNClRoZSBwb2ludHMgZG8gbm90IGZhbGwgb24gdGhlIGxpbmUuIE9uIHRoZSBzaW1fbm9ybSBwbG90IHRoZSBzbG9wZSBiZXR3ZWVuIC0yIHRvIC0xIGlzIGdyZWF0ZXIgY29tcGFyZWQgdG8gdGhlIHJlYWwgZGF0YSB0aGUgc2xvcGUgYmV0d2VlbiAtMiB0byAtMSBpcyBhIHNtYWxsZXIgcGxvdC4gQm90aCBwbG90cyBkbyBsb29rIHNpbWlsYXIgdG8gYSBjZXJ0YWluIGV4dGVudC4gDQoNCmBgYHtyfQ0KZ2dwbG90KGRhdGEgPSBOVUxMLCBhZXMoc2FtcGxlID0gc2ltX25vcm0pKSArDQogIGdlb21fbGluZShzdGF0ID0gInFxIikNCmBgYA0KDQoNCmBgYHtyfQ0KcXFub3Jtc2ltKHNhbXBsZSA9IGNhbF9mYXQsIGRhdGEgPSBkYWlyeV9xdWVlbikNCmBgYA0KDQojIyBFeGVyY2lzZSA0DQoNCkRvZXMgdGhlIG5vcm1hbCBwcm9iYWJpbGl0eSBwbG90IGZvciB0aGUgY2Fsb3JpZXMgZnJvbSBmYXQgbG9vayBzaW1pbGFyIHRvIHRoZSBwbG90cyBjcmVhdGVkIGZvciB0aGUgc2ltdWxhdGVkIGRhdGE/IFRoYXQgaXMsIGRvIHRoZSBwbG90cyBwcm92aWRlIGV2aWRlbmNlIHRoYXQgdGhlIGZlbWFsZSBoZWlnaHRzIGFyZSBuZWFybHkgbm9ybWFsPw0KDQpEYWlyeSBxdWVlbnMgZmF0IGNhbG9yaWUgcGxvdCBkb2VzIGxvb2sgbmVhcmx5IG5vcm1hbCBiZWNhdXNlIGl0IGlzIGZvbGxvd2luZyB0aGUgZGlhZ29uYWwgbGluZS4gSXQgYWxzbyBoYXMgYSByZXNlbWJsYW5jZSB0byBzaW0gNy4NCg0KIyMgRXhlcmNpc2UgNQ0KDQpVc2luZyB0aGUgc2FtZSB0ZWNobmlxdWUsIGRldGVybWluZSB3aGV0aGVyIG9yIG5vdCB0aGUgY2Fsb3JpZXMgZnJvbSBNY0RvbmFsZOKAmXMgbWVudSBhcHBlYXIgdG8gY29tZSBmcm9tIGEgbm9ybWFsIGRpc3RyaWJ1dGlvbi4NCg0KTWNkb25hbGRzIGlzIGFsc28gbmVhcmx5IG5vcm1hbC4gSXQgZG9lcyBmb2xsb3cgdGhlIGRpYWdvbmFsIGxpbmUuIEl0IGRvZXMgYWxzbyBsb29rIGxpa2UgdGhlIGRhaXJ5IHF1ZWVuIGZhdCBjYWxvcmllIHBsb3QgQnV0IHRoaXMgcGxvdCBmb3IgbWNkb25hbGRzIGhhcyBhIHNvbWV3aGF0IG9mIGEgcmVzZW1ibGFuY2UgdG8gc2ltIDEgYW5kIHNpbSAzIGF0IHRoZSBiZWdpbmluZy4gDQoNCmBgYHtyfQ0KZ2dwbG90KGRhdGEgPSBNY2RvbmFsZHMsIGFlcyhzYW1wbGUgPSBjYWxfZmF0KSkgKyANCiAgZ2VvbV9saW5lKHN0YXQgPSAicXEiKQ0KYGBgDQoNCmBgYHtyfQ0KcXFub3Jtc2ltKHNhbXBsZSA9IGNhbF9mYXQsIGRhdGEgPSBNY2RvbmFsZHMpDQpgYGANCg0KIyMgTm9ybWFsIHByb2JhYmlsaXRpZXMNCg0KYGBge3J9DQoxIC0gcG5vcm0ocSA9IDYwMCwgbWVhbiA9IGRxbWVhbiwgc2QgPSBkcXNkKQ0KYGBgDQoNCmBgYHtyfQ0KICBkYWlyeV9xdWVlbiAlPiUgDQogICAgZmlsdGVyKGNhbF9mYXQgPiA2MDApICU+JQ0KICAgIHN1bW1hcmlzZShwZXJjZW50ID0gbigpIC8gbnJvdyhkYWlyeV9xdWVlbikpDQpgYGANCg0KIyMgRXhlcmNpc2UgNg0KDQpXcml0ZSBvdXQgdHdvIHByb2JhYmlsaXR5IHF1ZXN0aW9ucyB0aGF0IHlvdSB3b3VsZCBsaWtlIHRvIGFuc3dlciBhYm91dCBhbnkgb2YgdGhlIHJlc3RhdXJhbnRzIGluIHRoaXMgZGF0YXNldC4gQ2FsY3VsYXRlIHRob3NlIHByb2JhYmlsaXRpZXMgdXNpbmcgYm90aCB0aGUgdGhlb3JldGljYWwgbm9ybWFsIGRpc3RyaWJ1dGlvbiBhcyB3ZWxsIGFzIHRoZSBlbXBpcmljYWwgZGlzdHJpYnV0aW9uIChmb3VyIHByb2JhYmlsaXRpZXMgaW4gYWxsKS4gV2hpY2ggb25lIGhhZCBhIGNsb3NlciBhZ3JlZW1lbnQgYmV0d2VlbiB0aGUgdHdvIG1ldGhvZHM/DQoNCldoYXQgaXMgdGhlIHByb2JhYmlsaXR5IHRoYXQgYSByYW5kb21seSBjaG9zZW4gbWNkb25hbGRzIGEgcHJvZHVjdCBoYXMgbW9yZSBsZXNzIDMwMCBjYWxvcmllcyBmcm9tIGZhdD8NCg0KYGBge3J9DQpNY2RvbmFsZHMgPC0gZmFzdGZvb2QgJT4lDQogIGZpbHRlcihyZXN0YXVyYW50ID09ICJNY2RvbmFsZHMiKQ0KDQptY21lYW4gPC0gbWVhbihNY2RvbmFsZHMkY2FsX2ZhdCkNCm1jc2QgICA8LSBzZChNY2RvbmFsZHMkY2FsX2ZhdCkNCg0KMSAtIHBub3JtKHEgPSAzMDAsIG1lYW4gPSBkcW1lYW4sIHNkID0gZHFzZCkNCg0KTWNkb25hbGRzICU+JSANCiAgZmlsdGVyKGNhbF9mYXQgPCAzMDApICU+JQ0KICBzdW1tYXJpc2UocGVyY2VudCA9IG4oKSAvIG5yb3coTWNkb25hbGRzKSkNCmBgYA0KDQpXaGF0IGlzIHRoZSBwcm9iYWJpbGl0eSB0aGF0IGFueSByYW5kb20gZmFzdCBmb29kIHJlc3RhdXJhbnQgaGFzIG1vcmUgdGhhbiA4MDAgY2Fsb3JpZXMgZnJvbSBmYXQ/DQoNCmBgYHtyfQ0KDQpmZm1lYW4gPC0gbWVhbihmYXN0Zm9vZCRjYWxfZmF0KQ0KZmZzZCAgIDwtIHNkKGZhc3Rmb29kJGNhbF9mYXQpDQoNCjEgLSBwbm9ybShxID0gODAwLCBtZWFuID0gZHFtZWFuLCBzZCA9IGZmc2QpDQoNCmZhc3Rmb29kICU+JSANCiAgZmlsdGVyKGNhbF9mYXQgPiA4MDApICU+JQ0KICBzdW1tYXJpc2UocGVyY2VudCA9IG4oKSAvIG5yb3coZmFzdGZvb2QpKQ0KYGBgDQoNClRoZSBwcm9iYWJpbGl0eSBvZiBtY2RvbmFsZHMgaGF2aW5nIGEgcHJvZHVjdCBsZXNzIHRoYW4gMzAwIGhhZCBhIGNsb3NlciBhZ3JlZW1lbnQgdG8gdGhlIHF1ZXN0aW9uIEkgYXNrZWQuDQoNCiMjIEV4ZXJjaXNlIDcNCg0KTm93IGxldOKAmXMgY29uc2lkZXIgc29tZSBvZiB0aGUgb3RoZXIgdmFyaWFibGVzIGluIHRoZSBkYXRhc2V0LiBPdXQgb2YgYWxsIHRoZSBkaWZmZXJlbnQgcmVzdGF1cmFudHMsIHdoaWNoIG9uZXPigJkgZGlzdHJpYnV0aW9uIGlzIHRoZSBjbG9zZXN0IHRvIG5vcm1hbCBmb3Igc29kaXVtPw0KDQpgYGB7cn0NCmRxIDwtIGZhc3Rmb29kICU+JQ0KICBmaWx0ZXIocmVzdGF1cmFudCA9PSAiRGFpcnkgUXVlZW4iKQ0KDQpxcW5vcm0oZHEkc29kaXVtLCBtYWluID0gIkRhaXJ5IFF1ZWVuIikNCmBgYA0KDQpgYGB7cn0NCm1jZCA8LSBmYXN0Zm9vZCAlPiUNCiAgZmlsdGVyKHJlc3RhdXJhbnQgPT0gIk1jZG9uYWxkcyIpDQoNCnFxbm9ybShtY2Qkc29kaXVtLCBtYWluID0gIk1jZG9uYWxkJ3MiKQ0KYGBgDQoNCkJhc2VkIG9uIHRoZSBkYXRlIGZyb20gdGhlIHBsb3RzLCBkYWlyeSBxdWVlbnMgZGlzdHJpYnV0aW9uIGlzIHRoZSBjbG9zZXRzIHRvIGEgbm9ybWFsIGZvciBzb2RpdW0uIA0KDQojIyBFeGVyY2lzZSA4DQoNCk5vdGUgdGhhdCBzb21lIG9mIHRoZSBub3JtYWwgcHJvYmFiaWxpdHkgcGxvdHMgZm9yIHNvZGl1bSBkaXN0cmlidXRpb25zIHNlZW0gdG8gaGF2ZSBhIHN0ZXB3aXNlIHBhdHRlcm4uIHdoeSBkbyB5b3UgdGhpbmsgdGhpcyBtaWdodCBiZSB0aGUgY2FzZT8NCg0KTW9zdCBsaWtlbHkgdGhlcmUncyBhIHN0ZXB3aXNlIHBhdHRlcm4gYmVjYXVzZSBvZiB0aGUgdmFyaWV0eSBvZiBmb29kIHRoYXQgbWNkb25hbGRzIGFuZCBkYWlyeSBxdWVlbiBvZmZlcnMuIEJvdGggb2YgdGhlc2UgZmFzdCBmb29kIHJlc3RhdXJhbnRzIHdpbGwgaGF2ZSBkaWZmZXJlbnQgc29kaXVtIGxldmVscyBkZXBlbmRpbmcgd2hhdHMgb24gdGhlIG1lbnUuVGhlaXIgZnJpZXMgb3IgYnVyZ2VycyBtb3N0IGxpa2VseSBoYXZlIGEgZGlmZmVyZW50IGFtb3VudCBvZiBzb2RpdW0gaW4gdGhlbS4gDQoNCiMjIyBFeGVyY2lzZSA5DQoNCkFzIHlvdSBjYW4gc2VlLCBub3JtYWwgcHJvYmFiaWxpdHkgcGxvdHMgY2FuIGJlIHVzZWQgYm90aCB0byBhc3Nlc3Mgbm9ybWFsaXR5IGFuZCB2aXN1YWxpemUgc2tld25lc3MuIE1ha2UgYSBub3JtYWwgcHJvYmFiaWxpdHkgcGxvdCBmb3IgdGhlIHRvdGFsIGNhcmJvaHlkcmF0ZXMgZnJvbSBhIHJlc3RhdXJhbnQgb2YgeW91ciBjaG9pY2UuIEJhc2VkIG9uIHRoaXMgbm9ybWFsIHByb2JhYmlsaXR5IHBsb3QsIGlzIHRoaXMgdmFyaWFibGUgbGVmdCBza2V3ZWQsIHN5bW1ldHJpYywgb3IgcmlnaHQgc2tld2VkPw0KVXNlIGEgaGlzdG9ncmFtIHRvIGNvbmZpcm0geW91ciBmaW5kaW5ncw0KDQpCYXNlZCBvbiB0aGUgcGxvdCBhbmQgaGlzdG9ncmFtIHRoZSB2YXJpYWJsZSBpcyByaWdodCBza2V3ZWQuIEJvdGggcGxvdHMgaGF2ZSBhIHN0cm9uZyBjb25jZW50cmF0aW9uIGluIHRoZSBtaWRkbGUgd2hpY2ggY29uZmlybXMgbXkgZmluZGluZ3MgZm9yIG1lLiANCg0KYGBge3J9DQpxcW5vcm0obWNkJHRvdGFsX2NhcmIsIG1haW4gPSAiTWNkb25hbGRzIENhcmJzIikNCg0KaGlzdChtY2QkdG90YWxfY2FyYikNCmBgYA0KDQoNCg==