library(tidyverse)
library(tidyquant)
library(modelr)
library(gridExtra)
library(grid)
library(readr)

On May 17, 2017, the Washington Post broke a story about a recorded conversation between some members of Congress where one of the participants says he thinks Vladimir Putin pays another member of Congress and the Republican Presidential Candidate. I became curious about the this and wanted to investigate the travel habits of Congressional members.

This data comes from Data for Democracy/ProPublica and it represents the travel records of government officials from 1995-2017.

travels <- read_csv("https://query.data.world/s/7ezifc8eqig9vdazaoa1noecv",
                   col_types = cols(
                      name = col_character(),
                      honorific = col_character(),
                      Description = col_character(),
                      Quantity = col_integer(),
                      arrival_date = col_date(format = "%m/%d/%Y"),
                      departure_date = col_date(format = "%m/%d/%Y"),
                      country = col_character(),
                      table_header = col_character(), 
                      source_file = col_character(), 
                      ArrivalYear = col_integer())) %>%
  mutate(year = format(arrival_date, "%Y"))
The following named parsers don't match the column names: Description, Quantity, ArrivalYear956 parsing failures.
 row            col           expected     actual                                                   file
 986 arrival_date   date like %m/%d/%Y 1//1998    'https://query.data.world/s/7ezifc8eqig9vdazaoa1noecv'
 986 departure_date date like %m/%d/%Y 1//1998    'https://query.data.world/s/7ezifc8eqig9vdazaoa1noecv'
1409 arrival_date   valid date         2/29/2007  'https://query.data.world/s/7ezifc8eqig9vdazaoa1noecv'
1443 departure_date valid date         13/13/2006 'https://query.data.world/s/7ezifc8eqig9vdazaoa1noecv'
1646 departure_date date like %m/%d/%Y 1/5//1999  'https://query.data.world/s/7ezifc8eqig9vdazaoa1noecv'
.... .............. .................. .......... ......................................................
See problems(...) for more details.
head(travels)
dim(travels)
[1] 48237     8

How many travellers are represented?

nrow(travels %>% group_by(name) %>% summarise(GovernmentOfficials = n()) %>% na.omit())
[1] 5346

Who travelled to Russia most often?

travels %>% filter(grepl("Russia",country)) %>% group_by(name) %>% summarise(visitsToRussia = n()) %>% arrange(desc(visitsToRussia)) %>% top_n(6)
Selecting by visitsToRussia

I narrowed down the data set to those who have made more than 4 trips to Russia during their tenure.

myVectorOfStrings <- c("Rohr", "Curt Weldon", "Charles Taylor", "Sloat", "Paul Berkowitz", "Mark Gage", "Robert King" )
matchExpression <- paste(myVectorOfStrings, collapse = "|")
# [1] "foo|bar"

The table below shows of often each of the select Officials has travelled to each country represented.

travels %>% filter(grepl(matchExpression, name)) %>% group_by(name, country) %>% summarise(n = n()) %>% arrange(country) %>% top_n(10)
Selecting by n
NN <- travels %>% filter(grepl(matchExpression, name)) %>% select(name, country, year) %>% arrange(name)%>% na.omit()

The proportion of each officials’ travels to Russia in relation to all travels.

NN$namesVector <- rep(c("Amanda Sloat", "Curt Weldon","Dana Rohrabacher", "Amanda Sloat","Robert King", "Charles Taylor", "Curt Weldon", "Dana Rohrabacher", "Mark Gage", "Robert King", "Dana Rohrabacher", "Mark Gage", "Paul Berkowitz","Robert King","Dana Rohrabacher"), times = c(43,1,4,9,1, 27,88,174,1,2, 4,49, 160, 87,1))
x <- NN %>% filter(country == "Russia") %>% na.omit() %>% group_by(namesVector) %>% summarise(n = n())
ggplot(NN, aes(x = namesVector)) + geom_bar(fill = "blue", alpha = 0.5) + theme(axis.text.x = element_text(angle = 45, vjust = 1, hjust = 1)) + 
  geom_boxplot(data = x, aes(x = namesVector, y = n, fatten = 4)) + labs(title = "All Trips", subtitle = " Black line demarcates the number of trips to Russia") +
  labs(x="Government Official",y="Total Number of Trips")

