Resultados

1. Quais bactérias e quantas bactérias estão presentes na UTI do hospital independente da área e da situação de sujo e limpo?

# 
# bac %>% select(micro) %>% 
#   group_by(micro) %>% count() %>% 
#   ungroup %>% 
#   mutate(total = sum(n),  prop = paste0(round(n/total*100,2),"%")) %>% 
#   arrange(desc(n)) %>% kable()

bac  %>% select(naDNA,id,local,super,micro,momento,gram,diluicao,naDNA) %>% distinct_all() %>%
  group_by(micro) %>% count() %>% 
  ungroup %>% 
  mutate(total = sum(n),  prop = paste0(round(n/total*100,2),"%")) %>% 
  arrange((desc(n))) %>% datatable(
    .,
    rownames = FALSE,
    filter = "top",
    extensions = c('Buttons', 'Scroller'),
    options = list(
      dom = 'Blfrtip',
      buttons = c('csv', 'excel'),
      deferRender = T,
      #scrollY = '600px',
      scroller = TRUE))

# bacz <- bac %>% select(micro) %>% 
#   group_by(micro) %>% count() %>% 
#   ungroup %>% 
#   mutate(total = sum(n),  prop = paste0(round(n/total*100,1),"%")) %>% 
#   arrange(desc(n))

bacz <- bac  %>% select(naDNA,id,local,super,micro,momento,gram,diluicao,naDNA) %>% distinct_all() %>%
  group_by(micro) %>% count() %>% 
  ungroup %>% 
  mutate(total = sum(n),  prop = paste0(round(n/total*100,1),"%")) %>%
  arrange(desc(n))


  ggplot(bacz) +
  aes(x=reorder(micro,+n),y=n, fill=micro, label=paste0(n," (",round(n/total*100,2),"%)")) + 
  geom_bar(stat = "identity", position = "dodge") +
  scale_fill_manual(values = cor) +
  theme_pubr() +
  theme(legend.key = element_blank(),
        legend.position = "none",
        axis.text.y = element_text(face = "italic"),
        axis.text.x = element_text(angle = 0,
                                   hjust = 0.5,
                                   size=9,
                                   colour = "black")) +
  labs(caption = paste0("Total = ", bacz$total[1]) ) +
  geom_text(vjust=0.5,hjust=-0.01, size=3) + 
  xlab("") + ylab("Frequência") + coord_flip() #+ facet_wrap(~gram*momento, nrow = 2)

2. Qual a frequência de bactérias Gram positivas e Gram negativas na UTI comparando a situação de sujo e limpo?


bac  %>% select(momento,gram,id) %>% distinct_all() %>%
    group_by(momento,gram) %>% count() %>% 
    ungroup %>% 
    mutate(total = sum(n),  prop = paste0(round(n/total*100,2),"%")) %>%
    arrange(desc(n)) %>% kable()
momento gram n total prop
Antes da limpeza Gram positiva 37 119 31.09%
Antes da limpeza Gram negativa 29 119 24.37%
Após a limpeza Gram positiva 28 119 23.53%
Após a limpeza Gram negativa 25 119 21.01%

bac  %>% select(momento,gram,id) %>% distinct_all() %>%
  group_by(momento,gram) %>% count() %>% 
  ungroup %>% 
  mutate(total = sum(n),  prop = paste0(round(n/total*100,2),"%")) %>%
  arrange(desc(gram,momento)) %>%
  ggplot() +
  ggtitle("Gram positiva") +
  aes(x=reorder(gram,-n),y=n, fill=gram, label=paste0(n," \n ",round(n/total*100,2),"%")) + 
  geom_bar(stat = "identity", position = "dodge") +
  theme_pubr() +
  theme(legend.key = element_blank(),
        legend.position = "none",
        axis.text.x = element_text(angle = 90,
                                   hjust = 1,
                                   colour = "black")) +
  labs(caption = paste0("Total = ", bacz$total[1]) ) +
  geom_text(vjust=-0.2, size=3) + 
  xlab("") + ylab("Frequência") + facet_grid(~momento)


bac %>% filter(gram=="Gram positiva") %>% 
  select(momento,gram,id) %>% distinct_all() %>%
  group_by(momento,gram) %>% count() %>% 
  ungroup %>% 
  mutate(total = sum(n),  prop = paste0(round(n/total*100,2),"%")) %>%
  arrange(desc(n)) %>% kable()
momento gram n total prop
Antes da limpeza Gram positiva 37 65 56.92%
Após a limpeza Gram positiva 28 65 43.08%

bacz <- bac %>% filter(gram=="Gram positiva") %>% 
  select(momento,gram,id,micro) %>% distinct_all() %>%
  group_by(momento,gram,micro) %>% count() %>% 
  ungroup %>% 
  mutate(total = sum(n),  prop = paste0(round(n/total*100,2),"%")) %>%
  arrange(desc(n))

ggplot(bacz) +
  ggtitle("Gram positiva") +
  scale_fill_manual(values = cor) +
  aes(x=reorder(micro,-n),y=n, fill=micro, label=paste0(n," \n ",round(n/total*100,2),"%")) + 
  geom_bar(stat = "identity", position = "dodge") +
  theme_pubr() +
  theme(legend.key = element_blank(),
        legend.position = "none",
        axis.text.x = element_text(angle = 90,
                                   hjust = 1,
                                   colour = "black")) +
  labs(caption = paste0("Total = ", bacz$total[1]) ) +
  geom_text(vjust=-0.2, size=3) + 
  xlab("") + ylab("Frequência") + facet_wrap(~momento, nrow = 2) + theme(axis.text.x = element_text(face = "italic")) 




bac %>% filter(gram=="Gram positiva" & momento=="Antes da limpeza") %>% 
  select(momento,gram,id,micro) %>% distinct_all() %>%
  group_by(momento,gram,micro) %>% count() %>% 
  ungroup %>% 
  mutate(total = sum(n),  prop = paste0(round(n/total*100,2),"%")) %>%
  arrange(desc(n)) %>% kable()
momento gram micro n total prop
Antes da limpeza Gram positiva Bastonete Gram positivo 17 37 45.95%
Antes da limpeza Gram positiva Enterococcus faecalis 9 37 24.32%
Antes da limpeza Gram positiva Staphylococcus aureus 2 37 5.41%
Antes da limpeza Gram positiva Staphylococcus epidermidis 2 37 5.41%
Antes da limpeza Gram positiva Staphylococcus haemolyticus 2 37 5.41%
Antes da limpeza Gram positiva Enterococcus faecium 1 37 2.7%
Antes da limpeza Gram positiva Kocuria rhizophila 1 37 2.7%
Antes da limpeza Gram positiva Staphylococcus cohnii 1 37 2.7%
Antes da limpeza Gram positiva Staphylococcus saprophyticus 1 37 2.7%
Antes da limpeza Gram positiva Staphylococcus sciuri 1 37 2.7%

bac %>% filter(gram=="Gram positiva" & momento=="Após a limpeza") %>% 
  select(momento,gram,id,micro) %>% distinct_all() %>%
  group_by(momento,gram,micro) %>% count() %>% 
  ungroup %>% 
  mutate(total = sum(n),  prop = paste0(round(n/total*100,2),"%")) %>%
  arrange(desc(n)) %>% kable()
momento gram micro n total prop
Após a limpeza Gram positiva Staphylococcus haemolyticus (MRSA + MBL) 4 28 14.29%
Após a limpeza Gram positiva Staphylococcus hominis 3 28 10.71%
Após a limpeza Gram positiva Staphylococcus hominis (MRSA + MBL) 3 28 10.71%
Após a limpeza Gram positiva Staphylococcus lentus 3 28 10.71%
Após a limpeza Gram positiva Bastonete Gram positivo 2 28 7.14%
Após a limpeza Gram positiva Enterococcus faecium 2 28 7.14%
Após a limpeza Gram positiva Staphylococcus hominis (MBL) 2 28 7.14%
Após a limpeza Gram positiva Aerococcus viridans 1 28 3.57%
Após a limpeza Gram positiva Alloiococcus otitis 1 28 3.57%
Após a limpeza Gram positiva Corynebacterium jeikeium 1 28 3.57%
Após a limpeza Gram positiva Enterococcus columbae 1 28 3.57%
Após a limpeza Gram positiva Enterococcus faecalis 1 28 3.57%
Após a limpeza Gram positiva Staphylococcus caprae 1 28 3.57%
Após a limpeza Gram positiva Staphylococcus epidermidis 1 28 3.57%
Após a limpeza Gram positiva Staphylococcus haemolyticus 1 28 3.57%
Após a limpeza Gram positiva Staphylococcus warneri (MRSA + MBL) 1 28 3.57%

a <- bac %>% filter(gram=="Gram positiva" & momento=="Antes da limpeza") %>% 
  select(momento,gram,id,micro) %>% distinct_all() %>%
  group_by(momento,gram,micro) %>% count() %>% 
  ungroup %>% mutate(total = sum(n),  prop = paste0(round(n/total*100,2),"%")) %>%
  arrange(desc(n)) %>% 
  ggplot() +
  #ggtitle("Gram positiva") +
  labs(subtitle = "Antes da limpeza") +
  scale_fill_manual(values = cor) +
  aes(x=reorder(micro,-n),y=n, fill=micro, label=paste0(n," \n ",round(n/total*100,2),"%")) + 
  geom_bar(stat = "identity", position = "dodge") +
  theme_pubr() +
  theme(legend.key = element_blank(),
        legend.position = "none",
        axis.text.x = element_text(angle = 90,
                                   hjust = 1,
                                   colour = "black")) +
  geom_text(vjust=-0.2, size=3) + 
  xlab("") + ylab("Frequência") + theme(axis.text.x = element_text(face = "italic"))

a


b <- bac %>% filter(gram=="Gram positiva" & momento=="Após a limpeza") %>% 
  select(momento,gram,id,micro) %>% distinct_all() %>%
  group_by(momento,gram,micro) %>% count() %>% 
  ungroup %>% mutate(total = sum(n),  prop = paste0(round(n/total*100,2),"%")) %>%
  arrange(desc(n)) %>% 
  ggplot() +
 # ggtitle("Gram positiva") +
  labs(subtitle = "Após a limpeza") +
  aes(x=reorder(micro,-n),y=n, fill=micro, label=paste0(n," \n ",round(n/total*100,2),"%")) + 
  geom_bar(stat = "identity", position = "dodge") +
  theme_pubr() +
  theme(legend.key = element_blank(),
        legend.position = "none",
        axis.text.x = element_text(angle = 90,
                                   hjust = 1,
                                   colour = "black")) +
  geom_text(vjust=-0.2, size=3) + 
  xlab("") + ylab("Frequência") + theme(axis.text.x = element_text(face = "italic"))


b



bac %>% filter(gram=="Gram negativa") %>% 
  select(momento,gram,id,micro) %>% distinct_all() %>%
  group_by(momento,gram,micro) %>% count() %>% 
  ungroup %>% 
  mutate(total = sum(n),  prop = paste0(round(n/total*100,2),"%")) %>%
  arrange(desc(n)) %>% kable()
momento gram micro n total prop
Antes da limpeza Gram negativa Serratia marcescens 12 54 22.22%
Antes da limpeza Gram negativa Klebsiella pneumoniae 5 54 9.26%
Após a limpeza Gram negativa Pantoea spp 5 54 9.26%
Antes da limpeza Gram negativa Acinetobacter baumannii complex 4 54 7.41%
Após a limpeza Gram negativa Acinetobacter baumannii 4 54 7.41%
Após a limpeza Gram negativa Klebsiella pneumoniae (ESBL) 4 54 7.41%
Após a limpeza Gram negativa Acinetobacter baumannii complex 3 54 5.56%
Após a limpeza Gram negativa Klebsiella pneumoniae 3 54 5.56%
Antes da limpeza Gram negativa Enterobacter cloacae complex 2 54 3.7%
Antes da limpeza Gram negativa Klebsiella pneumoniae (ESBL) 2 54 3.7%
Após a limpeza Gram negativa Acinetobacter baumannii complex (KPC) 2 54 3.7%
Antes da limpeza Gram negativa Aeromonas salmonicida 1 54 1.85%
Antes da limpeza Gram negativa Burkholderia mallei 1 54 1.85%
Antes da limpeza Gram negativa Escherichia coli 1 54 1.85%
Antes da limpeza Gram negativa Pseudomonas stutzeri 1 54 1.85%
Após a limpeza Gram negativa Acinetobacter baumannii complex (ESBL) 1 54 1.85%
Após a limpeza Gram negativa Aeromonas salmonicida 1 54 1.85%
Após a limpeza Gram negativa Enterobacter cloacae (ESBL) 1 54 1.85%
Após a limpeza Gram negativa Enterobacter cloacae complex 1 54 1.85%

bacz <- bac %>% filter(gram=="Gram negativa") %>% 
  select(momento,gram,id,micro) %>% distinct_all() %>%
  group_by(momento,gram,micro) %>% count() %>% 
  ungroup %>% 
  mutate(total = sum(n),  prop = paste0(round(n/total*100,2),"%")) %>%
  arrange(desc(n)) 

ggplot(bacz) +
  ggtitle("Gram negativa") +
  scale_fill_manual(values = cor) +
  aes(x=reorder(micro,-n),y=n, fill=micro, label=paste0(n," \n ",round(n/total*100,2),"%")) + 
  geom_bar(stat = "identity", position = "dodge") +
  theme_pubr() +
  theme(legend.key = element_blank(),
        legend.position = "none",
        axis.text.x = element_text(angle = 90,
                                   hjust = 1,
                                   colour = "black")) +
  geom_text(vjust=-0.2, size=3) + 
  labs(caption = paste0("Total = ", bacz$total[1]) ) +
  xlab("") + ylab("Frequência") + facet_wrap(~momento, nrow = 2) + theme(axis.text.x = element_text(face = "italic"))



a <- bac %>% filter(gram=="Gram negativa" & momento=="Antes da limpeza") %>% 
  select(momento,gram,id,micro) %>% distinct_all() %>%
  group_by(momento,gram,micro) %>% count() %>% 
  ungroup %>% mutate(total = sum(n),  prop = paste0(round(n/total*100,2),"%")) %>%
  arrange(desc(n)) %>% 
  ggplot() +
  scale_fill_manual(values = cor) +
  ggtitle("Gram negativa") +
  labs(subtitle = "Antes da limpeza") +
  aes(x=reorder(micro,-n),y=n, fill=micro, label=paste0(n," \n ",round(n/total*100,2),"%")) + 
  geom_bar(stat = "identity", position = "dodge") +
  theme_pubr() +
  theme(legend.key = element_blank(),
        legend.position = "none",
        axis.text.x = element_text(angle = 90,
                                   hjust = 1,
                                   colour = "black")) +
  geom_text(vjust=-0.2, size=3) + 
  xlab("") + ylab("Frequência") + theme(axis.text.x = element_text(face = "italic"))

a


b <- bac %>% filter(gram=="Gram negativa" & momento=="Após a limpeza") %>% 
  select(momento,gram,id,micro) %>% distinct_all() %>%
  group_by(momento,gram,micro) %>% count() %>% 
  ungroup %>% mutate(total = sum(n),  prop = paste0(round(n/total*100,2),"%")) %>%
  arrange(desc(n)) %>% 
  ggplot() +
  ggtitle("Gram negativa") +
  labs(subtitle = "Após a limpeza") +
  aes(x=reorder(micro,-n),y=n, fill=micro, label=paste0(n," \n ",round(n/total*100,2),"%")) + 
  geom_bar(stat = "identity", position = "dodge") +
  theme_pubr() +
  theme(legend.key = element_blank(),
        legend.position = "none",
        axis.text.x = element_text(angle = 90,
                                   hjust = 1,
                                   colour = "black")) +
  geom_text(vjust=-0.2, size=3) + 
  xlab("") + ylab("Frequência") + theme(axis.text.x = element_text(face = "italic"))


b

3. Qual a frequência de bactérias Gram positivas e Gram negativas encontrada por área, comparando sujo e limpo?

LEITO 03


bac %>% filter(local =="Leito 03") %>%
  select(momento,gram,id,micro) %>% distinct_all() %>%
  group_by(momento,gram) %>% count() %>% 
  ungroup %>% 
  mutate(total = sum(n),  prop = paste0(round(n/total*100,2),"%")) %>%
  arrange(desc(gram,momento)) %>% kable()
momento gram n total prop
Antes da limpeza Gram positiva 4 9 44.44%
Após a limpeza Gram positiva 4 9 44.44%
Após a limpeza Gram negativa 1 9 11.11%

bacz <- bac %>% filter(local =="Leito 03") %>%
  select(momento,gram,id,micro) %>% distinct_all() %>%
  group_by(momento,gram) %>% count() %>% 
  ungroup %>% 
  mutate(total = sum(n),  prop = paste0(round(n/total*100,2),"%")) %>%
  arrange(desc(gram,momento))


ggplot(bacz) +
  ggtitle("Leito 03") +
  aes(x=reorder(gram,-n),y=n, fill=gram, label=paste0(n," \n ",round(n/total*100,2),"%")) + 
  geom_bar(stat = "identity", position = "dodge") +
  theme_pubr() +
  theme(legend.key = element_blank(),
        legend.position = "none",
        axis.text.x = element_text(angle = 90,
                                   hjust = 1,
                                   colour = "black")) +
  geom_text(vjust=-0.2, size=3) + 
  labs(subtitle = paste0("Total = ", bacz$total[1]) ) +
  xlab("") + ylab("Frequência") + facet_wrap(~momento, ncol = 2)

LEITO 04


bac %>% filter(local =="Leito 04") %>%
  select(momento,gram,id,micro) %>% distinct_all() %>%
  group_by(momento,gram) %>% count() %>% 
  ungroup %>% 
  mutate(total = sum(n),  prop = paste0(round(n/total*100,2),"%")) %>%
  arrange(desc(gram,momento)) %>% kable()
momento gram n total prop
Antes da limpeza Gram positiva 4 8 50%
Após a limpeza Gram positiva 1 8 12.5%
Após a limpeza Gram negativa 3 8 37.5%

bacz <- bac %>% filter(local =="Leito 04") %>%
  select(momento,gram,id,micro) %>% distinct_all() %>%
  group_by(momento,gram) %>% count() %>% 
  ungroup %>% 
  mutate(total = sum(n),  prop = paste0(round(n/total*100,2),"%")) %>%
  arrange(desc(gram,momento))
ggplot(bacz) +
  ggtitle("Leito 04") +
  aes(x=reorder(gram,-n),y=n, fill=gram, label=paste0(n," \n ",round(n/total*100,2),"%")) + 
  geom_bar(stat = "identity", position = "dodge") +
  theme_pubr() +
  theme(legend.key = element_blank(),
        legend.position = "none",
        axis.text.x = element_text(angle = 90,
                                   hjust = 1,
                                   colour = "black")) +
  geom_text(vjust=-0.2, size=3) + 
  labs(subtitle = paste0("Total = ", bacz$total[1]) ) +
  xlab("") + ylab("Frequência") + facet_wrap(~momento, ncol = 2)

LEITO 05


bac %>% filter(local =="Leito 05") %>%
  select(momento,gram,id,micro) %>% distinct_all() %>%
  group_by(momento,gram) %>% count() %>% 
  ungroup %>% 
  mutate(total = sum(n),  prop = paste0(round(n/total*100,2),"%")) %>%
  arrange(desc(gram,momento)) %>% kable()
momento gram n total prop
Antes da limpeza Gram positiva 4 12 33.33%
Após a limpeza Gram positiva 4 12 33.33%
Após a limpeza Gram negativa 4 12 33.33%

bacz <- bac %>% filter(local =="Leito 05") %>%
  select(momento,gram,id,micro) %>% distinct_all() %>%
  group_by(momento,gram) %>% count() %>% 
  ungroup %>% 
  mutate(total = sum(n),  prop = paste0(round(n/total*100,2),"%")) %>%
  arrange(desc(gram,momento))
ggplot(bacz) +
  ggtitle("Leito 05") +
  aes(x=reorder(gram,-n),y=n, fill=gram, label=paste0(n," \n ",round(n/total*100,2),"%")) + 
  geom_bar(stat = "identity", position = "dodge") +
  theme_pubr() +
  theme(legend.key = element_blank(),
        legend.position = "none",
        axis.text.x = element_text(angle = 90,
                                   hjust = 1,
                                   colour = "black")) +
  geom_text(vjust=-0.2, size=3) + 
  labs(subtitle = paste0("Total = ", bacz$total[1]) ) +
  xlab("") + ylab("Frequência") + facet_wrap(~momento, ncol = 2)

LEITO 06


bac %>% filter(local =="Leito 06") %>%
  select(momento,gram,id,micro) %>% distinct_all() %>%
  group_by(momento,gram) %>% count() %>% 
  ungroup %>% 
  mutate(total = sum(n),  prop = paste0(round(n/total*100,2),"%")) %>%
  arrange(desc(gram,momento)) %>% kable()
momento gram n total prop
Antes da limpeza Gram positiva 5 18 27.78%
Após a limpeza Gram positiva 4 18 22.22%
Antes da limpeza Gram negativa 6 18 33.33%
Após a limpeza Gram negativa 3 18 16.67%

bacz <- bac %>% filter(local =="Leito 06") %>%
  select(momento,gram,id,micro) %>% distinct_all() %>%
  group_by(momento,gram) %>% count() %>% 
  ungroup %>% 
  mutate(total = sum(n),  prop = paste0(round(n/total*100,2),"%")) %>%
  arrange(desc(gram,momento))
ggplot(bacz) +
  ggtitle("Leito 06") +
  aes(x=reorder(gram,-n),y=n, fill=gram, label=paste0(n," \n ",round(n/total*100,2),"%")) + 
  geom_bar(stat = "identity", position = "dodge") +
  theme_pubr() +
  theme(legend.key = element_blank(),
        legend.position = "none",
        axis.text.x = element_text(angle = 90,
                                   hjust = 1,
                                   colour = "black")) +
  geom_text(vjust=-0.2, size=3) + 
  labs(subtitle = paste0("Total = ", bacz$total[1]) ) +
  xlab("") + ylab("Frequência") + facet_wrap(~momento, ncol = 2)

LEITO 08


bac %>% filter(local =="Leito 08") %>%
  select(momento,gram,id,micro) %>% distinct_all() %>%
  group_by(momento,gram) %>% count() %>% 
  ungroup %>% 
  mutate(total = sum(n),  prop = paste0(round(n/total*100,2),"%")) %>%
  arrange(desc(gram,momento)) %>% kable()
momento gram n total prop
Antes da limpeza Gram positiva 3 11 27.27%
Após a limpeza Gram positiva 4 11 36.36%
Antes da limpeza Gram negativa 1 11 9.09%
Após a limpeza Gram negativa 3 11 27.27%

bacz <- bac %>% filter(local =="Leito 08") %>%
  select(momento,gram,id,micro) %>% distinct_all() %>%
  group_by(momento,gram) %>% count() %>% 
  ungroup %>% 
  mutate(total = sum(n),  prop = paste0(round(n/total*100,2),"%")) %>%
  arrange(desc(gram,momento))
ggplot(bacz) +
  ggtitle("Leito 08") +
  aes(x=reorder(gram,-n),y=n, fill=gram, label=paste0(n," \n ",round(n/total*100,2),"%")) + 
  geom_bar(stat = "identity", position = "dodge") +
  theme_pubr() +
  theme(legend.key = element_blank(),
        legend.position = "none",
        axis.text.x = element_text(angle = 90,
                                   hjust = 1,
                                   colour = "black")) +
  geom_text(vjust=-0.2, size=3) + 
  labs(subtitle = paste0("Total = ", bacz$total[1]) ) +
  xlab("") + ylab("Frequência") + facet_wrap(~momento, ncol = 2)

LEITO 12


bac %>% filter(local =="Leito 12") %>%
  select(momento,gram,id,micro) %>% distinct_all() %>%
  group_by(momento,gram) %>% count() %>% 
  ungroup %>% 
  mutate(total = sum(n),  prop = paste0(round(n/total*100,2),"%")) %>%
  arrange(desc(gram,momento)) %>% kable()
momento gram n total prop
Antes da limpeza Gram positiva 5 10 50%
Após a limpeza Gram positiva 1 10 10%
Após a limpeza Gram negativa 4 10 40%

bacz <- bac %>% filter(local =="Leito 12") %>%
  select(momento,gram,id,micro) %>% distinct_all() %>%
  group_by(momento,gram) %>% count() %>% 
  ungroup %>% 
  mutate(total = sum(n),  prop = paste0(round(n/total*100,2),"%")) %>%
  arrange(desc(gram,momento))
ggplot(bacz) +
  ggtitle("Leito 12") +
  aes(x=reorder(gram,-n),y=n, fill=gram, label=paste0(n," \n ",round(n/total*100,2),"%")) + 
  geom_bar(stat = "identity", position = "dodge") +
  theme_pubr() +
  theme(legend.key = element_blank(),
        legend.position = "none",
        axis.text.x = element_text(angle = 90,
                                   hjust = 1,
                                   colour = "black")) +
  geom_text(vjust=-0.2, size=3) + 
  labs(subtitle = paste0("Total = ", bacz$total[1]) ) +
  xlab("") + ylab("Frequência") + facet_wrap(~momento, ncol = 2)

Área administrativa


bac %>% filter(local =="Área administrativa") %>%
  select(momento,gram,id,micro) %>% distinct_all() %>%
  group_by(momento,gram) %>% count() %>% 
  ungroup %>% 
  mutate(total = sum(n),  prop = paste0(round(n/total*100,2),"%")) %>%
  arrange(desc(gram,momento)) %>% kable()
momento gram n total prop
Após a limpeza Gram positiva 2 4 50%
Antes da limpeza Gram negativa 2 4 50%

bacz <- bac %>% filter(local =="Área administrativa") %>%
  select(momento,gram,id,micro) %>% distinct_all() %>%
  group_by(momento,gram) %>% count() %>% 
  ungroup %>% 
  mutate(total = sum(n),  prop = paste0(round(n/total*100,2),"%")) %>%
  arrange(desc(gram,momento))
ggplot(bacz) +
  ggtitle("Área administrativa") +
  aes(x=reorder(gram,-n),y=n, fill=gram, label=paste0(n," \n ",round(n/total*100,2),"%")) + 
  geom_bar(stat = "identity", position = "dodge") +
  theme_pubr() +
  theme(legend.key = element_blank(),
        legend.position = "none",
        axis.text.x = element_text(angle = 90,
                                   hjust = 1,
                                   colour = "black")) +
  geom_text(vjust=-0.2, size=3) + 
  labs(subtitle = paste0("Total = ", bacz$total[1]) ) +
  xlab("") + ylab("Frequência") + facet_wrap(~momento, ncol = 2)

Banheiro CTI


bac %>% filter(local =="Banheiro CTI") %>%
  select(momento,gram,id,micro) %>% distinct_all() %>%
  group_by(momento,gram) %>% count() %>% 
  ungroup %>% 
  mutate(total = sum(n),  prop = paste0(round(n/total*100,2),"%")) %>%
  arrange(desc(gram,momento)) %>% kable()
momento gram n total prop
Antes da limpeza Gram positiva 2 7 28.57%
Após a limpeza Gram positiva 1 7 14.29%
Antes da limpeza Gram negativa 3 7 42.86%
Após a limpeza Gram negativa 1 7 14.29%

bacz <- bac %>% filter(local =="Banheiro CTI") %>%
  select(momento,gram,id,micro) %>% distinct_all() %>%
  group_by(momento,gram) %>% count() %>% 
  ungroup %>% 
  mutate(total = sum(n),  prop = paste0(round(n/total*100,2),"%")) %>%
  arrange(desc(gram,momento))
ggplot(bacz) +
  ggtitle("Banheiro CTI") +
  aes(x=reorder(gram,-n),y=n, fill=gram, label=paste0(n," \n ",round(n/total*100,2),"%")) + 
  geom_bar(stat = "identity", position = "dodge") +
  theme_pubr() +
  theme(legend.key = element_blank(),
        legend.position = "none",
        axis.text.x = element_text(angle = 90,
                                   hjust = 1,
                                   colour = "black")) +
  geom_text(vjust=-0.2, size=3) + 
  labs(subtitle = paste0("Total = ", bacz$total[1]) ) +
  xlab("") + ylab("Frequência") + facet_wrap(~momento, ncol = 2)

Copa CTI


bac %>% filter(local =="Copa CTI") %>%
  select(momento,gram,id,micro) %>% distinct_all() %>%
  group_by(momento,gram) %>% count() %>% 
  ungroup %>% 
  mutate(total = sum(n),  prop = paste0(round(n/total*100,2),"%")) %>%
  arrange(desc(gram,momento)) %>% kable()
momento gram n total prop
Antes da limpeza Gram positiva 7 21 33.33%
Após a limpeza Gram positiva 2 21 9.52%
Antes da limpeza Gram negativa 9 21 42.86%
Após a limpeza Gram negativa 3 21 14.29%

bacz <- bac %>% filter(local =="Copa CTI") %>%
  select(momento,gram,id,micro) %>% distinct_all() %>%
  group_by(momento,gram) %>% count() %>% 
  ungroup %>% 
  mutate(total = sum(n),  prop = paste0(round(n/total*100,2),"%")) %>%
  arrange(desc(gram,momento))
ggplot(bacz) +
  ggtitle("Copa CTI") +
  aes(x=reorder(gram,-n),y=n, fill=gram, label=paste0(n," \n ",round(n/total*100,2),"%")) + 
  geom_bar(stat = "identity", position = "dodge") +
  theme_pubr() +
  theme(legend.key = element_blank(),
        legend.position = "none",
        axis.text.x = element_text(angle = 90,
                                   hjust = 1,
                                   colour = "black")) +
  geom_text(vjust=-0.2, size=3) + 
  labs(subtitle = paste0("Total = ", bacz$total[1]) ) +
  xlab("") + ylab("Frequência") + facet_wrap(~momento, ncol = 2)

CTI


bac %>% filter(local =="Pia do CTI") %>%
  select(momento,gram,id,micro) %>% distinct_all() %>%
  group_by(momento,gram) %>% count() %>% 
  ungroup %>% 
  mutate(total = sum(n),  prop = paste0(round(n/total*100,2),"%")) %>%
  arrange(desc(gram,momento)) %>% kable()
momento gram n total prop
Após a limpeza Gram positiva 2 6 33.33%
Antes da limpeza Gram negativa 3 6 50%
Após a limpeza Gram negativa 1 6 16.67%

bacz <- bac %>% filter(local =="Pia do CTI") %>%
  select(momento,gram,id,micro) %>% distinct_all() %>%
  group_by(momento,gram) %>% count() %>% 
  ungroup %>% 
  mutate(total = sum(n),  prop = paste0(round(n/total*100,2),"%")) %>%
  arrange(desc(gram,momento))
ggplot(bacz) +
  ggtitle("Pia do CTI") +
  aes(x=reorder(gram,-n),y=n, fill=gram, label=paste0(n," \n ",round(n/total*100,2),"%")) + 
  geom_bar(stat = "identity", position = "dodge") +
  theme_pubr() +
  theme(legend.key = element_blank(),
        legend.position = "none",
        axis.text.x = element_text(angle = 90,
                                   hjust = 1,
                                   colour = "black")) +
  geom_text(vjust=-0.2, size=3) + 
  labs(subtitle = paste0("Total = ", bacz$total[1]) ) +
  xlab("") + ylab("Frequência") + facet_wrap(~momento, ncol = 2)

Farmácia


bac %>% filter(local =="Farmácia") %>%
  select(momento,gram,id,micro) %>% distinct_all() %>%
  group_by(momento,gram) %>% count() %>% 
  ungroup %>% 
  mutate(total = sum(n),  prop = paste0(round(n/total*100,2),"%")) %>%
  arrange(desc(gram,momento)) %>% kable()
momento gram n total prop
Antes da limpeza Gram positiva 3 13 23.08%
Após a limpeza Gram positiva 3 13 23.08%
Antes da limpeza Gram negativa 5 13 38.46%
Após a limpeza Gram negativa 2 13 15.38%

bacz <- bac %>% filter(local =="Farmácia") %>%
  select(momento,gram,id,micro) %>% distinct_all() %>%
  group_by(momento,gram) %>% count() %>% 
  ungroup %>% 
  mutate(total = sum(n),  prop = paste0(round(n/total*100,2),"%")) %>%
  arrange(desc(gram,momento))
ggplot(bacz) +
  ggtitle("Farmácia") +
  aes(x=reorder(gram,-n),y=n, fill=gram, label=paste0(n," \n ",round(n/total*100,2),"%")) + 
  geom_bar(stat = "identity", position = "dodge") +
  theme_pubr() +
  theme(legend.key = element_blank(),
        legend.position = "none",
        axis.text.x = element_text(angle = 90,
                                   hjust = 1,
                                   colour = "black")) +
  geom_text(vjust=-0.2, size=3) + 
  labs(subtitle = paste0("Total = ", bacz$total[1]) ) +
  xlab("") + ylab("Frequência") + facet_wrap(~momento, ncol = 2)

4. Qual a frequência de cada bactéria encontrado por área, comparando sujo e limpo?

LEITO 03


bac %>% filter(local =="Leito 03") %>%
  select(gram, momento,micro,id) %>% distinct_all() %>%
  group_by(gram, momento,micro) %>% count() %>% 
  ungroup %>% 
  mutate(total = sum(n),  prop = paste0(round(n/total*100,2),"%")) %>%
  arrange(desc(gram,momento)) %>% kable()
gram momento micro n total prop
Gram positiva Antes da limpeza Bastonete Gram positivo 3 9 33.33%
Gram positiva Antes da limpeza Staphylococcus saprophyticus 1 9 11.11%
Gram positiva Após a limpeza Enterococcus columbae 1 9 11.11%
Gram positiva Após a limpeza Staphylococcus caprae 1 9 11.11%
Gram positiva Após a limpeza Staphylococcus epidermidis 1 9 11.11%
Gram positiva Após a limpeza Staphylococcus hominis (MRSA + MBL) 1 9 11.11%
Gram negativa Após a limpeza Klebsiella pneumoniae (ESBL) 1 9 11.11%

bacz <- bac %>% filter(local =="Leito 03") %>%
  select(gram, momento,micro,id) %>% distinct_all() %>%
  group_by(gram, momento,micro) %>% count() %>%
  ungroup %>% 
  mutate(total = sum(n),  prop = paste0(round(n/total*100,2),"%")) %>%
  arrange(desc(micro, gram,momento))
ggplot(bacz) +
  ggtitle("Leito 03") +
  aes(x=reorder(micro,-n),y=n, fill=micro, label=paste0(n," \n ",round(n/total*100,2),"%")) + 
  geom_bar(stat = "identity", position = "dodge") +
  theme_pubr() +
  theme(legend.key = element_blank(),
        legend.position = "none",
        axis.text.x = element_text(angle = 90,
                                   hjust = 1,
                                   colour = "black")) +
  geom_text(vjust=-0.2, size=3) + 
  labs(subtitle = paste0("Total = ", bacz$total[1]) ) +
  xlab("") + ylab("Frequência") + facet_wrap(~momento, nrow = 2) + theme(axis.text.x = element_text(face = "italic"))

LEITO 04


bac %>% filter(local =="Leito 04") %>%
  select(gram, momento,micro,id) %>% distinct_all() %>%
  group_by(gram, momento,micro) %>% count() %>% 
  ungroup %>% 
  mutate(total = sum(n),  prop = paste0(round(n/total*100,2),"%")) %>%
  arrange(desc(gram,momento)) %>% kable()
gram momento micro n total prop
Gram positiva Antes da limpeza Bastonete Gram positivo 4 8 50%
Gram positiva Após a limpeza Staphylococcus haemolyticus 1 8 12.5%
Gram negativa Após a limpeza Klebsiella pneumoniae 1 8 12.5%
Gram negativa Após a limpeza Pantoea spp 2 8 25%

bacz <- bac %>% filter(local =="Leito 04") %>%
  select(gram, momento,micro,id) %>% distinct_all() %>%
  group_by(gram, momento,micro) %>% count() %>% 
  ungroup %>% 
  mutate(total = sum(n),  prop = paste0(round(n/total*100,2),"%")) %>%
  arrange(desc(micro, gram,momento))

ggplot(bacz) +
  ggtitle("Leito 04") +
  aes(x=reorder(micro,-n),y=n, fill=micro, label=paste0(n," \n ",round(n/total*100,2),"%")) + 
  geom_bar(stat = "identity", position = "dodge") +
  theme_pubr() +
  theme(legend.key = element_blank(),
        legend.position = "none",
        axis.text.x = element_text(angle = 90,
                                   hjust = 1,
                                   colour = "black")) +
  geom_text(vjust=-0.2, size=3) + 
  labs(subtitle = paste0("Total = ", bacz$total[1]) ) +
  xlab("") + ylab("Frequência") + facet_wrap(~momento, nrow = 2)+ theme(axis.text.x = element_text(face = "italic"))

LEITO 05


bac %>% filter(local =="Leito 05") %>%
  select(gram, momento,micro,id) %>% distinct_all() %>%
  group_by(gram, momento,micro) %>% count() %>% 
  ungroup %>% 
  mutate(total = sum(n),  prop = paste0(round(n/total*100,2),"%")) %>%
  arrange(desc(gram,momento)) %>% kable()
gram momento micro n total prop
Gram positiva Antes da limpeza Bastonete Gram positivo 4 12 33.33%
Gram positiva Após a limpeza Staphylococcus haemolyticus (MRSA + MBL) 1 12 8.33%
Gram positiva Após a limpeza Staphylococcus hominis (MBL) 2 12 16.67%
Gram positiva Após a limpeza Staphylococcus hominis (MRSA + MBL) 1 12 8.33%
Gram negativa Após a limpeza Acinetobacter baumannii complex (ESBL) 1 12 8.33%
Gram negativa Após a limpeza Acinetobacter baumannii complex (KPC) 2 12 16.67%
Gram negativa Após a limpeza Klebsiella pneumoniae (ESBL) 1 12 8.33%

bacz <- bac %>% filter(local =="Leito 05") %>%
  select(gram, momento,micro,id) %>% distinct_all() %>%
  group_by(gram, momento,micro) %>% count() %>% 
  ungroup %>% 
  mutate(total = sum(n),  prop = paste0(round(n/total*100,2),"%")) %>%
  arrange(desc(micro, gram,momento))
ggplot(bacz) +
  ggtitle("Leito 05") +
  aes(x=reorder(micro,-n),y=n, fill=micro, label=paste0(n," \n ",round(n/total*100,2),"%")) + 
  geom_bar(stat = "identity", position = "dodge") +
  theme_pubr() +
  theme(legend.key = element_blank(),
        legend.position = "none",
        axis.text.x = element_text(angle = 90,
                                   hjust = 1,
                                   colour = "black")) +
  geom_text(vjust=-0.2, size=3) + 
  labs(subtitle = paste0("Total = ", bacz$total[1]) ) +
  xlab("") + ylab("Frequência") + facet_wrap(~momento, nrow = 2) + theme(axis.text.x = element_text(face = "italic"))

LEITO 06


bac %>% filter(local =="Leito 06") %>%
  select(gram, momento,micro,id) %>% distinct_all() %>%
  group_by(gram, momento,micro) %>% count() %>% 
  ungroup %>% 
  mutate(total = sum(n),  prop = paste0(round(n/total*100,2),"%")) %>%
  arrange(desc(gram,momento)) %>% kable()
gram momento micro n total prop
Gram positiva Antes da limpeza Enterococcus faecalis 3 18 16.67%
Gram positiva Antes da limpeza Staphylococcus aureus 1 18 5.56%
Gram positiva Antes da limpeza Staphylococcus epidermidis 1 18 5.56%
Gram positiva Após a limpeza Bastonete Gram positivo 1 18 5.56%
Gram positiva Após a limpeza Staphylococcus haemolyticus (MRSA + MBL) 1 18 5.56%
Gram positiva Após a limpeza Staphylococcus hominis 1 18 5.56%
Gram positiva Após a limpeza Staphylococcus lentus 1 18 5.56%
Gram negativa Antes da limpeza Acinetobacter baumannii complex 1 18 5.56%
Gram negativa Antes da limpeza Pseudomonas stutzeri 1 18 5.56%
Gram negativa Antes da limpeza Serratia marcescens 4 18 22.22%
Gram negativa Após a limpeza Acinetobacter baumannii complex 1 18 5.56%
Gram negativa Após a limpeza Klebsiella pneumoniae (ESBL) 1 18 5.56%
Gram negativa Após a limpeza Pantoea spp 1 18 5.56%

bacz <- bac %>% filter(local =="Leito 06") %>%
  select(gram, momento,micro,id) %>% distinct_all() %>%
  group_by(gram, momento,micro) %>% count() %>% 
  ungroup %>% 
  mutate(total = sum(n),  prop = paste0(round(n/total*100,2),"%")) %>%
  arrange(desc(micro, gram,momento))
ggplot(bacz) +
  ggtitle("Leito 06") +
  aes(x=reorder(micro,-n),y=n, fill=micro, label=paste0(n," \n ",round(n/total*100,2),"%")) + 
  geom_bar(stat = "identity", position = "dodge") +
  theme_pubr() +
  theme(legend.key = element_blank(),
        legend.position = "none",
        axis.text.x = element_text(angle = 90,
                                   hjust = 1,
                                   colour = "black")) +
  geom_text(vjust=-0.2, size=3) + 
  labs(subtitle = paste0("Total = ", bacz$total[1]) ) +
  xlab("") + ylab("Frequência") + facet_wrap(~momento, nrow = 2)+ theme(axis.text.x = element_text(face = "italic"))

LEITO 08


bac %>% filter(local =="Leito 08") %>%
  select(gram, momento,micro,id) %>% distinct_all() %>%
  group_by(gram, momento,micro) %>% count() %>% 
  ungroup %>% 
  mutate(total = sum(n),  prop = paste0(round(n/total*100,2),"%")) %>%
  arrange(desc(gram,momento)) %>% kable()
gram momento micro n total prop
Gram positiva Antes da limpeza Bastonete Gram positivo 3 11 27.27%
Gram positiva Após a limpeza Aerococcus viridans 1 11 9.09%
Gram positiva Após a limpeza Enterococcus faecium 2 11 18.18%
Gram positiva Após a limpeza Staphylococcus hominis 1 11 9.09%
Gram negativa Antes da limpeza Enterobacter cloacae complex 1 11 9.09%
Gram negativa Após a limpeza Acinetobacter baumannii 1 11 9.09%
Gram negativa Após a limpeza Pantoea spp 2 11 18.18%

bacz <- bac %>% filter(local =="Leito 08") %>%
  select(gram, momento,micro,id) %>% distinct_all() %>%
  group_by(gram, momento,micro) %>% count() %>% 
  ungroup %>% 
  mutate(total = sum(n),  prop = paste0(round(n/total*100,2),"%")) %>%
  arrange(desc(micro, gram,momento))
ggplot(bacz) +
  ggtitle("Leito 08") +
  aes(x=reorder(micro,-n),y=n, fill=micro, label=paste0(n," \n ",round(n/total*100,2),"%")) + 
  geom_bar(stat = "identity", position = "dodge") +
  theme_pubr() +
  theme(legend.key = element_blank(),
        legend.position = "none",
        axis.text.x = element_text(angle = 90,
                                   hjust = 1,
                                   colour = "black")) +
  geom_text(vjust=-0.2, size=3) + 
  labs(subtitle = paste0("Total = ", bacz$total[1]) ) +
  xlab("") + ylab("Frequência") + facet_wrap(~momento, nrow = 2) + theme(axis.text.x = element_text(face = "italic"))

LEITO 12


bac %>% filter(local =="Leito 12") %>%
  select(gram, momento,micro,id) %>% distinct_all() %>%
  group_by(gram, momento,micro) %>% count() %>% 
  ungroup %>% 
  mutate(total = sum(n),  prop = paste0(round(n/total*100,2),"%")) %>%
  arrange(desc(gram,momento)) %>% kable()
gram momento micro n total prop
Gram positiva Antes da limpeza Bastonete Gram positivo 3 10 30%
Gram positiva Antes da limpeza Staphylococcus haemolyticus 2 10 20%
Gram positiva Após a limpeza Bastonete Gram positivo 1 10 10%
Gram negativa Após a limpeza Acinetobacter baumannii 2 10 20%
Gram negativa Após a limpeza Acinetobacter baumannii complex 1 10 10%
Gram negativa Após a limpeza Klebsiella pneumoniae 1 10 10%

bacz <- bac %>% filter(local =="Leito 12") %>%
  select(gram, momento,micro,id) %>% distinct_all() %>%
  group_by(gram, momento,micro) %>% count() %>% 
  ungroup %>% 
  mutate(total = sum(n),  prop = paste0(round(n/total*100,2),"%")) %>%
  arrange(desc(micro, gram,momento))
ggplot(bacz) +
  ggtitle("Leito 12") +
  aes(x=reorder(micro,-n),y=n, fill=micro, label=paste0(n," \n ",round(n/total*100,2),"%")) + 
  geom_bar(stat = "identity", position = "dodge") +
  theme_pubr() +
  theme(legend.key = element_blank(),
        legend.position = "none",
        axis.text.x = element_text(angle = 90,
                                   hjust = 1,
                                   colour = "black")) +
  geom_text(vjust=-0.2, size=3) + 
  labs(subtitle = paste0("Total = ", bacz$total[1]) ) +
  xlab("") + ylab("Frequência") + facet_wrap(~momento, nrow = 2) + theme(axis.text.x = element_text(face = "italic"))

Área administrativa


bac %>% filter(local =="Área administrativa") %>%
  select(gram, momento,micro,id) %>% distinct_all() %>%
  group_by(gram, momento,micro) %>% count() %>% 
  ungroup %>% 
  mutate(total = sum(n),  prop = paste0(round(n/total*100,2),"%")) %>%
  arrange(desc(gram,momento)) %>% kable()
gram momento micro n total prop
Gram positiva Após a limpeza Alloiococcus otitis 1 4 25%
Gram positiva Após a limpeza Staphylococcus haemolyticus (MRSA + MBL) 1 4 25%
Gram negativa Antes da limpeza Acinetobacter baumannii complex 1 4 25%
Gram negativa Antes da limpeza Klebsiella pneumoniae 1 4 25%

bacz <- bac %>% filter(local =="Área administrativa") %>%
  select(gram, momento,micro,id) %>% distinct_all() %>%
  group_by(gram, momento,micro) %>% count() %>% 
  ungroup %>% 
  mutate(total = sum(n),  prop = paste0(round(n/total*100,2),"%")) %>%
  arrange(desc(micro, gram,momento))

ggplot(bacz) +
  ggtitle("Área administrativa") +
  aes(x=reorder(micro,-n),y=n, fill=micro, label=paste0(n," \n ",round(n/total*100,2),"%")) + 
  geom_bar(stat = "identity", position = "dodge") +
  theme_pubr() +
  theme(legend.key = element_blank(),
        legend.position = "none",
        axis.text.x = element_text(angle = 90,
                                   hjust = 1,
                                   colour = "black")) +
  geom_text(vjust=-0.2, size=3) + 
  labs(subtitle = paste0("Total = ", bacz$total[1]) ) +
  xlab("") + ylab("Frequência") + facet_wrap(~momento, nrow = 2) + theme(axis.text.x = element_text(face = "italic"))

Banheiro CTI


bac %>% filter(local =="Banheiro CTI") %>%
  select(gram, momento,micro,id) %>% distinct_all() %>%
  group_by(gram, momento,micro) %>% count() %>% 
  ungroup %>% 
  mutate(total = sum(n),  prop = paste0(round(n/total*100,2),"%")) %>%
  arrange(desc(gram,momento)) %>% kable()
gram momento micro n total prop
Gram positiva Antes da limpeza Enterococcus faecalis 1 7 14.29%
Gram positiva Antes da limpeza Staphylococcus aureus 1 7 14.29%
Gram positiva Após a limpeza Staphylococcus lentus 1 7 14.29%
Gram negativa Antes da limpeza Serratia marcescens 3 7 42.86%
Gram negativa Após a limpeza Klebsiella pneumoniae (ESBL) 1 7 14.29%

bacz <- bac %>% filter(local =="Banheiro CTI") %>%
  select(gram, momento,micro,id) %>% distinct_all() %>%
  group_by(gram, momento,micro) %>% count() %>% 
  ungroup %>% 
  mutate(total = sum(n),  prop = paste0(round(n/total*100,2),"%")) %>%
  arrange(desc(micro, gram,momento))

ggplot(bacz) +
  ggtitle("Banheiro CTI") +
  aes(x=reorder(micro,-n),y=n, fill=micro, label=paste0(n," \n ",round(n/total*100,2),"%")) + 
  geom_bar(stat = "identity", position = "dodge") +
  theme_pubr() +
  theme(legend.key = element_blank(),
        legend.position = "none",
        axis.text.x = element_text(angle = 90,
                                   hjust = 1,
                                   colour = "black")) +
  geom_text(vjust=-0.2, size=3) + 
  labs(subtitle = paste0("Total = ", bacz$total[1]) ) +
  xlab("") + ylab("Frequência") + facet_wrap(~momento, nrow = 2) + theme(axis.text.x = element_text(face = "italic"))

Copa CTI


bac %>% filter(local =="Copa CTI") %>%
  select(gram, momento,micro,id) %>% distinct_all() %>%
  group_by(gram, momento,micro) %>% count() %>% 
  ungroup %>% 
  mutate(total = sum(n),  prop = paste0(round(n/total*100,2),"%")) %>%
  arrange(desc(gram,momento)) %>% kable()
gram momento micro n total prop
Gram positiva Antes da limpeza Enterococcus faecalis 2 21 9.52%
Gram positiva Antes da limpeza Enterococcus faecium 1 21 4.76%
Gram positiva Antes da limpeza Kocuria rhizophila 1 21 4.76%
Gram positiva Antes da limpeza Staphylococcus cohnii 1 21 4.76%
Gram positiva Antes da limpeza Staphylococcus epidermidis 1 21 4.76%
Gram positiva Antes da limpeza Staphylococcus sciuri 1 21 4.76%
Gram positiva Após a limpeza Staphylococcus haemolyticus (MRSA + MBL) 1 21 4.76%
Gram positiva Após a limpeza Staphylococcus hominis 1 21 4.76%
Gram negativa Antes da limpeza Aeromonas salmonicida 1 21 4.76%
Gram negativa Antes da limpeza Burkholderia mallei 1 21 4.76%
Gram negativa Antes da limpeza Escherichia coli 1 21 4.76%
Gram negativa Antes da limpeza Klebsiella pneumoniae 2 21 9.52%
Gram negativa Antes da limpeza Klebsiella pneumoniae (ESBL) 1 21 4.76%
Gram negativa Antes da limpeza Serratia marcescens 3 21 14.29%
Gram negativa Após a limpeza Acinetobacter baumannii 1 21 4.76%
Gram negativa Após a limpeza Enterobacter cloacae (ESBL) 1 21 4.76%
Gram negativa Após a limpeza Klebsiella pneumoniae 1 21 4.76%

bacz <- bac %>% filter(local =="Copa CTI") %>%
  select(gram, momento,micro,id) %>% distinct_all() %>%
  group_by(gram, momento,micro) %>% count() %>% 
  ungroup %>% 
  mutate(total = sum(n),  prop = paste0(round(n/total*100,2),"%")) %>%
  arrange(desc(micro, gram,momento))

ggplot(bacz) +
  ggtitle("Copa CTI") +
  aes(x=reorder(micro,-n),y=n, fill=micro, label=paste0(n," \n ",round(n/total*100,2),"%")) + 
  geom_bar(stat = "identity", position = "dodge") +
  theme_pubr() +
  theme(legend.key = element_blank(),
        legend.position = "none",
        axis.text.x = element_text(angle = 90,
                                   hjust = 1,
                                   colour = "black")) +
  geom_text(vjust=-0.2, size=3) + 
  labs(subtitle = paste0("Total = ", bacz$total[1]) ) +
  xlab("") + ylab("Frequência") + facet_wrap(~momento, nrow = 2) + theme(axis.text.x = element_text(face = "italic"))

CTI


bac %>% filter(local =="Pia do CTI") %>%
  select(gram, momento,micro,id) %>% distinct_all() %>%
  group_by(gram, momento,micro) %>% count() %>% 
  ungroup %>% 
  mutate(total = sum(n),  prop = paste0(round(n/total*100,2),"%")) %>%
  arrange(desc(gram,momento)) %>% kable()
gram momento micro n total prop
Gram positiva Após a limpeza Corynebacterium jeikeium 1 6 16.67%
Gram positiva Após a limpeza Enterococcus faecalis 1 6 16.67%
Gram negativa Antes da limpeza Acinetobacter baumannii complex 1 6 16.67%
Gram negativa Antes da limpeza Serratia marcescens 2 6 33.33%
Gram negativa Após a limpeza Acinetobacter baumannii complex 1 6 16.67%

bacz <- bac %>% filter(local =="Pia do CTI") %>%
  select(gram, momento,micro,id) %>% distinct_all() %>%
  group_by(gram, momento,micro) %>% count() %>% 
  ungroup %>% 
  mutate(total = sum(n),  prop = paste0(round(n/total*100,2),"%")) %>%
  arrange(desc(micro, gram,momento))
ggplot(bacz) +
  ggtitle("Pia do CTI") +
  aes(x=reorder(micro,-n),y=n, fill=micro, label=paste0(n," \n ",round(n/total*100,2),"%")) + 
  geom_bar(stat = "identity", position = "dodge") +
  theme_pubr() +
  theme(legend.key = element_blank(),
        legend.position = "none",
        axis.text.x = element_text(angle = 90,
                                   hjust = 1,
                                   colour = "black")) +
  geom_text(vjust=-0.2, size=3) + 
  labs(subtitle = paste0("Total = ", bacz$total[1]) ) +
  xlab("") + ylab("Frequência") + facet_wrap(~momento, nrow = 2) + theme(axis.text.x = element_text(face = "italic"))

Farmácia


bac %>% filter(local =="Farmácia") %>%
  select(gram, momento,micro,id) %>% distinct_all() %>%
  group_by(gram, momento,micro) %>% count() %>% 
  ungroup %>% 
  mutate(total = sum(n),  prop = paste0(round(n/total*100,2),"%")) %>%
  arrange(desc(gram,momento)) %>% kable()
gram momento micro n total prop
Gram positiva Antes da limpeza Enterococcus faecalis 3 13 23.08%
Gram positiva Após a limpeza Staphylococcus hominis (MRSA + MBL) 1 13 7.69%
Gram positiva Após a limpeza Staphylococcus lentus 1 13 7.69%
Gram positiva Após a limpeza Staphylococcus warneri (MRSA + MBL) 1 13 7.69%
Gram negativa Antes da limpeza Acinetobacter baumannii complex 1 13 7.69%
Gram negativa Antes da limpeza Enterobacter cloacae complex 1 13 7.69%
Gram negativa Antes da limpeza Klebsiella pneumoniae 2 13 15.38%
Gram negativa Antes da limpeza Klebsiella pneumoniae (ESBL) 1 13 7.69%
Gram negativa Após a limpeza Aeromonas salmonicida 1 13 7.69%
Gram negativa Após a limpeza Enterobacter cloacae complex 1 13 7.69%

bacz <- bac %>% filter(local =="Farmácia") %>%
  select(gram, momento,micro,id) %>% distinct_all() %>%
  group_by(gram, momento,micro) %>% count() %>% 
  ungroup %>% 
  mutate(total = sum(n),  prop = paste0(round(n/total*100,2),"%")) %>%
  arrange(desc(micro, gram,momento))
ggplot(bacz) +
  ggtitle("Farmácia") +
  aes(x=reorder(micro,-n),y=n, fill=micro, label=paste0(n," \n ",round(n/total*100,2),"%")) + 
  geom_bar(stat = "identity", position = "dodge") +
  theme_pubr() +
  theme(legend.key = element_blank(),
        legend.position = "none",
        axis.text.x = element_text(angle = 90,
                                   hjust = 1,
                                   colour = "black")) +
  geom_text(vjust=-0.2, size=3) + 
  labs(subtitle = paste0("Total = ", bacz$total[1]) ) +
  xlab("") + ylab("Frequência") + facet_wrap(~momento, nrow = 2) + theme(axis.text.x = element_text(face = "italic"))

5. Qual a frequência de bactérias resistentes por área, comparando sujo e limpo?

LEITO 03


bac %>% filter(local =="Leito 03", inter=="R") %>%
  select(gram, momento,micro,id) %>% distinct_all() %>%
  group_by(gram, momento,micro) %>% count() %>% 
  ungroup %>% 
  mutate(total = sum(n),  prop = paste0(round(n/total*100,2),"%")) %>%
  arrange(desc(gram,momento)) %>% kable()
gram momento micro n total prop
Gram positiva Antes da limpeza Staphylococcus saprophyticus 1 4 25%
Gram positiva Após a limpeza Staphylococcus epidermidis 1 4 25%
Gram positiva Após a limpeza Staphylococcus hominis (MRSA + MBL) 1 4 25%
Gram negativa Após a limpeza Klebsiella pneumoniae (ESBL) 1 4 25%

bacz <- bac %>% filter(local =="Leito 03", inter=="R") %>%
  select(gram, momento,micro,id) %>% distinct_all() %>%
  group_by(gram, momento,micro) %>% count() %>% 
  ungroup %>% 
  mutate(total = sum(n),  prop = paste0(round(n/total*100,2),"%")) %>%
  arrange(desc(micro, gram,momento))

ggplot(bacz) +
  ggtitle("Leito 03") +
  aes(x=reorder(micro,-n),y=n, fill=micro, label=paste0(n," \n ",round(n/total*100,2),"%")) + 
  geom_bar(stat = "identity", position = "dodge") +
  theme_pubr() +
  theme(legend.key = element_blank(),
        legend.position = "none",
        axis.text.x = element_text(angle = 90,
                                   hjust = 1,
                                   colour = "black")) +
  geom_text(vjust=-0.2, size=3) + 
  labs(subtitle = paste0("Total = ", bacz$total[1]) ) +
  xlab("") + ylab("Frequência") + facet_wrap(~momento, nrow = 2) + theme(axis.text.x = element_text(face = "italic"))

LEITO 04


bac %>% filter(local =="Leito 04", inter=="R") %>%
  select(gram, momento,micro,id) %>% distinct_all() %>%
  group_by(gram, momento,micro) %>% count() %>% 
  ungroup %>% 
  mutate(total = sum(n),  prop = paste0(round(n/total*100,2),"%")) %>%
  arrange(desc(gram,momento)) %>% kable()
gram momento micro n total prop
Gram positiva Após a limpeza Staphylococcus haemolyticus 1 2 50%
Gram negativa Após a limpeza Klebsiella pneumoniae 1 2 50%

bacz <- bac %>% filter(local =="Leito 04", inter=="R") %>%
  select(gram, momento,micro,id) %>% distinct_all() %>%
  group_by(gram, momento,micro) %>% count() %>% 
  ungroup %>% 
  mutate(total = sum(n),  prop = paste0(round(n/total*100,2),"%")) %>%
  arrange(desc(micro, gram,momento))
ggplot(bacz) +
  ggtitle("Leito 04") +
  aes(x=reorder(micro,-n),y=n, fill=micro, label=paste0(n," \n ",round(n/total*100,2),"%")) + 
  geom_bar(stat = "identity", position = "dodge") +
  theme_pubr() +
  theme(legend.key = element_blank(),
        legend.position = "none",
        axis.text.x = element_text(angle = 90,
                                   hjust = 1,
                                   colour = "black")) +
  geom_text(vjust=-0.2, size=3) + 
  labs(subtitle = paste0("Total = ", bacz$total[1]) ) +
  xlab("") + ylab("Frequência") + facet_wrap(~momento, nrow = 2) + theme(axis.text.x = element_text(face = "italic"))

LEITO 05


bac %>% filter(local =="Leito 05", inter=="R") %>%
  select(gram, momento,micro,id) %>% distinct_all() %>%
  group_by(gram, momento,micro) %>% count() %>% 
  ungroup %>% 
  mutate(total = sum(n),  prop = paste0(round(n/total*100,2),"%")) %>%
  arrange(desc(gram,momento)) %>% kable()
gram momento micro n total prop
Gram positiva Após a limpeza Staphylococcus haemolyticus (MRSA + MBL) 1 8 12.5%
Gram positiva Após a limpeza Staphylococcus hominis (MBL) 2 8 25%
Gram positiva Após a limpeza Staphylococcus hominis (MRSA + MBL) 1 8 12.5%
Gram negativa Após a limpeza Acinetobacter baumannii complex (ESBL) 1 8 12.5%
Gram negativa Após a limpeza Acinetobacter baumannii complex (KPC) 2 8 25%
Gram negativa Após a limpeza Klebsiella pneumoniae (ESBL) 1 8 12.5%

bacz <- bac %>% filter(local =="Leito 05", inter=="R") %>%
  select(gram, momento,micro,id) %>% distinct_all() %>%
  group_by(gram, momento,micro) %>% count() %>% 
  ungroup %>% 
  mutate(total = sum(n),  prop = paste0(round(n/total*100,2),"%")) %>%
  arrange(desc(micro, gram,momento))
ggplot(bacz) +
  ggtitle("Leito 05") +
  aes(x=reorder(micro,-n),y=n, fill=micro, label=paste0(n," \n ",round(n/total*100,2),"%")) + 
  geom_bar(stat = "identity", position = "dodge") +
  theme_pubr() +
  theme(legend.key = element_blank(),
        legend.position = "none",
        axis.text.x = element_text(angle = 90,
                                   hjust = 1,
                                   colour = "black")) +
  geom_text(vjust=-0.2, size=3) + 
  labs(subtitle = paste0("Total = ", bacz$total[1]) ) +
  xlab("") + ylab("Frequência") + facet_wrap(~momento, nrow = 2) + theme(axis.text.x = element_text(face = "italic"))

LEITO 06


bac %>% filter(local =="Leito 06", inter=="R") %>%
  select(gram, momento,micro,id) %>% distinct_all() %>%
  group_by(gram, momento,micro) %>% count() %>% 
  ungroup %>% 
  mutate(total = sum(n),  prop = paste0(round(n/total*100,2),"%")) %>%
  arrange(desc(gram,momento)) %>% kable()
gram momento micro n total prop
Gram positiva Antes da limpeza Staphylococcus epidermidis 1 12 8.33%
Gram positiva Após a limpeza Staphylococcus haemolyticus (MRSA + MBL) 1 12 8.33%
Gram positiva Após a limpeza Staphylococcus hominis 1 12 8.33%
Gram positiva Após a limpeza Staphylococcus lentus 1 12 8.33%
Gram negativa Antes da limpeza Acinetobacter baumannii complex 1 12 8.33%
Gram negativa Antes da limpeza Pseudomonas stutzeri 1 12 8.33%
Gram negativa Antes da limpeza Serratia marcescens 4 12 33.33%
Gram negativa Após a limpeza Acinetobacter baumannii complex 1 12 8.33%
Gram negativa Após a limpeza Klebsiella pneumoniae (ESBL) 1 12 8.33%

bacz <- bac %>% filter(local =="Leito 06", inter=="R") %>%
  select(gram, momento,micro,id) %>% distinct_all() %>%
  group_by(gram, momento,micro) %>% count() %>% 
  ungroup %>% 
  mutate(total = sum(n),  prop = paste0(round(n/total*100,2),"%")) %>%
  arrange(desc(micro, gram,momento))
ggplot(bacz) +
  ggtitle("Leito 06") +
  aes(x=reorder(micro,-n),y=n, fill=micro, label=paste0(n," \n ",round(n/total*100,2),"%")) + 
  geom_bar(stat = "identity", position = "dodge") +
  theme_pubr() +
  theme(legend.key = element_blank(),
        legend.position = "none",
        axis.text.x = element_text(angle = 90,
                                   hjust = 1,
                                   colour = "black")) +
  geom_text(vjust=-0.2, size=3) + 
  labs(subtitle = paste0("Total = ", bacz$total[1]) ) +
  xlab("") + ylab("Frequência") + facet_wrap(~momento, nrow = 2) + theme(axis.text.x = element_text(face = "italic"))

LEITO 08


bac %>% filter(local =="Leito 08", inter=="R") %>%
  select(gram, momento,micro,id) %>% distinct_all() %>%
  group_by(gram, momento,micro) %>% count() %>% 
  ungroup %>% 
  mutate(total = sum(n),  prop = paste0(round(n/total*100,2),"%")) %>%
  arrange(desc(gram,momento)) %>% kable()
gram momento micro n total prop
Gram positiva Após a limpeza Enterococcus faecium 2 5 40%
Gram positiva Após a limpeza Staphylococcus hominis 1 5 20%
Gram negativa Antes da limpeza Enterobacter cloacae complex 1 5 20%
Gram negativa Após a limpeza Acinetobacter baumannii 1 5 20%

bacz <- bac %>% filter(local =="Leito 08", inter=="R") %>%
  select(gram, momento,micro,id) %>% distinct_all() %>%
  group_by(gram, momento,micro) %>% count() %>% 
  ungroup %>% 
  mutate(total = sum(n),  prop = paste0(round(n/total*100,2),"%")) %>%
  arrange(desc(micro, gram,momento))
ggplot(bacz) +
  ggtitle("Leito 08") +
  aes(x=reorder(micro,-n),y=n, fill=micro, label=paste0(n," \n ",round(n/total*100,2),"%")) + 
  geom_bar(stat = "identity", position = "dodge") +
  theme_pubr() +
  theme(legend.key = element_blank(),
        legend.position = "none",
        axis.text.x = element_text(angle = 90,
                                   hjust = 1,
                                   colour = "black")) +
  geom_text(vjust=-0.2, size=3) + 
  labs(subtitle = paste0("Total = ", bacz$total[1]) ) +
  xlab("") + ylab("Frequência") + facet_wrap(~momento, nrow = 2) + theme(axis.text.x = element_text(face = "italic"))

LEITO 12


bac %>% filter(local =="Leito 12", inter=="R") %>%
  select(gram, momento,micro,id) %>% distinct_all() %>%
  group_by(gram, momento,micro) %>% count() %>% 
  ungroup %>% 
  mutate(total = sum(n),  prop = paste0(round(n/total*100,2),"%")) %>%
  arrange(desc(gram,momento)) %>% kable()
gram momento micro n total prop
Gram positiva Antes da limpeza Staphylococcus haemolyticus 2 6 33.33%
Gram negativa Após a limpeza Acinetobacter baumannii 2 6 33.33%
Gram negativa Após a limpeza Acinetobacter baumannii complex 1 6 16.67%
Gram negativa Após a limpeza Klebsiella pneumoniae 1 6 16.67%

bacz <- bac %>% filter(local =="Leito 12", inter=="R") %>%
  select(gram, momento,micro,id) %>% distinct_all() %>%
  group_by(gram, momento,micro) %>% count() %>% 
  ungroup %>% 
  mutate(total = sum(n),  prop = paste0(round(n/total*100,2),"%")) %>%
  arrange(desc(micro, gram,momento))
ggplot(bacz) +
  ggtitle("Leito 12") +
  aes(x=reorder(micro,-n),y=n, fill=micro, label=paste0(n," \n ",round(n/total*100,2),"%")) + 
  geom_bar(stat = "identity", position = "dodge") +
  theme_pubr() +
  theme(legend.key = element_blank(),
        legend.position = "none",
        axis.text.x = element_text(angle = 90,
                                   hjust = 1,
                                   colour = "black")) +
  geom_text(vjust=-0.2, size=3) + 
  labs(subtitle = paste0("Total = ", bacz$total[1]) ) +
  xlab("") + ylab("Frequência") + facet_wrap(~momento, nrow = 2)

Área administrativa


bac %>% filter(local =="Área administrativa", inter=="R") %>%
  select(gram, momento,micro,id) %>% distinct_all() %>%
  group_by(gram, momento,micro) %>% count() %>% 
  ungroup %>% 
  mutate(total = sum(n),  prop = paste0(round(n/total*100,2),"%")) %>%
  arrange(desc(gram,momento)) %>% kable()
gram momento micro n total prop
Gram positiva Após a limpeza Staphylococcus haemolyticus (MRSA + MBL) 1 3 33.33%
Gram negativa Antes da limpeza Acinetobacter baumannii complex 1 3 33.33%
Gram negativa Antes da limpeza Klebsiella pneumoniae 1 3 33.33%

bacz <- bac %>% filter(local =="Área administrativa", inter=="R") %>%
  select(gram, momento,micro,id) %>% distinct_all() %>%
  group_by(gram, momento,micro) %>% count() %>% 
  ungroup %>% 
  mutate(total = sum(n),  prop = paste0(round(n/total*100,2),"%")) %>%
  arrange(desc(micro, gram,momento))
ggplot(bacz) +
  ggtitle("Área administrativa") +
  aes(x=reorder(micro,-n),y=n, fill=micro, label=paste0(n," \n ",round(n/total*100,2),"%")) + 
  geom_bar(stat = "identity", position = "dodge") +
  theme_pubr() +
  theme(legend.key = element_blank(),
        legend.position = "none",
        axis.text.x = element_text(angle = 90,
                                   hjust = 1,
                                   colour = "black")) +
  geom_text(vjust=-0.2, size=3) + 
  labs(subtitle = paste0("Total = ", bacz$total[1]) ) +
  xlab("") + ylab("Frequência") + facet_wrap(~momento, nrow = 2) + theme(axis.text.x = element_text(face = "italic"))

Banheiro CTI


bac %>% filter(local =="Banheiro CTI", inter=="R") %>%
  select(gram, momento,micro,id) %>% distinct_all() %>%
  group_by(gram, momento,micro) %>% count() %>% 
  ungroup %>% 
  mutate(total = sum(n),  prop = paste0(round(n/total*100,2),"%")) %>%
  arrange(desc(gram,momento)) %>% kable()
gram momento micro n total prop
Gram positiva Após a limpeza Staphylococcus lentus 1 5 20%
Gram negativa Antes da limpeza Serratia marcescens 3 5 60%
Gram negativa Após a limpeza Klebsiella pneumoniae (ESBL) 1 5 20%

bacz <- bac %>% filter(local =="Banheiro CTI", inter=="R") %>%
  select(gram, momento,micro,id) %>% distinct_all() %>%
  group_by(gram, momento,micro) %>% count() %>% 
  ungroup %>% 
  mutate(total = sum(n),  prop = paste0(round(n/total*100,2),"%")) %>%
  arrange(desc(micro, gram,momento))
ggplot(bacz) +
  ggtitle("Banheiro CTI") +
  aes(x=reorder(micro,-n),y=n, fill=micro, label=paste0(n," \n ",round(n/total*100,2),"%")) + 
  geom_bar(stat = "identity", position = "dodge") +
  theme_pubr() +
  theme(legend.key = element_blank(),
        legend.position = "none",
        axis.text.x = element_text(angle = 90,
                                   hjust = 1,
                                   colour = "black")) +
  geom_text(vjust=-0.2, size=3) + 
  labs(subtitle = paste0("Total = ", bacz$total[1]) ) +
  xlab("") + ylab("Frequência") + facet_wrap(~momento, nrow = 2)+ theme(axis.text.x = element_text(face = "italic"))

Copa CTI


bac %>% filter(local =="Copa CTI", inter=="R") %>%
  select(gram, momento,micro,id) %>% distinct_all() %>%
  group_by(gram, momento,micro) %>% count() %>% 
  ungroup %>% 
  mutate(total = sum(n),  prop = paste0(round(n/total*100,2),"%")) %>%
  arrange(desc(gram,momento)) %>% kable()
gram momento micro n total prop
Gram positiva Antes da limpeza Staphylococcus cohnii 1 13 7.69%
Gram positiva Antes da limpeza Staphylococcus epidermidis 1 13 7.69%
Gram positiva Após a limpeza Staphylococcus haemolyticus (MRSA + MBL) 1 13 7.69%
Gram positiva Após a limpeza Staphylococcus hominis 1 13 7.69%
Gram negativa Antes da limpeza Klebsiella pneumoniae 2 13 15.38%
Gram negativa Antes da limpeza Klebsiella pneumoniae (ESBL) 1 13 7.69%
Gram negativa Antes da limpeza Serratia marcescens 3 13 23.08%
Gram negativa Após a limpeza Acinetobacter baumannii 1 13 7.69%
Gram negativa Após a limpeza Enterobacter cloacae (ESBL) 1 13 7.69%
Gram negativa Após a limpeza Klebsiella pneumoniae 1 13 7.69%

bacz <- bac %>% filter(local =="Copa CTI", inter=="R") %>%
  select(gram, momento,micro,id) %>% distinct_all() %>%
  group_by(gram, momento,micro) %>% count() %>% 
  ungroup %>% 
  mutate(total = sum(n),  prop = paste0(round(n/total*100,2),"%")) %>%
  arrange(desc(micro, gram,momento))
ggplot(bacz) +
  ggtitle("Copa CTI") +
  aes(x=reorder(micro,-n),y=n, fill=micro, label=paste0(n," \n ",round(n/total*100,2),"%")) + 
  geom_bar(stat = "identity", position = "dodge") +
  theme_pubr() +
  theme(legend.key = element_blank(),
        legend.position = "none",
        axis.text.x = element_text(angle = 90,
                                   hjust = 1,
                                   colour = "black")) +
  geom_text(vjust=-0.2, size=3) + 
  labs(subtitle = paste0("Total = ", bacz$total[1]) ) +
  xlab("") + ylab("Frequência") + facet_wrap(~momento, nrow = 2)+ theme(axis.text.x = element_text(face = "italic"))

CTI


bac %>% filter(local =="Pia do CTI", inter=="R") %>%
  select(gram, momento,micro,id) %>% distinct_all() %>%
  group_by(gram, momento,micro) %>% count() %>% 
  ungroup %>% 
  mutate(total = sum(n),  prop = paste0(round(n/total*100,2),"%")) %>%
  arrange(desc(gram,momento)) %>% kable()
gram momento micro n total prop
Gram positiva Após a limpeza Enterococcus faecalis 1 5 20%
Gram negativa Antes da limpeza Acinetobacter baumannii complex 1 5 20%
Gram negativa Antes da limpeza Serratia marcescens 2 5 40%
Gram negativa Após a limpeza Acinetobacter baumannii complex 1 5 20%

bacz <- bac %>% filter(local =="Pia do CTI", inter=="R") %>%
  select(gram, momento,micro,id) %>% distinct_all() %>%
  group_by(gram, momento,micro) %>% count() %>% 
  ungroup %>% 
  mutate(total = sum(n),  prop = paste0(round(n/total*100,2),"%")) %>%
  arrange(desc(micro, gram,momento))
ggplot(bacz) +
  ggtitle("Pia do CTI") +
  aes(x=reorder(micro,-n),y=n, fill=micro, label=paste0(n," \n ",round(n/total*100,2),"%")) + 
  geom_bar(stat = "identity", position = "dodge") +
  theme_pubr() +
  theme(legend.key = element_blank(),
        legend.position = "none",
        axis.text.x = element_text(angle = 90,
                                   hjust = 1,
                                   colour = "black")) +
  geom_text(vjust=-0.2, size=3) + 
  labs(subtitle = paste0("Total = ", bacz$total[1]) ) +
  xlab("") + ylab("Frequência") + facet_wrap(~momento, nrow = 2)+ theme(axis.text.x = element_text(face = "italic"))

Farmácia


bac %>% filter(local =="Farmácia", inter=="R") %>%
  select(gram, momento,micro,id) %>% distinct_all() %>%
  group_by(gram, momento,micro) %>% count() %>% 
  ungroup %>% 
  mutate(total = sum(n),  prop = paste0(round(n/total*100,2),"%")) %>%
  arrange(desc(gram,momento)) %>% kable()
gram momento micro n total prop
Gram positiva Antes da limpeza Enterococcus faecalis 2 11 18.18%
Gram positiva Após a limpeza Staphylococcus hominis (MRSA + MBL) 1 11 9.09%
Gram positiva Após a limpeza Staphylococcus lentus 1 11 9.09%
Gram positiva Após a limpeza Staphylococcus warneri (MRSA + MBL) 1 11 9.09%
Gram negativa Antes da limpeza Acinetobacter baumannii complex 1 11 9.09%
Gram negativa Antes da limpeza Enterobacter cloacae complex 1 11 9.09%
Gram negativa Antes da limpeza Klebsiella pneumoniae 2 11 18.18%
Gram negativa Antes da limpeza Klebsiella pneumoniae (ESBL) 1 11 9.09%
Gram negativa Após a limpeza Enterobacter cloacae complex 1 11 9.09%

bacz <- bac %>% filter(local =="Farmácia", inter=="R") %>%
  select(gram, momento,micro,id) %>% distinct_all() %>%
  group_by(gram, momento,micro) %>% count() %>% 
  ungroup %>% 
  mutate(total = sum(n),  prop = paste0(round(n/total*100,2),"%")) %>%
  arrange(desc(micro, gram,momento))
ggplot(bacz) +
  ggtitle("Farmácia") +
  aes(x=reorder(micro,-n),y=n, fill=micro, label=paste0(n," \n ",round(n/total*100,2),"%")) + 
  geom_bar(stat = "identity", position = "dodge") +
  theme_pubr() +
  theme(legend.key = element_blank(),
        legend.position = "none",
        axis.text.x = element_text(angle = 90,
                                   hjust = 1,
                                   colour = "black")) +
  geom_text(vjust=-0.2, size=3) + 
  labs(subtitle = paste0("Total = ", bacz$total[1]) ) +
  xlab("") + ylab("Frequência") + facet_wrap(~momento, nrow = 2) + theme(axis.text.x = element_text(face = "italic"))

6. Qual a correlação das bactérias Gram positivas e Gram negativas mais encontradas e com perfil de resistência entre as duas situações (limpo e sujo)?

library(reshape2)

Correlação


dad <- bac %>% filter(inter=="R") %>%
  select(micro, gram, momento, local,id) %>% distinct_all() %>%
  group_by(micro, gram,momento,local) %>% count() %>% 
  ungroup %>% 
  mutate(total = sum(n),  prop = paste0(round(n/total*100,2),"%")) %>%
  arrange(desc(n))

dad2 <- dcast(dad, local+momento ~gram)
names(dad2) <- c("local","momento","gnegativa","gpositiva")

ggscatter(dad2,
          x = "gnegativa",
          y = "gpositiva",
          add = "reg.line",#adicnionar linha de regressao
          conf.int = TRUE,
          cor.coef = TRUE,
          cor.method = "spearman",
          xlab = "Gram negativa",
          ylab = "Gram positiva",
          facet.by=c("momento"),
          font.label = c(5, "plain"))+
  labs(tag = "")



dad2 %>% kable
local momento gnegativa gpositiva
Área administrativa Antes da limpeza 2 0
Área administrativa Após a limpeza 0 1
Banheiro CTI Antes da limpeza 1 0
Banheiro CTI Após a limpeza 1 1
Copa CTI Antes da limpeza 3 2
Copa CTI Após a limpeza 3 2
Farmácia Antes da limpeza 4 1
Farmácia Após a limpeza 1 3
Leito 03 Antes da limpeza 0 1
Leito 03 Após a limpeza 1 2
Leito 04 Após a limpeza 1 1
Leito 05 Após a limpeza 3 3
Leito 06 Antes da limpeza 3 1
Leito 06 Após a limpeza 2 3
Leito 08 Antes da limpeza 1 0
Leito 08 Após a limpeza 1 2
Leito 12 Antes da limpeza 0 1
Leito 12 Após a limpeza 3 0
Pia do CTI Antes da limpeza 2 0
Pia do CTI Após a limpeza 1 1

Foi utilizado metodo de Correlação de Spearman, já que os dados não seguem uma distribuição normal

7. Qual a frequência total de bactérias gram positivas e gram negativas com perfilde resistência por área e considerando situação de sujo/limpo

Resposta



bac %>% filter(inter == "R") %>%
  select(momento,local,gram,id,micro) %>% distinct_all() %>%
  group_by(momento,local,gram) %>% count() %>% 
  ungroup %>% 
  mutate(total = sum(n),  prop = paste0(round(n/total*100,2),"%")) %>%
  arrange(desc(n)) %>% kable
momento local gram n total prop
Antes da limpeza Copa CTI Gram negativa 6 74 8.11%
Antes da limpeza Leito 06 Gram negativa 6 74 8.11%
Antes da limpeza Farmácia Gram negativa 5 74 6.76%
Após a limpeza Leito 05 Gram negativa 4 74 5.41%
Após a limpeza Leito 05 Gram positiva 4 74 5.41%
Após a limpeza Leito 12 Gram negativa 4 74 5.41%
Antes da limpeza Banheiro CTI Gram negativa 3 74 4.05%
Antes da limpeza Pia do CTI Gram negativa 3 74 4.05%
Após a limpeza Copa CTI Gram negativa 3 74 4.05%
Após a limpeza Farmácia Gram positiva 3 74 4.05%
Após a limpeza Leito 06 Gram positiva 3 74 4.05%
Após a limpeza Leito 08 Gram positiva 3 74 4.05%
Antes da limpeza Área administrativa Gram negativa 2 74 2.7%
Antes da limpeza Copa CTI Gram positiva 2 74 2.7%
Antes da limpeza Farmácia Gram positiva 2 74 2.7%
Antes da limpeza Leito 12 Gram positiva 2 74 2.7%
Após a limpeza Copa CTI Gram positiva 2 74 2.7%
Após a limpeza Leito 03 Gram positiva 2 74 2.7%
Após a limpeza Leito 06 Gram negativa 2 74 2.7%
Antes da limpeza Leito 03 Gram positiva 1 74 1.35%
Antes da limpeza Leito 06 Gram positiva 1 74 1.35%
Antes da limpeza Leito 08 Gram negativa 1 74 1.35%
Após a limpeza Área administrativa Gram positiva 1 74 1.35%
Após a limpeza Banheiro CTI Gram negativa 1 74 1.35%
Após a limpeza Banheiro CTI Gram positiva 1 74 1.35%
Após a limpeza Farmácia Gram negativa 1 74 1.35%
Após a limpeza Leito 03 Gram negativa 1 74 1.35%
Após a limpeza Leito 04 Gram negativa 1 74 1.35%
Após a limpeza Leito 04 Gram positiva 1 74 1.35%
Após a limpeza Leito 08 Gram negativa 1 74 1.35%
Após a limpeza Pia do CTI Gram negativa 1 74 1.35%
Após a limpeza Pia do CTI Gram positiva 1 74 1.35%


b <- bac %>% filter(inter == "R") %>%
  select(momento,local,gram,id,micro) %>% distinct_all() %>%
  group_by(momento,local,gram) %>% count() %>% 
  ungroup %>% 
  mutate(total = sum(n),  prop = paste0(round(n/total*100,2),"%")) %>%
  arrange(desc(n)) 
  
ggplot(b) +
  ggtitle("Gram Negativa e Positiva") +
  aes(x=reorder(local,-n),y=n, fill=local, label=paste0(n," \n ",round(n/total*100,2),"%")) + 
  geom_bar(stat = "identity", position = position_dodge(1)) +
  theme_pubr() +
  theme(legend.key = element_blank(),
        legend.position = "none",
        axis.text.x = element_text(angle = 90,
                                   hjust = 1,
                                   colour = "black")) +
  geom_text(vjust=-0.2, size=3, position = position_dodge(1)) + 
  labs(subtitle = paste0("Total = ", b$total[1]) ) +
  xlab("") + ylab("Frequência") + facet_wrap(~momento*gram, ncol = 2)

10. Qual bactéria é mais frequente nos leitos da UTI por superfície?

LEITOS



bac %>% filter(local %in% c("Leito 03","Leito 04","Leito 05","Leito 06","Leito 08","Leito 12")) %>%
  select(momento,super,id,micro) %>% distinct_all() %>%
  group_by(momento,super,micro) %>% count() %>% 
  ungroup %>% 
  mutate(total = sum(n),  prop = paste0(round(n/total*100,2),"%")) %>%
  arrange(desc(n)) %>% kable()
momento super micro n total prop
Antes da limpeza Mesinha Bastonete Gram positivo 5 68 7.35%
Antes da limpeza Cama Bastonete Gram positivo 4 68 5.88%
Antes da limpeza Chão Bastonete Gram positivo 4 68 5.88%
Antes da limpeza Monitor cardíaco Bastonete Gram positivo 4 68 5.88%
Após a limpeza Chão Pantoea spp 4 68 5.88%
Antes da limpeza Monitor cardíaco Serratia marcescens 3 68 4.41%
Antes da limpeza Cama Staphylococcus haemolyticus 2 68 2.94%
Antes da limpeza Mesinha Enterococcus faecalis 2 68 2.94%
Após a limpeza Chão Acinetobacter baumannii 2 68 2.94%
Após a limpeza Mesinha Klebsiella pneumoniae 2 68 2.94%
Após a limpeza Monitor cardíaco Klebsiella pneumoniae (ESBL) 2 68 2.94%
Após a limpeza Monitor cardíaco Staphylococcus haemolyticus (MRSA + MBL) 2 68 2.94%
Antes da limpeza Cama Acinetobacter baumannii complex 1 68 1.47%
Antes da limpeza Cama Enterococcus faecalis 1 68 1.47%
Antes da limpeza Cama Serratia marcescens 1 68 1.47%
Antes da limpeza Chão Enterobacter cloacae complex 1 68 1.47%
Antes da limpeza Chão Staphylococcus aureus 1 68 1.47%
Antes da limpeza Chão Staphylococcus epidermidis 1 68 1.47%
Antes da limpeza Mesinha Pseudomonas stutzeri 1 68 1.47%
Antes da limpeza Monitor cardíaco Staphylococcus saprophyticus 1 68 1.47%
Após a limpeza Cama Acinetobacter baumannii complex 1 68 1.47%
Após a limpeza Cama Enterococcus faecium 1 68 1.47%
Após a limpeza Cama Staphylococcus epidermidis 1 68 1.47%
Após a limpeza Cama Staphylococcus haemolyticus 1 68 1.47%
Após a limpeza Cama Staphylococcus hominis 1 68 1.47%
Após a limpeza Cama Staphylococcus hominis (MBL) 1 68 1.47%
Após a limpeza Chão Acinetobacter baumannii complex (ESBL) 1 68 1.47%
Após a limpeza Chão Acinetobacter baumannii complex (KPC) 1 68 1.47%
Após a limpeza Chão Klebsiella pneumoniae (ESBL) 1 68 1.47%
Após a limpeza Chão Staphylococcus hominis (MBL) 1 68 1.47%
Após a limpeza Chão Staphylococcus hominis (MRSA + MBL) 1 68 1.47%
Após a limpeza Chão Staphylococcus lentus 1 68 1.47%
Após a limpeza Mesinha Acinetobacter baumannii 1 68 1.47%
Após a limpeza Mesinha Acinetobacter baumannii complex (KPC) 1 68 1.47%
Após a limpeza Mesinha Bastonete Gram positivo 1 68 1.47%
Após a limpeza Mesinha Enterococcus faecium 1 68 1.47%
Após a limpeza Mesinha Staphylococcus caprae 1 68 1.47%
Após a limpeza Monitor cardíaco Acinetobacter baumannii complex 1 68 1.47%
Após a limpeza Monitor cardíaco Aerococcus viridans 1 68 1.47%
Após a limpeza Monitor cardíaco Bastonete Gram positivo 1 68 1.47%
Após a limpeza Monitor cardíaco Enterococcus columbae 1 68 1.47%
Após a limpeza Monitor cardíaco Pantoea spp 1 68 1.47%
Após a limpeza Monitor cardíaco Staphylococcus hominis 1 68 1.47%
Após a limpeza Monitor cardíaco Staphylococcus hominis (MRSA + MBL) 1 68 1.47%


a <- bac %>% filter(local %in% c("Leito 03","Leito 04","Leito 05","Leito 06","Leito 08","Leito 12")) %>%
  select(momento,super,id,micro) %>% distinct_all() %>%
  group_by(momento,super,micro) %>% count() %>% 
  ungroup %>% 
  mutate(total = sum(n),  prop = paste0(round(n/total*100,2),"%")) %>%
  arrange(desc(n)) 

ggplot(a) +
  ggtitle("Leitos 03, 04, 05, 06, 08 e 12") +
  aes(x=reorder(micro,+n),y=n, fill=super, label=n) + 
  geom_bar(stat = "identity", position = "stack") +
  theme_pubr() +
  scale_fill_discrete(name="Superficie")+
  theme(legend.position = "right",
        axis.text.x = element_text(angle = 0,
                                   hjust = 0,
                                   colour = "black")) +
  geom_text(size=3,hjust=+2, vjust=0.5, position = "stack") + 
  labs(subtitle = paste0("Total = ", a$total[1])) +
  xlab("") + ylab("Frequência") + facet_wrap(~momento, ncol = 2) + coord_flip() + theme(axis.text.y = element_text(face = "italic"))

11. Quais os padrões de susceptibilidade antimicrobiana de cepas de bactérias isoladas (Microrganismos x medicamentos x suceptibilidade de antimicrobianos S (%) I (%) R (%))

Resposta


library(summarytools)
library(tidyr)


# bac %>% mutate(id = factor(id), inter = factor(inter)) %>% 
#   #  filter(inter=="R") %>% 
#   select(anti,id,inter) %>% 
#   group_by(anti,inter) %>%  count() %>% 
#   descr(., stats = c("common"), transpose = T) %>% 
#   tb() %>% arrange(desc(mean)) %>% as.data.frame() #%>% summarise(sum(mean))
bac2 <- bac

bac2 %>% mutate(id = factor(id), inter = factor(inter)) %>% 
  select(anti,inter,micro, id, inter) %>% 
  group_by(anti,inter) %>%  count() %>% arrange(anti,desc(n)) %>% 
  ungroup %>%
  as.data.frame() %>% pivot_wider(names_from = inter, values_from = n, values_fill = 0) %>% 
  mutate(TS = sum(S),  PS = paste0(round(S/TS*100,2),"%"),
         TI = sum(I),  PI = paste0(round(I/TI*100,2),"%"),
         TR = sum(R),  PR = paste0(round(R/TR*100,2),"%"),
         TNEG = sum(NEG),  PNEG = paste0(round(NEG/TR*100,2),"%"),
         TPOS = sum(POS),  PPOS = paste0(round(POS/TR*100,2),"%"),
         TNA = sum(`NA`),  PNA = paste0(round(`NA`/TR*100,2),"%")) %>% as.data.frame() %>%  kable("pandoc")
anti S I R NEG POS NA TS PS TI PI TR PR TNEG PNEG TPOS PPOS TNA PNA
Ácido Nalidíxico 8 0 0 0 0 0 845 0.95% 35 0% 334 0% 37 0% 19 0% 47 0%
Amicacina 40 2 0 0 0 0 845 4.73% 35 5.71% 334 0% 37 0% 19 0% 47 0%
Amoxicilina/Ácido clavulânico 2 0 6 0 0 0 845 0.24% 35 0% 334 1.8% 37 0% 19 0% 47 0%
Ampicilina 13 1 23 0 0 0 845 1.54% 35 2.86% 334 6.89% 37 0% 19 0% 47 0%
Ampicilina/Sulbactam 16 0 7 0 0 0 845 1.89% 35 0% 334 2.1% 37 0% 19 0% 47 0%
Benzilpenicilina 8 0 18 0 0 0 845 0.95% 35 0% 334 5.39% 37 0% 19 0% 47 0%
BLSE 0 0 0 8 4 1 845 0% 35 0% 334 0% 37 2.4% 19 1.2% 47 0.3%
Cefalotina 2 0 2 0 0 0 845 0.24% 35 0% 334 0.6% 37 0% 19 0% 47 0%
Cefepima 31 1 14 0 0 0 845 3.67% 35 2.86% 334 4.19% 37 0% 19 0% 47 0%
Cefoxitina 14 1 23 0 0 0 845 1.66% 35 2.86% 334 6.89% 37 0% 19 0% 47 0%
Ceftarolina 7 0 0 0 0 2 845 0.83% 35 0% 334 0% 37 0% 19 0% 47 0.6%
Ceftazidima 23 1 14 0 0 0 845 2.72% 35 2.86% 334 4.19% 37 0% 19 0% 47 0%
Ceftriaxona 24 6 16 0 0 0 845 2.84% 35 17.14% 334 4.79% 37 0% 19 0% 47 0%
Cefuroxima 8 0 33 0 0 0 845 0.95% 35 0% 334 9.88% 37 0% 19 0% 47 0%
Cefuroxima Axetil 8 0 38 0 0 0 845 0.95% 35 0% 334 11.38% 37 0% 19 0% 47 0%
Ciprofloxacina 39 0 7 0 0 0 845 4.62% 35 0% 334 2.1% 37 0% 19 0% 47 0%
Clindamicina 8 0 21 0 0 0 845 0.95% 35 0% 334 6.29% 37 0% 19 0% 47 0%
Colistina 28 0 11 0 0 0 845 3.31% 35 0% 334 3.29% 37 0% 19 0% 47 0%
Daptomicina 32 0 1 0 0 4 845 3.79% 35 0% 334 0.3% 37 0% 19 0% 47 1.2%
Eritromicina 9 9 22 0 0 0 845 1.07% 35 25.71% 334 6.59% 37 0% 19 0% 47 0%
Ertapenem 25 1 5 0 0 0 845 2.96% 35 2.86% 334 1.5% 37 0% 19 0% 47 0%
Estreptomicina Alto Nível (Sinergia) 13 0 0 0 0 0 845 1.54% 35 0% 334 0% 37 0% 19 0% 47 0%
Gentamicina 62 4 7 0 0 0 845 7.34% 35 11.43% 334 2.1% 37 0% 19 0% 47 0%
Gentamicina Alto Nível (Sinergia) 13 0 0 0 0 0 845 1.54% 35 0% 334 0% 37 0% 19 0% 47 0%
Imipenem 25 0 2 0 0 0 845 2.96% 35 0% 334 0.6% 37 0% 19 0% 47 0%
Levofloxacina 29 1 10 0 0 0 845 3.43% 35 2.86% 334 2.99% 37 0% 19 0% 47 0%
Linezolid 37 0 2 0 0 0 845 4.38% 35 0% 334 0.6% 37 0% 19 0% 47 0%
Meropenem 40 0 6 0 0 0 845 4.73% 35 0% 334 1.8% 37 0% 19 0% 47 0%
Nitrofurantoína 41 2 5 0 0 0 845 4.85% 35 5.71% 334 1.5% 37 0% 19 0% 47 0%
Norfloxacina 8 0 0 0 0 0 845 0.95% 35 0% 334 0% 37 0% 19 0% 47 0%
Oxacilina 12 0 16 0 0 0 845 1.42% 35 0% 334 4.79% 37 0% 19 0% 47 0%
Piperacilina/Tazobactam 31 1 2 0 0 0 845 3.67% 35 2.86% 334 0.6% 37 0% 19 0% 47 0%
Resistência Induzida a Clindamicina 1 0 0 21 1 3 845 0.12% 35 0% 334 0% 37 6.29% 19 0.3% 47 0.9%
Rifampicina 21 1 4 0 0 0 845 2.49% 35 2.86% 334 1.2% 37 0% 19 0% 47 0%
Sem dados 0 0 0 0 0 33 845 0% 35 0% 334 0% 37 0% 19 0% 47 9.88%
Teicoplanina 36 0 3 0 0 0 845 4.26% 35 0% 334 0.9% 37 0% 19 0% 47 0%
Teste de screening de cefoxitina 0 0 0 8 14 4 845 0% 35 0% 334 0% 37 2.4% 19 4.19% 47 1.2%
Tigeciclina 71 3 0 0 0 0 845 8.4% 35 8.57% 334 0% 37 0% 19 0% 47 0%
Trimetoprim/Sulfametoxazol 25 0 13 0 0 0 845 2.96% 35 0% 334 3.89% 37 0% 19 0% 47 0%
Vancomicina 35 1 3 0 0 0 845 4.14% 35 2.86% 334 0.9% 37 0% 19 0% 47 0%

bac2$inter[is.na(bac2$inter)] <- "NAava"

bac2 %>% mutate(id = factor(id), inter = factor(inter)) %>% 
  select(momento,anti,inter,micro, id, inter) %>% 
  group_by(momento,anti,inter,micro) %>%  count() %>% arrange(anti,desc(n)) %>% 
  pivot_wider(names_from = micro, values_from = n) %>% replace(is.na(.), 0) %>% as.data.frame() %>%   mutate(sum = rowSums(.[4:38])) %>% select(momento,anti,inter,sum) %>% arrange(desc(sum)) %>% pivot_wider(names_from = inter, values_from = sum, values_fill = 0) %>% as.data.frame() -> antitab


bac2 %>% mutate(id = factor(id), inter = factor(inter)) %>% #filter(inter!="NA") %>% 
  select(momento,anti,inter,micro, id, inter) %>% 
  group_by(momento,anti,inter,micro) %>%  count() %>% arrange(anti,desc(n)) %>% 
  pivot_wider(names_from = micro, values_from = n) %>% replace(is.na(.), 0) %>% as.data.frame() %>%   mutate(sum = rowSums(.[4:38])) %>% select(anti,momento,inter,sum) %>% arrange(desc(sum)) -> anti

levels(anti$inter) <- c("Intermediário","Não Avaliado","Negativo","Positivo","Resistente","Sensível")

anti %>% filter(inter %in% c("Intermediário", "Resistente","Sensível")) %>% 
  ggplot() +
  # ggtitle("S, R, I, NEG, POS") +
  aes(x=reorder(anti,-sum),y=sum, fill=inter) + 
  geom_bar(stat = "identity", position = "stack") +
  theme_pubr() +
  theme(legend.title = element_blank(),
        legend.position = "right",
        axis.text.x = element_text(angle = 90,
                                   hjust = 1,
                                   vjust = 0.3,
                                   colour = "black")) +
  xlab("") + ylab("Frequência") 



anti %>% filter(inter %in% c("Intermediário", "Resistente","Sensível")) %>% 
ggbarplot(., x = "anti", 
                   y = "sum",
                   fill = "inter", palette = "lancet",
                   label = F,
                   lab.pos = c("in"),
                   facet.by = "momento",
                   xlab = "",
                   repel=T,
                   ylab= "Frequência",
                   lab.size = 3,
                   position = position_stack()
) + 
  theme_pubr(legend="right") +
  theme(
    legend.title = element_blank(),
    text = element_text(size = 10),
    axis.text.y = element_text(
      angle = 0,
      hjust = 0,
      colour = "black"),
    axis.text.x = element_text(
      angle = 90,
      hjust = 1,
      vjust = 0.3,
      colour = "black")) #+ coord_flip()




bac2 %>% mutate(id = factor(id), inter = factor(inter)) %>% #filter(inter!="NA") %>% 
  select(anti,inter,micro, id, inter) %>% 
  group_by(anti,inter,micro) %>%  count() %>% arrange(anti,desc(n)) %>% 
  pivot_wider(names_from = micro, values_from = n) %>% replace(is.na(.), 0) %>% as.data.frame() %>%   mutate(sum = rowSums(.[4:37])) %>% select(anti,inter,sum) %>% arrange(desc(sum)) -> anti2

levels(anti2$inter) <- c("Intermediário","Não Avaliado","Negativo","Positivo","Resistente","Sensível")

bac2 %>% mutate(id = factor(id), inter = factor(inter)) %>% 
  select(anti,inter,micro, id, inter) %>% 
  group_by(anti,inter,micro) %>%  count() %>% arrange(anti,desc(n)) %>% 
  pivot_wider(names_from = micro, values_from = n) %>% replace(is.na(.), 0) %>% as.data.frame() %>%   mutate(sum = rowSums(.[4:37])) %>% select(anti,inter,sum) %>% arrange(desc(sum)) %>% pivot_wider(names_from = inter, values_from = sum, values_fill = 0) %>% as.data.frame() -> antitab2


anti2 %>% filter(inter %in% c("Intermediário", "Resistente","Sensível")) %>% ggbarplot(., x = "anti", 
                    y = "sum",
                    fill = "inter", #palette = "lancet",
                    label = TRUE,
                    lab.pos = c("out"),
                    #facet.by = "momento",
                    xlab = "",
                    repel=T,
                    ylab= "Frequência",
                    lab.size = 3,
                    position = position_stack()
) + 
  theme_pubr(legend="right") +
  theme(
    legend.title = element_blank(),
    text = element_text(size = 10),
    axis.text.y = element_text(
      angle = 0,
      hjust = 1,
      colour = "black"),
    axis.text.x = element_text(
      angle = 90,
      hjust = 1,
      colour = "black")) #+ coord_flip()

12. Comparação entre o numéro de R,S,I,NEG,POS,NA antes e depois da limpeza

Resposta



antitab %>%
  group_by(momento) %>%
  shapiro_test(S) %>% kable("pandoc")
momento variable statistic p
Antes da limpeza S 0.9160134 0.0057829
Após a limpeza S 0.9121528 0.0044004


p <- ggboxplot(antitab, x = "momento", y = "S",
               color = "momento", palette = "jco",
               add = "jitter", xlab = "", ylab = "Sensível") + 
  theme_pubr(legend="right") +
  theme(legend.title = element_blank())

p + stat_compare_means(paired = T)




antitab %>%
  group_by(momento) %>%
  shapiro_test(R) %>% kable("pandoc")
momento variable statistic p
Antes da limpeza R 0.6545600 0.00e+00
Após a limpeza R 0.8175864 1.61e-05


p <- ggboxplot(antitab, x = "momento", y = "R",
               color = "momento", palette = "jco",
               add = "jitter", xlab = "", ylab = "Resistente") + 
  theme_pubr(legend="right") +
  theme(legend.title = element_blank())

p + stat_compare_means(paired = T)




antitab %>%
  group_by(momento) %>%
  shapiro_test(I) %>% kable("pandoc")
momento variable statistic p
Antes da limpeza I 0.4110345 0
Após a limpeza I 0.4899872 0

p <- ggboxplot(antitab, x = "momento", y = "I",
               color = "momento", palette = "jco",
               add = "jitter", xlab = "", ylab = "Intermediário") + 
  theme_pubr(legend="right") +
  theme(legend.title = element_blank())

p + stat_compare_means(paired = T)




antitab %>%
  group_by(momento) %>%
  shapiro_test(NEG) %>% kable("pandoc")
momento variable statistic p
Antes da limpeza NEG 0.3014146 0
Após a limpeza NEG 0.2096947 0

p <- ggboxplot(antitab, x = "momento", y = "NEG",
               color = "momento", palette = "jco",
               add = "jitter", xlab = "", ylab = "Negativo") + 
  theme_pubr(legend="right") +
  theme(legend.title = element_blank())

p + stat_compare_means(paired = T)



antitab %>%
  group_by(momento) %>%
  shapiro_test(POS) %>% kable("pandoc")
momento variable statistic p
Antes da limpeza POS 0.2910119 0
Após a limpeza POS 0.1822424 0

p <- ggboxplot(antitab, x = "momento", y = "POS",
               color = "momento", palette = "jco",
               add = "jitter", xlab = "", ylab = "Positivo") + 
  theme_pubr(legend="right") +
  theme(legend.title = element_blank())

p + stat_compare_means(paired = T)



antitab %>%
  group_by(momento) %>%
  shapiro_test(NAava) %>% kable("pandoc")
momento variable statistic p
Antes da limpeza NAava 0.1581813 0
Após a limpeza NAava 0.3319444 0

p <- ggboxplot(antitab, x = "momento", y = "NAava",
               color = "momento", palette = "jco",
               add = "jitter", xlab = "", ylab = "Não Avaliado") + 
  theme_pubr(legend="right") +
  theme(legend.title = element_blank())

p + stat_compare_means(paired = T)


a<-compare_means(S ~ momento, data = antitab, paired = T)
b<-compare_means(R ~ momento, data = antitab, paired = T)
c<-compare_means(I ~ momento, data = antitab, paired = T)
d<-compare_means(NEG ~ momento, data = antitab, paired = T)
e<-compare_means(POS ~ momento, data = antitab, paired = T)
f<-compare_means(NAava  ~ momento, data = antitab, paired = T)

rbind(a,b,c,d,e,f) %>% kable("pandoc")
.y. group1 group2 p p.adj p.format p.signif method
S Antes da limpeza Após a limpeza 0.0920815 0.092 0.092 ns Wilcoxon
R Antes da limpeza Após a limpeza 0.0752452 0.075 0.075 ns Wilcoxon
I Antes da limpeza Após a limpeza 0.8595969 0.860 0.86 ns Wilcoxon
NEG Antes da limpeza Após a limpeza 0.8330289 0.830 0.83 ns Wilcoxon
POS Antes da limpeza Após a limpeza 1.0000000 1.000 1 ns Wilcoxon
NAava Antes da limpeza Após a limpeza 0.2614461 0.260 0.26 ns Wilcoxon

EXTRA

K-means e PCA

Carregamento dos dados


dat <- bac %>% select(micro, local, id) %>% distinct_all() %>%
  group_by(micro, local) %>% count() %>% 
  ungroup 

dat2 <- dcast(dat, micro ~ local)
dat2[is.na(dat2)] <- 0

rownames(dat2) <- dat2$micro

dat2 <- dat2[-1]


dat2

Dimensionamento e padronização


df <- scale(dat2) 

Número ótimo de clusters


# Silhueta média para kmeans
fviz_nbclust(df, kmeans, method = "silhouette")


# Estatística de lacunas
fviz_nbclust(df, kmeans, method = "gap_stat")


# Método Elbow para kmeans
fviz_nbclust(df, kmeans, method = "wss") +
  geom_vline(xintercept = 3, linetype = 2)




nbclust_out <- NbClust(
  data = df,
  distance = "euclidean",
  min.nc = 2,
  max.nc = 5,
  method = "kmeans"
)

*** : The Hubert index is a graphical method of determining the number of clusters.
                In the plot of Hubert index, we seek a significant knee that corresponds to a 
                significant increase of the value of the measure i.e the significant peak in Hubert
                index second differences plot. 
 

*** : The D index is a graphical method of determining the number of clusters. 
                In the plot of D index, we seek a significant knee (the significant peak in Dindex
                second differences plot) that corresponds to a significant increase of the value of
                the measure. 
 
******************************************************************* 
* Among all indices:                                                
* 4 proposed 2 as the best number of clusters 
* 13 proposed 3 as the best number of clusters 
* 5 proposed 4 as the best number of clusters 
* 1 proposed 5 as the best number of clusters 

                   ***** Conclusion *****                            
 
* According to the majority rule, the best number of clusters is  3 
 
 
******************************************************************* 

# create a dataframe of the optimal number of clusters
nbclust_plot <- data.frame(clusters = nbclust_out$Best.nc[1, ])
# select only indices which select between 2 and 5 clusters
nbclust_plot <- subset(nbclust_plot, clusters >= 2 & clusters <= 5)

# create plot
ggplot(nbclust_plot) +
  aes(x = clusters) +
  geom_histogram(bins = 30L, fill = "#0c4c8a") +
  labs(x = "Number of clusters", y = "Frequency among all indices", title = "Optimal number of clusters") +
  theme_pubr()

Clusterização k-means


#set.seed(123)
km.res = kmeans(df, 3, nstart=25)
#km.res <- hkmeans(df, 3,hc.method = "ward.D")
print(km.res)
K-means clustering with 3 clusters of sizes 3, 1, 31

Cluster means:
  Área administrativa Banheiro CTI   Copa CTI   Farmácia   Leito 03   Leito 04
1          0.67858019    1.9402966  1.3141477  1.3157610 -0.4209752 -0.2967516
2         -0.35404184   -0.3424053 -0.7392081 -0.5080661  4.4904016  4.8964014
3         -0.05424835   -0.1767253 -0.1033302 -0.1109425 -0.1041121 -0.1292305
    Leito 05   Leito 06    Leito 08    Leito 12 Pia do CTI
1 -0.4090567  2.7034958 -0.43753614  0.05771805  2.9108445
2  4.3632718  0.5282693  3.73894524  4.50200817 -0.3337274
3 -0.1011646 -0.2786696 -0.07826893 -0.15081169 -0.2709292

Clustering vector:
                 Acinetobacter baumannii 
                                       3 
         Acinetobacter baumannii complex 
                                       1 
  Acinetobacter baumannii complex (ESBL) 
                                       3 
   Acinetobacter baumannii complex (KPC) 
                                       3 
                     Aerococcus viridans 
                                       3 
                   Aeromonas salmonicida 
                                       3 
                     Alloiococcus otitis 
                                       3 
                 Bastonete Gram positivo 
                                       2 
                     Burkholderia mallei 
                                       3 
                Corynebacterium jeikeium 
                                       3 
             Enterobacter cloacae (ESBL) 
                                       3 
            Enterobacter cloacae complex 
                                       3 
                   Enterococcus columbae 
                                       3 
                   Enterococcus faecalis 
                                       1 
                    Enterococcus faecium 
                                       3 
                        Escherichia coli 
                                       3 
                   Klebsiella pneumoniae 
                                       3 
            Klebsiella pneumoniae (ESBL) 
                                       3 
                      Kocuria rhizophila 
                                       3 
                             Pantoea spp 
                                       3 
                    Pseudomonas stutzeri 
                                       3 
                     Serratia marcescens 
                                       1 
                   Staphylococcus aureus 
                                       3 
                   Staphylococcus caprae 
                                       3 
                   Staphylococcus cohnii 
                                       3 
              Staphylococcus epidermidis 
                                       3 
             Staphylococcus haemolyticus 
                                       3 
Staphylococcus haemolyticus (MRSA + MBL) 
                                       3 
                  Staphylococcus hominis 
                                       3 
            Staphylococcus hominis (MBL) 
                                       3 
     Staphylococcus hominis (MRSA + MBL) 
                                       3 
                   Staphylococcus lentus 
                                       3 
            Staphylococcus saprophyticus 
                                       3 
                   Staphylococcus sciuri 
                                       3 
     Staphylococcus warneri (MRSA + MBL) 
                                       3 

Within cluster sum of squares by cluster:
[1]  41.76277   0.00000 152.57633
 (between_SS / total_SS =  48.0 %)

Available components:

[1] "cluster"      "centers"      "totss"        "withinss"     "tot.withinss"
[6] "betweenss"    "size"         "iter"         "ifault"      

# fviz_cluster(km.res, palette = "Dark2", repel = TRUE,
#              ggtheme = theme_classic())
# 
# fviz_dend(km.res, cex = 0.6, palette = "Dark2", 
#           rect = TRUE, rect_border = "Dark2", rect_fill = TRUE)

Criando novo banco de dados com cluster

aggregate(dat2, by=list(cluster=km.res$cluster), mean)

dd <- cbind(dat2, cluster = km.res$cluster)


km.res$cluster
                 Acinetobacter baumannii 
                                       3 
         Acinetobacter baumannii complex 
                                       1 
  Acinetobacter baumannii complex (ESBL) 
                                       3 
   Acinetobacter baumannii complex (KPC) 
                                       3 
                     Aerococcus viridans 
                                       3 
                   Aeromonas salmonicida 
                                       3 
                     Alloiococcus otitis 
                                       3 
                 Bastonete Gram positivo 
                                       2 
                     Burkholderia mallei 
                                       3 
                Corynebacterium jeikeium 
                                       3 
             Enterobacter cloacae (ESBL) 
                                       3 
            Enterobacter cloacae complex 
                                       3 
                   Enterococcus columbae 
                                       3 
                   Enterococcus faecalis 
                                       1 
                    Enterococcus faecium 
                                       3 
                        Escherichia coli 
                                       3 
                   Klebsiella pneumoniae 
                                       3 
            Klebsiella pneumoniae (ESBL) 
                                       3 
                      Kocuria rhizophila 
                                       3 
                             Pantoea spp 
                                       3 
                    Pseudomonas stutzeri 
                                       3 
                     Serratia marcescens 
                                       1 
                   Staphylococcus aureus 
                                       3 
                   Staphylococcus caprae 
                                       3 
                   Staphylococcus cohnii 
                                       3 
              Staphylococcus epidermidis 
                                       3 
             Staphylococcus haemolyticus 
                                       3 
Staphylococcus haemolyticus (MRSA + MBL) 
                                       3 
                  Staphylococcus hominis 
                                       3 
            Staphylococcus hominis (MBL) 
                                       3 
     Staphylococcus hominis (MRSA + MBL) 
                                       3 
                   Staphylococcus lentus 
                                       3 
            Staphylococcus saprophyticus 
                                       3 
                   Staphylococcus sciuri 
                                       3 
     Staphylococcus warneri (MRSA + MBL) 
                                       3 
km.res$size
[1]  3  1 31
km.res$centers
  Área administrativa Banheiro CTI   Copa CTI   Farmácia   Leito 03   Leito 04
1          0.67858019    1.9402966  1.3141477  1.3157610 -0.4209752 -0.2967516
2         -0.35404184   -0.3424053 -0.7392081 -0.5080661  4.4904016  4.8964014
3         -0.05424835   -0.1767253 -0.1033302 -0.1109425 -0.1041121 -0.1292305
    Leito 05   Leito 06    Leito 08    Leito 12 Pia do CTI
1 -0.4090567  2.7034958 -0.43753614  0.05771805  2.9108445
2  4.3632718  0.5282693  3.73894524  4.50200817 -0.3337274
3 -0.1011646 -0.2786696 -0.07826893 -0.15081169 -0.2709292

Vizualizando os clusters



fviz_cluster(km.res, data=df,
             geom.ind = c("text"),
             ellipse.type="euclid",
             star.plot=T,
             palette = "Dark2",
             repel=TRUE,
             font.family = "italic",
             ggtheme=theme_pubr())

Dendrograma


dista=dist(df, method = "euclid")

dista.hc=hclust(d=dista, method = "ward.D")

fviz_dend(dista.hc,cex =0.5, k = 3, color_labels_by_k = TRUE, type = "rectangle")

fviz_dend(dista.hc,cex =0.8, k = 3, color_labels_by_k = TRUE, type = "phylogenic")

fviz_dend(dista.hc,cex =0.5, k = 3, color_labels_by_k = TRUE, type = "circular", lwd = 1)



fviz_dist(dista, gradient = list(low = "#00AFBB", mid = "white", high = "#FC4E07"))+ 
theme(axis.text.y = element_text(face = "italic"),
      axis.text.x = element_text(face = "italic"))

PCA


km.pca <- PCA(
  df,
  graph = F,
  scale.unit = TRUE)

eig.val <- get_eigenvalue(km.pca)
eig.val
       eigenvalue variance.percent cumulative.variance.percent
Dim.1   3.5580000        32.345455                    32.34545
Dim.2   2.6793918        24.358108                    56.70356
Dim.3   1.2426359        11.296690                    68.00025
Dim.4   0.8629244         7.844768                    75.84502
Dim.5   0.7553600         6.866909                    82.71193
Dim.6   0.6331413         5.755830                    88.46776
Dim.7   0.4044704         3.677004                    92.14476
Dim.8   0.3433866         3.121697                    95.26646
Dim.9   0.2529191         2.299265                    97.56573
Dim.10  0.1543937         1.403579                    98.96930
Dim.11  0.1133765         1.030696                   100.00000

fviz_eig(km.pca, addlabels=TRUE)


var <- get_pca_var(km.pca)
var
Principal Component Analysis Results for variables
 ===================================================
  Name       Description                                    
1 "$coord"   "Coordinates for the variables"                
2 "$cor"     "Correlations between variables and dimensions"
3 "$cos2"    "Cos2 for the variables"                       
4 "$contrib" "contributions of the variables"               
$coord

$cor

$cos2

$contrib

Coordinates for the variables

Correlations between variables and dimensions

Cos2 for the variables

contributions of the variables



#  Coordenadas
head(var$coord)
                         Dim.1     Dim.2      Dim.3        Dim.4       Dim.5
Área administrativa -0.1515598 0.1524005  0.8535430 -0.381525622 -0.03773429
Banheiro CTI        -0.4474423 0.6997840 -0.4232991 -0.005728760  0.03385333
Copa CTI            -0.4376934 0.5095557  0.1551532  0.360015354 -0.33402932
Farmácia            -0.2832577 0.3361338  0.4359862  0.607448899  0.41855202
Leito 03             0.7340294 0.2896805 -0.1389382  0.005183907  0.35311513
Leito 04             0.8134368 0.4270941  0.1088101  0.072830818 -0.15418335
# Cos2: qualidade no mapa do fator
head(var$cos2)
                         Dim.1      Dim.2      Dim.3        Dim.4       Dim.5
Área administrativa 0.02297038 0.02322591 0.72853573 1.455618e-01 0.001423877
Banheiro CTI        0.20020460 0.48969771 0.17918211 3.281870e-05 0.001146048
Copa CTI            0.19157555 0.25964698 0.02407253 1.296111e-01 0.111575587
Farmácia            0.08023495 0.11298590 0.19008393 3.689942e-01 0.175185794
Leito 03            0.53879910 0.08391480 0.01930383 2.687289e-05 0.124690297
Leito 04            0.66167947 0.18240934 0.01183964 5.304328e-03 0.023772506
# Contribuições para os componentes principais
head(var$contrib)
                        Dim.1     Dim.2      Dim.3        Dim.4      Dim.5
Área administrativa  0.645598  0.866835 58.6282515 16.868429264  0.1885031
Banheiro CTI         5.626886 18.276450 14.4195178  0.003803195  0.1517221
Copa CTI             5.384361  9.690519  1.9372146 15.019977122 14.7711800
Farmácia             2.255058  4.216849 15.2968321 42.760888886 23.1923574
Leito 03            15.143314  3.131860  1.5534584  0.003114165 16.5073998
Leito 04            18.596949  6.807864  0.9527847  0.614692051  3.1471756

fviz_cos2(km.pca, choice = "var", axes = 1:2)


df %>% cor(method = "spearman") %>% corrplot(.,
                                             method = "number",
                                             type = "upper",
                                             tl.pos = "td")





summary(km.pca)

Call:
PCA(X = df, scale.unit = TRUE, graph = F) 


Eigenvalues
                       Dim.1   Dim.2   Dim.3   Dim.4   Dim.5   Dim.6   Dim.7
Variance               3.558   2.679   1.243   0.863   0.755   0.633   0.404
% of var.             32.345  24.358  11.297   7.845   6.867   5.756   3.677
Cumulative % of var.  32.345  56.704  68.000  75.845  82.712  88.468  92.145
                       Dim.8   Dim.9  Dim.10  Dim.11
Variance               0.343   0.253   0.154   0.113
% of var.              3.122   2.299   1.404   1.031
Cumulative % of var.  95.266  97.566  98.969 100.000

Individuals (the 10 first)
                                           Dist    Dim.1    ctr   cos2    Dim.2
Acinetobacter baumannii                |  2.651 |  0.970  0.755  0.134 | -0.099
Acinetobacter baumannii complex        |  5.132 | -1.512  1.835  0.087 |  2.367
Acinetobacter baumannii complex (ESBL) |  1.656 |  0.251  0.051  0.023 | -1.147
Acinetobacter baumannii complex (KPC)  |  2.476 |  0.718  0.415  0.084 | -0.950
Aerococcus viridans                    |  1.738 |  0.315  0.079  0.033 | -1.122
Aeromonas salmonicida                  |  1.569 | -0.715  0.411  0.208 | -0.670
Alloiococcus otitis                    |  3.147 | -0.469  0.177  0.022 | -1.051
Bastonete Gram positivo                | 10.088 |  9.154 67.285  0.823 |  4.215
Burkholderia mallei                    |  1.403 | -0.507  0.206  0.130 | -0.955
Corynebacterium jeikeium               |  2.201 | -0.675  0.365  0.094 | -0.517
                                          ctr   cos2    Dim.3    ctr   cos2  
Acinetobacter baumannii                 0.011  0.001 |  0.229  0.121  0.007 |
Acinetobacter baumannii complex         5.972  0.213 |  2.546 14.902  0.246 |
Acinetobacter baumannii complex (ESBL)  1.403  0.480 | -0.418  0.401  0.064 |
Acinetobacter baumannii complex (KPC)   0.962  0.147 | -0.459  0.485  0.034 |
Aerococcus viridans                     1.342  0.417 | -0.460  0.486  0.070 |
Aeromonas salmonicida                   0.478  0.182 |  0.341  0.267  0.047 |
Alloiococcus otitis                     1.178  0.112 |  2.031  9.482  0.416 |
Bastonete Gram positivo                18.941  0.175 | -0.040  0.004  0.000 |
Burkholderia mallei                     0.972  0.463 | -0.202  0.094  0.021 |
Corynebacterium jeikeium                0.285  0.055 | -0.350  0.281  0.025 |

Variables (the 10 first)
                                          Dim.1    ctr   cos2    Dim.2    ctr
Área administrativa                    | -0.152  0.646  0.023 |  0.152  0.867
Banheiro CTI                           | -0.447  5.627  0.200 |  0.700 18.276
Copa CTI                               | -0.438  5.384  0.192 |  0.510  9.691
Farmácia                               | -0.283  2.255  0.080 |  0.336  4.217
Leito 03                               |  0.734 15.143  0.539 |  0.290  3.132
Leito 04                               |  0.813 18.597  0.662 |  0.427  6.808
Leito 05                               |  0.729 14.917  0.531 |  0.266  2.647
Leito 06                               | -0.334  3.139  0.112 |  0.862 27.731
Leito 08                               |  0.709 14.144  0.503 |  0.257  2.470
Leito 12                               |  0.725 14.773  0.526 |  0.422  6.633
                                         cos2    Dim.3    ctr   cos2  
Área administrativa                     0.023 |  0.854 58.628  0.729 |
Banheiro CTI                            0.490 | -0.423 14.420  0.179 |
Copa CTI                                0.260 |  0.155  1.937  0.024 |
Farmácia                                0.113 |  0.436 15.297  0.190 |
Leito 03                                0.084 | -0.139  1.553  0.019 |
Leito 04                                0.182 |  0.109  0.953  0.012 |
Leito 05                                0.071 | -0.038  0.119  0.001 |
Leito 06                                0.743 | -0.170  2.339  0.029 |
Leito 08                                0.066 | -0.066  0.352  0.004 |
Leito 12                                0.178 |  0.233  4.384  0.054 |


# Contribuições de variáveis para PC1
fviz_contrib(km.pca, choice = "var", axes = 1, top = 10)

# Contribuições de variáveis para PC2
fviz_contrib(km.pca, choice = "var", axes = 2, top = 10)


# contribuição total para PC1 e PC2 

fviz_contrib(km.pca, choice = "var", axes = 1:2)



fviz_pca_biplot(
  km.pca,
  geom.ind = "text",
  col.var = "contrib",
  gradient.cols = c("#00AFBB", "#E7B800", "#FC4E07"),
  legend.title = "Contribuição",
  palette = "Dark2",
  repel = F
)



fviz_pca_ind(
  km.pca,
  geom = "text",
  habillage = as.factor(dd$cluster),
  addEllipses = TRUE,
  repel = T,
  palette = "Dark2"
)


fviz_pca_ind(km.pca,
             geom.ind = "text",
             col.ind = as.factor(dd$cluster),
             addEllipses = TRUE, 
             legend.title = "Grupos",
             repel = T,
             palette = "Dark2"
)




df %>% pairs.panels(., 
                    show.points=TRUE, 
                    method = "spearman",
                    gap=0, 
                    stars=TRUE,
                    ci=FALSE,
                    alpha=0.05,
                    cex.cor=1,
                    cex=1.0,
                    breaks="Sturges",
                    rug=FALSE,
                    density=F,
                    hist.col="darkgreen",
                    factor=5,
                    digits=2,
                    ellipses=FALSE,
                    scale=FALSE,
                    smooth=TRUE,
                    lm=T,
                    cor=T
) 



dd.pca = prcomp(df, scale = T)


ggbiplot2(
  dd.pca,
  obs.scale = 1,
  var.scale = 1,
  ellipse = T,
  circle = T,
  varname.abbrev = T,
  grupos = as.factor(dd$cluster)
) + theme_pubr() + scale_color_brewer( palette = 'Dark2')



ind <- get_pca_ind(km.pca)
ind
Principal Component Analysis Results for individuals
 ===================================================
  Name       Description                       
1 "$coord"   "Coordinates for the individuals" 
2 "$cos2"    "Cos2 for the individuals"        
3 "$contrib" "contributions of the individuals"
$coord

$cos2

$contrib

Coordinates for the individuals

Cos2 for the individuals

contributions of the individuals


# Coordenadas de indivíduos
head(ind$coord)
                                            Dim.1       Dim.2      Dim.3
Acinetobacter baumannii                 0.9699156 -0.09926623  0.2292384
Acinetobacter baumannii complex        -1.5117696  2.36656852  2.5457906
Acinetobacter baumannii complex (ESBL)  0.2509344 -1.14688822 -0.4175689
Acinetobacter baumannii complex (KPC)   0.7184552 -0.94993678 -0.4592452
Aerococcus viridans                     0.3146240 -1.12183389 -0.4597433
Aeromonas salmonicida                  -0.7150491 -0.66972713  0.3408877
                                             Dim.4      Dim.5
Acinetobacter baumannii                 0.35054455 -1.5204586
Acinetobacter baumannii complex        -2.61861198  0.5402088
Acinetobacter baumannii complex (ESBL) -0.49573957  0.4806389
Acinetobacter baumannii complex (KPC)  -0.67743349  0.9705285
Aerococcus viridans                    -0.01818709 -0.6938637
Aeromonas salmonicida                   1.07793342  0.1786954
# Qualidade dos indivíduos
head(ind$cos2)
                                            Dim.1       Dim.2       Dim.3
Acinetobacter baumannii                0.13381644 0.001401666 0.007475089
Acinetobacter baumannii complex        0.08676500 0.212623616 0.246047354
Acinetobacter baumannii complex (ESBL) 0.02297227 0.479872364 0.063612113
Acinetobacter baumannii complex (KPC)  0.08417506 0.147154464 0.034393251
Aerococcus viridans                    0.03276062 0.416510052 0.069951852
Aeromonas salmonicida                  0.20756486 0.182086549 0.047174225
                                              Dim.4      Dim.5
Acinetobacter baumannii                0.0174794598 0.32884465
Acinetobacter baumannii complex        0.2603248545 0.01107890
Acinetobacter baumannii complex (ESBL) 0.0896583476 0.08427939
Acinetobacter baumannii complex (KPC)  0.0748371720 0.15360334
Aerococcus viridans                    0.0001094699 0.15933701
Aeromonas salmonicida                  0.4717000891 0.01296310
# Contribuições de indivíduos
head(ind$contrib)
                                            Dim.1      Dim.2      Dim.3
Acinetobacter baumannii                0.75542947 0.01050749  0.1208267
Acinetobacter baumannii complex        1.83525850 5.97219379 14.9016174
Acinetobacter baumannii complex (ESBL) 0.05056458 1.40261316  0.4009076
Acinetobacter baumannii complex (KPC)  0.41450085 0.96224382  0.4849280
Aerococcus viridans                    0.07948949 1.34200099  0.4859805
Aeromonas salmonicida                  0.41057996 0.47829023  0.2671842
                                             Dim.4     Dim.5
Acinetobacter baumannii                 0.40686060 8.7443431
Acinetobacter baumannii complex        22.70395318 1.1038279
Acinetobacter baumannii complex (ESBL)  0.81370382 0.8738076
Acinetobacter baumannii complex (KPC)   1.51947134 3.5628258
Aerococcus viridans                     0.00109518 1.8210684
Aeromonas salmonicida                   3.84718489 0.1207827



fviz_pca_ind(km.pca, col.ind = "cos2", 
             gradient.cols = c("#00AFBB", "#E7B800", "#FC4E07"),
             repel = TRUE
)


fviz_contrib(km.pca, choice = "ind", axes = 1:2)



set.seed(123)
my.cont.var <- rnorm(35)

fviz_pca_ind(km.pca, col.ind = my.cont.var,
             gradient.cols = c("blue", "yellow", "red"),
             legend.title = "Cont.Var")



fviz_pca_ind(km.pca,
             geom.ind = "point",
             col.ind = as.factor(dd$cluster),
             palette = "Dark2",
             addEllipses = TRUE, 
             legend.title = "Grupos"
)



fviz_pca_biplot(km.pca, 
                geom.ind = c("point","text"),
                fill.ind = as.factor(dd$cluster), 
                col.ind = "black",
                pointshape = 21, 
                pointsize = 2,
                palette = "Dark2",
                repel=F,
                labelsize=3,
                addEllipses = F,
                alpha.var ="contrib", 
                col.var = "contrib",
                gradient.cols = c("#00AFBB", "#E7B800", "#FC4E07"),
                legend.title = list(fill = "Cluster",
                                    color = "Contrib",
                                    alpha = "Contrib"))

Referência

Os procedimentos estatísticos utilizados neste estudo foram realizados no programa R (R Core Team 2020). Pacote ‘stats’: Coeficiente de correlação de Spearman (R Core Team 2020). Pacote ‘ggpot2’: elementos gráficos (Wickham 2016).

antitab
antitab2




write.xlsx(antitab, "anti.xlsx")
write.xlsx(antitab2, "anti2.xlsx")

R Core Team. 2020. “R: A Language and Environment for Statistical Computing.” https://www.R-project.org/.

Wickham, Hadley. 2016. Ggplot2: Elegant Graphics for Data Analysis. Springer-Verlag New York. https://ggplot2.tidyverse.org.

IycgLS0tDQojJyB0aXRsZTogIkFuw6FsaXNlIg0KIycgYXV0aG9yOiBDaWQgRWRzb24gUMOzdm9hcw0KIycgYmlibGlvZ3JhcGh5OiBScGFja2FnZXMuYmliDQojJyBvdXRwdXQ6DQojJyAgIGh0bWxfbm90ZWJvb2s6IA0KIycgICAgIGNvZGVfZm9sZGluZzogaGlkZQ0KIycgICAgIHRvYzogdHJ1ZQ0KIycgICAgIHRvY19mbG9hdDogdHJ1ZQ0KIycgICAgIGNvbGxhcHNlZDogZmFsc2UNCiMnIC0tLQ0KIysgd2FybmluZz1GQUxTRSwgZWNobz1ULCBtZXNzYWdlPUZBTFNFDQojKyBzZXR1cCwgaW5jbHVkZT1GLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFDQprbml0cjo6b3B0c19jaHVuayRzZXQoY29sbGFwc2UgPSBUUlVFKQ0KDQpsaWJyYXJ5KGtuaXRyKQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShmYWN0b2V4dHJhKQ0KbGlicmFyeShGYWN0b01pbmVSKQ0KbGlicmFyeSh2ZWdhbikNCmxpYnJhcnkocHN5Y2gpDQpsaWJyYXJ5KGNvcnJwbG90KQ0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkoTmJDbHVzdCkNCmxpYnJhcnkoZ2dwdWJyKQ0KbGlicmFyeShyc3RhdGl4KQ0KbGlicmFyeSh4bHN4KQ0KDQpnZ2JpcGxvdDI9ZnVuY3Rpb24ocGNvYmosIGNob2ljZXMgPSAxOjIsIHNjYWxlID0gMSwgcGMuYmlwbG90ID0gVFJVRSwgDQogICAgICAgICAgICAgICAgICAgb2JzLnNjYWxlID0gMSAtIHNjYWxlLCB2YXIuc2NhbGUgPSBzY2FsZSwgDQogICAgICAgICAgICAgICAgICAgZ3J1cG9zID0gTlVMTCwgZWxsaXBzZSA9IEZBTFNFLCBlbGxpcHNlLnByb2IgPSAwLjY4LCANCiAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBOVUxMLCBsYWJlbHMuc2l6ZSA9IDMsIGFscGhhID0gMSwgDQogICAgICAgICAgICAgICAgICAgdmFyLmF4ZXMgPSBUUlVFLCANCiAgICAgICAgICAgICAgICAgICBjaXJjbGUgPSBGQUxTRSwgY2lyY2xlLnByb2IgPSAwLjY5LCANCiAgICAgICAgICAgICAgICAgICB2YXJuYW1lLnNpemUgPSAzLCB2YXJuYW1lLmFkanVzdCA9IDEuNSwgDQogICAgICAgICAgICAgICAgICAgdmFybmFtZS5hYmJyZXYgPSBGQUxTRSwgLi4uKQ0Kew0KICBsaWJyYXJ5KGdncGxvdDIpDQogIGxpYnJhcnkocGx5cikNCiAgbGlicmFyeShzY2FsZXMpDQogIGxpYnJhcnkoZ3JpZCkNCiAgDQogIHN0b3BpZm5vdChsZW5ndGgoY2hvaWNlcykgPT0gMikNCiAgDQogICMgUmVjb3ZlciB0aGUgU1ZEDQogIGlmKGluaGVyaXRzKHBjb2JqLCAncHJjb21wJykpew0KICAgIG5vYnMuZmFjdG9yIDwtIHNxcnQobnJvdyhwY29iaiR4KSAtIDEpDQogICAgZCA8LSBwY29iaiRzZGV2DQogICAgdSA8LSBzd2VlcChwY29iaiR4LCAyLCAxIC8gKGQgKiBub2JzLmZhY3RvciksIEZVTiA9ICcqJykNCiAgICB2IDwtIHBjb2JqJHJvdGF0aW9uDQogIH0gZWxzZSBpZihpbmhlcml0cyhwY29iaiwgJ3ByaW5jb21wJykpIHsNCiAgICBub2JzLmZhY3RvciA8LSBzcXJ0KHBjb2JqJG4ub2JzKQ0KICAgIGQgPC0gcGNvYmokc2Rldg0KICAgIHUgPC0gc3dlZXAocGNvYmokc2NvcmVzLCAyLCAxIC8gKGQgKiBub2JzLmZhY3RvciksIEZVTiA9ICcqJykNCiAgICB2IDwtIHBjb2JqJGxvYWRpbmdzDQogIH0gZWxzZSBpZihpbmhlcml0cyhwY29iaiwgJ1BDQScpKSB7DQogICAgbm9icy5mYWN0b3IgPC0gc3FydChucm93KHBjb2JqJGNhbGwkWCkpDQogICAgZCA8LSB1bmxpc3Qoc3FydChwY29iaiRlaWcpWzFdKQ0KICAgIHUgPC0gc3dlZXAocGNvYmokaW5kJGNvb3JkLCAyLCAxIC8gKGQgKiBub2JzLmZhY3RvciksIEZVTiA9ICcqJykNCiAgICB2IDwtIHN3ZWVwKHBjb2JqJHZhciRjb29yZCwyLHNxcnQocGNvYmokZWlnWzE6bmNvbChwY29iaiR2YXIkY29vcmQpLDFdKSxGVU49Ii8iKQ0KICB9IGVsc2Ugew0KICAgIHN0b3AoJ0V4cGVjdGVkIGEgb2JqZWN0IG9mIGNsYXNzIHByY29tcCwgcHJpbmNvbXAgb3IgUENBJykNCiAgfQ0KICANCiAgIyBTY29yZXMNCiAgZGYudSA8LSBhcy5kYXRhLmZyYW1lKHN3ZWVwKHVbLGNob2ljZXNdLCAyLCBkW2Nob2ljZXNdXm9icy5zY2FsZSwgRlVOPScqJykpDQogIA0KICAjIERpcmVjdGlvbnMNCiAgdiA8LSBzd2VlcCh2LCAyLCBkXnZhci5zY2FsZSwgRlVOPScqJykNCiAgZGYudiA8LSBhcy5kYXRhLmZyYW1lKHZbLCBjaG9pY2VzXSkNCiAgDQogIG5hbWVzKGRmLnUpIDwtIGMoJ3h2YXInLCAneXZhcicpDQogIG5hbWVzKGRmLnYpIDwtIG5hbWVzKGRmLnUpDQogIA0KICBpZihwYy5iaXBsb3QpIHsNCiAgICBkZi51IDwtIGRmLnUgKiBub2JzLmZhY3Rvcg0KICB9DQogIA0KICAjIFNjYWxlIHRoZSByYWRpdXMgb2YgdGhlIGNvcnJlbGF0aW9uIGNpcmNsZSBzbyB0aGF0IGl0IGNvcnJlc3BvbmRzIHRvIA0KICAjIGEgZGF0YSBlbGxpcHNlIGZvciB0aGUgc3RhbmRhcmRpemVkIFBDIHNjb3Jlcw0KICByIDwtIDENCiAgDQogICMgU2NhbGUgZGlyZWN0aW9ucw0KICB2LnNjYWxlIDwtIHJvd1N1bXModl4yKQ0KICBkZi52IDwtIGRmLnYgLyBzcXJ0KG1heCh2LnNjYWxlKSkNCiAgDQogICMjIFNjYWxlIFNjb3Jlcw0KICByLnNjYWxlPXNxcnQobWF4KGRmLnVbLDFdXjIrZGYudVssMl1eMikpDQogIGRmLnU9Ljk5KmRmLnUvci5zY2FsZQ0KICANCiAgIyBDaGFuZ2UgdGhlIGxhYmVscyBmb3IgdGhlIGF4ZXMNCiAgaWYob2JzLnNjYWxlID09IDApIHsNCiAgICB1LmF4aXMubGFicyA8LSBwYXN0ZSgnc3RhbmRhcmRpemVkIFBDJywgY2hvaWNlcywgc2VwPScnKQ0KICB9IGVsc2Ugew0KICAgIHUuYXhpcy5sYWJzIDwtIHBhc3RlKCdDb21wb25lbnRlIFByaW5jaXBhbCAnLCBjaG9pY2VzLCBzZXA9JycpDQogIH0NCiAgDQogICMgQXBwZW5kIHRoZSBwcm9wb3J0aW9uIG9mIGV4cGxhaW5lZCB2YXJpYW5jZSB0byB0aGUgYXhpcyBsYWJlbHMNCiAgdS5heGlzLmxhYnMgPC0gcGFzdGUodS5heGlzLmxhYnMsIA0KICAgICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKCcoJTAuMWYlJSknLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDAgKiBwY29iaiRzZGV2W2Nob2ljZXNdXjIvc3VtKHBjb2JqJHNkZXZeMikpKQ0KICANCiAgIyBTY29yZSBMYWJlbHMNCiAgaWYoIWlzLm51bGwobGFiZWxzKSkgew0KICAgIGRmLnUkbGFiZWxzIDwtIGxhYmVscw0KICB9DQogIA0KICAjIEdyb3VwaW5nIHZhcmlhYmxlDQogIGlmKCFpcy5udWxsKGdydXBvcykpIHsNCiAgICBkZi51JGdydXBvcyA8LSBncnVwb3MNCiAgfQ0KICANCiAgIyBWYXJpYWJsZSBOYW1lcw0KICBpZih2YXJuYW1lLmFiYnJldikgew0KICAgIGRmLnYkdmFybmFtZSA8LSBhYmJyZXZpYXRlKHJvd25hbWVzKHYpKQ0KICB9IGVsc2Ugew0KICAgIGRmLnYkdmFybmFtZSA8LSByb3duYW1lcyh2KQ0KICB9DQogIA0KICAjIFZhcmlhYmxlcyBmb3IgdGV4dCBsYWJlbCBwbGFjZW1lbnQNCiAgZGYudiRhbmdsZSA8LSB3aXRoKGRmLnYsICgxODAvcGkpICogYXRhbih5dmFyIC8geHZhcikpDQogIGRmLnYkaGp1c3QgPSB3aXRoKGRmLnYsICgxIC0gdmFybmFtZS5hZGp1c3QgKiBzaWduKHh2YXIpKSAvIDIpDQogIA0KICAjIEJhc2UgcGxvdA0KICBnIDwtIGdncGxvdChkYXRhID0gZGYudSwgYWVzKHggPSB4dmFyLCB5ID0geXZhcikpICsgDQogICAgeGxhYih1LmF4aXMubGFic1sxXSkgKyB5bGFiKHUuYXhpcy5sYWJzWzJdKSArIGNvb3JkX2VxdWFsKCkNCiAgDQogIGlmKHZhci5heGVzKSB7DQogICAgIyBEcmF3IGNpcmNsZQ0KICAgIGlmKGNpcmNsZSkgDQogICAgew0KICAgICAgdGhldGEgPC0gYyhzZXEoLXBpLCBwaSwgbGVuZ3RoID0gNTApLCBzZXEocGksIC1waSwgbGVuZ3RoID0gNTApKQ0KICAgICAgY2lyY2xlIDwtIGRhdGEuZnJhbWUoeHZhciA9IHIgKiBjb3ModGhldGEpLCB5dmFyID0gciAqIHNpbih0aGV0YSkpDQogICAgICBnIDwtIGcgKyBnZW9tX3BhdGgoZGF0YSA9IGNpcmNsZSwgY29sb3IgPSBtdXRlZCgnd2hpdGUnKSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IDEvMiwgYWxwaGEgPSAxLzMpDQogICAgfQ0KICAgIA0KICAgICMgRHJhdyBkaXJlY3Rpb25zDQogICAgZyA8LSBnICsNCiAgICAgIGdlb21fc2VnbWVudChkYXRhID0gZGYudiwNCiAgICAgICAgICAgICAgICAgICBhZXMoeCA9IDAsIHkgPSAwLCB4ZW5kID0geHZhciwgeWVuZCA9IHl2YXIpLA0KICAgICAgICAgICAgICAgICAgIGFycm93ID0gYXJyb3cobGVuZ3RoID0gdW5pdCgxLzIsICdwaWNhcycpKSwgDQogICAgICAgICAgICAgICAgICAgY29sb3IgPSBtdXRlZCgncmVkJykpDQogIH0NCiAgDQogICMgRHJhdyBlaXRoZXIgbGFiZWxzIG9yIHBvaW50cw0KICBpZighaXMubnVsbChkZi51JGxhYmVscykpIHsNCiAgICBpZighaXMubnVsbChkZi51JGdydXBvcykpIHsNCiAgICAgIGcgPC0gZyArIGdlb21fdGV4dChhZXMobGFiZWwgPSBsYWJlbHMsIGNvbG9yID0gZ3J1cG9zKSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IGxhYmVscy5zaXplKQ0KICAgIH0gZWxzZSB7DQogICAgICBnIDwtIGcgKyBnZW9tX3RleHQoYWVzKGxhYmVsID0gbGFiZWxzKSwgc2l6ZSA9IGxhYmVscy5zaXplKSAgICAgIA0KICAgIH0NCiAgfSBlbHNlIHsNCiAgICBpZighaXMubnVsbChkZi51JGdydXBvcykpIHsNCiAgICAgIGcgPC0gZyArIGdlb21fcG9pbnQoYWVzKGNvbG9yID0gZ3J1cG9zKSwgYWxwaGEgPSBhbHBoYSkNCiAgICB9IGVsc2Ugew0KICAgICAgZyA8LSBnICsgZ2VvbV9wb2ludChhbHBoYSA9IGFscGhhKSAgICAgIA0KICAgIH0NCiAgfQ0KICANCiAgIyBPdmVybGF5IGEgY29uY2VudHJhdGlvbiBlbGxpcHNlIGlmIHRoZXJlIGFyZSBncnVwb3MNCiAgaWYoIWlzLm51bGwoZGYudSRncnVwb3MpICYmIGVsbGlwc2UpIHsNCiAgICB0aGV0YSA8LSBjKHNlcSgtcGksIHBpLCBsZW5ndGggPSA1MCksIHNlcShwaSwgLXBpLCBsZW5ndGggPSA1MCkpDQogICAgY2lyY2xlIDwtIGNiaW5kKGNvcyh0aGV0YSksIHNpbih0aGV0YSkpDQogICAgDQogICAgZWxsIDwtIGRkcGx5KGRmLnUsICdncnVwb3MnLCBmdW5jdGlvbih4KSB7DQogICAgICBpZihucm93KHgpIDwgMikgew0KICAgICAgICByZXR1cm4oTlVMTCkNCiAgICAgIH0gZWxzZSBpZihucm93KHgpID09IDIpIHsNCiAgICAgICAgc2lnbWEgPC0gdmFyKGNiaW5kKHgkeHZhciwgeCR5dmFyKSkNCiAgICAgIH0gZWxzZSB7DQogICAgICAgIHNpZ21hIDwtIGRpYWcoYyh2YXIoeCR4dmFyKSwgdmFyKHgkeXZhcikpKQ0KICAgICAgfQ0KICAgICAgbXUgPC0gYyhtZWFuKHgkeHZhciksIG1lYW4oeCR5dmFyKSkNCiAgICAgIGVkIDwtIHNxcnQocWNoaXNxKGVsbGlwc2UucHJvYiwgZGYgPSAyKSkNCiAgICAgIGRhdGEuZnJhbWUoc3dlZXAoY2lyY2xlICUqJSBjaG9sKHNpZ21hKSAqIGVkLCAyLCBtdSwgRlVOID0gJysnKSwgDQogICAgICAgICAgICAgICAgIGdydXBvcyA9IHgkZ3J1cG9zWzFdKQ0KICAgIH0pDQogICAgbmFtZXMoZWxsKVsxOjJdIDwtIGMoJ3h2YXInLCAneXZhcicpDQogICAgZyA8LSBnICsgZ2VvbV9wYXRoKGRhdGEgPSBlbGwsIGFlcyhjb2xvciA9IGdydXBvcywgZ3JvdXAgPSBncnVwb3MpKQ0KICB9DQogIA0KICAjIExhYmVsIHRoZSB2YXJpYWJsZSBheGVzDQogIGlmKHZhci5heGVzKSB7DQogICAgZyA8LSBnICsgDQogICAgICBnZW9tX3RleHQoZGF0YSA9IGRmLnYsIA0KICAgICAgICAgICAgICAgIGFlcyhsYWJlbCA9IHZhcm5hbWUsIHggPSB4dmFyLCB5ID0geXZhciwgDQogICAgICAgICAgICAgICAgICAgIGFuZ2xlID0gYW5nbGUsIGhqdXN0ID0gaGp1c3QpLCANCiAgICAgICAgICAgICAgICBjb2xvciA9ICdkYXJrcmVkJywgc2l6ZSA9IHZhcm5hbWUuc2l6ZSkNCiAgfQ0KICAjIENoYW5nZSB0aGUgbmFtZSBvZiB0aGUgbGVnZW5kIGZvciBncnVwb3MNCiAgIyBpZighaXMubnVsbChncnVwb3MpKSB7DQogICMgICBnIDwtIGcgKyBzY2FsZV9jb2xvcl9icmV3ZXIobmFtZSA9IGRlcGFyc2Uoc3Vic3RpdHV0ZShncnVwb3MpKSwgDQogICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFsZXR0ZSA9ICdEYXJrMicpDQogICMgfQ0KICANCiAgIyBUT0RPOiBBZGQgYSBzZWNvbmQgc2V0IG9mIGF4ZXMNCiAgDQogIHJldHVybihnKQ0KfQ0KDQoNCg0KbGlicmFyeShyZWFkeGwpDQpsaWJyYXJ5KGtuaXRyKQ0KYmFjIDwtIHJlYWRfZXhjZWwoIlBsYW5pbGhhIENvbXBsZXRhIENUSS4gUGFsb21hLnhsc3giLCBzaGVldCA9ICJkYWRvcyIpDQpiYWMgPC0gYmFjWzE6MTFdDQpzdHIoYmFjKQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShkcGx5cikNCmJhYyRtaWNybyA8LSBhcy5mYWN0b3IoYmFjJG1pY3JvKQ0KYmFjJGxvY2FsIDwtIGFzLmZhY3RvcihiYWMkbG9jYWwpDQpiYWMkbW9tZW50byA8LSBhcy5mYWN0b3IoYmFjJG1vbWVudG8pDQoNCg0KbGV2ZWxzKGJhYyRtb21lbnRvKSA8LSBjKCJBbnRlcyBkYSBsaW1wZXphIiwiQXDDs3MgYSBsaW1wZXphIikNCmxpYnJhcnkoZ2dwdWJyKQ0KbGlicmFyeShEVCkNCmJhYyRyZXN1bC5taWMgPC0gYXMuZmFjdG9yKGJhYyRyZXN1bC5taWMpDQpsaWJyYXJ5KFJDb2xvckJyZXdlcikNCmxpYnJhcnkoY29sb3JSYW1wcykNCm9wdGlvbnMoRFQub3B0aW9ucyA9IGxpc3Qoc2Nyb2xsWT0iMTAwdmgiKSkNCg0KDQojZ2V0UGFsZXR0ZSA8LSBjb2xvclJhbXBQYWxldHRlKGJyZXdlci5wYWwoMTIsICJTZXQzIikpDQoNCmdnX2NvbG9yX2h1ZSA8LSBmdW5jdGlvbihuKSB7DQogIGh1ZXMgPSBzZXEoMTUsIDM3NSwgbGVuZ3RoID0gbiArIDEpDQogIGhjbChoID0gaHVlcywgbCA9IDY1LCBjID0gMTAwKVsxOm5dDQp9DQoNCiMgbGlicmFyeShzY2FsZXMpDQojIHNob3dfY29sKGh1ZV9wYWwoKSgzMCkpDQoNCmNvciA9IGdnX2NvbG9yX2h1ZShsZW5ndGgobGV2ZWxzKGJhYyRtaWNybykpKQ0KDQoNCiMgDQojIA0KIyBiYWMgJT4lIGZpbHRlcihtb21lbnRvPT0iQXDDs3MgYSBsaW1wZXphIikgJT4lIHNlbGVjdChsb2NhbCxzdXBlcixtaWNybyxtb21lbnRvLGdyYW0sZGlsdWljYW8sbmFETkEpICU+JSBkaXN0aW5jdF9hbGwoKSAlPiUNCiMgICBncm91cF9ieShuYUROQSxncmFtLHN1cGVyLG1vbWVudG8sbG9jYWwsbWljcm8pICU+JSBjb3VudCgpICU+JSANCiMgICB1bmdyb3VwICU+JSANCiMgICBtdXRhdGUodG90YWwgPSBzdW0obiksICBwcm9wID0gcGFzdGUwKHJvdW5kKG4vdG90YWwqMTAwLDIpLCIlIikpICU+JSANCiMgICBhcnJhbmdlKChuYUROQSkpICU+JSBrYWJsZSgpDQoNCiMnICMjICoqUmVzdWx0YWRvcyAqKg0KIycNCg0KIycgDQojJyAjIyAqKjEqKi4JKlF1YWlzIGJhY3TDqXJpYXMgZSBxdWFudGFzIGJhY3TDqXJpYXMgZXN0w6NvIHByZXNlbnRlcyBuYSBVVEkgZG8gaG9zcGl0YWwgaW5kZXBlbmRlbnRlIGRhIMOhcmVhIGUgZGEgc2l0dWHDp8OjbyBkZSBzdWpvIGUgbGltcG8/Kg0KIycgDQojKyBlY2hvPVQsIGZpZy5oZWlnaHQ9NywgZmlnLndpZHRoPTEyLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFDQojIA0KIyBiYWMgJT4lIHNlbGVjdChtaWNybykgJT4lIA0KIyAgIGdyb3VwX2J5KG1pY3JvKSAlPiUgY291bnQoKSAlPiUgDQojICAgdW5ncm91cCAlPiUgDQojICAgbXV0YXRlKHRvdGFsID0gc3VtKG4pLCAgcHJvcCA9IHBhc3RlMChyb3VuZChuL3RvdGFsKjEwMCwyKSwiJSIpKSAlPiUgDQojICAgYXJyYW5nZShkZXNjKG4pKSAlPiUga2FibGUoKQ0KDQpiYWMgICU+JSBzZWxlY3QobmFETkEsaWQsbG9jYWwsc3VwZXIsbWljcm8sbW9tZW50byxncmFtLGRpbHVpY2FvLG5hRE5BKSAlPiUgZGlzdGluY3RfYWxsKCkgJT4lDQogIGdyb3VwX2J5KG1pY3JvKSAlPiUgY291bnQoKSAlPiUgDQogIHVuZ3JvdXAgJT4lIA0KICBtdXRhdGUodG90YWwgPSBzdW0obiksICBwcm9wID0gcGFzdGUwKHJvdW5kKG4vdG90YWwqMTAwLDIpLCIlIikpICU+JSANCiAgYXJyYW5nZSgoZGVzYyhuKSkpICU+JSBkYXRhdGFibGUoDQogICAgLiwNCiAgICByb3duYW1lcyA9IEZBTFNFLA0KICAgIGZpbHRlciA9ICJ0b3AiLA0KICAgIGV4dGVuc2lvbnMgPSBjKCdCdXR0b25zJywgJ1Njcm9sbGVyJyksDQogICAgb3B0aW9ucyA9IGxpc3QoDQogICAgICBkb20gPSAnQmxmcnRpcCcsDQogICAgICBidXR0b25zID0gYygnY3N2JywgJ2V4Y2VsJyksDQogICAgICBkZWZlclJlbmRlciA9IFQsDQogICAgICAjc2Nyb2xsWSA9ICc2MDBweCcsDQogICAgICBzY3JvbGxlciA9IFRSVUUpKQ0KDQojIGJhY3ogPC0gYmFjICU+JSBzZWxlY3QobWljcm8pICU+JSANCiMgICBncm91cF9ieShtaWNybykgJT4lIGNvdW50KCkgJT4lIA0KIyAgIHVuZ3JvdXAgJT4lIA0KIyAgIG11dGF0ZSh0b3RhbCA9IHN1bShuKSwgIHByb3AgPSBwYXN0ZTAocm91bmQobi90b3RhbCoxMDAsMSksIiUiKSkgJT4lIA0KIyAgIGFycmFuZ2UoZGVzYyhuKSkNCg0KYmFjeiA8LSBiYWMgICU+JSBzZWxlY3QobmFETkEsaWQsbG9jYWwsc3VwZXIsbWljcm8sbW9tZW50byxncmFtLGRpbHVpY2FvLG5hRE5BKSAlPiUgZGlzdGluY3RfYWxsKCkgJT4lDQogIGdyb3VwX2J5KG1pY3JvKSAlPiUgY291bnQoKSAlPiUgDQogIHVuZ3JvdXAgJT4lIA0KICBtdXRhdGUodG90YWwgPSBzdW0obiksICBwcm9wID0gcGFzdGUwKHJvdW5kKG4vdG90YWwqMTAwLDEpLCIlIikpICU+JQ0KICBhcnJhbmdlKGRlc2MobikpDQoNCg0KICBnZ3Bsb3QoYmFjeikgKw0KICBhZXMoeD1yZW9yZGVyKG1pY3JvLCtuKSx5PW4sIGZpbGw9bWljcm8sIGxhYmVsPXBhc3RlMChuLCIgKCIscm91bmQobi90b3RhbCoxMDAsMiksIiUpIikpICsgDQogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBwb3NpdGlvbiA9ICJkb2RnZSIpICsNCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gY29yKSArDQogIHRoZW1lX3B1YnIoKSArDQogIHRoZW1lKGxlZ2VuZC5rZXkgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwNCiAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoZmFjZSA9ICJpdGFsaWMiKSwNCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSAwLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoanVzdCA9IDAuNSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZT05LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvdXIgPSAiYmxhY2siKSkgKw0KICBsYWJzKGNhcHRpb24gPSBwYXN0ZTAoIlRvdGFsID0gIiwgYmFjeiR0b3RhbFsxXSkgKSArDQogIGdlb21fdGV4dCh2anVzdD0wLjUsaGp1c3Q9LTAuMDEsIHNpemU9MykgKyANCiAgeGxhYigiIikgKyB5bGFiKCJGcmVxdcOqbmNpYSIpICsgY29vcmRfZmxpcCgpICMrIGZhY2V0X3dyYXAofmdyYW0qbW9tZW50bywgbnJvdyA9IDIpDQoNCiMnICMjICoqMioqLgkqUXVhbCBhIGZyZXF1w6puY2lhIGRlIGJhY3TDqXJpYXMgR3JhbSBwb3NpdGl2YXMgZSBHcmFtIG5lZ2F0aXZhcyBuYSBVVEkgY29tcGFyYW5kbyBhIHNpdHVhw6fDo28gZGUgc3VqbyBlIGxpbXBvPyoNCiMnIA0KIysgZWNobz1ULCBmaWcuaGVpZ2h0PTEwLCBmaWcud2lkdGg9OSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRQ0KDQpiYWMgICU+JSBzZWxlY3QobW9tZW50byxncmFtLGlkKSAlPiUgZGlzdGluY3RfYWxsKCkgJT4lDQogICAgZ3JvdXBfYnkobW9tZW50byxncmFtKSAlPiUgY291bnQoKSAlPiUgDQogICAgdW5ncm91cCAlPiUgDQogICAgbXV0YXRlKHRvdGFsID0gc3VtKG4pLCAgcHJvcCA9IHBhc3RlMChyb3VuZChuL3RvdGFsKjEwMCwyKSwiJSIpKSAlPiUNCiAgICBhcnJhbmdlKGRlc2MobikpICU+JSBrYWJsZSgpDQoNCmJhYyAgJT4lIHNlbGVjdChtb21lbnRvLGdyYW0saWQpICU+JSBkaXN0aW5jdF9hbGwoKSAlPiUNCiAgZ3JvdXBfYnkobW9tZW50byxncmFtKSAlPiUgY291bnQoKSAlPiUgDQogIHVuZ3JvdXAgJT4lIA0KICBtdXRhdGUodG90YWwgPSBzdW0obiksICBwcm9wID0gcGFzdGUwKHJvdW5kKG4vdG90YWwqMTAwLDIpLCIlIikpICU+JQ0KICBhcnJhbmdlKGRlc2MoZ3JhbSxtb21lbnRvKSkgJT4lDQogIGdncGxvdCgpICsNCiAgZ2d0aXRsZSgiR3JhbSBwb3NpdGl2YSIpICsNCiAgYWVzKHg9cmVvcmRlcihncmFtLC1uKSx5PW4sIGZpbGw9Z3JhbSwgbGFiZWw9cGFzdGUwKG4sIiBcbiAiLHJvdW5kKG4vdG90YWwqMTAwLDIpLCIlIikpICsgDQogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBwb3NpdGlvbiA9ICJkb2RnZSIpICsNCiAgdGhlbWVfcHVicigpICsNCiAgdGhlbWUobGVnZW5kLmtleSA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLA0KICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoanVzdCA9IDEsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG91ciA9ICJibGFjayIpKSArDQogIGxhYnMoY2FwdGlvbiA9IHBhc3RlMCgiVG90YWwgPSAiLCBiYWN6JHRvdGFsWzFdKSApICsNCiAgZ2VvbV90ZXh0KHZqdXN0PS0wLjIsIHNpemU9MykgKyANCiAgeGxhYigiIikgKyB5bGFiKCJGcmVxdcOqbmNpYSIpICsgZmFjZXRfZ3JpZCh+bW9tZW50bykNCg0KYmFjICU+JSBmaWx0ZXIoZ3JhbT09IkdyYW0gcG9zaXRpdmEiKSAlPiUgDQogIHNlbGVjdChtb21lbnRvLGdyYW0saWQpICU+JSBkaXN0aW5jdF9hbGwoKSAlPiUNCiAgZ3JvdXBfYnkobW9tZW50byxncmFtKSAlPiUgY291bnQoKSAlPiUgDQogIHVuZ3JvdXAgJT4lIA0KICBtdXRhdGUodG90YWwgPSBzdW0obiksICBwcm9wID0gcGFzdGUwKHJvdW5kKG4vdG90YWwqMTAwLDIpLCIlIikpICU+JQ0KICBhcnJhbmdlKGRlc2MobikpICU+JSBrYWJsZSgpDQoNCmJhY3ogPC0gYmFjICU+JSBmaWx0ZXIoZ3JhbT09IkdyYW0gcG9zaXRpdmEiKSAlPiUgDQogIHNlbGVjdChtb21lbnRvLGdyYW0saWQsbWljcm8pICU+JSBkaXN0aW5jdF9hbGwoKSAlPiUNCiAgZ3JvdXBfYnkobW9tZW50byxncmFtLG1pY3JvKSAlPiUgY291bnQoKSAlPiUgDQogIHVuZ3JvdXAgJT4lIA0KICBtdXRhdGUodG90YWwgPSBzdW0obiksICBwcm9wID0gcGFzdGUwKHJvdW5kKG4vdG90YWwqMTAwLDIpLCIlIikpICU+JQ0KICBhcnJhbmdlKGRlc2MobikpDQoNCmdncGxvdChiYWN6KSArDQogIGdndGl0bGUoIkdyYW0gcG9zaXRpdmEiKSArDQogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGNvcikgKw0KICBhZXMoeD1yZW9yZGVyKG1pY3JvLC1uKSx5PW4sIGZpbGw9bWljcm8sIGxhYmVsPXBhc3RlMChuLCIgXG4gIixyb3VuZChuL3RvdGFsKjEwMCwyKSwiJSIpKSArIA0KICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgcG9zaXRpb24gPSAiZG9kZ2UiKSArDQogIHRoZW1lX3B1YnIoKSArDQogIHRoZW1lKGxlZ2VuZC5rZXkgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwNCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGp1c3QgPSAxLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvdXIgPSAiYmxhY2siKSkgKw0KICBsYWJzKGNhcHRpb24gPSBwYXN0ZTAoIlRvdGFsID0gIiwgYmFjeiR0b3RhbFsxXSkgKSArDQogIGdlb21fdGV4dCh2anVzdD0tMC4yLCBzaXplPTMpICsgDQogIHhsYWIoIiIpICsgeWxhYigiRnJlcXXDqm5jaWEiKSArIGZhY2V0X3dyYXAofm1vbWVudG8sIG5yb3cgPSAyKSArIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGZhY2UgPSAiaXRhbGljIikpIA0KDQoNCg0KYmFjICU+JSBmaWx0ZXIoZ3JhbT09IkdyYW0gcG9zaXRpdmEiICYgbW9tZW50bz09IkFudGVzIGRhIGxpbXBlemEiKSAlPiUgDQogIHNlbGVjdChtb21lbnRvLGdyYW0saWQsbWljcm8pICU+JSBkaXN0aW5jdF9hbGwoKSAlPiUNCiAgZ3JvdXBfYnkobW9tZW50byxncmFtLG1pY3JvKSAlPiUgY291bnQoKSAlPiUgDQogIHVuZ3JvdXAgJT4lIA0KICBtdXRhdGUodG90YWwgPSBzdW0obiksICBwcm9wID0gcGFzdGUwKHJvdW5kKG4vdG90YWwqMTAwLDIpLCIlIikpICU+JQ0KICBhcnJhbmdlKGRlc2MobikpICU+JSBrYWJsZSgpDQoNCmJhYyAlPiUgZmlsdGVyKGdyYW09PSJHcmFtIHBvc2l0aXZhIiAmIG1vbWVudG89PSJBcMOzcyBhIGxpbXBlemEiKSAlPiUgDQogIHNlbGVjdChtb21lbnRvLGdyYW0saWQsbWljcm8pICU+JSBkaXN0aW5jdF9hbGwoKSAlPiUNCiAgZ3JvdXBfYnkobW9tZW50byxncmFtLG1pY3JvKSAlPiUgY291bnQoKSAlPiUgDQogIHVuZ3JvdXAgJT4lIA0KICBtdXRhdGUodG90YWwgPSBzdW0obiksICBwcm9wID0gcGFzdGUwKHJvdW5kKG4vdG90YWwqMTAwLDIpLCIlIikpICU+JQ0KICBhcnJhbmdlKGRlc2MobikpICU+JSBrYWJsZSgpDQoNCmEgPC0gYmFjICU+JSBmaWx0ZXIoZ3JhbT09IkdyYW0gcG9zaXRpdmEiICYgbW9tZW50bz09IkFudGVzIGRhIGxpbXBlemEiKSAlPiUgDQogIHNlbGVjdChtb21lbnRvLGdyYW0saWQsbWljcm8pICU+JSBkaXN0aW5jdF9hbGwoKSAlPiUNCiAgZ3JvdXBfYnkobW9tZW50byxncmFtLG1pY3JvKSAlPiUgY291bnQoKSAlPiUgDQogIHVuZ3JvdXAgJT4lIG11dGF0ZSh0b3RhbCA9IHN1bShuKSwgIHByb3AgPSBwYXN0ZTAocm91bmQobi90b3RhbCoxMDAsMiksIiUiKSkgJT4lDQogIGFycmFuZ2UoZGVzYyhuKSkgJT4lIA0KICBnZ3Bsb3QoKSArDQogICNnZ3RpdGxlKCJHcmFtIHBvc2l0aXZhIikgKw0KICBsYWJzKHN1YnRpdGxlID0gIkFudGVzIGRhIGxpbXBlemEiKSArDQogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGNvcikgKw0KICBhZXMoeD1yZW9yZGVyKG1pY3JvLC1uKSx5PW4sIGZpbGw9bWljcm8sIGxhYmVsPXBhc3RlMChuLCIgXG4gIixyb3VuZChuL3RvdGFsKjEwMCwyKSwiJSIpKSArIA0KICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgcG9zaXRpb24gPSAiZG9kZ2UiKSArDQogIHRoZW1lX3B1YnIoKSArDQogIHRoZW1lKGxlZ2VuZC5rZXkgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwNCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGp1c3QgPSAxLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvdXIgPSAiYmxhY2siKSkgKw0KICBnZW9tX3RleHQodmp1c3Q9LTAuMiwgc2l6ZT0zKSArIA0KICB4bGFiKCIiKSArIHlsYWIoIkZyZXF1w6puY2lhIikgKyB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChmYWNlID0gIml0YWxpYyIpKQ0KDQphDQoNCmIgPC0gYmFjICU+JSBmaWx0ZXIoZ3JhbT09IkdyYW0gcG9zaXRpdmEiICYgbW9tZW50bz09IkFww7NzIGEgbGltcGV6YSIpICU+JSANCiAgc2VsZWN0KG1vbWVudG8sZ3JhbSxpZCxtaWNybykgJT4lIGRpc3RpbmN0X2FsbCgpICU+JQ0KICBncm91cF9ieShtb21lbnRvLGdyYW0sbWljcm8pICU+JSBjb3VudCgpICU+JSANCiAgdW5ncm91cCAlPiUgbXV0YXRlKHRvdGFsID0gc3VtKG4pLCAgcHJvcCA9IHBhc3RlMChyb3VuZChuL3RvdGFsKjEwMCwyKSwiJSIpKSAlPiUNCiAgYXJyYW5nZShkZXNjKG4pKSAlPiUgDQogIGdncGxvdCgpICsNCiAjIGdndGl0bGUoIkdyYW0gcG9zaXRpdmEiKSArDQogIGxhYnMoc3VidGl0bGUgPSAiQXDDs3MgYSBsaW1wZXphIikgKw0KICBhZXMoeD1yZW9yZGVyKG1pY3JvLC1uKSx5PW4sIGZpbGw9bWljcm8sIGxhYmVsPXBhc3RlMChuLCIgXG4gIixyb3VuZChuL3RvdGFsKjEwMCwyKSwiJSIpKSArIA0KICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgcG9zaXRpb24gPSAiZG9kZ2UiKSArDQogIHRoZW1lX3B1YnIoKSArDQogIHRoZW1lKGxlZ2VuZC5rZXkgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwNCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGp1c3QgPSAxLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvdXIgPSAiYmxhY2siKSkgKw0KICBnZW9tX3RleHQodmp1c3Q9LTAuMiwgc2l6ZT0zKSArIA0KICB4bGFiKCIiKSArIHlsYWIoIkZyZXF1w6puY2lhIikgKyB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChmYWNlID0gIml0YWxpYyIpKQ0KDQoNCmINCg0KDQpiYWMgJT4lIGZpbHRlcihncmFtPT0iR3JhbSBuZWdhdGl2YSIpICU+JSANCiAgc2VsZWN0KG1vbWVudG8sZ3JhbSxpZCxtaWNybykgJT4lIGRpc3RpbmN0X2FsbCgpICU+JQ0KICBncm91cF9ieShtb21lbnRvLGdyYW0sbWljcm8pICU+JSBjb3VudCgpICU+JSANCiAgdW5ncm91cCAlPiUgDQogIG11dGF0ZSh0b3RhbCA9IHN1bShuKSwgIHByb3AgPSBwYXN0ZTAocm91bmQobi90b3RhbCoxMDAsMiksIiUiKSkgJT4lDQogIGFycmFuZ2UoZGVzYyhuKSkgJT4lIGthYmxlKCkNCg0KYmFjeiA8LSBiYWMgJT4lIGZpbHRlcihncmFtPT0iR3JhbSBuZWdhdGl2YSIpICU+JSANCiAgc2VsZWN0KG1vbWVudG8sZ3JhbSxpZCxtaWNybykgJT4lIGRpc3RpbmN0X2FsbCgpICU+JQ0KICBncm91cF9ieShtb21lbnRvLGdyYW0sbWljcm8pICU+JSBjb3VudCgpICU+JSANCiAgdW5ncm91cCAlPiUgDQogIG11dGF0ZSh0b3RhbCA9IHN1bShuKSwgIHByb3AgPSBwYXN0ZTAocm91bmQobi90b3RhbCoxMDAsMiksIiUiKSkgJT4lDQogIGFycmFuZ2UoZGVzYyhuKSkgDQoNCmdncGxvdChiYWN6KSArDQogIGdndGl0bGUoIkdyYW0gbmVnYXRpdmEiKSArDQogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGNvcikgKw0KICBhZXMoeD1yZW9yZGVyKG1pY3JvLC1uKSx5PW4sIGZpbGw9bWljcm8sIGxhYmVsPXBhc3RlMChuLCIgXG4gIixyb3VuZChuL3RvdGFsKjEwMCwyKSwiJSIpKSArIA0KICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgcG9zaXRpb24gPSAiZG9kZ2UiKSArDQogIHRoZW1lX3B1YnIoKSArDQogIHRoZW1lKGxlZ2VuZC5rZXkgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwNCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGp1c3QgPSAxLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvdXIgPSAiYmxhY2siKSkgKw0KICBnZW9tX3RleHQodmp1c3Q9LTAuMiwgc2l6ZT0zKSArIA0KICBsYWJzKGNhcHRpb24gPSBwYXN0ZTAoIlRvdGFsID0gIiwgYmFjeiR0b3RhbFsxXSkgKSArDQogIHhsYWIoIiIpICsgeWxhYigiRnJlcXXDqm5jaWEiKSArIGZhY2V0X3dyYXAofm1vbWVudG8sIG5yb3cgPSAyKSArIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGZhY2UgPSAiaXRhbGljIikpDQoNCg0KYSA8LSBiYWMgJT4lIGZpbHRlcihncmFtPT0iR3JhbSBuZWdhdGl2YSIgJiBtb21lbnRvPT0iQW50ZXMgZGEgbGltcGV6YSIpICU+JSANCiAgc2VsZWN0KG1vbWVudG8sZ3JhbSxpZCxtaWNybykgJT4lIGRpc3RpbmN0X2FsbCgpICU+JQ0KICBncm91cF9ieShtb21lbnRvLGdyYW0sbWljcm8pICU+JSBjb3VudCgpICU+JSANCiAgdW5ncm91cCAlPiUgbXV0YXRlKHRvdGFsID0gc3VtKG4pLCAgcHJvcCA9IHBhc3RlMChyb3VuZChuL3RvdGFsKjEwMCwyKSwiJSIpKSAlPiUNCiAgYXJyYW5nZShkZXNjKG4pKSAlPiUgDQogIGdncGxvdCgpICsNCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gY29yKSArDQogIGdndGl0bGUoIkdyYW0gbmVnYXRpdmEiKSArDQogIGxhYnMoc3VidGl0bGUgPSAiQW50ZXMgZGEgbGltcGV6YSIpICsNCiAgYWVzKHg9cmVvcmRlcihtaWNybywtbikseT1uLCBmaWxsPW1pY3JvLCBsYWJlbD1wYXN0ZTAobiwiIFxuICIscm91bmQobi90b3RhbCoxMDAsMiksIiUiKSkgKyANCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIHBvc2l0aW9uID0gImRvZGdlIikgKw0KICB0aGVtZV9wdWJyKCkgKw0KICB0aGVtZShsZWdlbmQua2V5ID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsDQogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhqdXN0ID0gMSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3VyID0gImJsYWNrIikpICsNCiAgZ2VvbV90ZXh0KHZqdXN0PS0wLjIsIHNpemU9MykgKyANCiAgeGxhYigiIikgKyB5bGFiKCJGcmVxdcOqbmNpYSIpICsgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoZmFjZSA9ICJpdGFsaWMiKSkNCg0KYQ0KDQpiIDwtIGJhYyAlPiUgZmlsdGVyKGdyYW09PSJHcmFtIG5lZ2F0aXZhIiAmIG1vbWVudG89PSJBcMOzcyBhIGxpbXBlemEiKSAlPiUgDQogIHNlbGVjdChtb21lbnRvLGdyYW0saWQsbWljcm8pICU+JSBkaXN0aW5jdF9hbGwoKSAlPiUNCiAgZ3JvdXBfYnkobW9tZW50byxncmFtLG1pY3JvKSAlPiUgY291bnQoKSAlPiUgDQogIHVuZ3JvdXAgJT4lIG11dGF0ZSh0b3RhbCA9IHN1bShuKSwgIHByb3AgPSBwYXN0ZTAocm91bmQobi90b3RhbCoxMDAsMiksIiUiKSkgJT4lDQogIGFycmFuZ2UoZGVzYyhuKSkgJT4lIA0KICBnZ3Bsb3QoKSArDQogIGdndGl0bGUoIkdyYW0gbmVnYXRpdmEiKSArDQogIGxhYnMoc3VidGl0bGUgPSAiQXDDs3MgYSBsaW1wZXphIikgKw0KICBhZXMoeD1yZW9yZGVyKG1pY3JvLC1uKSx5PW4sIGZpbGw9bWljcm8sIGxhYmVsPXBhc3RlMChuLCIgXG4gIixyb3VuZChuL3RvdGFsKjEwMCwyKSwiJSIpKSArIA0KICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgcG9zaXRpb24gPSAiZG9kZ2UiKSArDQogIHRoZW1lX3B1YnIoKSArDQogIHRoZW1lKGxlZ2VuZC5rZXkgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwNCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGp1c3QgPSAxLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvdXIgPSAiYmxhY2siKSkgKw0KICBnZW9tX3RleHQodmp1c3Q9LTAuMiwgc2l6ZT0zKSArIA0KICB4bGFiKCIiKSArIHlsYWIoIkZyZXF1w6puY2lhIikgKyB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChmYWNlID0gIml0YWxpYyIpKQ0KDQoNCmINCg0KDQoNCiMnICMjICoqMyoqLgkqUXVhbCBhIGZyZXF1w6puY2lhIGRlIGJhY3TDqXJpYXMgR3JhbSBwb3NpdGl2YXMgZSBHcmFtIG5lZ2F0aXZhcyBlbmNvbnRyYWRhIHBvciDDoXJlYSwgY29tcGFyYW5kbyBzdWpvIGUgbGltcG8/Kg0KIycgDQoNCg0KIycgIyMjICoqTEVJVE8gMDMqKiAgDQojKyBlY2hvPVQsIGZpZy5oZWlnaHQ9MTAsIGZpZy53aWR0aD05LCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFDQoNCmJhYyAlPiUgZmlsdGVyKGxvY2FsID09IkxlaXRvIDAzIikgJT4lDQogIHNlbGVjdChtb21lbnRvLGdyYW0saWQsbWljcm8pICU+JSBkaXN0aW5jdF9hbGwoKSAlPiUNCiAgZ3JvdXBfYnkobW9tZW50byxncmFtKSAlPiUgY291bnQoKSAlPiUgDQogIHVuZ3JvdXAgJT4lIA0KICBtdXRhdGUodG90YWwgPSBzdW0obiksICBwcm9wID0gcGFzdGUwKHJvdW5kKG4vdG90YWwqMTAwLDIpLCIlIikpICU+JQ0KICBhcnJhbmdlKGRlc2MoZ3JhbSxtb21lbnRvKSkgJT4lIGthYmxlKCkNCg0KYmFjeiA8LSBiYWMgJT4lIGZpbHRlcihsb2NhbCA9PSJMZWl0byAwMyIpICU+JQ0KICBzZWxlY3QobW9tZW50byxncmFtLGlkLG1pY3JvKSAlPiUgZGlzdGluY3RfYWxsKCkgJT4lDQogIGdyb3VwX2J5KG1vbWVudG8sZ3JhbSkgJT4lIGNvdW50KCkgJT4lIA0KICB1bmdyb3VwICU+JSANCiAgbXV0YXRlKHRvdGFsID0gc3VtKG4pLCAgcHJvcCA9IHBhc3RlMChyb3VuZChuL3RvdGFsKjEwMCwyKSwiJSIpKSAlPiUNCiAgYXJyYW5nZShkZXNjKGdyYW0sbW9tZW50bykpDQoNCg0KZ2dwbG90KGJhY3opICsNCiAgZ2d0aXRsZSgiTGVpdG8gMDMiKSArDQogIGFlcyh4PXJlb3JkZXIoZ3JhbSwtbikseT1uLCBmaWxsPWdyYW0sIGxhYmVsPXBhc3RlMChuLCIgXG4gIixyb3VuZChuL3RvdGFsKjEwMCwyKSwiJSIpKSArIA0KICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgcG9zaXRpb24gPSAiZG9kZ2UiKSArDQogIHRoZW1lX3B1YnIoKSArDQogIHRoZW1lKGxlZ2VuZC5rZXkgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwNCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGp1c3QgPSAxLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvdXIgPSAiYmxhY2siKSkgKw0KICBnZW9tX3RleHQodmp1c3Q9LTAuMiwgc2l6ZT0zKSArIA0KICBsYWJzKHN1YnRpdGxlID0gcGFzdGUwKCJUb3RhbCA9ICIsIGJhY3okdG90YWxbMV0pICkgKw0KICB4bGFiKCIiKSArIHlsYWIoIkZyZXF1w6puY2lhIikgKyBmYWNldF93cmFwKH5tb21lbnRvLCBuY29sID0gMikNCg0KIycgIyMjICoqTEVJVE8gMDQqKiAgDQojKyBlY2hvPVQsIGZpZy5oZWlnaHQ9MTAsIGZpZy53aWR0aD05LCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFDQoNCmJhYyAlPiUgZmlsdGVyKGxvY2FsID09IkxlaXRvIDA0IikgJT4lDQogIHNlbGVjdChtb21lbnRvLGdyYW0saWQsbWljcm8pICU+JSBkaXN0aW5jdF9hbGwoKSAlPiUNCiAgZ3JvdXBfYnkobW9tZW50byxncmFtKSAlPiUgY291bnQoKSAlPiUgDQogIHVuZ3JvdXAgJT4lIA0KICBtdXRhdGUodG90YWwgPSBzdW0obiksICBwcm9wID0gcGFzdGUwKHJvdW5kKG4vdG90YWwqMTAwLDIpLCIlIikpICU+JQ0KICBhcnJhbmdlKGRlc2MoZ3JhbSxtb21lbnRvKSkgJT4lIGthYmxlKCkNCg0KYmFjeiA8LSBiYWMgJT4lIGZpbHRlcihsb2NhbCA9PSJMZWl0byAwNCIpICU+JQ0KICBzZWxlY3QobW9tZW50byxncmFtLGlkLG1pY3JvKSAlPiUgZGlzdGluY3RfYWxsKCkgJT4lDQogIGdyb3VwX2J5KG1vbWVudG8sZ3JhbSkgJT4lIGNvdW50KCkgJT4lIA0KICB1bmdyb3VwICU+JSANCiAgbXV0YXRlKHRvdGFsID0gc3VtKG4pLCAgcHJvcCA9IHBhc3RlMChyb3VuZChuL3RvdGFsKjEwMCwyKSwiJSIpKSAlPiUNCiAgYXJyYW5nZShkZXNjKGdyYW0sbW9tZW50bykpDQpnZ3Bsb3QoYmFjeikgKw0KICBnZ3RpdGxlKCJMZWl0byAwNCIpICsNCiAgYWVzKHg9cmVvcmRlcihncmFtLC1uKSx5PW4sIGZpbGw9Z3JhbSwgbGFiZWw9cGFzdGUwKG4sIiBcbiAiLHJvdW5kKG4vdG90YWwqMTAwLDIpLCIlIikpICsgDQogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBwb3NpdGlvbiA9ICJkb2RnZSIpICsNCiAgdGhlbWVfcHVicigpICsNCiAgdGhlbWUobGVnZW5kLmtleSA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLA0KICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoanVzdCA9IDEsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG91ciA9ICJibGFjayIpKSArDQogIGdlb21fdGV4dCh2anVzdD0tMC4yLCBzaXplPTMpICsgDQogIGxhYnMoc3VidGl0bGUgPSBwYXN0ZTAoIlRvdGFsID0gIiwgYmFjeiR0b3RhbFsxXSkgKSArDQogIHhsYWIoIiIpICsgeWxhYigiRnJlcXXDqm5jaWEiKSArIGZhY2V0X3dyYXAofm1vbWVudG8sIG5jb2wgPSAyKQ0KDQojJyAjIyMgKipMRUlUTyAwNSoqICANCiMrIGVjaG89VCwgZmlnLmhlaWdodD0xMCwgZmlnLndpZHRoPTksIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UNCg0KYmFjICU+JSBmaWx0ZXIobG9jYWwgPT0iTGVpdG8gMDUiKSAlPiUNCiAgc2VsZWN0KG1vbWVudG8sZ3JhbSxpZCxtaWNybykgJT4lIGRpc3RpbmN0X2FsbCgpICU+JQ0KICBncm91cF9ieShtb21lbnRvLGdyYW0pICU+JSBjb3VudCgpICU+JSANCiAgdW5ncm91cCAlPiUgDQogIG11dGF0ZSh0b3RhbCA9IHN1bShuKSwgIHByb3AgPSBwYXN0ZTAocm91bmQobi90b3RhbCoxMDAsMiksIiUiKSkgJT4lDQogIGFycmFuZ2UoZGVzYyhncmFtLG1vbWVudG8pKSAlPiUga2FibGUoKQ0KDQpiYWN6IDwtIGJhYyAlPiUgZmlsdGVyKGxvY2FsID09IkxlaXRvIDA1IikgJT4lDQogIHNlbGVjdChtb21lbnRvLGdyYW0saWQsbWljcm8pICU+JSBkaXN0aW5jdF9hbGwoKSAlPiUNCiAgZ3JvdXBfYnkobW9tZW50byxncmFtKSAlPiUgY291bnQoKSAlPiUgDQogIHVuZ3JvdXAgJT4lIA0KICBtdXRhdGUodG90YWwgPSBzdW0obiksICBwcm9wID0gcGFzdGUwKHJvdW5kKG4vdG90YWwqMTAwLDIpLCIlIikpICU+JQ0KICBhcnJhbmdlKGRlc2MoZ3JhbSxtb21lbnRvKSkNCmdncGxvdChiYWN6KSArDQogIGdndGl0bGUoIkxlaXRvIDA1IikgKw0KICBhZXMoeD1yZW9yZGVyKGdyYW0sLW4pLHk9biwgZmlsbD1ncmFtLCBsYWJlbD1wYXN0ZTAobiwiIFxuICIscm91bmQobi90b3RhbCoxMDAsMiksIiUiKSkgKyANCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIHBvc2l0aW9uID0gImRvZGdlIikgKw0KICB0aGVtZV9wdWJyKCkgKw0KICB0aGVtZShsZWdlbmQua2V5ID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsDQogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhqdXN0ID0gMSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3VyID0gImJsYWNrIikpICsNCiAgZ2VvbV90ZXh0KHZqdXN0PS0wLjIsIHNpemU9MykgKyANCiAgbGFicyhzdWJ0aXRsZSA9IHBhc3RlMCgiVG90YWwgPSAiLCBiYWN6JHRvdGFsWzFdKSApICsNCiAgeGxhYigiIikgKyB5bGFiKCJGcmVxdcOqbmNpYSIpICsgZmFjZXRfd3JhcCh+bW9tZW50bywgbmNvbCA9IDIpDQoNCiMnICMjIyAqKkxFSVRPIDA2KiogIA0KIysgZWNobz1ULCBmaWcuaGVpZ2h0PTEwLCBmaWcud2lkdGg9OSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRQ0KDQpiYWMgJT4lIGZpbHRlcihsb2NhbCA9PSJMZWl0byAwNiIpICU+JQ0KICBzZWxlY3QobW9tZW50byxncmFtLGlkLG1pY3JvKSAlPiUgZGlzdGluY3RfYWxsKCkgJT4lDQogIGdyb3VwX2J5KG1vbWVudG8sZ3JhbSkgJT4lIGNvdW50KCkgJT4lIA0KICB1bmdyb3VwICU+JSANCiAgbXV0YXRlKHRvdGFsID0gc3VtKG4pLCAgcHJvcCA9IHBhc3RlMChyb3VuZChuL3RvdGFsKjEwMCwyKSwiJSIpKSAlPiUNCiAgYXJyYW5nZShkZXNjKGdyYW0sbW9tZW50bykpICU+JSBrYWJsZSgpDQoNCmJhY3ogPC0gYmFjICU+JSBmaWx0ZXIobG9jYWwgPT0iTGVpdG8gMDYiKSAlPiUNCiAgc2VsZWN0KG1vbWVudG8sZ3JhbSxpZCxtaWNybykgJT4lIGRpc3RpbmN0X2FsbCgpICU+JQ0KICBncm91cF9ieShtb21lbnRvLGdyYW0pICU+JSBjb3VudCgpICU+JSANCiAgdW5ncm91cCAlPiUgDQogIG11dGF0ZSh0b3RhbCA9IHN1bShuKSwgIHByb3AgPSBwYXN0ZTAocm91bmQobi90b3RhbCoxMDAsMiksIiUiKSkgJT4lDQogIGFycmFuZ2UoZGVzYyhncmFtLG1vbWVudG8pKQ0KZ2dwbG90KGJhY3opICsNCiAgZ2d0aXRsZSgiTGVpdG8gMDYiKSArDQogIGFlcyh4PXJlb3JkZXIoZ3JhbSwtbikseT1uLCBmaWxsPWdyYW0sIGxhYmVsPXBhc3RlMChuLCIgXG4gIixyb3VuZChuL3RvdGFsKjEwMCwyKSwiJSIpKSArIA0KICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgcG9zaXRpb24gPSAiZG9kZ2UiKSArDQogIHRoZW1lX3B1YnIoKSArDQogIHRoZW1lKGxlZ2VuZC5rZXkgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwNCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGp1c3QgPSAxLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvdXIgPSAiYmxhY2siKSkgKw0KICBnZW9tX3RleHQodmp1c3Q9LTAuMiwgc2l6ZT0zKSArIA0KICBsYWJzKHN1YnRpdGxlID0gcGFzdGUwKCJUb3RhbCA9ICIsIGJhY3okdG90YWxbMV0pICkgKw0KICB4bGFiKCIiKSArIHlsYWIoIkZyZXF1w6puY2lhIikgKyBmYWNldF93cmFwKH5tb21lbnRvLCBuY29sID0gMikNCg0KIycgIyMjICoqTEVJVE8gMDgqKiAgDQojKyBlY2hvPVQsIGZpZy5oZWlnaHQ9MTAsIGZpZy53aWR0aD05LCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFDQoNCmJhYyAlPiUgZmlsdGVyKGxvY2FsID09IkxlaXRvIDA4IikgJT4lDQogIHNlbGVjdChtb21lbnRvLGdyYW0saWQsbWljcm8pICU+JSBkaXN0aW5jdF9hbGwoKSAlPiUNCiAgZ3JvdXBfYnkobW9tZW50byxncmFtKSAlPiUgY291bnQoKSAlPiUgDQogIHVuZ3JvdXAgJT4lIA0KICBtdXRhdGUodG90YWwgPSBzdW0obiksICBwcm9wID0gcGFzdGUwKHJvdW5kKG4vdG90YWwqMTAwLDIpLCIlIikpICU+JQ0KICBhcnJhbmdlKGRlc2MoZ3JhbSxtb21lbnRvKSkgJT4lIGthYmxlKCkNCg0KYmFjeiA8LSBiYWMgJT4lIGZpbHRlcihsb2NhbCA9PSJMZWl0byAwOCIpICU+JQ0KICBzZWxlY3QobW9tZW50byxncmFtLGlkLG1pY3JvKSAlPiUgZGlzdGluY3RfYWxsKCkgJT4lDQogIGdyb3VwX2J5KG1vbWVudG8sZ3JhbSkgJT4lIGNvdW50KCkgJT4lIA0KICB1bmdyb3VwICU+JSANCiAgbXV0YXRlKHRvdGFsID0gc3VtKG4pLCAgcHJvcCA9IHBhc3RlMChyb3VuZChuL3RvdGFsKjEwMCwyKSwiJSIpKSAlPiUNCiAgYXJyYW5nZShkZXNjKGdyYW0sbW9tZW50bykpDQpnZ3Bsb3QoYmFjeikgKw0KICBnZ3RpdGxlKCJMZWl0byAwOCIpICsNCiAgYWVzKHg9cmVvcmRlcihncmFtLC1uKSx5PW4sIGZpbGw9Z3JhbSwgbGFiZWw9cGFzdGUwKG4sIiBcbiAiLHJvdW5kKG4vdG90YWwqMTAwLDIpLCIlIikpICsgDQogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBwb3NpdGlvbiA9ICJkb2RnZSIpICsNCiAgdGhlbWVfcHVicigpICsNCiAgdGhlbWUobGVnZW5kLmtleSA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLA0KICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoanVzdCA9IDEsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG91ciA9ICJibGFjayIpKSArDQogIGdlb21fdGV4dCh2anVzdD0tMC4yLCBzaXplPTMpICsgDQogIGxhYnMoc3VidGl0bGUgPSBwYXN0ZTAoIlRvdGFsID0gIiwgYmFjeiR0b3RhbFsxXSkgKSArDQogIHhsYWIoIiIpICsgeWxhYigiRnJlcXXDqm5jaWEiKSArIGZhY2V0X3dyYXAofm1vbWVudG8sIG5jb2wgPSAyKQ0KDQoNCg0KDQojJyAjIyMgKipMRUlUTyAxMioqICANCiMrIGVjaG89VCwgZmlnLmhlaWdodD0xMCwgZmlnLndpZHRoPTksIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UNCg0KYmFjICU+JSBmaWx0ZXIobG9jYWwgPT0iTGVpdG8gMTIiKSAlPiUNCiAgc2VsZWN0KG1vbWVudG8sZ3JhbSxpZCxtaWNybykgJT4lIGRpc3RpbmN0X2FsbCgpICU+JQ0KICBncm91cF9ieShtb21lbnRvLGdyYW0pICU+JSBjb3VudCgpICU+JSANCiAgdW5ncm91cCAlPiUgDQogIG11dGF0ZSh0b3RhbCA9IHN1bShuKSwgIHByb3AgPSBwYXN0ZTAocm91bmQobi90b3RhbCoxMDAsMiksIiUiKSkgJT4lDQogIGFycmFuZ2UoZGVzYyhncmFtLG1vbWVudG8pKSAlPiUga2FibGUoKQ0KDQpiYWN6IDwtIGJhYyAlPiUgZmlsdGVyKGxvY2FsID09IkxlaXRvIDEyIikgJT4lDQogIHNlbGVjdChtb21lbnRvLGdyYW0saWQsbWljcm8pICU+JSBkaXN0aW5jdF9hbGwoKSAlPiUNCiAgZ3JvdXBfYnkobW9tZW50byxncmFtKSAlPiUgY291bnQoKSAlPiUgDQogIHVuZ3JvdXAgJT4lIA0KICBtdXRhdGUodG90YWwgPSBzdW0obiksICBwcm9wID0gcGFzdGUwKHJvdW5kKG4vdG90YWwqMTAwLDIpLCIlIikpICU+JQ0KICBhcnJhbmdlKGRlc2MoZ3JhbSxtb21lbnRvKSkNCmdncGxvdChiYWN6KSArDQogIGdndGl0bGUoIkxlaXRvIDEyIikgKw0KICBhZXMoeD1yZW9yZGVyKGdyYW0sLW4pLHk9biwgZmlsbD1ncmFtLCBsYWJlbD1wYXN0ZTAobiwiIFxuICIscm91bmQobi90b3RhbCoxMDAsMiksIiUiKSkgKyANCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIHBvc2l0aW9uID0gImRvZGdlIikgKw0KICB0aGVtZV9wdWJyKCkgKw0KICB0aGVtZShsZWdlbmQua2V5ID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsDQogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhqdXN0ID0gMSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3VyID0gImJsYWNrIikpICsNCiAgZ2VvbV90ZXh0KHZqdXN0PS0wLjIsIHNpemU9MykgKyANCiAgbGFicyhzdWJ0aXRsZSA9IHBhc3RlMCgiVG90YWwgPSAiLCBiYWN6JHRvdGFsWzFdKSApICsNCiAgeGxhYigiIikgKyB5bGFiKCJGcmVxdcOqbmNpYSIpICsgZmFjZXRfd3JhcCh+bW9tZW50bywgbmNvbCA9IDIpDQoNCg0KDQojJyAjIyMgKirDgXJlYSBhZG1pbmlzdHJhdGl2YSoqICANCiMrIGVjaG89VCwgZmlnLmhlaWdodD0xMCwgZmlnLndpZHRoPTksIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UNCg0KYmFjICU+JSBmaWx0ZXIobG9jYWwgPT0iw4FyZWEgYWRtaW5pc3RyYXRpdmEiKSAlPiUNCiAgc2VsZWN0KG1vbWVudG8sZ3JhbSxpZCxtaWNybykgJT4lIGRpc3RpbmN0X2FsbCgpICU+JQ0KICBncm91cF9ieShtb21lbnRvLGdyYW0pICU+JSBjb3VudCgpICU+JSANCiAgdW5ncm91cCAlPiUgDQogIG11dGF0ZSh0b3RhbCA9IHN1bShuKSwgIHByb3AgPSBwYXN0ZTAocm91bmQobi90b3RhbCoxMDAsMiksIiUiKSkgJT4lDQogIGFycmFuZ2UoZGVzYyhncmFtLG1vbWVudG8pKSAlPiUga2FibGUoKQ0KDQpiYWN6IDwtIGJhYyAlPiUgZmlsdGVyKGxvY2FsID09IsOBcmVhIGFkbWluaXN0cmF0aXZhIikgJT4lDQogIHNlbGVjdChtb21lbnRvLGdyYW0saWQsbWljcm8pICU+JSBkaXN0aW5jdF9hbGwoKSAlPiUNCiAgZ3JvdXBfYnkobW9tZW50byxncmFtKSAlPiUgY291bnQoKSAlPiUgDQogIHVuZ3JvdXAgJT4lIA0KICBtdXRhdGUodG90YWwgPSBzdW0obiksICBwcm9wID0gcGFzdGUwKHJvdW5kKG4vdG90YWwqMTAwLDIpLCIlIikpICU+JQ0KICBhcnJhbmdlKGRlc2MoZ3JhbSxtb21lbnRvKSkNCmdncGxvdChiYWN6KSArDQogIGdndGl0bGUoIsOBcmVhIGFkbWluaXN0cmF0aXZhIikgKw0KICBhZXMoeD1yZW9yZGVyKGdyYW0sLW4pLHk9biwgZmlsbD1ncmFtLCBsYWJlbD1wYXN0ZTAobiwiIFxuICIscm91bmQobi90b3RhbCoxMDAsMiksIiUiKSkgKyANCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIHBvc2l0aW9uID0gImRvZGdlIikgKw0KICB0aGVtZV9wdWJyKCkgKw0KICB0aGVtZShsZWdlbmQua2V5ID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsDQogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhqdXN0ID0gMSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3VyID0gImJsYWNrIikpICsNCiAgZ2VvbV90ZXh0KHZqdXN0PS0wLjIsIHNpemU9MykgKyANCiAgbGFicyhzdWJ0aXRsZSA9IHBhc3RlMCgiVG90YWwgPSAiLCBiYWN6JHRvdGFsWzFdKSApICsNCiAgeGxhYigiIikgKyB5bGFiKCJGcmVxdcOqbmNpYSIpICsgZmFjZXRfd3JhcCh+bW9tZW50bywgbmNvbCA9IDIpDQoNCg0KIycgIyMjICoqQmFuaGVpcm8gQ1RJKiogIA0KIysgZWNobz1ULCBmaWcuaGVpZ2h0PTEwLCBmaWcud2lkdGg9OSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRQ0KDQpiYWMgJT4lIGZpbHRlcihsb2NhbCA9PSJCYW5oZWlybyBDVEkiKSAlPiUNCiAgc2VsZWN0KG1vbWVudG8sZ3JhbSxpZCxtaWNybykgJT4lIGRpc3RpbmN0X2FsbCgpICU+JQ0KICBncm91cF9ieShtb21lbnRvLGdyYW0pICU+JSBjb3VudCgpICU+JSANCiAgdW5ncm91cCAlPiUgDQogIG11dGF0ZSh0b3RhbCA9IHN1bShuKSwgIHByb3AgPSBwYXN0ZTAocm91bmQobi90b3RhbCoxMDAsMiksIiUiKSkgJT4lDQogIGFycmFuZ2UoZGVzYyhncmFtLG1vbWVudG8pKSAlPiUga2FibGUoKQ0KDQpiYWN6IDwtIGJhYyAlPiUgZmlsdGVyKGxvY2FsID09IkJhbmhlaXJvIENUSSIpICU+JQ0KICBzZWxlY3QobW9tZW50byxncmFtLGlkLG1pY3JvKSAlPiUgZGlzdGluY3RfYWxsKCkgJT4lDQogIGdyb3VwX2J5KG1vbWVudG8sZ3JhbSkgJT4lIGNvdW50KCkgJT4lIA0KICB1bmdyb3VwICU+JSANCiAgbXV0YXRlKHRvdGFsID0gc3VtKG4pLCAgcHJvcCA9IHBhc3RlMChyb3VuZChuL3RvdGFsKjEwMCwyKSwiJSIpKSAlPiUNCiAgYXJyYW5nZShkZXNjKGdyYW0sbW9tZW50bykpDQpnZ3Bsb3QoYmFjeikgKw0KICBnZ3RpdGxlKCJCYW5oZWlybyBDVEkiKSArDQogIGFlcyh4PXJlb3JkZXIoZ3JhbSwtbikseT1uLCBmaWxsPWdyYW0sIGxhYmVsPXBhc3RlMChuLCIgXG4gIixyb3VuZChuL3RvdGFsKjEwMCwyKSwiJSIpKSArIA0KICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgcG9zaXRpb24gPSAiZG9kZ2UiKSArDQogIHRoZW1lX3B1YnIoKSArDQogIHRoZW1lKGxlZ2VuZC5rZXkgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwNCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGp1c3QgPSAxLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvdXIgPSAiYmxhY2siKSkgKw0KICBnZW9tX3RleHQodmp1c3Q9LTAuMiwgc2l6ZT0zKSArIA0KICBsYWJzKHN1YnRpdGxlID0gcGFzdGUwKCJUb3RhbCA9ICIsIGJhY3okdG90YWxbMV0pICkgKw0KICB4bGFiKCIiKSArIHlsYWIoIkZyZXF1w6puY2lhIikgKyBmYWNldF93cmFwKH5tb21lbnRvLCBuY29sID0gMikNCg0KDQoNCg0KIycgIyMjICoqQ29wYSBDVEkqKiAgDQojKyBlY2hvPVQsIGZpZy5oZWlnaHQ9MTAsIGZpZy53aWR0aD05LCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFDQoNCmJhYyAlPiUgZmlsdGVyKGxvY2FsID09IkNvcGEgQ1RJIikgJT4lDQogIHNlbGVjdChtb21lbnRvLGdyYW0saWQsbWljcm8pICU+JSBkaXN0aW5jdF9hbGwoKSAlPiUNCiAgZ3JvdXBfYnkobW9tZW50byxncmFtKSAlPiUgY291bnQoKSAlPiUgDQogIHVuZ3JvdXAgJT4lIA0KICBtdXRhdGUodG90YWwgPSBzdW0obiksICBwcm9wID0gcGFzdGUwKHJvdW5kKG4vdG90YWwqMTAwLDIpLCIlIikpICU+JQ0KICBhcnJhbmdlKGRlc2MoZ3JhbSxtb21lbnRvKSkgJT4lIGthYmxlKCkNCg0KYmFjeiA8LSBiYWMgJT4lIGZpbHRlcihsb2NhbCA9PSJDb3BhIENUSSIpICU+JQ0KICBzZWxlY3QobW9tZW50byxncmFtLGlkLG1pY3JvKSAlPiUgZGlzdGluY3RfYWxsKCkgJT4lDQogIGdyb3VwX2J5KG1vbWVudG8sZ3JhbSkgJT4lIGNvdW50KCkgJT4lIA0KICB1bmdyb3VwICU+JSANCiAgbXV0YXRlKHRvdGFsID0gc3VtKG4pLCAgcHJvcCA9IHBhc3RlMChyb3VuZChuL3RvdGFsKjEwMCwyKSwiJSIpKSAlPiUNCiAgYXJyYW5nZShkZXNjKGdyYW0sbW9tZW50bykpDQpnZ3Bsb3QoYmFjeikgKw0KICBnZ3RpdGxlKCJDb3BhIENUSSIpICsNCiAgYWVzKHg9cmVvcmRlcihncmFtLC1uKSx5PW4sIGZpbGw9Z3JhbSwgbGFiZWw9cGFzdGUwKG4sIiBcbiAiLHJvdW5kKG4vdG90YWwqMTAwLDIpLCIlIikpICsgDQogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBwb3NpdGlvbiA9ICJkb2RnZSIpICsNCiAgdGhlbWVfcHVicigpICsNCiAgdGhlbWUobGVnZW5kLmtleSA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLA0KICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoanVzdCA9IDEsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG91ciA9ICJibGFjayIpKSArDQogIGdlb21fdGV4dCh2anVzdD0tMC4yLCBzaXplPTMpICsgDQogIGxhYnMoc3VidGl0bGUgPSBwYXN0ZTAoIlRvdGFsID0gIiwgYmFjeiR0b3RhbFsxXSkgKSArDQogIHhsYWIoIiIpICsgeWxhYigiRnJlcXXDqm5jaWEiKSArIGZhY2V0X3dyYXAofm1vbWVudG8sIG5jb2wgPSAyKQ0KDQoNCg0KDQojJyAjIyMgKipDVEkqKiAgDQojKyBlY2hvPVQsIGZpZy5oZWlnaHQ9MTAsIGZpZy53aWR0aD05LCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFDQoNCmJhYyAlPiUgZmlsdGVyKGxvY2FsID09IlBpYSBkbyBDVEkiKSAlPiUNCiAgc2VsZWN0KG1vbWVudG8sZ3JhbSxpZCxtaWNybykgJT4lIGRpc3RpbmN0X2FsbCgpICU+JQ0KICBncm91cF9ieShtb21lbnRvLGdyYW0pICU+JSBjb3VudCgpICU+JSANCiAgdW5ncm91cCAlPiUgDQogIG11dGF0ZSh0b3RhbCA9IHN1bShuKSwgIHByb3AgPSBwYXN0ZTAocm91bmQobi90b3RhbCoxMDAsMiksIiUiKSkgJT4lDQogIGFycmFuZ2UoZGVzYyhncmFtLG1vbWVudG8pKSAlPiUga2FibGUoKQ0KDQpiYWN6IDwtIGJhYyAlPiUgZmlsdGVyKGxvY2FsID09IlBpYSBkbyBDVEkiKSAlPiUNCiAgc2VsZWN0KG1vbWVudG8sZ3JhbSxpZCxtaWNybykgJT4lIGRpc3RpbmN0X2FsbCgpICU+JQ0KICBncm91cF9ieShtb21lbnRvLGdyYW0pICU+JSBjb3VudCgpICU+JSANCiAgdW5ncm91cCAlPiUgDQogIG11dGF0ZSh0b3RhbCA9IHN1bShuKSwgIHByb3AgPSBwYXN0ZTAocm91bmQobi90b3RhbCoxMDAsMiksIiUiKSkgJT4lDQogIGFycmFuZ2UoZGVzYyhncmFtLG1vbWVudG8pKQ0KZ2dwbG90KGJhY3opICsNCiAgZ2d0aXRsZSgiUGlhIGRvIENUSSIpICsNCiAgYWVzKHg9cmVvcmRlcihncmFtLC1uKSx5PW4sIGZpbGw9Z3JhbSwgbGFiZWw9cGFzdGUwKG4sIiBcbiAiLHJvdW5kKG4vdG90YWwqMTAwLDIpLCIlIikpICsgDQogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBwb3NpdGlvbiA9ICJkb2RnZSIpICsNCiAgdGhlbWVfcHVicigpICsNCiAgdGhlbWUobGVnZW5kLmtleSA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLA0KICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoanVzdCA9IDEsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG91ciA9ICJibGFjayIpKSArDQogIGdlb21fdGV4dCh2anVzdD0tMC4yLCBzaXplPTMpICsgDQogIGxhYnMoc3VidGl0bGUgPSBwYXN0ZTAoIlRvdGFsID0gIiwgYmFjeiR0b3RhbFsxXSkgKSArDQogIHhsYWIoIiIpICsgeWxhYigiRnJlcXXDqm5jaWEiKSArIGZhY2V0X3dyYXAofm1vbWVudG8sIG5jb2wgPSAyKQ0KDQoNCg0KIycgIyMjICoqRmFybcOhY2lhKiogIA0KIysgZWNobz1ULCBmaWcuaGVpZ2h0PTEwLCBmaWcud2lkdGg9OSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRQ0KDQpiYWMgJT4lIGZpbHRlcihsb2NhbCA9PSJGYXJtw6FjaWEiKSAlPiUNCiAgc2VsZWN0KG1vbWVudG8sZ3JhbSxpZCxtaWNybykgJT4lIGRpc3RpbmN0X2FsbCgpICU+JQ0KICBncm91cF9ieShtb21lbnRvLGdyYW0pICU+JSBjb3VudCgpICU+JSANCiAgdW5ncm91cCAlPiUgDQogIG11dGF0ZSh0b3RhbCA9IHN1bShuKSwgIHByb3AgPSBwYXN0ZTAocm91bmQobi90b3RhbCoxMDAsMiksIiUiKSkgJT4lDQogIGFycmFuZ2UoZGVzYyhncmFtLG1vbWVudG8pKSAlPiUga2FibGUoKQ0KDQpiYWN6IDwtIGJhYyAlPiUgZmlsdGVyKGxvY2FsID09IkZhcm3DoWNpYSIpICU+JQ0KICBzZWxlY3QobW9tZW50byxncmFtLGlkLG1pY3JvKSAlPiUgZGlzdGluY3RfYWxsKCkgJT4lDQogIGdyb3VwX2J5KG1vbWVudG8sZ3JhbSkgJT4lIGNvdW50KCkgJT4lIA0KICB1bmdyb3VwICU+JSANCiAgbXV0YXRlKHRvdGFsID0gc3VtKG4pLCAgcHJvcCA9IHBhc3RlMChyb3VuZChuL3RvdGFsKjEwMCwyKSwiJSIpKSAlPiUNCiAgYXJyYW5nZShkZXNjKGdyYW0sbW9tZW50bykpDQpnZ3Bsb3QoYmFjeikgKw0KICBnZ3RpdGxlKCJGYXJtw6FjaWEiKSArDQogIGFlcyh4PXJlb3JkZXIoZ3JhbSwtbikseT1uLCBmaWxsPWdyYW0sIGxhYmVsPXBhc3RlMChuLCIgXG4gIixyb3VuZChuL3RvdGFsKjEwMCwyKSwiJSIpKSArIA0KICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgcG9zaXRpb24gPSAiZG9kZ2UiKSArDQogIHRoZW1lX3B1YnIoKSArDQogIHRoZW1lKGxlZ2VuZC5rZXkgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwNCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGp1c3QgPSAxLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvdXIgPSAiYmxhY2siKSkgKw0KICBnZW9tX3RleHQodmp1c3Q9LTAuMiwgc2l6ZT0zKSArIA0KICBsYWJzKHN1YnRpdGxlID0gcGFzdGUwKCJUb3RhbCA9ICIsIGJhY3okdG90YWxbMV0pICkgKw0KICB4bGFiKCIiKSArIHlsYWIoIkZyZXF1w6puY2lhIikgKyBmYWNldF93cmFwKH5tb21lbnRvLCBuY29sID0gMikNCg0KDQoNCg0KDQoNCiMnICMjICoqNCoqLgkqUXVhbCBhIGZyZXF1w6puY2lhIGRlIGNhZGEgYmFjdMOpcmlhIGVuY29udHJhZG8gcG9yIMOhcmVhLCBjb21wYXJhbmRvIHN1am8gZSBsaW1wbz8qDQoNCg0KIycgIyMjICoqTEVJVE8gMDMqKiAgDQojKyBlY2hvPVQsIGZpZy5oZWlnaHQ9MTAsIGZpZy53aWR0aD05LCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFDQoNCmJhYyAlPiUgZmlsdGVyKGxvY2FsID09IkxlaXRvIDAzIikgJT4lDQogIHNlbGVjdChncmFtLCBtb21lbnRvLG1pY3JvLGlkKSAlPiUgZGlzdGluY3RfYWxsKCkgJT4lDQogIGdyb3VwX2J5KGdyYW0sIG1vbWVudG8sbWljcm8pICU+JSBjb3VudCgpICU+JSANCiAgdW5ncm91cCAlPiUgDQogIG11dGF0ZSh0b3RhbCA9IHN1bShuKSwgIHByb3AgPSBwYXN0ZTAocm91bmQobi90b3RhbCoxMDAsMiksIiUiKSkgJT4lDQogIGFycmFuZ2UoZGVzYyhncmFtLG1vbWVudG8pKSAlPiUga2FibGUoKQ0KDQpiYWN6IDwtIGJhYyAlPiUgZmlsdGVyKGxvY2FsID09IkxlaXRvIDAzIikgJT4lDQogIHNlbGVjdChncmFtLCBtb21lbnRvLG1pY3JvLGlkKSAlPiUgZGlzdGluY3RfYWxsKCkgJT4lDQogIGdyb3VwX2J5KGdyYW0sIG1vbWVudG8sbWljcm8pICU+JSBjb3VudCgpICU+JQ0KICB1bmdyb3VwICU+JSANCiAgbXV0YXRlKHRvdGFsID0gc3VtKG4pLCAgcHJvcCA9IHBhc3RlMChyb3VuZChuL3RvdGFsKjEwMCwyKSwiJSIpKSAlPiUNCiAgYXJyYW5nZShkZXNjKG1pY3JvLCBncmFtLG1vbWVudG8pKQ0KZ2dwbG90KGJhY3opICsNCiAgZ2d0aXRsZSgiTGVpdG8gMDMiKSArDQogIGFlcyh4PXJlb3JkZXIobWljcm8sLW4pLHk9biwgZmlsbD1taWNybywgbGFiZWw9cGFzdGUwKG4sIiBcbiAiLHJvdW5kKG4vdG90YWwqMTAwLDIpLCIlIikpICsgDQogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBwb3NpdGlvbiA9ICJkb2RnZSIpICsNCiAgdGhlbWVfcHVicigpICsNCiAgdGhlbWUobGVnZW5kLmtleSA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLA0KICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoanVzdCA9IDEsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG91ciA9ICJibGFjayIpKSArDQogIGdlb21fdGV4dCh2anVzdD0tMC4yLCBzaXplPTMpICsgDQogIGxhYnMoc3VidGl0bGUgPSBwYXN0ZTAoIlRvdGFsID0gIiwgYmFjeiR0b3RhbFsxXSkgKSArDQogIHhsYWIoIiIpICsgeWxhYigiRnJlcXXDqm5jaWEiKSArIGZhY2V0X3dyYXAofm1vbWVudG8sIG5yb3cgPSAyKSArIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGZhY2UgPSAiaXRhbGljIikpDQoNCiMnICMjIyAqKkxFSVRPIDA0KiogIA0KIysgZWNobz1ULCBmaWcuaGVpZ2h0PTEwLCBmaWcud2lkdGg9OSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRQ0KDQpiYWMgJT4lIGZpbHRlcihsb2NhbCA9PSJMZWl0byAwNCIpICU+JQ0KICBzZWxlY3QoZ3JhbSwgbW9tZW50byxtaWNybyxpZCkgJT4lIGRpc3RpbmN0X2FsbCgpICU+JQ0KICBncm91cF9ieShncmFtLCBtb21lbnRvLG1pY3JvKSAlPiUgY291bnQoKSAlPiUgDQogIHVuZ3JvdXAgJT4lIA0KICBtdXRhdGUodG90YWwgPSBzdW0obiksICBwcm9wID0gcGFzdGUwKHJvdW5kKG4vdG90YWwqMTAwLDIpLCIlIikpICU+JQ0KICBhcnJhbmdlKGRlc2MoZ3JhbSxtb21lbnRvKSkgJT4lIGthYmxlKCkNCg0KYmFjeiA8LSBiYWMgJT4lIGZpbHRlcihsb2NhbCA9PSJMZWl0byAwNCIpICU+JQ0KICBzZWxlY3QoZ3JhbSwgbW9tZW50byxtaWNybyxpZCkgJT4lIGRpc3RpbmN0X2FsbCgpICU+JQ0KICBncm91cF9ieShncmFtLCBtb21lbnRvLG1pY3JvKSAlPiUgY291bnQoKSAlPiUgDQogIHVuZ3JvdXAgJT4lIA0KICBtdXRhdGUodG90YWwgPSBzdW0obiksICBwcm9wID0gcGFzdGUwKHJvdW5kKG4vdG90YWwqMTAwLDIpLCIlIikpICU+JQ0KICBhcnJhbmdlKGRlc2MobWljcm8sIGdyYW0sbW9tZW50bykpDQoNCmdncGxvdChiYWN6KSArDQogIGdndGl0bGUoIkxlaXRvIDA0IikgKw0KICBhZXMoeD1yZW9yZGVyKG1pY3JvLC1uKSx5PW4sIGZpbGw9bWljcm8sIGxhYmVsPXBhc3RlMChuLCIgXG4gIixyb3VuZChuL3RvdGFsKjEwMCwyKSwiJSIpKSArIA0KICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgcG9zaXRpb24gPSAiZG9kZ2UiKSArDQogIHRoZW1lX3B1YnIoKSArDQogIHRoZW1lKGxlZ2VuZC5rZXkgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwNCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGp1c3QgPSAxLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvdXIgPSAiYmxhY2siKSkgKw0KICBnZW9tX3RleHQodmp1c3Q9LTAuMiwgc2l6ZT0zKSArIA0KICBsYWJzKHN1YnRpdGxlID0gcGFzdGUwKCJUb3RhbCA9ICIsIGJhY3okdG90YWxbMV0pICkgKw0KICB4bGFiKCIiKSArIHlsYWIoIkZyZXF1w6puY2lhIikgKyBmYWNldF93cmFwKH5tb21lbnRvLCBucm93ID0gMikrIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGZhY2UgPSAiaXRhbGljIikpDQoNCiMnICMjIyAqKkxFSVRPIDA1KiogIA0KIysgZWNobz1ULCBmaWcuaGVpZ2h0PTEwLCBmaWcud2lkdGg9OSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRQ0KDQpiYWMgJT4lIGZpbHRlcihsb2NhbCA9PSJMZWl0byAwNSIpICU+JQ0KICBzZWxlY3QoZ3JhbSwgbW9tZW50byxtaWNybyxpZCkgJT4lIGRpc3RpbmN0X2FsbCgpICU+JQ0KICBncm91cF9ieShncmFtLCBtb21lbnRvLG1pY3JvKSAlPiUgY291bnQoKSAlPiUgDQogIHVuZ3JvdXAgJT4lIA0KICBtdXRhdGUodG90YWwgPSBzdW0obiksICBwcm9wID0gcGFzdGUwKHJvdW5kKG4vdG90YWwqMTAwLDIpLCIlIikpICU+JQ0KICBhcnJhbmdlKGRlc2MoZ3JhbSxtb21lbnRvKSkgJT4lIGthYmxlKCkNCg0KYmFjeiA8LSBiYWMgJT4lIGZpbHRlcihsb2NhbCA9PSJMZWl0byAwNSIpICU+JQ0KICBzZWxlY3QoZ3JhbSwgbW9tZW50byxtaWNybyxpZCkgJT4lIGRpc3RpbmN0X2FsbCgpICU+JQ0KICBncm91cF9ieShncmFtLCBtb21lbnRvLG1pY3JvKSAlPiUgY291bnQoKSAlPiUgDQogIHVuZ3JvdXAgJT4lIA0KICBtdXRhdGUodG90YWwgPSBzdW0obiksICBwcm9wID0gcGFzdGUwKHJvdW5kKG4vdG90YWwqMTAwLDIpLCIlIikpICU+JQ0KICBhcnJhbmdlKGRlc2MobWljcm8sIGdyYW0sbW9tZW50bykpDQpnZ3Bsb3QoYmFjeikgKw0KICBnZ3RpdGxlKCJMZWl0byAwNSIpICsNCiAgYWVzKHg9cmVvcmRlcihtaWNybywtbikseT1uLCBmaWxsPW1pY3JvLCBsYWJlbD1wYXN0ZTAobiwiIFxuICIscm91bmQobi90b3RhbCoxMDAsMiksIiUiKSkgKyANCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIHBvc2l0aW9uID0gImRvZGdlIikgKw0KICB0aGVtZV9wdWJyKCkgKw0KICB0aGVtZShsZWdlbmQua2V5ID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsDQogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhqdXN0ID0gMSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3VyID0gImJsYWNrIikpICsNCiAgZ2VvbV90ZXh0KHZqdXN0PS0wLjIsIHNpemU9MykgKyANCiAgbGFicyhzdWJ0aXRsZSA9IHBhc3RlMCgiVG90YWwgPSAiLCBiYWN6JHRvdGFsWzFdKSApICsNCiAgeGxhYigiIikgKyB5bGFiKCJGcmVxdcOqbmNpYSIpICsgZmFjZXRfd3JhcCh+bW9tZW50bywgbnJvdyA9IDIpICsgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoZmFjZSA9ICJpdGFsaWMiKSkNCg0KIycgIyMjICoqTEVJVE8gMDYqKiAgDQojKyBlY2hvPVQsIGZpZy5oZWlnaHQ9MTAsIGZpZy53aWR0aD05LCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFDQoNCmJhYyAlPiUgZmlsdGVyKGxvY2FsID09IkxlaXRvIDA2IikgJT4lDQogIHNlbGVjdChncmFtLCBtb21lbnRvLG1pY3JvLGlkKSAlPiUgZGlzdGluY3RfYWxsKCkgJT4lDQogIGdyb3VwX2J5KGdyYW0sIG1vbWVudG8sbWljcm8pICU+JSBjb3VudCgpICU+JSANCiAgdW5ncm91cCAlPiUgDQogIG11dGF0ZSh0b3RhbCA9IHN1bShuKSwgIHByb3AgPSBwYXN0ZTAocm91bmQobi90b3RhbCoxMDAsMiksIiUiKSkgJT4lDQogIGFycmFuZ2UoZGVzYyhncmFtLG1vbWVudG8pKSAlPiUga2FibGUoKQ0KDQpiYWN6IDwtIGJhYyAlPiUgZmlsdGVyKGxvY2FsID09IkxlaXRvIDA2IikgJT4lDQogIHNlbGVjdChncmFtLCBtb21lbnRvLG1pY3JvLGlkKSAlPiUgZGlzdGluY3RfYWxsKCkgJT4lDQogIGdyb3VwX2J5KGdyYW0sIG1vbWVudG8sbWljcm8pICU+JSBjb3VudCgpICU+JSANCiAgdW5ncm91cCAlPiUgDQogIG11dGF0ZSh0b3RhbCA9IHN1bShuKSwgIHByb3AgPSBwYXN0ZTAocm91bmQobi90b3RhbCoxMDAsMiksIiUiKSkgJT4lDQogIGFycmFuZ2UoZGVzYyhtaWNybywgZ3JhbSxtb21lbnRvKSkNCmdncGxvdChiYWN6KSArDQogIGdndGl0bGUoIkxlaXRvIDA2IikgKw0KICBhZXMoeD1yZW9yZGVyKG1pY3JvLC1uKSx5PW4sIGZpbGw9bWljcm8sIGxhYmVsPXBhc3RlMChuLCIgXG4gIixyb3VuZChuL3RvdGFsKjEwMCwyKSwiJSIpKSArIA0KICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgcG9zaXRpb24gPSAiZG9kZ2UiKSArDQogIHRoZW1lX3B1YnIoKSArDQogIHRoZW1lKGxlZ2VuZC5rZXkgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwNCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGp1c3QgPSAxLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvdXIgPSAiYmxhY2siKSkgKw0KICBnZW9tX3RleHQodmp1c3Q9LTAuMiwgc2l6ZT0zKSArIA0KICBsYWJzKHN1YnRpdGxlID0gcGFzdGUwKCJUb3RhbCA9ICIsIGJhY3okdG90YWxbMV0pICkgKw0KICB4bGFiKCIiKSArIHlsYWIoIkZyZXF1w6puY2lhIikgKyBmYWNldF93cmFwKH5tb21lbnRvLCBucm93ID0gMikrIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGZhY2UgPSAiaXRhbGljIikpDQoNCg0KDQojJyAjIyMgKipMRUlUTyAwOCoqICANCiMrIGVjaG89VCwgZmlnLmhlaWdodD0xMCwgZmlnLndpZHRoPTksIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UNCg0KYmFjICU+JSBmaWx0ZXIobG9jYWwgPT0iTGVpdG8gMDgiKSAlPiUNCiAgc2VsZWN0KGdyYW0sIG1vbWVudG8sbWljcm8saWQpICU+JSBkaXN0aW5jdF9hbGwoKSAlPiUNCiAgZ3JvdXBfYnkoZ3JhbSwgbW9tZW50byxtaWNybykgJT4lIGNvdW50KCkgJT4lIA0KICB1bmdyb3VwICU+JSANCiAgbXV0YXRlKHRvdGFsID0gc3VtKG4pLCAgcHJvcCA9IHBhc3RlMChyb3VuZChuL3RvdGFsKjEwMCwyKSwiJSIpKSAlPiUNCiAgYXJyYW5nZShkZXNjKGdyYW0sbW9tZW50bykpICU+JSBrYWJsZSgpDQoNCmJhY3ogPC0gYmFjICU+JSBmaWx0ZXIobG9jYWwgPT0iTGVpdG8gMDgiKSAlPiUNCiAgc2VsZWN0KGdyYW0sIG1vbWVudG8sbWljcm8saWQpICU+JSBkaXN0aW5jdF9hbGwoKSAlPiUNCiAgZ3JvdXBfYnkoZ3JhbSwgbW9tZW50byxtaWNybykgJT4lIGNvdW50KCkgJT4lIA0KICB1bmdyb3VwICU+JSANCiAgbXV0YXRlKHRvdGFsID0gc3VtKG4pLCAgcHJvcCA9IHBhc3RlMChyb3VuZChuL3RvdGFsKjEwMCwyKSwiJSIpKSAlPiUNCiAgYXJyYW5nZShkZXNjKG1pY3JvLCBncmFtLG1vbWVudG8pKQ0KZ2dwbG90KGJhY3opICsNCiAgZ2d0aXRsZSgiTGVpdG8gMDgiKSArDQogIGFlcyh4PXJlb3JkZXIobWljcm8sLW4pLHk9biwgZmlsbD1taWNybywgbGFiZWw9cGFzdGUwKG4sIiBcbiAiLHJvdW5kKG4vdG90YWwqMTAwLDIpLCIlIikpICsgDQogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBwb3NpdGlvbiA9ICJkb2RnZSIpICsNCiAgdGhlbWVfcHVicigpICsNCiAgdGhlbWUobGVnZW5kLmtleSA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLA0KICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoanVzdCA9IDEsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG91ciA9ICJibGFjayIpKSArDQogIGdlb21fdGV4dCh2anVzdD0tMC4yLCBzaXplPTMpICsgDQogIGxhYnMoc3VidGl0bGUgPSBwYXN0ZTAoIlRvdGFsID0gIiwgYmFjeiR0b3RhbFsxXSkgKSArDQogIHhsYWIoIiIpICsgeWxhYigiRnJlcXXDqm5jaWEiKSArIGZhY2V0X3dyYXAofm1vbWVudG8sIG5yb3cgPSAyKSArIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGZhY2UgPSAiaXRhbGljIikpDQoNCg0KIycgIyMjICoqTEVJVE8gMTIqKiAgDQojKyBlY2hvPVQsIGZpZy5oZWlnaHQ9MTAsIGZpZy53aWR0aD05LCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFDQoNCmJhYyAlPiUgZmlsdGVyKGxvY2FsID09IkxlaXRvIDEyIikgJT4lDQogIHNlbGVjdChncmFtLCBtb21lbnRvLG1pY3JvLGlkKSAlPiUgZGlzdGluY3RfYWxsKCkgJT4lDQogIGdyb3VwX2J5KGdyYW0sIG1vbWVudG8sbWljcm8pICU+JSBjb3VudCgpICU+JSANCiAgdW5ncm91cCAlPiUgDQogIG11dGF0ZSh0b3RhbCA9IHN1bShuKSwgIHByb3AgPSBwYXN0ZTAocm91bmQobi90b3RhbCoxMDAsMiksIiUiKSkgJT4lDQogIGFycmFuZ2UoZGVzYyhncmFtLG1vbWVudG8pKSAlPiUga2FibGUoKQ0KDQpiYWN6IDwtIGJhYyAlPiUgZmlsdGVyKGxvY2FsID09IkxlaXRvIDEyIikgJT4lDQogIHNlbGVjdChncmFtLCBtb21lbnRvLG1pY3JvLGlkKSAlPiUgZGlzdGluY3RfYWxsKCkgJT4lDQogIGdyb3VwX2J5KGdyYW0sIG1vbWVudG8sbWljcm8pICU+JSBjb3VudCgpICU+JSANCiAgdW5ncm91cCAlPiUgDQogIG11dGF0ZSh0b3RhbCA9IHN1bShuKSwgIHByb3AgPSBwYXN0ZTAocm91bmQobi90b3RhbCoxMDAsMiksIiUiKSkgJT4lDQogIGFycmFuZ2UoZGVzYyhtaWNybywgZ3JhbSxtb21lbnRvKSkNCmdncGxvdChiYWN6KSArDQogIGdndGl0bGUoIkxlaXRvIDEyIikgKw0KICBhZXMoeD1yZW9yZGVyKG1pY3JvLC1uKSx5PW4sIGZpbGw9bWljcm8sIGxhYmVsPXBhc3RlMChuLCIgXG4gIixyb3VuZChuL3RvdGFsKjEwMCwyKSwiJSIpKSArIA0KICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgcG9zaXRpb24gPSAiZG9kZ2UiKSArDQogIHRoZW1lX3B1YnIoKSArDQogIHRoZW1lKGxlZ2VuZC5rZXkgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwNCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGp1c3QgPSAxLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvdXIgPSAiYmxhY2siKSkgKw0KICBnZW9tX3RleHQodmp1c3Q9LTAuMiwgc2l6ZT0zKSArIA0KICBsYWJzKHN1YnRpdGxlID0gcGFzdGUwKCJUb3RhbCA9ICIsIGJhY3okdG90YWxbMV0pICkgKw0KICB4bGFiKCIiKSArIHlsYWIoIkZyZXF1w6puY2lhIikgKyBmYWNldF93cmFwKH5tb21lbnRvLCBucm93ID0gMikgKyB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChmYWNlID0gIml0YWxpYyIpKQ0KDQoNCg0KDQojJyAjIyMgKirDgXJlYSBhZG1pbmlzdHJhdGl2YSoqICANCiMrIGVjaG89VCwgZmlnLmhlaWdodD0xMCwgZmlnLndpZHRoPTksIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UNCg0KYmFjICU+JSBmaWx0ZXIobG9jYWwgPT0iw4FyZWEgYWRtaW5pc3RyYXRpdmEiKSAlPiUNCiAgc2VsZWN0KGdyYW0sIG1vbWVudG8sbWljcm8saWQpICU+JSBkaXN0aW5jdF9hbGwoKSAlPiUNCiAgZ3JvdXBfYnkoZ3JhbSwgbW9tZW50byxtaWNybykgJT4lIGNvdW50KCkgJT4lIA0KICB1bmdyb3VwICU+JSANCiAgbXV0YXRlKHRvdGFsID0gc3VtKG4pLCAgcHJvcCA9IHBhc3RlMChyb3VuZChuL3RvdGFsKjEwMCwyKSwiJSIpKSAlPiUNCiAgYXJyYW5nZShkZXNjKGdyYW0sbW9tZW50bykpICU+JSBrYWJsZSgpDQoNCmJhY3ogPC0gYmFjICU+JSBmaWx0ZXIobG9jYWwgPT0iw4FyZWEgYWRtaW5pc3RyYXRpdmEiKSAlPiUNCiAgc2VsZWN0KGdyYW0sIG1vbWVudG8sbWljcm8saWQpICU+JSBkaXN0aW5jdF9hbGwoKSAlPiUNCiAgZ3JvdXBfYnkoZ3JhbSwgbW9tZW50byxtaWNybykgJT4lIGNvdW50KCkgJT4lIA0KICB1bmdyb3VwICU+JSANCiAgbXV0YXRlKHRvdGFsID0gc3VtKG4pLCAgcHJvcCA9IHBhc3RlMChyb3VuZChuL3RvdGFsKjEwMCwyKSwiJSIpKSAlPiUNCiAgYXJyYW5nZShkZXNjKG1pY3JvLCBncmFtLG1vbWVudG8pKQ0KDQpnZ3Bsb3QoYmFjeikgKw0KICBnZ3RpdGxlKCLDgXJlYSBhZG1pbmlzdHJhdGl2YSIpICsNCiAgYWVzKHg9cmVvcmRlcihtaWNybywtbikseT1uLCBmaWxsPW1pY3JvLCBsYWJlbD1wYXN0ZTAobiwiIFxuICIscm91bmQobi90b3RhbCoxMDAsMiksIiUiKSkgKyANCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIHBvc2l0aW9uID0gImRvZGdlIikgKw0KICB0aGVtZV9wdWJyKCkgKw0KICB0aGVtZShsZWdlbmQua2V5ID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsDQogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhqdXN0ID0gMSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3VyID0gImJsYWNrIikpICsNCiAgZ2VvbV90ZXh0KHZqdXN0PS0wLjIsIHNpemU9MykgKyANCiAgbGFicyhzdWJ0aXRsZSA9IHBhc3RlMCgiVG90YWwgPSAiLCBiYWN6JHRvdGFsWzFdKSApICsNCiAgeGxhYigiIikgKyB5bGFiKCJGcmVxdcOqbmNpYSIpICsgZmFjZXRfd3JhcCh+bW9tZW50bywgbnJvdyA9IDIpICsgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoZmFjZSA9ICJpdGFsaWMiKSkNCg0KDQojJyAjIyMgKipCYW5oZWlybyBDVEkqKiAgDQojKyBlY2hvPVQsIGZpZy5oZWlnaHQ9MTAsIGZpZy53aWR0aD05LCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFDQoNCmJhYyAlPiUgZmlsdGVyKGxvY2FsID09IkJhbmhlaXJvIENUSSIpICU+JQ0KICBzZWxlY3QoZ3JhbSwgbW9tZW50byxtaWNybyxpZCkgJT4lIGRpc3RpbmN0X2FsbCgpICU+JQ0KICBncm91cF9ieShncmFtLCBtb21lbnRvLG1pY3JvKSAlPiUgY291bnQoKSAlPiUgDQogIHVuZ3JvdXAgJT4lIA0KICBtdXRhdGUodG90YWwgPSBzdW0obiksICBwcm9wID0gcGFzdGUwKHJvdW5kKG4vdG90YWwqMTAwLDIpLCIlIikpICU+JQ0KICBhcnJhbmdlKGRlc2MoZ3JhbSxtb21lbnRvKSkgJT4lIGthYmxlKCkNCg0KYmFjeiA8LSBiYWMgJT4lIGZpbHRlcihsb2NhbCA9PSJCYW5oZWlybyBDVEkiKSAlPiUNCiAgc2VsZWN0KGdyYW0sIG1vbWVudG8sbWljcm8saWQpICU+JSBkaXN0aW5jdF9hbGwoKSAlPiUNCiAgZ3JvdXBfYnkoZ3JhbSwgbW9tZW50byxtaWNybykgJT4lIGNvdW50KCkgJT4lIA0KICB1bmdyb3VwICU+JSANCiAgbXV0YXRlKHRvdGFsID0gc3VtKG4pLCAgcHJvcCA9IHBhc3RlMChyb3VuZChuL3RvdGFsKjEwMCwyKSwiJSIpKSAlPiUNCiAgYXJyYW5nZShkZXNjKG1pY3JvLCBncmFtLG1vbWVudG8pKQ0KDQpnZ3Bsb3QoYmFjeikgKw0KICBnZ3RpdGxlKCJCYW5oZWlybyBDVEkiKSArDQogIGFlcyh4PXJlb3JkZXIobWljcm8sLW4pLHk9biwgZmlsbD1taWNybywgbGFiZWw9cGFzdGUwKG4sIiBcbiAiLHJvdW5kKG4vdG90YWwqMTAwLDIpLCIlIikpICsgDQogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBwb3NpdGlvbiA9ICJkb2RnZSIpICsNCiAgdGhlbWVfcHVicigpICsNCiAgdGhlbWUobGVnZW5kLmtleSA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLA0KICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoanVzdCA9IDEsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG91ciA9ICJibGFjayIpKSArDQogIGdlb21fdGV4dCh2anVzdD0tMC4yLCBzaXplPTMpICsgDQogIGxhYnMoc3VidGl0bGUgPSBwYXN0ZTAoIlRvdGFsID0gIiwgYmFjeiR0b3RhbFsxXSkgKSArDQogIHhsYWIoIiIpICsgeWxhYigiRnJlcXXDqm5jaWEiKSArIGZhY2V0X3dyYXAofm1vbWVudG8sIG5yb3cgPSAyKSArIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGZhY2UgPSAiaXRhbGljIikpDQoNCg0KDQoNCiMnICMjIyAqKkNvcGEgQ1RJKiogIA0KIysgZWNobz1ULCBmaWcuaGVpZ2h0PTEwLCBmaWcud2lkdGg9OSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRQ0KDQpiYWMgJT4lIGZpbHRlcihsb2NhbCA9PSJDb3BhIENUSSIpICU+JQ0KICBzZWxlY3QoZ3JhbSwgbW9tZW50byxtaWNybyxpZCkgJT4lIGRpc3RpbmN0X2FsbCgpICU+JQ0KICBncm91cF9ieShncmFtLCBtb21lbnRvLG1pY3JvKSAlPiUgY291bnQoKSAlPiUgDQogIHVuZ3JvdXAgJT4lIA0KICBtdXRhdGUodG90YWwgPSBzdW0obiksICBwcm9wID0gcGFzdGUwKHJvdW5kKG4vdG90YWwqMTAwLDIpLCIlIikpICU+JQ0KICBhcnJhbmdlKGRlc2MoZ3JhbSxtb21lbnRvKSkgJT4lIGthYmxlKCkNCg0KYmFjeiA8LSBiYWMgJT4lIGZpbHRlcihsb2NhbCA9PSJDb3BhIENUSSIpICU+JQ0KICBzZWxlY3QoZ3JhbSwgbW9tZW50byxtaWNybyxpZCkgJT4lIGRpc3RpbmN0X2FsbCgpICU+JQ0KICBncm91cF9ieShncmFtLCBtb21lbnRvLG1pY3JvKSAlPiUgY291bnQoKSAlPiUgDQogIHVuZ3JvdXAgJT4lIA0KICBtdXRhdGUodG90YWwgPSBzdW0obiksICBwcm9wID0gcGFzdGUwKHJvdW5kKG4vdG90YWwqMTAwLDIpLCIlIikpICU+JQ0KICBhcnJhbmdlKGRlc2MobWljcm8sIGdyYW0sbW9tZW50bykpDQoNCmdncGxvdChiYWN6KSArDQogIGdndGl0bGUoIkNvcGEgQ1RJIikgKw0KICBhZXMoeD1yZW9yZGVyKG1pY3JvLC1uKSx5PW4sIGZpbGw9bWljcm8sIGxhYmVsPXBhc3RlMChuLCIgXG4gIixyb3VuZChuL3RvdGFsKjEwMCwyKSwiJSIpKSArIA0KICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgcG9zaXRpb24gPSAiZG9kZ2UiKSArDQogIHRoZW1lX3B1YnIoKSArDQogIHRoZW1lKGxlZ2VuZC5rZXkgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwNCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGp1c3QgPSAxLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvdXIgPSAiYmxhY2siKSkgKw0KICBnZW9tX3RleHQodmp1c3Q9LTAuMiwgc2l6ZT0zKSArIA0KICBsYWJzKHN1YnRpdGxlID0gcGFzdGUwKCJUb3RhbCA9ICIsIGJhY3okdG90YWxbMV0pICkgKw0KICB4bGFiKCIiKSArIHlsYWIoIkZyZXF1w6puY2lhIikgKyBmYWNldF93cmFwKH5tb21lbnRvLCBucm93ID0gMikgKyB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChmYWNlID0gIml0YWxpYyIpKQ0KDQoNCg0KDQojJyAjIyMgKipDVEkqKiAgDQojKyBlY2hvPVQsIGZpZy5oZWlnaHQ9MTAsIGZpZy53aWR0aD05LCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFDQoNCmJhYyAlPiUgZmlsdGVyKGxvY2FsID09IlBpYSBkbyBDVEkiKSAlPiUNCiAgc2VsZWN0KGdyYW0sIG1vbWVudG8sbWljcm8saWQpICU+JSBkaXN0aW5jdF9hbGwoKSAlPiUNCiAgZ3JvdXBfYnkoZ3JhbSwgbW9tZW50byxtaWNybykgJT4lIGNvdW50KCkgJT4lIA0KICB1bmdyb3VwICU+JSANCiAgbXV0YXRlKHRvdGFsID0gc3VtKG4pLCAgcHJvcCA9IHBhc3RlMChyb3VuZChuL3RvdGFsKjEwMCwyKSwiJSIpKSAlPiUNCiAgYXJyYW5nZShkZXNjKGdyYW0sbW9tZW50bykpICU+JSBrYWJsZSgpDQoNCmJhY3ogPC0gYmFjICU+JSBmaWx0ZXIobG9jYWwgPT0iUGlhIGRvIENUSSIpICU+JQ0KICBzZWxlY3QoZ3JhbSwgbW9tZW50byxtaWNybyxpZCkgJT4lIGRpc3RpbmN0X2FsbCgpICU+JQ0KICBncm91cF9ieShncmFtLCBtb21lbnRvLG1pY3JvKSAlPiUgY291bnQoKSAlPiUgDQogIHVuZ3JvdXAgJT4lIA0KICBtdXRhdGUodG90YWwgPSBzdW0obiksICBwcm9wID0gcGFzdGUwKHJvdW5kKG4vdG90YWwqMTAwLDIpLCIlIikpICU+JQ0KICBhcnJhbmdlKGRlc2MobWljcm8sIGdyYW0sbW9tZW50bykpDQpnZ3Bsb3QoYmFjeikgKw0KICBnZ3RpdGxlKCJQaWEgZG8gQ1RJIikgKw0KICBhZXMoeD1yZW9yZGVyKG1pY3JvLC1uKSx5PW4sIGZpbGw9bWljcm8sIGxhYmVsPXBhc3RlMChuLCIgXG4gIixyb3VuZChuL3RvdGFsKjEwMCwyKSwiJSIpKSArIA0KICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgcG9zaXRpb24gPSAiZG9kZ2UiKSArDQogIHRoZW1lX3B1YnIoKSArDQogIHRoZW1lKGxlZ2VuZC5rZXkgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwNCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGp1c3QgPSAxLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvdXIgPSAiYmxhY2siKSkgKw0KICBnZW9tX3RleHQodmp1c3Q9LTAuMiwgc2l6ZT0zKSArIA0KICBsYWJzKHN1YnRpdGxlID0gcGFzdGUwKCJUb3RhbCA9ICIsIGJhY3okdG90YWxbMV0pICkgKw0KICB4bGFiKCIiKSArIHlsYWIoIkZyZXF1w6puY2lhIikgKyBmYWNldF93cmFwKH5tb21lbnRvLCBucm93ID0gMikgKyB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChmYWNlID0gIml0YWxpYyIpKQ0KDQoNCg0KIycgIyMjICoqRmFybcOhY2lhKiogIA0KIysgZWNobz1ULCBmaWcuaGVpZ2h0PTEwLCBmaWcud2lkdGg9OSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRQ0KDQpiYWMgJT4lIGZpbHRlcihsb2NhbCA9PSJGYXJtw6FjaWEiKSAlPiUNCiAgc2VsZWN0KGdyYW0sIG1vbWVudG8sbWljcm8saWQpICU+JSBkaXN0aW5jdF9hbGwoKSAlPiUNCiAgZ3JvdXBfYnkoZ3JhbSwgbW9tZW50byxtaWNybykgJT4lIGNvdW50KCkgJT4lIA0KICB1bmdyb3VwICU+JSANCiAgbXV0YXRlKHRvdGFsID0gc3VtKG4pLCAgcHJvcCA9IHBhc3RlMChyb3VuZChuL3RvdGFsKjEwMCwyKSwiJSIpKSAlPiUNCiAgYXJyYW5nZShkZXNjKGdyYW0sbW9tZW50bykpICU+JSBrYWJsZSgpDQoNCmJhY3ogPC0gYmFjICU+JSBmaWx0ZXIobG9jYWwgPT0iRmFybcOhY2lhIikgJT4lDQogIHNlbGVjdChncmFtLCBtb21lbnRvLG1pY3JvLGlkKSAlPiUgZGlzdGluY3RfYWxsKCkgJT4lDQogIGdyb3VwX2J5KGdyYW0sIG1vbWVudG8sbWljcm8pICU+JSBjb3VudCgpICU+JSANCiAgdW5ncm91cCAlPiUgDQogIG11dGF0ZSh0b3RhbCA9IHN1bShuKSwgIHByb3AgPSBwYXN0ZTAocm91bmQobi90b3RhbCoxMDAsMiksIiUiKSkgJT4lDQogIGFycmFuZ2UoZGVzYyhtaWNybywgZ3JhbSxtb21lbnRvKSkNCmdncGxvdChiYWN6KSArDQogIGdndGl0bGUoIkZhcm3DoWNpYSIpICsNCiAgYWVzKHg9cmVvcmRlcihtaWNybywtbikseT1uLCBmaWxsPW1pY3JvLCBsYWJlbD1wYXN0ZTAobiwiIFxuICIscm91bmQobi90b3RhbCoxMDAsMiksIiUiKSkgKyANCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIHBvc2l0aW9uID0gImRvZGdlIikgKw0KICB0aGVtZV9wdWJyKCkgKw0KICB0aGVtZShsZWdlbmQua2V5ID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsDQogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhqdXN0ID0gMSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3VyID0gImJsYWNrIikpICsNCiAgZ2VvbV90ZXh0KHZqdXN0PS0wLjIsIHNpemU9MykgKyANCiAgbGFicyhzdWJ0aXRsZSA9IHBhc3RlMCgiVG90YWwgPSAiLCBiYWN6JHRvdGFsWzFdKSApICsNCiAgeGxhYigiIikgKyB5bGFiKCJGcmVxdcOqbmNpYSIpICsgZmFjZXRfd3JhcCh+bW9tZW50bywgbnJvdyA9IDIpICsgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoZmFjZSA9ICJpdGFsaWMiKSkNCg0KDQoNCiMnICMjCSoqNSoqLgkqUXVhbCBhIGZyZXF1w6puY2lhIGRlIGJhY3TDqXJpYXMgcmVzaXN0ZW50ZXMgcG9yIMOhcmVhLCBjb21wYXJhbmRvIHN1am8gZSBsaW1wbz8qDQojJyANCg0KIycgIyMjICoqTEVJVE8gMDMqKiAgDQojKyBlY2hvPVQsIGZpZy5oZWlnaHQ9MTAsIGZpZy53aWR0aD05LCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFDQoNCmJhYyAlPiUgZmlsdGVyKGxvY2FsID09IkxlaXRvIDAzIiwgaW50ZXI9PSJSIikgJT4lDQogIHNlbGVjdChncmFtLCBtb21lbnRvLG1pY3JvLGlkKSAlPiUgZGlzdGluY3RfYWxsKCkgJT4lDQogIGdyb3VwX2J5KGdyYW0sIG1vbWVudG8sbWljcm8pICU+JSBjb3VudCgpICU+JSANCiAgdW5ncm91cCAlPiUgDQogIG11dGF0ZSh0b3RhbCA9IHN1bShuKSwgIHByb3AgPSBwYXN0ZTAocm91bmQobi90b3RhbCoxMDAsMiksIiUiKSkgJT4lDQogIGFycmFuZ2UoZGVzYyhncmFtLG1vbWVudG8pKSAlPiUga2FibGUoKQ0KDQpiYWN6IDwtIGJhYyAlPiUgZmlsdGVyKGxvY2FsID09IkxlaXRvIDAzIiwgaW50ZXI9PSJSIikgJT4lDQogIHNlbGVjdChncmFtLCBtb21lbnRvLG1pY3JvLGlkKSAlPiUgZGlzdGluY3RfYWxsKCkgJT4lDQogIGdyb3VwX2J5KGdyYW0sIG1vbWVudG8sbWljcm8pICU+JSBjb3VudCgpICU+JSANCiAgdW5ncm91cCAlPiUgDQogIG11dGF0ZSh0b3RhbCA9IHN1bShuKSwgIHByb3AgPSBwYXN0ZTAocm91bmQobi90b3RhbCoxMDAsMiksIiUiKSkgJT4lDQogIGFycmFuZ2UoZGVzYyhtaWNybywgZ3JhbSxtb21lbnRvKSkNCg0KZ2dwbG90KGJhY3opICsNCiAgZ2d0aXRsZSgiTGVpdG8gMDMiKSArDQogIGFlcyh4PXJlb3JkZXIobWljcm8sLW4pLHk9biwgZmlsbD1taWNybywgbGFiZWw9cGFzdGUwKG4sIiBcbiAiLHJvdW5kKG4vdG90YWwqMTAwLDIpLCIlIikpICsgDQogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBwb3NpdGlvbiA9ICJkb2RnZSIpICsNCiAgdGhlbWVfcHVicigpICsNCiAgdGhlbWUobGVnZW5kLmtleSA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLA0KICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoanVzdCA9IDEsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG91ciA9ICJibGFjayIpKSArDQogIGdlb21fdGV4dCh2anVzdD0tMC4yLCBzaXplPTMpICsgDQogIGxhYnMoc3VidGl0bGUgPSBwYXN0ZTAoIlRvdGFsID0gIiwgYmFjeiR0b3RhbFsxXSkgKSArDQogIHhsYWIoIiIpICsgeWxhYigiRnJlcXXDqm5jaWEiKSArIGZhY2V0X3dyYXAofm1vbWVudG8sIG5yb3cgPSAyKSArIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGZhY2UgPSAiaXRhbGljIikpDQoNCiMnICMjIyAqKkxFSVRPIDA0KiogIA0KIysgZWNobz1ULCBmaWcuaGVpZ2h0PTEwLCBmaWcud2lkdGg9OSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRQ0KDQpiYWMgJT4lIGZpbHRlcihsb2NhbCA9PSJMZWl0byAwNCIsIGludGVyPT0iUiIpICU+JQ0KICBzZWxlY3QoZ3JhbSwgbW9tZW50byxtaWNybyxpZCkgJT4lIGRpc3RpbmN0X2FsbCgpICU+JQ0KICBncm91cF9ieShncmFtLCBtb21lbnRvLG1pY3JvKSAlPiUgY291bnQoKSAlPiUgDQogIHVuZ3JvdXAgJT4lIA0KICBtdXRhdGUodG90YWwgPSBzdW0obiksICBwcm9wID0gcGFzdGUwKHJvdW5kKG4vdG90YWwqMTAwLDIpLCIlIikpICU+JQ0KICBhcnJhbmdlKGRlc2MoZ3JhbSxtb21lbnRvKSkgJT4lIGthYmxlKCkNCg0KYmFjeiA8LSBiYWMgJT4lIGZpbHRlcihsb2NhbCA9PSJMZWl0byAwNCIsIGludGVyPT0iUiIpICU+JQ0KICBzZWxlY3QoZ3JhbSwgbW9tZW50byxtaWNybyxpZCkgJT4lIGRpc3RpbmN0X2FsbCgpICU+JQ0KICBncm91cF9ieShncmFtLCBtb21lbnRvLG1pY3JvKSAlPiUgY291bnQoKSAlPiUgDQogIHVuZ3JvdXAgJT4lIA0KICBtdXRhdGUodG90YWwgPSBzdW0obiksICBwcm9wID0gcGFzdGUwKHJvdW5kKG4vdG90YWwqMTAwLDIpLCIlIikpICU+JQ0KICBhcnJhbmdlKGRlc2MobWljcm8sIGdyYW0sbW9tZW50bykpDQpnZ3Bsb3QoYmFjeikgKw0KICBnZ3RpdGxlKCJMZWl0byAwNCIpICsNCiAgYWVzKHg9cmVvcmRlcihtaWNybywtbikseT1uLCBmaWxsPW1pY3JvLCBsYWJlbD1wYXN0ZTAobiwiIFxuICIscm91bmQobi90b3RhbCoxMDAsMiksIiUiKSkgKyANCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIHBvc2l0aW9uID0gImRvZGdlIikgKw0KICB0aGVtZV9wdWJyKCkgKw0KICB0aGVtZShsZWdlbmQua2V5ID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsDQogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhqdXN0ID0gMSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3VyID0gImJsYWNrIikpICsNCiAgZ2VvbV90ZXh0KHZqdXN0PS0wLjIsIHNpemU9MykgKyANCiAgbGFicyhzdWJ0aXRsZSA9IHBhc3RlMCgiVG90YWwgPSAiLCBiYWN6JHRvdGFsWzFdKSApICsNCiAgeGxhYigiIikgKyB5bGFiKCJGcmVxdcOqbmNpYSIpICsgZmFjZXRfd3JhcCh+bW9tZW50bywgbnJvdyA9IDIpICsgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoZmFjZSA9ICJpdGFsaWMiKSkNCg0KIycgIyMjICoqTEVJVE8gMDUqKiAgDQojKyBlY2hvPVQsIGZpZy5oZWlnaHQ9MTAsIGZpZy53aWR0aD05LCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFDQoNCmJhYyAlPiUgZmlsdGVyKGxvY2FsID09IkxlaXRvIDA1IiwgaW50ZXI9PSJSIikgJT4lDQogIHNlbGVjdChncmFtLCBtb21lbnRvLG1pY3JvLGlkKSAlPiUgZGlzdGluY3RfYWxsKCkgJT4lDQogIGdyb3VwX2J5KGdyYW0sIG1vbWVudG8sbWljcm8pICU+JSBjb3VudCgpICU+JSANCiAgdW5ncm91cCAlPiUgDQogIG11dGF0ZSh0b3RhbCA9IHN1bShuKSwgIHByb3AgPSBwYXN0ZTAocm91bmQobi90b3RhbCoxMDAsMiksIiUiKSkgJT4lDQogIGFycmFuZ2UoZGVzYyhncmFtLG1vbWVudG8pKSAlPiUga2FibGUoKQ0KDQpiYWN6IDwtIGJhYyAlPiUgZmlsdGVyKGxvY2FsID09IkxlaXRvIDA1IiwgaW50ZXI9PSJSIikgJT4lDQogIHNlbGVjdChncmFtLCBtb21lbnRvLG1pY3JvLGlkKSAlPiUgZGlzdGluY3RfYWxsKCkgJT4lDQogIGdyb3VwX2J5KGdyYW0sIG1vbWVudG8sbWljcm8pICU+JSBjb3VudCgpICU+JSANCiAgdW5ncm91cCAlPiUgDQogIG11dGF0ZSh0b3RhbCA9IHN1bShuKSwgIHByb3AgPSBwYXN0ZTAocm91bmQobi90b3RhbCoxMDAsMiksIiUiKSkgJT4lDQogIGFycmFuZ2UoZGVzYyhtaWNybywgZ3JhbSxtb21lbnRvKSkNCmdncGxvdChiYWN6KSArDQogIGdndGl0bGUoIkxlaXRvIDA1IikgKw0KICBhZXMoeD1yZW9yZGVyKG1pY3JvLC1uKSx5PW4sIGZpbGw9bWljcm8sIGxhYmVsPXBhc3RlMChuLCIgXG4gIixyb3VuZChuL3RvdGFsKjEwMCwyKSwiJSIpKSArIA0KICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgcG9zaXRpb24gPSAiZG9kZ2UiKSArDQogIHRoZW1lX3B1YnIoKSArDQogIHRoZW1lKGxlZ2VuZC5rZXkgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwNCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGp1c3QgPSAxLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvdXIgPSAiYmxhY2siKSkgKw0KICBnZW9tX3RleHQodmp1c3Q9LTAuMiwgc2l6ZT0zKSArIA0KICBsYWJzKHN1YnRpdGxlID0gcGFzdGUwKCJUb3RhbCA9ICIsIGJhY3okdG90YWxbMV0pICkgKw0KICB4bGFiKCIiKSArIHlsYWIoIkZyZXF1w6puY2lhIikgKyBmYWNldF93cmFwKH5tb21lbnRvLCBucm93ID0gMikgKyB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChmYWNlID0gIml0YWxpYyIpKQ0KDQojJyAjIyMgKipMRUlUTyAwNioqICANCiMrIGVjaG89VCwgZmlnLmhlaWdodD0xMCwgZmlnLndpZHRoPTksIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UNCg0KYmFjICU+JSBmaWx0ZXIobG9jYWwgPT0iTGVpdG8gMDYiLCBpbnRlcj09IlIiKSAlPiUNCiAgc2VsZWN0KGdyYW0sIG1vbWVudG8sbWljcm8saWQpICU+JSBkaXN0aW5jdF9hbGwoKSAlPiUNCiAgZ3JvdXBfYnkoZ3JhbSwgbW9tZW50byxtaWNybykgJT4lIGNvdW50KCkgJT4lIA0KICB1bmdyb3VwICU+JSANCiAgbXV0YXRlKHRvdGFsID0gc3VtKG4pLCAgcHJvcCA9IHBhc3RlMChyb3VuZChuL3RvdGFsKjEwMCwyKSwiJSIpKSAlPiUNCiAgYXJyYW5nZShkZXNjKGdyYW0sbW9tZW50bykpICU+JSBrYWJsZSgpDQoNCmJhY3ogPC0gYmFjICU+JSBmaWx0ZXIobG9jYWwgPT0iTGVpdG8gMDYiLCBpbnRlcj09IlIiKSAlPiUNCiAgc2VsZWN0KGdyYW0sIG1vbWVudG8sbWljcm8saWQpICU+JSBkaXN0aW5jdF9hbGwoKSAlPiUNCiAgZ3JvdXBfYnkoZ3JhbSwgbW9tZW50byxtaWNybykgJT4lIGNvdW50KCkgJT4lIA0KICB1bmdyb3VwICU+JSANCiAgbXV0YXRlKHRvdGFsID0gc3VtKG4pLCAgcHJvcCA9IHBhc3RlMChyb3VuZChuL3RvdGFsKjEwMCwyKSwiJSIpKSAlPiUNCiAgYXJyYW5nZShkZXNjKG1pY3JvLCBncmFtLG1vbWVudG8pKQ0KZ2dwbG90KGJhY3opICsNCiAgZ2d0aXRsZSgiTGVpdG8gMDYiKSArDQogIGFlcyh4PXJlb3JkZXIobWljcm8sLW4pLHk9biwgZmlsbD1taWNybywgbGFiZWw9cGFzdGUwKG4sIiBcbiAiLHJvdW5kKG4vdG90YWwqMTAwLDIpLCIlIikpICsgDQogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBwb3NpdGlvbiA9ICJkb2RnZSIpICsNCiAgdGhlbWVfcHVicigpICsNCiAgdGhlbWUobGVnZW5kLmtleSA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLA0KICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoanVzdCA9IDEsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG91ciA9ICJibGFjayIpKSArDQogIGdlb21fdGV4dCh2anVzdD0tMC4yLCBzaXplPTMpICsgDQogIGxhYnMoc3VidGl0bGUgPSBwYXN0ZTAoIlRvdGFsID0gIiwgYmFjeiR0b3RhbFsxXSkgKSArDQogIHhsYWIoIiIpICsgeWxhYigiRnJlcXXDqm5jaWEiKSArIGZhY2V0X3dyYXAofm1vbWVudG8sIG5yb3cgPSAyKSArIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGZhY2UgPSAiaXRhbGljIikpDQoNCg0KIycgIyMjICoqTEVJVE8gMDgqKiAgDQojKyBlY2hvPVQsIGZpZy5oZWlnaHQ9MTAsIGZpZy53aWR0aD05LCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFDQoNCmJhYyAlPiUgZmlsdGVyKGxvY2FsID09IkxlaXRvIDA4IiwgaW50ZXI9PSJSIikgJT4lDQogIHNlbGVjdChncmFtLCBtb21lbnRvLG1pY3JvLGlkKSAlPiUgZGlzdGluY3RfYWxsKCkgJT4lDQogIGdyb3VwX2J5KGdyYW0sIG1vbWVudG8sbWljcm8pICU+JSBjb3VudCgpICU+JSANCiAgdW5ncm91cCAlPiUgDQogIG11dGF0ZSh0b3RhbCA9IHN1bShuKSwgIHByb3AgPSBwYXN0ZTAocm91bmQobi90b3RhbCoxMDAsMiksIiUiKSkgJT4lDQogIGFycmFuZ2UoZGVzYyhncmFtLG1vbWVudG8pKSAlPiUga2FibGUoKQ0KDQpiYWN6IDwtIGJhYyAlPiUgZmlsdGVyKGxvY2FsID09IkxlaXRvIDA4IiwgaW50ZXI9PSJSIikgJT4lDQogIHNlbGVjdChncmFtLCBtb21lbnRvLG1pY3JvLGlkKSAlPiUgZGlzdGluY3RfYWxsKCkgJT4lDQogIGdyb3VwX2J5KGdyYW0sIG1vbWVudG8sbWljcm8pICU+JSBjb3VudCgpICU+JSANCiAgdW5ncm91cCAlPiUgDQogIG11dGF0ZSh0b3RhbCA9IHN1bShuKSwgIHByb3AgPSBwYXN0ZTAocm91bmQobi90b3RhbCoxMDAsMiksIiUiKSkgJT4lDQogIGFycmFuZ2UoZGVzYyhtaWNybywgZ3JhbSxtb21lbnRvKSkNCmdncGxvdChiYWN6KSArDQogIGdndGl0bGUoIkxlaXRvIDA4IikgKw0KICBhZXMoeD1yZW9yZGVyKG1pY3JvLC1uKSx5PW4sIGZpbGw9bWljcm8sIGxhYmVsPXBhc3RlMChuLCIgXG4gIixyb3VuZChuL3RvdGFsKjEwMCwyKSwiJSIpKSArIA0KICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgcG9zaXRpb24gPSAiZG9kZ2UiKSArDQogIHRoZW1lX3B1YnIoKSArDQogIHRoZW1lKGxlZ2VuZC5rZXkgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwNCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGp1c3QgPSAxLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvdXIgPSAiYmxhY2siKSkgKw0KICBnZW9tX3RleHQodmp1c3Q9LTAuMiwgc2l6ZT0zKSArIA0KICBsYWJzKHN1YnRpdGxlID0gcGFzdGUwKCJUb3RhbCA9ICIsIGJhY3okdG90YWxbMV0pICkgKw0KICB4bGFiKCIiKSArIHlsYWIoIkZyZXF1w6puY2lhIikgKyBmYWNldF93cmFwKH5tb21lbnRvLCBucm93ID0gMikgKyB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChmYWNlID0gIml0YWxpYyIpKQ0KDQoNCg0KDQojJyAjIyMgKipMRUlUTyAxMioqICANCiMrIGVjaG89VCwgZmlnLmhlaWdodD0xMCwgZmlnLndpZHRoPTksIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UNCg0KYmFjICU+JSBmaWx0ZXIobG9jYWwgPT0iTGVpdG8gMTIiLCBpbnRlcj09IlIiKSAlPiUNCiAgc2VsZWN0KGdyYW0sIG1vbWVudG8sbWljcm8saWQpICU+JSBkaXN0aW5jdF9hbGwoKSAlPiUNCiAgZ3JvdXBfYnkoZ3JhbSwgbW9tZW50byxtaWNybykgJT4lIGNvdW50KCkgJT4lIA0KICB1bmdyb3VwICU+JSANCiAgbXV0YXRlKHRvdGFsID0gc3VtKG4pLCAgcHJvcCA9IHBhc3RlMChyb3VuZChuL3RvdGFsKjEwMCwyKSwiJSIpKSAlPiUNCiAgYXJyYW5nZShkZXNjKGdyYW0sbW9tZW50bykpICU+JSBrYWJsZSgpDQoNCmJhY3ogPC0gYmFjICU+JSBmaWx0ZXIobG9jYWwgPT0iTGVpdG8gMTIiLCBpbnRlcj09IlIiKSAlPiUNCiAgc2VsZWN0KGdyYW0sIG1vbWVudG8sbWljcm8saWQpICU+JSBkaXN0aW5jdF9hbGwoKSAlPiUNCiAgZ3JvdXBfYnkoZ3JhbSwgbW9tZW50byxtaWNybykgJT4lIGNvdW50KCkgJT4lIA0KICB1bmdyb3VwICU+JSANCiAgbXV0YXRlKHRvdGFsID0gc3VtKG4pLCAgcHJvcCA9IHBhc3RlMChyb3VuZChuL3RvdGFsKjEwMCwyKSwiJSIpKSAlPiUNCiAgYXJyYW5nZShkZXNjKG1pY3JvLCBncmFtLG1vbWVudG8pKQ0KZ2dwbG90KGJhY3opICsNCiAgZ2d0aXRsZSgiTGVpdG8gMTIiKSArDQogIGFlcyh4PXJlb3JkZXIobWljcm8sLW4pLHk9biwgZmlsbD1taWNybywgbGFiZWw9cGFzdGUwKG4sIiBcbiAiLHJvdW5kKG4vdG90YWwqMTAwLDIpLCIlIikpICsgDQogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBwb3NpdGlvbiA9ICJkb2RnZSIpICsNCiAgdGhlbWVfcHVicigpICsNCiAgdGhlbWUobGVnZW5kLmtleSA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLA0KICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoanVzdCA9IDEsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG91ciA9ICJibGFjayIpKSArDQogIGdlb21fdGV4dCh2anVzdD0tMC4yLCBzaXplPTMpICsgDQogIGxhYnMoc3VidGl0bGUgPSBwYXN0ZTAoIlRvdGFsID0gIiwgYmFjeiR0b3RhbFsxXSkgKSArDQogIHhsYWIoIiIpICsgeWxhYigiRnJlcXXDqm5jaWEiKSArIGZhY2V0X3dyYXAofm1vbWVudG8sIG5yb3cgPSAyKQ0KDQoNCg0KIycgIyMjICoqw4FyZWEgYWRtaW5pc3RyYXRpdmEqKiAgDQojKyBlY2hvPVQsIGZpZy5oZWlnaHQ9MTAsIGZpZy53aWR0aD05LCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFDQoNCmJhYyAlPiUgZmlsdGVyKGxvY2FsID09IsOBcmVhIGFkbWluaXN0cmF0aXZhIiwgaW50ZXI9PSJSIikgJT4lDQogIHNlbGVjdChncmFtLCBtb21lbnRvLG1pY3JvLGlkKSAlPiUgZGlzdGluY3RfYWxsKCkgJT4lDQogIGdyb3VwX2J5KGdyYW0sIG1vbWVudG8sbWljcm8pICU+JSBjb3VudCgpICU+JSANCiAgdW5ncm91cCAlPiUgDQogIG11dGF0ZSh0b3RhbCA9IHN1bShuKSwgIHByb3AgPSBwYXN0ZTAocm91bmQobi90b3RhbCoxMDAsMiksIiUiKSkgJT4lDQogIGFycmFuZ2UoZGVzYyhncmFtLG1vbWVudG8pKSAlPiUga2FibGUoKQ0KDQpiYWN6IDwtIGJhYyAlPiUgZmlsdGVyKGxvY2FsID09IsOBcmVhIGFkbWluaXN0cmF0aXZhIiwgaW50ZXI9PSJSIikgJT4lDQogIHNlbGVjdChncmFtLCBtb21lbnRvLG1pY3JvLGlkKSAlPiUgZGlzdGluY3RfYWxsKCkgJT4lDQogIGdyb3VwX2J5KGdyYW0sIG1vbWVudG8sbWljcm8pICU+JSBjb3VudCgpICU+JSANCiAgdW5ncm91cCAlPiUgDQogIG11dGF0ZSh0b3RhbCA9IHN1bShuKSwgIHByb3AgPSBwYXN0ZTAocm91bmQobi90b3RhbCoxMDAsMiksIiUiKSkgJT4lDQogIGFycmFuZ2UoZGVzYyhtaWNybywgZ3JhbSxtb21lbnRvKSkNCmdncGxvdChiYWN6KSArDQogIGdndGl0bGUoIsOBcmVhIGFkbWluaXN0cmF0aXZhIikgKw0KICBhZXMoeD1yZW9yZGVyKG1pY3JvLC1uKSx5PW4sIGZpbGw9bWljcm8sIGxhYmVsPXBhc3RlMChuLCIgXG4gIixyb3VuZChuL3RvdGFsKjEwMCwyKSwiJSIpKSArIA0KICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgcG9zaXRpb24gPSAiZG9kZ2UiKSArDQogIHRoZW1lX3B1YnIoKSArDQogIHRoZW1lKGxlZ2VuZC5rZXkgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwNCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGp1c3QgPSAxLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvdXIgPSAiYmxhY2siKSkgKw0KICBnZW9tX3RleHQodmp1c3Q9LTAuMiwgc2l6ZT0zKSArIA0KICBsYWJzKHN1YnRpdGxlID0gcGFzdGUwKCJUb3RhbCA9ICIsIGJhY3okdG90YWxbMV0pICkgKw0KICB4bGFiKCIiKSArIHlsYWIoIkZyZXF1w6puY2lhIikgKyBmYWNldF93cmFwKH5tb21lbnRvLCBucm93ID0gMikgKyB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChmYWNlID0gIml0YWxpYyIpKQ0KDQoNCiMnICMjIyAqKkJhbmhlaXJvIENUSSoqICANCiMrIGVjaG89VCwgZmlnLmhlaWdodD0xMCwgZmlnLndpZHRoPTksIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UNCg0KYmFjICU+JSBmaWx0ZXIobG9jYWwgPT0iQmFuaGVpcm8gQ1RJIiwgaW50ZXI9PSJSIikgJT4lDQogIHNlbGVjdChncmFtLCBtb21lbnRvLG1pY3JvLGlkKSAlPiUgZGlzdGluY3RfYWxsKCkgJT4lDQogIGdyb3VwX2J5KGdyYW0sIG1vbWVudG8sbWljcm8pICU+JSBjb3VudCgpICU+JSANCiAgdW5ncm91cCAlPiUgDQogIG11dGF0ZSh0b3RhbCA9IHN1bShuKSwgIHByb3AgPSBwYXN0ZTAocm91bmQobi90b3RhbCoxMDAsMiksIiUiKSkgJT4lDQogIGFycmFuZ2UoZGVzYyhncmFtLG1vbWVudG8pKSAlPiUga2FibGUoKQ0KDQpiYWN6IDwtIGJhYyAlPiUgZmlsdGVyKGxvY2FsID09IkJhbmhlaXJvIENUSSIsIGludGVyPT0iUiIpICU+JQ0KICBzZWxlY3QoZ3JhbSwgbW9tZW50byxtaWNybyxpZCkgJT4lIGRpc3RpbmN0X2FsbCgpICU+JQ0KICBncm91cF9ieShncmFtLCBtb21lbnRvLG1pY3JvKSAlPiUgY291bnQoKSAlPiUgDQogIHVuZ3JvdXAgJT4lIA0KICBtdXRhdGUodG90YWwgPSBzdW0obiksICBwcm9wID0gcGFzdGUwKHJvdW5kKG4vdG90YWwqMTAwLDIpLCIlIikpICU+JQ0KICBhcnJhbmdlKGRlc2MobWljcm8sIGdyYW0sbW9tZW50bykpDQpnZ3Bsb3QoYmFjeikgKw0KICBnZ3RpdGxlKCJCYW5oZWlybyBDVEkiKSArDQogIGFlcyh4PXJlb3JkZXIobWljcm8sLW4pLHk9biwgZmlsbD1taWNybywgbGFiZWw9cGFzdGUwKG4sIiBcbiAiLHJvdW5kKG4vdG90YWwqMTAwLDIpLCIlIikpICsgDQogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBwb3NpdGlvbiA9ICJkb2RnZSIpICsNCiAgdGhlbWVfcHVicigpICsNCiAgdGhlbWUobGVnZW5kLmtleSA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLA0KICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoanVzdCA9IDEsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG91ciA9ICJibGFjayIpKSArDQogIGdlb21fdGV4dCh2anVzdD0tMC4yLCBzaXplPTMpICsgDQogIGxhYnMoc3VidGl0bGUgPSBwYXN0ZTAoIlRvdGFsID0gIiwgYmFjeiR0b3RhbFsxXSkgKSArDQogIHhsYWIoIiIpICsgeWxhYigiRnJlcXXDqm5jaWEiKSArIGZhY2V0X3dyYXAofm1vbWVudG8sIG5yb3cgPSAyKSsgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoZmFjZSA9ICJpdGFsaWMiKSkNCg0KDQoNCg0KIycgIyMjICoqQ29wYSBDVEkqKiAgDQojKyBlY2hvPVQsIGZpZy5oZWlnaHQ9MTAsIGZpZy53aWR0aD05LCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFDQoNCmJhYyAlPiUgZmlsdGVyKGxvY2FsID09IkNvcGEgQ1RJIiwgaW50ZXI9PSJSIikgJT4lDQogIHNlbGVjdChncmFtLCBtb21lbnRvLG1pY3JvLGlkKSAlPiUgZGlzdGluY3RfYWxsKCkgJT4lDQogIGdyb3VwX2J5KGdyYW0sIG1vbWVudG8sbWljcm8pICU+JSBjb3VudCgpICU+JSANCiAgdW5ncm91cCAlPiUgDQogIG11dGF0ZSh0b3RhbCA9IHN1bShuKSwgIHByb3AgPSBwYXN0ZTAocm91bmQobi90b3RhbCoxMDAsMiksIiUiKSkgJT4lDQogIGFycmFuZ2UoZGVzYyhncmFtLG1vbWVudG8pKSAlPiUga2FibGUoKQ0KDQpiYWN6IDwtIGJhYyAlPiUgZmlsdGVyKGxvY2FsID09IkNvcGEgQ1RJIiwgaW50ZXI9PSJSIikgJT4lDQogIHNlbGVjdChncmFtLCBtb21lbnRvLG1pY3JvLGlkKSAlPiUgZGlzdGluY3RfYWxsKCkgJT4lDQogIGdyb3VwX2J5KGdyYW0sIG1vbWVudG8sbWljcm8pICU+JSBjb3VudCgpICU+JSANCiAgdW5ncm91cCAlPiUgDQogIG11dGF0ZSh0b3RhbCA9IHN1bShuKSwgIHByb3AgPSBwYXN0ZTAocm91bmQobi90b3RhbCoxMDAsMiksIiUiKSkgJT4lDQogIGFycmFuZ2UoZGVzYyhtaWNybywgZ3JhbSxtb21lbnRvKSkNCmdncGxvdChiYWN6KSArDQogIGdndGl0bGUoIkNvcGEgQ1RJIikgKw0KICBhZXMoeD1yZW9yZGVyKG1pY3JvLC1uKSx5PW4sIGZpbGw9bWljcm8sIGxhYmVsPXBhc3RlMChuLCIgXG4gIixyb3VuZChuL3RvdGFsKjEwMCwyKSwiJSIpKSArIA0KICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgcG9zaXRpb24gPSAiZG9kZ2UiKSArDQogIHRoZW1lX3B1YnIoKSArDQogIHRoZW1lKGxlZ2VuZC5rZXkgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwNCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGp1c3QgPSAxLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvdXIgPSAiYmxhY2siKSkgKw0KICBnZW9tX3RleHQodmp1c3Q9LTAuMiwgc2l6ZT0zKSArIA0KICBsYWJzKHN1YnRpdGxlID0gcGFzdGUwKCJUb3RhbCA9ICIsIGJhY3okdG90YWxbMV0pICkgKw0KICB4bGFiKCIiKSArIHlsYWIoIkZyZXF1w6puY2lhIikgKyBmYWNldF93cmFwKH5tb21lbnRvLCBucm93ID0gMikrIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGZhY2UgPSAiaXRhbGljIikpDQoNCg0KDQoNCiMnICMjIyAqKkNUSSoqICANCiMrIGVjaG89VCwgZmlnLmhlaWdodD0xMCwgZmlnLndpZHRoPTksIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UNCg0KYmFjICU+JSBmaWx0ZXIobG9jYWwgPT0iUGlhIGRvIENUSSIsIGludGVyPT0iUiIpICU+JQ0KICBzZWxlY3QoZ3JhbSwgbW9tZW50byxtaWNybyxpZCkgJT4lIGRpc3RpbmN0X2FsbCgpICU+JQ0KICBncm91cF9ieShncmFtLCBtb21lbnRvLG1pY3JvKSAlPiUgY291bnQoKSAlPiUgDQogIHVuZ3JvdXAgJT4lIA0KICBtdXRhdGUodG90YWwgPSBzdW0obiksICBwcm9wID0gcGFzdGUwKHJvdW5kKG4vdG90YWwqMTAwLDIpLCIlIikpICU+JQ0KICBhcnJhbmdlKGRlc2MoZ3JhbSxtb21lbnRvKSkgJT4lIGthYmxlKCkNCg0KYmFjeiA8LSBiYWMgJT4lIGZpbHRlcihsb2NhbCA9PSJQaWEgZG8gQ1RJIiwgaW50ZXI9PSJSIikgJT4lDQogIHNlbGVjdChncmFtLCBtb21lbnRvLG1pY3JvLGlkKSAlPiUgZGlzdGluY3RfYWxsKCkgJT4lDQogIGdyb3VwX2J5KGdyYW0sIG1vbWVudG8sbWljcm8pICU+JSBjb3VudCgpICU+JSANCiAgdW5ncm91cCAlPiUgDQogIG11dGF0ZSh0b3RhbCA9IHN1bShuKSwgIHByb3AgPSBwYXN0ZTAocm91bmQobi90b3RhbCoxMDAsMiksIiUiKSkgJT4lDQogIGFycmFuZ2UoZGVzYyhtaWNybywgZ3JhbSxtb21lbnRvKSkNCmdncGxvdChiYWN6KSArDQogIGdndGl0bGUoIlBpYSBkbyBDVEkiKSArDQogIGFlcyh4PXJlb3JkZXIobWljcm8sLW4pLHk9biwgZmlsbD1taWNybywgbGFiZWw9cGFzdGUwKG4sIiBcbiAiLHJvdW5kKG4vdG90YWwqMTAwLDIpLCIlIikpICsgDQogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBwb3NpdGlvbiA9ICJkb2RnZSIpICsNCiAgdGhlbWVfcHVicigpICsNCiAgdGhlbWUobGVnZW5kLmtleSA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLA0KICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoanVzdCA9IDEsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG91ciA9ICJibGFjayIpKSArDQogIGdlb21fdGV4dCh2anVzdD0tMC4yLCBzaXplPTMpICsgDQogIGxhYnMoc3VidGl0bGUgPSBwYXN0ZTAoIlRvdGFsID0gIiwgYmFjeiR0b3RhbFsxXSkgKSArDQogIHhsYWIoIiIpICsgeWxhYigiRnJlcXXDqm5jaWEiKSArIGZhY2V0X3dyYXAofm1vbWVudG8sIG5yb3cgPSAyKSsgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoZmFjZSA9ICJpdGFsaWMiKSkNCg0KDQoNCiMnICMjIyAqKkZhcm3DoWNpYSoqICANCiMrIGVjaG89VCwgZmlnLmhlaWdodD0xMCwgZmlnLndpZHRoPTksIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UNCg0KYmFjICU+JSBmaWx0ZXIobG9jYWwgPT0iRmFybcOhY2lhIiwgaW50ZXI9PSJSIikgJT4lDQogIHNlbGVjdChncmFtLCBtb21lbnRvLG1pY3JvLGlkKSAlPiUgZGlzdGluY3RfYWxsKCkgJT4lDQogIGdyb3VwX2J5KGdyYW0sIG1vbWVudG8sbWljcm8pICU+JSBjb3VudCgpICU+JSANCiAgdW5ncm91cCAlPiUgDQogIG11dGF0ZSh0b3RhbCA9IHN1bShuKSwgIHByb3AgPSBwYXN0ZTAocm91bmQobi90b3RhbCoxMDAsMiksIiUiKSkgJT4lDQogIGFycmFuZ2UoZGVzYyhncmFtLG1vbWVudG8pKSAlPiUga2FibGUoKQ0KDQpiYWN6IDwtIGJhYyAlPiUgZmlsdGVyKGxvY2FsID09IkZhcm3DoWNpYSIsIGludGVyPT0iUiIpICU+JQ0KICBzZWxlY3QoZ3JhbSwgbW9tZW50byxtaWNybyxpZCkgJT4lIGRpc3RpbmN0X2FsbCgpICU+JQ0KICBncm91cF9ieShncmFtLCBtb21lbnRvLG1pY3JvKSAlPiUgY291bnQoKSAlPiUgDQogIHVuZ3JvdXAgJT4lIA0KICBtdXRhdGUodG90YWwgPSBzdW0obiksICBwcm9wID0gcGFzdGUwKHJvdW5kKG4vdG90YWwqMTAwLDIpLCIlIikpICU+JQ0KICBhcnJhbmdlKGRlc2MobWljcm8sIGdyYW0sbW9tZW50bykpDQpnZ3Bsb3QoYmFjeikgKw0KICBnZ3RpdGxlKCJGYXJtw6FjaWEiKSArDQogIGFlcyh4PXJlb3JkZXIobWljcm8sLW4pLHk9biwgZmlsbD1taWNybywgbGFiZWw9cGFzdGUwKG4sIiBcbiAiLHJvdW5kKG4vdG90YWwqMTAwLDIpLCIlIikpICsgDQogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBwb3NpdGlvbiA9ICJkb2RnZSIpICsNCiAgdGhlbWVfcHVicigpICsNCiAgdGhlbWUobGVnZW5kLmtleSA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLA0KICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoanVzdCA9IDEsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG91ciA9ICJibGFjayIpKSArDQogIGdlb21fdGV4dCh2anVzdD0tMC4yLCBzaXplPTMpICsgDQogIGxhYnMoc3VidGl0bGUgPSBwYXN0ZTAoIlRvdGFsID0gIiwgYmFjeiR0b3RhbFsxXSkgKSArDQogIHhsYWIoIiIpICsgeWxhYigiRnJlcXXDqm5jaWEiKSArIGZhY2V0X3dyYXAofm1vbWVudG8sIG5yb3cgPSAyKSArIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGZhY2UgPSAiaXRhbGljIikpDQoNCg0KIycgIyMgKio2KiouCSpRdWFsIGEgY29ycmVsYcOnw6NvIGRhcyBiYWN0w6lyaWFzIEdyYW0gcG9zaXRpdmFzIGUgR3JhbSBuZWdhdGl2YXMgbWFpcyBlbmNvbnRyYWRhcyBlIGNvbSBwZXJmaWwgZGUgcmVzaXN0w6puY2lhIGVudHJlIGFzIGR1YXMgc2l0dWHDp8O1ZXMgKGxpbXBvIGUgc3Vqbyk/Kg0KDQpsaWJyYXJ5KHJlc2hhcGUyKQ0KIycgIyMjICoqQ29ycmVsYcOnw6NvKiogIA0KIysgZWNobz1ULCBmaWcuaGVpZ2h0PTYsIGZpZy53aWR0aD0xMCwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRQ0KDQpkYWQgPC0gYmFjICU+JSBmaWx0ZXIoaW50ZXI9PSJSIikgJT4lDQogIHNlbGVjdChtaWNybywgZ3JhbSwgbW9tZW50bywgbG9jYWwsaWQpICU+JSBkaXN0aW5jdF9hbGwoKSAlPiUNCiAgZ3JvdXBfYnkobWljcm8sIGdyYW0sbW9tZW50byxsb2NhbCkgJT4lIGNvdW50KCkgJT4lIA0KICB1bmdyb3VwICU+JSANCiAgbXV0YXRlKHRvdGFsID0gc3VtKG4pLCAgcHJvcCA9IHBhc3RlMChyb3VuZChuL3RvdGFsKjEwMCwyKSwiJSIpKSAlPiUNCiAgYXJyYW5nZShkZXNjKG4pKQ0KDQpkYWQyIDwtIGRjYXN0KGRhZCwgbG9jYWwrbW9tZW50byB+Z3JhbSkNCm5hbWVzKGRhZDIpIDwtIGMoImxvY2FsIiwibW9tZW50byIsImduZWdhdGl2YSIsImdwb3NpdGl2YSIpDQoNCmdnc2NhdHRlcihkYWQyLA0KICAgICAgICAgIHggPSAiZ25lZ2F0aXZhIiwNCiAgICAgICAgICB5ID0gImdwb3NpdGl2YSIsDQogICAgICAgICAgYWRkID0gInJlZy5saW5lIiwjYWRpY25pb25hciBsaW5oYSBkZSByZWdyZXNzYW8NCiAgICAgICAgICBjb25mLmludCA9IFRSVUUsDQogICAgICAgICAgY29yLmNvZWYgPSBUUlVFLA0KICAgICAgICAgIGNvci5tZXRob2QgPSAic3BlYXJtYW4iLA0KICAgICAgICAgIHhsYWIgPSAiR3JhbSBuZWdhdGl2YSIsDQogICAgICAgICAgeWxhYiA9ICJHcmFtIHBvc2l0aXZhIiwNCiAgICAgICAgICBmYWNldC5ieT1jKCJtb21lbnRvIiksDQogICAgICAgICAgZm9udC5sYWJlbCA9IGMoNSwgInBsYWluIikpKw0KICBsYWJzKHRhZyA9ICIiKQ0KDQoNCmRhZDIgJT4lIGthYmxlDQoNCiMnIEZvaSB1dGlsaXphZG8gbWV0b2RvIGRlIENvcnJlbGHDp8OjbyBkZSBTcGVhcm1hbiwgasOhIHF1ZSBvcyBkYWRvcyBuw6NvIHNlZ3VlbSB1bWEgZGlzdHJpYnVpw6fDo28gbm9ybWFsDQojJw0KDQoNCg0KIycgIyMgKio3KiouICpRdWFsIGEgZnJlcXXDqm5jaWEgdG90YWwgZGUgYmFjdMOpcmlhcyBncmFtIHBvc2l0aXZhcyBlIGdyYW0gbmVnYXRpdmFzIGNvbSBwZXJmaWxkZSByZXNpc3TDqm5jaWEgcG9yIMOhcmVhIGUgY29uc2lkZXJhbmRvIHNpdHVhw6fDo28gZGUgc3Vqby9saW1wbyoNCiMnIA0KDQoNCiMnICMjIyAqKlJlc3Bvc3RhKiogIA0KIysgZWNobz1ULCBmaWcuaGVpZ2h0PTgsIGZpZy53aWR0aD0xMCwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRQ0KDQoNCmJhYyAlPiUgZmlsdGVyKGludGVyID09ICJSIikgJT4lDQogIHNlbGVjdChtb21lbnRvLGxvY2FsLGdyYW0saWQsbWljcm8pICU+JSBkaXN0aW5jdF9hbGwoKSAlPiUNCiAgZ3JvdXBfYnkobW9tZW50byxsb2NhbCxncmFtKSAlPiUgY291bnQoKSAlPiUgDQogIHVuZ3JvdXAgJT4lIA0KICBtdXRhdGUodG90YWwgPSBzdW0obiksICBwcm9wID0gcGFzdGUwKHJvdW5kKG4vdG90YWwqMTAwLDIpLCIlIikpICU+JQ0KICBhcnJhbmdlKGRlc2MobikpICU+JSBrYWJsZQ0KDQoNCmIgPC0gYmFjICU+JSBmaWx0ZXIoaW50ZXIgPT0gIlIiKSAlPiUNCiAgc2VsZWN0KG1vbWVudG8sbG9jYWwsZ3JhbSxpZCxtaWNybykgJT4lIGRpc3RpbmN0X2FsbCgpICU+JQ0KICBncm91cF9ieShtb21lbnRvLGxvY2FsLGdyYW0pICU+JSBjb3VudCgpICU+JSANCiAgdW5ncm91cCAlPiUgDQogIG11dGF0ZSh0b3RhbCA9IHN1bShuKSwgIHByb3AgPSBwYXN0ZTAocm91bmQobi90b3RhbCoxMDAsMiksIiUiKSkgJT4lDQogIGFycmFuZ2UoZGVzYyhuKSkgDQogIA0KZ2dwbG90KGIpICsNCiAgZ2d0aXRsZSgiR3JhbSBOZWdhdGl2YSBlIFBvc2l0aXZhIikgKw0KICBhZXMoeD1yZW9yZGVyKGxvY2FsLC1uKSx5PW4sIGZpbGw9bG9jYWwsIGxhYmVsPXBhc3RlMChuLCIgXG4gIixyb3VuZChuL3RvdGFsKjEwMCwyKSwiJSIpKSArIA0KICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSgxKSkgKw0KICB0aGVtZV9wdWJyKCkgKw0KICB0aGVtZShsZWdlbmQua2V5ID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsDQogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhqdXN0ID0gMSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3VyID0gImJsYWNrIikpICsNCiAgZ2VvbV90ZXh0KHZqdXN0PS0wLjIsIHNpemU9MywgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSgxKSkgKyANCiAgbGFicyhzdWJ0aXRsZSA9IHBhc3RlMCgiVG90YWwgPSAiLCBiJHRvdGFsWzFdKSApICsNCiAgeGxhYigiIikgKyB5bGFiKCJGcmVxdcOqbmNpYSIpICsgZmFjZXRfd3JhcCh+bW9tZW50bypncmFtLCBuY29sID0gMikNCg0KDQoNCg0KDQojJyAjIyAqKjEwKiouCSpRdWFsIGJhY3TDqXJpYSDDqSBtYWlzIGZyZXF1ZW50ZSBub3MgbGVpdG9zIGRhIFVUSSBwb3Igc3VwZXJmw61jaWU/Kg0KIycgDQoNCg0KIycgIyMjICoqTEVJVE9TKiogIA0KIysgZWNobz1ULCBmaWcuaGVpZ2h0PTgsIGZpZy53aWR0aD0xMCwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRQ0KDQoNCmJhYyAlPiUgZmlsdGVyKGxvY2FsICVpbiUgYygiTGVpdG8gMDMiLCJMZWl0byAwNCIsIkxlaXRvIDA1IiwiTGVpdG8gMDYiLCJMZWl0byAwOCIsIkxlaXRvIDEyIikpICU+JQ0KICBzZWxlY3QobW9tZW50byxzdXBlcixpZCxtaWNybykgJT4lIGRpc3RpbmN0X2FsbCgpICU+JQ0KICBncm91cF9ieShtb21lbnRvLHN1cGVyLG1pY3JvKSAlPiUgY291bnQoKSAlPiUgDQogIHVuZ3JvdXAgJT4lIA0KICBtdXRhdGUodG90YWwgPSBzdW0obiksICBwcm9wID0gcGFzdGUwKHJvdW5kKG4vdG90YWwqMTAwLDIpLCIlIikpICU+JQ0KICBhcnJhbmdlKGRlc2MobikpICU+JSBrYWJsZSgpDQoNCg0KYSA8LSBiYWMgJT4lIGZpbHRlcihsb2NhbCAlaW4lIGMoIkxlaXRvIDAzIiwiTGVpdG8gMDQiLCJMZWl0byAwNSIsIkxlaXRvIDA2IiwiTGVpdG8gMDgiLCJMZWl0byAxMiIpKSAlPiUNCiAgc2VsZWN0KG1vbWVudG8sc3VwZXIsaWQsbWljcm8pICU+JSBkaXN0aW5jdF9hbGwoKSAlPiUNCiAgZ3JvdXBfYnkobW9tZW50byxzdXBlcixtaWNybykgJT4lIGNvdW50KCkgJT4lIA0KICB1bmdyb3VwICU+JSANCiAgbXV0YXRlKHRvdGFsID0gc3VtKG4pLCAgcHJvcCA9IHBhc3RlMChyb3VuZChuL3RvdGFsKjEwMCwyKSwiJSIpKSAlPiUNCiAgYXJyYW5nZShkZXNjKG4pKSANCg0KZ2dwbG90KGEpICsNCiAgZ2d0aXRsZSgiTGVpdG9zIDAzLCAwNCwgMDUsIDA2LCAwOCBlIDEyIikgKw0KICBhZXMoeD1yZW9yZGVyKG1pY3JvLCtuKSx5PW4sIGZpbGw9c3VwZXIsIGxhYmVsPW4pICsgDQogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBwb3NpdGlvbiA9ICJzdGFjayIpICsNCiAgdGhlbWVfcHVicigpICsNCiAgc2NhbGVfZmlsbF9kaXNjcmV0ZShuYW1lPSJTdXBlcmZpY2llIikrDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJyaWdodCIsDQogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gMCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGp1c3QgPSAwLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvdXIgPSAiYmxhY2siKSkgKw0KICBnZW9tX3RleHQoc2l6ZT0zLGhqdXN0PSsyLCB2anVzdD0wLjUsIHBvc2l0aW9uID0gInN0YWNrIikgKyANCiAgbGFicyhzdWJ0aXRsZSA9IHBhc3RlMCgiVG90YWwgPSAiLCBhJHRvdGFsWzFdKSkgKw0KICB4bGFiKCIiKSArIHlsYWIoIkZyZXF1w6puY2lhIikgKyBmYWNldF93cmFwKH5tb21lbnRvLCBuY29sID0gMikgKyBjb29yZF9mbGlwKCkgKyB0aGVtZShheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChmYWNlID0gIml0YWxpYyIpKQ0KDQoNCg0KDQoNCiMnICMjICoqMTEqKi4JKlF1YWlzIG9zIHBhZHLDtWVzIGRlIHN1c2NlcHRpYmlsaWRhZGUgYW50aW1pY3JvYmlhbmEgZGUgY2VwYXMgZGUgYmFjdMOpcmlhcyBpc29sYWRhcyAoTWljcm9yZ2FuaXNtb3MgeCBtZWRpY2FtZW50b3MgeCBzdWNlcHRpYmlsaWRhZGUgZGUgYW50aW1pY3JvYmlhbm9zIFMgKCUpIEkgKCUpIFIgKCUpKSoNCiMnIA0KDQoNCiMnICMjIyAqKlJlc3Bvc3RhKiogIA0KIysgZWNobz1ULCBmaWcuaGVpZ2h0PTgsIGZpZy53aWR0aD0xMCwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRQ0KDQpsaWJyYXJ5KHN1bW1hcnl0b29scykNCmxpYnJhcnkodGlkeXIpDQoNCg0KIyBiYWMgJT4lIG11dGF0ZShpZCA9IGZhY3RvcihpZCksIGludGVyID0gZmFjdG9yKGludGVyKSkgJT4lIA0KIyAgICMgIGZpbHRlcihpbnRlcj09IlIiKSAlPiUgDQojICAgc2VsZWN0KGFudGksaWQsaW50ZXIpICU+JSANCiMgICBncm91cF9ieShhbnRpLGludGVyKSAlPiUgIGNvdW50KCkgJT4lIA0KIyAgIGRlc2NyKC4sIHN0YXRzID0gYygiY29tbW9uIiksIHRyYW5zcG9zZSA9IFQpICU+JSANCiMgICB0YigpICU+JSBhcnJhbmdlKGRlc2MobWVhbikpICU+JSBhcy5kYXRhLmZyYW1lKCkgIyU+JSBzdW1tYXJpc2Uoc3VtKG1lYW4pKQ0KYmFjMiA8LSBiYWMNCg0KYmFjMiAlPiUgbXV0YXRlKGlkID0gZmFjdG9yKGlkKSwgaW50ZXIgPSBmYWN0b3IoaW50ZXIpKSAlPiUgDQogIHNlbGVjdChhbnRpLGludGVyLG1pY3JvLCBpZCwgaW50ZXIpICU+JSANCiAgZ3JvdXBfYnkoYW50aSxpbnRlcikgJT4lICBjb3VudCgpICU+JSBhcnJhbmdlKGFudGksZGVzYyhuKSkgJT4lIA0KICB1bmdyb3VwICU+JQ0KICBhcy5kYXRhLmZyYW1lKCkgJT4lIHBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSBpbnRlciwgdmFsdWVzX2Zyb20gPSBuLCB2YWx1ZXNfZmlsbCA9IDApICU+JSANCiAgbXV0YXRlKFRTID0gc3VtKFMpLCAgUFMgPSBwYXN0ZTAocm91bmQoUy9UUyoxMDAsMiksIiUiKSwNCiAgICAgICAgIFRJID0gc3VtKEkpLCAgUEkgPSBwYXN0ZTAocm91bmQoSS9USSoxMDAsMiksIiUiKSwNCiAgICAgICAgIFRSID0gc3VtKFIpLCAgUFIgPSBwYXN0ZTAocm91bmQoUi9UUioxMDAsMiksIiUiKSwNCiAgICAgICAgIFRORUcgPSBzdW0oTkVHKSwgIFBORUcgPSBwYXN0ZTAocm91bmQoTkVHL1RSKjEwMCwyKSwiJSIpLA0KICAgICAgICAgVFBPUyA9IHN1bShQT1MpLCAgUFBPUyA9IHBhc3RlMChyb3VuZChQT1MvVFIqMTAwLDIpLCIlIiksDQogICAgICAgICBUTkEgPSBzdW0oYE5BYCksICBQTkEgPSBwYXN0ZTAocm91bmQoYE5BYC9UUioxMDAsMiksIiUiKSkgJT4lIGFzLmRhdGEuZnJhbWUoKSAlPiUgIGthYmxlKCJwYW5kb2MiKQ0KDQpiYWMyJGludGVyW2lzLm5hKGJhYzIkaW50ZXIpXSA8LSAiTkFhdmEiDQoNCmJhYzIgJT4lIG11dGF0ZShpZCA9IGZhY3RvcihpZCksIGludGVyID0gZmFjdG9yKGludGVyKSkgJT4lIA0KICBzZWxlY3QobW9tZW50byxhbnRpLGludGVyLG1pY3JvLCBpZCwgaW50ZXIpICU+JSANCiAgZ3JvdXBfYnkobW9tZW50byxhbnRpLGludGVyLG1pY3JvKSAlPiUgIGNvdW50KCkgJT4lIGFycmFuZ2UoYW50aSxkZXNjKG4pKSAlPiUgDQogIHBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSBtaWNybywgdmFsdWVzX2Zyb20gPSBuKSAlPiUgcmVwbGFjZShpcy5uYSguKSwgMCkgJT4lIGFzLmRhdGEuZnJhbWUoKSAlPiUgICBtdXRhdGUoc3VtID0gcm93U3VtcyguWzQ6MzhdKSkgJT4lIHNlbGVjdChtb21lbnRvLGFudGksaW50ZXIsc3VtKSAlPiUgYXJyYW5nZShkZXNjKHN1bSkpICU+JSBwaXZvdF93aWRlcihuYW1lc19mcm9tID0gaW50ZXIsIHZhbHVlc19mcm9tID0gc3VtLCB2YWx1ZXNfZmlsbCA9IDApICU+JSBhcy5kYXRhLmZyYW1lKCkgLT4gYW50aXRhYg0KDQoNCmJhYzIgJT4lIG11dGF0ZShpZCA9IGZhY3RvcihpZCksIGludGVyID0gZmFjdG9yKGludGVyKSkgJT4lICNmaWx0ZXIoaW50ZXIhPSJOQSIpICU+JSANCiAgc2VsZWN0KG1vbWVudG8sYW50aSxpbnRlcixtaWNybywgaWQsIGludGVyKSAlPiUgDQogIGdyb3VwX2J5KG1vbWVudG8sYW50aSxpbnRlcixtaWNybykgJT4lICBjb3VudCgpICU+JSBhcnJhbmdlKGFudGksZGVzYyhuKSkgJT4lIA0KICBwaXZvdF93aWRlcihuYW1lc19mcm9tID0gbWljcm8sIHZhbHVlc19mcm9tID0gbikgJT4lIHJlcGxhY2UoaXMubmEoLiksIDApICU+JSBhcy5kYXRhLmZyYW1lKCkgJT4lICAgbXV0YXRlKHN1bSA9IHJvd1N1bXMoLls0OjM4XSkpICU+JSBzZWxlY3QoYW50aSxtb21lbnRvLGludGVyLHN1bSkgJT4lIGFycmFuZ2UoZGVzYyhzdW0pKSAtPiBhbnRpDQoNCmxldmVscyhhbnRpJGludGVyKSA8LSBjKCJJbnRlcm1lZGnDoXJpbyIsIk7Do28gQXZhbGlhZG8iLCJOZWdhdGl2byIsIlBvc2l0aXZvIiwiUmVzaXN0ZW50ZSIsIlNlbnPDrXZlbCIpDQoNCmFudGkgJT4lIGZpbHRlcihpbnRlciAlaW4lIGMoIkludGVybWVkacOhcmlvIiwgIlJlc2lzdGVudGUiLCJTZW5zw612ZWwiKSkgJT4lIA0KICBnZ3Bsb3QoKSArDQogICMgZ2d0aXRsZSgiUywgUiwgSSwgTkVHLCBQT1MiKSArDQogIGFlcyh4PXJlb3JkZXIoYW50aSwtc3VtKSx5PXN1bSwgZmlsbD1pbnRlcikgKyANCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIHBvc2l0aW9uID0gInN0YWNrIikgKw0KICB0aGVtZV9wdWJyKCkgKw0KICB0aGVtZShsZWdlbmQudGl0bGUgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJyaWdodCIsDQogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhqdXN0ID0gMSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmp1c3QgPSAwLjMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG91ciA9ICJibGFjayIpKSArDQogIHhsYWIoIiIpICsgeWxhYigiRnJlcXXDqm5jaWEiKSANCg0KDQphbnRpICU+JSBmaWx0ZXIoaW50ZXIgJWluJSBjKCJJbnRlcm1lZGnDoXJpbyIsICJSZXNpc3RlbnRlIiwiU2Vuc8OtdmVsIikpICU+JSANCmdnYmFycGxvdCguLCB4ID0gImFudGkiLCANCiAgICAgICAgICAgICAgICAgICB5ID0gInN1bSIsDQogICAgICAgICAgICAgICAgICAgZmlsbCA9ICJpbnRlciIsIHBhbGV0dGUgPSAibGFuY2V0IiwNCiAgICAgICAgICAgICAgICAgICBsYWJlbCA9IEYsDQogICAgICAgICAgICAgICAgICAgbGFiLnBvcyA9IGMoImluIiksDQogICAgICAgICAgICAgICAgICAgZmFjZXQuYnkgPSAibW9tZW50byIsDQogICAgICAgICAgICAgICAgICAgeGxhYiA9ICIiLA0KICAgICAgICAgICAgICAgICAgIHJlcGVsPVQsDQogICAgICAgICAgICAgICAgICAgeWxhYj0gIkZyZXF1w6puY2lhIiwNCiAgICAgICAgICAgICAgICAgICBsYWIuc2l6ZSA9IDMsDQogICAgICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9zdGFjaygpDQopICsgDQogIHRoZW1lX3B1YnIobGVnZW5kPSJyaWdodCIpICsNCiAgdGhlbWUoDQogICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF9ibGFuaygpLA0KICAgIHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwKSwNCiAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dCgNCiAgICAgIGFuZ2xlID0gMCwNCiAgICAgIGhqdXN0ID0gMCwNCiAgICAgIGNvbG91ciA9ICJibGFjayIpLA0KICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KA0KICAgICAgYW5nbGUgPSA5MCwNCiAgICAgIGhqdXN0ID0gMSwNCiAgICAgIHZqdXN0ID0gMC4zLA0KICAgICAgY29sb3VyID0gImJsYWNrIikpICMrIGNvb3JkX2ZsaXAoKQ0KDQoNCg0KYmFjMiAlPiUgbXV0YXRlKGlkID0gZmFjdG9yKGlkKSwgaW50ZXIgPSBmYWN0b3IoaW50ZXIpKSAlPiUgI2ZpbHRlcihpbnRlciE9Ik5BIikgJT4lIA0KICBzZWxlY3QoYW50aSxpbnRlcixtaWNybywgaWQsIGludGVyKSAlPiUgDQogIGdyb3VwX2J5KGFudGksaW50ZXIsbWljcm8pICU+JSAgY291bnQoKSAlPiUgYXJyYW5nZShhbnRpLGRlc2MobikpICU+JSANCiAgcGl2b3Rfd2lkZXIobmFtZXNfZnJvbSA9IG1pY3JvLCB2YWx1ZXNfZnJvbSA9IG4pICU+JSByZXBsYWNlKGlzLm5hKC4pLCAwKSAlPiUgYXMuZGF0YS5mcmFtZSgpICU+JSAgIG11dGF0ZShzdW0gPSByb3dTdW1zKC5bNDozN10pKSAlPiUgc2VsZWN0KGFudGksaW50ZXIsc3VtKSAlPiUgYXJyYW5nZShkZXNjKHN1bSkpIC0+IGFudGkyDQoNCmxldmVscyhhbnRpMiRpbnRlcikgPC0gYygiSW50ZXJtZWRpw6FyaW8iLCJOw6NvIEF2YWxpYWRvIiwiTmVnYXRpdm8iLCJQb3NpdGl2byIsIlJlc2lzdGVudGUiLCJTZW5zw612ZWwiKQ0KDQpiYWMyICU+JSBtdXRhdGUoaWQgPSBmYWN0b3IoaWQpLCBpbnRlciA9IGZhY3RvcihpbnRlcikpICU+JSANCiAgc2VsZWN0KGFudGksaW50ZXIsbWljcm8sIGlkLCBpbnRlcikgJT4lIA0KICBncm91cF9ieShhbnRpLGludGVyLG1pY3JvKSAlPiUgIGNvdW50KCkgJT4lIGFycmFuZ2UoYW50aSxkZXNjKG4pKSAlPiUgDQogIHBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSBtaWNybywgdmFsdWVzX2Zyb20gPSBuKSAlPiUgcmVwbGFjZShpcy5uYSguKSwgMCkgJT4lIGFzLmRhdGEuZnJhbWUoKSAlPiUgICBtdXRhdGUoc3VtID0gcm93U3VtcyguWzQ6MzddKSkgJT4lIHNlbGVjdChhbnRpLGludGVyLHN1bSkgJT4lIGFycmFuZ2UoZGVzYyhzdW0pKSAlPiUgcGl2b3Rfd2lkZXIobmFtZXNfZnJvbSA9IGludGVyLCB2YWx1ZXNfZnJvbSA9IHN1bSwgdmFsdWVzX2ZpbGwgPSAwKSAlPiUgYXMuZGF0YS5mcmFtZSgpIC0+IGFudGl0YWIyDQoNCg0KYW50aTIgJT4lIGZpbHRlcihpbnRlciAlaW4lIGMoIkludGVybWVkacOhcmlvIiwgIlJlc2lzdGVudGUiLCJTZW5zw612ZWwiKSkgJT4lIGdnYmFycGxvdCguLCB4ID0gImFudGkiLCANCiAgICAgICAgICAgICAgICAgICAgeSA9ICJzdW0iLA0KICAgICAgICAgICAgICAgICAgICBmaWxsID0gImludGVyIiwgI3BhbGV0dGUgPSAibGFuY2V0IiwNCiAgICAgICAgICAgICAgICAgICAgbGFiZWwgPSBUUlVFLA0KICAgICAgICAgICAgICAgICAgICBsYWIucG9zID0gYygib3V0IiksDQogICAgICAgICAgICAgICAgICAgICNmYWNldC5ieSA9ICJtb21lbnRvIiwNCiAgICAgICAgICAgICAgICAgICAgeGxhYiA9ICIiLA0KICAgICAgICAgICAgICAgICAgICByZXBlbD1ULA0KICAgICAgICAgICAgICAgICAgICB5bGFiPSAiRnJlcXXDqm5jaWEiLA0KICAgICAgICAgICAgICAgICAgICBsYWIuc2l6ZSA9IDMsDQogICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fc3RhY2soKQ0KKSArIA0KICB0aGVtZV9wdWJyKGxlZ2VuZD0icmlnaHQiKSArDQogIHRoZW1lKA0KICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICB0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCksDQogICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoDQogICAgICBhbmdsZSA9IDAsDQogICAgICBoanVzdCA9IDEsDQogICAgICBjb2xvdXIgPSAiYmxhY2siKSwNCiAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dCgNCiAgICAgIGFuZ2xlID0gOTAsDQogICAgICBoanVzdCA9IDEsDQogICAgICBjb2xvdXIgPSAiYmxhY2siKSkgIysgY29vcmRfZmxpcCgpDQoNCg0KDQoNCg0KIycgIyMgKioxMioqLgkqQ29tcGFyYcOnw6NvIGVudHJlIG8gbnVtw6lybyBkZSBSLFMsSSxORUcsUE9TLE5BIGFudGVzIGUgZGVwb2lzIGRhIGxpbXBlemEqDQojJyANCg0KDQojJyAjIyMgKipSZXNwb3N0YSoqICANCiMrIGVjaG89VCwgZmlnLmhlaWdodD04LCBmaWcud2lkdGg9MTAsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UNCg0KDQphbnRpdGFiICU+JQ0KICBncm91cF9ieShtb21lbnRvKSAlPiUNCiAgc2hhcGlyb190ZXN0KFMpICU+JSBrYWJsZSgicGFuZG9jIikNCg0KDQpwIDwtIGdnYm94cGxvdChhbnRpdGFiLCB4ID0gIm1vbWVudG8iLCB5ID0gIlMiLA0KICAgICAgICAgICAgICAgY29sb3IgPSAibW9tZW50byIsIHBhbGV0dGUgPSAiamNvIiwNCiAgICAgICAgICAgICAgIGFkZCA9ICJqaXR0ZXIiLCB4bGFiID0gIiIsIHlsYWIgPSAiU2Vuc8OtdmVsIikgKyANCiAgdGhlbWVfcHVicihsZWdlbmQ9InJpZ2h0IikgKw0KICB0aGVtZShsZWdlbmQudGl0bGUgPSBlbGVtZW50X2JsYW5rKCkpDQoNCnAgKyBzdGF0X2NvbXBhcmVfbWVhbnMocGFpcmVkID0gVCkNCg0KDQoNCmFudGl0YWIgJT4lDQogIGdyb3VwX2J5KG1vbWVudG8pICU+JQ0KICBzaGFwaXJvX3Rlc3QoUikgJT4lIGthYmxlKCJwYW5kb2MiKQ0KDQoNCnAgPC0gZ2dib3hwbG90KGFudGl0YWIsIHggPSAibW9tZW50byIsIHkgPSAiUiIsDQogICAgICAgICAgICAgICBjb2xvciA9ICJtb21lbnRvIiwgcGFsZXR0ZSA9ICJqY28iLA0KICAgICAgICAgICAgICAgYWRkID0gImppdHRlciIsIHhsYWIgPSAiIiwgeWxhYiA9ICJSZXNpc3RlbnRlIikgKyANCiAgdGhlbWVfcHVicihsZWdlbmQ9InJpZ2h0IikgKw0KICB0aGVtZShsZWdlbmQudGl0bGUgPSBlbGVtZW50X2JsYW5rKCkpDQoNCnAgKyBzdGF0X2NvbXBhcmVfbWVhbnMocGFpcmVkID0gVCkNCg0KDQoNCmFudGl0YWIgJT4lDQogIGdyb3VwX2J5KG1vbWVudG8pICU+JQ0KICBzaGFwaXJvX3Rlc3QoSSkgJT4lIGthYmxlKCJwYW5kb2MiKQ0KDQpwIDwtIGdnYm94cGxvdChhbnRpdGFiLCB4ID0gIm1vbWVudG8iLCB5ID0gIkkiLA0KICAgICAgICAgICAgICAgY29sb3IgPSAibW9tZW50byIsIHBhbGV0dGUgPSAiamNvIiwNCiAgICAgICAgICAgICAgIGFkZCA9ICJqaXR0ZXIiLCB4bGFiID0gIiIsIHlsYWIgPSAiSW50ZXJtZWRpw6FyaW8iKSArIA0KICB0aGVtZV9wdWJyKGxlZ2VuZD0icmlnaHQiKSArDQogIHRoZW1lKGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfYmxhbmsoKSkNCg0KcCArIHN0YXRfY29tcGFyZV9tZWFucyhwYWlyZWQgPSBUKQ0KDQoNCg0KYW50aXRhYiAlPiUNCiAgZ3JvdXBfYnkobW9tZW50bykgJT4lDQogIHNoYXBpcm9fdGVzdChORUcpICU+JSBrYWJsZSgicGFuZG9jIikNCg0KcCA8LSBnZ2JveHBsb3QoYW50aXRhYiwgeCA9ICJtb21lbnRvIiwgeSA9ICJORUciLA0KICAgICAgICAgICAgICAgY29sb3IgPSAibW9tZW50byIsIHBhbGV0dGUgPSAiamNvIiwNCiAgICAgICAgICAgICAgIGFkZCA9ICJqaXR0ZXIiLCB4bGFiID0gIiIsIHlsYWIgPSAiTmVnYXRpdm8iKSArIA0KICB0aGVtZV9wdWJyKGxlZ2VuZD0icmlnaHQiKSArDQogIHRoZW1lKGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfYmxhbmsoKSkNCg0KcCArIHN0YXRfY29tcGFyZV9tZWFucyhwYWlyZWQgPSBUKQ0KDQoNCmFudGl0YWIgJT4lDQogIGdyb3VwX2J5KG1vbWVudG8pICU+JQ0KICBzaGFwaXJvX3Rlc3QoUE9TKSAlPiUga2FibGUoInBhbmRvYyIpDQoNCnAgPC0gZ2dib3hwbG90KGFudGl0YWIsIHggPSAibW9tZW50byIsIHkgPSAiUE9TIiwNCiAgICAgICAgICAgICAgIGNvbG9yID0gIm1vbWVudG8iLCBwYWxldHRlID0gImpjbyIsDQogICAgICAgICAgICAgICBhZGQgPSAiaml0dGVyIiwgeGxhYiA9ICIiLCB5bGFiID0gIlBvc2l0aXZvIikgKyANCiAgdGhlbWVfcHVicihsZWdlbmQ9InJpZ2h0IikgKw0KICB0aGVtZShsZWdlbmQudGl0bGUgPSBlbGVtZW50X2JsYW5rKCkpDQoNCnAgKyBzdGF0X2NvbXBhcmVfbWVhbnMocGFpcmVkID0gVCkNCg0KDQphbnRpdGFiICU+JQ0KICBncm91cF9ieShtb21lbnRvKSAlPiUNCiAgc2hhcGlyb190ZXN0KE5BYXZhKSAlPiUga2FibGUoInBhbmRvYyIpDQoNCnAgPC0gZ2dib3hwbG90KGFudGl0YWIsIHggPSAibW9tZW50byIsIHkgPSAiTkFhdmEiLA0KICAgICAgICAgICAgICAgY29sb3IgPSAibW9tZW50byIsIHBhbGV0dGUgPSAiamNvIiwNCiAgICAgICAgICAgICAgIGFkZCA9ICJqaXR0ZXIiLCB4bGFiID0gIiIsIHlsYWIgPSAiTsOjbyBBdmFsaWFkbyIpICsgDQogIHRoZW1lX3B1YnIobGVnZW5kPSJyaWdodCIpICsNCiAgdGhlbWUobGVnZW5kLnRpdGxlID0gZWxlbWVudF9ibGFuaygpKQ0KDQpwICsgc3RhdF9jb21wYXJlX21lYW5zKHBhaXJlZCA9IFQpDQoNCmE8LWNvbXBhcmVfbWVhbnMoUyB+IG1vbWVudG8sIGRhdGEgPSBhbnRpdGFiLCBwYWlyZWQgPSBUKQ0KYjwtY29tcGFyZV9tZWFucyhSIH4gbW9tZW50bywgZGF0YSA9IGFudGl0YWIsIHBhaXJlZCA9IFQpDQpjPC1jb21wYXJlX21lYW5zKEkgfiBtb21lbnRvLCBkYXRhID0gYW50aXRhYiwgcGFpcmVkID0gVCkNCmQ8LWNvbXBhcmVfbWVhbnMoTkVHIH4gbW9tZW50bywgZGF0YSA9IGFudGl0YWIsIHBhaXJlZCA9IFQpDQplPC1jb21wYXJlX21lYW5zKFBPUyB+IG1vbWVudG8sIGRhdGEgPSBhbnRpdGFiLCBwYWlyZWQgPSBUKQ0KZjwtY29tcGFyZV9tZWFucyhOQWF2YSAgfiBtb21lbnRvLCBkYXRhID0gYW50aXRhYiwgcGFpcmVkID0gVCkNCg0KcmJpbmQoYSxiLGMsZCxlLGYpICU+JSBrYWJsZSgicGFuZG9jIikNCg0KDQoNCg0KDQojJyAjIyAqKkVYVFJBKioNCiMnIA0KDQojJyAjIyMgKipLLW1lYW5zIGUgUENBKiogIA0KIysgZWNobz1ULCBmaWcuaGVpZ2h0PTEwLCBmaWcud2lkdGg9OSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRQ0KDQoNCiMnIENhcnJlZ2FtZW50byBkb3MgZGFkb3MNCiMrIGVjaG89VCwgZmlnLmhlaWdodD05LCBmaWcud2lkdGg9MTIsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UNCg0KZGF0IDwtIGJhYyAlPiUgc2VsZWN0KG1pY3JvLCBsb2NhbCwgaWQpICU+JSBkaXN0aW5jdF9hbGwoKSAlPiUNCiAgZ3JvdXBfYnkobWljcm8sIGxvY2FsKSAlPiUgY291bnQoKSAlPiUgDQogIHVuZ3JvdXAgDQoNCmRhdDIgPC0gZGNhc3QoZGF0LCBtaWNybyB+IGxvY2FsKQ0KZGF0Mltpcy5uYShkYXQyKV0gPC0gMA0KDQpyb3duYW1lcyhkYXQyKSA8LSBkYXQyJG1pY3JvDQoNCmRhdDIgPC0gZGF0MlstMV0NCg0KDQpkYXQyDQoNCg0KIycgRGltZW5zaW9uYW1lbnRvIGUgcGFkcm9uaXphw6fDo28NCiMrIGVjaG89VCwgZmlnLmhlaWdodD05LCBmaWcud2lkdGg9MTIsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UNCg0KZGYgPC0gc2NhbGUoZGF0MikgDQoNCiMnIE7Dum1lcm8gw7N0aW1vIGRlIGNsdXN0ZXJzDQojKyBlY2hvPVQsIGZpZy5oZWlnaHQ9OSwgZmlnLndpZHRoPTEyLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFDQoNCiMgU2lsaHVldGEgbcOpZGlhIHBhcmEga21lYW5zDQpmdml6X25iY2x1c3QoZGYsIGttZWFucywgbWV0aG9kID0gInNpbGhvdWV0dGUiKQ0KDQojIEVzdGF0w61zdGljYSBkZSBsYWN1bmFzDQpmdml6X25iY2x1c3QoZGYsIGttZWFucywgbWV0aG9kID0gImdhcF9zdGF0IikNCg0KIyBNw6l0b2RvIEVsYm93IHBhcmEga21lYW5zDQpmdml6X25iY2x1c3QoZGYsIGttZWFucywgbWV0aG9kID0gIndzcyIpICsNCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMywgbGluZXR5cGUgPSAyKQ0KDQoNCg0KbmJjbHVzdF9vdXQgPC0gTmJDbHVzdCgNCiAgZGF0YSA9IGRmLA0KICBkaXN0YW5jZSA9ICJldWNsaWRlYW4iLA0KICBtaW4ubmMgPSAyLA0KICBtYXgubmMgPSA1LA0KICBtZXRob2QgPSAia21lYW5zIg0KKQ0KDQojIGNyZWF0ZSBhIGRhdGFmcmFtZSBvZiB0aGUgb3B0aW1hbCBudW1iZXIgb2YgY2x1c3RlcnMNCm5iY2x1c3RfcGxvdCA8LSBkYXRhLmZyYW1lKGNsdXN0ZXJzID0gbmJjbHVzdF9vdXQkQmVzdC5uY1sxLCBdKQ0KIyBzZWxlY3Qgb25seSBpbmRpY2VzIHdoaWNoIHNlbGVjdCBiZXR3ZWVuIDIgYW5kIDUgY2x1c3RlcnMNCm5iY2x1c3RfcGxvdCA8LSBzdWJzZXQobmJjbHVzdF9wbG90LCBjbHVzdGVycyA+PSAyICYgY2x1c3RlcnMgPD0gNSkNCg0KIyBjcmVhdGUgcGxvdA0KZ2dwbG90KG5iY2x1c3RfcGxvdCkgKw0KICBhZXMoeCA9IGNsdXN0ZXJzKSArDQogIGdlb21faGlzdG9ncmFtKGJpbnMgPSAzMEwsIGZpbGwgPSAiIzBjNGM4YSIpICsNCiAgbGFicyh4ID0gIk51bWJlciBvZiBjbHVzdGVycyIsIHkgPSAiRnJlcXVlbmN5IGFtb25nIGFsbCBpbmRpY2VzIiwgdGl0bGUgPSAiT3B0aW1hbCBudW1iZXIgb2YgY2x1c3RlcnMiKSArDQogIHRoZW1lX3B1YnIoKQ0KDQojJyBDbHVzdGVyaXphw6fDo28gay1tZWFucw0KIysgZWNobz1ULCBmaWcuaGVpZ2h0PTksIGZpZy53aWR0aD0xMiwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRQ0KDQojc2V0LnNlZWQoMTIzKQ0Ka20ucmVzID0ga21lYW5zKGRmLCAzLCBuc3RhcnQ9MjUpDQoja20ucmVzIDwtIGhrbWVhbnMoZGYsIDMsaGMubWV0aG9kID0gIndhcmQuRCIpDQpwcmludChrbS5yZXMpDQoNCiMgZnZpel9jbHVzdGVyKGttLnJlcywgcGFsZXR0ZSA9ICJEYXJrMiIsIHJlcGVsID0gVFJVRSwNCiMgICAgICAgICAgICAgIGdndGhlbWUgPSB0aGVtZV9jbGFzc2ljKCkpDQojIA0KIyBmdml6X2RlbmQoa20ucmVzLCBjZXggPSAwLjYsIHBhbGV0dGUgPSAiRGFyazIiLCANCiMgICAgICAgICAgIHJlY3QgPSBUUlVFLCByZWN0X2JvcmRlciA9ICJEYXJrMiIsIHJlY3RfZmlsbCA9IFRSVUUpDQoNCiMnIENyaWFuZG8gbm92byBiYW5jbyBkZSBkYWRvcyBjb20gY2x1c3Rlcg0KDQphZ2dyZWdhdGUoZGF0MiwgYnk9bGlzdChjbHVzdGVyPWttLnJlcyRjbHVzdGVyKSwgbWVhbikNCg0KZGQgPC0gY2JpbmQoZGF0MiwgY2x1c3RlciA9IGttLnJlcyRjbHVzdGVyKQ0KDQoNCmttLnJlcyRjbHVzdGVyDQprbS5yZXMkc2l6ZQ0Ka20ucmVzJGNlbnRlcnMNCg0KIycgVml6dWFsaXphbmRvIG9zIGNsdXN0ZXJzDQojKyBlY2hvPVQsIGZpZy5oZWlnaHQ9OSwgZmlnLndpZHRoPTEyLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFDQoNCg0KZnZpel9jbHVzdGVyKGttLnJlcywgZGF0YT1kZiwNCiAgICAgICAgICAgICBnZW9tLmluZCA9IGMoInRleHQiKSwNCiAgICAgICAgICAgICBlbGxpcHNlLnR5cGU9ImV1Y2xpZCIsDQogICAgICAgICAgICAgc3Rhci5wbG90PVQsDQogICAgICAgICAgICAgcGFsZXR0ZSA9ICJEYXJrMiIsDQogICAgICAgICAgICAgcmVwZWw9VFJVRSwNCiAgICAgICAgICAgICBmb250LmZhbWlseSA9ICJpdGFsaWMiLA0KICAgICAgICAgICAgIGdndGhlbWU9dGhlbWVfcHVicigpKQ0KDQoNCiMnIERlbmRyb2dyYW1hDQojKyBlY2hvPVQsIGZpZy5oZWlnaHQ9OSwgZmlnLndpZHRoPTEyLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFDQoNCmRpc3RhPWRpc3QoZGYsIG1ldGhvZCA9ICJldWNsaWQiKQ0KDQpkaXN0YS5oYz1oY2x1c3QoZD1kaXN0YSwgbWV0aG9kID0gIndhcmQuRCIpDQoNCmZ2aXpfZGVuZChkaXN0YS5oYyxjZXggPTAuNSwgayA9IDMsIGNvbG9yX2xhYmVsc19ieV9rID0gVFJVRSwgdHlwZSA9ICJyZWN0YW5nbGUiKQ0KZnZpel9kZW5kKGRpc3RhLmhjLGNleCA9MC44LCBrID0gMywgY29sb3JfbGFiZWxzX2J5X2sgPSBUUlVFLCB0eXBlID0gInBoeWxvZ2VuaWMiKQ0KZnZpel9kZW5kKGRpc3RhLmhjLGNleCA9MC41LCBrID0gMywgY29sb3JfbGFiZWxzX2J5X2sgPSBUUlVFLCB0eXBlID0gImNpcmN1bGFyIiwgbHdkID0gMSkNCg0KDQpmdml6X2Rpc3QoZGlzdGEsIGdyYWRpZW50ID0gbGlzdChsb3cgPSAiIzAwQUZCQiIsIG1pZCA9ICJ3aGl0ZSIsIGhpZ2ggPSAiI0ZDNEUwNyIpKSsgDQp0aGVtZShheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChmYWNlID0gIml0YWxpYyIpLA0KICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoZmFjZSA9ICJpdGFsaWMiKSkNCg0KIycgUENBDQojKyBlY2hvPVQsIGZpZy5oZWlnaHQ9OSwgZmlnLndpZHRoPTEyLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFDQoNCmttLnBjYSA8LSBQQ0EoDQogIGRmLA0KICBncmFwaCA9IEYsDQogIHNjYWxlLnVuaXQgPSBUUlVFKQ0KDQplaWcudmFsIDwtIGdldF9laWdlbnZhbHVlKGttLnBjYSkNCmVpZy52YWwNCg0KZnZpel9laWcoa20ucGNhLCBhZGRsYWJlbHM9VFJVRSkNCg0KdmFyIDwtIGdldF9wY2FfdmFyKGttLnBjYSkNCnZhcg0KDQoNCg0KIyAgQ29vcmRlbmFkYXMNCmhlYWQodmFyJGNvb3JkKQ0KIyBDb3MyOiBxdWFsaWRhZGUgbm8gbWFwYSBkbyBmYXRvcg0KaGVhZCh2YXIkY29zMikNCiMgQ29udHJpYnVpw6fDtWVzIHBhcmEgb3MgY29tcG9uZW50ZXMgcHJpbmNpcGFpcw0KaGVhZCh2YXIkY29udHJpYikNCg0KZnZpel9jb3MyKGttLnBjYSwgY2hvaWNlID0gInZhciIsIGF4ZXMgPSAxOjIpDQoNCmRmICU+JSBjb3IobWV0aG9kID0gInNwZWFybWFuIikgJT4lIGNvcnJwbG90KC4sDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2QgPSAibnVtYmVyIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPSAidXBwZXIiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGwucG9zID0gInRkIikNCg0KDQoNCg0Kc3VtbWFyeShrbS5wY2EpDQoNCg0KIyBDb250cmlidWnDp8O1ZXMgZGUgdmFyacOhdmVpcyBwYXJhIFBDMQ0KZnZpel9jb250cmliKGttLnBjYSwgY2hvaWNlID0gInZhciIsIGF4ZXMgPSAxLCB0b3AgPSAxMCkNCiMgQ29udHJpYnVpw6fDtWVzIGRlIHZhcmnDoXZlaXMgcGFyYSBQQzINCmZ2aXpfY29udHJpYihrbS5wY2EsIGNob2ljZSA9ICJ2YXIiLCBheGVzID0gMiwgdG9wID0gMTApDQoNCiMgY29udHJpYnVpw6fDo28gdG90YWwgcGFyYSBQQzEgZSBQQzIgDQoNCmZ2aXpfY29udHJpYihrbS5wY2EsIGNob2ljZSA9ICJ2YXIiLCBheGVzID0gMToyKQ0KDQoNCmZ2aXpfcGNhX2JpcGxvdCgNCiAga20ucGNhLA0KICBnZW9tLmluZCA9ICJ0ZXh0IiwNCiAgY29sLnZhciA9ICJjb250cmliIiwNCiAgZ3JhZGllbnQuY29scyA9IGMoIiMwMEFGQkIiLCAiI0U3QjgwMCIsICIjRkM0RTA3IiksDQogIGxlZ2VuZC50aXRsZSA9ICJDb250cmlidWnDp8OjbyIsDQogIHBhbGV0dGUgPSAiRGFyazIiLA0KICByZXBlbCA9IEYNCikNCg0KDQpmdml6X3BjYV9pbmQoDQogIGttLnBjYSwNCiAgZ2VvbSA9ICJ0ZXh0IiwNCiAgaGFiaWxsYWdlID0gYXMuZmFjdG9yKGRkJGNsdXN0ZXIpLA0KICBhZGRFbGxpcHNlcyA9IFRSVUUsDQogIHJlcGVsID0gVCwNCiAgcGFsZXR0ZSA9ICJEYXJrMiINCikNCg0KZnZpel9wY2FfaW5kKGttLnBjYSwNCiAgICAgICAgICAgICBnZW9tLmluZCA9ICJ0ZXh0IiwNCiAgICAgICAgICAgICBjb2wuaW5kID0gYXMuZmFjdG9yKGRkJGNsdXN0ZXIpLA0KICAgICAgICAgICAgIGFkZEVsbGlwc2VzID0gVFJVRSwgDQogICAgICAgICAgICAgbGVnZW5kLnRpdGxlID0gIkdydXBvcyIsDQogICAgICAgICAgICAgcmVwZWwgPSBULA0KICAgICAgICAgICAgIHBhbGV0dGUgPSAiRGFyazIiDQopDQoNCg0KDQpkZiAlPiUgcGFpcnMucGFuZWxzKC4sIA0KICAgICAgICAgICAgICAgICAgICBzaG93LnBvaW50cz1UUlVFLCANCiAgICAgICAgICAgICAgICAgICAgbWV0aG9kID0gInNwZWFybWFuIiwNCiAgICAgICAgICAgICAgICAgICAgZ2FwPTAsIA0KICAgICAgICAgICAgICAgICAgICBzdGFycz1UUlVFLA0KICAgICAgICAgICAgICAgICAgICBjaT1GQUxTRSwNCiAgICAgICAgICAgICAgICAgICAgYWxwaGE9MC4wNSwNCiAgICAgICAgICAgICAgICAgICAgY2V4LmNvcj0xLA0KICAgICAgICAgICAgICAgICAgICBjZXg9MS4wLA0KICAgICAgICAgICAgICAgICAgICBicmVha3M9IlN0dXJnZXMiLA0KICAgICAgICAgICAgICAgICAgICBydWc9RkFMU0UsDQogICAgICAgICAgICAgICAgICAgIGRlbnNpdHk9RiwNCiAgICAgICAgICAgICAgICAgICAgaGlzdC5jb2w9ImRhcmtncmVlbiIsDQogICAgICAgICAgICAgICAgICAgIGZhY3Rvcj01LA0KICAgICAgICAgICAgICAgICAgICBkaWdpdHM9MiwNCiAgICAgICAgICAgICAgICAgICAgZWxsaXBzZXM9RkFMU0UsDQogICAgICAgICAgICAgICAgICAgIHNjYWxlPUZBTFNFLA0KICAgICAgICAgICAgICAgICAgICBzbW9vdGg9VFJVRSwNCiAgICAgICAgICAgICAgICAgICAgbG09VCwNCiAgICAgICAgICAgICAgICAgICAgY29yPVQNCikgDQoNCg0KZGQucGNhID0gcHJjb21wKGRmLCBzY2FsZSA9IFQpDQoNCg0KZ2diaXBsb3QyKA0KICBkZC5wY2EsDQogIG9icy5zY2FsZSA9IDEsDQogIHZhci5zY2FsZSA9IDEsDQogIGVsbGlwc2UgPSBULA0KICBjaXJjbGUgPSBULA0KICB2YXJuYW1lLmFiYnJldiA9IFQsDQogIGdydXBvcyA9IGFzLmZhY3RvcihkZCRjbHVzdGVyKQ0KKSArIHRoZW1lX3B1YnIoKSArIHNjYWxlX2NvbG9yX2JyZXdlciggcGFsZXR0ZSA9ICdEYXJrMicpDQoNCg0KaW5kIDwtIGdldF9wY2FfaW5kKGttLnBjYSkNCmluZA0KDQoNCiMgQ29vcmRlbmFkYXMgZGUgaW5kaXbDrWR1b3MNCmhlYWQoaW5kJGNvb3JkKQ0KIyBRdWFsaWRhZGUgZG9zIGluZGl2w61kdW9zDQpoZWFkKGluZCRjb3MyKQ0KIyBDb250cmlidWnDp8O1ZXMgZGUgaW5kaXbDrWR1b3MNCmhlYWQoaW5kJGNvbnRyaWIpDQoNCg0KDQpmdml6X3BjYV9pbmQoa20ucGNhLCBjb2wuaW5kID0gImNvczIiLCANCiAgICAgICAgICAgICBncmFkaWVudC5jb2xzID0gYygiIzAwQUZCQiIsICIjRTdCODAwIiwgIiNGQzRFMDciKSwNCiAgICAgICAgICAgICByZXBlbCA9IFRSVUUNCikNCg0KZnZpel9jb250cmliKGttLnBjYSwgY2hvaWNlID0gImluZCIsIGF4ZXMgPSAxOjIpDQoNCg0Kc2V0LnNlZWQoMTIzKQ0KbXkuY29udC52YXIgPC0gcm5vcm0oMzUpDQoNCmZ2aXpfcGNhX2luZChrbS5wY2EsIGNvbC5pbmQgPSBteS5jb250LnZhciwNCiAgICAgICAgICAgICBncmFkaWVudC5jb2xzID0gYygiYmx1ZSIsICJ5ZWxsb3ciLCAicmVkIiksDQogICAgICAgICAgICAgbGVnZW5kLnRpdGxlID0gIkNvbnQuVmFyIikNCg0KDQpmdml6X3BjYV9pbmQoa20ucGNhLA0KICAgICAgICAgICAgIGdlb20uaW5kID0gInBvaW50IiwNCiAgICAgICAgICAgICBjb2wuaW5kID0gYXMuZmFjdG9yKGRkJGNsdXN0ZXIpLA0KICAgICAgICAgICAgIHBhbGV0dGUgPSAiRGFyazIiLA0KICAgICAgICAgICAgIGFkZEVsbGlwc2VzID0gVFJVRSwgDQogICAgICAgICAgICAgbGVnZW5kLnRpdGxlID0gIkdydXBvcyINCikNCg0KDQpmdml6X3BjYV9iaXBsb3Qoa20ucGNhLCANCiAgICAgICAgICAgICAgICBnZW9tLmluZCA9IGMoInBvaW50IiwidGV4dCIpLA0KICAgICAgICAgICAgICAgIGZpbGwuaW5kID0gYXMuZmFjdG9yKGRkJGNsdXN0ZXIpLCANCiAgICAgICAgICAgICAgICBjb2wuaW5kID0gImJsYWNrIiwNCiAgICAgICAgICAgICAgICBwb2ludHNoYXBlID0gMjEsIA0KICAgICAgICAgICAgICAgIHBvaW50c2l6ZSA9IDIsDQogICAgICAgICAgICAgICAgcGFsZXR0ZSA9ICJEYXJrMiIsDQogICAgICAgICAgICAgICAgcmVwZWw9RiwNCiAgICAgICAgICAgICAgICBsYWJlbHNpemU9MywNCiAgICAgICAgICAgICAgICBhZGRFbGxpcHNlcyA9IEYsDQogICAgICAgICAgICAgICAgYWxwaGEudmFyID0iY29udHJpYiIsIA0KICAgICAgICAgICAgICAgIGNvbC52YXIgPSAiY29udHJpYiIsDQogICAgICAgICAgICAgICAgZ3JhZGllbnQuY29scyA9IGMoIiMwMEFGQkIiLCAiI0U3QjgwMCIsICIjRkM0RTA3IiksDQogICAgICAgICAgICAgICAgbGVnZW5kLnRpdGxlID0gbGlzdChmaWxsID0gIkNsdXN0ZXIiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3IgPSAiQ29udHJpYiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYSA9ICJDb250cmliIikpDQoNCg0KDQoNCg0KIycgDQojJyAjIyAqKlJlZmVyw6puY2lhKioNCiMnIE9zIHByb2NlZGltZW50b3MgZXN0YXTDrXN0aWNvcyB1dGlsaXphZG9zIG5lc3RlIGVzdHVkbyBmb3JhbSByZWFsaXphZG9zIG5vIHByb2dyYW1hIFIgW0BSQ29yZVRlYW1dLiBQYWNvdGUgJ3N0YXRzJzogQ29lZmljaWVudGUgZGUgY29ycmVsYcOnw6NvIGRlIFNwZWFybWFuIFtAUkNvcmVUZWFtXS4gUGFjb3RlICcqZ2dwb3QyKic6IGVsZW1lbnRvcyBncsOhZmljb3MgW0BHR1Bsb3QyXS4NCmFudGl0YWINCmFudGl0YWIyDQoNCg0KDQoNCndyaXRlLnhsc3goYW50aXRhYiwgImFudGkueGxzeCIpDQp3cml0ZS54bHN4KGFudGl0YWIyLCAiYW50aTIueGxzeCIpDQoNCg==