1 Set Up

library(data.table)
library(dplyr)
library(tidyr)
library(ggplot2)
library(magrittr)

BASE_DIR <- here::here()

theme_set(theme_bw())

1.1 Objective

Take a look at how different the Hector output is when different initial C pools are used.

out <- as.data.table(rbind(read.csv(file.path(BASE_DIR, "hector_new.csv")),
                           read.csv(file.path(BASE_DIR, "hector_old.csv"))))

2 How did the inital C values change?

df <- data.table(box = c("HL", "LL", "IO", "DO"), 
           old = c(140, 770, 8400, 26000), 
           new = c(135, 765, 9080, 28019))
df

Surface

data.table(old = sum(df[df$box %in% c("HL", "LL")]$old), 
           new = sum(df[df$box %in% c("HL", "LL")]$new))

Deep / Interior

data.table(old = sum(df[df$box %in% c("IO", "DO")]$old), 
           new = sum(df[df$box %in% c("IO", "DO")]$new))

Total Ocean C changes by about 7%.

data.table(old = sum(df$old), 
           new = sum(df$new))

3 Ocean Output

4 pH

out  %>%
    filter(grepl(x = tolower(variable), pattern = "ph")) ->
    ph_data
ph_data %>%
    ggplot(aes(year, value, color = pre, linetype = scenario)) +
    geom_line() +
    facet_wrap("variable", scales = "free", ncol = 1)

ph_data %>%
    distinct() %>%
    dcast(scenario + year + units + variable ~ pre, value.var = "value", fun.aggregate = min) %>%
    mutate(percent =  100 *(`new` - `old`) / old) %>%
    group_by(variable) %>%
    summarise(min = min(percent),
              max = max(percent),
              mean = mean(percent))

5 CO3

out  %>%
    filter(grepl(x = tolower(variable), pattern = "co3")) ->
    co3_data

co3_data %>%
    ggplot(aes(year, value, color = pre, linetype = scenario)) +
    geom_line() +
    facet_wrap("variable", scales = "free", ncol = 1)

co3_data %>%
    distinct() %>%
    dcast(scenario + year + units + variable ~ pre, value.var = "value") %>%
    mutate(percent =  100 *(`new` - `old`) / `old`) %>%
    group_by(variable) %>%
    summarise(min = min(percent),
              max = max(percent),
              mean = mean(percent))

6 DIC

out  %>%
    filter(grepl(x = tolower(variable), pattern = "dic")) ->
    dic_data

dic_data %>%
    ggplot(aes(year, value, color = pre, linetype = scenario)) +
    geom_line() +
    facet_wrap("variable", scales = "free", ncol = 1)

dic_data %>%
    distinct() %>%
    dcast(scenario + year + units + variable ~ pre, value.var = "value") %>%
    mutate(percent =  100 *(`new` - `old`) / `old`) %>%
    group_by(variable) %>%
    summarise(min = min(percent),
              max = max(percent),
              mean = mean(percent))

7 Carbon

out  %>%
    filter(grepl(x = tolower(variable), pattern = "carbon_")) ->
    carbon_out

carbon_out %>%
    ggplot(aes(year, value, color = pre, linetype = scenario)) +
    geom_line() +
    facet_wrap("variable", scales = "free", ncol = 1)

carbon_out %>%
    distinct() %>%
    dcast(scenario + year + units + variable ~ pre, value.var = "value") %>%
    mutate(percent =  100 *(`new` - `old`) / `old`) %>%
    group_by(variable) %>%
    summarise(min = min(percent),
              max = max(percent),
              mean = mean(percent))

8 SST

out  %>%
    filter(variable == "Tgav_ocean_ST") ->
    tgav_out

tgav_out %>%
    ggplot(aes(year, value, color = pre, linetype = scenario)) +
    geom_line() +
    facet_wrap("variable", scales = "free", ncol = 1)

tgav_out %>%
    distinct() %>%
    dcast(scenario + year + units + variable ~ pre, value.var = "value") %>%
    mutate(percent =  100 *(`new` - `old`) / `old`) %>%
    group_by(variable) %>%
    summarise(min = min(percent),
              max = max(percent),
              mean = mean(percent))

9 The Big 4

big_four_vars <- c("Tgav", "Ftot", "Ca", "FCO2")
out %>%
    filter(variable %in% big_four_vars) -> 
    big_four_out
    
big_four_out %>% 
    ggplot(aes(year, value, color = pre, linetype = scenario)) +
    geom_line() +
    facet_wrap("variable", scales = "free")

9.1 Percent Difference in the Big Four


big_four_out %>%
    distinct() %>%
    dcast(scenario + year + units + variable ~ pre, value.var = "value") %>%
    mutate(percent =  100 *(`new` - `old`) / `old`) %>%
    group_by(variable) %>%
    summarise(min = min(percent),
              max = max(percent),
              mean = mean(percent))

10 Log files

10.1 Hector using the old values

