Kaitlin Kavlie PSYC-541 Lab #4: Rtweet Analysis

The well-known person I chose to analyze on Twitter was Elon Musk, whose Twitter handle is ‘@elonmusk’.

  1. I searched for tweets people have been making about Elon Musk and created a table of the most popular tweets about him.

I used the first code below to create a data set of the top tweets about Elon Musk.

elonmusk <- search_tweets("elon_musk", n = 1000, include_rts = F)

Downloading [=======>---------------------------------]  20%
Downloading [===========>-----------------------------]  30%
Downloading [===============>-------------------------]  40%
Downloading [===================>---------------------]  50%
Downloading [========================>----------------]  60%
Downloading [============================>------------]  70%
Downloading [================================>--------]  80%
Downloading [====================================>----]  90%
Downloading [=========================================] 100%

Then, I used the code below to create a table of the top tweets about Elon.

elonmusk %>% 
  select(text, retweet_count) %>%    
  top_n(25) %>%                       # get the top 25 most popular tweets
  arrange(-retweet_count) %>%         # sort in descending order of popularity
  datatable()
Selecting by retweet_count

The table created above allows you to see the top 28 tweets about Elon Musk, in descending order by number of retweets. The most retweeted was a tweet referring to Elon Musk’s business Tesla.

  1. I created a data set of Elon Musk’s tweets and then created a table of his most used hashtags.

Using the get_timeline code below, I created a data set of Elon Musk’s tweets.

elon_tweets <- get_timeline("elonmusk", n = 5000)

Then I used the glimpse function to preview the dataset.

