Notebook description: Basic data visualization practice
Data source: TidyTuesday Extinct plants
Load packages
library(tidyverse)
library(readr)
library(ggthemes)
library(ggsci)
library(viridis)
Import data
plants <- readr::read_csv('https://raw.githubusercontent.com/rfordatascience/tidytuesday/master/data/2020/2020-08-18/plants.csv')
actions <- readr::read_csv('https://raw.githubusercontent.com/rfordatascience/tidytuesday/master/data/2020/2020-08-18/actions.csv')
threats <- readr::read_csv('https://raw.githubusercontent.com/rfordatascience/tidytuesday/master/data/2020/2020-08-18/threats.csv')
dim(plants)
[1] 500 24
dim(actions)
[1] 3000 8
dim(threats)
[1] 6000 8
Extinct plants by last_year_seen (500 plants are considered to be extinct in 2020)
plants %>% filter(!is.na(year_last_seen)) %>% group_by(year_last_seen) %>% tally() %>% ggplot(aes(x= factor(year_last_seen, level = c('Before 1900','1900-1919','1920-1939', '1940-1959','1960-1979','1980-1999','2000-2020')), y=n, fill=n)) + geom_col(width=0.6) + geom_text(aes(label=n, vjust=-0.5)) + theme_light() + scale_fill_viridis(option="cividis") + labs(x="", y="", fill="", title= "Year last seen of 500 extinct plants") + theme(
panel.grid.major.x = element_blank(),
panel.border = element_blank(),
axis.ticks.x = element_blank(),
axis.ticks.y = element_blank(),
panel.grid.major.y = element_blank(),
panel.grid.minor.x = element_blank(),
panel.grid.minor.y = element_blank(),
legend.position="none"
)

Threat type of extinct plants
#plot treat type of extinct plants
threats %>% filter(threatened=="1", !is.na(year_last_seen), threat_type!= 'Unknown') %>% group_by(threat_type) %>% tally() %>% ggplot(aes(x=reorder(threat_type,n), y=n, fill=n)) + geom_col() + scale_fill_viridis() + coord_flip() + theme_light() + labs(x="", y="", fill="", title= "Threat types of extinct plants") + theme(
panel.grid.major.x = element_blank(),
panel.border = element_blank(),
axis.ticks.x = element_blank(),
axis.ticks.y = element_blank(),
panel.grid.major.y = element_blank(),
panel.grid.minor.x = element_blank(),
panel.grid.minor.y = element_blank()
)

Proportion of threat types by year last seen (1900 and after)
threats %>% filter(threatened=="1", !is.na(year_last_seen), threat_type!= 'Unknown', year_last_seen!='Before 1900') %>% group_by(year_last_seen, threat_type) %>% tally() %>% mutate(prop= n/sum(n)) %>% ggplot(aes(x= threat_type, y= prop, fill=year_last_seen)) + geom_col() + coord_flip() + facet_wrap(~year_last_seen) + theme_minimal() + scale_fill_uchicago() + theme(legend.position="none") + labs(y="proportion") + theme(
panel.grid.major.x = element_blank(),
panel.border = element_blank(),
axis.ticks.x = element_blank(),
axis.ticks.y = element_blank(),
panel.grid.major.y = element_blank(),
panel.grid.minor.x = element_blank(),
panel.grid.minor.y = element_blank()
)

Summary of extinct plants by continent
plants %>% group_by(continent) %>% tally(sort=T) %>% mutate(prop=n/sum(n))
Proportion of extinct plants by continent
plants %>% group_by(continent) %>% tally(sort=T) %>% mutate(prop=n/sum(n)) %>% ggplot(aes(x=reorder(continent,prop), y=prop, fill=prop)) + geom_col() + coord_flip() + geom_text(aes(label=n, hjust=-0.3)) + ylim(0.0,0.5) + labs(y="proportion", x= "", title = "Extinct plants by continent", fill="Proportion") + scale_fill_viridis() + theme_light() + theme(
panel.grid.major.x = element_blank(),
panel.border = element_blank(),
axis.ticks.x = element_blank(),
axis.ticks.y = element_blank(),
panel.grid.major.y = element_blank(),
panel.grid.minor.x = element_blank(),
panel.grid.minor.y = element_blank()
)

