#qpcr <- read_csv("qPCR results final.csv", 
#    col_types = cols(treatment = col_factor(levels = c("3", 
#        "4")), replicate = col_factor(levels = c("1", 
#        "4", "6", "7", "8", "9", "10", "11", 
#        "12")), start = col_date(format = "%m/%d/%Y"), 
#       Innoculation_date = col_date(format = "%m/%d/%Y"), 
#        date = col_date(format = "%m/%d/%Y"), 
#        round = col_factor(levels = c("1", 
#            "2", "3")), trial = col_skip()))

#qpcr$colony <- as.factor(qpcr$colony)
#qpcr$bee_id <- as.factor(qpcr$bee_id)
#qpcr$spores <- as.double(qpcr$spores)

#workers_for_qpcr_merge <- read_csv("workers_for qpcr merge.csv")

#qpcr <- merge(workers_for_qpcr_merge, qpcr, by = "bee_id", all = FALSE)
#
#qpcr$inoculate <- as.logical(qpcr$inoculate)


qpcr <- read_csv("merged_qpcr.csv", 
    col_types = cols(treatment = col_factor(levels = c("3", 
        "4")), replicate = col_factor(levels = c("1", 
        "4", "6", "7", "8", "9", "10", "11", 
        "12")), start = col_date(format = "%m/%d/%Y"), 
        Innoculation_date = col_date(format = "%m/%d/%Y"), 
        date = col_date(format = "%m/%d/%Y"), 
        round = col_factor(levels = c("1", 
            "2", "3")), trial = col_skip()))
## Warning: The following named parsers don't match the column names: trial
qpcr$days <- qpcr$days_since_innoculation

qpcr$fungicide <- as.logical(qpcr$fungicide)
qpcr$crithidia <- as.logical(qpcr$crithidia)
qpcr$qro <- as.factor(qpcr$qro)
qpcr$colony <- as.factor(qpcr$colony)
qpcr$premature_death <- as.factor(qpcr$premature_death)
qpcr$dry <- as.double(qpcr$dry)
## Warning: NAs introduced by coercion
qpcr$bee_id <- as.factor(qpcr$bee_id)

Overall plots

p <- ggplot(qpcr, aes(x = days_since_innoculation, y = spores, color = colony)) +
  geom_point() + 
  geom_line(aes(group = bee_id), alpha = 0.5) +
  labs(title = "Spores per Bee Over Time",
       x = "Time",
       y = "Number of Spores",
       color = "Colony") +
  facet_wrap(~bee_id)

interactive_plot <- ggplotly(p)

interactive_plot
library(htmlwidgets)

saveWidget(interactive_plot, file = "interactive_plot.html")

unique(qpcr$colony)
##  [1] T3.01 T3.10 T3.11 T3.12 T3.4  T3.6  T3.7  T3.8  T3.9  T4.01 T4.10 T4.11
## [13] T4.12 T4.4  T4.6  T4.7  T4.8  T4.9 
## 18 Levels: T3.01 T3.10 T3.11 T3.12 T3.4 T3.6 T3.7 T3.8 T3.9 T4.01 ... T4.9

Subset by colony

subset_t3.01 <- subset(qpcr, colony == "T3.01")
subset_t3.10 <- subset(qpcr, colony == "T3.10")
subset_t3.11 <- subset(qpcr, colony == "T3.11")
subset_t3.12 <- subset(qpcr, colony == "T3.12")
subset_t3.4 <- subset(qpcr, colony == "T3.4")
subset_t3.6 <- subset(qpcr, colony == "T3.6")
subset_t3.7 <- subset(qpcr, colony == "T3.7")
subset_t3.8 <- subset(qpcr, colony == "T3.8")
subset_t3.9 <- subset(qpcr, colony == "T3.9")
subset_t4.01 <- subset(qpcr, colony == "T4.01")
subset_t4.10 <- subset(qpcr, colony == "T4.10")
subset_t4.11 <- subset(qpcr, colony == "T4.11")
subset_t4.12 <- subset(qpcr, colony == "T4.12")
subset_t4.4 <- subset(qpcr, colony == "T4.4")
subset_t4.6 <- subset(qpcr, colony == "T4.6")
subset_t4.7 <- subset(qpcr, colony == "T4.7")
subset_t4.8 <- subset(qpcr, colony == "T4.8")
subset_t4.9 <- subset(qpcr, colony == "T4.9")
ggplot(subset_t3.01, aes(x = days_since_innoculation, y = spores, color = inoculate)) +
  geom_point() + 
  coord_cartesian(ylim=c(0, 370)) + 
  geom_line(aes(group = bee_id), alpha = 0.5) +
  geom_text(aes(label = spores), vjust = -1, size =5) +  # Adding data labels
  labs(title = "Crithidia spores per bee over time",
       x = "Days Since Inoculation",
       y = "Number of Spores") +
  facet_wrap(~bee_id) +
  theme(legend.position = "none") +
  theme_gray(base_size = 15)

ggplot(subset_t3.10, aes(x = days_since_innoculation, y = spores, color = inoculate)) +
  geom_point() + 
  coord_cartesian(ylim=c(0, 370)) + 
  geom_line(aes(group = bee_id), alpha = 0.5) +
  geom_text(aes(label = spores), vjust = -1, size = 5) +  # Adding data labels
  labs(title = "Crithidia spores per bee over time",
       x = "Days Since Inoculation",
       y = "Number of Spores") +
  facet_wrap(~bee_id) +
  theme(legend.position = "none") +
  theme_gray(base_size = 15)

ggplot(subset_t3.11, aes(x = days_since_innoculation, y = spores, color = inoculate)) +
  geom_point() + 
  coord_cartesian(ylim=c(0, 370)) + 
  geom_line(aes(group = bee_id), alpha = 0.5) +
  geom_text(aes(label = spores), vjust = -1, size = 5) +  # Adding data labels
  labs(title = "Crithidia spores per bee over time",
       x = "Days Since Inoculation",
       y = "Number of Spores") +
  facet_wrap(~bee_id) +
  theme(legend.position = "none") +
  theme_gray(base_size = 15)

ggplot(subset_t3.12, aes(x = days_since_innoculation, y = spores, color = inoculate)) +
  geom_point() + 
  coord_cartesian(ylim=c(0, 370)) + 
  geom_line(aes(group = bee_id), alpha = 0.5) +
  geom_text(aes(label = spores), vjust = -1, size = 5) +  # Adding data labels
  labs(title = "Crithidia spores per bee over time",
       x = "Days Since Inoculation",
       y = "Number of Spores") +
  facet_wrap(~bee_id) +
  theme(legend.position = "none") +
  theme_gray(base_size = 15)

ggplot(subset_t3.4, aes(x = days_since_innoculation, y = spores, color = inoculate)) +
  geom_point() + 
  coord_cartesian(ylim=c(0, 370)) + 
  geom_line(aes(group = bee_id), alpha = 0.5) +
  geom_text(aes(label = spores), vjust = -1, size = 5) +  # Adding data labels
  labs(title = "Crithidia spores per bee over time",
       x = "Days Since Inoculation",
       y = "Number of Spores") +
  facet_wrap(~bee_id) +
  theme(legend.position = "none") +
  theme_gray(base_size = 15)

ggplot(subset_t3.6, aes(x = days_since_innoculation, y = spores, color = inoculate)) +
  geom_point() + 
  coord_cartesian(ylim=c(0, 370)) + 
  geom_line(aes(group = bee_id), alpha = 0.5) +
  geom_text(aes(label = spores), vjust = -1, size = 5) +  # Adding data labels
  labs(title = "Crithidia spores per bee over time",
       x = "Days Since Inoculation",
       y = "Number of Spores") +
  facet_wrap(~bee_id) +
  theme(legend.position = "none") +
  theme_gray(base_size = 15)