Tue Feb 15 16:30:46 2022:DEBUG:stashCValues: annualflux_sum=0.0032725 Pg C
Tue Feb 15 16:30:46 2022:DEBUG:log_state: ----- State of LL box -----
Tue Feb 15 16:30:46 2022:DEBUG:log_state:    carbon = 783.646 -> 783.65
Tue Feb 15 16:30:46 2022:DEBUG:log_state:    T=20.9 degC, surfacebox=1, active_chemistry=1
Tue Feb 15 16:30:46 2022:DEBUG:log_state:    CarbonAdditions = 69.2904 (8.84205%)
Tue Feb 15 16:30:46 2022:DEBUG:log_state:    CarbonSubtractions = 68.2904 (8.71444%)
Tue Feb 15 16:30:46 2022:DEBUG:log_state:    FPgC = -0.9965 (-0.127162%)
Tue Feb 15 16:30:46 2022:DEBUG:log_state:    ao_flux = 0 (0%)
Tue Feb 15 16:30:46 2022:DEBUG:log_state:    oa_flux = 0.9965 (0.127162%)
Tue Feb 15 16:30:46 2022:DEBUG:log_state:    K0 = 0.0324716 mol/l/atm Tr = 0.0337689 gC/m/month/atm
Tue Feb 15 16:30:46 2022:DEBUG:log_state:    Surface DIC = 2076.28 umol/kg
Tue Feb 15 16:30:46 2022:DEBUG:log_state:    Connection #0 to HL, k=0.0742532, window=1
Tue Feb 15 16:30:46 2022:DEBUG:log_state:    Connection #1 to intermediate, k=0.0128912, window=1
Tue Feb 15 16:30:46 2022:DEBUG:log_state: ----- State of HL box -----
Tue Feb 15 16:30:46 2022:DEBUG:log_state:    carbon = 140.525 -> 140.525
Tue Feb 15 16:30:46 2022:DEBUG:log_state:    T=1.6 degC, surfacebox=1, active_chemistry=1
Tue Feb 15 16:30:46 2022:DEBUG:log_state:    CarbonAdditions = 98.3685 (70.0008%)
Tue Feb 15 16:30:46 2022:DEBUG:log_state:    CarbonSubtractions = 99.3685 (70.7124%)
Tue Feb 15 16:30:46 2022:DEBUG:log_state:    FPgC = 0.999773 (0.711456%)
Tue Feb 15 16:30:46 2022:DEBUG:log_state:    ao_flux = 0.999773 (0.711456%)
Tue Feb 15 16:30:46 2022:DEBUG:log_state:    oa_flux = 0 (0%)
Tue Feb 15 16:30:46 2022:DEBUG:log_state:    K0 = 0.0609349 mol/l/atm Tr = 0.0368937 gC/m/month/atm
Tue Feb 15 16:30:46 2022:DEBUG:log_state:    Surface DIC = 2109.82 umol/kg
Tue Feb 15 16:30:46 2022:DEBUG:log_state:    Connection #0 to deep, k=0.707124, window=1
Tue Feb 15 16:30:46 2022:DEBUG:log_state: ----- State of intermediate box -----
Tue Feb 15 16:30:46 2022:DEBUG:log_state:    carbon = 8418.94 -> 8418.94
Tue Feb 15 16:30:46 2022:DEBUG:log_state:    T=18 degC, surfacebox=0, active_chemistry=0
Tue Feb 15 16:30:46 2022:DEBUG:log_state:    CarbonAdditions = 273.472 (3.2483%)
Tue Feb 15 16:30:46 2022:DEBUG:log_state:    CarbonSubtractions = 273.472 (3.24829%)
Tue Feb 15 16:30:46 2022:DEBUG:log_state:    K0 = 0 (undefined) Tr = 0 (undefined)
Tue Feb 15 16:30:46 2022:DEBUG:log_state:    Connection #0 to LL, k=0.0082303, window=1
Tue Feb 15 16:30:46 2022:DEBUG:log_state:    Connection #1 to HL, k=0.0047726, window=1
Tue Feb 15 16:30:46 2022:DEBUG:log_state:    Connection #2 to deep, k=0.01948, window=1
Tue Feb 15 16:30:46 2022:DEBUG:log_state: ----- State of deep box -----
Tue Feb 15 16:30:46 2022:DEBUG:log_state:    carbon = 25991.8 -> 25991.8
Tue Feb 15 16:30:46 2022:DEBUG:log_state:    T=18 degC, surfacebox=0, active_chemistry=0
Tue Feb 15 16:30:46 2022:DEBUG:log_state:    CarbonAdditions = 263.369 (1.01328%)
Tue Feb 15 16:30:46 2022:DEBUG:log_state:    CarbonSubtractions = 263.37 (1.01328%)
Tue Feb 15 16:30:46 2022:DEBUG:log_state:    K0 = 0 (undefined) Tr = 0 (undefined)
Tue Feb 15 16:30:46 2022:DEBUG:log_state:    Connection #0 to intermediate, k=0.0101328, window=1

10.2 Hector using the new values

Tue Feb 15 16:16:24 2022:DEBUG:log_state: ----- State of LL box -----
Tue Feb 15 16:16:24 2022:DEBUG:log_state:    carbon = 844.184 -> 844.186
Tue Feb 15 16:16:24 2022:DEBUG:log_state:    T=20.9 degC, surfacebox=1, active_chemistry=1
Tue Feb 15 16:16:24 2022:DEBUG:log_state:    CarbonAdditions = 74.5659 (8.8329%)
Tue Feb 15 16:16:24 2022:DEBUG:log_state:    CarbonSubtractions = 73.5659 (8.71444%)
Tue Feb 15 16:16:24 2022:DEBUG:log_state:    FPgC = -0.997694 (-0.118184%)
Tue Feb 15 16:16:24 2022:DEBUG:log_state:    ao_flux = 0 (0%)
Tue Feb 15 16:16:24 2022:DEBUG:log_state:    oa_flux = 0.997694 (0.118184%)
Tue Feb 15 16:16:24 2022:DEBUG:log_state:    K0 = 0.0324716 mol/l/atm Tr = 0.0337689 gC/m/month/atm
Tue Feb 15 16:16:24 2022:DEBUG:log_state:    Surface DIC = 2236.67 umol/kg
Tue Feb 15 16:16:24 2022:DEBUG:log_state:    Connection #0 to HL, k=0.0742532, window=1
Tue Feb 15 16:16:24 2022:DEBUG:log_state:    Connection #1 to intermediate, k=0.0128912, window=1
Tue Feb 15 16:16:24 2022:DEBUG:log_state: ----- State of HL box -----
Tue Feb 15 16:16:24 2022:DEBUG:log_state:    carbon = 151.208 -> 151.208
Tue Feb 15 16:16:24 2022:DEBUG:log_state:    T=1.6 degC, surfacebox=1, active_chemistry=1
Tue Feb 15 16:16:24 2022:DEBUG:log_state:    CarbonAdditions = 105.923 (70.0511%)
Tue Feb 15 16:16:24 2022:DEBUG:log_state:    CarbonSubtractions = 106.923 (70.7124%)
Tue Feb 15 16:16:24 2022:DEBUG:log_state:    FPgC = 1.00002 (0.661357%)
Tue Feb 15 16:16:24 2022:DEBUG:log_state:    ao_flux = 1.00002 (0.661357%)
Tue Feb 15 16:16:24 2022:DEBUG:log_state:    oa_flux = 0 (0%)
Tue Feb 15 16:16:24 2022:DEBUG:log_state:    K0 = 0.0609349 mol/l/atm Tr = 0.0368937 gC/m/month/atm
Tue Feb 15 16:16:24 2022:DEBUG:log_state:    Surface DIC = 2270.22 umol/kg
Tue Feb 15 16:16:24 2022:DEBUG:log_state:    Connection #0 to deep, k=0.707124, window=1
Tue Feb 15 16:16:24 2022:DEBUG:log_state: ----- State of intermediate box -----
Tue Feb 15 16:16:24 2022:DEBUG:log_state:    carbon = 9059.93 -> 9059.93
Tue Feb 15 16:16:24 2022:DEBUG:log_state:    T=18 degC, surfacebox=0, active_chemistry=0
Tue Feb 15 16:16:24 2022:DEBUG:log_state:    CarbonAdditions = 294.293 (3.24829%)
Tue Feb 15 16:16:24 2022:DEBUG:log_state:    CarbonSubtractions = 294.293 (3.24829%)
Tue Feb 15 16:16:24 2022:DEBUG:log_state:    K0 = 0 (undefined) Tr = 0 (undefined)
Tue Feb 15 16:16:24 2022:DEBUG:log_state:    Connection #0 to LL, k=0.0082303, window=1
Tue Feb 15 16:16:24 2022:DEBUG:log_state:    Connection #1 to HL, k=0.0047726, window=1
Tue Feb 15 16:16:24 2022:DEBUG:log_state:    Connection #2 to deep, k=0.01948, window=1
Tue Feb 15 16:16:24 2022:DEBUG:log_state: ----- State of deep box -----
Tue Feb 15 16:16:24 2022:DEBUG:log_state:    carbon = 27969.5 -> 27969.5
Tue Feb 15 16:16:24 2022:DEBUG:log_state:    T=18 degC, surfacebox=0, active_chemistry=0
Tue Feb 15 16:16:24 2022:DEBUG:log_state:    CarbonAdditions = 283.41 (1.01328%)
Tue Feb 15 16:16:24 2022:DEBUG:log_state:    CarbonSubtractions = 283.411 (1.01328%)
Tue Feb 15 16:16:24 2022:DEBUG:log_state:    K0 = 0 (undefined) Tr = 0 (undefined)
Tue Feb 15 16:16:24 2022:DEBUG:log_state:    Connection #0 to intermediate, k=0.0101328, window=1
Tue Feb 15 16:16:24 2022:DEBUG:record_state: Recording component state at t= 1746

