library(tidyverse)
## Warning: package 'tidyverse' was built under R version 4.0.2
## Warning: package 'tibble' was built under R version 4.0.2
## Warning: package 'tidyr' was built under R version 4.0.2
## Warning: package 'dplyr' was built under R version 4.0.2
library(openintro)
## Warning: package 'openintro' was built under R version 4.0.2
## Warning: package 'airports' was built under R version 4.0.2
## Warning: package 'cherryblossom' was built under R version 4.0.2
## Warning: package 'usdata' was built under R version 4.0.2
library(dplyr)
library(ggplot2)
library(openintro)
#library(oilabs)
data("nycflights")

Exercise 1

Lab Report - Departure Delays

ggplot (data = nycflights, aes(x = dep_delay) ) + geom_histogram()
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

ggplot (data = nycflights, aes(x = dep_delay) ) + geom_histogram(binwidth = 15)

ggplot (data = nycflights, aes(x = dep_delay) ) + geom_histogram(binwidth = 150)

To my way of thinking, none of these histograms work. There are simply too many observations for this histogram to make sense. Also, what is the dep_delay? In minutes?

Reduce the # of observations by limiting the file to flights to LAX.

lax_flights <- nycflights %>%
  filter(dest == "LAX")
ggplot(data = lax_flights, aes(x = dep_delay)) +
  geom_histogram()
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

lax_flights <- nycflights %>%
  filter(dest == "LAX")
ggplot(data = lax_flights, aes(x = dep_delay)) +
  geom_histogram(binwidth = 5)

lax_flights %>%
  summarise (mean_dd = mean(dep_delay), 
             median_dd = median(dep_delay),
             n         = n())
## # A tibble: 1 x 3
##   mean_dd median_dd     n
##     <dbl>     <dbl> <int>
## 1    9.78        -1  1583

Exercise 2

Filter on multiple criteria

sfo_feb_flights <- nycflights %>%
  filter(dest == "SFO", month ==2)
summary(sfo_feb_flights)
##       year          month        day           dep_time      dep_delay    
##  Min.   :2013   Min.   :2   Min.   : 1.00   Min.   : 613   Min.   :-10.0  
##  1st Qu.:2013   1st Qu.:2   1st Qu.: 7.00   1st Qu.: 943   1st Qu.: -5.0  
##  Median :2013   Median :2   Median :16.00   Median :1268   Median : -2.0  
##  Mean   :2013   Mean   :2   Mean   :15.26   Mean   :1298   Mean   : 10.5  
##  3rd Qu.:2013   3rd Qu.:2   3rd Qu.:22.50   3rd Qu.:1742   3rd Qu.:  9.0  
##  Max.   :2013   Max.   :2   Max.   :28.00   Max.   :2159   Max.   :209.0  
##     arr_time      arr_delay        carrier            tailnum         
##  Min.   : 118   Min.   :-66.00   Length:68          Length:68         
##  1st Qu.:1233   1st Qu.:-21.25   Class :character   Class :character  
##  Median :1497   Median :-11.00   Mode  :character   Mode  :character  
##  Mean   :1607   Mean   : -4.50                                        
##  3rd Qu.:2062   3rd Qu.:  2.00                                        
##  Max.   :2256   Max.   :196.00                                        
##      flight          origin              dest              air_time    
##  Min.   :  11.0   Length:68          Length:68          Min.   :317.0  
##  1st Qu.:  85.0   Class :character   Class :character   1st Qu.:345.0  
##  Median : 641.0   Mode  :character   Mode  :character   Median :354.0  
##  Mean   : 795.1                                         Mean   :351.9  
##  3rd Qu.:1487.2                                         3rd Qu.:360.0  
##  Max.   :2126.0                                         Max.   :376.0  
##     distance         hour           minute     
##  Min.   :2565   Min.   : 6.00   Min.   : 1.00  
##  1st Qu.:2586   1st Qu.: 9.00   1st Qu.:25.00  
##  Median :2586   Median :12.50   Median :33.50  
##  Mean   :2584   Mean   :12.62   Mean   :36.35  
##  3rd Qu.:2586   3rd Qu.:17.00   3rd Qu.:54.00  
##  Max.   :2586   Max.   :21.00   Max.   :59.00
write.csv(sfo_feb_flights, "C:/Users/Jerome/Documents/Math_217/sfo_feb_flights.csv")
write.csv(nycflights, "C:/Users/Jerome/Documents/Math_217/nycflights.csv")
write.csv(lax_flights, "C:/Users/Jerome/Documents/Math_217/lax_flights.csv")

