library(tidyverse)
library(dplyr)
library(agricolae)
library(psych)
## Importação e limpeza dos dados
df = read.csv("Dataset.csv", stringsAsFactors = FALSE)
################### Filtering treatments ###################
target <- c("T1R1", "T1R2", "T1R3", "T1R4", "T4R1", "T4R2", "T4R3", "T4R4",
"T5R1", "T5R2", "T5R3", "T5R4", "T6R1", "T6R2", "T6R3", "T6R4",
"T11R1", "T11R2", "T11R3", "T11R4",
"T12R1", "T12R2", "T12R3", "T12R4")
df <- df %>%
filter(TRATAMENTO %in% target)
#### Função para renomear os tratamentos
###################################################################################
my_fun <- function(x) {
x %>%
mutate(TRATAMENTO = case_when(TRATAMENTO == 'T1R1' ~'T1',
TRATAMENTO == 'T1R2' ~'T1',
TRATAMENTO == 'T1R3' ~'T1',
TRATAMENTO == 'T1R4' ~'T1',
TRATAMENTO == 'T2R1' ~'T2',
TRATAMENTO == 'T2R2' ~'T2',
TRATAMENTO == 'T2R3' ~'T2',
TRATAMENTO == 'T2R4' ~'T2',
TRATAMENTO == 'T3R1' ~'T3',
TRATAMENTO == 'T3R2' ~'T3',
TRATAMENTO == 'T3R3' ~'T3',
TRATAMENTO == 'T3R4' ~'T3',
TRATAMENTO == 'T4R1' ~'T4',
TRATAMENTO == 'T4R2' ~'T4',
TRATAMENTO == 'T4R3' ~'T4',
TRATAMENTO == 'T4R4' ~'T4',
TRATAMENTO == 'T5R1' ~'T5',
TRATAMENTO == 'T5R2' ~'T5',
TRATAMENTO == 'T5R3' ~'T5',
TRATAMENTO == 'T5R4' ~'T5',
TRATAMENTO == 'T6R1' ~'T6',
TRATAMENTO == 'T6R2' ~'T6',
TRATAMENTO == 'T6R3' ~'T6',
TRATAMENTO == 'T6R4' ~'T6',
TRATAMENTO == 'T7R1' ~'T7',
TRATAMENTO == 'T7R2' ~'T7',
TRATAMENTO == 'T7R3' ~'T7',
TRATAMENTO == 'T7R4' ~'T7',
TRATAMENTO == 'T8R1' ~'T8',
TRATAMENTO == 'T8R2' ~'T8',
TRATAMENTO == 'T8R3' ~'T8',
TRATAMENTO == 'T8R4' ~'T8',
TRATAMENTO == 'T9R1' ~'T9',
TRATAMENTO == 'T9R2' ~'T9',
TRATAMENTO == 'T9R3' ~'T9',
TRATAMENTO == 'T9R4' ~'T9',
TRATAMENTO == 'T10R1' ~'T10',
TRATAMENTO == 'T10R2' ~'T10',
TRATAMENTO == 'T10R3' ~'T10',
TRATAMENTO == 'T10R4' ~'T10',
TRATAMENTO == 'T11R1' ~'T11',
TRATAMENTO == 'T11R2' ~'T11',
TRATAMENTO == 'T11R3' ~'T11',
TRATAMENTO == 'T11R4' ~'T11',
TRATAMENTO == 'T12R1' ~'T12',
TRATAMENTO == 'T12R2' ~'T12',
TRATAMENTO == 'T12R3' ~'T12',
TRATAMENTO == 'T12R4' ~'T12'))
}
### Separa as bases por doenças e remove outliers
D1 = df %>%
group_by(TRATAMENTO) %>%
mutate(DIPLOCARPON.In = ifelse((abs(DIPLOCARPON.In - median(DIPLOCARPON.In)) > 2*sd(DIPLOCARPON.In)), mean(DIPLOCARPON.In), DIPLOCARPON.In)) %>%
select(SEMANA, TRATAMENTO, DIPLOCARPON.In)
D2 = df %>%
group_by(TRATAMENTO) %>%
mutate(DIPLOCARPON.Sev = ifelse((abs(DIPLOCARPON.Sev - median(DIPLOCARPON.Sev)) > 2*sd(DIPLOCARPON.Sev)), mean(DIPLOCARPON.Sev), DIPLOCARPON.Sev)) %>%
select(SEMANA, TRATAMENTO, DIPLOCARPON.Sev)
D3 = df %>%
group_by(TRATAMENTO) %>%
mutate(MICOSFAERELA.In = ifelse(!(abs(MICOSFAERELA.In - median(MICOSFAERELA.In)) > 2*sd(MICOSFAERELA.In)), mean(MICOSFAERELA.In), MICOSFAERELA.In)) %>%
select(SEMANA, TRATAMENTO, MICOSFAERELA.In)
D4 = df %>%
group_by(TRATAMENTO) %>%
mutate(MICOSFAERELA.Sev = ifelse((abs(MICOSFAERELA.Sev - median(MICOSFAERELA.Sev)) > 2*sd(MICOSFAERELA.Sev)), mean(MICOSFAERELA.Sev), MICOSFAERELA.Sev)) %>%
select(SEMANA, TRATAMENTO, MICOSFAERELA.Sev)
D5 = df %>%
group_by(TRATAMENTO) %>%
mutate(ANTRACNOSE.In = ifelse((abs(ANTRACNOSE.In - median(ANTRACNOSE.In)) > 2*sd(ANTRACNOSE.In)), mean(ANTRACNOSE.In), ANTRACNOSE.In)) %>%
select(SEMANA, TRATAMENTO, ANTRACNOSE.In)
D6 = df %>%
group_by(TRATAMENTO) %>%
mutate(ANTRACNOSE.Sev = ifelse(!(abs(ANTRACNOSE.Sev - median(ANTRACNOSE.Sev)) > 2*sd(ANTRACNOSE.Sev)), mean(ANTRACNOSE.Sev), ANTRACNOSE.Sev)) %>%
select(SEMANA, TRATAMENTO, ANTRACNOSE.Sev)
D7 = df %>%
group_by(TRATAMENTO) %>%
mutate(BOTRYTIS.Inf = ifelse(!(abs(BOTRYTIS.Inf - median(BOTRYTIS.Inf)) > 2*sd(BOTRYTIS.Inf)), mean(BOTRYTIS.Inf), BOTRYTIS.Inf)) %>%
select(SEMANA, TRATAMENTO, BOTRYTIS.Inf)
### Renomeia os tratamentos
D1 <- my_fun(D1)
D2 <- my_fun(D2)
D3 <- my_fun(D3)
D4 <- my_fun(D4)
D5 <- my_fun(D5)
D6 <- my_fun(D6)
D7 <- my_fun(D7)
#################################################################
####################### DIPLOCARPON.In ##########################
#################################################################
### Plot Boxplot disease
D1 %>%
ggplot(aes(TRATAMENTO, DIPLOCARPON.In)) +
geom_jitter(size=3, width = .1)+
geom_boxplot(size=1)

