Licença

This work is licensed under the Creative Commons Attribution-ShareAlike 4.0 International License. To view a copy of this license, visit http://creativecommons.org/licenses/by-sa/4.0/ or send a letter to Creative Commons, PO Box 1866, Mountain View, CA 94042, USA.

License: CC BY-SA 4.0

Citação

Sugestão de citação: FIGUEIREDO, Adriano Marcos Rodrigues. Economia Regional: exemplo de treemap no comércio internacional. Campo Grande-MS,Brasil: RStudio/Rpubs, 2021. Disponível em http://rpubs.com/amrofi/treemap1.

1 Introdução

O treemap permite visualizar blocos cujos tamanhos refletem a grandeza da variável, e as cores refletem agrupamentos ou tipos de produtos. Têm sido muito utilizados em comércio internacional, por exemplo no Observatório de Complexidade Econômica - OEC, https://oec.world/, em dashboards e outras utilizações.

O exemplo a seguir reproduz e adapta a rotina de Paulo Alencar (https://www.fulljoin.com.br/) e código disponibilizado em https://github.com/paulofelipe/tutorial_d3plusr. Utilizaremos o pacote de Alencar e Guerra (2016), D3plusR.

2 Exemplo

Os dados utilizados foram extraídos do github de Paulo Alencar, e são das exportações brasileiras para China a partir de 2015, considerando o período parcial até abril, como também o total dos anos de 2015 e 2016. Os dados estão desagregados por fator agregado e principais produtos exportados e importados. Sugere-se que a atualização seja feita a partir dos dados do Comtrade com o pacote comtrader. São 3226 observações em 10 colunas.

library(D3plusR)
library(dplyr)
dados_chn <- read.csv2("dados/chn.csv", stringsAsFactors = FALSE, encoding = "latin1")
knitr::kable(head(dados_chn))
TIPO PERIODO CO_ANO CO_PAIS NO_PAIS CO_PAIS_ISOA3 NO_PPE_PPI NO_FAT_AGREG VL_FOB KG_LIQUIDO
EXPORTAÇÕES Jan-Abr 2015 160 China CHN Abrasivos e pedras para amolar e semelhantes Produtos Manufaturados 328523 5529
EXPORTAÇÕES Jan-Abr 2015 160 China CHN Aceleradores de reação e preparações catalíticas Produtos Manufaturados 2737 30
EXPORTAÇÕES Jan-Abr 2015 160 China CHN Acetatos,nitratos, éteres de celulose e outs. derivados Produtos Manufaturados 54518 10050
EXPORTAÇÕES Jan-Abr 2015 160 China CHN Ácidos carboxílicos, seus anidridos, halogenetos, etc. Produtos Manufaturados 58495 15355
EXPORTAÇÕES Jan-Abr 2015 160 China CHN Açúcar de cana, em bruto Produtos Semimanufaturados 242426442 728498375
EXPORTAÇÕES Jan-Abr 2015 160 China CHN Açúcar refinado Produtos Manufaturados 405 450

É possível ver que algumas colunas são desnecessárias, como a primeira coluna que contém apenas a informação de que são exportações e importações. Mas ela pode ser útil se houver também as importações no mesmo dataset. A investigação do dataset pode ser melhorada usando a função unique. Vocês verão que o dataset contêm exportações e importações. Também olhamos a coluna PERIODO. Veremos que tem informações para Jan-Abr e para Total.

unique(dados_chn["TIPO"])
unique(dados_chn["PERIODO"])

Separaremos então apenas as exportações, para período igual a total. Na sequência, um primeiro treemap contendo apenas a informação registrada em NO_FAT_AGREG e NO_PPE_PPI. Utilizaremos o pacote D3plusR para elaborar o treemap.

Esta informação tratará as duas colunas como fatores, contando os resutlados em cada caso, para o dataset de exportações (dados_chn_exp). Observa-se a predominância das exportações brasileiras para a China de produtos básicos, caixa amarela, e assim tem-se um primeiro olhar sobre estes dados.

dados_chn_exp <- dados_chn %>%
    filter(TIPO == "EXPORTAÇÕES", PERIODO == "Total")

d3plus(dados_chn_exp, type = "tree_map", id = c("NO_FAT_AGREG", "NO_PPE_PPI"), width = "100%",
    height = 500) %>%
    d3plusSize("VL_FOB")

Treemap das exportações brasileiras para a China, Total (2015-16)

Para que o D3plusR possa mostrar as participações, é necessário que os rótulos (labels) tenham o seu alinhamento vertical definido para o topo (d3plusLabels(value = TRUE, valign = "top")).

d3plus(dados_chn_exp, type = "tree_map", id = c("NO_FAT_AGREG", "NO_PPE_PPI"), width = "100%",
    height = 500) %>%
    d3plusSize("VL_FOB") %>%
    d3plusLabels(value = TRUE, valign = "top")

Treemap das exportações brasileiras para a China, Total (2015-16)

Agora, vamos definir que o nível de profundidade da visualização é o de produtos, ou seja, d3plusDepth(1). A posição da profundidade Depth é definida pela opção id = c("NO_FAT_AGREG", "NO_PPE_PPI"), que varia iniciando em “0”. Ou seja, para o detalhamento em nível de “NO_PPE_PPI”, especificar “1” em d3plusDepth(). A cor foi definida pelo fator agregado d3plusColor(value = "NO_FAT_AGREG"):

d3plus(dados_chn_exp, type = "tree_map", id = c("NO_FAT_AGREG", "NO_PPE_PPI"), width = "100%",
    height = 500) %>%
    d3plusSize("VL_FOB") %>%
    d3plusLabels(value = TRUE, valign = "top") %>%
    d3plusDepth(1) %>%
    d3plusColor(value = "NO_FAT_AGREG") %>%
    d3plusLegend(value = TRUE, order = list(value = "size", sort = "desc"))

Treemap das exportações brasileiras para a China, Total (2015-16)

Referências

Referências de pacotes utilizados - lista todos os pacotes que foram abertos em algum procedimento

Alencar, Paulo, e Saulo Guerra. 2016. D3plusR: Create D3plus visualizations.
Allaire, JJ, Yihui Xie, Jonathan McPherson, Javier Luraschi, Kevin Ushey, Aron Atkins, Hadley Wickham, Joe Cheng, Winston Chang, e Richard Iannone. 2021. rmarkdown: Dynamic Documents for R. https://CRAN.R-project.org/package=rmarkdown.
Barnier, Julien. 2021. rmdformats: HTML Output Formats and Templates for rmarkdown Documents. https://github.com/juba/rmdformats.
Ooms, Jeroen. 2014. «The jsonlite Package: A Practical and Consistent Mapping Between JSON Data and R Objects». arXiv:1403.2805 [stat.CO]. https://arxiv.org/abs/1403.2805.
———. 2020. jsonlite: A Simple and Robust JSON Parser and Generator for R. https://CRAN.R-project.org/package=jsonlite.
R Core Team. 2021. R: A Language and Environment for Statistical Computing. Vienna, Austria: R Foundation for Statistical Computing. https://www.R-project.org/.
Wickham, Hadley, Romain François, Lionel Henry, e Kirill Müller. 2021. dplyr: A Grammar of Data Manipulation. https://CRAN.R-project.org/package=dplyr.
Xie, Yihui. 2014. «knitr: A Comprehensive Tool for Reproducible Research in R». Em Implementing Reproducible Computational Research, editado por Victoria Stodden, Friedrich Leisch, e Roger D. Peng. Chapman; Hall/CRC. http://www.crcpress.com/product/isbn/9781466561595.
———. 2015. Dynamic Documents with R and knitr. 2nd ed. Boca Raton, Florida: Chapman; Hall/CRC. https://yihui.org/knitr/.
———. 2016. bookdown: Authoring Books and Technical Documents with R Markdown. Boca Raton, Florida: Chapman; Hall/CRC. https://bookdown.org/yihui/bookdown.
———. 2021a. bookdown: Authoring Books and Technical Documents with R Markdown. https://CRAN.R-project.org/package=bookdown.
———. 2021b. knitr: A General-Purpose Package for Dynamic Report Generation in R. https://yihui.org/knitr/.
Xie, Yihui, J. J. Allaire, e Garrett Grolemund. 2018. R Markdown: The Definitive Guide. Boca Raton, Florida: Chapman; Hall/CRC. https://bookdown.org/yihui/rmarkdown.
Xie, Yihui, Christophe Dervieux, e Emily Riederer. 2020. R Markdown Cookbook. Boca Raton, Florida: Chapman; Hall/CRC. https://bookdown.org/yihui/rmarkdown-cookbook.
LS0tDQpsYW5nOiBwdA0KdGl0bGU6ICJFY29ub21pYSBSZWdpb25hbDogZXhlbXBsbyBkZSB0cmVlbWFwIG5vIGNvbcOpcmNpbyBpbnRlcm5hY2lvbmFsIg0KYXV0aG9yOiAiQWRyaWFubyBNYXJjb3MgUm9kcmlndWVzIEZpZ3VlaXJlZG8iDQpoZWFkZXItaW5jbHVkZXM6DQogIC0gXHVzZXBhY2thZ2VbcG9ydHVnZXNde2JhYmVsfQ0KbGlua2NvbG9yOiBibHVlDQpiaWJsaW9ncmFwaHk6IHBhY2thZ2VzLmJpYg0Kbm9jaXRlOiAnQConDQphYnN0cmFjdDogDQogIFRoaXMgaXMgYW4gdW5kZXJncmFkIHN0dWRlbnQgbGV2ZWwgaW5zdHJ1Y3Rpb24gZm9yIGNsYXNzIHVzZS4gIA0KZGF0ZTogImByIGZvcm1hdChTeXMuRGF0ZSgpLCAnJWQgJUIgJVknKWAiDQpvdXRwdXQ6DQogIGh0bWxfZG9jdW1lbnQ6DQogICAgY29kZV9kb3dubG9hZDogdHJ1ZQ0KICAgIHRoZW1lOiBkZWZhdWx0DQogICAgbnVtYmVyX3NlY3Rpb25zOiB0cnVlDQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZmxvYXQ6IG5vDQogICAgZGZfcHJpbnQ6IHBhZ2VkDQogICAgZmlnX2NhcHRpb246IHRydWUNCiAgcGRmX2RvY3VtZW50Og0KICAgIHRvYzogeWVzDQotLS0NCg0KYGBge3Iga25pdHJfaW5pdCwgZWNobz1GQUxTRSwgY2FjaGU9RkFMU0V9DQpsaWJyYXJ5KGtuaXRyKQ0KbGlicmFyeShybWFya2Rvd24pDQpsaWJyYXJ5KHJtZGZvcm1hdHMpDQoNCiMjIEdsb2JhbCBvcHRpb25zDQpvcHRpb25zKG1heC5wcmludD0iMTAwIikNCm9wdHNfY2h1bmskc2V0KGVjaG89VFJVRSwNCgkgICAgICAgICAgICAgY2FjaGU9VFJVRSwNCiAgICAgICAgICAgICAgIHByb21wdD1GQUxTRSwNCiAgICAgICAgICAgICAgIHRpZHk9VFJVRSwNCiAgICAgICAgICAgICAgIGNvbW1lbnQ9TkEsDQogICAgICAgICAgICAgICBtZXNzYWdlPUZBTFNFLA0KICAgICAgICAgICAgICAgd2FybmluZz1GQUxTRSkNCm9wdHNfa25pdCRzZXQod2lkdGg9MTAwKQ0KYGBgDQoNCiMgTGljZW7Dp2EgeyNMaWNlbsOnYSAudW5udW1iZXJlZH0NCg0KVGhpcyB3b3JrIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBDcmVhdGl2ZSBDb21tb25zIEF0dHJpYnV0aW9uLVNoYXJlQWxpa2UgNC4wIEludGVybmF0aW9uYWwgTGljZW5zZS4gVG8gdmlldyBhIGNvcHkgb2YgdGhpcyBsaWNlbnNlLCB2aXNpdCA8aHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvYnktc2EvNC4wLz4gb3Igc2VuZCBhIGxldHRlciB0byBDcmVhdGl2ZSBDb21tb25zLCBQTyBCb3ggMTg2NiwgTW91bnRhaW4gVmlldywgQ0EgOTQwNDIsIFVTQS4NCg0KIVtMaWNlbnNlOiBDQyBCWS1TQSA0LjBdKGh0dHBzOi8vbWlycm9ycy5jcmVhdGl2ZWNvbW1vbnMub3JnL3ByZXNza2l0L2J1dHRvbnMvODh4MzEvcG5nL2J5LXNhLnBuZyl7d2lkdGg9IjI1JSJ9DQoNCiMgQ2l0YcOnw6NvIHsjQ2l0YcOnw6NvIC51bm51bWJlcmVkfQ0KDQpTdWdlc3TDo28gZGUgY2l0YcOnw6NvOiBGSUdVRUlSRURPLCBBZHJpYW5vIE1hcmNvcyBSb2RyaWd1ZXMuIEVjb25vbWlhIFJlZ2lvbmFsOiBleGVtcGxvIGRlIHRyZWVtYXAgbm8gY29tw6lyY2lvIGludGVybmFjaW9uYWwuIENhbXBvIEdyYW5kZS1NUyxCcmFzaWw6IFJTdHVkaW8vUnB1YnMsIDIwMjEuIERpc3BvbsOtdmVsIGVtIDxodHRwOi8vcnB1YnMuY29tL2Ftcm9maS90cmVlbWFwMT4uDQoNCiMgSW50cm9kdcOnw6NvDQoNCk8gdHJlZW1hcCBwZXJtaXRlIHZpc3VhbGl6YXIgYmxvY29zIGN1am9zIHRhbWFuaG9zIHJlZmxldGVtIGEgZ3JhbmRlemEgZGEgdmFyacOhdmVsLCBlIGFzIGNvcmVzIHJlZmxldGVtIGFncnVwYW1lbnRvcyBvdSB0aXBvcyBkZSBwcm9kdXRvcy4gVMOqbSBzaWRvIG11aXRvIHV0aWxpemFkb3MgZW0gY29tw6lyY2lvIGludGVybmFjaW9uYWwsIHBvciBleGVtcGxvIG5vIE9ic2VydmF0w7NyaW8gZGUgQ29tcGxleGlkYWRlIEVjb27DtG1pY2EgLSBPRUMsIDxodHRwczovL29lYy53b3JsZC8+LCBlbSBkYXNoYm9hcmRzIGUgb3V0cmFzIHV0aWxpemHDp8O1ZXMuICAgIA0KDQpPIGV4ZW1wbG8gYSBzZWd1aXIgcmVwcm9kdXogZSBhZGFwdGEgYSByb3RpbmEgZGUgUGF1bG8gQWxlbmNhciAoPGh0dHBzOi8vd3d3LmZ1bGxqb2luLmNvbS5ici8+KSBlIGPDs2RpZ28gZGlzcG9uaWJpbGl6YWRvIGVtIDxodHRwczovL2dpdGh1Yi5jb20vcGF1bG9mZWxpcGUvdHV0b3JpYWxfZDNwbHVzcj4uIFV0aWxpemFyZW1vcyBvIHBhY290ZSBkZSBBbGVuY2FyIGUgR3VlcnJhICgyMDE2KSwgYEQzcGx1c1JgLiAgICANCg0KIyBFeGVtcGxvDQoNCk9zIGRhZG9zIHV0aWxpemFkb3MgZm9yYW0gZXh0cmHDrWRvcyBkbyBnaXRodWIgZGUgUGF1bG8gQWxlbmNhciwgZSBzw6NvIGRhcyBleHBvcnRhw6fDtWVzIGJyYXNpbGVpcmFzIHBhcmEgQ2hpbmEgYSBwYXJ0aXIgZGUgMjAxNSwgY29uc2lkZXJhbmRvIG8gcGVyw61vZG8gcGFyY2lhbCBhdMOpIGFicmlsLCBjb21vIHRhbWLDqW0gbyB0b3RhbCBkb3MgYW5vcyBkZSAyMDE1IGUgMjAxNi4gT3MgZGFkb3MgZXN0w6NvIGRlc2FncmVnYWRvcyBwb3IgZmF0b3IgYWdyZWdhZG8gZSBwcmluY2lwYWlzIHByb2R1dG9zIGV4cG9ydGFkb3MgZSBpbXBvcnRhZG9zLiBTdWdlcmUtc2UgcXVlIGEgYXR1YWxpemHDp8OjbyBzZWphIGZlaXRhIGEgcGFydGlyIGRvcyBkYWRvcyBkbyBDb210cmFkZSBjb20gbyBwYWNvdGUgYGNvbXRyYWRlcmAuIFPDo28gMzIyNiBvYnNlcnZhw6fDtWVzIGVtIDEwIGNvbHVuYXMuDQoNCmBgYHtyfQ0KbGlicmFyeShEM3BsdXNSKQ0KbGlicmFyeShkcGx5cikNCmRhZG9zX2NobiA8LSByZWFkLmNzdjIoJ2RhZG9zL2Nobi5jc3YnLCBzdHJpbmdzQXNGYWN0b3JzID0gRkFMU0UsDQogICAgICAgICAgICAgICAgICAgICAgIGVuY29kaW5nID0gJ2xhdGluMScpDQprbml0cjo6a2FibGUoaGVhZChkYWRvc19jaG4pKQ0KYGBgDQoNCsOJIHBvc3PDrXZlbCB2ZXIgcXVlIGFsZ3VtYXMgY29sdW5hcyBzw6NvIGRlc25lY2Vzc8OhcmlhcywgY29tbyBhIHByaW1laXJhIGNvbHVuYSBxdWUgY29udMOpbSBhcGVuYXMgYSBpbmZvcm1hw6fDo28gZGUgcXVlIHPDo28gZXhwb3J0YcOnw7VlcyBlIGltcG9ydGHDp8O1ZXMuIE1hcyBlbGEgcG9kZSBzZXIgw7p0aWwgc2UgaG91dmVyIHRhbWLDqW0gYXMgaW1wb3J0YcOnw7VlcyBubyBtZXNtbyBkYXRhc2V0LiBBIGludmVzdGlnYcOnw6NvIGRvIGRhdGFzZXQgcG9kZSBzZXIgbWVsaG9yYWRhIHVzYW5kbyBhIGZ1bsOnw6NvIGB1bmlxdWVgLiBWb2PDqnMgdmVyw6NvIHF1ZSBvIGRhdGFzZXQgY29udMOqbSBleHBvcnRhw6fDtWVzIGUgaW1wb3J0YcOnw7Vlcy4gVGFtYsOpbSBvbGhhbW9zIGEgY29sdW5hIGBQRVJJT0RPYC4gVmVyZW1vcyBxdWUgdGVtIGluZm9ybWHDp8O1ZXMgcGFyYSBgSmFuLUFicmAgZSBwYXJhIGBUb3RhbGAuICAgICANCg0KYGBge3J9DQp1bmlxdWUoZGFkb3NfY2huWyJUSVBPIl0pDQp1bmlxdWUoZGFkb3NfY2huWyJQRVJJT0RPIl0pDQpgYGANCg0KU2VwYXJhcmVtb3MgZW50w6NvIGFwZW5hcyBhcyBleHBvcnRhw6fDtWVzLCBwYXJhIHBlcsOtb2RvIGlndWFsIGEgdG90YWwuIE5hIHNlcXXDqm5jaWEsIHVtIHByaW1laXJvIHRyZWVtYXAgY29udGVuZG8gYXBlbmFzIGEgaW5mb3JtYcOnw6NvIHJlZ2lzdHJhZGEgZW0gYE5PX0ZBVF9BR1JFR2AgZSBgTk9fUFBFX1BQSWAuIFV0aWxpemFyZW1vcyBvIHBhY290ZSBgRDNwbHVzUmAgcGFyYSBlbGFib3JhciBvIHRyZWVtYXAuIA0KICAgICANCkVzdGEgaW5mb3JtYcOnw6NvIHRyYXRhcsOhIGFzIGR1YXMgY29sdW5hcyBjb21vIGZhdG9yZXMsIGNvbnRhbmRvIG9zIHJlc3V0bGFkb3MgZW0gY2FkYSBjYXNvLCBwYXJhIG8gZGF0YXNldCBkZSBleHBvcnRhw6fDtWVzIChgZGFkb3NfY2huX2V4cGApLiBPYnNlcnZhLXNlIGEgcHJlZG9taW7Dom5jaWEgZGFzIGV4cG9ydGHDp8O1ZXMgYnJhc2lsZWlyYXMgcGFyYSBhIENoaW5hIGRlIHByb2R1dG9zIGLDoXNpY29zLCBjYWl4YSBhbWFyZWxhLCBlIGFzc2ltIHRlbS1zZSB1bSBwcmltZWlybyBvbGhhciBzb2JyZSBlc3RlcyBkYWRvcy4NCg0KYGBge3IsIGZpZy5jYXA9IlRyZWVtYXAgZGFzIGV4cG9ydGHDp8O1ZXMgYnJhc2lsZWlyYXMgcGFyYSBhIENoaW5hLCBUb3RhbCAoMjAxNS0xNikifQ0KZGFkb3NfY2huX2V4cCA8LSBkYWRvc19jaG4gJT4lIA0KICBmaWx0ZXIoVElQTyA9PSAiRVhQT1JUQcOHw5VFUyIsIFBFUklPRE8gPT0gIlRvdGFsIikNCg0KZDNwbHVzKGRhZG9zX2Nobl9leHAsIHR5cGUgPSAidHJlZV9tYXAiLCBpZCA9IGMoIk5PX0ZBVF9BR1JFRyIsICJOT19QUEVfUFBJIiksDQogICAgICAgd2lkdGggPSAiMTAwJSIsIGhlaWdodCA9IDUwMCkgJT4lIA0KICBkM3BsdXNTaXplKCJWTF9GT0IiKQ0KYGBgDQoNClBhcmEgcXVlIG8gYEQzcGx1c1JgIHBvc3NhIG1vc3RyYXIgYXMgcGFydGljaXBhw6fDtWVzLCDDqSBuZWNlc3PDoXJpbyBxdWUgb3MgcsOzdHVsb3MgKF9sYWJlbHNfKSB0ZW5oYW0gbyBzZXUgYWxpbmhhbWVudG8gdmVydGljYWwgZGVmaW5pZG8gcGFyYSBvIHRvcG8gKGBkM3BsdXNMYWJlbHModmFsdWUgPSBUUlVFLCB2YWxpZ24gPSAidG9wIilgKS4NCg0KYGBge3IsIGZpZy5jYXA9IlRyZWVtYXAgZGFzIGV4cG9ydGHDp8O1ZXMgYnJhc2lsZWlyYXMgcGFyYSBhIENoaW5hLCBUb3RhbCAoMjAxNS0xNikifQ0KZDNwbHVzKGRhZG9zX2Nobl9leHAsIHR5cGUgPSAidHJlZV9tYXAiLCBpZCA9IGMoIk5PX0ZBVF9BR1JFRyIsICJOT19QUEVfUFBJIiksDQogICAgICAgd2lkdGggPSAiMTAwJSIsIGhlaWdodCA9IDUwMCkgJT4lIA0KICBkM3BsdXNTaXplKCJWTF9GT0IiKSAlPiUgDQogIGQzcGx1c0xhYmVscyh2YWx1ZSA9IFRSVUUsIHZhbGlnbiA9ICJ0b3AiKQ0KYGBgDQoNCg0KQWdvcmEsIHZhbW9zIGRlZmluaXIgcXVlIG8gbsOtdmVsIGRlIHByb2Z1bmRpZGFkZSBkYSB2aXN1YWxpemHDp8OjbyDDqSBvIGRlIHByb2R1dG9zLCBvdSBzZWphLCBgZDNwbHVzRGVwdGgoMSlgLiBBIHBvc2nDp8OjbyBkYSBwcm9mdW5kaWRhZGUgRGVwdGggw6kgZGVmaW5pZGEgcGVsYSBvcMOnw6NvIGBpZCA9IGMoIk5PX0ZBVF9BR1JFRyIsICJOT19QUEVfUFBJIilgLCBxdWUgdmFyaWEgaW5pY2lhbmRvIGVtICIwIi4gT3Ugc2VqYSwgcGFyYSBvIGRldGFsaGFtZW50byBlbSBuw612ZWwgZGUgICJOT19QUEVfUFBJIiwgZXNwZWNpZmljYXIgIjEiIGVtIGBkM3BsdXNEZXB0aCgpYC4gQSBjb3IgZm9pIGRlZmluaWRhIHBlbG8gZmF0b3IgYWdyZWdhZG8gYGQzcGx1c0NvbG9yKHZhbHVlID0gIk5PX0ZBVF9BR1JFRyIpYDoNCg0KYGBge3IsIGZpZy5jYXA9IlRyZWVtYXAgZGFzIGV4cG9ydGHDp8O1ZXMgYnJhc2lsZWlyYXMgcGFyYSBhIENoaW5hLCBUb3RhbCAoMjAxNS0xNikifQ0KZDNwbHVzKGRhZG9zX2Nobl9leHAsIHR5cGUgPSAidHJlZV9tYXAiLCBpZCA9IGMoIk5PX0ZBVF9BR1JFRyIsICJOT19QUEVfUFBJIiksDQogICAgICAgd2lkdGggPSAiMTAwJSIsIGhlaWdodCA9IDUwMCkgJT4lIA0KICBkM3BsdXNTaXplKCJWTF9GT0IiKSAlPiUgDQogIGQzcGx1c0xhYmVscyh2YWx1ZSA9IFRSVUUsIHZhbGlnbiA9ICJ0b3AiKSAlPiUgDQogIGQzcGx1c0RlcHRoKDEpICU+JSANCiAgZDNwbHVzQ29sb3IodmFsdWUgPSAiTk9fRkFUX0FHUkVHIikgJT4lIA0KICBkM3BsdXNMZWdlbmQodmFsdWUgPSBUUlVFLCBvcmRlciA9IGxpc3QodmFsdWUgPSAic2l6ZSIsIHNvcnQgPSAiZGVzYyIpKQ0KYGBgDQoNCiMgUmVmZXLDqm5jaWFzIHsjUmVmZXLDqm5jaWFzIC51bm51bWJlcmVkfQ0KDQoqKlJlZmVyw6puY2lhcyBkZSBwYWNvdGVzIHV0aWxpemFkb3MgLSoqIGxpc3RhIHRvZG9zIG9zIHBhY290ZXMgcXVlIGZvcmFtIGFiZXJ0b3MgZW0gYWxndW0gcHJvY2VkaW1lbnRvDQoNCmBgYHtyLGluY2x1ZGU9RkFMU0Usd2FybmluZz1GQUxTRSxjb21tZW50PUZBTFNFfQ0Ka25pdHI6OndyaXRlX2JpYihjKC5wYWNrYWdlcygpLCAiYm9va2Rvd24iKSwgInBhY2thZ2VzLmJpYiIsIHdpZHRoID0gNjApDQpgYGA=