All the above was done on 10 September prioir to class.

Now I need to start over.

library(tidyverse)
library(openintro)
library(dplyr)
library(ggplot2)
library(openintro)
#library(oilabs)
data("nycflights")
### Read the files I created before class

lax_flights <- read.csv("C:/Users/Jerome/Documents/Math_217/lax_flights.csv")
sfo_feb_flights <- ("C:/Users/Jerome/Documents/Math_217/sfo_feb_flights.csv")

Exercise 3

I tried to make the histogram with the sfo_feb_flights file i created before class. It didn’t work. I got the following error message: Error: data must be a data frame, or other object coercible by fortify(), not a character vectort

#ggplot (data = sfo_feb_flights, aes(x = dep_delay)) +
 # geom_histogram(5)
#summary(sfo_feb_flights$dep_delay)

So when that didn’t work, I simply re-created the sfo_feb_flights subset with a different name.

sfo_feb_flights_2 <- nycflights %>%
  filter(dest == "SFO", month ==2)
summary(sfo_feb_flights_2)
##       year          month        day           dep_time      dep_delay    
##  Min.   :2013   Min.   :2   Min.   : 1.00   Min.   : 613   Min.   :-10.0  
##  1st Qu.:2013   1st Qu.:2   1st Qu.: 7.00   1st Qu.: 943   1st Qu.: -5.0  
##  Median :2013   Median :2   Median :16.00   Median :1268   Median : -2.0  
##  Mean   :2013   Mean   :2   Mean   :15.26   Mean   :1298   Mean   : 10.5  
##  3rd Qu.:2013   3rd Qu.:2   3rd Qu.:22.50   3rd Qu.:1742   3rd Qu.:  9.0  
##  Max.   :2013   Max.   :2   Max.   :28.00   Max.   :2159   Max.   :209.0  
##     arr_time      arr_delay        carrier            tailnum         
##  Min.   : 118   Min.   :-66.00   Length:68          Length:68         
##  1st Qu.:1233   1st Qu.:-21.25   Class :character   Class :character  
##  Median :1497   Median :-11.00   Mode  :character   Mode  :character  
##  Mean   :1607   Mean   : -4.50                                        
##  3rd Qu.:2062   3rd Qu.:  2.00                                        
##  Max.   :2256   Max.   :196.00                                        
##      flight          origin              dest              air_time    
##  Min.   :  11.0   Length:68          Length:68          Min.   :317.0  
##  1st Qu.:  85.0   Class :character   Class :character   1st Qu.:345.0  
##  Median : 641.0   Mode  :character   Mode  :character   Median :354.0  
##  Mean   : 795.1                                         Mean   :351.9  
##  3rd Qu.:1487.2                                         3rd Qu.:360.0  
##  Max.   :2126.0                                         Max.   :376.0  
##     distance         hour           minute     
##  Min.   :2565   Min.   : 6.00   Min.   : 1.00  
##  1st Qu.:2586   1st Qu.: 9.00   1st Qu.:25.00  
##  Median :2586   Median :12.50   Median :33.50  
##  Mean   :2584   Mean   :12.62   Mean   :36.35  
##  3rd Qu.:2586   3rd Qu.:17.00   3rd Qu.:54.00  
##  Max.   :2586   Max.   :21.00   Max.   :59.00

###Then I re-ran Exercise 3 Histogram