11 Comparison with obs

read.csv(file.path(BASE_DIR, "obs", "HOTS_PH.csv"), skip = 3) %>% 
    rename(variable = vtag) %>% 
    select(year = Year, value, variable) %>% 
    mutate(scenario = "HOTS") -> 
    obs1 

read.csv(file.path(BASE_DIR, "obs", "ensemble_mean_model.csv")) %>% 
    select(year, value, variable) %>% 
    mutate(scenario = "CMIP") -> 
    obs2
obs_out <- bind_rows(obs1, obs2) %>% 
        mutate(variable = tolower(variable)) 
out %>% 
    filter(variable %in% c("pH_HL", "pH_LL", "pH")) %>% 
    filter(pre == "new") %>% 
    mutate(variable = tolower(variable)) -> 
    hector_ph

out %>% 
    filter(variable %in% c("pH_HL", "pH_LL", "pH")) %>% 
    filter(pre == "old") %>% 
    mutate(variable = tolower(variable)) -> 
    hector_ph_old

ggplot() + 
    geom_point(data = hector_ph, aes(year, value, color = 'new hector'), size = 1) + 
    geom_point(data = hector_ph_old, aes(year, value, color = 'old hector'), size = 1) + 
    geom_point(data = obs_out, aes(year, value, color = scenario), size = 1) + 
    facet_wrap("variable") + 
    coord_cartesian(xlim = c(1850, 2000), ylim = c(7.45, 8.25)) + 
    labs(y = "ph total value")
Warning: Removed 4 rows containing missing values (geom_point).

Well this is less than ideal. Hmmmmmm…

