LDA Word within categories

Se aplica LDA (n = 20) considerando cada entrada de desinformación como un documento. Se muestan los ochos términos más característicos para cada topic. Los cluster parecen congruentes se diferencian bastante entre topics las palabras más características de cada uno.

stop_words_vc <- paste(stop_words$word, collapse = " | ")

read_tsv(here::here("data_web", "data_20200504T164147.tsv")) %>%
  select(summary, country) %>%
  rowid_to_column(var = "document") %>%
  mutate(document = paste(document, "document")) %>%
  unnest_tokens(word, summary) %>%
  filter(!word %in% stop_words$word) %>%
  # mutate_at("word", ~SnowballC::wordStem(., language="en")) %>%
  mutate(country = str_remove(country, "^Country: ")) %>%
  filter(!str_detect(country, "Keywords: ")) %>%
  mutate(country = str_replace_all(country,
                                   "Bosnia and Herzegovina",
                                   "BosniaHerzegovina")) %>%
  mutate(country = str_remove_all(country, ",?and\\s+"),
         with_stop_words = str_detect(country, stop_words_vc),
         new_country = countrycode::countrycode(country,
                                                "country.name",
                                                "country.name",
                                                nomatch = "None",
                                                warn = F),
         country = case_when(
           with_stop_words == T ~ new_country,
           TRUE ~ country
           )) %>%
  select(document:word) -> tidy_words

tidy_words %>%
  count(document, word, sort = T) %>%
  cast_dtm(document, word, n) -> disinfo_dtm

disinfo_lda <- topicmodels::LDA(disinfo_dtm, k = 20, control = list(seed = 1234))

disinfo_lda %>%
  tidy() %>%
  group_by(topic) %>%
  top_n(8, beta) %>%
  ungroup() -> disinfor_lda_tidy

disinfor_lda_tidy %>%
  mutate(term = reorder_within(term, beta, topic)) %>%
  ggplot(aes(term, beta, fill = factor(topic))) +
  geom_col(show.legend = FALSE) +
  facet_wrap(~topic, ncol = 3, scales = "free") +
  coord_flip() +
  scale_x_reordered()

Notas: - Seguir limpiando country - Menos o más topics¿? - stemming?

LDA and countries

La siguiente tabla muestra los topics y los

disinfo_lda %>%
  tidy(matrix = "gamma") %>%
  left_join(tidy_words %>%
              select(document, country) %>%
              distinct()) %>%
  arrange(topic, desc(gamma)) %>%
  group_by(topic) %>%
  top_n(4, wt = gamma) %>%
  # separate_rows(country, sep = ", ") %>%
  select(topic, country) %>%
  summarise(country = paste(country, collapse = "\n")) %>%
  ungroup() %>%
  left_join(disinfor_lda_tidy %>%
              group_by(topic) %>%
              summarise(term = paste(term, collapse = " "))) %>%
  mutate(topic = paste("Topic", topic)) %>% 
  group_by(topic) %>% 
  gt::gt()