###################################################
kruskal.test(DIPLOCARPON.In~TRATAMENTO,D1)
Kruskal-Wallis rank sum test
data: DIPLOCARPON.In by TRATAMENTO
Kruskal-Wallis chi-squared = 14.041, df = 5, p-value = 0.01535
pairwise.wilcox.test(D1$DIPLOCARPON.In, D1$TRATAMENTO)
Pairwise comparisons using Wilcoxon rank sum test
data: D1$DIPLOCARPON.In and D1$TRATAMENTO
T1 T11 T12 T4 T5
T11 0.354 - - - -
T12 0.049 1.000 - - -
T4 1.000 1.000 0.428 - -
T5 0.039 1.000 1.000 0.400 -
T6 0.684 1.000 1.000 1.000 1.000
P value adjustment method: holm
##################################################
################ SUMMARY
saida <- describeBy(D1 ~ TRATAMENTO, skew=FALSE,ranges=FALSE,mat=TRUE)
mat <- c(saida[13,5], saida[13,6], saida[14,5], saida[14,6],
saida[15,5], saida[15,6], saida[16,5], saida[16,6],
saida[17,5], saida[17,6], saida[18,5], saida[18,6])
rnames <- c(toString(saida[13,2]),toString(saida[14,2]),toString(saida[15,2]),
toString(saida[16,2]),toString(saida[17,2]),toString(saida[18,2]))
cnames <- c("Média","DesvP")
mat <- matrix(mat,nrow=6, ncol=2,byrow=TRUE,dimnames=list(rnames,cnames))
print("Valores de Média e Desvio Padrão")
[1] "Valores de Média e Desvio Padrão"
print(mat)
Média DesvP
T1 5.6725 4.636974
T11 3.3250 3.257162
T12 2.7000 2.823346
T4 4.2325 3.501383
T5 2.5050 2.153465
T6 3.8300 3.827646
#################################################################
####################### DIPLOCARPON.Sev ##########################
#################################################################
### Plot Boxplot disease
D2 %>%
ggplot(aes(TRATAMENTO, DIPLOCARPON.Sev)) +
geom_jitter(size=3, width = .1)+
geom_boxplot(size=1)

ANOVA<-aov(DIPLOCARPON.Sev~TRATAMENTO,D2)
res <- ANOVA$residuals
shapiro.test(res)
Shapiro-Wilk normality test
data: res
W = 0.81426, p-value = 3.158e-16
summary(ANOVA)
Df Sum Sq Mean Sq F value Pr(>F)
TRATAMENTO 5 1.24 0.2485 0.92 0.468
Residuals 234 63.20 0.2701
TukeyHSD(ANOVA)
Tukey multiple comparisons of means
95% family-wise confidence level
Fit: aov(formula = DIPLOCARPON.Sev ~ TRATAMENTO, data = D2)
$TRATAMENTO
diff lwr upr p adj
T11-T1 0.0725 -0.2614094 0.4064094 0.9891805
T12-T1 0.0350 -0.2989094 0.3689094 0.9996650
T4-T1 -0.0425 -0.3764094 0.2914094 0.9991367
T5-T1 -0.0625 -0.3964094 0.2714094 0.9945560
T6-T1 -0.1500 -0.4839094 0.1839094 0.7898663
T12-T11 -0.0375 -0.3714094 0.2964094 0.9995305
T4-T11 -0.1150 -0.4489094 0.2189094 0.9209167
T5-T11 -0.1350 -0.4689094 0.1989094 0.8544640
T6-T11 -0.2225 -0.5564094 0.1114094 0.3957297
T4-T12 -0.0775 -0.4114094 0.2564094 0.9853522
T5-T12 -0.0975 -0.4314094 0.2364094 0.9598962
T6-T12 -0.1850 -0.5189094 0.1489094 0.6046418
T5-T4 -0.0200 -0.3539094 0.3139094 0.9999789
T6-T4 -0.1075 -0.4414094 0.2264094 0.9397452
T6-T5 -0.0875 -0.4214094 0.2464094 0.9748612
################ SUMMARY
saida <- describeBy(D2 ~ TRATAMENTO, skew=FALSE,ranges=FALSE,mat=TRUE)
mat <- c(saida[13,5], saida[13,6], saida[14,5], saida[14,6],
saida[15,5], saida[15,6], saida[16,5], saida[16,6],
saida[17,5], saida[17,6], saida[18,5], saida[18,6])
rnames <- c(toString(saida[13,2]),toString(saida[14,2]),toString(saida[15,2]),
toString(saida[16,2]),toString(saida[17,2]),toString(saida[18,2]))
cnames <- c("Média","DesvP")
mat <- matrix(mat,nrow=6, ncol=2,byrow=TRUE,dimnames=list(rnames,cnames))
print("Valores de Média e Desvio Padrão")
[1] "Valores de Média e Desvio Padrão"
print(mat)
Média DesvP
T1 0.8775 0.4054042
T11 0.9500 0.6774765
T12 0.9125 0.5979398
T4 0.8350 0.3641287
T5 0.8150 0.5484477
T6 0.7275 0.4540346
#################################################################
####################### MICOSFAERELA.In ##########################
#################################################################
### Plot Boxplot disease
D3 %>%
ggplot(aes(TRATAMENTO, MICOSFAERELA.In)) +
geom_jitter(size=3, width = .1)+
geom_boxplot(size=1)

kruskal.test(MICOSFAERELA.In~TRATAMENTO,D3)
Kruskal-Wallis rank sum test
data: MICOSFAERELA.In by TRATAMENTO
Kruskal-Wallis chi-squared = 54.403, df = 5, p-value = 1.732e-10
pairwise.wilcox.test(D3$MICOSFAERELA.In, D3$TRATAMENTO)
Pairwise comparisons using Wilcoxon rank sum test
data: D3$MICOSFAERELA.In and D3$TRATAMENTO
T1 T11 T12 T4 T5
T11 0.0080 - - - -
T12 1.0000 0.2311 - - -
T4 0.0011 1.3e-07 0.0014 - -
T5 4.2e-05 1.1e-05 0.0187 1.0000 -
T6 0.0232 5.7e-05 0.1694 1.0000 1.0000
P value adjustment method: holm
saida <- describeBy(D3 ~ TRATAMENTO, skew=FALSE,ranges=FALSE,mat=TRUE)
mat <- c(saida[13,5], saida[13,6], saida[14,5], saida[14,6],
saida[15,5], saida[15,6], saida[16,5], saida[16,6],
saida[17,5], saida[17,6], saida[18,5], saida[18,6])
rnames <- c(toString(saida[13,2]),toString(saida[14,2]),toString(saida[15,2]),
toString(saida[16,2]),toString(saida[17,2]),toString(saida[18,2]))
cnames <- c("Média","DesvP")
mat <- matrix(mat,nrow=6, ncol=2,byrow=TRUE,dimnames=list(rnames,cnames))
print("Valores de Média e Desvio Padrão")
[1] "Valores de Média e Desvio Padrão"
print(mat)
Média DesvP
T1 0.9075 0.5050451
T11 1.6050 1.8886910
T12 1.1575 1.0928409
T4 0.5400 0.8414883
T5 0.5325 0.7630531
T6 0.6300 0.7759857
#################################################################
####################### MICOSFAERELA.Sev ##########################
#################################################################
### Plot Boxplot disease
D4 %>%
ggplot(aes(TRATAMENTO, MICOSFAERELA.Sev)) +
geom_jitter(size=3, width = .1)+
geom_boxplot(size=1)

