This R Markdown notebook, describes how to access and visualize Infodengue’s datasets using the R language. For more information about the data and how to cite them, visit here.

To execute this notebook, the following libraries are necessary:

suppressPackageStartupMessages(library(tidyverse))

Data query

As tabelas geradas pelo Infodengue contem dados agregados por semana provenientes de diferentes fontes. Elas podem ser consultadas via formulário, ou diretamente do R, por meio de uma consulta à API.

Infodengue’s tables have data aggregated by week, provided by different sources. They could be consulted by a form, or directly from R, via consult of an API.

This functionality is available via the URL: https://info.dengue.mat.br/api/alertcity?params: must contain the following parameters:

geocode: city's IBGE code
disease: desease type to be consulted (str:dengue|chikungunya|zika)
format: file extension/format (str:json|csv)
ew_start: epidemiological week initial consultation (int:1-53)
ew_end: epidemiological week final consultation (int:1-53)
ey_start: year of initial consultation  (int:0-9999)
ey_end: year of final consultation  (int:0-9999)

Every parameter mentioned so far is obligatory for the consultation. The following example shows the requisition of the register of dengue between 1 and 52 of the year 2020, in Rio de Janeiro (geocodigo = 3304557) on CSV: :

https://info.dengue.mat.br/api/alertcity?geocode=3304557&disease=dengue&format=csv&ew_start=1&ew_end=52&ey_start=2020&ey_end=2020

How to do it using R?

1. Define the parameters

Verify if the consult is correct:

url <- "https://info.dengue.mat.br/api/alertcity?"
geocode <- 3304557
disease <- "dengue"
format <- "csv"
ew_start <- 1
ew_end <- 52
ey_start <- 2021
ey_end <- 2021

# do not change
cons1 <- paste0(url,"geocode=",geocode,"&disease=",disease,"&format=",format,"&ew_start=",ew_start,"&ew_end=",ew_end,"&ey_start=",ey_start,"&ey_end=",ey_end)
cons1
[1] "https://info.dengue.mat.br/api/alertcity?geocode=3304557&disease=dengue&format=csv&ew_start=1&ew_end=52&ey_start=2021&ey_end=2021"

2. Consulting:

dados <- read_csv(cons1, show_col_types=FALSE) %>% arrange(data_iniSE)
glimpse(dados)
Rows: 40
Columns: 21
$ data_iniSE       <date> 2021-01-03, 2021-01-10, 2021-01-17, 2021-01-24, 2021-01-31, 202…
$ SE               <dbl> 202101, 202102, 202103, 202104, 202105, 202106, 202107, 202108, …
$ casos_est        <dbl> 9, 11, 14, 30, 18, 17, 17, 25, 23, 32, 36, 43, 47, 74, 64, 41, 4…
$ casos_est_min    <dbl> 9, 11, 14, 30, 18, 17, 17, 25, 23, 32, 36, 43, 47, 74, 64, 41, 4…
$ casos_est_max    <dbl> 9, 11, 14, 30, 18, 17, 17, 25, 23, 32, 36, 43, 47, 74, 64, 41, 4…
$ casos            <dbl> 9, 11, 14, 30, 18, 17, 17, 25, 23, 32, 36, 43, 47, 74, 64, 41, 4…
$ p_rt1            <dbl> 0.64216300, 0.73637200, 0.82569900, 0.99771600, 0.56761300, 0.24…
$ p_inc100k        <dbl> 0.133377, 0.163016, 0.207475, 0.444588, 0.266753, 0.251933, 0.25…
$ Localidade_id    <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0…
$ nivel            <dbl> 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1…
$ id               <dbl> 3.304557e+17, 3.304557e+17, 3.304557e+17, 3.304557e+17, 3.304557…
$ versao_modelo    <date> 2021-10-13, 2021-10-13, 2021-10-13, 2021-10-13, 2021-10-13, 202…
$ Rt               <dbl> 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1…
$ pop              <dbl> 6747815, 6747815, 6747815, 6747815, 6747815, 6747815, 6747815, 6…
$ tempmin          <dbl> 24, 24, 24, 25, 24, 22, 24, 23, 24, 23, 24, 24, 23, 21, 20, 20, …
$ umidmax          <dbl> 90, 89, 84, 80, 85, 90, 95, 95, 90, 96, 93, 91, 93, 94, 92, 92, …
$ receptivo        <dbl> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0…
$ transmissao      <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0…
$ nivel_inc        <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0…
$ notif_accum_year <dbl> 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032…

