Set Up

library(ggplot2)
library(dplyr)
library(tidyr)
DATA_DIR <- here::here("data")
new_archive <- read.csv(here::here(DATA_DIR, "new_new.csv"), stringsAsFactors = FALSE)

ACCESS-ESM1-5

access_old <- read.csv(here::here(DATA_DIR, "ACCESS-ESM1-5_archive_data.csv"), stringsAsFactors = FALSE)
access_old$source <- "old"
new_archive$source <- "new"
new_archive_access <- dplyr::filter(new_archive, model == "ACCESS-ESM1-5")
access_old %>% 
  bind_rows(new_archive_access) %>%
  group_by(model, experiment, source) %>% 
  summarise(count = n_distinct(ensemble)) %>% 
  ungroup %>% 
  tidyr::spread(source, count) %>% 
  knitr::kable(format = "markdown")
`summarise()` regrouping output by 'model', 'experiment' (override with `.groups` argument)
model experiment new old
ACCESS-ESM1-5 1pctCO2 1 NA
ACCESS-ESM1-5 abrupt-4xCO2 2 NA
ACCESS-ESM1-5 ssp119 30 20
ACCESS-ESM1-5 ssp126 30 20
ACCESS-ESM1-5 ssp245 30 20
ACCESS-ESM1-5 ssp370 30 20
ACCESS-ESM1-5 ssp434 30 20
ACCESS-ESM1-5 ssp460 30 20
ACCESS-ESM1-5 ssp534-over 30 20
ACCESS-ESM1-5 ssp585 30 20
ggplot() + 
  geom_point(data = access_old, aes(fx, dx, color = "old")) + 
  geom_point(data = new_archive_access, aes(fx, dx, color = "new"), alpha = 0.5) + 
  theme_bw() + 
  scale_color_manual(values = c("old" = "blue", "new" = "pink")) +
  facet_wrap("experiment", scales = "free") + 
  NULL + 
  labs(title = "ACCESS-ESM1-5")

CanESM5

canesm_old <- read.csv(here::here(DATA_DIR, "CanESM5_archive_data.csv"), stringsAsFactors = FALSE)
canesm_old$source <- "old"
new_archive_canesm <- dplyr::filter(new_archive, model == "CanESM5")
canesm_old %>% 
  bind_rows(new_archive_canesm) %>%
  group_by(model, experiment, source) %>% 
  summarise(count = n_distinct(ensemble)) %>% 
  ungroup %>% 
  tidyr::spread(source, count) %>% 
  knitr::kable(format = "markdown")
`summarise()` regrouping output by 'model', 'experiment' (override with `.groups` argument)
model experiment new old
CanESM5 1pctCO2 6 NA
CanESM5 abrupt-2xCO2 1 NA
CanESM5 abrupt-4xCO2 2 NA
CanESM5 ssp119 65 25
CanESM5 ssp126 65 25
CanESM5 ssp245 65 25
CanESM5 ssp370 65 25
CanESM5 ssp434 65 25
CanESM5 ssp460 65 25
CanESM5 ssp534-over 65 25
CanESM5 ssp585 65 25
ggplot() + 
  geom_point(data = canesm_old, aes(fx, dx, color = "old")) + 
  geom_point(data = new_archive_canesm, aes(fx, dx, color = "new"), alpha = 0.5) + 
  theme_bw() + 
  scale_color_manual(values = c("old" = "blue", "new" = "pink")) +
  facet_wrap("experiment", scales = "free") + 
  NULL + 
  labs(title = "CanESM5")

MIROC6

miroc_old <- read.csv(here::here(DATA_DIR, "MIROC6_archive_data.csv"), stringsAsFactors = FALSE)
miroc_old$source <- "old"
new_archive_miroc <- dplyr::filter(new_archive, model == "MIROC6")
miroc_old %>% 
  bind_rows(new_archive_miroc) %>%
  group_by(model, experiment, source) %>% 
  summarise(count = n_distinct(ensemble)) %>% 
  ungroup %>% 
  tidyr::spread(source, count) %>% 
  knitr::kable(format = "markdown")
