library(tidyverse)
library(here)
library(cowplot)
theme_set(theme_bw())

Olá a todos! Esse notebook é uma continuação da serie de análise do clima de algumas cidades da Paraiba. Dentre elas, selecionamos os dados das seguinte cidades:

Campina Grande Patos João Pessoa

Para rever a parte 1, clique aqui

Vamos começar carregando nossos dados

# SEMPRE read_csv NUNCA read.csv
clima_tudo = read_csv(
    here("data/tempo-jp-cg-pt.csv"),
    col_types = cols(
        .default = col_double(),
        cidade = col_character(),
        semana = col_date(format = ""),
        ano = col_integer(),
        mes = col_integer()
    )
)

clima = clima_tudo %>% 
    filter(ano <= 2019, ano >= 2010, !is.na(temp_max))

glimpse(clima)
Rows: 1,562
Columns: 11
$ cidade      <chr> "Campina Grande", "Campina Grande", "Campina Grande", "Campina Grande", "Campina Grande"~
$ semana      <date> 2010-01-03, 2010-01-10, 2010-01-17, 2010-01-24, 2010-01-31, 2010-02-07, 2010-02-14, 201~
$ temp_max    <dbl> 31.4, 32.1, 31.0, 31.2, 32.1, 32.2, 31.3, 32.9, 34.1, 34.6, 33.0, 32.7, 32.5, 32.4, 31.8~
$ temp_media  <dbl> 25.53333, 25.60952, 24.20952, 26.06190, 26.02381, 26.04286, 25.84762, 26.95238, 27.97143~
$ temp_min    <dbl> 21.2, 21.3, 20.5, 21.2, 21.4, 20.4, 21.5, 22.1, 22.0, 21.9, 20.8, 21.1, 22.6, 22.6, 21.3~
$ vento_medio <dbl> 4.080952, 3.952381, 2.860000, 3.690476, 3.971429, 3.404762, 3.404762, 3.542857, 3.061905~
$ vento_max   <dbl> 5.3, 6.6, 5.0, 5.5, 6.5, 6.3, 5.5, 5.5, 4.0, 5.0, 7.8, 5.6, 5.1, 5.3, 5.5, 5.5, 4.5, 6.3~
$ umidade     <dbl> 76.23810, 75.95238, 85.33333, 77.80952, 76.04762, 77.76190, 80.42857, 76.04762, 71.00000~
$ chuva       <dbl> 4.7, 0.2, 69.3, 3.8, 1.2, 10.9, 2.5, 0.0, 0.0, 0.0, 0.2, 12.6, 8.4, 30.4, 12.9, 44.6, 7.~
$ ano         <int> 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010~
$ mes         <int> 1, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7~
ferias = clima %>%
    filter(cidade == 'Campina Grande') %>%
    filter(mes == 1 | mes == 2 | mes == 6)

aula = clima %>% 
    filter(cidade == 'Campina Grande') %>%
    filter(mes != 1 & mes != 2 & mes != 6)

sumario_ferias = ferias %>% 
    group_by(ano) %>%
    summarise(temp_max_anual = max(temp_max),
              temp_median = quantile(temp_max, .5),
              temp_min_anual = min(temp_max),
              chuva_max = max(chuva),
              chuva_median = quantile(chuva, .5),
              chuva_min = min(chuva),
              .groups = 'drop')

sumario_aula = aula %>% 
    group_by(ano) %>%
    summarise(temp_max_anual = max(temp_max),
              temp_median = quantile(temp_max, .5),
              temp_min_anual = min(temp_max),
              chuva_max = max(chuva),
              chuva_median = quantile(chuva, .5),
              chuva_min = min(chuva),
              .groups = 'drop')

Que tal iniciarmos essa análise de uma maneira diferente ?

1. Podemos tentar observar se nos meses de férias da UFCG (local onde estudo) e na cidade de Campina Grande (local onde eu moro, ora pois), duas perguntas:

Para iniciar a análise, optei por deixar os gráficos correspondentes aos meses de férias ao lado dos meses que normalmente ocorrem as aulas, tal informação pode ser vista no eixo x do gráfico, os meses de férias escolhidos foram:

Consequentemente os outros meses foram escolhidos como os meses onde ocorrem aulas normalmente :D

  1. Quais as semelhanças e diferenças entre a temperatura e as chuvas nos meses de férias e nos meses de aula?
# Meses de Férias
plot_ferias <- ferias %>% 
    ggplot(aes(x = ano, y = temp_max)) + 
    geom_point(alpha = .75, size = .9, color = 'gray') +
    geom_point(data = sumario_ferias, aes(y = temp_max_anual), color = 'black') +
    geom_point(data = sumario_ferias, aes(y = temp_median), color = 'coral') +
    geom_point(data = sumario_ferias, aes(y = temp_min_anual), color = 'black') +
    labs(
        x = 'Meses durante as férias',
        y = 'Calor'
    )

