setwd('C:\\Users\\momob\\OneDrive\\Desktop\\STAT400')
female <- read.csv('female.csv')
is.data.frame(female)
[1] TRUE
head(female)
library(tidyverse)
── Attaching core tidyverse packages ────────────────────────────── tidyverse 2.0.0 ──
✔ dplyr     1.1.4     ✔ readr     2.1.5
✔ forcats   1.0.0     ✔ stringr   1.5.1
✔ ggplot2   3.5.1     ✔ tibble    3.2.1
✔ lubridate 1.9.4     ✔ tidyr     1.3.1
✔ purrr     1.0.4     ── Conflicts ──────────────────────────────────────────────── tidyverse_conflicts() ──
✖ dplyr::filter() masks stats::filter()
✖ dplyr::lag()    masks stats::lag()
ℹ Use the ]8;;http://conflicted.r-lib.org/conflicted package]8;; to force all conflicts to become errors
female <- female %>%
  filter(Country.Name == "Brazil" | Country.Name == "India" | Country.Name == "United States")
head(female)
colnames(female)
 [1] "Series.Name"    "Series.Code"    "Country.Name"   "Country.Code"  
 [5] "X1990..YR1990." "X2000..YR2000." "X2014..YR2014." "X2015..YR2015."
 [9] "X2016..YR2016." "X2017..YR2017." "X2018..YR2018." "X2019..YR2019."
[13] "X2020..YR2020." "X2021..YR2021." "X2022..YR2022." "X2023..YR2023."
rel_col <- which(colnames(female)=="Country.Name" | colnames(female)== "X2014..YR2014." | colnames(female)== "X2017..YR2017." | colnames(female) == "X2021..YR2021." )
rel_col
[1]  3  7 10 14
female <- female[rel_col] %>% rename("2014" = 2, "2017" = 3, "2021" = 4)
head(female)
transpose_f <- data.frame(t(female[-1]))
colnames(transpose_f) <- female[, 1]
head(transpose_f)
print(sapply(transpose_f, class))
       Brazil         India United States 
  "character"   "character"   "character" 
transpose_f$Brazil = as.numeric(transpose_f$Brazil) 
transpose_f$India = as.numeric(transpose_f$India)
transpose_f$"United States" = as.numeric(transpose_f$"United States")
head(transpose_f)
summarise_each(transpose_f, list(mean))
Warning: `summarise_each()` was deprecated in dplyr 0.7.0.
Please use `across()` instead.
transpose_f %>%
  summarise(across(c(Brazil, India, "United States"), list(mean=mean, sd=sd)))
year <- c(2014, 2017,2021)
ggplot(data=transpose_f, aes(x=year, y=India, group=1)) +
  geom_line()+
  geom_point()

setwd('C:\\Users\\momob\\OneDrive\\Desktop\\STAT400')
male <- read.csv(file = "male.csv")
male <- male %>%
  filter(Country.Name == "Brazil" | Country.Name == "India" | Country.Name == "United States") 

male <- male[rel_col] %>% 
  rename("2014" = 2, "2017" = 3, "2021" = 4)

transpose_m <- data.frame(t(male[-1]))
colnames(transpose_m) <- male[, 1]

transpose_m$Brazil = as.numeric(as.character(transpose_m$Brazil)) 
transpose_m$India = as.numeric(as.character(transpose_m$India))
transpose_m$"United States" = as.numeric(as.character((transpose_m$"United States")))

head(transpose_m)
transpose_m <- rename(transpose_m, "Brazil_m" = 1, "India_m" = 2, "United_States_m" = 3)

head(transpose_m)
transpose_m <- rownames_to_column(transpose_m, var="Year") 
transpose_f <- rownames_to_column(transpose_f, var="Year")
acct_owner_by_gender <- merge(x = transpose_m, y = transpose_f, by = "Year", all.x = TRUE)
acct_owner_by_gender <- rename(acct_owner_by_gender, "United_States" = 7)
head(acct_owner_by_gender)
gfg_plot <- ggplot(acct_owner_by_gender, aes(x=year)) +  
    geom_line(aes(y = India), color = "black") +
    geom_line(aes(y = India_m), color = "red") +
    geom_line(aes(y = Brazil), color = "green") +
    geom_line(aes(y = Brazil_m), color = "blue") +
    geom_line(aes(y = United_States), color = "purple") +
    geom_line(aes(y = United_States_m), color = "violet") 
    
gfg_plot

Project 1 Question 1

gfg_plot <- ggplot(acct_owner_by_gender, aes(x=year)) +  
    geom_line(aes(y = India), color = "black") +
    geom_line(aes(y = India_m), color = "red") +
    geom_line(aes(y = Brazil), color = "green") +
    geom_line(aes(y = Brazil_m), color = "blue") +
    geom_line(aes(y = United_States), color = "purple") +
    geom_line(aes(y = United_States_m), color = "violet") +
    labs(y = "percentage ownership")
    
gfg_plot

