library(genius)
package 㤼㸱genius㤼㸲 was built under R version 4.0.4
library(tidyverse)
Registered S3 methods overwritten by 'dbplyr':
  method         from
  print.tbl_lazy     
  print.tbl_sql      
-- Attaching packages ------------------------------------------------- tidyverse 1.3.0 --
v ggplot2 3.3.3     v purrr   0.3.4
v tibble  3.1.0     v dplyr   1.0.4
v tidyr   1.1.3     v stringr 1.4.0
v readr   1.4.0     v forcats 0.5.1
package 㤼㸱tidyr㤼㸲 was built under R version 4.0.4-- Conflicts ---------------------------------------------------- tidyverse_conflicts() --
x dplyr::filter() masks stats::filter()
x dplyr::lag()    masks stats::lag()
library(tidytext)
package 㤼㸱tidytext㤼㸲 was built under R version 4.0.4
library(wordcloud2)
Registered S3 method overwritten by 'htmlwidgets':
  method           from         
  print.htmlwidget tools:rstudio
judds <- genius_album(artist = "the judds", album = "rockin_with_the_rhythm")
`html_session()` was deprecated in rvest 1.0.0.
Please use `session()` instead.Joining, by = c("album_name", "track_n", "track_url")

TEXT ANALYSIS OF LYRICS BY THE JUDDS

For this text analysis of lyrics, I decided to use my favorite country artists, The Judds. The Judds have been one of my musical influences ever since I can remember. A mother and daughter duet, they rocked the country world in the 80s. In the following three tables, we will break down each song by word, determine which word is the most used, as well as remove the common words such as the, and, you, and I.

judds_words <- judds %>%
  unnest_tokens(word, lyric) %>%
  select(track_title, word)

judds_words
NA
judds_words %>%
  count(word, sort = T)
NA
NA



judds_words %>%
  anti_join(stop_words) %>%
  count(word, sort = T)
Joining, by = "word"

The word cloud below shows that the words baby and treat were used most often.

judds_words %>%
  anti_join(stop_words) %>%
  count(word, sort = T) %>%
  top_n(100) %>%
  wordcloud2(size = .5)
Joining, by = "word"
Selecting by n

bing <- get_sentiments("bing")
bing
NA

Next we will determine the sentiment behind the words that were used. The following table and graph shows that more words were used with a negative conotation than a positive one.


judds_words %>%
  inner_join(bing) %>%
  count(word, sentiment, sort = TRUE)
Joining, by = "word"

judds_words %>%
  inner_join(bing) %>%
  count(word, sentiment, sort = TRUE) %>%
  group_by(sentiment) %>%
  top_n(10) %>%
  ungroup() %>%
  mutate(word = reorder(word, n)) %>%
  ggplot(aes(word, n, fill = sentiment)) +
  geom_col(show.legend = FALSE) +
  facet_wrap(vars(sentiment), scales = "free") +
  labs(y = "The Judds - Words That Contribute the Most to Each Sentiment", x = NULL) +
  scale_fill_viridis_d() +
  coord_flip() +
  theme_minimal()
Joining, by = "word"
Selecting by n

The following word clouds shows that love and like were used the most with positive sentiment and fall and cry were used with a negative sentiment.

judds_words %>%
  inner_join(bing) %>%
  count(word, sentiment, sort = TRUE) %>%
  filter(sentiment == "positive") %>%
  select(word, n) %>%
  wordcloud2()
Joining, by = "word"

judds_words %>%
  inner_join(bing) %>%
  count(word, sentiment, sort = TRUE) %>%
  filter(sentiment == "negative") %>%
  select(word, n) %>%
  wordcloud2()
Joining, by = "word"

Now we will determine what two words were used together the most throughout the lyrics of the album.


judds %>%
  unnest_tokens(bigram, lyric, token = "ngrams", n = 2)%>%
  select(bigram)
NA
judds %>%
  unnest_tokens(bigram, lyric, token = "ngrams", n = 2)%>%
  select(bigram) -> judds_bigrams
