Resultados

17.24

df <- structure(list(
  trat = c(rep("Controle", 10), rep("Tratada", 10)),
  parcela = c(rep(seq(1:10), 2)),
  resp = c(
    115.4, 121, 112.3, 78.7, 65.6, 213.5, 157.5, 80.7, 142.8, 100.3,
    98.4, 73.6, 65.9, 42.1, 77.2, 104.0, 82.8, 59.4, 102.6, 53.7
  )
),
.Names = c("trat", "parcela", "resp"),
class = "data.frame",
row.names = c(NA, -20L)
)

df$trat <- as.factor(df$trat)

df %>% kable
trat parcela resp
Controle 1 115.4
Controle 2 121.0
Controle 3 112.3
Controle 4 78.7
Controle 5 65.6
Controle 6 213.5
Controle 7 157.5
Controle 8 80.7
Controle 9 142.8
Controle 10 100.3
Tratada 1 98.4
Tratada 2 73.6
Tratada 3 65.9
Tratada 4 42.1
Tratada 5 77.2
Tratada 6 104.0
Tratada 7 82.8
Tratada 8 59.4
Tratada 9 102.6
Tratada 10 53.7
ggdensity(df$resp, fill = "lightgray")

ggqqplot(df$resp)

df %>% 
  group_by(trat) %>%
  shapiro_test(resp)  %>% kable
trat variable statistic p
Controle resp 0.9269365 0.4184447
Tratada resp 0.9497315 0.6653243
res <- bartlett.test(resp ~ trat, data = df)
res 

    Bartlett test of homogeneity of variances

data:  resp by trat
Bartlett's K-squared = 4.1299, df = 1, p-value = 0.04213
df %>% levene_test(resp ~ trat)  %>% kable
df1 df2 statistic p
1 18 2.029988 0.1713302
tab <- df %>%
  group_by(trat) %>%
  get_summary_stats(resp, type = "mean_sd") %>%
  as.data.frame()

tab  %>% kable
trat variable n mean sd
Controle resp 10 118.78 43.884
Tratada resp 10 75.97 21.268
tab %>%
  summarise(redução.com.tratamento = paste(round((1 - (min(mean) / max(mean))) * 100, 2), "%")) %>% kable()
redução.com.tratamento
36.04 %
stat.test <- df %>% pairwise_sign_test(resp ~ trat)

stat.test  %>% kable
.y. group1 group2 n1 n2 statistic df p p.adj p.adj.signif
resp Controle Tratada 10 10 9 10 0.022 0.022 *
bxp <- ggpaired(df,
  x = "trat", y = "resp", color = "trat",
  ylab = "Peso (g) de Plantas Daninhas", xlab = "", label = T, repel = T, palette = "Dark2"
) +
  theme_pubr(legend = "none")


stat.test <- stat.test %>% add_xy_position(x = "trat")

bxp + stat_pvalue_manual(stat.test) +
  labs(subtitle = get_test_label(stat.test, detailed = TRUE))

17.25

df <- data.frame(
  stringsAsFactors = T,
  var = c(
    "A", "A", "A",
    "A", "A", "A", "A", "A", "A", "A", "A", "A",
    "A", "A", "B", "B", "B", "B", "B", "B", "B", "B",
    "B", "B", "B", "B", "B", "B", "B"
  ),
  prod = c(
    4.2, 3.5, 4.2,
    5.8, 2.8, 4.8, 3.3, 5.1, 3.7, 2.5, 4.7, 5.9,
    4.2, 5.2, 4.3, 2.5, 5.1, 1.8, 3.6, 3.8, 3.5, 4,
    4.5, 4.5, 5.2, 4.1, 2.2, 1.7, 5
  )
)


df %>% kable
var prod
A 4.2
A 3.5
A 4.2
A 5.8
A 2.8
A 4.8
A 3.3
A 5.1
A 3.7
A 2.5
A 4.7
A 5.9
A 4.2
A 5.2
B 4.3
B 2.5
B 5.1
B 1.8
B 3.6
B 3.8
B 3.5
B 4.0
B 4.5
B 4.5
B 5.2
B 4.1
B 2.2
B 1.7
B 5.0
ggdensity(df$prod, fill = "lightgray")

ggqqplot(df$prod) 

df %>% 
  group_by(var) %>%
  shapiro_test(prod)  %>% kable
var variable statistic p
A prod 0.9700240 0.8769761
B prod 0.9115877 0.1432172
res <- bartlett.test(prod ~ var, data = df)
res

    Bartlett test of homogeneity of variances

data:  prod by var
Bartlett's K-squared = 0.16488, df = 1, p-value = 0.6847
df %>% levene_test(prod ~ var)  %>% kable
df1 df2 statistic p
1 27 0.1108677 0.7417302
df %>%
  group_by(var) %>%
  get_summary_stats(prod, type = "median_iqr")  %>% kable
var variable n median iqr
A prod 14 4.2 1.475
B prod 15 4.0 1.500
bxp <- ggboxplot(
  df,
  x = "var", y = "prod", color = "var", palette = "jco",
  ylab = "Produçao (kg)", xlab = "Variedade", add = "jitter", bxp.errorbar = T
)


stat.test <- df %>%
  wilcox_test(prod ~ var) %>%
  add_significance()
stat.test  %>% kable
.y. group1 group2 n1 n2 statistic p p.signif
prod A B 14 15 131 0.265 ns
df %>% wilcox_effsize(prod ~ var)  %>% kable
.y. group1 group2 effsize n1 n2 magnitude
prod A B 0.2109486 14 15 small
stat.test <- stat.test %>% add_xy_position(x = "var")
bxp +
  stat_pvalue_manual(stat.test) +
  labs(subtitle = get_test_label(stat.test, detailed = TRUE)) + theme_pubr(legend = "none")

17.26

df <- data.frame(
  stringsAsFactors = T,
  parcela = c(
    1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 1L,
    2L, 3L, 4L, 5L, 6L, 7L, 8L
  ),
  trat = c(
    "controle", "controle", "controle",
    "controle", "controle", "controle",
    "controle", "controle", "tratada", "tratada",
    "tratada", "tratada", "tratada",
    "tratada", "tratada", "tratada"
  ),
  resp = c(
    103.7, 88.5, 75.4, 97.8, 93.2, 81.4,
    78.1, 105.4, 98.7, 112.4, 117.3, 102.5,
    114.3, 116.4, 107.8, 104.3
  )
)