# Meses de aula
plot_aula <- aula %>% 
    filter(mes != 1 & mes != 2 & mes != 6) %>% 
    ggplot(aes(x = ano, y = temp_max)) + 
    geom_point(alpha = .75, size = .9, color = 'gray') +
    geom_point(data = sumario_aula, aes(y = temp_max_anual), color = 'black') +
    geom_point(data = sumario_aula, aes(y = temp_median), color = 'coral') +
    geom_point(data = sumario_aula, aes(y = temp_min_anual), color = 'black') +
    labs(
        x = 'Meses durante as aulas',
        y = 'Calor'
    )

plot_grid(plot_ferias, plot_aula)

Gráfico correspondente a temperatura anual entre 2010 e 2019 para a cidade de Campina Grande

# Meses de Férias
plot_ferias <- ferias %>% 
    ggplot(aes(x = ano, y = chuva)) + 
    geom_point(alpha = .75, size = .9, color = 'steelblue') +
    geom_point(data = sumario_ferias, aes(y = chuva_max), color = 'black') +
    geom_point(data = sumario_ferias, aes(y = chuva_median), color = 'coral') +
    geom_point(data = sumario_ferias, aes(y = chuva_min), color = 'black') +
    labs(
        x = 'Meses durante as férias',
        y = 'Calor'
    )

# Meses de aula
plot_aula <- aula %>% 
    ggplot(aes(x = ano, y = chuva)) + 
    geom_point(alpha = .75, size = .9, color = 'steelblue') +
    geom_point(data = sumario_aula, aes(y = chuva_max), color = 'black') +
    geom_point(data = sumario_aula, aes(y = chuva_median), color = 'coral') +
    geom_point(data = sumario_aula, aes(y = chuva_min), color = 'black') +
    labs(
        x = 'Meses durante as aulas',
        y = 'Calor'
    )

plot_grid(plot_ferias, plot_aula)

Gráfico correspondente as chuvas anuais entre 2010 e 2019 para a cidade de Campina Grande

Algo que podemos observar nos gráficos dipostos é que durante as férias temos temperaturas mais quentes, oque é natural, já que são meses do verão. De maneira análoga, para as chuvas ocorre o mesmo efeito, já que temos uma mescla das outras estações, incluindo o inverno e consequentemente mais índices de chuva.

Um detalhe interessante nesse gráfico é que podemos observar essa informação de maneira mais resumida ou sumarizada de acordo com os pontos máximos, mínimos e um quantil de 50% de cada gráfico. Tal maneira é interessante mas reduz grandemente a quantidade de informação.

Podemos observar que atráves do quantil que muitos pontos se concentram em temperaturas mais altas tanto para os meses de férias quanto para os meses de aula. O mesmo ocorre para os dados de chuvas, o quantil nos mostra que existem mais dias com pouca ou nenhuma chuva, em relação aos dias com chuva.

plot_chuvas_ferias = ferias %>% 
    ggplot(aes(x = chuva)) + 
    geom_density(fill = "steelblue", color = "black") + 
    geom_rug() +
    labs(
        x = 'Meses durante as férias',
    )

plot_chuvas_aula = aula %>% 
    ggplot(aes(x = chuva)) + 
    geom_density(fill = "steelblue", color = "black") + 
    geom_rug() +
    labs(
        x = 'Meses durante as aulas',
    )

plot_grid(plot_chuvas_ferias, plot_chuvas_aula)

Gráfico correspondente a densidade das chuvas anuais entre 2010 e 2019 para a cidade de Campina Grande

Nesse gráfico podemos observar mais claramente que a concentração dos dias não chuvosos se aprensentam com maior área no gráfico de densidade, por outro lado, podemos ver que os dias chuvosos se encontram na calda longa. Os traços abaixo do gráfico nos ajudam a entender melhor a concentração dos pontos/semanas.

Um fato interessante comparando nos dois gráficos é que existem mais dias chuvosos nas férias :oooooo

  1. Quando o clima é melhor?

Bem, isso é bem subjetivo e individual para cada pessoa. Talvez minha resposta seja bem enviesada a dizer que os meses de férias são melhores e mais animados e o calor possa proporcionar isso! Mas os dias chuvosos da nossa amada Campina Grande me fazem sempre repensar esse posicionamento rs.

2. Vamos comparar se as 3 cidades têm meses claramente mais quentes/frios. Em qual delas há épocas mais diferentes?

clima %>% 
    ggplot(aes(x = mes, y = temp_media)) +
    facet_wrap(~reorder(cidade, temp_media)) +
    geom_point(aes(y = temp_media), color="gray") +
    stat_summary(geom = "line", color = "green", fun = median)+
    stat_summary(geom = "line", color = "red", fun = mean)+
    scale_x_continuous(breaks = 1:12) + 
    labs(
         y = "Temperatura média", 
         x = "Mês"
    )

clima %>% 
    group_by(cidade) %>% 
        summarise(variancia = sum((temp_max - mean(temp_max))**2) / n(),
                  .groups = "drop")

Neste gráfico é possível visualizar a distribuição da temperatura das cidades em cada mês em um período de 10 anos. Os pontos cinzas representam as médias dos meses de cada ano observado, e as linhas verde e vermelha representam a média e mediana ao longo dos meses.