glimpse(elon_tweets)
Rows: 21
Columns: 90
$ user_id                 <chr> "44196397", "44196397", "44196397", "44196397", "44196397", "44196397", "44196397", "44196397", "44196397", "4419639~
$ status_id               <chr> "1495835133332631563", "1495824937269055495", "1495824820956762113", "1495812910018445315", "1495812568585277441", "~
$ created_at              <dttm> 2022-02-21 18:57:41, 2022-02-21 18:17:10, 2022-02-21 18:16:43, 2022-02-21 17:29:23, 2022-02-21 17:28:01, 2022-02-21~
$ screen_name             <chr> "elonmusk", "elonmusk", "elonmusk", "elonmusk", "elonmusk", "elonmusk", "elonmusk", "elonmusk", "elonmusk", "elonmus~
$ text                    <chr> "@BRO_SPI_Airport @SpacePadreIsle @SpaceX Sounds good, we will send one over", "@martiandoge @SteveofRivia @almenese~
$ source                  <chr> "Twitter for iPhone", "Twitter for iPhone", "Twitter for iPhone", "Twitter for iPhone", "Twitter for iPhone", "Twitt~
$ display_text_width      <dbl> 34, 19, 1, 59, 87, 127, 84, 69, 51, 44, 116, 2, 1, 17, 139, 1, 24, 164, 4, 36, 164
$ reply_to_status_id      <chr> "1495816234948046851", "1495814039339175936", "1495820443344904193", "1495812568585277441", "1495787975774552074", "~
$ reply_to_user_id        <chr> "1311662284469604352", "1357405356100489216", "30699048", "44196397", "1083699592699543552", "1389400996426702848", ~
$ reply_to_screen_name    <chr> "BRO_SPI_Airport", "martiandoge", "BillyM2k", "elonmusk", "SpacePadreIsle", "SteveofRivia", "cgpgrey", "d4t4wr4ngl3r~
$ is_quote                <lgl> FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALS~
$ is_retweet              <lgl> FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE,~
$ favorite_count          <int> 954, 684, 2182, 2440, 5110, 3374, 956, 4704, 1974, 0, 0, 6666, 16071, 5807, 4817, 18923, 22217, 88877, 2346, 13156, ~
$ retweet_count           <int> 88, 50, 132, 153, 313, 318, 81, 215, 167, 3171, 1726, 213, 649, 351, 585, 742, 2838, 11722, 200, 640, 183
$ quote_count             <int> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA
$ reply_count             <int> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA
$ hashtags                <list> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA
$ symbols                 <list> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA
$ urls_url                <list> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, <"spacex.com/launches", "twitter.com/i/broadcasts/1…">, NA, NA, NA, NA, NA, ~
$ urls_t.co               <list> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, <"https://t.co/bJFjLCzWdK", "https://t.co/HIeJL2TVUY">, NA, NA, NA, NA, NA, ~
$ urls_expanded_url       <list> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, <"http://spacex.com/launches", "https://twitter.com/i/broadcasts/1yoJMWDYwek~
$ media_url               <list> NA, NA, NA, NA, NA, NA, NA, NA, NA, "http://pbs.twimg.com/amplify_video_thumb/1495771593695391744/img/PqyZ3IxH9ct6PK~
$ media_t.co              <list> NA, NA, NA, NA, NA, NA, NA, NA, NA, "https://t.co/XIDjbJtDPz", NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA
$ media_expanded_url      <list> NA, NA, NA, NA, NA, NA, NA, NA, NA, "https://twitter.com/SpaceX/status/1495771647680212996/video/1", NA, NA, NA, NA~
$ media_type              <list> NA, NA, NA, NA, NA, NA, NA, NA, NA, "photo", NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA
$ ext_media_url           <list> NA, NA, NA, NA, NA, NA, NA, NA, NA, "http://pbs.twimg.com/amplify_video_thumb/1495771593695391744/img/PqyZ3IxH9ct6P~
$ ext_media_t.co          <list> NA, NA, NA, NA, NA, NA, NA, NA, NA, "https://t.co/XIDjbJtDPz", NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA
$ ext_media_expanded_url  <list> NA, NA, NA, NA, NA, NA, NA, NA, NA, "https://twitter.com/SpaceX/status/1495771647680212996/video/1", NA, NA, NA, NA~
$ ext_media_type          <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA
$ mentions_user_id        <list> <"1311662284469604352", "1083699592699543552", "34743251">, <"1357405356100489216", "1389400996426702848", "5648639~
$ mentions_screen_name    <list> <"BRO_SPI_Airport", "SpacePadreIsle", "SpaceX">, <"martiandoge", "SteveofRivia", "almeneses1", "SawyerMerritt">, <"~
$ lang                    <chr> "en", "en", "und", "en", "en", "en", "en", "en", "en", "en", "en", "und", "und", "en", "en", "und", "fr", "en", "en~
$ quoted_status_id        <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA
$ quoted_text             <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA
$ quoted_created_at       <dttm> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA
$ quoted_source           <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA
$ quoted_favorite_count   <int> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA
$ quoted_retweet_count    <int> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA
$ quoted_user_id          <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA
$ quoted_screen_name      <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA
$ quoted_name             <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA
$ quoted_followers_count  <int> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA
$ quoted_friends_count    <int> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA
$ quoted_statuses_count   <int> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA
$ quoted_location         <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA
$ quoted_description      <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA
$ quoted_verified         <lgl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA
$ retweet_status_id       <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, "1495771647680212996", "1495767751222181888", NA, NA, NA, NA, NA, NA, NA, NA, N~
$ retweet_text            <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, "Liftoff! https://t.co/XIDjbJtDPz", "Watch Falcon 9 launch 46 Starlink satellit~
$ retweet_created_at      <dttm> NA, NA, NA, NA, NA, NA, NA, NA, NA, 2022-02-21 14:45:25, 2022-02-21 14:29:56, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA
$ retweet_source          <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, "Twitter Media Studio - LiveCut", "Twitter Media Studio", NA, NA, NA, NA, NA, N~
$ retweet_favorite_count  <int> NA, NA, NA, NA, NA, NA, NA, NA, NA, 25136, 10718, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA
$ retweet_retweet_count   <int> NA, NA, NA, NA, NA, NA, NA, NA, NA, 3171, 1726, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA
$ retweet_user_id         <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, "34743251", "34743251", NA, NA, NA, NA, NA, NA, NA, NA, NA, NA
$ retweet_screen_name     <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, "SpaceX", "SpaceX", NA, NA, NA, NA, NA, NA, NA, NA, NA, NA
$ retweet_name            <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, "SpaceX", "SpaceX", NA, NA, NA, NA, NA, NA, NA, NA, NA, NA
$ retweet_followers_count <int> NA, NA, NA, NA, NA, NA, NA, NA, NA, 20246925, 20246925, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA
$ retweet_friends_count   <int> NA, NA, NA, NA, NA, NA, NA, NA, NA, 100, 100, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA
$ retweet_statuses_count  <int> NA, NA, NA, NA, NA, NA, NA, NA, NA, 5721, 5721, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA
$ retweet_location        <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, "Hawthorne, CA", "Hawthorne, CA", NA, NA, NA, NA, NA, NA, NA, NA, NA, NA
$ retweet_description     <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, "SpaceX designs, manufactures and launches the world’s most advanced rockets an~
$ retweet_verified        <lgl> NA, NA, NA, NA, NA, NA, NA, NA, NA, TRUE, TRUE, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA
$ place_url               <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA
$ place_name              <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA
$ place_full_name         <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA
$ place_type              <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA
$ country                 <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA
$ country_code            <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA
$ geo_coords              <list> <NA, NA>, <NA, NA>, <NA, NA>, <NA, NA>, <NA, NA>, <NA, NA>, <NA, NA>, <NA, NA>, <NA, NA>, <NA, NA>, <NA, NA>, <NA, ~
$ coords_coords           <list> <NA, NA>, <NA, NA>, <NA, NA>, <NA, NA>, <NA, NA>, <NA, NA>, <NA, NA>, <NA, NA>, <NA, NA>, <NA, NA>, <NA, NA>, <NA, ~
$ bbox_coords             <list> <NA, NA, NA, NA, NA, NA, NA, NA>, <NA, NA, NA, NA, NA, NA, NA, NA>, <NA, NA, NA, NA, NA, NA, NA, NA>, <NA, NA, NA, N~
$ status_url              <chr> "https://twitter.com/elonmusk/status/1495835133332631563", "https://twitter.com/elonmusk/status/1495824937269055495~
$ name                    <chr> "Elon Musk", "Elon Musk", "Elon Musk", "Elon Musk", "Elon Musk", "Elon Musk", "Elon Musk", "Elon Musk", "Elon Musk"~
$ location                <chr> "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", ""
$ description             <chr> "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", ""
$ url                     <lgl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA
$ protected               <lgl> FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALS~
$ followers_count         <int> 74490914, 74490914, 74490914, 74490914, 74490914, 74490914, 74490914, 74490914, 74490914, 74490914, 74490914, 744909~
$ friends_count           <int> 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109
$ listed_count            <int> 86579, 86579, 86579, 86579, 86579, 86579, 86579, 86579, 86579, 86579, 86579, 86579, 86579, 86579, 86579, 86579, 8657~
$ statuses_count          <int> 16932, 16932, 16932, 16932, 16932, 16932, 16932, 16932, 16932, 16932, 16932, 16932, 16932, 16932, 16932, 16932, 169~
$ favourites_count        <int> 12177, 12177, 12177, 12177, 12177, 12177, 12177, 12177, 12177, 12177, 12177, 12177, 12177, 12177, 12177, 12177, 1217~
$ account_created_at      <dttm> 2009-06-02 20:12:29, 2009-06-02 20:12:29, 2009-06-02 20:12:29, 2009-06-02 20:12:29, 2009-06-02 20:12:29, 2009-06-02 ~
$ verified                <lgl> TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TR~
$ profile_url             <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA
$ profile_expanded_url    <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA
$ account_lang            <lgl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA
$ profile_banner_url      <chr> "https://pbs.twimg.com/profile_banners/44196397/1576183471", "https://pbs.twimg.com/profile_banners/44196397/1576183~
$ profile_background_url  <chr> "http://abs.twimg.com/images/themes/theme1/bg.png", "http://abs.twimg.com/images/themes/theme1/bg.png", "http://abs.~
$ profile_image_url       <chr> "http://pbs.twimg.com/profile_images/1489375145684873217/3VYnFrzx_normal.jpg", "http://pbs.twimg.com/profile_images/~

