6 Point Data Analysis

gh = factor, 6 unique IDs, each greenhouse coded as an individual and seperate entity source = koppert or biobest 6 data points for all analyses averaged across greenhouse

input greenhouse data

greenhouse_analysis <- read_csv("greenhouse_analysis.csv", 
    col_types = cols(year = col_factor(levels = c("2022", 
        "2024")), gh = col_factor(levels = c("1", 
        "2", "3", "4", "5", "6"))))

greenhouse_analysis <- greenhouse_analysis %>%
  mutate(across(c(
    coragen_L, lalstop_k61_L, previcurflex_L, pylon_L, lunatranquility_L,
    rootshielplus_L, milstop_L, quadristop_L, azaguard_L, botanigard22wp_L,
    botanigardes_L, captivaprime_L, fontelis_L, mpede_L, nofly_L, veneratecg_L,
    beleaf50sg_L, entrustsc_L, grotto_L
  ), as.logical))

greenhouse_analysis$source <- as.factor(greenhouse_analysis$source)

look at general data structure

library(ggplot2)
library(tidyr)
library(dplyr)

# List of your logical treatment variables
treat_vars <- c(
  "coragen_L", "lalstop_k61_L", "previcurflex_L", "pylon_L", 
  "lunatranquility_L", "rootshielplus_L", "milstop_L", "quadristop_L", 
  "azaguard_L", "botanigard22wp_L", "botanigardes_L", "captivaprime_L", 
  "fontelis_L", "mpede_L", "nofly_L", "veneratecg_L", "beleaf50sg_L", 
  "entrustsc_L", "grotto_L"
)

# Reshape the data to long format
greenhouse_long <- greenhouse_analysis %>%
  pivot_longer(cols = all_of(treat_vars),
               names_to = "treatment",
               values_to = "applied")

# Create boxplots of crith_prop vs each treatment
ggplot(greenhouse_long, aes(x = as.factor(applied), y = crith_prop)) +
  geom_boxplot(fill = "gray90", color = "black", outlier.shape = 21) +
  facet_wrap(~ treatment, scales = "free_y", ncol = 4) +
  labs(
    x = "Applied (TRUE = Treated, FALSE = Control)",
    y = "Crithidia infection proportion",
    title = "Effect of each treatment on Crithidia infection"
  ) +
  theme_bw(base_size = 14) +
  theme(
    strip.text = element_text(face = "bold"),
    axis.text.x = element_text(angle = 0, hjust = 0.5)
  )

ggplot(greenhouse_long, aes(x = as.factor(applied), y = mean_pol)) +
  geom_boxplot(fill = "gray90", color = "black", outlier.shape = 21) +
  facet_wrap(~ treatment, scales = "free_y", ncol = 4) +
  labs(
    x = "Applied (TRUE = Treated, FALSE = Control)",
    y = "Mean anther bruising",
    title = "Effect of each treatment on mean anther bruising"
  ) +
  theme_bw(base_size = 14) +
  theme(
    strip.text = element_text(face = "bold"),
    axis.text.x = element_text(angle = 0, hjust = 0.5)
  )

ggplot(greenhouse_analysis, aes(x=crith_prop, y = prop_1)) +
  geom_point(size = 3) + 
  geom_smooth(method = "glm", se = TRUE, size = 2)
## Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
## ℹ Please use `linewidth` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
## `geom_smooth()` using formula = 'y ~ x'

ggplot(greenhouse_analysis, aes(x=total_application, y = prop_1)) +
  geom_point(size = 3) + 
  geom_smooth(method = "glm", se = TRUE, size = 2)
## `geom_smooth()` using formula = 'y ~ x'

ggplot(greenhouse_analysis, aes(x=total_application, y = prop_2)) +
  geom_point(size = 3) + 
  geom_smooth(method = "glm", se = TRUE, size = 2)
## `geom_smooth()` using formula = 'y ~ x'

ggplot(greenhouse_analysis, aes(x=total_application, y = prop_3)) +
  geom_point(size = 3) + 
  geom_smooth(method = "glm", se = TRUE, size = 2)
## `geom_smooth()` using formula = 'y ~ x'

ggplot(greenhouse_analysis, aes(x=total_application, y = mean_pol)) +
  geom_point(size = 3) + 
  geom_smooth(method = "glm", se = TRUE, size = 2)
## `geom_smooth()` using formula = 'y ~ x'

ggplot(greenhouse_analysis, aes(x=source, y = mean_pol, fill = source)) +
  geom_boxplot()

ggplot(greenhouse_analysis, aes(x=source, y = crith_prop, fill = source)) +
  geom_boxplot()

Crithidia vs. individual applied pesticide presence/absence

library(ggplot2)
library(dplyr)

# Summarize the data
greenhouse_summary <- greenhouse_long %>%
  group_by(applied, treatment) %>%
  summarise(
    mean_crith = mean(crith_prop, na.rm = TRUE),
    se_crith = sd(crith_prop, na.rm = TRUE)/sqrt(n()),
    .groups = "drop"
  )

# Bar plot
ggplot(greenhouse_summary, aes(x = treatment, y = mean_crith, fill = applied)) +
  geom_col(position = position_dodge(width = 0.8), color = "black") +
  geom_errorbar(aes(ymin = mean_crith - se_crith, ymax = mean_crith + se_crith),
                width = 0.2, position = position_dodge(width = 0.8)) +
  labs(
    x = "Pesticide",
    y = "Mean Crithidia infection proportion",
    title = "Effect of each treatment on Crithidia infection"
  ) +
  scale_fill_manual(values = c("FALSE" = "gray70", "TRUE" = "skyblue"), 
                    name = "Applied") +
  theme_bw(base_size = 14) +
  theme(
    axis.text.x = element_text(angle = 45, hjust = 1, face = "bold"),
    legend.position = "top"
  )

Pollination analysis

Pollination score vs. Crithidia

library(ggplot2)
library(dplyr)
library(lme4)
library(cowplot)

# Fit model
crith_mod1 <- glm(mean_pol ~ crith_prop + source + year, data = greenhouse_analysis)
Anova(crith_mod1)
## Analysis of Deviance Table (Type II tests)
## 
## Response: mean_pol
##            LR Chisq Df Pr(>Chisq)  
## crith_prop   2.9585  1    0.08543 .
## source       0.6591  1    0.41688  
## year         6.2548  1    0.01239 *
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
summary(crith_mod1)
## 
## Call:
## glm(formula = mean_pol ~ crith_prop + source + year, data = greenhouse_analysis)
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)   
## (Intercept)  2.27761    0.12593  18.086  0.00304 **
## crith_prop  -0.27087    0.15748  -1.720  0.22757   
## sourcekop   -0.06171    0.07602  -0.812  0.50214   
## year2024     0.15049    0.06017   2.501  0.12953   
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for gaussian family taken to be 0.003709939)
## 
##     Null deviance: 0.0851667  on 5  degrees of freedom
## Residual deviance: 0.0074199  on 2  degrees of freedom
## AIC: -13.145
## 
## Number of Fisher Scoring iterations: 2
AIC(crith_mod1)
## [1] -13.14485
sim_resgh_cm <- simulateResiduals(fittedModel = crith_mod1)
plot(sim_resgh_cm)

testDispersion(crith_mod1)

## 
##  DHARMa nonparametric dispersion test via sd of residuals fitted vs.
##  simulated
## 
## data:  simulationOutput
## dispersion = 0.40046, p-value = 0.296
## alternative hypothesis: two.sided
# Create a grid of crith_prop values
crith_grid <- data.frame(
  crith_prop = seq(min(greenhouse_analysis$crith_prop, na.rm = TRUE),
                   max(greenhouse_analysis$crith_prop, na.rm = TRUE),
                   length.out = 100),
  source = factor(levels(greenhouse_analysis$source)[1], levels = levels(greenhouse_analysis$source)),
  year   = factor(levels(greenhouse_analysis$year)[1], levels = levels(greenhouse_analysis$year))
)

# Predict with standard errors (fixed effects only)
pred <- predict(crith_mod1, newdata = crith_grid, re.form = NA, se.fit = TRUE)
crith_grid$predicted <- pred$fit
crith_grid$lower <- pred$fit - 1.96 * pred$se.fit
crith_grid$upper <- pred$fit + 1.96 * pred$se.fit

# Plot with CI ribbon
ggplot(greenhouse_analysis, aes(x = crith_prop, y = mean_pol)) +
  geom_point(shape = 21, size = 6, fill = "darkgreen", color = "black") +
  geom_ribbon(data = crith_grid,
              aes(x = crith_prop, ymin = lower, ymax = upper),
              alpha = 0.2, fill = "darkgray",
              inherit.aes = FALSE) +  # <-- prevent inheriting y = mean_pol
  geom_line(data = crith_grid,
            aes(x = crith_prop, y = predicted),
            color = "black", size = 2,
            inherit.aes = FALSE) +
  theme_cowplot() +
  labs(
    y = "Average Anther Bruising",
    x = "Average Proportion Crithidia"
  ) +
  annotate(
    geom = "text",
    x = 0.2,
    y = 2.5,
    label = "P = 0.08",
    size = 12
  ) +
  theme(
    axis.text = element_text(size = 24),
    axis.title = element_text(size = 24),
    text = element_text(size = 18)
  )

Pollination vs. total chemicals applied

library(ggplot2)
library(dplyr)
library(lme4)
library(cowplot)

# Fit the model
total_applied_mod1 <- glm(mean_pol ~ total_applied + source + year, data = greenhouse_analysis)
Anova(total_applied_mod1)
## Analysis of Deviance Table (Type II tests)
## 
## Response: mean_pol
##               LR Chisq Df Pr(>Chisq)   
## total_applied  10.1418  1   0.001449 **
## source          3.0744  1   0.079532 . 
## year            0.0212  1   0.884245   
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
summary(total_applied_mod1)
## 
## Call:
## glm(formula = mean_pol ~ total_applied + source + year, data = greenhouse_analysis)
## 
## Coefficients:
##                 Estimate Std. Error t value Pr(>|t|)   
## (Intercept)    2.439e+00  1.181e-01  20.652  0.00234 **
## total_applied -2.379e-06  7.471e-07  -3.185  0.08606 . 
## sourcekop     -8.941e-02  5.099e-02  -1.753  0.22162   
## year2024       1.019e-02  6.998e-02   0.146  0.89759   
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for gaussian family taken to be 0.001515072)
## 
##     Null deviance: 0.0851667  on 5  degrees of freedom
## Residual deviance: 0.0030301  on 2  degrees of freedom
## AIC: -18.518
## 
## Number of Fisher Scoring iterations: 2
sim_resgh_tt <- simulateResiduals(fittedModel = total_applied_mod1)
plot(sim_resgh_tt)

testDispersion(total_applied_mod1)

## 
##  DHARMa nonparametric dispersion test via sd of residuals fitted vs.
##  simulated
## 
## data:  simulationOutput
## dispersion = 0.40046, p-value = 0.296
## alternative hypothesis: two.sided
# Create a grid of total_applied values
total_grid <- data.frame(
  total_applied = seq(min(greenhouse_analysis$total_applied, na.rm = TRUE),
                      max(greenhouse_analysis$total_applied, na.rm = TRUE),
                      length.out = 100),
  source = factor(levels(greenhouse_analysis$source)[1], levels = levels(greenhouse_analysis$source)),
  year   = factor(levels(greenhouse_analysis$year)[1], levels = levels(greenhouse_analysis$year))
)

# Predict with standard errors (fixed effects only)
pred_total <- predict(total_applied_mod1, newdata = total_grid, re.form = NA, se.fit = TRUE)
total_grid$predicted <- pred_total$fit
total_grid$lower <- pred_total$fit - 1.96 * pred_total$se.fit
total_grid$upper <- pred_total$fit + 1.96 * pred_total$se.fit

# Plot with CI ribbon
ggplot(greenhouse_analysis, aes(x = total_applied, y = mean_pol)) +
  geom_point(shape = 21, size = 6, fill = "darkgreen", color = "black") +
  geom_ribbon(data = total_grid,
              aes(x = total_applied, ymin = lower, ymax = upper),
              alpha = 0.2, fill = "seagreen",
              inherit.aes = FALSE) +
  geom_line(data = total_grid,
            aes(x = total_applied, y = predicted),
            color = "black", size = 2,
            inherit.aes = FALSE) +
  theme_cowplot() +
  labs(
    y = "Average Anther Bruising",
    x = "Total Pesticides Applied (ml)"
  ) +
  annotate(
    geom = "text",
    x = min(greenhouse_analysis$total_applied) + 0.1 * diff(range(greenhouse_analysis$total_applied)),
    y = 2.7,
    label = "P < 0.01",  # Replace with your actual P-value if you want
    size = 12
  ) +
  theme(
    axis.text = element_text(size = 24),
    axis.title = element_text(size = 24),
    text = element_text(size = 18)
  )

