Basics
Data summary
metadata1 %>%
group_by(T_SURVEY_NAME) %>%
summarise(n_surveys = n_distinct(T_SURVEY_ID),
n_countries = n_distinct(T_SURVEY_COUNTRY),
n_waves = n_distinct(T_SURVEY_ROUND),
min_year = min(T_SURVEY_YEAR),
max_year = max(T_SURVEY_YEAR))
There are 45 countries altogether. Of those, 17 are not included in all projects:
metadata1 %>%
count(T_SURVEY_NAME, T_SURVEY_COUNTRY) %>%
spread(T_SURVEY_NAME, n) %>%
filter(is.na(EQLS + ESS + EVS + ISSP))
Excess bias
by project
Proportion of surveys with excess (> 1.96) absolute bias:
metadata1 %>%
mutate(is_sig = Q_Abs_bias_internal_criteria > 1.96) %>%
count(T_SURVEY_NAME, is_sig) %>%
group_by(T_SURVEY_NAME) %>%
mutate(prop_sig = round(n / sum(n), 3)) %>%
filter(is_sig == TRUE) %>%
select(T_SURVEY_NAME, prop_sig)
2008 was a difficult year for surveys?
Numbers above bars indicate the number of surveys for which bias was possible to calculate.
part1 <- metadata1 %>%
drop_na(Q_Abs_bias_internal_criteria) %>%
filter(T_SURVEY_NAME != "ISSP") %>%
mutate(is_sig = Q_Abs_bias_internal_criteria > 1.96,
round = gsub("^[A-Z]{1,4}", "", T_SURVEY_ROUND)) %>%
count(T_SURVEY_NAME, round, is_sig) %>%
group_by(T_SURVEY_NAME, round) %>%
mutate(prop_sig = n / sum(n),
nsurveys = sum(n)) %>%
filter(is_sig == TRUE) %>%
ggplot(.) +
geom_bar(aes(x = round, y = prop_sig), stat = "Identity", fill = "gray70") +
geom_text(aes(x = round, y = prop_sig + 0.03, label = nsurveys), col = "gray20") +
theme_bw() +
facet_wrap("T_SURVEY_NAME", scales = "free_x")
part2 <- metadata1 %>%
drop_na(Q_Abs_bias_internal_criteria) %>%
filter(T_SURVEY_NAME == "ISSP") %>%
mutate(is_sig = Q_Abs_bias_internal_criteria > 1.96,
round = gsub("^[A-Z]{1,4}", "", T_SURVEY_ROUND)) %>%
count(T_SURVEY_NAME, round, is_sig) %>%
group_by(T_SURVEY_NAME, round) %>%
mutate(prop_sig = n / sum(n),
nsurveys = sum(n)) %>%
filter(is_sig == TRUE) %>%
ggplot(.) +
geom_bar(aes(x = round, y = prop_sig), stat = "Identity", fill = "gray70") +
geom_text(aes(x = round, y = prop_sig + 0.035, label = nsurveys), col = "gray20") +
theme_bw() +
theme(axis.text.x = element_text(angle = 90)) +
facet_wrap("T_SURVEY_NAME", scales = "free_x")
part1 / part2

by country
Surveys with absolute bias > 1.96 by country.
metadata1 %>%
drop_na(Q_Abs_bias_internal_criteria) %>%
group_by(T_SURVEY_COUNTRY) %>%
mutate(total_surveys = n(),
total_projects = n_distinct(T_SURVEY_NAME),
is_sig = Q_Abs_bias_internal_criteria > 1.96) %>%
group_by(T_SURVEY_COUNTRY, is_sig) %>%
mutate(bias_surveys = n(),
bias_projects = n_distinct(T_SURVEY_NAME)) %>%
ungroup() %>%
distinct(T_SURVEY_COUNTRY, total_surveys, bias_surveys, total_projects, bias_projects, is_sig) %>%
complete(is_sig, T_SURVEY_COUNTRY, fill = list(bias_surveys = 0, bias_projects = 0)) %>%
group_by(T_SURVEY_COUNTRY) %>%
mutate(total_surveys = max(total_surveys, na.rm = T),
total_projects = max(total_projects, na.rm = T)) %>%
filter(is_sig == TRUE) %>%
mutate(prop_bias = round(bias_surveys / total_surveys, 3)) %>%
select(T_SURVEY_COUNTRY, total_surveys, bias_surveys, prop_bias, total_projects, bias_projects) %>%
arrange(desc(prop_bias))
Changes over time
Bias
Orange dots indicate surveys from the waves analyzed in Kohler 2007.
metadata1 %>%
ungroup() %>%
mutate(S_SAMPLE_TYPE = fct_collapse(S_SAMPLE_TYPE,
noinfo_insuff = c("no info", "insuff")),
S_SAMPLE_TYPE = fct_rev(S_SAMPLE_TYPE),
K2007 = T_SURVEY_ROUND %in% c("EQLS1", "ESS1", "ESS2", "EVS1999", "ISSP2002")) %>%
ggplot(., aes(x = T_SURVEY_YEAR, y = Q_Bias_internal_criteria, col = K2007)) +
geom_point(size = 2, alpha = 0.5) +
scale_color_manual(values = c("gray50", "darkorange")) +
theme_bw() +
theme(legend.position = "none") +
xlab("")