The data table

The available variables are:

3. Plotting examples

suppressPackageStartupMessages(library(ggTimeSeries))
library(ggplot2)

#Weekly count of reported cases of dengue in the city of Rio de Janeiro. Arrows indicate weekly variation.
p1 <- ggplot_waterfall(dados,'SE','casos', nArrowSize = 0.8)
p1 + scale_fill_manual(
     values = c("forestgreen", "blue", "darkred"),
     labels = c("4wd", "front", " rear")) +
     xlab("Epidemiological Week")+
     ylab("Reported Cases")+
     scale_x_continuous(breaks=dados$SE)+
     theme_light() +
     theme(legend.position="none",axis.text.x = element_text(angle = 45,size=23, hjust = 1), 
           axis.text.y = element_text(size=23),axis.title= element_text(size=30))

suppressPackageStartupMessages(library(plotly))

#Reported cases and estimated cases
p2 <- plot_ly(dados,x = ~as.factor(SE))
p2 <- p2 %>% add_bars(y = ~casos, type = 'bar',
                      name = "Reported cases",
                      text = "Reported cases",
                      marker = list(color = 'lightblue'),
                      hovertemplate = paste("Date:",dados$data_iniSE,"<br>",
                                            "%{xaxis.title.text}: %{x}<br>",
                                            "%{text}: %{y}<br>"))%>%
             add_lines(y = ~casos_est, name = "Estimated cases",text = "Estimated cases",line =list(dash = "linear", color="blue"),
                       hovertemplate = paste("Date:",dados$data_iniSE,"<br>",
                                             "%{xaxis.title.text}: %{x}<br>",
                                             "%{text}: %{y}<br>")) %>%
             add_lines(y = ~casos_est_min, name = "Minimum Interval of the estimated cases",text = "Minimum Interval of the estimated cases", line=list(dash = "dot", color="black"),
                       hovertemplate = paste("Date:",dados$data_iniSE,"<br>",
                                             "%{xaxis.title.text}: %{x}<br>",
                                             "%{text}: %{y}<br>")) %>%
             add_lines(y = ~casos_est_max,name = "Maximum Interval of the estimated cases",text = "Maximum Interval of the estimated cases", line =list(dash ="dot", color="black"),
                       hovertemplate = paste("Date:",dados$data_iniSE,"<br>",
                                             "%{xaxis.title.text}: %{x}<br>",
                                             "%{text}: %{y}<br>")) %>%
            layout(title = list(text = "Total reported and estimated cases for Rio de Janeiro", x = 0),
                   xaxis = list(title = "Epidemiological Week",
                                tick0=202101, dtick=1,tickangle=315,tickfont = list( size=12)),
                   yaxis = list(title = "Number of cases"))

p2 %>% layout(legend = list(orientation="h", x = 0.5, y = 1,
                            legend.background = element_rect(fill = "transparent")))