df  %>% kable
parcela trat resp
1 controle 103.7
2 controle 88.5
3 controle 75.4
4 controle 97.8
5 controle 93.2
6 controle 81.4
7 controle 78.1
8 controle 105.4
1 tratada 98.7
2 tratada 112.4
3 tratada 117.3
4 tratada 102.5
5 tratada 114.3
6 tratada 116.4
7 tratada 107.8
8 tratada 104.3
tab <- df %>%
  group_by(trat) %>%
  get_summary_stats(resp, type = "common") %>%
  as.data.frame()



ggdensity(df$resp, fill = "lightgray")

ggqqplot(df$resp)

df %>% 
  group_by(trat) %>%
  shapiro_test(resp)  %>% kable
trat variable statistic p
controle resp 0.9332002 0.5456486
tratada resp 0.9316795 0.5314870
res <- bartlett.test(resp ~ trat, data = df)
res

    Bartlett test of homogeneity of variances

data:  resp by trat
Bartlett's K-squared = 1.6201, df = 1, p-value = 0.2031
df %>% levene_test(resp ~ trat)  %>% kable
df1 df2 statistic p
1 14 3.004222 0.1050056
tab  %>% kable
trat variable n min max median iqr mean sd se ci
controle resp 8 75.4 105.4 90.85 18.700 90.438 11.498 4.065 9.612
tratada resp 8 98.7 117.3 110.10 10.975 109.213 6.916 2.445 5.782
tab %>%
  summarise(ganho = paste(round((max(mean) - min(mean)) / min(mean) * 100, 2), "%")) %>%
  kable()
ganho
20.76 %
stat.test <- df %>%
  wilcox_test(resp ~ trat, detailed = T) %>%
  add_significance()
stat.test  %>% kable
estimate .y. group1 group2 n1 n2 statistic p conf.low conf.high method alternative p.signif
-19.25 resp controle tratada 8 8 5 0.00295 -29.7 -8.7 Wilcoxon two.sided **
df %>% wilcox_effsize(resp ~ trat) %>% kable
.y. group1 group2 effsize n1 n2 magnitude
resp controle tratada 0.7088918 8 8 large
bxp <- ggboxplot(df,
  x = "trat", y = "resp", color = "trat",
  ylab = "Peso (g) Plântula de Milho", xlab = "", add = "jitter",
  palette = "Dark2", bxp.errorbar = T
) + theme_pubr(legend = "none")


stat.test <- stat.test %>% add_xy_position(x = "trat")

bxp + stat_pvalue_manual(stat.test) +
  labs(
    subtitle = get_test_label(stat.test, detailed = TRUE),
    caption = get_pwc_label(stat.test)
  )

17.27

df <- structure(list(
  trat = c(
    "Rizoma 1kg",
    "Rizoma 1kg",
    "Rizoma 1kg",
    "Rizoma 1kg",
    "Rizoma 1kg",
    "Rizoma 2kg",
    "Rizoma 2kg",
    "Rizoma 2kg",
    "Rizoma 2kg",
    "Rizoma 2kg",
    "Rizoma 3kg",
    "Rizoma 3kg",
    "Rizoma 3kg",
    "Rizoma 3kg",
    "Rizoma 3kg"
  ),
  r = c(
    "1",
    "2",
    "3",
    "4",
    "5",
    "1",
    "2",
    "3",
    "4",
    "5",
    "1",
    "2",
    "3",
    "4",
    "5"
  ),
  resp = c(
    7.2,
    8.4,
    8.2,
    8.4,
    7.8,
    8.4,
    8.8,
    8.6,
    9.7,
    9.2,
    9.0,
    9.3,
    9.0,
    9.9,
    10.1
  )
),
.Names = c("trat", "r", "resp"),
class = "data.frame",
row.names = c(NA, -15L)
)
df$trat <- as.factor(df$trat)
df %>% kable
trat r resp
Rizoma 1kg 1 7.2
Rizoma 1kg 2 8.4
Rizoma 1kg 3 8.2
Rizoma 1kg 4 8.4
Rizoma 1kg 5 7.8
Rizoma 2kg 1 8.4
Rizoma 2kg 2 8.8
Rizoma 2kg 3 8.6
Rizoma 2kg 4 9.7
Rizoma 2kg 5 9.2
Rizoma 3kg 1 9.0
Rizoma 3kg 2 9.3
Rizoma 3kg 3 9.0
Rizoma 3kg 4 9.9
Rizoma 3kg 5 10.1
df %>%
  group_by(trat) %>%
  get_summary_stats(resp, type = "mean")  %>% kable
trat variable n mean
Rizoma 1kg resp 5 8.00
Rizoma 2kg resp 5 8.94
Rizoma 3kg resp 5 9.46
bxp <- ggboxplot(
  df,
  x = "trat",
  y = "resp",
  color = "trat",
  palette = "jco",
  bxp.errorbar = T, add = "jitter"
)


gghistogram(df,
  x = "resp", y = "..density..",
  fill = "steelblue", bins = 4, add_density = TRUE
)

df %>%
  group_by(trat) %>%
  identify_outliers(resp)  %>% kable
trat r resp is.outlier is.extreme
df %>%
  group_by(trat) %>%
  shapiro_test(resp) %>% kable
trat variable statistic p
Rizoma 1kg resp 0.8539288 0.2072593
Rizoma 2kg resp 0.9494145 0.7330048
Rizoma 3kg resp 0.8548712 0.2104124
res <- bartlett.test(resp ~ trat, data = df)
res

    Bartlett test of homogeneity of variances

data:  resp by trat
Bartlett's K-squared = 0.00084382, df = 2, p-value = 0.9996
df %>% levene_test(resp ~ trat)  %>% kable
df1 df2 statistic p
2 12 0.0169014 0.983264
model <- lm(resp ~ trat, data = df)
ggqqplot(residuals(model))

res.kruskal <- df %>%
  kruskal_test(resp ~ trat)

df %>% kruskal_effsize(resp ~ trat)  %>% kable
.y. n effsize method magnitude
resp 15 0.6674474 eta2[H] large
ggdensity(df, x = "resp", rug = TRUE, fill = "lightgray") +
  stat_central_tendency(type = "median", color = "red", linetype = "dashed") +
  labs(subtitle = get_test_label(res.kruskal, detailed = TRUE))

