Logo do R

Visualização de Dados

Farley Andrade e Lopes

8ª RPM

Exercicio 1.1

Este estudo utiliza o conjunto de dados mtcars para explorar a relação entre o peso do veículo e seu consumo de combustível, diferenciando os resultados pelo número de cilindros.

Exercicio 1.2

O conjunto de dados diamonds é explorado para visualizar a distribuição da qualidade de corte (cut) dos diamantes.

Exercicio 1.3

Análise da variação de preços dos diamantes em função da qualidade de corte, utilizando um gráfico de violino para visualizar a densidade da distribuição.

Exercicio 1.4

Difereça entre geom_point() versus geom_jitter()

A escolha entre as funções geom_point() e geom_jitter() no ggplot2 é crucial para a correta representação de dados, especialmente em cenários com variáveis discretas ou categóricas.

O geom_point() plota as observações diretamente em suas coordenadas. Quando múltiplos pontos compartilham exatamente o mesmo par de coordenadas (um fenômeno conhecido como overplotting), eles se sobrepõem, ocultando a verdadeira densidade dos dados.

Em contraste, o geom_jitter() introduz uma pequena quantidade de ruído aleatório (ou “tremor”) nas posições dos pontos. Este deslocamento é sutil o suficiente para não distorcer a relação geral, mas eficaz para separar pontos sobrepostos. Isso revela a concentração real de dados em valores discretos, sendo a opção preferencial para:

  • Visualizar dados categóricos ou discretos em um eixo.
  • Mostrar a distribuição de pontos em um boxplot ou gráfico de violino.

Em resumo, o geom_point() é ideal para dados contínuos sem sobreposição significativa, enquanto o geom_jitter() é uma técnica de desagregação essencial para lidar com o overplotting em dados discretos.

A Estrutura da Gramática dos Gráficos (Grammar of Graphics)

A Gramática dos Gráficos, formalizada por Leland Wilkinson, é o princípio teórico que fundamenta o ggplot2. Ela postula que qualquer visualização estatística pode ser construída pela combinação de componentes independentes. Essa abordagem declarativa permite que o usuário se concentre no que deseja visualizar, e não em como desenhar.

No contexto do ggplot2, a construção de um gráfico segue uma sintaxe de camadas, onde cada componente é adicionado sequencialmente, sendo os principais:

  • Dados: conjunto de informações a serem representadas.
  • Estética (aes): mapeamento de variáveis para atributos visuais (posição, cor, tamanho).
  • Geometrias (geom): formas gráficas (pontos, linhas, barras).
  • Escalas (scale): traduzem valores em atributos visuais.
  • Coordenadas (coord): definem o sistema de posicionamento.
  • Facetas (facet): dividem os dados em subgráficos.
  • Tema (theme): controla aparência geral.

A força do ggplot2 reside em sua modularidade, permitindo a criação de visualizações complexas e personalizadas apenas combinando e ajustando esses elementos.