Question 2: The ownership percentages appear to vary by country and gender. In the US, both males and females appear to stagnate. Males and females in Brazil both stagnated until 2018, where they were both strictly increasing at similar rates. India is an interesting case because while females strictly increased until 2017 where they plateaued, males actually began to decrease until 2021 where it was the same percentage ownership as females.

Question 3: Excluding India, both male and female account ownership percentages from all countries are either net positive or almost neutral by 2021. India itself is an interesting case though. From 2014 to 2017, India account ownership percentages were skyrocketing, with males having a higher baseline. Afterwards, account ownership percentages steadily decreased for both males and females, with males in particular decreasing far faster than females. In 2021, male percentages converged with female percentages.

Question 4:

setwd('C:\\Users\\momob\\OneDrive\\Desktop\\STAT400')
primary_ed <- read.csv('primary_ed.csv')
primary_ed <- primary_ed %>%
  filter(Country.Name == "United Kingdom" | Country.Name == "Armenia" | Country.Name == "Ghana" | Country.Name == "Albania" | Country.Name == "Finland")

rel_col <- which(colnames(primary_ed)=="Country.Name" | colnames(primary_ed)== "X2014..YR2014." | colnames(primary_ed)== "X2017..YR2017." | colnames(primary_ed) == "X2021..YR2021." )


primary_ed <- primary_ed[rel_col] %>% 
  rename("2014" = 2, "2017" = 3, "2021" = 4)

transpose_prim <- data.frame(t(primary_ed[-1]))
colnames(transpose_prim) <- primary_ed[, 1]

transpose_prim$"United Kingdom" <- as.numeric(as.character(transpose_prim$"United Kingdom"))
transpose_prim$Armenia <- as.numeric(as.character(transpose_prim$Armenia))
transpose_prim$Ghana <- as.numeric(as.character(transpose_prim$Ghana))
transpose_prim$Albania <- as.numeric(as.character(transpose_prim$Albania))
transpose_prim$Finland <- as.numeric(as.character(transpose_prim$Finland))


transpose_prim <- rename(transpose_prim, "United Kingdom_prim" = 1, "Armenia_prim" = 2, "Ghana_prim" = 3, "Albania_prim" = 4, "Finland_prim" = 5)

head(transpose_prim)
gfg_plot <- ggplot(transpose_prim, aes(x=year)) +  
    geom_line(aes(y = `United Kingdom_prim`), color = "black") +
    geom_line(aes(y = Armenia_prim), color = "red") +
    geom_line(aes(y = Ghana_prim), color = "green") +
    geom_line(aes(y = Albania_prim), color = "blue") +
    geom_line(aes(y = Finland_prim), color = "purple") +
    labs(y = "percentage ownership")
    
gfg_plot

setwd('C:\\Users\\momob\\OneDrive\\Desktop\\STAT400')
secondary_ed <- read.csv('secondary_ed.csv')

secondary_ed <- secondary_ed %>%
  filter(Country.Name == "United Kingdom" | Country.Name == "Armenia" | Country.Name == "Ghana" | Country.Name == "Albania" | Country.Name == "Finland")

secondary_ed <- secondary_ed[rel_col] %>%
  rename("2014" = 2, "2017" = 3, "2021" = 4)

transpose_sec <- data.frame(t(secondary_ed[-1]))
colnames(transpose_sec) <- secondary_ed[, 1]

transpose_sec$"United Kingdom" <- as.numeric(as.character(transpose_sec$"United Kingdom"))
transpose_sec$Armenia <- as.numeric(as.character(transpose_sec$Armenia))
transpose_sec$Ghana <- as.numeric(as.character(transpose_sec$Ghana))
transpose_sec$Albania <- as.numeric(as.character(transpose_sec$Albania))
transpose_sec$Finland <- as.numeric(as.character(transpose_sec$Finland))

transpose_sec <- rename(transpose_sec, "United Kingdom_sec" = 1, "Armenia_sec" = 2, "Ghana_sec" = 3, "Albania_sec" = 4, "Finland_sec" = 5)

head(transpose_sec)
gfg_plot <- ggplot(transpose_sec, aes(x=year)) +  
    geom_line(aes(y = `United Kingdom_sec`), color = "black") +
    geom_line(aes(y = Armenia_sec), color = "red") +
    geom_line(aes(y = Ghana_sec), color = "green") +
    geom_line(aes(y = Albania_sec), color = "blue") +
    geom_line(aes(y = Finland_sec), color = "purple") +
    labs(y = "percentage ownership")
    
gfg_plot

