Tidyverse Assignment Requirements - Tidyverse CREATE Assignment (25 points)

  1. Clone the provided repository (1 point) *
  2. Write a vignette using one TidyVerse package (15 points) *
  3. Write a vignette using more than one TidyVerse packages (+ 2 points) *
  4. Make a pull request on the shared repository (1 point)
  5. Update the README.md file with your example (2 points)
  6. Submit your GitHub handle name & link to Peergrade (1 point)
  7. Grade your 3 peers and provide the feedback in Peergrade (2 points)
  8. Submit the best peer link & your link to Blackboard (1 point)
library(tidyverse)
library(httr)
library(jsonlite)
library(RCurl)

Vignette 1 - jsonlite and hittr

These are two packages within tidyverse that I really enjoyed using to extract data from a New York Times API.

It is important to code defensively by capturing and processing error codes. To test if the code will fail if the status code is anything other than 200, uncomment the get_status code

api_call_return <- GET(url)
(get_status <- api_call_return$status_code)
[1] 200
# Uncomment to test stop_for_status for API call error
#get_status<- 404

Test the return status and extract the api result set for processing

if (get_status != 200) {
  stop_for_status(get_status)
}
api_call_header <- headers(api_call_return)
api_call_parsed <- content(api_call_return,"parse")
results_list <- api_call_parsed[["results"]]
head(results_list,1)
[[1]]
[[1]]$display_title
[1] "Shiva Baby"

[[1]]$mpaa_rating
[1] ""

[[1]]$critics_pick
[1] 1

[[1]]$byline
[1] "Jason Bailey"

[[1]]$headline
[1] "‘Shiva Baby’ Review: It’s Complicated"

[[1]]$summary_short
[1] "The potential land mines of a young woman’s life are set to explode simultaneously in this tense comedy from Emma Seligman."

[[1]]$publication_date
[1] "2021-04-08"

[[1]]$opening_date
[1] "2021-04-02"

[[1]]$date_updated
[1] "2021-04-08 15:29:03"

[[1]]$link
[[1]]$link$type
[1] "article"

[[1]]$link$url
[1] "https://www.nytimes.com/2021/04/08/movies/shiva-baby-review.html"

[[1]]$link$suggested_link_text
[1] "Read the New York Times Review of Shiva Baby"


[[1]]$multimedia
[[1]]$multimedia$type
[1] "mediumThreeByTwo210"

[[1]]$multimedia$src
[1] "https://static01.nyt.com/images/2021/04/10/arts/shiva1/shiva1-mediumThreeByTwo440.jpg"

[[1]]$multimedia$height
[1] 140

[[1]]$multimedia$width
[1] 210

Vignette 2 - ggplot, rCURL

These are two packages within tidyverse. rCURL allow a source to be retrieved from a website while ggplot gives the ability to create numerous types of graphs to visualize your data with.

For this vignette I am using a subset of the baseball.csv from https://www.kaggle.com/danielmontilla/baseball-databank. The subset file contains 62 players from 2019 MLB season and I will calculate batting average by position for 2019 as well as visualize the top player batting averages for 2019 by position type (outfield, infield and catcher). The catcher position is not considered an infield nor outfield position. The catcher is the only postion positioned in foul territory. Plus the catcher is the only player that can see the entire field. How many of you new this?

# Source the subset file from the Kaggle Website from my github repository
filename <- getURL("https://raw.githubusercontent.com/audiorunner13/Masters-Coursework/main/DATA607%20Spring%202021/TidyVerseVignette/Data/BattingByPosition.csv")
batting_by_posit <- read.csv(text = filename,na.strings = "")
batting_by_posit

The next four sections calculate the batting average for each position type

# create a batting_by_posit_totals data.frame and aggregate the avg by position type
batting_by_posit_totals <- aggregate.data.frame(x = batting_by_posit$avg,   # Sum by group
          by = list(batting_by_posit$posit),
          FUN = sum)