Pollination vs. fungicide

total_fung_mod1 <- glm(mean_pol ~ fungicide_b + source + year, data = greenhouse_analysis)
Anova(total_fung_mod1)
## Analysis of Deviance Table (Type II tests)
## 
## Response: mean_pol
##             LR Chisq Df Pr(>Chisq)    
## fungicide_b   28.224  1  1.081e-07 ***
## source         0.030  1     0.8627    
## year         133.624  1  < 2.2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
total_fung_mod1
## 
## Call:  glm(formula = mean_pol ~ fungicide_b + source + year, data = greenhouse_analysis)
## 
## Coefficients:
## (Intercept)  fungicide_b    sourcekop     year2024  
##   2.134e+00   -2.097e-06    3.812e-03    2.481e-01  
## 
## Degrees of Freedom: 5 Total (i.e. Null);  2 Residual
## Null Deviance:       0.08517 
## Residual Deviance: 0.001217  AIC: -23.99
summary(total_fung_mod1)
## 
## Call:
## glm(formula = mean_pol ~ fungicide_b + source + year, data = greenhouse_analysis)
## 
## Coefficients:
##               Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  2.134e+00  1.973e-02 108.139 8.55e-05 ***
## fungicide_b -2.097e-06  3.948e-07  -5.313   0.0337 *  
## sourcekop    3.812e-03  2.203e-02   0.173   0.8786    
## year2024     2.481e-01  2.146e-02  11.560   0.0074 ** 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for gaussian family taken to be 0.0006086432)
## 
##     Null deviance: 0.0851667  on 5  degrees of freedom
## Residual deviance: 0.0012173  on 2  degrees of freedom
## AIC: -23.99
## 
## Number of Fisher Scoring iterations: 2
AIC(total_fung_mod1)
## [1] -23.99008
sim_resgh_fung <- simulateResiduals(fittedModel = total_fung_mod1)
qqnorm(resid(total_fung_mod1));qqline(resid(total_fung_mod1))

testUniformity(sim_resgh_fung)

## 
##  Exact one-sample Kolmogorov-Smirnov test
## 
## data:  simulationOutput$scaledResiduals
## D = 0.236, p-value = 0.8238
## alternative hypothesis: two-sided
testDispersion(sim_resgh_fung)

## 
##  DHARMa nonparametric dispersion test via sd of residuals fitted vs.
##  simulated
## 
## data:  simulationOutput
## dispersion = 0.40046, p-value = 0.296
## alternative hypothesis: two.sided
# Create a grid of total_applied values
total_grid <- data.frame(
  fungicide_b = seq(min(greenhouse_analysis$fungicide_b, na.rm = TRUE),
                      max(greenhouse_analysis$fungicide_b, na.rm = TRUE),
                      length.out = 100),
  source = factor(levels(greenhouse_analysis$source)[1], levels = levels(greenhouse_analysis$source)),
  year   = factor(levels(greenhouse_analysis$year)[1], levels = levels(greenhouse_analysis$year))
)

# Predict with standard errors (fixed effects only)
pred_total <- predict(total_fung_mod1, newdata = total_grid, re.form = NA, se.fit = TRUE)
total_grid$predicted <- pred_total$fit
total_grid$lower <- pred_total$fit - 1.96 * pred_total$se.fit
total_grid$upper <- pred_total$fit + 1.96 * pred_total$se.fit

# Plot with CI ribbon
ggplot(greenhouse_analysis, aes(x = fungicide_b, y = mean_pol)) +
  geom_point(shape = 21, size = 6, fill = "darkgreen", color = "black") +
  geom_ribbon(data = total_grid,
              aes(x = fungicide_b, ymin = lower, ymax = upper),
              alpha = 0.2, fill = "seagreen",
              inherit.aes = FALSE) +
  geom_line(data = total_grid,
            aes(x = fungicide_b, y = predicted),
            color = "black", size = 2,
            inherit.aes = FALSE) +
  theme_cowplot() +
  labs(
    y = "Average Anther Bruising",
    x = "Total Fungicides Applied (ml)"
  ) +
  annotate(
    geom = "text",
    x = 10000,
    y = 2.6,
    label = "P < 0.01",  # Replace with your actual P-value if you want
    size = 9
  ) +
  theme(
    axis.text = element_text(size = 24),
    axis.title = element_text(size = 24),
    text = element_text(size = 18)
  )

Pollination vs. insecticide

total_insec_mod1 <- glm(mean_pol ~ insecticide_1 + source + year, data = greenhouse_analysis)
Anova(total_insec_mod1)
## Analysis of Deviance Table (Type II tests)
## 
## Response: mean_pol
##               LR Chisq Df Pr(>Chisq)
## insecticide_1  0.09021  1     0.7639
## source         0.24497  1     0.6206
## year           1.15623  1     0.2822
total_insec_mod1
## 
## Call:  glm(formula = mean_pol ~ insecticide_1 + source + year, data = greenhouse_analysis)
## 
## Coefficients:
##   (Intercept)  insecticide_1      sourcekop       year2024  
##     1.985e+00      6.986e-07      5.665e-02      2.849e-01  
## 
## Degrees of Freedom: 5 Total (i.e. Null);  2 Residual
## Null Deviance:       0.08517 
## Residual Deviance: 0.0176    AIC: -7.962
summary(total_insec_mod1)
## 
## Call:
## glm(formula = mean_pol ~ insecticide_1 + source + year, data = greenhouse_analysis)
## 
## Coefficients:
##                Estimate Std. Error t value Pr(>|t|)  
## (Intercept)   1.985e+00  2.947e-01   6.736   0.0213 *
## insecticide_1 6.986e-07  2.326e-06   0.300   0.7923  
## sourcekop     5.665e-02  1.145e-01   0.495   0.6697  
## year2024      2.849e-01  2.650e-01   1.075   0.3947  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for gaussian family taken to be 0.008800879)
## 
##     Null deviance: 0.085167  on 5  degrees of freedom
## Residual deviance: 0.017602  on 2  degrees of freedom
## AIC: -7.9618
## 
## Number of Fisher Scoring iterations: 2
AIC(total_insec_mod1)
## [1] -7.961834
sim_resgh_insec <- simulateResiduals(fittedModel = total_insec_mod1)
qqnorm(resid(total_insec_mod1));qqline(resid(total_insec_mod1))

testUniformity(sim_resgh_insec)

## 
##  Exact one-sample Kolmogorov-Smirnov test
## 
## data:  simulationOutput$scaledResiduals
## D = 0.188, p-value = 0.9563
## alternative hypothesis: two-sided
testDispersion(sim_resgh_insec)

## 
##  DHARMa nonparametric dispersion test via sd of residuals fitted vs.
##  simulated
## 
## data:  simulationOutput
## dispersion = 0.40046, p-value = 0.296
## alternative hypothesis: two.sided
# Create a grid of insecticide_1 values for prediction
total_grid_insec <- data.frame(
  insecticide_1 = seq(
    min(greenhouse_analysis$insecticide_1, na.rm = TRUE),
    max(greenhouse_analysis$insecticide_1, na.rm = TRUE),
    length.out = 100
  ),
  source = factor(levels(greenhouse_analysis$source)[1], levels = levels(greenhouse_analysis$source)),
  year   = factor(levels(greenhouse_analysis$year)[1], levels = levels(greenhouse_analysis$year))
)

# Predict with standard errors (fixed effects only)
pred_total_insec <- predict(total_insec_mod1, newdata = total_grid_insec, se.fit = TRUE)
total_grid_insec$predicted <- pred_total_insec$fit
total_grid_insec$lower <- pred_total_insec$fit - 1.96 * pred_total_insec$se.fit
total_grid_insec$upper <- pred_total_insec$fit + 1.96 * pred_total_insec$se.fit

# Plot model with CI ribbon
ggplot(greenhouse_analysis, aes(x = insecticide_1, y = mean_pol)) +
  geom_point(shape = 21, size = 6, fill = "darkgreen", color = "black") +
  geom_ribbon(
    data = total_grid_insec,
    aes(x = insecticide_1, ymin = lower, ymax = upper),
    alpha = 0.2, fill = "darkgray",
    inherit.aes = FALSE
  ) +
  geom_line(
    data = total_grid_insec,
    aes(x = insecticide_1, y = predicted),
    color = "black", size = 2,
    inherit.aes = FALSE
  ) +
  scale_x_continuous(labels = scales::comma_format(accuracy = 1)) +  # avoid scientific notation
  theme_cowplot() +
  labs(
    y = "Average Anther Bruising",
    x = "Total Insecticides Applied (ml)"
  ) +
  annotate(
    geom = "text",
    x = 17000,
    y = 2.6,
    label = "P = 0.8",  # adjust if desired
    size = 10
  ) +
  theme(
    axis.text = element_text(size = 24),
    axis.title = element_text(size = 24),
    text = element_text(size = 18)
  )

Crithidia analysis

Crithidia vs. total chemicals applied

# Fit the binomial GLM using plain numeric total_applied
gh_ins_crith <- glm(
  cbind(total_crith, crith_neg) ~ total_applied + year + source,
  data = greenhouse_analysis,
  family = binomial("logit")
)

Anova(gh_ins_crith)
## Analysis of Deviance Table (Type II tests)
## 
## Response: cbind(total_crith, crith_neg)
##               LR Chisq Df Pr(>Chisq)    
## total_applied   49.182  1  2.332e-12 ***
## year            11.915  1  0.0005569 ***
## source           0.263  1  0.6080041    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# Create prediction grid
total_grid <- data.frame(
  total_applied = seq(
    min(greenhouse_analysis$total_applied, na.rm = TRUE),
    max(greenhouse_analysis$total_applied, na.rm = TRUE),
    length.out = 100
  ),
  source = factor(levels(greenhouse_analysis$source)[1], levels = levels(greenhouse_analysis$source)),
  year = factor(levels(greenhouse_analysis$year)[1], levels = levels(greenhouse_analysis$year))
)

# Predict on the link scale with SE
pred <- predict(
  gh_ins_crith,
  newdata = total_grid,
  type = "link",
  se.fit = TRUE
)

# Compute 95% CI on link scale and transform back to probability
inv_logit <- function(x) exp(x) / (1 + exp(x))
total_grid <- total_grid %>%
  mutate(
    fit_link = pred$fit,
    lower_link = fit_link - 1.96 * pred$se.fit,
    upper_link = fit_link + 1.96 * pred$se.fit,
    predicted = inv_logit(fit_link),
    lower = inv_logit(lower_link),
    upper = inv_logit(upper_link)
  )

# Plot
ggplot(greenhouse_analysis, aes(x = total_applied, y = total_crith / (total_crith + crith_neg))) +
  geom_point(shape = 21, size = 5, fill = "darkorchid", color = "black") +
  geom_ribbon(data = total_grid,
              aes(x = total_applied, ymin = lower, ymax = upper),
              alpha = 0.2, fill = "orchid",
              inherit.aes = FALSE) +
  geom_line(data = total_grid,
            aes(x = total_applied, y = predicted),
            color = "black", size = 1.5,
            inherit.aes = FALSE) +
  coord_cartesian(ylim = c(0, 1)) +  # set y-axis from 0 to 1
  theme_cowplot() +
  labs(
    y = "Average Crithidia Prevelance",
    x = "Total Pesticides Applied (ml)"
  ) +
  theme(
    axis.text = element_text(size = 24),
    axis.title = element_text(size = 24),
    text = element_text(size = 18)
  ) +
  annotate(geom = "text", 
           x = 45000,
           y = 1,
           label = "P < 0.001",
           size = 12)

Crithidia vs. fungicide

library(ggplot2)
library(dplyr)
library(cowplot)

greenhouse_analysis <- greenhouse_analysis %>%
  mutate(
    fungicide_1_sc = scale(fungicide_1),   # rescaled version
    # keep source and year as factors
    source = factor(source),
    year = factor(year)
  )

# Refit model (from before)
gh_ins_crith1_rescaled <- glmer(
  cbind(total_crith, crith_neg) ~ fungicide_1_sc + source + year + (1 | gh),
  data = greenhouse_analysis,
  family = binomial("logit"),
  control = glmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 2e5))
)

simres <- simulateResiduals(gh_ins_crith1_rescaled)
testDispersion(simres)