Lastly, I used the code below to create a data table of Elon’s most used hashtags.

elon_tweets %>%
  select(hashtags) %>%                   # Focus on the hashtags
  unnest(cols = c(hashtags)) %>%                           # Separate multiple hashtags
  mutate(hashtags = tolower(hashtags)) %>%      # make all hashtags lowercase
  count(hashtags, sort=TRUE) %>%
  datatable()

The table above shows Elon Musk’s most used hastag, as I found that he only has one.

  1. I made a table of Elon’s number of tweets per day, as well as one for his average number of tweets per day.

Using the below I created a table of dates and corresponding number of times Elon tweeted that particular date.

elon_tweets %>% 
  group_by(day = date(created_at)) %>%    # extract the date, group by it
  summarize(tweets_per_day = n())         # count the number of tweets each day

Then I used the code shown below to find the average number of times Elon tweets a day.

elon_tweets %>%
  group_by(day = date(created_at)) %>%
  summarize(tweets_per_day = n()) %>%
  summarize(mean(tweets_per_day))

On average, Elon tweets 8 times a day.

  1. I created a plotly graph of the number of Elon’s tweets per day using the code directly below.
elon_tweets %>% 
  mutate(day = date(created_at)) %>%
  plot_ly(x = ~day) %>%                                        
  add_histogram() %>%
  layout(title = "Number of tweets from @elonmusk")