ggplot(subset_t3.7, aes(x = days_since_innoculation, y = spores, color = inoculate)) +
  geom_point() + 
  coord_cartesian(ylim=c(0, 370)) + 
  geom_line(aes(group = bee_id), alpha = 0.5) +
  geom_text(aes(label = spores), vjust = -1, size = 5) +  # Adding data labels
  labs(title = "Crithidia spores per bee over time",
       x = "Days Since Inoculation",
       y = "Number of Spores") +
  facet_wrap(~bee_id) +
  theme(legend.position = "none") +
  theme_gray(base_size = 15)

ggplot(subset_t3.8, aes(x = days_since_innoculation, y = spores, color = inoculate)) +
  geom_point() + 
  coord_cartesian(ylim=c(0, 370)) + 
  geom_line(aes(group = bee_id), alpha = 0.5) +
  geom_text(aes(label = spores), vjust = -1, size = 5) +  # Adding data labels
  labs(title = "Crithidia spores per bee over time",
       x = "Days Since Inoculation",
       y = "Number of Spores") +
  facet_wrap(~bee_id) +
  theme(legend.position = "none") +
  theme_gray(base_size = 15)

ggplot(subset_t3.9, aes(x = days_since_innoculation, y = spores, color = inoculate)) +
  geom_point() + 
  coord_cartesian(ylim=c(0, 370)) + 
  geom_line(aes(group = bee_id), alpha = 0.5) +
  geom_text(aes(label = spores), vjust = -1, size = 5) +  # Adding data labels
  labs(title = "Crithidia spores per bee over time",
       x = "Days Since Inoculation",
       y = "Number of Spores") +
  facet_wrap(~bee_id) +
  theme(legend.position = "none") +
  theme_gray(base_size = 15)

ggplot(subset_t4.01, aes(x = days_since_innoculation, y = spores, color = inoculate)) +
  geom_point() + 
  coord_cartesian(ylim=c(0, 370)) + 
  geom_line(aes(group = bee_id), alpha = 0.5) +
  geom_text(aes(label = spores), vjust = -1, size = 5) +  # Adding data labels
  labs(title = "Crithidia spores per bee over time",
       x = "Days Since Inoculation",
       y = "Number of Spores") +
  facet_wrap(~bee_id) +
  theme(legend.position = "none") +
  theme_gray(base_size = 15)

ggplot(subset_t4.10, aes(x = days_since_innoculation, y = spores, color = inoculate)) +
  geom_point() + 
  coord_cartesian(ylim=c(0, 370)) + 
  geom_line(aes(group = bee_id), alpha = 0.5) +
  geom_text(aes(label = spores), vjust = -1, size = 5) +  # Adding data labels
  labs(title = "Crithidia spores per bee over time",
       x = "Days Since Inoculation",
       y = "Number of Spores") +
  facet_wrap(~bee_id) +
  theme(legend.position = "none") +
  theme_gray(base_size = 15)

ggplot(subset_t4.11, aes(x = days_since_innoculation, y = spores, color = inoculate)) +
  geom_point() + 
  coord_cartesian(ylim=c(0, 370)) + 
  geom_line(aes(group = bee_id), alpha = 0.5) +
  geom_text(aes(label = spores), vjust = -1, size = 5) +  # Adding data labels
  labs(title = "Crithidia spores per bee over time",
       x = "Days Since Inoculation",
       y = "Number of Spores") +
  facet_wrap(~bee_id) +
  theme(legend.position = "none") +
  theme_gray(base_size = 15)

ggplot(subset_t4.12, aes(x = days_since_innoculation, y = spores, color = inoculate)) +
  geom_point() + 
  coord_cartesian(ylim=c(0, 370)) + 
  geom_line(aes(group = bee_id), alpha = 0.5) +
  geom_text(aes(label = spores), vjust = -1, size = 5) +  # Adding data labels
  labs(title = "Crithidia spores per bee over time",
       x = "Days Since Inoculation",
       y = "Number of Spores") +
  facet_wrap(~bee_id) +
  theme(legend.position = "none") +
  theme_gray(base_size = 15)

ggplot(subset_t4.4, aes(x = days_since_innoculation, y = spores, color = inoculate)) +
  geom_point() + 
  coord_cartesian(ylim=c(0, 370)) + 
  geom_line(aes(group = bee_id), alpha = 0.5) +
  geom_text(aes(label = spores), vjust = -1, size = 5) +  # Adding data labels
  labs(title = "Crithidia spores per bee over time",
       x = "Days Since Inoculation",
       y = "Number of Spores") +
  facet_wrap(~bee_id) +
  theme(legend.position = "none") +
  theme_gray(base_size = 15)

ggplot(subset_t4.6, aes(x = days_since_innoculation, y = spores, color = inoculate)) +
  geom_point() + 
  coord_cartesian(ylim=c(0, 370)) + 
  geom_line(aes(group = bee_id), alpha = 0.5) +
  geom_text(aes(label = spores), vjust = -1, size = 5) +  # Adding data labels
  labs(title = "Crithidia spores per bee over time",
       x = "Days Since Inoculation",
       y = "Number of Spores") +
  facet_wrap(~bee_id) +
  theme(legend.position = "none") +
  theme_gray(base_size = 15)

ggplot(subset_t4.7, aes(x = days_since_innoculation, y = spores, color = inoculate)) +
  geom_point() + 
  coord_cartesian(ylim=c(0, 370)) + 
  geom_line(aes(group = bee_id), alpha = 0.5) +
  geom_text(aes(label = spores), vjust = -1, size = 5) +  # Adding data labels
  labs(title = "Crithidia spores per bee over time",
       x = "Days Since Inoculation",
       y = "Number of Spores") +
  facet_wrap(~bee_id) +
  theme(legend.position = "none") +
  theme_gray(base_size = 15)

ggplot(subset_t4.8, aes(x = days_since_innoculation, y = spores, color = inoculate)) +
  geom_point() + 
  coord_cartesian(ylim=c(0, 370)) + 
  geom_line(aes(group = bee_id), alpha = 0.5) +
  geom_text(aes(label = spores), vjust = -1, size = 5) +  # Adding data labels
  labs(title = "Crithidia spores per bee over time",
       x = "Days Since Inoculation",
       y = "Number of Spores") +
  facet_wrap(~bee_id) +
  theme(legend.position = "none") +
  theme_gray(base_size = 15)

ggplot(subset_t4.9, aes(x = days_since_innoculation, y = spores, color = inoculate)) +
  geom_point() + 
  coord_cartesian(ylim=c(0, 370)) + 
  geom_line(aes(group = bee_id), alpha = 0.5) +
  geom_text(aes(label = spores), vjust = -1, size = 5) +  # Adding data labels
  labs(title = "Crithidia spores per bee over time",
       x = "Days Since Inoculation",
       y = "Number of Spores") +
  facet_wrap(~bee_id) +
  theme(legend.position = "none") +
  theme_gray(base_size = 15)

Averages of results

adf <- qpcr %>%
  group_by(treatment, days_since_innoculation) %>%
  summarise(m = mean(spores),
            sd = sd(spores),
            l = length(spores)) %>%
  mutate(se = sd/sqrt(l))

adf$days <- adf$days_since_innoculation