pwc2 <- df %>%
  dunn_test(resp ~ trat, p.adjust.method = "bonferroni") %>%
  add_significance()

pwc2 <- pwc2 %>%
  add_xy_position(x = "trat")


bxp + stat_pvalue_manual(pwc2, hide.ns = T) +
  labs(
    subtitle = get_test_label(res.kruskal, detailed = T),
    caption = get_pwc_label(pwc2)
  ) +
  theme_pubr(legend = "none") +
  ylab("Número de pencas por cacho ") +
  xlab("") +
  # stat_compare_means()+
  theme(
    legend.title = element_blank(),
    text = element_text(),
    axis.text.y = element_text(
      angle = 0,
      hjust = 1,
      colour = "black"
    ),
    axis.text.x = element_text(
      angle = 0,
      hjust = 0.5,
      colour = "black"
    )
  )

17.28

df <- data.frame(
  stringsAsFactors = T,
  blo = c(
    "b1", "b2", "b3", "b4", "b5",
    "b6", "b1", "b2", "b3", "b4", "b5", "b6", "b1", "b2", "b3",
    "b4", "b5", "b6", "b1", "b2", "b3", "b4", "b5", "b6"
  ),
  var = c(
    "Co 419", "Co 419", "Co 419",
    "Co 419", "Co 419", "Co 419", "Co 421", "Co 421", "Co 421",
    "Co 421", "Co 421", "Co 421", "CB-4170", "CB-4170",
    "CB-4170", "CB-4170", "CB-4170", "CB-4170", "CB-4176",
    "CB-4176", "CB-4176", "CB-4176", "CB-4176", "CB-4176"
  ),
  resp = c(
    110.6, 119.5, 120.1, 105.3,
    130.8, 138.1, 116.7, 128.4, 131.5, 114.8, 146.8, 155.5,
    140.3, 150, 150.9, 144.7, 153.9, 156.9, 143.4, 153.8, 151.5,
    144.1, 154.6, 159.3
  )
)

df %>% kable
blo var resp
b1 Co 419 110.6
b2 Co 419 119.5
b3 Co 419 120.1
b4 Co 419 105.3
b5 Co 419 130.8
b6 Co 419 138.1
b1 Co 421 116.7
b2 Co 421 128.4
b3 Co 421 131.5
b4 Co 421 114.8
b5 Co 421 146.8
b6 Co 421 155.5
b1 CB-4170 140.3
b2 CB-4170 150.0
b3 CB-4170 150.9
b4 CB-4170 144.7
b5 CB-4170 153.9
b6 CB-4170 156.9
b1 CB-4176 143.4
b2 CB-4176 153.8
b3 CB-4176 151.5
b4 CB-4176 144.1
b5 CB-4176 154.6
b6 CB-4176 159.3
df %>%
  group_by(var) %>%
  get_summary_stats(resp, type = "full") %>% kable
var variable n min max median q1 q3 iqr mad mean sd se ci
CB-4170 resp 6 140.3 156.9 150.45 146.025 153.150 7.125 6.820 149.450 6.066 2.477 6.366
CB-4176 resp 6 143.4 159.3 152.65 145.950 154.400 8.450 6.375 151.117 6.249 2.551 6.558
Co 419 resp 6 105.3 138.1 119.80 112.825 128.125 15.300 14.974 120.733 12.213 4.986 12.816
Co 421 resp 6 114.8 155.5 129.95 119.625 142.975 23.350 21.053 132.283 16.211 6.618 17.012
res.fried <- df %>% friedman_test(resp ~ var | blo)
res.fried %>% kable
.y. n statistic df p method
resp 6 17 3 0.0007067 Friedman test
df %>% friedman_effsize(resp ~ var | blo) %>% kable
.y. n effsize method magnitude
resp 6 0.9444444 Kendall W large
pwc <- df %>%
  wilcox_test(resp ~ var, p.adjust.method = "bonferroni") %>%
  add_significance()
pwc %>% kable
.y. group1 group2 n1 n2 statistic p p.adj p.adj.signif
resp CB-4170 CB-4176 6 6 15 0.699 1.000 ns
resp CB-4170 Co 419 6 6 36 0.002 0.013 *
resp CB-4170 Co 421 6 6 29 0.093 0.559 ns
resp CB-4176 Co 419 6 6 36 0.002 0.013 *
resp CB-4176 Co 421 6 6 29 0.093 0.559 ns
resp Co 419 Co 421 6 6 11 0.310 1.000 ns
pwc <- pwc %>% add_xy_position(x = "blo")
ggboxplot(df, x = "var", y = "resp", add = "jitter", color = "var", palette = "jco", xlab = "", ylab = "Produção (t/ha)") + theme_pubr(legend = "none") +
  stat_pvalue_manual(pwc, hide.ns = T) +
  labs(
    subtitle = get_test_label(res.fried, detailed = TRUE),
    caption = get_pwc_label(pwc))

17.29

df <- data.frame(
  stringsAsFactors = F,
  x = c(
    0.602, 0.636, 0.604, 0.548, 0.59,
    0.592, 0.625, 0.641, 0.606, 0.502, 0.588,
    0.594, 0.626),
  y = c(
    0.619, 0.62, 0.62, 0.538, 0.616,
    0.601, 0.664, 0.652, 0.579, 0.501, 0.59,
    0.622, 0.606))

ggdensity(df$x, fill = "lightgray")

ggqqplot(df$x)

ggdensity(df$y, fill = "lightgray")

ggqqplot(df$y)

df %>%
  cor_test(
    method = "spearman",
    conf.level = 0.95
  ) %>%
  add_significance() %>% kable
var1 var2 cor statistic p method p.signif
x y 0.68 115.6586 0.0102 Spearman *
ggscatter(df,
  x = "x", y = "y",
  add = "reg.line", conf.int = TRUE,
  cor.coef = TRUE, cor.method = "spearman",
  xlab = "DAP (Sonda Pressler)", ylab = "DAP (Seccões transversais do tronco)")

Referência

Essas análises fazem parte dos Exercícios do Livro (Paulo Vanderlei Ferreira 2018), utilizando os pacotes dplyr (Wickham et al. 2020), ggpubr (Kassambara 2020a), rstatix (Kassambara 2020b) e knitr, (Xie 2014)