LS0tCnRpdGxlOiAiSGVjdG9yOiBJbml0YWxpemVkIE9jZWFuIEMiCm91dHB1dDoKICBodG1sX25vdGVib29rOgogICAgdG9jOiB5ZXMKICAgIHRvY19kZXB0aDogJzQnCiAgICB0b2NfZmxvYXQ6IHllcwogICAgbnVtYmVyX3NlY3Rpb25zOiB0cnVlCmRhdGU6ICJgciBmb3JtYXQoU3lzLnRpbWUoKSwgJyVkICVCLCAlWScpYCIKLS0tCgojIFNldCBVcCAKYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9CmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSwgZXJyb3IgPSBGQUxTRSwgbWVzc2FnZSA9IEZBTFNFLCBtZXNzYWdlID0gRkFMU0UpCiMgc2VlIGh0dHBzOi8vYm9va2Rvd24ub3JnL3lpaHVpL3JtYXJrZG93bi1jb29rYm9vay8gZm9yIG1vcmUgaW5mbyBvbiBtYXJrZG93bnMKYGBgCgpgYGB7cn0KbGlicmFyeShkYXRhLnRhYmxlKQpsaWJyYXJ5KGRwbHlyKQpsaWJyYXJ5KHRpZHlyKQpsaWJyYXJ5KGdncGxvdDIpCmxpYnJhcnkobWFncml0dHIpCgpCQVNFX0RJUiA8LSBoZXJlOjpoZXJlKCkKCnRoZW1lX3NldCh0aGVtZV9idygpKQpgYGAKCiMjIE9iamVjdGl2ZSAKClRha2UgYSBsb29rIGF0IGhvdyBkaWZmZXJlbnQgdGhlIEhlY3RvciBvdXRwdXQgaXMgd2hlbiBkaWZmZXJlbnQgaW5pdGlhbCBDIHBvb2xzIGFyZSB1c2VkLiAKCmBgYHtyfQpvdXQgPC0gYXMuZGF0YS50YWJsZShyYmluZChyZWFkLmNzdihmaWxlLnBhdGgoQkFTRV9ESVIsICJoZWN0b3JfbmV3LmNzdiIpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZC5jc3YoZmlsZS5wYXRoKEJBU0VfRElSLCAiaGVjdG9yX29sZC5jc3YiKSkpKQpgYGAKCgojIEhvdyBkaWQgdGhlIGluaXRhbCBDIHZhbHVlcyBjaGFuZ2U/IAoKCmBgYHtyfQpkZiA8LSBkYXRhLnRhYmxlKGJveCA9IGMoIkhMIiwgIkxMIiwgIklPIiwgIkRPIiksIAogICAgICAgICAgIG9sZCA9IGMoMTQwLCA3NzAsIDg0MDAsIDI2MDAwKSwgCiAgICAgICAgICAgbmV3ID0gYygxMzUsIDc2NSwgOTA4MCwgMjgwMTkpKQpkZgpgYGAKClN1cmZhY2UKCmBgYHtyfQpkYXRhLnRhYmxlKG9sZCA9IHN1bShkZltkZiRib3ggJWluJSBjKCJITCIsICJMTCIpXSRvbGQpLCAKICAgICAgICAgICBuZXcgPSBzdW0oZGZbZGYkYm94ICVpbiUgYygiSEwiLCAiTEwiKV0kbmV3KSkKYGBgCgpEZWVwIC8gSW50ZXJpb3IgCgpgYGB7cn0KZGF0YS50YWJsZShvbGQgPSBzdW0oZGZbZGYkYm94ICVpbiUgYygiSU8iLCAiRE8iKV0kb2xkKSwgCiAgICAgICAgICAgbmV3ID0gc3VtKGRmW2RmJGJveCAlaW4lIGMoIklPIiwgIkRPIildJG5ldykpCmBgYApUb3RhbCBPY2VhbiBDIGNoYW5nZXMgYnkgYWJvdXQgNyUuIAoKCmBgYHtyfQpkYXRhLnRhYmxlKG9sZCA9IHN1bShkZiRvbGQpLCAKICAgICAgICAgICBuZXcgPSBzdW0oZGYkbmV3KSkKYGBgCiMgT2NlYW4gT3V0cHV0CgojIHBICgpgYGB7cn0Kb3V0ICAlPiUKICAgIGZpbHRlcihncmVwbCh4ID0gdG9sb3dlcih2YXJpYWJsZSksIHBhdHRlcm4gPSAicGgiKSkgLT4KICAgIHBoX2RhdGEKYGBgCgpgYGB7cn0KcGhfZGF0YSAlPiUKICAgIGdncGxvdChhZXMoeWVhciwgdmFsdWUsIGNvbG9yID0gcHJlLCBsaW5ldHlwZSA9IHNjZW5hcmlvKSkgKwogICAgZ2VvbV9saW5lKCkgKwogICAgZmFjZXRfd3JhcCgidmFyaWFibGUiLCBzY2FsZXMgPSAiZnJlZSIsIG5jb2wgPSAxKQpgYGAKCmBgYHtyfQpwaF9kYXRhICU+JQogICAgZGlzdGluY3QoKSAlPiUKICAgIGRjYXN0KHNjZW5hcmlvICsgeWVhciArIHVuaXRzICsgdmFyaWFibGUgfiBwcmUsIHZhbHVlLnZhciA9ICJ2YWx1ZSIsIGZ1bi5hZ2dyZWdhdGUgPSBtaW4pICU+JQogICAgbXV0YXRlKHBlcmNlbnQgPSAgMTAwICooYG5ld2AgLSBgb2xkYCkgLyBvbGQpICU+JQogICAgZ3JvdXBfYnkodmFyaWFibGUpICU+JQogICAgc3VtbWFyaXNlKG1pbiA9IG1pbihwZXJjZW50KSwKICAgICAgICAgICAgICBtYXggPSBtYXgocGVyY2VudCksCiAgICAgICAgICAgICAgbWVhbiA9IG1lYW4ocGVyY2VudCkpCmBgYAoKIyBDTzMKCmBgYHtyfQpvdXQgICU+JQogICAgZmlsdGVyKGdyZXBsKHggPSB0b2xvd2VyKHZhcmlhYmxlKSwgcGF0dGVybiA9ICJjbzMiKSkgLT4KICAgIGNvM19kYXRhCgpjbzNfZGF0YSAlPiUKICAgIGdncGxvdChhZXMoeWVhciwgdmFsdWUsIGNvbG9yID0gcHJlLCBsaW5ldHlwZSA9IHNjZW5hcmlvKSkgKwogICAgZ2VvbV9saW5lKCkgKwogICAgZmFjZXRfd3JhcCgidmFyaWFibGUiLCBzY2FsZXMgPSAiZnJlZSIsIG5jb2wgPSAxKQoKYGBgCgpgYGB7cn0KY28zX2RhdGEgJT4lCiAgICBkaXN0aW5jdCgpICU+JQogICAgZGNhc3Qoc2NlbmFyaW8gKyB5ZWFyICsgdW5pdHMgKyB2YXJpYWJsZSB+IHByZSwgdmFsdWUudmFyID0gInZhbHVlIikgJT4lCiAgICBtdXRhdGUocGVyY2VudCA9ICAxMDAgKihgbmV3YCAtIGBvbGRgKSAvIGBvbGRgKSAlPiUKICAgIGdyb3VwX2J5KHZhcmlhYmxlKSAlPiUKICAgIHN1bW1hcmlzZShtaW4gPSBtaW4ocGVyY2VudCksCiAgICAgICAgICAgICAgbWF4ID0gbWF4KHBlcmNlbnQpLAogICAgICAgICAgICAgIG1lYW4gPSBtZWFuKHBlcmNlbnQpKQpgYGAKCiMgRElDIAoKYGBge3J9Cm91dCAgJT4lCiAgICBmaWx0ZXIoZ3JlcGwoeCA9IHRvbG93ZXIodmFyaWFibGUpLCBwYXR0ZXJuID0gImRpYyIpKSAtPgogICAgZGljX2RhdGEKCmRpY19kYXRhICU+JQogICAgZ2dwbG90KGFlcyh5ZWFyLCB2YWx1ZSwgY29sb3IgPSBwcmUsIGxpbmV0eXBlID0gc2NlbmFyaW8pKSArCiAgICBnZW9tX2xpbmUoKSArCiAgICBmYWNldF93cmFwKCJ2YXJpYWJsZSIsIHNjYWxlcyA9ICJmcmVlIiwgbmNvbCA9IDEpCmBgYAoKYGBge3J9CmRpY19kYXRhICU+JQogICAgZGlzdGluY3QoKSAlPiUKICAgIGRjYXN0KHNjZW5hcmlvICsgeWVhciArIHVuaXRzICsgdmFyaWFibGUgfiBwcmUsIHZhbHVlLnZhciA9ICJ2YWx1ZSIpICU+JQogICAgbXV0YXRlKHBlcmNlbnQgPSAgMTAwICooYG5ld2AgLSBgb2xkYCkgLyBgb2xkYCkgJT4lCiAgICBncm91cF9ieSh2YXJpYWJsZSkgJT4lCiAgICBzdW1tYXJpc2UobWluID0gbWluKHBlcmNlbnQpLAogICAgICAgICAgICAgIG1heCA9IG1heChwZXJjZW50KSwKICAgICAgICAgICAgICBtZWFuID0gbWVhbihwZXJjZW50KSkKYGBgCgojIENhcmJvbgoKYGBge3J9Cm91dCAgJT4lCiAgICBmaWx0ZXIoZ3JlcGwoeCA9IHRvbG93ZXIodmFyaWFibGUpLCBwYXR0ZXJuID0gImNhcmJvbl8iKSkgLT4KICAgIGNhcmJvbl9vdXQKCmNhcmJvbl9vdXQgJT4lCiAgICBnZ3Bsb3QoYWVzKHllYXIsIHZhbHVlLCBjb2xvciA9IHByZSwgbGluZXR5cGUgPSBzY2VuYXJpbykpICsKICAgIGdlb21fbGluZSgpICsKICAgIGZhY2V0X3dyYXAoInZhcmlhYmxlIiwgc2NhbGVzID0gImZyZWUiLCBuY29sID0gMSkKYGBgCgpgYGB7cn0KY2FyYm9uX291dCAlPiUKICAgIGRpc3RpbmN0KCkgJT4lCiAgICBkY2FzdChzY2VuYXJpbyArIHllYXIgKyB1bml0cyArIHZhcmlhYmxlIH4gcHJlLCB2YWx1ZS52YXIgPSAidmFsdWUiKSAlPiUKICAgIG11dGF0ZShwZXJjZW50ID0gIDEwMCAqKGBuZXdgIC0gYG9sZGApIC8gYG9sZGApICU+JQogICAgZ3JvdXBfYnkodmFyaWFibGUpICU+JQogICAgc3VtbWFyaXNlKG1pbiA9IG1pbihwZXJjZW50KSwKICAgICAgICAgICAgICBtYXggPSBtYXgocGVyY2VudCksCiAgICAgICAgICAgICAgbWVhbiA9IG1lYW4ocGVyY2VudCkpCmBgYAoKIyBTU1QKCmBgYHtyfQpvdXQgICU+JQogICAgZmlsdGVyKHZhcmlhYmxlID09ICJUZ2F2X29jZWFuX1NUIikgLT4KICAgIHRnYXZfb3V0Cgp0Z2F2X291dCAlPiUKICAgIGdncGxvdChhZXMoeWVhciwgdmFsdWUsIGNvbG9yID0gcHJlLCBsaW5ldHlwZSA9IHNjZW5hcmlvKSkgKwogICAgZ2VvbV9saW5lKCkgKwogICAgZmFjZXRfd3JhcCgidmFyaWFibGUiLCBzY2FsZXMgPSAiZnJlZSIsIG5jb2wgPSAxKQpgYGAKCgpgYGB7cn0KdGdhdl9vdXQgJT4lCiAgICBkaXN0aW5jdCgpICU+JQogICAgZGNhc3Qoc2NlbmFyaW8gKyB5ZWFyICsgdW5pdHMgKyB2YXJpYWJsZSB+IHByZSwgdmFsdWUudmFyID0gInZhbHVlIikgJT4lCiAgICBtdXRhdGUocGVyY2VudCA9ICAxMDAgKihgbmV3YCAtIGBvbGRgKSAvIGBvbGRgKSAlPiUKICAgIGdyb3VwX2J5KHZhcmlhYmxlKSAlPiUKICAgIHN1bW1hcmlzZShtaW4gPSBtaW4ocGVyY2VudCksCiAgICAgICAgICAgICAgbWF4ID0gbWF4KHBlcmNlbnQpLAogICAgICAgICAgICAgIG1lYW4gPSBtZWFuKHBlcmNlbnQpKQpgYGAKIyBUaGUgQmlnIDQgCgoKYGBge3J9CmJpZ19mb3VyX3ZhcnMgPC0gYygiVGdhdiIsICJGdG90IiwgIkNhIiwgIkZDTzIiKQpvdXQgJT4lCiAgICBmaWx0ZXIodmFyaWFibGUgJWluJSBiaWdfZm91cl92YXJzKSAtPiAKICAgIGJpZ19mb3VyX291dAogICAgCmJpZ19mb3VyX291dCAlPiUgCiAgICBnZ3Bsb3QoYWVzKHllYXIsIHZhbHVlLCBjb2xvciA9IHByZSwgbGluZXR5cGUgPSBzY2VuYXJpbykpICsKICAgIGdlb21fbGluZSgpICsKICAgIGZhY2V0X3dyYXAoInZhcmlhYmxlIiwgc2NhbGVzID0gImZyZWUiKQpgYGAKCiMjIFBlcmNlbnQgRGlmZmVyZW5jZSBpbiB0aGUgQmlnIEZvdXIKCmBgYHtyfQoKYmlnX2ZvdXJfb3V0ICU+JQogICAgZGlzdGluY3QoKSAlPiUKICAgIGRjYXN0KHNjZW5hcmlvICsgeWVhciArIHVuaXRzICsgdmFyaWFibGUgfiBwcmUsIHZhbHVlLnZhciA9ICJ2YWx1ZSIpICU+JQogICAgbXV0YXRlKHBlcmNlbnQgPSAgMTAwICooYG5ld2AgLSBgb2xkYCkgLyBgb2xkYCkgJT4lCiAgICBncm91cF9ieSh2YXJpYWJsZSkgJT4lCiAgICBzdW1tYXJpc2UobWluID0gbWluKHBlcmNlbnQpLAogICAgICAgICAgICAgIG1heCA9IG1heChwZXJjZW50KSwKICAgICAgICAgICAgICBtZWFuID0gbWVhbihwZXJjZW50KSkKYGBgCgojIExvZyBmaWxlcyAKCiMjIEhlY3RvciB1c2luZyB0aGUgb2xkIHZhbHVlcyAKCmBgYApUdWUgRmViIDE1IDE2OjMwOjQ2IDIwMjI6REVCVUc6c3Rhc2hDVmFsdWVzOiBhbm51YWxmbHV4X3N1bT0wLjAwMzI3MjUgUGcgQwpUdWUgRmViIDE1IDE2OjMwOjQ2IDIwMjI6REVCVUc6bG9nX3N0YXRlOiAtLS0tLSBTdGF0ZSBvZiBMTCBib3ggLS0tLS0KVHVlIEZlYiAxNSAxNjozMDo0NiAyMDIyOkRFQlVHOmxvZ19zdGF0ZTogICAgY2FyYm9uID0gNzgzLjY0NiAtPiA3ODMuNjUKVHVlIEZlYiAxNSAxNjozMDo0NiAyMDIyOkRFQlVHOmxvZ19zdGF0ZTogICAgVD0yMC45IGRlZ0MsIHN1cmZhY2Vib3g9MSwgYWN0aXZlX2NoZW1pc3RyeT0xClR1ZSBGZWIgMTUgMTY6MzA6NDYgMjAyMjpERUJVRzpsb2dfc3RhdGU6ICAgIENhcmJvbkFkZGl0aW9ucyA9IDY5LjI5MDQgKDguODQyMDUlKQpUdWUgRmViIDE1IDE2OjMwOjQ2IDIwMjI6REVCVUc6bG9nX3N0YXRlOiAgICBDYXJib25TdWJ0cmFjdGlvbnMgPSA2OC4yOTA0ICg4LjcxNDQ0JSkKVHVlIEZlYiAxNSAxNjozMDo0NiAyMDIyOkRFQlVHOmxvZ19zdGF0ZTogICAgRlBnQyA9IC0wLjk5NjUgKC0wLjEyNzE2MiUpClR1ZSBGZWIgMTUgMTY6MzA6NDYgMjAyMjpERUJVRzpsb2dfc3RhdGU6ICAgIGFvX2ZsdXggPSAwICgwJSkKVHVlIEZlYiAxNSAxNjozMDo0NiAyMDIyOkRFQlVHOmxvZ19zdGF0ZTogICAgb2FfZmx1eCA9IDAuOTk2NSAoMC4xMjcxNjIlKQpUdWUgRmViIDE1IDE2OjMwOjQ2IDIwMjI6REVCVUc6bG9nX3N0YXRlOiAgICBLMCA9IDAuMDMyNDcxNiBtb2wvbC9hdG0gVHIgPSAwLjAzMzc2ODkgZ0MvbS9tb250aC9hdG0KVHVlIEZlYiAxNSAxNjozMDo0NiAyMDIyOkRFQlVHOmxvZ19zdGF0ZTogICAgU3VyZmFjZSBESUMgPSAyMDc2LjI4IHVtb2wva2cKVHVlIEZlYiAxNSAxNjozMDo0NiAyMDIyOkRFQlVHOmxvZ19zdGF0ZTogICAgQ29ubmVjdGlvbiAjMCB0byBITCwgaz0wLjA3NDI1MzIsIHdpbmRvdz0xClR1ZSBGZWIgMTUgMTY6MzA6NDYgMjAyMjpERUJVRzpsb2dfc3RhdGU6ICAgIENvbm5lY3Rpb24gIzEgdG8gaW50ZXJtZWRpYXRlLCBrPTAuMDEyODkxMiwgd2luZG93PTEKVHVlIEZlYiAxNSAxNjozMDo0NiAyMDIyOkRFQlVHOmxvZ19zdGF0ZTogLS0tLS0gU3RhdGUgb2YgSEwgYm94IC0tLS0tClR1ZSBGZWIgMTUgMTY6MzA6NDYgMjAyMjpERUJVRzpsb2dfc3RhdGU6ICAgIGNhcmJvbiA9IDE0MC41MjUgLT4gMTQwLjUyNQpUdWUgRmViIDE1IDE2OjMwOjQ2IDIwMjI6REVCVUc6bG9nX3N0YXRlOiAgICBUPTEuNiBkZWdDLCBzdXJmYWNlYm94PTEsIGFjdGl2ZV9jaGVtaXN0cnk9MQpUdWUgRmViIDE1IDE2OjMwOjQ2IDIwMjI6REVCVUc6bG9nX3N0YXRlOiAgICBDYXJib25BZGRpdGlvbnMgPSA5OC4zNjg1ICg3MC4wMDA4JSkKVHVlIEZlYiAxNSAxNjozMDo0NiAyMDIyOkRFQlVHOmxvZ19zdGF0ZTogICAgQ2FyYm9uU3VidHJhY3Rpb25zID0gOTkuMzY4NSAoNzAuNzEyNCUpClR1ZSBGZWIgMTUgMTY6MzA6NDYgMjAyMjpERUJVRzpsb2dfc3RhdGU6ICAgIEZQZ0MgPSAwLjk5OTc3MyAoMC43MTE0NTYlKQpUdWUgRmViIDE1IDE2OjMwOjQ2IDIwMjI6REVCVUc6bG9nX3N0YXRlOiAgICBhb19mbHV4ID0gMC45OTk3NzMgKDAuNzExNDU2JSkKVHVlIEZlYiAxNSAxNjozMDo0NiAyMDIyOkRFQlVHOmxvZ19zdGF0ZTogICAgb2FfZmx1eCA9IDAgKDAlKQpUdWUgRmViIDE1IDE2OjMwOjQ2IDIwMjI6REVCVUc6bG9nX3N0YXRlOiAgICBLMCA9IDAuMDYwOTM0OSBtb2wvbC9hdG0gVHIgPSAwLjAzNjg5MzcgZ0MvbS9tb250aC9hdG0KVHVlIEZlYiAxNSAxNjozMDo0NiAyMDIyOkRFQlVHOmxvZ19zdGF0ZTogICAgU3VyZmFjZSBESUMgPSAyMTA5LjgyIHVtb2wva2cKVHVlIEZlYiAxNSAxNjozMDo0NiAyMDIyOkRFQlVHOmxvZ19zdGF0ZTogICAgQ29ubmVjdGlvbiAjMCB0byBkZWVwLCBrPTAuNzA3MTI0LCB3aW5kb3c9MQpUdWUgRmViIDE1IDE2OjMwOjQ2IDIwMjI6REVCVUc6bG9nX3N0YXRlOiAtLS0tLSBTdGF0ZSBvZiBpbnRlcm1lZGlhdGUgYm94IC0tLS0tClR1ZSBGZWIgMTUgMTY6MzA6NDYgMjAyMjpERUJVRzpsb2dfc3RhdGU6ICAgIGNhcmJvbiA9IDg0MTguOTQgLT4gODQxOC45NApUdWUgRmViIDE1IDE2OjMwOjQ2IDIwMjI6REVCVUc6bG9nX3N0YXRlOiAgICBUPTE4IGRlZ0MsIHN1cmZhY2Vib3g9MCwgYWN0aXZlX2NoZW1pc3RyeT0wClR1ZSBGZWIgMTUgMTY6MzA6NDYgMjAyMjpERUJVRzpsb2dfc3RhdGU6ICAgIENhcmJvbkFkZGl0aW9ucyA9IDI3My40NzIgKDMuMjQ4MyUpClR1ZSBGZWIgMTUgMTY6MzA6NDYgMjAyMjpERUJVRzpsb2dfc3RhdGU6ICAgIENhcmJvblN1YnRyYWN0aW9ucyA9IDI3My40NzIgKDMuMjQ4MjklKQpUdWUgRmViIDE1IDE2OjMwOjQ2IDIwMjI6REVCVUc6bG9nX3N0YXRlOiAgICBLMCA9IDAgKHVuZGVmaW5lZCkgVHIgPSAwICh1bmRlZmluZWQpClR1ZSBGZWIgMTUgMTY6MzA6NDYgMjAyMjpERUJVRzpsb2dfc3RhdGU6ICAgIENvbm5lY3Rpb24gIzAgdG8gTEwsIGs9MC4wMDgyMzAzLCB3aW5kb3c9MQpUdWUgRmViIDE1IDE2OjMwOjQ2IDIwMjI6REVCVUc6bG9nX3N0YXRlOiAgICBDb25uZWN0aW9uICMxIHRvIEhMLCBrPTAuMDA0NzcyNiwgd2luZG93PTEKVHVlIEZlYiAxNSAxNjozMDo0NiAyMDIyOkRFQlVHOmxvZ19zdGF0ZTogICAgQ29ubmVjdGlvbiAjMiB0byBkZWVwLCBrPTAuMDE5NDgsIHdpbmRvdz0xClR1ZSBGZWIgMTUgMTY6MzA6NDYgMjAyMjpERUJVRzpsb2dfc3RhdGU6IC0tLS0tIFN0YXRlIG9mIGRlZXAgYm94IC0tLS0tClR1ZSBGZWIgMTUgMTY6MzA6NDYgMjAyMjpERUJVRzpsb2dfc3RhdGU6ICAgIGNhcmJvbiA9IDI1OTkxLjggLT4gMjU5OTEuOApUdWUgRmViIDE1IDE2OjMwOjQ2IDIwMjI6REVCVUc6bG9nX3N0YXRlOiAgICBUPTE4IGRlZ0MsIHN1cmZhY2Vib3g9MCwgYWN0aXZlX2NoZW1pc3RyeT0wClR1ZSBGZWIgMTUgMTY6MzA6NDYgMjAyMjpERUJVRzpsb2dfc3RhdGU6ICAgIENhcmJvbkFkZGl0aW9ucyA9IDI2My4zNjkgKDEuMDEzMjglKQpUdWUgRmViIDE1IDE2OjMwOjQ2IDIwMjI6REVCVUc6bG9nX3N0YXRlOiAgICBDYXJib25TdWJ0cmFjdGlvbnMgPSAyNjMuMzcgKDEuMDEzMjglKQpUdWUgRmViIDE1IDE2OjMwOjQ2IDIwMjI6REVCVUc6bG9nX3N0YXRlOiAgICBLMCA9IDAgKHVuZGVmaW5lZCkgVHIgPSAwICh1bmRlZmluZWQpClR1ZSBGZWIgMTUgMTY6MzA6NDYgMjAyMjpERUJVRzpsb2dfc3RhdGU6ICAgIENvbm5lY3Rpb24gIzAgdG8gaW50ZXJtZWRpYXRlLCBrPTAuMDEwMTMyOCwgd2luZG93PTEKCmBgYAoKIyMgSGVjdG9yIHVzaW5nIHRoZSBuZXcgdmFsdWVzIAoKYGBgClR1ZSBGZWIgMTUgMTY6MTY6MjQgMjAyMjpERUJVRzpsb2dfc3RhdGU6IC0tLS0tIFN0YXRlIG9mIExMIGJveCAtLS0tLQpUdWUgRmViIDE1IDE2OjE2OjI0IDIwMjI6REVCVUc6bG9nX3N0YXRlOiAgICBjYXJib24gPSA4NDQuMTg0IC0+IDg0NC4xODYKVHVlIEZlYiAxNSAxNjoxNjoyNCAyMDIyOkRFQlVHOmxvZ19zdGF0ZTogICAgVD0yMC45IGRlZ0MsIHN1cmZhY2Vib3g9MSwgYWN0aXZlX2NoZW1pc3RyeT0xClR1ZSBGZWIgMTUgMTY6MTY6MjQgMjAyMjpERUJVRzpsb2dfc3RhdGU6ICAgIENhcmJvbkFkZGl0aW9ucyA9IDc0LjU2NTkgKDguODMyOSUpClR1ZSBGZWIgMTUgMTY6MTY6MjQgMjAyMjpERUJVRzpsb2dfc3RhdGU6ICAgIENhcmJvblN1YnRyYWN0aW9ucyA9IDczLjU2NTkgKDguNzE0NDQlKQpUdWUgRmViIDE1IDE2OjE2OjI0IDIwMjI6REVCVUc6bG9nX3N0YXRlOiAgICBGUGdDID0gLTAuOTk3Njk0ICgtMC4xMTgxODQlKQpUdWUgRmViIDE1IDE2OjE2OjI0IDIwMjI6REVCVUc6bG9nX3N0YXRlOiAgICBhb19mbHV4ID0gMCAoMCUpClR1ZSBGZWIgMTUgMTY6MTY6MjQgMjAyMjpERUJVRzpsb2dfc3RhdGU6ICAgIG9hX2ZsdXggPSAwLjk5NzY5NCAoMC4xMTgxODQlKQpUdWUgRmViIDE1IDE2OjE2OjI0IDIwMjI6REVCVUc6bG9nX3N0YXRlOiAgICBLMCA9IDAuMDMyNDcxNiBtb2wvbC9hdG0gVHIgPSAwLjAzMzc2ODkgZ0MvbS9tb250aC9hdG0KVHVlIEZlYiAxNSAxNjoxNjoyNCAyMDIyOkRFQlVHOmxvZ19zdGF0ZTogICAgU3VyZmFjZSBESUMgPSAyMjM2LjY3IHVtb2wva2cKVHVlIEZlYiAxNSAxNjoxNjoyNCAyMDIyOkRFQlVHOmxvZ19zdGF0ZTogICAgQ29ubmVjdGlvbiAjMCB0byBITCwgaz0wLjA3NDI1MzIsIHdpbmRvdz0xClR1ZSBGZWIgMTUgMTY6MTY6MjQgMjAyMjpERUJVRzpsb2dfc3RhdGU6ICAgIENvbm5lY3Rpb24gIzEgdG8gaW50ZXJtZWRpYXRlLCBrPTAuMDEyODkxMiwgd2luZG93PTEKVHVlIEZlYiAxNSAxNjoxNjoyNCAyMDIyOkRFQlVHOmxvZ19zdGF0ZTogLS0tLS0gU3RhdGUgb2YgSEwgYm94IC0tLS0tClR1ZSBGZWIgMTUgMTY6MTY6MjQgMjAyMjpERUJVRzpsb2dfc3RhdGU6ICAgIGNhcmJvbiA9IDE1MS4yMDggLT4gMTUxLjIwOApUdWUgRmViIDE1IDE2OjE2OjI0IDIwMjI6REVCVUc6bG9nX3N0YXRlOiAgICBUPTEuNiBkZWdDLCBzdXJmYWNlYm94PTEsIGFjdGl2ZV9jaGVtaXN0cnk9MQpUdWUgRmViIDE1IDE2OjE2OjI0IDIwMjI6REVCVUc6bG9nX3N0YXRlOiAgICBDYXJib25BZGRpdGlvbnMgPSAxMDUuOTIzICg3MC4wNTExJSkKVHVlIEZlYiAxNSAxNjoxNjoyNCAyMDIyOkRFQlVHOmxvZ19zdGF0ZTogICAgQ2FyYm9uU3VidHJhY3Rpb25zID0gMTA2LjkyMyAoNzAuNzEyNCUpClR1ZSBGZWIgMTUgMTY6MTY6MjQgMjAyMjpERUJVRzpsb2dfc3RhdGU6ICAgIEZQZ0MgPSAxLjAwMDAyICgwLjY2MTM1NyUpClR1ZSBGZWIgMTUgMTY6MTY6MjQgMjAyMjpERUJVRzpsb2dfc3RhdGU6ICAgIGFvX2ZsdXggPSAxLjAwMDAyICgwLjY2MTM1NyUpClR1ZSBGZWIgMTUgMTY6MTY6MjQgMjAyMjpERUJVRzpsb2dfc3RhdGU6ICAgIG9hX2ZsdXggPSAwICgwJSkKVHVlIEZlYiAxNSAxNjoxNjoyNCAyMDIyOkRFQlVHOmxvZ19zdGF0ZTogICAgSzAgPSAwLjA2MDkzNDkgbW9sL2wvYXRtIFRyID0gMC4wMzY4OTM3IGdDL20vbW9udGgvYXRtClR1ZSBGZWIgMTUgMTY6MTY6MjQgMjAyMjpERUJVRzpsb2dfc3RhdGU6ICAgIFN1cmZhY2UgRElDID0gMjI3MC4yMiB1bW9sL2tnClR1ZSBGZWIgMTUgMTY6MTY6MjQgMjAyMjpERUJVRzpsb2dfc3RhdGU6ICAgIENvbm5lY3Rpb24gIzAgdG8gZGVlcCwgaz0wLjcwNzEyNCwgd2luZG93PTEKVHVlIEZlYiAxNSAxNjoxNjoyNCAyMDIyOkRFQlVHOmxvZ19zdGF0ZTogLS0tLS0gU3RhdGUgb2YgaW50ZXJtZWRpYXRlIGJveCAtLS0tLQpUdWUgRmViIDE1IDE2OjE2OjI0IDIwMjI6REVCVUc6bG9nX3N0YXRlOiAgICBjYXJib24gPSA5MDU5LjkzIC0+IDkwNTkuOTMKVHVlIEZlYiAxNSAxNjoxNjoyNCAyMDIyOkRFQlVHOmxvZ19zdGF0ZTogICAgVD0xOCBkZWdDLCBzdXJmYWNlYm94PTAsIGFjdGl2ZV9jaGVtaXN0cnk9MApUdWUgRmViIDE1IDE2OjE2OjI0IDIwMjI6REVCVUc6bG9nX3N0YXRlOiAgICBDYXJib25BZGRpdGlvbnMgPSAyOTQuMjkzICgzLjI0ODI5JSkKVHVlIEZlYiAxNSAxNjoxNjoyNCAyMDIyOkRFQlVHOmxvZ19zdGF0ZTogICAgQ2FyYm9uU3VidHJhY3Rpb25zID0gMjk0LjI5MyAoMy4yNDgyOSUpClR1ZSBGZWIgMTUgMTY6MTY6MjQgMjAyMjpERUJVRzpsb2dfc3RhdGU6ICAgIEswID0gMCAodW5kZWZpbmVkKSBUciA9IDAgKHVuZGVmaW5lZCkKVHVlIEZlYiAxNSAxNjoxNjoyNCAyMDIyOkRFQlVHOmxvZ19zdGF0ZTogICAgQ29ubmVjdGlvbiAjMCB0byBMTCwgaz0wLjAwODIzMDMsIHdpbmRvdz0xClR1ZSBGZWIgMTUgMTY6MTY6MjQgMjAyMjpERUJVRzpsb2dfc3RhdGU6ICAgIENvbm5lY3Rpb24gIzEgdG8gSEwsIGs9MC4wMDQ3NzI2LCB3aW5kb3c9MQpUdWUgRmViIDE1IDE2OjE2OjI0IDIwMjI6REVCVUc6bG9nX3N0YXRlOiAgICBDb25uZWN0aW9uICMyIHRvIGRlZXAsIGs9MC4wMTk0OCwgd2luZG93PTEKVHVlIEZlYiAxNSAxNjoxNjoyNCAyMDIyOkRFQlVHOmxvZ19zdGF0ZTogLS0tLS0gU3RhdGUgb2YgZGVlcCBib3ggLS0tLS0KVHVlIEZlYiAxNSAxNjoxNjoyNCAyMDIyOkRFQlVHOmxvZ19zdGF0ZTogICAgY2FyYm9uID0gMjc5NjkuNSAtPiAyNzk2OS41ClR1ZSBGZWIgMTUgMTY6MTY6MjQgMjAyMjpERUJVRzpsb2dfc3RhdGU6ICAgIFQ9MTggZGVnQywgc3VyZmFjZWJveD0wLCBhY3RpdmVfY2hlbWlzdHJ5PTAKVHVlIEZlYiAxNSAxNjoxNjoyNCAyMDIyOkRFQlVHOmxvZ19zdGF0ZTogICAgQ2FyYm9uQWRkaXRpb25zID0gMjgzLjQxICgxLjAxMzI4JSkKVHVlIEZlYiAxNSAxNjoxNjoyNCAyMDIyOkRFQlVHOmxvZ19zdGF0ZTogICAgQ2FyYm9uU3VidHJhY3Rpb25zID0gMjgzLjQxMSAoMS4wMTMyOCUpClR1ZSBGZWIgMTUgMTY6MTY6MjQgMjAyMjpERUJVRzpsb2dfc3RhdGU6ICAgIEswID0gMCAodW5kZWZpbmVkKSBUciA9IDAgKHVuZGVmaW5lZCkKVHVlIEZlYiAxNSAxNjoxNjoyNCAyMDIyOkRFQlVHOmxvZ19zdGF0ZTogICAgQ29ubmVjdGlvbiAjMCB0byBpbnRlcm1lZGlhdGUsIGs9MC4wMTAxMzI4LCB3aW5kb3c9MQpUdWUgRmViIDE1IDE2OjE2OjI0IDIwMjI6REVCVUc6cmVjb3JkX3N0YXRlOiBSZWNvcmRpbmcgY29tcG9uZW50IHN0YXRlIGF0IHQ9IDE3NDYKYGBgCgojIENvbXBhcmlzb24gd2l0aCBvYnMgCgpgYGB7cn0KcmVhZC5jc3YoZmlsZS5wYXRoKEJBU0VfRElSLCAib2JzIiwgIkhPVFNfUEguY3N2IiksIHNraXAgPSAzKSAlPiUgCiAgICByZW5hbWUodmFyaWFibGUgPSB2dGFnKSAlPiUgCiAgICBzZWxlY3QoeWVhciA9IFllYXIsIHZhbHVlLCB2YXJpYWJsZSkgJT4lIAogICAgbXV0YXRlKHNjZW5hcmlvID0gIkhPVFMiKSAtPiAKICAgIG9iczEgCgpyZWFkLmNzdihmaWxlLnBhdGgoQkFTRV9ESVIsICJvYnMiLCAiZW5zZW1ibGVfbWVhbl9tb2RlbC5jc3YiKSkgJT4lIAogICAgc2VsZWN0KHllYXIsIHZhbHVlLCB2YXJpYWJsZSkgJT4lIAogICAgbXV0YXRlKHNjZW5hcmlvID0gIkNNSVAiKSAtPiAKICAgIG9iczIKYGBgCgpgYGB7cn0Kb2JzX291dCA8LSBiaW5kX3Jvd3Mob2JzMSwgb2JzMikgJT4lIAogICAgICAgIG11dGF0ZSh2YXJpYWJsZSA9IHRvbG93ZXIodmFyaWFibGUpKSAKCmBgYAoKCmBgYHtyfQpvdXQgJT4lIAogICAgZmlsdGVyKHZhcmlhYmxlICVpbiUgYygicEhfSEwiLCAicEhfTEwiLCAicEgiKSkgJT4lIAogICAgZmlsdGVyKHByZSA9PSAibmV3IikgJT4lIAogICAgbXV0YXRlKHZhcmlhYmxlID0gdG9sb3dlcih2YXJpYWJsZSkpIC0+IAogICAgaGVjdG9yX3BoCgpvdXQgJT4lIAogICAgZmlsdGVyKHZhcmlhYmxlICVpbiUgYygicEhfSEwiLCAicEhfTEwiLCAicEgiKSkgJT4lIAogICAgZmlsdGVyKHByZSA9PSAib2xkIikgJT4lIAogICAgbXV0YXRlKHZhcmlhYmxlID0gdG9sb3dlcih2YXJpYWJsZSkpIC0+IAogICAgaGVjdG9yX3BoX29sZAoKZ2dwbG90KCkgKyAKICAgIGdlb21fcG9pbnQoZGF0YSA9IGhlY3Rvcl9waCwgYWVzKHllYXIsIHZhbHVlLCBjb2xvciA9ICduZXcgaGVjdG9yJyksIHNpemUgPSAxKSArIAogICAgZ2VvbV9wb2ludChkYXRhID0gaGVjdG9yX3BoX29sZCwgYWVzKHllYXIsIHZhbHVlLCBjb2xvciA9ICdvbGQgaGVjdG9yJyksIHNpemUgPSAxKSArIAogICAgZ2VvbV9wb2ludChkYXRhID0gb2JzX291dCwgYWVzKHllYXIsIHZhbHVlLCBjb2xvciA9IHNjZW5hcmlvKSwgc2l6ZSA9IDEpICsgCiAgICBmYWNldF93cmFwKCJ2YXJpYWJsZSIpICsgCiAgICBjb29yZF9jYXJ0ZXNpYW4oeGxpbSA9IGMoMTg1MCwgMjAwMCksIHlsaW0gPSBjKDcuNDUsIDguMjUpKSArIAogICAgbGFicyh5ID0gInBoIHRvdGFsIHZhbHVlIikKCmBgYAoKV2VsbCB0aGlzIGlzIGxlc3MgdGhhbiBpZGVhbC4gSG1tbW1tbS4uLgoK