Exercise 1
The data below come from tidytuesday and provide information on accidents at theme parks. You can see more of these data available here . The data give you some details of where and when the accident occurred, and something about the injured party as well.
safer_parks.csv
{-}
acc_id
double
Unique ID
acc_date
character
Accident Date
acc_state
character
Accident State
acc_city
character
Accident City
fix_port
character
.
source
character
Source of injury report
bus_type
character
Business type
industry_sector
character
Industry sector
device_category
character
Device category
device_type
character
Device type
tradename_or_generic
character
Common name of the device
manufacturer
character
Manufacturer of device
num_injured
double
Num injured
age_youngest
double
Youngest individual injured
gender
character
Gender of individual injured
acc_desc
character
Description of accident
injury_desc
character
Injury description
report
character
Report URL
category
character
Category of accident
mechanical
double
Mechanical failure (binary NA/1)
op_error
double
Operator error (binary NA/1)
employee
double
Employee error (binary NA/1)
notes
character
Additional notes
Working with the safer_parks
data, complete the following tasks.
Problem (a)
Using acc_date
, create a new date variable called idate
that is a proper date column generated via {lubridate}.
Problem (b)
Now create new columns for (i) the month of the accident, and (ii) the day of the week. These should not be abbreviated (i.e., we should see the values as ‘Monday’ instead of ‘Mon’, “July” instead of “Jul”). What month had the highest number of accidents? What day of the week had the highest number of accidents?
## # A tibble: 12 x 2
## injury_month n
## <ord> <int>
## 1 July 1702
## 2 August 1448
## 3 June 1322
## 4 May 706
## 5 September 575
## 6 March 493
## 7 April 484
## 8 October 461
## 9 December 320
## 10 November 302
## 11 February 281
## 12 January 257
## # A tibble: 7 x 2
## injury_dow n
## <ord> <int>
## 1 Saturday 2070
## 2 Sunday 1633
## 3 Friday 1128
## 4 Monday 985
## 5 Thursday 926
## 6 Wednesday 830
## 7 Tuesday 779
Looks like the month of July, and Saturdays, respectively.
Problem (c)
What if you look at days of the week by month? Does the same day of the week show up with the most accidents regardless of month or do we see some variation?
## # A tibble: 84 x 3
## injury_month injury_dow n
## <ord> <ord> <int>
## 1 July Saturday 330
## 2 August Saturday 328
## 3 June Saturday 316
## 4 July Sunday 287
## 5 August Sunday 259
## 6 July Friday 251
## 7 July Thursday 218
## 8 June Sunday 217
## 9 July Monday 216
## 10 July Wednesday 203
## # … with 74 more rows
Well, Saturdays for the most part.
Problem (d)
What were the five
dates with the most number of accidents?
## # A tibble: 1,845 x 2
## idate n
## <date> <int>
## 1 2014-08-16 23
## 2 2012-07-21 22
## 3 2015-07-11 21
## 4 2015-06-13 20
## 5 2015-06-14 20
## 6 2015-07-19 20
## 7 2016-08-06 20
## 8 2014-06-14 19
## 9 2015-07-13 19
## 10 2016-08-27 19
## # … with 1,835 more rows
Problem (e)
Using the Texas injury data, answer the following question: What ride was the safest? [Hint: For each ride (ride_name
) you will need to calculate the number of days between accidents. The ride with the highest number of days is the safest.]
tx_injuries.csv
injury_report_rec
double
Unique Record ID
name_of_operation
character
Company name
city
character
City
st
character
State (all TX)
injury_date
character
Injury date - note there are some different formats
ride_name
character
Ride Name
serial_no
character
Serial number of ride
gender
character
Gender of the injured individual
age
character
Age of the injured individual
body_part
character
Body part injured
alleged_injury
character
Alleged injury - type of injury
cause_of_injury
character
Approximate cause of the injury (free text)
other
character
Anecdotal information in addition to cause of injury
## # A tibble: 542 x 4
## # Groups: ride_name [252]
## date ride_name tspan tspan.days
## <date> <chr> <dbl> <dbl>
## 1 2015-04-16 iFly Austin 50025600 579
## 2 2014-07-26 Batman 36720000 425
## 3 2014-08-25 Coyote Cannon 35769600 414
## 4 2014-09-07 Tsunami Surge 35078400 406
## 5 2014-07-25 Howlin' Tornado 33696000 390
## 6 2014-08-31 Stingray Falls 33350400 386
## 7 2014-07-04 Cliffhanger 31276800 362
## 8 2014-05-16 Go Karts 29894400 346
## 9 2014-06-17 Mr. Freeze 28857600 334
## 10 2014-07-22 Dragon Blaster 28080000 325
## # … with 532 more rows
You should note that this assumes each ride was in operation for the same amount of time. If this is not true then our estimates will be unreliable.
The injury_date
problem fix …
## # A tibble: 542 x 14
## injury_report_r… name_of_operati… city st injury_date ride_name serial_no
## <dbl> <chr> <chr> <chr> <chr> <chr> <chr>
## 1 2032 Skygroup Invest… Aust… TX 2/12/2013 I Fly SV024
## 2 1897 Willie G's Post… Galv… TX 3/2/2013 Gulf Gli… GS-11-10…
## 3 837 Great Wolf Lodge Grap… TX 3/3/2013 Howlin T… 0643-C1-…
## 4 99 Six Flags Fiest… San … TX 3/3/2013 Scooby D… n/a
## 5 55 Ray Cammack Sho… Lave… AZ 3/11/2013 Alien Ab… 862162
## 6 780 ZDT's Amusement… Segu… TX 3/12/2013 Go Karts n/a
## 7 253 Six Flags Over … Arli… TX 3/15/2013 Gold Riv… 01-0511
## 8 253 Six Flags Over … Arli… TX 3/15/2013 Titan COCO62
## 9 55 Ray Cammack Sho… Lave… AZ 3/16/2013 Wild Riv… 97-05-00…
## 10 55 Ray Cammack Sho… Lave… AZ 3/16/2013 Sky Ride… A-878-B
## # … with 532 more rows, and 7 more variables: gender <chr>, age <chr>,
## # body_part <chr>, alleged_injury <chr>, cause_of_injury <chr>, other <chr>,
## # new_date <dttm>
Exercise 2
These data (see below) come from this story: The next generation: The space race is dominated by new contenders . You have data on space missions over time, with dates of the launch, the launching agency/country, type of launch vehicle, and so on.
launches
{-}
tag
Harvard or [COSPAR][cospar] id of launch
JD
[Julian Date][jd] of launch
launch_date
date of launch
launch_year
year of launch
type
type of launch vehicle
variant
variant of launch vehicle
mission
space mission
agency
launching agency
state_code
launching agency’s state
category
success (O) or failure (F)
agency_type
type of agency
Problem (a)
Create a new column called date
that stores launch_date
as a proper data field in ymd format from {lubridate}.
Problem (b)
Creating columns as needed, calculate and show the number of launches first by year, then by month, and then by day of the week. The result should be arranged in descending order of the number of launches.
## # A tibble: 63 x 2
## year n
## <dbl> <int>
## 1 1967 139
## 2 1971 134
## 3 1975 132
## 4 1966 131
## 5 1976 131
## 6 1977 130
## 7 1982 129
## 8 1983 129
## 9 1984 129
## 10 1968 128
## # … with 53 more rows
## # A tibble: 12 x 2
## month n
## <ord> <int>
## 1 December 579
## 2 June 524
## 3 October 523
## 4 September 511
## 5 April 504
## 6 August 495
## 7 July 466
## 8 May 460
## 9 March 447
## 10 November 435
## 11 February 429
## 12 January 340
## # A tibble: 31 x 2
## day n
## <int> <int>
## 1 28 248
## 2 25 227
## 3 24 217
## 4 14 213
## 5 21 211
## 6 15 210
## 7 26 208
## 8 16 206
## 9 20 205
## 10 18 204
## # … with 21 more rows
## # A tibble: 7 x 2
## dow n
## <ord> <int>
## 1 Thursday 1112
## 2 Wednesday 1102
## 3 Friday 1030
## 4 Tuesday 971
## 5 Saturday 618
## 6 Monday 534
## 7 Sunday 346
So 1967, the month of December, the 28th of a month, and Thursday have the most launches, respectively.
Problem (c)
How many launches were successful (O)
versus failed (F)
by country and year? The countries of interest will be state_code values of “CN”, “F”, “J”, “RU”, “SU”, “US”. You do not need to arrange your results in any order.
## # A tibble: 370 x 4
## state_code year category n
## <chr> <dbl> <chr> <int>
## 1 CN 1970 O 1
## 2 CN 1971 O 1
## 3 CN 1973 F 1
## 4 CN 1974 F 2
## 5 CN 1975 O 3
## 6 CN 1976 F 1
## 7 CN 1976 O 2
## 8 CN 1978 O 1
## 9 CN 1979 F 1
## 10 CN 1981 O 1
## # … with 360 more rows
LS0tCnRpdGxlOiAiTVBBIDU4MzAgLSBNb2R1bGUgMDQgRXhlcmNpc2VzIgpzdWJ0aXRsZTogIlNwcmluZyAyMDIwIgphdXRob3I6ICJQcm9mZXNzb3IgUnVoaWwiCmRhdGU6ICJVcGRhdGVkIG9uIGByIFN5cy5EYXRlKClgIgpvdXRwdXQ6IAogIGh0bWxfZG9jdW1lbnQ6IAogICAgY29kZV9kb3dubG9hZDogeWVzCiAgICBjb2RlX2ZvbGRpbmc6IGhpZGUKICAgIGZpZ19jYXB0aW9uOiB5ZXMKICAgIGhpZ2hsaWdodDogemVuYnVybgogICAgbnVtYmVyX3NlY3Rpb25zOiBubwogICAgdGhlbWU6IGZsYXRseQogICAgdG9jOiB5ZXMKICAgIHRvY19mbG9hdDogeWVzCmVkaXRvcl9vcHRpb25zOiAKICBjaHVua19vdXRwdXRfdHlwZTogY29uc29sZQotLS0KCjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+Cgpib2R5eyAvKiBOb3JtYWwgICovCi8qICAgIGZvbnQtZmFtaWx5OiBMYXRvLCBzYW5zLXNlcmlmOyAgCiAgICAgIGZvbnQtZmFtaWx5OiBNdWt0YSwgc2Fucy1zZXJpZjsgCiAgICAgIGZvbnQtZmFtaWx5OiAnTnVuaXRvIFNhbnMnLCBzYW5zLXNlcmlmOwogICAgICBmb250LWZhbWlseTogS2FybGEsIHNhbnMtc2VyaWY7ICAqLwogICAgICBmb250LWZhbWlseTogJ01lcnJpd2VhdGhlciBTYW5zJywgc2Fucy1zZXJpZjsgCiAgICAgIGZvbnQtc2l6ZTogMThweDsKICB9CgpoMS50aXRsZSB7CiAgZm9udC1zaXplOiAzOHB4OwogIGNvbG9yOiBEYXJrUmVkOwp9CgpoMSB7IC8qIEhlYWRlciAxICovCiAgZm9udC1zaXplOiAyOHB4OwogIGNvbG9yOiBEYXJrQmx1ZTsKfQoKaDIgeyAvKiBIZWFkZXIgMiAqLwogICAgZm9udC1zaXplOiAyMnB4OwogIGNvbG9yOiBEYXJrQmx1ZTsKfQoKaDMgeyAvKiBIZWFkZXIgMyAqLwogIGZvbnQtc2l6ZTogMThweDsKICBjb2xvcjogRGFya0JsdWU7Cn0KCmNvZGUucnsgLyogQ29kZSBibG9jayAqLwogICAgZm9udC1mYW1pbHk6IE11a3RhLCBzYW5zLXNlcmlmOyAKICAgIGZvbnQtd2VpZ2h0OiA2MDA7ICAKICAgIGZvbnQtc2l6ZTogMThweDsKfQoKLyogcHJlIHsgLyogQ29kZSBibG9jayAtIGRldGVybWluZXMgY29kZSBzcGFjaW5nIGJldHdlZW4gbGluZXMgKi8KICAgIGZvbnQtc2l6ZTogMTZweDsKfSAqLwo8L3N0eWxlPgoKCmBgYHtyIGtsaXBweSwgZWNobyA9IEZBTFNFLCBpbmNsdWRlID0gVFJVRX0Ka2xpcHB5OjprbGlwcHkodG9vbHRpcF9tZXNzYWdlID0gJ0NsaWNrIHRvIGNvcHknLCB0b29sdGlwX3N1Y2Nlc3MgPSAnRG9uZScsIGNvbG9yID0gJ2Nvcm5mbG93ZXJibHVlJywgcG9zaXRpb24gPSBjKCd0b3AnLCAncmlnaHQnKSkKYGBgCgpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFLCB3YXJuaW5nID0gRkFMU0UsIG1lc3NhZ2UgPSBGQUxTRSwgZHBpID0gMzAwLCBjYWNoZSA9IFRSVUUsIGZpZy5hbGlnbiA9ICJjZW50ZXIiLCBmaWcud2lkdGggPSAxMCwgZmlnLmhlaWdodCA9IDgsIG91dC53aWR0aCA9ICIxMDAlIiwgaGlnaGxpZ2h0ID0gVFJVRSkgCmBgYAoKIyBFeGVyY2lzZSAxCgpUaGUgZGF0YSBiZWxvdyBjb21lIGZyb20gW3RpZHl0dWVzZGF5XShodHRwczovL2dpdGh1Yi5jb20vcmZvcmRhdGFzY2llbmNlL3RpZHl0dWVzZGF5L3RyZWUvbWFzdGVyL2RhdGEvMjAxOS8yMDE5LTA5LTEwKSBhbmQgcHJvdmlkZSBpbmZvcm1hdGlvbiBvbiBhY2NpZGVudHMgYXQgdGhlbWUgcGFya3MuIFlvdSBjYW4gc2VlIG1vcmUgb2YgdGhlc2UgW2RhdGEgYXZhaWxhYmxlIGhlcmVdKGh0dHBzOi8vcmlkZXNkYXRhYmFzZS5vcmcvc2FmZXJwYXJrcy9kYXRhLykuIFRoZSBkYXRhIGdpdmUgeW91IHNvbWUgZGV0YWlscyBvZiB3aGVyZSBhbmQgd2hlbiB0aGUgYWNjaWRlbnQgb2NjdXJyZWQsIGFuZCBzb21ldGhpbmcgYWJvdXQgdGhlIGluanVyZWQgcGFydHkgYXMgd2VsbC4gCgpgYGB7ciBleDAxfQpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeSh0aWR5bG9nKQoKc2FmZXJfcGFya3MgPC0gcmVhZHI6OnJlYWRfY3N2KCJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vcmZvcmRhdGFzY2llbmNlL3RpZHl0dWVzZGF5L21hc3Rlci9kYXRhLzIwMTkvMjAxOS0wOS0xMC9zYWZlcnBhcmtzLmNzdiIpCmBgYAoKYHNhZmVyX3BhcmtzLmNzdmAgey19Cgp8dmFyaWFibGUgICAgICAgICAgICAgfGNsYXNzICAgICB8ZGVzY3JpcHRpb24gfAp8Oi0tLS0tLS0tLS0tLS0tLS0tLS0tfDotLS0tLS0tLS18Oi0tLS0tLS0tLS0tfAp8YWNjX2lkICAgICAgICAgICAgICAgfGRvdWJsZSAgICB8IFVuaXF1ZSBJRCB8CnxhY2NfZGF0ZSAgICAgICAgICAgICB8Y2hhcmFjdGVyIHwgQWNjaWRlbnQgRGF0ZSB8CnxhY2Nfc3RhdGUgICAgICAgICAgICB8Y2hhcmFjdGVyIHwgQWNjaWRlbnQgU3RhdGUgfAp8YWNjX2NpdHkgICAgICAgICAgICAgfGNoYXJhY3RlciB8IEFjY2lkZW50IENpdHkgfAp8Zml4X3BvcnQgICAgICAgICAgICAgfGNoYXJhY3RlciB8LiAgICAgICAgICAgfAp8c291cmNlICAgICAgICAgICAgICAgfGNoYXJhY3RlciB8IFNvdXJjZSBvZiBpbmp1cnkgcmVwb3J0IHwKfGJ1c190eXBlICAgICAgICAgICAgIHxjaGFyYWN0ZXIgfCBCdXNpbmVzcyB0eXBlIHwKfGluZHVzdHJ5X3NlY3RvciAgICAgIHxjaGFyYWN0ZXIgfCBJbmR1c3RyeSBzZWN0b3IgfAp8ZGV2aWNlX2NhdGVnb3J5ICAgICAgfGNoYXJhY3RlciB8IERldmljZSBjYXRlZ29yeSB8CnxkZXZpY2VfdHlwZSAgICAgICAgICB8Y2hhcmFjdGVyIHwgRGV2aWNlIHR5cGUgfAp8dHJhZGVuYW1lX29yX2dlbmVyaWMgfGNoYXJhY3RlciB8IENvbW1vbiBuYW1lIG9mIHRoZSBkZXZpY2UgfAp8bWFudWZhY3R1cmVyICAgICAgICAgfGNoYXJhY3RlciB8IE1hbnVmYWN0dXJlciBvZiBkZXZpY2UgfAp8bnVtX2luanVyZWQgICAgICAgICAgfGRvdWJsZSAgICB8IE51bSBpbmp1cmVkIHwKfGFnZV95b3VuZ2VzdCAgICAgICAgIHxkb3VibGUgICAgfCBZb3VuZ2VzdCBpbmRpdmlkdWFsIGluanVyZWQgfAp8Z2VuZGVyICAgICAgICAgICAgICAgfGNoYXJhY3RlciB8IEdlbmRlciBvZiBpbmRpdmlkdWFsIGluanVyZWQgfAp8YWNjX2Rlc2MgICAgICAgICAgICAgfGNoYXJhY3RlciB8IERlc2NyaXB0aW9uIG9mIGFjY2lkZW50IHwKfGluanVyeV9kZXNjICAgICAgICAgIHxjaGFyYWN0ZXIgfCBJbmp1cnkgZGVzY3JpcHRpb24gfAp8cmVwb3J0ICAgICAgICAgICAgICAgfGNoYXJhY3RlciB8IFJlcG9ydCBVUkwgfAp8Y2F0ZWdvcnkgICAgICAgICAgICAgfGNoYXJhY3RlciB8IENhdGVnb3J5IG9mIGFjY2lkZW50IHwKfG1lY2hhbmljYWwgICAgICAgICAgIHxkb3VibGUgICAgfCBNZWNoYW5pY2FsIGZhaWx1cmUgKGJpbmFyeSBOQS8xKSB8CnxvcF9lcnJvciAgICAgICAgICAgICB8ZG91YmxlICAgIHwgT3BlcmF0b3IgZXJyb3IgKGJpbmFyeSBOQS8xKXwKfGVtcGxveWVlICAgICAgICAgICAgIHxkb3VibGUgICAgfCBFbXBsb3llZSBlcnJvciAoYmluYXJ5IE5BLzEpfAp8bm90ZXMgICAgICAgICAgICAgICAgfGNoYXJhY3RlciB8IEFkZGl0aW9uYWwgbm90ZXN8IAoKV29ya2luZyB3aXRoIHRoZSBgc2FmZXJfcGFya3NgIGRhdGEsIGNvbXBsZXRlIHRoZSBmb2xsb3dpbmcgdGFza3MuIAoKIyMgUHJvYmxlbSAoYSkgey19ClVzaW5nIGBhY2NfZGF0ZWAsIGNyZWF0ZSBhIG5ldyBkYXRlIHZhcmlhYmxlIGNhbGxlZCBgaWRhdGVgIHRoYXQgaXMgYSBwcm9wZXIgZGF0ZSBjb2x1bW4gZ2VuZXJhdGVkIHZpYSB7bHVicmlkYXRlfS4gCgpgYGB7cn0Kc2FmZXJfcGFya3MgJT4lCiAgbXV0YXRlKAogICAgaWRhdGUgPSBtZHkoYWNjX2RhdGUpCiAgICApIC0+IHNhZmVyX3BhcmtzCmBgYAoKIyMgUHJvYmxlbSAoYikgey19Ck5vdyBjcmVhdGUgbmV3IGNvbHVtbnMgZm9yIChpKSB0aGUgbW9udGggb2YgdGhlIGFjY2lkZW50LCBhbmQgKGlpKSB0aGUgZGF5IG9mIHRoZSB3ZWVrLiBUaGVzZSBzaG91bGQgbm90IGJlIGFiYnJldmlhdGVkIChpLmUuLCB3ZSBzaG91bGQgc2VlIHRoZSB2YWx1ZXMgYXMgJ01vbmRheScgaW5zdGVhZCBvZiAnTW9uJywgIkp1bHkiIGluc3RlYWQgb2YgIkp1bCIpLiBXaGF0IG1vbnRoIGhhZCB0aGUgaGlnaGVzdCBudW1iZXIgb2YgYWNjaWRlbnRzPyBXaGF0IGRheSBvZiB0aGUgd2VlayBoYWQgdGhlIGhpZ2hlc3QgbnVtYmVyIG9mIGFjY2lkZW50cz8gCgpgYGB7cn0Kc2FmZXJfcGFya3MgJT4lCiAgbXV0YXRlKAogICAgaW5qdXJ5X21vbnRoID0gbW9udGgoaWRhdGUsIGxhYmVsID0gVFJVRSwgYWJiciA9IEZBTFNFKSwKICAgIGluanVyeV9kb3cgPSB3ZGF5KGlkYXRlLCBsYWJlbCA9IFRSVUUsIGFiYnIgPSBGQUxTRSkKICApIC0+IHNhZmVyX3BhcmtzCgpzYWZlcl9wYXJrcyAlPiUKICBmaWx0ZXIoIWlzLm5hKGluanVyeV9tb250aCkpICU+JQogIGNvdW50KGluanVyeV9tb250aCwgc29ydCA9IFRSVUUpCgpzYWZlcl9wYXJrcyAlPiUKICBmaWx0ZXIoIWlzLm5hKGluanVyeV9kb3cpKSAlPiUKICBjb3VudChpbmp1cnlfZG93LCBzb3J0ID0gVFJVRSkKYGBgCgpMb29rcyBsaWtlIHRoZSBtb250aCBvZiBKdWx5LCBhbmQgU2F0dXJkYXlzLCByZXNwZWN0aXZlbHkuIAoKIyMgUHJvYmxlbSAoYykgey19CldoYXQgaWYgeW91IGxvb2sgYXQgZGF5cyBvZiB0aGUgd2VlayBieSBtb250aD8gRG9lcyB0aGUgc2FtZSBkYXkgb2YgdGhlIHdlZWsgc2hvdyB1cCB3aXRoIHRoZSBtb3N0IGFjY2lkZW50cyByZWdhcmRsZXNzIG9mIG1vbnRoIG9yIGRvIHdlIHNlZSBzb21lIHZhcmlhdGlvbj8gCgpgYGB7cn0Kc2FmZXJfcGFya3MgJT4lCiAgZmlsdGVyKCFpcy5uYShpbmp1cnlfbW9udGgpKSAlPiUKICBjb3VudChpbmp1cnlfbW9udGgsIGluanVyeV9kb3csIHNvcnQgPSBUUlVFKQpgYGAKCldlbGwsIFNhdHVyZGF5cyBmb3IgdGhlIG1vc3QgcGFydC4gCgojIyBQcm9ibGVtIChkKSB7LX0KV2hhdCB3ZXJlIHRoZSBgZml2ZWAgZGF0ZXMgd2l0aCB0aGUgbW9zdCBudW1iZXIgb2YgYWNjaWRlbnRzPyAKCmBgYHtyfQpzYWZlcl9wYXJrcyAlPiUKICBmaWx0ZXIoIWlzLm5hKGlkYXRlKSkgJT4lCiAgY291bnQoaWRhdGUsIHNvcnQgPSBUUlVFKSAlPiUKICBhcnJhbmdlKC1uKQpgYGAKCiMjIGByIGZvbnRhd2Vzb21lOjpmYSgiZmlyZSIsIGZpbGwgPSAiZGFya3JlZCIpYCBQcm9ibGVtIChlKSB7LX0KVXNpbmcgdGhlIFRleGFzIGluanVyeSBkYXRhLCBhbnN3ZXIgdGhlIGZvbGxvd2luZyBxdWVzdGlvbjogV2hhdCByaWRlIHdhcyB0aGUgc2FmZXN0PyBbSGludDogRm9yIGVhY2ggcmlkZSAoYHJpZGVfbmFtZWApIHlvdSB3aWxsIG5lZWQgdG8gY2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgZGF5cyBiZXR3ZWVuIGFjY2lkZW50cy4gVGhlIHJpZGUgd2l0aCB0aGUgaGlnaGVzdCBudW1iZXIgb2YgZGF5cyBpcyB0aGUgc2FmZXN0Ll0gCgpgYGB7ciB0eGluanVyeX0KcmVhZF9jc3YoCiAgImh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9yZm9yZGF0YXNjaWVuY2UvdGlkeXR1ZXNkYXkvbWFzdGVyL2RhdGEvMjAxOS8yMDE5LTA5LTEwL3R4X2luanVyaWVzLmNzdiIKICApIC0+IHR4X2luanVyaWVzCmBgYAoKYHR4X2luanVyaWVzLmNzdmAKCnx2YXJpYWJsZSAgICAgICAgICB8Y2xhc3MgICAgIHxkZXNjcmlwdGlvbiB8Cnw6LS0tLS0tLS0tLS0tLS0tLS18Oi0tLS0tLS0tLXw6LS0tLS0tLS0tLS18Cnxpbmp1cnlfcmVwb3J0X3JlYyB8ZG91YmxlICAgIHwgVW5pcXVlIFJlY29yZCBJRCB8CnxuYW1lX29mX29wZXJhdGlvbiB8Y2hhcmFjdGVyIHwgQ29tcGFueSBuYW1lIHwKfGNpdHkgICAgICAgICAgICAgIHxjaGFyYWN0ZXIgfCBDaXR5IHwKfHN0ICAgICAgICAgICAgICAgIHxjaGFyYWN0ZXIgfCBTdGF0ZSAoYWxsIFRYKSB8Cnxpbmp1cnlfZGF0ZSAgICAgICB8Y2hhcmFjdGVyIHwgSW5qdXJ5IGRhdGUgLSBub3RlIHRoZXJlIGFyZSBzb21lIGRpZmZlcmVudCBmb3JtYXRzIHwKfHJpZGVfbmFtZSAgICAgICAgIHxjaGFyYWN0ZXIgfCBSaWRlIE5hbWUgfAp8c2VyaWFsX25vICAgICAgICAgfGNoYXJhY3RlciB8IFNlcmlhbCBudW1iZXIgb2YgcmlkZSB8CnxnZW5kZXIgICAgICAgICAgICB8Y2hhcmFjdGVyIHwgR2VuZGVyIG9mIHRoZSBpbmp1cmVkIGluZGl2aWR1YWwgfAp8YWdlICAgICAgICAgICAgICAgfGNoYXJhY3RlciB8IEFnZSBvZiB0aGUgaW5qdXJlZCBpbmRpdmlkdWFsIHwKfGJvZHlfcGFydCAgICAgICAgIHxjaGFyYWN0ZXIgfCBCb2R5IHBhcnQgaW5qdXJlZCB8CnxhbGxlZ2VkX2luanVyeSAgICB8Y2hhcmFjdGVyIHwgQWxsZWdlZCBpbmp1cnkgLSB0eXBlIG9mIGluanVyeSB8CnxjYXVzZV9vZl9pbmp1cnkgICB8Y2hhcmFjdGVyIHwgQXBwcm94aW1hdGUgY2F1c2Ugb2YgdGhlIGluanVyeSAoZnJlZSB0ZXh0KSB8CnxvdGhlciAgICAgICAgICAgICB8Y2hhcmFjdGVyIHwgQW5lY2RvdGFsIGluZm9ybWF0aW9uIGluIGFkZGl0aW9uIHRvIGNhdXNlIG9mIGluanVyeSB8CgoKYGBge3J9CnR4X2luanVyaWVzICU+JQogIG11dGF0ZShkYXRlID0gbWR5KGluanVyeV9kYXRlKSkgJT4lCiAgZ3JvdXBfYnkocmlkZV9uYW1lKSAlPiUKICBhcnJhbmdlKGRhdGUpICU+JQogIG11dGF0ZSgKICAgIHRzcGFuID0gaW50ZXJ2YWwobGFnKGRhdGUsIG9yZGVyX2J5ID0gcmlkZV9uYW1lKSwgZGF0ZSksCiAgICB0c3Bhbi5kYXlzID0gYXMuZHVyYXRpb24odHNwYW4pL2RkYXlzKDEpCiAgKSAlPiUKICBzZWxlY3QoZGF0ZSwgcmlkZV9uYW1lLCB0c3BhbiwgdHNwYW4uZGF5cykgJT4lCiAgYXJyYW5nZSgtdHNwYW4uZGF5cykKYGBgCgpZb3Ugc2hvdWxkIG5vdGUgdGhhdCB0aGlzIGFzc3VtZXMgZWFjaCByaWRlIHdhcyBpbiBvcGVyYXRpb24gZm9yIHRoZSBzYW1lIGFtb3VudCBvZiB0aW1lLiBJZiB0aGlzIGlzIG5vdCB0cnVlIHRoZW4gb3VyIGVzdGltYXRlcyB3aWxsIGJlIHVucmVsaWFibGUuIAoKPiBUaGUgYGluanVyeV9kYXRlYCBwcm9ibGVtIGZpeCAuLi4KCmBgYHtyIGZpeH0KdHhfaW5qdXJpZXMgJT4lCiAgbXV0YXRlKAogICAgbmV3X2RhdGUgPSBwYXJzZV9kYXRlX3RpbWUoCiAgICAgIHR4X2luanVyaWVzJGluanVyeV9kYXRlLAogICAgICBvcmRlcnMgPSBjKCJkIG0geSIsICJkIEIgWSIsICJtL2QveSIsICJ5bWQiKSkKICAgICkKCmBgYAoKCiMgRXhlcmNpc2UgMiB7LX0KVGhlc2UgZGF0YSAoc2VlIGJlbG93KSBjb21lIGZyb20gdGhpcyBzdG9yeTogW1RoZSBuZXh0IGdlbmVyYXRpb246IFRoZSBzcGFjZSByYWNlIGlzIGRvbWluYXRlZCBieSBuZXcgY29udGVuZGVyc10oaHR0cHM6Ly93d3cuZWNvbm9taXN0LmNvbS9ncmFwaGljLWRldGFpbC8yMDE4LzEwLzE4L3RoZS1zcGFjZS1yYWNlLWlzLWRvbWluYXRlZC1ieS1uZXctY29udGVuZGVycykuIFlvdSBoYXZlIGRhdGEgb24gc3BhY2UgbWlzc2lvbnMgb3ZlciB0aW1lLCB3aXRoIGRhdGVzIG9mIHRoZSBsYXVuY2gsIHRoZSBsYXVuY2hpbmcgYWdlbmN5L2NvdW50cnksIHR5cGUgb2YgbGF1bmNoIHZlaGljbGUsIGFuZCBzbyBvbi4gCgpgbGF1bmNoZXNgIHstfQoKfCB2YXJpYWJsZSAgICB8IGRlZmluaXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAp8IC0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CnwgdGFnICAgICAgICAgfCBIYXJ2YXJkIG9yIFtDT1NQQVJdW2Nvc3Bhcl0gaWQgb2YgbGF1bmNoIHwKfCBKRCAgICAgICAgICB8IFtKdWxpYW4gRGF0ZV1bamRdIG9mIGxhdW5jaCAgICAgICAgICAgICAgfAp8IGxhdW5jaF9kYXRlIHwgZGF0ZSBvZiBsYXVuY2ggICAgICAgICAgICAgICAgICAgICAgICAgICB8CnwgbGF1bmNoX3llYXIgfCB5ZWFyIG9mIGxhdW5jaCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKfCB0eXBlICAgICAgICB8IHR5cGUgb2YgbGF1bmNoIHZlaGljbGUgICAgICAgICAgICAgICAgICAgfAp8IHZhcmlhbnQgICAgIHwgdmFyaWFudCBvZiBsYXVuY2ggdmVoaWNsZSAgICAgICAgICAgICAgICB8CnwgbWlzc2lvbiAgICAgfCBzcGFjZSBtaXNzaW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKfCBhZ2VuY3kgICAgICB8IGxhdW5jaGluZyBhZ2VuY3kgICAgICAgICAgICAgICAgICAgICAgICAgfAp8IHN0YXRlX2NvZGUgIHwgbGF1bmNoaW5nIGFnZW5jeSdzIHN0YXRlICAgICAgICAgICAgICAgICB8CnwgY2F0ZWdvcnkgICAgfCBzdWNjZXNzIChPKSBvciBmYWlsdXJlIChGKSAgICAgICAgICAgICAgIHwKfCBhZ2VuY3lfdHlwZSB8IHR5cGUgb2YgYWdlbmN5ICAgICAgICAgICAgICAgICAgICAgICAgICAgfAoKCgpgYGB7cn0KcmVhZF9jc3YoCiAgImh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9yZm9yZGF0YXNjaWVuY2UvdGlkeXR1ZXNkYXkvbWFzdGVyL2RhdGEvMjAxOS8yMDE5LTAxLTE1L2xhdW5jaGVzLmNzdiIKICApIC0+IGxhdW5jaGVzCmBgYAoKIyMgUHJvYmxlbSAoYSkgey19CkNyZWF0ZSBhIG5ldyBjb2x1bW4gY2FsbGVkIGBkYXRlYCB0aGF0IHN0b3JlcyBgbGF1bmNoX2RhdGVgIGFzIGEgcHJvcGVyIGRhdGEgZmllbGQgaW4geW1kIGZvcm1hdCBmcm9tIHtsdWJyaWRhdGV9LiAKCmBgYHtyfQpsYXVuY2hlcyAlPiUKICBtdXRhdGUoZGF0ZSA9IHltZChsYXVuY2hfZGF0ZSkpIC0+IGxhdS5kZgpgYGAKCiMjIFByb2JsZW0gKGIpIHstfQpDcmVhdGluZyBjb2x1bW5zIGFzIG5lZWRlZCwgY2FsY3VsYXRlIGFuZCBzaG93IHRoZSBudW1iZXIgb2YgbGF1bmNoZXMgZmlyc3QgYnkgeWVhciwgdGhlbiBieSBtb250aCwgYW5kIHRoZW4gYnkgZGF5IG9mIHRoZSB3ZWVrLiBUaGUgcmVzdWx0IHNob3VsZCBiZSBhcnJhbmdlZCBpbiBkZXNjZW5kaW5nIG9yZGVyIG9mIHRoZSBudW1iZXIgb2YgbGF1bmNoZXMuIAoKYGBge3J9CmxhdS5kZiAlPiUKICBtdXRhdGUoCiAgICB5ZWFyID0geWVhcihkYXRlKSwKICAgIG1vbnRoID0gbW9udGgoZGF0ZSwgYWJiciA9IEZBTFNFLCBsYWJlbCA9IFRSVUUpLAogICAgZGF5ID0gZGF5KGRhdGUpLAogICAgZG93ID0gd2RheShkYXRlLCBhYmJyID0gRkFMU0UsIGxhYmVsID0gVFJVRSkKICApIC0+IGxhdS5kZgoKbGF1LmRmICU+JQogIGZpbHRlcighaXMubmEoeWVhcikpICU+JQogIGNvdW50KHllYXIsIHNvcnQgPSBUUlVFKSAKCmxhdS5kZiAlPiUKICBmaWx0ZXIoIWlzLm5hKG1vbnRoKSkgJT4lCiAgY291bnQobW9udGgsIHNvcnQgPSBUUlVFKSAKICAKbGF1LmRmICU+JQogIGZpbHRlcighaXMubmEoZGF5KSkgJT4lCiAgY291bnQoZGF5LCBzb3J0ID0gVFJVRSkgCgpsYXUuZGYgJT4lCiAgZmlsdGVyKCFpcy5uYShkb3cpKSAlPiUKICBjb3VudChkb3csIHNvcnQgPSBUUlVFKSAKYGBgCgpTbyAxOTY3LCB0aGUgbW9udGggb2YgRGVjZW1iZXIsIHRoZSAyOHRoIG9mIGEgbW9udGgsIGFuZCBUaHVyc2RheSBoYXZlIHRoZSBtb3N0IGxhdW5jaGVzLCByZXNwZWN0aXZlbHkuIAoKCiMjIFByb2JsZW0gKGMpIHstfQpIb3cgbWFueSBsYXVuY2hlcyB3ZXJlIHN1Y2Nlc3NmdWwgYChPKWAgdmVyc3VzIGZhaWxlZCBgKEYpYCBieSBjb3VudHJ5IGFuZCB5ZWFyPyBUaGUgY291bnRyaWVzIG9mIGludGVyZXN0IHdpbGwgYmUgc3RhdGVfY29kZSB2YWx1ZXMgb2YgIkNOIiwgIkYiLCAiSiIsICJSVSIsICJTVSIsICJVUyIuIFlvdSBkbyBub3QgbmVlZCB0byBhcnJhbmdlIHlvdXIgcmVzdWx0cyBpbiBhbnkgb3JkZXIuIAoKYGBge3J9CmxhdS5kZiAlPiUKICBmaWx0ZXIoCiAgICAhaXMubmEoZGF0ZSksCiAgICBzdGF0ZV9jb2RlICVpbiUgYygiQ04iLCAiRiIsICJKIiwgIlJVIiwgIlNVIiwgIlVTIikKICAgICkgJT4lCiAgY291bnQoc3RhdGVfY29kZSwgeWVhciwgY2F0ZWdvcnkpCmBgYAoK