1. Election Results
The votes for Iowa and nearby states:
library(dplyr)
library(ggplot2)
if (! file.exists("election2024.csv"))
download.file("http://www.stat.uiowa.edu/~luke/data/election2024.csv",
"election2024.csv")
election2024 <- read.csv("election2024.csv")
state_abb <- data.frame(state = state.name, abb = state.abb)
election <- left_join(election2024, state_abb, "state")
nearby_states <- c("IA", "IL", "WI", "MN", "SD", "MO", "NE")
election_nearby <- filter(election, abb %in% nearby_states) |>
mutate(candidate = factor(candidate, c("Harris", "Other", "Trump")))
select(election_nearby, state, candidate, votes) |>
tidyr::pivot_wider(names_from = "candidate", values_from = "votes") |>
gt::gt() |>
gt::fmt_integer()
| state |
Harris |
Trump |
Other |
| Illinois |
3,062,863 |
2,449,079 |
121,368 |
| Iowa |
707,278 |
927,019 |
29,209 |
| Minnesota |
1,656,979 |
1,519,032 |
77,909 |
| Missouri |
1,200,599 |
1,751,986 |
42,742 |
| Nebraska |
369,995 |
564,816 |
12,348 |
| South Dakota |
146,859 |
272,081 |
9,982 |
| Wisconsin |
1,668,229 |
1,697,626 |
49,932 |
The three plots:
p <- ggplot(election_nearby, aes(x = state, y = votes, fill = candidate)) +
scale_fill_manual(values = c(Trump = scales::muted("red"),
Harris = scales::muted("blue"),
Other = "grey")) +
labs(x = "") +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1))
p_bar <- p + geom_col()
p_fill <- p + geom_col(position = "fill")
library(ggmosaic)
library(forcats)
p_spine <- p +
mutate(election_nearby, candidate = fct_rev(factor(candidate))) +
geom_mosaic(aes(x = product(abb), weight = votes, fill = candidate))
library(patchwork)
(p_bar + guides(fill = "none") + labs(title = "Stacked Bar Chart")) +
(p_fill + guides(fill = "none") + labs(title = "Filled Bar Chart")) +
(p_spine + labs(title = "Spine Plot"))

The stacked bar chart clearly shows the differing vote totals, but
does not make it easy to compare vote proportions from one state to
another. The filled version makes comparing proportions easy but does
not show the differing vote totals. The spine chart also makes comparing
proportions across states easy, and also reflects the differing vote
totals in the widths of the bars. For the stated purpose the spine chart
is the best choice.
3. Cancellations and Destination Location
For the first three months of 2013, compute the number of flights,
the average arrival delay, and the proportion of canceled flights to
each of the destinations. Assume a flight is canceled it its departure
time and arrival time are both missing.
It is useful to add a canceled variable to the
flights table, assuming that canceled flights are those
with both dep_time and arr_time missing:
library(dplyr)
library(nycflights13)
flights <- mutate(flights, canceled = is.na(dep_time) & is.na(arr_time))
For each destination and the first three months, compute the number
of flights, percent canceled, and average arrival delay:
fl3 <- filter(flights, month <= 3) |>
group_by(dest) |>
summarize(n = n(),
pcan = 100 * mean(canceled),
delay = mean(arr_delay, na.rm = TRUE)) |>
ungroup()
Focus on the top 50 destinations in terms of the number of flights
from NYC during the first three months of 2013.
fl3_50 <- slice_max(fl3, n, n = 50)
Create a map with a point at each of these destinations, and encode
the proportion of canceled flights in the point’s size. Comment on what
you see.
To show the data on a map, add location information by joining with
data from the airports table:
fl3_50 <- left_join(fl3_50,
select(airports, faa, lat, lon, alt),
c("dest" = "faa"))
A map showing the cancellation percentages for the top 50
destinations:
library(ggplot2)
pm <- ggplot(fl3_50, aes(x = lon, y = lat)) +
borders("state") +
coord_map() +
theme_void()
## Warning: `borders()` was deprecated in ggplot2 4.0.0.
## ℹ Please use `annotation_borders()` instead.
## This warning is displayed once per session.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
pm + geom_point(aes(size = pcan)) + scale_size_area()
## Warning: Removed 1 row containing missing values or values outside the scale range
## (`geom_point()`).