# rename fields in df
(batting_by_posit_totals <- batting_by_posit_totals %>% 
   dplyr::rename("position" = Group.1, "total_bavg" = x))
# calc a prercentage field and append to repsective rows
catcher_total_bavg_rec <- batting_by_posit_totals %>% filter(batting_by_posit_totals$position == "catcher")
catcher_bavg <- catcher_total_bavg_rec$total_bavg/14
bat_avg <- round(catcher_bavg,3)
(catcher_total_bavg_rec <- cbind(catcher_total_bavg_rec,bat_avg))
# calc a prercentage field and append to repsective rows
outfield_total_bavg_rec <- batting_by_posit_totals %>% filter(batting_by_posit_totals$position == "outfield")
outfield_bavg <- outfield_total_bavg_rec$total_bavg/24
bat_avg <- round(outfield_bavg,3)
(outfield_total_bavg_rec <- cbind(outfield_total_bavg_rec,bat_avg))
# calc a prercentage field and append to repsective rows
infield_total_bavg_rec <- batting_by_posit_totals %>% filter(batting_by_posit_totals$position == "infield")
infield_bavg <- infield_total_bavg_rec$total_bavg/24
bat_avg <- round(infield_bavg,3)
(infield_total_bavg_rec <- cbind(infield_total_bavg_rec,bat_avg))
final_batting_by_posit <- data.frame(c())
final_batting_by_posit <- rbind(final_batting_by_posit,catcher_total_bavg_rec)
final_batting_by_posit <- rbind(final_batting_by_posit,outfield_total_bavg_rec)
final_batting_by_posit <- rbind(final_batting_by_posit,infield_total_bavg_rec)
final_batting_by_posit

Use ggplot to create the following graphs to visualize the data.

final_batting_by_posit %>%
  ggplot(aes(y=reorder(position,bat_avg),x=bat_avg,fill=position)) +
      geom_bar(stat = 'identity',position=position_dodge()) +
      geom_text(aes(label=bat_avg), vjust=1.0, color="black",
                position = position_dodge(0.9), size=3.0) +
      labs(y = ("Position"),x = ("Position Batting Average"),
           title = ("2019 Batting Average by Positiion")) +
      theme_minimal()

(outfield_players <- batting_by_posit %>% filter(batting_by_posit$posit == "outfield"))
outfield_players %>%
  top_n(15) %>%
  ggplot(aes(y=reorder(playerID,avg),x=avg,fill=playerID)) +
      geom_bar(stat = 'identity',position=position_dodge()) +
      geom_text(aes(label=avg), vjust=1.0, color="black",
                position = position_dodge(0.9), size=3.0) +
      labs(y = ("Player"),x = ("Outfielder Batting Average"),
           title = ("2019 Top 15 Outfielder Batting Averages")) +
      theme_minimal()
Selecting by GIDP

(infield_players <- batting_by_posit %>% filter(batting_by_posit$posit == "infield"))
infield_players %>%
  top_n(15) %>% 
  ggplot(aes(y=reorder(playerID,avg),x=avg,fill=playerID)) +
      geom_bar(stat = 'identity',position=position_dodge()) +
      geom_text(aes(label=avg), vjust=1.0, color="black",
                position = position_dodge(0.9), size=3.0) +
      labs(y = ("Player"),x = ("Infielder Batting Average"),
           title = ("2019 Top 15 Infielder Batting Averages")) +
      theme_minimal()
Selecting by GIDP

(catchers <- batting_by_posit %>% filter(batting_by_posit$posit == "catcher"))
catchers %>%
  top_n(10) %>%
  ggplot(aes(y=reorder(playerID,avg),x=avg,fill=playerID)) +
      geom_bar(stat = 'identity',position=position_dodge()) +
      geom_text(aes(label=avg), vjust=1.0, color="black",
                position = position_dodge(0.9), size=3.0) +
      labs(y = ("Player"),x = ("Catcher Batting Average"),
           title = ("2019 Top 10 Catcher Batting Averages")) +
      theme_minimal()