LS0tCnRpdGxlOiAiSW5mb2Rlbmd1ZSIKYXV0aG9yOiAiW2luZm8uZGVuZ3VlLm1hdC5icl0oaHR0cDovL2luZm8uZGVuZ3VlLm1hdC5icikiIApvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKLS0tCgpgYGB7ciBpbmNsdWRlID0gRkFMU0V9IAprbml0cjo6b3B0c19jaHVuayRzZXQobWVzc2FnZSAgPSBGQUxTRSAsIHdhcm5pbmc9RkFMU0UpCmBgYAoKClRoaXMgW1IgTWFya2Rvd25dKGh0dHA6Ly9ybWFya2Rvd24ucnN0dWRpby5jb20pIG5vdGVib29rLCBkZXNjcmliZXMgaG93IHRvIGFjY2VzcyBhbmQgdmlzdWFsaXplIEluZm9kZW5ndWUncyBkYXRhc2V0cyB1c2luZyB0aGUgUiBsYW5ndWFnZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGRhdGEgYW5kIGhvdyB0byBjaXRlIHRoZW0sIHZpc2l0IFtoZXJlXShodHRwczovL2luZm8uZGVuZ3VlLm1hdC5ici9pbmZvcm1hY29lcykuCgpUbyBleGVjdXRlIHRoaXMgbm90ZWJvb2ssIHRoZSBmb2xsb3dpbmcgbGlicmFyaWVzIGFyZSBuZWNlc3Nhcnk6CgpgYGB7cn0Kc3VwcHJlc3NQYWNrYWdlU3RhcnR1cE1lc3NhZ2VzKGxpYnJhcnkodGlkeXZlcnNlKSkKYGBgCgojIyBEYXRhIHF1ZXJ5CgpBcyB0YWJlbGFzIGdlcmFkYXMgcGVsbyBJbmZvZGVuZ3VlIGNvbnRlbSBkYWRvcyBhZ3JlZ2Fkb3MgcG9yIHNlbWFuYSBwcm92ZW5pZW50ZXMgZGUgZGlmZXJlbnRlcyBmb250ZXMuIEVsYXMgcG9kZW0gc2VyIGNvbnN1bHRhZGFzIHZpYSBbZm9ybXVsw6FyaW9dKGh0dHBzOi8vaW5mby5kZW5ndWUubWF0LmJyL3NlcnZpY2VzL2FwaSksIG91IGRpcmV0YW1lbnRlIGRvIFIsIHBvciBtZWlvIGRlIHVtYSBjb25zdWx0YSDDoCBBUEkuCgpJbmZvZGVuZ3VlJ3MgdGFibGVzIGhhdmUgZGF0YSBhZ2dyZWdhdGVkIGJ5IHdlZWssIHByb3ZpZGVkIGJ5IGRpZmZlcmVudCBzb3VyY2VzLiBUaGV5IGNvdWxkIGJlIGNvbnN1bHRlZCBieSBhIFtmb3JtXShodHRwczovL2luZm8uZGVuZ3VlLm1hdC5ici9zZXJ2aWNlcy9hcGkpLCBvciBkaXJlY3RseSBmcm9tIFIsIHZpYSBjb25zdWx0IG9mIGFuIEFQSS4gCgpUaGlzIGZ1bmN0aW9uYWxpdHkgaXMgYXZhaWxhYmxlIHZpYSB0aGUgVVJMOiBodHRwczovL2luZm8uZGVuZ3VlLm1hdC5ici9hcGkvYWxlcnRjaXR5P3BhcmFtczogbXVzdCBjb250YWluIHRoZSBmb2xsb3dpbmcgcGFyYW1ldGVyczoKCgogICAgZ2VvY29kZTogY2l0eSdzIElCR0UgY29kZQogICAgZGlzZWFzZTogZGVzZWFzZSB0eXBlIHRvIGJlIGNvbnN1bHRlZCAoc3RyOmRlbmd1ZXxjaGlrdW5ndW55YXx6aWthKQogICAgZm9ybWF0OiBmaWxlIGV4dGVuc2lvbi9mb3JtYXQgKHN0cjpqc29ufGNzdikKICAgIGV3X3N0YXJ0OiBlcGlkZW1pb2xvZ2ljYWwgd2VlayBpbml0aWFsIGNvbnN1bHRhdGlvbiAoaW50OjEtNTMpCiAgICBld19lbmQ6IGVwaWRlbWlvbG9naWNhbCB3ZWVrIGZpbmFsIGNvbnN1bHRhdGlvbiAoaW50OjEtNTMpCiAgICBleV9zdGFydDogeWVhciBvZiBpbml0aWFsIGNvbnN1bHRhdGlvbiAgKGludDowLTk5OTkpCiAgICBleV9lbmQ6IHllYXIgb2YgZmluYWwgY29uc3VsdGF0aW9uICAoaW50OjAtOTk5OSkKCkV2ZXJ5IHBhcmFtZXRlciBtZW50aW9uZWQgc28gZmFyIGlzIG9ibGlnYXRvcnkgZm9yIHRoZSBjb25zdWx0YXRpb24uIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSBzaG93cyB0aGUgcmVxdWlzaXRpb24gb2YgdGhlIHJlZ2lzdGVyIG9mIGRlbmd1ZSBiZXR3ZWVuIDEgYW5kIDUyIG9mIHRoZSB5ZWFyIDIwMjAsIGluIFJpbyBkZSBKYW5laXJvIChnZW9jb2RpZ28gPSAzMzA0NTU3KSBvbiBDU1Y6IDoKCmh0dHBzOi8vaW5mby5kZW5ndWUubWF0LmJyL2FwaS9hbGVydGNpdHk/Z2VvY29kZT0zMzA0NTU3JmRpc2Vhc2U9ZGVuZ3VlJmZvcm1hdD1jc3YmZXdfc3RhcnQ9MSZld19lbmQ9NTImZXlfc3RhcnQ9MjAyMCZleV9lbmQ9MjAyMAoKKipIb3cgdG8gZG8gaXQgdXNpbmcgUj8qKiAKCioqMS4gRGVmaW5lIHRoZSBwYXJhbWV0ZXJzKioKClZlcmlmeSBpZiB0aGUgY29uc3VsdCBpcyBjb3JyZWN0OgoKYGBge3J9CnVybCA8LSAiaHR0cHM6Ly9pbmZvLmRlbmd1ZS5tYXQuYnIvYXBpL2FsZXJ0Y2l0eT8iCmdlb2NvZGUgPC0gMzMwNDU1NwpkaXNlYXNlIDwtICJkZW5ndWUiCmZvcm1hdCA8LSAiY3N2Igpld19zdGFydCA8LSAxCmV3X2VuZCA8LSA1MgpleV9zdGFydCA8LSAyMDIxCmV5X2VuZCA8LSAyMDIxCgojIGRvIG5vdCBjaGFuZ2UKY29uczEgPC0gcGFzdGUwKHVybCwiZ2VvY29kZT0iLGdlb2NvZGUsIiZkaXNlYXNlPSIsZGlzZWFzZSwiJmZvcm1hdD0iLGZvcm1hdCwiJmV3X3N0YXJ0PSIsZXdfc3RhcnQsIiZld19lbmQ9Iixld19lbmQsIiZleV9zdGFydD0iLGV5X3N0YXJ0LCImZXlfZW5kPSIsZXlfZW5kKQpjb25zMQpgYGAKKioyLiBDb25zdWx0aW5nOioqCgoKYGBge3J9CmRhZG9zIDwtIHJlYWRfY3N2KGNvbnMxLCBzaG93X2NvbF90eXBlcz1GQUxTRSkgJT4lIGFycmFuZ2UoZGF0YV9pbmlTRSkKZ2xpbXBzZShkYWRvcykKYGBgCgojIyBUaGUgZGF0YSB0YWJsZQoKVGhlIGF2YWlsYWJsZSB2YXJpYWJsZXMgYXJlOgoKLSBkYXRhX2luaVNFOiBGaXJzdCBkYXkgb2YgdGhlIGVwaWRlbWlvbG9naWNhbCB3ZWVrIChTdW5kYXkpOwotIFNFOiBlcGlkZW1pb2xvZ2ljYWwgd2VlazsKLSBjYXNvc19lc3Q6IEVzdGltYXRlZCBudW1iZXIgb2YgY2FzZXMgcGVyIHdlZWsgdXNpbmcgdGhlIG5vd2Nhc3RpbmcgbW9kZWwgKG5vdGU6IFZhbHVlcyBhcmUgdXBkYXRlZCByZXRyb3NwZWN0aXZlbHkgZXZlcnkgd2Vlayk7Ci0gY2Fzb3NfZXN0X21pbiBlIGNhc29zX2VzdF9tYXg6IDk1JSBjcmVkaWJpbGl0eSBpbnRlcnZhbCBvZiB0aGUgZXN0aW1hdGVkIG51bWJlciBvZiBjYXNlczsKLSBjYXNvczogTnVtYmVyIG9mIHJlcG9ydGVkIGNhc2VzIHBlciB3ZWVrIChWYWx1ZXMgYXJlIHVwZGF0ZWQgcmV0cm9zcGVjdGl2ZWx5IGV2ZXJ5IHdlZWspOwotIHBfcnQxOiBQcm9iYWJpbGl0eSBvZiAoUnQ+IDEpLiBGb3IgaXNzdWluZyB0aGUgb3JhbmdlIGFsZXJ0LCB3ZSB1c2UgY3JpdGVyaW9uIHBfcnQxID4gMC45NSBmb3IgMyB3ZWVrcyBvciBtb3JlOwotIHBfaW5jMTAwazogRXN0aW1hdGVkIGluY2lkZW5jZSByYXRlIHBlciAxMDAsMDAwOwotIExvY2FsaWRhZGVfaWQ6IFN1Yi1tdW5pY2lwYWxpdHkgZGl2aXNpb24gKGN1cnJlbnRseSBpbXBsZW1lbnRlZCBvbmx5IGluIFJpbyBkZSBKYW5laXJvKTsKLSBuaXZlbDogQWxlcnQgbGV2ZWwgKDEgPSBncmVlbiwgMiA9IHllbGxvdywgMyA9IG9yYW5nZSwgNCA9IHJlZCk7Ci0gaWQ6IE51bWVyaWNhbCBpbmRleDsKLSB2ZXJzYW9fbW9kZWxvOiBNb2RlbCB2ZXJzaW9uIChpbnRlcm5hbCB1c2UpOwotIHR3ZWV0OiBOdW1iZXIgb2YgbWVzc2FnZXMgbWVudGlvbmluZyBkZW5ndWUgc3ltcHRvbXMgd2l0aGluIGdlb2xvY2F0ZWQgdHdlZXRzLiBTb3VyY2U6IERlbmd1ZSBPYnNlcnZhdG9yeSAvIFVGTUc7Ci0gUnQ6IFBvaW50IGVzdGltYXRlIG9mIHRoZSByZXByb2R1Y3RpdmUgbnVtYmVyIG9mIGNhc2VzLCBzZWUgKEtub3cgbW9yZSk7Ci0gcG9wOiBlc3RpbWF0ZWQgcG9wdWxhdGlvbiAoSUJHRSk7Ci0gdGVtcG1pbjogYXZlcmFnZSBvZiB0aGUgZGFpbHkgbWluaW11bSB0ZW1wZXJhdHVyZXMgYWxvbmcgdGhlIHdlZWs7Ci0gdW1pZG1heDogYXZlcmFnZSBvZiB0aGUgZGFpbHkgbWF4aW11bSByZWxhdGl2ZSBhaXIgaHVtaWRpdHkgYWxvbmcgdGhlIHdlZWs7Ci0gcmVjZXB0aXZvOiBpbmRpY2F0ZXMgY2xpbWF0ZSByZWNlcHRpdml0eSwgaS5lLiwgY29uZGl0aW9ucyBmb3IgaGlnaCB2ZWN0b3JpYWwgY2FwYWNpdHkuIDAgPSAtIC0gdW5mYXZvcmFibGUsIDEgPSBmYXZvcmFibGUsIDIgPSBmYXZvcmFibGUgdGhpcyB3ZWVrIGFuZCBsYXN0IHdlZWssIDMgPSBmYXZvcmFibGUgZm9yIGF0IGxlYXN0IC0gdGhyZWUgd2Vla3MgKHN1ZmZpY2llbnQgZm9yIGNvbXBsZXRpbmcgYSB0cmFuc21pc3Npb24gY3ljbGUpOwotIHRyYW5zbWlzc2FvOiBldmlkZW5jZSBvZiBzdXN0YWluZWQgdHJhbnNtaXNzaW9uOiAwID0gbm8gZXZpZGVuY2UsIDEgPSBwb3NzaWJsZSwgMiA9IGxpa2VseSwgMyA9IGhpZ2hseSBsaWtlbHk7Ci0gbml2ZWxfaW5jOiBFc3RpbWF0ZWQgaW5jaWRlbmNlIGJlbG93IHRoZSBwcmUtZXBpZGVtaWMgdGhyZXNob2xkLCAxID0gYWJvdmUgdGhlIHByZS1lcGlkZW1pYyB0aHJlc2hvbGQsIGJ1dCBiZWxvdyB0aGUgZXBpZGVtaWMgdGhyZXNob2xkLCAyID0gYWJvdmUgdGhlIGVwaWRlbWljIHRocmVzaG9sZDsKLSBub3RpZl9hY2N1bV95ZWFyOiBhY2N1bXVsYXRlZCBudW1iZXIgb2YgY2FzZXMgcGVyIHllYXI7CgoqKjMuIFBsb3R0aW5nIGV4YW1wbGVzKioKCmBgYHtyICwgZmlnLndpZHRoID0gMjUsIGZpZy5oZWlnaHQ9MTJ9CnN1cHByZXNzUGFja2FnZVN0YXJ0dXBNZXNzYWdlcyhsaWJyYXJ5KGdnVGltZVNlcmllcykpCmxpYnJhcnkoZ2dwbG90MikKCiNXZWVrbHkgY291bnQgb2YgcmVwb3J0ZWQgY2FzZXMgb2YgZGVuZ3VlIGluIHRoZSBjaXR5IG9mIFJpbyBkZSBKYW5laXJvLiBBcnJvd3MgaW5kaWNhdGUgd2Vla2x5IHZhcmlhdGlvbi4KcDEgPC0gZ2dwbG90X3dhdGVyZmFsbChkYWRvcywnU0UnLCdjYXNvcycsIG5BcnJvd1NpemUgPSAwLjgpCnAxICsgc2NhbGVfZmlsbF9tYW51YWwoCiAgICAgdmFsdWVzID0gYygiZm9yZXN0Z3JlZW4iLCAiYmx1ZSIsICJkYXJrcmVkIiksCiAgICAgbGFiZWxzID0gYygiNHdkIiwgImZyb250IiwgIiByZWFyIikpICsKICAgICB4bGFiKCJFcGlkZW1pb2xvZ2ljYWwgV2VlayIpKwogICAgIHlsYWIoIlJlcG9ydGVkIENhc2VzIikrCiAgICAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcz1kYWRvcyRTRSkrCiAgICAgdGhlbWVfbGlnaHQoKSArCiAgICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJub25lIixheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LHNpemU9MjMsIGhqdXN0ID0gMSksIAogICAgICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemU9MjMpLGF4aXMudGl0bGU9IGVsZW1lbnRfdGV4dChzaXplPTMwKSkKYGBgCgpgYGB7ciAgLCBmaWcud2lkdGggPSA5LjUsIGZpZy5oZWlnaHQ9NX0Kc3VwcHJlc3NQYWNrYWdlU3RhcnR1cE1lc3NhZ2VzKGxpYnJhcnkocGxvdGx5KSkKCiNSZXBvcnRlZCBjYXNlcyBhbmQgZXN0aW1hdGVkIGNhc2VzCnAyIDwtIHBsb3RfbHkoZGFkb3MseCA9IH5hcy5mYWN0b3IoU0UpKQpwMiA8LSBwMiAlPiUgYWRkX2JhcnMoeSA9IH5jYXNvcywgdHlwZSA9ICdiYXInLAogICAgICAgICAgICAgICAgICAgICAgbmFtZSA9ICJSZXBvcnRlZCBjYXNlcyIsCiAgICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gIlJlcG9ydGVkIGNhc2VzIiwKICAgICAgICAgICAgICAgICAgICAgIG1hcmtlciA9IGxpc3QoY29sb3IgPSAnbGlnaHRibHVlJyksCiAgICAgICAgICAgICAgICAgICAgICBob3ZlcnRlbXBsYXRlID0gcGFzdGUoIkRhdGU6IixkYWRvcyRkYXRhX2luaVNFLCI8YnI+IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXt4YXhpcy50aXRsZS50ZXh0fTogJXt4fTxicj4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIle3RleHR9OiAle3l9PGJyPiIpKSU+JQogICAgICAgICAgICAgYWRkX2xpbmVzKHkgPSB+Y2Fzb3NfZXN0LCBuYW1lID0gIkVzdGltYXRlZCBjYXNlcyIsdGV4dCA9ICJFc3RpbWF0ZWQgY2FzZXMiLGxpbmUgPWxpc3QoZGFzaCA9ICJsaW5lYXIiLCBjb2xvcj0iYmx1ZSIpLAogICAgICAgICAgICAgICAgICAgICAgIGhvdmVydGVtcGxhdGUgPSBwYXN0ZSgiRGF0ZToiLGRhZG9zJGRhdGFfaW5pU0UsIjxicj4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXt4YXhpcy50aXRsZS50ZXh0fTogJXt4fTxicj4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXt0ZXh0fTogJXt5fTxicj4iKSkgJT4lCiAgICAgICAgICAgICBhZGRfbGluZXMoeSA9IH5jYXNvc19lc3RfbWluLCBuYW1lID0gIk1pbmltdW0gSW50ZXJ2YWwgb2YgdGhlIGVzdGltYXRlZCBjYXNlcyIsdGV4dCA9ICJNaW5pbXVtIEludGVydmFsIG9mIHRoZSBlc3RpbWF0ZWQgY2FzZXMiLCBsaW5lPWxpc3QoZGFzaCA9ICJkb3QiLCBjb2xvcj0iYmxhY2siKSwKICAgICAgICAgICAgICAgICAgICAgICBob3ZlcnRlbXBsYXRlID0gcGFzdGUoIkRhdGU6IixkYWRvcyRkYXRhX2luaVNFLCI8YnI+IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiV7eGF4aXMudGl0bGUudGV4dH06ICV7eH08YnI+IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiV7dGV4dH06ICV7eX08YnI+IikpICU+JQogICAgICAgICAgICAgYWRkX2xpbmVzKHkgPSB+Y2Fzb3NfZXN0X21heCxuYW1lID0gIk1heGltdW0gSW50ZXJ2YWwgb2YgdGhlIGVzdGltYXRlZCBjYXNlcyIsdGV4dCA9ICJNYXhpbXVtIEludGVydmFsIG9mIHRoZSBlc3RpbWF0ZWQgY2FzZXMiLCBsaW5lID1saXN0KGRhc2ggPSJkb3QiLCBjb2xvcj0iYmxhY2siKSwKICAgICAgICAgICAgICAgICAgICAgICBob3ZlcnRlbXBsYXRlID0gcGFzdGUoIkRhdGU6IixkYWRvcyRkYXRhX2luaVNFLCI8YnI+IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiV7eGF4aXMudGl0bGUudGV4dH06ICV7eH08YnI+IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiV7dGV4dH06ICV7eX08YnI+IikpICU+JQogICAgICAgICAgICBsYXlvdXQodGl0bGUgPSBsaXN0KHRleHQgPSAiVG90YWwgcmVwb3J0ZWQgYW5kIGVzdGltYXRlZCBjYXNlcyBmb3IgUmlvIGRlIEphbmVpcm8iLCB4ID0gMCksCiAgICAgICAgICAgICAgICAgICB4YXhpcyA9IGxpc3QodGl0bGUgPSAiRXBpZGVtaW9sb2dpY2FsIFdlZWsiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpY2swPTIwMjEwMSwgZHRpY2s9MSx0aWNrYW5nbGU9MzE1LHRpY2tmb250ID0gbGlzdCggc2l6ZT0xMikpLAogICAgICAgICAgICAgICAgICAgeWF4aXMgPSBsaXN0KHRpdGxlID0gIk51bWJlciBvZiBjYXNlcyIpKQoKcDIgJT4lIGxheW91dChsZWdlbmQgPSBsaXN0KG9yaWVudGF0aW9uPSJoIiwgeCA9IDAuNSwgeSA9IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWdlbmQuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gInRyYW5zcGFyZW50IikpKQpgYGAKCgoK