kruskal.test(MICOSFAERELA.Sev~TRATAMENTO,D4)
Kruskal-Wallis rank sum test
data: MICOSFAERELA.Sev by TRATAMENTO
Kruskal-Wallis chi-squared = 28.231, df = 5, p-value = 3.28e-05
pairwise.wilcox.test(D4$MICOSFAERELA.Sev, D4$TRATAMENTO)
Pairwise comparisons using Wilcoxon rank sum test
data: D4$MICOSFAERELA.Sev and D4$TRATAMENTO
T1 T11 T12 T4 T5
T11 1.0000 - - - -
T12 1.0000 0.6616 - - -
T4 0.0140 0.0079 0.2617 - -
T5 0.0077 0.0051 0.1908 1.0000 -
T6 0.0397 0.0239 0.6416 1.0000 1.0000
P value adjustment method: holm
saida <- describeBy(D4 ~ TRATAMENTO, skew=FALSE,ranges=FALSE,mat=TRUE)
mat <- c(saida[13,5], saida[13,6], saida[14,5], saida[14,6],
saida[15,5], saida[15,6], saida[16,5], saida[16,6],
saida[17,5], saida[17,6], saida[18,5], saida[18,6])
rnames <- c(toString(saida[13,2]),toString(saida[14,2]),toString(saida[15,2]),
toString(saida[16,2]),toString(saida[17,2]),toString(saida[18,2]))
cnames <- c("Média","DesvP")
mat <- matrix(mat,nrow=6, ncol=2,byrow=TRUE,dimnames=list(rnames,cnames))
print("Valores de Média e Desvio Padrão")
[1] "Valores de Média e Desvio Padrão"
print(mat)
Média DesvP
T1 0.4725 0.5392243
T11 0.6325 0.7353309
T12 0.3525 0.5218250
T4 0.1225 0.3100765
T5 0.0850 0.2348486
T6 0.1400 0.3326660
#################################################################
####################### ANTRACNOSE.In ##########################
#################################################################
### Plot Boxplot disease
D5 %>%
ggplot(aes(TRATAMENTO, ANTRACNOSE.In)) +
geom_jitter(size=3, width = .1)+
geom_boxplot(size=1)

kruskal.test(ANTRACNOSE.In~TRATAMENTO,D5)
Kruskal-Wallis rank sum test
data: ANTRACNOSE.In by TRATAMENTO
Kruskal-Wallis chi-squared = 17.353, df = 5, p-value = 0.003877
pairwise.wilcox.test(D5$ANTRACNOSE.In, D5$TRATAMENTO)
Pairwise comparisons using Wilcoxon rank sum test
data: D5$ANTRACNOSE.In and D5$TRATAMENTO
T1 T11 T12 T4 T5
T11 0.027 - - - -
T12 0.050 1.000 - - -
T4 0.024 1.000 1.000 - -
T5 0.012 1.000 1.000 1.000 -
T6 0.017 1.000 1.000 1.000 1.000
P value adjustment method: holm
saida <- describeBy(D5 ~ TRATAMENTO, skew=FALSE,ranges=FALSE,mat=TRUE)
mat <- c(saida[13,5], saida[13,6], saida[14,5], saida[14,6],
saida[15,5], saida[15,6], saida[16,5], saida[16,6],
saida[17,5], saida[17,6], saida[18,5], saida[18,6])
rnames <- c(toString(saida[13,2]),toString(saida[14,2]),toString(saida[15,2]),
toString(saida[16,2]),toString(saida[17,2]),toString(saida[18,2]))
cnames <- c("Média","DesvP")
mat <- matrix(mat,nrow=6, ncol=2,byrow=TRUE,dimnames=list(rnames,cnames))
print("Valores de Média e Desvio Padrão")
[1] "Valores de Média e Desvio Padrão"
print(mat)
Média DesvP
T1 4.4050 3.143895
T11 2.2850 1.948379
T12 2.4425 1.854155
T4 2.3225 2.336169
T5 2.1100 1.896123
T6 2.1650 1.866788
#################################################################
####################### ANTRACNOSE.Sev ##########################
#################################################################
### Plot Boxplot disease
D6 %>%
ggplot(aes(TRATAMENTO, ANTRACNOSE.Sev)) +
geom_jitter(size=3, width = .1)+
geom_boxplot(size=1)

kruskal.test(ANTRACNOSE.Sev~TRATAMENTO,D6)
Kruskal-Wallis rank sum test
data: ANTRACNOSE.Sev by TRATAMENTO
Kruskal-Wallis chi-squared = 27.756, df = 5, p-value = 4.062e-05
pairwise.wilcox.test(D6$ANTRACNOSE.Sev, D6$TRATAMENTO)
Pairwise comparisons using Wilcoxon rank sum test
data: D6$ANTRACNOSE.Sev and D6$TRATAMENTO
T1 T11 T12 T4 T5
T11 0.6004 - - - -
T12 0.0086 1.0000 - - -
T4 1.3e-07 1.0000 1.0000 - -
T5 0.0114 1.0000 1.0000 1.0000 -
T6 1.0e-05 1.0000 1.0000 1.0000 1.0000
P value adjustment method: holm
saida <- describeBy(D6 ~ TRATAMENTO, skew=FALSE,ranges=FALSE,mat=TRUE)
mat <- c(saida[13,5], saida[13,6], saida[14,5], saida[14,6],
saida[15,5], saida[15,6], saida[16,5], saida[16,6],
saida[17,5], saida[17,6], saida[18,5], saida[18,6])
rnames <- c(toString(saida[13,2]),toString(saida[14,2]),toString(saida[15,2]),
toString(saida[16,2]),toString(saida[17,2]),toString(saida[18,2]))
cnames <- c("Média","DesvP")
mat <- matrix(mat,nrow=6, ncol=2,byrow=TRUE,dimnames=list(rnames,cnames))
print("Valores de Média e Desvio Padrão")
[1] "Valores de Média e Desvio Padrão"
print(mat)
Média DesvP
T1 1.9175 0.6126393
T11 1.4550 0.7214480
T12 1.5525 0.6151871
T4 1.3525 0.3862957
T5 1.4675 0.8483430
T6 1.5100 0.7989737
#################################################################
####################### BOTRYTIS.Inf ##########################
#################################################################
### Plot Boxplot disease
D7 %>%
ggplot(aes(TRATAMENTO, BOTRYTIS.Inf)) +
geom_jitter(size=3, width = .1)+
geom_boxplot(size=1)