Selecting by GIDP

LS0tCnRpdGxlOiAiREFUQTYwNyBUaWR5VmVyc2UgQXNzaWdubWVudCIKYXV0aG9yOiAiUGV0ZXIgR2F0aWNhIgpkYXRlOiAiYHIgZm9ybWF0KFN5cy5EYXRlKCksICclQiAlZCAlWScpYCIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKIyMjIFRpZHl2ZXJzZSBBc3NpZ25tZW50IFJlcXVpcmVtZW50cyAtIFRpZHl2ZXJzZSBDUkVBVEUgQXNzaWdubWVudCAoMjUgcG9pbnRzKQogIDEuICAgIENsb25lIHRoZSBwcm92aWRlZCByZXBvc2l0b3J5ICgxIHBvaW50KSAqCiAgMi4gICAgV3JpdGUgYSB2aWduZXR0ZSB1c2luZyBvbmUgVGlkeVZlcnNlIHBhY2thZ2UgKDE1IHBvaW50cykgKgogIDMuICAgIFdyaXRlIGEgdmlnbmV0dGUgdXNpbmcgbW9yZSB0aGFuIG9uZSBUaWR5VmVyc2UgcGFja2FnZXMgKCsgMiBwb2ludHMpICoKICA0LiAgICBNYWtlIGEgcHVsbCByZXF1ZXN0IG9uIHRoZSBzaGFyZWQgcmVwb3NpdG9yeSAoMSBwb2ludCkKICA1LiAgICBVcGRhdGUgdGhlIFJFQURNRS5tZCBmaWxlIHdpdGggeW91ciBleGFtcGxlICgyIHBvaW50cykKICA2LiAgICBTdWJtaXQgeW91ciBHaXRIdWIgaGFuZGxlIG5hbWUgJiBsaW5rIHRvIFBlZXJncmFkZSAoMSBwb2ludCkKICA3LiAgICBHcmFkZSB5b3VyIDMgcGVlcnMgYW5kIHByb3ZpZGUgdGhlIGZlZWRiYWNrIGluIFBlZXJncmFkZSAoMiBwb2ludHMpCiAgOC4gICAgU3VibWl0IHRoZSBiZXN0IHBlZXIgbGluayAmIHlvdXIgbGluayB0byBCbGFja2JvYXJkICgxIHBvaW50KQoKCmBgYHtyfQpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShodHRyKQpsaWJyYXJ5KGpzb25saXRlKQpsaWJyYXJ5KFJDdXJsKQpgYGAKCiMgVmlnbmV0dGUgMSAtIGpzb25saXRlIGFuZCBoaXR0ciAKIyMjIFRoZXNlIGFyZSB0d28gcGFja2FnZXMgd2l0aGluIHRpZHl2ZXJzZSB0aGF0IEkgcmVhbGx5IGVuam95ZWQgdXNpbmcgdG8gZXh0cmFjdCBkYXRhIGZyb20gYSBOZXcgWW9yayBUaW1lcyBBUEkuCgpgYGB7ciBpbmNsdWRlPUZBTFNFIH0KICAgKHVybCA8LSAiaHR0cHM6Ly9hcGkubnl0aW1lcy5jb20vc3ZjL21vdmllcy92Mi9yZXZpZXdzL3BpY2tzLmpzb24/b3BlbmluZy1kYXRlPTIwMjAtMDItMTI6MjAyMS0wNC0xMCZvcmRlcj1ieS1vcGVuaW5nLWRhdGUmYXBpLWtleT05aWU4T0pZcXVoWDJqcWY4aHltcjRnUDBpR2tKZ2lrRSIpCmBgYAoKSXQgaXMgaW1wb3J0YW50IHRvIGNvZGUgZGVmZW5zaXZlbHkgYnkgY2FwdHVyaW5nIGFuZCBwcm9jZXNzaW5nIGVycm9yIGNvZGVzLiAgVG8gdGVzdCBpZiB0aGUgY29kZSB3aWxsIGZhaWwgaWYgdGhlIHN0YXR1cyBjb2RlIGlzIGFueXRoaW5nIG90aGVyIHRoYW4gMjAwLCB1bmNvbW1lbnQgdGhlIGdldF9zdGF0dXMgY29kZQpgYGB7cn0KYXBpX2NhbGxfcmV0dXJuIDwtIEdFVCh1cmwpCihnZXRfc3RhdHVzIDwtIGFwaV9jYWxsX3JldHVybiRzdGF0dXNfY29kZSkKIyBVbmNvbW1lbnQgdG8gdGVzdCBzdG9wX2Zvcl9zdGF0dXMgZm9yIEFQSSBjYWxsIGVycm9yCiNnZXRfc3RhdHVzPC0gNDA0CmBgYApUZXN0IHRoZSByZXR1cm4gc3RhdHVzIGFuZCBleHRyYWN0IHRoZSBhcGkgcmVzdWx0IHNldCBmb3IgcHJvY2Vzc2luZwpgYGB7ciB0ZXN0IHRoZSByZXR1cm4gc3RhdHVzIGFuZCBleHRyYWN0IHRoZSBhcGkgcmVzdWx0IHNldCBmb3IgcHJvY2Vzc2luZ30KaWYgKGdldF9zdGF0dXMgIT0gMjAwKSB7CiAgc3RvcF9mb3Jfc3RhdHVzKGdldF9zdGF0dXMpCn0KYXBpX2NhbGxfaGVhZGVyIDwtIGhlYWRlcnMoYXBpX2NhbGxfcmV0dXJuKQphcGlfY2FsbF9wYXJzZWQgPC0gY29udGVudChhcGlfY2FsbF9yZXR1cm4sInBhcnNlIikKcmVzdWx0c19saXN0IDwtIGFwaV9jYWxsX3BhcnNlZFtbInJlc3VsdHMiXV0KaGVhZChyZXN1bHRzX2xpc3QsMSkKYGBgCgojIFZpZ25ldHRlIDIgLSBnZ3Bsb3QsIHJDVVJMCiMjIyBUaGVzZSBhcmUgdHdvIHBhY2thZ2VzIHdpdGhpbiB0aWR5dmVyc2UuIHJDVVJMIGFsbG93IGEgc291cmNlIHRvIGJlIHJldHJpZXZlZCBmcm9tIGEgd2Vic2l0ZSB3aGlsZSBnZ3Bsb3QgZ2l2ZXMgdGhlIGFiaWxpdHkgdG8gY3JlYXRlIG51bWVyb3VzIHR5cGVzIG9mIGdyYXBocyB0byB2aXN1YWxpemUgeW91ciBkYXRhIHdpdGguCgpGb3IgdGhpcyB2aWduZXR0ZSBJIGFtIHVzaW5nIGEgc3Vic2V0IG9mIHRoZSBiYXNlYmFsbC5jc3YgZnJvbSBodHRwczovL3d3dy5rYWdnbGUuY29tL2RhbmllbG1vbnRpbGxhL2Jhc2ViYWxsLWRhdGFiYW5rLiAgVGhlIHN1YnNldCBmaWxlIGNvbnRhaW5zIDYyIHBsYXllcnMgZnJvbSAyMDE5IE1MQiBzZWFzb24gYW5kIEkgd2lsbCBjYWxjdWxhdGUgYmF0dGluZyBhdmVyYWdlIGJ5IHBvc2l0aW9uIGZvciAyMDE5IGFzIHdlbGwgYXMgdmlzdWFsaXplIHRoZSB0b3AgcGxheWVyIGJhdHRpbmcgYXZlcmFnZXMgZm9yIDIwMTkgYnkgcG9zaXRpb24gdHlwZSAob3V0ZmllbGQsIGluZmllbGQgYW5kIGNhdGNoZXIpLiBUaGUgY2F0Y2hlciBwb3NpdGlvbiBpcyBub3QgY29uc2lkZXJlZCBhbiBpbmZpZWxkIG5vciBvdXRmaWVsZCBwb3NpdGlvbi4gIFRoZSBjYXRjaGVyIGlzIHRoZSBvbmx5IHBvc3Rpb24gcG9zaXRpb25lZCBpbiBmb3VsIHRlcnJpdG9yeS4gIFBsdXMgdGhlIGNhdGNoZXIgaXMgdGhlIG9ubHkgcGxheWVyIHRoYXQgY2FuIHNlZSB0aGUgZW50aXJlIGZpZWxkLiAgSG93IG1hbnkgb2YgeW91IG5ldyB0aGlzPwoKYGBge3IgU291cmNlIHN1YnNldCBmaWxlIGZyb20ga2FnZ2xlIHdlYnNpdGUgZnJvbSBteSBnaXRodWJ9CiMgU291cmNlIHRoZSBzdWJzZXQgZmlsZSBmcm9tIHRoZSBLYWdnbGUgV2Vic2l0ZSBmcm9tIG15IGdpdGh1YiByZXBvc2l0b3J5CmZpbGVuYW1lIDwtIGdldFVSTCgiaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2F1ZGlvcnVubmVyMTMvTWFzdGVycy1Db3Vyc2V3b3JrL21haW4vREFUQTYwNyUyMFNwcmluZyUyMDIwMjEvVGlkeVZlcnNlVmlnbmV0dGUvRGF0YS9CYXR0aW5nQnlQb3NpdGlvbi5jc3YiKQpiYXR0aW5nX2J5X3Bvc2l0IDwtIHJlYWQuY3N2KHRleHQgPSBmaWxlbmFtZSxuYS5zdHJpbmdzID0gIiIpCmJhdHRpbmdfYnlfcG9zaXQKYGBgCgpUaGUgbmV4dCBmb3VyIHNlY3Rpb25zIGNhbGN1bGF0ZSB0aGUgYmF0dGluZyBhdmVyYWdlIGZvciBlYWNoIHBvc2l0aW9uIHR5cGUKYGBge3J9CiMgY3JlYXRlIGEgYmF0dGluZ19ieV9wb3NpdF90b3RhbHMgZGF0YS5mcmFtZSBhbmQgYWdncmVnYXRlIHRoZSBhdmcgYnkgcG9zaXRpb24gdHlwZQpiYXR0aW5nX2J5X3Bvc2l0X3RvdGFscyA8LSBhZ2dyZWdhdGUuZGF0YS5mcmFtZSh4ID0gYmF0dGluZ19ieV9wb3NpdCRhdmcsICAgIyBTdW0gYnkgZ3JvdXAKICAgICAgICAgIGJ5ID0gbGlzdChiYXR0aW5nX2J5X3Bvc2l0JHBvc2l0KSwKICAgICAgICAgIEZVTiA9IHN1bSkKIyByZW5hbWUgZmllbGRzIGluIGRmCihiYXR0aW5nX2J5X3Bvc2l0X3RvdGFscyA8LSBiYXR0aW5nX2J5X3Bvc2l0X3RvdGFscyAlPiUgCiAgIGRwbHlyOjpyZW5hbWUoInBvc2l0aW9uIiA9IEdyb3VwLjEsICJ0b3RhbF9iYXZnIiA9IHgpKQpgYGAKCmBgYHtyIGNhbGMgYSBjYXRjaGVyIGJhdHRpbmcgYXZlcmFnZ2UgYW5kIGNyZWF0ZSBjYXRjaGVyIHJlY29yZCBkZiwgZWNobz1UUlVFfQojIGNhbGMgYSBwcmVyY2VudGFnZSBmaWVsZCBhbmQgYXBwZW5kIHRvIHJlcHNlY3RpdmUgcm93cwpjYXRjaGVyX3RvdGFsX2JhdmdfcmVjIDwtIGJhdHRpbmdfYnlfcG9zaXRfdG90YWxzICU+JSBmaWx0ZXIoYmF0dGluZ19ieV9wb3NpdF90b3RhbHMkcG9zaXRpb24gPT0gImNhdGNoZXIiKQpjYXRjaGVyX2JhdmcgPC0gY2F0Y2hlcl90b3RhbF9iYXZnX3JlYyR0b3RhbF9iYXZnLzE0CmJhdF9hdmcgPC0gcm91bmQoY2F0Y2hlcl9iYXZnLDMpCihjYXRjaGVyX3RvdGFsX2JhdmdfcmVjIDwtIGNiaW5kKGNhdGNoZXJfdG90YWxfYmF2Z19yZWMsYmF0X2F2ZykpCmBgYAoKYGBge3IgY2FsYyBhIG91dGZpZWxkIGJhdHRpbmcgYXZlcmFnZ2UgYW5kIGNyZWF0ZSBvdXRmaWVsZCByZWNvcmQgZGYsIGVjaG89VFJVRX0KIyBjYWxjIGEgcHJlcmNlbnRhZ2UgZmllbGQgYW5kIGFwcGVuZCB0byByZXBzZWN0aXZlIHJvd3MKb3V0ZmllbGRfdG90YWxfYmF2Z19yZWMgPC0gYmF0dGluZ19ieV9wb3NpdF90b3RhbHMgJT4lIGZpbHRlcihiYXR0aW5nX2J5X3Bvc2l0X3RvdGFscyRwb3NpdGlvbiA9PSAib3V0ZmllbGQiKQpvdXRmaWVsZF9iYXZnIDwtIG91dGZpZWxkX3RvdGFsX2JhdmdfcmVjJHRvdGFsX2JhdmcvMjQKYmF0X2F2ZyA8LSByb3VuZChvdXRmaWVsZF9iYXZnLDMpCihvdXRmaWVsZF90b3RhbF9iYXZnX3JlYyA8LSBjYmluZChvdXRmaWVsZF90b3RhbF9iYXZnX3JlYyxiYXRfYXZnKSkKYGBgCgpgYGB7ciBjYWxjIGEgaW5maWVsZCBiYXR0aW5nIGF2ZXJhZ2dlIGFuZCBjcmVhdGUgaW5maWVsZCByZWNvcmQgZGYsIGVjaG89VFJVRX0KIyBjYWxjIGEgcHJlcmNlbnRhZ2UgZmllbGQgYW5kIGFwcGVuZCB0byByZXBzZWN0aXZlIHJvd3MKaW5maWVsZF90b3RhbF9iYXZnX3JlYyA8LSBiYXR0aW5nX2J5X3Bvc2l0X3RvdGFscyAlPiUgZmlsdGVyKGJhdHRpbmdfYnlfcG9zaXRfdG90YWxzJHBvc2l0aW9uID09ICJpbmZpZWxkIikKaW5maWVsZF9iYXZnIDwtIGluZmllbGRfdG90YWxfYmF2Z19yZWMkdG90YWxfYmF2Zy8yNApiYXRfYXZnIDwtIHJvdW5kKGluZmllbGRfYmF2ZywzKQooaW5maWVsZF90b3RhbF9iYXZnX3JlYyA8LSBjYmluZChpbmZpZWxkX3RvdGFsX2JhdmdfcmVjLGJhdF9hdmcpKQpgYGAKCmBgYHtyIHVzZSByYmluZiB0byBjcmVhdGUgZmluYWwgYmF0dGluZyBhdmVyYWdlIGJ5IHBvc2l0aW9uIGRmfQpmaW5hbF9iYXR0aW5nX2J5X3Bvc2l0IDwtIGRhdGEuZnJhbWUoYygpKQpmaW5hbF9iYXR0aW5nX2J5X3Bvc2l0IDwtIHJiaW5kKGZpbmFsX2JhdHRpbmdfYnlfcG9zaXQsY2F0Y2hlcl90b3RhbF9iYXZnX3JlYykKZmluYWxfYmF0dGluZ19ieV9wb3NpdCA8LSByYmluZChmaW5hbF9iYXR0aW5nX2J5X3Bvc2l0LG91dGZpZWxkX3RvdGFsX2JhdmdfcmVjKQpmaW5hbF9iYXR0aW5nX2J5X3Bvc2l0IDwtIHJiaW5kKGZpbmFsX2JhdHRpbmdfYnlfcG9zaXQsaW5maWVsZF90b3RhbF9iYXZnX3JlYykKZmluYWxfYmF0dGluZ19ieV9wb3NpdApgYGAKCiMjIyMgVXNlIGdncGxvdCB0byBjcmVhdGUgdGhlIGZvbGxvd2luZyBncmFwaHMgdG8gdmlzdWFsaXplIHRoZSBkYXRhLgpgYGB7ciBwbG90IGJhciBncmFwaCBvZiB0b3RhbCBiYXR0aW5nIGF2ZXJhZ2UgYnkgcG9zaXRpb259CmZpbmFsX2JhdHRpbmdfYnlfcG9zaXQgJT4lCiAgZ2dwbG90KGFlcyh5PXJlb3JkZXIocG9zaXRpb24sYmF0X2F2ZykseD1iYXRfYXZnLGZpbGw9cG9zaXRpb24pKSArCiAgICAgIGdlb21fYmFyKHN0YXQgPSAnaWRlbnRpdHknLHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKCkpICsKICAgICAgZ2VvbV90ZXh0KGFlcyhsYWJlbD1iYXRfYXZnKSwgdmp1c3Q9MS4wLCBjb2xvcj0iYmxhY2siLAogICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSgwLjkpLCBzaXplPTMuMCkgKwogICAgICBsYWJzKHkgPSAoIlBvc2l0aW9uIikseCA9ICgiUG9zaXRpb24gQmF0dGluZyBBdmVyYWdlIiksCiAgICAgICAgICAgdGl0bGUgPSAoIjIwMTkgQmF0dGluZyBBdmVyYWdlIGJ5IFBvc2l0aWlvbiIpKSArCiAgICAgIHRoZW1lX21pbmltYWwoKQpgYGAKCmBgYHtyIHN1YnNldCBiYXR0aW5nX2J5X3Bvc2l0IGJ5IG91dGZpZWxkIHBvc2l0aW9ufQoob3V0ZmllbGRfcGxheWVycyA8LSBiYXR0aW5nX2J5X3Bvc2l0ICU+JSBmaWx0ZXIoYmF0dGluZ19ieV9wb3NpdCRwb3NpdCA9PSAib3V0ZmllbGQiKSkKYGBgCgpgYGB7ciBwbG90IGJhciBncmFwaCBvZiBvdXRmaWVsZGVyIGJhdHRpbmcgYXZlcmFnZX0Kb3V0ZmllbGRfcGxheWVycyAlPiUKICB0b3BfbigxNSkgJT4lCiAgZ2dwbG90KGFlcyh5PXJlb3JkZXIocGxheWVySUQsYXZnKSx4PWF2ZyxmaWxsPXBsYXllcklEKSkgKwogICAgICBnZW9tX2JhcihzdGF0ID0gJ2lkZW50aXR5Jyxwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSgpKSArCiAgICAgIGdlb21fdGV4dChhZXMobGFiZWw9YXZnKSwgdmp1c3Q9MS4wLCBjb2xvcj0iYmxhY2siLAogICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSgwLjkpLCBzaXplPTMuMCkgKwogICAgICBsYWJzKHkgPSAoIlBsYXllciIpLHggPSAoIk91dGZpZWxkZXIgQmF0dGluZyBBdmVyYWdlIiksCiAgICAgICAgICAgdGl0bGUgPSAoIjIwMTkgVG9wIDE1IE91dGZpZWxkZXIgQmF0dGluZyBBdmVyYWdlcyIpKSArCiAgICAgIHRoZW1lX21pbmltYWwoKQpgYGAKCmBgYHtyIHN1YnNldCBiYXR0aW5nX2J5X3Bvc2l0IGJ5IGluZmllbGQgcG9zaXRpb259CihpbmZpZWxkX3BsYXllcnMgPC0gYmF0dGluZ19ieV9wb3NpdCAlPiUgZmlsdGVyKGJhdHRpbmdfYnlfcG9zaXQkcG9zaXQgPT0gImluZmllbGQiKSkKYGBgCgpgYGB7ciBwbG90IGJhciBncmFwaCBvZiBpbmZpZWxkZXIgYmF0dGluZyBhdmVyYWdlfQppbmZpZWxkX3BsYXllcnMgJT4lCiAgdG9wX24oMTUpICU+JSAKICBnZ3Bsb3QoYWVzKHk9cmVvcmRlcihwbGF5ZXJJRCxhdmcpLHg9YXZnLGZpbGw9cGxheWVySUQpKSArCiAgICAgIGdlb21fYmFyKHN0YXQgPSAnaWRlbnRpdHknLHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKCkpICsKICAgICAgZ2VvbV90ZXh0KGFlcyhsYWJlbD1hdmcpLCB2anVzdD0xLjAsIGNvbG9yPSJibGFjayIsCiAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKDAuOSksIHNpemU9My4wKSArCiAgICAgIGxhYnMoeSA9ICgiUGxheWVyIikseCA9ICgiSW5maWVsZGVyIEJhdHRpbmcgQXZlcmFnZSIpLAogICAgICAgICAgIHRpdGxlID0gKCIyMDE5IFRvcCAxNSBJbmZpZWxkZXIgQmF0dGluZyBBdmVyYWdlcyIpKSArCiAgICAgIHRoZW1lX21pbmltYWwoKQpgYGAKCmBgYHtyIHN1YnNldCBiYXR0aW5nX2J5X3Bvc2l0IGJ5IGNhdGNoZXIgcG9zaXRpb259CihjYXRjaGVycyA8LSBiYXR0aW5nX2J5X3Bvc2l0ICU+JSBmaWx0ZXIoYmF0dGluZ19ieV9wb3NpdCRwb3NpdCA9PSAiY2F0Y2hlciIpKQpgYGAKCmBgYHtyIHBsb3QgYmFyIGdyYXBoIG9mIGNhdGNoZXIgYmF0dGluZyBhdmVyYWdlfQpjYXRjaGVycyAlPiUKICB0b3BfbigxMCkgJT4lCiAgZ2dwbG90KGFlcyh5PXJlb3JkZXIocGxheWVySUQsYXZnKSx4PWF2ZyxmaWxsPXBsYXllcklEKSkgKwogICAgICBnZW9tX2JhcihzdGF0ID0gJ2lkZW50aXR5Jyxwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSgpKSArCiAgICAgIGdlb21fdGV4dChhZXMobGFiZWw9YXZnKSwgdmp1c3Q9MS4wLCBjb2xvcj0iYmxhY2siLAogICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSgwLjkpLCBzaXplPTMuMCkgKwogICAgICBsYWJzKHkgPSAoIlBsYXllciIpLHggPSAoIkNhdGNoZXIgQmF0dGluZyBBdmVyYWdlIiksCiAgICAgICAgICAgdGl0bGUgPSAoIjIwMTkgVG9wIDEwIENhdGNoZXIgQmF0dGluZyBBdmVyYWdlcyIpKSArCiAgICAgIHRoZW1lX21pbmltYWwoKQpgYGAK