Kassambara, Alboukadel. 2020a. Ggpubr: ’Ggplot2’ Based Publication Ready Plots. https://CRAN.R-project.org/package=ggpubr.

———. 2020b. Rstatix: Pipe-Friendly Framework for Basic Statistical Tests. https://CRAN.R-project.org/package=rstatix.

Paulo Vanderlei Ferreira. 2018. Estatística Experimental Aplicada às Ciências Agrárias. Edited by Editora UFV. 1st ed. Viçosa, MG.

Wickham, Hadley, Romain François, Lionel Henry, and Kirill Müller. 2020. Dplyr: A Grammar of Data Manipulation. https://CRAN.R-project.org/package=dplyr.

Xie, Yihui. 2014. “Knitr: A Comprehensive Tool for Reproducible Research in R.” In Implementing Reproducible Computational Research, edited by Victoria Stodden, Friedrich Leisch, and Roger D. Peng. Chapman; Hall/CRC. http://www.crcpress.com/product/isbn/9781466561595.

IycgLS0tDQojJyB0aXRsZTogIlRlc3RlcyBOw6NvIFBhcmFtw6l0cmljb3MiDQojJyBhdXRob3I6IENpZCBFZHNvbiBQw7N2b2FzDQojJyBiaWJsaW9ncmFwaHk6IFJwYWNrYWdlcy5iaWINCiMnIG91dHB1dDoNCiMnICAgaHRtbF9ub3RlYm9vazogDQojJyAgICAgY29kZV9mb2xkaW5nOiBzaG93DQojJyAgICAgdG9jOiB0cnVlDQojJyAgICAgdG9jX2Zsb2F0OiB0cnVlDQojJyAgICAgY29sbGFwc2VkOiB0cnVlDQojJyAtLS0NCiMrIHdhcm5pbmc9RkFMU0UsIGVjaG89VCwgbWVzc2FnZT1GQUxTRQ0KIysgc2V0dXAsIGluY2x1ZGU9RiwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRQ0KDQpwa2cgPC0gYygiZHBseXIiLA0KICAgICAgICAgImtuaXRyIiwNCiAgICAgICAgICJnZ3B1YnIiLA0KICAgICAgICAgInJzdGF0aXgiKQ0KDQpzYXBwbHkocGtnLA0KICAgICAgIGxpYnJhcnksDQogICAgICAgY2hhcmFjdGVyLm9ubHkgPSBUUlVFLA0KICAgICAgIGxvZ2ljYWwucmV0dXJuID0gVFJVRSkNCg0KDQoNCg0KIycgIyMgKipSZXN1bHRhZG9zICoqDQojJw0KDQojJyANCiMnICMjICoqMTcuMjQqKg0KIycgDQojKyBlY2hvPVQsIGZpZy5oZWlnaHQ9NSwgZmlnLndpZHRoPTgsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UNCg0KZGYgPC0gc3RydWN0dXJlKGxpc3QoDQogIHRyYXQgPSBjKHJlcCgiQ29udHJvbGUiLCAxMCksIHJlcCgiVHJhdGFkYSIsIDEwKSksDQogIHBhcmNlbGEgPSBjKHJlcChzZXEoMToxMCksIDIpKSwNCiAgcmVzcCA9IGMoDQogICAgMTE1LjQsIDEyMSwgMTEyLjMsIDc4LjcsIDY1LjYsIDIxMy41LCAxNTcuNSwgODAuNywgMTQyLjgsIDEwMC4zLA0KICAgIDk4LjQsIDczLjYsIDY1LjksIDQyLjEsIDc3LjIsIDEwNC4wLCA4Mi44LCA1OS40LCAxMDIuNiwgNTMuNw0KICApDQopLA0KLk5hbWVzID0gYygidHJhdCIsICJwYXJjZWxhIiwgInJlc3AiKSwNCmNsYXNzID0gImRhdGEuZnJhbWUiLA0Kcm93Lm5hbWVzID0gYyhOQSwgLTIwTCkNCikNCg0KZGYkdHJhdCA8LSBhcy5mYWN0b3IoZGYkdHJhdCkNCg0KZGYgJT4lIGthYmxlDQoNCg0KZ2dkZW5zaXR5KGRmJHJlc3AsIGZpbGwgPSAibGlnaHRncmF5IikNCmdncXFwbG90KGRmJHJlc3ApDQoNCmRmICU+JSANCiAgZ3JvdXBfYnkodHJhdCkgJT4lDQogIHNoYXBpcm9fdGVzdChyZXNwKSAgJT4lIGthYmxlDQoNCg0KcmVzIDwtIGJhcnRsZXR0LnRlc3QocmVzcCB+IHRyYXQsIGRhdGEgPSBkZikNCnJlcyANCg0KDQpkZiAlPiUgbGV2ZW5lX3Rlc3QocmVzcCB+IHRyYXQpICAlPiUga2FibGUNCg0KDQp0YWIgPC0gZGYgJT4lDQogIGdyb3VwX2J5KHRyYXQpICU+JQ0KICBnZXRfc3VtbWFyeV9zdGF0cyhyZXNwLCB0eXBlID0gIm1lYW5fc2QiKSAlPiUNCiAgYXMuZGF0YS5mcmFtZSgpDQoNCnRhYiAgJT4lIGthYmxlDQoNCnRhYiAlPiUNCiAgc3VtbWFyaXNlKHJlZHXDp8Ojby5jb20udHJhdGFtZW50byA9IHBhc3RlKHJvdW5kKCgxIC0gKG1pbihtZWFuKSAvIG1heChtZWFuKSkpICogMTAwLCAyKSwgIiUiKSkgJT4lIGthYmxlKCkNCg0Kc3RhdC50ZXN0IDwtIGRmICU+JSBwYWlyd2lzZV9zaWduX3Rlc3QocmVzcCB+IHRyYXQpDQoNCnN0YXQudGVzdCAgJT4lIGthYmxlDQoNCg0KYnhwIDwtIGdncGFpcmVkKGRmLA0KICB4ID0gInRyYXQiLCB5ID0gInJlc3AiLCBjb2xvciA9ICJ0cmF0IiwNCiAgeWxhYiA9ICJQZXNvIChnKSBkZSBQbGFudGFzIERhbmluaGFzIiwgeGxhYiA9ICIiLCBsYWJlbCA9IFQsIHJlcGVsID0gVCwgcGFsZXR0ZSA9ICJEYXJrMiINCikgKw0KICB0aGVtZV9wdWJyKGxlZ2VuZCA9ICJub25lIikNCg0KDQpzdGF0LnRlc3QgPC0gc3RhdC50ZXN0ICU+JSBhZGRfeHlfcG9zaXRpb24oeCA9ICJ0cmF0IikNCg0KYnhwICsgc3RhdF9wdmFsdWVfbWFudWFsKHN0YXQudGVzdCkgKw0KICBsYWJzKHN1YnRpdGxlID0gZ2V0X3Rlc3RfbGFiZWwoc3RhdC50ZXN0LCBkZXRhaWxlZCA9IFRSVUUpKQ0KDQojJyANCiMnICMjICoqMTcuMjUqKg0KIycgDQojKyBlY2hvPVQsIGZpZy5oZWlnaHQ9NSwgZmlnLndpZHRoPTgsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UNCg0KZGYgPC0gZGF0YS5mcmFtZSgNCiAgc3RyaW5nc0FzRmFjdG9ycyA9IFQsDQogIHZhciA9IGMoDQogICAgIkEiLCAiQSIsICJBIiwNCiAgICAiQSIsICJBIiwgIkEiLCAiQSIsICJBIiwgIkEiLCAiQSIsICJBIiwgIkEiLA0KICAgICJBIiwgIkEiLCAiQiIsICJCIiwgIkIiLCAiQiIsICJCIiwgIkIiLCAiQiIsICJCIiwNCiAgICAiQiIsICJCIiwgIkIiLCAiQiIsICJCIiwgIkIiLCAiQiINCiAgKSwNCiAgcHJvZCA9IGMoDQogICAgNC4yLCAzLjUsIDQuMiwNCiAgICA1LjgsIDIuOCwgNC44LCAzLjMsIDUuMSwgMy43LCAyLjUsIDQuNywgNS45LA0KICAgIDQuMiwgNS4yLCA0LjMsIDIuNSwgNS4xLCAxLjgsIDMuNiwgMy44LCAzLjUsIDQsDQogICAgNC41LCA0LjUsIDUuMiwgNC4xLCAyLjIsIDEuNywgNQ0KICApDQopDQoNCg0KZGYgJT4lIGthYmxlDQoNCg0KZ2dkZW5zaXR5KGRmJHByb2QsIGZpbGwgPSAibGlnaHRncmF5IikNCmdncXFwbG90KGRmJHByb2QpIA0KDQoNCmRmICU+JSANCiAgZ3JvdXBfYnkodmFyKSAlPiUNCiAgc2hhcGlyb190ZXN0KHByb2QpICAlPiUga2FibGUNCg0KDQpyZXMgPC0gYmFydGxldHQudGVzdChwcm9kIH4gdmFyLCBkYXRhID0gZGYpDQpyZXMNCg0KDQpkZiAlPiUgbGV2ZW5lX3Rlc3QocHJvZCB+IHZhcikgICU+JSBrYWJsZQ0KDQpkZiAlPiUNCiAgZ3JvdXBfYnkodmFyKSAlPiUNCiAgZ2V0X3N1bW1hcnlfc3RhdHMocHJvZCwgdHlwZSA9ICJtZWRpYW5faXFyIikgICU+JSBrYWJsZQ0KDQoNCg0KYnhwIDwtIGdnYm94cGxvdCgNCiAgZGYsDQogIHggPSAidmFyIiwgeSA9ICJwcm9kIiwgY29sb3IgPSAidmFyIiwgcGFsZXR0ZSA9ICJqY28iLA0KICB5bGFiID0gIlByb2R1w6dhbyAoa2cpIiwgeGxhYiA9ICJWYXJpZWRhZGUiLCBhZGQgPSAiaml0dGVyIiwgYnhwLmVycm9yYmFyID0gVA0KKQ0KDQoNCnN0YXQudGVzdCA8LSBkZiAlPiUNCiAgd2lsY294X3Rlc3QocHJvZCB+IHZhcikgJT4lDQogIGFkZF9zaWduaWZpY2FuY2UoKQ0Kc3RhdC50ZXN0ICAlPiUga2FibGUNCg0KDQpkZiAlPiUgd2lsY294X2VmZnNpemUocHJvZCB+IHZhcikgICU+JSBrYWJsZQ0KDQpzdGF0LnRlc3QgPC0gc3RhdC50ZXN0ICU+JSBhZGRfeHlfcG9zaXRpb24oeCA9ICJ2YXIiKQ0KYnhwICsNCiAgc3RhdF9wdmFsdWVfbWFudWFsKHN0YXQudGVzdCkgKw0KICBsYWJzKHN1YnRpdGxlID0gZ2V0X3Rlc3RfbGFiZWwoc3RhdC50ZXN0LCBkZXRhaWxlZCA9IFRSVUUpKSArIHRoZW1lX3B1YnIobGVnZW5kID0gIm5vbmUiKQ0KDQoNCiMnIA0KIycgIyMgKioxNy4yNioqDQojJyANCiMrIGVjaG89VCwgZmlnLmhlaWdodD01LCBmaWcud2lkdGg9OCwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRQ0KDQpkZiA8LSBkYXRhLmZyYW1lKA0KICBzdHJpbmdzQXNGYWN0b3JzID0gVCwNCiAgcGFyY2VsYSA9IGMoDQogICAgMUwsIDJMLCAzTCwgNEwsIDVMLCA2TCwgN0wsIDhMLCAxTCwNCiAgICAyTCwgM0wsIDRMLCA1TCwgNkwsIDdMLCA4TA0KICApLA0KICB0cmF0ID0gYygNCiAgICAiY29udHJvbGUiLCAiY29udHJvbGUiLCAiY29udHJvbGUiLA0KICAgICJjb250cm9sZSIsICJjb250cm9sZSIsICJjb250cm9sZSIsDQogICAgImNvbnRyb2xlIiwgImNvbnRyb2xlIiwgInRyYXRhZGEiLCAidHJhdGFkYSIsDQogICAgInRyYXRhZGEiLCAidHJhdGFkYSIsICJ0cmF0YWRhIiwNCiAgICAidHJhdGFkYSIsICJ0cmF0YWRhIiwgInRyYXRhZGEiDQogICksDQogIHJlc3AgPSBjKA0KICAgIDEwMy43LCA4OC41LCA3NS40LCA5Ny44LCA5My4yLCA4MS40LA0KICAgIDc4LjEsIDEwNS40LCA5OC43LCAxMTIuNCwgMTE3LjMsIDEwMi41LA0KICAgIDExNC4zLCAxMTYuNCwgMTA3LjgsIDEwNC4zDQogICkNCikNCg0KDQpkZiAgJT4lIGthYmxlDQoNCg0KdGFiIDwtIGRmICU+JQ0KICBncm91cF9ieSh0cmF0KSAlPiUNCiAgZ2V0X3N1bW1hcnlfc3RhdHMocmVzcCwgdHlwZSA9ICJjb21tb24iKSAlPiUNCiAgYXMuZGF0YS5mcmFtZSgpDQoNCg0KDQpnZ2RlbnNpdHkoZGYkcmVzcCwgZmlsbCA9ICJsaWdodGdyYXkiKQ0KZ2dxcXBsb3QoZGYkcmVzcCkNCg0KZGYgJT4lIA0KICBncm91cF9ieSh0cmF0KSAlPiUNCiAgc2hhcGlyb190ZXN0KHJlc3ApICAlPiUga2FibGUNCg0KDQpyZXMgPC0gYmFydGxldHQudGVzdChyZXNwIH4gdHJhdCwgZGF0YSA9IGRmKQ0KcmVzDQoNCg0KZGYgJT4lIGxldmVuZV90ZXN0KHJlc3AgfiB0cmF0KSAgJT4lIGthYmxlDQoNCg0KdGFiICAlPiUga2FibGUNCg0KdGFiICU+JQ0KICBzdW1tYXJpc2UoZ2FuaG8gPSBwYXN0ZShyb3VuZCgobWF4KG1lYW4pIC0gbWluKG1lYW4pKSAvIG1pbihtZWFuKSAqIDEwMCwgMiksICIlIikpICU+JQ0KICBrYWJsZSgpDQoNCnN0YXQudGVzdCA8LSBkZiAlPiUNCiAgd2lsY294X3Rlc3QocmVzcCB+IHRyYXQsIGRldGFpbGVkID0gVCkgJT4lDQogIGFkZF9zaWduaWZpY2FuY2UoKQ0Kc3RhdC50ZXN0ICAlPiUga2FibGUNCg0KZGYgJT4lIHdpbGNveF9lZmZzaXplKHJlc3AgfiB0cmF0KSAlPiUga2FibGUNCg0KDQoNCmJ4cCA8LSBnZ2JveHBsb3QoZGYsDQogIHggPSAidHJhdCIsIHkgPSAicmVzcCIsIGNvbG9yID0gInRyYXQiLA0KICB5bGFiID0gIlBlc28gKGcpIFBsw6JudHVsYSBkZSBNaWxobyIsIHhsYWIgPSAiIiwgYWRkID0gImppdHRlciIsDQogIHBhbGV0dGUgPSAiRGFyazIiLCBieHAuZXJyb3JiYXIgPSBUDQopICsgdGhlbWVfcHVicihsZWdlbmQgPSAibm9uZSIpDQoNCg0Kc3RhdC50ZXN0IDwtIHN0YXQudGVzdCAlPiUgYWRkX3h5X3Bvc2l0aW9uKHggPSAidHJhdCIpDQoNCmJ4cCArIHN0YXRfcHZhbHVlX21hbnVhbChzdGF0LnRlc3QpICsNCiAgbGFicygNCiAgICBzdWJ0aXRsZSA9IGdldF90ZXN0X2xhYmVsKHN0YXQudGVzdCwgZGV0YWlsZWQgPSBUUlVFKSwNCiAgICBjYXB0aW9uID0gZ2V0X3B3Y19sYWJlbChzdGF0LnRlc3QpDQogICkNCg0KDQojJyANCiMnICMjICoqMTcuMjcqKg0KIycgDQojKyBlY2hvPVQsIGZpZy5oZWlnaHQ9NSwgZmlnLndpZHRoPTgsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UNCg0KZGYgPC0gc3RydWN0dXJlKGxpc3QoDQogIHRyYXQgPSBjKA0KICAgICJSaXpvbWEgMWtnIiwNCiAgICAiUml6b21hIDFrZyIsDQogICAgIlJpem9tYSAxa2ciLA0KICAgICJSaXpvbWEgMWtnIiwNCiAgICAiUml6b21hIDFrZyIsDQogICAgIlJpem9tYSAya2ciLA0KICAgICJSaXpvbWEgMmtnIiwNCiAgICAiUml6b21hIDJrZyIsDQogICAgIlJpem9tYSAya2ciLA0KICAgICJSaXpvbWEgMmtnIiwNCiAgICAiUml6b21hIDNrZyIsDQogICAgIlJpem9tYSAza2ciLA0KICAgICJSaXpvbWEgM2tnIiwNCiAgICAiUml6b21hIDNrZyIsDQogICAgIlJpem9tYSAza2ciDQogICksDQogIHIgPSBjKA0KICAgICIxIiwNCiAgICAiMiIsDQogICAgIjMiLA0KICAgICI0IiwNCiAgICAiNSIsDQogICAgIjEiLA0KICAgICIyIiwNCiAgICAiMyIsDQogICAgIjQiLA0KICAgICI1IiwNCiAgICAiMSIsDQogICAgIjIiLA0KICAgICIzIiwNCiAgICAiNCIsDQogICAgIjUiDQogICksDQogIHJlc3AgPSBjKA0KICAgIDcuMiwNCiAgICA4LjQsDQogICAgOC4yLA0KICAgIDguNCwNCiAgICA3LjgsDQogICAgOC40LA0KICAgIDguOCwNCiAgICA4LjYsDQogICAgOS43LA0KICAgIDkuMiwNCiAgICA5LjAsDQogICAgOS4zLA0KICAgIDkuMCwNCiAgICA5LjksDQogICAgMTAuMQ0KICApDQopLA0KLk5hbWVzID0gYygidHJhdCIsICJyIiwgInJlc3AiKSwNCmNsYXNzID0gImRhdGEuZnJhbWUiLA0Kcm93Lm5hbWVzID0gYyhOQSwgLTE1TCkNCikNCmRmJHRyYXQgPC0gYXMuZmFjdG9yKGRmJHRyYXQpDQpkZiAlPiUga2FibGUNCg0KZGYgJT4lDQogIGdyb3VwX2J5KHRyYXQpICU+JQ0KICBnZXRfc3VtbWFyeV9zdGF0cyhyZXNwLCB0eXBlID0gIm1lYW4iKSAgJT4lIGthYmxlDQoNCmJ4cCA8LSBnZ2JveHBsb3QoDQogIGRmLA0KICB4ID0gInRyYXQiLA0KICB5ID0gInJlc3AiLA0KICBjb2xvciA9ICJ0cmF0IiwNCiAgcGFsZXR0ZSA9ICJqY28iLA0KICBieHAuZXJyb3JiYXIgPSBULCBhZGQgPSAiaml0dGVyIg0KKQ0KDQoNCmdnaGlzdG9ncmFtKGRmLA0KICB4ID0gInJlc3AiLCB5ID0gIi4uZGVuc2l0eS4uIiwNCiAgZmlsbCA9ICJzdGVlbGJsdWUiLCBiaW5zID0gNCwgYWRkX2RlbnNpdHkgPSBUUlVFDQopDQoNCmRmICU+JQ0KICBncm91cF9ieSh0cmF0KSAlPiUNCiAgaWRlbnRpZnlfb3V0bGllcnMocmVzcCkgICU+JSBrYWJsZQ0KDQpkZiAlPiUNCiAgZ3JvdXBfYnkodHJhdCkgJT4lDQogIHNoYXBpcm9fdGVzdChyZXNwKSAlPiUga2FibGUNCg0KDQoNCg0KcmVzIDwtIGJhcnRsZXR0LnRlc3QocmVzcCB+IHRyYXQsIGRhdGEgPSBkZikNCnJlcw0KDQoNCmRmICU+JSBsZXZlbmVfdGVzdChyZXNwIH4gdHJhdCkgICU+JSBrYWJsZQ0KDQptb2RlbCA8LSBsbShyZXNwIH4gdHJhdCwgZGF0YSA9IGRmKQ0KZ2dxcXBsb3QocmVzaWR1YWxzKG1vZGVsKSkNCg0KcmVzLmtydXNrYWwgPC0gZGYgJT4lDQogIGtydXNrYWxfdGVzdChyZXNwIH4gdHJhdCkNCg0KZGYgJT4lIGtydXNrYWxfZWZmc2l6ZShyZXNwIH4gdHJhdCkgICU+JSBrYWJsZQ0KDQpnZ2RlbnNpdHkoZGYsIHggPSAicmVzcCIsIHJ1ZyA9IFRSVUUsIGZpbGwgPSAibGlnaHRncmF5IikgKw0KICBzdGF0X2NlbnRyYWxfdGVuZGVuY3kodHlwZSA9ICJtZWRpYW4iLCBjb2xvciA9ICJyZWQiLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArDQogIGxhYnMoc3VidGl0bGUgPSBnZXRfdGVzdF9sYWJlbChyZXMua3J1c2thbCwgZGV0YWlsZWQgPSBUUlVFKSkNCg0KcHdjMiA8LSBkZiAlPiUNCiAgZHVubl90ZXN0KHJlc3AgfiB0cmF0LCBwLmFkanVzdC5tZXRob2QgPSAiYm9uZmVycm9uaSIpICU+JQ0KICBhZGRfc2lnbmlmaWNhbmNlKCkNCg0KcHdjMiA8LSBwd2MyICU+JQ0KICBhZGRfeHlfcG9zaXRpb24oeCA9ICJ0cmF0IikNCg0KDQpieHAgKyBzdGF0X3B2YWx1ZV9tYW51YWwocHdjMiwgaGlkZS5ucyA9IFQpICsNCiAgbGFicygNCiAgICBzdWJ0aXRsZSA9IGdldF90ZXN0X2xhYmVsKHJlcy5rcnVza2FsLCBkZXRhaWxlZCA9IFQpLA0KICAgIGNhcHRpb24gPSBnZXRfcHdjX2xhYmVsKHB3YzIpDQogICkgKw0KICB0aGVtZV9wdWJyKGxlZ2VuZCA9ICJub25lIikgKw0KICB5bGFiKCJOw7ptZXJvIGRlIHBlbmNhcyBwb3IgY2FjaG8gIikgKw0KICB4bGFiKCIiKSArDQogICMgc3RhdF9jb21wYXJlX21lYW5zKCkrDQogIHRoZW1lKA0KICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICB0ZXh0ID0gZWxlbWVudF90ZXh0KCksDQogICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoDQogICAgICBhbmdsZSA9IDAsDQogICAgICBoanVzdCA9IDEsDQogICAgICBjb2xvdXIgPSAiYmxhY2siDQogICAgKSwNCiAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dCgNCiAgICAgIGFuZ2xlID0gMCwNCiAgICAgIGhqdXN0ID0gMC41LA0KICAgICAgY29sb3VyID0gImJsYWNrIg0KICAgICkNCiAgKQ0KDQojJyANCiMnICMjICoqMTcuMjgqKg0KIycgDQojKyBlY2hvPVQsIGZpZy5oZWlnaHQ9NSwgZmlnLndpZHRoPTgsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UNCg0KZGYgPC0gZGF0YS5mcmFtZSgNCiAgc3RyaW5nc0FzRmFjdG9ycyA9IFQsDQogIGJsbyA9IGMoDQogICAgImIxIiwgImIyIiwgImIzIiwgImI0IiwgImI1IiwNCiAgICAiYjYiLCAiYjEiLCAiYjIiLCAiYjMiLCAiYjQiLCAiYjUiLCAiYjYiLCAiYjEiLCAiYjIiLCAiYjMiLA0KICAgICJiNCIsICJiNSIsICJiNiIsICJiMSIsICJiMiIsICJiMyIsICJiNCIsICJiNSIsICJiNiINCiAgKSwNCiAgdmFyID0gYygNCiAgICAiQ28gNDE5IiwgIkNvIDQxOSIsICJDbyA0MTkiLA0KICAgICJDbyA0MTkiLCAiQ28gNDE5IiwgIkNvIDQxOSIsICJDbyA0MjEiLCAiQ28gNDIxIiwgIkNvIDQyMSIsDQogICAgIkNvIDQyMSIsICJDbyA0MjEiLCAiQ28gNDIxIiwgIkNCLTQxNzAiLCAiQ0ItNDE3MCIsDQogICAgIkNCLTQxNzAiLCAiQ0ItNDE3MCIsICJDQi00MTcwIiwgIkNCLTQxNzAiLCAiQ0ItNDE3NiIsDQogICAgIkNCLTQxNzYiLCAiQ0ItNDE3NiIsICJDQi00MTc2IiwgIkNCLTQxNzYiLCAiQ0ItNDE3NiINCiAgKSwNCiAgcmVzcCA9IGMoDQogICAgMTEwLjYsIDExOS41LCAxMjAuMSwgMTA1LjMsDQogICAgMTMwLjgsIDEzOC4xLCAxMTYuNywgMTI4LjQsIDEzMS41LCAxMTQuOCwgMTQ2LjgsIDE1NS41LA0KICAgIDE0MC4zLCAxNTAsIDE1MC45LCAxNDQuNywgMTUzLjksIDE1Ni45LCAxNDMuNCwgMTUzLjgsIDE1MS41LA0KICAgIDE0NC4xLCAxNTQuNiwgMTU5LjMNCiAgKQ0KKQ0KDQpkZiAlPiUga2FibGUNCg0KZGYgJT4lDQogIGdyb3VwX2J5KHZhcikgJT4lDQogIGdldF9zdW1tYXJ5X3N0YXRzKHJlc3AsIHR5cGUgPSAiZnVsbCIpICU+JSBrYWJsZQ0KDQpyZXMuZnJpZWQgPC0gZGYgJT4lIGZyaWVkbWFuX3Rlc3QocmVzcCB+IHZhciB8IGJsbykNCnJlcy5mcmllZCAlPiUga2FibGUNCg0KZGYgJT4lIGZyaWVkbWFuX2VmZnNpemUocmVzcCB+IHZhciB8IGJsbykgJT4lIGthYmxlDQoNCnB3YyA8LSBkZiAlPiUNCiAgd2lsY294X3Rlc3QocmVzcCB+IHZhciwgcC5hZGp1c3QubWV0aG9kID0gImJvbmZlcnJvbmkiKSAlPiUNCiAgYWRkX3NpZ25pZmljYW5jZSgpDQpwd2MgJT4lIGthYmxlDQoNCg0KcHdjIDwtIHB3YyAlPiUgYWRkX3h5X3Bvc2l0aW9uKHggPSAiYmxvIikNCmdnYm94cGxvdChkZiwgeCA9ICJ2YXIiLCB5ID0gInJlc3AiLCBhZGQgPSAiaml0dGVyIiwgY29sb3IgPSAidmFyIiwgcGFsZXR0ZSA9ICJqY28iLCB4bGFiID0gIiIsIHlsYWIgPSAiUHJvZHXDp8OjbyAodC9oYSkiKSArIHRoZW1lX3B1YnIobGVnZW5kID0gIm5vbmUiKSArDQogIHN0YXRfcHZhbHVlX21hbnVhbChwd2MsIGhpZGUubnMgPSBUKSArDQogIGxhYnMoDQogICAgc3VidGl0bGUgPSBnZXRfdGVzdF9sYWJlbChyZXMuZnJpZWQsIGRldGFpbGVkID0gVFJVRSksDQogICAgY2FwdGlvbiA9IGdldF9wd2NfbGFiZWwocHdjKSkNCg0KDQoNCiMnIA0KIycgIyMgKioxNy4yOSoqDQojJyANCiMrIGVjaG89VCwgZmlnLmhlaWdodD01LCBmaWcud2lkdGg9OCwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRQ0KDQpkZiA8LSBkYXRhLmZyYW1lKA0KICBzdHJpbmdzQXNGYWN0b3JzID0gRiwNCiAgeCA9IGMoDQogICAgMC42MDIsIDAuNjM2LCAwLjYwNCwgMC41NDgsIDAuNTksDQogICAgMC41OTIsIDAuNjI1LCAwLjY0MSwgMC42MDYsIDAuNTAyLCAwLjU4OCwNCiAgICAwLjU5NCwgMC42MjYpLA0KICB5ID0gYygNCiAgICAwLjYxOSwgMC42MiwgMC42MiwgMC41MzgsIDAuNjE2LA0KICAgIDAuNjAxLCAwLjY2NCwgMC42NTIsIDAuNTc5LCAwLjUwMSwgMC41OSwNCiAgICAwLjYyMiwgMC42MDYpKQ0KDQpnZ2RlbnNpdHkoZGYkeCwgZmlsbCA9ICJsaWdodGdyYXkiKQ0KZ2dxcXBsb3QoZGYkeCkNCg0KZ2dkZW5zaXR5KGRmJHksIGZpbGwgPSAibGlnaHRncmF5IikNCmdncXFwbG90KGRmJHkpDQoNCg0KZGYgJT4lDQogIGNvcl90ZXN0KA0KICAgIG1ldGhvZCA9ICJzcGVhcm1hbiIsDQogICAgY29uZi5sZXZlbCA9IDAuOTUNCiAgKSAlPiUNCiAgYWRkX3NpZ25pZmljYW5jZSgpICU+JSBrYWJsZQ0KDQoNCmdnc2NhdHRlcihkZiwNCiAgeCA9ICJ4IiwgeSA9ICJ5IiwNCiAgYWRkID0gInJlZy5saW5lIiwgY29uZi5pbnQgPSBUUlVFLA0KICBjb3IuY29lZiA9IFRSVUUsIGNvci5tZXRob2QgPSAic3BlYXJtYW4iLA0KICB4bGFiID0gIkRBUCAoU29uZGEgUHJlc3NsZXIpIiwgeWxhYiA9ICJEQVAgKFNlY2PDtWVzIHRyYW5zdmVyc2FpcyBkbyB0cm9uY28pIikNCg0KDQojJyANCiMnICMjICoqUmVmZXLDqm5jaWEqKg0KIycgRXNzYXMgYW7DoWxpc2VzIGZhemVtIHBhcnRlIGRvcyBFeGVyY8OtY2lvcyBkbyBMaXZybyBbQFBhdWxvVmFuZGVybGVpRmVycmVpcmEyMDE4XSwgdXRpbGl6YW5kbyBvcyBwYWNvdGVzICpkcGx5ciogW0BkcGx5cl0sICpnZ3B1YnIqIFtAZ2dwdWJyXSwgKnJzdGF0aXgqIFtAcnN0YXRpeF0gZSAqa25pdHIqLCBbQGtuaXRyXQ==