adf
## # A tibble: 28 × 7
## # Groups:   treatment [2]
##    treatment days_since_innoculation     m    sd     l    se  days
##    <fct>                       <dbl> <dbl> <dbl> <int> <dbl> <dbl>
##  1 3                               1  7.75 33.2     39  5.32     1
##  2 3                               2 21.1  50.0     41  7.81     2
##  3 3                               3  6.82 19.8     42  3.06     3
##  4 3                               4 18.4  66.7     41 10.4      4
##  5 3                               5  3.24  6.85    40  1.08     5
##  6 3                               6 15.3  51.5     37  8.47     6
##  7 3                               7  4.70 13.2     39  2.11     7
##  8 3                               8 16.5  33.7     37  5.54     8
##  9 3                               9 26.7  62.2     39  9.96     9
## 10 3                              10  5.92 20.8     38  3.37    10
## # ℹ 18 more rows
range(qpcr$spores_standardized)
## [1]   0 362
ggplot(qpcr, aes(x = days, y = spores_standardized, color = treatment)) +
  geom_point(size = 5)+
  ggtitle("Average Crithidia Spores per Treatment")+
  xlab("Days since colony inoculation") +
  ylab("Average Spores") +
  scale_fill_viridis_d() +
  theme(text = element_text(size = 20)) +
  geom_smooth(method = "lm", color = "black") +
  facet_wrap(~treatment)

sporemod <- lmer(spores_standardized ~ fungicide*time + (1|colony) + (1|bee_id) + round + inoculate + avg_pollen + dry, data = qpcr)