DQotLS0NCnRpdGxlOiAiVHJhYmFsaG8gZmluYWwgZGUgVmlzdWFsaXphw6fDo28gZGUgRGFkb3MiDQphdXRob3I6ICJCeSBGYXJsZXkgTG9wZXMiDQpkYXRlOiAiYHIgZm9ybWF0KFN5cy5EYXRlKCksICclZCBkZSAlQiBkZSAlWScpYCINCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDoNCiAgICB0aGVtZTogY29zbW8NCiAgICBoaWdobGlnaHQ6IHplbmJ1cm4NCiAgICB0b2M6IHRydWUNCiAgICB0b2NfZmxvYXQ6IHRydWUNCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlDQotLS0NCg0KPGRpdiBzdHlsZT0iZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjsgZ2FwOiAxNnB4OyBtYXJnaW4tYm90dG9tOiAyMHB4OyI+PGltZyBzcmM9Imh0dHBzOi8vZW5jcnlwdGVkLXRibjAuZ3N0YXRpYy5jb20vaW1hZ2VzP3E9dGJuOkFOZDlHY1ExckJfVjBMSHFlSnlxUS1oMkRPWHk4UExXdE56R2VBdllxUSZzIiBhbHQ9IkxvZ28gZG8gUiIgc3R5bGU9IndpZHRoOiAxMjBweDsgYm9yZGVyLXJhZGl1czogOHB4OyBib3JkZXI6IDFweCBzb2xpZCAjY2NjOyI+PGRpdiBzdHlsZT0ibGluZS1oZWlnaHQ6IDEuMjsgdGV4dC1hbGlnbjogY2VudGVyOyI+PGgyIHN0eWxlPSJtYXJnaW46IDA7IGZvbnQtd2VpZ2h0OiBib2xkOyI+VmlzdWFsaXphw6fDo28gZGUgRGFkb3M8L2gyPjxoMyBzdHlsZT0ibWFyZ2luOiAwOyI+RmFybGV5IEFuZHJhZGUgZSBMb3BlczwvaDM+PGg0IHN0eWxlPSJtYXJnaW46IDA7Ij44wqogUlBNPC9oND48L2Rpdj48L2Rpdj4NCg0KIyB7LnRhYnNldH0NCg0KIyMgKipFeGVyY2ljaW8gMS4xKioNCg0KRXN0ZSBlc3R1ZG8gdXRpbGl6YSBvIGNvbmp1bnRvIGRlIGRhZG9zIGBtdGNhcnNgIHBhcmEgZXhwbG9yYXIgYSByZWxhw6fDo28gZW50cmUgbyBwZXNvIGRvIHZlw61jdWxvIGUgc2V1IGNvbnN1bW8gZGUgY29tYnVzdMOtdmVsLCBkaWZlcmVuY2lhbmRvIG9zIHJlc3VsdGFkb3MgcGVsbyBuw7ptZXJvIGRlIGNpbGluZHJvcy4NCg0KYGBge3IgYW5hbGlzZV9tdGNhcnMsIGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0V9DQpsaWJyYXJ5KGdncGxvdDIpDQoNCiMgQ2FycmVnYW1lbnRvIGRvIGNvbmp1bnRvIGRlIGRhZG9zDQpkYWRvc192ZWljdWxvcyA8LSBtdGNhcnMNCg0KIyBDcmlhw6fDo28gZG8gZ3LDoWZpY28gZGUgZGlzcGVyc8Ojbw0KZ2dwbG90KGRhdGEgPSBkYWRvc192ZWljdWxvcywgYWVzKHggPSB3dCwgeSA9IG1wZywgc2hhcGUgPSBmYWN0b3IoY3lsKSkpICsNCiAgZ2VvbV9wb2ludChzaXplID0gNCwgYWVzKGNvbG9yID0gZmFjdG9yKGN5bCkpKSArDQogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIHNlID0gRkFMU0UsIGNvbG9yID0gImdyYXk1MCIsIGxpbmV0eXBlID0gImRhc2hlZCIpICsNCiAgbGFicygNCiAgICB0aXRsZSA9ICJDb3JyZWxhw6fDo28gZW50cmUgTWFzc2EgZSBFZmljacOqbmNpYSBkZSBDb21idXN0w612ZWwiLA0KICAgIHggPSAiTWFzc2EgZG8gVmXDrWN1bG8gKG1pbGhhcmVzIGRlIGxpYnJhcykiLA0KICAgIHkgPSAiRWZpY2nDqm5jaWEgKG1pbGhhcyBwb3IgZ2Fsw6NvKSIsDQogICAgc2hhcGUgPSAiQ2lsaW5kcm9zIiwNCiAgICBjb2xvciA9ICJDaWxpbmRyb3MiDQogICkgKw0KICB0aGVtZV9idygpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIpDQpgYGANCg0KIyMgKipFeGVyY2ljaW8gMS4yKioNCg0KTyBjb25qdW50byBkZSBkYWRvcyBgZGlhbW9uZHNgIMOpIGV4cGxvcmFkbyBwYXJhIHZpc3VhbGl6YXIgYSBkaXN0cmlidWnDp8OjbyBkYSBxdWFsaWRhZGUgZGUgY29ydGUgKGBjdXRgKSBkb3MgZGlhbWFudGVzLg0KDQpgYGB7ciBhbmFsaXNlX2RpYW1vbmRzX2Rpc3RyaWJ1aWNhbywgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRX0NCiMgQ2FycmVnYW1lbnRvIGRvIGNvbmp1bnRvIGRlIGRhZG9zDQpkYXRhKGRpYW1vbmRzKQ0KDQojIEdyw6FmaWNvIGRlIGJhcnJhcyBjb20gcHJvcG9yw6fDtWVzIGUgbm92YSBwYWxldGEgZGUgY29yZXMNCg0KZ2dwbG90KGRpYW1vbmRzLCBhZXMoeCA9IGN1dCwgZmlsbCA9IGN1dCkpICsNCiAgZ2VvbV9iYXIoKSArDQogIHNjYWxlX3hfZGlzY3JldGUobGltaXRzID0gbmFtZXMoc29ydCh0YWJsZShkaWFtb25kcyRjdXQpLCBkZWNyZWFzaW5nID0gVFJVRSkpKSArDQogIGdlb21fdGV4dCgNCiAgICBzdGF0ID0gImNvdW50IiwNCiAgICBhZXMobGFiZWwgPSBhZnRlcl9zdGF0KGNvdW50KSksDQogICAgdmp1c3QgPSAtMC41DQogICkgKw0KICBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlID0gIlJkQnUiKSArDQogIGxhYnMoDQogICAgdGl0bGUgPSAiQ29udGFnZW0gZGUgRGlhbWFudGVzIHBvciBDb3J0ZSIsDQogICAgeCA9ICJDb3J0ZSIsDQogICAgeSA9ICJRdWFudGlkYWRlIiwNCiAgICBmaWxsID0gIkN1dCINCiAgKSArDQogIHRoZW1lX21pbmltYWwoKQ0KYGBgDQoNCiMjICoqRXhlcmNpY2lvIDEuMyoqDQoNCkFuw6FsaXNlIGRhIHZhcmlhw6fDo28gZGUgcHJlw6dvcyBkb3MgZGlhbWFudGVzIGVtIGZ1bsOnw6NvIGRhIHF1YWxpZGFkZSBkZSBjb3J0ZSwgdXRpbGl6YW5kbyB1bSBncsOhZmljbyBkZSB2aW9saW5vIHBhcmEgdmlzdWFsaXphciBhIGRlbnNpZGFkZSBkYSBkaXN0cmlidWnDp8Ojby4NCg0KDQoNCg0KYGBge3IgYW5hbGlzZV9kaWFtb25kc19wcmVjbywgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRX0NCiMgR3LDoWZpY28gZGUgdmlvbGlubyBwYXJhIHZpc3VhbGl6YXIgYSBkZW5zaWRhZGUgZGEgZGlzdHJpYnVpw6fDo28gZGUgcHJlw6dvcw0KZ2dwbG90KGRpYW1vbmRzLCBhZXMoeCA9IGN1dCwgeSA9IHByaWNlLCBmaWxsID0gY3V0KSkgKw0KICBnZW9tX2JveHBsb3QodHJpbSA9IEZBTFNFLCBhbHBoYSA9IDAuNykgKw0KICBsYWJzKA0KICAgIHRpdGxlID0gIlZhcmlhw6fDo28gZGUgUHJlw6dvcyBwb3IgQ29ydGUiLA0KICAgIHggPSAiQ29ydGUiLA0KICAgIHkgPSAiUHJlw6dvIGRvIERpYW1hbnRlIg0KICApICsNCiAgIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoDQogICAgIkZhaXIiID0gIiNFNDA4MEEiLA0KICAgICJHb29kIiA9ICIjRkU5OTAwIiwNCiAgICAiVmVyeSBHb29kIiA9ICIjRkZGRjAwIiwNCiAgICAiUHJlbWl1bSIgPSAiIzFEMTVFNyIsDQogICAgIklkZWFsIiA9ICIjM0FCRTA1Ig0KICApKSArDQogIHRoZW1lX21pbmltYWwoKSArDQogIHRoZW1lKA0KICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwNCiAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDMwLCBoanVzdCA9IDEpDQogICkNCmBgYA0KDQojIyAqKkV4ZXJjaWNpbyAxLjQqKg0KDQojIyMgKipEaWZlcmXDp2EgZW50cmUgYGdlb21fcG9pbnQoKWAgdmVyc3VzIGBnZW9tX2ppdHRlcigpYCoqDQoNCkEgZXNjb2xoYSBlbnRyZSBhcyBmdW7Dp8O1ZXMgYGdlb21fcG9pbnQoKWAgZSBgZ2VvbV9qaXR0ZXIoKWAgbm8gKipnZ3Bsb3QyKiogw6kgY3J1Y2lhbCBwYXJhIGEgY29ycmV0YSByZXByZXNlbnRhw6fDo28gZGUgZGFkb3MsIGVzcGVjaWFsbWVudGUgZW0gY2Vuw6FyaW9zIGNvbSB2YXJpw6F2ZWlzIGRpc2NyZXRhcyBvdSBjYXRlZ8OzcmljYXMuDQoNCk8gYGdlb21fcG9pbnQoKWAgcGxvdGEgYXMgb2JzZXJ2YcOnw7VlcyBkaXJldGFtZW50ZSBlbSBzdWFzIGNvb3JkZW5hZGFzLiBRdWFuZG8gbcO6bHRpcGxvcyBwb250b3MgY29tcGFydGlsaGFtIGV4YXRhbWVudGUgbyBtZXNtbyBwYXIgZGUgY29vcmRlbmFkYXMgKHVtIGZlbsO0bWVubyBjb25oZWNpZG8gY29tbyAqb3ZlcnBsb3R0aW5nKiksIGVsZXMgc2Ugc29icmVww7VlbSwgb2N1bHRhbmRvIGEgdmVyZGFkZWlyYSBkZW5zaWRhZGUgZG9zIGRhZG9zLg0KDQpFbSBjb250cmFzdGUsIG8gYGdlb21faml0dGVyKClgIGludHJvZHV6IHVtYSBwZXF1ZW5hIHF1YW50aWRhZGUgZGUgcnXDrWRvIGFsZWF0w7NyaW8gKG91ICJ0cmVtb3IiKSBuYXMgcG9zacOnw7VlcyBkb3MgcG9udG9zLiBFc3RlIGRlc2xvY2FtZW50byDDqSBzdXRpbCBvIHN1ZmljaWVudGUgcGFyYSBuw6NvIGRpc3RvcmNlciBhIHJlbGHDp8OjbyBnZXJhbCwgbWFzIGVmaWNheiBwYXJhIHNlcGFyYXIgcG9udG9zIHNvYnJlcG9zdG9zLiBJc3NvIHJldmVsYSBhIGNvbmNlbnRyYcOnw6NvIHJlYWwgZGUgZGFkb3MgZW0gdmFsb3JlcyBkaXNjcmV0b3MsIHNlbmRvIGEgb3DDp8OjbyBwcmVmZXJlbmNpYWwgcGFyYToNCg0KKiAgIFZpc3VhbGl6YXIgZGFkb3MgY2F0ZWfDs3JpY29zIG91IGRpc2NyZXRvcyBlbSB1bSBlaXhvLg0KKiAgIE1vc3RyYXIgYSBkaXN0cmlidWnDp8OjbyBkZSBwb250b3MgZW0gdW0gYm94cGxvdCBvdSBncsOhZmljbyBkZSB2aW9saW5vLg0KDQpFbSByZXN1bW8sIG8gYGdlb21fcG9pbnQoKWAgw6kgaWRlYWwgcGFyYSBkYWRvcyBjb250w61udW9zIHNlbSBzb2JyZXBvc2nDp8OjbyBzaWduaWZpY2F0aXZhLCBlbnF1YW50byBvIGBnZW9tX2ppdHRlcigpYCDDqSB1bWEgdMOpY25pY2EgZGUgKipkZXNhZ3JlZ2HDp8OjbyoqIGVzc2VuY2lhbCBwYXJhIGxpZGFyIGNvbSBvICpvdmVycGxvdHRpbmcqIGVtIGRhZG9zIGRpc2NyZXRvcy4NCg0KYGBge3IgY29tcGFyYWNhb19nZW9tcywgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRX0NCmxpYnJhcnkoZ3JpZCkNCg0KIyBGaWx0cmFnZW0gZGUgZGFkb3MgcGFyYSBjb21wYXJhw6fDo28NCmRhZG9zX3NlbGVjaW9uYWRvcyA8LSBzdWJzZXQobXBnLCBjbGFzcyAlaW4lIGMoImNvbXBhY3QiLCAic3V2IiwgIm1pZHNpemUiKSkNCg0KIyBHcsOhZmljbyAxOiBVc28gZGUgZ2VvbV9wb2ludCgpDQpncmFmaWNvX3BvbnRvIDwtIGdncGxvdChkYWRvc19zZWxlY2lvbmFkb3MsIGFlcyh4ID0gY2xhc3MsIHkgPSBod3kpKSArDQogIGdlb21fcG9pbnQoY29sb3IgPSAiIzM0OThkYiIsIHNpemUgPSAzKSArDQogIGxhYnMoDQogICAgdGl0bGUgPSAiZ2VvbV9wb2ludCgpOiBTb2JyZXBvc2nDp8OjbyBPY3VsdGEgRGVuc2lkYWRlIiwNCiAgICB4ID0gIlRpcG8gZGUgVmXDrWN1bG8iLA0KICAgIHkgPSAiQ29uc3VtbyBSb2RvdmnDoXJpbyAobXBnKSINCiAgKSArDQogIHRoZW1lX2NsYXNzaWMoKQ0KDQojIEdyw6FmaWNvIDI6IFVzbyBkZSBnZW9tX2ppdHRlcigpDQpncmFmaWNvX2ppdHRlciA8LSBnZ3Bsb3QoZGFkb3Nfc2VsZWNpb25hZG9zLCBhZXMoeCA9IGNsYXNzLCB5ID0gaHd5KSkgKw0KICBnZW9tX2ppdHRlcihjb2xvciA9ICIjZTc0YzNjIiwgc2l6ZSA9IDMsIHdpZHRoID0gMC4yLCBoZWlnaHQgPSAwKSArDQogIGxhYnMoDQogICAgdGl0bGUgPSAiZ2VvbV9qaXR0ZXIoKTogUmV2ZWxhbmRvIGEgQ29uY2VudHJhw6fDo28gZGUgRGFkb3MiLA0KICAgIHggPSAiVGlwbyBkZSBWZcOtY3VsbyIsDQogICAgeSA9ICJDb25zdW1vIFJvZG92acOhcmlvIChtcGcpIg0KICApICsNCiAgdGhlbWVfY2xhc3NpYygpDQoNCiMgT3JnYW5pemHDp8OjbyBkb3MgZ3LDoWZpY29zIGxhZG8gYSBsYWRvDQpncmlkLm5ld3BhZ2UoKQ0KcHVzaFZpZXdwb3J0KHZpZXdwb3J0KGxheW91dCA9IGdyaWQubGF5b3V0KDEsIDIpKSkNCnByaW50KGdyYWZpY29fcG9udG8sIHZwID0gdmlld3BvcnQobGF5b3V0LnBvcy5yb3cgPSAxLCBsYXlvdXQucG9zLmNvbCA9IDEpKQ0KcHJpbnQoZ3JhZmljb19qaXR0ZXIsIHZwID0gdmlld3BvcnQobGF5b3V0LnBvcy5yb3cgPSAxLCBsYXlvdXQucG9zLmNvbCA9IDIpKQ0KYGBgDQoNCiMjIyAqKkEgRXN0cnV0dXJhIGRhIEdyYW3DoXRpY2EgZG9zIEdyw6FmaWNvcyAoR3JhbW1hciBvZiBHcmFwaGljcykqKg0KDQpBICoqR3JhbcOhdGljYSBkb3MgR3LDoWZpY29zKiosIGZvcm1hbGl6YWRhIHBvciBMZWxhbmQgV2lsa2luc29uLCDDqSBvIHByaW5jw61waW8gdGXDs3JpY28gcXVlIGZ1bmRhbWVudGEgbyAqKmdncGxvdDIqKi4gRWxhIHBvc3R1bGEgcXVlIHF1YWxxdWVyIHZpc3VhbGl6YcOnw6NvIGVzdGF0w61zdGljYSBwb2RlIHNlciBjb25zdHJ1w61kYSBwZWxhIGNvbWJpbmHDp8OjbyBkZSBjb21wb25lbnRlcyBpbmRlcGVuZGVudGVzLiBFc3NhIGFib3JkYWdlbSBkZWNsYXJhdGl2YSBwZXJtaXRlIHF1ZSBvIHVzdcOhcmlvIHNlIGNvbmNlbnRyZSBubyBxdWUgZGVzZWphIHZpc3VhbGl6YXIsIGUgbsOjbyBlbSBjb21vIGRlc2VuaGFyLg0KDQpObyBjb250ZXh0byBkbyAqKmdncGxvdDIqKiwgYSBjb25zdHJ1w6fDo28gZGUgdW0gZ3LDoWZpY28gc2VndWUgdW1hIHNpbnRheGUgZGUgY2FtYWRhcywgb25kZSBjYWRhIGNvbXBvbmVudGUgw6kgYWRpY2lvbmFkbyBzZXF1ZW5jaWFsbWVudGUsIHNlbmRvIG9zIHByaW5jaXBhaXM6DQoNCi0gKipEYWRvcyoqOiBjb25qdW50byBkZSBpbmZvcm1hw6fDtWVzIGEgc2VyZW0gcmVwcmVzZW50YWRhcy4gIA0KLSAqKkVzdMOpdGljYSAoYWVzKSoqOiBtYXBlYW1lbnRvIGRlIHZhcmnDoXZlaXMgcGFyYSBhdHJpYnV0b3MgdmlzdWFpcyAocG9zacOnw6NvLCBjb3IsIHRhbWFuaG8pLiAgDQotICoqR2VvbWV0cmlhcyAoZ2VvbSkqKjogZm9ybWFzIGdyw6FmaWNhcyAocG9udG9zLCBsaW5oYXMsIGJhcnJhcykuICANCi0gKipFc2NhbGFzIChzY2FsZSkqKjogdHJhZHV6ZW0gdmFsb3JlcyBlbSBhdHJpYnV0b3MgdmlzdWFpcy4gIA0KLSAqKkNvb3JkZW5hZGFzIChjb29yZCkqKjogZGVmaW5lbSBvIHNpc3RlbWEgZGUgcG9zaWNpb25hbWVudG8uICANCi0gKipGYWNldGFzIChmYWNldCkqKjogZGl2aWRlbSBvcyBkYWRvcyBlbSBzdWJncsOhZmljb3MuICANCi0gKipUZW1hICh0aGVtZSkqKjogY29udHJvbGEgYXBhcsOqbmNpYSBnZXJhbC4gIA0KDQpBIGZvcsOnYSBkbyAqKmdncGxvdDIqKiByZXNpZGUgZW0gc3VhIG1vZHVsYXJpZGFkZSwgcGVybWl0aW5kbyBhIGNyaWHDp8OjbyBkZSB2aXN1YWxpemHDp8O1ZXMgY29tcGxleGFzIGUgcGVyc29uYWxpemFkYXMgYXBlbmFzIGNvbWJpbmFuZG8gZSBhanVzdGFuZG8gZXNzZXMgZWxlbWVudG9zLg0KDQpgYGB7ciwgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRX0NCmRhZG9zX2ZpbHRyYWRvcyA8LSBzdWJzZXQobXBnLCBjbGFzcyAlaW4lIGMoImNvbXBhY3QiLCAic3V2IiwgIm1pZHNpemUiKSkNCg0KZGFkb3NfZmlsdHJhZG9zMiA8LSBzdWJzZXQoZGFkb3NfZmlsdHJhZG9zLCBod3kgIT0gNDApDQoNCmcxIDwtIGdncGxvdChkYWRvc19maWx0cmFkb3MsIGFlcyh4ID0gY2xhc3MsIHkgPSBod3kpKSArDQogIGdlb21fcG9pbnQoY29sb3IgPSAiIzM0OThkYiIsIHNpemUgPSAzKSArDQogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIGZvcm11bGEgPSB5IH4geCwgc2UgPSBGQUxTRSwgY29sb3IgPSAicmVkIikgKw0KICBsYWJzKA0KICAgIHRpdGxlID0gIkdyYW3DoXRpY2E6IGRhZG9zL2VzdMOpdGljYS9nZW9tZXRyaWEiLA0KICAgIHggPSAiQ2F0ZWdvcmlhIGRvIHZlw61jdWxvIiwNCiAgICB5ID0gIkNvbnN1bW8gbmEgZXN0cmFkYSAobXBnKSINCiAgKSArDQogIHRoZW1lX21pbmltYWwoKQ0KDQpnMiA8LSBnZ3Bsb3QoZGFkb3NfZmlsdHJhZG9zMiwgYWVzKHggPSBod3ksIGZpbGwgPSBjbGFzcykpICsNCiAgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGggPSAyLCBjb2xvciA9ICJ3aGl0ZSIpICsNCiAgZmFjZXRfd3JhcCh+IGNsYXNzKSArDQogIHNjYWxlX3hfY29udGludW91cygNCiAgICBicmVha3MgPSBjKDEwLCAyMCwgMzApLA0KICAgIGxpbWl0cyA9IGMoOCwgMzIpDQogICkgKw0KICBsYWJzKA0KICAgIHRpdGxlID0gIkdyYW3DoXRpY2E6IGZhY2V0YXMgcGFyYSBjb21wYXJhw6fDo28iLA0KICAgIHggPSAiQ29uc3VtbyBuYSBlc3RyYWRhIChtcGcpIiwNCiAgICB5ID0gIkZyZXF1w6puY2lhIg0KICApICsNCiAgdGhlbWVfbWluaW1hbCgpICsgDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikNCg0KZ3JpZC5uZXdwYWdlKCkNCnB1c2hWaWV3cG9ydCh2aWV3cG9ydChsYXlvdXQgPSBncmlkLmxheW91dCgxLCAyKSkpDQpwcmludChnMSwgdnAgPSB2aWV3cG9ydChsYXlvdXQucG9zLnJvdyA9IDEsIGxheW91dC5wb3MuY29sID0gMSkpDQpwcmludChnMiwgdnAgPSB2aWV3cG9ydChsYXlvdXQucG9zLnJvdyA9IDEsIGxheW91dC5wb3MuY29sID0gMikpDQpgYGANCg==