[The map only shows 49 airports since SJU (San Juan, Puerto Rico) is
one of the top 50 but not in the airports date frame.]
Using alpha blending can help with the over-plotting along the east
coast:
pm + geom_point(aes(size = pcan), alpha = 0.3) + scale_size_area()
## Warning: Removed 1 row containing missing values or values outside the scale range
## (`geom_point()`).

Cancellation percentages are higher for closer airports and airports
likely to be experiencing similar weather conditions.
In addition to the location and proportion of canceled flights,
whether the average arrival delay is more or less than 20 minutes could
be encoded using color or shape. Try both approaches, comment on what
you see and on the advantages and disadvantages of each approach.
Whether the average delay is 20 minutes or more can be encoded in
using color or shape:
pm + geom_point(aes(size = pcan, color = delay >= 20)) + scale_size_area()
## Warning: Removed 1 row containing missing values or values outside the scale range
## (`geom_point()`).

pm + geom_point(aes(size = pcan, shape = delay >= 20)) + scale_size_area()
## Warning: Removed 1 row containing missing values or values outside the scale range
## (`geom_point()`).

For a 15 minute cutoff there are a few more high delay
destinations:
pm + geom_point(aes(size = pcan, color = delay >= 15)) + scale_size_area()
## Warning: Removed 1 row containing missing values or values outside the scale range
## (`geom_point()`).

pm + geom_point(aes(size = pcan, shape = delay >= 15)) + scale_size_area()
## Warning: Removed 1 row containing missing values or values outside the scale range
## (`geom_point()`).