NA

The plotly histogram above shows that Elon tweeted the most between January 26th to 28th , and tweeted the least January 8th through 10th.

  1. I created a table, as well as a plotly histogram, of Elon Musk’s tweets in relation to each hour of the day.

I incorporated the time zone factor using the tz code below.

tz(elon_tweets$created_at)
[1] "UTC"

Then the code below was used to set the time zone to Los Angeles and create a table listing his number of tweets for each hour of the day.

elon_tweets %>% 
  mutate(time = with_tz(created_at, "America/Los_Angeles")) %>% 
  mutate(time = hour(time)) %>% 
  count(time) %>% 
  datatable(options = (list(pageLength = 24)), rownames = F)
NA

Then I used this code to create a plotly histogram of number of tweets coordinated to each hour of the day.

elon_tweets %>% 
  mutate(time = with_tz(created_at, "America/Los_Angeles")) %>%    # convert to Los Angeles time zone
  mutate(time = hour(time)) %>%                                 # extract the hour
  plot_ly(x = ~time) %>%                                        # create plotly graph
  add_histogram() %>%
  layout(title = "When Does @elonmusk Tweet?", 
         xaxis = list(title = "Time of Day (0 = midnight)"),
         yaxis = list(title = "Number of Tweets"))
NA

The plotly histogram and the table displaying the number of tweets coordinated with the time of day shows Elon tweets least frequently at 5 AM and most frequently around 12 to 1 PM and 2 to 3 PM.

  1. I created a table and a plotly histogram of the days of the week that Elon tweets.

Using this code I created a table for the weekdays and number of tweets made on each of the days.

elon_tweets %>% 
  mutate(Day = wday(created_at,           
                    label = T)) %>%       
  count(Day) %>%                          
  datatable(rownames = F)
NA

Then I created a plotly histogram of the number of tweets for each day of the week by using the code shown below.

elon_tweets %>% 
  mutate(Day = wday(created_at,           
                    label = T)) %>%       
  plot_ly(x = ~Day) %>%                                        
  add_histogram() %>%
  layout(title = "When Does @elonmusk Tweet?", 
         xaxis = list(title = "Days of the Week"),
         yaxis = list(title = "Number of Tweets"))
NA

The data table and plotly histogram displayed above show that Elon tweets fairly consistently throughout the week. He tweets the most on Thursdays with 77 tweets for that weekday, and he tweets the least on Saturdays with 44 tweets that day.

  1. Using the code shown below I created a plotly heatmap of the weekdays and times of day that Elon Musk tweets.
elon_tweets %>% 
  mutate(day = wday(created_at, label = T)) %>% 
  mutate(hour = hour(with_tz(created_at, "America/Los_Angeles"))) %>% 
  plot_ly(x = ~day, y = ~hour) %>% 
  add_histogram2d(nbinsx = 7, nbinsy = 24) %>%
  layout(title = "When Does @elonmusk Tweet?", 
         xaxis = list(title = "Days of the Week"),
         yaxis = list(title = "Hour of the day (0 = midnight)"))
NA

The plotly heatmap displayed above shows that the day and time Elon Musk has most frequently tweets at are Mondays at 3 PM. His second and third most popular day and times to tweet are Thursdays at 10 AM and 1 PM.