country term
Topic 1
Latvia, Russia, Estonia, Lithuania, Germany USSR, Germany, Poland USSR, Russia, Germany, Poland USSR, Russia, Germany soviet poland polish history union germany ussr nazi
Topic 2
Russia, US Russia, US Russia, US Kazakhstan russian russia trump elections german media election presidential
Topic 3
Russia, Ukraine Malaysia, Russia, Ukraine, The Netherlands Australia, Malaysia, Russia, Ukraine, The Netherlands Ukraine, The Netherlands russian russia missile skripal investigation information evidence mh17
Topic 4
Brazil, US Russia, US Norway, Germany US russia war nato civil world west finland cold
Topic 5
Uzbekistan, Armenia, Azerbaijan, Moldova, Ukraine, Georgia EU, Portugal, Greece, Germany, Spain EU, Germany EU, Italy, Germany russia european eu countries sanctions europe union economic
Topic 6
Russia, Ukraine Ukraine Russia, Ukraine Russia, Ukraine ukraine russia ukrainian donbas kyiv coup 2014 conflict
Topic 7
Russia, Ukraine Russia, Sweden Russia Russia russian russia crimea international 2014 putin referendum crimean
Topic 8
Russia, Ukraine US Uzbekistan, Tajikistan, Armenia, Kazakhstan, Azerbaijan, Moldova, Russia, Ukraine, Belarus, Georgia Russia, Belarus, US, Poland belarus russian russia russians policy west western anti
Topic 9
US US Sweden EU, Canada, US global coronavirus system world people orthodox church 19
Topic 10
UK, Belarus Israel, UK, Belarus, US, Sweden Romania, Moldova Georgia belarus belarusian soros opposition society people children rights
Topic 11
China, US, France Cuba, Canada, China, US China, UK, US China, UK china coronavirus chinese laboratory american virus biological spread
Topic 12
Bulgaria, Georgia Australia, Czech Republic Slovakia, Russia Slovakia, Russia military ukrainian czech republic ministry donetsk people’s luhansk
Topic 13
Afghanistan, Syria US, Syria Iraq, US, Syria Iran, Russia russian syria turkish estonia turkey isis trend week’s
Topic 14
Ukraine Ukraine Ukraine Ukraine ukrainian foreign people country authorities minister citizens nazis
Topic 15
Venezuela, US Israel, Russia US, Georgia Georgia nato georgia south georgian security terrorism united threat
Topic 16
Russia, US Latvia, Russia, Estonia, Lithuania, US Russia, US Russia belarus russian russia countries military nato nuclear europe
Topic 17
Russia, Ukraine Russia, Ukraine Russia, Ukraine Russia, Ukraine russian poroshenko ukrainian president army soldiers law petro
Topic 18
Syria Syria Russia, Syria Russia, US, Syria chemical weapons syria helmets white syrian terrorist attack
Topic 19
France France France France fire migrants france treaty french police inf million
Topic 20
Venezuela Denmark Japan, US Venezuela, US president country refugees government east middle revolution colour

LDA Words with Covid-19

stop_words_vc <- paste(stop_words$word, collapse = " | ")

read_tsv(here::here("data_web", "data_20200504T164147.tsv")) %>% 
  filter(str_detect(keywords, pattern = "coronavirus")) %>% 
  select(summary, country) %>%  
  rowid_to_column(var = "document") %>%
  mutate(document = paste(document, "document")) %>%
  unnest_tokens(word, summary) %>%
  filter(!word %in% stop_words$word) %>%
  # mutate_at("word", ~SnowballC::wordStem(., language="en")) %>%
  mutate(country = str_remove(country, "^Country: ")) %>%
  filter(!str_detect(country, "Keywords: ")) %>%
  mutate(country = str_replace_all(country,
                                   "Bosnia and Herzegovina",
                                   "BosniaHerzegovina")) %>%
  mutate(country = str_remove_all(country, ",?and\\s+"),
         with_stop_words = str_detect(country, stop_words_vc),
         new_country = countrycode::countrycode(country,
                                                "country.name",
                                                "country.name",
                                                nomatch = "None",
                                                warn = F),
         country = case_when(
           with_stop_words == T ~ new_country,
           TRUE ~ country
           )) %>%
  select(document:word) -> tidy_words

tidy_words %>%
  count(document, word, sort = T) %>%
  cast_dtm(document, word, n) -> disinfo_dtm

disinfo_lda <- topicmodels::LDA(disinfo_dtm, k = 9, control = list(seed = 1234))

disinfo_lda %>%
  tidy() %>%
  group_by(topic) %>%
  top_n(8, beta) %>%
  ungroup() -> disinfor_lda_tidy

disinfor_lda_tidy %>%
  mutate(term = reorder_within(term, beta, topic)) %>%
  ggplot(aes(term, beta, fill = factor(topic))) +
  geom_col(show.legend = FALSE) +
  facet_wrap(~topic, ncol = 3, scales = "free") +
  coord_flip() +
  scale_x_reordered()

disinfo_lda %>%
  tidy(matrix = "gamma") %>%
  left_join(tidy_words %>%
              select(document, country) %>%
              distinct()) %>%
  arrange(topic, desc(gamma)) %>%
  group_by(topic) %>%
  top_n(4, wt = gamma) %>%
  # separate_rows(country, sep = ", ") %>%
  select(topic, country) %>%
  summarise(country = paste(country, collapse = "\n")) %>%
  ungroup() %>%
  left_join(disinfor_lda_tidy %>%
              group_by(topic) %>%
              summarise(term = paste(term, collapse = " "))) %>%
  mutate(topic = paste("Topic", topic)) %>% 
  group_by(topic) %>% 
  gt::gt()
