• load packages
  • load data
    • Exercise 1
    • Exercise 2
    • Exercise 3
    • Exercise 4
    • Exercise 5
    • Exercise 6
    • Exercise 7
    • Exercise 8
    • Exercise 9

load packages

library(tidyverse)
library(openintro)

load data

data(nycflights)
names(nycflights)
##  [1] "year"      "month"     "day"       "dep_time"  "dep_delay" "arr_time" 
##  [7] "arr_delay" "carrier"   "tailnum"   "flight"    "origin"    "dest"     
## [13] "air_time"  "distance"  "hour"      "minute"
glimpse(nycflights)
## Rows: 32,735
## Columns: 16
## $ year      <int> 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, …
## $ month     <int> 6, 5, 12, 5, 7, 1, 12, 8, 9, 4, 6, 11, 4, 3, 10, 1, 2, 8, 10…
## $ day       <int> 30, 7, 8, 14, 21, 1, 9, 13, 26, 30, 17, 22, 26, 25, 21, 23, …
## $ dep_time  <int> 940, 1657, 859, 1841, 1102, 1817, 1259, 1920, 725, 1323, 940…
## $ dep_delay <dbl> 15, -3, -1, -4, -3, -3, 14, 85, -10, 62, 5, 5, -2, 115, -4, …
## $ arr_time  <int> 1216, 2104, 1238, 2122, 1230, 2008, 1617, 2032, 1027, 1549, …
## $ arr_delay <dbl> -4, 10, 11, -34, -8, 3, 22, 71, -8, 60, -4, -2, 22, 91, -6, …
## $ carrier   <chr> "VX", "DL", "DL", "DL", "9E", "AA", "WN", "B6", "AA", "EV", …
## $ tailnum   <chr> "N626VA", "N3760C", "N712TW", "N914DL", "N823AY", "N3AXAA", …
## $ flight    <int> 407, 329, 422, 2391, 3652, 353, 1428, 1407, 2279, 4162, 20, …
## $ origin    <chr> "JFK", "JFK", "JFK", "JFK", "LGA", "LGA", "EWR", "JFK", "LGA…
## $ dest      <chr> "LAX", "SJU", "LAX", "TPA", "ORF", "ORD", "HOU", "IAD", "MIA…
## $ air_time  <dbl> 313, 216, 376, 135, 50, 138, 240, 48, 148, 110, 50, 161, 87,…
## $ distance  <dbl> 2475, 1598, 2475, 1005, 296, 733, 1411, 228, 1096, 820, 264,…
## $ hour      <dbl> 9, 16, 8, 18, 11, 18, 12, 19, 7, 13, 9, 13, 8, 20, 12, 20, 6…
## $ minute    <dbl> 40, 57, 59, 41, 2, 17, 59, 20, 25, 23, 40, 20, 9, 54, 17, 24…

Exercise 1

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)

Look carefully at these three histograms. How do they compare? Are features revealed in one that are obscured in another?

Changing the binwidth helps to show features. The 2nd histogram is better representation of the data as it displays the breakdown accurately.

Exercise 2

Create a new data frame that includes flights headed to SFO in February, and save this data frame as sfo_feb_flights. How many flights meet these criteria?

68 flights meet this criteria.

sfo_feb_flights <- nycflights %>%
  filter(dest == "SFO", month == 2)

count(sfo_feb_flights)
## # A tibble: 1 × 1
##       n
##   <int>
## 1    68

Exercise 3

Describe the distribution of the arrival delays of these flights using a histogram and appropriate summary statistics. Hint: The summary statistics you use should depend on the shape of the distribution.

ggplot(data = sfo_feb_flights, aes(x = arr_delay)) +
  geom_histogram(binwidth = 15)

sfo_feb_flights %>%
  group_by(origin)%>%
  summarise( 
            min_ad = min(arr_delay),
            max_ad = max(arr_delay),        
            median_ad = median(arr_delay),
            iqr_ad = IQR(arr_delay),
            n_flights=n()
            )