Surveys with absolute bias exceeding 5 are labelled.
metadata1 %>%
ggplot(., aes(x = T_SURVEY_YEAR, y = Q_Bias_internal_criteria)) +
geom_point(size = 2) +
gghighlight(Q_Abs_bias_internal_criteria > 5) +
geom_text_repel(aes(label = T_SURVEY_ID), size = 3.5) +
theme_bw() +
xlab("")

Absolute bias and response rates
Note the different Y axis ranges.
metadata1 %>%
filter(!S_SAMPLE_TYPE %in% c("no info", "insuff", "non-prob"),
mode == "f2f") %>%
# filter(Q_Abs_bias_internal_criteria < 4.5) %>%
select(T_SURVEY_NAME, T_SURVEY_COUNTRY, T_SURVEY_ROUND, T_SURVEY_YEAR,
Q_Abs_bias_internal_criteria, S_RR1_CALC_VALUE) %>%
gather(var, value, c(S_RR1_CALC_VALUE, Q_Abs_bias_internal_criteria)) %>%
drop_na(value) %>%
ggplot(., aes(x = T_SURVEY_YEAR,
y = value)) +
geom_point(alpha = 0.1) +
geom_smooth(method = "loess") +
theme_bw() +
facet_wrap(T_SURVEY_NAME ~ var, scales = "free_y", ncol = 2)

Absolute bias by sample type
part1 <- metadata1 %>%
filter(T_SURVEY_NAME %in% c("ESS", "EQLS")) %>%
ggplot(., aes(x = S_SAMPLE_TYPE, y = Q_Abs_bias_internal_criteria)) +
geom_boxplot() +
theme_bw() +
xlab("") +
facet_wrap("T_SURVEY_NAME", ncol = 1)
part2 <- metadata1 %>%
filter(T_SURVEY_NAME %in% c("ISSP", "EVS")) %>%
ggplot(., aes(x = S_SAMPLE_TYPE, y = Q_Abs_bias_internal_criteria)) +
geom_boxplot() +
theme_bw() +
ylab("") + xlab("") +
facet_wrap("T_SURVEY_NAME", ncol = 1)
part1 + part2 + plot_layout(widths = c(1, 2))

Excluding absolute bias > 4.
part1 <- metadata1 %>%
filter(T_SURVEY_NAME %in% c("ESS", "EQLS")) %>%
ggplot(., aes(x = S_SAMPLE_TYPE, y = Q_Abs_bias_internal_criteria)) +
geom_boxplot() +
theme_bw() +
xlab("") + ylim(0,4) +
facet_wrap("T_SURVEY_NAME", ncol = 1)
part2 <- metadata1 %>%
filter(T_SURVEY_NAME %in% c("ISSP", "EVS")) %>%
ggplot(., aes(x = S_SAMPLE_TYPE, y = Q_Abs_bias_internal_criteria)) +
geom_boxplot() +
theme_bw() +
ylab("") + xlab("") + ylim(0,4) +
facet_wrap("T_SURVEY_NAME", ncol = 1)
part1 + part2 + plot_layout(widths = c(1, 2))

Bias and response rates
Overall
Excludes sample types: no information, insufficient, non-probability.
metadata1 %>%
filter(!S_SAMPLE_TYPE %in% c("no info", "insuff", "non-prob"),
mode == "f2f") %>%
ggplot(., aes(x = S_RR1_CALC_VALUE, y = Q_Abs_bias_internal_criteria)) +
geom_point(aes(col = T_SURVEY_NAME), size = 2, alpha = 0.5) +
geom_smooth(method = "loess", se = FALSE) +
xlim(0, 1) +
theme_bw()

Excludes RR >= 0.9, and sample types: no information, insufficient, non-probability.
metadata1 %>%
filter(!S_SAMPLE_TYPE %in% c("no info", "insuff", "non-prob"),
mode == "f2f",
S_RR1_CALC_VALUE < 0.9) %>%
ggplot(., aes(x = S_RR1_CALC_VALUE, y = Q_Abs_bias_internal_criteria)) +
geom_point(aes(col = T_SURVEY_NAME), size = 2, alpha = 0.5) +
geom_smooth(method = "loess", se = FALSE) +
xlim(0, 1) +
theme_bw()

By sample type
Excludes RR >= 0.9, and sample types: no information, insufficient, non-probability.
metadata1 %>%
filter(!S_SAMPLE_TYPE %in% c("no info", "insuff", "non-prob"),
mode == "f2f",
S_RR1_CALC_VALUE < 0.9) %>%
ggplot(., aes(x = S_RR1_CALC_VALUE, y = Q_Abs_bias_internal_criteria)) +
geom_point(size = 2, alpha = 0.1) +
geom_smooth(method = "loess", se = FALSE, size = 1) +
theme_bw() +
facet_wrap("S_SAMPLE_TYPE")

By sample type and project
Excludes RR >= 0.9, and sample types: no information, insufficient, non-probability.
metadata1 %>%
filter(!S_SAMPLE_TYPE %in% c("no info", "insuff", "non-prob"),
mode == "f2f",
S_RR1_CALC_VALUE < 0.9) %>%
ggplot(., aes(x = S_RR1_CALC_VALUE, y = Q_Abs_bias_internal_criteria)) +
geom_point(size = 2, alpha = 0.1) +
geom_smooth(method = "loess", se = FALSE) +
theme_bw() +
facet_grid(T_SURVEY_NAME ~ S_SAMPLE_TYPE)