LS0tDQp0aXRsZTogIlIgTm90ZWJvb2siDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KS2FpdGxpbiBLYXZsaWUgUFNZQy01NDENCkxhYiAjNDogUnR3ZWV0IEFuYWx5c2lzDQoNCg0KDQpUaGUgd2VsbC1rbm93biBwZXJzb24gSSBjaG9zZSB0byBhbmFseXplIG9uIFR3aXR0ZXIgd2FzIEVsb24gTXVzaywgd2hvc2UgVHdpdHRlciBoYW5kbGUgaXMgJ0BlbG9ubXVzaycuDQoNCg0KMS4gSSBzZWFyY2hlZCBmb3IgdHdlZXRzIHBlb3BsZSBoYXZlIGJlZW4gbWFraW5nIGFib3V0IEVsb24gTXVzayBhbmQgY3JlYXRlZCBhIHRhYmxlIG9mIHRoZSBtb3N0IHBvcHVsYXIgdHdlZXRzIGFib3V0IGhpbS4NCg0KDQoNCkkgdXNlZCB0aGUgZmlyc3QgY29kZSBiZWxvdyB0byBjcmVhdGUgYSBkYXRhIHNldCBvZiB0aGUgdG9wIHR3ZWV0cyBhYm91dCBFbG9uIE11c2suDQoNCmBgYHtyfQ0KZWxvbm11c2sgPC0gc2VhcmNoX3R3ZWV0cygiZWxvbl9tdXNrIiwgbiA9IDEwMDAsIGluY2x1ZGVfcnRzID0gRikNCmBgYA0KDQpUaGVuLCBJIHVzZWQgdGhlIGNvZGUgYmVsb3cgdG8gY3JlYXRlIGEgdGFibGUgb2YgdGhlIHRvcCB0d2VldHMgYWJvdXQgRWxvbi4NCg0KDQpgYGB7cn0NCmVsb25tdXNrICU+JSANCiAgc2VsZWN0KHRleHQsIHJldHdlZXRfY291bnQpICU+JSAgICANCiAgdG9wX24oMjUpICU+JSAgICAgICAgICAgICAgICAgICAgICAgDQogIGFycmFuZ2UoLXJldHdlZXRfY291bnQpICU+JSAgICAgICAgIA0KICBkYXRhdGFibGUoKQ0KYGBgDQoNClRoZSB0YWJsZSBjcmVhdGVkIGFib3ZlIGFsbG93cyB5b3UgdG8gc2VlIHRoZSB0b3AgMjggdHdlZXRzIGFib3V0IEVsb24gTXVzaywgaW4gZGVzY2VuZGluZyBvcmRlciBieSBudW1iZXIgb2YgcmV0d2VldHMuIFRoZSBtb3N0IHJldHdlZXRlZCB3YXMgYSB0d2VldCByZWZlcnJpbmcgdG8gRWxvbiBNdXNrJ3MgYnVzaW5lc3MgVGVzbGEuDQoNCg0KDQoyLiBJIGNyZWF0ZWQgYSBkYXRhIHNldCBvZiBFbG9uIE11c2sncyB0d2VldHMgYW5kIHRoZW4gY3JlYXRlZCBhIHRhYmxlIG9mIGhpcyBtb3N0IHVzZWQgaGFzaHRhZ3MuIA0KDQoNCg0KVXNpbmcgdGhlIGdldF90aW1lbGluZSBjb2RlIGJlbG93LCBJIGNyZWF0ZWQgYSBkYXRhIHNldCBvZiBFbG9uIE11c2sncyB0d2VldHMuDQoNCmBgYHtyfQ0KZWxvbl90d2VldHMgPC0gZ2V0X3RpbWVsaW5lKCJlbG9ubXVzayIsIG4gPSA1MDAwKQ0KYGBgDQoNCg0KVGhlbiBJIHVzZWQgdGhlIGdsaW1wc2UgZnVuY3Rpb24gdG8gcHJldmlldyB0aGUgZGF0YXNldC4NCmBgYHtyfQ0KZ2xpbXBzZShlbG9uX3R3ZWV0cykNCmBgYA0KDQoNCkxhc3RseSwgSSB1c2VkIHRoZSBjb2RlIGJlbG93IHRvIGNyZWF0ZSBhIGRhdGEgdGFibGUgb2YgRWxvbidzIG1vc3QgdXNlZCBoYXNodGFncy4gDQoNCg0KYGBge3J9DQplbG9uX3R3ZWV0cyAlPiUNCiAgc2VsZWN0KGhhc2h0YWdzKSAlPiUgICAgICAgICAgICAgICAgICAgDQogIHVubmVzdChjb2xzID0gYyhoYXNodGFncykpICU+JSAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICBtdXRhdGUoaGFzaHRhZ3MgPSB0b2xvd2VyKGhhc2h0YWdzKSkgJT4lICAgICAgDQogIGNvdW50KGhhc2h0YWdzLCBzb3J0PVRSVUUpICU+JQ0KICBkYXRhdGFibGUoKQ0KYGBgDQoNClRoZSB0YWJsZSBhYm92ZSBzaG93cyBFbG9uIE11c2sncyBtb3N0IHVzZWQgaGFzdGFnLCBhcyBJIGZvdW5kIHRoYXQgaGUgb25seSBoYXMgb25lLiANCg0KDQoNCg0KMy4gSSBtYWRlIGEgdGFibGUgb2YgRWxvbidzIG51bWJlciBvZiB0d2VldHMgcGVyIGRheSwgYXMgd2VsbCBhcyBvbmUgZm9yIGhpcyBhdmVyYWdlIG51bWJlciBvZiB0d2VldHMgcGVyIGRheS4NCg0KDQpVc2luZyB0aGUgYmVsb3cgSSBjcmVhdGVkIGEgdGFibGUgb2YgZGF0ZXMgYW5kIGNvcnJlc3BvbmRpbmcgbnVtYmVyIG9mIHRpbWVzIEVsb24gdHdlZXRlZCB0aGF0IHBhcnRpY3VsYXIgZGF0ZS4NCg0KYGBge3J9DQplbG9uX3R3ZWV0cyAlPiUgDQogIGdyb3VwX2J5KGRheSA9IGRhdGUoY3JlYXRlZF9hdCkpICU+JSAgICANCiAgc3VtbWFyaXplKHR3ZWV0c19wZXJfZGF5ID0gbigpKSAgICAgICAgDQpgYGANCg0KVGhlbiBJIHVzZWQgdGhlIGNvZGUgc2hvd24gYmVsb3cgdG8gZmluZCB0aGUgYXZlcmFnZSBudW1iZXIgb2YgdGltZXMgRWxvbiB0d2VldHMgYSBkYXkuDQoNCg0KYGBge3J9DQplbG9uX3R3ZWV0cyAlPiUNCiAgZ3JvdXBfYnkoZGF5ID0gZGF0ZShjcmVhdGVkX2F0KSkgJT4lDQogIHN1bW1hcml6ZSh0d2VldHNfcGVyX2RheSA9IG4oKSkgJT4lDQogIHN1bW1hcml6ZShtZWFuKHR3ZWV0c19wZXJfZGF5KSkNCmBgYA0KDQpPbiBhdmVyYWdlLCBFbG9uIHR3ZWV0cyA4IHRpbWVzIGEgZGF5LiANCg0KDQoNCg0KNC4gSSBjcmVhdGVkIGEgcGxvdGx5IGdyYXBoIG9mIHRoZSBudW1iZXIgb2YgRWxvbidzIHR3ZWV0cyBwZXIgZGF5IHVzaW5nIHRoZSBjb2RlIGRpcmVjdGx5IGJlbG93LiANCg0KYGBge3J9DQplbG9uX3R3ZWV0cyAlPiUgDQogIG11dGF0ZShkYXkgPSBkYXRlKGNyZWF0ZWRfYXQpKSAlPiUNCiAgcGxvdF9seSh4ID0gfmRheSkgJT4lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICBhZGRfaGlzdG9ncmFtKCkgJT4lDQogIGxheW91dCh0aXRsZSA9ICJOdW1iZXIgb2YgdHdlZXRzIGZyb20gQGVsb25tdXNrIikNCiAgDQpgYGANCg0KDQpUaGUgcGxvdGx5IGhpc3RvZ3JhbSBhYm92ZSBzaG93cyB0aGF0IEVsb24gdHdlZXRlZCB0aGUgbW9zdCBiZXR3ZWVuIEphbnVhcnkgMjZ0aCB0byAyOHRoICwgYW5kIHR3ZWV0ZWQgdGhlIGxlYXN0IEphbnVhcnkgOHRoIHRocm91Z2ggMTB0aC4NCg0KDQoNCjUuIEkgY3JlYXRlZCBhIHRhYmxlLCBhcyB3ZWxsIGFzIGEgcGxvdGx5IGhpc3RvZ3JhbSwgb2YgRWxvbiBNdXNrJ3MgdHdlZXRzIGluIHJlbGF0aW9uIHRvIGVhY2ggaG91ciBvZiB0aGUgZGF5LiAgDQoNCg0KSSBpbmNvcnBvcmF0ZWQgdGhlIHRpbWUgem9uZSBmYWN0b3IgdXNpbmcgdGhlIHR6IGNvZGUgYmVsb3cuDQoNCmBgYHtyfQ0KdHooZWxvbl90d2VldHMkY3JlYXRlZF9hdCkNCg0KYGBgDQoNClRoZW4gdGhlIGNvZGUgYmVsb3cgd2FzIHVzZWQgdG8gc2V0IHRoZSB0aW1lIHpvbmUgdG8gTG9zIEFuZ2VsZXMgYW5kIGNyZWF0ZSBhIHRhYmxlIGxpc3RpbmcgaGlzIG51bWJlciBvZiB0d2VldHMgZm9yIGVhY2ggaG91ciBvZiB0aGUgZGF5LiANCg0KYGBge3J9DQplbG9uX3R3ZWV0cyAlPiUgDQogIG11dGF0ZSh0aW1lID0gd2l0aF90eihjcmVhdGVkX2F0LCAiQW1lcmljYS9Mb3NfQW5nZWxlcyIpKSAlPiUgDQogIG11dGF0ZSh0aW1lID0gaG91cih0aW1lKSkgJT4lIA0KICBjb3VudCh0aW1lKSAlPiUgDQogIGRhdGF0YWJsZShvcHRpb25zID0gKGxpc3QocGFnZUxlbmd0aCA9IDI0KSksIHJvd25hbWVzID0gRikNCg0KYGBgDQoNClRoZW4gSSB1c2VkIHRoaXMgY29kZSB0byBjcmVhdGUgYSBwbG90bHkgaGlzdG9ncmFtIG9mIG51bWJlciBvZiB0d2VldHMgY29vcmRpbmF0ZWQgdG8gZWFjaCBob3VyIG9mIHRoZSBkYXkuDQoNCmBgYHtyfQ0KZWxvbl90d2VldHMgJT4lIA0KICBtdXRhdGUodGltZSA9IHdpdGhfdHooY3JlYXRlZF9hdCwgIkFtZXJpY2EvTG9zX0FuZ2VsZXMiKSkgJT4lICAgICMgY29udmVydCB0byBMb3MgQW5nZWxlcyB0aW1lIHpvbmUNCiAgbXV0YXRlKHRpbWUgPSBob3VyKHRpbWUpKSAlPiUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGV4dHJhY3QgdGhlIGhvdXINCiAgcGxvdF9seSh4ID0gfnRpbWUpICU+JSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGNyZWF0ZSBwbG90bHkgZ3JhcGgNCiAgYWRkX2hpc3RvZ3JhbSgpICU+JQ0KICBsYXlvdXQodGl0bGUgPSAiV2hlbiBEb2VzIEBlbG9ubXVzayBUd2VldD8iLCANCiAgICAgICAgIHhheGlzID0gbGlzdCh0aXRsZSA9ICJUaW1lIG9mIERheSAoMCA9IG1pZG5pZ2h0KSIpLA0KICAgICAgICAgeWF4aXMgPSBsaXN0KHRpdGxlID0gIk51bWJlciBvZiBUd2VldHMiKSkNCg0KYGBgDQoNClRoZSBwbG90bHkgaGlzdG9ncmFtIGFuZCB0aGUgdGFibGUgZGlzcGxheWluZyB0aGUgbnVtYmVyIG9mIHR3ZWV0cyBjb29yZGluYXRlZCB3aXRoIHRoZSB0aW1lIG9mIGRheSBzaG93cyBFbG9uIHR3ZWV0cyBsZWFzdCBmcmVxdWVudGx5IGF0IDUgQU0gYW5kIG1vc3QgZnJlcXVlbnRseSBhcm91bmQgMTIgdG8gMSBQTSBhbmQgMiB0byAzIFBNLg0KDQoNCg0KDQo2LiBJIGNyZWF0ZWQgYSB0YWJsZSBhbmQgYSBwbG90bHkgaGlzdG9ncmFtIG9mIHRoZSBkYXlzIG9mIHRoZSB3ZWVrIHRoYXQgRWxvbiB0d2VldHMuICANCg0KDQpVc2luZyB0aGlzIGNvZGUgSSBjcmVhdGVkIGEgdGFibGUgZm9yIHRoZSB3ZWVrZGF5cyBhbmQgbnVtYmVyIG9mIHR3ZWV0cyBtYWRlIG9uIGVhY2ggb2YgdGhlIGRheXMuDQoNCmBgYHtyfQ0KZWxvbl90d2VldHMgJT4lIA0KICBtdXRhdGUoRGF5ID0gd2RheShjcmVhdGVkX2F0LCAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgIGxhYmVsID0gVCkpICU+JSAgICAgICANCiAgY291bnQoRGF5KSAlPiUgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICBkYXRhdGFibGUocm93bmFtZXMgPSBGKQ0KDQpgYGANCg0KVGhlbiBJIGNyZWF0ZWQgYSBwbG90bHkgaGlzdG9ncmFtIG9mIHRoZSBudW1iZXIgb2YgdHdlZXRzIGZvciBlYWNoIGRheSBvZiB0aGUgd2VlayBieSB1c2luZyB0aGUgY29kZSBzaG93biBiZWxvdy4NCg0KYGBge3J9DQplbG9uX3R3ZWV0cyAlPiUgDQogIG11dGF0ZShEYXkgPSB3ZGF5KGNyZWF0ZWRfYXQsICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgbGFiZWwgPSBUKSkgJT4lICAgICAgIA0KICBwbG90X2x5KHggPSB+RGF5KSAlPiUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogIGFkZF9oaXN0b2dyYW0oKSAlPiUNCiAgbGF5b3V0KHRpdGxlID0gIldoZW4gRG9lcyBAZWxvbm11c2sgVHdlZXQ/IiwgDQogICAgICAgICB4YXhpcyA9IGxpc3QodGl0bGUgPSAiRGF5cyBvZiB0aGUgV2VlayIpLA0KICAgICAgICAgeWF4aXMgPSBsaXN0KHRpdGxlID0gIk51bWJlciBvZiBUd2VldHMiKSkNCg0KYGBgDQoNClRoZSBkYXRhIHRhYmxlIGFuZCBwbG90bHkgaGlzdG9ncmFtIGRpc3BsYXllZCBhYm92ZSBzaG93IHRoYXQgRWxvbiB0d2VldHMgZmFpcmx5IGNvbnNpc3RlbnRseSB0aHJvdWdob3V0IHRoZSB3ZWVrLiBIZSB0d2VldHMgdGhlIG1vc3Qgb24gVGh1cnNkYXlzIHdpdGggNzcgdHdlZXRzIGZvciB0aGF0IHdlZWtkYXksIGFuZCBoZSB0d2VldHMgdGhlIGxlYXN0IG9uIFNhdHVyZGF5cyB3aXRoIDQ0IHR3ZWV0cyB0aGF0IGRheS4NCg0KDQoNCjcuIFVzaW5nIHRoZSBjb2RlIHNob3duIGJlbG93IEkgY3JlYXRlZCBhIHBsb3RseSBoZWF0bWFwIG9mIHRoZSB3ZWVrZGF5cyBhbmQgdGltZXMgb2YgZGF5IHRoYXQgRWxvbiBNdXNrIHR3ZWV0cy4gIA0KDQpgYGB7cn0NCmVsb25fdHdlZXRzICU+JSANCiAgbXV0YXRlKGRheSA9IHdkYXkoY3JlYXRlZF9hdCwgbGFiZWwgPSBUKSkgJT4lIA0KICBtdXRhdGUoaG91ciA9IGhvdXIod2l0aF90eihjcmVhdGVkX2F0LCAiQW1lcmljYS9Mb3NfQW5nZWxlcyIpKSkgJT4lIA0KICBwbG90X2x5KHggPSB+ZGF5LCB5ID0gfmhvdXIpICU+JSANCiAgYWRkX2hpc3RvZ3JhbTJkKG5iaW5zeCA9IDcsIG5iaW5zeSA9IDI0KSAlPiUNCiAgbGF5b3V0KHRpdGxlID0gIldoZW4gRG9lcyBAZWxvbm11c2sgVHdlZXQ/IiwgDQogICAgICAgICB4YXhpcyA9IGxpc3QodGl0bGUgPSAiRGF5cyBvZiB0aGUgV2VlayIpLA0KICAgICAgICAgeWF4aXMgPSBsaXN0KHRpdGxlID0gIkhvdXIgb2YgdGhlIGRheSAoMCA9IG1pZG5pZ2h0KSIpKQ0KDQpgYGANCg0KDQpUaGUgcGxvdGx5IGhlYXRtYXAgZGlzcGxheWVkIGFib3ZlIHNob3dzIHRoYXQgdGhlIGRheSBhbmQgdGltZSBFbG9uIE11c2sgaGFzIG1vc3QgZnJlcXVlbnRseSB0d2VldHMgYXQgYXJlIE1vbmRheXMgYXQgMyBQTS4gSGlzIHNlY29uZCBhbmQgdGhpcmQgbW9zdCBwb3B1bGFyIGRheSBhbmQgdGltZXMgdG8gdHdlZXQgYXJlIFRodXJzZGF5cyBhdCAxMCBBTSBhbmQgMSBQTS4NCg0KDQoNCg0K