ggplot(data=sfo_feb_flights_2, aes (x = dep_delay)) +
  geom_histogram(bins=5)

summary(sfo_feb_flights_2$dep_delay)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   -10.0    -5.0    -2.0    10.5     9.0   209.0
#summary(sfo_feb_flights$dep_delay)
sfo_feb_flights_2 %>%
group_by(origin) %>%
  summarize(median_dd = median(dep_delay), iqr_dd = IQR(dep_delay,), n_flights=n())
## `summarise()` ungrouping output (override with `.groups` argument)
## # A tibble: 2 x 4
##   origin median_dd iqr_dd n_flights
##   <chr>      <dbl>  <dbl>     <int>
## 1 EWR          0.5   5.75         8
## 2 JFK         -2.5  15.2         60

Exercise 4

sfo_feb_flights_2 %>%
  group_by(carrier) %>%
  summarise (median_dd = median(dep_delay), iqr_dd = IQR(dep_delay), n_flights = n()) %>%
               arrange (desc(iqr_dd))
## `summarise()` ungrouping output (override with `.groups` argument)
## # A tibble: 5 x 4
##   carrier median_dd iqr_dd n_flights
##   <chr>       <dbl>  <dbl>     <int>
## 1 AA           13     32.8        10
## 2 VX           -3.5   16.8        12
## 3 UA           -2     13          21
## 4 DL           -3      6.5        19
## 5 B6           -2      3.5         6

Departure Delays by Month - Part of Exercise 4

nycflights %>%
  group_by (month) %>%
  summarise (mean_dd = mean(dep_delay)) %>%
  arrange (desc(mean_dd))
## `summarise()` ungrouping output (override with `.groups` argument)
## # A tibble: 12 x 2
##    month mean_dd
##    <int>   <dbl>
##  1     7   20.8 
##  2     6   20.4 
##  3    12   17.4 
##  4     4   14.6 
##  5     3   13.5 
##  6     5   13.3 
##  7     8   12.6 
##  8     2   10.7 
##  9     1   10.2 
## 10     9    6.87
## 11    11    6.10
## 12    10    5.88

Exercise 5 Mean vs. Median Departure Delay

nycflights %>%
  group_by(month)%>%
  summarise (median_dd = median(dep_delay)) %>%
  arrange (desc(median_dd))
## `summarise()` ungrouping output (override with `.groups` argument)
## # A tibble: 12 x 2
##    month median_dd
##    <int>     <dbl>
##  1    12         1
##  2     6         0
##  3     7         0
##  4     3        -1
##  5     5        -1
##  6     8        -1
##  7     1        -2
##  8     2        -2
##  9     4        -2
## 10    11        -2
## 11     9        -3
## 12    10        -3

Create New Variable w/ the Mutate Function

nycflights <-nycflights %>%
mutate (dep_type = ifelse(dep_delay <5, "on time", "delayed"))
nycflights %>%
  group_by (origin)%>%
  summarise  (ot_dep_rate = sum(dep_type == "on time") / n()) %>%
  arrange(desc(ot_dep_rate))
## `summarise()` ungrouping output (override with `.groups` argument)
## # A tibble: 3 x 2
##   origin ot_dep_rate
##   <chr>        <dbl>
## 1 LGA          0.728
## 2 JFK          0.694
## 3 EWR          0.637
ggplot (data = nycflights, aes(x=origin, fill = dep_type)) +
  geom_bar()

Exercise 7 - Create new variable - average speed

new <- nycflights %>%
  mutate (avg_speed = mean(distance/(air_time/60)))

Exercise 8 Scatterplot of Average Speed vs. Distance

plot1 <- new %>%
  ggplot (aes(x = distance, y = avg_speed))+
  geom_point()
plot1

### Exercise 9

plot2 <- nycflights %>%
  filter (carrier == "AA" | carrier == "UA" | carrier == "DL") %>% 
  ggplot (aes(x=dep_delay, y = arr_delay, color = carrier)) +
  geom_point()
plot2