`summarise()` regrouping output by 'model', 'experiment' (override with `.groups` argument)
model experiment new old
MIROC6 1pctCO2 1 NA
MIROC6 abrupt-2xCO2 1 NA
MIROC6 abrupt-4xCO2 1 NA
MIROC6 ssp119 50 50
MIROC6 ssp126 50 50
MIROC6 ssp245 50 50
MIROC6 ssp370 50 50
MIROC6 ssp434 50 50
MIROC6 ssp460 50 50
MIROC6 ssp534-over 50 50
MIROC6 ssp585 50 50
ggplot() + 
  geom_point(data = miroc_old, aes(fx, dx, color = "old")) + 
  geom_point(data = new_archive_miroc, aes(fx, dx, color = "new"), alpha = 0.5) + 
  theme_bw() + 
  scale_color_manual(values = c("old" = "blue", "new" = "pink")) +
  facet_wrap("experiment", scales = "free") + 
  NULL + 
  labs(title = "MIROC6")

MPI-ESM1-2-HR

mpi_old <- read.csv(here::here(DATA_DIR, "MPI-ESM1-2-HR_archive_data.csv"), stringsAsFactors = FALSE)
mpi_old$source <- "old"
new_archive_mpi <- dplyr::filter(new_archive, model == "MPI-ESM1-2-HR")
mpi_old %>% 
  bind_rows(new_archive_mpi) %>%
  group_by(model, experiment, source) %>% 
  summarise(count = n_distinct(ensemble)) %>% 
  ungroup %>% 
  tidyr::spread(source, count) %>% 
  knitr::kable(format = "markdown")
`summarise()` regrouping output by 'model', 'experiment' (override with `.groups` argument)
model experiment new old
MPI-ESM1-2-HR 1pctCO2 1 NA
MPI-ESM1-2-HR abrupt-4xCO2 1 NA
MPI-ESM1-2-HR ssp119 10 10
MPI-ESM1-2-HR ssp126 10 10
MPI-ESM1-2-HR ssp245 10 10
MPI-ESM1-2-HR ssp370 10 10
MPI-ESM1-2-HR ssp434 10 10
MPI-ESM1-2-HR ssp460 10 10
MPI-ESM1-2-HR ssp534-over 10 10
MPI-ESM1-2-HR ssp585 10 10
ggplot() + 
  geom_point(data = mpi_old, aes(fx, dx, color = "old")) + 
  geom_point(data = new_archive_mpi, aes(fx, dx, color = "new"), alpha = 0.5) + 
  theme_bw() + 
  scale_color_manual(values = c("old" = "blue", "new" = "pink")) +
  facet_wrap("experiment", scales = "free") + 
  NULL + 
  labs(title = "MPI-ESM1-2-HR")

MPI-ESM1-2-LR

mpi_old <- read.csv(here::here(DATA_DIR, "MPI-ESM1-2-LR_archive_data.csv"), stringsAsFactors = FALSE)
mpi_old$source <- "old"
new_archive_mpi <- dplyr::filter(new_archive, model == "MPI-ESM1-2-LR")
mpi_old %>% 
  bind_rows(new_archive_mpi) %>%
  group_by(model, experiment, source) %>% 
  summarise(count = n_distinct(ensemble)) %>% 
  ungroup %>% 
  tidyr::spread(source, count) %>% 
  knitr::kable(format = "markdown")
`summarise()` regrouping output by 'model', 'experiment' (override with `.groups` argument)
model experiment new old
MPI-ESM1-2-LR 1pctCO2 1 NA
MPI-ESM1-2-LR abrupt-4xCO2 1 NA
MPI-ESM1-2-LR ssp119 10 10
MPI-ESM1-2-LR ssp126 10 10
MPI-ESM1-2-LR ssp245 10 10
MPI-ESM1-2-LR ssp370 10 10
MPI-ESM1-2-LR ssp434 10 10
MPI-ESM1-2-LR ssp460 10 10
MPI-ESM1-2-LR ssp534-over 10 10
MPI-ESM1-2-LR ssp585 10 10
ggplot() + 
  geom_point(data = mpi_old, aes(fx, dx, color = "old")) + 
  geom_point(data = new_archive_mpi, aes(fx, dx, color = "new"), alpha = 0.5) + 
  theme_bw() + 
  scale_color_manual(values = c("old" = "blue", "new" = "pink")) +
  facet_wrap("experiment", scales = "free") + 
  NULL + 
  labs(title = "MPI-ESM1-2-HR")

NorCPM1