transpose_prim <- rownames_to_column(transpose_prim, var="Year") 
transpose_sec <- rownames_to_column(transpose_sec, var="Year")
acct_owner_by_education <- merge(x = transpose_prim, y = transpose_sec, by = "Year", all.x = TRUE)
acct_owner_by_education <- rename(acct_owner_by_education, "Finland_sec" = 11)
head(acct_owner_by_education)
gfg_plot <- ggplot(acct_owner_by_education, aes(x = year)) +   
    geom_line(aes(y = `United Kingdom_prim`), color = "black") +
    geom_line(aes(y = `United Kingdom_sec`), color = "red") +
    geom_line(aes(y = `Armenia_prim`), color = "green") +
    geom_line(aes(y = `Armenia_sec`), color = "blue") +
    geom_line(aes(y = Ghana_prim), color = "purple") +
    geom_line(aes(y = Ghana_sec), color = "violet") +
    geom_line(aes(y = Albania_prim), color = "orange") +
    geom_line(aes(y = Albania_sec), color = "pink") +
    geom_line(aes(y = Finland_prim), color = "brown") +
    geom_line(aes(y = Finland_sec), color = "yellow") +
    labs(y = "percentage ownership")

gfg_plot

Overall, the percentage of account owners with primary or secondary education for most countries either net positive or net neutral. The percentage of account holders in Ghana and Finland were similar no matter if they had primary or secondary education. The United Kingdom percentage ownership for primary educated people was significantly higher than secondary educated people. Armenia stood out as the biggest winners from 2014 to 2017, as percentage ownership for both primary and secondary educated people significantly increased from under 25% to close to 50%. However, after 2017, it stood more in line with other countries in that the rate of increased tapered off.