Ao observar os pontos em cinza, podemos ver que as temperaturas em João Pessoa estão mais concentradas que as demais cidades. Patos é a cidade que houve mais dispersão nas temperaturas e possuiu as temperaturas mais elevadas, com alguns pontos extremos, chegando próximo aos 32,5°C e um pouco abaixo de 25°C. Campina Grande registrou no geral temperaturas mais baixas e uma dispersão maior de temperatura que João Pessoa.

Observando as linhas no gráfico, o comportamento da temperatura em Campina Grande é parecido com João Pessoa, apresentando uma curva mais suavizada, com os meses de março e dezembro possuindo as temperaturas médias mais altas e julho a mais baixa, e em Patos a curva é mais “brusca” com uma diferença maior entre a curva da média e mediana, ficando evidente que em novembro apresentou a temperatura média mais alta e em junho a mais baixa. Para descobrir a cidade que tem épocas mais diferentes, foi calculada a variância da temperatura máxima, e mostrou que a variância de Campina Grande é maior que a das outras cidades, levando a crer que é a cidade com épocas mais diferentes.

LS0tDQp0aXRsZTogIk1haXMgRURBIG5vIGNsaW1hIGRlIEpvw6NvIFBlc3NvYSwgQ2FtcGluYSBHcmFuZGUgZSBQYXRvcyINCm91dHB1dDogaHRtbF9ub3RlYm9vaw0KLS0tDQoNCmBgYHtyIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0V9DQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkoaGVyZSkNCmxpYnJhcnkoY293cGxvdCkNCnRoZW1lX3NldCh0aGVtZV9idygpKQ0KYGBgDQoNCk9sw6EgYSB0b2RvcyEgRXNzZSBub3RlYm9vayDDqSB1bWEgY29udGludWHDp8OjbyBkYSBzZXJpZSBkZSBhbsOhbGlzZSBkbyBjbGltYSBkZSBhbGd1bWFzIGNpZGFkZXMgZGEgUGFyYWliYS4gRGVudHJlIGVsYXMsIHNlbGVjaW9uYW1vcyBvcyBkYWRvcyBkYXMgc2VndWludGUgY2lkYWRlczoNCg0KQ2FtcGluYSBHcmFuZGUNClBhdG9zDQpKb8OjbyBQZXNzb2ENCg0KKlBhcmEgcmV2ZXIgYSBwYXJ0ZSAxLCBjbGlxdWUgW2FxdWldKGh0dHBzOi8vcnB1YnMuY29tL2xlb19taXJhY2gvZWRhX3dlYXRoZXJfY2l0aWVzX3BiKSoNCg0KIyMjIyBWYW1vcyBjb21lw6dhciBjYXJyZWdhbmRvIG5vc3NvcyBkYWRvcw0KDQpgYGB7cn0NCmNsaW1hX3R1ZG8gPSByZWFkX2NzdigNCiAgICBoZXJlKCJkYXRhL3RlbXBvLWpwLWNnLXB0LmNzdiIpLA0KICAgIGNvbF90eXBlcyA9IGNvbHMoDQogICAgICAgIC5kZWZhdWx0ID0gY29sX2RvdWJsZSgpLA0KICAgICAgICBjaWRhZGUgPSBjb2xfY2hhcmFjdGVyKCksDQogICAgICAgIHNlbWFuYSA9IGNvbF9kYXRlKGZvcm1hdCA9ICIiKSwNCiAgICAgICAgYW5vID0gY29sX2ludGVnZXIoKSwNCiAgICAgICAgbWVzID0gY29sX2ludGVnZXIoKQ0KICAgICkNCikNCg0KY2xpbWEgPSBjbGltYV90dWRvICU+JSANCiAgICBmaWx0ZXIoYW5vIDw9IDIwMTksIGFubyA+PSAyMDEwLCAhaXMubmEodGVtcF9tYXgpKQ0KDQpnbGltcHNlKGNsaW1hKQ0KYGBgDQoNCmBgYHtyfQ0KZmVyaWFzID0gY2xpbWEgJT4lDQogICAgZmlsdGVyKGNpZGFkZSA9PSAnQ2FtcGluYSBHcmFuZGUnKSAlPiUNCiAgICBmaWx0ZXIobWVzID09IDEgfCBtZXMgPT0gMiB8IG1lcyA9PSA2KQ0KDQphdWxhID0gY2xpbWEgJT4lIA0KICAgIGZpbHRlcihjaWRhZGUgPT0gJ0NhbXBpbmEgR3JhbmRlJykgJT4lDQogICAgZmlsdGVyKG1lcyAhPSAxICYgbWVzICE9IDIgJiBtZXMgIT0gNikNCg0Kc3VtYXJpb19mZXJpYXMgPSBmZXJpYXMgJT4lIA0KICAgIGdyb3VwX2J5KGFubykgJT4lDQogICAgc3VtbWFyaXNlKHRlbXBfbWF4X2FudWFsID0gbWF4KHRlbXBfbWF4KSwNCiAgICAgICAgICAgICAgdGVtcF9tZWRpYW4gPSBxdWFudGlsZSh0ZW1wX21heCwgLjUpLA0KICAgICAgICAgICAgICB0ZW1wX21pbl9hbnVhbCA9IG1pbih0ZW1wX21heCksDQogICAgICAgICAgICAgIGNodXZhX21heCA9IG1heChjaHV2YSksDQogICAgICAgICAgICAgIGNodXZhX21lZGlhbiA9IHF1YW50aWxlKGNodXZhLCAuNSksDQogICAgICAgICAgICAgIGNodXZhX21pbiA9IG1pbihjaHV2YSksDQogICAgICAgICAgICAgIC5ncm91cHMgPSAnZHJvcCcpDQoNCnN1bWFyaW9fYXVsYSA9IGF1bGEgJT4lIA0KICAgIGdyb3VwX2J5KGFubykgJT4lDQogICAgc3VtbWFyaXNlKHRlbXBfbWF4X2FudWFsID0gbWF4KHRlbXBfbWF4KSwNCiAgICAgICAgICAgICAgdGVtcF9tZWRpYW4gPSBxdWFudGlsZSh0ZW1wX21heCwgLjUpLA0KICAgICAgICAgICAgICB0ZW1wX21pbl9hbnVhbCA9IG1pbih0ZW1wX21heCksDQogICAgICAgICAgICAgIGNodXZhX21heCA9IG1heChjaHV2YSksDQogICAgICAgICAgICAgIGNodXZhX21lZGlhbiA9IHF1YW50aWxlKGNodXZhLCAuNSksDQogICAgICAgICAgICAgIGNodXZhX21pbiA9IG1pbihjaHV2YSksDQogICAgICAgICAgICAgIC5ncm91cHMgPSAnZHJvcCcpDQpgYGANCg0KUXVlIHRhbCBpbmljaWFybW9zIGVzc2EgYW7DoWxpc2UgZGUgdW1hIG1hbmVpcmEgZGlmZXJlbnRlID8gDQoNCiMjIyMgMS4gUG9kZW1vcyB0ZW50YXIgb2JzZXJ2YXIgc2Ugbm9zICptZXNlcyBkZSBmw6lyaWFzKiBkYSBVRkNHIChsb2NhbCBvbmRlIGVzdHVkbykgZSBuYSBjaWRhZGUgZGUgQ2FtcGluYSBHcmFuZGUgKGxvY2FsIG9uZGUgZXUgbW9ybywgb3JhIHBvaXMpLCBkdWFzIHBlcmd1bnRhczoNCg0KUGFyYSBpbmljaWFyIGEgYW7DoWxpc2UsIG9wdGVpIHBvciBkZWl4YXIgb3MgZ3LDoWZpY29zIGNvcnJlc3BvbmRlbnRlcyBhb3MgbWVzZXMgZGUgZsOpcmlhcyBhbyBsYWRvIGRvcyBtZXNlcyBxdWUgbm9ybWFsbWVudGUgb2NvcnJlbSBhcyBhdWxhcywgdGFsIGluZm9ybWHDp8OjbyBwb2RlIHNlciB2aXN0YSBubyBlaXhvIHggZG8gZ3LDoWZpY28sIG9zIG1lc2VzIGRlIGbDqXJpYXMgZXNjb2xoaWRvcyBmb3JhbToNCg0KKiBKYW5laXJvDQoqIEZldmVyZWlybw0KKiBKdW5obw0KDQpDb25zZXF1ZW50ZW1lbnRlIG9zIG91dHJvcyBtZXNlcyBmb3JhbSBlc2NvbGhpZG9zIGNvbW8gb3MgbWVzZXMgb25kZSBvY29ycmVtIGF1bGFzIG5vcm1hbG1lbnRlIDpEDQoNCjEuIFF1YWlzIGFzIHNlbWVsaGFuw6dhcyBlIGRpZmVyZW7Dp2FzIGVudHJlIGEgKnRlbXBlcmF0dXJhKiBlIGFzICpjaHV2YXMqIG5vcyBtZXNlcyBkZSBmw6lyaWFzIGUgbm9zIG1lc2VzIGRlIGF1bGE/DQoNCg0KYGBge3J9DQojIE1lc2VzIGRlIEbDqXJpYXMNCnBsb3RfZmVyaWFzIDwtIGZlcmlhcyAlPiUgDQogICAgZ2dwbG90KGFlcyh4ID0gYW5vLCB5ID0gdGVtcF9tYXgpKSArIA0KICAgIGdlb21fcG9pbnQoYWxwaGEgPSAuNzUsIHNpemUgPSAuOSwgY29sb3IgPSAnZ3JheScpICsNCiAgICBnZW9tX3BvaW50KGRhdGEgPSBzdW1hcmlvX2ZlcmlhcywgYWVzKHkgPSB0ZW1wX21heF9hbnVhbCksIGNvbG9yID0gJ2JsYWNrJykgKw0KICAgIGdlb21fcG9pbnQoZGF0YSA9IHN1bWFyaW9fZmVyaWFzLCBhZXMoeSA9IHRlbXBfbWVkaWFuKSwgY29sb3IgPSAnY29yYWwnKSArDQogICAgZ2VvbV9wb2ludChkYXRhID0gc3VtYXJpb19mZXJpYXMsIGFlcyh5ID0gdGVtcF9taW5fYW51YWwpLCBjb2xvciA9ICdibGFjaycpICsNCiAgICBsYWJzKA0KICAgICAgICB4ID0gJ01lc2VzIGR1cmFudGUgYXMgZsOpcmlhcycsDQogICAgICAgIHkgPSAnQ2Fsb3InDQogICAgKQ0KDQojIE1lc2VzIGRlIGF1bGENCnBsb3RfYXVsYSA8LSBhdWxhICU+JSANCiAgICBmaWx0ZXIobWVzICE9IDEgJiBtZXMgIT0gMiAmIG1lcyAhPSA2KSAlPiUgDQogICAgZ2dwbG90KGFlcyh4ID0gYW5vLCB5ID0gdGVtcF9tYXgpKSArIA0KICAgIGdlb21fcG9pbnQoYWxwaGEgPSAuNzUsIHNpemUgPSAuOSwgY29sb3IgPSAnZ3JheScpICsNCiAgICBnZW9tX3BvaW50KGRhdGEgPSBzdW1hcmlvX2F1bGEsIGFlcyh5ID0gdGVtcF9tYXhfYW51YWwpLCBjb2xvciA9ICdibGFjaycpICsNCiAgICBnZW9tX3BvaW50KGRhdGEgPSBzdW1hcmlvX2F1bGEsIGFlcyh5ID0gdGVtcF9tZWRpYW4pLCBjb2xvciA9ICdjb3JhbCcpICsNCiAgICBnZW9tX3BvaW50KGRhdGEgPSBzdW1hcmlvX2F1bGEsIGFlcyh5ID0gdGVtcF9taW5fYW51YWwpLCBjb2xvciA9ICdibGFjaycpICsNCiAgICBsYWJzKA0KICAgICAgICB4ID0gJ01lc2VzIGR1cmFudGUgYXMgYXVsYXMnLA0KICAgICAgICB5ID0gJ0NhbG9yJw0KICAgICkNCg0KcGxvdF9ncmlkKHBsb3RfZmVyaWFzLCBwbG90X2F1bGEpDQpgYGANCg0KKkdyw6FmaWNvIGNvcnJlc3BvbmRlbnRlIGEgdGVtcGVyYXR1cmEgYW51YWwgZW50cmUgMjAxMCBlIDIwMTkgcGFyYSBhIGNpZGFkZSBkZSBDYW1waW5hIEdyYW5kZSoNCg0KYGBge3J9DQojIE1lc2VzIGRlIEbDqXJpYXMNCnBsb3RfZmVyaWFzIDwtIGZlcmlhcyAlPiUgDQogICAgZ2dwbG90KGFlcyh4ID0gYW5vLCB5ID0gY2h1dmEpKSArIA0KICAgIGdlb21fcG9pbnQoYWxwaGEgPSAuNzUsIHNpemUgPSAuOSwgY29sb3IgPSAnc3RlZWxibHVlJykgKw0KICAgIGdlb21fcG9pbnQoZGF0YSA9IHN1bWFyaW9fZmVyaWFzLCBhZXMoeSA9IGNodXZhX21heCksIGNvbG9yID0gJ2JsYWNrJykgKw0KICAgIGdlb21fcG9pbnQoZGF0YSA9IHN1bWFyaW9fZmVyaWFzLCBhZXMoeSA9IGNodXZhX21lZGlhbiksIGNvbG9yID0gJ2NvcmFsJykgKw0KICAgIGdlb21fcG9pbnQoZGF0YSA9IHN1bWFyaW9fZmVyaWFzLCBhZXMoeSA9IGNodXZhX21pbiksIGNvbG9yID0gJ2JsYWNrJykgKw0KICAgIGxhYnMoDQogICAgICAgIHggPSAnTWVzZXMgZHVyYW50ZSBhcyBmw6lyaWFzJywNCiAgICAgICAgeSA9ICdDYWxvcicNCiAgICApDQoNCiMgTWVzZXMgZGUgYXVsYQ0KcGxvdF9hdWxhIDwtIGF1bGEgJT4lIA0KICAgIGdncGxvdChhZXMoeCA9IGFubywgeSA9IGNodXZhKSkgKyANCiAgICBnZW9tX3BvaW50KGFscGhhID0gLjc1LCBzaXplID0gLjksIGNvbG9yID0gJ3N0ZWVsYmx1ZScpICsNCiAgICBnZW9tX3BvaW50KGRhdGEgPSBzdW1hcmlvX2F1bGEsIGFlcyh5ID0gY2h1dmFfbWF4KSwgY29sb3IgPSAnYmxhY2snKSArDQogICAgZ2VvbV9wb2ludChkYXRhID0gc3VtYXJpb19hdWxhLCBhZXMoeSA9IGNodXZhX21lZGlhbiksIGNvbG9yID0gJ2NvcmFsJykgKw0KICAgIGdlb21fcG9pbnQoZGF0YSA9IHN1bWFyaW9fYXVsYSwgYWVzKHkgPSBjaHV2YV9taW4pLCBjb2xvciA9ICdibGFjaycpICsNCiAgICBsYWJzKA0KICAgICAgICB4ID0gJ01lc2VzIGR1cmFudGUgYXMgYXVsYXMnLA0KICAgICAgICB5ID0gJ0NhbG9yJw0KICAgICkNCg0KcGxvdF9ncmlkKHBsb3RfZmVyaWFzLCBwbG90X2F1bGEpDQpgYGANCipHcsOhZmljbyBjb3JyZXNwb25kZW50ZSBhcyBjaHV2YXMgYW51YWlzIGVudHJlIDIwMTAgZSAyMDE5IHBhcmEgYSBjaWRhZGUgZGUgQ2FtcGluYSBHcmFuZGUqDQoNCkFsZ28gcXVlIHBvZGVtb3Mgb2JzZXJ2YXIgbm9zIGdyw6FmaWNvcyBkaXBvc3RvcyDDqSBxdWUgZHVyYW50ZSBhcyBmw6lyaWFzIHRlbW9zIHRlbXBlcmF0dXJhcyBtYWlzIHF1ZW50ZXMsIG9xdWUgw6kgbmF0dXJhbCwgasOhIHF1ZSBzw6NvIG1lc2VzIGRvIHZlcsOjby4gRGUgbWFuZWlyYSBhbsOhbG9nYSwgcGFyYSBhcyBjaHV2YXMgb2NvcnJlIG8gbWVzbW8gZWZlaXRvLCBqw6EgcXVlIHRlbW9zIHVtYSBtZXNjbGEgZGFzIG91dHJhcyBlc3Rhw6fDtWVzLCBpbmNsdWluZG8gbyBpbnZlcm5vIGUgY29uc2VxdWVudGVtZW50ZSBtYWlzIMOtbmRpY2VzIGRlIGNodXZhLg0KDQpVbSBkZXRhbGhlIGludGVyZXNzYW50ZSBuZXNzZSBncsOhZmljbyDDqSBxdWUgcG9kZW1vcyBvYnNlcnZhciBlc3NhIGluZm9ybWHDp8OjbyBkZSBtYW5laXJhIG1haXMgcmVzdW1pZGEgb3Ugc3VtYXJpemFkYSBkZSBhY29yZG8gY29tIG9zIHBvbnRvcyBtw6F4aW1vcywgbcOtbmltb3MgZSB1bSBxdWFudGlsIGRlIDUwJSBkZSBjYWRhIGdyw6FmaWNvLiBUYWwgbWFuZWlyYSDDqSBpbnRlcmVzc2FudGUgbWFzIHJlZHV6IGdyYW5kZW1lbnRlIGEgcXVhbnRpZGFkZSBkZSBpbmZvcm1hw6fDo28uDQoNClBvZGVtb3Mgb2JzZXJ2YXIgcXVlIGF0csOhdmVzIGRvIHF1YW50aWwgcXVlIG11aXRvcyBwb250b3Mgc2UgY29uY2VudHJhbSBlbSB0ZW1wZXJhdHVyYXMgbWFpcyBhbHRhcyB0YW50byBwYXJhIG9zIG1lc2VzIGRlIGbDqXJpYXMgcXVhbnRvIHBhcmEgb3MgbWVzZXMgZGUgYXVsYS4NCk8gbWVzbW8gb2NvcnJlIHBhcmEgb3MgZGFkb3MgZGUgY2h1dmFzLCBvIHF1YW50aWwgbm9zIG1vc3RyYSBxdWUgZXhpc3RlbSBtYWlzIGRpYXMgY29tIHBvdWNhIG91IG5lbmh1bWEgY2h1dmEsIGVtIHJlbGHDp8OjbyBhb3MgZGlhcyBjb20gY2h1dmEuDQoNCmBgYHtyfQ0KcGxvdF9jaHV2YXNfZmVyaWFzID0gZmVyaWFzICU+JSANCiAgICBnZ3Bsb3QoYWVzKHggPSBjaHV2YSkpICsgDQogICAgZ2VvbV9kZW5zaXR5KGZpbGwgPSAic3RlZWxibHVlIiwgY29sb3IgPSAiYmxhY2siKSArIA0KICAgIGdlb21fcnVnKCkgKw0KICAgIGxhYnMoDQogICAgICAgIHggPSAnTWVzZXMgZHVyYW50ZSBhcyBmw6lyaWFzJywNCiAgICApDQoNCnBsb3RfY2h1dmFzX2F1bGEgPSBhdWxhICU+JSANCiAgICBnZ3Bsb3QoYWVzKHggPSBjaHV2YSkpICsgDQogICAgZ2VvbV9kZW5zaXR5KGZpbGwgPSAic3RlZWxibHVlIiwgY29sb3IgPSAiYmxhY2siKSArIA0KICAgIGdlb21fcnVnKCkgKw0KICAgIGxhYnMoDQogICAgICAgIHggPSAnTWVzZXMgZHVyYW50ZSBhcyBhdWxhcycsDQogICAgKQ0KDQpwbG90X2dyaWQocGxvdF9jaHV2YXNfZmVyaWFzLCBwbG90X2NodXZhc19hdWxhKQ0KYGBgDQoqR3LDoWZpY28gY29ycmVzcG9uZGVudGUgYSBkZW5zaWRhZGUgZGFzIGNodXZhcyBhbnVhaXMgZW50cmUgMjAxMCBlIDIwMTkgcGFyYSBhIGNpZGFkZSBkZSBDYW1waW5hIEdyYW5kZSoNCg0KTmVzc2UgZ3LDoWZpY28gcG9kZW1vcyBvYnNlcnZhciBtYWlzIGNsYXJhbWVudGUgcXVlIGEgY29uY2VudHJhw6fDo28gZG9zIGRpYXMgbsOjbyBjaHV2b3NvcyBzZSBhcHJlbnNlbnRhbSBjb20gbWFpb3Igw6FyZWEgbm8gZ3LDoWZpY28gZGUgZGVuc2lkYWRlLCBwb3Igb3V0cm8gbGFkbywgcG9kZW1vcyB2ZXIgcXVlIG9zIGRpYXMgY2h1dm9zb3Mgc2UgZW5jb250cmFtIG5hIGNhbGRhIGxvbmdhLiBPcyB0cmHDp29zIGFiYWl4byBkbyBncsOhZmljbyBub3MgYWp1ZGFtIGEgZW50ZW5kZXIgbWVsaG9yIGEgY29uY2VudHJhw6fDo28gZG9zIHBvbnRvcy9zZW1hbmFzLg0KDQpVbSBmYXRvIGludGVyZXNzYW50ZSBjb21wYXJhbmRvIG5vcyBkb2lzIGdyw6FmaWNvcyDDqSBxdWUgZXhpc3RlbSBtYWlzIGRpYXMgY2h1dm9zb3MgbmFzIGbDqXJpYXMgOm9vb29vbw0KDQoyLiBRdWFuZG8gbyBjbGltYSDDqSBtZWxob3I/DQoNCkJlbSwgaXNzbyDDqSBiZW0gc3ViamV0aXZvIGUgaW5kaXZpZHVhbCBwYXJhIGNhZGEgcGVzc29hLiBUYWx2ZXogbWluaGEgcmVzcG9zdGEgc2VqYSBiZW0gZW52aWVzYWRhIGEgZGl6ZXIgcXVlIG9zIG1lc2VzIGRlIGbDqXJpYXMgc8OjbyBtZWxob3JlcyBlIG1haXMgYW5pbWFkb3MgZSBvIGNhbG9yIHBvc3NhIHByb3BvcmNpb25hciBpc3NvISBNYXMgb3MgZGlhcyBjaHV2b3NvcyBkYSBub3NzYSBhbWFkYSBDYW1waW5hIEdyYW5kZSBtZSBmYXplbSBzZW1wcmUgcmVwZW5zYXIgZXNzZSBwb3NpY2lvbmFtZW50byBycy4NCg0KIyMjIyAyLiBWYW1vcyBjb21wYXJhciBzZSBhcyAzIGNpZGFkZXMgdMOqbSBtZXNlcyBjbGFyYW1lbnRlIG1haXMgcXVlbnRlcy9mcmlvcy4gRW0gcXVhbCBkZWxhcyBow6Egw6lwb2NhcyBtYWlzIGRpZmVyZW50ZXM/IA0KDQpgYGB7cn0NCmNsaW1hICU+JSANCiAgICBnZ3Bsb3QoYWVzKHggPSBtZXMsIHkgPSB0ZW1wX21lZGlhKSkgKw0KICAgIGZhY2V0X3dyYXAofnJlb3JkZXIoY2lkYWRlLCB0ZW1wX21lZGlhKSkgKw0KICAgIGdlb21fcG9pbnQoYWVzKHkgPSB0ZW1wX21lZGlhKSwgY29sb3I9ImdyYXkiKSArDQogICAgc3RhdF9zdW1tYXJ5KGdlb20gPSAibGluZSIsIGNvbG9yID0gImdyZWVuIiwgZnVuID0gbWVkaWFuKSsNCiAgICBzdGF0X3N1bW1hcnkoZ2VvbSA9ICJsaW5lIiwgY29sb3IgPSAicmVkIiwgZnVuID0gbWVhbikrDQogICAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IDE6MTIpICsgDQogICAgbGFicygNCiAgICAgICAgIHkgPSAiVGVtcGVyYXR1cmEgbcOpZGlhIiwgDQogICAgICAgICB4ID0gIk3DqnMiDQogICAgKQ0KYGBgDQoNCmBgYHtyfQ0KY2xpbWEgJT4lIA0KICAgIGdyb3VwX2J5KGNpZGFkZSkgJT4lIA0KICAgICAgICBzdW1tYXJpc2UodmFyaWFuY2lhID0gc3VtKCh0ZW1wX21heCAtIG1lYW4odGVtcF9tYXgpKSoqMikgLyBuKCksDQogICAgICAgICAgICAgICAgICAuZ3JvdXBzID0gImRyb3AiKQ0KYGBgDQoNCk5lc3RlIGdyw6FmaWNvIMOpIHBvc3PDrXZlbCB2aXN1YWxpemFyIGEgZGlzdHJpYnVpw6fDo28gZGEgdGVtcGVyYXR1cmEgZGFzIGNpZGFkZXMgZW0gY2FkYSBtw6pzIGVtIHVtIHBlcsOtb2RvIGRlIDEwIGFub3MuIE9zIHBvbnRvcyBjaW56YXMgcmVwcmVzZW50YW0gYXMgbcOpZGlhcyBkb3MgbWVzZXMgZGUgY2FkYSBhbm8gb2JzZXJ2YWRvLCBlIGFzIGxpbmhhcyB2ZXJkZSBlIHZlcm1lbGhhIHJlcHJlc2VudGFtIGEgbcOpZGlhIGUgbWVkaWFuYSBhbyBsb25nbyBkb3MgbWVzZXMuIA0KDQpBbyBvYnNlcnZhciBvcyBwb250b3MgZW0gY2luemEsIHBvZGVtb3MgdmVyIHF1ZSBhcyB0ZW1wZXJhdHVyYXMgZW0gSm/Do28gUGVzc29hIGVzdMOjbyBtYWlzIGNvbmNlbnRyYWRhcyBxdWUgYXMgZGVtYWlzIGNpZGFkZXMuIFBhdG9zIMOpIGEgY2lkYWRlIHF1ZSBob3V2ZSBtYWlzIGRpc3BlcnPDo28gbmFzIHRlbXBlcmF0dXJhcyBlIHBvc3N1aXUgYXMgdGVtcGVyYXR1cmFzIG1haXMgZWxldmFkYXMsIGNvbSBhbGd1bnMgcG9udG9zIGV4dHJlbW9zLCBjaGVnYW5kbyBwcsOzeGltbyBhb3MgMzIsNcKwQyBlIHVtIHBvdWNvIGFiYWl4byBkZSAyNcKwQy4gQ2FtcGluYSBHcmFuZGUgcmVnaXN0cm91IG5vIGdlcmFsIHRlbXBlcmF0dXJhcyBtYWlzIGJhaXhhcyBlIHVtYSBkaXNwZXJzw6NvIG1haW9yIGRlIHRlbXBlcmF0dXJhIHF1ZSBKb8OjbyBQZXNzb2EuIA0KDQpPYnNlcnZhbmRvIGFzIGxpbmhhcyBubyBncsOhZmljbywgbyBjb21wb3J0YW1lbnRvIGRhIHRlbXBlcmF0dXJhIGVtIENhbXBpbmEgR3JhbmRlIMOpIHBhcmVjaWRvIGNvbSBKb8OjbyBQZXNzb2EsIGFwcmVzZW50YW5kbyB1bWEgY3VydmEgbWFpcyBzdWF2aXphZGEsIGNvbSBvcyBtZXNlcyBkZSBtYXLDp28gZSBkZXplbWJybyBwb3NzdWluZG8gYXMgdGVtcGVyYXR1cmFzIG3DqWRpYXMgbWFpcyBhbHRhcyBlIGp1bGhvIGEgbWFpcyBiYWl4YSwgZSBlbSBQYXRvcyBhIGN1cnZhIMOpIG1haXMgImJydXNjYSIgY29tIHVtYSBkaWZlcmVuw6dhIG1haW9yIGVudHJlIGEgY3VydmEgZGEgbcOpZGlhIGUgbWVkaWFuYSwgZmljYW5kbyBldmlkZW50ZSBxdWUgZW0gbm92ZW1icm8gYXByZXNlbnRvdSBhIHRlbXBlcmF0dXJhIG3DqWRpYSBtYWlzIGFsdGEgZSBlbSBqdW5obyBhIG1haXMgYmFpeGEuIFBhcmEgZGVzY29icmlyIGEgY2lkYWRlIHF1ZSB0ZW0gw6lwb2NhcyBtYWlzIGRpZmVyZW50ZXMsIGZvaSBjYWxjdWxhZGEgYSB2YXJpw6JuY2lhIGRhIHRlbXBlcmF0dXJhIG3DoXhpbWEsIGUgbW9zdHJvdSBxdWUgYSB2YXJpw6JuY2lhIGRlIENhbXBpbmEgR3JhbmRlIMOpIG1haW9yIHF1ZSBhIGRhcyBvdXRyYXMgY2lkYWRlcywgbGV2YW5kbyBhIGNyZXIgcXVlIMOpIGEgY2lkYWRlIGNvbSDDqXBvY2FzIG1haXMgZGlmZXJlbnRlcy4NCg0KDQo=