norcpm1_old <- read.csv(here::here(DATA_DIR, "NorCPM1_archive_data.csv"), stringsAsFactors = FALSE)
norcpm1_old$source <- "old"
new_archive_norcpm1 <- dplyr::filter(new_archive, model == "NorCPM1")
norcpm1_old %>% 
  bind_rows(new_archive_norcpm1) %>%
  group_by(model, experiment, source) %>% 
  summarise(count = n_distinct(ensemble)) %>% 
  ungroup %>% 
  tidyr::spread(source, count) %>% 
  knitr::kable(format = "markdown")
`summarise()` regrouping output by 'model', 'experiment' (override with `.groups` argument)
model experiment new old
NorCPM1 1pctCO2 1 NA
NorCPM1 abrupt-4xCO2 1 NA
NorCPM1 ssp119 29 29
NorCPM1 ssp126 29 29
NorCPM1 ssp245 29 29
NorCPM1 ssp370 29 29
NorCPM1 ssp434 29 29
NorCPM1 ssp460 29 29
NorCPM1 ssp534-over 29 29
NorCPM1 ssp585 29 29
ggplot() + 
  geom_point(data = norcpm1_old, aes(fx, dx, color = "old")) + 
  geom_point(data = new_archive_norcpm1, aes(fx, dx, color = "new"), alpha = 0.5) + 
  theme_bw() + 
  scale_color_manual(values = c("old" = "blue", "new" = "pink")) +
  facet_wrap("experiment", scales = "free") + 
  NULL + 
  labs(title = "NorCPM1")

UKESM1-0-LL

ukesm_old <- read.csv(here::here(DATA_DIR, "UKESM1-0-LL_archive_data.csv"), stringsAsFactors = FALSE)
ukesm_old$source <- "old"
new_archive_ukesm <- dplyr::filter(new_archive, model == "UKESM1-0-LL")
ukesm_old %>% 
  bind_rows(new_archive_ukesm) %>%
  group_by(model, experiment, source) %>% 
  summarise(count = n_distinct(ensemble)) %>% 
  ungroup %>% 
  tidyr::spread(source, count) %>% 
  knitr::kable(format = "markdown")
`summarise()` regrouping output by 'model', 'experiment' (override with `.groups` argument)
model experiment new old
UKESM1-0-LL 1pctCO2 4 NA
UKESM1-0-LL abrupt-4xCO2 1 NA
UKESM1-0-LL ssp119 19 18
UKESM1-0-LL ssp126 19 18
UKESM1-0-LL ssp245 19 18
UKESM1-0-LL ssp370 19 18
UKESM1-0-LL ssp434 19 18
UKESM1-0-LL ssp460 19 18
UKESM1-0-LL ssp534-over 19 18
UKESM1-0-LL ssp585 19 18
ggplot() + 
  geom_point(data = ukesm_old, aes(fx, dx, color = "old")) + 
  geom_point(data = new_archive_ukesm, aes(fx, dx, color = "new"), alpha = 0.5) + 
  theme_bw() + 
  scale_color_manual(values = c("old" = "blue", "new" = "pink")) +
  facet_wrap("experiment", scales = "free") + 
  NULL + 
  labs(title = "UKESM1-0-LL")

New Experiments

new_exps <- c("1pctCO2", "abrupt-4xCO2", "abrupt-2xCO2")
old_exps <- setdiff(new_exps, unique(new_archive$experiment))
new_archive %>% 
  mutate(exp = if_else(experiment %in% new_exps, '1%, x4 CO2 & x2 CO2', 'historical + ssps')) -> 
  data
mods <- unique(data$model)
data$exp <- factor(data$exp, c('1%, x4 CO2 & x2 CO2', 'historical + ssps'), ordered = TRUE)
data %>% 
  filter(model %in% mods[1:16]) %>% 
  ggplot(aes(fx, dx, color = exp)) + 
  geom_point() + 
  facet_wrap("model", scales = "free") + 
  theme_bw() + 
  scale_color_manual(values = c('1%, x4 CO2 & x2 CO2' = 'blue', 'historical + ssps' = 'grey'))

data %>% 
  filter(model %in% mods[17:27]) %>% 
  ggplot(aes(fx, dx, color = exp)) + 
  geom_point() + 
  facet_wrap("model", scales = "free") + 
  theme_bw() + 
  scale_color_manual(values = c('1%, x4 CO2 & x2 CO2' = 'blue', 'historical + ssps' = 'grey'))