## 
##  DHARMa nonparametric dispersion test via sd of residuals fitted vs.
##  simulated
## 
## data:  simulationOutput
## dispersion = 0.98085, p-value = 0.952
## alternative hypothesis: two.sided
# Create prediction grid using the scaled variable
total_grid <- data.frame(
  fungicide_1_sc = seq(
    min(greenhouse_analysis$fungicide_1_sc, na.rm = TRUE),
    max(greenhouse_analysis$fungicide_1_sc, na.rm = TRUE),
    length.out = 100
  ),
  source = factor(levels(greenhouse_analysis$source)[1], levels = levels(greenhouse_analysis$source)),
  year = factor(levels(greenhouse_analysis$year)[1], levels = levels(greenhouse_analysis$year))
)

# Predict on link scale with SE
pred <- predict(
  gh_ins_crith1_rescaled,
  newdata = total_grid,
  type = "link",
  se.fit = TRUE,
  re.form = NA  # marginal prediction (average over random effects)
)
## Warning in predict.merMod(gh_ins_crith1_rescaled, newdata = total_grid, :
## se.fit computation uses an approximation to estimate the sampling distribution
## of the parameters
# Back-transform the scaled x-axis for plotting
fung_mean <- attr(greenhouse_analysis$fungicide_1_sc, "scaled:center")
fung_sd <- attr(greenhouse_analysis$fungicide_1_sc, "scaled:scale")
total_grid$fungicide_1 <- total_grid$fungicide_1_sc * fung_sd + fung_mean

# Compute 95% CI on link scale and transform back to probability
inv_logit <- function(x) exp(x) / (1 + exp(x))
total_grid <- total_grid %>%
  mutate(
    fit_link = pred$fit,
    lower_link = fit_link - 1.96 * pred$se.fit,
    upper_link = fit_link + 1.96 * pred$se.fit,
    predicted = inv_logit(fit_link),
    lower = inv_logit(lower_link),
    upper = inv_logit(upper_link)
  )

# Plot the model fit with CI
ggplot(greenhouse_analysis, aes(x = fungicide_1, y = total_crith / (total_crith + crith_neg))) +
  geom_point(shape = 21, size = 6, fill = "darkorchid", color = "black") +
  geom_ribbon(
    data = total_grid,
    aes(x = fungicide_1, ymin = lower, ymax = upper),
    alpha = 0.2, fill = "orchid",
    inherit.aes = FALSE
  ) +
  geom_line(
    data = total_grid,
    aes(x = fungicide_1, y = predicted),
    color = "black", size = 2,
    inherit.aes = FALSE
  ) +
  coord_cartesian(ylim = c(0, 1)) +
  theme_cowplot() +
  labs(
    y = "Average Crithidia Prevalence",
    x = "Total Fungicides Applied (ml)"
  ) +
  theme(
    axis.text = element_text(size = 24),
    axis.title = element_text(size = 24),
    text = element_text(size = 18)
  ) +
  annotate(
    geom = "text",
    x = 17000,
    y = 0.95,
    label = "P < 0.001",
    size = 10
  )

Crithidia vs. insecticide

# Rescale and refit model
greenhouse_analysis <- greenhouse_analysis %>%
  mutate(
    insecticide_1_sc = scale(insecticide_1),
    source = factor(source),
    year = factor(year)
  )

# Fit GLMM with scaled predictor
gh_ins_crith1_rescaled <- glmer(
  cbind(total_crith, crith_neg) ~ insecticide_1_sc + source + year + (1 | gh),
  data = greenhouse_analysis,
  family = binomial("logit"),
  control = glmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 2e5))
)

summary(gh_ins_crith1_rescaled)
## Generalized linear mixed model fit by maximum likelihood (Laplace
##   Approximation) [glmerMod]
##  Family: binomial  ( logit )
## Formula: cbind(total_crith, crith_neg) ~ insecticide_1_sc + source + year +  
##     (1 | gh)
##    Data: greenhouse_analysis
## Control: glmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 2e+05))
## 
##      AIC      BIC   logLik deviance df.resid 
##     60.8     59.7    -25.4     50.8        1 
## 
## Scaled residuals: 
##      Min       1Q   Median       3Q      Max 
## -0.29961 -0.16038  0.03638  0.15290  0.55952 
## 
## Random effects:
##  Groups Name        Variance Std.Dev.
##  gh     (Intercept) 0.4713   0.6865  
## Number of obs: 6, groups:  gh, 6
## 
## Fixed effects:
##                  Estimate Std. Error z value Pr(>|z|)   
## (Intercept)        3.4224     1.2917   2.650  0.00806 **
## insecticide_1_sc  -1.9379     1.1738  -1.651  0.09873 . 
## sourcekop         -2.9814     0.9208  -3.238  0.00120 **
## year2024          -4.5702     2.0754  -2.202  0.02766 * 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Correlation of Fixed Effects:
##             (Intr) ins_1_ sorckp
## insctcd_1_s -0.933              
## sourcekop   -0.794  0.728       
## year2024    -0.960  0.959  0.706
Anova(gh_ins_crith1_rescaled)
## Analysis of Deviance Table (Type II Wald chisquare tests)
## 
## Response: cbind(total_crith, crith_neg)
##                    Chisq Df Pr(>Chisq)   
## insecticide_1_sc  2.7259  1   0.098730 . 
## source           10.4843  1   0.001204 **
## year              4.8494  1   0.027655 * 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# Model diagnostics
sim_res_gh_in1 <- simulateResiduals(fittedModel = gh_ins_crith1_rescaled)
plot(sim_res_gh_in1)

testDispersion(sim_res_gh_in1)

## 
##  DHARMa nonparametric dispersion test via sd of residuals fitted vs.
##  simulated
## 
## data:  simulationOutput
## dispersion = 1.012, p-value = 0.896
## alternative hypothesis: two.sided
# Create prediction grid using scaled variable
total_grid <- data.frame(
  insecticide_1_sc = seq(
    min(greenhouse_analysis$insecticide_1_sc, na.rm = TRUE),
    max(greenhouse_analysis$insecticide_1_sc, na.rm = TRUE),
    length.out = 100
  ),
  source = factor(levels(greenhouse_analysis$source)[1], levels = levels(greenhouse_analysis$source)),
  year = factor(levels(greenhouse_analysis$year)[1], levels = levels(greenhouse_analysis$year))
)

# Predict on link scale with SE
pred <- predict(
  gh_ins_crith1_rescaled,
  newdata = total_grid,
  type = "link",
  se.fit = TRUE,
  re.form = NA  # marginal predictions
)
## Warning in predict.merMod(gh_ins_crith1_rescaled, newdata = total_grid, :
## se.fit computation uses an approximation to estimate the sampling distribution
## of the parameters
# Back-transform scaled variable to original units
insect_mean <- attr(greenhouse_analysis$insecticide_1_sc, "scaled:center")
insect_sd <- attr(greenhouse_analysis$insecticide_1_sc, "scaled:scale")
total_grid$insecticide_1 <- total_grid$insecticide_1_sc * insect_sd + insect_mean

# Compute 95% CI on link scale and back-transform to probability
inv_logit <- function(x) exp(x) / (1 + exp(x))
total_grid <- total_grid %>%
  mutate(
    fit_link = pred$fit,
    lower_link = fit_link - 1.96 * pred$se.fit,
    upper_link = fit_link + 1.96 * pred$se.fit,
    predicted = inv_logit(fit_link),
    lower = inv_logit(lower_link),
    upper = inv_logit(upper_link)
  )

# Final plot on ORIGINAL insecticide scale
ggplot(greenhouse_analysis, aes(x = insecticide_1, y = total_crith / (total_crith + crith_neg))) +
  geom_point(shape = 21, size = 6, fill = "darkorchid", color = "black") +
  geom_ribbon(
    data = total_grid,
    aes(x = insecticide_1, ymin = lower, ymax = upper),
    alpha = 0.2, fill = "darkgray",
    inherit.aes = FALSE
  ) +
  geom_line(
    data = total_grid,
    aes(x = insecticide_1, y = predicted),
    color = "black", size = 2,
    inherit.aes = FALSE
  ) +
  scale_x_continuous(
    labels = scales::comma_format(accuracy = 1),  # Show regular numbers with commas
    name = "Total Insecticides Applied (ml)"
  ) +
  coord_cartesian(ylim = c(0, 1.2)) +
  theme_cowplot() +
  labs(
    y = "Average Crithidia Prevalence"
  ) +
  theme(
    axis.text = element_text(size = 24),
    axis.title = element_text(size = 24),
    text = element_text(size = 18)
  ) +
  annotate(
    geom = "text",
    x = 20000,
    y = 1.2,
    label = "P = 0.1",
    size = 12
  ) 