The size and shape channels interfere with each other quite a bit;
color and size interfere with each other much less. Picking out the
rarer shapes is also harder than spotting the different colors: color
achieves better pop-out.
LS0tCnRpdGxlOiAiQXNzaWdubWVudCA3IE5vdGVzIgpvdXRwdXQ6CiAgaHRtbF9kb2N1bWVudDoKICAgIHRvYzogeWVzCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlCiAgICBjb2RlX2ZvbGRpbmc6ICJoaWRlIgotLS0KCmBgYHtyIGdsb2JhbF9vcHRpb25zLCBpbmNsdWRlID0gRkFMU0V9CmtuaXRyOjpvcHRzX2NodW5rJHNldChjb2xsYXBzZSA9IFRSVUUsIGZpZy5hbGlnbiA9ICJjZW50ZXIiKQpgYGAKCiMjIDEuIEVsZWN0aW9uIFJlc3VsdHMKCgpUaGUgdm90ZXMgZm9yIElvd2EgYW5kIG5lYXJieSBzdGF0ZXM6CgpgYGB7ciwgbWVzc2FnZSA9IEZBTFNFfQpsaWJyYXJ5KGRwbHlyKQpsaWJyYXJ5KGdncGxvdDIpCmlmICghIGZpbGUuZXhpc3RzKCJlbGVjdGlvbjIwMjQuY3N2IikpCiAgICBkb3dubG9hZC5maWxlKCJodHRwOi8vd3d3LnN0YXQudWlvd2EuZWR1L35sdWtlL2RhdGEvZWxlY3Rpb24yMDI0LmNzdiIsCiAgICAgICAgICAgICAgICAgICJlbGVjdGlvbjIwMjQuY3N2IikKZWxlY3Rpb24yMDI0IDwtIHJlYWQuY3N2KCJlbGVjdGlvbjIwMjQuY3N2IikKc3RhdGVfYWJiIDwtIGRhdGEuZnJhbWUoc3RhdGUgPSBzdGF0ZS5uYW1lLCBhYmIgPSBzdGF0ZS5hYmIpCmVsZWN0aW9uIDwtIGxlZnRfam9pbihlbGVjdGlvbjIwMjQsIHN0YXRlX2FiYiwgInN0YXRlIikKbmVhcmJ5X3N0YXRlcyA8LSBjKCJJQSIsICJJTCIsICJXSSIsICJNTiIsICJTRCIsICJNTyIsICJORSIpCmVsZWN0aW9uX25lYXJieSA8LSBmaWx0ZXIoZWxlY3Rpb24sIGFiYiAlaW4lIG5lYXJieV9zdGF0ZXMpIHw+CiAgICBtdXRhdGUoY2FuZGlkYXRlID0gZmFjdG9yKGNhbmRpZGF0ZSwgYygiSGFycmlzIiwgIk90aGVyIiwgIlRydW1wIikpKQoKc2VsZWN0KGVsZWN0aW9uX25lYXJieSwgc3RhdGUsIGNhbmRpZGF0ZSwgdm90ZXMpIHw+CiAgICB0aWR5cjo6cGl2b3Rfd2lkZXIobmFtZXNfZnJvbSA9ICJjYW5kaWRhdGUiLCB2YWx1ZXNfZnJvbSA9ICJ2b3RlcyIpIHw+CiAgICBndDo6Z3QoKSB8PgogICAgZ3Q6OmZtdF9pbnRlZ2VyKCkKYGBgCgpUaGUgdGhyZWUgcGxvdHM6CgoKYGBge3IsIGZpZy53aWR0aCA9IDExLCBmaWcuaGVpZ2h0ID0gNH0KcCA8LSBnZ3Bsb3QoZWxlY3Rpb25fbmVhcmJ5LCBhZXMoeCA9IHN0YXRlLCB5ID0gdm90ZXMsIGZpbGwgPSBjYW5kaWRhdGUpKSArCiAgICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKFRydW1wID0gc2NhbGVzOjptdXRlZCgicmVkIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhcnJpcyA9IHNjYWxlczo6bXV0ZWQoImJsdWUiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3RoZXIgPSAiZ3JleSIpKSArCiAgICBsYWJzKHggPSAiIikgKwogICAgdGhlbWVfbWluaW1hbCgpICsKICAgIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSkpCgpwX2JhciA8LSBwICsgZ2VvbV9jb2woKQpwX2ZpbGwgPC0gcCArIGdlb21fY29sKHBvc2l0aW9uID0gImZpbGwiKQpsaWJyYXJ5KGdnbW9zYWljKQpsaWJyYXJ5KGZvcmNhdHMpCnBfc3BpbmUgPC0gcCArCiAgICBtdXRhdGUoZWxlY3Rpb25fbmVhcmJ5LCBjYW5kaWRhdGUgPSBmY3RfcmV2KGZhY3RvcihjYW5kaWRhdGUpKSkgKwogICAgZ2VvbV9tb3NhaWMoYWVzKHggPSBwcm9kdWN0KGFiYiksIHdlaWdodCA9IHZvdGVzLCBmaWxsID0gY2FuZGlkYXRlKSkKbGlicmFyeShwYXRjaHdvcmspCihwX2JhciArIGd1aWRlcyhmaWxsID0gIm5vbmUiKSArIGxhYnModGl0bGUgPSAiU3RhY2tlZCBCYXIgQ2hhcnQiKSkgKwogICAgKHBfZmlsbCArIGd1aWRlcyhmaWxsID0gIm5vbmUiKSArIGxhYnModGl0bGUgPSAiRmlsbGVkIEJhciBDaGFydCIpKSArCiAgICAocF9zcGluZSArIGxhYnModGl0bGUgPSAiU3BpbmUgUGxvdCIpKQpgYGAKClRoZSBzdGFja2VkIGJhciBjaGFydCBjbGVhcmx5IHNob3dzIHRoZSBkaWZmZXJpbmcgdm90ZSB0b3RhbHMsIGJ1dApkb2VzIG5vdCBtYWtlIGl0IGVhc3kgdG8gY29tcGFyZSB2b3RlIHByb3BvcnRpb25zIGZyb20gb25lIHN0YXRlIHRvCmFub3RoZXIuIFRoZSBmaWxsZWQgdmVyc2lvbiBtYWtlcyBjb21wYXJpbmcgcHJvcG9ydGlvbnMgZWFzeSBidXQgZG9lcwpub3Qgc2hvdyB0aGUgZGlmZmVyaW5nIHZvdGUgdG90YWxzLiBUaGUgc3BpbmUgY2hhcnQgYWxzbyBtYWtlcwpjb21wYXJpbmcgcHJvcG9ydGlvbnMgYWNyb3NzIHN0YXRlcyBlYXN5LCBhbmQgYWxzbyByZWZsZWN0cyB0aGUKZGlmZmVyaW5nIHZvdGUgdG90YWxzIGluIHRoZSB3aWR0aHMgb2YgdGhlIGJhcnMuIEZvciB0aGUgc3RhdGVkCnB1cnBvc2UgdGhlIHNwaW5lIGNoYXJ0IGlzIHRoZSBiZXN0IGNob2ljZS4KCiMjIDIuIEdhcG1pbmRlciBUb29sdGlwcwoKRmlyc3QgY3JlYXRlIHRoZSBwbG90IG9iamVjdCB3aXRoIGEgYHRleHRgIGFlc3RoZXRpYyBtYXBwZWQgdG8gYGNvdW50cnlgOgoKYGBge3IsIG1lc3NhZ2UgPSBGQUxTRX0KbGlicmFyeShkcGx5cikKbGlicmFyeShnZ3Bsb3QyKQp0aGVtZV9zZXQodGhlbWVfbWluaW1hbCgpICsgdGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTYpKSkKbGlicmFyeShnYXBtaW5kZXIpCmdhcCA8LSBmaWx0ZXIoZ2FwbWluZGVyLCB5ZWFyICUlIDEwID09IDcgJiB5ZWFyID49IDE5NzcpCnAgPC0gZ2dwbG90KGdhcCwgYWVzKHggPSBnZHBQZXJjYXAsIHkgPSBsaWZlRXhwLAogICAgICAgICAgICAgICAgICAgICBjb2xvciA9IGNvbnRpbmVudCwKICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IHBvcCwKICAgICAgICAgICAgICAgICAgICAgdGV4dCA9IGNvdW50cnkpKSArCiAgICBnZW9tX3BvaW50KCkgKwogICAgc2NhbGVfc2l6ZV9hcmVhKG1heF9zaXplID0gOCkgKwogICAgc2NhbGVfeF9sb2cxMCgpICsKICAgIGZhY2V0X3dyYXAofiB5ZWFyKQpgYGAKClRoZW4gc3BlY2lmeSB0aGUgYHRleHRgIGFlc3RoZXRpYyBhcyB0aGUgYHRvb2x0aXBgIGluIHRoZSBgZ2dwbG90bHlgCmNhbGwuICBUaGUgYHN0eWxlYCBmdW5jdGlvbiBmcm9tIGBwbG90bHlgIGNhbiBiZSB1c2VkIHRvIGFkanVzdCB0aGUKYmFja2dyb3VuZCBjb2xvci4KCgpgYGB7ciwgbWVzc2FnZSA9IEZBTFNFfQpsaWJyYXJ5KHBsb3RseSkKcHAgPC0gZ2dwbG90bHkocCwgdG9vbHRpcCA9ICJ0ZXh0IikKc3R5bGUocHAsIGhvdmVybGFiZWwgPSBsaXN0KGJnY29sb3IgPSAid2hpdGUiKSkKYGBgCgojIyAzLiBDYW5jZWxsYXRpb25zIGFuZCBEZXN0aW5hdGlvbiBMb2NhdGlvbgoKPiBGb3IgdGhlIGZpcnN0IHRocmVlIG1vbnRocyBvZiAyMDEzLCBjb21wdXRlIHRoZSBudW1iZXIgb2YgZmxpZ2h0cywKPiB0aGUgYXZlcmFnZSBhcnJpdmFsIGRlbGF5LCBhbmQgdGhlIHByb3BvcnRpb24gb2YgY2FuY2VsZWQgZmxpZ2h0cyB0bwo+IGVhY2ggb2YgdGhlIGRlc3RpbmF0aW9ucy4gQXNzdW1lIGEgZmxpZ2h0IGlzIGNhbmNlbGVkIGl0IGl0cwo+IGRlcGFydHVyZSB0aW1lIGFuZCBhcnJpdmFsIHRpbWUgYXJlIGJvdGggbWlzc2luZy4KCkl0IGlzIHVzZWZ1bCB0byBhZGQgYSBgY2FuY2VsZWRgIHZhcmlhYmxlIHRvIHRoZSBgZmxpZ2h0c2AgdGFibGUsCmFzc3VtaW5nIHRoYXQgY2FuY2VsZWQgZmxpZ2h0cyBhcmUgdGhvc2Ugd2l0aCBib3RoIGBkZXBfdGltZWAgYW5kCmBhcnJfdGltZWAgbWlzc2luZzoKCmBgYHtyLCBtZXNzYWdlID0gRkFMU0UsIGNsYXNzLnNvdXJjZSA9ICJmb2xkLXNob3cifQpsaWJyYXJ5KGRwbHlyKQpsaWJyYXJ5KG55Y2ZsaWdodHMxMykKZmxpZ2h0cyA8LSBtdXRhdGUoZmxpZ2h0cywgY2FuY2VsZWQgPSBpcy5uYShkZXBfdGltZSkgJiBpcy5uYShhcnJfdGltZSkpCmBgYAoKRm9yIGVhY2ggZGVzdGluYXRpb24gYW5kIHRoZSBmaXJzdCB0aHJlZSBtb250aHMsIGNvbXB1dGUgdGhlIG51bWJlciBvZgpmbGlnaHRzLCBwZXJjZW50IGNhbmNlbGVkLCBhbmQgYXZlcmFnZSBhcnJpdmFsIGRlbGF5OgoKYGBge3IsIGNsYXNzLnNvdXJjZSA9ICJmb2xkLXNob3cifQpmbDMgPC0gZmlsdGVyKGZsaWdodHMsIG1vbnRoIDw9IDMpIHw+CiAgICBncm91cF9ieShkZXN0KSB8PgogICAgc3VtbWFyaXplKG4gPSBuKCksCiAgICAgICAgICAgICAgcGNhbiA9IDEwMCAqIG1lYW4oY2FuY2VsZWQpLAogICAgICAgICAgICAgIGRlbGF5ID0gbWVhbihhcnJfZGVsYXksIG5hLnJtID0gVFJVRSkpIHw+CiAgICB1bmdyb3VwKCkKYGBgCgo+IEZvY3VzIG9uIHRoZSB0b3AgNTAgZGVzdGluYXRpb25zIGluIHRlcm1zIG9mIHRoZSBudW1iZXIgb2YgZmxpZ2h0cwo+IGZyb20gTllDIGR1cmluZyB0aGUgZmlyc3QgdGhyZWUgbW9udGhzIG9mIDIwMTMuCgpgYGB7ciwgY2xhc3Muc291cmNlID0gImZvbGQtc2hvdyJ9CmZsM181MCA8LSBzbGljZV9tYXgoZmwzLCBuLCBuID0gNTApCmBgYAoKPiBDcmVhdGUgYSBtYXAgd2l0aCBhIHBvaW50IGF0IGVhY2ggb2YgdGhlc2UgZGVzdGluYXRpb25zLCBhbmQgZW5jb2RlCj4gdGhlIHByb3BvcnRpb24gb2YgY2FuY2VsZWQgZmxpZ2h0cyBpbiB0aGUgcG9pbnQncyBzaXplLiBDb21tZW50IG9uCj4gd2hhdCB5b3Ugc2VlLgoKVG8gc2hvdyB0aGUgZGF0YSBvbiBhIG1hcCwgYWRkIGxvY2F0aW9uIGluZm9ybWF0aW9uIGJ5IGpvaW5pbmcgd2l0aApkYXRhIGZyb20gdGhlIGBhaXJwb3J0c2AgdGFibGU6CgpgYGB7ciwgY2xhc3Muc291cmNlID0gImZvbGQtc2hvdyJ9CmZsM181MCA8LSBsZWZ0X2pvaW4oZmwzXzUwLAogICAgICAgICAgICAgICAgICAgIHNlbGVjdChhaXJwb3J0cywgZmFhLCBsYXQsIGxvbiwgYWx0KSwKICAgICAgICAgICAgICAgICAgICBjKCJkZXN0IiA9ICJmYWEiKSkKYGBgCgpBIG1hcCBzaG93aW5nIHRoZSBjYW5jZWxsYXRpb24gcGVyY2VudGFnZXMgZm9yIHRoZSB0b3AgNTAgZGVzdGluYXRpb25zOgoKYGBge3J9CmxpYnJhcnkoZ2dwbG90MikKcG0gPC0gZ2dwbG90KGZsM181MCwgYWVzKHggPSBsb24sIHkgPSBsYXQpKSArCiAgICBib3JkZXJzKCJzdGF0ZSIpICsKICAgIGNvb3JkX21hcCgpICsKICAgIHRoZW1lX3ZvaWQoKQpwbSArIGdlb21fcG9pbnQoYWVzKHNpemUgPSBwY2FuKSkgKyBzY2FsZV9zaXplX2FyZWEoKQpgYGAKCltUaGUgbWFwIG9ubHkgc2hvd3MgNDkgYWlycG9ydHMgc2luY2UgU0pVIChTYW4gSnVhbiwgUHVlcnRvIFJpY28pIGlzCm9uZSBvZiB0aGUgdG9wIDUwIGJ1dCBub3QgaW4gdGhlIGBhaXJwb3J0c2AgZGF0ZSBmcmFtZS5dCgpVc2luZyBhbHBoYSBibGVuZGluZyBjYW4gaGVscCB3aXRoIHRoZSBvdmVyLXBsb3R0aW5nIGFsb25nIHRoZSBlYXN0CmNvYXN0OgoKYGBge3J9CnBtICsgZ2VvbV9wb2ludChhZXMoc2l6ZSA9IHBjYW4pLCBhbHBoYSA9IDAuMykgKyBzY2FsZV9zaXplX2FyZWEoKQpgYGAKCkNhbmNlbGxhdGlvbiBwZXJjZW50YWdlcyBhcmUgaGlnaGVyIGZvciBjbG9zZXIgYWlycG9ydHMgYW5kIGFpcnBvcnRzCmxpa2VseSB0byBiZSBleHBlcmllbmNpbmcgc2ltaWxhciB3ZWF0aGVyIGNvbmRpdGlvbnMuIAoKPiBJbiBhZGRpdGlvbiB0byB0aGUgbG9jYXRpb24gYW5kIHByb3BvcnRpb24gb2YgY2FuY2VsZWQgZmxpZ2h0cywKPiB3aGV0aGVyIHRoZSBhdmVyYWdlIGFycml2YWwgZGVsYXkgaXMgbW9yZSBvciBsZXNzIHRoYW4gMjAgbWludXRlcwo+IGNvdWxkIGJlIGVuY29kZWQgdXNpbmcgY29sb3Igb3Igc2hhcGUuIFRyeSBib3RoIGFwcHJvYWNoZXMsIGNvbW1lbnQKPiBvbiB3aGF0IHlvdSBzZWUgYW5kIG9uIHRoZSBhZHZhbnRhZ2VzIGFuZCBkaXNhZHZhbnRhZ2VzIG9mIGVhY2gKPiBhcHByb2FjaC4KCldoZXRoZXIgdGhlIGF2ZXJhZ2UgZGVsYXkgaXMgMjAgbWludXRlcyBvciBtb3JlIGNhbiBiZSBlbmNvZGVkIGluCnVzaW5nIGNvbG9yIG9yIHNoYXBlOgoKYGBge3J9CnBtICsgZ2VvbV9wb2ludChhZXMoc2l6ZSA9IHBjYW4sIGNvbG9yID0gZGVsYXkgPj0gMjApKSArIHNjYWxlX3NpemVfYXJlYSgpCnBtICsgZ2VvbV9wb2ludChhZXMoc2l6ZSA9IHBjYW4sIHNoYXBlID0gZGVsYXkgPj0gMjApKSArIHNjYWxlX3NpemVfYXJlYSgpCmBgYAoKRm9yIGEgMTUgbWludXRlIGN1dG9mZiB0aGVyZSBhcmUgYSBmZXcgbW9yZSBoaWdoIGRlbGF5IGRlc3RpbmF0aW9uczoKCmBgYHtyfQpwbSArIGdlb21fcG9pbnQoYWVzKHNpemUgPSBwY2FuLCBjb2xvciA9IGRlbGF5ID49IDE1KSkgKyBzY2FsZV9zaXplX2FyZWEoKQpwbSArIGdlb21fcG9pbnQoYWVzKHNpemUgPSBwY2FuLCBzaGFwZSA9IGRlbGF5ID49IDE1KSkgKyBzY2FsZV9zaXplX2FyZWEoKQpgYGAKClRoZSBzaXplIGFuZCBzaGFwZSBjaGFubmVscyBpbnRlcmZlcmUgd2l0aCBlYWNoIG90aGVyIHF1aXRlIGEgYml0Owpjb2xvciBhbmQgc2l6ZSBpbnRlcmZlcmUgd2l0aCBlYWNoIG90aGVyIG11Y2ggbGVzcy4gUGlja2luZyBvdXQgdGhlCnJhcmVyIHNoYXBlcyBpcyBhbHNvIGhhcmRlciB0aGFuIHNwb3R0aW5nIHRoZSBkaWZmZXJlbnQgY29sb3JzOiBjb2xvcgphY2hpZXZlcyBiZXR0ZXIgcG9wLW91dC4K