Answer to the question in #9: Assuming the x axis units are minutes, it seems you could have a delay of slightly more than an hour (roughly 70 - 80 minutes) abd still arrive on time (zero minutes arrival delay)
LS0tDQp0aXRsZTogIkxhYiBJbnRybyB0byBEYXRhIg0KYXV0aG9yOiAiSmVyb21lIEFuZGVyc29uIg0KZGF0ZTogImAxMCBTZXB0IDIwMjBgIg0Kb3V0cHV0OiBvcGVuaW50cm86OmxhYl9yZXBvcnQNCi0tLQ0KDQpgYGB7ciBsb2FkLXBhY2thZ2VzLCBtZXNzYWdlPUZBTFNFfQ0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KG9wZW5pbnRybykNCmxpYnJhcnkoZHBseXIpDQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KG9wZW5pbnRybykNCiNsaWJyYXJ5KG9pbGFicykNCmRhdGEoIm55Y2ZsaWdodHMiKQ0KYGBgDQoNCiMjIyBFeGVyY2lzZSAxDQoNCiMjIExhYiBSZXBvcnQgLSBEZXBhcnR1cmUgRGVsYXlzDQoNCmBgYHtyfQ0KZ2dwbG90IChkYXRhID0gbnljZmxpZ2h0cywgYWVzKHggPSBkZXBfZGVsYXkpICkgKyBnZW9tX2hpc3RvZ3JhbSgpDQoNCmdncGxvdCAoZGF0YSA9IG55Y2ZsaWdodHMsIGFlcyh4ID0gZGVwX2RlbGF5KSApICsgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGggPSAxNSkNCg0KZ2dwbG90IChkYXRhID0gbnljZmxpZ2h0cywgYWVzKHggPSBkZXBfZGVsYXkpICkgKyBnZW9tX2hpc3RvZ3JhbShiaW53aWR0aCA9IDE1MCkNCmBgYA0KDQojIyMjIFRvIG15IHdheSBvZiB0aGlua2luZywgbm9uZSBvZiB0aGVzZSBoaXN0b2dyYW1zIHdvcmsuICBUaGVyZSBhcmUgc2ltcGx5IHRvbyBtYW55IG9ic2VydmF0aW9ucyBmb3IgdGhpcyBoaXN0b2dyYW0gdG8gbWFrZSBzZW5zZS4gQWxzbywgd2hhdCBpcyB0aGUgZGVwX2RlbGF5PyAgSW4gbWludXRlcz8gDQoNCiMjIyBSZWR1Y2UgdGhlICMgb2Ygb2JzZXJ2YXRpb25zIGJ5IGxpbWl0aW5nIHRoZSBmaWxlIHRvIGZsaWdodHMgdG8gTEFYLiANCg0KYGBge3J9DQpsYXhfZmxpZ2h0cyA8LSBueWNmbGlnaHRzICU+JQ0KICBmaWx0ZXIoZGVzdCA9PSAiTEFYIikNCmdncGxvdChkYXRhID0gbGF4X2ZsaWdodHMsIGFlcyh4ID0gZGVwX2RlbGF5KSkgKw0KICBnZW9tX2hpc3RvZ3JhbSgpDQoNCmBgYA0KDQoNCg0KYGBge3J9DQpsYXhfZmxpZ2h0cyA8LSBueWNmbGlnaHRzICU+JQ0KICBmaWx0ZXIoZGVzdCA9PSAiTEFYIikNCmdncGxvdChkYXRhID0gbGF4X2ZsaWdodHMsIGFlcyh4ID0gZGVwX2RlbGF5KSkgKw0KICBnZW9tX2hpc3RvZ3JhbShiaW53aWR0aCA9IDUpDQpgYGANCg0KDQpgYGB7cn0NCmxheF9mbGlnaHRzICU+JQ0KICBzdW1tYXJpc2UgKG1lYW5fZGQgPSBtZWFuKGRlcF9kZWxheSksIA0KICAgICAgICAgICAgIG1lZGlhbl9kZCA9IG1lZGlhbihkZXBfZGVsYXkpLA0KICAgICAgICAgICAgIG4gICAgICAgICA9IG4oKSkNCmBgYA0KDQojIyMgRXhlcmNpc2UgMg0KDQojIyMjIEZpbHRlciBvbiBtdWx0aXBsZSBjcml0ZXJpYQ0KDQpgYGB7cn0NCnNmb19mZWJfZmxpZ2h0cyA8LSBueWNmbGlnaHRzICU+JQ0KICBmaWx0ZXIoZGVzdCA9PSAiU0ZPIiwgbW9udGggPT0yKQ0Kc3VtbWFyeShzZm9fZmViX2ZsaWdodHMpDQp3cml0ZS5jc3Yoc2ZvX2ZlYl9mbGlnaHRzLCAiQzovVXNlcnMvSmVyb21lL0RvY3VtZW50cy9NYXRoXzIxNy9zZm9fZmViX2ZsaWdodHMuY3N2IikNCmBgYA0KDQpgYGB7cn0NCndyaXRlLmNzdihueWNmbGlnaHRzLCAiQzovVXNlcnMvSmVyb21lL0RvY3VtZW50cy9NYXRoXzIxNy9ueWNmbGlnaHRzLmNzdiIpDQp3cml0ZS5jc3YobGF4X2ZsaWdodHMsICJDOi9Vc2Vycy9KZXJvbWUvRG9jdW1lbnRzL01hdGhfMjE3L2xheF9mbGlnaHRzLmNzdiIpDQpgYGANCmBgYHtyfQ0KDQpgYGANCg0KIyMjIEFsbCB0aGUgYWJvdmUgd2FzIGRvbmUgb24gMTAgU2VwdGVtYmVyIHByaW9pciB0byBjbGFzcy4gDQoNCk5vdyBJIG5lZWQgdG8gc3RhcnQgb3Zlci4gDQoNCmBgYHtyfQ0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KG9wZW5pbnRybykNCmxpYnJhcnkoZHBseXIpDQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KG9wZW5pbnRybykNCiNsaWJyYXJ5KG9pbGFicykNCmRhdGEoIm55Y2ZsaWdodHMiKQ0KDQoNCmBgYA0KDQoNCmBgYHtyfQ0KIyMjIFJlYWQgdGhlIGZpbGVzIEkgY3JlYXRlZCBiZWZvcmUgY2xhc3MNCg0KbGF4X2ZsaWdodHMgPC0gcmVhZC5jc3YoIkM6L1VzZXJzL0plcm9tZS9Eb2N1bWVudHMvTWF0aF8yMTcvbGF4X2ZsaWdodHMuY3N2IikNCnNmb19mZWJfZmxpZ2h0cyA8LSAoIkM6L1VzZXJzL0plcm9tZS9Eb2N1bWVudHMvTWF0aF8yMTcvc2ZvX2ZlYl9mbGlnaHRzLmNzdiIpDQpgYGANCg0KDQojIyMgRXhlcmNpc2UgMw0KSSB0cmllZCB0byBtYWtlIHRoZSBoaXN0b2dyYW0gd2l0aCB0aGUgc2ZvX2ZlYl9mbGlnaHRzIGZpbGUgaSBjcmVhdGVkIGJlZm9yZSBjbGFzcy4gSXQgZGlkbid0IHdvcmsuIEkgZ290IHRoZSBmb2xsb3dpbmcgZXJyb3IgbWVzc2FnZTogRXJyb3I6IGBkYXRhYCBtdXN0IGJlIGEgZGF0YSBmcmFtZSwgb3Igb3RoZXIgb2JqZWN0IGNvZXJjaWJsZSBieSBgZm9ydGlmeSgpYCwgbm90IGEgY2hhcmFjdGVyIHZlY3RvcnQNCg0KDQpgYGB7cn0NCg0KDQoNCiNnZ3Bsb3QgKGRhdGEgPSBzZm9fZmViX2ZsaWdodHMsIGFlcyh4ID0gZGVwX2RlbGF5KSkgKw0KICMgZ2VvbV9oaXN0b2dyYW0oNSkNCiNzdW1tYXJ5KHNmb19mZWJfZmxpZ2h0cyRkZXBfZGVsYXkpDQoNCmBgYA0KDQoNCiMjIyBTbyB3aGVuIHRoYXQgZGlkbid0IHdvcmssIEkgc2ltcGx5IHJlLWNyZWF0ZWQgdGhlIHNmb19mZWJfZmxpZ2h0cyBzdWJzZXQgd2l0aCBhIGRpZmZlcmVudCBuYW1lLiANCg0KYGBge3J9DQpzZm9fZmViX2ZsaWdodHNfMiA8LSBueWNmbGlnaHRzICU+JQ0KICBmaWx0ZXIoZGVzdCA9PSAiU0ZPIiwgbW9udGggPT0yKQ0Kc3VtbWFyeShzZm9fZmViX2ZsaWdodHNfMikNCmBgYA0KDQojIyNUaGVuIEkgcmUtcmFuIEV4ZXJjaXNlIDMgSGlzdG9ncmFtDQoNCmBgYHtyfQ0KZ2dwbG90KGRhdGE9c2ZvX2ZlYl9mbGlnaHRzXzIsIGFlcyAoeCA9IGRlcF9kZWxheSkpICsNCiAgZ2VvbV9oaXN0b2dyYW0oYmlucz01KQ0KYGBgDQoNCmBgYHtyfQ0Kc3VtbWFyeShzZm9fZmViX2ZsaWdodHNfMiRkZXBfZGVsYXkpDQoNCmBgYA0KDQpgYGB7cn0NCiNzdW1tYXJ5KHNmb19mZWJfZmxpZ2h0cyRkZXBfZGVsYXkpDQpgYGANCmBgYHtyfQ0Kc2ZvX2ZlYl9mbGlnaHRzXzIgJT4lDQpncm91cF9ieShvcmlnaW4pICU+JQ0KICBzdW1tYXJpemUobWVkaWFuX2RkID0gbWVkaWFuKGRlcF9kZWxheSksIGlxcl9kZCA9IElRUihkZXBfZGVsYXksKSwgbl9mbGlnaHRzPW4oKSkNCmBgYCAgICAgIA0KDQoNCiMjIyBFeGVyY2lzZSA0DQoNCmBgYHtyfQ0KDQpzZm9fZmViX2ZsaWdodHNfMiAlPiUNCiAgZ3JvdXBfYnkoY2FycmllcikgJT4lDQogIHN1bW1hcmlzZSAobWVkaWFuX2RkID0gbWVkaWFuKGRlcF9kZWxheSksIGlxcl9kZCA9IElRUihkZXBfZGVsYXkpLCBuX2ZsaWdodHMgPSBuKCkpICU+JQ0KICAgICAgICAgICAgICAgYXJyYW5nZSAoZGVzYyhpcXJfZGQpKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgDQpgYGAgICAgICAgICAgICAgDQoNCiMjIyMgRGVwYXJ0dXJlIERlbGF5cyBieSBNb250aCAtIFBhcnQgb2YgRXhlcmNpc2UgNA0KDQpgYGB7cn0NCm55Y2ZsaWdodHMgJT4lDQogIGdyb3VwX2J5IChtb250aCkgJT4lDQogIHN1bW1hcmlzZSAobWVhbl9kZCA9IG1lYW4oZGVwX2RlbGF5KSkgJT4lDQogIGFycmFuZ2UgKGRlc2MobWVhbl9kZCkpDQoNCg0KYGBgDQoNCiMjIyBFeGVyY2lzZSA1IE1lYW4gdnMuIE1lZGlhbiBEZXBhcnR1cmUgRGVsYXkNCg0KYGBge3J9DQpueWNmbGlnaHRzICU+JQ0KICBncm91cF9ieShtb250aCklPiUNCiAgc3VtbWFyaXNlIChtZWRpYW5fZGQgPSBtZWRpYW4oZGVwX2RlbGF5KSkgJT4lDQogIGFycmFuZ2UgKGRlc2MobWVkaWFuX2RkKSkNCg0KDQpgYGANCg0KIyMjIyBDcmVhdGUgTmV3IFZhcmlhYmxlIHcvIHRoZSBNdXRhdGUgRnVuY3Rpb24NCg0KYGBge3J9DQpueWNmbGlnaHRzIDwtbnljZmxpZ2h0cyAlPiUNCm11dGF0ZSAoZGVwX3R5cGUgPSBpZmVsc2UoZGVwX2RlbGF5IDw1LCAib24gdGltZSIsICJkZWxheWVkIikpDQpueWNmbGlnaHRzICU+JQ0KICBncm91cF9ieSAob3JpZ2luKSU+JQ0KICBzdW1tYXJpc2UgIChvdF9kZXBfcmF0ZSA9IHN1bShkZXBfdHlwZSA9PSAib24gdGltZSIpIC8gbigpKSAlPiUNCiAgYXJyYW5nZShkZXNjKG90X2RlcF9yYXRlKSkNCg0KYGBgDQoNCmBgYHtyfQ0KZ2dwbG90IChkYXRhID0gbnljZmxpZ2h0cywgYWVzKHg9b3JpZ2luLCBmaWxsID0gZGVwX3R5cGUpKSArDQogIGdlb21fYmFyKCkNCg0KDQpgYGANCg0KIyMjIEV4ZXJjaXNlIDcgLSBDcmVhdGUgbmV3IHZhcmlhYmxlIC0gYXZlcmFnZSBzcGVlZA0KDQpgYGB7cn0NCm5ldyA8LSBueWNmbGlnaHRzICU+JQ0KICBtdXRhdGUgKGF2Z19zcGVlZCA9IG1lYW4oZGlzdGFuY2UvKGFpcl90aW1lLzYwKSkpDQoNCg0KYGBgDQoNCiMjIyBFeGVyY2lzZSA4IFNjYXR0ZXJwbG90IG9mIEF2ZXJhZ2UgU3BlZWQgdnMuIERpc3RhbmNlDQoNCmBgYHtyfQ0KDQpwbG90MSA8LSBuZXcgJT4lDQogIGdncGxvdCAoYWVzKHggPSBkaXN0YW5jZSwgeSA9IGF2Z19zcGVlZCkpKw0KICBnZW9tX3BvaW50KCkNCnBsb3QxDQoNCmBgYA0KIyMjIEV4ZXJjaXNlIDkNCg0KYGBge3J9DQoNCnBsb3QyIDwtIG55Y2ZsaWdodHMgJT4lDQogIGZpbHRlciAoY2FycmllciA9PSAiQUEiIHwgY2FycmllciA9PSAiVUEiIHwgY2FycmllciA9PSAiREwiKSAlPiUgDQogIGdncGxvdCAoYWVzKHg9ZGVwX2RlbGF5LCB5ID0gYXJyX2RlbGF5LCBjb2xvciA9IGNhcnJpZXIpKSArDQogIGdlb21fcG9pbnQoKQ0KcGxvdDINCmBgYA0KDQojIyMjIyBBbnN3ZXIgdG8gdGhlIHF1ZXN0aW9uIGluICM5OiBBc3N1bWluZyB0aGUgeCBheGlzIHVuaXRzIGFyZSBtaW51dGVzLCBpdCBzZWVtcyB5b3UgY291bGQgaGF2ZSBhIGRlbGF5IG9mIHNsaWdodGx5IG1vcmUgdGhhbiBhbiBob3VyIChyb3VnaGx5IDcwIC0gODAgbWludXRlcykgYWJkIHN0aWxsIGFycml2ZSBvbiB0aW1lICh6ZXJvIG1pbnV0ZXMgYXJyaXZhbCBkZWxheSk=