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: Rotina rápida para associar datasets em R. Campo Grande-MS,Brasil: RStudio/Rpubs, 2021. Disponível em <http://rpubs.com/amrofi/Regional_Economics_associate>.

1 Introdução

Segue uma rotina rápida para comparar dois data.frames e gerar uma coluna indicadora de quando o dado constar nos dois. A ideia é comparar colunas dos dois datasets e resultar em 1 quando estiver nos dois e 0 quando não estiver.

2 Rotina de cálculo

2.1 Exemplo CPF

Essa rotina foi fornecida pelo Denis Oliveira Rodrigues no grupo do Facebook R - Brasil Programadores em 17/05/2021.

# Rotina rápida para comparar dataframes e associar dummy
x1 <- data.frame(cpf = c(112221, 142214, 121412))

x2 <- data.frame(cpf = c(121412, 145177, 464556, 142214))

x2$indicadora <- ifelse(x2$cpf %in% x1$cpf, 1, 0)

x2$indicadora
[1] 1 0 0 1
print(x2)
     cpf indicadora
1 121412          1
2 145177          0
3 464556          0
4 142214          1

2.2 Exemplo para selecionar grupo de municípios

Primeiro, chamamos os dados. Atentar para a presença de coluna de Total e para a linha do Total. Os dados foram colocados embedded no code.