LS0tDQp0aXRsZTogIkdyZWVuaG91c2UgRGF0YSBBbmFseXNpcyINCmF1dGhvcjogIkVtaWx5IFJ1bm5pb24iDQpkYXRlOiAiMjAyNS0wMS0yNCINCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDoNCiAgICB0b2M6IHRydWUNCiAgICB0b2NfZGVwdGg6IDQNCiAgICBudW1iZXJfc2VjdGlvbnM6IGZhbHNlDQogICAgdG9jX2Zsb2F0OiB0cnVlDQogICAgdGhlbWU6IGpvdXJuYWwNCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlDQotLS0NCg0KYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9DQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUpDQpgYGANCg0KDQpgYGB7ciBsb2FkIGxpYnJhcmllcywgaW5jbHVkZT1GQUxTRX0NCmxpYnJhcnkodmlyaWRpc0xpdGUpDQpsaWJyYXJ5KHN0YXRzKQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShjYXIpDQpsaWJyYXJ5KGVtbWVhbnMpDQpsaWJyYXJ5KE1BU1MpDQpsaWJyYXJ5KGxtZTQpDQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkoZHBseXIpDQpsaWJyYXJ5KHJlYWRyKQ0KbGlicmFyeSh2aXJpZGlzTGl0ZSkNCmxpYnJhcnkoc3RhdHMpDQpsaWJyYXJ5KERIQVJNYSkNCmxpYnJhcnkoZ2dwYXR0ZXJuKQ0KbGlicmFyeShrYWJsZUV4dHJhKQ0KbGlicmFyeShibG1lY28pDQoNCmxpYnJhcnkoY293cGxvdCkNCmxpYnJhcnkocGxvdGx5KQ0KbGlicmFyeShhZ3JpY29sYWUpIA0KbGlicmFyeShnZ3B1YnIpDQpsaWJyYXJ5KGdsdWUpDQpsaWJyYXJ5KG11bHRjb21wKQ0KbGlicmFyeShtdWx0Y29tcFZpZXcpDQpsaWJyYXJ5KGdsbW1UTUIpDQpsaWJyYXJ5KHJzdGF0aXgpDQpsaWJyYXJ5KGZpdGRpc3RycGx1cykNCmxpYnJhcnkobG9nc3BsaW5lKQ0KbGlicmFyeShHR2FsbHkpDQpsaWJyYXJ5KGRhdGEudGFibGUpDQoNCmBgYA0KDQoNCg0KIyA2IFBvaW50IERhdGEgQW5hbHlzaXMgDQoNCmdoID0gZmFjdG9yLCA2IHVuaXF1ZSBJRHMsIGVhY2ggZ3JlZW5ob3VzZSBjb2RlZCBhcyBhbiBpbmRpdmlkdWFsIGFuZCBzZXBlcmF0ZSBlbnRpdHkgDQpzb3VyY2UgPSBrb3BwZXJ0IG9yIGJpb2Jlc3QgDQo2IGRhdGEgcG9pbnRzIGZvciBhbGwgYW5hbHlzZXMgYXZlcmFnZWQgYWNyb3NzIGdyZWVuaG91c2UgDQoNCiMjIGlucHV0IGdyZWVuaG91c2UgZGF0YSANCg0KYGBge3J9DQpncmVlbmhvdXNlX2FuYWx5c2lzIDwtIHJlYWRfY3N2KCJncmVlbmhvdXNlX2FuYWx5c2lzLmNzdiIsIA0KICAgIGNvbF90eXBlcyA9IGNvbHMoeWVhciA9IGNvbF9mYWN0b3IobGV2ZWxzID0gYygiMjAyMiIsIA0KICAgICAgICAiMjAyNCIpKSwgZ2ggPSBjb2xfZmFjdG9yKGxldmVscyA9IGMoIjEiLCANCiAgICAgICAgIjIiLCAiMyIsICI0IiwgIjUiLCAiNiIpKSkpDQoNCmdyZWVuaG91c2VfYW5hbHlzaXMgPC0gZ3JlZW5ob3VzZV9hbmFseXNpcyAlPiUNCiAgbXV0YXRlKGFjcm9zcyhjKA0KICAgIGNvcmFnZW5fTCwgbGFsc3RvcF9rNjFfTCwgcHJldmljdXJmbGV4X0wsIHB5bG9uX0wsIGx1bmF0cmFucXVpbGl0eV9MLA0KICAgIHJvb3RzaGllbHBsdXNfTCwgbWlsc3RvcF9MLCBxdWFkcmlzdG9wX0wsIGF6YWd1YXJkX0wsIGJvdGFuaWdhcmQyMndwX0wsDQogICAgYm90YW5pZ2FyZGVzX0wsIGNhcHRpdmFwcmltZV9MLCBmb250ZWxpc19MLCBtcGVkZV9MLCBub2ZseV9MLCB2ZW5lcmF0ZWNnX0wsDQogICAgYmVsZWFmNTBzZ19MLCBlbnRydXN0c2NfTCwgZ3JvdHRvX0wNCiAgKSwgYXMubG9naWNhbCkpDQoNCmdyZWVuaG91c2VfYW5hbHlzaXMkc291cmNlIDwtIGFzLmZhY3RvcihncmVlbmhvdXNlX2FuYWx5c2lzJHNvdXJjZSkNCg0KYGBgDQoNCiMjIGxvb2sgYXQgZ2VuZXJhbCBkYXRhIHN0cnVjdHVyZSANCg0KDQpgYGB7ciwgZmlnLndpZHRoPTEwLCBmaWcuaGVpZ2h0PTEyfQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeSh0aWR5cikNCmxpYnJhcnkoZHBseXIpDQoNCiMgTGlzdCBvZiB5b3VyIGxvZ2ljYWwgdHJlYXRtZW50IHZhcmlhYmxlcw0KdHJlYXRfdmFycyA8LSBjKA0KICAiY29yYWdlbl9MIiwgImxhbHN0b3BfazYxX0wiLCAicHJldmljdXJmbGV4X0wiLCAicHlsb25fTCIsIA0KICAibHVuYXRyYW5xdWlsaXR5X0wiLCAicm9vdHNoaWVscGx1c19MIiwgIm1pbHN0b3BfTCIsICJxdWFkcmlzdG9wX0wiLCANCiAgImF6YWd1YXJkX0wiLCAiYm90YW5pZ2FyZDIyd3BfTCIsICJib3RhbmlnYXJkZXNfTCIsICJjYXB0aXZhcHJpbWVfTCIsIA0KICAiZm9udGVsaXNfTCIsICJtcGVkZV9MIiwgIm5vZmx5X0wiLCAidmVuZXJhdGVjZ19MIiwgImJlbGVhZjUwc2dfTCIsIA0KICAiZW50cnVzdHNjX0wiLCAiZ3JvdHRvX0wiDQopDQoNCiMgUmVzaGFwZSB0aGUgZGF0YSB0byBsb25nIGZvcm1hdA0KZ3JlZW5ob3VzZV9sb25nIDwtIGdyZWVuaG91c2VfYW5hbHlzaXMgJT4lDQogIHBpdm90X2xvbmdlcihjb2xzID0gYWxsX29mKHRyZWF0X3ZhcnMpLA0KICAgICAgICAgICAgICAgbmFtZXNfdG8gPSAidHJlYXRtZW50IiwNCiAgICAgICAgICAgICAgIHZhbHVlc190byA9ICJhcHBsaWVkIikNCg0KIyBDcmVhdGUgYm94cGxvdHMgb2YgY3JpdGhfcHJvcCB2cyBlYWNoIHRyZWF0bWVudA0KZ2dwbG90KGdyZWVuaG91c2VfbG9uZywgYWVzKHggPSBhcy5mYWN0b3IoYXBwbGllZCksIHkgPSBjcml0aF9wcm9wKSkgKw0KICBnZW9tX2JveHBsb3QoZmlsbCA9ICJncmF5OTAiLCBjb2xvciA9ICJibGFjayIsIG91dGxpZXIuc2hhcGUgPSAyMSkgKw0KICBmYWNldF93cmFwKH4gdHJlYXRtZW50LCBzY2FsZXMgPSAiZnJlZV95IiwgbmNvbCA9IDQpICsNCiAgbGFicygNCiAgICB4ID0gIkFwcGxpZWQgKFRSVUUgPSBUcmVhdGVkLCBGQUxTRSA9IENvbnRyb2wpIiwNCiAgICB5ID0gIkNyaXRoaWRpYSBpbmZlY3Rpb24gcHJvcG9ydGlvbiIsDQogICAgdGl0bGUgPSAiRWZmZWN0IG9mIGVhY2ggdHJlYXRtZW50IG9uIENyaXRoaWRpYSBpbmZlY3Rpb24iDQogICkgKw0KICB0aGVtZV9idyhiYXNlX3NpemUgPSAxNCkgKw0KICB0aGVtZSgNCiAgICBzdHJpcC50ZXh0ID0gZWxlbWVudF90ZXh0KGZhY2UgPSAiYm9sZCIpLA0KICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gMCwgaGp1c3QgPSAwLjUpDQogICkNCg0KDQpnZ3Bsb3QoZ3JlZW5ob3VzZV9sb25nLCBhZXMoeCA9IGFzLmZhY3RvcihhcHBsaWVkKSwgeSA9IG1lYW5fcG9sKSkgKw0KICBnZW9tX2JveHBsb3QoZmlsbCA9ICJncmF5OTAiLCBjb2xvciA9ICJibGFjayIsIG91dGxpZXIuc2hhcGUgPSAyMSkgKw0KICBmYWNldF93cmFwKH4gdHJlYXRtZW50LCBzY2FsZXMgPSAiZnJlZV95IiwgbmNvbCA9IDQpICsNCiAgbGFicygNCiAgICB4ID0gIkFwcGxpZWQgKFRSVUUgPSBUcmVhdGVkLCBGQUxTRSA9IENvbnRyb2wpIiwNCiAgICB5ID0gIk1lYW4gYW50aGVyIGJydWlzaW5nIiwNCiAgICB0aXRsZSA9ICJFZmZlY3Qgb2YgZWFjaCB0cmVhdG1lbnQgb24gbWVhbiBhbnRoZXIgYnJ1aXNpbmciDQogICkgKw0KICB0aGVtZV9idyhiYXNlX3NpemUgPSAxNCkgKw0KICB0aGVtZSgNCiAgICBzdHJpcC50ZXh0ID0gZWxlbWVudF90ZXh0KGZhY2UgPSAiYm9sZCIpLA0KICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gMCwgaGp1c3QgPSAwLjUpDQogICkNCg0KDQpnZ3Bsb3QoZ3JlZW5ob3VzZV9hbmFseXNpcywgYWVzKHg9Y3JpdGhfcHJvcCwgeSA9IHByb3BfMSkpICsNCiAgZ2VvbV9wb2ludChzaXplID0gMykgKyANCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImdsbSIsIHNlID0gVFJVRSwgc2l6ZSA9IDIpDQoNCmdncGxvdChncmVlbmhvdXNlX2FuYWx5c2lzLCBhZXMoeD10b3RhbF9hcHBsaWNhdGlvbiwgeSA9IHByb3BfMSkpICsNCiAgZ2VvbV9wb2ludChzaXplID0gMykgKyANCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImdsbSIsIHNlID0gVFJVRSwgc2l6ZSA9IDIpDQoNCmdncGxvdChncmVlbmhvdXNlX2FuYWx5c2lzLCBhZXMoeD10b3RhbF9hcHBsaWNhdGlvbiwgeSA9IHByb3BfMikpICsNCiAgZ2VvbV9wb2ludChzaXplID0gMykgKyANCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImdsbSIsIHNlID0gVFJVRSwgc2l6ZSA9IDIpDQoNCmdncGxvdChncmVlbmhvdXNlX2FuYWx5c2lzLCBhZXMoeD10b3RhbF9hcHBsaWNhdGlvbiwgeSA9IHByb3BfMykpICsNCiAgZ2VvbV9wb2ludChzaXplID0gMykgKyANCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImdsbSIsIHNlID0gVFJVRSwgc2l6ZSA9IDIpDQoNCmdncGxvdChncmVlbmhvdXNlX2FuYWx5c2lzLCBhZXMoeD10b3RhbF9hcHBsaWNhdGlvbiwgeSA9IG1lYW5fcG9sKSkgKw0KICBnZW9tX3BvaW50KHNpemUgPSAzKSArIA0KICBnZW9tX3Ntb290aChtZXRob2QgPSAiZ2xtIiwgc2UgPSBUUlVFLCBzaXplID0gMikNCg0KZ2dwbG90KGdyZWVuaG91c2VfYW5hbHlzaXMsIGFlcyh4PXNvdXJjZSwgeSA9IG1lYW5fcG9sLCBmaWxsID0gc291cmNlKSkgKw0KICBnZW9tX2JveHBsb3QoKQ0KDQpnZ3Bsb3QoZ3JlZW5ob3VzZV9hbmFseXNpcywgYWVzKHg9c291cmNlLCB5ID0gY3JpdGhfcHJvcCwgZmlsbCA9IHNvdXJjZSkpICsNCiAgZ2VvbV9ib3hwbG90KCkNCg0KYGBgDQoNCg0KDQojIyBDcml0aGlkaWEgdnMuIGluZGl2aWR1YWwgYXBwbGllZCBwZXN0aWNpZGUgcHJlc2VuY2UvYWJzZW5jZSANCg0KYGBge3IsIGZpZy53aWR0aD0xMiwgZmlnLmhlaWdodD0xMH0NCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkoZHBseXIpDQoNCiMgU3VtbWFyaXplIHRoZSBkYXRhDQpncmVlbmhvdXNlX3N1bW1hcnkgPC0gZ3JlZW5ob3VzZV9sb25nICU+JQ0KICBncm91cF9ieShhcHBsaWVkLCB0cmVhdG1lbnQpICU+JQ0KICBzdW1tYXJpc2UoDQogICAgbWVhbl9jcml0aCA9IG1lYW4oY3JpdGhfcHJvcCwgbmEucm0gPSBUUlVFKSwNCiAgICBzZV9jcml0aCA9IHNkKGNyaXRoX3Byb3AsIG5hLnJtID0gVFJVRSkvc3FydChuKCkpLA0KICAgIC5ncm91cHMgPSAiZHJvcCINCiAgKQ0KDQojIEJhciBwbG90DQpnZ3Bsb3QoZ3JlZW5ob3VzZV9zdW1tYXJ5LCBhZXMoeCA9IHRyZWF0bWVudCwgeSA9IG1lYW5fY3JpdGgsIGZpbGwgPSBhcHBsaWVkKSkgKw0KICBnZW9tX2NvbChwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC44KSwgY29sb3IgPSAiYmxhY2siKSArDQogIGdlb21fZXJyb3JiYXIoYWVzKHltaW4gPSBtZWFuX2NyaXRoIC0gc2VfY3JpdGgsIHltYXggPSBtZWFuX2NyaXRoICsgc2VfY3JpdGgpLA0KICAgICAgICAgICAgICAgIHdpZHRoID0gMC4yLCBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC44KSkgKw0KICBsYWJzKA0KICAgIHggPSAiUGVzdGljaWRlIiwNCiAgICB5ID0gIk1lYW4gQ3JpdGhpZGlhIGluZmVjdGlvbiBwcm9wb3J0aW9uIiwNCiAgICB0aXRsZSA9ICJFZmZlY3Qgb2YgZWFjaCB0cmVhdG1lbnQgb24gQ3JpdGhpZGlhIGluZmVjdGlvbiINCiAgKSArDQogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoIkZBTFNFIiA9ICJncmF5NzAiLCAiVFJVRSIgPSAic2t5Ymx1ZSIpLCANCiAgICAgICAgICAgICAgICAgICAgbmFtZSA9ICJBcHBsaWVkIikgKw0KICB0aGVtZV9idyhiYXNlX3NpemUgPSAxNCkgKw0KICB0aGVtZSgNCiAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIGZhY2UgPSAiYm9sZCIpLA0KICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJ0b3AiDQogICkNCg0KYGBgDQoNCiMjIFBvbGxpbmF0aW9uIGFuYWx5c2lzIA0KDQojIyMgUG9sbGluYXRpb24gc2NvcmUgdnMuIENyaXRoaWRpYSANCg0KYGBge3IsIGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD02LCBkcGk9NjAwfQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkobG1lNCkNCmxpYnJhcnkoY293cGxvdCkNCg0KIyBGaXQgbW9kZWwNCmNyaXRoX21vZDEgPC0gZ2xtKG1lYW5fcG9sIH4gY3JpdGhfcHJvcCArIHNvdXJjZSArIHllYXIsIGRhdGEgPSBncmVlbmhvdXNlX2FuYWx5c2lzKQ0KQW5vdmEoY3JpdGhfbW9kMSkNCg0Kc3VtbWFyeShjcml0aF9tb2QxKQ0KQUlDKGNyaXRoX21vZDEpDQpzaW1fcmVzZ2hfY20gPC0gc2ltdWxhdGVSZXNpZHVhbHMoZml0dGVkTW9kZWwgPSBjcml0aF9tb2QxKQ0KcGxvdChzaW1fcmVzZ2hfY20pDQp0ZXN0RGlzcGVyc2lvbihjcml0aF9tb2QxKQ0KDQojIENyZWF0ZSBhIGdyaWQgb2YgY3JpdGhfcHJvcCB2YWx1ZXMNCmNyaXRoX2dyaWQgPC0gZGF0YS5mcmFtZSgNCiAgY3JpdGhfcHJvcCA9IHNlcShtaW4oZ3JlZW5ob3VzZV9hbmFseXNpcyRjcml0aF9wcm9wLCBuYS5ybSA9IFRSVUUpLA0KICAgICAgICAgICAgICAgICAgIG1heChncmVlbmhvdXNlX2FuYWx5c2lzJGNyaXRoX3Byb3AsIG5hLnJtID0gVFJVRSksDQogICAgICAgICAgICAgICAgICAgbGVuZ3RoLm91dCA9IDEwMCksDQogIHNvdXJjZSA9IGZhY3RvcihsZXZlbHMoZ3JlZW5ob3VzZV9hbmFseXNpcyRzb3VyY2UpWzFdLCBsZXZlbHMgPSBsZXZlbHMoZ3JlZW5ob3VzZV9hbmFseXNpcyRzb3VyY2UpKSwNCiAgeWVhciAgID0gZmFjdG9yKGxldmVscyhncmVlbmhvdXNlX2FuYWx5c2lzJHllYXIpWzFdLCBsZXZlbHMgPSBsZXZlbHMoZ3JlZW5ob3VzZV9hbmFseXNpcyR5ZWFyKSkNCikNCg0KIyBQcmVkaWN0IHdpdGggc3RhbmRhcmQgZXJyb3JzIChmaXhlZCBlZmZlY3RzIG9ubHkpDQpwcmVkIDwtIHByZWRpY3QoY3JpdGhfbW9kMSwgbmV3ZGF0YSA9IGNyaXRoX2dyaWQsIHJlLmZvcm0gPSBOQSwgc2UuZml0ID0gVFJVRSkNCmNyaXRoX2dyaWQkcHJlZGljdGVkIDwtIHByZWQkZml0DQpjcml0aF9ncmlkJGxvd2VyIDwtIHByZWQkZml0IC0gMS45NiAqIHByZWQkc2UuZml0DQpjcml0aF9ncmlkJHVwcGVyIDwtIHByZWQkZml0ICsgMS45NiAqIHByZWQkc2UuZml0DQoNCiMgUGxvdCB3aXRoIENJIHJpYmJvbg0KZ2dwbG90KGdyZWVuaG91c2VfYW5hbHlzaXMsIGFlcyh4ID0gY3JpdGhfcHJvcCwgeSA9IG1lYW5fcG9sKSkgKw0KICBnZW9tX3BvaW50KHNoYXBlID0gMjEsIHNpemUgPSA2LCBmaWxsID0gImRhcmtncmVlbiIsIGNvbG9yID0gImJsYWNrIikgKw0KICBnZW9tX3JpYmJvbihkYXRhID0gY3JpdGhfZ3JpZCwNCiAgICAgICAgICAgICAgYWVzKHggPSBjcml0aF9wcm9wLCB5bWluID0gbG93ZXIsIHltYXggPSB1cHBlciksDQogICAgICAgICAgICAgIGFscGhhID0gMC4yLCBmaWxsID0gImRhcmtncmF5IiwNCiAgICAgICAgICAgICAgaW5oZXJpdC5hZXMgPSBGQUxTRSkgKyAgIyA8LS0gcHJldmVudCBpbmhlcml0aW5nIHkgPSBtZWFuX3BvbA0KICBnZW9tX2xpbmUoZGF0YSA9IGNyaXRoX2dyaWQsDQogICAgICAgICAgICBhZXMoeCA9IGNyaXRoX3Byb3AsIHkgPSBwcmVkaWN0ZWQpLA0KICAgICAgICAgICAgY29sb3IgPSAiYmxhY2siLCBzaXplID0gMiwNCiAgICAgICAgICAgIGluaGVyaXQuYWVzID0gRkFMU0UpICsNCiAgdGhlbWVfY293cGxvdCgpICsNCiAgbGFicygNCiAgICB5ID0gIkF2ZXJhZ2UgQW50aGVyIEJydWlzaW5nIiwNCiAgICB4ID0gIkF2ZXJhZ2UgUHJvcG9ydGlvbiBDcml0aGlkaWEiDQogICkgKw0KICBhbm5vdGF0ZSgNCiAgICBnZW9tID0gInRleHQiLA0KICAgIHggPSAwLjIsDQogICAgeSA9IDIuNSwNCiAgICBsYWJlbCA9ICJQID0gMC4wOCIsDQogICAgc2l6ZSA9IDEyDQogICkgKw0KICB0aGVtZSgNCiAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDI0KSwNCiAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAyNCksDQogICAgdGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTgpDQogICkNCg0KYGBgDQoNCiMjIyBQb2xsaW5hdGlvbiB2cy4gdG90YWwgY2hlbWljYWxzIGFwcGxpZWQgDQoNCmBgYHtyLCBmaWcud2lkdGg9MTAsIGZpZy5oZWlnaHQ9NiwgZHBpPTYwMH0NCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkoZHBseXIpDQpsaWJyYXJ5KGxtZTQpDQpsaWJyYXJ5KGNvd3Bsb3QpDQoNCiMgRml0IHRoZSBtb2RlbA0KdG90YWxfYXBwbGllZF9tb2QxIDwtIGdsbShtZWFuX3BvbCB+IHRvdGFsX2FwcGxpZWQgKyBzb3VyY2UgKyB5ZWFyLCBkYXRhID0gZ3JlZW5ob3VzZV9hbmFseXNpcykNCkFub3ZhKHRvdGFsX2FwcGxpZWRfbW9kMSkNCg0KDQpzdW1tYXJ5KHRvdGFsX2FwcGxpZWRfbW9kMSkNCnNpbV9yZXNnaF90dCA8LSBzaW11bGF0ZVJlc2lkdWFscyhmaXR0ZWRNb2RlbCA9IHRvdGFsX2FwcGxpZWRfbW9kMSkNCnBsb3Qoc2ltX3Jlc2doX3R0KQ0KdGVzdERpc3BlcnNpb24odG90YWxfYXBwbGllZF9tb2QxKQ0KDQoNCiMgQ3JlYXRlIGEgZ3JpZCBvZiB0b3RhbF9hcHBsaWVkIHZhbHVlcw0KdG90YWxfZ3JpZCA8LSBkYXRhLmZyYW1lKA0KICB0b3RhbF9hcHBsaWVkID0gc2VxKG1pbihncmVlbmhvdXNlX2FuYWx5c2lzJHRvdGFsX2FwcGxpZWQsIG5hLnJtID0gVFJVRSksDQogICAgICAgICAgICAgICAgICAgICAgbWF4KGdyZWVuaG91c2VfYW5hbHlzaXMkdG90YWxfYXBwbGllZCwgbmEucm0gPSBUUlVFKSwNCiAgICAgICAgICAgICAgICAgICAgICBsZW5ndGgub3V0ID0gMTAwKSwNCiAgc291cmNlID0gZmFjdG9yKGxldmVscyhncmVlbmhvdXNlX2FuYWx5c2lzJHNvdXJjZSlbMV0sIGxldmVscyA9IGxldmVscyhncmVlbmhvdXNlX2FuYWx5c2lzJHNvdXJjZSkpLA0KICB5ZWFyICAgPSBmYWN0b3IobGV2ZWxzKGdyZWVuaG91c2VfYW5hbHlzaXMkeWVhcilbMV0sIGxldmVscyA9IGxldmVscyhncmVlbmhvdXNlX2FuYWx5c2lzJHllYXIpKQ0KKQ0KDQojIFByZWRpY3Qgd2l0aCBzdGFuZGFyZCBlcnJvcnMgKGZpeGVkIGVmZmVjdHMgb25seSkNCnByZWRfdG90YWwgPC0gcHJlZGljdCh0b3RhbF9hcHBsaWVkX21vZDEsIG5ld2RhdGEgPSB0b3RhbF9ncmlkLCByZS5mb3JtID0gTkEsIHNlLmZpdCA9IFRSVUUpDQp0b3RhbF9ncmlkJHByZWRpY3RlZCA8LSBwcmVkX3RvdGFsJGZpdA0KdG90YWxfZ3JpZCRsb3dlciA8LSBwcmVkX3RvdGFsJGZpdCAtIDEuOTYgKiBwcmVkX3RvdGFsJHNlLmZpdA0KdG90YWxfZ3JpZCR1cHBlciA8LSBwcmVkX3RvdGFsJGZpdCArIDEuOTYgKiBwcmVkX3RvdGFsJHNlLmZpdA0KDQojIFBsb3Qgd2l0aCBDSSByaWJib24NCmdncGxvdChncmVlbmhvdXNlX2FuYWx5c2lzLCBhZXMoeCA9IHRvdGFsX2FwcGxpZWQsIHkgPSBtZWFuX3BvbCkpICsNCiAgZ2VvbV9wb2ludChzaGFwZSA9IDIxLCBzaXplID0gNiwgZmlsbCA9ICJkYXJrZ3JlZW4iLCBjb2xvciA9ICJibGFjayIpICsNCiAgZ2VvbV9yaWJib24oZGF0YSA9IHRvdGFsX2dyaWQsDQogICAgICAgICAgICAgIGFlcyh4ID0gdG90YWxfYXBwbGllZCwgeW1pbiA9IGxvd2VyLCB5bWF4ID0gdXBwZXIpLA0KICAgICAgICAgICAgICBhbHBoYSA9IDAuMiwgZmlsbCA9ICJzZWFncmVlbiIsDQogICAgICAgICAgICAgIGluaGVyaXQuYWVzID0gRkFMU0UpICsNCiAgZ2VvbV9saW5lKGRhdGEgPSB0b3RhbF9ncmlkLA0KICAgICAgICAgICAgYWVzKHggPSB0b3RhbF9hcHBsaWVkLCB5ID0gcHJlZGljdGVkKSwNCiAgICAgICAgICAgIGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDIsDQogICAgICAgICAgICBpbmhlcml0LmFlcyA9IEZBTFNFKSArDQogIHRoZW1lX2Nvd3Bsb3QoKSArDQogIGxhYnMoDQogICAgeSA9ICJBdmVyYWdlIEFudGhlciBCcnVpc2luZyIsDQogICAgeCA9ICJUb3RhbCBQZXN0aWNpZGVzIEFwcGxpZWQgKG1sKSINCiAgKSArDQogIGFubm90YXRlKA0KICAgIGdlb20gPSAidGV4dCIsDQogICAgeCA9IG1pbihncmVlbmhvdXNlX2FuYWx5c2lzJHRvdGFsX2FwcGxpZWQpICsgMC4xICogZGlmZihyYW5nZShncmVlbmhvdXNlX2FuYWx5c2lzJHRvdGFsX2FwcGxpZWQpKSwNCiAgICB5ID0gMi43LA0KICAgIGxhYmVsID0gIlAgPCAwLjAxIiwgICMgUmVwbGFjZSB3aXRoIHlvdXIgYWN0dWFsIFAtdmFsdWUgaWYgeW91IHdhbnQNCiAgICBzaXplID0gMTINCiAgKSArDQogIHRoZW1lKA0KICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMjQpLA0KICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDI0KSwNCiAgICB0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxOCkNCiAgKQ0KDQpgYGANCg0KIyMjIFBvbGxpbmF0aW9uIHZzLiBmdW5naWNpZGUgDQoNCmBgYHtyLCBmaWcud2lkdGg9MTAsIGZpZy5oZWlnaHQ9NiwgZHBpPTYwMH0NCnRvdGFsX2Z1bmdfbW9kMSA8LSBnbG0obWVhbl9wb2wgfiBmdW5naWNpZGVfYiArIHNvdXJjZSArIHllYXIsIGRhdGEgPSBncmVlbmhvdXNlX2FuYWx5c2lzKQ0KQW5vdmEodG90YWxfZnVuZ19tb2QxKQ0KdG90YWxfZnVuZ19tb2QxDQoNCnN1bW1hcnkodG90YWxfZnVuZ19tb2QxKQ0KQUlDKHRvdGFsX2Z1bmdfbW9kMSkNCnNpbV9yZXNnaF9mdW5nIDwtIHNpbXVsYXRlUmVzaWR1YWxzKGZpdHRlZE1vZGVsID0gdG90YWxfZnVuZ19tb2QxKQ0KcXFub3JtKHJlc2lkKHRvdGFsX2Z1bmdfbW9kMSkpO3FxbGluZShyZXNpZCh0b3RhbF9mdW5nX21vZDEpKQ0KdGVzdFVuaWZvcm1pdHkoc2ltX3Jlc2doX2Z1bmcpDQp0ZXN0RGlzcGVyc2lvbihzaW1fcmVzZ2hfZnVuZykNCg0KDQojIENyZWF0ZSBhIGdyaWQgb2YgdG90YWxfYXBwbGllZCB2YWx1ZXMNCnRvdGFsX2dyaWQgPC0gZGF0YS5mcmFtZSgNCiAgZnVuZ2ljaWRlX2IgPSBzZXEobWluKGdyZWVuaG91c2VfYW5hbHlzaXMkZnVuZ2ljaWRlX2IsIG5hLnJtID0gVFJVRSksDQogICAgICAgICAgICAgICAgICAgICAgbWF4KGdyZWVuaG91c2VfYW5hbHlzaXMkZnVuZ2ljaWRlX2IsIG5hLnJtID0gVFJVRSksDQogICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoLm91dCA9IDEwMCksDQogIHNvdXJjZSA9IGZhY3RvcihsZXZlbHMoZ3JlZW5ob3VzZV9hbmFseXNpcyRzb3VyY2UpWzFdLCBsZXZlbHMgPSBsZXZlbHMoZ3JlZW5ob3VzZV9hbmFseXNpcyRzb3VyY2UpKSwNCiAgeWVhciAgID0gZmFjdG9yKGxldmVscyhncmVlbmhvdXNlX2FuYWx5c2lzJHllYXIpWzFdLCBsZXZlbHMgPSBsZXZlbHMoZ3JlZW5ob3VzZV9hbmFseXNpcyR5ZWFyKSkNCikNCg0KIyBQcmVkaWN0IHdpdGggc3RhbmRhcmQgZXJyb3JzIChmaXhlZCBlZmZlY3RzIG9ubHkpDQpwcmVkX3RvdGFsIDwtIHByZWRpY3QodG90YWxfZnVuZ19tb2QxLCBuZXdkYXRhID0gdG90YWxfZ3JpZCwgcmUuZm9ybSA9IE5BLCBzZS5maXQgPSBUUlVFKQ0KdG90YWxfZ3JpZCRwcmVkaWN0ZWQgPC0gcHJlZF90b3RhbCRmaXQNCnRvdGFsX2dyaWQkbG93ZXIgPC0gcHJlZF90b3RhbCRmaXQgLSAxLjk2ICogcHJlZF90b3RhbCRzZS5maXQNCnRvdGFsX2dyaWQkdXBwZXIgPC0gcHJlZF90b3RhbCRmaXQgKyAxLjk2ICogcHJlZF90b3RhbCRzZS5maXQNCg0KIyBQbG90IHdpdGggQ0kgcmliYm9uDQpnZ3Bsb3QoZ3JlZW5ob3VzZV9hbmFseXNpcywgYWVzKHggPSBmdW5naWNpZGVfYiwgeSA9IG1lYW5fcG9sKSkgKw0KICBnZW9tX3BvaW50KHNoYXBlID0gMjEsIHNpemUgPSA2LCBmaWxsID0gImRhcmtncmVlbiIsIGNvbG9yID0gImJsYWNrIikgKw0KICBnZW9tX3JpYmJvbihkYXRhID0gdG90YWxfZ3JpZCwNCiAgICAgICAgICAgICAgYWVzKHggPSBmdW5naWNpZGVfYiwgeW1pbiA9IGxvd2VyLCB5bWF4ID0gdXBwZXIpLA0KICAgICAgICAgICAgICBhbHBoYSA9IDAuMiwgZmlsbCA9ICJzZWFncmVlbiIsDQogICAgICAgICAgICAgIGluaGVyaXQuYWVzID0gRkFMU0UpICsNCiAgZ2VvbV9saW5lKGRhdGEgPSB0b3RhbF9ncmlkLA0KICAgICAgICAgICAgYWVzKHggPSBmdW5naWNpZGVfYiwgeSA9IHByZWRpY3RlZCksDQogICAgICAgICAgICBjb2xvciA9ICJibGFjayIsIHNpemUgPSAyLA0KICAgICAgICAgICAgaW5oZXJpdC5hZXMgPSBGQUxTRSkgKw0KICB0aGVtZV9jb3dwbG90KCkgKw0KICBsYWJzKA0KICAgIHkgPSAiQXZlcmFnZSBBbnRoZXIgQnJ1aXNpbmciLA0KICAgIHggPSAiVG90YWwgRnVuZ2ljaWRlcyBBcHBsaWVkIChtbCkiDQogICkgKw0KICBhbm5vdGF0ZSgNCiAgICBnZW9tID0gInRleHQiLA0KICAgIHggPSAxMDAwMCwNCiAgICB5ID0gMi42LA0KICAgIGxhYmVsID0gIlAgPCAwLjAxIiwgICMgUmVwbGFjZSB3aXRoIHlvdXIgYWN0dWFsIFAtdmFsdWUgaWYgeW91IHdhbnQNCiAgICBzaXplID0gOQ0KICApICsNCiAgdGhlbWUoDQogICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAyNCksDQogICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMjQpLA0KICAgIHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE4KQ0KICApDQoNCmBgYA0KDQoNCiMjIyBQb2xsaW5hdGlvbiB2cy4gaW5zZWN0aWNpZGUNCg0KYGBge3IsIGZpZy5oZWlnaHQ9MTAsIGZpZy5oZWlnaHQ9NiwgZHBpPTYwMH0NCnRvdGFsX2luc2VjX21vZDEgPC0gZ2xtKG1lYW5fcG9sIH4gaW5zZWN0aWNpZGVfMSArIHNvdXJjZSArIHllYXIsIGRhdGEgPSBncmVlbmhvdXNlX2FuYWx5c2lzKQ0KQW5vdmEodG90YWxfaW5zZWNfbW9kMSkNCnRvdGFsX2luc2VjX21vZDENCg0Kc3VtbWFyeSh0b3RhbF9pbnNlY19tb2QxKQ0KQUlDKHRvdGFsX2luc2VjX21vZDEpDQpzaW1fcmVzZ2hfaW5zZWMgPC0gc2ltdWxhdGVSZXNpZHVhbHMoZml0dGVkTW9kZWwgPSB0b3RhbF9pbnNlY19tb2QxKQ0KcXFub3JtKHJlc2lkKHRvdGFsX2luc2VjX21vZDEpKTtxcWxpbmUocmVzaWQodG90YWxfaW5zZWNfbW9kMSkpDQp0ZXN0VW5pZm9ybWl0eShzaW1fcmVzZ2hfaW5zZWMpDQp0ZXN0RGlzcGVyc2lvbihzaW1fcmVzZ2hfaW5zZWMpDQoNCg0KIyBDcmVhdGUgYSBncmlkIG9mIGluc2VjdGljaWRlXzEgdmFsdWVzIGZvciBwcmVkaWN0aW9uDQp0b3RhbF9ncmlkX2luc2VjIDwtIGRhdGEuZnJhbWUoDQogIGluc2VjdGljaWRlXzEgPSBzZXEoDQogICAgbWluKGdyZWVuaG91c2VfYW5hbHlzaXMkaW5zZWN0aWNpZGVfMSwgbmEucm0gPSBUUlVFKSwNCiAgICBtYXgoZ3JlZW5ob3VzZV9hbmFseXNpcyRpbnNlY3RpY2lkZV8xLCBuYS5ybSA9IFRSVUUpLA0KICAgIGxlbmd0aC5vdXQgPSAxMDANCiAgKSwNCiAgc291cmNlID0gZmFjdG9yKGxldmVscyhncmVlbmhvdXNlX2FuYWx5c2lzJHNvdXJjZSlbMV0sIGxldmVscyA9IGxldmVscyhncmVlbmhvdXNlX2FuYWx5c2lzJHNvdXJjZSkpLA0KICB5ZWFyICAgPSBmYWN0b3IobGV2ZWxzKGdyZWVuaG91c2VfYW5hbHlzaXMkeWVhcilbMV0sIGxldmVscyA9IGxldmVscyhncmVlbmhvdXNlX2FuYWx5c2lzJHllYXIpKQ0KKQ0KDQojIFByZWRpY3Qgd2l0aCBzdGFuZGFyZCBlcnJvcnMgKGZpeGVkIGVmZmVjdHMgb25seSkNCnByZWRfdG90YWxfaW5zZWMgPC0gcHJlZGljdCh0b3RhbF9pbnNlY19tb2QxLCBuZXdkYXRhID0gdG90YWxfZ3JpZF9pbnNlYywgc2UuZml0ID0gVFJVRSkNCnRvdGFsX2dyaWRfaW5zZWMkcHJlZGljdGVkIDwtIHByZWRfdG90YWxfaW5zZWMkZml0DQp0b3RhbF9ncmlkX2luc2VjJGxvd2VyIDwtIHByZWRfdG90YWxfaW5zZWMkZml0IC0gMS45NiAqIHByZWRfdG90YWxfaW5zZWMkc2UuZml0DQp0b3RhbF9ncmlkX2luc2VjJHVwcGVyIDwtIHByZWRfdG90YWxfaW5zZWMkZml0ICsgMS45NiAqIHByZWRfdG90YWxfaW5zZWMkc2UuZml0DQoNCiMgUGxvdCBtb2RlbCB3aXRoIENJIHJpYmJvbg0KZ2dwbG90KGdyZWVuaG91c2VfYW5hbHlzaXMsIGFlcyh4ID0gaW5zZWN0aWNpZGVfMSwgeSA9IG1lYW5fcG9sKSkgKw0KICBnZW9tX3BvaW50KHNoYXBlID0gMjEsIHNpemUgPSA2LCBmaWxsID0gImRhcmtncmVlbiIsIGNvbG9yID0gImJsYWNrIikgKw0KICBnZW9tX3JpYmJvbigNCiAgICBkYXRhID0gdG90YWxfZ3JpZF9pbnNlYywNCiAgICBhZXMoeCA9IGluc2VjdGljaWRlXzEsIHltaW4gPSBsb3dlciwgeW1heCA9IHVwcGVyKSwNCiAgICBhbHBoYSA9IDAuMiwgZmlsbCA9ICJkYXJrZ3JheSIsDQogICAgaW5oZXJpdC5hZXMgPSBGQUxTRQ0KICApICsNCiAgZ2VvbV9saW5lKA0KICAgIGRhdGEgPSB0b3RhbF9ncmlkX2luc2VjLA0KICAgIGFlcyh4ID0gaW5zZWN0aWNpZGVfMSwgeSA9IHByZWRpY3RlZCksDQogICAgY29sb3IgPSAiYmxhY2siLCBzaXplID0gMiwNCiAgICBpbmhlcml0LmFlcyA9IEZBTFNFDQogICkgKw0KICBzY2FsZV94X2NvbnRpbnVvdXMobGFiZWxzID0gc2NhbGVzOjpjb21tYV9mb3JtYXQoYWNjdXJhY3kgPSAxKSkgKyAgIyBhdm9pZCBzY2llbnRpZmljIG5vdGF0aW9uDQogIHRoZW1lX2Nvd3Bsb3QoKSArDQogIGxhYnMoDQogICAgeSA9ICJBdmVyYWdlIEFudGhlciBCcnVpc2luZyIsDQogICAgeCA9ICJUb3RhbCBJbnNlY3RpY2lkZXMgQXBwbGllZCAobWwpIg0KICApICsNCiAgYW5ub3RhdGUoDQogICAgZ2VvbSA9ICJ0ZXh0IiwNCiAgICB4ID0gMTcwMDAsDQogICAgeSA9IDIuNiwNCiAgICBsYWJlbCA9ICJQID0gMC44IiwgICMgYWRqdXN0IGlmIGRlc2lyZWQNCiAgICBzaXplID0gMTANCiAgKSArDQogIHRoZW1lKA0KICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMjQpLA0KICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDI0KSwNCiAgICB0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxOCkNCiAgKQ0KYGBgDQoNCiMjIENyaXRoaWRpYSBhbmFseXNpcyANCg0KIyMjIENyaXRoaWRpYSB2cy4gdG90YWwgY2hlbWljYWxzIGFwcGxpZWQgDQoNCmBgYHtyLCBmaWcuaGVpZ2h0PTEwLCBmaWcuaGVpZ2h0PTYsIGRwaT02MDB9DQojIEZpdCB0aGUgYmlub21pYWwgR0xNIHVzaW5nIHBsYWluIG51bWVyaWMgdG90YWxfYXBwbGllZA0KZ2hfaW5zX2NyaXRoIDwtIGdsbSgNCiAgY2JpbmQodG90YWxfY3JpdGgsIGNyaXRoX25lZykgfiB0b3RhbF9hcHBsaWVkICsgeWVhciArIHNvdXJjZSwNCiAgZGF0YSA9IGdyZWVuaG91c2VfYW5hbHlzaXMsDQogIGZhbWlseSA9IGJpbm9taWFsKCJsb2dpdCIpDQopDQoNCkFub3ZhKGdoX2luc19jcml0aCkNCg0KDQojIENyZWF0ZSBwcmVkaWN0aW9uIGdyaWQNCnRvdGFsX2dyaWQgPC0gZGF0YS5mcmFtZSgNCiAgdG90YWxfYXBwbGllZCA9IHNlcSgNCiAgICBtaW4oZ3JlZW5ob3VzZV9hbmFseXNpcyR0b3RhbF9hcHBsaWVkLCBuYS5ybSA9IFRSVUUpLA0KICAgIG1heChncmVlbmhvdXNlX2FuYWx5c2lzJHRvdGFsX2FwcGxpZWQsIG5hLnJtID0gVFJVRSksDQogICAgbGVuZ3RoLm91dCA9IDEwMA0KICApLA0KICBzb3VyY2UgPSBmYWN0b3IobGV2ZWxzKGdyZWVuaG91c2VfYW5hbHlzaXMkc291cmNlKVsxXSwgbGV2ZWxzID0gbGV2ZWxzKGdyZWVuaG91c2VfYW5hbHlzaXMkc291cmNlKSksDQogIHllYXIgPSBmYWN0b3IobGV2ZWxzKGdyZWVuaG91c2VfYW5hbHlzaXMkeWVhcilbMV0sIGxldmVscyA9IGxldmVscyhncmVlbmhvdXNlX2FuYWx5c2lzJHllYXIpKQ0KKQ0KDQojIFByZWRpY3Qgb24gdGhlIGxpbmsgc2NhbGUgd2l0aCBTRQ0KcHJlZCA8LSBwcmVkaWN0KA0KICBnaF9pbnNfY3JpdGgsDQogIG5ld2RhdGEgPSB0b3RhbF9ncmlkLA0KICB0eXBlID0gImxpbmsiLA0KICBzZS5maXQgPSBUUlVFDQopDQoNCiMgQ29tcHV0ZSA5NSUgQ0kgb24gbGluayBzY2FsZSBhbmQgdHJhbnNmb3JtIGJhY2sgdG8gcHJvYmFiaWxpdHkNCmludl9sb2dpdCA8LSBmdW5jdGlvbih4KSBleHAoeCkgLyAoMSArIGV4cCh4KSkNCnRvdGFsX2dyaWQgPC0gdG90YWxfZ3JpZCAlPiUNCiAgbXV0YXRlKA0KICAgIGZpdF9saW5rID0gcHJlZCRmaXQsDQogICAgbG93ZXJfbGluayA9IGZpdF9saW5rIC0gMS45NiAqIHByZWQkc2UuZml0LA0KICAgIHVwcGVyX2xpbmsgPSBmaXRfbGluayArIDEuOTYgKiBwcmVkJHNlLmZpdCwNCiAgICBwcmVkaWN0ZWQgPSBpbnZfbG9naXQoZml0X2xpbmspLA0KICAgIGxvd2VyID0gaW52X2xvZ2l0KGxvd2VyX2xpbmspLA0KICAgIHVwcGVyID0gaW52X2xvZ2l0KHVwcGVyX2xpbmspDQogICkNCg0KIyBQbG90DQpnZ3Bsb3QoZ3JlZW5ob3VzZV9hbmFseXNpcywgYWVzKHggPSB0b3RhbF9hcHBsaWVkLCB5ID0gdG90YWxfY3JpdGggLyAodG90YWxfY3JpdGggKyBjcml0aF9uZWcpKSkgKw0KICBnZW9tX3BvaW50KHNoYXBlID0gMjEsIHNpemUgPSA1LCBmaWxsID0gImRhcmtvcmNoaWQiLCBjb2xvciA9ICJibGFjayIpICsNCiAgZ2VvbV9yaWJib24oZGF0YSA9IHRvdGFsX2dyaWQsDQogICAgICAgICAgICAgIGFlcyh4ID0gdG90YWxfYXBwbGllZCwgeW1pbiA9IGxvd2VyLCB5bWF4ID0gdXBwZXIpLA0KICAgICAgICAgICAgICBhbHBoYSA9IDAuMiwgZmlsbCA9ICJvcmNoaWQiLA0KICAgICAgICAgICAgICBpbmhlcml0LmFlcyA9IEZBTFNFKSArDQogIGdlb21fbGluZShkYXRhID0gdG90YWxfZ3JpZCwNCiAgICAgICAgICAgIGFlcyh4ID0gdG90YWxfYXBwbGllZCwgeSA9IHByZWRpY3RlZCksDQogICAgICAgICAgICBjb2xvciA9ICJibGFjayIsIHNpemUgPSAxLjUsDQogICAgICAgICAgICBpbmhlcml0LmFlcyA9IEZBTFNFKSArDQogIGNvb3JkX2NhcnRlc2lhbih5bGltID0gYygwLCAxKSkgKyAgIyBzZXQgeS1heGlzIGZyb20gMCB0byAxDQogIHRoZW1lX2Nvd3Bsb3QoKSArDQogIGxhYnMoDQogICAgeSA9ICJBdmVyYWdlIENyaXRoaWRpYSBQcmV2ZWxhbmNlIiwNCiAgICB4ID0gIlRvdGFsIFBlc3RpY2lkZXMgQXBwbGllZCAobWwpIg0KICApICsNCiAgdGhlbWUoDQogICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAyNCksDQogICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMjQpLA0KICAgIHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE4KQ0KICApICsNCiAgYW5ub3RhdGUoZ2VvbSA9ICJ0ZXh0IiwgDQogICAgICAgICAgIHggPSA0NTAwMCwNCiAgICAgICAgICAgeSA9IDEsDQogICAgICAgICAgIGxhYmVsID0gIlAgPCAwLjAwMSIsDQogICAgICAgICAgIHNpemUgPSAxMikNCg0KDQoNCmBgYA0KDQoNCiMjIyBDcml0aGlkaWEgdnMuIGZ1bmdpY2lkZSANCg0KYGBge3IsIGZpZy53aWR0aD05LCBmaWcuaGVpZ2h0PTYsIGRwaT0zMDB9DQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KGRwbHlyKQ0KbGlicmFyeShjb3dwbG90KQ0KDQpncmVlbmhvdXNlX2FuYWx5c2lzIDwtIGdyZWVuaG91c2VfYW5hbHlzaXMgJT4lDQogIG11dGF0ZSgNCiAgICBmdW5naWNpZGVfMV9zYyA9IHNjYWxlKGZ1bmdpY2lkZV8xKSwgICAjIHJlc2NhbGVkIHZlcnNpb24NCiAgICAjIGtlZXAgc291cmNlIGFuZCB5ZWFyIGFzIGZhY3RvcnMNCiAgICBzb3VyY2UgPSBmYWN0b3Ioc291cmNlKSwNCiAgICB5ZWFyID0gZmFjdG9yKHllYXIpDQogICkNCg0KIyBSZWZpdCBtb2RlbCAoZnJvbSBiZWZvcmUpDQpnaF9pbnNfY3JpdGgxX3Jlc2NhbGVkIDwtIGdsbWVyKA0KICBjYmluZCh0b3RhbF9jcml0aCwgY3JpdGhfbmVnKSB+IGZ1bmdpY2lkZV8xX3NjICsgc291cmNlICsgeWVhciArICgxIHwgZ2gpLA0KICBkYXRhID0gZ3JlZW5ob3VzZV9hbmFseXNpcywNCiAgZmFtaWx5ID0gYmlub21pYWwoImxvZ2l0IiksDQogIGNvbnRyb2wgPSBnbG1lckNvbnRyb2wob3B0aW1pemVyID0gImJvYnlxYSIsIG9wdEN0cmwgPSBsaXN0KG1heGZ1biA9IDJlNSkpDQopDQoNCnNpbXJlcyA8LSBzaW11bGF0ZVJlc2lkdWFscyhnaF9pbnNfY3JpdGgxX3Jlc2NhbGVkKQ0KdGVzdERpc3BlcnNpb24oc2ltcmVzKQ0KDQojIENyZWF0ZSBwcmVkaWN0aW9uIGdyaWQgdXNpbmcgdGhlIHNjYWxlZCB2YXJpYWJsZQ0KdG90YWxfZ3JpZCA8LSBkYXRhLmZyYW1lKA0KICBmdW5naWNpZGVfMV9zYyA9IHNlcSgNCiAgICBtaW4oZ3JlZW5ob3VzZV9hbmFseXNpcyRmdW5naWNpZGVfMV9zYywgbmEucm0gPSBUUlVFKSwNCiAgICBtYXgoZ3JlZW5ob3VzZV9hbmFseXNpcyRmdW5naWNpZGVfMV9zYywgbmEucm0gPSBUUlVFKSwNCiAgICBsZW5ndGgub3V0ID0gMTAwDQogICksDQogIHNvdXJjZSA9IGZhY3RvcihsZXZlbHMoZ3JlZW5ob3VzZV9hbmFseXNpcyRzb3VyY2UpWzFdLCBsZXZlbHMgPSBsZXZlbHMoZ3JlZW5ob3VzZV9hbmFseXNpcyRzb3VyY2UpKSwNCiAgeWVhciA9IGZhY3RvcihsZXZlbHMoZ3JlZW5ob3VzZV9hbmFseXNpcyR5ZWFyKVsxXSwgbGV2ZWxzID0gbGV2ZWxzKGdyZWVuaG91c2VfYW5hbHlzaXMkeWVhcikpDQopDQoNCiMgUHJlZGljdCBvbiBsaW5rIHNjYWxlIHdpdGggU0UNCnByZWQgPC0gcHJlZGljdCgNCiAgZ2hfaW5zX2NyaXRoMV9yZXNjYWxlZCwNCiAgbmV3ZGF0YSA9IHRvdGFsX2dyaWQsDQogIHR5cGUgPSAibGluayIsDQogIHNlLmZpdCA9IFRSVUUsDQogIHJlLmZvcm0gPSBOQSAgIyBtYXJnaW5hbCBwcmVkaWN0aW9uIChhdmVyYWdlIG92ZXIgcmFuZG9tIGVmZmVjdHMpDQopDQoNCiMgQmFjay10cmFuc2Zvcm0gdGhlIHNjYWxlZCB4LWF4aXMgZm9yIHBsb3R0aW5nDQpmdW5nX21lYW4gPC0gYXR0cihncmVlbmhvdXNlX2FuYWx5c2lzJGZ1bmdpY2lkZV8xX3NjLCAic2NhbGVkOmNlbnRlciIpDQpmdW5nX3NkIDwtIGF0dHIoZ3JlZW5ob3VzZV9hbmFseXNpcyRmdW5naWNpZGVfMV9zYywgInNjYWxlZDpzY2FsZSIpDQp0b3RhbF9ncmlkJGZ1bmdpY2lkZV8xIDwtIHRvdGFsX2dyaWQkZnVuZ2ljaWRlXzFfc2MgKiBmdW5nX3NkICsgZnVuZ19tZWFuDQoNCiMgQ29tcHV0ZSA5NSUgQ0kgb24gbGluayBzY2FsZSBhbmQgdHJhbnNmb3JtIGJhY2sgdG8gcHJvYmFiaWxpdHkNCmludl9sb2dpdCA8LSBmdW5jdGlvbih4KSBleHAoeCkgLyAoMSArIGV4cCh4KSkNCnRvdGFsX2dyaWQgPC0gdG90YWxfZ3JpZCAlPiUNCiAgbXV0YXRlKA0KICAgIGZpdF9saW5rID0gcHJlZCRmaXQsDQogICAgbG93ZXJfbGluayA9IGZpdF9saW5rIC0gMS45NiAqIHByZWQkc2UuZml0LA0KICAgIHVwcGVyX2xpbmsgPSBmaXRfbGluayArIDEuOTYgKiBwcmVkJHNlLmZpdCwNCiAgICBwcmVkaWN0ZWQgPSBpbnZfbG9naXQoZml0X2xpbmspLA0KICAgIGxvd2VyID0gaW52X2xvZ2l0KGxvd2VyX2xpbmspLA0KICAgIHVwcGVyID0gaW52X2xvZ2l0KHVwcGVyX2xpbmspDQogICkNCg0KIyBQbG90IHRoZSBtb2RlbCBmaXQgd2l0aCBDSQ0KZ2dwbG90KGdyZWVuaG91c2VfYW5hbHlzaXMsIGFlcyh4ID0gZnVuZ2ljaWRlXzEsIHkgPSB0b3RhbF9jcml0aCAvICh0b3RhbF9jcml0aCArIGNyaXRoX25lZykpKSArDQogIGdlb21fcG9pbnQoc2hhcGUgPSAyMSwgc2l6ZSA9IDYsIGZpbGwgPSAiZGFya29yY2hpZCIsIGNvbG9yID0gImJsYWNrIikgKw0KICBnZW9tX3JpYmJvbigNCiAgICBkYXRhID0gdG90YWxfZ3JpZCwNCiAgICBhZXMoeCA9IGZ1bmdpY2lkZV8xLCB5bWluID0gbG93ZXIsIHltYXggPSB1cHBlciksDQogICAgYWxwaGEgPSAwLjIsIGZpbGwgPSAib3JjaGlkIiwNCiAgICBpbmhlcml0LmFlcyA9IEZBTFNFDQogICkgKw0KICBnZW9tX2xpbmUoDQogICAgZGF0YSA9IHRvdGFsX2dyaWQsDQogICAgYWVzKHggPSBmdW5naWNpZGVfMSwgeSA9IHByZWRpY3RlZCksDQogICAgY29sb3IgPSAiYmxhY2siLCBzaXplID0gMiwNCiAgICBpbmhlcml0LmFlcyA9IEZBTFNFDQogICkgKw0KICBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoMCwgMSkpICsNCiAgdGhlbWVfY293cGxvdCgpICsNCiAgbGFicygNCiAgICB5ID0gIkF2ZXJhZ2UgQ3JpdGhpZGlhIFByZXZhbGVuY2UiLA0KICAgIHggPSAiVG90YWwgRnVuZ2ljaWRlcyBBcHBsaWVkIChtbCkiDQogICkgKw0KICB0aGVtZSgNCiAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDI0KSwNCiAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAyNCksDQogICAgdGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTgpDQogICkgKw0KICBhbm5vdGF0ZSgNCiAgICBnZW9tID0gInRleHQiLA0KICAgIHggPSAxNzAwMCwNCiAgICB5ID0gMC45NSwNCiAgICBsYWJlbCA9ICJQIDwgMC4wMDEiLA0KICAgIHNpemUgPSAxMA0KICApDQoNCmBgYA0KDQojIyMgQ3JpdGhpZGlhIHZzLiBpbnNlY3RpY2lkZSANCg0KYGBge3IsIGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD02LCBkcGk9NjAwfQ0KDQoNCiMgUmVzY2FsZSBhbmQgcmVmaXQgbW9kZWwNCmdyZWVuaG91c2VfYW5hbHlzaXMgPC0gZ3JlZW5ob3VzZV9hbmFseXNpcyAlPiUNCiAgbXV0YXRlKA0KICAgIGluc2VjdGljaWRlXzFfc2MgPSBzY2FsZShpbnNlY3RpY2lkZV8xKSwNCiAgICBzb3VyY2UgPSBmYWN0b3Ioc291cmNlKSwNCiAgICB5ZWFyID0gZmFjdG9yKHllYXIpDQogICkNCg0KIyBGaXQgR0xNTSB3aXRoIHNjYWxlZCBwcmVkaWN0b3INCmdoX2luc19jcml0aDFfcmVzY2FsZWQgPC0gZ2xtZXIoDQogIGNiaW5kKHRvdGFsX2NyaXRoLCBjcml0aF9uZWcpIH4gaW5zZWN0aWNpZGVfMV9zYyArIHNvdXJjZSArIHllYXIgKyAoMSB8IGdoKSwNCiAgZGF0YSA9IGdyZWVuaG91c2VfYW5hbHlzaXMsDQogIGZhbWlseSA9IGJpbm9taWFsKCJsb2dpdCIpLA0KICBjb250cm9sID0gZ2xtZXJDb250cm9sKG9wdGltaXplciA9ICJib2J5cWEiLCBvcHRDdHJsID0gbGlzdChtYXhmdW4gPSAyZTUpKQ0KKQ0KDQpzdW1tYXJ5KGdoX2luc19jcml0aDFfcmVzY2FsZWQpDQpBbm92YShnaF9pbnNfY3JpdGgxX3Jlc2NhbGVkKQ0KDQojIE1vZGVsIGRpYWdub3N0aWNzDQpzaW1fcmVzX2doX2luMSA8LSBzaW11bGF0ZVJlc2lkdWFscyhmaXR0ZWRNb2RlbCA9IGdoX2luc19jcml0aDFfcmVzY2FsZWQpDQpwbG90KHNpbV9yZXNfZ2hfaW4xKQ0KdGVzdERpc3BlcnNpb24oc2ltX3Jlc19naF9pbjEpDQoNCiMgQ3JlYXRlIHByZWRpY3Rpb24gZ3JpZCB1c2luZyBzY2FsZWQgdmFyaWFibGUNCnRvdGFsX2dyaWQgPC0gZGF0YS5mcmFtZSgNCiAgaW5zZWN0aWNpZGVfMV9zYyA9IHNlcSgNCiAgICBtaW4oZ3JlZW5ob3VzZV9hbmFseXNpcyRpbnNlY3RpY2lkZV8xX3NjLCBuYS5ybSA9IFRSVUUpLA0KICAgIG1heChncmVlbmhvdXNlX2FuYWx5c2lzJGluc2VjdGljaWRlXzFfc2MsIG5hLnJtID0gVFJVRSksDQogICAgbGVuZ3RoLm91dCA9IDEwMA0KICApLA0KICBzb3VyY2UgPSBmYWN0b3IobGV2ZWxzKGdyZWVuaG91c2VfYW5hbHlzaXMkc291cmNlKVsxXSwgbGV2ZWxzID0gbGV2ZWxzKGdyZWVuaG91c2VfYW5hbHlzaXMkc291cmNlKSksDQogIHllYXIgPSBmYWN0b3IobGV2ZWxzKGdyZWVuaG91c2VfYW5hbHlzaXMkeWVhcilbMV0sIGxldmVscyA9IGxldmVscyhncmVlbmhvdXNlX2FuYWx5c2lzJHllYXIpKQ0KKQ0KDQojIFByZWRpY3Qgb24gbGluayBzY2FsZSB3aXRoIFNFDQpwcmVkIDwtIHByZWRpY3QoDQogIGdoX2luc19jcml0aDFfcmVzY2FsZWQsDQogIG5ld2RhdGEgPSB0b3RhbF9ncmlkLA0KICB0eXBlID0gImxpbmsiLA0KICBzZS5maXQgPSBUUlVFLA0KICByZS5mb3JtID0gTkEgICMgbWFyZ2luYWwgcHJlZGljdGlvbnMNCikNCg0KIyBCYWNrLXRyYW5zZm9ybSBzY2FsZWQgdmFyaWFibGUgdG8gb3JpZ2luYWwgdW5pdHMNCmluc2VjdF9tZWFuIDwtIGF0dHIoZ3JlZW5ob3VzZV9hbmFseXNpcyRpbnNlY3RpY2lkZV8xX3NjLCAic2NhbGVkOmNlbnRlciIpDQppbnNlY3Rfc2QgPC0gYXR0cihncmVlbmhvdXNlX2FuYWx5c2lzJGluc2VjdGljaWRlXzFfc2MsICJzY2FsZWQ6c2NhbGUiKQ0KdG90YWxfZ3JpZCRpbnNlY3RpY2lkZV8xIDwtIHRvdGFsX2dyaWQkaW5zZWN0aWNpZGVfMV9zYyAqIGluc2VjdF9zZCArIGluc2VjdF9tZWFuDQoNCiMgQ29tcHV0ZSA5NSUgQ0kgb24gbGluayBzY2FsZSBhbmQgYmFjay10cmFuc2Zvcm0gdG8gcHJvYmFiaWxpdHkNCmludl9sb2dpdCA8LSBmdW5jdGlvbih4KSBleHAoeCkgLyAoMSArIGV4cCh4KSkNCnRvdGFsX2dyaWQgPC0gdG90YWxfZ3JpZCAlPiUNCiAgbXV0YXRlKA0KICAgIGZpdF9saW5rID0gcHJlZCRmaXQsDQogICAgbG93ZXJfbGluayA9IGZpdF9saW5rIC0gMS45NiAqIHByZWQkc2UuZml0LA0KICAgIHVwcGVyX2xpbmsgPSBmaXRfbGluayArIDEuOTYgKiBwcmVkJHNlLmZpdCwNCiAgICBwcmVkaWN0ZWQgPSBpbnZfbG9naXQoZml0X2xpbmspLA0KICAgIGxvd2VyID0gaW52X2xvZ2l0KGxvd2VyX2xpbmspLA0KICAgIHVwcGVyID0gaW52X2xvZ2l0KHVwcGVyX2xpbmspDQogICkNCg0KIyBGaW5hbCBwbG90IG9uIE9SSUdJTkFMIGluc2VjdGljaWRlIHNjYWxlDQpnZ3Bsb3QoZ3JlZW5ob3VzZV9hbmFseXNpcywgYWVzKHggPSBpbnNlY3RpY2lkZV8xLCB5ID0gdG90YWxfY3JpdGggLyAodG90YWxfY3JpdGggKyBjcml0aF9uZWcpKSkgKw0KICBnZW9tX3BvaW50KHNoYXBlID0gMjEsIHNpemUgPSA2LCBmaWxsID0gImRhcmtvcmNoaWQiLCBjb2xvciA9ICJibGFjayIpICsNCiAgZ2VvbV9yaWJib24oDQogICAgZGF0YSA9IHRvdGFsX2dyaWQsDQogICAgYWVzKHggPSBpbnNlY3RpY2lkZV8xLCB5bWluID0gbG93ZXIsIHltYXggPSB1cHBlciksDQogICAgYWxwaGEgPSAwLjIsIGZpbGwgPSAiZGFya2dyYXkiLA0KICAgIGluaGVyaXQuYWVzID0gRkFMU0UNCiAgKSArDQogIGdlb21fbGluZSgNCiAgICBkYXRhID0gdG90YWxfZ3JpZCwNCiAgICBhZXMoeCA9IGluc2VjdGljaWRlXzEsIHkgPSBwcmVkaWN0ZWQpLA0KICAgIGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDIsDQogICAgaW5oZXJpdC5hZXMgPSBGQUxTRQ0KICApICsNCiAgc2NhbGVfeF9jb250aW51b3VzKA0KICAgIGxhYmVscyA9IHNjYWxlczo6Y29tbWFfZm9ybWF0KGFjY3VyYWN5ID0gMSksICAjIFNob3cgcmVndWxhciBudW1iZXJzIHdpdGggY29tbWFzDQogICAgbmFtZSA9ICJUb3RhbCBJbnNlY3RpY2lkZXMgQXBwbGllZCAobWwpIg0KICApICsNCiAgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKDAsIDEuMikpICsNCiAgdGhlbWVfY293cGxvdCgpICsNCiAgbGFicygNCiAgICB5ID0gIkF2ZXJhZ2UgQ3JpdGhpZGlhIFByZXZhbGVuY2UiDQogICkgKw0KICB0aGVtZSgNCiAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDI0KSwNCiAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAyNCksDQogICAgdGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTgpDQogICkgKw0KICBhbm5vdGF0ZSgNCiAgICBnZW9tID0gInRleHQiLA0KICAgIHggPSAyMDAwMCwNCiAgICB5ID0gMS4yLA0KICAgIGxhYmVsID0gIlAgPSAwLjEiLA0KICAgIHNpemUgPSAxMg0KICApIA0KDQoNCmBgYA0KDQo=