head(NN)
NN %>% 
  ggplot(aes(x = year, fill = country)) + 
  geom_bar(position = "fill") + 
  #scale_y_continuous(limits=c(0,30)) + 
  facet_grid(namesVector ~ .,scales = "free_y")  + 
  scale_fill_manual(values=c('burlywood4',
'cadetblue',
'cadetblue1',
'cadetblue2',
'cadetblue4',
'chartreuse',
'chartreuse1',
'chartreuse2',
'chartreuse3',
'chartreuse4',
'chocolate',
'chocolate1',
'chocolate3',
'chocolate4',
'coral',
'coral1',
'coral2',
'coral3',
'coral4',
'cornflowerblue',
'cornsilk',
'cornsilk1',
'cornsilk2',
'cornsilk3',
'cornsilk4',
'cyan',
'cyan1',
'cyan2',
'cyan3',
'cyan4',
'darkblue',
'darkcyan',
'darkgoldenrod',
'darkgoldenrod1',
'darkgoldenrod3',
'darkgoldenrod4',
'darkgray',
'aliceblue',
'antiquewhite',
'antiquewhite1',
'antiquewhite2',
'antiquewhite3',
'antiquewhite4',
'aquamarine',
'aquamarine1',
'aquamarine2',
'aquamarine3',
'aquamarine4',
'azure',
'azure1',
'azure2',
'azure3',
'azure4',
'beige',
'bisque',
'bisque1',
'bisque2',
'bisque3',
'bisque4',
'blanchedalmond',
'blue',
'blue1',
'blue2',
'blue3',
'blue4',
'blueviolet',
'brown',
'brown1',
'brown2',
'brown3',
'brown4',
'burlywood',
'burlywood1',
'burlywood2',
'burlywood3',
'darkgreen',
'darkgrey',
'darkkhaki',
'darkmagenta',
'darkolivegreen',
'darkolivegreen1',
'darkolivegreen2',
'darkolivegreen3',
'darkolivegreen4',
'darkorange',
'darkorange1',
'darkorange2',
'darkorange3',
'darkorange4',
'darkorchid',
'darkorchid1',
'darkorchid2',
'darkorchid3',
'black',
'darkorchid4',
'darkred',
'darksalmon',
'darkseagreen',
'darkseagreen1',
'darkseagreen2',
'darkseagreen3',
'darkseagreen4',
'darkslateblue',
'darkslategray',
'darkslategray1',
'darkslategray2',
'darkslategray3',
'darkslategray4',
'darkslategrey',
'darkturquoise',
'darkviolet',
'deeppink',
'deeppink1',
'deeppink2',
'deeppink3',
'deeppink4',
'lightblue4',
'lightcoral',
'lightcyan',
'lightcyan1',
'lightcyan2',
'lightcyan3',
'lightcyan4',
'lightgoldenrod')) + 
  theme_tq() + 
  guides(color = F) + 
  labs(title = "How much of the Official's travel is to Russia", x = "")  + 
  labs(title = "", subtitle = "Civil Servants Travel from 1995-2016Trips to \n Russia are in black",y = "Number of Trips")  + theme(axis.text.x = element_text(angle = 45, vjust = 1, hjust = 1)) 

Taylor

BerkowitzRussia <- travels %>%  filter(grepl("Berkowitz",name)) %>% filter(grepl("Russia", country)) %>% arrange(desc(departure_date))
BerkowitzN <- travels %>%  filter(grepl("Berkowitz",name)) %>% filter(grepl("Nether", country)) %>% arrange(desc(departure_date))
dim(BerkowitzN)
MostRussia <- rbind.data.frame(WeldonRussia, RohrabacherRussia, TaylorRussia, GageRussia, KingRussia, SloatRussia, BerkowitzRussia)
dim(MostRussia)

MostRussia$namesVector <- rep(c("Curt Weldon", "Dana Rohrabacher","Charles Taylor","Mark Gage","Robert King","Amanda Sloat","Paul Berkowitz"), times = c(22,12,11,8,6,5,5))
MostRussia
MostRussia %>% ggplot(aes(x = year)) + geom_bar(fill = "plum4") + scale_y_continuous(limits=c(0,4)) + facet_grid(namesVector ~ .,scales = "free_y")  + scale_color_manual(values = palette_light()) + theme_tq() + guides(color = F) + labs(title = "Civil Servants and their Trips to Russia", x = "")

Finally I saw in a 2 part documentary, that there might be a connections with those in Russia to the Netherlands for the purposes of money laundering. Shown below is the proportion of trips to the Netherlands and Russia to all other countries visited.

NN %>% mutate(Country = ifelse(country == "Russia", "Russia", ifelse(country == "Netherlands","Netherlands", "Other"))) %>% 
  ggplot(aes(x = year, fill = Country)) + 
  geom_bar(position = "fill") + 
  #scale_y_continuous(limits=c(0,30)) + 
  facet_grid(namesVector ~ .,scales = "free_y")  + 
  # scale_color_manual(values = palette_dark()) + theme_tq() + 
  guides(color = F) + 
  labs(title = "Civil Servants Travel from 1995-2016", subtitle = "Trips to Russia are in light blue",y = "Number of Trips")  + theme(axis.text.x = element_text(angle = 45, vjust = 1, hjust = 1)) 