LS0tDQp0aXRsZTogIlN1cnZleXMiDQpkYXRlOiAiNy8xMy8yMDIxIg0Kb3V0cHV0Og0KICBodG1sX25vdGVib29rOg0KICAgIGNvZGVfZm9sZGluZzogaGlkZQ0KICAgIHRvYzogdHJ1ZQ0KICAgIHRvY19mbG9hdDogDQogICAgICBjb2xsYXBzZWQ6IGZhbHNlDQotLS0NCg0KYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9DQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUsIHdhcm5pbmcgPSBGQUxTRSwgbWVzc2FnZSA9IEZBTFNFKQ0KDQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkoaGF2ZW4pDQpsaWJyYXJ5KHBhdGNod29yaykNCmxpYnJhcnkoZ2dyZXBlbCkNCmxpYnJhcnkoZ2doaWdobGlnaHQpDQoNCm1ldGFkYXRhIDwtIHJpbzo6aW1wb3J0KCIwMF9NZXRhZGF0YV9FUUxTX0VTU19FVlNfSVNTUF8yMV8wN18wMi5zYXYiLCB1c2VyX25hID0gVFJVRSkNCg0KDQptZXRhZGF0YTEgPC0gbWV0YWRhdGEgJT4lDQogIHphcF9sYWJlbHMoKSAlPiUNCiAgbXV0YXRlKFNfU0FNUExFX1RZUEUgPSBwbHlyOjptYXB2YWx1ZXMoU19TQU1QTEVfVFlQRSwgYyhOQSwgMSwyLDMsNCw1LDYsNyksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMoIm5vIGluZm8iLCAibm9uLXByb2IiLCAibXVsdGkgUlIiLCAibXVsdGkgSEgiLCAibXVsdGkgaW5kIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNpbmdsZSBzdGFnZSIsICJtdWx0aSB1bnNwZWMiLCAiaW5zdWZmIikpLA0KICAgICAgICAgU19TQU1QTEVfVFlQRSA9IGZhY3RvcihTX1NBTVBMRV9UWVBFLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCJubyBpbmZvIiwgImluc3VmZiIsICJtdWx0aSB1bnNwZWMiLCAibm9uLXByb2IiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibXVsdGkgUlIiLCAibXVsdGkgSEgiLCAibXVsdGkgaW5kIiwgInNpbmdsZSBzdGFnZSIpKSwNCiAgICAgICAgIFNfV0lUSElOX0hIX1NFTEVDVElPTiA9IHBseXI6Om1hcHZhbHVlcyhTX1dJVEhJTl9ISF9TRUxFQ1RJT04sIGMoMCwxLDYsNyw5LDEwLE5BKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjKCJub3QgYXBwIiwgIktpc2giLCAiYmlydGhkYXkiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiaXJ0aGRheSBzZWxmLWNvbXBsIiwgImluc3VmZiIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5vbi1yYW5kb20iLCAibWlzcyIpKSwNCiAgICAgICAgIHllYXIgPSBUX1NVUlZFWV9ZRUFSIC0gMTk4MSwNCiAgICAgICAgIG1vZGUgPSBjYXNlX3doZW4oDQogICAgICAgICAgIFNfTU9ERV9GMkYgPT0gMSB+ICJmMmYiLA0KICAgICAgICAgICBTX01PREVfQ0FUSSA9PSAxIH4gImNhdGkiLA0KICAgICAgICAgICBTX01PREVfQ0FXSSA9PSAxIH4gImNhd2kiLA0KICAgICAgICAgICBTX01PREVfUE9TVF9NQUlMID09IDEgfiAibWFpbCIsDQogICAgICAgICAgIFNfTU9ERV9TRUxGX0NPTVBMRVRJT04gPT0gMSB+ICJzZWxmIiwNCiAgICAgICAgICAgVFJVRSB+ICJtaXNzaW5nIg0KICAgICAgICAgKQ0KICApICU+JQ0KICANCiAgbXV0YXRlX2lmKGlzLm51bWVyaWMsIGZ1bmN0aW9uKHgpIGlmZWxzZSh4ICVpbiUgYygtOTk5OSwgLTg4ODgpLCBOQSwgeCkpICU+JQ0KICBtdXRhdGVfYXQodmFycyhTX0JBQ0tfQ0hFQ0tJTkcsIFNfU1VCU1RJVFVUSU9OKSwgZmFjdG9yKQ0KYGBgDQoNCiMgQmFzaWNzDQoNCkRhdGEgc3VtbWFyeQ0KDQpgYGB7cn0NCm1ldGFkYXRhMSAlPiUNCiAgZ3JvdXBfYnkoVF9TVVJWRVlfTkFNRSkgJT4lDQogIHN1bW1hcmlzZShuX3N1cnZleXMgPSBuX2Rpc3RpbmN0KFRfU1VSVkVZX0lEKSwNCiAgICAgICAgICAgIG5fY291bnRyaWVzID0gbl9kaXN0aW5jdChUX1NVUlZFWV9DT1VOVFJZKSwNCiAgICAgICAgICAgIG5fd2F2ZXMgPSBuX2Rpc3RpbmN0KFRfU1VSVkVZX1JPVU5EKSwNCiAgICAgICAgICAgIG1pbl95ZWFyID0gbWluKFRfU1VSVkVZX1lFQVIpLA0KICAgICAgICAgICAgbWF4X3llYXIgPSBtYXgoVF9TVVJWRVlfWUVBUikpDQpgYGANCg0KVGhlcmUgYXJlIDQ1IGNvdW50cmllcyBhbHRvZ2V0aGVyLiBPZiB0aG9zZSwgMTcgYXJlIG5vdCBpbmNsdWRlZCBpbiBhbGwgcHJvamVjdHM6DQoNCmBgYHtyfQ0KbWV0YWRhdGExICU+JQ0KICBjb3VudChUX1NVUlZFWV9OQU1FLCBUX1NVUlZFWV9DT1VOVFJZKSAlPiUNCiAgc3ByZWFkKFRfU1VSVkVZX05BTUUsIG4pICU+JQ0KICBmaWx0ZXIoaXMubmEoRVFMUyArIEVTUyArIEVWUyArIElTU1ApKQ0KYGBgDQoNCg0KDQojIEV4Y2VzcyBiaWFzDQoNCiMjIGJ5IHByb2plY3QNCg0KUHJvcG9ydGlvbiBvZiBzdXJ2ZXlzIHdpdGggZXhjZXNzICg+IDEuOTYpIGFic29sdXRlIGJpYXM6DQoNCmBgYHtyIHByb2plY3Qtc2lnbmlmaWNhbnQtdGFibGV9DQptZXRhZGF0YTEgJT4lDQogIG11dGF0ZShpc19zaWcgPSBRX0Fic19iaWFzX2ludGVybmFsX2NyaXRlcmlhID4gMS45NikgJT4lDQogIGNvdW50KFRfU1VSVkVZX05BTUUsIGlzX3NpZykgJT4lDQogIGdyb3VwX2J5KFRfU1VSVkVZX05BTUUpICU+JQ0KICBtdXRhdGUocHJvcF9zaWcgPSByb3VuZChuIC8gc3VtKG4pLCAzKSkgJT4lDQogIGZpbHRlcihpc19zaWcgPT0gVFJVRSkgJT4lDQogIHNlbGVjdChUX1NVUlZFWV9OQU1FLCBwcm9wX3NpZykNCmBgYA0KDQoNCjIwMDggd2FzIGEgZGlmZmljdWx0IHllYXIgZm9yIHN1cnZleXM/DQoNCk51bWJlcnMgYWJvdmUgYmFycyBpbmRpY2F0ZSB0aGUgbnVtYmVyIG9mIHN1cnZleXMgZm9yIHdoaWNoIGJpYXMgd2FzIHBvc3NpYmxlIHRvIGNhbGN1bGF0ZS4NCg0KDQpgYGB7ciwgZmlnLmhlaWdodD0gNiwgZmlnLndpZHRoID0gMTB9DQpwYXJ0MSA8LSBtZXRhZGF0YTEgJT4lDQogIGRyb3BfbmEoUV9BYnNfYmlhc19pbnRlcm5hbF9jcml0ZXJpYSkgJT4lDQogIGZpbHRlcihUX1NVUlZFWV9OQU1FICE9ICJJU1NQIikgJT4lDQogIG11dGF0ZShpc19zaWcgPSBRX0Fic19iaWFzX2ludGVybmFsX2NyaXRlcmlhID4gMS45NiwNCiAgICAgICAgIHJvdW5kID0gZ3N1YigiXltBLVpdezEsNH0iLCAiIiwgVF9TVVJWRVlfUk9VTkQpKSAlPiUNCiAgY291bnQoVF9TVVJWRVlfTkFNRSwgcm91bmQsIGlzX3NpZykgJT4lDQogIGdyb3VwX2J5KFRfU1VSVkVZX05BTUUsIHJvdW5kKSAlPiUNCiAgbXV0YXRlKHByb3Bfc2lnID0gbiAvIHN1bShuKSwNCiAgICAgICAgIG5zdXJ2ZXlzID0gc3VtKG4pKSAlPiUNCiAgZmlsdGVyKGlzX3NpZyA9PSBUUlVFKSAlPiUNCiAgZ2dwbG90KC4pICsNCiAgZ2VvbV9iYXIoYWVzKHggPSByb3VuZCwgeSA9IHByb3Bfc2lnKSwgc3RhdCA9ICJJZGVudGl0eSIsIGZpbGwgPSAiZ3JheTcwIikgKw0KICBnZW9tX3RleHQoYWVzKHggPSByb3VuZCwgeSA9IHByb3Bfc2lnICsgMC4wMywgbGFiZWwgPSBuc3VydmV5cyksIGNvbCA9ICJncmF5MjAiKSArDQogIHRoZW1lX2J3KCkgKw0KICBmYWNldF93cmFwKCJUX1NVUlZFWV9OQU1FIiwgc2NhbGVzID0gImZyZWVfeCIpDQoNCnBhcnQyIDwtIG1ldGFkYXRhMSAlPiUNCiAgZHJvcF9uYShRX0Fic19iaWFzX2ludGVybmFsX2NyaXRlcmlhKSAlPiUNCiAgZmlsdGVyKFRfU1VSVkVZX05BTUUgPT0gIklTU1AiKSAlPiUNCiAgbXV0YXRlKGlzX3NpZyA9IFFfQWJzX2JpYXNfaW50ZXJuYWxfY3JpdGVyaWEgPiAxLjk2LA0KICAgICAgICAgcm91bmQgPSBnc3ViKCJeW0EtWl17MSw0fSIsICIiLCBUX1NVUlZFWV9ST1VORCkpICU+JQ0KICBjb3VudChUX1NVUlZFWV9OQU1FLCByb3VuZCwgaXNfc2lnKSAlPiUNCiAgZ3JvdXBfYnkoVF9TVVJWRVlfTkFNRSwgcm91bmQpICU+JQ0KICBtdXRhdGUocHJvcF9zaWcgPSBuIC8gc3VtKG4pLA0KICAgICAgICAgbnN1cnZleXMgPSBzdW0obikpICU+JQ0KICBmaWx0ZXIoaXNfc2lnID09IFRSVUUpICU+JQ0KICBnZ3Bsb3QoLikgKw0KICBnZW9tX2JhcihhZXMoeCA9IHJvdW5kLCB5ID0gcHJvcF9zaWcpLCBzdGF0ID0gIklkZW50aXR5IiwgZmlsbCA9ICJncmF5NzAiKSArDQogIGdlb21fdGV4dChhZXMoeCA9IHJvdW5kLCB5ID0gcHJvcF9zaWcgKyAwLjAzNSwgbGFiZWwgPSBuc3VydmV5cyksIGNvbCA9ICJncmF5MjAiKSArDQogIHRoZW1lX2J3KCkgKw0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwKSkgKw0KICBmYWNldF93cmFwKCJUX1NVUlZFWV9OQU1FIiwgc2NhbGVzID0gImZyZWVfeCIpDQoNCnBhcnQxIC8gcGFydDINCmBgYA0KDQojIyBieSBjb3VudHJ5DQoNClN1cnZleXMgd2l0aCBhYnNvbHV0ZSBiaWFzID4gMS45NiBieSBjb3VudHJ5Lg0KDQpgYGB7cn0NCm1ldGFkYXRhMSAlPiUNCiAgZHJvcF9uYShRX0Fic19iaWFzX2ludGVybmFsX2NyaXRlcmlhKSAlPiUNCiAgZ3JvdXBfYnkoVF9TVVJWRVlfQ09VTlRSWSkgJT4lDQogIG11dGF0ZSh0b3RhbF9zdXJ2ZXlzID0gbigpLA0KICAgICAgICAgdG90YWxfcHJvamVjdHMgPSBuX2Rpc3RpbmN0KFRfU1VSVkVZX05BTUUpLA0KICAgICAgICAgaXNfc2lnID0gUV9BYnNfYmlhc19pbnRlcm5hbF9jcml0ZXJpYSA+IDEuOTYpICU+JQ0KICBncm91cF9ieShUX1NVUlZFWV9DT1VOVFJZLCBpc19zaWcpICU+JQ0KICBtdXRhdGUoYmlhc19zdXJ2ZXlzID0gbigpLA0KICAgICAgICAgYmlhc19wcm9qZWN0cyA9IG5fZGlzdGluY3QoVF9TVVJWRVlfTkFNRSkpICU+JQ0KICB1bmdyb3VwKCkgJT4lDQogIGRpc3RpbmN0KFRfU1VSVkVZX0NPVU5UUlksIHRvdGFsX3N1cnZleXMsIGJpYXNfc3VydmV5cywgdG90YWxfcHJvamVjdHMsIGJpYXNfcHJvamVjdHMsIGlzX3NpZykgJT4lDQogIGNvbXBsZXRlKGlzX3NpZywgVF9TVVJWRVlfQ09VTlRSWSwgZmlsbCA9IGxpc3QoYmlhc19zdXJ2ZXlzID0gMCwgYmlhc19wcm9qZWN0cyA9IDApKSAlPiUNCiAgZ3JvdXBfYnkoVF9TVVJWRVlfQ09VTlRSWSkgJT4lDQogIG11dGF0ZSh0b3RhbF9zdXJ2ZXlzID0gbWF4KHRvdGFsX3N1cnZleXMsIG5hLnJtID0gVCksDQogICAgICAgICB0b3RhbF9wcm9qZWN0cyA9IG1heCh0b3RhbF9wcm9qZWN0cywgbmEucm0gPSBUKSkgJT4lDQogIGZpbHRlcihpc19zaWcgPT0gVFJVRSkgJT4lDQogIG11dGF0ZShwcm9wX2JpYXMgPSByb3VuZChiaWFzX3N1cnZleXMgLyB0b3RhbF9zdXJ2ZXlzLCAzKSkgJT4lDQogIHNlbGVjdChUX1NVUlZFWV9DT1VOVFJZLCB0b3RhbF9zdXJ2ZXlzLCBiaWFzX3N1cnZleXMsIHByb3BfYmlhcywgdG90YWxfcHJvamVjdHMsIGJpYXNfcHJvamVjdHMpICU+JQ0KICBhcnJhbmdlKGRlc2MocHJvcF9iaWFzKSkNCmBgYA0KDQoNCg0KIyBDaGFuZ2VzIG92ZXIgdGltZQ0KDQojIyBCaWFzDQoNCk9yYW5nZSBkb3RzIGluZGljYXRlIHN1cnZleXMgZnJvbSB0aGUgd2F2ZXMgYW5hbHl6ZWQgaW4gS29obGVyIDIwMDcuDQoNCmBgYHtyLCBmaWcuaGVpZ2h0PSA2LCBmaWcud2lkdGggPSAxMH0NCm1ldGFkYXRhMSAlPiUNCiAgdW5ncm91cCgpICU+JQ0KICBtdXRhdGUoU19TQU1QTEVfVFlQRSA9IGZjdF9jb2xsYXBzZShTX1NBTVBMRV9UWVBFLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2luZm9faW5zdWZmID0gYygibm8gaW5mbyIsICJpbnN1ZmYiKSksDQogICAgICAgICBTX1NBTVBMRV9UWVBFID0gZmN0X3JldihTX1NBTVBMRV9UWVBFKSwNCiAgICAgICAgIEsyMDA3ID0gVF9TVVJWRVlfUk9VTkQgJWluJSBjKCJFUUxTMSIsICJFU1MxIiwgIkVTUzIiLCAiRVZTMTk5OSIsICJJU1NQMjAwMiIpKSAlPiUNCiAgZ2dwbG90KC4sIGFlcyh4ID0gVF9TVVJWRVlfWUVBUiwgeSA9IFFfQmlhc19pbnRlcm5hbF9jcml0ZXJpYSwgY29sID0gSzIwMDcpKSArDQogIGdlb21fcG9pbnQoc2l6ZSA9IDIsIGFscGhhID0gMC41KSArDQogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCJncmF5NTAiLCAiZGFya29yYW5nZSIpKSArDQogIHRoZW1lX2J3KCkgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsNCiAgeGxhYigiIikNCmBgYA0KDQpTdXJ2ZXlzIHdpdGggYWJzb2x1dGUgYmlhcyBleGNlZWRpbmcgNSBhcmUgbGFiZWxsZWQuDQoNCmBgYHtyLCBmaWcuaGVpZ2h0PSA2LCBmaWcud2lkdGggPSAxMH0NCm1ldGFkYXRhMSAlPiUNCiAgZ2dwbG90KC4sIGFlcyh4ID0gVF9TVVJWRVlfWUVBUiwgeSA9IFFfQmlhc19pbnRlcm5hbF9jcml0ZXJpYSkpICsNCiAgZ2VvbV9wb2ludChzaXplID0gMikgKw0KICBnZ2hpZ2hsaWdodChRX0Fic19iaWFzX2ludGVybmFsX2NyaXRlcmlhID4gNSkgKw0KICBnZW9tX3RleHRfcmVwZWwoYWVzKGxhYmVsID0gVF9TVVJWRVlfSUQpLCBzaXplID0gMy41KSArDQogIHRoZW1lX2J3KCkgKw0KICB4bGFiKCIiKQ0KYGBgDQoNCg0KIyMgQWJzb2x1dGUgYmlhcyBhbmQgcmVzcG9uc2UgcmF0ZXMNCg0KTm90ZSB0aGUgZGlmZmVyZW50IFkgYXhpcyByYW5nZXMuDQoNCmBgYHtyLCBmaWcuaGVpZ2h0PSAxMCwgZmlnLndpZHRoID0gMTB9DQptZXRhZGF0YTEgJT4lDQogIGZpbHRlcighU19TQU1QTEVfVFlQRSAlaW4lIGMoIm5vIGluZm8iLCAiaW5zdWZmIiwgIm5vbi1wcm9iIiksDQogICAgICAgICBtb2RlID09ICJmMmYiKSAlPiUNCiAgIyBmaWx0ZXIoUV9BYnNfYmlhc19pbnRlcm5hbF9jcml0ZXJpYSA8IDQuNSkgJT4lDQogIHNlbGVjdChUX1NVUlZFWV9OQU1FLCBUX1NVUlZFWV9DT1VOVFJZLCBUX1NVUlZFWV9ST1VORCwgVF9TVVJWRVlfWUVBUiwNCiAgICAgICAgIFFfQWJzX2JpYXNfaW50ZXJuYWxfY3JpdGVyaWEsIFNfUlIxX0NBTENfVkFMVUUpICU+JQ0KICBnYXRoZXIodmFyLCB2YWx1ZSwgYyhTX1JSMV9DQUxDX1ZBTFVFLCBRX0Fic19iaWFzX2ludGVybmFsX2NyaXRlcmlhKSkgJT4lDQogIGRyb3BfbmEodmFsdWUpICU+JQ0KICBnZ3Bsb3QoLiwgYWVzKHggPSBUX1NVUlZFWV9ZRUFSLA0KICAgICAgICAgICAgICAgIHkgPSB2YWx1ZSkpICsNCiAgZ2VvbV9wb2ludChhbHBoYSA9IDAuMSkgKw0KICBnZW9tX3Ntb290aChtZXRob2QgPSAibG9lc3MiKSArDQogIHRoZW1lX2J3KCkgKw0KICBmYWNldF93cmFwKFRfU1VSVkVZX05BTUUgfiB2YXIsIHNjYWxlcyA9ICJmcmVlX3kiLCBuY29sID0gMikNCmBgYA0KDQoNCg0KIyBBYnNvbHV0ZSBiaWFzIGJ5IHNhbXBsZSB0eXBlDQoNCmBgYHtyLCBmaWcuaGVpZ2h0PSA3LCBmaWcud2lkdGggPSAxMH0NCnBhcnQxIDwtIG1ldGFkYXRhMSAlPiUNCiAgZmlsdGVyKFRfU1VSVkVZX05BTUUgJWluJSBjKCJFU1MiLCAiRVFMUyIpKSAlPiUNCiAgZ2dwbG90KC4sIGFlcyh4ID0gU19TQU1QTEVfVFlQRSwgeSA9IFFfQWJzX2JpYXNfaW50ZXJuYWxfY3JpdGVyaWEpKSArDQogIGdlb21fYm94cGxvdCgpICsNCiAgdGhlbWVfYncoKSArDQogIHhsYWIoIiIpICsNCiAgZmFjZXRfd3JhcCgiVF9TVVJWRVlfTkFNRSIsIG5jb2wgPSAxKQ0KDQpwYXJ0MiA8LSBtZXRhZGF0YTEgJT4lDQogIGZpbHRlcihUX1NVUlZFWV9OQU1FICVpbiUgYygiSVNTUCIsICJFVlMiKSkgJT4lDQogIGdncGxvdCguLCBhZXMoeCA9IFNfU0FNUExFX1RZUEUsIHkgPSBRX0Fic19iaWFzX2ludGVybmFsX2NyaXRlcmlhKSkgKw0KICBnZW9tX2JveHBsb3QoKSArDQogIHRoZW1lX2J3KCkgKw0KICB5bGFiKCIiKSArIHhsYWIoIiIpICsNCiAgZmFjZXRfd3JhcCgiVF9TVVJWRVlfTkFNRSIsIG5jb2wgPSAxKQ0KDQpwYXJ0MSArIHBhcnQyICsgcGxvdF9sYXlvdXQod2lkdGhzID0gYygxLCAyKSkNCmBgYA0KDQoNCkV4Y2x1ZGluZyBhYnNvbHV0ZSBiaWFzID4gNC4NCg0KDQpgYGB7ciwgZmlnLmhlaWdodD0gNywgZmlnLndpZHRoID0gMTB9DQpwYXJ0MSA8LSBtZXRhZGF0YTEgJT4lDQogIGZpbHRlcihUX1NVUlZFWV9OQU1FICVpbiUgYygiRVNTIiwgIkVRTFMiKSkgJT4lDQogIGdncGxvdCguLCBhZXMoeCA9IFNfU0FNUExFX1RZUEUsIHkgPSBRX0Fic19iaWFzX2ludGVybmFsX2NyaXRlcmlhKSkgKw0KICBnZW9tX2JveHBsb3QoKSArDQogIHRoZW1lX2J3KCkgKw0KICB4bGFiKCIiKSArIHlsaW0oMCw0KSArDQogIGZhY2V0X3dyYXAoIlRfU1VSVkVZX05BTUUiLCBuY29sID0gMSkNCg0KcGFydDIgPC0gbWV0YWRhdGExICU+JQ0KICBmaWx0ZXIoVF9TVVJWRVlfTkFNRSAlaW4lIGMoIklTU1AiLCAiRVZTIikpICU+JQ0KICBnZ3Bsb3QoLiwgYWVzKHggPSBTX1NBTVBMRV9UWVBFLCB5ID0gUV9BYnNfYmlhc19pbnRlcm5hbF9jcml0ZXJpYSkpICsNCiAgZ2VvbV9ib3hwbG90KCkgKw0KICB0aGVtZV9idygpICsNCiAgeWxhYigiIikgKyB4bGFiKCIiKSArIHlsaW0oMCw0KSArDQogIGZhY2V0X3dyYXAoIlRfU1VSVkVZX05BTUUiLCBuY29sID0gMSkNCg0KcGFydDEgKyBwYXJ0MiArIHBsb3RfbGF5b3V0KHdpZHRocyA9IGMoMSwgMikpDQpgYGANCg0KDQoNCiMgQmlhcyBhbmQgcmVzcG9uc2UgcmF0ZXMNCg0KIyMgT3ZlcmFsbA0KDQpFeGNsdWRlcyBzYW1wbGUgdHlwZXM6IG5vIGluZm9ybWF0aW9uLCBpbnN1ZmZpY2llbnQsIG5vbi1wcm9iYWJpbGl0eS4NCg0KYGBge3IsIGZpZy5oZWlnaHQ9IDUsIGZpZy53aWR0aCA9IDEwfQ0KbWV0YWRhdGExICU+JQ0KICBmaWx0ZXIoIVNfU0FNUExFX1RZUEUgJWluJSBjKCJubyBpbmZvIiwgImluc3VmZiIsICJub24tcHJvYiIpLA0KICAgICAgICAgbW9kZSA9PSAiZjJmIikgJT4lDQogIGdncGxvdCguLCBhZXMoeCA9IFNfUlIxX0NBTENfVkFMVUUsIHkgPSBRX0Fic19iaWFzX2ludGVybmFsX2NyaXRlcmlhKSkgKw0KICBnZW9tX3BvaW50KGFlcyhjb2wgPSBUX1NVUlZFWV9OQU1FKSwgc2l6ZSA9IDIsIGFscGhhID0gMC41KSArDQogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsb2VzcyIsIHNlID0gRkFMU0UpICsNCiAgeGxpbSgwLCAxKSArDQogIHRoZW1lX2J3KCkNCmBgYA0KDQpFeGNsdWRlcyBSUiA+PSAwLjksIGFuZCBzYW1wbGUgdHlwZXM6IG5vIGluZm9ybWF0aW9uLCBpbnN1ZmZpY2llbnQsIG5vbi1wcm9iYWJpbGl0eS4NCg0KYGBge3IsIGZpZy5oZWlnaHQ9IDUsIGZpZy53aWR0aCA9IDEwfQ0KbWV0YWRhdGExICU+JQ0KICBmaWx0ZXIoIVNfU0FNUExFX1RZUEUgJWluJSBjKCJubyBpbmZvIiwgImluc3VmZiIsICJub24tcHJvYiIpLA0KICAgICAgICAgbW9kZSA9PSAiZjJmIiwNCiAgICAgICAgIFNfUlIxX0NBTENfVkFMVUUgPCAwLjkpICU+JQ0KICBnZ3Bsb3QoLiwgYWVzKHggPSBTX1JSMV9DQUxDX1ZBTFVFLCB5ID0gUV9BYnNfYmlhc19pbnRlcm5hbF9jcml0ZXJpYSkpICsNCiAgZ2VvbV9wb2ludChhZXMoY29sID0gVF9TVVJWRVlfTkFNRSksIHNpemUgPSAyLCBhbHBoYSA9IDAuNSkgKw0KICBnZW9tX3Ntb290aChtZXRob2QgPSAibG9lc3MiLCBzZSA9IEZBTFNFKSArDQogIHhsaW0oMCwgMSkgKw0KICB0aGVtZV9idygpDQpgYGANCg0KDQojIyBCeSBzYW1wbGUgdHlwZQ0KDQpFeGNsdWRlcyBSUiA+PSAwLjksIGFuZCBzYW1wbGUgdHlwZXM6IG5vIGluZm9ybWF0aW9uLCBpbnN1ZmZpY2llbnQsIG5vbi1wcm9iYWJpbGl0eS4NCg0KYGBge3IsIGZpZy5oZWlnaHQ9IDYsIGZpZy53aWR0aCA9IDEwfQ0KbWV0YWRhdGExICU+JQ0KICBmaWx0ZXIoIVNfU0FNUExFX1RZUEUgJWluJSBjKCJubyBpbmZvIiwgImluc3VmZiIsICJub24tcHJvYiIpLA0KICAgICAgICAgbW9kZSA9PSAiZjJmIiwNCiAgICAgICAgIFNfUlIxX0NBTENfVkFMVUUgPCAwLjkpICU+JSAgDQogIGdncGxvdCguLCBhZXMoeCA9IFNfUlIxX0NBTENfVkFMVUUsIHkgPSBRX0Fic19iaWFzX2ludGVybmFsX2NyaXRlcmlhKSkgKw0KICBnZW9tX3BvaW50KHNpemUgPSAyLCBhbHBoYSA9IDAuMSkgKw0KICBnZW9tX3Ntb290aChtZXRob2QgPSAibG9lc3MiLCBzZSA9IEZBTFNFLCBzaXplID0gMSkgKw0KICB0aGVtZV9idygpICsNCiAgZmFjZXRfd3JhcCgiU19TQU1QTEVfVFlQRSIpDQpgYGANCg0KDQojIyBCeSBzYW1wbGUgdHlwZSBhbmQgcHJvamVjdA0KDQpFeGNsdWRlcyBSUiA+PSAwLjksIGFuZCBzYW1wbGUgdHlwZXM6IG5vIGluZm9ybWF0aW9uLCBpbnN1ZmZpY2llbnQsIG5vbi1wcm9iYWJpbGl0eS4NCg0KYGBge3IsIGZpZy5oZWlnaHQ9IDYsIGZpZy53aWR0aCA9IDEwfQ0KbWV0YWRhdGExICU+JQ0KICBmaWx0ZXIoIVNfU0FNUExFX1RZUEUgJWluJSBjKCJubyBpbmZvIiwgImluc3VmZiIsICJub24tcHJvYiIpLA0KICAgICAgICAgbW9kZSA9PSAiZjJmIiwNCiAgICAgICAgIFNfUlIxX0NBTENfVkFMVUUgPCAwLjkpICU+JSAgDQogIGdncGxvdCguLCBhZXMoeCA9IFNfUlIxX0NBTENfVkFMVUUsIHkgPSBRX0Fic19iaWFzX2ludGVybmFsX2NyaXRlcmlhKSkgKw0KICBnZW9tX3BvaW50KHNpemUgPSAyLCBhbHBoYSA9IDAuMSkgKw0KICBnZW9tX3Ntb290aChtZXRob2QgPSAibG9lc3MiLCBzZSA9IEZBTFNFKSArDQogIHRoZW1lX2J3KCkgKw0KICBmYWNldF9ncmlkKFRfU1VSVkVZX05BTUUgfiBTX1NBTVBMRV9UWVBFKQ0KYGBgDQoNCiAgDQogIA==