kruskal.test(BOTRYTIS.Inf~TRATAMENTO,D7)
Kruskal-Wallis rank sum test
data: BOTRYTIS.Inf by TRATAMENTO
Kruskal-Wallis chi-squared = 35.737, df = 5, p-value = 1.072e-06
pairwise.wilcox.test(D7$BOTRYTIS.Inf, D7$TRATAMENTO)
Pairwise comparisons using Wilcoxon rank sum test
data: D7$BOTRYTIS.Inf and D7$TRATAMENTO
T1 T11 T12 T4 T5
T11 1.00000 - - - -
T12 1.00000 1.00000 - - -
T4 1.00000 1.00000 1.00000 - -
T5 1.00000 0.24717 0.47524 0.71947 -
T6 0.00231 9.5e-06 0.00161 8.2e-06 0.00038
P value adjustment method: holm
saida <- describeBy(D7 ~ TRATAMENTO, skew=FALSE,ranges=FALSE,mat=TRUE)
mat <- c(saida[13,5], saida[13,6], saida[14,5], saida[14,6],
saida[15,5], saida[15,6], saida[16,5], saida[16,6],
saida[17,5], saida[17,6], saida[18,5], saida[18,6])
rnames <- c(toString(saida[13,2]),toString(saida[14,2]),toString(saida[15,2]),
toString(saida[16,2]),toString(saida[17,2]),toString(saida[18,2]))
cnames <- c("Média","DesvP")
mat <- matrix(mat,nrow=6, ncol=2,byrow=TRUE,dimnames=list(rnames,cnames))
print("Valores de Média e Desvio Padrão")
[1] "Valores de Média e Desvio Padrão"
print(mat)
Média DesvP
T1 1.7275 1.5207939
T11 1.6900 1.4840692
T12 1.4050 0.6898346
T4 1.8650 1.8259595
T5 1.3500 1.1502508
T6 0.9175 1.3157600
LS0tCnRpdGxlOiAiQW7DoWxpc2UgYSBwYXJ0aXIgZG9zIGRhZG9zIGJydXRvcyBkYXMgRG9lbsOnYXMiCm91dHB1dDogaHRtbF9ub3RlYm9vawotLS0KCmBgYHtyfQpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShkcGx5cikKbGlicmFyeShhZ3JpY29sYWUpCmxpYnJhcnkocHN5Y2gpCmBgYAoKYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9IAprbml0cjo6b3B0c19jaHVuayRzZXQod2FybmluZyA9IEZBTFNFLCBtZXNzYWdlID0gRkFMU0UpIApgYGAKCmBgYHtyfQojIyBJbXBvcnRhw6fDo28gZSBsaW1wZXphIGRvcyBkYWRvcwpkZiA9IHJlYWQuY3N2KCJEYXRhc2V0LmNzdiIsIHN0cmluZ3NBc0ZhY3RvcnMgPSBGQUxTRSkKCgojIyMjIyMjIyMjIyMjIyMjIyMjIEZpbHRlcmluZyB0cmVhdG1lbnRzICMjIyMjIyMjIyMjIyMjIyMjIyMKdGFyZ2V0IDwtIGMoIlQxUjEiLCAiVDFSMiIsICJUMVIzIiwgIlQxUjQiLCAiVDRSMSIsICJUNFIyIiwgIlQ0UjMiLCAiVDRSNCIsCiAgICAgICAgICAgICJUNVIxIiwgIlQ1UjIiLCAiVDVSMyIsICJUNVI0IiwgIlQ2UjEiLCAiVDZSMiIsICJUNlIzIiwgIlQ2UjQiLAogICAgICAgICAgICAiVDExUjEiLCAiVDExUjIiLCAiVDExUjMiLCAiVDExUjQiLCAKICAgICAgICAgICAgIlQxMlIxIiwgIlQxMlIyIiwgIlQxMlIzIiwgIlQxMlI0IikKZGYgPC0gZGYgJT4lCiAgICBmaWx0ZXIoVFJBVEFNRU5UTyAlaW4lIHRhcmdldCkKYGBgCgoKYGBge3J9CiMjIyMgRnVuw6fDo28gcGFyYSByZW5vbWVhciBvcyB0cmF0YW1lbnRvcwojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpteV9mdW4gPC0gZnVuY3Rpb24oeCkgeyAKICB4ICU+JSAgICAgICAKICAgIG11dGF0ZShUUkFUQU1FTlRPID0gY2FzZV93aGVuKFRSQVRBTUVOVE8gPT0gJ1QxUjEnIH4nVDEnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJBVEFNRU5UTyA9PSAnVDFSMicgfidUMScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUkFUQU1FTlRPID09ICdUMVIzJyB+J1QxJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSQVRBTUVOVE8gPT0gJ1QxUjQnIH4nVDEnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJBVEFNRU5UTyA9PSAnVDJSMScgfidUMicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUkFUQU1FTlRPID09ICdUMlIyJyB+J1QyJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSQVRBTUVOVE8gPT0gJ1QyUjMnIH4nVDInLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJBVEFNRU5UTyA9PSAnVDJSNCcgfidUMicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUkFUQU1FTlRPID09ICdUM1IxJyB+J1QzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSQVRBTUVOVE8gPT0gJ1QzUjInIH4nVDMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJBVEFNRU5UTyA9PSAnVDNSMycgfidUMycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUkFUQU1FTlRPID09ICdUM1I0JyB+J1QzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSQVRBTUVOVE8gPT0gJ1Q0UjEnIH4nVDQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJBVEFNRU5UTyA9PSAnVDRSMicgfidUNCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUkFUQU1FTlRPID09ICdUNFIzJyB+J1Q0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSQVRBTUVOVE8gPT0gJ1Q0UjQnIH4nVDQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJBVEFNRU5UTyA9PSAnVDVSMScgfidUNScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUkFUQU1FTlRPID09ICdUNVIyJyB+J1Q1JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSQVRBTUVOVE8gPT0gJ1Q1UjMnIH4nVDUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJBVEFNRU5UTyA9PSAnVDVSNCcgfidUNScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUkFUQU1FTlRPID09ICdUNlIxJyB+J1Q2JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSQVRBTUVOVE8gPT0gJ1Q2UjInIH4nVDYnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJBVEFNRU5UTyA9PSAnVDZSMycgfidUNicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUkFUQU1FTlRPID09ICdUNlI0JyB+J1Q2JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSQVRBTUVOVE8gPT0gJ1Q3UjEnIH4nVDcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJBVEFNRU5UTyA9PSAnVDdSMicgfidUNycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUkFUQU1FTlRPID09ICdUN1IzJyB+J1Q3JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSQVRBTUVOVE8gPT0gJ1Q3UjQnIH4nVDcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJBVEFNRU5UTyA9PSAnVDhSMScgfidUOCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUkFUQU1FTlRPID09ICdUOFIyJyB+J1Q4JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSQVRBTUVOVE8gPT0gJ1Q4UjMnIH4nVDgnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJBVEFNRU5UTyA9PSAnVDhSNCcgfidUOCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUkFUQU1FTlRPID09ICdUOVIxJyB+J1Q5JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSQVRBTUVOVE8gPT0gJ1Q5UjInIH4nVDknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJBVEFNRU5UTyA9PSAnVDlSMycgfidUOScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUkFUQU1FTlRPID09ICdUOVI0JyB+J1Q5JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSQVRBTUVOVE8gPT0gJ1QxMFIxJyB+J1QxMCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUkFUQU1FTlRPID09ICdUMTBSMicgfidUMTAnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJBVEFNRU5UTyA9PSAnVDEwUjMnIH4nVDEwJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSQVRBTUVOVE8gPT0gJ1QxMFI0JyB+J1QxMCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUkFUQU1FTlRPID09ICdUMTFSMScgfidUMTEnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJBVEFNRU5UTyA9PSAnVDExUjInIH4nVDExJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSQVRBTUVOVE8gPT0gJ1QxMVIzJyB+J1QxMScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUkFUQU1FTlRPID09ICdUMTFSNCcgfidUMTEnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJBVEFNRU5UTyA9PSAnVDEyUjEnIH4nVDEyJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSQVRBTUVOVE8gPT0gJ1QxMlIyJyB+J1QxMicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUkFUQU1FTlRPID09ICdUMTJSMycgfidUMTInLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJBVEFNRU5UTyA9PSAnVDEyUjQnIH4nVDEyJykpCn0KCmBgYAoKYGBge3J9CiMjIyBTZXBhcmEgYXMgYmFzZXMgcG9yIGRvZW7Dp2FzIGUgcmVtb3ZlIG91dGxpZXJzCkQxID0gZGYgJT4lCiAgZ3JvdXBfYnkoVFJBVEFNRU5UTykgJT4lCiAgbXV0YXRlKERJUExPQ0FSUE9OLkluID0gaWZlbHNlKChhYnMoRElQTE9DQVJQT04uSW4gLSBtZWRpYW4oRElQTE9DQVJQT04uSW4pKSA+IDIqc2QoRElQTE9DQVJQT04uSW4pKSwgbWVhbihESVBMT0NBUlBPTi5JbiksIERJUExPQ0FSUE9OLkluKSkgJT4lCiAgc2VsZWN0KFNFTUFOQSwgVFJBVEFNRU5UTywgRElQTE9DQVJQT04uSW4pIAoKRDIgPSBkZiAlPiUKICBncm91cF9ieShUUkFUQU1FTlRPKSAlPiUKICBtdXRhdGUoRElQTE9DQVJQT04uU2V2ID0gaWZlbHNlKChhYnMoRElQTE9DQVJQT04uU2V2IC0gbWVkaWFuKERJUExPQ0FSUE9OLlNldikpID4gMipzZChESVBMT0NBUlBPTi5TZXYpKSwgbWVhbihESVBMT0NBUlBPTi5TZXYpLCBESVBMT0NBUlBPTi5TZXYpKSAlPiUKICBzZWxlY3QoU0VNQU5BLCBUUkFUQU1FTlRPLCBESVBMT0NBUlBPTi5TZXYpIAoKRDMgPSBkZiAlPiUKICBncm91cF9ieShUUkFUQU1FTlRPKSAlPiUKICBtdXRhdGUoTUlDT1NGQUVSRUxBLkluID0gaWZlbHNlKCEoYWJzKE1JQ09TRkFFUkVMQS5JbiAtIG1lZGlhbihNSUNPU0ZBRVJFTEEuSW4pKSA+IDIqc2QoTUlDT1NGQUVSRUxBLkluKSksIG1lYW4oTUlDT1NGQUVSRUxBLkluKSwgTUlDT1NGQUVSRUxBLkluKSkgJT4lCiAgc2VsZWN0KFNFTUFOQSwgVFJBVEFNRU5UTywgTUlDT1NGQUVSRUxBLkluKSAKCkQ0ID0gZGYgJT4lCiAgZ3JvdXBfYnkoVFJBVEFNRU5UTykgJT4lCiAgbXV0YXRlKE1JQ09TRkFFUkVMQS5TZXYgPSBpZmVsc2UoKGFicyhNSUNPU0ZBRVJFTEEuU2V2IC0gbWVkaWFuKE1JQ09TRkFFUkVMQS5TZXYpKSA+IDIqc2QoTUlDT1NGQUVSRUxBLlNldikpLCBtZWFuKE1JQ09TRkFFUkVMQS5TZXYpLCBNSUNPU0ZBRVJFTEEuU2V2KSkgJT4lCiAgc2VsZWN0KFNFTUFOQSwgVFJBVEFNRU5UTywgTUlDT1NGQUVSRUxBLlNldikgCgpENSA9IGRmICU+JQogIGdyb3VwX2J5KFRSQVRBTUVOVE8pICU+JQogIG11dGF0ZShBTlRSQUNOT1NFLkluID0gaWZlbHNlKChhYnMoQU5UUkFDTk9TRS5JbiAtIG1lZGlhbihBTlRSQUNOT1NFLkluKSkgPiAyKnNkKEFOVFJBQ05PU0UuSW4pKSwgbWVhbihBTlRSQUNOT1NFLkluKSwgQU5UUkFDTk9TRS5JbikpICU+JQogIHNlbGVjdChTRU1BTkEsIFRSQVRBTUVOVE8sIEFOVFJBQ05PU0UuSW4pIAoKRDYgPSBkZiAlPiUKICBncm91cF9ieShUUkFUQU1FTlRPKSAlPiUKICBtdXRhdGUoQU5UUkFDTk9TRS5TZXYgPSBpZmVsc2UoIShhYnMoQU5UUkFDTk9TRS5TZXYgLSBtZWRpYW4oQU5UUkFDTk9TRS5TZXYpKSA+IDIqc2QoQU5UUkFDTk9TRS5TZXYpKSwgbWVhbihBTlRSQUNOT1NFLlNldiksIEFOVFJBQ05PU0UuU2V2KSkgJT4lCiAgc2VsZWN0KFNFTUFOQSwgVFJBVEFNRU5UTywgQU5UUkFDTk9TRS5TZXYpIAoKRDcgPSBkZiAlPiUKICBncm91cF9ieShUUkFUQU1FTlRPKSAlPiUKICBtdXRhdGUoQk9UUllUSVMuSW5mID0gaWZlbHNlKCEoYWJzKEJPVFJZVElTLkluZiAtIG1lZGlhbihCT1RSWVRJUy5JbmYpKSA+IDIqc2QoQk9UUllUSVMuSW5mKSksIG1lYW4oQk9UUllUSVMuSW5mKSwgQk9UUllUSVMuSW5mKSkgJT4lCiAgc2VsZWN0KFNFTUFOQSwgVFJBVEFNRU5UTywgQk9UUllUSVMuSW5mKSAKYGBgCgpgYGB7cn0KIyMjIFJlbm9tZWlhIG9zIHRyYXRhbWVudG9zCkQxIDwtIG15X2Z1bihEMSkKRDIgPC0gbXlfZnVuKEQyKQpEMyA8LSBteV9mdW4oRDMpCkQ0IDwtIG15X2Z1bihENCkKRDUgPC0gbXlfZnVuKEQ1KQpENiA8LSBteV9mdW4oRDYpCkQ3IDwtIG15X2Z1bihENykKYGBgCgpgYGB7cn0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgRElQTE9DQVJQT04uSW4gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCiMjIyBQbG90IEJveHBsb3QgZGlzZWFzZQpEMSAlPiUgCiAgZ2dwbG90KGFlcyhUUkFUQU1FTlRPLCBESVBMT0NBUlBPTi5JbikpICsKICBnZW9tX2ppdHRlcihzaXplPTMsIHdpZHRoID0gLjEpKwogIGdlb21fYm94cGxvdChzaXplPTEpCmBgYAoKYGBge3J9CiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwprcnVza2FsLnRlc3QoRElQTE9DQVJQT04uSW5+VFJBVEFNRU5UTyxEMSkKcGFpcndpc2Uud2lsY294LnRlc3QoRDEkRElQTE9DQVJQT04uSW4sIEQxJFRSQVRBTUVOVE8pCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmBgYAoKYGBge3J9CiMjIyMjIyMjIyMjIyMjIyMgU1VNTUFSWQpzYWlkYSA8LSBkZXNjcmliZUJ5KEQxIH4gVFJBVEFNRU5UTywgc2tldz1GQUxTRSxyYW5nZXM9RkFMU0UsbWF0PVRSVUUpCm1hdCA8LSBjKHNhaWRhWzEzLDVdLCBzYWlkYVsxMyw2XSwgc2FpZGFbMTQsNV0sIHNhaWRhWzE0LDZdLAogICAgICAgICBzYWlkYVsxNSw1XSwgc2FpZGFbMTUsNl0sIHNhaWRhWzE2LDVdLCBzYWlkYVsxNiw2XSwKICAgICAgICAgc2FpZGFbMTcsNV0sIHNhaWRhWzE3LDZdLCBzYWlkYVsxOCw1XSwgc2FpZGFbMTgsNl0pCnJuYW1lcyA8LSBjKHRvU3RyaW5nKHNhaWRhWzEzLDJdKSx0b1N0cmluZyhzYWlkYVsxNCwyXSksdG9TdHJpbmcoc2FpZGFbMTUsMl0pLAogICAgICAgICAgICB0b1N0cmluZyhzYWlkYVsxNiwyXSksdG9TdHJpbmcoc2FpZGFbMTcsMl0pLHRvU3RyaW5nKHNhaWRhWzE4LDJdKSkKY25hbWVzIDwtIGMoIk3DqWRpYSIsIkRlc3ZQIikKbWF0IDwtIG1hdHJpeChtYXQsbnJvdz02LCBuY29sPTIsYnlyb3c9VFJVRSxkaW1uYW1lcz1saXN0KHJuYW1lcyxjbmFtZXMpKQpwcmludCgiVmFsb3JlcyBkZSBNw6lkaWEgZSBEZXN2aW8gUGFkcsOjbyIpCnByaW50KG1hdCkKYGBgCgpgYGB7cn0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgRElQTE9DQVJQT04uU2V2ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgojIyMgUGxvdCBCb3hwbG90IGRpc2Vhc2UKRDIgJT4lIAogIGdncGxvdChhZXMoVFJBVEFNRU5UTywgRElQTE9DQVJQT04uU2V2KSkgKwogIGdlb21faml0dGVyKHNpemU9Mywgd2lkdGggPSAuMSkrCiAgZ2VvbV9ib3hwbG90KHNpemU9MSkKYGBgCgpgYGB7cn0KQU5PVkE8LWFvdihESVBMT0NBUlBPTi5TZXZ+VFJBVEFNRU5UTyxEMikKcmVzIDwtIEFOT1ZBJHJlc2lkdWFscwpzaGFwaXJvLnRlc3QocmVzKQpzdW1tYXJ5KEFOT1ZBKQpUdWtleUhTRChBTk9WQSkKYGBgCgpgYGB7cn0KIyMjIyMjIyMjIyMjIyMjIyBTVU1NQVJZCnNhaWRhIDwtIGRlc2NyaWJlQnkoRDIgfiBUUkFUQU1FTlRPLCBza2V3PUZBTFNFLHJhbmdlcz1GQUxTRSxtYXQ9VFJVRSkKbWF0IDwtIGMoc2FpZGFbMTMsNV0sIHNhaWRhWzEzLDZdLCBzYWlkYVsxNCw1XSwgc2FpZGFbMTQsNl0sCiAgICAgICAgIHNhaWRhWzE1LDVdLCBzYWlkYVsxNSw2XSwgc2FpZGFbMTYsNV0sIHNhaWRhWzE2LDZdLAogICAgICAgICBzYWlkYVsxNyw1XSwgc2FpZGFbMTcsNl0sIHNhaWRhWzE4LDVdLCBzYWlkYVsxOCw2XSkKcm5hbWVzIDwtIGModG9TdHJpbmcoc2FpZGFbMTMsMl0pLHRvU3RyaW5nKHNhaWRhWzE0LDJdKSx0b1N0cmluZyhzYWlkYVsxNSwyXSksCiAgICAgICAgICAgIHRvU3RyaW5nKHNhaWRhWzE2LDJdKSx0b1N0cmluZyhzYWlkYVsxNywyXSksdG9TdHJpbmcoc2FpZGFbMTgsMl0pKQpjbmFtZXMgPC0gYygiTcOpZGlhIiwiRGVzdlAiKQptYXQgPC0gbWF0cml4KG1hdCxucm93PTYsIG5jb2w9MixieXJvdz1UUlVFLGRpbW5hbWVzPWxpc3Qocm5hbWVzLGNuYW1lcykpCnByaW50KCJWYWxvcmVzIGRlIE3DqWRpYSBlIERlc3ZpbyBQYWRyw6NvIikKcHJpbnQobWF0KQpgYGAKCmBgYHtyfQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBNSUNPU0ZBRVJFTEEuSW4gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyMjIFBsb3QgQm94cGxvdCBkaXNlYXNlCkQzICU+JSAKICBnZ3Bsb3QoYWVzKFRSQVRBTUVOVE8sIE1JQ09TRkFFUkVMQS5JbikpICsKICBnZW9tX2ppdHRlcihzaXplPTMsIHdpZHRoID0gLjEpKwogIGdlb21fYm94cGxvdChzaXplPTEpCgpgYGAKCmBgYHtyfQprcnVza2FsLnRlc3QoTUlDT1NGQUVSRUxBLkluflRSQVRBTUVOVE8sRDMpCnBhaXJ3aXNlLndpbGNveC50ZXN0KEQzJE1JQ09TRkFFUkVMQS5JbiwgRDMkVFJBVEFNRU5UTykKYGBgCgpgYGB7cn0Kc2FpZGEgPC0gZGVzY3JpYmVCeShEMyB+IFRSQVRBTUVOVE8sIHNrZXc9RkFMU0UscmFuZ2VzPUZBTFNFLG1hdD1UUlVFKQptYXQgPC0gYyhzYWlkYVsxMyw1XSwgc2FpZGFbMTMsNl0sIHNhaWRhWzE0LDVdLCBzYWlkYVsxNCw2XSwKICAgICAgICAgc2FpZGFbMTUsNV0sIHNhaWRhWzE1LDZdLCBzYWlkYVsxNiw1XSwgc2FpZGFbMTYsNl0sCiAgICAgICAgIHNhaWRhWzE3LDVdLCBzYWlkYVsxNyw2XSwgc2FpZGFbMTgsNV0sIHNhaWRhWzE4LDZdKQpybmFtZXMgPC0gYyh0b1N0cmluZyhzYWlkYVsxMywyXSksdG9TdHJpbmcoc2FpZGFbMTQsMl0pLHRvU3RyaW5nKHNhaWRhWzE1LDJdKSwKICAgICAgICAgICAgdG9TdHJpbmcoc2FpZGFbMTYsMl0pLHRvU3RyaW5nKHNhaWRhWzE3LDJdKSx0b1N0cmluZyhzYWlkYVsxOCwyXSkpCmNuYW1lcyA8LSBjKCJNw6lkaWEiLCJEZXN2UCIpCm1hdCA8LSBtYXRyaXgobWF0LG5yb3c9NiwgbmNvbD0yLGJ5cm93PVRSVUUsZGltbmFtZXM9bGlzdChybmFtZXMsY25hbWVzKSkKcHJpbnQoIlZhbG9yZXMgZGUgTcOpZGlhIGUgRGVzdmlvIFBhZHLDo28iKQpwcmludChtYXQpCmBgYAoKYGBge3J9CiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIE1JQ09TRkFFUkVMQS5TZXYgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyMjIFBsb3QgQm94cGxvdCBkaXNlYXNlCkQ0ICU+JSAKICBnZ3Bsb3QoYWVzKFRSQVRBTUVOVE8sIE1JQ09TRkFFUkVMQS5TZXYpKSArCiAgZ2VvbV9qaXR0ZXIoc2l6ZT0zLCB3aWR0aCA9IC4xKSsKICBnZW9tX2JveHBsb3Qoc2l6ZT0xKQpgYGAKCmBgYHtyfQprcnVza2FsLnRlc3QoTUlDT1NGQUVSRUxBLlNldn5UUkFUQU1FTlRPLEQ0KQpwYWlyd2lzZS53aWxjb3gudGVzdChENCRNSUNPU0ZBRVJFTEEuU2V2LCBENCRUUkFUQU1FTlRPKQpgYGAKCmBgYHtyfQpzYWlkYSA8LSBkZXNjcmliZUJ5KEQ0IH4gVFJBVEFNRU5UTywgc2tldz1GQUxTRSxyYW5nZXM9RkFMU0UsbWF0PVRSVUUpCm1hdCA8LSBjKHNhaWRhWzEzLDVdLCBzYWlkYVsxMyw2XSwgc2FpZGFbMTQsNV0sIHNhaWRhWzE0LDZdLAogICAgICAgICBzYWlkYVsxNSw1XSwgc2FpZGFbMTUsNl0sIHNhaWRhWzE2LDVdLCBzYWlkYVsxNiw2XSwKICAgICAgICAgc2FpZGFbMTcsNV0sIHNhaWRhWzE3LDZdLCBzYWlkYVsxOCw1XSwgc2FpZGFbMTgsNl0pCnJuYW1lcyA8LSBjKHRvU3RyaW5nKHNhaWRhWzEzLDJdKSx0b1N0cmluZyhzYWlkYVsxNCwyXSksdG9TdHJpbmcoc2FpZGFbMTUsMl0pLAogICAgICAgICAgICB0b1N0cmluZyhzYWlkYVsxNiwyXSksdG9TdHJpbmcoc2FpZGFbMTcsMl0pLHRvU3RyaW5nKHNhaWRhWzE4LDJdKSkKY25hbWVzIDwtIGMoIk3DqWRpYSIsIkRlc3ZQIikKbWF0IDwtIG1hdHJpeChtYXQsbnJvdz02LCBuY29sPTIsYnlyb3c9VFJVRSxkaW1uYW1lcz1saXN0KHJuYW1lcyxjbmFtZXMpKQpwcmludCgiVmFsb3JlcyBkZSBNw6lkaWEgZSBEZXN2aW8gUGFkcsOjbyIpCnByaW50KG1hdCkKYGBgCgpgYGB7cn0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgQU5UUkFDTk9TRS5JbiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIyMgUGxvdCBCb3hwbG90IGRpc2Vhc2UKRDUgJT4lIAogIGdncGxvdChhZXMoVFJBVEFNRU5UTywgQU5UUkFDTk9TRS5JbikpICsKICBnZW9tX2ppdHRlcihzaXplPTMsIHdpZHRoID0gLjEpKwogIGdlb21fYm94cGxvdChzaXplPTEpCmBgYAoKYGBge3J9CmtydXNrYWwudGVzdChBTlRSQUNOT1NFLkluflRSQVRBTUVOVE8sRDUpCnBhaXJ3aXNlLndpbGNveC50ZXN0KEQ1JEFOVFJBQ05PU0UuSW4sIEQ1JFRSQVRBTUVOVE8pCmBgYAoKYGBge3J9CnNhaWRhIDwtIGRlc2NyaWJlQnkoRDUgfiBUUkFUQU1FTlRPLCBza2V3PUZBTFNFLHJhbmdlcz1GQUxTRSxtYXQ9VFJVRSkKbWF0IDwtIGMoc2FpZGFbMTMsNV0sIHNhaWRhWzEzLDZdLCBzYWlkYVsxNCw1XSwgc2FpZGFbMTQsNl0sCiAgICAgICAgIHNhaWRhWzE1LDVdLCBzYWlkYVsxNSw2XSwgc2FpZGFbMTYsNV0sIHNhaWRhWzE2LDZdLAogICAgICAgICBzYWlkYVsxNyw1XSwgc2FpZGFbMTcsNl0sIHNhaWRhWzE4LDVdLCBzYWlkYVsxOCw2XSkKcm5hbWVzIDwtIGModG9TdHJpbmcoc2FpZGFbMTMsMl0pLHRvU3RyaW5nKHNhaWRhWzE0LDJdKSx0b1N0cmluZyhzYWlkYVsxNSwyXSksCiAgICAgICAgICAgIHRvU3RyaW5nKHNhaWRhWzE2LDJdKSx0b1N0cmluZyhzYWlkYVsxNywyXSksdG9TdHJpbmcoc2FpZGFbMTgsMl0pKQpjbmFtZXMgPC0gYygiTcOpZGlhIiwiRGVzdlAiKQptYXQgPC0gbWF0cml4KG1hdCxucm93PTYsIG5jb2w9MixieXJvdz1UUlVFLGRpbW5hbWVzPWxpc3Qocm5hbWVzLGNuYW1lcykpCnByaW50KCJWYWxvcmVzIGRlIE3DqWRpYSBlIERlc3ZpbyBQYWRyw6NvIikKcHJpbnQobWF0KQpgYGAKCmBgYHtyfQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBBTlRSQUNOT1NFLlNldiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIyMgUGxvdCBCb3hwbG90IGRpc2Vhc2UKRDYgJT4lIAogIGdncGxvdChhZXMoVFJBVEFNRU5UTywgQU5UUkFDTk9TRS5TZXYpKSArCiAgZ2VvbV9qaXR0ZXIoc2l6ZT0zLCB3aWR0aCA9IC4xKSsKICBnZW9tX2JveHBsb3Qoc2l6ZT0xKQpgYGAKCmBgYHtyfQprcnVza2FsLnRlc3QoQU5UUkFDTk9TRS5TZXZ+VFJBVEFNRU5UTyxENikKcGFpcndpc2Uud2lsY294LnRlc3QoRDYkQU5UUkFDTk9TRS5TZXYsIEQ2JFRSQVRBTUVOVE8pCmBgYAoKYGBge3J9CnNhaWRhIDwtIGRlc2NyaWJlQnkoRDYgfiBUUkFUQU1FTlRPLCBza2V3PUZBTFNFLHJhbmdlcz1GQUxTRSxtYXQ9VFJVRSkKbWF0IDwtIGMoc2FpZGFbMTMsNV0sIHNhaWRhWzEzLDZdLCBzYWlkYVsxNCw1XSwgc2FpZGFbMTQsNl0sCiAgICAgICAgIHNhaWRhWzE1LDVdLCBzYWlkYVsxNSw2XSwgc2FpZGFbMTYsNV0sIHNhaWRhWzE2LDZdLAogICAgICAgICBzYWlkYVsxNyw1XSwgc2FpZGFbMTcsNl0sIHNhaWRhWzE4LDVdLCBzYWlkYVsxOCw2XSkKcm5hbWVzIDwtIGModG9TdHJpbmcoc2FpZGFbMTMsMl0pLHRvU3RyaW5nKHNhaWRhWzE0LDJdKSx0b1N0cmluZyhzYWlkYVsxNSwyXSksCiAgICAgICAgICAgIHRvU3RyaW5nKHNhaWRhWzE2LDJdKSx0b1N0cmluZyhzYWlkYVsxNywyXSksdG9TdHJpbmcoc2FpZGFbMTgsMl0pKQpjbmFtZXMgPC0gYygiTcOpZGlhIiwiRGVzdlAiKQptYXQgPC0gbWF0cml4KG1hdCxucm93PTYsIG5jb2w9MixieXJvdz1UUlVFLGRpbW5hbWVzPWxpc3Qocm5hbWVzLGNuYW1lcykpCnByaW50KCJWYWxvcmVzIGRlIE3DqWRpYSBlIERlc3ZpbyBQYWRyw6NvIikKcHJpbnQobWF0KQpgYGAKCmBgYHtyfQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBCT1RSWVRJUy5JbmYgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyMjIFBsb3QgQm94cGxvdCBkaXNlYXNlCkQ3ICU+JSAKICBnZ3Bsb3QoYWVzKFRSQVRBTUVOVE8sIEJPVFJZVElTLkluZikpICsKICBnZW9tX2ppdHRlcihzaXplPTMsIHdpZHRoID0gLjEpKwogIGdlb21fYm94cGxvdChzaXplPTEpCmBgYAoKYGBge3J9CmtydXNrYWwudGVzdChCT1RSWVRJUy5JbmZ+VFJBVEFNRU5UTyxENykKcGFpcndpc2Uud2lsY294LnRlc3QoRDckQk9UUllUSVMuSW5mLCBENyRUUkFUQU1FTlRPKQpgYGAKCmBgYHtyfQpzYWlkYSA8LSBkZXNjcmliZUJ5KEQ3IH4gVFJBVEFNRU5UTywgc2tldz1GQUxTRSxyYW5nZXM9RkFMU0UsbWF0PVRSVUUpCm1hdCA8LSBjKHNhaWRhWzEzLDVdLCBzYWlkYVsxMyw2XSwgc2FpZGFbMTQsNV0sIHNhaWRhWzE0LDZdLAogICAgICAgICBzYWlkYVsxNSw1XSwgc2FpZGFbMTUsNl0sIHNhaWRhWzE2LDVdLCBzYWlkYVsxNiw2XSwKICAgICAgICAgc2FpZGFbMTcsNV0sIHNhaWRhWzE3LDZdLCBzYWlkYVsxOCw1XSwgc2FpZGFbMTgsNl0pCnJuYW1lcyA8LSBjKHRvU3RyaW5nKHNhaWRhWzEzLDJdKSx0b1N0cmluZyhzYWlkYVsxNCwyXSksdG9TdHJpbmcoc2FpZGFbMTUsMl0pLAogICAgICAgICAgICB0b1N0cmluZyhzYWlkYVsxNiwyXSksdG9TdHJpbmcoc2FpZGFbMTcsMl0pLHRvU3RyaW5nKHNhaWRhWzE4LDJdKSkKY25hbWVzIDwtIGMoIk3DqWRpYSIsIkRlc3ZQIikKbWF0IDwtIG1hdHJpeChtYXQsbnJvdz02LCBuY29sPTIsYnlyb3c9VFJVRSxkaW1uYW1lcz1saXN0KHJuYW1lcyxjbmFtZXMpKQpwcmludCgiVmFsb3JlcyBkZSBNw6lkaWEgZSBEZXN2aW8gUGFkcsOjbyIpCnByaW50KG1hdCkKYGBgCgoKCgo=