LS0tDQp0aXRsZTogIlNUQVQ0MDAgUHJvamVjdCAxIg0Kb3V0cHV0OiBodG1sX25vdGVib29rDQotLS0NCg0KYGBge3J9DQpzZXR3ZCgnQzpcXFVzZXJzXFxtb21vYlxcT25lRHJpdmVcXERlc2t0b3BcXFNUQVQ0MDAnKQ0KZmVtYWxlIDwtIHJlYWQuY3N2KCdmZW1hbGUuY3N2JykNCmlzLmRhdGEuZnJhbWUoZmVtYWxlKQ0KYGBgDQoNCmBgYHtyfQ0KaGVhZChmZW1hbGUpDQpgYGANCg0KYGBge3J9DQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCg0KZmVtYWxlIDwtIGZlbWFsZSAlPiUNCiAgZmlsdGVyKENvdW50cnkuTmFtZSA9PSAiQnJhemlsIiB8IENvdW50cnkuTmFtZSA9PSAiSW5kaWEiIHwgQ291bnRyeS5OYW1lID09ICJVbml0ZWQgU3RhdGVzIikNCmhlYWQoZmVtYWxlKQ0KYGBgDQoNCmBgYHtyfQ0KY29sbmFtZXMoZmVtYWxlKQ0KYGBgDQoNCmBgYHtyfQ0KcmVsX2NvbCA8LSB3aGljaChjb2xuYW1lcyhmZW1hbGUpPT0iQ291bnRyeS5OYW1lIiB8IGNvbG5hbWVzKGZlbWFsZSk9PSAiWDIwMTQuLllSMjAxNC4iIHwgY29sbmFtZXMoZmVtYWxlKT09ICJYMjAxNy4uWVIyMDE3LiIgfCBjb2xuYW1lcyhmZW1hbGUpID09ICJYMjAyMS4uWVIyMDIxLiIgKQ0KcmVsX2NvbA0KYGBgDQoNCmBgYHtyfQ0KZmVtYWxlIDwtIGZlbWFsZVtyZWxfY29sXSAlPiUgcmVuYW1lKCIyMDE0IiA9IDIsICIyMDE3IiA9IDMsICIyMDIxIiA9IDQpDQpoZWFkKGZlbWFsZSkNCmBgYA0KDQpgYGB7cn0NCnRyYW5zcG9zZV9mIDwtIGRhdGEuZnJhbWUodChmZW1hbGVbLTFdKSkNCmNvbG5hbWVzKHRyYW5zcG9zZV9mKSA8LSBmZW1hbGVbLCAxXQ0KaGVhZCh0cmFuc3Bvc2VfZikNCmBgYA0KDQpgYGB7cn0NCnByaW50KHNhcHBseSh0cmFuc3Bvc2VfZiwgY2xhc3MpKQ0KYGBgDQoNCmBgYHtyfQ0KdHJhbnNwb3NlX2YkQnJhemlsID0gYXMubnVtZXJpYyh0cmFuc3Bvc2VfZiRCcmF6aWwpIA0KdHJhbnNwb3NlX2YkSW5kaWEgPSBhcy5udW1lcmljKHRyYW5zcG9zZV9mJEluZGlhKQ0KdHJhbnNwb3NlX2YkIlVuaXRlZCBTdGF0ZXMiID0gYXMubnVtZXJpYyh0cmFuc3Bvc2VfZiQiVW5pdGVkIFN0YXRlcyIpDQpoZWFkKHRyYW5zcG9zZV9mKQ0KYGBgDQoNCmBgYHtyfQ0Kc3VtbWFyaXNlX2VhY2godHJhbnNwb3NlX2YsIGxpc3QobWVhbikpDQpgYGANCg0KYGBge3J9DQp0cmFuc3Bvc2VfZiAlPiUNCiAgc3VtbWFyaXNlKGFjcm9zcyhjKEJyYXppbCwgSW5kaWEsICJVbml0ZWQgU3RhdGVzIiksIGxpc3QobWVhbj1tZWFuLCBzZD1zZCkpKQ0KYGBgDQoNCmBgYHtyfQ0KeWVhciA8LSBjKDIwMTQsIDIwMTcsMjAyMSkNCmdncGxvdChkYXRhPXRyYW5zcG9zZV9mLCBhZXMoeD15ZWFyLCB5PUluZGlhLCBncm91cD0xKSkgKw0KICBnZW9tX2xpbmUoKSsNCiAgZ2VvbV9wb2ludCgpDQpgYGANCg0KYGBge3J9DQpzZXR3ZCgnQzpcXFVzZXJzXFxtb21vYlxcT25lRHJpdmVcXERlc2t0b3BcXFNUQVQ0MDAnKQ0KbWFsZSA8LSByZWFkLmNzdihmaWxlID0gIm1hbGUuY3N2IikNCm1hbGUgPC0gbWFsZSAlPiUNCiAgZmlsdGVyKENvdW50cnkuTmFtZSA9PSAiQnJhemlsIiB8IENvdW50cnkuTmFtZSA9PSAiSW5kaWEiIHwgQ291bnRyeS5OYW1lID09ICJVbml0ZWQgU3RhdGVzIikgDQoNCm1hbGUgPC0gbWFsZVtyZWxfY29sXSAlPiUgDQogIHJlbmFtZSgiMjAxNCIgPSAyLCAiMjAxNyIgPSAzLCAiMjAyMSIgPSA0KQ0KDQp0cmFuc3Bvc2VfbSA8LSBkYXRhLmZyYW1lKHQobWFsZVstMV0pKQ0KY29sbmFtZXModHJhbnNwb3NlX20pIDwtIG1hbGVbLCAxXQ0KDQp0cmFuc3Bvc2VfbSRCcmF6aWwgPSBhcy5udW1lcmljKGFzLmNoYXJhY3Rlcih0cmFuc3Bvc2VfbSRCcmF6aWwpKSANCnRyYW5zcG9zZV9tJEluZGlhID0gYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIodHJhbnNwb3NlX20kSW5kaWEpKQ0KdHJhbnNwb3NlX20kIlVuaXRlZCBTdGF0ZXMiID0gYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIoKHRyYW5zcG9zZV9tJCJVbml0ZWQgU3RhdGVzIikpKQ0KDQpoZWFkKHRyYW5zcG9zZV9tKQ0KYGBgDQpgYGB7cn0NCnRyYW5zcG9zZV9tIDwtIHJlbmFtZSh0cmFuc3Bvc2VfbSwgIkJyYXppbF9tIiA9IDEsICJJbmRpYV9tIiA9IDIsICJVbml0ZWRfU3RhdGVzX20iID0gMykNCg0KaGVhZCh0cmFuc3Bvc2VfbSkNCmBgYA0KDQpgYGB7cn0NCnRyYW5zcG9zZV9tIDwtIHJvd25hbWVzX3RvX2NvbHVtbih0cmFuc3Bvc2VfbSwgdmFyPSJZZWFyIikgDQp0cmFuc3Bvc2VfZiA8LSByb3duYW1lc190b19jb2x1bW4odHJhbnNwb3NlX2YsIHZhcj0iWWVhciIpDQphY2N0X293bmVyX2J5X2dlbmRlciA8LSBtZXJnZSh4ID0gdHJhbnNwb3NlX20sIHkgPSB0cmFuc3Bvc2VfZiwgYnkgPSAiWWVhciIsIGFsbC54ID0gVFJVRSkNCmFjY3Rfb3duZXJfYnlfZ2VuZGVyIDwtIHJlbmFtZShhY2N0X293bmVyX2J5X2dlbmRlciwgIlVuaXRlZF9TdGF0ZXMiID0gNykNCmhlYWQoYWNjdF9vd25lcl9ieV9nZW5kZXIpDQpgYGANCg0KYGBge3J9DQpnZmdfcGxvdCA8LSBnZ3Bsb3QoYWNjdF9vd25lcl9ieV9nZW5kZXIsIGFlcyh4PXllYXIpKSArICANCiAgICBnZW9tX2xpbmUoYWVzKHkgPSBJbmRpYSksIGNvbG9yID0gImJsYWNrIikgKw0KICAgIGdlb21fbGluZShhZXMoeSA9IEluZGlhX20pLCBjb2xvciA9ICJyZWQiKSArDQogICAgZ2VvbV9saW5lKGFlcyh5ID0gQnJhemlsKSwgY29sb3IgPSAiZ3JlZW4iKSArDQogICAgZ2VvbV9saW5lKGFlcyh5ID0gQnJhemlsX20pLCBjb2xvciA9ICJibHVlIikgKw0KICAgIGdlb21fbGluZShhZXMoeSA9IFVuaXRlZF9TdGF0ZXMpLCBjb2xvciA9ICJwdXJwbGUiKSArDQogICAgZ2VvbV9saW5lKGFlcyh5ID0gVW5pdGVkX1N0YXRlc19tKSwgY29sb3IgPSAidmlvbGV0IikgDQogICAgDQpnZmdfcGxvdA0KYGBgDQoNClByb2plY3QgMQ0KUXVlc3Rpb24gMQ0KYGBge3J9DQpnZmdfcGxvdCA8LSBnZ3Bsb3QoYWNjdF9vd25lcl9ieV9nZW5kZXIsIGFlcyh4PXllYXIpKSArICANCiAgICBnZW9tX2xpbmUoYWVzKHkgPSBJbmRpYSksIGNvbG9yID0gImJsYWNrIikgKw0KICAgIGdlb21fbGluZShhZXMoeSA9IEluZGlhX20pLCBjb2xvciA9ICJyZWQiKSArDQogICAgZ2VvbV9saW5lKGFlcyh5ID0gQnJhemlsKSwgY29sb3IgPSAiZ3JlZW4iKSArDQogICAgZ2VvbV9saW5lKGFlcyh5ID0gQnJhemlsX20pLCBjb2xvciA9ICJibHVlIikgKw0KICAgIGdlb21fbGluZShhZXMoeSA9IFVuaXRlZF9TdGF0ZXMpLCBjb2xvciA9ICJwdXJwbGUiKSArDQogICAgZ2VvbV9saW5lKGFlcyh5ID0gVW5pdGVkX1N0YXRlc19tKSwgY29sb3IgPSAidmlvbGV0IikgKw0KICAgIGxhYnMoeSA9ICJwZXJjZW50YWdlIG93bmVyc2hpcCIpDQogICAgDQpnZmdfcGxvdA0KDQpgYGANClF1ZXN0aW9uIDI6DQogIFRoZSBvd25lcnNoaXAgcGVyY2VudGFnZXMgYXBwZWFyIHRvIHZhcnkgYnkgY291bnRyeSBhbmQgZ2VuZGVyLiBJbiB0aGUgVVMsIGJvdGggbWFsZXMgYW5kIGZlbWFsZXMgYXBwZWFyIHRvIHN0YWduYXRlLiBNYWxlcyBhbmQgZmVtYWxlcyBpbiBCcmF6aWwgYm90aCBzdGFnbmF0ZWQgdW50aWwgMjAxOCwgd2hlcmUgdGhleSB3ZXJlIGJvdGggc3RyaWN0bHkgaW5jcmVhc2luZyBhdCBzaW1pbGFyIHJhdGVzLiBJbmRpYSBpcyBhbiBpbnRlcmVzdGluZyBjYXNlIGJlY2F1c2Ugd2hpbGUgZmVtYWxlcyBzdHJpY3RseSBpbmNyZWFzZWQgdW50aWwgMjAxNyB3aGVyZSB0aGV5IHBsYXRlYXVlZCwgbWFsZXMgYWN0dWFsbHkgYmVnYW4gdG8gZGVjcmVhc2UgdW50aWwgMjAyMSB3aGVyZSBpdCB3YXMgdGhlIHNhbWUgcGVyY2VudGFnZSBvd25lcnNoaXAgYXMgZmVtYWxlcy4NCiAgDQpRdWVzdGlvbiAzOg0KICBFeGNsdWRpbmcgSW5kaWEsIGJvdGggbWFsZSBhbmQgZmVtYWxlIGFjY291bnQgb3duZXJzaGlwIHBlcmNlbnRhZ2VzIGZyb20gYWxsIGNvdW50cmllcyBhcmUgZWl0aGVyIG5ldCBwb3NpdGl2ZSBvciBhbG1vc3QgbmV1dHJhbCBieSAyMDIxLiBJbmRpYSBpdHNlbGYgaXMgYW4gaW50ZXJlc3RpbmcgY2FzZSB0aG91Z2guIEZyb20gMjAxNCB0byAyMDE3LCBJbmRpYSBhY2NvdW50IG93bmVyc2hpcCBwZXJjZW50YWdlcyB3ZXJlIHNreXJvY2tldGluZywgd2l0aCBtYWxlcyBoYXZpbmcgYSBoaWdoZXIgYmFzZWxpbmUuIEFmdGVyd2FyZHMsIGFjY291bnQgb3duZXJzaGlwIHBlcmNlbnRhZ2VzIHN0ZWFkaWx5IGRlY3JlYXNlZCBmb3IgYm90aCBtYWxlcyBhbmQgZmVtYWxlcywgd2l0aCBtYWxlcyBpbiBwYXJ0aWN1bGFyIGRlY3JlYXNpbmcgZmFyIGZhc3RlciB0aGFuIGZlbWFsZXMuIEluIDIwMjEsIG1hbGUgcGVyY2VudGFnZXMgY29udmVyZ2VkIHdpdGggZmVtYWxlIHBlcmNlbnRhZ2VzLg0KICANClF1ZXN0aW9uIDQ6DQoNCmBgYHtyfQ0Kc2V0d2QoJ0M6XFxVc2Vyc1xcbW9tb2JcXE9uZURyaXZlXFxEZXNrdG9wXFxTVEFUNDAwJykNCnByaW1hcnlfZWQgPC0gcmVhZC5jc3YoJ3ByaW1hcnlfZWQuY3N2JykNCnByaW1hcnlfZWQgPC0gcHJpbWFyeV9lZCAlPiUNCiAgZmlsdGVyKENvdW50cnkuTmFtZSA9PSAiVW5pdGVkIEtpbmdkb20iIHwgQ291bnRyeS5OYW1lID09ICJBcm1lbmlhIiB8IENvdW50cnkuTmFtZSA9PSAiR2hhbmEiIHwgQ291bnRyeS5OYW1lID09ICJBbGJhbmlhIiB8IENvdW50cnkuTmFtZSA9PSAiRmlubGFuZCIpDQoNCnJlbF9jb2wgPC0gd2hpY2goY29sbmFtZXMocHJpbWFyeV9lZCk9PSJDb3VudHJ5Lk5hbWUiIHwgY29sbmFtZXMocHJpbWFyeV9lZCk9PSAiWDIwMTQuLllSMjAxNC4iIHwgY29sbmFtZXMocHJpbWFyeV9lZCk9PSAiWDIwMTcuLllSMjAxNy4iIHwgY29sbmFtZXMocHJpbWFyeV9lZCkgPT0gIlgyMDIxLi5ZUjIwMjEuIiApDQoNCg0KcHJpbWFyeV9lZCA8LSBwcmltYXJ5X2VkW3JlbF9jb2xdICU+JSANCiAgcmVuYW1lKCIyMDE0IiA9IDIsICIyMDE3IiA9IDMsICIyMDIxIiA9IDQpDQoNCnRyYW5zcG9zZV9wcmltIDwtIGRhdGEuZnJhbWUodChwcmltYXJ5X2VkWy0xXSkpDQpjb2xuYW1lcyh0cmFuc3Bvc2VfcHJpbSkgPC0gcHJpbWFyeV9lZFssIDFdDQoNCnRyYW5zcG9zZV9wcmltJCJVbml0ZWQgS2luZ2RvbSIgPC0gYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIodHJhbnNwb3NlX3ByaW0kIlVuaXRlZCBLaW5nZG9tIikpDQp0cmFuc3Bvc2VfcHJpbSRBcm1lbmlhIDwtIGFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKHRyYW5zcG9zZV9wcmltJEFybWVuaWEpKQ0KdHJhbnNwb3NlX3ByaW0kR2hhbmEgPC0gYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIodHJhbnNwb3NlX3ByaW0kR2hhbmEpKQ0KdHJhbnNwb3NlX3ByaW0kQWxiYW5pYSA8LSBhcy5udW1lcmljKGFzLmNoYXJhY3Rlcih0cmFuc3Bvc2VfcHJpbSRBbGJhbmlhKSkNCnRyYW5zcG9zZV9wcmltJEZpbmxhbmQgPC0gYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIodHJhbnNwb3NlX3ByaW0kRmlubGFuZCkpDQoNCg0KdHJhbnNwb3NlX3ByaW0gPC0gcmVuYW1lKHRyYW5zcG9zZV9wcmltLCAiVW5pdGVkIEtpbmdkb21fcHJpbSIgPSAxLCAiQXJtZW5pYV9wcmltIiA9IDIsICJHaGFuYV9wcmltIiA9IDMsICJBbGJhbmlhX3ByaW0iID0gNCwgIkZpbmxhbmRfcHJpbSIgPSA1KQ0KDQpoZWFkKHRyYW5zcG9zZV9wcmltKQ0KYGBgDQoNCmBgYHtyfQ0KZ2ZnX3Bsb3QgPC0gZ2dwbG90KHRyYW5zcG9zZV9wcmltLCBhZXMoeD15ZWFyKSkgKyAgDQogICAgZ2VvbV9saW5lKGFlcyh5ID0gYFVuaXRlZCBLaW5nZG9tX3ByaW1gKSwgY29sb3IgPSAiYmxhY2siKSArDQogICAgZ2VvbV9saW5lKGFlcyh5ID0gQXJtZW5pYV9wcmltKSwgY29sb3IgPSAicmVkIikgKw0KICAgIGdlb21fbGluZShhZXMoeSA9IEdoYW5hX3ByaW0pLCBjb2xvciA9ICJncmVlbiIpICsNCiAgICBnZW9tX2xpbmUoYWVzKHkgPSBBbGJhbmlhX3ByaW0pLCBjb2xvciA9ICJibHVlIikgKw0KICAgIGdlb21fbGluZShhZXMoeSA9IEZpbmxhbmRfcHJpbSksIGNvbG9yID0gInB1cnBsZSIpICsNCiAgICBsYWJzKHkgPSAicGVyY2VudGFnZSBvd25lcnNoaXAiKQ0KICAgIA0KZ2ZnX3Bsb3QNCmBgYA0KDQpgYGB7cn0NCnNldHdkKCdDOlxcVXNlcnNcXG1vbW9iXFxPbmVEcml2ZVxcRGVza3RvcFxcU1RBVDQwMCcpDQpzZWNvbmRhcnlfZWQgPC0gcmVhZC5jc3YoJ3NlY29uZGFyeV9lZC5jc3YnKQ0KDQpzZWNvbmRhcnlfZWQgPC0gc2Vjb25kYXJ5X2VkICU+JQ0KICBmaWx0ZXIoQ291bnRyeS5OYW1lID09ICJVbml0ZWQgS2luZ2RvbSIgfCBDb3VudHJ5Lk5hbWUgPT0gIkFybWVuaWEiIHwgQ291bnRyeS5OYW1lID09ICJHaGFuYSIgfCBDb3VudHJ5Lk5hbWUgPT0gIkFsYmFuaWEiIHwgQ291bnRyeS5OYW1lID09ICJGaW5sYW5kIikNCg0Kc2Vjb25kYXJ5X2VkIDwtIHNlY29uZGFyeV9lZFtyZWxfY29sXSAlPiUNCiAgcmVuYW1lKCIyMDE0IiA9IDIsICIyMDE3IiA9IDMsICIyMDIxIiA9IDQpDQoNCnRyYW5zcG9zZV9zZWMgPC0gZGF0YS5mcmFtZSh0KHNlY29uZGFyeV9lZFstMV0pKQ0KY29sbmFtZXModHJhbnNwb3NlX3NlYykgPC0gc2Vjb25kYXJ5X2VkWywgMV0NCg0KdHJhbnNwb3NlX3NlYyQiVW5pdGVkIEtpbmdkb20iIDwtIGFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKHRyYW5zcG9zZV9zZWMkIlVuaXRlZCBLaW5nZG9tIikpDQp0cmFuc3Bvc2Vfc2VjJEFybWVuaWEgPC0gYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIodHJhbnNwb3NlX3NlYyRBcm1lbmlhKSkNCnRyYW5zcG9zZV9zZWMkR2hhbmEgPC0gYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIodHJhbnNwb3NlX3NlYyRHaGFuYSkpDQp0cmFuc3Bvc2Vfc2VjJEFsYmFuaWEgPC0gYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIodHJhbnNwb3NlX3NlYyRBbGJhbmlhKSkNCnRyYW5zcG9zZV9zZWMkRmlubGFuZCA8LSBhcy5udW1lcmljKGFzLmNoYXJhY3Rlcih0cmFuc3Bvc2Vfc2VjJEZpbmxhbmQpKQ0KDQp0cmFuc3Bvc2Vfc2VjIDwtIHJlbmFtZSh0cmFuc3Bvc2Vfc2VjLCAiVW5pdGVkIEtpbmdkb21fc2VjIiA9IDEsICJBcm1lbmlhX3NlYyIgPSAyLCAiR2hhbmFfc2VjIiA9IDMsICJBbGJhbmlhX3NlYyIgPSA0LCAiRmlubGFuZF9zZWMiID0gNSkNCg0KaGVhZCh0cmFuc3Bvc2Vfc2VjKQ0KYGBgDQoNCmBgYHtyfQ0KZ2ZnX3Bsb3QgPC0gZ2dwbG90KHRyYW5zcG9zZV9zZWMsIGFlcyh4PXllYXIpKSArICANCiAgICBnZW9tX2xpbmUoYWVzKHkgPSBgVW5pdGVkIEtpbmdkb21fc2VjYCksIGNvbG9yID0gImJsYWNrIikgKw0KICAgIGdlb21fbGluZShhZXMoeSA9IEFybWVuaWFfc2VjKSwgY29sb3IgPSAicmVkIikgKw0KICAgIGdlb21fbGluZShhZXMoeSA9IEdoYW5hX3NlYyksIGNvbG9yID0gImdyZWVuIikgKw0KICAgIGdlb21fbGluZShhZXMoeSA9IEFsYmFuaWFfc2VjKSwgY29sb3IgPSAiYmx1ZSIpICsNCiAgICBnZW9tX2xpbmUoYWVzKHkgPSBGaW5sYW5kX3NlYyksIGNvbG9yID0gInB1cnBsZSIpICsNCiAgICBsYWJzKHkgPSAicGVyY2VudGFnZSBvd25lcnNoaXAiKQ0KICAgIA0KZ2ZnX3Bsb3QNCmBgYA0KDQpgYGB7cn0NCnRyYW5zcG9zZV9wcmltIDwtIHJvd25hbWVzX3RvX2NvbHVtbih0cmFuc3Bvc2VfcHJpbSwgdmFyPSJZZWFyIikgDQp0cmFuc3Bvc2Vfc2VjIDwtIHJvd25hbWVzX3RvX2NvbHVtbih0cmFuc3Bvc2Vfc2VjLCB2YXI9IlllYXIiKQ0KYWNjdF9vd25lcl9ieV9lZHVjYXRpb24gPC0gbWVyZ2UoeCA9IHRyYW5zcG9zZV9wcmltLCB5ID0gdHJhbnNwb3NlX3NlYywgYnkgPSAiWWVhciIsIGFsbC54ID0gVFJVRSkNCmBgYA0KDQpgYGB7cn0NCmhlYWQoYWNjdF9vd25lcl9ieV9lZHVjYXRpb24pDQpgYGANCg0KYGBge3J9DQpnZmdfcGxvdCA8LSBnZ3Bsb3QoYWNjdF9vd25lcl9ieV9lZHVjYXRpb24sIGFlcyh4ID0geWVhcikpICsgICANCiAgICBnZW9tX2xpbmUoYWVzKHkgPSBgVW5pdGVkIEtpbmdkb21fcHJpbWApLCBjb2xvciA9ICJibGFjayIpICsNCiAgICBnZW9tX2xpbmUoYWVzKHkgPSBgVW5pdGVkIEtpbmdkb21fc2VjYCksIGNvbG9yID0gInJlZCIpICsNCiAgICBnZW9tX2xpbmUoYWVzKHkgPSBgQXJtZW5pYV9wcmltYCksIGNvbG9yID0gImdyZWVuIikgKw0KICAgIGdlb21fbGluZShhZXMoeSA9IGBBcm1lbmlhX3NlY2ApLCBjb2xvciA9ICJibHVlIikgKw0KICAgIGdlb21fbGluZShhZXMoeSA9IEdoYW5hX3ByaW0pLCBjb2xvciA9ICJwdXJwbGUiKSArDQogICAgZ2VvbV9saW5lKGFlcyh5ID0gR2hhbmFfc2VjKSwgY29sb3IgPSAidmlvbGV0IikgKw0KICAgIGdlb21fbGluZShhZXMoeSA9IEFsYmFuaWFfcHJpbSksIGNvbG9yID0gIm9yYW5nZSIpICsNCiAgICBnZW9tX2xpbmUoYWVzKHkgPSBBbGJhbmlhX3NlYyksIGNvbG9yID0gInBpbmsiKSArDQogICAgZ2VvbV9saW5lKGFlcyh5ID0gRmlubGFuZF9wcmltKSwgY29sb3IgPSAiYnJvd24iKSArDQogICAgZ2VvbV9saW5lKGFlcyh5ID0gRmlubGFuZF9zZWMpLCBjb2xvciA9ICJ5ZWxsb3ciKSArDQogICAgbGFicyh5ID0gInBlcmNlbnRhZ2Ugb3duZXJzaGlwIikNCg0KZ2ZnX3Bsb3QNCmBgYA0KT3ZlcmFsbCwgdGhlIHBlcmNlbnRhZ2Ugb2YgYWNjb3VudCBvd25lcnMgd2l0aCBwcmltYXJ5IG9yIHNlY29uZGFyeSBlZHVjYXRpb24gZm9yIG1vc3QgY291bnRyaWVzIGVpdGhlciBuZXQgcG9zaXRpdmUgb3IgbmV0IG5ldXRyYWwuIFRoZSBwZXJjZW50YWdlIG9mIGFjY291bnQgaG9sZGVycyBpbiBHaGFuYSBhbmQgRmlubGFuZCB3ZXJlIHNpbWlsYXIgbm8gbWF0dGVyIGlmIHRoZXkgaGFkIHByaW1hcnkgb3Igc2Vjb25kYXJ5IGVkdWNhdGlvbi4gVGhlIFVuaXRlZCBLaW5nZG9tIHBlcmNlbnRhZ2Ugb3duZXJzaGlwIGZvciBwcmltYXJ5IGVkdWNhdGVkIHBlb3BsZSB3YXMgc2lnbmlmaWNhbnRseSBoaWdoZXIgdGhhbiBzZWNvbmRhcnkgZWR1Y2F0ZWQgcGVvcGxlLiBBcm1lbmlhIHN0b29kIG91dCBhcyB0aGUgYmlnZ2VzdCB3aW5uZXJzIGZyb20gMjAxNCB0byAyMDE3LCBhcyBwZXJjZW50YWdlIG93bmVyc2hpcCBmb3IgYm90aCBwcmltYXJ5IGFuZCBzZWNvbmRhcnkgZWR1Y2F0ZWQgcGVvcGxlIHNpZ25pZmljYW50bHkgaW5jcmVhc2VkIGZyb20gdW5kZXIgMjUlIHRvIGNsb3NlIHRvIDUwJS4gSG93ZXZlciwgYWZ0ZXIgMjAxNywgaXQgc3Rvb2QgbW9yZSBpbiBsaW5lIHdpdGggb3RoZXIgY291bnRyaWVzIGluIHRoYXQgdGhlIHJhdGUgb2YgaW5jcmVhc2VkIHRhcGVyZWQgb2ZmLg==