judds_bigrams %>%
  count(bigram, sort = T)
NA

judds_bigrams %>%
  separate(bigram, c("word1", "word2"), sep = " ") %>%
  filter(!word1 %in% stop_words$word) %>%
  filter(!word2 %in% stop_words$word) %>%
  unite(bigram, word1, word2, sep = " ")
NA

judds_bigrams %>%
  separate(bigram, c("word1", "word2"), sep = " ") %>%
  filter(!word1 %in% stop_words$word) %>%
  filter(!word2 %in% stop_words$word) %>%
  unite(bigram, word1, word2, sep = " ") %>%
  count(bigram, sort = T)
NA

judds_bigrams %>%
  separate(bigram, c("word1", "word2"), sep = " ") %>%
  filter(!word1 %in% stop_words$word) %>%
  filter(!word2 %in% stop_words$word) %>%
  unite(bigram, word1, word2, sep = " ") %>%
  count(bigram, sort = T) %>%
  filter(n  >  1) %>%
  wordcloud2(size = .5)
NA

In the word cloud above you can see that “river roll” and “na na” were the most common two word combinations.


first_word <- c("i", "you")


judds_bigrams %>%
  count(bigram, sort = T) %>%
  separate(bigram, c("word1", "word2"), sep = " ") %>%
  filter(word1 %in% first_word) %>%
  count(word1, word2, wt = n, sort = TRUE)
NA

Next we will look at what words follow “I” and “you” as well as “he” and “she” the most.



first_word <- c("i", "you")


judds_bigrams %>%
  count(bigram, sort = T) %>%
  separate(bigram, c("word1", "word2"), sep = " ") %>%
  filter(word1 %in% first_word) %>%
  count(word1, word2, wt = n, sort = TRUE) %>%
  mutate(word2 = factor(word2, levels = rev(unique(word2)))) %>%
  group_by(word1) %>%
  top_n(5) %>%
  ggplot(aes(word2, n, fill = word1)) +
  scale_fill_viridis_d() + 
  geom_col(show.legend = FALSE) + 
  labs(x = NULL, y = NULL, title = "Words Following: I and You") +
  facet_wrap(~word1, scales = "free") +
  coord_flip() +
  theme_minimal()
Selecting by n

NA
NA

The table above indicates “wish” followed “I” more frequently, and “that” followed “you” most often. The table below indicates that “gave” followed “he” most often and “Wouldn’t” followed “she” more frequently.

The word combinations noticed makes sense as they do have a song called “River Roll on” and “I Wish She Wouldn’t Treat You That Way.”



first_word <- c("he", "she")


judds_bigrams %>%
  count(bigram, sort = T) %>%
  separate(bigram, c("word1", "word2"), sep = " ") %>%
  filter(word1 %in% first_word) %>%
  count(word1, word2, wt = n, sort = TRUE) %>%
  mutate(word2 = factor(word2, levels = rev(unique(word2)))) %>%
  group_by(word1) %>%
  top_n(5) %>%
  ggplot(aes(word2, n, fill = word1)) +
  scale_fill_viridis_d() + 
  geom_col(show.legend = FALSE) + 
  labs(x = NULL, y = NULL, title = "Words Following: He and She") +
  facet_wrap(~word1, scales = "free") +
  coord_flip() +
  theme_minimal()
Selecting by n


judds %>%
  unnest_tokens(words, lyric, token = "ngrams", n = 4)%>%
  count(words, sort = T)
NA

In the last analysis, we will look at what four word combination was used most on the album. As you can see, “Rockin With The Rhythm” was used the most. Again this makes sense as "Rockin With The Rhythm is the name of a song and one of the albums.


judds %>%
  unnest_tokens(words, lyric, token = "ngrams", n = 4)%>%
  count(words, sort = T) %>%
  filter(words == "rockin with the rhythm")