ICN_Sala <- structure(list(Munic = c("Acorizal", "Agua Boa", "Alta Floresta", "Alto Araguaia", 
    "Alto Boa Vista", "Alto Garcas", "Alto Paraguai", "Alto Taquari", "Apiacas", 
    "Araguaiana", "Araguainha", "Araputanga", "Arenapolis", "Aripuana", "Barao de Melgaco", 
    "Barra do Bugres", "Barra do Garcas", "Bom Jesus do Araguaia", "Brasnorte", "Caceres", 
    "Campinapolis", "Campo Novo do Parecis", "Campo Verde", "Campos de Julio", "Canabrava do Norte", 
    "Canarana", "Carlinda", "Castanheira", "Chapada dos Guimaraes", "Claudia", "Cocalinho", 
    "Colider", "Colniza", "Comodoro", "Confresa", "Conquista D'Oeste", "Cotriguacu", 
    "Cuiaba", "Curvelândia", "Denise", "Diamantino", "Dom Aquino", "Feliz Natal", 
    "Figueiropolis D Oeste", "Gaucha do Norte", "General Carneiro", "Gloria D'oeste", 
    "Guaranta do Norte", "Guiratinga", "Indiavai", "Ipiranga do Norte", "Itanhanga", 
    "Itauba", "Itiquira", "Jaciara", "Jangada", "Jauru", "Juara", "Juina", "Juruena", 
    "Juscimeira", "Lambari D'oeste", "Lucas do Rio Verde", "Luciara", "Vila Bela da Santissima Trindade", 
    "Marcelandia", "Matupa", "Mirassol Doeste", "Nobres", "Nortelandia", "Nossa Senhora do Livramento", 
    "Nova Bandeirantes", "Nova Nazaré", "Nova Lacerda", "Nova Santa Helena", "Nova Brasilandia", 
    "Nova Canaa do Norte", "Nova Mutum", "Nova Olimpia", "Nova Ubirata", "Nova Xavantina", 
    "Novo Mundo", "Novo Horizonte do Norte", "Novo Sao Joaquim", "Paranaita", "Paranatinga", 
    "Novo Santo Antonio", "Pedra Preta", "Peixoto de Azevedo", "Planalto da Serra", 
    "Pocone", "Pontal do Araguaia", "Ponte Branca", "Pontes e Lacerda", "Porto Alegre do Norte", 
    "Porto dos Gauchos", "Porto Esperidiao", "Porto Estrela", "Poxoreo", "Primavera do Leste", 
    "Querencia", "Sao Jose dos Quatro Marcos", "Reserva do Cabacal", "Ribeirao Cascalheira", 
    "Ribeiraozinho", "Rio Branco", "Santa Carmem", "Santo Afonso", "Sao Jose do Povo", 
    "Sao Jose do Rio Claro", "Sao Jose do Xingu", "Sao Pedro da Cipa", "Rondolandia", 
    "Rondonopolis", "Rosario Oeste", "Santa Cruz do Xingu", "Salto do Ceu", "Santa Rita do Trivelato", 
    "Santa Terezinha", "Santo Antonio do Leste", "Santo Antonio do Leverger", "Sao Felix do Araguaia", 
    "Sapezal", "Serra Nova Dourada", "Sinop", "Sorriso", "Tabapora", "Tangara da Serra", 
    "Tapurah", "Terra Nova do Norte", "Tesouro", "Torixoreu", "Uniao do Sul", "Vale de São Domingos", 
    "Varzea Grande", "Vera", "Vila Rica", "Nova Guarita", "Nova Marilandia", "Nova Maringa", 
    "Nova Monte Verde", "Total"), bovinos = c(45, 551, 1272, 215, 72, 94, 36, 35, 
    196, 260, 19, 373, 63, 335, 152, 411, 1020, 63, 253, 1412, 171, 42, 107, 8, 57, 
    481, 173, 147, 149, 27, 465, 239, 35, 475, 85, 100, 79, 771, 9, 99, 115, 152, 
    26, 88, 157, 102, 59, 172, 169, 75, 46, 5, 208, 274, 157, 56, 202, 884, 420, 
    140, 252, 190, 6, 29, 1022, 201, 172, 265, 76, 26, 195, 255, 74, 186, 141, 141, 
    402, 177, 103, 81, 363, 229, 24, 140, 340, 542, 10, 409, 172, 110, 491, 123, 
    15, 1113, 31, 167, 529, 128, 422, 174, 254, 168, 6, 254, 15, 93, 40, 60, 63, 
    151, 427, 11, 244, 809, 188, 70, 88, 22, 238, 59, 575, 258, 31, 20, 205, 54, 
    159, 644, 108, 104, 97, 143, 36, 11, 196, 41, 440, 41, 86, 131, 429, 30698), 
    Total = c(238, 3633, 9571, 2588, 408, 2072, 295, 1878, 1142, 568, 234, 2876, 
        854, 2883, 492, 5130, 11613, 501, 2618, 11764, 768, 6883, 7311, 1367, 393, 
        2988, 756, 629, 1997, 2008, 991, 4499, 1870, 2794, 1420, 589, 1230, 204915, 
        256, 780, 6371, 1420, 1660, 383, 756, 718, 273, 2818, 1321, 279, 1031, 405, 
        946, 3204, 5011, 718, 853, 5303, 5370, 1086, 1127, 1038, 14104, 224, 1946, 
        1830, 2742, 4911, 1997, 579, 892, 1036, 254, 794, 487, 437, 1295, 10337, 
        4408, 2049, 1937, 632, 226, 1586, 1173, 3289, 84, 3946, 1812, 337, 2782, 
        549, 118, 5920, 638, 916, 1492, 401, 1955, 13069, 2436, 2448, 186, 815, 251, 
        488, 631, 290, 304, 2704, 946, 938, 716, 41066, 1465, 292, 449, 798, 748, 
        732, 3946, 1404, 5831, 79, 25469, 16098, 1554, 17268, 2677, 977, 392, 559, 
        548, 37, 38718, 1747, 2198, 302, 450, 1043, 1382, 622459)), row.names = c(NA, 
    -142L), class = c("tbl_df", "tbl", "data.frame"))
# recortei apenas alguns municipios
knitr::kable(ICN_Sala[c(35:45, 110:135), ], caption = "Tabela ICN_Sala com alguns municípios")
Tabela ICN_Sala com alguns municípios
Munic bovinos Total
35 Confresa 85 1420
36 Conquista D’Oeste 100 589
37 Cotriguacu 79 1230
38 Cuiaba 771 204915
39 Curvelândia 9 256
40 Denise 99 780
41 Diamantino 115 6371
42 Dom Aquino 152 1420
43 Feliz Natal 26 1660
44 Figueiropolis D Oeste 88 383
45 Gaucha do Norte 157 756
110 Sao Jose do Rio Claro 151 2704
111 Sao Jose do Xingu 427 946
112 Sao Pedro da Cipa 11 938
113 Rondolandia 244 716
114 Rondonopolis 809 41066
115 Rosario Oeste 188 1465
116 Santa Cruz do Xingu 70 292
117 Salto do Ceu 88 449
118 Santa Rita do Trivelato 22 798
119 Santa Terezinha 238 748
120 Santo Antonio do Leste 59 732
121 Santo Antonio do Leverger 575 3946
122 Sao Felix do Araguaia 258 1404
123 Sapezal 31 5831
124 Serra Nova Dourada 20 79
125 Sinop 205 25469
126 Sorriso 54 16098
127 Tabapora 159 1554
128 Tangara da Serra 644 17268
129 Tapurah 108 2677
130 Terra Nova do Norte 104 977
131 Tesouro 97 392
132 Torixoreu 143 559
133 Uniao do Sul 36 548
134 Vale de São Domingos 11 37
135 Varzea Grande 196 38718
# Agora a condicao: Cuiabá, Rondonópolis, Sinop e Várzea Grande com dummy 1 e 0
# para os demais atentar para acentos, cedilhas etc
x3 <- data.frame(Munic = c("Cuiaba", "Rondonopolis", "Sinop", "Varzea Grande"))
print(x3)
          Munic
