Descriptives
Descriptive table by
gender
# flattening time-varying variables (basepay)
columns <- c("F: 1%", "F: 99%", "F: Mean", "F: SD", "M: 1%", "M: 99%", "M: Mean", "M: SD")
rows <- c("Real monthly pay", "Log real monthly pay", "Transition year", "Transition experienced","Time" , "PhD Discipline", "Health sciences", "Social sciences", "Natural sciences and mathematics", "Engineering", "Humanities", "Child under 5", "Log monthly contract hours", "Temporary contract", "PhD cohort", "PhD satisfaction", "Sector", "For-profit", "Government", "Non-profit", "Other job", "Break in Dutch employment", "Period abroad", "Partnered", "Time at transition", "N individuals", "N observations")
t1 <- data.frame(matrix(nrow=length(rows), ncol=length(columns)))
colnames(t1) <- columns
rownames(t1) <- rows
df_mmfc %>%
group_by(gender) %>%
summarize(across(c(realpay_corr2, log_realpay, t, log_hrs, phd_coh, phd_sat, break_job, abroad_time),
list(p1 = ~quantile(.x, 0.01), p99 = ~quantile(.x, 0.99), mean = mean, sd=sd),
.names = "{.col}-{.fn}")) %>%
pivot_longer(
cols = -gender,
names_to = c("variable", "statistic"),
names_sep = "-"
) %>%
pivot_wider(
names_from = statistic,
values_from = value
) -> t1_contin
df_mmfc %>% filter(gender=="women") -> df_wom
df_mmfc %>% filter(gender=="men") -> df_men
# check if 1% and 99% of dummies is indeed 0/1
# c(quantile(df_men$trans_lt, 0.01), quantile(df_men$trans_lt, 0.99))
# c(quantile(df_men$trans_st, 0.01), quantile(df_men$trans_st, 0.99))
# c(quantile(df_men$child_u5, 0.01), quantile(df_men$child_u5, 0.99))
# c(quantile(df_men$temporary_emp, 0.01), quantile(df_men$temporary_emp, 0.99))
# c(quantile(df_men$sector_forpr, 0.01), quantile(df_men$sector_forpr, 0.99))
# c(quantile(df_men$sector_gov, 0.01), quantile(df_men$sector_gov, 0.99))
# c(quantile(df_men$sector_nonpr, 0.01), quantile(df_men$sector_nonpr, 0.99))
# c(quantile(df_men$otherjob, 0.01), quantile(df_men$otherjob, 0.99))
# c(quantile(df_men$partnered, 0.01), quantile(df_men$partnered, 0.99))
# c(quantile(df_wom$trans_lt, 0.01), quantile(df_wom$trans_lt, 0.99))
# c(quantile(df_wom$trans_st, 0.01), quantile(df_wom$trans_st, 0.99))
# c(quantile(df_wom$child_u5, 0.01), quantile(df_wom$child_u5, 0.99))
# c(quantile(df_wom$temporary_emp, 0.01), quantile(df_wom$temporary_emp, 0.99))
# c(quantile(df_wom$sector_forpr, 0.01), quantile(df_wom$sector_forpr, 0.99))
# c(quantile(df_wom$sector_gov, 0.01), quantile(df_wom$sector_gov, 0.99))
# c(quantile(df_wom$sector_nonpr, 0.01), quantile(df_wom$sector_nonpr, 0.99))
# c(quantile(df_wom$otherjob, 0.01), quantile(df_wom$otherjob, 0.99))
# c(quantile(df_wom$partnered, 0.01), quantile(df_wom$partnered, 0.99))
# it is!
t1[c(3,4,7:12,14,18:21,24),1] <- rep(0.0001, times=length(t1[c(3,4,7:12,14,18:21,24),1]))
t1[c(3,4,7:12,14,18:21,24),2] <- rep(1.0001, times=length(t1[c(3,4,7:12,14,18:21,24),2]))
t1[c(3,4,7:12,14,18:21,24),5] <- rep(0.0001, times=length(t1[c(3,4,7:12,14,18:21,24),5]))
t1[c(3,4,7:12,14,18:21,24),6] <- rep(1.0001, times=length(t1[c(3,4,7:12,14,18:21,24),6]))
# time at transition
df_wom %>% filter(trans_st==1) -> womtrans
df_men %>% filter(trans_st==1) -> mentrans
# women
t1[c(1:2),c(1:4)] <- t1_contin[c(9:10),c(3:6)] # pay
t1[3,3] <- mean(df_wom$trans_st)
t1[4,3] <- mean(df_wom$trans_lt)
t1[5,c(1:4)] <- t1_contin[11, c(3:6)] # time
t1[c(7:11),3]<- round(prop.table(table(df_wom$phd_disci)), digits=2)[c(1:5)] # disci
t1[12,3] <- mean(df_wom$child_u5)
t1[13,c(1:4)] <- t1_contin[12, c(3:6)] # contract hours
t1[14,3] <- mean(df_wom$temporary_emp)
t1[c(15:16),c(1:4)] <- t1_contin[c(13:14),c(3:6)] # phd cohort, satis
t1[18, 3] <- mean(df_wom$sector_forpr)
t1[19, 3] <- mean(df_wom$sector_gov)
t1[20, 3] <- mean(df_wom$sector_nonpr)
t1[21, 3] <- mean(df_wom$otherjob)
t1[c(22:23),c(1:4)] <- t1_contin[c(15:16), c(3:6)] # break job, abroad
t1[24, 3] <- mean(df_wom$partnered)
t1[25, 1] <- quantile(womtrans$t, 0.01)
t1[25, 2] <- quantile(womtrans$t, 0.99)
t1[25, 3] <- mean(womtrans$t)
t1[25, 4] <- sd(womtrans$t)
t1[26, 3] <- nrow(df_wom[!duplicated(df_wom$RINPERSOON),])
t1[27, 3] <- nrow(df_wom)
# men
t1[c(1:2),c(5:8)] <- t1_contin[c(1:2),c(3:6)] # pay
t1[3,7] <- mean(df_men$trans_st)
t1[4,7] <- mean(df_men$trans_lt)
t1[5,c(5:8)] <- t1_contin[3, c(3:6)] # time
t1[c(7:11),7]<- round(prop.table(table(df_men$phd_disci)), digits=2)[c(1:5)] # disci
t1[12,7] <- mean(df_men$child_u5)
t1[13,c(5:8)] <- t1_contin[4, c(3:6)] # contract hours
t1[14,7] <- mean(df_men$temporary_emp)
t1[c(15:16),c(5:8)] <- t1_contin[c(5:6),c(3:6)] # phd cohort, satis
t1[18, 7] <- mean(df_men$sector_forpr)
t1[19, 7] <- mean(df_men$sector_gov)
t1[20, 7] <- mean(df_men$sector_nonpr)
t1[21, 7] <- mean(df_men$otherjob)
t1[c(22:23),c(5:8)] <- t1_contin[c(7:8), c(3:6)] # break job, abroad
t1[24, 7] <- mean(df_men$partnered)
t1[25, 5] <- quantile(mentrans$t, 0.01)
t1[25, 6] <- quantile(mentrans$t, 0.99)
t1[25, 7] <- mean(mentrans$t)
t1[25, 8] <- sd(mentrans$t)
t1[26, 7] <- nrow(df_men[!duplicated(df_men$RINPERSOON),])
t1[27, 7] <- nrow(df_men)
t1[c(1:25),] <- round(t1[c(1:25),], digits=2)
t1[c(26:27),] <- abs(t1[c(26:27),])
t1[26,] <- round(abs(t1[26,]), digits=0)
t1[27,] <- round(abs(t1[27,]), digits=0)
t1[is.na(t1)] <- ""
Descriptives_Table <- t1
write.csv(t1, file="F:/GPE_salaris/R&R/descriptive_tab.csv")
Table1 <- read.csv(file="Table1.csv", header=TRUE, check.names=FALSE)
Table1[is.na(Table1)] <- ""
kable(Table1, caption = "<b>Table 1: descriptive statistics for all variables used in our analyses, split out for men and women</b>") %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive"))
Table 1: descriptive statistics for all variables used in our
analyses, split out for men and women
|
|
F: 1%
|
F: 99%
|
F: Mean
|
F: SD
|
M: 1%
|
M: 99%
|
M: Mean
|
M: SD
|
|
Real monthly pay
|
1085.08
|
15324.76
|
4867.1
|
2776.15
|
1441.4
|
17133.96
|
5529.32
|
3187.54
|
|
Log real monthly pay
|
6.99
|
9.64
|
8.36
|
0.52
|
7.27
|
9.75
|
8.48
|
0.51
|
|
Transition year
|
0
|
1
|
0.05
|
|
0
|
1
|
0.05
|
|
|
Transition experienced
|
0
|
1
|
0.32
|
|
0
|
1
|
0.35
|
|
|
Time
|
0
|
16
|
5.91
|
4.26
|
0
|
16
|
6.25
|
4.39
|
|
PhD Discipline
|
|
|
|
|
|
|
|
|
|
Health sciences
|
0
|
1
|
0.43
|
|
0
|
1
|
0.27
|
|
|
Social sciences
|
0
|
1
|
0.31
|
|
0
|
1
|
0.23
|
|
|
Natural sciences and mathematics
|
0
|
1
|
0.16
|
|
0
|
1
|
0.29
|
|
|
Engineering
|
0
|
1
|
0.05
|
|
0
|
1
|
0.14
|
|
|
Humanities
|
0
|
1
|
0.06
|
|
0
|
1
|
0.06
|
|
|
Child under 5
|
0
|
1
|
0.33
|
|
0
|
1
|
0.32
|
|
|
Log monthly contract hours
|
3.56
|
5.29
|
4.93
|
0.29
|
4.13
|
5.29
|
5.02
|
0.22
|
|
Temporary contract
|
0
|
1
|
0.39
|
|
0
|
1
|
0.34
|
|
|
PhD cohort
|
0
|
12
|
4.51
|
3.11
|
0
|
11
|
3.9
|
2.93
|
|
PhD satisfaction
|
2.12
|
4
|
3.14
|
0.38
|
2.25
|
4
|
3.22
|
0.37
|
|
Sector
|
|
|
|
|
|
|
|
|
|
For-profit
|
0
|
1
|
0.38
|
|
0
|
1
|
0.42
|
|
|
Government
|
0
|
1
|
0.48
|
|
0
|
1
|
0.48
|
|
|
Non-profit
|
0
|
1
|
0.14
|
|
0
|
1
|
0.1
|
|
|
Other job
|
0
|
1
|
0.06
|
|
0
|
1
|
0.06
|
|
|
Break in Dutch employment
|
0
|
16.99
|
0.9
|
4.83
|
0
|
16.46
|
0.84
|
4.78
|
|
Period abroad
|
0
|
0
|
0.43
|
6.52
|
0
|
24.31
|
0.78
|
7.97
|
|
Partnered
|
0
|
1
|
0.5
|
|
0
|
1
|
0.58
|
|
|
Time at transition
|
1
|
14
|
3.97
|
3.13
|
1
|
13.54
|
3.59
|
3.04
|
|
N individuals
|
|
|
2298
|
|
|
|
2278
|
|
|
N observations
|
|
|
23903
|
|
|
|
24883
|
|
Robustness: descriptive
statistics of people who go abroad after their PhD
load(file="H:/processed_data/abroadafterphd_long.rda")
levels(as.factor(abroadafterphd_long$phd_disci))
abroadafterphd_long$phd_disci <- factor(abroadafterphd_long$phd_disci, levels=c("Health sciences", "Social sciences", "Natural sciences and mathematics", "Engineering", "Humanities"))
abroadafterphd_long <- abroadafterphd_long %>%
mutate(gender = ifelse(gender==1, "men", "women"))
abroadafterphd_long$gender <- factor(abroadafterphd_long$gender, levels=c("men", "women"))
# removing missings
nrow(abroadafterphd_long[!duplicated(abroadafterphd_long$RINPERSOON),]) # 353
abroadafterphd_long %>%
filter(!is.na(phd_sat)) %>%
filter(!is.na(temporary_emp)) %>%
filter(!is.na(sect_adj)) -> abroadafterphd_long
nrow(abroadafterphd_long[!duplicated(abroadafterphd_long$RINPERSOON),]) # 352
# flattening time-varying variables (basepay)
columns <- c("F: 1%", "F: 99%", "F: Mean", "F: SD", "M: 1%", "M: 99%", "M: Mean", "M: SD")
rows <- c("Real monthly pay", "Log real monthly pay", "Transition year", "Transition experienced","Time" , "PhD Discipline", "Health sciences", "Social sciences", "Natural sciences and mathematics", "Engineering", "Humanities", "Child under 5", "Log monthly contract hours", "Temporary contract", "PhD cohort", "PhD satisfaction", "Sector", "For-profit", "Government", "Non-profit", "Other job", "Break in Dutch employment", "Period abroad", "Partnered", "Time at transition", "N individuals", "N observations")
t1_abroad <- data.frame(matrix(nrow=length(rows), ncol=length(columns)))
colnames(t1_abroad) <- columns
rownames(t1_abroad) <- rows
abroadafterphd_long %>%
group_by(gender) %>%
summarize(across(c(realpay_corr2, log_realpay, t, basehours_month, phd_coh, phd_sat, break_job, abroad_time),
list(p1 = ~quantile(.x, 0.01), p99 = ~quantile(.x, 0.99), mean = mean, sd=sd),
.names = "{.col}-{.fn}")) %>%
pivot_longer(
cols = -gender,
names_to = c("variable", "statistic"),
names_sep = "-"
) %>%
pivot_wider(
names_from = statistic,
values_from = value
) -> t1_abroad_contin
abroadafterphd_long %>% filter(gender=="women") -> df_wom
abroadafterphd_long %>% filter(gender=="men") -> df_men
# check if 1% and 99% of dummies is indeed 0/1
# c(quantile(df_men$trans_lt, 0.01), quantile(df_men$trans_lt, 0.99))
# c(quantile(df_men$trans_st, 0.01), quantile(df_men$trans_st, 0.99))
# c(quantile(df_men$child_u5, 0.01), quantile(df_men$child_u5, 0.99))
# c(quantile(df_men$temporary_emp, 0.01), quantile(df_men$temporary_emp, 0.99))
# c(quantile(df_men$sector_forpr, 0.01), quantile(df_men$sector_forpr, 0.99))
# c(quantile(df_men$sector_gov, 0.01), quantile(df_men$sector_gov, 0.99))
# c(quantile(df_men$sector_nonpr, 0.01), quantile(df_men$sector_nonpr, 0.99))
# c(quantile(df_men$otherjob, 0.01), quantile(df_men$otherjob, 0.99))
# c(quantile(df_men$partnered, 0.01), quantile(df_men$partnered, 0.99))
# c(quantile(df_wom$trans_lt, 0.01), quantile(df_wom$trans_lt, 0.99))
# c(quantile(df_wom$trans_st, 0.01), quantile(df_wom$trans_st, 0.99))
# c(quantile(df_wom$child_u5, 0.01), quantile(df_wom$child_u5, 0.99))
# c(quantile(df_wom$temporary_emp, 0.01), quantile(df_wom$temporary_emp, 0.99))
# c(quantile(df_wom$sector_forpr, 0.01), quantile(df_wom$sector_forpr, 0.99))
# c(quantile(df_wom$sector_gov, 0.01), quantile(df_wom$sector_gov, 0.99))
# c(quantile(df_wom$sector_nonpr, 0.01), quantile(df_wom$sector_nonpr, 0.99))
# c(quantile(df_wom$otherjob, 0.01), quantile(df_wom$otherjob, 0.99))
# c(quantile(df_wom$partnered, 0.01), quantile(df_wom$partnered, 0.99))
# it is!
t1_abroad[c(3,4,7:12,14,18:21,24),1] <- rep(0.0001, times=length(t1_abroad[c(3,4,7:12,14,18:21,24),1]))
t1_abroad[c(3,4,7:12,14,18:21,24),2] <- rep(1.0001, times=length(t1_abroad[c(3,4,7:12,14,18:21,24),2]))
t1_abroad[c(3,4,7:12,14,18:21,24),5] <- rep(0.0001, times=length(t1_abroad[c(3,4,7:12,14,18:21,24),5]))
t1_abroad[c(3,4,7:12,14,18:21,24),6] <- rep(1.0001, times=length(t1_abroad[c(3,4,7:12,14,18:21,24),6]))
# time at transition
df_wom %>% filter(trans_st==1) -> womtrans
df_men %>% filter(trans_st==1) -> mentrans
# women
t1_abroad[c(1:2),c(1:4)] <- t1_abroad_contin[c(9:10),c(3:6)] # pay
t1_abroad[3,3] <- mean(df_wom$trans_st)
t1_abroad[4,3] <- mean(df_wom$trans_lt)
t1_abroad[5,c(1:4)] <- t1_abroad_contin[11, c(3:6)] # time
t1_abroad[c(7:11),3]<- round(prop.table(table(df_wom$phd_disci)), digits=2)[c(1:5)] # disci
t1_abroad[12,3] <- mean(df_wom$child_u5)
t1_abroad[13,c(1:4)] <- t1_abroad_contin[12, c(3:6)] # contract hours
t1_abroad[14,3] <- mean(df_wom$temporary_emp)
t1_abroad[c(15:16),c(1:4)] <- t1_abroad_contin[c(13:14),c(3:6)] # phd cohort, satis
t1_abroad[18, 3] <- mean(df_wom$sector_forpr)
t1_abroad[19, 3] <- mean(df_wom$sector_gov)
t1_abroad[20, 3] <- mean(df_wom$sector_nonpr)
t1_abroad[21, 3] <- mean(df_wom$otherjob)
t1_abroad[c(22:23),c(1:4)] <- t1_abroad_contin[c(15:16), c(3:6)] # break job, abroad
t1_abroad[24, 3] <- mean(df_wom$partnered)
t1_abroad[25, 1] <- quantile(womtrans$t, 0.01)
t1_abroad[25, 2] <- quantile(womtrans$t, 0.99)
t1_abroad[25, 3] <- mean(womtrans$t)
t1_abroad[25, 4] <- sd(womtrans$t)
t1_abroad[26, 3] <- nrow(df_wom[!duplicated(df_wom$RINPERSOON),])
t1_abroad[27, 3] <- nrow(df_wom)
# men
t1_abroad[c(1:2),c(5:8)] <- t1_abroad_contin[c(1:2),c(3:6)] # pay
t1_abroad[3,7] <- mean(df_men$trans_st)
t1_abroad[4,7] <- mean(df_men$trans_lt)
t1_abroad[5,c(5:8)] <- t1_abroad_contin[3, c(3:6)] # time
t1_abroad[c(7:11),7]<- round(prop.table(table(df_men$phd_disci)), digits=2)[c(1:5)] # disci
t1_abroad[12,7] <- mean(df_men$child_u5)
t1_abroad[13,c(5:8)] <- t1_abroad_contin[4, c(3:6)] # contract hours
t1_abroad[14,7] <- mean(df_men$temporary_emp)
t1_abroad[c(15:16),c(5:8)] <- t1_abroad_contin[c(5:6),c(3:6)] # phd cohort, satis
t1_abroad[18, 7] <- mean(df_men$sector_forpr)
t1_abroad[19, 7] <- mean(df_men$sector_gov)
t1_abroad[20, 7] <- mean(df_men$sector_nonpr)
t1_abroad[21, 7] <- mean(df_men$otherjob)
t1_abroad[c(22:23),c(5:8)] <- t1_abroad_contin[c(7:8), c(3:6)] # break job, abroad
t1_abroad[24, 7] <- mean(df_men$partnered)
t1_abroad[25, 5] <- quantile(mentrans$t, 0.01)
t1_abroad[25, 6] <- quantile(mentrans$t, 0.99)
t1_abroad[25, 7] <- mean(mentrans$t)
t1_abroad[25, 8] <- sd(mentrans$t)
t1_abroad[26, 7] <- nrow(df_men[!duplicated(df_men$RINPERSOON),])
t1_abroad[27, 7] <- nrow(df_men)
t1_abroad[c(1:25),] <- round(t1_abroad[c(1:25),], digits=2)
t1_abroad[c(26:27),] <- abs(t1_abroad[c(26:27),])
t1_abroad[26,] <- round(abs(t1_abroad[26,]), digits=0)
t1_abroad[27,] <- round(abs(t1_abroad[27,]), digits=0)
t1_abroad[is.na(t1_abroad)] <- ""
t1_abroad <- t1_abroad[c(1:2,4:23,26:27),] # removing transition columns as these don't make sense
t1_abroad <- t1_abroad[,c(3,4,7,8)] # no min/max due to sample size restrictions
Descriptives_Table <- t1_abroad
write.csv(t1_abroad, file="F:/GPE_salaris/R&R/descriptive_tab_abroadphd.csv")
Table1_abroadphd <- read.csv(file="Table1_abroadphd.csv", header=TRUE, check.names=FALSE)
Table1_abroadphd[is.na(Table1_abroadphd)] <- ""
kable(Table1_abroadphd, caption = "<b>Table: descriptive statistics for PhDs who went abroad after their PhD</b>") %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive"))
Table: descriptive statistics for PhDs who went abroad after their
PhD
|
|
F: Mean
|
F: SD
|
M: Mean
|
M: SD
|
|
Real monthly pay
|
4858.36
|
2015.94
|
5562.04
|
2651.9
|
|
Log real monthly pay
|
8.41
|
0.41
|
8.53
|
0.43
|
|
Transition experienced
|
0.58
|
|
0.55
|
|
|
Time
|
8.36
|
3.85
|
8.52
|
3.84
|
|
PhD Discipline
|
|
|
|
|
|
Health sciences
|
0.24
|
|
0.18
|
|
|
Social sciences
|
0.18
|
|
0.07
|
|
|
Natural sciences and mathematics
|
0.52
|
|
0.58
|
|
|
Engineering
|
0.05
|
|
0.13
|
|
|
Humanities
|
0.01
|
|
0.04
|
|
|
Child under 5
|
0.38
|
|
0.36
|
|
|
Log monthly contract hours
|
4.97
|
0.24
|
5.05
|
0.19
|
|
Temporary contract
|
0.37
|
|
0.37
|
|
|
PhD cohort
|
3.36
|
2.82
|
2.87
|
2.55
|
|
PhD satisfaction
|
3.21
|
0.35
|
3.23
|
0.42
|
|
Sector
|
|
|
|
|
|
For-profit
|
0.48
|
|
0.52
|
|
|
Government
|
0.42
|
|
0.41
|
|
|
Non-profit
|
0.09
|
|
0.07
|
|
|
Other job
|
0.02
|
|
0.02
|
|
|
Break in Dutch employment
|
0.87
|
4.41
|
0.61
|
3.05
|
|
Period abroad
|
6.95
|
20.91
|
9.16
|
27.04
|
|
N individuals
|
130
|
|
222
|
|
|
N observations
|
1258
|
|
2199
|
|
T-test table: are people who go abroad after their PhD different from
those who do not?
# chi-square gender distri:
gender_reg <- table(df_mmfc$gender[!duplicated(df_mmfc$RINPERSOON)])
gender_abr <- table(abroadafterphd_long$gender[!duplicated(abroadafterphd_long$RINPERSOON)])
gender_distri <- rbind.data.frame(gender_reg, gender_abr)
rownames(gender_distri) <- c("Main data", "Abroad after PhD")
colnames(gender_distri) <- c("Men", "Women")
chisq_gender <- chisq.test(gender_distri)
gender_distri$chisq <- chisq_gender$statistic
gender_distri$chisq_df <- chisq_gender$parameter
gender_distri$chisq_p <- chisq_gender$p.value
write.csv(gender_distri, file="F:/GPE_salaris/R&R/gender_distri_abroad.csv")
df_mmfc %>%
mutate(disci_health = ifelse(phd_disci=="Health sciences", 1, 0),
disci_social = ifelse(phd_disci=="Social sciences", 1, 0),
disci_natural = ifelse(phd_disci=="Natural sciences and mathematics", 1, 0),
disci_engineering = ifelse(phd_disci=="Engineering", 1, 0),
disci_humanities = ifelse(phd_disci=="Humanities", 1, 0)) -> df_mmfc
abroadafterphd_long %>%
mutate(disci_health = ifelse(phd_disci=="Health sciences", 1, 0),
disci_social = ifelse(phd_disci=="Social sciences", 1, 0),
disci_natural = ifelse(phd_disci=="Natural sciences and mathematics", 1, 0),
disci_engineering = ifelse(phd_disci=="Engineering", 1, 0),
disci_humanities = ifelse(phd_disci=="Humanities", 1, 0)) -> abroadafterphd_long
df_mmfc %>% filter(gender=="women") -> df_wom
df_mmfc %>% filter(gender=="men") -> df_men
abroadafterphd_long %>% filter(gender=="women") -> df_wom_a
abroadafterphd_long %>% filter(gender=="men") -> df_men_a
t1_v <- t.test(df_wom$realpay_corr2, df_wom_a$realpay_corr2)
t2_v <- t.test(df_wom$log_realpay, df_wom_a$log_realpay)
t3_v <- t.test(df_wom$t, df_wom_a$t)
t4_v <- t.test(df_wom$disci_health, df_wom_a$disci_health)
t5_v <- t.test(df_wom$disci_social, df_wom_a$disci_social)
t6_v <- t.test(df_wom$disci_natural, df_wom_a$disci_natural)
t7_v <- t.test(df_wom$disci_engineering, df_wom_a$disci_engineering)
t8_v <- t.test(df_wom$disci_humanities, df_wom_a$disci_humanities)
t9_v <- t.test(df_wom$child_u5, df_wom_a$child_u5)
t10_v <- t.test(df_wom$log_hrs, df_wom_a$log_hrs)
t11_v <- t.test(df_wom$temporary_emp, df_wom_a$temporary_emp)
t12_v <- t.test(df_wom$phd_coh, df_wom_a$phd_coh)
t13_v <- t.test(df_wom$phd_sat, df_wom_a$phd_sat)
t14_v <- t.test(df_wom$sector_forpr, df_wom_a$sector_forpr)
t15_v <- t.test(df_wom$sector_gov, df_wom_a$sector_gov)
t16_v <- t.test(df_wom$sector_nonpr, df_wom_a$sector_nonpr)
t17_v <- t.test(df_wom$otherjob, df_wom_a$otherjob)
t18_v <- t.test(df_wom$break_job, df_wom_a$break_job)
t19_v <- t.test(df_wom$abroad_time, df_wom_a$abroad_time)
t20_v <- t.test(df_wom$partnered, df_wom_a$partnered)
t1_m <- t.test(df_men$realpay_corr2, df_men_a$realpay_corr2)
t2_m <- t.test(df_men$log_realpay, df_men_a$log_realpay)
t3_m <- t.test(df_men$t, df_men_a$t)
t4_m <- t.test(df_men$disci_health, df_men_a$disci_health)
t5_m <- t.test(df_men$disci_social, df_men_a$disci_social)
t6_m <- t.test(df_men$disci_natural, df_men_a$disci_natural)
t7_m <- t.test(df_men$disci_engineering, df_men_a$disci_engineering)
t8_m <- t.test(df_men$disci_humanities, df_men_a$disci_humanities)
t9_m <- t.test(df_men$child_u5, df_men_a$child_u5)
t10_m <- t.test(df_men$log_hrs, df_men_a$log_hrs)
t11_m <- t.test(df_men$temporary_emp, df_men_a$temporary_emp)
t12_m <- t.test(df_men$phd_coh, df_men_a$phd_coh)
t13_m <- t.test(df_men$phd_sat, df_men_a$phd_sat)
t14_m <- t.test(df_men$sector_forpr, df_men_a$sector_forpr)
t15_m <- t.test(df_men$sector_gov, df_men_a$sector_gov)
t16_m <- t.test(df_men$sector_nonpr, df_men_a$sector_nonpr)
t17_m <- t.test(df_men$otherjob, df_men_a$otherjob)
t18_m <- t.test(df_men$break_job, df_men_a$break_job)
t19_m <- t.test(df_men$abroad_time, df_men_a$abroad_time)
t20_m <- t.test(df_men$partnered, df_men_a$partnered)
extract_t <- function(ttest) {
tibble(
t_value = unname(ttest$statistic),
df = unname(ttest$parameter),
p_value = unname(ttest$p.value)
)
}
test_wom <- mget(paste0("t", 1:20, "_v"))
test_men <- mget(paste0("t", 1:20, "_m"))
varnames <- c("Real monthly pay", "Log real monthly pay", "Time", "PhD discipline: Health sciences", "PhD discipline: Social sciences", "PhD discipline: Natural sciences & mathematics", "PhD discipline: Engineering", "PhD discipline: Humanities", "Child under 5", "Log Monthly contract hours", "Temporary contract", "PhD cohort", "PhD satisfaction", "Sector: For-profit", "Sector: Government", "Sector:Non-profit", "Other job", "Break in Dutch employment", "Period abroad", "Partnered")
test_df_wom <- bind_rows(lapply(test_wom, extract_t), .id="test_id") %>%
mutate(variable=varnames,
N_obs = (nrow(df_wom) + nrow(df_wom_a)),
group="women")
test_df_men <- bind_rows(lapply(test_men, extract_t), .id="test_id") %>%
mutate(variable=varnames,
N_obs = (nrow(df_men) + nrow(df_men_a)),
group="men")
test_df_all <- bind_rows(test_df_men, test_df_wom)
test_df_all$psmall <- ifelse(test_df_all$p_value<.001, 1, 0)
test_df_all$ttest <- paste0("t(", round(test_df_all$df, 2), ") = ", round(test_df_all$t_value, 2), ", p ", ifelse(test_df_all$psmall==1, "< .001", paste0("= ", round(test_df_all$p_value, 2))))
write.csv(test_df_all, file="F:/GPE_salaris/R&R/ttests_main_abroad.csv")
ttests_mainabroad <- read.csv(file="ttests_main_abroad.csv", header=TRUE, check.names = FALSE)
ttests_mainabroad[,-1]
## test_id t_value df p_value
## 1 t1_m -0.54482884 2791.092 5.859148e-01
## 2 t2_m -4.91808711 2782.432 9.247609e-07
## 3 t3_m -26.28683748 2731.112 5.864767e-136
## 4 t4_m 10.58758396 2745.622 1.057409e-25
## 5 t5_m 26.88090259 3393.241 1.843293e-144
## 6 t6_m -26.59154389 2536.902 1.219750e-137
## 7 t7_m 1.23312866 2626.082 2.176381e-01
## 8 t8_m 6.41187345 2901.868 1.672075e-10
## 9 t9_m -3.72901434 2578.664 1.963702e-04
## 10 t10_m -7.48455912 2787.712 9.570685e-14
## 11 t11_m -2.91269103 2585.656 3.614001e-03
## 12 t12_m 17.78638679 2734.406 4.679438e-67
## 13 t13_m -1.17182236 2502.966 2.413799e-01
## 14 t14_m -9.06312947 2590.921 2.435695e-19
## 15 t15_m 6.30574697 2613.798 3.356219e-10
## 16 t16_m 5.56488385 2780.548 2.873351e-08
## 17 t17_m 10.47898127 3288.980 2.688617e-25
## 18 t18_m 3.26277165 3242.145 1.114724e-03
## 19 t19_m -14.48310051 2231.901 1.677765e-45
## 20 t20_m -6.02140886 2629.183 1.970343e-09
## 21 t1_v 0.14665298 1519.638 8.834254e-01
## 22 t2_v -4.31270458 1473.152 1.719924e-05
## 23 t3_v -21.85057698 1424.003 1.641672e-91
## 24 t4_v 15.27586101 1440.897 6.090731e-49
## 25 t5_v 11.46403537 1455.524 3.431097e-29
## 26 t6_v -25.51582615 1327.420 3.507584e-117
## 27 t7_v 0.03913606 1393.127 9.687875e-01
## 28 t8_v 13.71807152 1973.628 5.632661e-41
## 29 t9_v -3.46311953 1384.384 5.502304e-04
## 30 t10_v -6.49330210 1447.355 1.151181e-10
## 31 t11_v 1.40339762 1395.222 1.607208e-01
## 32 t12_v 13.98859348 1422.669 9.322857e-42
## 33 t13_v -7.10179205 1418.733 1.941450e-12
## 34 t14_v -7.38925817 1384.287 2.543458e-13
## 35 t15_v 4.33908548 1395.738 1.533749e-05
## 36 t16_v 5.25756723 1449.498 1.678162e-07
## 37 t17_v 11.39910565 1751.582 4.353029e-29
## 38 t18_v 0.25543702 1419.811 7.984226e-01
## 39 t19_v -11.03042334 1269.902 4.420890e-27
## 40 t20_v -0.64049890 1392.486 5.219537e-01
## variable N_obs group psmall
## 1 Real monthly pay 27082 men 0
## 2 Log real monthly pay 27082 men 1
## 3 Time 27082 men 1
## 4 PhD discipline: Health sciences 27082 men 1
## 5 PhD discipline: Social sciences 27082 men 1
## 6 PhD discipline: Natural sciences & mathematics 27082 men 1
## 7 PhD discipline: Engineering 27082 men 0
## 8 PhD discipline: Humanities 27082 men 1
## 9 Child under 5 27082 men 1
## 10 Log Monthly contract hours 27082 men 1
## 11 Temporary contract 27082 men 0
## 12 PhD cohort 27082 men 1
## 13 PhD satisfaction 27082 men 0
## 14 Sector: For-profit 27082 men 1
## 15 Sector: Government 27082 men 1
## 16 Sector:Non-profit 27082 men 1
## 17 Other job 27082 men 1
## 18 Break in Dutch employment 27082 men 0
## 19 Period abroad 27082 men 1
## 20 Partnered 27082 men 1
## 21 Real monthly pay 25161 women 0
## 22 Log real monthly pay 25161 women 1
## 23 Time 25161 women 1
## 24 PhD discipline: Health sciences 25161 women 1
## 25 PhD discipline: Social sciences 25161 women 1
## 26 PhD discipline: Natural sciences & mathematics 25161 women 1
## 27 PhD discipline: Engineering 25161 women 0
## 28 PhD discipline: Humanities 25161 women 1
## 29 Child under 5 25161 women 1
## 30 Log Monthly contract hours 25161 women 1
## 31 Temporary contract 25161 women 0
## 32 PhD cohort 25161 women 1
## 33 PhD satisfaction 25161 women 1
## 34 Sector: For-profit 25161 women 1
## 35 Sector: Government 25161 women 1
## 36 Sector:Non-profit 25161 women 1
## 37 Other job 25161 women 1
## 38 Break in Dutch employment 25161 women 0
## 39 Period abroad 25161 women 1
## 40 Partnered 25161 women 0
## ttest
## 1 t(2791.09) = -0.54, p = 0.59
## 2 t(2782.43) = -4.92, p < .001
## 3 t(2731.11) = -26.29, p < .001
## 4 t(2745.62) = 10.59, p < .001
## 5 t(3393.24) = 26.88, p < .001
## 6 t(2536.9) = -26.59, p < .001
## 7 t(2626.08) = 1.23, p = 0.22
## 8 t(2901.87) = 6.41, p < .001
## 9 t(2578.66) = -3.73, p < .001
## 10 t(2787.71) = -7.48, p < .001
## 11 t(2585.66) = -2.91, p = 0
## 12 t(2734.41) = 17.79, p < .001
## 13 t(2502.97) = -1.17, p = 0.24
## 14 t(2590.92) = -9.06, p < .001
## 15 t(2613.8) = 6.31, p < .001
## 16 t(2780.55) = 5.56, p < .001
## 17 t(3288.98) = 10.48, p < .001
## 18 t(3242.15) = 3.26, p = 0
## 19 t(2231.9) = -14.48, p < .001
## 20 t(2629.18) = -6.02, p < .001
## 21 t(1519.64) = 0.15, p = 0.88
## 22 t(1473.15) = -4.31, p < .001
## 23 t(1424) = -21.85, p < .001
## 24 t(1440.9) = 15.28, p < .001
## 25 t(1455.52) = 11.46, p < .001
## 26 t(1327.42) = -25.52, p < .001
## 27 t(1393.13) = 0.04, p = 0.97
## 28 t(1973.63) = 13.72, p < .001
## 29 t(1384.38) = -3.46, p < .001
## 30 t(1447.36) = -6.49, p < .001
## 31 t(1395.22) = 1.4, p = 0.16
## 32 t(1422.67) = 13.99, p < .001
## 33 t(1418.73) = -7.1, p < .001
## 34 t(1384.29) = -7.39, p < .001
## 35 t(1395.74) = 4.34, p < .001
## 36 t(1449.5) = 5.26, p < .001
## 37 t(1751.58) = 11.4, p < .001
## 38 t(1419.81) = 0.26, p = 0.8
## 39 t(1269.9) = -11.03, p < .001
## 40 t(1392.49) = -0.64, p = 0.52
kable(ttests_mainabroad, caption = "<b>T-tests comparing PhDs who went abroad after their PhD and those who did not</b>") %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive"))
T-tests comparing PhDs who went abroad after their PhD and those who
did not
|
|
test_id
|
t_value
|
df
|
p_value
|
variable
|
N_obs
|
group
|
psmall
|
ttest
|
|
1
|
t1_m
|
-0.5448288
|
2791.092
|
0.5859148
|
Real monthly pay
|
27082
|
men
|
0
|
t(2791.09) = -0.54, p = 0.59
|
|
2
|
t2_m
|
-4.9180871
|
2782.432
|
0.0000009
|
Log real monthly pay
|
27082
|
men
|
1
|
t(2782.43) = -4.92, p < .001
|
|
3
|
t3_m
|
-26.2868375
|
2731.112
|
0.0000000
|
Time
|
27082
|
men
|
1
|
t(2731.11) = -26.29, p < .001
|
|
4
|
t4_m
|
10.5875840
|
2745.622
|
0.0000000
|
PhD discipline: Health sciences
|
27082
|
men
|
1
|
t(2745.62) = 10.59, p < .001
|
|
5
|
t5_m
|
26.8809026
|
3393.241
|
0.0000000
|
PhD discipline: Social sciences
|
27082
|
men
|
1
|
t(3393.24) = 26.88, p < .001
|
|
6
|
t6_m
|
-26.5915439
|
2536.902
|
0.0000000
|
PhD discipline: Natural sciences & mathematics
|
27082
|
men
|
1
|
t(2536.9) = -26.59, p < .001
|
|
7
|
t7_m
|
1.2331287
|
2626.082
|
0.2176381
|
PhD discipline: Engineering
|
27082
|
men
|
0
|
t(2626.08) = 1.23, p = 0.22
|
|
8
|
t8_m
|
6.4118734
|
2901.868
|
0.0000000
|
PhD discipline: Humanities
|
27082
|
men
|
1
|
t(2901.87) = 6.41, p < .001
|
|
9
|
t9_m
|
-3.7290143
|
2578.664
|
0.0001964
|
Child under 5
|
27082
|
men
|
1
|
t(2578.66) = -3.73, p < .001
|
|
10
|
t10_m
|
-7.4845591
|
2787.712
|
0.0000000
|
Log Monthly contract hours
|
27082
|
men
|
1
|
t(2787.71) = -7.48, p < .001
|
|
11
|
t11_m
|
-2.9126910
|
2585.656
|
0.0036140
|
Temporary contract
|
27082
|
men
|
0
|
t(2585.66) = -2.91, p = 0
|
|
12
|
t12_m
|
17.7863868
|
2734.406
|
0.0000000
|
PhD cohort
|
27082
|
men
|
1
|
t(2734.41) = 17.79, p < .001
|
|
13
|
t13_m
|
-1.1718224
|
2502.966
|
0.2413799
|
PhD satisfaction
|
27082
|
men
|
0
|
t(2502.97) = -1.17, p = 0.24
|
|
14
|
t14_m
|
-9.0631295
|
2590.921
|
0.0000000
|
Sector: For-profit
|
27082
|
men
|
1
|
t(2590.92) = -9.06, p < .001
|
|
15
|
t15_m
|
6.3057470
|
2613.798
|
0.0000000
|
Sector: Government
|
27082
|
men
|
1
|
t(2613.8) = 6.31, p < .001
|
|
16
|
t16_m
|
5.5648839
|
2780.548
|
0.0000000
|
Sector:Non-profit
|
27082
|
men
|
1
|
t(2780.55) = 5.56, p < .001
|
|
17
|
t17_m
|
10.4789813
|
3288.980
|
0.0000000
|
Other job
|
27082
|
men
|
1
|
t(3288.98) = 10.48, p < .001
|
|
18
|
t18_m
|
3.2627717
|
3242.145
|
0.0011147
|
Break in Dutch employment
|
27082
|
men
|
0
|
t(3242.15) = 3.26, p = 0
|
|
19
|
t19_m
|
-14.4831005
|
2231.901
|
0.0000000
|
Period abroad
|
27082
|
men
|
1
|
t(2231.9) = -14.48, p < .001
|
|
20
|
t20_m
|
-6.0214089
|
2629.183
|
0.0000000
|
Partnered
|
27082
|
men
|
1
|
t(2629.18) = -6.02, p < .001
|
|
21
|
t1_v
|
0.1466530
|
1519.638
|
0.8834254
|
Real monthly pay
|
25161
|
women
|
0
|
t(1519.64) = 0.15, p = 0.88
|
|
22
|
t2_v
|
-4.3127046
|
1473.152
|
0.0000172
|
Log real monthly pay
|
25161
|
women
|
1
|
t(1473.15) = -4.31, p < .001
|
|
23
|
t3_v
|
-21.8505770
|
1424.003
|
0.0000000
|
Time
|
25161
|
women
|
1
|
t(1424) = -21.85, p < .001
|
|
24
|
t4_v
|
15.2758610
|
1440.897
|
0.0000000
|
PhD discipline: Health sciences
|
25161
|
women
|
1
|
t(1440.9) = 15.28, p < .001
|
|
25
|
t5_v
|
11.4640354
|
1455.524
|
0.0000000
|
PhD discipline: Social sciences
|
25161
|
women
|
1
|
t(1455.52) = 11.46, p < .001
|
|
26
|
t6_v
|
-25.5158262
|
1327.420
|
0.0000000
|
PhD discipline: Natural sciences & mathematics
|
25161
|
women
|
1
|
t(1327.42) = -25.52, p < .001
|
|
27
|
t7_v
|
0.0391361
|
1393.127
|
0.9687875
|
PhD discipline: Engineering
|
25161
|
women
|
0
|
t(1393.13) = 0.04, p = 0.97
|
|
28
|
t8_v
|
13.7180715
|
1973.628
|
0.0000000
|
PhD discipline: Humanities
|
25161
|
women
|
1
|
t(1973.63) = 13.72, p < .001
|
|
29
|
t9_v
|
-3.4631195
|
1384.384
|
0.0005502
|
Child under 5
|
25161
|
women
|
1
|
t(1384.38) = -3.46, p < .001
|
|
30
|
t10_v
|
-6.4933021
|
1447.355
|
0.0000000
|
Log Monthly contract hours
|
25161
|
women
|
1
|
t(1447.36) = -6.49, p < .001
|
|
31
|
t11_v
|
1.4033976
|
1395.222
|
0.1607208
|
Temporary contract
|
25161
|
women
|
0
|
t(1395.22) = 1.4, p = 0.16
|
|
32
|
t12_v
|
13.9885935
|
1422.669
|
0.0000000
|
PhD cohort
|
25161
|
women
|
1
|
t(1422.67) = 13.99, p < .001
|
|
33
|
t13_v
|
-7.1017921
|
1418.733
|
0.0000000
|
PhD satisfaction
|
25161
|
women
|
1
|
t(1418.73) = -7.1, p < .001
|
|
34
|
t14_v
|
-7.3892582
|
1384.287
|
0.0000000
|
Sector: For-profit
|
25161
|
women
|
1
|
t(1384.29) = -7.39, p < .001
|
|
35
|
t15_v
|
4.3390855
|
1395.738
|
0.0000153
|
Sector: Government
|
25161
|
women
|
1
|
t(1395.74) = 4.34, p < .001
|
|
36
|
t16_v
|
5.2575672
|
1449.498
|
0.0000002
|
Sector:Non-profit
|
25161
|
women
|
1
|
t(1449.5) = 5.26, p < .001
|
|
37
|
t17_v
|
11.3991057
|
1751.582
|
0.0000000
|
Other job
|
25161
|
women
|
1
|
t(1751.58) = 11.4, p < .001
|
|
38
|
t18_v
|
0.2554370
|
1419.811
|
0.7984226
|
Break in Dutch employment
|
25161
|
women
|
0
|
t(1419.81) = 0.26, p = 0.8
|
|
39
|
t19_v
|
-11.0304233
|
1269.902
|
0.0000000
|
Period abroad
|
25161
|
women
|
1
|
t(1269.9) = -11.03, p < .001
|
|
40
|
t20_v
|
-0.6404989
|
1392.486
|
0.5219537
|
Partnered
|
25161
|
women
|
0
|
t(1392.49) = -0.64, p = 0.52
|
LS0tDQp0aXRsZTogIkxlYXZpbmcgZm9yIG1vcmUgb3Igc2V0dGxpbmcgZm9yIGxlc3M6IERlc2NyaXB0aXZlcyINCmRhdGU6ICJMYXN0IGNvbXBpbGVkIG9uIGByIFN5cy5EYXRlKClgIg0Kb3V0cHV0OiANCiAgaHRtbF9kb2N1bWVudDoNCiAgICBjc3M6IHR3ZWFrcy5jc3MNCiAgICB0b2M6ICB0cnVlDQogICAgdG9jX2Zsb2F0OiB0cnVlDQogICAgbnVtYmVyX3NlY3Rpb25zOiB0cnVlDQogICAgY29kZV9mb2xkaW5nOiBzaG93DQogICAgY29kZV9kb3dubG9hZDogeWVzDQotLS0NCg0KDQojIFJlYWRpbmcgaW4gcGFja2FnZXMNCg0KYGBge3J9DQoNCnJtKGxpc3Q9bHMoKSkNCg0KYGBgDQoNCg0KYGBge3J9DQoNCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShrYWJsZUV4dHJhKQ0KDQpgYGANCg0KIyBSZWFkaW5nIGluIGRhdGENCg0KYGBge3IsIGV2YWw9RkFMU0V9DQoNCmxvYWQoZmlsZT0iSDovcHJvY2Vzc2VkX2RhdGEvZGZfbW1mYy5yZGEiKQ0KbG9hZChmaWxlPSJIOi9wcm9jZXNzZWRfZGF0YS9kZl9vdGhlci5yZGEiKQ0KbG9hZChmaWxlPSJIOi9wcm9jZXNzZWRfZGF0YS9kZl9ub290aGVyLnJkYSIpDQoNCmBgYA0KDQoNCg0KIyBTb21lIGFkLWhvYyByZWxldmVsaW5nIA0KDQpgYGB7ciwgZXZhbD1GQUxTRX0NCg0KbGV2ZWxzKGFzLmZhY3RvcihkZl9tbWZjJHBoZF9kaXNjaSkpDQoNCmRmX21tZmMkcGhkX2Rpc2NpIDwtIGZhY3RvcihkZl9tbWZjJHBoZF9kaXNjaSwgbGV2ZWxzPWMoIkhlYWx0aCBzY2llbmNlcyIsICJTb2NpYWwgc2NpZW5jZXMiLCAiTmF0dXJhbCBzY2llbmNlcyBhbmQgbWF0aGVtYXRpY3MiLCAiRW5naW5lZXJpbmciLCAiSHVtYW5pdGllcyIsICJBZ3JpY3VsdHVyZSBhbmQgYW5pbWFsIHNjaWVuY2VzIikpDQoNCmRmX21tZmMgPC0gZGZfbW1mYyAlPiUgDQogIG11dGF0ZShnZW5kZXIgPSBpZmVsc2UoZ2VuZGVyPT0xLCAibWVuIiwgIndvbWVuIikpDQoNCmRmX21tZmMkZ2VuZGVyIDwtIGZhY3RvcihkZl9tbWZjJGdlbmRlciwgbGV2ZWxzPWMoIm1lbiIsICJ3b21lbiIpKQ0KDQpgYGANCg0KDQojIERlc2NyaXB0aXZlcw0KDQojIyBOdW1iZXIgb2YgdHJhbnNpdGlvbnMNCg0KYGBge3IsIGV2YWw9RkFMU0V9DQoNCmRmX21tZmMgJT4lDQogIGdyb3VwX2J5KGdlbmRlcikgJT4lDQogIGNvdW50KHRyYW5zX3N0KSAlPiUNCiAgZmlsdGVyKHRyYW5zX3N0PT0xKSAlPiUNCiAgbXV0YXRlKE5fdHJhbnNpdGlvbnM9bikgJT4lIA0KICBzZWxlY3QoZ2VuZGVyLCBOX3RyYW5zaXRpb25zKSAtPiBOX3RyYW5zaXRpb25zDQoNCndyaXRlLmNzdihOX3RyYW5zaXRpb25zLCBmaWxlPSJGOi9HUEVfc2FsYXJpcy9OX3RyYW5zaXRpb25zLmNzdiIpDQoNCmBgYA0KDQoNCg0KIyBEZXNjcmlwdGl2ZXMNCg0KDQojIyBEZXNjcmlwdGl2ZSB0YWJsZSBieSBnZW5kZXINCg0KYGBge3IsIGV2YWw9RkFMU0V9DQoNCiMgZmxhdHRlbmluZyB0aW1lLXZhcnlpbmcgdmFyaWFibGVzIChiYXNlcGF5KQ0KDQpjb2x1bW5zIDwtIGMoIkY6IDElIiwgIkY6IDk5JSIsICJGOiBNZWFuIiwgIkY6IFNEIiwgIk06IDElIiwgIk06IDk5JSIsICJNOiBNZWFuIiwgIk06IFNEIikNCnJvd3MgPC0gYygiUmVhbCBtb250aGx5IHBheSIsICJMb2cgcmVhbCBtb250aGx5IHBheSIsICJUcmFuc2l0aW9uIHllYXIiLCAiVHJhbnNpdGlvbiBleHBlcmllbmNlZCIsIlRpbWUiICwgIlBoRCBEaXNjaXBsaW5lIiwgIkhlYWx0aCBzY2llbmNlcyIsICJTb2NpYWwgc2NpZW5jZXMiLCAiTmF0dXJhbCBzY2llbmNlcyBhbmQgbWF0aGVtYXRpY3MiLCAiRW5naW5lZXJpbmciLCAiSHVtYW5pdGllcyIsICJDaGlsZCB1bmRlciA1IiwgIkxvZyBtb250aGx5IGNvbnRyYWN0IGhvdXJzIiwgIlRlbXBvcmFyeSBjb250cmFjdCIsICJQaEQgY29ob3J0IiwgIlBoRCBzYXRpc2ZhY3Rpb24iLCAiU2VjdG9yIiwgIkZvci1wcm9maXQiLCAiR292ZXJubWVudCIsICJOb24tcHJvZml0IiwgIk90aGVyIGpvYiIsICJCcmVhayBpbiBEdXRjaCBlbXBsb3ltZW50IiwgIlBlcmlvZCBhYnJvYWQiLCAiUGFydG5lcmVkIiwgIlRpbWUgYXQgdHJhbnNpdGlvbiIsICJOIGluZGl2aWR1YWxzIiwgIk4gb2JzZXJ2YXRpb25zIikNCiAgDQp0MSA8LSBkYXRhLmZyYW1lKG1hdHJpeChucm93PWxlbmd0aChyb3dzKSwgbmNvbD1sZW5ndGgoY29sdW1ucykpKQ0KDQpjb2xuYW1lcyh0MSkgPC0gY29sdW1ucw0Kcm93bmFtZXModDEpIDwtIHJvd3MNCg0KZGZfbW1mYyAlPiUNCiAgZ3JvdXBfYnkoZ2VuZGVyKSAlPiUNCiAgc3VtbWFyaXplKGFjcm9zcyhjKHJlYWxwYXlfY29ycjIsIGxvZ19yZWFscGF5LCB0LCBsb2dfaHJzLCBwaGRfY29oLCBwaGRfc2F0LCBicmVha19qb2IsIGFicm9hZF90aW1lKSwNCiAgICAgICAgICAgIGxpc3QocDEgPSB+cXVhbnRpbGUoLngsIDAuMDEpLCBwOTkgPSB+cXVhbnRpbGUoLngsIDAuOTkpLCBtZWFuID0gbWVhbiwgc2Q9c2QpLA0KICAgICAgICAgICAgLm5hbWVzID0gInsuY29sfS17LmZufSIpKSAlPiUNCiAgcGl2b3RfbG9uZ2VyKA0KICAgIGNvbHMgPSAtZ2VuZGVyLA0KICAgIG5hbWVzX3RvID0gYygidmFyaWFibGUiLCAic3RhdGlzdGljIiksIA0KICAgIG5hbWVzX3NlcCA9ICItIg0KICApICU+JQ0KICBwaXZvdF93aWRlcigNCiAgICBuYW1lc19mcm9tID0gc3RhdGlzdGljLA0KICAgIHZhbHVlc19mcm9tID0gdmFsdWUNCiAgKSAtPiB0MV9jb250aW4NCg0KDQpkZl9tbWZjICU+JSBmaWx0ZXIoZ2VuZGVyPT0id29tZW4iKSAtPiBkZl93b20NCmRmX21tZmMgJT4lIGZpbHRlcihnZW5kZXI9PSJtZW4iKSAtPiBkZl9tZW4NCg0KIyBjaGVjayBpZiAxJSBhbmQgOTklIG9mIGR1bW1pZXMgaXMgaW5kZWVkIDAvMQ0KIyBjKHF1YW50aWxlKGRmX21lbiR0cmFuc19sdCwgMC4wMSksIHF1YW50aWxlKGRmX21lbiR0cmFuc19sdCwgMC45OSkpDQojIGMocXVhbnRpbGUoZGZfbWVuJHRyYW5zX3N0LCAwLjAxKSwgcXVhbnRpbGUoZGZfbWVuJHRyYW5zX3N0LCAwLjk5KSkNCiMgYyhxdWFudGlsZShkZl9tZW4kY2hpbGRfdTUsIDAuMDEpLCBxdWFudGlsZShkZl9tZW4kY2hpbGRfdTUsIDAuOTkpKQ0KIyBjKHF1YW50aWxlKGRmX21lbiR0ZW1wb3JhcnlfZW1wLCAwLjAxKSwgcXVhbnRpbGUoZGZfbWVuJHRlbXBvcmFyeV9lbXAsIDAuOTkpKQ0KIyBjKHF1YW50aWxlKGRmX21lbiRzZWN0b3JfZm9ycHIsIDAuMDEpLCBxdWFudGlsZShkZl9tZW4kc2VjdG9yX2ZvcnByLCAwLjk5KSkNCiMgYyhxdWFudGlsZShkZl9tZW4kc2VjdG9yX2dvdiwgMC4wMSksIHF1YW50aWxlKGRmX21lbiRzZWN0b3JfZ292LCAwLjk5KSkNCiMgYyhxdWFudGlsZShkZl9tZW4kc2VjdG9yX25vbnByLCAwLjAxKSwgcXVhbnRpbGUoZGZfbWVuJHNlY3Rvcl9ub25wciwgMC45OSkpDQojIGMocXVhbnRpbGUoZGZfbWVuJG90aGVyam9iLCAwLjAxKSwgcXVhbnRpbGUoZGZfbWVuJG90aGVyam9iLCAwLjk5KSkNCiMgYyhxdWFudGlsZShkZl9tZW4kcGFydG5lcmVkLCAwLjAxKSwgcXVhbnRpbGUoZGZfbWVuJHBhcnRuZXJlZCwgMC45OSkpDQojIGMocXVhbnRpbGUoZGZfd29tJHRyYW5zX2x0LCAwLjAxKSwgcXVhbnRpbGUoZGZfd29tJHRyYW5zX2x0LCAwLjk5KSkNCiMgYyhxdWFudGlsZShkZl93b20kdHJhbnNfc3QsIDAuMDEpLCBxdWFudGlsZShkZl93b20kdHJhbnNfc3QsIDAuOTkpKQ0KIyBjKHF1YW50aWxlKGRmX3dvbSRjaGlsZF91NSwgMC4wMSksIHF1YW50aWxlKGRmX3dvbSRjaGlsZF91NSwgMC45OSkpDQojIGMocXVhbnRpbGUoZGZfd29tJHRlbXBvcmFyeV9lbXAsIDAuMDEpLCBxdWFudGlsZShkZl93b20kdGVtcG9yYXJ5X2VtcCwgMC45OSkpDQojIGMocXVhbnRpbGUoZGZfd29tJHNlY3Rvcl9mb3JwciwgMC4wMSksIHF1YW50aWxlKGRmX3dvbSRzZWN0b3JfZm9ycHIsIDAuOTkpKQ0KIyBjKHF1YW50aWxlKGRmX3dvbSRzZWN0b3JfZ292LCAwLjAxKSwgcXVhbnRpbGUoZGZfd29tJHNlY3Rvcl9nb3YsIDAuOTkpKQ0KIyBjKHF1YW50aWxlKGRmX3dvbSRzZWN0b3Jfbm9ucHIsIDAuMDEpLCBxdWFudGlsZShkZl93b20kc2VjdG9yX25vbnByLCAwLjk5KSkNCiMgYyhxdWFudGlsZShkZl93b20kb3RoZXJqb2IsIDAuMDEpLCBxdWFudGlsZShkZl93b20kb3RoZXJqb2IsIDAuOTkpKQ0KIyBjKHF1YW50aWxlKGRmX3dvbSRwYXJ0bmVyZWQsIDAuMDEpLCBxdWFudGlsZShkZl93b20kcGFydG5lcmVkLCAwLjk5KSkNCiMgaXQgaXMhDQoNCg0KdDFbYygzLDQsNzoxMiwxNCwxODoyMSwyNCksMV0gPC0gcmVwKDAuMDAwMSwgdGltZXM9bGVuZ3RoKHQxW2MoMyw0LDc6MTIsMTQsMTg6MjEsMjQpLDFdKSkNCnQxW2MoMyw0LDc6MTIsMTQsMTg6MjEsMjQpLDJdIDwtIHJlcCgxLjAwMDEsIHRpbWVzPWxlbmd0aCh0MVtjKDMsNCw3OjEyLDE0LDE4OjIxLDI0KSwyXSkpDQp0MVtjKDMsNCw3OjEyLDE0LDE4OjIxLDI0KSw1XSA8LSByZXAoMC4wMDAxLCB0aW1lcz1sZW5ndGgodDFbYygzLDQsNzoxMiwxNCwxODoyMSwyNCksNV0pKQ0KdDFbYygzLDQsNzoxMiwxNCwxODoyMSwyNCksNl0gPC0gcmVwKDEuMDAwMSwgdGltZXM9bGVuZ3RoKHQxW2MoMyw0LDc6MTIsMTQsMTg6MjEsMjQpLDZdKSkNCg0KIyB0aW1lIGF0IHRyYW5zaXRpb24NCmRmX3dvbSAlPiUgZmlsdGVyKHRyYW5zX3N0PT0xKSAtPiB3b210cmFucw0KZGZfbWVuICU+JSBmaWx0ZXIodHJhbnNfc3Q9PTEpIC0+IG1lbnRyYW5zDQoNCiMgd29tZW4gDQp0MVtjKDE6MiksYygxOjQpXSA8LSB0MV9jb250aW5bYyg5OjEwKSxjKDM6NildICMgcGF5DQp0MVszLDNdIDwtIG1lYW4oZGZfd29tJHRyYW5zX3N0KQ0KdDFbNCwzXSA8LSBtZWFuKGRmX3dvbSR0cmFuc19sdCkNCnQxWzUsYygxOjQpXSA8LSB0MV9jb250aW5bMTEsIGMoMzo2KV0gIyB0aW1lDQp0MVtjKDc6MTEpLDNdPC0gcm91bmQocHJvcC50YWJsZSh0YWJsZShkZl93b20kcGhkX2Rpc2NpKSksIGRpZ2l0cz0yKVtjKDE6NSldICMgZGlzY2kNCnQxWzEyLDNdIDwtIG1lYW4oZGZfd29tJGNoaWxkX3U1KQ0KdDFbMTMsYygxOjQpXSA8LSB0MV9jb250aW5bMTIsIGMoMzo2KV0gIyBjb250cmFjdCBob3Vycw0KdDFbMTQsM10gPC0gbWVhbihkZl93b20kdGVtcG9yYXJ5X2VtcCkNCnQxW2MoMTU6MTYpLGMoMTo0KV0gPC0gdDFfY29udGluW2MoMTM6MTQpLGMoMzo2KV0gIyBwaGQgY29ob3J0LCBzYXRpcw0KdDFbMTgsIDNdIDwtIG1lYW4oZGZfd29tJHNlY3Rvcl9mb3JwcikNCnQxWzE5LCAzXSA8LSBtZWFuKGRmX3dvbSRzZWN0b3JfZ292KQ0KdDFbMjAsIDNdIDwtIG1lYW4oZGZfd29tJHNlY3Rvcl9ub25wcikNCnQxWzIxLCAzXSA8LSBtZWFuKGRmX3dvbSRvdGhlcmpvYikNCnQxW2MoMjI6MjMpLGMoMTo0KV0gPC0gdDFfY29udGluW2MoMTU6MTYpLCBjKDM6NildICMgYnJlYWsgam9iLCBhYnJvYWQNCnQxWzI0LCAzXSA8LSBtZWFuKGRmX3dvbSRwYXJ0bmVyZWQpDQp0MVsyNSwgMV0gPC0gcXVhbnRpbGUod29tdHJhbnMkdCwgMC4wMSkNCnQxWzI1LCAyXSA8LSBxdWFudGlsZSh3b210cmFucyR0LCAwLjk5KQ0KdDFbMjUsIDNdIDwtIG1lYW4od29tdHJhbnMkdCkNCnQxWzI1LCA0XSA8LSBzZCh3b210cmFucyR0KQ0KdDFbMjYsIDNdIDwtIG5yb3coZGZfd29tWyFkdXBsaWNhdGVkKGRmX3dvbSRSSU5QRVJTT09OKSxdKQ0KdDFbMjcsIDNdIDwtIG5yb3coZGZfd29tKQ0KDQojIG1lbiANCnQxW2MoMToyKSxjKDU6OCldIDwtIHQxX2NvbnRpbltjKDE6MiksYygzOjYpXSAjIHBheQ0KdDFbMyw3XSA8LSBtZWFuKGRmX21lbiR0cmFuc19zdCkNCnQxWzQsN10gPC0gbWVhbihkZl9tZW4kdHJhbnNfbHQpDQp0MVs1LGMoNTo4KV0gPC0gdDFfY29udGluWzMsIGMoMzo2KV0gIyB0aW1lDQp0MVtjKDc6MTEpLDddPC0gcm91bmQocHJvcC50YWJsZSh0YWJsZShkZl9tZW4kcGhkX2Rpc2NpKSksIGRpZ2l0cz0yKVtjKDE6NSldICMgZGlzY2kNCnQxWzEyLDddIDwtIG1lYW4oZGZfbWVuJGNoaWxkX3U1KQ0KdDFbMTMsYyg1OjgpXSA8LSB0MV9jb250aW5bNCwgYygzOjYpXSAjIGNvbnRyYWN0IGhvdXJzDQp0MVsxNCw3XSA8LSBtZWFuKGRmX21lbiR0ZW1wb3JhcnlfZW1wKQ0KdDFbYygxNToxNiksYyg1OjgpXSA8LSB0MV9jb250aW5bYyg1OjYpLGMoMzo2KV0gIyBwaGQgY29ob3J0LCBzYXRpcw0KdDFbMTgsIDddIDwtIG1lYW4oZGZfbWVuJHNlY3Rvcl9mb3JwcikNCnQxWzE5LCA3XSA8LSBtZWFuKGRmX21lbiRzZWN0b3JfZ292KQ0KdDFbMjAsIDddIDwtIG1lYW4oZGZfbWVuJHNlY3Rvcl9ub25wcikNCnQxWzIxLCA3XSA8LSBtZWFuKGRmX21lbiRvdGhlcmpvYikNCnQxW2MoMjI6MjMpLGMoNTo4KV0gPC0gdDFfY29udGluW2MoNzo4KSwgYygzOjYpXSAjIGJyZWFrIGpvYiwgYWJyb2FkDQp0MVsyNCwgN10gPC0gbWVhbihkZl9tZW4kcGFydG5lcmVkKQ0KdDFbMjUsIDVdIDwtIHF1YW50aWxlKG1lbnRyYW5zJHQsIDAuMDEpDQp0MVsyNSwgNl0gPC0gcXVhbnRpbGUobWVudHJhbnMkdCwgMC45OSkNCnQxWzI1LCA3XSA8LSBtZWFuKG1lbnRyYW5zJHQpDQp0MVsyNSwgOF0gPC0gc2QobWVudHJhbnMkdCkNCnQxWzI2LCA3XSA8LSBucm93KGRmX21lblshZHVwbGljYXRlZChkZl9tZW4kUklOUEVSU09PTiksXSkNCnQxWzI3LCA3XSA8LSBucm93KGRmX21lbikNCg0KdDFbYygxOjI1KSxdIDwtIHJvdW5kKHQxW2MoMToyNSksXSwgZGlnaXRzPTIpDQp0MVtjKDI2OjI3KSxdIDwtIGFicyh0MVtjKDI2OjI3KSxdKQ0KDQp0MVsyNixdIDwtIHJvdW5kKGFicyh0MVsyNixdKSwgZGlnaXRzPTApDQp0MVsyNyxdIDwtIHJvdW5kKGFicyh0MVsyNyxdKSwgZGlnaXRzPTApDQoNCnQxW2lzLm5hKHQxKV0gPC0gIiINCg0KRGVzY3JpcHRpdmVzX1RhYmxlIDwtIHQxDQoNCndyaXRlLmNzdih0MSwgZmlsZT0iRjovR1BFX3NhbGFyaXMvUiZSL2Rlc2NyaXB0aXZlX3RhYi5jc3YiKQ0KDQpgYGANCg0KDQpgYGB7cn0NCg0KVGFibGUxIDwtIHJlYWQuY3N2KGZpbGU9IlRhYmxlMS5jc3YiLCBoZWFkZXI9VFJVRSwgY2hlY2submFtZXM9RkFMU0UpDQoNCg0KVGFibGUxW2lzLm5hKFRhYmxlMSldIDwtICIiDQoNCg0Ka2FibGUoVGFibGUxLCBjYXB0aW9uID0gIjxiPlRhYmxlIDE6IGRlc2NyaXB0aXZlIHN0YXRpc3RpY3MgZm9yIGFsbCB2YXJpYWJsZXMgdXNlZCBpbiBvdXIgYW5hbHlzZXMsIHNwbGl0IG91dCBmb3IgbWVuIGFuZCB3b21lbjwvYj4iKSAlPiUNCiAga2FibGVfc3R5bGluZyhib290c3RyYXBfb3B0aW9ucyA9IGMoInN0cmlwZWQiLCAiaG92ZXIiLCAiY29uZGVuc2VkIiwgInJlc3BvbnNpdmUiKSkNCg0KDQpgYGANCg0KDQoNCg0KIyBSb2J1c3RuZXNzOiBkZXNjcmlwdGl2ZSBzdGF0aXN0aWNzIG9mIHBlb3BsZSB3aG8gZ28gYWJyb2FkIGFmdGVyIHRoZWlyIFBoRA0KDQpgYGB7ciwgZXZhbD1GQUxTRX0NCg0KbG9hZChmaWxlPSJIOi9wcm9jZXNzZWRfZGF0YS9hYnJvYWRhZnRlcnBoZF9sb25nLnJkYSIpDQoNCmxldmVscyhhcy5mYWN0b3IoYWJyb2FkYWZ0ZXJwaGRfbG9uZyRwaGRfZGlzY2kpKQ0KDQphYnJvYWRhZnRlcnBoZF9sb25nJHBoZF9kaXNjaSA8LSBmYWN0b3IoYWJyb2FkYWZ0ZXJwaGRfbG9uZyRwaGRfZGlzY2ksIGxldmVscz1jKCJIZWFsdGggc2NpZW5jZXMiLCAiU29jaWFsIHNjaWVuY2VzIiwgIk5hdHVyYWwgc2NpZW5jZXMgYW5kIG1hdGhlbWF0aWNzIiwgIkVuZ2luZWVyaW5nIiwgIkh1bWFuaXRpZXMiKSkNCg0KYWJyb2FkYWZ0ZXJwaGRfbG9uZyA8LSBhYnJvYWRhZnRlcnBoZF9sb25nICU+JSANCiAgbXV0YXRlKGdlbmRlciA9IGlmZWxzZShnZW5kZXI9PTEsICJtZW4iLCAid29tZW4iKSkNCg0KYWJyb2FkYWZ0ZXJwaGRfbG9uZyRnZW5kZXIgPC0gZmFjdG9yKGFicm9hZGFmdGVycGhkX2xvbmckZ2VuZGVyLCBsZXZlbHM9YygibWVuIiwgIndvbWVuIikpDQoNCiMgcmVtb3ZpbmcgbWlzc2luZ3MNCm5yb3coYWJyb2FkYWZ0ZXJwaGRfbG9uZ1shZHVwbGljYXRlZChhYnJvYWRhZnRlcnBoZF9sb25nJFJJTlBFUlNPT04pLF0pICMgMzUzDQoNCmFicm9hZGFmdGVycGhkX2xvbmcgJT4lDQogIGZpbHRlcighaXMubmEocGhkX3NhdCkpICU+JQ0KICBmaWx0ZXIoIWlzLm5hKHRlbXBvcmFyeV9lbXApKSAlPiUNCiAgZmlsdGVyKCFpcy5uYShzZWN0X2FkaikpIC0+IGFicm9hZGFmdGVycGhkX2xvbmcNCg0KbnJvdyhhYnJvYWRhZnRlcnBoZF9sb25nWyFkdXBsaWNhdGVkKGFicm9hZGFmdGVycGhkX2xvbmckUklOUEVSU09PTiksXSkgIyAzNTINCg0KIyBmbGF0dGVuaW5nIHRpbWUtdmFyeWluZyB2YXJpYWJsZXMgKGJhc2VwYXkpDQoNCmNvbHVtbnMgPC0gYygiRjogMSUiLCAiRjogOTklIiwgIkY6IE1lYW4iLCAiRjogU0QiLCAiTTogMSUiLCAiTTogOTklIiwgIk06IE1lYW4iLCAiTTogU0QiKQ0Kcm93cyA8LSBjKCJSZWFsIG1vbnRobHkgcGF5IiwgIkxvZyByZWFsIG1vbnRobHkgcGF5IiwgIlRyYW5zaXRpb24geWVhciIsICJUcmFuc2l0aW9uIGV4cGVyaWVuY2VkIiwiVGltZSIgLCAiUGhEIERpc2NpcGxpbmUiLCAiSGVhbHRoIHNjaWVuY2VzIiwgIlNvY2lhbCBzY2llbmNlcyIsICJOYXR1cmFsIHNjaWVuY2VzIGFuZCBtYXRoZW1hdGljcyIsICJFbmdpbmVlcmluZyIsICJIdW1hbml0aWVzIiwgIkNoaWxkIHVuZGVyIDUiLCAiTG9nIG1vbnRobHkgY29udHJhY3QgaG91cnMiLCAiVGVtcG9yYXJ5IGNvbnRyYWN0IiwgIlBoRCBjb2hvcnQiLCAiUGhEIHNhdGlzZmFjdGlvbiIsICJTZWN0b3IiLCAiRm9yLXByb2ZpdCIsICJHb3Zlcm5tZW50IiwgIk5vbi1wcm9maXQiLCAiT3RoZXIgam9iIiwgIkJyZWFrIGluIER1dGNoIGVtcGxveW1lbnQiLCAiUGVyaW9kIGFicm9hZCIsICJQYXJ0bmVyZWQiLCAiVGltZSBhdCB0cmFuc2l0aW9uIiwgIk4gaW5kaXZpZHVhbHMiLCAiTiBvYnNlcnZhdGlvbnMiKQ0KICANCnQxX2Ficm9hZCA8LSBkYXRhLmZyYW1lKG1hdHJpeChucm93PWxlbmd0aChyb3dzKSwgbmNvbD1sZW5ndGgoY29sdW1ucykpKQ0KDQpjb2xuYW1lcyh0MV9hYnJvYWQpIDwtIGNvbHVtbnMNCnJvd25hbWVzKHQxX2Ficm9hZCkgPC0gcm93cw0KDQphYnJvYWRhZnRlcnBoZF9sb25nICU+JQ0KICBncm91cF9ieShnZW5kZXIpICU+JQ0KICBzdW1tYXJpemUoYWNyb3NzKGMocmVhbHBheV9jb3JyMiwgbG9nX3JlYWxwYXksIHQsIGJhc2Vob3Vyc19tb250aCwgcGhkX2NvaCwgcGhkX3NhdCwgYnJlYWtfam9iLCBhYnJvYWRfdGltZSksDQogICAgICAgICAgICBsaXN0KHAxID0gfnF1YW50aWxlKC54LCAwLjAxKSwgcDk5ID0gfnF1YW50aWxlKC54LCAwLjk5KSwgbWVhbiA9IG1lYW4sIHNkPXNkKSwNCiAgICAgICAgICAgIC5uYW1lcyA9ICJ7LmNvbH0tey5mbn0iKSkgJT4lDQogIHBpdm90X2xvbmdlcigNCiAgICBjb2xzID0gLWdlbmRlciwNCiAgICBuYW1lc190byA9IGMoInZhcmlhYmxlIiwgInN0YXRpc3RpYyIpLCANCiAgICBuYW1lc19zZXAgPSAiLSINCiAgKSAlPiUNCiAgcGl2b3Rfd2lkZXIoDQogICAgbmFtZXNfZnJvbSA9IHN0YXRpc3RpYywNCiAgICB2YWx1ZXNfZnJvbSA9IHZhbHVlDQogICkgLT4gdDFfYWJyb2FkX2NvbnRpbg0KDQoNCmFicm9hZGFmdGVycGhkX2xvbmcgJT4lIGZpbHRlcihnZW5kZXI9PSJ3b21lbiIpIC0+IGRmX3dvbQ0KYWJyb2FkYWZ0ZXJwaGRfbG9uZyAlPiUgZmlsdGVyKGdlbmRlcj09Im1lbiIpIC0+IGRmX21lbg0KDQojIGNoZWNrIGlmIDElIGFuZCA5OSUgb2YgZHVtbWllcyBpcyBpbmRlZWQgMC8xDQojIGMocXVhbnRpbGUoZGZfbWVuJHRyYW5zX2x0LCAwLjAxKSwgcXVhbnRpbGUoZGZfbWVuJHRyYW5zX2x0LCAwLjk5KSkNCiMgYyhxdWFudGlsZShkZl9tZW4kdHJhbnNfc3QsIDAuMDEpLCBxdWFudGlsZShkZl9tZW4kdHJhbnNfc3QsIDAuOTkpKQ0KIyBjKHF1YW50aWxlKGRmX21lbiRjaGlsZF91NSwgMC4wMSksIHF1YW50aWxlKGRmX21lbiRjaGlsZF91NSwgMC45OSkpDQojIGMocXVhbnRpbGUoZGZfbWVuJHRlbXBvcmFyeV9lbXAsIDAuMDEpLCBxdWFudGlsZShkZl9tZW4kdGVtcG9yYXJ5X2VtcCwgMC45OSkpDQojIGMocXVhbnRpbGUoZGZfbWVuJHNlY3Rvcl9mb3JwciwgMC4wMSksIHF1YW50aWxlKGRmX21lbiRzZWN0b3JfZm9ycHIsIDAuOTkpKQ0KIyBjKHF1YW50aWxlKGRmX21lbiRzZWN0b3JfZ292LCAwLjAxKSwgcXVhbnRpbGUoZGZfbWVuJHNlY3Rvcl9nb3YsIDAuOTkpKQ0KIyBjKHF1YW50aWxlKGRmX21lbiRzZWN0b3Jfbm9ucHIsIDAuMDEpLCBxdWFudGlsZShkZl9tZW4kc2VjdG9yX25vbnByLCAwLjk5KSkNCiMgYyhxdWFudGlsZShkZl9tZW4kb3RoZXJqb2IsIDAuMDEpLCBxdWFudGlsZShkZl9tZW4kb3RoZXJqb2IsIDAuOTkpKQ0KIyBjKHF1YW50aWxlKGRmX21lbiRwYXJ0bmVyZWQsIDAuMDEpLCBxdWFudGlsZShkZl9tZW4kcGFydG5lcmVkLCAwLjk5KSkNCiMgYyhxdWFudGlsZShkZl93b20kdHJhbnNfbHQsIDAuMDEpLCBxdWFudGlsZShkZl93b20kdHJhbnNfbHQsIDAuOTkpKQ0KIyBjKHF1YW50aWxlKGRmX3dvbSR0cmFuc19zdCwgMC4wMSksIHF1YW50aWxlKGRmX3dvbSR0cmFuc19zdCwgMC45OSkpDQojIGMocXVhbnRpbGUoZGZfd29tJGNoaWxkX3U1LCAwLjAxKSwgcXVhbnRpbGUoZGZfd29tJGNoaWxkX3U1LCAwLjk5KSkNCiMgYyhxdWFudGlsZShkZl93b20kdGVtcG9yYXJ5X2VtcCwgMC4wMSksIHF1YW50aWxlKGRmX3dvbSR0ZW1wb3JhcnlfZW1wLCAwLjk5KSkNCiMgYyhxdWFudGlsZShkZl93b20kc2VjdG9yX2ZvcnByLCAwLjAxKSwgcXVhbnRpbGUoZGZfd29tJHNlY3Rvcl9mb3JwciwgMC45OSkpDQojIGMocXVhbnRpbGUoZGZfd29tJHNlY3Rvcl9nb3YsIDAuMDEpLCBxdWFudGlsZShkZl93b20kc2VjdG9yX2dvdiwgMC45OSkpDQojIGMocXVhbnRpbGUoZGZfd29tJHNlY3Rvcl9ub25wciwgMC4wMSksIHF1YW50aWxlKGRmX3dvbSRzZWN0b3Jfbm9ucHIsIDAuOTkpKQ0KIyBjKHF1YW50aWxlKGRmX3dvbSRvdGhlcmpvYiwgMC4wMSksIHF1YW50aWxlKGRmX3dvbSRvdGhlcmpvYiwgMC45OSkpDQojIGMocXVhbnRpbGUoZGZfd29tJHBhcnRuZXJlZCwgMC4wMSksIHF1YW50aWxlKGRmX3dvbSRwYXJ0bmVyZWQsIDAuOTkpKQ0KIyBpdCBpcyENCg0KDQp0MV9hYnJvYWRbYygzLDQsNzoxMiwxNCwxODoyMSwyNCksMV0gPC0gcmVwKDAuMDAwMSwgdGltZXM9bGVuZ3RoKHQxX2Ficm9hZFtjKDMsNCw3OjEyLDE0LDE4OjIxLDI0KSwxXSkpDQp0MV9hYnJvYWRbYygzLDQsNzoxMiwxNCwxODoyMSwyNCksMl0gPC0gcmVwKDEuMDAwMSwgdGltZXM9bGVuZ3RoKHQxX2Ficm9hZFtjKDMsNCw3OjEyLDE0LDE4OjIxLDI0KSwyXSkpDQp0MV9hYnJvYWRbYygzLDQsNzoxMiwxNCwxODoyMSwyNCksNV0gPC0gcmVwKDAuMDAwMSwgdGltZXM9bGVuZ3RoKHQxX2Ficm9hZFtjKDMsNCw3OjEyLDE0LDE4OjIxLDI0KSw1XSkpDQp0MV9hYnJvYWRbYygzLDQsNzoxMiwxNCwxODoyMSwyNCksNl0gPC0gcmVwKDEuMDAwMSwgdGltZXM9bGVuZ3RoKHQxX2Ficm9hZFtjKDMsNCw3OjEyLDE0LDE4OjIxLDI0KSw2XSkpDQoNCiMgdGltZSBhdCB0cmFuc2l0aW9uDQpkZl93b20gJT4lIGZpbHRlcih0cmFuc19zdD09MSkgLT4gd29tdHJhbnMNCmRmX21lbiAlPiUgZmlsdGVyKHRyYW5zX3N0PT0xKSAtPiBtZW50cmFucw0KDQojIHdvbWVuIA0KdDFfYWJyb2FkW2MoMToyKSxjKDE6NCldIDwtIHQxX2Ficm9hZF9jb250aW5bYyg5OjEwKSxjKDM6NildICMgcGF5DQp0MV9hYnJvYWRbMywzXSA8LSBtZWFuKGRmX3dvbSR0cmFuc19zdCkNCnQxX2Ficm9hZFs0LDNdIDwtIG1lYW4oZGZfd29tJHRyYW5zX2x0KQ0KdDFfYWJyb2FkWzUsYygxOjQpXSA8LSB0MV9hYnJvYWRfY29udGluWzExLCBjKDM6NildICMgdGltZQ0KdDFfYWJyb2FkW2MoNzoxMSksM108LSByb3VuZChwcm9wLnRhYmxlKHRhYmxlKGRmX3dvbSRwaGRfZGlzY2kpKSwgZGlnaXRzPTIpW2MoMTo1KV0gIyBkaXNjaQ0KdDFfYWJyb2FkWzEyLDNdIDwtIG1lYW4oZGZfd29tJGNoaWxkX3U1KQ0KdDFfYWJyb2FkWzEzLGMoMTo0KV0gPC0gdDFfYWJyb2FkX2NvbnRpblsxMiwgYygzOjYpXSAjIGNvbnRyYWN0IGhvdXJzDQp0MV9hYnJvYWRbMTQsM10gPC0gbWVhbihkZl93b20kdGVtcG9yYXJ5X2VtcCkNCnQxX2Ficm9hZFtjKDE1OjE2KSxjKDE6NCldIDwtIHQxX2Ficm9hZF9jb250aW5bYygxMzoxNCksYygzOjYpXSAjIHBoZCBjb2hvcnQsIHNhdGlzDQp0MV9hYnJvYWRbMTgsIDNdIDwtIG1lYW4oZGZfd29tJHNlY3Rvcl9mb3JwcikNCnQxX2Ficm9hZFsxOSwgM10gPC0gbWVhbihkZl93b20kc2VjdG9yX2dvdikNCnQxX2Ficm9hZFsyMCwgM10gPC0gbWVhbihkZl93b20kc2VjdG9yX25vbnByKQ0KdDFfYWJyb2FkWzIxLCAzXSA8LSBtZWFuKGRmX3dvbSRvdGhlcmpvYikNCnQxX2Ficm9hZFtjKDIyOjIzKSxjKDE6NCldIDwtIHQxX2Ficm9hZF9jb250aW5bYygxNToxNiksIGMoMzo2KV0gIyBicmVhayBqb2IsIGFicm9hZA0KdDFfYWJyb2FkWzI0LCAzXSA8LSBtZWFuKGRmX3dvbSRwYXJ0bmVyZWQpDQp0MV9hYnJvYWRbMjUsIDFdIDwtIHF1YW50aWxlKHdvbXRyYW5zJHQsIDAuMDEpDQp0MV9hYnJvYWRbMjUsIDJdIDwtIHF1YW50aWxlKHdvbXRyYW5zJHQsIDAuOTkpDQp0MV9hYnJvYWRbMjUsIDNdIDwtIG1lYW4od29tdHJhbnMkdCkNCnQxX2Ficm9hZFsyNSwgNF0gPC0gc2Qod29tdHJhbnMkdCkNCnQxX2Ficm9hZFsyNiwgM10gPC0gbnJvdyhkZl93b21bIWR1cGxpY2F0ZWQoZGZfd29tJFJJTlBFUlNPT04pLF0pDQp0MV9hYnJvYWRbMjcsIDNdIDwtIG5yb3coZGZfd29tKQ0KDQojIG1lbiANCnQxX2Ficm9hZFtjKDE6MiksYyg1OjgpXSA8LSB0MV9hYnJvYWRfY29udGluW2MoMToyKSxjKDM6NildICMgcGF5DQp0MV9hYnJvYWRbMyw3XSA8LSBtZWFuKGRmX21lbiR0cmFuc19zdCkNCnQxX2Ficm9hZFs0LDddIDwtIG1lYW4oZGZfbWVuJHRyYW5zX2x0KQ0KdDFfYWJyb2FkWzUsYyg1OjgpXSA8LSB0MV9hYnJvYWRfY29udGluWzMsIGMoMzo2KV0gIyB0aW1lDQp0MV9hYnJvYWRbYyg3OjExKSw3XTwtIHJvdW5kKHByb3AudGFibGUodGFibGUoZGZfbWVuJHBoZF9kaXNjaSkpLCBkaWdpdHM9MilbYygxOjUpXSAjIGRpc2NpDQp0MV9hYnJvYWRbMTIsN10gPC0gbWVhbihkZl9tZW4kY2hpbGRfdTUpDQp0MV9hYnJvYWRbMTMsYyg1OjgpXSA8LSB0MV9hYnJvYWRfY29udGluWzQsIGMoMzo2KV0gIyBjb250cmFjdCBob3Vycw0KdDFfYWJyb2FkWzE0LDddIDwtIG1lYW4oZGZfbWVuJHRlbXBvcmFyeV9lbXApDQp0MV9hYnJvYWRbYygxNToxNiksYyg1OjgpXSA8LSB0MV9hYnJvYWRfY29udGluW2MoNTo2KSxjKDM6NildICMgcGhkIGNvaG9ydCwgc2F0aXMNCnQxX2Ficm9hZFsxOCwgN10gPC0gbWVhbihkZl9tZW4kc2VjdG9yX2ZvcnByKQ0KdDFfYWJyb2FkWzE5LCA3XSA8LSBtZWFuKGRmX21lbiRzZWN0b3JfZ292KQ0KdDFfYWJyb2FkWzIwLCA3XSA8LSBtZWFuKGRmX21lbiRzZWN0b3Jfbm9ucHIpDQp0MV9hYnJvYWRbMjEsIDddIDwtIG1lYW4oZGZfbWVuJG90aGVyam9iKQ0KdDFfYWJyb2FkW2MoMjI6MjMpLGMoNTo4KV0gPC0gdDFfYWJyb2FkX2NvbnRpbltjKDc6OCksIGMoMzo2KV0gIyBicmVhayBqb2IsIGFicm9hZA0KdDFfYWJyb2FkWzI0LCA3XSA8LSBtZWFuKGRmX21lbiRwYXJ0bmVyZWQpDQp0MV9hYnJvYWRbMjUsIDVdIDwtIHF1YW50aWxlKG1lbnRyYW5zJHQsIDAuMDEpDQp0MV9hYnJvYWRbMjUsIDZdIDwtIHF1YW50aWxlKG1lbnRyYW5zJHQsIDAuOTkpDQp0MV9hYnJvYWRbMjUsIDddIDwtIG1lYW4obWVudHJhbnMkdCkNCnQxX2Ficm9hZFsyNSwgOF0gPC0gc2QobWVudHJhbnMkdCkNCnQxX2Ficm9hZFsyNiwgN10gPC0gbnJvdyhkZl9tZW5bIWR1cGxpY2F0ZWQoZGZfbWVuJFJJTlBFUlNPT04pLF0pDQp0MV9hYnJvYWRbMjcsIDddIDwtIG5yb3coZGZfbWVuKQ0KDQp0MV9hYnJvYWRbYygxOjI1KSxdIDwtIHJvdW5kKHQxX2Ficm9hZFtjKDE6MjUpLF0sIGRpZ2l0cz0yKQ0KdDFfYWJyb2FkW2MoMjY6MjcpLF0gPC0gYWJzKHQxX2Ficm9hZFtjKDI2OjI3KSxdKQ0KDQp0MV9hYnJvYWRbMjYsXSA8LSByb3VuZChhYnModDFfYWJyb2FkWzI2LF0pLCBkaWdpdHM9MCkNCnQxX2Ficm9hZFsyNyxdIDwtIHJvdW5kKGFicyh0MV9hYnJvYWRbMjcsXSksIGRpZ2l0cz0wKQ0KDQp0MV9hYnJvYWRbaXMubmEodDFfYWJyb2FkKV0gPC0gIiINCg0KdDFfYWJyb2FkIDwtIHQxX2Ficm9hZFtjKDE6Miw0OjIzLDI2OjI3KSxdICMgcmVtb3ZpbmcgdHJhbnNpdGlvbiBjb2x1bW5zIGFzIHRoZXNlIGRvbid0IG1ha2Ugc2Vuc2UNCg0KdDFfYWJyb2FkIDwtIHQxX2Ficm9hZFssYygzLDQsNyw4KV0gIyBubyBtaW4vbWF4IGR1ZSB0byBzYW1wbGUgc2l6ZSByZXN0cmljdGlvbnMNCg0KDQpEZXNjcmlwdGl2ZXNfVGFibGUgPC0gdDFfYWJyb2FkDQoNCndyaXRlLmNzdih0MV9hYnJvYWQsIGZpbGU9IkY6L0dQRV9zYWxhcmlzL1ImUi9kZXNjcmlwdGl2ZV90YWJfYWJyb2FkcGhkLmNzdiIpDQoNCmBgYA0KDQoNCmBgYHtyfQ0KDQpUYWJsZTFfYWJyb2FkcGhkIDwtIHJlYWQuY3N2KGZpbGU9IlRhYmxlMV9hYnJvYWRwaGQuY3N2IiwgaGVhZGVyPVRSVUUsIGNoZWNrLm5hbWVzPUZBTFNFKQ0KDQpUYWJsZTFfYWJyb2FkcGhkW2lzLm5hKFRhYmxlMV9hYnJvYWRwaGQpXSA8LSAiIg0KDQprYWJsZShUYWJsZTFfYWJyb2FkcGhkLCBjYXB0aW9uID0gIjxiPlRhYmxlOiBkZXNjcmlwdGl2ZSBzdGF0aXN0aWNzIGZvciBQaERzIHdobyB3ZW50IGFicm9hZCBhZnRlciB0aGVpciBQaEQ8L2I+IikgJT4lDQogIGthYmxlX3N0eWxpbmcoYm9vdHN0cmFwX29wdGlvbnMgPSBjKCJzdHJpcGVkIiwgImhvdmVyIiwgImNvbmRlbnNlZCIsICJyZXNwb25zaXZlIikpDQoNCg0KDQpgYGANCg0KDQoNCg0KVC10ZXN0IHRhYmxlOiBhcmUgcGVvcGxlIHdobyBnbyBhYnJvYWQgYWZ0ZXIgdGhlaXIgUGhEIGRpZmZlcmVudCBmcm9tIHRob3NlIHdobyBkbyBub3Q/DQoNCmBgYHtyLCBldmFsPUZBTFNFfQ0KDQoNCiMgY2hpLXNxdWFyZSBnZW5kZXIgZGlzdHJpOg0KZ2VuZGVyX3JlZyA8LSB0YWJsZShkZl9tbWZjJGdlbmRlclshZHVwbGljYXRlZChkZl9tbWZjJFJJTlBFUlNPT04pXSkNCmdlbmRlcl9hYnIgPC0gdGFibGUoYWJyb2FkYWZ0ZXJwaGRfbG9uZyRnZW5kZXJbIWR1cGxpY2F0ZWQoYWJyb2FkYWZ0ZXJwaGRfbG9uZyRSSU5QRVJTT09OKV0pDQpnZW5kZXJfZGlzdHJpIDwtIHJiaW5kLmRhdGEuZnJhbWUoZ2VuZGVyX3JlZywgZ2VuZGVyX2FicikNCg0Kcm93bmFtZXMoZ2VuZGVyX2Rpc3RyaSkgPC0gYygiTWFpbiBkYXRhIiwgIkFicm9hZCBhZnRlciBQaEQiKQ0KY29sbmFtZXMoZ2VuZGVyX2Rpc3RyaSkgPC0gYygiTWVuIiwgIldvbWVuIikNCg0KY2hpc3FfZ2VuZGVyIDwtIGNoaXNxLnRlc3QoZ2VuZGVyX2Rpc3RyaSkNCg0KZ2VuZGVyX2Rpc3RyaSRjaGlzcSA8LSBjaGlzcV9nZW5kZXIkc3RhdGlzdGljDQpnZW5kZXJfZGlzdHJpJGNoaXNxX2RmIDwtIGNoaXNxX2dlbmRlciRwYXJhbWV0ZXINCmdlbmRlcl9kaXN0cmkkY2hpc3FfcCA8LSBjaGlzcV9nZW5kZXIkcC52YWx1ZQ0KDQp3cml0ZS5jc3YoZ2VuZGVyX2Rpc3RyaSwgZmlsZT0iRjovR1BFX3NhbGFyaXMvUiZSL2dlbmRlcl9kaXN0cmlfYWJyb2FkLmNzdiIpDQoNCmRmX21tZmMgJT4lDQogIG11dGF0ZShkaXNjaV9oZWFsdGggPSBpZmVsc2UocGhkX2Rpc2NpPT0iSGVhbHRoIHNjaWVuY2VzIiwgMSwgMCksDQogICAgICAgICBkaXNjaV9zb2NpYWwgPSBpZmVsc2UocGhkX2Rpc2NpPT0iU29jaWFsIHNjaWVuY2VzIiwgMSwgMCksDQogICAgICAgICBkaXNjaV9uYXR1cmFsID0gaWZlbHNlKHBoZF9kaXNjaT09Ik5hdHVyYWwgc2NpZW5jZXMgYW5kIG1hdGhlbWF0aWNzIiwgMSwgMCksDQogICAgICAgICBkaXNjaV9lbmdpbmVlcmluZyA9IGlmZWxzZShwaGRfZGlzY2k9PSJFbmdpbmVlcmluZyIsIDEsIDApLA0KICAgICAgICAgZGlzY2lfaHVtYW5pdGllcyA9IGlmZWxzZShwaGRfZGlzY2k9PSJIdW1hbml0aWVzIiwgMSwgMCkpIC0+IGRmX21tZmMNCg0KDQphYnJvYWRhZnRlcnBoZF9sb25nICU+JQ0KICBtdXRhdGUoZGlzY2lfaGVhbHRoID0gaWZlbHNlKHBoZF9kaXNjaT09IkhlYWx0aCBzY2llbmNlcyIsIDEsIDApLA0KICAgICAgICAgZGlzY2lfc29jaWFsID0gaWZlbHNlKHBoZF9kaXNjaT09IlNvY2lhbCBzY2llbmNlcyIsIDEsIDApLA0KICAgICAgICAgZGlzY2lfbmF0dXJhbCA9IGlmZWxzZShwaGRfZGlzY2k9PSJOYXR1cmFsIHNjaWVuY2VzIGFuZCBtYXRoZW1hdGljcyIsIDEsIDApLA0KICAgICAgICAgZGlzY2lfZW5naW5lZXJpbmcgPSBpZmVsc2UocGhkX2Rpc2NpPT0iRW5naW5lZXJpbmciLCAxLCAwKSwNCiAgICAgICAgIGRpc2NpX2h1bWFuaXRpZXMgPSBpZmVsc2UocGhkX2Rpc2NpPT0iSHVtYW5pdGllcyIsIDEsIDApKSAtPiBhYnJvYWRhZnRlcnBoZF9sb25nDQoNCg0KDQpkZl9tbWZjICU+JSBmaWx0ZXIoZ2VuZGVyPT0id29tZW4iKSAtPiBkZl93b20NCmRmX21tZmMgJT4lIGZpbHRlcihnZW5kZXI9PSJtZW4iKSAtPiBkZl9tZW4NCmFicm9hZGFmdGVycGhkX2xvbmcgJT4lIGZpbHRlcihnZW5kZXI9PSJ3b21lbiIpIC0+IGRmX3dvbV9hDQphYnJvYWRhZnRlcnBoZF9sb25nICU+JSBmaWx0ZXIoZ2VuZGVyPT0ibWVuIikgLT4gZGZfbWVuX2ENCg0KdDFfdiA8LSB0LnRlc3QoZGZfd29tJHJlYWxwYXlfY29ycjIsIGRmX3dvbV9hJHJlYWxwYXlfY29ycjIpDQp0Ml92IDwtIHQudGVzdChkZl93b20kbG9nX3JlYWxwYXksIGRmX3dvbV9hJGxvZ19yZWFscGF5KQ0KdDNfdiA8LSB0LnRlc3QoZGZfd29tJHQsIGRmX3dvbV9hJHQpDQp0NF92IDwtIHQudGVzdChkZl93b20kZGlzY2lfaGVhbHRoLCBkZl93b21fYSRkaXNjaV9oZWFsdGgpDQp0NV92IDwtIHQudGVzdChkZl93b20kZGlzY2lfc29jaWFsLCBkZl93b21fYSRkaXNjaV9zb2NpYWwpDQp0Nl92IDwtIHQudGVzdChkZl93b20kZGlzY2lfbmF0dXJhbCwgZGZfd29tX2EkZGlzY2lfbmF0dXJhbCkNCnQ3X3YgPC0gdC50ZXN0KGRmX3dvbSRkaXNjaV9lbmdpbmVlcmluZywgZGZfd29tX2EkZGlzY2lfZW5naW5lZXJpbmcpDQp0OF92IDwtIHQudGVzdChkZl93b20kZGlzY2lfaHVtYW5pdGllcywgZGZfd29tX2EkZGlzY2lfaHVtYW5pdGllcykNCnQ5X3YgPC0gdC50ZXN0KGRmX3dvbSRjaGlsZF91NSwgZGZfd29tX2EkY2hpbGRfdTUpDQp0MTBfdiA8LSB0LnRlc3QoZGZfd29tJGxvZ19ocnMsIGRmX3dvbV9hJGxvZ19ocnMpDQp0MTFfdiA8LSB0LnRlc3QoZGZfd29tJHRlbXBvcmFyeV9lbXAsIGRmX3dvbV9hJHRlbXBvcmFyeV9lbXApDQp0MTJfdiA8LSB0LnRlc3QoZGZfd29tJHBoZF9jb2gsIGRmX3dvbV9hJHBoZF9jb2gpDQp0MTNfdiA8LSB0LnRlc3QoZGZfd29tJHBoZF9zYXQsIGRmX3dvbV9hJHBoZF9zYXQpDQp0MTRfdiA8LSB0LnRlc3QoZGZfd29tJHNlY3Rvcl9mb3JwciwgZGZfd29tX2Ekc2VjdG9yX2ZvcnByKQ0KdDE1X3YgPC0gdC50ZXN0KGRmX3dvbSRzZWN0b3JfZ292LCBkZl93b21fYSRzZWN0b3JfZ292KQ0KdDE2X3YgPC0gdC50ZXN0KGRmX3dvbSRzZWN0b3Jfbm9ucHIsIGRmX3dvbV9hJHNlY3Rvcl9ub25wcikNCnQxN192IDwtIHQudGVzdChkZl93b20kb3RoZXJqb2IsIGRmX3dvbV9hJG90aGVyam9iKQ0KdDE4X3YgPC0gdC50ZXN0KGRmX3dvbSRicmVha19qb2IsIGRmX3dvbV9hJGJyZWFrX2pvYikNCnQxOV92IDwtIHQudGVzdChkZl93b20kYWJyb2FkX3RpbWUsIGRmX3dvbV9hJGFicm9hZF90aW1lKQ0KdDIwX3YgPC0gdC50ZXN0KGRmX3dvbSRwYXJ0bmVyZWQsIGRmX3dvbV9hJHBhcnRuZXJlZCkNCg0KDQp0MV9tIDwtIHQudGVzdChkZl9tZW4kcmVhbHBheV9jb3JyMiwgZGZfbWVuX2EkcmVhbHBheV9jb3JyMikNCnQyX20gPC0gdC50ZXN0KGRmX21lbiRsb2dfcmVhbHBheSwgZGZfbWVuX2EkbG9nX3JlYWxwYXkpDQp0M19tIDwtIHQudGVzdChkZl9tZW4kdCwgZGZfbWVuX2EkdCkNCnQ0X20gPC0gdC50ZXN0KGRmX21lbiRkaXNjaV9oZWFsdGgsIGRmX21lbl9hJGRpc2NpX2hlYWx0aCkNCnQ1X20gPC0gdC50ZXN0KGRmX21lbiRkaXNjaV9zb2NpYWwsIGRmX21lbl9hJGRpc2NpX3NvY2lhbCkNCnQ2X20gPC0gdC50ZXN0KGRmX21lbiRkaXNjaV9uYXR1cmFsLCBkZl9tZW5fYSRkaXNjaV9uYXR1cmFsKQ0KdDdfbSA8LSB0LnRlc3QoZGZfbWVuJGRpc2NpX2VuZ2luZWVyaW5nLCBkZl9tZW5fYSRkaXNjaV9lbmdpbmVlcmluZykNCnQ4X20gPC0gdC50ZXN0KGRmX21lbiRkaXNjaV9odW1hbml0aWVzLCBkZl9tZW5fYSRkaXNjaV9odW1hbml0aWVzKQ0KdDlfbSA8LSB0LnRlc3QoZGZfbWVuJGNoaWxkX3U1LCBkZl9tZW5fYSRjaGlsZF91NSkNCnQxMF9tIDwtIHQudGVzdChkZl9tZW4kbG9nX2hycywgZGZfbWVuX2EkbG9nX2hycykNCnQxMV9tIDwtIHQudGVzdChkZl9tZW4kdGVtcG9yYXJ5X2VtcCwgZGZfbWVuX2EkdGVtcG9yYXJ5X2VtcCkNCnQxMl9tIDwtIHQudGVzdChkZl9tZW4kcGhkX2NvaCwgZGZfbWVuX2EkcGhkX2NvaCkNCnQxM19tIDwtIHQudGVzdChkZl9tZW4kcGhkX3NhdCwgZGZfbWVuX2EkcGhkX3NhdCkNCnQxNF9tIDwtIHQudGVzdChkZl9tZW4kc2VjdG9yX2ZvcnByLCBkZl9tZW5fYSRzZWN0b3JfZm9ycHIpDQp0MTVfbSA8LSB0LnRlc3QoZGZfbWVuJHNlY3Rvcl9nb3YsIGRmX21lbl9hJHNlY3Rvcl9nb3YpDQp0MTZfbSA8LSB0LnRlc3QoZGZfbWVuJHNlY3Rvcl9ub25wciwgZGZfbWVuX2Ekc2VjdG9yX25vbnByKQ0KdDE3X20gPC0gdC50ZXN0KGRmX21lbiRvdGhlcmpvYiwgZGZfbWVuX2Ekb3RoZXJqb2IpDQp0MThfbSA8LSB0LnRlc3QoZGZfbWVuJGJyZWFrX2pvYiwgZGZfbWVuX2EkYnJlYWtfam9iKQ0KdDE5X20gPC0gdC50ZXN0KGRmX21lbiRhYnJvYWRfdGltZSwgZGZfbWVuX2EkYWJyb2FkX3RpbWUpDQp0MjBfbSA8LSB0LnRlc3QoZGZfbWVuJHBhcnRuZXJlZCwgZGZfbWVuX2EkcGFydG5lcmVkKQ0KDQpleHRyYWN0X3QgPC0gZnVuY3Rpb24odHRlc3QpIHsNCiAgdGliYmxlKA0KICAgIHRfdmFsdWUgPSB1bm5hbWUodHRlc3Qkc3RhdGlzdGljKSwNCiAgICBkZiA9IHVubmFtZSh0dGVzdCRwYXJhbWV0ZXIpLA0KICAgIHBfdmFsdWUgPSB1bm5hbWUodHRlc3QkcC52YWx1ZSkNCiAgKQ0KfQ0KDQp0ZXN0X3dvbSA8LSBtZ2V0KHBhc3RlMCgidCIsIDE6MjAsICJfdiIpKQ0KdGVzdF9tZW4gPC0gbWdldChwYXN0ZTAoInQiLCAxOjIwLCAiX20iKSkNCg0KDQp2YXJuYW1lcyA8LSBjKCJSZWFsIG1vbnRobHkgcGF5IiwgIkxvZyByZWFsIG1vbnRobHkgcGF5IiwgIlRpbWUiLCAiUGhEIGRpc2NpcGxpbmU6IEhlYWx0aCBzY2llbmNlcyIsICJQaEQgZGlzY2lwbGluZTogU29jaWFsIHNjaWVuY2VzIiwgIlBoRCBkaXNjaXBsaW5lOiBOYXR1cmFsIHNjaWVuY2VzICYgbWF0aGVtYXRpY3MiLCAiUGhEIGRpc2NpcGxpbmU6IEVuZ2luZWVyaW5nIiwgIlBoRCBkaXNjaXBsaW5lOiBIdW1hbml0aWVzIiwgIkNoaWxkIHVuZGVyIDUiLCAiTG9nIE1vbnRobHkgY29udHJhY3QgaG91cnMiLCAiVGVtcG9yYXJ5IGNvbnRyYWN0IiwgIlBoRCBjb2hvcnQiLCAiUGhEIHNhdGlzZmFjdGlvbiIsICJTZWN0b3I6IEZvci1wcm9maXQiLCAiU2VjdG9yOiBHb3Zlcm5tZW50IiwgIlNlY3RvcjpOb24tcHJvZml0IiwgIk90aGVyIGpvYiIsICJCcmVhayBpbiBEdXRjaCBlbXBsb3ltZW50IiwgIlBlcmlvZCBhYnJvYWQiLCAiUGFydG5lcmVkIikNCg0KDQp0ZXN0X2RmX3dvbSA8LSBiaW5kX3Jvd3MobGFwcGx5KHRlc3Rfd29tLCBleHRyYWN0X3QpLCAuaWQ9InRlc3RfaWQiKSAlPiUNCiAgbXV0YXRlKHZhcmlhYmxlPXZhcm5hbWVzLA0KICAgICAgICAgTl9vYnMgPSAobnJvdyhkZl93b20pICsgbnJvdyhkZl93b21fYSkpLA0KICAgICAgICAgZ3JvdXA9IndvbWVuIikNCg0KdGVzdF9kZl9tZW4gPC0gYmluZF9yb3dzKGxhcHBseSh0ZXN0X21lbiwgZXh0cmFjdF90KSwgLmlkPSJ0ZXN0X2lkIikgJT4lDQogIG11dGF0ZSh2YXJpYWJsZT12YXJuYW1lcywgDQogICAgICAgICBOX29icyA9IChucm93KGRmX21lbikgKyBucm93KGRmX21lbl9hKSksDQogICAgICAgICBncm91cD0ibWVuIikNCg0KDQp0ZXN0X2RmX2FsbCA8LSBiaW5kX3Jvd3ModGVzdF9kZl9tZW4sIHRlc3RfZGZfd29tKQ0KDQp0ZXN0X2RmX2FsbCRwc21hbGwgPC0gaWZlbHNlKHRlc3RfZGZfYWxsJHBfdmFsdWU8LjAwMSwgMSwgMCkNCg0KDQp0ZXN0X2RmX2FsbCR0dGVzdCA8LSBwYXN0ZTAoInQoIiwgcm91bmQodGVzdF9kZl9hbGwkZGYsIDIpLCAiKSA9ICIsIHJvdW5kKHRlc3RfZGZfYWxsJHRfdmFsdWUsIDIpLCAiLCBwICIsIGlmZWxzZSh0ZXN0X2RmX2FsbCRwc21hbGw9PTEsICI8IC4wMDEiLCBwYXN0ZTAoIj0gIiwgcm91bmQodGVzdF9kZl9hbGwkcF92YWx1ZSwgMikpKSkNCg0KDQp3cml0ZS5jc3YodGVzdF9kZl9hbGwsIGZpbGU9IkY6L0dQRV9zYWxhcmlzL1ImUi90dGVzdHNfbWFpbl9hYnJvYWQuY3N2IikNCg0KYGBgDQoNCg0KYGBge3J9DQoNCnR0ZXN0c19tYWluYWJyb2FkIDwtIHJlYWQuY3N2KGZpbGU9InR0ZXN0c19tYWluX2Ficm9hZC5jc3YiLCBoZWFkZXI9VFJVRSwgY2hlY2submFtZXMgPSBGQUxTRSkNCg0KdHRlc3RzX21haW5hYnJvYWRbLC0xXQ0KDQprYWJsZSh0dGVzdHNfbWFpbmFicm9hZCwgY2FwdGlvbiA9ICI8Yj5ULXRlc3RzIGNvbXBhcmluZyBQaERzIHdobyB3ZW50IGFicm9hZCBhZnRlciB0aGVpciBQaEQgYW5kIHRob3NlIHdobyBkaWQgbm90PC9iPiIpICU+JQ0KICBrYWJsZV9zdHlsaW5nKGJvb3RzdHJhcF9vcHRpb25zID0gYygic3RyaXBlZCIsICJob3ZlciIsICJjb25kZW5zZWQiLCAicmVzcG9uc2l2ZSIpKQ0KDQpgYGANCg0KDQoNCiMgT3RoZXIgam9iDQoNCkFyZSBwZW9wbGUgd2l0aC9vdXQgYW4gb3RoZXIgam9iIG1vcmUgbGlrZWx5IHRvIG1ha2UgYSB0cmFuc2l0aW9uPw0KDQoNCmBgYHtyLCBldmFsPUZBTFNFfQ0KDQpkZl9tbWZjICU+JQ0KICBncm91cF9ieShSSU5QRVJTT09OKSAlPiUNCiAgc3VtbWFyaXplKGV2ZXJ0cmFucyA9IG1heCh0cmFuc19sdCkpIC0+IGV2ZXJ0cmFucw0KDQpkZl9tbWZjICU+JQ0KICBncm91cF9ieShSSU5QRVJTT09OKSAlPiUNCiAgZmlsdGVyKHVuaT09MSkgJT4lDQogIHN1bW1hcml6ZShvdGhlcmpvYl9tID0gbWF4KG90aGVyam9iKSwNCiAgICAgICAgICAgIHRpbWVfdW5pID0gbWF4KHQpKSAtPiBjaGVja3MNCg0KZXZlcnRyYW5zICU+JQ0KICBsZWZ0X2pvaW4oY2hlY2tzLCBieT1jKCJSSU5QRVJTT09OIikpIC0+IGV2ZXJ0cmFuc19vdGhlcmpvYg0KDQp0cmFuc19ieV9vaiA8LSBhcy5kYXRhLmZyYW1lKHRhYmxlKCJXaWxsIFRyYW5zaXRpb24iID0gZXZlcnRyYW5zX290aGVyam9iJGV2ZXJ0cmFucywgIk90aGVyIGpvYiIgPSBldmVydHJhbnNfb3RoZXJqb2Ikb3RoZXJqb2JfbSkpDQoNCndyaXRlLmNzdih0cmFuc19ieV9vaiwgZmlsZT0iRjovR1BFX3NhbGFyaXMvUiZSL3RyYW5zaXRpb25zX290aGVyam9iLmNzdiIpDQoNCg0KDQpkZl9vdGhlciAlPiUNCiAgZ3JvdXBfYnkodW5pLCBnZW5kZXIpICU+JQ0KICBzdW1tYXJpc2UobWVhbl9wZXJjX3BheV9qb2IxID0gbWVhbihwZXJjX3BheV9qb2IxKSwNCiAgICAgICAgICAgIHNkX3BlcmNfcGF5X2pvYjEgPSBzZChwZXJjX3BheV9qb2IxKSwNCiAgICAgICAgICAgIG1lYW5fcGVyY19ocnNfam9iMSA9IG1lYW4ocGVyY19ocnNfam9iMSksDQogICAgICAgICAgICBzZF9wZXJjX2hyc19qb2IxID0gc2QocGVyY19ocnNfam9iMSksDQogICAgICAgICAgICBuID0gbigpLA0KICAgICAgICAgICAgbl9vYnMgPSBuX2Rpc3RpbmN0KFJJTlBFUlNPT04pKSAtPiBvdGhlcmpvYl9zdW1tX2dlbmRlcg0KDQpkZl9vdGhlciAlPiUNCiAgZ3JvdXBfYnkodW5pKSAlPiUNCiAgc3VtbWFyaXNlKG1lYW5fcGVyY19wYXlfam9iMSA9IG1lYW4ocGVyY19wYXlfam9iMSksDQogICAgICAgICAgICBzZF9wZXJjX3BheV9qb2IxID0gc2QocGVyY19wYXlfam9iMSksDQogICAgICAgICAgICBtZWFuX3BlcmNfaHJzX2pvYjEgPSBtZWFuKHBlcmNfaHJzX2pvYjEpLA0KICAgICAgICAgICAgc2RfcGVyY19ocnNfam9iMSA9IHNkKHBlcmNfaHJzX2pvYjEpLA0KICAgICAgICAgICAgbiA9IG4oKSwNCiAgICAgICAgICAgIG5fb2JzID0gbl9kaXN0aW5jdChSSU5QRVJTT09OKSkgJT4lDQogIG11dGF0ZShnZW5kZXIgPSAiYWxsIikgLT4gb3RoZXJqb2Jfc3VtbQ0KDQpvdGhlcmpvYl9zdW1tIDwtIHJiaW5kLmRhdGEuZnJhbWUob3RoZXJqb2Jfc3VtbV9nZW5kZXIsIG90aGVyam9iX3N1bW0pDQoNCg0Kd3JpdGUuY3N2KG90aGVyam9iX3N1bW0sIGZpbGU9IkY6L0dQRV9zYWxhcmlzL1ImUi9kZXNjcmlwdGl2ZV90YWJfb3RoZXJqb2IuY3N2IikNCg0KYGBgDQoNCg0KYGBge3J9DQoNCnRyYW5zaXRpb25zX290aGVyam9iIDwtIHJlYWQuY3N2KGZpbGU9InRyYW5zaXRpb25zX290aGVyam9iLmNzdiIsIGhlYWRlciA9IFRSVUUsIGNoZWNrLm5hbWVzID0gRkFMU0UpDQoNCiMgaG93IG9mdGVuIGRvIHBlb3BsZSB3aXRoICgxKSBhbmQgd2l0aG91dCBhbiBvdGhlciBqb2IgKDApIG1ha2UgYSB0cmFuc2l0aW9uPw0KdHJhbnNpdGlvbnNfb3RoZXJqb2INCg0KDQojIE9mIHBlb3BsZSB3aXRoIGFuIGV4dHJhIGpvYiwgd2hhdCBwZXJjZW50YWdlIG9mIHRoZWlyIGVhcm5pbmdzIGFuZCB3b3JrIGhvdXJzIGNvbWUgZnJvbSB0aGVpciBtYWluIGpvYj8gU3BsaXQgb3V0IGJ5IGdlbmRlciAoMT1tZW47Mj13b21lbikgYW5kIHdoZXRoZXIgdGhlaXIgbWFpbiBqb2IgaXMgYXQgdGhlIHVuaSAoMC8xKQ0KVGFibGUxX290aGVyam9iIDwtIHJlYWQuY3N2KGZpbGU9IlRhYmxlMV9vdGhlcmpvYi5jc3YiLCBoZWFkZXIgPSBUUlVFLCBjaGVjay5uYW1lcyA9IEZBTFNFKQ0KDQpUYWJsZTFfb3RoZXJqb2JbLC0xXQ0KDQprYWJsZShUYWJsZTFfb3RoZXJqb2IsIGNhcHRpb24gPSAiPGI+UGVyY2VudGFnZSBvZiBlYXJuaW5ncyBhbmQgd29yayBob3VycyBoYXVsZWQgZnJvbSBtYWluIGpvYiwgZm9yIHJlc2VhcmNoZXJzIHdpdGggbW9yZSB0aGFuIDEgam9iPC9iPiIpICU+JQ0KICBrYWJsZV9zdHlsaW5nKGJvb3RzdHJhcF9vcHRpb25zID0gYygic3RyaXBlZCIsICJob3ZlciIsICJjb25kZW5zZWQiLCAicmVzcG9uc2l2ZSIpKQ0KDQoNCmBgYA0KDQoNCg==