country term
Topic 1
US China, US Russia EU, China, US eu china countries coronavirus world italy epidemic people
Topic 2
EU, Italy, Russia, US EU, Czech Republic EU, Canada, US EU eu coronavirus world virus russia crisis 19 covid
Topic 3
US US US US european coronavirus global world virus pandemic economic system
Topic 4
China, Russia, US Iran, China, Russia, US, France China, US, France China, UK, US china coronavirus chinese virus biological laboratory american covid
Topic 5
Italy, Germany, France Switzerland, US Italy, China, Latvia, Russia, Baltic states, Estonia, Lithuania, US Greece eu countries european coronavirus europe italy pandemic union
Topic 6
UK US Russia, Ukraine Italy, US coronavirus global epidemic ukraine pandemic russia ukrainian people
Topic 7
US China, Italy, UK, US China, UK, US Belarus china coronavirus world virus biological people population american
Topic 8
US, France China, Russia, US Italy, Russia, Ukraine US china coronavirus russian italy russia situation 19 aid
Topic 9
China, UK, Russia, Ukraine, US US EU, US, Germany Italy, Greece, UK, Latvia, Russia, Lithuania, US, Belgium china coronavirus world western russian russia people doctors
LS0tCnRpdGxlOiAiRVVWU0RJU0lORk8gTERBIiAKY2xlYW46IHRydWUKb3V0cHV0OgogIGJvb2tkb3duOjpodG1sX2RvY3VtZW50MjoKICAgIG51bWJlcl9zZWN0aW9uczogZmFsc2UKICAgIGNvZGVfZG93bmxvYWQ6IHRydWUKICAgIGNvZGVfZm9sZGluZzogaGlkZQogICAgc2VsZl9jb250YWluZWQ6IHRydWUKICAgIHRvYzogdHJ1ZQogICAgdG9jX2Zsb2F0OiBmYWxzZQotLS0KCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUsIHdhcm5pbmcgPSBGQUxTRSwgbWVzc2FnZSA9IEZBTFNFKQoKeGZ1bjo6cGtnX2F0dGFjaCgidGlkeXZlcnNlIiwgInRpZHl0ZXh0IikKCnRoZW1lX3NldCh0aGVtZV9saW5lZHJhdygpKQpgYGAKCiMjIExEQSBXb3JkIHdpdGhpbiBjYXRlZ29yaWVzCgpTZSBhcGxpY2EgTERBIChuID0gMjApIGNvbnNpZGVyYW5kbyBjYWRhIGVudHJhZGEgZGUgZGVzaW5mb3JtYWNpw7NuIGNvbW8gdW4gZG9jdW1lbnRvLiBTZSBtdWVzdGFuIGxvcyBvY2hvcyB0w6lybWlub3MgbcOhcyBjYXJhY3RlcsOtc3RpY29zIHBhcmEgY2FkYSB0b3BpYy4gTG9zIGNsdXN0ZXIgcGFyZWNlbiBjb25ncnVlbnRlcyBzZSBkaWZlcmVuY2lhbiBiYXN0YW50ZSBlbnRyZSB0b3BpY3MgbGFzIHBhbGFicmFzIG3DoXMgY2FyYWN0ZXLDrXN0aWNhcyBkZSBjYWRhIHVuby4KCmBgYHtyIG91dC53aWR0aCA9ICIxMDAlIiwgZmlnLmhlaWdodD0gMTB9CnN0b3Bfd29yZHNfdmMgPC0gcGFzdGUoc3RvcF93b3JkcyR3b3JkLCBjb2xsYXBzZSA9ICIgfCAiKQoKcmVhZF90c3YoaGVyZTo6aGVyZSgiZGF0YV93ZWIiLCAiZGF0YV8yMDIwMDUwNFQxNjQxNDcudHN2IikpICU+JQogIHNlbGVjdChzdW1tYXJ5LCBjb3VudHJ5KSAlPiUKICByb3dpZF90b19jb2x1bW4odmFyID0gImRvY3VtZW50IikgJT4lCiAgbXV0YXRlKGRvY3VtZW50ID0gcGFzdGUoZG9jdW1lbnQsICJkb2N1bWVudCIpKSAlPiUKICB1bm5lc3RfdG9rZW5zKHdvcmQsIHN1bW1hcnkpICU+JQogIGZpbHRlcighd29yZCAlaW4lIHN0b3Bfd29yZHMkd29yZCkgJT4lCiAgIyBtdXRhdGVfYXQoIndvcmQiLCB+U25vd2JhbGxDOjp3b3JkU3RlbSguLCBsYW5ndWFnZT0iZW4iKSkgJT4lCiAgbXV0YXRlKGNvdW50cnkgPSBzdHJfcmVtb3ZlKGNvdW50cnksICJeQ291bnRyeTogIikpICU+JQogIGZpbHRlcighc3RyX2RldGVjdChjb3VudHJ5LCAiS2V5d29yZHM6ICIpKSAlPiUKICBtdXRhdGUoY291bnRyeSA9IHN0cl9yZXBsYWNlX2FsbChjb3VudHJ5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCb3NuaWEgYW5kIEhlcnplZ292aW5hIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQm9zbmlhSGVyemVnb3ZpbmEiKSkgJT4lCiAgbXV0YXRlKGNvdW50cnkgPSBzdHJfcmVtb3ZlX2FsbChjb3VudHJ5LCAiLD9hbmRcXHMrIiksCiAgICAgICAgIHdpdGhfc3RvcF93b3JkcyA9IHN0cl9kZXRlY3QoY291bnRyeSwgc3RvcF93b3Jkc192YyksCiAgICAgICAgIG5ld19jb3VudHJ5ID0gY291bnRyeWNvZGU6OmNvdW50cnljb2RlKGNvdW50cnksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb3VudHJ5Lm5hbWUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY291bnRyeS5uYW1lIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9tYXRjaCA9ICJOb25lIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FybiA9IEYpLAogICAgICAgICBjb3VudHJ5ID0gY2FzZV93aGVuKAogICAgICAgICAgIHdpdGhfc3RvcF93b3JkcyA9PSBUIH4gbmV3X2NvdW50cnksCiAgICAgICAgICAgVFJVRSB+IGNvdW50cnkKICAgICAgICAgICApKSAlPiUKICBzZWxlY3QoZG9jdW1lbnQ6d29yZCkgLT4gdGlkeV93b3JkcwoKdGlkeV93b3JkcyAlPiUKICBjb3VudChkb2N1bWVudCwgd29yZCwgc29ydCA9IFQpICU+JQogIGNhc3RfZHRtKGRvY3VtZW50LCB3b3JkLCBuKSAtPiBkaXNpbmZvX2R0bQoKZGlzaW5mb19sZGEgPC0gdG9waWNtb2RlbHM6OkxEQShkaXNpbmZvX2R0bSwgayA9IDIwLCBjb250cm9sID0gbGlzdChzZWVkID0gMTIzNCkpCgpkaXNpbmZvX2xkYSAlPiUKICB0aWR5KCkgJT4lCiAgZ3JvdXBfYnkodG9waWMpICU+JQogIHRvcF9uKDgsIGJldGEpICU+JQogIHVuZ3JvdXAoKSAtPiBkaXNpbmZvcl9sZGFfdGlkeQoKZGlzaW5mb3JfbGRhX3RpZHkgJT4lCiAgbXV0YXRlKHRlcm0gPSByZW9yZGVyX3dpdGhpbih0ZXJtLCBiZXRhLCB0b3BpYykpICU+JQogIGdncGxvdChhZXModGVybSwgYmV0YSwgZmlsbCA9IGZhY3Rvcih0b3BpYykpKSArCiAgZ2VvbV9jb2woc2hvdy5sZWdlbmQgPSBGQUxTRSkgKwogIGZhY2V0X3dyYXAofnRvcGljLCBuY29sID0gMywgc2NhbGVzID0gImZyZWUiKSArCiAgY29vcmRfZmxpcCgpICsKICBzY2FsZV94X3Jlb3JkZXJlZCgpCmBgYAoKTm90YXM6Ci0gU2VndWlyIGxpbXBpYW5kbyBjb3VudHJ5Ci0gTWVub3MgbyBtw6FzIHRvcGljc8K/PwotIHN0ZW1taW5nPwoKIyMgTERBIGFuZCBjb3VudHJpZXMKTGEgc2lndWllbnRlIHRhYmxhIG11ZXN0cmEgbG9zIHRvcGljcyB5IGxvcyAKCmBgYHtyfQpkaXNpbmZvX2xkYSAlPiUKICB0aWR5KG1hdHJpeCA9ICJnYW1tYSIpICU+JQogIGxlZnRfam9pbih0aWR5X3dvcmRzICU+JQogICAgICAgICAgICAgIHNlbGVjdChkb2N1bWVudCwgY291bnRyeSkgJT4lCiAgICAgICAgICAgICAgZGlzdGluY3QoKSkgJT4lCiAgYXJyYW5nZSh0b3BpYywgZGVzYyhnYW1tYSkpICU+JQogIGdyb3VwX2J5KHRvcGljKSAlPiUKICB0b3Bfbig0LCB3dCA9IGdhbW1hKSAlPiUKICAjIHNlcGFyYXRlX3Jvd3MoY291bnRyeSwgc2VwID0gIiwgIikgJT4lCiAgc2VsZWN0KHRvcGljLCBjb3VudHJ5KSAlPiUKICBzdW1tYXJpc2UoY291bnRyeSA9IHBhc3RlKGNvdW50cnksIGNvbGxhcHNlID0gIlxuIikpICU+JQogIHVuZ3JvdXAoKSAlPiUKICBsZWZ0X2pvaW4oZGlzaW5mb3JfbGRhX3RpZHkgJT4lCiAgICAgICAgICAgICAgZ3JvdXBfYnkodG9waWMpICU+JQogICAgICAgICAgICAgIHN1bW1hcmlzZSh0ZXJtID0gcGFzdGUodGVybSwgY29sbGFwc2UgPSAiICIpKSkgJT4lCiAgbXV0YXRlKHRvcGljID0gcGFzdGUoIlRvcGljIiwgdG9waWMpKSAlPiUgCiAgZ3JvdXBfYnkodG9waWMpICU+JSAKICBndDo6Z3QoKQpgYGAKCiMgTERBIFdvcmRzIHdpdGggQ292aWQtMTkKCmBgYHtyIG91dC53aWR0aCA9ICIxMDAlIiwgZmlnLmhlaWdodD0gMTB9CnN0b3Bfd29yZHNfdmMgPC0gcGFzdGUoc3RvcF93b3JkcyR3b3JkLCBjb2xsYXBzZSA9ICIgfCAiKQoKcmVhZF90c3YoaGVyZTo6aGVyZSgiZGF0YV93ZWIiLCAiZGF0YV8yMDIwMDUwNFQxNjQxNDcudHN2IikpICU+JSAKICBmaWx0ZXIoc3RyX2RldGVjdChrZXl3b3JkcywgcGF0dGVybiA9ICJjb3JvbmF2aXJ1cyIpKSAlPiUgCiAgc2VsZWN0KHN1bW1hcnksIGNvdW50cnkpICU+JSAgCiAgcm93aWRfdG9fY29sdW1uKHZhciA9ICJkb2N1bWVudCIpICU+JQogIG11dGF0ZShkb2N1bWVudCA9IHBhc3RlKGRvY3VtZW50LCAiZG9jdW1lbnQiKSkgJT4lCiAgdW5uZXN0X3Rva2Vucyh3b3JkLCBzdW1tYXJ5KSAlPiUKICBmaWx0ZXIoIXdvcmQgJWluJSBzdG9wX3dvcmRzJHdvcmQpICU+JQogICMgbXV0YXRlX2F0KCJ3b3JkIiwgflNub3diYWxsQzo6d29yZFN0ZW0oLiwgbGFuZ3VhZ2U9ImVuIikpICU+JQogIG11dGF0ZShjb3VudHJ5ID0gc3RyX3JlbW92ZShjb3VudHJ5LCAiXkNvdW50cnk6ICIpKSAlPiUKICBmaWx0ZXIoIXN0cl9kZXRlY3QoY291bnRyeSwgIktleXdvcmRzOiAiKSkgJT4lCiAgbXV0YXRlKGNvdW50cnkgPSBzdHJfcmVwbGFjZV9hbGwoY291bnRyeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQm9zbmlhIGFuZCBIZXJ6ZWdvdmluYSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJvc25pYUhlcnplZ292aW5hIikpICU+JQogIG11dGF0ZShjb3VudHJ5ID0gc3RyX3JlbW92ZV9hbGwoY291bnRyeSwgIiw/YW5kXFxzKyIpLAogICAgICAgICB3aXRoX3N0b3Bfd29yZHMgPSBzdHJfZGV0ZWN0KGNvdW50cnksIHN0b3Bfd29yZHNfdmMpLAogICAgICAgICBuZXdfY291bnRyeSA9IGNvdW50cnljb2RlOjpjb3VudHJ5Y29kZShjb3VudHJ5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY291bnRyeS5uYW1lIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvdW50cnkubmFtZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vbWF0Y2ggPSAiTm9uZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhcm4gPSBGKSwKICAgICAgICAgY291bnRyeSA9IGNhc2Vfd2hlbigKICAgICAgICAgICB3aXRoX3N0b3Bfd29yZHMgPT0gVCB+IG5ld19jb3VudHJ5LAogICAgICAgICAgIFRSVUUgfiBjb3VudHJ5CiAgICAgICAgICAgKSkgJT4lCiAgc2VsZWN0KGRvY3VtZW50OndvcmQpIC0+IHRpZHlfd29yZHMKCnRpZHlfd29yZHMgJT4lCiAgY291bnQoZG9jdW1lbnQsIHdvcmQsIHNvcnQgPSBUKSAlPiUKICBjYXN0X2R0bShkb2N1bWVudCwgd29yZCwgbikgLT4gZGlzaW5mb19kdG0KCmRpc2luZm9fbGRhIDwtIHRvcGljbW9kZWxzOjpMREEoZGlzaW5mb19kdG0sIGsgPSA5LCBjb250cm9sID0gbGlzdChzZWVkID0gMTIzNCkpCgpkaXNpbmZvX2xkYSAlPiUKICB0aWR5KCkgJT4lCiAgZ3JvdXBfYnkodG9waWMpICU+JQogIHRvcF9uKDgsIGJldGEpICU+JQogIHVuZ3JvdXAoKSAtPiBkaXNpbmZvcl9sZGFfdGlkeQoKZGlzaW5mb3JfbGRhX3RpZHkgJT4lCiAgbXV0YXRlKHRlcm0gPSByZW9yZGVyX3dpdGhpbih0ZXJtLCBiZXRhLCB0b3BpYykpICU+JQogIGdncGxvdChhZXModGVybSwgYmV0YSwgZmlsbCA9IGZhY3Rvcih0b3BpYykpKSArCiAgZ2VvbV9jb2woc2hvdy5sZWdlbmQgPSBGQUxTRSkgKwogIGZhY2V0X3dyYXAofnRvcGljLCBuY29sID0gMywgc2NhbGVzID0gImZyZWUiKSArCiAgY29vcmRfZmxpcCgpICsKICBzY2FsZV94X3Jlb3JkZXJlZCgpCmBgYAoKCmBgYHtyfQpkaXNpbmZvX2xkYSAlPiUKICB0aWR5KG1hdHJpeCA9ICJnYW1tYSIpICU+JQogIGxlZnRfam9pbih0aWR5X3dvcmRzICU+JQogICAgICAgICAgICAgIHNlbGVjdChkb2N1bWVudCwgY291bnRyeSkgJT4lCiAgICAgICAgICAgICAgZGlzdGluY3QoKSkgJT4lCiAgYXJyYW5nZSh0b3BpYywgZGVzYyhnYW1tYSkpICU+JQogIGdyb3VwX2J5KHRvcGljKSAlPiUKICB0b3Bfbig0LCB3dCA9IGdhbW1hKSAlPiUKICAjIHNlcGFyYXRlX3Jvd3MoY291bnRyeSwgc2VwID0gIiwgIikgJT4lCiAgc2VsZWN0KHRvcGljLCBjb3VudHJ5KSAlPiUKICBzdW1tYXJpc2UoY291bnRyeSA9IHBhc3RlKGNvdW50cnksIGNvbGxhcHNlID0gIlxuIikpICU+JQogIHVuZ3JvdXAoKSAlPiUKICBsZWZ0X2pvaW4oZGlzaW5mb3JfbGRhX3RpZHkgJT4lCiAgICAgICAgICAgICAgZ3JvdXBfYnkodG9waWMpICU+JQogICAgICAgICAgICAgIHN1bW1hcmlzZSh0ZXJtID0gcGFzdGUodGVybSwgY29sbGFwc2UgPSAiICIpKSkgJT4lCiAgbXV0YXRlKHRvcGljID0gcGFzdGUoIlRvcGljIiwgdG9waWMpKSAlPiUgCiAgZ3JvdXBfYnkodG9waWMpICU+JSAKICBndDo6Z3QoKQpgYGA=