1        Cuiaba
2  Rondonopolis
3         Sinop
4 Varzea Grande
ICN_Sala$indicadora <- ifelse(ICN_Sala$Munic %in% x3$Munic, 1, 0)

ICN_Sala$indicadora
  [1] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
 [38] 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
 [75] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
 [ reached getOption("max.print") -- omitted 42 entries ]
options(max.print = 1e+06)
knitr::kable(ICN_Sala[c(35:45, 110:135), ], caption = "Tabela ICN_Sala com indicadora de alguns municípios")
Tabela ICN_Sala com indicadora de alguns municípios
Munic bovinos Total indicadora
35 Confresa 85 1420 0
36 Conquista D’Oeste 100 589 0
37 Cotriguacu 79 1230 0
38 Cuiaba 771 204915 1
39 Curvelândia 9 256 0
40 Denise 99 780 0
41 Diamantino 115 6371 0
42 Dom Aquino 152 1420 0
43 Feliz Natal 26 1660 0
44 Figueiropolis D Oeste 88 383 0
45 Gaucha do Norte 157 756 0
110 Sao Jose do Rio Claro 151 2704 0
111 Sao Jose do Xingu 427 946 0
112 Sao Pedro da Cipa 11 938 0
113 Rondolandia 244 716 0
114 Rondonopolis 809 41066 1
115 Rosario Oeste 188 1465 0
116 Santa Cruz do Xingu 70 292 0
117 Salto do Ceu 88 449 0
118 Santa Rita do Trivelato 22 798 0
119 Santa Terezinha 238 748 0
120 Santo Antonio do Leste 59 732 0
121 Santo Antonio do Leverger 575 3946 0
122 Sao Felix do Araguaia 258 1404 0
123 Sapezal 31 5831 0
124 Serra Nova Dourada 20 79 0
125 Sinop 205 25469 1
126 Sorriso 54 16098 0
127 Tabapora 159 1554 0
128 Tangara da Serra 644 17268 0
129 Tapurah 108 2677 0
130 Terra Nova do Norte 104 977 0
131 Tesouro 97 392 0
132 Torixoreu 143 559 0
133 Uniao do Sul 36 548 0
134 Vale de São Domingos 11 37 0
135 Varzea Grande 196 38718 1

Referências