data %>% 
  filter(model %in% mods[28:33]) %>% 
  ggplot(aes(fx, dx, color = exp)) + 
  geom_point() + 
  facet_wrap("model", scales = "free") + 
  theme_bw() + 
  scale_color_manual(values = c('1%, x4 CO2 & x2 CO2' = 'blue', 'historical + ssps' = 'grey'))

LS0tCnRpdGxlOiAiQ29tcGFyaW5nIEFyY2hpdmVzIgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKLS0tCgoKIyMgU2V0IFVwIApgYGB7cn0KbGlicmFyeShnZ3Bsb3QyKQpsaWJyYXJ5KGRwbHlyKQpsaWJyYXJ5KHRpZHlyKQoKCkRBVEFfRElSIDwtIGhlcmU6OmhlcmUoImRhdGEiKQpgYGAKCgpgYGB7cn0KbmV3X2FyY2hpdmUgPC0gcmVhZC5jc3YoaGVyZTo6aGVyZShEQVRBX0RJUiwgIm5ld19uZXcuY3N2IiksIHN0cmluZ3NBc0ZhY3RvcnMgPSBGQUxTRSkKYGBgCgoKIyBBQ0NFU1MtRVNNMS01CmBgYHtyfQphY2Nlc3Nfb2xkIDwtIHJlYWQuY3N2KGhlcmU6OmhlcmUoREFUQV9ESVIsICJBQ0NFU1MtRVNNMS01X2FyY2hpdmVfZGF0YS5jc3YiKSwgc3RyaW5nc0FzRmFjdG9ycyA9IEZBTFNFKQphY2Nlc3Nfb2xkJHNvdXJjZSA8LSAib2xkIgpuZXdfYXJjaGl2ZSRzb3VyY2UgPC0gIm5ldyIKbmV3X2FyY2hpdmVfYWNjZXNzIDwtIGRwbHlyOjpmaWx0ZXIobmV3X2FyY2hpdmUsIG1vZGVsID09ICJBQ0NFU1MtRVNNMS01IikKYGBgCgoKYGBge3J9CmFjY2Vzc19vbGQgJT4lIAogIGJpbmRfcm93cyhuZXdfYXJjaGl2ZV9hY2Nlc3MpICU+JQogIGdyb3VwX2J5KG1vZGVsLCBleHBlcmltZW50LCBzb3VyY2UpICU+JSAKICBzdW1tYXJpc2UoY291bnQgPSBuX2Rpc3RpbmN0KGVuc2VtYmxlKSkgJT4lIAogIHVuZ3JvdXAgJT4lIAogIHRpZHlyOjpzcHJlYWQoc291cmNlLCBjb3VudCkgJT4lIAogIGtuaXRyOjprYWJsZShmb3JtYXQgPSAibWFya2Rvd24iKQpgYGAKCgpgYGB7cn0KZ2dwbG90KCkgKyAKICBnZW9tX3BvaW50KGRhdGEgPSBhY2Nlc3Nfb2xkLCBhZXMoZngsIGR4LCBjb2xvciA9ICJvbGQiKSkgKyAKICBnZW9tX3BvaW50KGRhdGEgPSBuZXdfYXJjaGl2ZV9hY2Nlc3MsIGFlcyhmeCwgZHgsIGNvbG9yID0gIm5ldyIpLCBhbHBoYSA9IDAuNSkgKyAKICB0aGVtZV9idygpICsgCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoIm9sZCIgPSAiYmx1ZSIsICJuZXciID0gInBpbmsiKSkgKwogIGZhY2V0X3dyYXAoImV4cGVyaW1lbnQiLCBzY2FsZXMgPSAiZnJlZSIpICsgCiAgTlVMTCArIAogIGxhYnModGl0bGUgPSAiQUNDRVNTLUVTTTEtNSIpCmBgYAoKIyBDYW5FU001CgpgYGB7cn0KY2FuZXNtX29sZCA8LSByZWFkLmNzdihoZXJlOjpoZXJlKERBVEFfRElSLCAiQ2FuRVNNNV9hcmNoaXZlX2RhdGEuY3N2IiksIHN0cmluZ3NBc0ZhY3RvcnMgPSBGQUxTRSkKY2FuZXNtX29sZCRzb3VyY2UgPC0gIm9sZCIKbmV3X2FyY2hpdmVfY2FuZXNtIDwtIGRwbHlyOjpmaWx0ZXIobmV3X2FyY2hpdmUsIG1vZGVsID09ICJDYW5FU001IikKYGBgCgoKYGBge3J9CmNhbmVzbV9vbGQgJT4lIAogIGJpbmRfcm93cyhuZXdfYXJjaGl2ZV9jYW5lc20pICU+JQogIGdyb3VwX2J5KG1vZGVsLCBleHBlcmltZW50LCBzb3VyY2UpICU+JSAKICBzdW1tYXJpc2UoY291bnQgPSBuX2Rpc3RpbmN0KGVuc2VtYmxlKSkgJT4lIAogIHVuZ3JvdXAgJT4lIAogIHRpZHlyOjpzcHJlYWQoc291cmNlLCBjb3VudCkgJT4lIAogIGtuaXRyOjprYWJsZShmb3JtYXQgPSAibWFya2Rvd24iKQpgYGAKCgpgYGB7cn0KZ2dwbG90KCkgKyAKICBnZW9tX3BvaW50KGRhdGEgPSBjYW5lc21fb2xkLCBhZXMoZngsIGR4LCBjb2xvciA9ICJvbGQiKSkgKyAKICBnZW9tX3BvaW50KGRhdGEgPSBuZXdfYXJjaGl2ZV9jYW5lc20sIGFlcyhmeCwgZHgsIGNvbG9yID0gIm5ldyIpLCBhbHBoYSA9IDAuNSkgKyAKICB0aGVtZV9idygpICsgCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoIm9sZCIgPSAiYmx1ZSIsICJuZXciID0gInBpbmsiKSkgKwogIGZhY2V0X3dyYXAoImV4cGVyaW1lbnQiLCBzY2FsZXMgPSAiZnJlZSIpICsgCiAgTlVMTCArIAogIGxhYnModGl0bGUgPSAiQ2FuRVNNNSIpCmBgYAoKCgojIE1JUk9DNgoKYGBge3J9Cm1pcm9jX29sZCA8LSByZWFkLmNzdihoZXJlOjpoZXJlKERBVEFfRElSLCAiTUlST0M2X2FyY2hpdmVfZGF0YS5jc3YiKSwgc3RyaW5nc0FzRmFjdG9ycyA9IEZBTFNFKQptaXJvY19vbGQkc291cmNlIDwtICJvbGQiCm5ld19hcmNoaXZlX21pcm9jIDwtIGRwbHlyOjpmaWx0ZXIobmV3X2FyY2hpdmUsIG1vZGVsID09ICJNSVJPQzYiKQpgYGAKCgpgYGB7cn0KbWlyb2Nfb2xkICU+JSAKICBiaW5kX3Jvd3MobmV3X2FyY2hpdmVfbWlyb2MpICU+JQogIGdyb3VwX2J5KG1vZGVsLCBleHBlcmltZW50LCBzb3VyY2UpICU+JSAKICBzdW1tYXJpc2UoY291bnQgPSBuX2Rpc3RpbmN0KGVuc2VtYmxlKSkgJT4lIAogIHVuZ3JvdXAgJT4lIAogIHRpZHlyOjpzcHJlYWQoc291cmNlLCBjb3VudCkgJT4lIAogIGtuaXRyOjprYWJsZShmb3JtYXQgPSAibWFya2Rvd24iKQpgYGAKCgpgYGB7cn0KZ2dwbG90KCkgKyAKICBnZW9tX3BvaW50KGRhdGEgPSBtaXJvY19vbGQsIGFlcyhmeCwgZHgsIGNvbG9yID0gIm9sZCIpKSArIAogIGdlb21fcG9pbnQoZGF0YSA9IG5ld19hcmNoaXZlX21pcm9jLCBhZXMoZngsIGR4LCBjb2xvciA9ICJuZXciKSwgYWxwaGEgPSAwLjUpICsgCiAgdGhlbWVfYncoKSArIAogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCJvbGQiID0gImJsdWUiLCAibmV3IiA9ICJwaW5rIikpICsKICBmYWNldF93cmFwKCJleHBlcmltZW50Iiwgc2NhbGVzID0gImZyZWUiKSArIAogIE5VTEwgKyAKICBsYWJzKHRpdGxlID0gIk1JUk9DNiIpCmBgYAoKCiMgTVBJLUVTTTEtMi1IUgoKYGBge3J9Cm1waV9vbGQgPC0gcmVhZC5jc3YoaGVyZTo6aGVyZShEQVRBX0RJUiwgIk1QSS1FU00xLTItSFJfYXJjaGl2ZV9kYXRhLmNzdiIpLCBzdHJpbmdzQXNGYWN0b3JzID0gRkFMU0UpCm1waV9vbGQkc291cmNlIDwtICJvbGQiCm5ld19hcmNoaXZlX21waSA8LSBkcGx5cjo6ZmlsdGVyKG5ld19hcmNoaXZlLCBtb2RlbCA9PSAiTVBJLUVTTTEtMi1IUiIpCmBgYAoKCmBgYHtyfQptcGlfb2xkICU+JSAKICBiaW5kX3Jvd3MobmV3X2FyY2hpdmVfbXBpKSAlPiUKICBncm91cF9ieShtb2RlbCwgZXhwZXJpbWVudCwgc291cmNlKSAlPiUgCiAgc3VtbWFyaXNlKGNvdW50ID0gbl9kaXN0aW5jdChlbnNlbWJsZSkpICU+JSAKICB1bmdyb3VwICU+JSAKICB0aWR5cjo6c3ByZWFkKHNvdXJjZSwgY291bnQpICU+JSAKICBrbml0cjo6a2FibGUoZm9ybWF0ID0gIm1hcmtkb3duIikKYGBgCgoKYGBge3J9CmdncGxvdCgpICsgCiAgZ2VvbV9wb2ludChkYXRhID0gbXBpX29sZCwgYWVzKGZ4LCBkeCwgY29sb3IgPSAib2xkIikpICsgCiAgZ2VvbV9wb2ludChkYXRhID0gbmV3X2FyY2hpdmVfbXBpLCBhZXMoZngsIGR4LCBjb2xvciA9ICJuZXciKSwgYWxwaGEgPSAwLjUpICsgCiAgdGhlbWVfYncoKSArIAogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCJvbGQiID0gImJsdWUiLCAibmV3IiA9ICJwaW5rIikpICsKICBmYWNldF93cmFwKCJleHBlcmltZW50Iiwgc2NhbGVzID0gImZyZWUiKSArIAogIE5VTEwgKyAKICBsYWJzKHRpdGxlID0gIk1QSS1FU00xLTItSFIiKQpgYGAKCgojIE1QSS1FU00xLTItTFIKCmBgYHtyfQptcGlfb2xkIDwtIHJlYWQuY3N2KGhlcmU6OmhlcmUoREFUQV9ESVIsICJNUEktRVNNMS0yLUxSX2FyY2hpdmVfZGF0YS5jc3YiKSwgc3RyaW5nc0FzRmFjdG9ycyA9IEZBTFNFKQptcGlfb2xkJHNvdXJjZSA8LSAib2xkIgpuZXdfYXJjaGl2ZV9tcGkgPC0gZHBseXI6OmZpbHRlcihuZXdfYXJjaGl2ZSwgbW9kZWwgPT0gIk1QSS1FU00xLTItTFIiKQpgYGAKCgpgYGB7cn0KbXBpX29sZCAlPiUgCiAgYmluZF9yb3dzKG5ld19hcmNoaXZlX21waSkgJT4lCiAgZ3JvdXBfYnkobW9kZWwsIGV4cGVyaW1lbnQsIHNvdXJjZSkgJT4lIAogIHN1bW1hcmlzZShjb3VudCA9IG5fZGlzdGluY3QoZW5zZW1ibGUpKSAlPiUgCiAgdW5ncm91cCAlPiUgCiAgdGlkeXI6OnNwcmVhZChzb3VyY2UsIGNvdW50KSAlPiUgCiAga25pdHI6OmthYmxlKGZvcm1hdCA9ICJtYXJrZG93biIpCmBgYAoKCmBgYHtyfQpnZ3Bsb3QoKSArIAogIGdlb21fcG9pbnQoZGF0YSA9IG1waV9vbGQsIGFlcyhmeCwgZHgsIGNvbG9yID0gIm9sZCIpKSArIAogIGdlb21fcG9pbnQoZGF0YSA9IG5ld19hcmNoaXZlX21waSwgYWVzKGZ4LCBkeCwgY29sb3IgPSAibmV3IiksIGFscGhhID0gMC41KSArIAogIHRoZW1lX2J3KCkgKyAKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygib2xkIiA9ICJibHVlIiwgIm5ldyIgPSAicGluayIpKSArCiAgZmFjZXRfd3JhcCgiZXhwZXJpbWVudCIsIHNjYWxlcyA9ICJmcmVlIikgKyAKICBOVUxMICsgCiAgbGFicyh0aXRsZSA9ICJNUEktRVNNMS0yLUhSIikKYGBgCgoKIyBOb3JDUE0xCgpgYGB7cn0Kbm9yY3BtMV9vbGQgPC0gcmVhZC5jc3YoaGVyZTo6aGVyZShEQVRBX0RJUiwgIk5vckNQTTFfYXJjaGl2ZV9kYXRhLmNzdiIpLCBzdHJpbmdzQXNGYWN0b3JzID0gRkFMU0UpCm5vcmNwbTFfb2xkJHNvdXJjZSA8LSAib2xkIgpuZXdfYXJjaGl2ZV9ub3JjcG0xIDwtIGRwbHlyOjpmaWx0ZXIobmV3X2FyY2hpdmUsIG1vZGVsID09ICJOb3JDUE0xIikKYGBgCgoKYGBge3J9Cm5vcmNwbTFfb2xkICU+JSAKICBiaW5kX3Jvd3MobmV3X2FyY2hpdmVfbm9yY3BtMSkgJT4lCiAgZ3JvdXBfYnkobW9kZWwsIGV4cGVyaW1lbnQsIHNvdXJjZSkgJT4lIAogIHN1bW1hcmlzZShjb3VudCA9IG5fZGlzdGluY3QoZW5zZW1ibGUpKSAlPiUgCiAgdW5ncm91cCAlPiUgCiAgdGlkeXI6OnNwcmVhZChzb3VyY2UsIGNvdW50KSAlPiUgCiAga25pdHI6OmthYmxlKGZvcm1hdCA9ICJtYXJrZG93biIpCmBgYAoKCmBgYHtyfQpnZ3Bsb3QoKSArIAogIGdlb21fcG9pbnQoZGF0YSA9IG5vcmNwbTFfb2xkLCBhZXMoZngsIGR4LCBjb2xvciA9ICJvbGQiKSkgKyAKICBnZW9tX3BvaW50KGRhdGEgPSBuZXdfYXJjaGl2ZV9ub3JjcG0xLCBhZXMoZngsIGR4LCBjb2xvciA9ICJuZXciKSwgYWxwaGEgPSAwLjUpICsgCiAgdGhlbWVfYncoKSArIAogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCJvbGQiID0gImJsdWUiLCAibmV3IiA9ICJwaW5rIikpICsKICBmYWNldF93cmFwKCJleHBlcmltZW50Iiwgc2NhbGVzID0gImZyZWUiKSArIAogIE5VTEwgKyAKICBsYWJzKHRpdGxlID0gIk5vckNQTTEiKQpgYGAKCgojIFVLRVNNMS0wLUxMCgpgYGB7cn0KdWtlc21fb2xkIDwtIHJlYWQuY3N2KGhlcmU6OmhlcmUoREFUQV9ESVIsICJVS0VTTTEtMC1MTF9hcmNoaXZlX2RhdGEuY3N2IiksIHN0cmluZ3NBc0ZhY3RvcnMgPSBGQUxTRSkKdWtlc21fb2xkJHNvdXJjZSA8LSAib2xkIgpuZXdfYXJjaGl2ZV91a2VzbSA8LSBkcGx5cjo6ZmlsdGVyKG5ld19hcmNoaXZlLCBtb2RlbCA9PSAiVUtFU00xLTAtTEwiKQpgYGAKCgpgYGB7cn0KdWtlc21fb2xkICU+JSAKICBiaW5kX3Jvd3MobmV3X2FyY2hpdmVfdWtlc20pICU+JQogIGdyb3VwX2J5KG1vZGVsLCBleHBlcmltZW50LCBzb3VyY2UpICU+JSAKICBzdW1tYXJpc2UoY291bnQgPSBuX2Rpc3RpbmN0KGVuc2VtYmxlKSkgJT4lIAogIHVuZ3JvdXAgJT4lIAogIHRpZHlyOjpzcHJlYWQoc291cmNlLCBjb3VudCkgJT4lIAogIGtuaXRyOjprYWJsZShmb3JtYXQgPSAibWFya2Rvd24iKQpgYGAKCgpgYGB7cn0KZ2dwbG90KCkgKyAKICBnZW9tX3BvaW50KGRhdGEgPSB1a2VzbV9vbGQsIGFlcyhmeCwgZHgsIGNvbG9yID0gIm9sZCIpKSArIAogIGdlb21fcG9pbnQoZGF0YSA9IG5ld19hcmNoaXZlX3VrZXNtLCBhZXMoZngsIGR4LCBjb2xvciA9ICJuZXciKSwgYWxwaGEgPSAwLjUpICsgCiAgdGhlbWVfYncoKSArIAogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCJvbGQiID0gImJsdWUiLCAibmV3IiA9ICJwaW5rIikpICsKICBmYWNldF93cmFwKCJleHBlcmltZW50Iiwgc2NhbGVzID0gImZyZWUiKSArIAogIE5VTEwgKyAKICBsYWJzKHRpdGxlID0gIlVLRVNNMS0wLUxMIikKYGBgCgoKIyBOZXcgRXhwZXJpbWVudHMgCgpgYGB7cn0KbmV3X2V4cHMgPC0gYygiMXBjdENPMiIsICJhYnJ1cHQtNHhDTzIiLCAiYWJydXB0LTJ4Q08yIikKb2xkX2V4cHMgPC0gc2V0ZGlmZihuZXdfZXhwcywgdW5pcXVlKG5ld19hcmNoaXZlJGV4cGVyaW1lbnQpKQoKbmV3X2FyY2hpdmUgJT4lIAogIG11dGF0ZShleHAgPSBpZl9lbHNlKGV4cGVyaW1lbnQgJWluJSBuZXdfZXhwcywgJzElLCB4NCBDTzIgJiB4MiBDTzInLCAnaGlzdG9yaWNhbCArIHNzcHMnKSkgLT4gCiAgZGF0YQoKbW9kcyA8LSB1bmlxdWUoZGF0YSRtb2RlbCkKZGF0YSRleHAgPC0gZmFjdG9yKGRhdGEkZXhwLCBjKCcxJSwgeDQgQ08yICYgeDIgQ08yJywgJ2hpc3RvcmljYWwgKyBzc3BzJyksIG9yZGVyZWQgPSBUUlVFKQoKZGF0YSAlPiUgCiAgZmlsdGVyKG1vZGVsICVpbiUgbW9kc1sxOjE2XSkgJT4lIAogIGdncGxvdChhZXMoZngsIGR4LCBjb2xvciA9IGV4cCkpICsgCiAgZ2VvbV9wb2ludCgpICsgCiAgZmFjZXRfd3JhcCgibW9kZWwiLCBzY2FsZXMgPSAiZnJlZSIpICsgCiAgdGhlbWVfYncoKSArIAogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCcxJSwgeDQgQ08yICYgeDIgQ08yJyA9ICdibHVlJywgJ2hpc3RvcmljYWwgKyBzc3BzJyA9ICdncmV5JykpCgpgYGAKCmBgYHtyfQoKZGF0YSAlPiUgCiAgZmlsdGVyKG1vZGVsICVpbiUgbW9kc1sxNzoyN10pICU+JSAKICBnZ3Bsb3QoYWVzKGZ4LCBkeCwgY29sb3IgPSBleHApKSArIAogIGdlb21fcG9pbnQoKSArIAogIGZhY2V0X3dyYXAoIm1vZGVsIiwgc2NhbGVzID0gImZyZWUiKSArIAogIHRoZW1lX2J3KCkgKyAKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygnMSUsIHg0IENPMiAmIHgyIENPMicgPSAnYmx1ZScsICdoaXN0b3JpY2FsICsgc3NwcycgPSAnZ3JleScpKQoKYGBgCgpgYGB7cn0KCmRhdGEgJT4lIAogIGZpbHRlcihtb2RlbCAlaW4lIG1vZHNbMjg6MzNdKSAlPiUgCiAgZ2dwbG90KGFlcyhmeCwgZHgsIGNvbG9yID0gZXhwKSkgKyAKICBnZW9tX3BvaW50KCkgKyAKICBmYWNldF93cmFwKCJtb2RlbCIsIHNjYWxlcyA9ICJmcmVlIikgKyAKICB0aGVtZV9idygpICsgCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoJzElLCB4NCBDTzIgJiB4MiBDTzInID0gJ2JsdWUnLCAnaGlzdG9yaWNhbCArIHNzcHMnID0gJ2dyZXknKSkKCmBgYA==