NA
LS0tDQp0aXRsZTogIk1JTk5JRSBCRUxMIC0gVEVYVCBBTkFMWVNJUyAyIC0gTFlSSUNTIC0gVEhFIEpVRERTIg0Kb3V0cHV0Og0KICBodG1sX25vdGVib29rOiBkZWZhdWx0DQogIHBkZl9kb2N1bWVudDogZGVmYXVsdA0KLS0tDQoNCmBgYHtyfQ0KbGlicmFyeShnZW5pdXMpDQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkodGlkeXRleHQpDQpsaWJyYXJ5KHdvcmRjbG91ZDIpDQpgYGANCg0KYGBge3J9DQpqdWRkcyA8LSBnZW5pdXNfYWxidW0oYXJ0aXN0ID0gInRoZSBqdWRkcyIsIGFsYnVtID0gInJvY2tpbl93aXRoX3RoZV9yaHl0aG0iKQ0KYGBgDQoNCiMjIyBURVhUIEFOQUxZU0lTIE9GIExZUklDUyBCWSBUSEUgSlVERFMNCg0KRm9yIHRoaXMgdGV4dCBhbmFseXNpcyBvZiBseXJpY3MsIEkgZGVjaWRlZCB0byB1c2UgbXkgZmF2b3JpdGUgY291bnRyeSBhcnRpc3RzLCBUaGUgSnVkZHMuIFRoZSBKdWRkcyBoYXZlIGJlZW4gb25lIG9mIG15IG11c2ljYWwgaW5mbHVlbmNlcyBldmVyIHNpbmNlIEkgY2FuIHJlbWVtYmVyLiBBIG1vdGhlciBhbmQgZGF1Z2h0ZXIgZHVldCwgdGhleSByb2NrZWQgdGhlIGNvdW50cnkgd29ybGQgaW4gdGhlIDgwcy4gSW4gdGhlIGZvbGxvd2luZyB0aHJlZSB0YWJsZXMsIHdlIHdpbGwgYnJlYWsgZG93biBlYWNoIHNvbmcgYnkgd29yZCwgZGV0ZXJtaW5lIHdoaWNoIHdvcmQgaXMgdGhlIG1vc3QgdXNlZCwgYXMgd2VsbCBhcyByZW1vdmUgdGhlIGNvbW1vbiB3b3JkcyBzdWNoIGFzIHRoZSwgYW5kLCB5b3UsIGFuZCBJLg0KDQoNCmBgYHtyfQ0KanVkZHNfd29yZHMgPC0ganVkZHMgJT4lDQogIHVubmVzdF90b2tlbnMod29yZCwgbHlyaWMpICU+JQ0KICBzZWxlY3QodHJhY2tfdGl0bGUsIHdvcmQpDQoNCmp1ZGRzX3dvcmRzDQoNCmBgYA0KDQoNCmBgYHtyfQ0KanVkZHNfd29yZHMgJT4lDQogIGNvdW50KHdvcmQsIHNvcnQgPSBUKQ0KDQoNCmBgYA0KDQpgYGB7cn0NCg0KDQoNCmp1ZGRzX3dvcmRzICU+JQ0KICBhbnRpX2pvaW4oc3RvcF93b3JkcykgJT4lDQogIGNvdW50KHdvcmQsIHNvcnQgPSBUKQ0KDQpgYGANCg0KDQpUaGUgd29yZCBjbG91ZCBiZWxvdyBzaG93cyB0aGF0IHRoZSB3b3JkcyBiYWJ5IGFuZCB0cmVhdCB3ZXJlIHVzZWQgbW9zdCBvZnRlbi4gDQoNCg0KYGBge3J9DQpqdWRkc193b3JkcyAlPiUNCiAgYW50aV9qb2luKHN0b3Bfd29yZHMpICU+JQ0KICBjb3VudCh3b3JkLCBzb3J0ID0gVCkgJT4lDQogIHRvcF9uKDEwMCkgJT4lDQogIHdvcmRjbG91ZDIoc2l6ZSA9IC41KQ0KDQpgYGANCg0KYGBge3J9DQoNCmJpbmcgPC0gZ2V0X3NlbnRpbWVudHMoImJpbmciKQ0KYmluZw0KDQpgYGANCg0KTmV4dCB3ZSB3aWxsIGRldGVybWluZSB0aGUgc2VudGltZW50IGJlaGluZCB0aGUgd29yZHMgdGhhdCB3ZXJlIHVzZWQuIFRoZSBmb2xsb3dpbmcgdGFibGUgYW5kIGdyYXBoIHNob3dzIHRoYXQgbW9yZSB3b3JkcyB3ZXJlIHVzZWQgd2l0aCBhIG5lZ2F0aXZlIGNvbm90YXRpb24gdGhhbiBhIHBvc2l0aXZlIG9uZS4NCg0KYGBge3J9DQoNCmp1ZGRzX3dvcmRzICU+JQ0KICBpbm5lcl9qb2luKGJpbmcpICU+JQ0KICBjb3VudCh3b3JkLCBzZW50aW1lbnQsIHNvcnQgPSBUUlVFKQ0KDQpgYGANCg0KDQoNCmBgYHtyfQ0KDQpqdWRkc193b3JkcyAlPiUNCiAgaW5uZXJfam9pbihiaW5nKSAlPiUNCiAgY291bnQod29yZCwgc2VudGltZW50LCBzb3J0ID0gVFJVRSkgJT4lDQogIGdyb3VwX2J5KHNlbnRpbWVudCkgJT4lDQogIHRvcF9uKDEwKSAlPiUNCiAgdW5ncm91cCgpICU+JQ0KICBtdXRhdGUod29yZCA9IHJlb3JkZXIod29yZCwgbikpICU+JQ0KICBnZ3Bsb3QoYWVzKHdvcmQsIG4sIGZpbGwgPSBzZW50aW1lbnQpKSArDQogIGdlb21fY29sKHNob3cubGVnZW5kID0gRkFMU0UpICsNCiAgZmFjZXRfd3JhcCh2YXJzKHNlbnRpbWVudCksIHNjYWxlcyA9ICJmcmVlIikgKw0KICBsYWJzKHkgPSAiVGhlIEp1ZGRzIC0gV29yZHMgVGhhdCBDb250cmlidXRlIHRoZSBNb3N0IHRvIEVhY2ggU2VudGltZW50IiwgeCA9IE5VTEwpICsNCiAgc2NhbGVfZmlsbF92aXJpZGlzX2QoKSArDQogIGNvb3JkX2ZsaXAoKSArDQogIHRoZW1lX21pbmltYWwoKQ0KDQpgYGANCg0KVGhlIGZvbGxvd2luZyB3b3JkIGNsb3VkcyBzaG93cyB0aGF0IGxvdmUgYW5kIGxpa2Ugd2VyZSB1c2VkIHRoZSBtb3N0IHdpdGggcG9zaXRpdmUgc2VudGltZW50IGFuZCBmYWxsIGFuZCBjcnkgd2VyZSB1c2VkIHdpdGggYSBuZWdhdGl2ZSBzZW50aW1lbnQuDQoNCmBgYHtyfQ0KanVkZHNfd29yZHMgJT4lDQogIGlubmVyX2pvaW4oYmluZykgJT4lDQogIGNvdW50KHdvcmQsIHNlbnRpbWVudCwgc29ydCA9IFRSVUUpICU+JQ0KICBmaWx0ZXIoc2VudGltZW50ID09ICJwb3NpdGl2ZSIpICU+JQ0KICBzZWxlY3Qod29yZCwgbikgJT4lDQogIHdvcmRjbG91ZDIoKQ0KDQpgYGANCg0KDQpgYGB7cn0NCg0KanVkZHNfd29yZHMgJT4lDQogIGlubmVyX2pvaW4oYmluZykgJT4lDQogIGNvdW50KHdvcmQsIHNlbnRpbWVudCwgc29ydCA9IFRSVUUpICU+JQ0KICBmaWx0ZXIoc2VudGltZW50ID09ICJuZWdhdGl2ZSIpICU+JQ0KICBzZWxlY3Qod29yZCwgbikgJT4lDQogIHdvcmRjbG91ZDIoKQ0KDQpgYGANCg0KDQpOb3cgd2Ugd2lsbCBkZXRlcm1pbmUgd2hhdCB0d28gd29yZHMgd2VyZSB1c2VkIHRvZ2V0aGVyIHRoZSBtb3N0IHRocm91Z2hvdXQgdGhlIGx5cmljcyBvZiB0aGUgYWxidW0uDQoNCmBgYHtyfQ0KDQpqdWRkcyAlPiUNCiAgdW5uZXN0X3Rva2VucyhiaWdyYW0sIGx5cmljLCB0b2tlbiA9ICJuZ3JhbXMiLCBuID0gMiklPiUNCiAgc2VsZWN0KGJpZ3JhbSkNCg0KYGBgDQoNCg0KYGBge3J9DQpqdWRkcyAlPiUNCiAgdW5uZXN0X3Rva2VucyhiaWdyYW0sIGx5cmljLCB0b2tlbiA9ICJuZ3JhbXMiLCBuID0gMiklPiUNCiAgc2VsZWN0KGJpZ3JhbSkgLT4ganVkZHNfYmlncmFtcw0KYGBgDQoNCg0KYGBge3J9DQpqdWRkc19iaWdyYW1zICU+JQ0KICBjb3VudChiaWdyYW0sIHNvcnQgPSBUKQ0KDQpgYGANCg0KDQpgYGB7cn0NCg0KanVkZHNfYmlncmFtcyAlPiUNCiAgc2VwYXJhdGUoYmlncmFtLCBjKCJ3b3JkMSIsICJ3b3JkMiIpLCBzZXAgPSAiICIpICU+JQ0KICBmaWx0ZXIoIXdvcmQxICVpbiUgc3RvcF93b3JkcyR3b3JkKSAlPiUNCiAgZmlsdGVyKCF3b3JkMiAlaW4lIHN0b3Bfd29yZHMkd29yZCkgJT4lDQogIHVuaXRlKGJpZ3JhbSwgd29yZDEsIHdvcmQyLCBzZXAgPSAiICIpDQoNCmBgYA0KDQoNCmBgYHtyfQ0KDQpqdWRkc19iaWdyYW1zICU+JQ0KICBzZXBhcmF0ZShiaWdyYW0sIGMoIndvcmQxIiwgIndvcmQyIiksIHNlcCA9ICIgIikgJT4lDQogIGZpbHRlcighd29yZDEgJWluJSBzdG9wX3dvcmRzJHdvcmQpICU+JQ0KICBmaWx0ZXIoIXdvcmQyICVpbiUgc3RvcF93b3JkcyR3b3JkKSAlPiUNCiAgdW5pdGUoYmlncmFtLCB3b3JkMSwgd29yZDIsIHNlcCA9ICIgIikgJT4lDQogIGNvdW50KGJpZ3JhbSwgc29ydCA9IFQpDQoNCmBgYA0KDQoNCmBgYHtyfQ0KDQpqdWRkc19iaWdyYW1zICU+JQ0KICBzZXBhcmF0ZShiaWdyYW0sIGMoIndvcmQxIiwgIndvcmQyIiksIHNlcCA9ICIgIikgJT4lDQogIGZpbHRlcighd29yZDEgJWluJSBzdG9wX3dvcmRzJHdvcmQpICU+JQ0KICBmaWx0ZXIoIXdvcmQyICVpbiUgc3RvcF93b3JkcyR3b3JkKSAlPiUNCiAgdW5pdGUoYmlncmFtLCB3b3JkMSwgd29yZDIsIHNlcCA9ICIgIikgJT4lDQogIGNvdW50KGJpZ3JhbSwgc29ydCA9IFQpICU+JQ0KICBmaWx0ZXIobiAgPiAgMSkgJT4lDQogIHdvcmRjbG91ZDIoc2l6ZSA9IC41KQ0KDQpgYGANCg0KSW4gdGhlIHdvcmQgY2xvdWQgYWJvdmUgeW91IGNhbiBzZWUgdGhhdCAicml2ZXIgcm9sbCIgYW5kICJuYSBuYSIgd2VyZSB0aGUgbW9zdCBjb21tb24gdHdvIHdvcmQgY29tYmluYXRpb25zLg0KDQoNCg0KDQpgYGB7cn0NCg0KZmlyc3Rfd29yZCA8LSBjKCJpIiwgInlvdSIpDQoNCg0KanVkZHNfYmlncmFtcyAlPiUNCiAgY291bnQoYmlncmFtLCBzb3J0ID0gVCkgJT4lDQogIHNlcGFyYXRlKGJpZ3JhbSwgYygid29yZDEiLCAid29yZDIiKSwgc2VwID0gIiAiKSAlPiUNCiAgZmlsdGVyKHdvcmQxICVpbiUgZmlyc3Rfd29yZCkgJT4lDQogIGNvdW50KHdvcmQxLCB3b3JkMiwgd3QgPSBuLCBzb3J0ID0gVFJVRSkNCg0KYGBgDQoNCk5leHQgd2Ugd2lsbCBsb29rIGF0IHdoYXQgd29yZHMgZm9sbG93ICJJIiBhbmQgInlvdSIgYXMgd2VsbCBhcyAiaGUiIGFuZCAic2hlIiB0aGUgbW9zdC4gDQoNCg0KYGBge3J9DQoNCg0KZmlyc3Rfd29yZCA8LSBjKCJpIiwgInlvdSIpDQoNCg0KanVkZHNfYmlncmFtcyAlPiUNCiAgY291bnQoYmlncmFtLCBzb3J0ID0gVCkgJT4lDQogIHNlcGFyYXRlKGJpZ3JhbSwgYygid29yZDEiLCAid29yZDIiKSwgc2VwID0gIiAiKSAlPiUNCiAgZmlsdGVyKHdvcmQxICVpbiUgZmlyc3Rfd29yZCkgJT4lDQogIGNvdW50KHdvcmQxLCB3b3JkMiwgd3QgPSBuLCBzb3J0ID0gVFJVRSkgJT4lDQogIG11dGF0ZSh3b3JkMiA9IGZhY3Rvcih3b3JkMiwgbGV2ZWxzID0gcmV2KHVuaXF1ZSh3b3JkMikpKSkgJT4lDQogIGdyb3VwX2J5KHdvcmQxKSAlPiUNCiAgdG9wX24oNSkgJT4lDQogIGdncGxvdChhZXMod29yZDIsIG4sIGZpbGwgPSB3b3JkMSkpICsNCiAgc2NhbGVfZmlsbF92aXJpZGlzX2QoKSArIA0KICBnZW9tX2NvbChzaG93LmxlZ2VuZCA9IEZBTFNFKSArIA0KICBsYWJzKHggPSBOVUxMLCB5ID0gTlVMTCwgdGl0bGUgPSAiV29yZHMgRm9sbG93aW5nOiBJIGFuZCBZb3UiKSArDQogIGZhY2V0X3dyYXAofndvcmQxLCBzY2FsZXMgPSAiZnJlZSIpICsNCiAgY29vcmRfZmxpcCgpICsNCiAgdGhlbWVfbWluaW1hbCgpDQoNCiAgICAgICAgICAgICANCg0KYGBgDQoNClRoZSB0YWJsZSBhYm92ZSBpbmRpY2F0ZXMgIndpc2giIGZvbGxvd2VkICJJIiBtb3JlIGZyZXF1ZW50bHksIGFuZCAidGhhdCIgZm9sbG93ZWQgInlvdSIgbW9zdCBvZnRlbi4gVGhlIHRhYmxlIGJlbG93IGluZGljYXRlcyB0aGF0ICJnYXZlIiBmb2xsb3dlZCAiaGUiIG1vc3Qgb2Z0ZW4gYW5kICJXb3VsZG4ndCIgZm9sbG93ZWQgInNoZSIgbW9yZSBmcmVxdWVudGx5Lg0KDQpUaGUgd29yZCBjb21iaW5hdGlvbnMgbm90aWNlZCBtYWtlcyBzZW5zZSBhcyB0aGV5IGRvIGhhdmUgYSBzb25nIGNhbGxlZCAiUml2ZXIgUm9sbCBvbiIgYW5kICJJIFdpc2ggU2hlIFdvdWxkbid0IFRyZWF0IFlvdSBUaGF0IFdheS4iDQoNCmBgYHtyfQ0KDQoNCmZpcnN0X3dvcmQgPC0gYygiaGUiLCAic2hlIikNCg0KDQpqdWRkc19iaWdyYW1zICU+JQ0KICBjb3VudChiaWdyYW0sIHNvcnQgPSBUKSAlPiUNCiAgc2VwYXJhdGUoYmlncmFtLCBjKCJ3b3JkMSIsICJ3b3JkMiIpLCBzZXAgPSAiICIpICU+JQ0KICBmaWx0ZXIod29yZDEgJWluJSBmaXJzdF93b3JkKSAlPiUNCiAgY291bnQod29yZDEsIHdvcmQyLCB3dCA9IG4sIHNvcnQgPSBUUlVFKSAlPiUNCiAgbXV0YXRlKHdvcmQyID0gZmFjdG9yKHdvcmQyLCBsZXZlbHMgPSByZXYodW5pcXVlKHdvcmQyKSkpKSAlPiUNCiAgZ3JvdXBfYnkod29yZDEpICU+JQ0KICB0b3Bfbig1KSAlPiUNCiAgZ2dwbG90KGFlcyh3b3JkMiwgbiwgZmlsbCA9IHdvcmQxKSkgKw0KICBzY2FsZV9maWxsX3ZpcmlkaXNfZCgpICsgDQogIGdlb21fY29sKHNob3cubGVnZW5kID0gRkFMU0UpICsgDQogIGxhYnMoeCA9IE5VTEwsIHkgPSBOVUxMLCB0aXRsZSA9ICJXb3JkcyBGb2xsb3dpbmc6IEhlIGFuZCBTaGUiKSArDQogIGZhY2V0X3dyYXAofndvcmQxLCBzY2FsZXMgPSAiZnJlZSIpICsNCiAgY29vcmRfZmxpcCgpICsNCiAgdGhlbWVfbWluaW1hbCgpDQpgYGANCg0KDQoNCmBgYHtyfQ0KDQpqdWRkcyAlPiUNCiAgdW5uZXN0X3Rva2Vucyh3b3JkcywgbHlyaWMsIHRva2VuID0gIm5ncmFtcyIsIG4gPSA0KSU+JQ0KICBjb3VudCh3b3Jkcywgc29ydCA9IFQpDQoNCmBgYA0KDQpJbiB0aGUgbGFzdCBhbmFseXNpcywgd2Ugd2lsbCBsb29rIGF0IHdoYXQgZm91ciB3b3JkIGNvbWJpbmF0aW9uIHdhcyB1c2VkIG1vc3Qgb24gdGhlIGFsYnVtLiBBcyB5b3UgY2FuIHNlZSwgIlJvY2tpbiBXaXRoIFRoZSBSaHl0aG0iIHdhcyB1c2VkIHRoZSBtb3N0LiBBZ2FpbiB0aGlzIG1ha2VzIHNlbnNlIGFzICJSb2NraW4gV2l0aCBUaGUgUmh5dGhtIGlzIHRoZSBuYW1lIG9mIGEgc29uZyBhbmQgb25lIG9mIHRoZSBhbGJ1bXMuDQoNCmBgYHtyfQ0KDQpqdWRkcyAlPiUNCiAgdW5uZXN0X3Rva2Vucyh3b3JkcywgbHlyaWMsIHRva2VuID0gIm5ncmFtcyIsIG4gPSA0KSU+JQ0KICBjb3VudCh3b3Jkcywgc29ydCA9IFQpICU+JQ0KICBmaWx0ZXIod29yZHMgPT0gInJvY2tpbiB3aXRoIHRoZSByaHl0aG0iKQ0KDQpgYGANCg0KDQoNCg0K