year_last_seen by continent (inspired by kllycttn)
plants %>% filter(!is.na(year_last_seen)) %>% ggplot(aes(x= factor(year_last_seen, level = c('2000-2020','1980-1999','1960-1979', '1940-1959','1920-1939','1900-1919','Before 1900')), fill= continent)) + geom_bar() + coord_flip() + facet_wrap(~continent) + theme_minimal() + ggthemes::scale_fill_tableau() + labs(x="year_last_seen") + theme(
panel.grid.major.x = element_blank(),
panel.border = element_blank(),
axis.ticks.x = element_blank(),
axis.ticks.y = element_blank(),
panel.grid.minor.x = element_blank(),
panel.grid.minor.y = element_blank(),
legend.position="none"
)

Proportion of threat types by continent
threats %>% filter(threatened=="1") %>% filter(!is.na(year_last_seen)) %>% filter(threat_type!= 'Unknown') %>% group_by(continent, threat_type) %>% tally() %>% mutate(prop= n/sum(n)) %>% ggplot(aes(x= threat_type, y= prop, fill=continent)) + geom_col() + coord_flip() + facet_wrap(~continent) + theme_minimal() + ggthemes::scale_fill_tableau() + labs(y="proportion") + theme(
panel.grid.major.x = element_blank(),
panel.border = element_blank(),
axis.ticks.x = element_blank(),
axis.ticks.y = element_blank(),
panel.grid.minor.x = element_blank(),
panel.grid.minor.y = element_blank(),
legend.position="none"
)

Actions taken by continents (inspired by kllycttn)
actions %>% filter(action_taken=="1") %>% group_by(continent, action_type) %>% tally() %>% filter(action_type !='Unknown') %>% ggplot(aes(x=n, y=action_type, fill= action_type)) + geom_col() + facet_wrap(~continent) + theme_minimal() + scale_fill_uchicago() + theme(legend.position="none") + labs(x="", y="") + theme(
panel.grid.major.x = element_blank(),
panel.border = element_blank(),
axis.ticks.x = element_blank(),
axis.ticks.y = element_blank(),
panel.grid.minor.x = element_blank(),
panel.grid.minor.y = element_blank()
)

Red list category across the years (inspired by iamericfletcher)
plants %>% filter(!is.na(year_last_seen)) %>% group_by(year_last_seen, red_list_category) %>% tally() %>% ggplot(aes(x= factor(year_last_seen, level = c('Before 1900','1900-1919','1920-1939', '1940-1959','1960-1979','1980-1999','2000-2020')), y = n, fill= red_list_category)) + geom_col(position="dodge") + labs(x="") + scale_fill_manual(name = "", labels = c("Extinct", "Extnct in the Wild"), values = c("#7d8597", "#ad2831")) + labs(x="", y="", title = "Extinct vs Extinct in the Wild") + theme_light() + theme(
panel.grid.major.x = element_blank(),
panel.border = element_blank(),
axis.ticks.x = element_blank(),
axis.ticks.y = element_blank(),
panel.grid.major.y = element_blank(),
panel.grid.minor.x = element_blank(),
panel.grid.minor.y = element_blank()
)

