General Issues
Make sure you name your files as requested, including matching the specified use of upper and lower case. This matters on file systems that are case-sensitive.
Make sure to commit your work to your local repository and push your commits to GitLab. We can only see what is on GitLab, not what is on your computer. You can check what we see by going to the GitLab web interface.
Include your name and the date in the header of your .Rmd
file using author:
and date:
tags.
Your HTML file should be a report of your findings.
Any graph you show should be discussed in your narrative.
Any code you show should be discussed in your narrative.
If you do not need to discuss a piece of code in the narrative, use echo FALSE
to avoid showing it.
If you load a file that you have included in your repository or that you download to your repository then you need to make sure the code in your Rmarkdown document uses a relative path, not an absolute one. Absolute paths will only make sense on your computer, not on the computer of someone else who downloads your repository.
If you want to check your work is reproducible you can download your work to a computer other than the one you use for developing it. One option is the CLAS Linux systems accessed via FastX. You can use RStudio there to set up a clean copy of your repository and then just pull your changes and check that they knit successfully. Using STAT4580::checkHW
is a convenient way to do this.
1. Evaluate a Visualization
The Vox visualization attracted some attention in the internet; some examples:
Analysis of the visualization:
Items: diseases and associated measurements.
Attributes: disease, money raised; deaths.
Marks: circles, text.
Channels: vertical position, area, color (hue), text.
Mappings:
Ranks within the numeric variables are mapped to vertical position.
Magnitudes of numeric variables are mapped to circle areas.
Magnitudes are also mapped to text labels.
Disease is mapped to color (hue).
A goal of the visualization is to show the discrepancy between the relative amounts raised and the relative numbers of deaths. This relation is communicated by matching the positions or sizes of the corresponding circles by color, a weaker channel.
One good alternative, used in one of the links above, is a scatter plot:
Other options:
a Tufte-style slope graph using standardized variables or ranks (essentially a parallel coordinates plot; used in another of the links above);
visualizing a derived variable, such as funds per death.
There are issues with the data; some of these are discussed in the articles linked to above.
2. EPA Fuel Economy Data
library(lubridate)
library(readr)
if (! file.exists("vehicles.csv.zip") ||
file.mtime("vehicles.csv.zip") + months(6) < now())
download.file("http://www.stat.uiowa.edu/~luke/data/vehicles.csv.zip",
"vehicles.csv.zip")
newmpg <- read_csv("vehicles.csv.zip", guess_max = 100000)
From the documentation for the data the appropriate variables seem to be:
fuelType1
represents the primary fuel type, fl
in mpg
.
highway08
corresponds to hwy
in mpg
;
cylinders
corresponds to cyl
in mpg
;
displ
corresponds to displ
in mpg
;
The primary fuel type counts are
library(dplyr)
tbl <- count(newmpg, fuelType1)
kbl <- knitr::kable(tbl, format = "html")
kableExtra::kable_styling(kbl, full_width = FALSE)
fuelType1
|
n
|
Diesel
|
1274
|
Electricity
|
649
|
Midgrade Gasoline
|
162
|
Natural Gas
|
60
|
Premium Gasoline
|
14655
|
Regular Gasoline
|
30275
|
A bar chart of these numbers:
thm <- theme_minimal() + theme(text = element_text(size = 16))
ggplot(tbl, aes(x = n, y = reorder(fuelType1, n))) +
geom_col() +
scale_x_continuous(expand = expansion(mult = c(0, .1))) +
thm +
ylab(NULL)
Regular gas is the dominant fuel type over all years, with premium second. All other fuel types, including electricity, make up a small fraction.
3. Fuel Type Over the Years
A filled bar chart shows changes in the primary fuel type used over the years:
newmpg2 <- filter(newmpg, year <= 2023) |>
mutate(year = factor(year))
ggplot(newmpg2, aes(y = year, fill = fuelType1)) +
geom_bar(position = "fill") +
scale_x_continuous(expand = c(0, 0)) +
labs(x = "Proportion", y = NULL)
Regular gas was the predominant fuel type in the mid 1980s, but premium’s share has gradually increased to the point where almost as many models use premium as regular. Diesel’s popularity declined early and had a small resurgence recently. The market share for electricity is still quite small but is growing.
4. Highway Fuel Economy Over the Years
newmpg3 <- filter(newmpg, year <= 2023, year >= 2000) |>
mutate(year = factor(year))
alpha <- 0.2
size <- 0.3
nyear <- length(levels(newmpg3$year))
A strip chart is a useful way to look at the full data for a numeric variable at several different levels of a discrete variable, but some tuning is needed for larger data sets. For examining 24 years of highway gas mileage data from the EPA data set using alpha
= 0.2 and size
= 0.3 along with jittering seems to work reasonably well:
ggplot(newmpg3, aes(x = highway08, y = year)) +
geom_point(position = "jitter", size = size, alpha = alpha) +
ylab(NULL) +
thm
Over time the highway gas mileage distributions are moving upward a little bit, with the upper tails becoming gradually longer and an increasing number of very high efficiency models (mostly electric).
LS0tCnRpdGxlOiAiQXNzaWdubWVudCA0IE5vdGVzIgpvdXRwdXQ6CiAgaHRtbF9kb2N1bWVudDoKICAgIHRvYzogeWVzCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlCiAgICBjb2RlX2ZvbGRpbmc6ICJoaWRlIgotLS0KCmBgYHtyIGdsb2JhbF9vcHRpb25zLCBpbmNsdWRlID0gRkFMU0V9CmtuaXRyOjpvcHRzX2NodW5rJHNldChjb2xsYXBzZSA9IFRSVUUsIGZpZy5hbGlnbiA9ICJjZW50ZXIiKQpgYGAKCiMjIEdlbmVyYWwgSXNzdWVzCgoqIE1ha2Ugc3VyZSB5b3UgbmFtZSB5b3VyIGZpbGVzIGFzIHJlcXVlc3RlZCwgaW5jbHVkaW5nIG1hdGNoaW5nIHRoZQogIHNwZWNpZmllZCB1c2Ugb2YgdXBwZXIgYW5kIGxvd2VyIGNhc2UuIFRoaXMgbWF0dGVycyBvbiBmaWxlIHN5c3RlbXMKICB0aGF0IGFyZSBjYXNlLXNlbnNpdGl2ZS4KCiogTWFrZSBzdXJlIHRvIGNvbW1pdCB5b3VyIHdvcmsgdG8geW91ciBsb2NhbCByZXBvc2l0b3J5IGFuZCBwdXNoIHlvdXIKICBjb21taXRzIHRvIEdpdExhYi4gV2UgY2FuIG9ubHkgc2VlIHdoYXQgaXMgb24gR2l0TGFiLCBub3Qgd2hhdCBpcyBvbgogIHlvdXIgY29tcHV0ZXIuIFlvdSBjYW4gY2hlY2sgd2hhdCB3ZSBzZWUgYnkgZ29pbmcgdG8gdGhlIEdpdExhYiB3ZWIKICBpbnRlcmZhY2UuCiAKKiBJbmNsdWRlIHlvdXIgbmFtZSBhbmQgdGhlIGRhdGUgaW4gdGhlIGhlYWRlciBvZiB5b3VyIGAuUm1kYCBmaWxlCiAgdXNpbmcgYGF1dGhvcjpgIGFuZCBgZGF0ZTpgIHRhZ3MuCgoqIFlvdXIgSFRNTCBmaWxlIHNob3VsZCBiZSBhIHJlcG9ydCBvZiB5b3VyIGZpbmRpbmdzLgoKICAgICogQW55IGdyYXBoIHlvdSBzaG93IHNob3VsZCBiZSBkaXNjdXNzZWQgaW4geW91ciBuYXJyYXRpdmUuCgogICAgKiBBbnkgY29kZSB5b3Ugc2hvdyBzaG91bGQgYmUgZGlzY3Vzc2VkIGluIHlvdXIgbmFycmF0aXZlLgoKICAgICogSWYgeW91IGRvIG5vdCBuZWVkIHRvIGRpc2N1c3MgYSBwaWVjZSBvZiBjb2RlIGluIHRoZSBuYXJyYXRpdmUsCiAgICAgIHVzZSBgZWNobyBGQUxTRWAgdG8gYXZvaWQgc2hvd2luZyBpdC4KCiogSWYgeW91IGxvYWQgYSBmaWxlIHRoYXQgeW91IGhhdmUgaW5jbHVkZWQgaW4geW91ciByZXBvc2l0b3J5IG9yIHRoYXQKICB5b3UgZG93bmxvYWQgdG8geW91ciByZXBvc2l0b3J5IHRoZW4geW91IG5lZWQgdG8gbWFrZSBzdXJlIHRoZSBjb2RlCiAgaW4geW91ciBSbWFya2Rvd24gZG9jdW1lbnQgdXNlcyBhIHJlbGF0aXZlIHBhdGgsIG5vdCBhbiBhYnNvbHV0ZQogIG9uZS4gIEFic29sdXRlIHBhdGhzIHdpbGwgb25seSBtYWtlIHNlbnNlIG9uIHlvdXIgY29tcHV0ZXIsIG5vdCBvbgogIHRoZSBjb21wdXRlciBvZiBzb21lb25lIGVsc2Ugd2hvIGRvd25sb2FkcyB5b3VyIHJlcG9zaXRvcnkuCgoqIElmIHlvdSB3YW50IHRvIGNoZWNrIHlvdXIgd29yayBpcyByZXByb2R1Y2libGUgeW91IGNhbiBkb3dubG9hZCB5b3VyCiAgd29yayB0byBhIGNvbXB1dGVyIG90aGVyIHRoYW4gdGhlIG9uZSB5b3UgdXNlIGZvciBkZXZlbG9waW5nIGl0LgogIE9uZSBvcHRpb24gaXMgdGhlIENMQVMgTGludXggc3lzdGVtcyBhY2Nlc3NlZCB2aWEKICBbRmFzdFhdKGh0dHBzOi8vbGludXguY2xhcy51aW93YS5lZHUvaGVscC9mYXN0eCkuIFlvdSBjYW4gdXNlCiAgUlN0dWRpbyB0aGVyZSB0byBzZXQgdXAgYSBjbGVhbiBjb3B5IG9mIHlvdXIgcmVwb3NpdG9yeSBhbmQgdGhlbgogIGp1c3QgcHVsbCB5b3VyIGNoYW5nZXMgYW5kIGNoZWNrIHRoYXQgdGhleSBrbml0IHN1Y2Nlc3NmdWxseS4KICBVc2luZyBgU1RBVDQ1ODA6OmNoZWNrSFdgIGlzIGEgY29udmVuaWVudCB3YXkgdG8gZG8gdGhpcy4KCgojIyAxLiBFdmFsdWF0ZSBhIFZpc3VhbGl6YXRpb24KClRoZSBWb3ggdmlzdWFsaXphdGlvbiBhdHRyYWN0ZWQgc29tZSBhdHRlbnRpb24gaW4gdGhlIGludGVybmV0OyBzb21lCmV4YW1wbGVzOgoKLSBBIFtwb3N0XShodHRwczovL3d3dy5pZmxzY2llbmNlLmNvbS9pbmZvZ3JhcGhpYy1zaG93cy1kaWZmZXJlbmNlcy1iZXR3ZWVuLWRpc2Vhc2VzLXdlLWRvbmF0ZS1hbmQtZGlzZWFzZXMta2lsbC11cy0yNTQ4OSkKICBvbiA8aHR0cHM6Ly93d3cuaWZsc2NpZW5jZS5jb20vPi4KCi0gQSBbcG9zdF0oaHR0cHM6Ly9ub25wcm9maXRxdWFydGVybHkub3JnLzIwMTQvMDkvMDUvaW5mb2dyYXBoaWMtY29tcGFyZXMtZG9uYXRpb25zLXRvLWRpc2Vhc2UtYW5kLWZpbmRzLWJpZy1kaXNwYXJpdGllcy8pCiAgb24gPGh0dHBzOi8vbm9ucHJvZml0cXVhcnRlcmx5Lm9yZz4gd2l0aCBhIGxpbmsgdG8gb25lIFthbHRlcm5hdGl2ZQogIHZpc3VhbGl6YXRpb25dKGh0dHA6Ly90aGVtZW5kb3phbGluZS5vcmcvcG9zdC85NTc1NzY3NDM4MS90aGlzLWJ1YmJsZS1jaGFydC1pcy1raWxsaW5nLW1lKS4KCi0gQW5vdGhlciBbYWx0ZXJuYXRpdmUgdmlzdWFsaXphdGlvbl0oPGh0dHA6Ly93d3cudmlzdWFsbWFnbmV0aWMuY29tL3BvcnRmb2xpby9kb25hdGlvbnMtdnMtZGVhdGhzLXdoZXJlLXNob3VsZC1vdXItbW9uZXktZ28vPikuCgotIFRoZSBbb3JpZ2luYWwgdmlzdWFsaXphdGlvbl0oaW1nL29yaWctdm94LWNoYXJ0LmpwZykgbWFkZSB0aGUgdmVyeQogIGNvbW1vbiBtaXN0YWtlIG9mIG1hcHBpbmcgbWFnbml0dWRlcyB0byBjaXJjbGUgcmFkaXVzLCB3aGljaAogIGRpc3RvcnRzIHRoZSBwZXJjZWl2ZWQgbWFnbml0dWRlcyBzaW5jZSBwZXJjZXB0aW9uIGZvY3VzZXMgb24KICBhcmVhLiBUaGUgbWFpbiBjaGFuZ2UgaW4gdGhlIHJldmlzaW9uIGlzIHRvIG1hcCBtYWduaXR1ZGUgdG8gYXJlYS4KCi0gVGhlIHJldmlzaW9uIGFsc28gY2hhbmdlZCBzb21lIGNvbG9yIGFzc2lnbm1lbnRzLCBidXQga2VwdCB0aGUKICB0cmFkaXRpb25hbCBhc3NpZ25tZW50IG9mIHBpbmsgZm9yIEJyZWFzdCBDYW5jZXIuCgpBbmFseXNpcyBvZiB0aGUgdmlzdWFsaXphdGlvbjoKCi0gSXRlbXM6IGRpc2Vhc2VzIGFuZCBhc3NvY2lhdGVkIG1lYXN1cmVtZW50cy4KCi0gQXR0cmlidXRlczogZGlzZWFzZSwgbW9uZXkgcmFpc2VkOyBkZWF0aHMuCgotIE1hcmtzOiBjaXJjbGVzLCB0ZXh0LgoKLSBDaGFubmVsczogdmVydGljYWwgcG9zaXRpb24sIGFyZWEsIGNvbG9yIChodWUpLCB0ZXh0LgoKLSBNYXBwaW5nczoKCiAgICAqIFJhbmtzIHdpdGhpbiB0aGUgbnVtZXJpYyB2YXJpYWJsZXMgYXJlIG1hcHBlZCB0byB2ZXJ0aWNhbCBwb3NpdGlvbi4KCiAgICAqIE1hZ25pdHVkZXMgb2YgbnVtZXJpYyB2YXJpYWJsZXMgYXJlIG1hcHBlZCB0byBjaXJjbGUgYXJlYXMuCgogICAgKiBNYWduaXR1ZGVzIGFyZSBhbHNvIG1hcHBlZCB0byB0ZXh0IGxhYmVscy4KCiAgICAqIERpc2Vhc2UgaXMgbWFwcGVkIHRvIGNvbG9yIChodWUpLgoKQSBnb2FsIG9mIHRoZSB2aXN1YWxpemF0aW9uIGlzIHRvIHNob3cgdGhlIGRpc2NyZXBhbmN5IGJldHdlZW4gdGhlCnJlbGF0aXZlIGFtb3VudHMgcmFpc2VkIGFuZCB0aGUgcmVsYXRpdmUgbnVtYmVycyBvZiBkZWF0aHMuICBUaGlzCnJlbGF0aW9uIGlzIGNvbW11bmljYXRlZCBieSBtYXRjaGluZyB0aGUgcG9zaXRpb25zIG9yIHNpemVzIG9mIHRoZQpjb3JyZXNwb25kaW5nIGNpcmNsZXMgYnkgY29sb3IsIGEgd2Vha2VyIGNoYW5uZWwuCgpPbmUgZ29vZCBhbHRlcm5hdGl2ZSwgdXNlZCBpbiBvbmUgb2YgdGhlIGxpbmtzIGFib3ZlLCBpcyBhIHNjYXR0ZXIgcGxvdDoKCmBgYHtyLCBlY2hvID0gRkFMU0V9CmxpYnJhcnkoZ2dwbG90MikKaWYgKCEgZmlsZS5leGlzdHMoImRmdW5kcy5jc3YiKSkKICAgIGRvd25sb2FkLmZpbGUoImh0dHBzOi8vc3RhdC51aW93YS5lZHUvfmx1a2UvZGF0YS9kZnVuZHMuY3N2IiwKICAgICAgICAgICAgICAgICAgImRmdW5kcy5jc3YiKQpkZnVuZHMgPC0gcmVhZC5jc3YoImRmdW5kcy5jc3YiKQpnZ3Bsb3QoZGZ1bmRzLCBhZXMoeCA9IERlYXRocywgeSA9IEZ1bmRpbmcsIGNvbG9yID0gRGlzZWFzZSkpICsKICAgIGdlb21fcG9pbnQoc2l6ZSA9IDQpCmBgYAoKT3RoZXIgb3B0aW9uczoKCi0gYSBUdWZ0ZS1zdHlsZSBzbG9wZSBncmFwaCB1c2luZyBzdGFuZGFyZGl6ZWQgdmFyaWFibGVzIG9yIHJhbmtzCiAgKGVzc2VudGlhbGx5IGEgcGFyYWxsZWwgY29vcmRpbmF0ZXMgcGxvdDsgdXNlZCBpbiBhbm90aGVyIG9mIHRoZQogIGxpbmtzIGFib3ZlKTsKCi0gdmlzdWFsaXppbmcgYSBkZXJpdmVkIHZhcmlhYmxlLCBzdWNoIGFzIGZ1bmRzIHBlciBkZWF0aC4KClRoZXJlIGFyZSBpc3N1ZXMgd2l0aCB0aGUgZGF0YTsgc29tZSBvZiB0aGVzZSBhcmUgZGlzY3Vzc2VkIGluIHRoZQphcnRpY2xlcyBsaW5rZWQgdG8gYWJvdmUuCgoKIyMgMi4gRVBBIEZ1ZWwgRWNvbm9teSBEYXRhCgpgYGB7ciwgbWVzc2FnZSA9IEZBTFNFfQpsaWJyYXJ5KGx1YnJpZGF0ZSkKbGlicmFyeShyZWFkcikKaWYgKCEgZmlsZS5leGlzdHMoInZlaGljbGVzLmNzdi56aXAiKSB8fAogICAgZmlsZS5tdGltZSgidmVoaWNsZXMuY3N2LnppcCIpICsgbW9udGhzKDYpIDwgbm93KCkpCiAgICBkb3dubG9hZC5maWxlKCJodHRwOi8vd3d3LnN0YXQudWlvd2EuZWR1L35sdWtlL2RhdGEvdmVoaWNsZXMuY3N2LnppcCIsCiAgICAgICAgICAgICAgICAgICJ2ZWhpY2xlcy5jc3YuemlwIikKbmV3bXBnIDwtIHJlYWRfY3N2KCJ2ZWhpY2xlcy5jc3YuemlwIiwgZ3Vlc3NfbWF4ID0gMTAwMDAwKQpgYGAKCkZyb20gdGhlIFtkb2N1bWVudGF0aW9uIGZvciB0aGUKZGF0YV0oaHR0cHM6Ly93d3cuZnVlbGVjb25vbXkuZ292L2ZlZy93cy9pbmRleC5zaHRtbCN2ZWhpY2xlKSB0aGUKYXBwcm9wcmlhdGUgdmFyaWFibGVzIHNlZW0gdG8gYmU6CgogICogYGZ1ZWxUeXBlMWAgcmVwcmVzZW50cyB0aGUgcHJpbWFyeSBmdWVsIHR5cGUsIGBmbGAgaW4gYG1wZ2AuCiAgKiBgaGlnaHdheTA4YCBjb3JyZXNwb25kcyB0byBgaHd5YCBpbiBgbXBnYDsKICAqIGBjeWxpbmRlcnNgIGNvcnJlc3BvbmRzIHRvIGBjeWxgIGluIGBtcGdgOwogICogYGRpc3BsYCBjb3JyZXNwb25kcyB0byBgZGlzcGxgIGluIGBtcGdgOwoKVGhlIHByaW1hcnkgZnVlbCB0eXBlIGNvdW50cyBhcmUKCmBgYHtyLCBtZXNzYWdlID0gRkFMU0V9CmxpYnJhcnkoZHBseXIpCnRibCA8LSBjb3VudChuZXdtcGcsIGZ1ZWxUeXBlMSkKa2JsIDwtIGtuaXRyOjprYWJsZSh0YmwsIGZvcm1hdCA9ICJodG1sIikKa2FibGVFeHRyYTo6a2FibGVfc3R5bGluZyhrYmwsIGZ1bGxfd2lkdGggPSBGQUxTRSkKYGBgCgpBIGJhciBjaGFydCBvZiB0aGVzZSBudW1iZXJzOgoKYGBge3J9CnRobSA8LSB0aGVtZV9taW5pbWFsKCkgKyB0aGVtZSh0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNikpCmdncGxvdCh0YmwsIGFlcyh4ID0gbiwgeSA9IHJlb3JkZXIoZnVlbFR5cGUxLCBuKSkpICsKICAgIGdlb21fY29sKCkgKwogICAgc2NhbGVfeF9jb250aW51b3VzKGV4cGFuZCA9IGV4cGFuc2lvbihtdWx0ID0gYygwLCAuMSkpKSArCiAgICB0aG0gKwogICAgeWxhYihOVUxMKQpgYGAKClJlZ3VsYXIgZ2FzIGlzIHRoZSBkb21pbmFudCBmdWVsIHR5cGUgb3ZlciBhbGwgeWVhcnMsIHdpdGggcHJlbWl1bSBzZWNvbmQuCkFsbCBvdGhlciBmdWVsIHR5cGVzLCBpbmNsdWRpbmcgZWxlY3RyaWNpdHksIG1ha2UgdXAgYSBzbWFsbCBmcmFjdGlvbi4KCgojIyAzLiBGdWVsIFR5cGUgT3ZlciB0aGUgWWVhcnMKCkEgZmlsbGVkIGJhciBjaGFydCBzaG93cyBjaGFuZ2VzIGluIHRoZSBwcmltYXJ5IGZ1ZWwgdHlwZSB1c2VkIG92ZXIKdGhlIHllYXJzOgogIApgYGB7cn0KbmV3bXBnMiA8LSBmaWx0ZXIobmV3bXBnLCB5ZWFyIDw9IDIwMjMpIHw+CiAgICBtdXRhdGUoeWVhciA9IGZhY3Rvcih5ZWFyKSkKZ2dwbG90KG5ld21wZzIsIGFlcyh5ID0geWVhciwgZmlsbCA9IGZ1ZWxUeXBlMSkpICsKICAgIGdlb21fYmFyKHBvc2l0aW9uID0gImZpbGwiKSArCiAgICBzY2FsZV94X2NvbnRpbnVvdXMoZXhwYW5kID0gYygwLCAwKSkgKwogICAgbGFicyh4ID0gIlByb3BvcnRpb24iLCB5ID0gTlVMTCkKYGBgCgpSZWd1bGFyIGdhcyB3YXMgdGhlIHByZWRvbWluYW50IGZ1ZWwgdHlwZSBpbiB0aGUgbWlkIDE5ODBzLCBidXQKcHJlbWl1bSdzIHNoYXJlIGhhcyBncmFkdWFsbHkgaW5jcmVhc2VkIHRvIHRoZSBwb2ludCB3aGVyZSBhbG1vc3QgYXMKbWFueSBtb2RlbHMgdXNlIHByZW1pdW0gYXMgcmVndWxhci4gRGllc2VsJ3MgcG9wdWxhcml0eSBkZWNsaW5lZCBlYXJseQphbmQgaGFkIGEgc21hbGwgcmVzdXJnZW5jZSByZWNlbnRseS4gVGhlIG1hcmtldCBzaGFyZSBmb3IgZWxlY3RyaWNpdHkKaXMgc3RpbGwgcXVpdGUgc21hbGwgYnV0IGlzIGdyb3dpbmcuCgoKIyMgNC4gSGlnaHdheSBGdWVsIEVjb25vbXkgT3ZlciB0aGUgWWVhcnMKCmBgYHtyfQpuZXdtcGczIDwtIGZpbHRlcihuZXdtcGcsIHllYXIgPD0gMjAyMywgeWVhciA+PSAyMDAwKSB8PgogICAgbXV0YXRlKHllYXIgPSBmYWN0b3IoeWVhcikpCmFscGhhIDwtIDAuMgpzaXplIDwtIDAuMwpueWVhciA8LSBsZW5ndGgobGV2ZWxzKG5ld21wZzMkeWVhcikpCmBgYAoKQSBzdHJpcCBjaGFydCBpcyBhIHVzZWZ1bCB3YXkgdG8gbG9vayBhdCB0aGUgZnVsbCBkYXRhIGZvciBhIG51bWVyaWMKdmFyaWFibGUgYXQgc2V2ZXJhbCBkaWZmZXJlbnQgbGV2ZWxzIG9mIGEgZGlzY3JldGUgdmFyaWFibGUsIGJ1dCBzb21lCnR1bmluZyBpcyBuZWVkZWQgZm9yIGxhcmdlciBkYXRhIHNldHMuIEZvciBleGFtaW5pbmcgYHIgbnllYXJgIHllYXJzIG9mCmhpZ2h3YXkgZ2FzIG1pbGVhZ2UgZGF0YSBmcm9tIHRoZSBFUEEgZGF0YSBzZXQgdXNpbmcKYGFscGhhYCA9IGByIGFscGhhYCBhbmQgYHNpemVgID0gYHIgc2l6ZWAgYWxvbmcgd2l0aCBqaXR0ZXJpbmcgc2VlbXMgdG8Kd29yayByZWFzb25hYmx5IHdlbGw6CgpgYGB7cn0KZ2dwbG90KG5ld21wZzMsIGFlcyh4ID0gaGlnaHdheTA4LCB5ID0geWVhcikpICsKICAgIGdlb21fcG9pbnQocG9zaXRpb24gPSAiaml0dGVyIiwgc2l6ZSA9IHNpemUsIGFscGhhID0gYWxwaGEpICsKICAgIHlsYWIoTlVMTCkgKwogICAgdGhtCmBgYAoKT3ZlciB0aW1lIHRoZSBoaWdod2F5IGdhcyBtaWxlYWdlIGRpc3RyaWJ1dGlvbnMgYXJlIG1vdmluZyB1cHdhcmQKYSBsaXR0bGUgYml0LCB3aXRoIHRoZSB1cHBlciB0YWlscyBiZWNvbWluZyBncmFkdWFsbHkgbG9uZ2VyIGFuZCBhbgppbmNyZWFzaW5nIG51bWJlciBvZiB2ZXJ5IGhpZ2ggZWZmaWNpZW5jeSBtb2RlbHMgKG1vc3RseSBlbGVjdHJpYykuCgo8IS0tCkxvY2FsIFZhcmlhYmxlczogCm1vZGU6IHBvbHktbWFya2Rvd24rUgptb2RlOiBmbHlzcGVsbApFbmQ6Ci0tPgo=