## # A tibble: 2 × 6
##   origin min_ad max_ad median_ad iqr_ad n_flights
##   <chr>   <dbl>  <dbl>     <dbl>  <dbl>     <int>
## 1 EWR       -35      7     -15.5   17.5         8
## 2 JFK       -66    196     -10.5   22.8        60

Exercise 4

Calculate the median and interquartile range for arr_delays of flights in in the sfo_feb_flights data frame, grouped by carrier. Which carrier has the most variable arrival delays?

Delta (DL) and United Airlines (UA) have the largest IQR values and thus the most variable arrival delays.

sfo_feb_flights %>%
  group_by(carrier)%>%
  summarise( 
            min_ad = min(arr_delay),
            max_ad = max(arr_delay),        
            median_ad = median(arr_delay),
            iqr_ad = IQR(arr_delay),
            n_flights=n()
            )
## # A tibble: 5 × 6
##   carrier min_ad max_ad median_ad iqr_ad n_flights
##   <chr>    <dbl>  <dbl>     <dbl>  <dbl>     <int>
## 1 AA         -26     76       5     17.5        10
## 2 B6         -18     11     -10.5   12.2         6
## 3 DL         -48     48     -15     22          19
## 4 UA         -35    196     -10     22          21
## 5 VX         -66     99     -22.5   21.2        12

Exercise 5

Suppose you really dislike departure delays and you want to schedule your travel in a month that minimizes your potential departure delay leaving NYC. One option is to choose the month with the lowest mean departure delay. Another option is to choose the month with the lowest median departure delay. What are the pros and cons of these two choices?

The mean would give the average departure delay while the median would give the observation that sits at the middle of the data set.

The pro of using the mean is it accounts for outliers and it give you better ideas of the delay on average.

The pro of median is that it does not affected by extreme cases, however in this case, mean is a better option for decision making.

December is the month with the lowest average departure delay.

nycflights %>%
  group_by(month) %>%
  summarise(mean_dd = mean(dep_delay)) %>%
  arrange(desc(mean_dd))
## # A tibble: 12 × 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 6

If you were selecting an airport simply based on on time departure percentage, which NYC airport would you choose to fly out of?

LaGuardia (LGA) airport.

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))
## # A tibble: 3 × 2
##   origin ot_dep_rate
##   <chr>        <dbl>
## 1 LGA          0.728
## 2 JFK          0.694
## 3 EWR          0.637

Exercise 7

Mutate the data frame so that it includes a new variable that contains the average speed, avg_speed traveled by the plane for each flight (in mph). Hint: Average speed can be calculated as distance divided by number of hours of travel, and note that air_time is given in minutes.

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

Exercise 8

Make a scatterplot of avg_speed vs. distance. Describe the relationship between average speed and distance. Hint: Use geom_point().

The average speed increases until the distance is in the range of 1000-1500 (miles) and then it stabilizes.

ggplot(data = nycflights, mapping = aes(x = distance, y = avg_speed)) +
        geom_point()

Exercise 9

Replicate the following plot. Hint: The data frame plotted only contains flights from American Airlines, Delta Airlines, and United Airlines, and the points are colored by carrier. Once you replicate the plot, determine (roughly) what the cutoff point is for departure delays where you can still expect to get to your destination on time.

c_delay <- nycflights %>%
  filter(carrier == 'AA' | carrier == 'DL' | carrier == 'UA')
ggplot(c_delay, aes(dep_delay, arr_delay, color = carrier)) + geom_point()

Based on the below plot, the cutoff point is approximately 20mins. After this point, as departure delays climb so do arrival delays.

ggplot(c_delay, aes(dep_delay, arr_delay, color = carrier)) +
        xlim(-10, 60) +
        ylim(-10, 60) +
        geom_point()
## Warning: Removed 7108 rows containing missing values (`geom_point()`).