LS0tDQp0aXRsZTogIkZvcmVpZ24gVHJhdmVsIG9mIEdvdmVybm1lbnQgT2ZmaWNpYWxzIg0Kb3V0cHV0OiBodG1sX25vdGVib29rDQotLS0NCg0KDQpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeSh0aWR5cXVhbnQpDQpsaWJyYXJ5KG1vZGVscikNCmxpYnJhcnkoZ3JpZEV4dHJhKQ0KbGlicmFyeShncmlkKQ0KbGlicmFyeShyZWFkcikNCmBgYA0KDQpPbiBNYXkgMTcsIDIwMTcsIHRoZSBbV2FzaGluZ3RvbiBQb3N0IGJyb2tlIGEgc3RvcnldKGh0dHBzOi8vd3d3Lndhc2hpbmd0b25wb3N0LmNvbS93b3JsZC9uYXRpb25hbC1zZWN1cml0eS9ob3VzZS1tYWpvcml0eS1sZWFkZXItdG8tY29sbGVhZ3Vlcy1pbi0yMDE2LWktdGhpbmstcHV0aW4tcGF5cy10cnVtcC8yMDE3LzA1LzE3LzUxNWY2ZjhhLTNhZmYtMTFlNy04ODU0LTIxZjM1OTE4M2U4Y19zdG9yeS5odG1sP3V0bV90ZXJtPS45M2ZiZjM5MzM5ZWUpIGFib3V0IGEgcmVjb3JkZWQgY29udmVyc2F0aW9uIGJldHdlZW4gc29tZSBtZW1iZXJzIG9mIENvbmdyZXNzIHdoZXJlIG9uZSBvZiB0aGUgcGFydGljaXBhbnRzIHNheXMgaGUgdGhpbmtzIFZsYWRpbWlyIFB1dGluIHBheXMgYW5vdGhlciBtZW1iZXIgb2YgQ29uZ3Jlc3MgYW5kIHRoZSBSZXB1YmxpY2FuIFByZXNpZGVudGlhbCBDYW5kaWRhdGUuIEkgYmVjYW1lIGN1cmlvdXMgYWJvdXQgdGhlIHRoaXMgYW5kIHdhbnRlZCB0byBpbnZlc3RpZ2F0ZSB0aGUgdHJhdmVsIGhhYml0cyBvZiBDb25ncmVzc2lvbmFsIG1lbWJlcnMuICAgIA0KDQpbVGhpcyBkYXRhXShodHRwczovL2RhdGEud29ybGQvZGF0YTRkZW1vY3JhY3kvcHJvcHVibGljYS1mb3JlaWduLXRyYXZlbCkgY29tZXMgZnJvbSBEYXRhIGZvciBEZW1vY3JhY3kvUHJvUHVibGljYSBhbmQgaXQgcmVwcmVzZW50cyB0aGUgdHJhdmVsIHJlY29yZHMgb2YgZ292ZXJubWVudCBvZmZpY2lhbHMgZnJvbSAxOTk1LTIwMTcuIA0KDQoNCmBgYHtyfQ0KdHJhdmVscyA8LSByZWFkX2NzdigiaHR0cHM6Ly9xdWVyeS5kYXRhLndvcmxkL3MvN2V6aWZjOGVxaWc5dmRhemFvYTFub2VjdiIsDQogICAgICAgICAgICAgICAgICAgY29sX3R5cGVzID0gY29scygNCiAgICAgICAgICAgICAgICAgICAgICBuYW1lID0gY29sX2NoYXJhY3RlcigpLA0KICAgICAgICAgICAgICAgICAgICAgIGhvbm9yaWZpYyA9IGNvbF9jaGFyYWN0ZXIoKSwNCiAgICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiA9IGNvbF9jaGFyYWN0ZXIoKSwNCiAgICAgICAgICAgICAgICAgICAgICBRdWFudGl0eSA9IGNvbF9pbnRlZ2VyKCksDQogICAgICAgICAgICAgICAgICAgICAgYXJyaXZhbF9kYXRlID0gY29sX2RhdGUoZm9ybWF0ID0gIiVtLyVkLyVZIiksDQogICAgICAgICAgICAgICAgICAgICAgZGVwYXJ0dXJlX2RhdGUgPSBjb2xfZGF0ZShmb3JtYXQgPSAiJW0vJWQvJVkiKSwNCiAgICAgICAgICAgICAgICAgICAgICBjb3VudHJ5ID0gY29sX2NoYXJhY3RlcigpLA0KICAgICAgICAgICAgICAgICAgICAgIHRhYmxlX2hlYWRlciA9IGNvbF9jaGFyYWN0ZXIoKSwgDQogICAgICAgICAgICAgICAgICAgICAgc291cmNlX2ZpbGUgPSBjb2xfY2hhcmFjdGVyKCksIA0KICAgICAgICAgICAgICAgICAgICAgIEFycml2YWxZZWFyID0gY29sX2ludGVnZXIoKSkpICU+JQ0KICBtdXRhdGUoeWVhciA9IGZvcm1hdChhcnJpdmFsX2RhdGUsICIlWSIpKQ0KaGVhZCh0cmF2ZWxzKQ0KZGltKHRyYXZlbHMpDQpgYGANCg0KDQoqKkhvdyBtYW55IHRyYXZlbGxlcnMgYXJlIHJlcHJlc2VudGVkPyoqDQoNCmBgYHtyfQ0KbnJvdyh0cmF2ZWxzICU+JSBncm91cF9ieShuYW1lKSAlPiUgc3VtbWFyaXNlKEdvdmVybm1lbnRPZmZpY2lhbHMgPSBuKCkpICU+JSBuYS5vbWl0KCkpDQoNCmBgYA0KKipXaG8gdHJhdmVsbGVkIHRvIFJ1c3NpYSBtb3N0IG9mdGVuPyoqDQoNCmBgYHtyfQ0KdHJhdmVscyAlPiUgZmlsdGVyKGdyZXBsKCJSdXNzaWEiLGNvdW50cnkpKSAlPiUgZ3JvdXBfYnkobmFtZSkgJT4lIHN1bW1hcmlzZSh2aXNpdHNUb1J1c3NpYSA9IG4oKSkgJT4lIGFycmFuZ2UoZGVzYyh2aXNpdHNUb1J1c3NpYSkpICU+JSB0b3Bfbig2KQ0KYGBgDQoNCioqSSBuYXJyb3dlZCBkb3duIHRoZSBkYXRhIHNldCB0byB0aG9zZSB3aG8gaGF2ZSBtYWRlIG1vcmUgdGhhbiA0IHRyaXBzIHRvIFJ1c3NpYSBkdXJpbmcgdGhlaXIgdGVudXJlLioqIA0KDQpgYGB7cn0NCm15VmVjdG9yT2ZTdHJpbmdzIDwtIGMoIlJvaHIiLCAiQ3VydCBXZWxkb24iLCAiQ2hhcmxlcyBUYXlsb3IiLCAiU2xvYXQiLCAiUGF1bCBCZXJrb3dpdHoiLCAiTWFyayBHYWdlIiwgIlJvYmVydCBLaW5nIiApDQptYXRjaEV4cHJlc3Npb24gPC0gcGFzdGUobXlWZWN0b3JPZlN0cmluZ3MsIGNvbGxhcHNlID0gInwiKQ0KIyBbMV0gImZvb3xiYXIiDQpgYGANCg0KVGhlIHRhYmxlIGJlbG93IHNob3dzIG9mIG9mdGVuIGVhY2ggb2YgdGhlIHNlbGVjdCBPZmZpY2lhbHMgaGFzIHRyYXZlbGxlZCB0byBlYWNoIGNvdW50cnkgcmVwcmVzZW50ZWQuDQoNCmBgYHtyfQ0KdHJhdmVscyAlPiUgZmlsdGVyKGdyZXBsKG1hdGNoRXhwcmVzc2lvbiwgbmFtZSkpICU+JSBncm91cF9ieShuYW1lLCBjb3VudHJ5KSAlPiUgc3VtbWFyaXNlKG4gPSBuKCkpICU+JSBhcnJhbmdlKGNvdW50cnkpICU+JSB0b3BfbigxMCkNCk5OIDwtIHRyYXZlbHMgJT4lIGZpbHRlcihncmVwbChtYXRjaEV4cHJlc3Npb24sIG5hbWUpKSAlPiUgc2VsZWN0KG5hbWUsIGNvdW50cnksIHllYXIpICU+JSBhcnJhbmdlKG5hbWUpJT4lIG5hLm9taXQoKQ0KYGBgDQoNClRoZSBwcm9wb3J0aW9uIG9mIGVhY2ggb2ZmaWNpYWxzJyB0cmF2ZWxzIHRvIFJ1c3NpYSBpbiByZWxhdGlvbiB0byBhbGwgdHJhdmVscy4gDQoNCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KTk4kbmFtZXNWZWN0b3IgPC0gcmVwKGMoIkFtYW5kYSBTbG9hdCIsICJDdXJ0IFdlbGRvbiIsIkRhbmEgUm9ocmFiYWNoZXIiLCAiQW1hbmRhIFNsb2F0IiwiUm9iZXJ0IEtpbmciLCAiQ2hhcmxlcyBUYXlsb3IiLCAiQ3VydCBXZWxkb24iLCAiRGFuYSBSb2hyYWJhY2hlciIsICJNYXJrIEdhZ2UiLCAiUm9iZXJ0IEtpbmciLCAiRGFuYSBSb2hyYWJhY2hlciIsICJNYXJrIEdhZ2UiLCAiUGF1bCBCZXJrb3dpdHoiLCJSb2JlcnQgS2luZyIsIkRhbmEgUm9ocmFiYWNoZXIiKSwgdGltZXMgPSBjKDQzLDEsNCw5LDEsIDI3LDg4LDE3NCwxLDIsIDQsNDksIDE2MCwgODcsMSkpDQp4IDwtIE5OICU+JSBmaWx0ZXIoY291bnRyeSA9PSAiUnVzc2lhIikgJT4lIG5hLm9taXQoKSAlPiUgZ3JvdXBfYnkobmFtZXNWZWN0b3IpICU+JSBzdW1tYXJpc2UobiA9IG4oKSkNCmdncGxvdChOTiwgYWVzKHggPSBuYW1lc1ZlY3RvcikpICsgZ2VvbV9iYXIoZmlsbCA9ICJibHVlIiwgYWxwaGEgPSAwLjUpICsgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgdmp1c3QgPSAxLCBoanVzdCA9IDEpKSArIA0KICBnZW9tX2JveHBsb3QoZGF0YSA9IHgsIGFlcyh4ID0gbmFtZXNWZWN0b3IsIHkgPSBuLCBmYXR0ZW4gPSA0KSkgKyBsYWJzKHRpdGxlID0gIkFsbCBUcmlwcyIsIHN1YnRpdGxlID0gIiBCbGFjayBsaW5lIGRlbWFyY2F0ZXMgdGhlIG51bWJlciBvZiB0cmlwcyB0byBSdXNzaWEiKSArDQogIGxhYnMoeD0iR292ZXJubWVudCBPZmZpY2lhbCIseT0iVG90YWwgTnVtYmVyIG9mIFRyaXBzIikNCg0KYGBgDQoNCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBpbmNsdWRlPUZBTFNFfQ0KI05OICU+JSBtdXRhdGUodmlzaXRzVG9SdXNzaWEgPSBpZmVsc2UobmFtZXNWZWN0b3IgPT0gIkFtYW5kYSBTbG9hdCIsIDQsaWZlbHNlKG5hbWVzVmVjdG9yID09ICJDaGFybGVzIFRheWxvciIsIDgsaWZlbHNlKG5hbWVzVmVjdG9yID09ICJDdXJ0IFdlbGRvbiIsIDIyLCBpZmVsc2UobmFtZXNWZWN0b3IgPT0gIkRhbmEgUm9ocmFiYWNoZXIiLCA5LCBpZmVsc2UobmFtZXNWZWN0b3IgPT0gIk1hcmsgR2FnZSIsIDYsIGlmZWxzZShuYW1lc1ZlY3RvciA9PSAiUGF1bCBCZXJrb3dpdHoiLCA0LDYpKSkpKSkpDQojZ2dwbG90KE5OLCBhZXMoeCA9IG5hbWVzVmVjdG9yKSkgKyBnZW9tX2JhcihmaWxsID0gImJsdWUiKSArIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIHZqdXN0ID0gMSwgaGp1c3QgPSAxKSkgKyANCiAgI2dlb21fcG9pbnQoZGF0YSA9IHgsIGFlcyh4ID0gbmFtZXNWZWN0b3IsIHkgPSBuLCBjb2xvciA9ICJyZWQiLCBzaXplID0gMiwgYWxwaGEgPSAwLjUpKQ0KYGBgDQoNCg0KYGBge3IsIGZpZy5oZWlnaHQ9MjAsIGZpZy53aWR0aD04fQ0KTk4gJT4lIG11dGF0ZShDb3VudHJ5ID0gaWZlbHNlKGNvdW50cnkgPT0gIlJ1c3NpYSIsICJSdXNzaWEiLCAiTm90IFJ1c3NpYSIpKSAlPiUgDQogIGdncGxvdChhZXMoeCA9IHllYXIsIGZpbGwgPSBDb3VudHJ5KSkgKyANCiAgZ2VvbV9iYXIocG9zaXRpb24gPSAiZmlsbCIpICsgDQogICMgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cz1jKDAsMzApKSArIA0KICBmYWNldF9ncmlkKG5hbWVzVmVjdG9yIH4gLixzY2FsZXMgPSAiZnJlZV95IikgICsgDQogICNzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gcGFsZXR0ZV9kYXJrKCkpICsgDQogDQogICAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPWMoIiMzMzAwOTkiLCAiIzAwOTlGRiIpKSsgDQogICAgI3NjYWxlX2ZpbGxfYnJld2VyKHBhbGV0dGU9IlNldDEiKSArDQogICAgI3NjYWxlX2ZpbGxfaHVlKGM9NDUsIGw9ODApICsNCiAgdGhlbWVfdHEoKSArIA0KICBndWlkZXMoY29sb3IgPSBGKSArIA0KICBsYWJzKHRpdGxlID0gIkNpdmlsIFNlcnZhbnRzIFRyYXZlbCBmcm9tIDE5OTUtMjAxNiIsIHN1YnRpdGxlID0gIkhvdyBtdWNoIG9mIHRoYXQgdHJhdmVsIGlzIHRvIFJ1c3NpYSIseSA9ICJOdW1iZXIgb2YgVHJpcHMiKSAgKyB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCB2anVzdCA9IDEsIGhqdXN0ID0gMSkpIA0KYGBgDQpgYGB7cn0NCmhlYWQoTk4pDQpgYGANCg0KDQpgYGB7ciwgZmlnLmhlaWdodD0yMCwgZmlnLndpZHRoPTh9DQpOTiAlPiUgDQogIGdncGxvdChhZXMoeCA9IHllYXIsIGZpbGwgPSBjb3VudHJ5KSkgKyANCiAgZ2VvbV9iYXIocG9zaXRpb24gPSAiZmlsbCIpICsgDQogICNzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzPWMoMCwzMCkpICsgDQogIGZhY2V0X2dyaWQobmFtZXNWZWN0b3IgfiAuLHNjYWxlcyA9ICJmcmVlX3kiKSAgKyANCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPWMoJ2J1cmx5d29vZDQnLA0KJ2NhZGV0Ymx1ZScsDQonY2FkZXRibHVlMScsDQonY2FkZXRibHVlMicsDQonY2FkZXRibHVlNCcsDQonY2hhcnRyZXVzZScsDQonY2hhcnRyZXVzZTEnLA0KJ2NoYXJ0cmV1c2UyJywNCidjaGFydHJldXNlMycsDQonY2hhcnRyZXVzZTQnLA0KJ2Nob2NvbGF0ZScsDQonY2hvY29sYXRlMScsDQonY2hvY29sYXRlMycsDQonY2hvY29sYXRlNCcsDQonY29yYWwnLA0KJ2NvcmFsMScsDQonY29yYWwyJywNCidjb3JhbDMnLA0KJ2NvcmFsNCcsDQonY29ybmZsb3dlcmJsdWUnLA0KJ2Nvcm5zaWxrJywNCidjb3Juc2lsazEnLA0KJ2Nvcm5zaWxrMicsDQonY29ybnNpbGszJywNCidjb3Juc2lsazQnLA0KJ2N5YW4nLA0KJ2N5YW4xJywNCidjeWFuMicsDQonY3lhbjMnLA0KJ2N5YW40JywNCidkYXJrYmx1ZScsDQonZGFya2N5YW4nLA0KJ2Rhcmtnb2xkZW5yb2QnLA0KJ2Rhcmtnb2xkZW5yb2QxJywNCidkYXJrZ29sZGVucm9kMycsDQonZGFya2dvbGRlbnJvZDQnLA0KJ2RhcmtncmF5JywNCidhbGljZWJsdWUnLA0KJ2FudGlxdWV3aGl0ZScsDQonYW50aXF1ZXdoaXRlMScsDQonYW50aXF1ZXdoaXRlMicsDQonYW50aXF1ZXdoaXRlMycsDQonYW50aXF1ZXdoaXRlNCcsDQonYXF1YW1hcmluZScsDQonYXF1YW1hcmluZTEnLA0KJ2FxdWFtYXJpbmUyJywNCidhcXVhbWFyaW5lMycsDQonYXF1YW1hcmluZTQnLA0KJ2F6dXJlJywNCidhenVyZTEnLA0KJ2F6dXJlMicsDQonYXp1cmUzJywNCidhenVyZTQnLA0KJ2JlaWdlJywNCidiaXNxdWUnLA0KJ2Jpc3F1ZTEnLA0KJ2Jpc3F1ZTInLA0KJ2Jpc3F1ZTMnLA0KJ2Jpc3F1ZTQnLA0KJ2JsYW5jaGVkYWxtb25kJywNCidibHVlJywNCidibHVlMScsDQonYmx1ZTInLA0KJ2JsdWUzJywNCidibHVlNCcsDQonYmx1ZXZpb2xldCcsDQonYnJvd24nLA0KJ2Jyb3duMScsDQonYnJvd24yJywNCidicm93bjMnLA0KJ2Jyb3duNCcsDQonYnVybHl3b29kJywNCididXJseXdvb2QxJywNCididXJseXdvb2QyJywNCididXJseXdvb2QzJywNCidkYXJrZ3JlZW4nLA0KJ2RhcmtncmV5JywNCidkYXJra2hha2knLA0KJ2RhcmttYWdlbnRhJywNCidkYXJrb2xpdmVncmVlbicsDQonZGFya29saXZlZ3JlZW4xJywNCidkYXJrb2xpdmVncmVlbjInLA0KJ2RhcmtvbGl2ZWdyZWVuMycsDQonZGFya29saXZlZ3JlZW40JywNCidkYXJrb3JhbmdlJywNCidkYXJrb3JhbmdlMScsDQonZGFya29yYW5nZTInLA0KJ2RhcmtvcmFuZ2UzJywNCidkYXJrb3JhbmdlNCcsDQonZGFya29yY2hpZCcsDQonZGFya29yY2hpZDEnLA0KJ2RhcmtvcmNoaWQyJywNCidkYXJrb3JjaGlkMycsDQonYmxhY2snLA0KJ2RhcmtvcmNoaWQ0JywNCidkYXJrcmVkJywNCidkYXJrc2FsbW9uJywNCidkYXJrc2VhZ3JlZW4nLA0KJ2RhcmtzZWFncmVlbjEnLA0KJ2RhcmtzZWFncmVlbjInLA0KJ2RhcmtzZWFncmVlbjMnLA0KJ2RhcmtzZWFncmVlbjQnLA0KJ2RhcmtzbGF0ZWJsdWUnLA0KJ2RhcmtzbGF0ZWdyYXknLA0KJ2RhcmtzbGF0ZWdyYXkxJywNCidkYXJrc2xhdGVncmF5MicsDQonZGFya3NsYXRlZ3JheTMnLA0KJ2RhcmtzbGF0ZWdyYXk0JywNCidkYXJrc2xhdGVncmV5JywNCidkYXJrdHVycXVvaXNlJywNCidkYXJrdmlvbGV0JywNCidkZWVwcGluaycsDQonZGVlcHBpbmsxJywNCidkZWVwcGluazInLA0KJ2RlZXBwaW5rMycsDQonZGVlcHBpbms0JywNCidsaWdodGJsdWU0JywNCidsaWdodGNvcmFsJywNCidsaWdodGN5YW4nLA0KJ2xpZ2h0Y3lhbjEnLA0KJ2xpZ2h0Y3lhbjInLA0KJ2xpZ2h0Y3lhbjMnLA0KJ2xpZ2h0Y3lhbjQnLA0KJ2xpZ2h0Z29sZGVucm9kJykpICsgDQogIHRoZW1lX3RxKCkgKyANCiAgZ3VpZGVzKGNvbG9yID0gRikgKyANCiAgbGFicyh0aXRsZSA9ICJIb3cgbXVjaCBvZiB0aGUgT2ZmaWNpYWwncyB0cmF2ZWwgaXMgdG8gUnVzc2lhIiwgeCA9ICIiKSAgKyANCiAgbGFicyh0aXRsZSA9ICIiLCBzdWJ0aXRsZSA9ICJDaXZpbCBTZXJ2YW50cyBUcmF2ZWwgZnJvbSAxOTk1LTIwMTZUcmlwcyB0byBcbiBSdXNzaWEgYXJlIGluIGJsYWNrIix5ID0gIk51bWJlciBvZiBUcmlwcyIpICArIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIHZqdXN0ID0gMSwgaGp1c3QgPSAxKSkgDQpgYGANCg0KDQpgYGB7ciwgZXZhbD1GQUxTRSwgZmlnLmhlaWdodD00MCwgZmlnLndpZHRoPTgsIGluY2x1ZGU9RkFMU0V9DQpOTk4gPC0gdHJhdmVscyAlPiUgZmlsdGVyKGdyZXBsKG1hdGNoRXhwcmVzc2lvbiwgbmFtZSkpICU+JSBzZWxlY3QobmFtZSwgY291bnRyeSwgeWVhciklPiUgZ2dwbG90KGFlcyh4ID0geWVhciwgZmlsbCA9IGNvdW50cnkpKSArIGdlb21fYmFyKCkgKyBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzPWMoMCw0KSkgKyBmYWNldF9ncmlkKG5hbWUgfiAuLHNjYWxlcyA9ICJmcmVlX3kiKSAgKyBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gcGFsZXR0ZV9saWdodCgpKSArIHRoZW1lX3RxKCkgKyBndWlkZXMoY29sb3IgPSBGKSArIGxhYnModGl0bGUgPSAiQ2l2aWwgU2VydmFudHMgd2hvIE1vc3QgRnJlcXVlbnRseSBUcmF2ZWxsZWQgdG8gUnVzc2lhICIsIHggPSAiIikNCk5OTg0KDQpgYGANCg0KYGBge3IsIGV2YWw9RkFMU0UsIGluY2x1ZGU9RkFMU0V9DQpXZWxkb25SdXNzaWEgPC0gdHJhdmVscyAlPiUgIGZpbHRlcihncmVwbCgiV2VsZG9uIixuYW1lKSkgJT4lIGZpbHRlcihncmVwbCgiUnVzc2lhIiwgY291bnRyeSkpICU+JSAgYXJyYW5nZShkZXNjKGRlcGFydHVyZV9kYXRlKSkNCldlbGRvbk4gPC0gdHJhdmVscyAlPiUgIGZpbHRlcihncmVwbCgiV2VsZG9uIixuYW1lKSkgJT4lIGZpbHRlcihncmVwbCgiTmV0aGVyIiwgY291bnRyeSkpICU+JSAgYXJyYW5nZShkZXNjKGRlcGFydHVyZV9kYXRlKSkNCg0KZGltKFdlbGRvbk4pDQpoZWFkKFdlbGRvblJ1c3NpYSkNCmBgYA0KDQpgYGB7ciwgZXZhbD1GQUxTRSwgaW5jbHVkZT1GQUxTRX0NClJvaHJOIDwtIHRyYXZlbHMgJT4lICBmaWx0ZXIoZ3JlcGwoIlJvaHJhYmFjaGVyIixuYW1lKSkgJT4lIGZpbHRlcihncmVwbCgiTmV0aGVybGFuZHMiLCBjb3VudHJ5KSkgJT4lICBhcnJhbmdlKGRlc2MoZGVwYXJ0dXJlX2RhdGUpKQ0KZGltKFJvaHJOKQ0KaGVhZChSb2hyTikNCmBgYA0KDQoNCmBgYHtyLCBldmFsPUZBTFNFLCBpbmNsdWRlPUZBTFNFfQ0KUm9ocmFiYWNoZXJSdXNzaWEgPC0gdHJhdmVscyAlPiUgIGZpbHRlcihncmVwbCgiUm9ocmFiYWNoZXIiLG5hbWUpKSAlPiUgZmlsdGVyKGdyZXBsKCJSdXNzaWEiLCBjb3VudHJ5KSkgJT4lIGFycmFuZ2UoZGVzYyhkZXBhcnR1cmVfZGF0ZSkpDQpkaW0oUm9ocmFiYWNoZXJSdXNzaWEpDQpgYGANClRheWxvcg0KYGBge3IsIGV2YWw9RkFMU0UsIGluY2x1ZGU9RkFMU0V9DQpUYXlsb3JSdXNzaWEgPC0gdHJhdmVscyAlPiUgIGZpbHRlcihncmVwbCgiVGF5bG9yIixuYW1lKSkgJT4lIGZpbHRlcihncmVwbCgiUnVzc2lhIiwgY291bnRyeSkpICU+JSBhcnJhbmdlKGRlc2MoZGVwYXJ0dXJlX2RhdGUpKQ0KZGltKFRheWxvclJ1c3NpYSkNCg0KVGF5bG9yTiA8LSB0cmF2ZWxzICU+JSAgZmlsdGVyKGdyZXBsKCJUYXlsb3IiLG5hbWUpKSAlPiUgZmlsdGVyKGdyZXBsKCJOZXRoZXIiLCBjb3VudHJ5KSkgJT4lIGFycmFuZ2UoZGVzYyhkZXBhcnR1cmVfZGF0ZSkpDQpkaW0oVGF5bG9yTikNCmBgYA0KDQpgYGB7ciwgZXZhbD1GQUxTRSwgaW5jbHVkZT1GQUxTRX0NCkdhZ2VSdXNzaWEgPC0gdHJhdmVscyAlPiUgIGZpbHRlcihncmVwbCgiR2FnZSIsbmFtZSkpICU+JSBmaWx0ZXIoZ3JlcGwoIlJ1c3NpYSIsIGNvdW50cnkpKSAlPiUgYXJyYW5nZShkZXNjKGRlcGFydHVyZV9kYXRlKSkNCkdhZ2VOIDwtIHRyYXZlbHMgJT4lICBmaWx0ZXIoZ3JlcGwoIkdhZ2UiLG5hbWUpKSAlPiUgZmlsdGVyKGdyZXBsKCJOZXRoZXIiLCBjb3VudHJ5KSkgJT4lIGFycmFuZ2UoZGVzYyhkZXBhcnR1cmVfZGF0ZSkpDQpkaW0oR2FnZU4pDQpgYGANCg0KYGBge3IsIGV2YWw9RkFMU0UsIGluY2x1ZGU9RkFMU0V9DQpLaW5nUnVzc2lhIDwtIHRyYXZlbHMgJT4lICBmaWx0ZXIoZ3JlcGwoIlJvYmVydCBLaW5nIixuYW1lKSkgJT4lIGZpbHRlcihncmVwbCgiUnVzc2lhIiwgY291bnRyeSkpICU+JSBhcnJhbmdlKGRlc2MoZGVwYXJ0dXJlX2RhdGUpKQ0KS2luZ04gPC0gdHJhdmVscyAlPiUgIGZpbHRlcihncmVwbCgiUm9iZXJ0IEtpbmciLG5hbWUpKSAlPiUgZmlsdGVyKGdyZXBsKCJOZXRoZXIiLCBjb3VudHJ5KSkgJT4lIGFycmFuZ2UoZGVzYyhkZXBhcnR1cmVfZGF0ZSkpDQpkaW0oS2luZ04pDQpgYGANCg0KYGBge3IsIGV2YWw9RkFMU0UsIGluY2x1ZGU9RkFMU0V9DQpTbG9hdFJ1c3NpYSA8LSB0cmF2ZWxzICU+JSAgZmlsdGVyKGdyZXBsKCJTbG9hdCIsbmFtZSkpICU+JSBmaWx0ZXIoZ3JlcGwoIlJ1c3NpYSIsIGNvdW50cnkpKSAlPiUgYXJyYW5nZShkZXNjKGRlcGFydHVyZV9kYXRlKSkNClNsb2F0TiA8LSB0cmF2ZWxzICU+JSAgZmlsdGVyKGdyZXBsKCJTbG9hdCIsbmFtZSkpICU+JSBmaWx0ZXIoZ3JlcGwoIk5ldGhlcmwiLCBjb3VudHJ5KSkgJT4lIGFycmFuZ2UoZGVzYyhkZXBhcnR1cmVfZGF0ZSkpDQpkaW0oU2xvYXROKQ0KYGBgDQoNCmBgYHtyfQ0KQmVya293aXR6UnVzc2lhIDwtIHRyYXZlbHMgJT4lICBmaWx0ZXIoZ3JlcGwoIkJlcmtvd2l0eiIsbmFtZSkpICU+JSBmaWx0ZXIoZ3JlcGwoIlJ1c3NpYSIsIGNvdW50cnkpKSAlPiUgYXJyYW5nZShkZXNjKGRlcGFydHVyZV9kYXRlKSkNCkJlcmtvd2l0ek4gPC0gdHJhdmVscyAlPiUgIGZpbHRlcihncmVwbCgiQmVya293aXR6IixuYW1lKSkgJT4lIGZpbHRlcihncmVwbCgiTmV0aGVyIiwgY291bnRyeSkpICU+JSBhcnJhbmdlKGRlc2MoZGVwYXJ0dXJlX2RhdGUpKQ0KZGltKEJlcmtvd2l0ek4pDQpgYGANCg0KYGBge3J9DQpNb3N0UnVzc2lhIDwtIHJiaW5kLmRhdGEuZnJhbWUoV2VsZG9uUnVzc2lhLCBSb2hyYWJhY2hlclJ1c3NpYSwgVGF5bG9yUnVzc2lhLCBHYWdlUnVzc2lhLCBLaW5nUnVzc2lhLCBTbG9hdFJ1c3NpYSwgQmVya293aXR6UnVzc2lhKQ0KZGltKE1vc3RSdXNzaWEpDQpgYGANCg0KYGBge3IsIGV2YWw9RkFMU0UsIGluY2x1ZGU9RkFMU0V9DQpoZWFkKE1vc3RSdXNzaWEpDQpNb3N0UnVzc2lhDQpgYGANCg0KYGBge3J9DQoNCk1vc3RSdXNzaWEkbmFtZXNWZWN0b3IgPC0gcmVwKGMoIkN1cnQgV2VsZG9uIiwgIkRhbmEgUm9ocmFiYWNoZXIiLCJDaGFybGVzIFRheWxvciIsIk1hcmsgR2FnZSIsIlJvYmVydCBLaW5nIiwiQW1hbmRhIFNsb2F0IiwiUGF1bCBCZXJrb3dpdHoiKSwgdGltZXMgPSBjKDIyLDEyLDExLDgsNiw1LDUpKQ0KTW9zdFJ1c3NpYQ0KYGBgDQoNCg0KDQpgYGB7ciwgZmlnLmhlaWdodD0yMCwgZmlnLndpZHRoPTh9DQpNb3N0UnVzc2lhICU+JSBnZ3Bsb3QoYWVzKHggPSB5ZWFyKSkgKyBnZW9tX2JhcihmaWxsID0gInBsdW00IikgKyBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzPWMoMCw0KSkgKyBmYWNldF9ncmlkKG5hbWVzVmVjdG9yIH4gLixzY2FsZXMgPSAiZnJlZV95IikgICsgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IHBhbGV0dGVfbGlnaHQoKSkgKyB0aGVtZV90cSgpICsgZ3VpZGVzKGNvbG9yID0gRikgKyBsYWJzKHRpdGxlID0gIkNpdmlsIFNlcnZhbnRzIGFuZCB0aGVpciBUcmlwcyB0byBSdXNzaWEiLCB4ID0gIiIpDQpgYGANCg0KRmluYWxseSBJIHNhdyBpbiBhIDIgcGFydCBkb2N1bWVudGFyeSwgdGhhdCB0aGVyZSBtaWdodCBiZSBhIGNvbm5lY3Rpb25zIHdpdGggdGhvc2UgaW4gUnVzc2lhIHRvIHRoZSBOZXRoZXJsYW5kcyBmb3IgdGhlIHB1cnBvc2VzIG9mIG1vbmV5IGxhdW5kZXJpbmcuIFNob3duIGJlbG93IGlzIHRoZSBwcm9wb3J0aW9uIG9mIHRyaXBzIHRvIHRoZSBOZXRoZXJsYW5kcyBhbmQgUnVzc2lhIHRvIGFsbCBvdGhlciBjb3VudHJpZXMgdmlzaXRlZC4gDQoNCg0KYGBge3IsIGZpZy5oZWlnaHQ9MjAsIGZpZy53aWR0aD05fQ0KTk4gJT4lIG11dGF0ZShDb3VudHJ5ID0gaWZlbHNlKGNvdW50cnkgPT0gIlJ1c3NpYSIsICJSdXNzaWEiLCBpZmVsc2UoY291bnRyeSA9PSAiTmV0aGVybGFuZHMiLCJOZXRoZXJsYW5kcyIsICJPdGhlciIpKSkgJT4lIA0KICBnZ3Bsb3QoYWVzKHggPSB5ZWFyLCBmaWxsID0gQ291bnRyeSkpICsgDQogIGdlb21fYmFyKHBvc2l0aW9uID0gImZpbGwiKSArIA0KICAjc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cz1jKDAsMzApKSArIA0KICBmYWNldF9ncmlkKG5hbWVzVmVjdG9yIH4gLixzY2FsZXMgPSAiZnJlZV95IikgICsgDQogICMgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IHBhbGV0dGVfZGFyaygpKSArIHRoZW1lX3RxKCkgKyANCiAgZ3VpZGVzKGNvbG9yID0gRikgKyANCiAgbGFicyh0aXRsZSA9ICJDaXZpbCBTZXJ2YW50cyBUcmF2ZWwgZnJvbSAxOTk1LTIwMTYiLCBzdWJ0aXRsZSA9ICJUcmlwcyB0byBSdXNzaWEgYXJlIGluIGxpZ2h0IGJsdWUiLHkgPSAiTnVtYmVyIG9mIFRyaXBzIikgICsgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgdmp1c3QgPSAxLCBoanVzdCA9IDEpKSANCmBgYA0KDQoNCg0K