LS0tCnRpdGxlOiAiRXh0aW5jdCBQbGFudHMiCm91dHB1dDogaHRtbF9ub3RlYm9vawotLS0KKipOb3RlYm9vayBkZXNjcmlwdGlvbioqOiBCYXNpYyBkYXRhIHZpc3VhbGl6YXRpb24gcHJhY3RpY2UgCgoqKkRhdGEgc291cmNlKio6IFRpZHlUdWVzZGF5IFtFeHRpbmN0IHBsYW50c10oaHR0cHM6Ly9naXRodWIuY29tL3Jmb3JkYXRhc2NpZW5jZS90aWR5dHVlc2RheS9ibG9iL21hc3Rlci9kYXRhLzIwMjAvMjAyMC0wOC0xOC9yZWFkbWUubWQpCgpMb2FkIHBhY2thZ2VzCmBgYHtyLCBtZXNzYWdlID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRX0KbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkocmVhZHIpCmxpYnJhcnkoZ2d0aGVtZXMpCmxpYnJhcnkoZ2dzY2kpCmxpYnJhcnkodmlyaWRpcykKYGBgCgpJbXBvcnQgZGF0YQpgYGB7ciwgbWVzc2FnZSA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0V9CnBsYW50cyA8LSByZWFkcjo6cmVhZF9jc3YoJ2h0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9yZm9yZGF0YXNjaWVuY2UvdGlkeXR1ZXNkYXkvbWFzdGVyL2RhdGEvMjAyMC8yMDIwLTA4LTE4L3BsYW50cy5jc3YnKQphY3Rpb25zIDwtIHJlYWRyOjpyZWFkX2NzdignaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3Jmb3JkYXRhc2NpZW5jZS90aWR5dHVlc2RheS9tYXN0ZXIvZGF0YS8yMDIwLzIwMjAtMDgtMTgvYWN0aW9ucy5jc3YnKQp0aHJlYXRzIDwtIHJlYWRyOjpyZWFkX2NzdignaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3Jmb3JkYXRhc2NpZW5jZS90aWR5dHVlc2RheS9tYXN0ZXIvZGF0YS8yMDIwLzIwMjAtMDgtMTgvdGhyZWF0cy5jc3YnKQpgYGAKCmBgYHtyfQpkaW0ocGxhbnRzKQpkaW0oYWN0aW9ucykKZGltKHRocmVhdHMpCmBgYAoKRXh0aW5jdCBwbGFudHMgYnkgbGFzdF95ZWFyX3NlZW4gKDUwMCBwbGFudHMgYXJlIGNvbnNpZGVyZWQgdG8gYmUgZXh0aW5jdCBpbiAyMDIwKQpgYGB7cn0KcGxhbnRzICU+JSBmaWx0ZXIoIWlzLm5hKHllYXJfbGFzdF9zZWVuKSkgJT4lIGdyb3VwX2J5KHllYXJfbGFzdF9zZWVuKSAlPiUgdGFsbHkoKSAlPiUgZ2dwbG90KGFlcyh4PSBmYWN0b3IoeWVhcl9sYXN0X3NlZW4sIGxldmVsID0gYygnQmVmb3JlIDE5MDAnLCcxOTAwLTE5MTknLCcxOTIwLTE5MzknLCAnMTk0MC0xOTU5JywnMTk2MC0xOTc5JywnMTk4MC0xOTk5JywnMjAwMC0yMDIwJykpLCB5PW4sIGZpbGw9bikpICsgZ2VvbV9jb2wod2lkdGg9MC42KSArIGdlb21fdGV4dChhZXMobGFiZWw9biwgdmp1c3Q9LTAuNSkpICsgdGhlbWVfbGlnaHQoKSArIHNjYWxlX2ZpbGxfdmlyaWRpcyhvcHRpb249ImNpdmlkaXMiKSArIGxhYnMoeD0iIiwgeT0iIiwgZmlsbD0iIiwgdGl0bGU9ICJZZWFyIGxhc3Qgc2VlbiBvZiA1MDAgZXh0aW5jdCBwbGFudHMiKSArIHRoZW1lKAogICAgcGFuZWwuZ3JpZC5tYWpvci54ID0gZWxlbWVudF9ibGFuaygpLAogICAgcGFuZWwuYm9yZGVyID0gZWxlbWVudF9ibGFuaygpLAogICAgYXhpcy50aWNrcy54ID0gZWxlbWVudF9ibGFuaygpLAogICAgYXhpcy50aWNrcy55ID0gZWxlbWVudF9ibGFuaygpLAogICAgcGFuZWwuZ3JpZC5tYWpvci55ID0gZWxlbWVudF9ibGFuaygpLAogICAgcGFuZWwuZ3JpZC5taW5vci54ID0gZWxlbWVudF9ibGFuaygpLAogICAgcGFuZWwuZ3JpZC5taW5vci55ID0gZWxlbWVudF9ibGFuaygpLAogICAgbGVnZW5kLnBvc2l0aW9uPSJub25lIgogICkgCmBgYAoKVGhyZWF0IHR5cGUgb2YgZXh0aW5jdCBwbGFudHMKYGBge3J9CnRocmVhdHMgJT4lIGZpbHRlcih0aHJlYXRlbmVkPT0iMSIsICFpcy5uYSh5ZWFyX2xhc3Rfc2VlbiksIHRocmVhdF90eXBlIT0gJ1Vua25vd24nKSAlPiUgZ3JvdXBfYnkodGhyZWF0X3R5cGUpICU+JSB0YWxseSgpICU+JSBnZ3Bsb3QoYWVzKHg9cmVvcmRlcih0aHJlYXRfdHlwZSxuKSwgeT1uLCBmaWxsPW4pKSArIGdlb21fY29sKCkgKyBzY2FsZV9maWxsX3ZpcmlkaXMoKSArIGNvb3JkX2ZsaXAoKSArIHRoZW1lX2xpZ2h0KCkgKyBsYWJzKHg9IiIsIHk9IiIsIGZpbGw9IiIsIHRpdGxlPSAiVGhyZWF0IHR5cGVzIG9mIGV4dGluY3QgcGxhbnRzIikgKyB0aGVtZSgKICAgIHBhbmVsLmdyaWQubWFqb3IueCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgIHBhbmVsLmJvcmRlciA9IGVsZW1lbnRfYmxhbmsoKSwKICAgIGF4aXMudGlja3MueCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgIGF4aXMudGlja3MueSA9IGVsZW1lbnRfYmxhbmsoKSwKICAgIHBhbmVsLmdyaWQubWFqb3IueSA9IGVsZW1lbnRfYmxhbmsoKSwKICAgIHBhbmVsLmdyaWQubWlub3IueCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgIHBhbmVsLmdyaWQubWlub3IueSA9IGVsZW1lbnRfYmxhbmsoKQogICkgCmBgYAoKUHJvcG9ydGlvbiBvZiB0aHJlYXQgdHlwZXMgYnkgeWVhciBsYXN0IHNlZW4gKDE5MDAgYW5kIGFmdGVyKQpgYGB7cn0KdGhyZWF0cyAlPiUgZmlsdGVyKHRocmVhdGVuZWQ9PSIxIiwgIWlzLm5hKHllYXJfbGFzdF9zZWVuKSwgdGhyZWF0X3R5cGUhPSAnVW5rbm93bicsIHllYXJfbGFzdF9zZWVuIT0nQmVmb3JlIDE5MDAnKSAlPiUgZ3JvdXBfYnkoeWVhcl9sYXN0X3NlZW4sIHRocmVhdF90eXBlKSAlPiUgdGFsbHkoKSAlPiUgbXV0YXRlKHByb3A9IG4vc3VtKG4pKSAlPiUgZ2dwbG90KGFlcyh4PSB0aHJlYXRfdHlwZSwgeT0gcHJvcCwgZmlsbD15ZWFyX2xhc3Rfc2VlbikpICsgZ2VvbV9jb2woKSArIGNvb3JkX2ZsaXAoKSArIGZhY2V0X3dyYXAofnllYXJfbGFzdF9zZWVuKSArIHRoZW1lX21pbmltYWwoKSAgKyBzY2FsZV9maWxsX3VjaGljYWdvKCkgKyB0aGVtZShsZWdlbmQucG9zaXRpb249Im5vbmUiKSArIGxhYnMoeT0icHJvcG9ydGlvbiIpICsgdGhlbWUoCiAgICBwYW5lbC5ncmlkLm1ham9yLnggPSBlbGVtZW50X2JsYW5rKCksCiAgICBwYW5lbC5ib3JkZXIgPSBlbGVtZW50X2JsYW5rKCksCiAgICBheGlzLnRpY2tzLnggPSBlbGVtZW50X2JsYW5rKCksCiAgICBheGlzLnRpY2tzLnkgPSBlbGVtZW50X2JsYW5rKCksCiAgICBwYW5lbC5ncmlkLm1ham9yLnkgPSBlbGVtZW50X2JsYW5rKCksCiAgICBwYW5lbC5ncmlkLm1pbm9yLnggPSBlbGVtZW50X2JsYW5rKCksCiAgICBwYW5lbC5ncmlkLm1pbm9yLnkgPSBlbGVtZW50X2JsYW5rKCkKICApIApgYGAKClN1bW1hcnkgb2YgZXh0aW5jdCBwbGFudHMgYnkgY29udGluZW50IApgYGB7cn0KcGxhbnRzICU+JSBncm91cF9ieShjb250aW5lbnQpICU+JSB0YWxseShzb3J0PVQpICU+JSBtdXRhdGUocHJvcD1uL3N1bShuKSkKYGBgClByb3BvcnRpb24gb2YgZXh0aW5jdCBwbGFudHMgYnkgY29udGluZW50IApgYGB7cn0KcGxhbnRzICU+JSBncm91cF9ieShjb250aW5lbnQpICU+JSB0YWxseShzb3J0PVQpICU+JSBtdXRhdGUocHJvcD1uL3N1bShuKSkgJT4lIGdncGxvdChhZXMoeD1yZW9yZGVyKGNvbnRpbmVudCxwcm9wKSwgeT1wcm9wLCBmaWxsPXByb3ApKSArIGdlb21fY29sKCkgKyBjb29yZF9mbGlwKCkgKyBnZW9tX3RleHQoYWVzKGxhYmVsPW4sIGhqdXN0PS0wLjMpKSArIHlsaW0oMC4wLDAuNSkgKyBsYWJzKHk9InByb3BvcnRpb24iLCB4PSAiIiwgdGl0bGUgPSAiRXh0aW5jdCBwbGFudHMgYnkgY29udGluZW50IiwgZmlsbD0iUHJvcG9ydGlvbiIpICsgc2NhbGVfZmlsbF92aXJpZGlzKCkgKyB0aGVtZV9saWdodCgpICsgdGhlbWUoCiAgICBwYW5lbC5ncmlkLm1ham9yLnggPSBlbGVtZW50X2JsYW5rKCksCiAgICBwYW5lbC5ib3JkZXIgPSBlbGVtZW50X2JsYW5rKCksCiAgICBheGlzLnRpY2tzLnggPSBlbGVtZW50X2JsYW5rKCksCiAgICBheGlzLnRpY2tzLnkgPSBlbGVtZW50X2JsYW5rKCksCiAgICBwYW5lbC5ncmlkLm1ham9yLnkgPSBlbGVtZW50X2JsYW5rKCksCiAgICBwYW5lbC5ncmlkLm1pbm9yLnggPSBlbGVtZW50X2JsYW5rKCksCiAgICBwYW5lbC5ncmlkLm1pbm9yLnkgPSBlbGVtZW50X2JsYW5rKCkKICApIApgYGAKCnllYXJfbGFzdF9zZWVuIGJ5IGNvbnRpbmVudCAoaW5zcGlyZWQgYnkga2xseWN0dG4pCmBgYHtyfQpwbGFudHMgJT4lIGZpbHRlcighaXMubmEoeWVhcl9sYXN0X3NlZW4pKSAlPiUgZ2dwbG90KGFlcyh4PSBmYWN0b3IoeWVhcl9sYXN0X3NlZW4sIGxldmVsID0gYygnMjAwMC0yMDIwJywnMTk4MC0xOTk5JywnMTk2MC0xOTc5JywgJzE5NDAtMTk1OScsJzE5MjAtMTkzOScsJzE5MDAtMTkxOScsJ0JlZm9yZSAxOTAwJykpLCBmaWxsPSBjb250aW5lbnQpKSAgKyBnZW9tX2JhcigpICsgY29vcmRfZmxpcCgpICsgZmFjZXRfd3JhcCh+Y29udGluZW50KSArIHRoZW1lX21pbmltYWwoKSArIGdndGhlbWVzOjpzY2FsZV9maWxsX3RhYmxlYXUoKSArIGxhYnMoeD0ieWVhcl9sYXN0X3NlZW4iKSArIHRoZW1lKAogICAgcGFuZWwuZ3JpZC5tYWpvci54ID0gZWxlbWVudF9ibGFuaygpLAogICAgcGFuZWwuYm9yZGVyID0gZWxlbWVudF9ibGFuaygpLAogICAgYXhpcy50aWNrcy54ID0gZWxlbWVudF9ibGFuaygpLAogICAgYXhpcy50aWNrcy55ID0gZWxlbWVudF9ibGFuaygpLAogICAgcGFuZWwuZ3JpZC5taW5vci54ID0gZWxlbWVudF9ibGFuaygpLAogICAgcGFuZWwuZ3JpZC5taW5vci55ID0gZWxlbWVudF9ibGFuaygpLAogICAgbGVnZW5kLnBvc2l0aW9uPSJub25lIgogICkgCmBgYAoKUHJvcG9ydGlvbiBvZiB0aHJlYXQgdHlwZXMgYnkgY29udGluZW50IApgYGB7cn0KdGhyZWF0cyAlPiUgZmlsdGVyKHRocmVhdGVuZWQ9PSIxIikgJT4lIGZpbHRlcighaXMubmEoeWVhcl9sYXN0X3NlZW4pKSAlPiUgZmlsdGVyKHRocmVhdF90eXBlIT0gJ1Vua25vd24nKSAlPiUgZ3JvdXBfYnkoY29udGluZW50LCB0aHJlYXRfdHlwZSkgJT4lIHRhbGx5KCkgJT4lIG11dGF0ZShwcm9wPSBuL3N1bShuKSkgJT4lIGdncGxvdChhZXMoeD0gdGhyZWF0X3R5cGUsIHk9IHByb3AsIGZpbGw9Y29udGluZW50KSkgKyBnZW9tX2NvbCgpICsgY29vcmRfZmxpcCgpICsgZmFjZXRfd3JhcCh+Y29udGluZW50KSArIHRoZW1lX21pbmltYWwoKSAgKyBnZ3RoZW1lczo6c2NhbGVfZmlsbF90YWJsZWF1KCkgKyBsYWJzKHk9InByb3BvcnRpb24iKSArIHRoZW1lKAogICAgcGFuZWwuZ3JpZC5tYWpvci54ID0gZWxlbWVudF9ibGFuaygpLAogICAgcGFuZWwuYm9yZGVyID0gZWxlbWVudF9ibGFuaygpLAogICAgYXhpcy50aWNrcy54ID0gZWxlbWVudF9ibGFuaygpLAogICAgYXhpcy50aWNrcy55ID0gZWxlbWVudF9ibGFuaygpLAogICAgcGFuZWwuZ3JpZC5taW5vci54ID0gZWxlbWVudF9ibGFuaygpLAogICAgcGFuZWwuZ3JpZC5taW5vci55ID0gZWxlbWVudF9ibGFuaygpLAogICAgbGVnZW5kLnBvc2l0aW9uPSJub25lIgogICkgCmBgYAoKQWN0aW9ucyB0YWtlbiBieSBjb250aW5lbnRzIChpbnNwaXJlZCBieSBrbGx5Y3R0bikKYGBge3J9CmFjdGlvbnMgJT4lIGZpbHRlcihhY3Rpb25fdGFrZW49PSIxIikgJT4lIGdyb3VwX2J5KGNvbnRpbmVudCwgYWN0aW9uX3R5cGUpICU+JSB0YWxseSgpICU+JSBmaWx0ZXIoYWN0aW9uX3R5cGUgIT0nVW5rbm93bicpICU+JSBnZ3Bsb3QoYWVzKHg9biwgeT1hY3Rpb25fdHlwZSwgZmlsbD0gYWN0aW9uX3R5cGUpKSArIGdlb21fY29sKCkgKyBmYWNldF93cmFwKH5jb250aW5lbnQpICsgdGhlbWVfbWluaW1hbCgpICsgc2NhbGVfZmlsbF91Y2hpY2FnbygpICsgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJub25lIikgKyBsYWJzKHg9IiIsIHk9IiIpICsgdGhlbWUoCiAgICBwYW5lbC5ncmlkLm1ham9yLnggPSBlbGVtZW50X2JsYW5rKCksCiAgICBwYW5lbC5ib3JkZXIgPSBlbGVtZW50X2JsYW5rKCksCiAgICBheGlzLnRpY2tzLnggPSBlbGVtZW50X2JsYW5rKCksCiAgICBheGlzLnRpY2tzLnkgPSBlbGVtZW50X2JsYW5rKCksCiAgICBwYW5lbC5ncmlkLm1pbm9yLnggPSBlbGVtZW50X2JsYW5rKCksCiAgICBwYW5lbC5ncmlkLm1pbm9yLnkgPSBlbGVtZW50X2JsYW5rKCkKICApIApgYGAKClJlZCBsaXN0IGNhdGVnb3J5IGFjcm9zcyB0aGUgeWVhcnMgKGluc3BpcmVkIGJ5IGlhbWVyaWNmbGV0Y2hlcikgCmBgYHtyfQpwbGFudHMgJT4lIGZpbHRlcighaXMubmEoeWVhcl9sYXN0X3NlZW4pKSAlPiUgZ3JvdXBfYnkoeWVhcl9sYXN0X3NlZW4sIHJlZF9saXN0X2NhdGVnb3J5KSAlPiUgdGFsbHkoKSAlPiUgZ2dwbG90KGFlcyh4PSBmYWN0b3IoeWVhcl9sYXN0X3NlZW4sIGxldmVsID0gYygnQmVmb3JlIDE5MDAnLCcxOTAwLTE5MTknLCcxOTIwLTE5MzknLCAnMTk0MC0xOTU5JywnMTk2MC0xOTc5JywnMTk4MC0xOTk5JywnMjAwMC0yMDIwJykpLCB5ID0gbiwgZmlsbD0gcmVkX2xpc3RfY2F0ZWdvcnkpKSArIGdlb21fY29sKHBvc2l0aW9uPSJkb2RnZSIpICsgbGFicyh4PSIiKSArICBzY2FsZV9maWxsX21hbnVhbChuYW1lID0gIiIsIGxhYmVscyA9IGMoIkV4dGluY3QiLCAiRXh0bmN0IGluIHRoZSBXaWxkIiksIHZhbHVlcyA9IGMoIiM3ZDg1OTciLCAiI2FkMjgzMSIpKSArIGxhYnMoeD0iIiwgeT0iIiwgdGl0bGUgPSAiRXh0aW5jdCB2cyBFeHRpbmN0IGluIHRoZSBXaWxkIikgKyB0aGVtZV9saWdodCgpICsgdGhlbWUoCiAgICBwYW5lbC5ncmlkLm1ham9yLnggPSBlbGVtZW50X2JsYW5rKCksCiAgICBwYW5lbC5ib3JkZXIgPSBlbGVtZW50X2JsYW5rKCksCiAgICBheGlzLnRpY2tzLnggPSBlbGVtZW50X2JsYW5rKCksCiAgICBheGlzLnRpY2tzLnkgPSBlbGVtZW50X2JsYW5rKCksCiAgICBwYW5lbC5ncmlkLm1ham9yLnkgPSBlbGVtZW50X2JsYW5rKCksCiAgICBwYW5lbC5ncmlkLm1pbm9yLnggPSBlbGVtZW50X2JsYW5rKCksCiAgICBwYW5lbC5ncmlkLm1pbm9yLnkgPSBlbGVtZW50X2JsYW5rKCkKICApIApgYGAKCg==