LS0tCnRpdGxlOiAiREFUQSA2MDYgTGFiIDIiCmF1dGhvcjogIllpbmEgUWlhbyIKZGF0ZTogImByIFN5cy5EYXRlKClgIgpvdXRwdXQ6IG9wZW5pbnRybzo6bGFiX3JlcG9ydAotLS0KIyMgbG9hZCBwYWNrYWdlcwpgYGB7ciBsb2FkLXBhY2thZ2VzLCBtZXNzYWdlPUZBTFNFfQpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShvcGVuaW50cm8pCmBgYAojIyBsb2FkIGRhdGEKCmBgYHtyIGxvYWQtZGF0YSwgbWVzc2FnZT1GQUxTRX0KZGF0YShueWNmbGlnaHRzKQpgYGAKCgpgYGB7ciBuYW1lcywgbWVzc2FnZT1GQUxTRX0KbmFtZXMobnljZmxpZ2h0cykKYGBgCgpgYGB7cn0KZ2xpbXBzZShueWNmbGlnaHRzKQpgYGAKCiMjIyBFeGVyY2lzZSAxCmBgYHtyfQpnZ3Bsb3QoZGF0YSA9IG55Y2ZsaWdodHMsIGFlcyh4ID0gZGVwX2RlbGF5KSkgKwogIGdlb21faGlzdG9ncmFtKCkKCmdncGxvdChkYXRhID0gbnljZmxpZ2h0cywgYWVzKHggPSBkZXBfZGVsYXkpKSArCiAgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGggPSAxNSkKCmdncGxvdChkYXRhID0gbnljZmxpZ2h0cywgYWVzKHggPSBkZXBfZGVsYXkpKSArCiAgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGggPSAxNTApCgpgYGAKCgpMb29rIGNhcmVmdWxseSBhdCB0aGVzZSB0aHJlZSBoaXN0b2dyYW1zLiBIb3cgZG8gdGhleSBjb21wYXJlPyBBcmUgZmVhdHVyZXMgcmV2ZWFsZWQgaW4gb25lIHRoYXQgYXJlIG9ic2N1cmVkIGluIGFub3RoZXI/CgpDaGFuZ2luZyB0aGUgYmlud2lkdGggaGVscHMgdG8gc2hvdyBmZWF0dXJlcy4gVGhlIDJuZCBoaXN0b2dyYW0gaXMgYmV0dGVyIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBkYXRhIGFzIGl0IGRpc3BsYXlzIHRoZSBicmVha2Rvd24gYWNjdXJhdGVseS4KCgojIyMgRXhlcmNpc2UgMgoKQ3JlYXRlIGEgbmV3IGRhdGEgZnJhbWUgdGhhdCBpbmNsdWRlcyBmbGlnaHRzIGhlYWRlZCB0byBTRk8gaW4gRmVicnVhcnksIGFuZCBzYXZlIHRoaXMgZGF0YSBmcmFtZSBhcyBzZm9fZmViX2ZsaWdodHMuIEhvdyBtYW55IGZsaWdodHMgbWVldCB0aGVzZSBjcml0ZXJpYT8KCjY4IGZsaWdodHMgbWVldCB0aGlzIGNyaXRlcmlhLgoKYGBge3J9CnNmb19mZWJfZmxpZ2h0cyA8LSBueWNmbGlnaHRzICU+JQogIGZpbHRlcihkZXN0ID09ICJTRk8iLCBtb250aCA9PSAyKQoKY291bnQoc2ZvX2ZlYl9mbGlnaHRzKQpgYGAKCiMjIyBFeGVyY2lzZSAzCgoqKkRlc2NyaWJlIHRoZSBkaXN0cmlidXRpb24gb2YgdGhlIGFycml2YWwgZGVsYXlzIG9mIHRoZXNlIGZsaWdodHMgdXNpbmcgYSBoaXN0b2dyYW0gYW5kIGFwcHJvcHJpYXRlIHN1bW1hcnkgc3RhdGlzdGljcy4gSGludDogVGhlIHN1bW1hcnkgc3RhdGlzdGljcyB5b3UgdXNlIHNob3VsZCBkZXBlbmQgb24gdGhlIHNoYXBlIG9mIHRoZSBkaXN0cmlidXRpb24uKioKCmBgYHtyfQpnZ3Bsb3QoZGF0YSA9IHNmb19mZWJfZmxpZ2h0cywgYWVzKHggPSBhcnJfZGVsYXkpKSArCiAgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGggPSAxNSkKCmBgYAoKYGBge3J9CnNmb19mZWJfZmxpZ2h0cyAlPiUKICBncm91cF9ieShvcmlnaW4pJT4lCiAgc3VtbWFyaXNlKCAKICAgICAgICAgICAgbWluX2FkID0gbWluKGFycl9kZWxheSksCiAgICAgICAgICAgIG1heF9hZCA9IG1heChhcnJfZGVsYXkpLCAgICAgICAgCiAgICAgICAgICAgIG1lZGlhbl9hZCA9IG1lZGlhbihhcnJfZGVsYXkpLAogICAgICAgICAgICBpcXJfYWQgPSBJUVIoYXJyX2RlbGF5KSwKICAgICAgICAgICAgbl9mbGlnaHRzPW4oKQogICAgICAgICAgICApCmBgYAoKIyMjIEV4ZXJjaXNlIDQKCioqQ2FsY3VsYXRlIHRoZSBtZWRpYW4gYW5kIGludGVycXVhcnRpbGUgcmFuZ2UgZm9yIGFycl9kZWxheXMgb2YgZmxpZ2h0cyBpbiBpbiB0aGUgc2ZvX2ZlYl9mbGlnaHRzIGRhdGEgZnJhbWUsIGdyb3VwZWQgYnkgY2Fycmllci4gV2hpY2ggY2FycmllciBoYXMgdGhlIG1vc3QgdmFyaWFibGUgYXJyaXZhbCBkZWxheXM/KioKCkRlbHRhIChETCkgYW5kIFVuaXRlZCBBaXJsaW5lcyAoVUEpIGhhdmUgdGhlIGxhcmdlc3QgSVFSIHZhbHVlcyBhbmQgdGh1cyB0aGUgbW9zdCB2YXJpYWJsZSBhcnJpdmFsIGRlbGF5cy4KCmBgYHtyfQpzZm9fZmViX2ZsaWdodHMgJT4lCiAgZ3JvdXBfYnkoY2FycmllciklPiUKICBzdW1tYXJpc2UoIAogICAgICAgICAgICBtaW5fYWQgPSBtaW4oYXJyX2RlbGF5KSwKICAgICAgICAgICAgbWF4X2FkID0gbWF4KGFycl9kZWxheSksICAgICAgICAKICAgICAgICAgICAgbWVkaWFuX2FkID0gbWVkaWFuKGFycl9kZWxheSksCiAgICAgICAgICAgIGlxcl9hZCA9IElRUihhcnJfZGVsYXkpLAogICAgICAgICAgICBuX2ZsaWdodHM9bigpCiAgICAgICAgICAgICkKYGBgCgojIyMgRXhlcmNpc2UgNQoKKipTdXBwb3NlIHlvdSByZWFsbHkgZGlzbGlrZSBkZXBhcnR1cmUgZGVsYXlzIGFuZCB5b3Ugd2FudCB0byBzY2hlZHVsZSB5b3VyIHRyYXZlbCBpbiBhIG1vbnRoIHRoYXQgbWluaW1pemVzIHlvdXIgcG90ZW50aWFsIGRlcGFydHVyZSBkZWxheSBsZWF2aW5nIE5ZQy4gT25lIG9wdGlvbiBpcyB0byBjaG9vc2UgdGhlIG1vbnRoIHdpdGggdGhlIGxvd2VzdCBtZWFuIGRlcGFydHVyZSBkZWxheS4gQW5vdGhlciBvcHRpb24gaXMgdG8gY2hvb3NlIHRoZSBtb250aCB3aXRoIHRoZSBsb3dlc3QgbWVkaWFuIGRlcGFydHVyZSBkZWxheS4gV2hhdCBhcmUgdGhlIHByb3MgYW5kIGNvbnMgb2YgdGhlc2UgdHdvIGNob2ljZXM/KioKClRoZSBtZWFuIHdvdWxkIGdpdmUgdGhlIGF2ZXJhZ2UgZGVwYXJ0dXJlIGRlbGF5IHdoaWxlIHRoZSBtZWRpYW4gd291bGQgZ2l2ZSB0aGUgb2JzZXJ2YXRpb24gdGhhdCBzaXRzIGF0IHRoZSBtaWRkbGUgb2YgdGhlIGRhdGEgc2V0LiAKClRoZSBwcm8gb2YgdXNpbmcgdGhlIG1lYW4gaXMgaXQgYWNjb3VudHMgZm9yIG91dGxpZXJzIGFuZCBpdCBnaXZlIHlvdSBiZXR0ZXIgaWRlYXMgb2YgdGhlIGRlbGF5IG9uIGF2ZXJhZ2UuCgpUaGUgcHJvIG9mIG1lZGlhbiBpcyB0aGF0IGl0IGRvZXMgbm90IGFmZmVjdGVkIGJ5IGV4dHJlbWUgY2FzZXMsIGhvd2V2ZXIgaW4gdGhpcyBjYXNlLCBtZWFuIGlzIGEgYmV0dGVyIG9wdGlvbiBmb3IgZGVjaXNpb24gbWFraW5nLiAKCgoKRGVjZW1iZXIgaXMgdGhlIG1vbnRoIHdpdGggdGhlIGxvd2VzdCBhdmVyYWdlIGRlcGFydHVyZSBkZWxheS4KCmBgYHtyfQpueWNmbGlnaHRzICU+JQogIGdyb3VwX2J5KG1vbnRoKSAlPiUKICBzdW1tYXJpc2UobWVhbl9kZCA9IG1lYW4oZGVwX2RlbGF5KSkgJT4lCiAgYXJyYW5nZShkZXNjKG1lYW5fZGQpKQpgYGAKCiMjIyBFeGVyY2lzZSA2CgoqKklmIHlvdSB3ZXJlIHNlbGVjdGluZyBhbiBhaXJwb3J0IHNpbXBseSBiYXNlZCBvbiBvbiB0aW1lIGRlcGFydHVyZSBwZXJjZW50YWdlLCB3aGljaCBOWUMgYWlycG9ydCB3b3VsZCB5b3UgY2hvb3NlIHRvIGZseSBvdXQgb2Y/KioKCkxhR3VhcmRpYSAoTEdBKSBhaXJwb3J0LgoKYGBge3J9Cm55Y2ZsaWdodHMgPC0gbnljZmxpZ2h0cyAlPiUKICBtdXRhdGUoZGVwX3R5cGUgPSBpZmVsc2UoZGVwX2RlbGF5IDwgNSwgIm9uIHRpbWUiLCAiZGVsYXllZCIpKQpgYGAKCmBgYHtyfQpueWNmbGlnaHRzICU+JQogIGdyb3VwX2J5KG9yaWdpbikgJT4lCiAgc3VtbWFyaXNlKG90X2RlcF9yYXRlID0gc3VtKGRlcF90eXBlID09ICJvbiB0aW1lIikgLyBuKCkpICU+JQogIGFycmFuZ2UoZGVzYyhvdF9kZXBfcmF0ZSkpCmBgYAoKIyMjIEV4ZXJjaXNlIDcKCioqTXV0YXRlIHRoZSBkYXRhIGZyYW1lIHNvIHRoYXQgaXQgaW5jbHVkZXMgYSBuZXcgdmFyaWFibGUgdGhhdCBjb250YWlucyB0aGUgYXZlcmFnZSBzcGVlZCwgYGF2Z19zcGVlZGAgdHJhdmVsZWQgYnkgdGhlIHBsYW5lIGZvciBlYWNoIGZsaWdodCAoaW4gbXBoKS4gSGludDogQXZlcmFnZSBzcGVlZCBjYW4gYmUgY2FsY3VsYXRlZCBhcyBkaXN0YW5jZSBkaXZpZGVkIGJ5IG51bWJlciBvZiBob3VycyBvZiB0cmF2ZWwsIGFuZCBub3RlIHRoYXQgYGFpcl90aW1lYCBpcyBnaXZlbiBpbiBtaW51dGVzLioqCgoKYGBge3J9Cm55Y2ZsaWdodHMgPC0gbnljZmxpZ2h0cyAlPiUKICBtdXRhdGUoYXZnX3NwZWVkID0gZGlzdGFuY2UgLyAoYWlyX3RpbWUgLyA2MCkpCmBgYAoKIyMjIEV4ZXJjaXNlIDgKCioqTWFrZSBhIHNjYXR0ZXJwbG90IG9mIGF2Z19zcGVlZCB2cy4gZGlzdGFuY2UuIERlc2NyaWJlIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBhdmVyYWdlIHNwZWVkIGFuZCBkaXN0YW5jZS4gSGludDogVXNlIGdlb21fcG9pbnQoKS4qKgoKVGhlIGF2ZXJhZ2Ugc3BlZWQgaW5jcmVhc2VzIHVudGlsIHRoZSBkaXN0YW5jZSBpcyBpbiB0aGUgcmFuZ2Ugb2YgMTAwMC0xNTAwIChtaWxlcykgYW5kIHRoZW4gaXQgc3RhYmlsaXplcy4gCgpgYGB7cn0KZ2dwbG90KGRhdGEgPSBueWNmbGlnaHRzLCBtYXBwaW5nID0gYWVzKHggPSBkaXN0YW5jZSwgeSA9IGF2Z19zcGVlZCkpICsKICAgICAgICBnZW9tX3BvaW50KCkKYGBgCgojIyMgRXhlcmNpc2UgOQoKKipSZXBsaWNhdGUgdGhlIGZvbGxvd2luZyBwbG90LiBIaW50OiBUaGUgZGF0YSBmcmFtZSBwbG90dGVkIG9ubHkgY29udGFpbnMgZmxpZ2h0cyBmcm9tIEFtZXJpY2FuIEFpcmxpbmVzLCBEZWx0YSBBaXJsaW5lcywgYW5kIFVuaXRlZCBBaXJsaW5lcywgYW5kIHRoZSBwb2ludHMgYXJlIGNvbG9yZWQgYnkgY2Fycmllci4gT25jZSB5b3UgcmVwbGljYXRlIHRoZSBwbG90LCBkZXRlcm1pbmUgKHJvdWdobHkpIHdoYXQgdGhlIGN1dG9mZiBwb2ludCBpcyBmb3IgZGVwYXJ0dXJlIGRlbGF5cyB3aGVyZSB5b3UgY2FuIHN0aWxsIGV4cGVjdCB0byBnZXQgdG8geW91ciBkZXN0aW5hdGlvbiBvbiB0aW1lLioqCgpgYGB7cn0KCmNfZGVsYXkgPC0gbnljZmxpZ2h0cyAlPiUKICBmaWx0ZXIoY2FycmllciA9PSAnQUEnIHwgY2FycmllciA9PSAnREwnIHwgY2FycmllciA9PSAnVUEnKQpnZ3Bsb3QoY19kZWxheSwgYWVzKGRlcF9kZWxheSwgYXJyX2RlbGF5LCBjb2xvciA9IGNhcnJpZXIpKSArIGdlb21fcG9pbnQoKQoKYGBgCgpCYXNlZCBvbiB0aGUgYmVsb3cgcGxvdCwgdGhlIGN1dG9mZiBwb2ludCBpcyBhcHByb3hpbWF0ZWx5IDIwbWlucy4gQWZ0ZXIgdGhpcyBwb2ludCwgYXMgZGVwYXJ0dXJlIGRlbGF5cyBjbGltYiBzbyBkbyBhcnJpdmFsIGRlbGF5cy4KCmBgYHtyfQpnZ3Bsb3QoY19kZWxheSwgYWVzKGRlcF9kZWxheSwgYXJyX2RlbGF5LCBjb2xvciA9IGNhcnJpZXIpKSArCiAgICAgICAgeGxpbSgtMTAsIDYwKSArCiAgICAgICAgeWxpbSgtMTAsIDYwKSArCiAgICAgICAgZ2VvbV9wb2ludCgpCmBgYA==