LS0tDQp0aXRsZTogIkVjb25vbWlhIFJlZ2lvbmFsOiBSb3RpbmEgcsOhcGlkYSBwYXJhIGFzc29jaWFyIGRhdGFzZXRzIGVtIFIiDQphdXRob3I6ICJBZHJpYW5vIE1hcmNvcyBSb2RyaWd1ZXMgRmlndWVpcmVkbywgKmUtbWFpbDogYWRyaWFuby5maWd1ZWlyZWRvQHVmbXMuYnIqIg0KbGlua2NvbG9yOiBibHVlDQphYnN0cmFjdDogDQogIFRoaXMgaXMgYW4gdW5kZXJncmFkIHN0dWRlbnQgbGV2ZWwgaW5zdHJ1Y3Rpb24gZm9yIGNsYXNzIHVzZS4gIA0KZGF0ZTogImByIGZvcm1hdChTeXMuRGF0ZSgpLCAnJWQgJUIgJVknKWAiDQpvdXRwdXQ6DQogIGh0bWxfZG9jdW1lbnQ6DQogICAgY29kZV9kb3dubG9hZDogdHJ1ZQ0KICAgIHRoZW1lOiBkZWZhdWx0DQogICAgbnVtYmVyX3NlY3Rpb25zOiB0cnVlDQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZmxvYXQ6IG5vDQogICAgZGZfcHJpbnQ6IHBhZ2VkDQogICAgZmlnX2NhcHRpb246IHRydWUNCiAgcGRmX2RvY3VtZW50Og0KICAgIHRvYzogeWVzDQotLS0NCg0KYGBge3Iga25pdHJfaW5pdCwgZWNobz1GQUxTRSwgY2FjaGU9RkFMU0V9DQpsaWJyYXJ5KGtuaXRyKQ0KbGlicmFyeShybWFya2Rvd24pDQpsaWJyYXJ5KHJtZGZvcm1hdHMpDQoNCiMjIEdsb2JhbCBvcHRpb25zDQpvcHRpb25zKG1heC5wcmludD0iMTAwIikNCm9wdHNfY2h1bmskc2V0KGVjaG89VFJVRSwNCgkgICAgICAgICAgICAgY2FjaGU9RiwNCiAgICAgICAgICAgICAgIHByb21wdD1GQUxTRSwNCiAgICAgICAgICAgICAgIHRpZHk9VFJVRSwNCiAgICAgICAgICAgICAgIGNvbW1lbnQ9TkEsDQogICAgICAgICAgICAgICBtZXNzYWdlPUZBTFNFLA0KICAgICAgICAgICAgICAgd2FybmluZz1GQUxTRSkNCm9wdHNfa25pdCRzZXQod2lkdGg9MTAwKQ0KYGBgDQoNCiMgTGljZW7Dp2EgeyNMaWNlbsOnYSAudW5udW1iZXJlZH0NCg0KVGhpcyB3b3JrIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBDcmVhdGl2ZSBDb21tb25zIEF0dHJpYnV0aW9uLVNoYXJlQWxpa2UgNC4wIEludGVybmF0aW9uYWwgTGljZW5zZS4gVG8gdmlldyBhIGNvcHkgb2YgdGhpcyBsaWNlbnNlLCB2aXNpdCA8aHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvYnktc2EvNC4wLz4gb3Igc2VuZCBhIGxldHRlciB0byBDcmVhdGl2ZSBDb21tb25zLCBQTyBCb3ggMTg2NiwgTW91bnRhaW4gVmlldywgQ0EgOTQwNDIsIFVTQS4NCg0KIVtMaWNlbnNlOiBDQyBCWS1TQSA0LjBdKGh0dHBzOi8vbWlycm9ycy5jcmVhdGl2ZWNvbW1vbnMub3JnL3ByZXNza2l0L2J1dHRvbnMvODh4MzEvcG5nL2J5LXNhLnBuZyl7d2lkdGg9IjI1JSJ9DQoNCiMgQ2l0YcOnw6NvIHsjQ2l0YcOnw6NvIC51bm51bWJlcmVkfQ0KDQpTdWdlc3TDo28gZGUgY2l0YcOnw6NvOiBGSUdVRUlSRURPLCBBZHJpYW5vIE1hcmNvcyBSb2RyaWd1ZXMuIEVjb25vbWlhIFJlZ2lvbmFsOiBSb3RpbmEgcsOhcGlkYSBwYXJhIGFzc29jaWFyIGRhdGFzZXRzIGVtIFIuIENhbXBvIEdyYW5kZS1NUyxCcmFzaWw6IFJTdHVkaW8vUnB1YnMsIDIwMjEuIERpc3BvbsOtdmVsIGVtIFs8aHR0cDovL3JwdWJzLmNvbS9hbXJvZmkvUmVnaW9uYWxfRWNvbm9taWNzX2Fzc29jaWF0ZT5dKGh0dHA6Ly9ycHVicy5jb20vYW1yb2ZpL1JlZ2lvbmFsX0Vjb25vbWljc19hc3NvY2lhdGUpey51cml9LiANCg0KIyBJbnRyb2R1w6fDo28NCg0KU2VndWUgdW1hIHJvdGluYSByw6FwaWRhIHBhcmEgY29tcGFyYXIgZG9pcyBkYXRhLmZyYW1lcyBlIGdlcmFyIHVtYSBjb2x1bmEgaW5kaWNhZG9yYSBkZSBxdWFuZG8gbyBkYWRvIGNvbnN0YXIgbm9zIGRvaXMuIEEgaWRlaWEgw6kgY29tcGFyYXIgY29sdW5hcyBkb3MgZG9pcyBkYXRhc2V0cyBlIHJlc3VsdGFyIGVtIDEgcXVhbmRvIGVzdGl2ZXIgbm9zIGRvaXMgZSAwIHF1YW5kbyBuw6NvIGVzdGl2ZXIuDQoNCiMgUm90aW5hIGRlIGPDoWxjdWxvDQoNCiMjIEV4ZW1wbG8gQ1BGDQoNCkVzc2Egcm90aW5hIGZvaSBmb3JuZWNpZGEgcGVsbyBEZW5pcyBPbGl2ZWlyYSBSb2RyaWd1ZXMgbm8gZ3J1cG8gZG8gRmFjZWJvb2sgUiAtIEJyYXNpbCBQcm9ncmFtYWRvcmVzIGVtIDE3LzA1LzIwMjEuDQoNCmBgYHtyfQ0KIyBSb3RpbmEgcsOhcGlkYSBwYXJhIGNvbXBhcmFyIGRhdGFmcmFtZXMgZSBhc3NvY2lhciBkdW1teQ0KeDEgPC0gZGF0YS5mcmFtZShjcGYgPSBjKDExMjIyMSwgMTQyMjE0LCAxMjE0MTIpKQ0KDQp4MiA8LSBkYXRhLmZyYW1lKGNwZiA9IGMoMTIxNDEyLDE0NTE3Nyw0NjQ1NTYsMTQyMjE0KSkNCg0KeDIkaW5kaWNhZG9yYSA8LSBpZmVsc2UoeDIkY3BmICVpbiUgeDEkY3BmLCAxLDApDQoNCngyJGluZGljYWRvcmENCnByaW50KHgyKQ0KYGBgDQoNCg0KIyMgRXhlbXBsbyBwYXJhIHNlbGVjaW9uYXIgZ3J1cG8gZGUgbXVuaWPDrXBpb3MNCg0KUHJpbWVpcm8sIGNoYW1hbW9zIG9zIGRhZG9zLiBBdGVudGFyIHBhcmEgYSBwcmVzZW7Dp2EgZGUgY29sdW5hIGRlIFRvdGFsIGUgcGFyYSBhIGxpbmhhIGRvIFRvdGFsLiAqKipPcyBkYWRvcyBmb3JhbSBjb2xvY2Fkb3MgZW1iZWRkZWQgbm8gY29kZS4qKioNCg0KYGBge3IsIGV2YWw9VCxlY2hvPVR9DQpJQ05fU2FsYTwtIHN0cnVjdHVyZShsaXN0KE11bmljID0gYygiQWNvcml6YWwiLCAiQWd1YSBCb2EiLCAiQWx0YSBGbG9yZXN0YSIsIA0KIkFsdG8gQXJhZ3VhaWEiLCAiQWx0byBCb2EgVmlzdGEiLCAiQWx0byBHYXJjYXMiLCAiQWx0byBQYXJhZ3VhaSIsIA0KIkFsdG8gVGFxdWFyaSIsICJBcGlhY2FzIiwgIkFyYWd1YWlhbmEiLCAiQXJhZ3VhaW5oYSIsICJBcmFwdXRhbmdhIiwgDQoiQXJlbmFwb2xpcyIsICJBcmlwdWFuYSIsICJCYXJhbyBkZSBNZWxnYWNvIiwgIkJhcnJhIGRvIEJ1Z3JlcyIsIA0KIkJhcnJhIGRvIEdhcmNhcyIsICJCb20gSmVzdXMgZG8gQXJhZ3VhaWEiLCAiQnJhc25vcnRlIiwgIkNhY2VyZXMiLCANCiJDYW1waW5hcG9saXMiLCAiQ2FtcG8gTm92byBkbyBQYXJlY2lzIiwgIkNhbXBvIFZlcmRlIiwgIkNhbXBvcyBkZSBKdWxpbyIsIA0KIkNhbmFicmF2YSBkbyBOb3J0ZSIsICJDYW5hcmFuYSIsICJDYXJsaW5kYSIsICJDYXN0YW5oZWlyYSIsIA0KIkNoYXBhZGEgZG9zIEd1aW1hcmFlcyIsICJDbGF1ZGlhIiwgIkNvY2FsaW5obyIsICJDb2xpZGVyIiwgIkNvbG5pemEiLCANCiJDb21vZG9ybyIsICJDb25mcmVzYSIsICJDb25xdWlzdGEgRCdPZXN0ZSIsICJDb3RyaWd1YWN1IiwgIkN1aWFiYSIsIA0KIkN1cnZlbMOibmRpYSIsICJEZW5pc2UiLCAiRGlhbWFudGlubyIsICJEb20gQXF1aW5vIiwgIkZlbGl6IE5hdGFsIiwgDQoiRmlndWVpcm9wb2xpcyBEIE9lc3RlIiwgIkdhdWNoYSBkbyBOb3J0ZSIsICJHZW5lcmFsIENhcm5laXJvIiwgDQoiR2xvcmlhIEQnb2VzdGUiLCAiR3VhcmFudGEgZG8gTm9ydGUiLCAiR3VpcmF0aW5nYSIsICJJbmRpYXZhaSIsIA0KIklwaXJhbmdhIGRvIE5vcnRlIiwgIkl0YW5oYW5nYSIsICJJdGF1YmEiLCAiSXRpcXVpcmEiLCAiSmFjaWFyYSIsIA0KIkphbmdhZGEiLCAiSmF1cnUiLCAiSnVhcmEiLCAiSnVpbmEiLCAiSnVydWVuYSIsICJKdXNjaW1laXJhIiwgDQoiTGFtYmFyaSBEJ29lc3RlIiwgIkx1Y2FzIGRvIFJpbyBWZXJkZSIsICJMdWNpYXJhIiwgIlZpbGEgQmVsYSBkYSBTYW50aXNzaW1hIFRyaW5kYWRlIiwgDQoiTWFyY2VsYW5kaWEiLCAiTWF0dXBhIiwgIk1pcmFzc29sIERvZXN0ZSIsICJOb2JyZXMiLCAiTm9ydGVsYW5kaWEiLCANCiJOb3NzYSBTZW5ob3JhIGRvIExpdnJhbWVudG8iLCAiTm92YSBCYW5kZWlyYW50ZXMiLCAiTm92YSBOYXphcsOpIiwgDQoiTm92YSBMYWNlcmRhIiwgIk5vdmEgU2FudGEgSGVsZW5hIiwgIk5vdmEgQnJhc2lsYW5kaWEiLCAiTm92YSBDYW5hYSBkbyBOb3J0ZSIsIA0KIk5vdmEgTXV0dW0iLCAiTm92YSBPbGltcGlhIiwgIk5vdmEgVWJpcmF0YSIsICJOb3ZhIFhhdmFudGluYSIsIA0KIk5vdm8gTXVuZG8iLCAiTm92byBIb3Jpem9udGUgZG8gTm9ydGUiLCAiTm92byBTYW8gSm9hcXVpbSIsIA0KIlBhcmFuYWl0YSIsICJQYXJhbmF0aW5nYSIsICJOb3ZvIFNhbnRvIEFudG9uaW8iLCAiUGVkcmEgUHJldGEiLCANCiJQZWl4b3RvIGRlIEF6ZXZlZG8iLCAiUGxhbmFsdG8gZGEgU2VycmEiLCAiUG9jb25lIiwgIlBvbnRhbCBkbyBBcmFndWFpYSIsIA0KIlBvbnRlIEJyYW5jYSIsICJQb250ZXMgZSBMYWNlcmRhIiwgIlBvcnRvIEFsZWdyZSBkbyBOb3J0ZSIsIA0KIlBvcnRvIGRvcyBHYXVjaG9zIiwgIlBvcnRvIEVzcGVyaWRpYW8iLCAiUG9ydG8gRXN0cmVsYSIsICJQb3hvcmVvIiwgDQoiUHJpbWF2ZXJhIGRvIExlc3RlIiwgIlF1ZXJlbmNpYSIsICJTYW8gSm9zZSBkb3MgUXVhdHJvIE1hcmNvcyIsIA0KIlJlc2VydmEgZG8gQ2FiYWNhbCIsICJSaWJlaXJhbyBDYXNjYWxoZWlyYSIsICJSaWJlaXJhb3ppbmhvIiwgDQoiUmlvIEJyYW5jbyIsICJTYW50YSBDYXJtZW0iLCAiU2FudG8gQWZvbnNvIiwgIlNhbyBKb3NlIGRvIFBvdm8iLCANCiJTYW8gSm9zZSBkbyBSaW8gQ2xhcm8iLCAiU2FvIEpvc2UgZG8gWGluZ3UiLCAiU2FvIFBlZHJvIGRhIENpcGEiLCANCiJSb25kb2xhbmRpYSIsICJSb25kb25vcG9saXMiLCAiUm9zYXJpbyBPZXN0ZSIsICJTYW50YSBDcnV6IGRvIFhpbmd1IiwgDQoiU2FsdG8gZG8gQ2V1IiwgIlNhbnRhIFJpdGEgZG8gVHJpdmVsYXRvIiwgIlNhbnRhIFRlcmV6aW5oYSIsIA0KIlNhbnRvIEFudG9uaW8gZG8gTGVzdGUiLCAiU2FudG8gQW50b25pbyBkbyBMZXZlcmdlciIsICJTYW8gRmVsaXggZG8gQXJhZ3VhaWEiLCANCiJTYXBlemFsIiwgIlNlcnJhIE5vdmEgRG91cmFkYSIsICJTaW5vcCIsICJTb3JyaXNvIiwgIlRhYmFwb3JhIiwgDQoiVGFuZ2FyYSBkYSBTZXJyYSIsICJUYXB1cmFoIiwgIlRlcnJhIE5vdmEgZG8gTm9ydGUiLCAiVGVzb3VybyIsIA0KIlRvcml4b3JldSIsICJVbmlhbyBkbyBTdWwiLCAiVmFsZSBkZSBTw6NvIERvbWluZ29zIiwgIlZhcnplYSBHcmFuZGUiLCANCiJWZXJhIiwgIlZpbGEgUmljYSIsICJOb3ZhIEd1YXJpdGEiLCAiTm92YSBNYXJpbGFuZGlhIiwgIk5vdmEgTWFyaW5nYSIsIA0KIk5vdmEgTW9udGUgVmVyZGUiLCAiVG90YWwiKSwgYm92aW5vcyA9IGMoNDUsIDU1MSwgMTI3MiwgMjE1LCANCjcyLCA5NCwgMzYsIDM1LCAxOTYsIDI2MCwgMTksIDM3MywgNjMsIDMzNSwgMTUyLCA0MTEsIDEwMjAsIDYzLCANCjI1MywgMTQxMiwgMTcxLCA0MiwgMTA3LCA4LCA1NywgNDgxLCAxNzMsIDE0NywgMTQ5LCAyNywgNDY1LCANCjIzOSwgMzUsIDQ3NSwgODUsIDEwMCwgNzksIDc3MSwgOSwgOTksIDExNSwgMTUyLCAyNiwgODgsIDE1NywgDQoxMDIsIDU5LCAxNzIsIDE2OSwgNzUsIDQ2LCA1LCAyMDgsIDI3NCwgMTU3LCA1NiwgMjAyLCA4ODQsIDQyMCwgDQoxNDAsIDI1MiwgMTkwLCA2LCAyOSwgMTAyMiwgMjAxLCAxNzIsIDI2NSwgNzYsIDI2LCAxOTUsIDI1NSwgDQo3NCwgMTg2LCAxNDEsIDE0MSwgNDAyLCAxNzcsIDEwMywgODEsIDM2MywgMjI5LCAyNCwgMTQwLCAzNDAsIA0KNTQyLCAxMCwgNDA5LCAxNzIsIDExMCwgNDkxLCAxMjMsIDE1LCAxMTEzLCAzMSwgMTY3LCA1MjksIDEyOCwgDQo0MjIsIDE3NCwgMjU0LCAxNjgsIDYsIDI1NCwgMTUsIDkzLCA0MCwgNjAsIDYzLCAxNTEsIDQyNywgMTEsIA0KMjQ0LCA4MDksIDE4OCwgNzAsIDg4LCAyMiwgMjM4LCA1OSwgNTc1LCAyNTgsIDMxLCAyMCwgMjA1LCA1NCwgDQoxNTksIDY0NCwgMTA4LCAxMDQsIDk3LCAxNDMsIDM2LCAxMSwgMTk2LCA0MSwgNDQwLCA0MSwgODYsIDEzMSwgDQo0MjksIDMwNjk4KSwgVG90YWwgPSBjKDIzOCwgMzYzMywgOTU3MSwgMjU4OCwgNDA4LCAyMDcyLCAyOTUsIA0KMTg3OCwgMTE0MiwgNTY4LCAyMzQsIDI4NzYsIDg1NCwgMjg4MywgNDkyLCA1MTMwLCAxMTYxMywgNTAxLCANCjI2MTgsIDExNzY0LCA3NjgsIDY4ODMsIDczMTEsIDEzNjcsIDM5MywgMjk4OCwgNzU2LCA2MjksIDE5OTcsIA0KMjAwOCwgOTkxLCA0NDk5LCAxODcwLCAyNzk0LCAxNDIwLCA1ODksIDEyMzAsIDIwNDkxNSwgMjU2LCA3ODAsIA0KNjM3MSwgMTQyMCwgMTY2MCwgMzgzLCA3NTYsIDcxOCwgMjczLCAyODE4LCAxMzIxLCAyNzksIDEwMzEsIA0KNDA1LCA5NDYsIDMyMDQsIDUwMTEsIDcxOCwgODUzLCA1MzAzLCA1MzcwLCAxMDg2LCAxMTI3LCAxMDM4LCANCjE0MTA0LCAyMjQsIDE5NDYsIDE4MzAsIDI3NDIsIDQ5MTEsIDE5OTcsIDU3OSwgODkyLCAxMDM2LCAyNTQsIA0KNzk0LCA0ODcsIDQzNywgMTI5NSwgMTAzMzcsIDQ0MDgsIDIwNDksIDE5MzcsIDYzMiwgMjI2LCAxNTg2LCANCjExNzMsIDMyODksIDg0LCAzOTQ2LCAxODEyLCAzMzcsIDI3ODIsIDU0OSwgMTE4LCA1OTIwLCA2MzgsIDkxNiwgDQoxNDkyLCA0MDEsIDE5NTUsIDEzMDY5LCAyNDM2LCAyNDQ4LCAxODYsIDgxNSwgMjUxLCA0ODgsIDYzMSwgDQoyOTAsIDMwNCwgMjcwNCwgOTQ2LCA5MzgsIDcxNiwgNDEwNjYsIDE0NjUsIDI5MiwgNDQ5LCA3OTgsIDc0OCwgDQo3MzIsIDM5NDYsIDE0MDQsIDU4MzEsIDc5LCAyNTQ2OSwgMTYwOTgsIDE1NTQsIDE3MjY4LCAyNjc3LCA5NzcsIA0KMzkyLCA1NTksIDU0OCwgMzcsIDM4NzE4LCAxNzQ3LCAyMTk4LCAzMDIsIDQ1MCwgMTA0MywgMTM4MiwgNjIyNDU5DQopKSwgcm93Lm5hbWVzID0gYyhOQSwgLTE0MkwpLCBjbGFzcyA9IGMoInRibF9kZiIsICJ0YmwiLCAiZGF0YS5mcmFtZSINCikpDQojIHJlY29ydGVpIGFwZW5hcyBhbGd1bnMgbXVuaWNpcGlvcw0Ka25pdHI6OmthYmxlKElDTl9TYWxhW2MoMzU6NDUsMTEwOjEzNSksXSxjYXB0aW9uID0gIlRhYmVsYSBJQ05fU2FsYSBjb20gYWxndW5zIG11bmljw61waW9zIikNCmBgYA0KDQpgYGB7cn0NCiMgQWdvcmEgYSBjb25kaWNhbzogQ3VpYWLDoSwgUm9uZG9uw7Nwb2xpcywgU2lub3AgZSBWw6FyemVhIEdyYW5kZSBjb20gZHVtbXkgMSBlIDAgcGFyYSBvcyBkZW1haXMNCiMgYXRlbnRhciBwYXJhIGFjZW50b3MsIGNlZGlsaGFzIGV0Yw0KeDMgPC0gZGF0YS5mcmFtZShNdW5pYyA9IGMoJ0N1aWFiYScsICdSb25kb25vcG9saXMnLCAnU2lub3AnLCAnVmFyemVhIEdyYW5kZScpKQ0KcHJpbnQoeDMpDQpJQ05fU2FsYSRpbmRpY2Fkb3JhIDwtIGlmZWxzZShJQ05fU2FsYSRNdW5pYyAlaW4lIHgzJE11bmljLCAxLDApDQoNCklDTl9TYWxhJGluZGljYWRvcmENCm9wdGlvbnMobWF4LnByaW50PTEwMDAwMDApDQprbml0cjo6a2FibGUoSUNOX1NhbGFbYygzNTo0NSwxMTA6MTM1KSxdLGNhcHRpb24gPSAiVGFiZWxhIElDTl9TYWxhIGNvbSBpbmRpY2Fkb3JhIGRlIGFsZ3VucyBtdW5pY8OtcGlvcyIpDQpgYGANCg0KDQoNCiMgUmVmZXLDqm5jaWFzIHsjUmVmZXLDqm5jaWFzIC51bm51bWJlcmVkfQ0KDQo=