Anova(sporemod)
## Analysis of Deviance Table (Type II Wald chisquare tests)
## 
## Response: spores_standardized
##                  Chisq Df Pr(>Chisq)    
## fungicide       1.0137  1  0.3140242    
## time            2.1405  1  0.1434572    
## round          26.1077  2  2.142e-06 ***
## inoculate      12.9408  1  0.0003215 ***
## avg_pollen      0.5794  1  0.4465477    
## dry             0.0947  1  0.7583054    
## fungicide:time  5.1256  1  0.0235748 *  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
summary(sporemod)
## Linear mixed model fit by REML ['lmerMod']
## Formula: spores_standardized ~ fungicide * time + (1 | colony) + (1 |  
##     bee_id) + round + inoculate + avg_pollen + dry
##    Data: qpcr
## 
## REML criterion at convergence: 10564.3
## 
## Scaled residuals: 
##     Min      1Q  Median      3Q     Max 
## -1.3829 -0.3395 -0.1571 -0.0249 10.2090 
## 
## Random effects:
##  Groups   Name        Variance Std.Dev.
##  bee_id   (Intercept)    0.00   0.000  
##  colony   (Intercept)   31.15   5.581  
##  Residual             1124.22  33.529  
## Number of obs: 1074, groups:  bee_id, 84; colony, 18
## 
## Fixed effects:
##                    Estimate Std. Error t value
## (Intercept)         23.8006     8.6126   2.763
## fungicideTRUE      -16.3932     9.4302  -1.738
## time                -0.8817     0.3364  -2.621
## round2               1.5715     4.4878   0.350
## round3              24.8938     5.0447   4.935
## inoculateTRUE        9.0486     2.5154   3.597
## avg_pollen          -7.7029    10.1196  -0.761
## dry                -26.0513    84.6628  -0.308
## fungicideTRUE:time   1.1054     0.4883   2.264
## 
## Correlation of Fixed Effects:
##             (Intr) fnTRUE time   round2 round3 inTRUE avg_pl dry   
## fungicdTRUE -0.622                                                 
## time        -0.730  0.654                                          
## round2      -0.292  0.000 -0.062                                   
## round3      -0.160  0.051 -0.082  0.325                            
## inocultTRUE -0.043 -0.006  0.007 -0.015  0.026                     
## avg_pollen  -0.411  0.148  0.027  0.472  0.248  0.020              
## dry         -0.320  0.023  0.043 -0.082 -0.124 -0.067 -0.347       
## fngcdTRUE:t  0.544 -0.931 -0.689 -0.005  0.001 -0.001 -0.125  0.015
## optimizer (nloptwrap) convergence code: 0 (OK)
## boundary (singular) fit: see help('isSingular')
LS0tDQp0aXRsZTogInFQQ1IgUmVzdWx0cyINCmF1dGhvcjogIkVtaWx5IFJ1bm5pb24iDQpkYXRlOiAiMjAyNC0wNS0yMSINCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDoNCiAgICB0b2M6IHRydWUNCiAgICB0b2NfZGVwdGg6IDQNCiAgICBudW1iZXJfc2VjdGlvbnM6IGZhbHNlDQogICAgdG9jX2Zsb2F0OiB0cnVlDQogICAgdGhlbWU6IGpvdXJuYWwNCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlDQotLS0NCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KG1lc3NhZ2UgPSBGQUxTRSkNCmBgYA0KDQoNCmBgYHtyIGxvYWQgbGlicmFyaWVzLCBpbmNsdWRlPUZBTFNFfQ0KbGlicmFyeShyZWFkcikNCmxpYnJhcnkodmlyaWRpc0xpdGUpDQpsaWJyYXJ5KHN0YXRzKQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShjYXIpDQpsaWJyYXJ5KGVtbWVhbnMpDQpsaWJyYXJ5KE1BU1MpDQpsaWJyYXJ5KGxtZTQpDQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkoZHBseXIpDQpsaWJyYXJ5KGdncGF0dGVybikNCmxpYnJhcnkoa2FibGVFeHRyYSkNCmxpYnJhcnkoYmxtZWNvKQ0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KGRwbHlyKQ0KbGlicmFyeShjb3dwbG90KQ0KbGlicmFyeShwbG90bHkpDQpsaWJyYXJ5KGFncmljb2xhZSkgDQpsaWJyYXJ5KGdncHVicikNCmxpYnJhcnkoZ2x1ZSkNCmxpYnJhcnkobXVsdGNvbXApDQpsaWJyYXJ5KG11bHRjb21wVmlldykNCmxpYnJhcnkoZ2xtbVRNQikNCmxpYnJhcnkocnN0YXRpeCkNCmxpYnJhcnkoZml0ZGlzdHJwbHVzKQ0KbGlicmFyeShsb2dzcGxpbmUpDQpsaWJyYXJ5KEdHYWxseSkNCmxpYnJhcnkoZGF0YS50YWJsZSkNCmBgYA0KDQoNCmBgYHtyfQ0KDQojcXBjciA8LSByZWFkX2NzdigicVBDUiByZXN1bHRzIGZpbmFsLmNzdiIsIA0KIyAgICBjb2xfdHlwZXMgPSBjb2xzKHRyZWF0bWVudCA9IGNvbF9mYWN0b3IobGV2ZWxzID0gYygiMyIsIA0KIyAgICAgICAgIjQiKSksIHJlcGxpY2F0ZSA9IGNvbF9mYWN0b3IobGV2ZWxzID0gYygiMSIsIA0KIyAgICAgICAgIjQiLCAiNiIsICI3IiwgIjgiLCAiOSIsICIxMCIsICIxMSIsIA0KIyAgICAgICAgIjEyIikpLCBzdGFydCA9IGNvbF9kYXRlKGZvcm1hdCA9ICIlbS8lZC8lWSIpLCANCiMgICAgICAgSW5ub2N1bGF0aW9uX2RhdGUgPSBjb2xfZGF0ZShmb3JtYXQgPSAiJW0vJWQvJVkiKSwgDQojICAgICAgICBkYXRlID0gY29sX2RhdGUoZm9ybWF0ID0gIiVtLyVkLyVZIiksIA0KIyAgICAgICAgcm91bmQgPSBjb2xfZmFjdG9yKGxldmVscyA9IGMoIjEiLCANCiMgICAgICAgICAgICAiMiIsICIzIikpLCB0cmlhbCA9IGNvbF9za2lwKCkpKQ0KDQojcXBjciRjb2xvbnkgPC0gYXMuZmFjdG9yKHFwY3IkY29sb255KQ0KI3FwY3IkYmVlX2lkIDwtIGFzLmZhY3RvcihxcGNyJGJlZV9pZCkNCiNxcGNyJHNwb3JlcyA8LSBhcy5kb3VibGUocXBjciRzcG9yZXMpDQoNCiN3b3JrZXJzX2Zvcl9xcGNyX21lcmdlIDwtIHJlYWRfY3N2KCJ3b3JrZXJzX2ZvciBxcGNyIG1lcmdlLmNzdiIpDQoNCiNxcGNyIDwtIG1lcmdlKHdvcmtlcnNfZm9yX3FwY3JfbWVyZ2UsIHFwY3IsIGJ5ID0gImJlZV9pZCIsIGFsbCA9IEZBTFNFKQ0KIw0KI3FwY3IkaW5vY3VsYXRlIDwtIGFzLmxvZ2ljYWwocXBjciRpbm9jdWxhdGUpDQoNCg0KcXBjciA8LSByZWFkX2NzdigibWVyZ2VkX3FwY3IuY3N2IiwgDQogICAgY29sX3R5cGVzID0gY29scyh0cmVhdG1lbnQgPSBjb2xfZmFjdG9yKGxldmVscyA9IGMoIjMiLCANCiAgICAgICAgIjQiKSksIHJlcGxpY2F0ZSA9IGNvbF9mYWN0b3IobGV2ZWxzID0gYygiMSIsIA0KICAgICAgICAiNCIsICI2IiwgIjciLCAiOCIsICI5IiwgIjEwIiwgIjExIiwgDQogICAgICAgICIxMiIpKSwgc3RhcnQgPSBjb2xfZGF0ZShmb3JtYXQgPSAiJW0vJWQvJVkiKSwgDQogICAgICAgIElubm9jdWxhdGlvbl9kYXRlID0gY29sX2RhdGUoZm9ybWF0ID0gIiVtLyVkLyVZIiksIA0KICAgICAgICBkYXRlID0gY29sX2RhdGUoZm9ybWF0ID0gIiVtLyVkLyVZIiksIA0KICAgICAgICByb3VuZCA9IGNvbF9mYWN0b3IobGV2ZWxzID0gYygiMSIsIA0KICAgICAgICAgICAgIjIiLCAiMyIpKSwgdHJpYWwgPSBjb2xfc2tpcCgpKSkNCg0KcXBjciRkYXlzIDwtIHFwY3IkZGF5c19zaW5jZV9pbm5vY3VsYXRpb24NCg0KcXBjciRmdW5naWNpZGUgPC0gYXMubG9naWNhbChxcGNyJGZ1bmdpY2lkZSkNCnFwY3IkY3JpdGhpZGlhIDwtIGFzLmxvZ2ljYWwocXBjciRjcml0aGlkaWEpDQpxcGNyJHFybyA8LSBhcy5mYWN0b3IocXBjciRxcm8pDQpxcGNyJGNvbG9ueSA8LSBhcy5mYWN0b3IocXBjciRjb2xvbnkpDQpxcGNyJHByZW1hdHVyZV9kZWF0aCA8LSBhcy5mYWN0b3IocXBjciRwcmVtYXR1cmVfZGVhdGgpDQpxcGNyJGRyeSA8LSBhcy5kb3VibGUocXBjciRkcnkpDQpxcGNyJGJlZV9pZCA8LSBhcy5mYWN0b3IocXBjciRiZWVfaWQpDQoNCmBgYA0KDQoNCiMjIE92ZXJhbGwgcGxvdHMNCg0KYGBge3IsIGZpZy5oZWlnaHQ9IDQwLCBmaWcud2lkdGg9IDYwfQ0KDQpwIDwtIGdncGxvdChxcGNyLCBhZXMoeCA9IGRheXNfc2luY2VfaW5ub2N1bGF0aW9uLCB5ID0gc3BvcmVzLCBjb2xvciA9IGNvbG9ueSkpICsNCiAgZ2VvbV9wb2ludCgpICsgDQogIGdlb21fbGluZShhZXMoZ3JvdXAgPSBiZWVfaWQpLCBhbHBoYSA9IDAuNSkgKw0KICBsYWJzKHRpdGxlID0gIlNwb3JlcyBwZXIgQmVlIE92ZXIgVGltZSIsDQogICAgICAgeCA9ICJUaW1lIiwNCiAgICAgICB5ID0gIk51bWJlciBvZiBTcG9yZXMiLA0KICAgICAgIGNvbG9yID0gIkNvbG9ueSIpICsNCiAgZmFjZXRfd3JhcCh+YmVlX2lkKQ0KDQppbnRlcmFjdGl2ZV9wbG90IDwtIGdncGxvdGx5KHApDQoNCmludGVyYWN0aXZlX3Bsb3QNCg0KbGlicmFyeShodG1sd2lkZ2V0cykNCg0Kc2F2ZVdpZGdldChpbnRlcmFjdGl2ZV9wbG90LCBmaWxlID0gImludGVyYWN0aXZlX3Bsb3QuaHRtbCIpDQoNCnVuaXF1ZShxcGNyJGNvbG9ueSkNCg0KYGBgDQoNCg0KIyMgU3Vic2V0IGJ5IGNvbG9ueQ0KDQpgYGB7cn0NCnN1YnNldF90My4wMSA8LSBzdWJzZXQocXBjciwgY29sb255ID09ICJUMy4wMSIpDQpzdWJzZXRfdDMuMTAgPC0gc3Vic2V0KHFwY3IsIGNvbG9ueSA9PSAiVDMuMTAiKQ0Kc3Vic2V0X3QzLjExIDwtIHN1YnNldChxcGNyLCBjb2xvbnkgPT0gIlQzLjExIikNCnN1YnNldF90My4xMiA8LSBzdWJzZXQocXBjciwgY29sb255ID09ICJUMy4xMiIpDQpzdWJzZXRfdDMuNCA8LSBzdWJzZXQocXBjciwgY29sb255ID09ICJUMy40IikNCnN1YnNldF90My42IDwtIHN1YnNldChxcGNyLCBjb2xvbnkgPT0gIlQzLjYiKQ0Kc3Vic2V0X3QzLjcgPC0gc3Vic2V0KHFwY3IsIGNvbG9ueSA9PSAiVDMuNyIpDQpzdWJzZXRfdDMuOCA8LSBzdWJzZXQocXBjciwgY29sb255ID09ICJUMy44IikNCnN1YnNldF90My45IDwtIHN1YnNldChxcGNyLCBjb2xvbnkgPT0gIlQzLjkiKQ0Kc3Vic2V0X3Q0LjAxIDwtIHN1YnNldChxcGNyLCBjb2xvbnkgPT0gIlQ0LjAxIikNCnN1YnNldF90NC4xMCA8LSBzdWJzZXQocXBjciwgY29sb255ID09ICJUNC4xMCIpDQpzdWJzZXRfdDQuMTEgPC0gc3Vic2V0KHFwY3IsIGNvbG9ueSA9PSAiVDQuMTEiKQ0Kc3Vic2V0X3Q0LjEyIDwtIHN1YnNldChxcGNyLCBjb2xvbnkgPT0gIlQ0LjEyIikNCnN1YnNldF90NC40IDwtIHN1YnNldChxcGNyLCBjb2xvbnkgPT0gIlQ0LjQiKQ0Kc3Vic2V0X3Q0LjYgPC0gc3Vic2V0KHFwY3IsIGNvbG9ueSA9PSAiVDQuNiIpDQpzdWJzZXRfdDQuNyA8LSBzdWJzZXQocXBjciwgY29sb255ID09ICJUNC43IikNCnN1YnNldF90NC44IDwtIHN1YnNldChxcGNyLCBjb2xvbnkgPT0gIlQ0LjgiKQ0Kc3Vic2V0X3Q0LjkgPC0gc3Vic2V0KHFwY3IsIGNvbG9ueSA9PSAiVDQuOSIpDQpgYGANCg0KDQoNCg0KYGBge3IsIGZpZy53aWR0aD0gMjUsIGZpZy5oZWlnaHQ9IDEwfQ0KDQpnZ3Bsb3Qoc3Vic2V0X3QzLjAxLCBhZXMoeCA9IGRheXNfc2luY2VfaW5ub2N1bGF0aW9uLCB5ID0gc3BvcmVzLCBjb2xvciA9IGlub2N1bGF0ZSkpICsNCiAgZ2VvbV9wb2ludCgpICsgDQogIGNvb3JkX2NhcnRlc2lhbih5bGltPWMoMCwgMzcwKSkgKyANCiAgZ2VvbV9saW5lKGFlcyhncm91cCA9IGJlZV9pZCksIGFscGhhID0gMC41KSArDQogIGdlb21fdGV4dChhZXMobGFiZWwgPSBzcG9yZXMpLCB2anVzdCA9IC0xLCBzaXplID01KSArICAjIEFkZGluZyBkYXRhIGxhYmVscw0KICBsYWJzKHRpdGxlID0gIkNyaXRoaWRpYSBzcG9yZXMgcGVyIGJlZSBvdmVyIHRpbWUiLA0KICAgICAgIHggPSAiRGF5cyBTaW5jZSBJbm9jdWxhdGlvbiIsDQogICAgICAgeSA9ICJOdW1iZXIgb2YgU3BvcmVzIikgKw0KICBmYWNldF93cmFwKH5iZWVfaWQpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArDQogIHRoZW1lX2dyYXkoYmFzZV9zaXplID0gMTUpDQoNCmBgYA0KDQoNCmBgYHtyLCBmaWcud2lkdGg9IDI1LCBmaWcuaGVpZ2h0PSAxMH0NCmdncGxvdChzdWJzZXRfdDMuMTAsIGFlcyh4ID0gZGF5c19zaW5jZV9pbm5vY3VsYXRpb24sIHkgPSBzcG9yZXMsIGNvbG9yID0gaW5vY3VsYXRlKSkgKw0KICBnZW9tX3BvaW50KCkgKyANCiAgY29vcmRfY2FydGVzaWFuKHlsaW09YygwLCAzNzApKSArIA0KICBnZW9tX2xpbmUoYWVzKGdyb3VwID0gYmVlX2lkKSwgYWxwaGEgPSAwLjUpICsNCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IHNwb3JlcyksIHZqdXN0ID0gLTEsIHNpemUgPSA1KSArICAjIEFkZGluZyBkYXRhIGxhYmVscw0KICBsYWJzKHRpdGxlID0gIkNyaXRoaWRpYSBzcG9yZXMgcGVyIGJlZSBvdmVyIHRpbWUiLA0KICAgICAgIHggPSAiRGF5cyBTaW5jZSBJbm9jdWxhdGlvbiIsDQogICAgICAgeSA9ICJOdW1iZXIgb2YgU3BvcmVzIikgKw0KICBmYWNldF93cmFwKH5iZWVfaWQpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArDQogIHRoZW1lX2dyYXkoYmFzZV9zaXplID0gMTUpDQpgYGANCg0KDQpgYGB7ciwgZmlnLndpZHRoPSAyNSwgZmlnLmhlaWdodD0gMTB9DQpnZ3Bsb3Qoc3Vic2V0X3QzLjExLCBhZXMoeCA9IGRheXNfc2luY2VfaW5ub2N1bGF0aW9uLCB5ID0gc3BvcmVzLCBjb2xvciA9IGlub2N1bGF0ZSkpICsNCiAgZ2VvbV9wb2ludCgpICsgDQogIGNvb3JkX2NhcnRlc2lhbih5bGltPWMoMCwgMzcwKSkgKyANCiAgZ2VvbV9saW5lKGFlcyhncm91cCA9IGJlZV9pZCksIGFscGhhID0gMC41KSArDQogIGdlb21fdGV4dChhZXMobGFiZWwgPSBzcG9yZXMpLCB2anVzdCA9IC0xLCBzaXplID0gNSkgKyAgIyBBZGRpbmcgZGF0YSBsYWJlbHMNCiAgbGFicyh0aXRsZSA9ICJDcml0aGlkaWEgc3BvcmVzIHBlciBiZWUgb3ZlciB0aW1lIiwNCiAgICAgICB4ID0gIkRheXMgU2luY2UgSW5vY3VsYXRpb24iLA0KICAgICAgIHkgPSAiTnVtYmVyIG9mIFNwb3JlcyIpICsNCiAgZmFjZXRfd3JhcCh+YmVlX2lkKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKw0KICB0aGVtZV9ncmF5KGJhc2Vfc2l6ZSA9IDE1KQ0KYGBgDQoNCg0KYGBge3IsIGZpZy53aWR0aD0gMjUsIGZpZy5oZWlnaHQ9IDEwfQ0KZ2dwbG90KHN1YnNldF90My4xMiwgYWVzKHggPSBkYXlzX3NpbmNlX2lubm9jdWxhdGlvbiwgeSA9IHNwb3JlcywgY29sb3IgPSBpbm9jdWxhdGUpKSArDQogIGdlb21fcG9pbnQoKSArIA0KICBjb29yZF9jYXJ0ZXNpYW4oeWxpbT1jKDAsIDM3MCkpICsgDQogIGdlb21fbGluZShhZXMoZ3JvdXAgPSBiZWVfaWQpLCBhbHBoYSA9IDAuNSkgKw0KICBnZW9tX3RleHQoYWVzKGxhYmVsID0gc3BvcmVzKSwgdmp1c3QgPSAtMSwgc2l6ZSA9IDUpICsgICMgQWRkaW5nIGRhdGEgbGFiZWxzDQogIGxhYnModGl0bGUgPSAiQ3JpdGhpZGlhIHNwb3JlcyBwZXIgYmVlIG92ZXIgdGltZSIsDQogICAgICAgeCA9ICJEYXlzIFNpbmNlIElub2N1bGF0aW9uIiwNCiAgICAgICB5ID0gIk51bWJlciBvZiBTcG9yZXMiKSArDQogIGZhY2V0X3dyYXAofmJlZV9pZCkgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsNCiAgdGhlbWVfZ3JheShiYXNlX3NpemUgPSAxNSkNCmBgYA0KDQoNCmBgYHtyLCBmaWcud2lkdGg9IDI1LCBmaWcuaGVpZ2h0PSAxMH0NCmdncGxvdChzdWJzZXRfdDMuNCwgYWVzKHggPSBkYXlzX3NpbmNlX2lubm9jdWxhdGlvbiwgeSA9IHNwb3JlcywgY29sb3IgPSBpbm9jdWxhdGUpKSArDQogIGdlb21fcG9pbnQoKSArIA0KICBjb29yZF9jYXJ0ZXNpYW4oeWxpbT1jKDAsIDM3MCkpICsgDQogIGdlb21fbGluZShhZXMoZ3JvdXAgPSBiZWVfaWQpLCBhbHBoYSA9IDAuNSkgKw0KICBnZW9tX3RleHQoYWVzKGxhYmVsID0gc3BvcmVzKSwgdmp1c3QgPSAtMSwgc2l6ZSA9IDUpICsgICMgQWRkaW5nIGRhdGEgbGFiZWxzDQogIGxhYnModGl0bGUgPSAiQ3JpdGhpZGlhIHNwb3JlcyBwZXIgYmVlIG92ZXIgdGltZSIsDQogICAgICAgeCA9ICJEYXlzIFNpbmNlIElub2N1bGF0aW9uIiwNCiAgICAgICB5ID0gIk51bWJlciBvZiBTcG9yZXMiKSArDQogIGZhY2V0X3dyYXAofmJlZV9pZCkgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsNCiAgdGhlbWVfZ3JheShiYXNlX3NpemUgPSAxNSkNCmBgYA0KDQoNCmBgYHtyLCBmaWcud2lkdGg9IDI1LCBmaWcuaGVpZ2h0PSAxMH0NCmdncGxvdChzdWJzZXRfdDMuNiwgYWVzKHggPSBkYXlzX3NpbmNlX2lubm9jdWxhdGlvbiwgeSA9IHNwb3JlcywgY29sb3IgPSBpbm9jdWxhdGUpKSArDQogIGdlb21fcG9pbnQoKSArIA0KICBjb29yZF9jYXJ0ZXNpYW4oeWxpbT1jKDAsIDM3MCkpICsgDQogIGdlb21fbGluZShhZXMoZ3JvdXAgPSBiZWVfaWQpLCBhbHBoYSA9IDAuNSkgKw0KICBnZW9tX3RleHQoYWVzKGxhYmVsID0gc3BvcmVzKSwgdmp1c3QgPSAtMSwgc2l6ZSA9IDUpICsgICMgQWRkaW5nIGRhdGEgbGFiZWxzDQogIGxhYnModGl0bGUgPSAiQ3JpdGhpZGlhIHNwb3JlcyBwZXIgYmVlIG92ZXIgdGltZSIsDQogICAgICAgeCA9ICJEYXlzIFNpbmNlIElub2N1bGF0aW9uIiwNCiAgICAgICB5ID0gIk51bWJlciBvZiBTcG9yZXMiKSArDQogIGZhY2V0X3dyYXAofmJlZV9pZCkgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsNCiAgdGhlbWVfZ3JheShiYXNlX3NpemUgPSAxNSkNCmBgYA0KDQoNCmBgYHtyLCBmaWcud2lkdGg9IDI1LCBmaWcuaGVpZ2h0PSAxMH0NCmdncGxvdChzdWJzZXRfdDMuNywgYWVzKHggPSBkYXlzX3NpbmNlX2lubm9jdWxhdGlvbiwgeSA9IHNwb3JlcywgY29sb3IgPSBpbm9jdWxhdGUpKSArDQogIGdlb21fcG9pbnQoKSArIA0KICBjb29yZF9jYXJ0ZXNpYW4oeWxpbT1jKDAsIDM3MCkpICsgDQogIGdlb21fbGluZShhZXMoZ3JvdXAgPSBiZWVfaWQpLCBhbHBoYSA9IDAuNSkgKw0KICBnZW9tX3RleHQoYWVzKGxhYmVsID0gc3BvcmVzKSwgdmp1c3QgPSAtMSwgc2l6ZSA9IDUpICsgICMgQWRkaW5nIGRhdGEgbGFiZWxzDQogIGxhYnModGl0bGUgPSAiQ3JpdGhpZGlhIHNwb3JlcyBwZXIgYmVlIG92ZXIgdGltZSIsDQogICAgICAgeCA9ICJEYXlzIFNpbmNlIElub2N1bGF0aW9uIiwNCiAgICAgICB5ID0gIk51bWJlciBvZiBTcG9yZXMiKSArDQogIGZhY2V0X3dyYXAofmJlZV9pZCkgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsNCiAgdGhlbWVfZ3JheShiYXNlX3NpemUgPSAxNSkNCmBgYA0KDQoNCmBgYHtyLCBmaWcud2lkdGg9IDI1LCBmaWcuaGVpZ2h0PSAxMH0NCmdncGxvdChzdWJzZXRfdDMuOCwgYWVzKHggPSBkYXlzX3NpbmNlX2lubm9jdWxhdGlvbiwgeSA9IHNwb3JlcywgY29sb3IgPSBpbm9jdWxhdGUpKSArDQogIGdlb21fcG9pbnQoKSArIA0KICBjb29yZF9jYXJ0ZXNpYW4oeWxpbT1jKDAsIDM3MCkpICsgDQogIGdlb21fbGluZShhZXMoZ3JvdXAgPSBiZWVfaWQpLCBhbHBoYSA9IDAuNSkgKw0KICBnZW9tX3RleHQoYWVzKGxhYmVsID0gc3BvcmVzKSwgdmp1c3QgPSAtMSwgc2l6ZSA9IDUpICsgICMgQWRkaW5nIGRhdGEgbGFiZWxzDQogIGxhYnModGl0bGUgPSAiQ3JpdGhpZGlhIHNwb3JlcyBwZXIgYmVlIG92ZXIgdGltZSIsDQogICAgICAgeCA9ICJEYXlzIFNpbmNlIElub2N1bGF0aW9uIiwNCiAgICAgICB5ID0gIk51bWJlciBvZiBTcG9yZXMiKSArDQogIGZhY2V0X3dyYXAofmJlZV9pZCkgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsNCiAgdGhlbWVfZ3JheShiYXNlX3NpemUgPSAxNSkNCmBgYA0KDQoNCmBgYHtyLCBmaWcud2lkdGg9IDI1LCBmaWcuaGVpZ2h0PSAxMH0NCmdncGxvdChzdWJzZXRfdDMuOSwgYWVzKHggPSBkYXlzX3NpbmNlX2lubm9jdWxhdGlvbiwgeSA9IHNwb3JlcywgY29sb3IgPSBpbm9jdWxhdGUpKSArDQogIGdlb21fcG9pbnQoKSArIA0KICBjb29yZF9jYXJ0ZXNpYW4oeWxpbT1jKDAsIDM3MCkpICsgDQogIGdlb21fbGluZShhZXMoZ3JvdXAgPSBiZWVfaWQpLCBhbHBoYSA9IDAuNSkgKw0KICBnZW9tX3RleHQoYWVzKGxhYmVsID0gc3BvcmVzKSwgdmp1c3QgPSAtMSwgc2l6ZSA9IDUpICsgICMgQWRkaW5nIGRhdGEgbGFiZWxzDQogIGxhYnModGl0bGUgPSAiQ3JpdGhpZGlhIHNwb3JlcyBwZXIgYmVlIG92ZXIgdGltZSIsDQogICAgICAgeCA9ICJEYXlzIFNpbmNlIElub2N1bGF0aW9uIiwNCiAgICAgICB5ID0gIk51bWJlciBvZiBTcG9yZXMiKSArDQogIGZhY2V0X3dyYXAofmJlZV9pZCkgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsNCiAgdGhlbWVfZ3JheShiYXNlX3NpemUgPSAxNSkNCmBgYA0KDQoNCmBgYHtyLCBmaWcud2lkdGg9IDI1LCBmaWcuaGVpZ2h0PSAxMH0NCmdncGxvdChzdWJzZXRfdDQuMDEsIGFlcyh4ID0gZGF5c19zaW5jZV9pbm5vY3VsYXRpb24sIHkgPSBzcG9yZXMsIGNvbG9yID0gaW5vY3VsYXRlKSkgKw0KICBnZW9tX3BvaW50KCkgKyANCiAgY29vcmRfY2FydGVzaWFuKHlsaW09YygwLCAzNzApKSArIA0KICBnZW9tX2xpbmUoYWVzKGdyb3VwID0gYmVlX2lkKSwgYWxwaGEgPSAwLjUpICsNCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IHNwb3JlcyksIHZqdXN0ID0gLTEsIHNpemUgPSA1KSArICAjIEFkZGluZyBkYXRhIGxhYmVscw0KICBsYWJzKHRpdGxlID0gIkNyaXRoaWRpYSBzcG9yZXMgcGVyIGJlZSBvdmVyIHRpbWUiLA0KICAgICAgIHggPSAiRGF5cyBTaW5jZSBJbm9jdWxhdGlvbiIsDQogICAgICAgeSA9ICJOdW1iZXIgb2YgU3BvcmVzIikgKw0KICBmYWNldF93cmFwKH5iZWVfaWQpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArDQogIHRoZW1lX2dyYXkoYmFzZV9zaXplID0gMTUpDQpgYGANCg0KYGBge3IsIGZpZy53aWR0aD0gMjUsIGZpZy5oZWlnaHQ9IDEwfQ0KZ2dwbG90KHN1YnNldF90NC4xMCwgYWVzKHggPSBkYXlzX3NpbmNlX2lubm9jdWxhdGlvbiwgeSA9IHNwb3JlcywgY29sb3IgPSBpbm9jdWxhdGUpKSArDQogIGdlb21fcG9pbnQoKSArIA0KICBjb29yZF9jYXJ0ZXNpYW4oeWxpbT1jKDAsIDM3MCkpICsgDQogIGdlb21fbGluZShhZXMoZ3JvdXAgPSBiZWVfaWQpLCBhbHBoYSA9IDAuNSkgKw0KICBnZW9tX3RleHQoYWVzKGxhYmVsID0gc3BvcmVzKSwgdmp1c3QgPSAtMSwgc2l6ZSA9IDUpICsgICMgQWRkaW5nIGRhdGEgbGFiZWxzDQogIGxhYnModGl0bGUgPSAiQ3JpdGhpZGlhIHNwb3JlcyBwZXIgYmVlIG92ZXIgdGltZSIsDQogICAgICAgeCA9ICJEYXlzIFNpbmNlIElub2N1bGF0aW9uIiwNCiAgICAgICB5ID0gIk51bWJlciBvZiBTcG9yZXMiKSArDQogIGZhY2V0X3dyYXAofmJlZV9pZCkgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsNCiAgdGhlbWVfZ3JheShiYXNlX3NpemUgPSAxNSkNCmBgYA0KDQpgYGB7ciwgZmlnLndpZHRoPSAyNSwgZmlnLmhlaWdodD0gMTB9DQpnZ3Bsb3Qoc3Vic2V0X3Q0LjExLCBhZXMoeCA9IGRheXNfc2luY2VfaW5ub2N1bGF0aW9uLCB5ID0gc3BvcmVzLCBjb2xvciA9IGlub2N1bGF0ZSkpICsNCiAgZ2VvbV9wb2ludCgpICsgDQogIGNvb3JkX2NhcnRlc2lhbih5bGltPWMoMCwgMzcwKSkgKyANCiAgZ2VvbV9saW5lKGFlcyhncm91cCA9IGJlZV9pZCksIGFscGhhID0gMC41KSArDQogIGdlb21fdGV4dChhZXMobGFiZWwgPSBzcG9yZXMpLCB2anVzdCA9IC0xLCBzaXplID0gNSkgKyAgIyBBZGRpbmcgZGF0YSBsYWJlbHMNCiAgbGFicyh0aXRsZSA9ICJDcml0aGlkaWEgc3BvcmVzIHBlciBiZWUgb3ZlciB0aW1lIiwNCiAgICAgICB4ID0gIkRheXMgU2luY2UgSW5vY3VsYXRpb24iLA0KICAgICAgIHkgPSAiTnVtYmVyIG9mIFNwb3JlcyIpICsNCiAgZmFjZXRfd3JhcCh+YmVlX2lkKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKw0KICB0aGVtZV9ncmF5KGJhc2Vfc2l6ZSA9IDE1KQ0KYGBgDQoNCmBgYHtyLCBmaWcud2lkdGg9IDI1LCBmaWcuaGVpZ2h0PSAxMH0NCmdncGxvdChzdWJzZXRfdDQuMTIsIGFlcyh4ID0gZGF5c19zaW5jZV9pbm5vY3VsYXRpb24sIHkgPSBzcG9yZXMsIGNvbG9yID0gaW5vY3VsYXRlKSkgKw0KICBnZW9tX3BvaW50KCkgKyANCiAgY29vcmRfY2FydGVzaWFuKHlsaW09YygwLCAzNzApKSArIA0KICBnZW9tX2xpbmUoYWVzKGdyb3VwID0gYmVlX2lkKSwgYWxwaGEgPSAwLjUpICsNCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IHNwb3JlcyksIHZqdXN0ID0gLTEsIHNpemUgPSA1KSArICAjIEFkZGluZyBkYXRhIGxhYmVscw0KICBsYWJzKHRpdGxlID0gIkNyaXRoaWRpYSBzcG9yZXMgcGVyIGJlZSBvdmVyIHRpbWUiLA0KICAgICAgIHggPSAiRGF5cyBTaW5jZSBJbm9jdWxhdGlvbiIsDQogICAgICAgeSA9ICJOdW1iZXIgb2YgU3BvcmVzIikgKw0KICBmYWNldF93cmFwKH5iZWVfaWQpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArDQogIHRoZW1lX2dyYXkoYmFzZV9zaXplID0gMTUpDQpgYGANCg0KYGBge3IsIGZpZy53aWR0aD0gMjUsIGZpZy5oZWlnaHQ9IDEwfQ0KZ2dwbG90KHN1YnNldF90NC40LCBhZXMoeCA9IGRheXNfc2luY2VfaW5ub2N1bGF0aW9uLCB5ID0gc3BvcmVzLCBjb2xvciA9IGlub2N1bGF0ZSkpICsNCiAgZ2VvbV9wb2ludCgpICsgDQogIGNvb3JkX2NhcnRlc2lhbih5bGltPWMoMCwgMzcwKSkgKyANCiAgZ2VvbV9saW5lKGFlcyhncm91cCA9IGJlZV9pZCksIGFscGhhID0gMC41KSArDQogIGdlb21fdGV4dChhZXMobGFiZWwgPSBzcG9yZXMpLCB2anVzdCA9IC0xLCBzaXplID0gNSkgKyAgIyBBZGRpbmcgZGF0YSBsYWJlbHMNCiAgbGFicyh0aXRsZSA9ICJDcml0aGlkaWEgc3BvcmVzIHBlciBiZWUgb3ZlciB0aW1lIiwNCiAgICAgICB4ID0gIkRheXMgU2luY2UgSW5vY3VsYXRpb24iLA0KICAgICAgIHkgPSAiTnVtYmVyIG9mIFNwb3JlcyIpICsNCiAgZmFjZXRfd3JhcCh+YmVlX2lkKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKw0KICB0aGVtZV9ncmF5KGJhc2Vfc2l6ZSA9IDE1KQ0KYGBgDQoNCmBgYHtyLCBmaWcud2lkdGg9IDI1LCBmaWcuaGVpZ2h0PSAxMH0NCmdncGxvdChzdWJzZXRfdDQuNiwgYWVzKHggPSBkYXlzX3NpbmNlX2lubm9jdWxhdGlvbiwgeSA9IHNwb3JlcywgY29sb3IgPSBpbm9jdWxhdGUpKSArDQogIGdlb21fcG9pbnQoKSArIA0KICBjb29yZF9jYXJ0ZXNpYW4oeWxpbT1jKDAsIDM3MCkpICsgDQogIGdlb21fbGluZShhZXMoZ3JvdXAgPSBiZWVfaWQpLCBhbHBoYSA9IDAuNSkgKw0KICBnZW9tX3RleHQoYWVzKGxhYmVsID0gc3BvcmVzKSwgdmp1c3QgPSAtMSwgc2l6ZSA9IDUpICsgICMgQWRkaW5nIGRhdGEgbGFiZWxzDQogIGxhYnModGl0bGUgPSAiQ3JpdGhpZGlhIHNwb3JlcyBwZXIgYmVlIG92ZXIgdGltZSIsDQogICAgICAgeCA9ICJEYXlzIFNpbmNlIElub2N1bGF0aW9uIiwNCiAgICAgICB5ID0gIk51bWJlciBvZiBTcG9yZXMiKSArDQogIGZhY2V0X3dyYXAofmJlZV9pZCkgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsNCiAgdGhlbWVfZ3JheShiYXNlX3NpemUgPSAxNSkNCmBgYA0KDQpgYGB7ciwgZmlnLndpZHRoPSAyNSwgZmlnLmhlaWdodD0gMTB9DQpnZ3Bsb3Qoc3Vic2V0X3Q0LjcsIGFlcyh4ID0gZGF5c19zaW5jZV9pbm5vY3VsYXRpb24sIHkgPSBzcG9yZXMsIGNvbG9yID0gaW5vY3VsYXRlKSkgKw0KICBnZW9tX3BvaW50KCkgKyANCiAgY29vcmRfY2FydGVzaWFuKHlsaW09YygwLCAzNzApKSArIA0KICBnZW9tX2xpbmUoYWVzKGdyb3VwID0gYmVlX2lkKSwgYWxwaGEgPSAwLjUpICsNCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IHNwb3JlcyksIHZqdXN0ID0gLTEsIHNpemUgPSA1KSArICAjIEFkZGluZyBkYXRhIGxhYmVscw0KICBsYWJzKHRpdGxlID0gIkNyaXRoaWRpYSBzcG9yZXMgcGVyIGJlZSBvdmVyIHRpbWUiLA0KICAgICAgIHggPSAiRGF5cyBTaW5jZSBJbm9jdWxhdGlvbiIsDQogICAgICAgeSA9ICJOdW1iZXIgb2YgU3BvcmVzIikgKw0KICBmYWNldF93cmFwKH5iZWVfaWQpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArDQogIHRoZW1lX2dyYXkoYmFzZV9zaXplID0gMTUpDQpgYGANCg0KYGBge3IsIGZpZy53aWR0aD0gMjUsIGZpZy5oZWlnaHQ9IDEwfQ0KZ2dwbG90KHN1YnNldF90NC44LCBhZXMoeCA9IGRheXNfc2luY2VfaW5ub2N1bGF0aW9uLCB5ID0gc3BvcmVzLCBjb2xvciA9IGlub2N1bGF0ZSkpICsNCiAgZ2VvbV9wb2ludCgpICsgDQogIGNvb3JkX2NhcnRlc2lhbih5bGltPWMoMCwgMzcwKSkgKyANCiAgZ2VvbV9saW5lKGFlcyhncm91cCA9IGJlZV9pZCksIGFscGhhID0gMC41KSArDQogIGdlb21fdGV4dChhZXMobGFiZWwgPSBzcG9yZXMpLCB2anVzdCA9IC0xLCBzaXplID0gNSkgKyAgIyBBZGRpbmcgZGF0YSBsYWJlbHMNCiAgbGFicyh0aXRsZSA9ICJDcml0aGlkaWEgc3BvcmVzIHBlciBiZWUgb3ZlciB0aW1lIiwNCiAgICAgICB4ID0gIkRheXMgU2luY2UgSW5vY3VsYXRpb24iLA0KICAgICAgIHkgPSAiTnVtYmVyIG9mIFNwb3JlcyIpICsNCiAgZmFjZXRfd3JhcCh+YmVlX2lkKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKw0KICB0aGVtZV9ncmF5KGJhc2Vfc2l6ZSA9IDE1KQ0KYGBgDQoNCmBgYHtyLCBmaWcud2lkdGg9IDI1LCBmaWcuaGVpZ2h0PSAxMH0NCmdncGxvdChzdWJzZXRfdDQuOSwgYWVzKHggPSBkYXlzX3NpbmNlX2lubm9jdWxhdGlvbiwgeSA9IHNwb3JlcywgY29sb3IgPSBpbm9jdWxhdGUpKSArDQogIGdlb21fcG9pbnQoKSArIA0KICBjb29yZF9jYXJ0ZXNpYW4oeWxpbT1jKDAsIDM3MCkpICsgDQogIGdlb21fbGluZShhZXMoZ3JvdXAgPSBiZWVfaWQpLCBhbHBoYSA9IDAuNSkgKw0KICBnZW9tX3RleHQoYWVzKGxhYmVsID0gc3BvcmVzKSwgdmp1c3QgPSAtMSwgc2l6ZSA9IDUpICsgICMgQWRkaW5nIGRhdGEgbGFiZWxzDQogIGxhYnModGl0bGUgPSAiQ3JpdGhpZGlhIHNwb3JlcyBwZXIgYmVlIG92ZXIgdGltZSIsDQogICAgICAgeCA9ICJEYXlzIFNpbmNlIElub2N1bGF0aW9uIiwNCiAgICAgICB5ID0gIk51bWJlciBvZiBTcG9yZXMiKSArDQogIGZhY2V0X3dyYXAofmJlZV9pZCkgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsNCiAgdGhlbWVfZ3JheShiYXNlX3NpemUgPSAxNSkNCmBgYA0KDQoNCiMjIEF2ZXJhZ2VzIG9mIHJlc3VsdHMgDQoNCmBgYHtyfQ0KDQphZGYgPC0gcXBjciAlPiUNCiAgZ3JvdXBfYnkodHJlYXRtZW50LCBkYXlzX3NpbmNlX2lubm9jdWxhdGlvbikgJT4lDQogIHN1bW1hcmlzZShtID0gbWVhbihzcG9yZXMpLA0KICAgICAgICAgICAgc2QgPSBzZChzcG9yZXMpLA0KICAgICAgICAgICAgbCA9IGxlbmd0aChzcG9yZXMpKSAlPiUNCiAgbXV0YXRlKHNlID0gc2Qvc3FydChsKSkNCg0KYWRmJGRheXMgPC0gYWRmJGRheXNfc2luY2VfaW5ub2N1bGF0aW9uDQoNCmFkZg0KDQpgYGANCg0KDQpgYGB7ciwgZmlnLmhlaWdodD0xMCwgZmlnLndpZHRoPTEyfQ0KcmFuZ2UocXBjciRzcG9yZXNfc3RhbmRhcmRpemVkKQ0KDQpnZ3Bsb3QocXBjciwgYWVzKHggPSBkYXlzLCB5ID0gc3BvcmVzX3N0YW5kYXJkaXplZCwgY29sb3IgPSB0cmVhdG1lbnQpKSArDQogIGdlb21fcG9pbnQoc2l6ZSA9IDUpKw0KICBnZ3RpdGxlKCJBdmVyYWdlIENyaXRoaWRpYSBTcG9yZXMgcGVyIFRyZWF0bWVudCIpKw0KICB4bGFiKCJEYXlzIHNpbmNlIGNvbG9ueSBpbm9jdWxhdGlvbiIpICsNCiAgeWxhYigiQXZlcmFnZSBTcG9yZXMiKSArDQogIHNjYWxlX2ZpbGxfdmlyaWRpc19kKCkgKw0KICB0aGVtZSh0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAyMCkpICsNCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgY29sb3IgPSAiYmxhY2siKSArDQogIGZhY2V0X3dyYXAofnRyZWF0bWVudCkNCg0KYGBgDQoNCg0KYGBge3J9DQoNCnNwb3JlbW9kIDwtIGxtZXIoc3BvcmVzX3N0YW5kYXJkaXplZCB+IGZ1bmdpY2lkZSp0aW1lICsgKDF8Y29sb255KSArICgxfGJlZV9pZCkgKyByb3VuZCArIGlub2N1bGF0ZSArIGF2Z19wb2xsZW4gKyBkcnksIGRhdGEgPSBxcGNyKQ0KDQpBbm92YShzcG9yZW1vZCkNCg0Kc3VtbWFyeShzcG9yZW1vZCkNCmBgYA0KDQo=