Instruções

Ambiente

1 Leitura e limpeza dos dados

  1. Os nomes das colunas originais estão em inglês. Para ver o dicionário de dados — documentação sobre cada uma das colunas — visite https://www.kaggle.com/datasets/crisparada/brazilian-cities?select=Data_Dictionary.csv.

  2. Eis uma função para renomear as colunas para português. Ela simplesmente retorna um vetor com os novos nomes, na mesma ordem que as colunas originais.

    renomear <- function(x) {
    
      c(
        'cidade',
        'estado',
        'capital',
        'pop_resid',
        'pop_resid_bras',
        'pop_resid_estr',
        'unidades_domest',
        'unidades_domest_urban',
        'unidades_domest_rural',
        'pop_regular',
        'pop_regular_1',
        'pop_regular_1_4',
        'pop_regular_5_9',
        'pop_regular_10_14',
        'pop_regular_15_59',
        'pop_regular_60_mais',
        'area_cultivada',
        'producao_rural',
        'idhm_ranking',
        'idhm',
        'idhm_renda',
        'idhm_longevidade',
        'idhm_educacao',
        'longitude',
        'latitude',
        'altitude',
        'tv_assinatura',
        'telefones_fixos',
        'area',
        'regiao_turismo',
        'categoria_turismo',
        'pop_estimada',
        'tipo',
        'gva_agropec',
        'gva_industria',
        'gva_servicos',
        'gva_publico',
        'gva_total',
        'impostos',
        'pib',
        'pop_pib',
        'pib_capita',
        'atividade_principal',
        'despesas_municipais',
        'empresas_tot',
        'empresas_a',
        'empresas_b',
        'empresas_c',
        'empresas_d',
        'empresas_e',
        'empresas_f',
        'empresas_g',
        'empresas_h',
        'empresas_i',
        'empresas_j',
        'empresas_k',
        'empresas_l',
        'empresas_m',
        'empresas_n',
        'empresas_o',
        'empresas_p',
        'empresas_q',
        'empresas_r',
        'empresas_s',
        'empresas_t',
        'empresas_u',
        'hoteis',
        'camas',
        'agencias_priv',
        'agencias_publ',
        'bancos_priv',
        'bancos_publ',
        'patrimonio_bancos_priv',
        'patrimonio_bancos_publ',
        'carros',
        'motos',
        'tratores',
        'uber',
        'mac',
        'walmart',
        'correios'
      )
    
    }
  3. Ler os dados, renomear as colunas e mudar o tipo de duas delas:

    cidades <- read_csv(
      'https://github.com/fnaufel/lista1-cidades-br/raw/master/dados/BRAZIL_CITIES_REV2022.CSV'
    ) %>% 
      rename_with(.fn = renomear) %>% 
      mutate(
        capital = as.logical(capital),
        uber = as.logical(uber)
      )
    ## Rows: 5578 Columns: 81
    ## ── Column specification ─────────────────────────────────────────────────────────────
    ## Delimiter: ","
    ## chr  (6): CITY, STATE, REGIAO_TUR, CATEGORIA_TUR, RURAL_URBAN, GVA_MAIN
    ## dbl (75): CAPITAL, IBGE_RES_POP, IBGE_RES_POP_BRAS, IBGE_RES_POP_ESTR, IBGE_DU, I...
    ## 
    ## ℹ Use `spec()` to retrieve the full column specification for this data.
    ## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
  4. Examinar a tibble com dfSummary:

    cidades %>% 
      dfSummary() %>% 
      print(method = 'render')
    Variável Estatísticas / Valores Freqs (% de Válidos) Faltante
    cidade [character]
    1. Bom Jesus
    2. São Domingos
    3. Bonito
    4. Planalto
    5. Santa Helena
    6. Santa Inês
    7. Santa Luzia
    8. Santa Terezinha
    9. São Francisco
    10. Vera Cruz
    [ 5290 outros ]
    5 ( 0,1% )
    5 ( 0,1% )
    4 ( 0,1% )
    4 ( 0,1% )
    4 ( 0,1% )
    4 ( 0,1% )
    4 ( 0,1% )
    4 ( 0,1% )
    4 ( 0,1% )
    4 ( 0,1% )
    5536 ( 99,2% )
    0 (0,0%)
    estado [character]
    1. MG
    2. SP
    3. RS
    4. BA
    5. PR
    6. SC
    7. GO
    8. PB
    9. PI
    10. MA
    [ 17 outros ]
    853 ( 15,3% )
    646 ( 11,6% )
    499 ( 8,9% )
    418 ( 7,5% )
    400 ( 7,2% )
    295 ( 5,3% )
    246 ( 4,4% )
    224 ( 4,0% )
    224 ( 4,0% )
    217 ( 3,9% )
    1556 ( 27,9% )
    0 (0,0%)
    capital [logical]
    1. FALSE
    2. TRUE
    5545 ( 99,4% )
    33 ( 0,6% )
    0 (0,0%)
    pop_resid [numeric]
    Média (dp) : 34223,1 (202882,9)
    mín < mediana < máx:
    0 < 10926,5 < 11253503
    IQE (CV) : 18192 (5,9)
    5044 valores distintos 0 (0,0%)
    pop_resid_bras [numeric]
    Média (dp) : 34145,7 (201262,7)
    mín < mediana < máx:
    0 < 10916 < 11133776
    IQE (CV) : 18166 (5,9)
    5072 valores distintos 0 (0,0%)
    pop_resid_estr [numeric]
    Média (dp) : 77,4 (1793,8)
    mín < mediana < máx:
    0 < 0 < 119727
    IQE (CV) : 10 (23,2)
    359 valores distintos 0 (0,0%)
    unidades_domest [numeric]
    Média (dp) : 10283,1 (64692)
    mín < mediana < máx:
    0 < 3167 < 3576148
    IQE (CV) : 5157,2 (6,3)
    4197 valores distintos 0 (0,0%)
    unidades_domest_urban [numeric]
    Média (dp) : 8842,3 (64285,7)
    mín < mediana < máx:
    0 < 1839,5 < 3548433
    IQE (CV) : 3748,8 (7,3)
    3769 valores distintos 0 (0,0%)
    unidades_domest_rural [numeric]
    Média (dp) : 1440,8 (1690,5)
    mín < mediana < máx:
    0 < 916 < 33809
    IQE (CV) : 1342,5 (1,2)
    2653 valores distintos 0 (0,0%)
    pop_regular [numeric]
    Média (dp) : 27552,7 (185746,8)
    mín < mediana < máx:
    0 < 6156 < 10463636
    IQE (CV) : 12514,5 (6,7)
    4785 valores distintos 0 (0,0%)
    pop_regular_1 [numeric]
    Média (dp) : 382,7 (2324,2)
    mín < mediana < máx:
    0 < 92 < 129464
    IQE (CV) : 194 (6,1)
    1030 valores distintos 0 (0,0%)
    pop_regular_1_4 [numeric]
    Média (dp) : 1542,1 (9242,6)
    mín < mediana < máx:
    0 < 376 < 514794
    IQE (CV) : 791,8 (6)
    2019 valores distintos 0 (0,0%)
    pop_regular_5_9 [numeric]
    Média (dp) : 2066 (12299,6)
    mín < mediana < máx:
    0 < 514 < 684443
    IQE (CV) : 1080 (6)
    2314 valores distintos 0 (0,0%)
    pop_regular_10_14 [numeric]
    Média (dp) : 2377,6 (14170)
    mín < mediana < máx:
    0 < 587 < 783702
    IQE (CV) : 1219,5 (6)
    2472 valores distintos 0 (0,0%)
    pop_regular_15_59 [numeric]
    Média (dp) : 18184,2 (125063,7)
    mín < mediana < máx:
    0 < 3835,5 < 7058221
    IQE (CV) : 7863 (6,9)
    4478 valores distintos 0 (0,0%)
    pop_regular_60_mais [numeric]
    Média (dp) : 3000,2 (23221,5)
    mín < mediana < máx:
    0 < 720,5 < 1293012
    IQE (CV) : 1383,8 (7,7)
    2622 valores distintos 0 (0,0%)
    area_cultivada [numeric]
    Média (dp) : 14170,8 (44031,1)
    mín < mediana < máx:
    0 < 3462 < 1205669
    IQE (CV) : 10288,5 (3,1)
    4339 valores distintos 0 (0,0%)
    producao_rural [numeric]
    Média (dp) : 57356,2 (148075)
    mín < mediana < máx:
    0 < 13838,5 < 3274885
    IQE (CV) : 53306,2 (2,6)
    5010 valores distintos 0 (0,0%)
    idhm_ranking [numeric]
    Média (dp) : 2777,3 (1609,5)
    mín < mediana < máx:
    0 < 2776,5 < 5565
    IQE (CV) : 2786,5 (0,6)
    5566 valores distintos 0 (0,0%)
    idhm [numeric]
    Média (dp) : 0,7 (0,1)
    mín < mediana < máx:
    0 < 0,7 < 0,9
    IQE (CV) : 0,1 (0,1)
    350 valores distintos 0 (0,0%)
    idhm_renda [numeric]
    Média (dp) : 0,6 (0,1)
    mín < mediana < máx:
    0 < 0,7 < 0,9
    IQE (CV) : 0,1 (0,1)
    391 valores distintos 0 (0,0%)
    idhm_longevidade [numeric]
    Média (dp) : 0,8 (0,1)
    mín < mediana < máx:
    0 < 0,8 < 0,9
    IQE (CV) : 0,1 (0,1)
    221 valores distintos 0 (0,0%)
    idhm_educacao [numeric]
    Média (dp) : 0,6 (0,1)
    mín < mediana < máx:
    0 < 0,6 < 0,8
    IQE (CV) : 0,1 (0,2)
    467 valores distintos 0 (0,0%)
    longitude [numeric]
    Média (dp) : -46,1 (6,8)
    mín < mediana < máx:
    -72,9 < -46,5 < 0
    IQE (CV) : 9,5 (-0,1)
    5496 valores distintos 0 (0,0%)
    latitude [numeric]
    Média (dp) : -16,4 (8,3)
    mín < mediana < máx:
    -33,7 < -18,1 < 4,6
    IQE (CV) : 14,4 (-0,5)
    5489 valores distintos 0 (0,0%)
    altitude [numeric]
    Média (dp) : 416,9 (289)
    mín < mediana < máx:
    0 < 406,2 < 1639,2
    IQE (CV) : 459,5 (0,7)
    5549 valores distintos 0 (0,0%)
    tv_assinatura [numeric]
    Média (dp) : 3092,8 (35769,4)
    mín < mediana < máx:
    0 < 246,5 < 2047668
    IQE (CV) : 727 (11,6)
    1923 valores distintos 0 (0,0%)
    telefones_fixos [numeric]
    Média (dp) : 6562,2 (87934,3)
    mín < mediana < máx:
    0 < 327 < 5543127
    IQE (CV) : 1032,8 (13,4)
    2237 valores distintos 0 (0,0%)
    area [numeric]
    Média (dp) : 1526,1 (5604)
    mín < mediana < máx:
    0 < 416,6 < 159533,3
    IQE (CV) : 822,2 (3,7)
    5556 valores distintos 0 (0,0%)
    regiao_turismo [character]
    1. 0
    2. Corredores Das Águas
    3. Vale Do Contestado
    4. Amazônia Atlântica
    5. Araguaia-Tocantins
    6. Cariri
    7. Trilhas Do Rio Doce
    8. Chapada Diamantina
    9. Vale Das Águas
    10. Rota Do Yucumã
    [ 312 outros ]
    2290 ( 41,1% )
    59 ( 1,1% )
    45 ( 0,8% )
    40 ( 0,7% )
    39 ( 0,7% )
    37 ( 0,7% )
    37 ( 0,7% )
    35 ( 0,6% )
    33 ( 0,6% )
    32 ( 0,6% )
    2931 ( 52,5% )
    0 (0,0%)
    categoria_turismo [character]
    1. 0
    2. A
    3. B
    4. C
    5. D
    6. E
    2290 ( 41,1% )
    52 ( 0,9% )
    168 ( 3,0% )
    522 ( 9,4% )
    1893 ( 33,9% )
    653 ( 11,7% )
    0 (0,0%)
    pop_estimada [numeric]
    Média (dp) : 37405,8 (219816,2)
    mín < mediana < máx:
    0 < 11574 < 12176866
    IQE (CV) : 19851,8 (5,9)
    5096 valores distintos 0 (0,0%)
    tipo [character]
    1. 0
    2. Intermediário Adjacente
    3. Intermediário Remoto
    4. Rural Adjacente
    5. Rural Remoto
    6. Sem classificação
    7. Urbano
    5 ( 0,1% )
    688 ( 12,3% )
    60 ( 1,1% )
    3040 ( 54,5% )
    323 ( 5,8% )
    5 ( 0,1% )
    1457 ( 26,1% )
    0 (0,0%)
    gva_agropec [numeric]
    Média (dp) : 55000,6 (92020,5)
    mín < mediana < máx:
    0 < 27028 < 1402282
    IQE (CV) : 50761,5 (1,7)
    5373 valores distintos 0 (0,0%)
    gva_industria [numeric]
    Média (dp) : 206310,4 (1296665)
    mín < mediana < máx:
    0 < 11701,5 < 63306755
    IQE (CV) : 59850,8 (6,3)
    5126 valores distintos 0 (0,0%)
    gva_servicos [numeric]
    Média (dp) : 541092,6 (7133989)
    mín < mediana < máx:
    0 < 46623 < 464656988
    IQE (CV) : 129230 (13,2)
    5460 valores distintos 0 (0,0%)
    gva_publico [numeric]
    Média (dp) : 169565,1 (1558102)
    mín < mediana < máx:
    0 < 47242,5 < 92051448
    IQE (CV) : 75242 (9,2)
    5435 valores distintos 0 (0,0%)
    gva_total [numeric]
    Média (dp) : 971968,7 (9411596)
    mín < mediana < máx:
    0 < 158949 < 569910503
    IQE (CV) : 340389,8 (9,7)
    5537 valores distintos 0 (0,0%)
    impostos [numeric]
    Média (dp) : 152362,9 (1964351)
    mín < mediana < máx:
    -14159 < 8660 < 117125387
    IQE (CV) : 29175,5 (12,9)
    4981 valores distintos 0 (0,0%)
    pib [numeric]
    Média (dp) : 1124332 (11352213)
    mín < mediana < máx:
    0 < 168298,5 < 687035890
    IQE (CV) : 369649,2 (10,1)
    5530 valores distintos 0 (0,0%)
    pop_pib [numeric]
    Média (dp) : 36972,6 (216862,9)
    mín < mediana < máx:
    0 < 11570,5 < 12038175
    IQE (CV) : 19609,8 (5,9)
    5114 valores distintos 0 (0,0%)
    pib_capita [numeric]
    Média (dp) : 21110,8 (20328,6)
    mín < mediana < máx:
    0 < 15865 < 314638
    IQE (CV) : 17106,2 (1)
    5046 valores distintos 0 (0,0%)
    atividade_principal [character]
    1. 0
    2. Administração, defesa, ed
    3. Agricultura, inclusive ap
    4. Comércio e reparação de v
    5. Construção
    6. Demais serviços
    7. Eletricidade e gás, água,
    8. Indústrias de transformaç
    9. Indústrias extrativas
    10. Pecuária, inclusive apoio
    11. Produção florestal, pesca
    5 ( 0,1% )
    2725 ( 48,9% )
    735 ( 13,2% )
    46 ( 0,8% )
    7 ( 0,1% )
    1480 ( 26,5% )
    98 ( 1,8% )
    261 ( 4,7% )
    35 ( 0,6% )
    161 ( 2,9% )
    25 ( 0,4% )
    0 (0,0%)
    despesas_municipais [numeric]
    Média (dp) : 76314304 (740935036)
    mín < mediana < máx:
    0 < 17733204 < 45772497944
    IQE (CV) : 41455946 (9,7)
    4071 valores distintos 0 (0,0%)
    empresas_tot [numeric]
    Média (dp) : 906,4 (8327,9)
    mín < mediana < máx:
    0 < 162 < 530446
    IQE (CV) : 380 (9,2)
    1458 valores distintos 0 (0,0%)
    empresas_a [numeric]
    Média (dp) : 18,2 (81)
    mín < mediana < máx:
    0 < 2 < 1948
    IQE (CV) : 7 (4,4)
    247 valores distintos 0 (0,0%)
    empresas_b [numeric]
    Média (dp) : 1,9 (6,2)
    mín < mediana < máx:
    0 < 0 < 274
    IQE (CV) : 2 (3,3)
    55 valores distintos 0 (0,0%)
    empresas_c [numeric]
    Média (dp) : 73,4 (499,5)
    mín < mediana < máx:
    0 < 11 < 31566
    IQE (CV) : 36 (6,8)
    483 valores distintos 0 (0,0%)
    empresas_d [numeric]
    Média (dp) : 0,4 (6,3)
    mín < mediana < máx:
    0 < 0 < 332
    IQE (CV) : 0 (14,9)
    26 valores distintos 0 (0,0%)
    empresas_e [numeric]
    Média (dp) : 2 (11,7)
    mín < mediana < máx:
    0 < 0 < 657
    IQE (CV) : 1 (5,8)
    63 valores distintos 0 (0,0%)
    empresas_f [numeric]
    Média (dp) : 43,2 (407,2)
    mín < mediana < máx:
    0 < 4 < 25222
    IQE (CV) : 14 (9,4)
    345 valores distintos 0 (0,0%)
    empresas_g [numeric]
    Média (dp) : 347,9 (2428,8)
    mín < mediana < máx:
    0 < 74 < 150633
    IQE (CV) : 168 (7)
    996 valores distintos 0 (0,0%)
    empresas_h [numeric]
    Média (dp) : 41 (300,3)
    mín < mediana < máx:
    0 < 7 < 19515
    IQE (CV) : 24 (7,3)
    344 valores distintos 0 (0,0%)
    empresas_i [numeric]
    Média (dp) : 55,9 (483,9)
    mín < mediana < máx:
    0 < 7 < 29290
    IQE (CV) : 22 (8,7)
    396 valores distintos 0 (0,0%)
    empresas_j [numeric]
    Média (dp) : 24,7 (547,2)
    mín < mediana < máx:
    0 < 1 < 38720
    IQE (CV) : 5 (22,1)
    211 valores distintos 0 (0,0%)
    empresas_k [numeric]
    Média (dp) : 15,5 (340,6)
    mín < mediana < máx:
    0 < 0 < 23738
    IQE (CV) : 2 (21,9)
    173 valores distintos 0 (0,0%)
    empresas_l [numeric]
    Média (dp) : 15,1 (212,5)
    mín < mediana < máx:
    0 < 0 < 14003
    IQE (CV) : 3 (14)
    193 valores distintos 0 (0,0%)
    empresas_m [numeric]
    Média (dp) : 51,3 (766,9)
    mín < mediana < máx:
    0 < 4 < 49181
    IQE (CV) : 12 (15)
    317 valores distintos 0 (0,0%)
    empresas_n [numeric]
    Média (dp) : 83,6 (1231,7)
    mín < mediana < máx:
    0 < 4 < 76757
    IQE (CV) : 13 (14,7)
    398 valores distintos 0 (0,0%)
    empresas_o [numeric]
    Média (dp) : 3,3 (6,1)
    mín < mediana < máx:
    0 < 2 < 204
    IQE (CV) : 1 (1,9)
    47 valores distintos 0 (0,0%)
    empresas_p [numeric]
    Média (dp) : 30,9 (260,8)
    mín < mediana < máx:
    0 < 6 < 16030
    IQE (CV) : 15 (8,4)
    276 valores distintos 0 (0,0%)
    empresas_q [numeric]
    Média (dp) : 34,1 (366)
    mín < mediana < máx:
    0 < 3 < 22248
    IQE (CV) : 11 (10,7)
    296 valores distintos 0 (0,0%)
    empresas_r [numeric]
    Média (dp) : 12,2 (122,2)
    mín < mediana < máx:
    0 < 2 < 6687
    IQE (CV) : 6 (10)
    163 valores distintos 0 (0,0%)
    empresas_s [numeric]
    Média (dp) : 51,6 (429,4)
    mín < mediana < máx:
    0 < 12 < 24832
    IQE (CV) : 26 (8,3)
    340 valores distintos 0 (0,0%)
    empresas_t [numeric] 1 valor distinto
    0 : 5578 ( 100,0% )
    0 (0,0%)
    empresas_u [numeric]
    Média (dp) : 0,1 (1,9)
    mín < mediana < máx:
    0 < 0 < 123
    IQE (CV) : 0 (38,4)
    0 : 5551 ( 99,5% )
    1 : 14 ( 0,3% )
    2 : 2 ( 0,0% )
    3 : 4 ( 0,1% )
    5 : 1 ( 0,0% )
    7 : 1 ( 0,0% )
    8 : 2 ( 0,0% )
    35 : 1 ( 0,0% )
    64 : 1 ( 0,0% )
    123 : 1 ( 0,0% )
    0 (0,0%)
    hoteis [numeric]
    Média (dp) : 0,5 (2,9)
    mín < mediana < máx:
    0 < 0 < 97
    IQE (CV) : 0 (5,7)
    33 valores distintos 0 (0,0%)
    camas [numeric]
    Média (dp) : 41 (307,6)
    mín < mediana < máx:
    0 < 0 < 13247
    IQE (CV) : 0 (7,5)
    369 valores distintos 0 (0,0%)
    agencias_priv [numeric]
    Média (dp) : 2 (26,5)
    mín < mediana < máx:
    0 < 0 < 1693
    IQE (CV) : 1 (13,1)
    61 valores distintos 0 (0,0%)
    agencias_publ [numeric]
    Média (dp) : 1,7 (11,2)
    mín < mediana < máx:
    0 < 1 < 626
    IQE (CV) : 2 (6,6)
    51 valores distintos 0 (0,0%)
    bancos_priv [numeric]
    Média (dp) : 0,8 (1,8)
    mín < mediana < máx:
    0 < 0 < 83
    IQE (CV) : 1 (2,3)
    20 valores distintos 0 (0,0%)
    bancos_publ [numeric]
    Média (dp) : 0,9 (1,1)
    mín < mediana < máx:
    0 < 1 < 8
    IQE (CV) : 2 (1,1)
    0 : 2654 ( 47,6% )
    1 : 1181 ( 21,2% )
    2 : 1187 ( 21,3% )
    3 : 500 ( 9,0% )
    4 : 54 ( 1,0% )
    5 : 1 ( 0,0% )
    8 : 1 ( 0,0% )
    0 (0,0%)
    patrimonio_bancos_priv [numeric]
    Média (dp) : 5500436242 (277575211170)
    mín < mediana < máx:
    0 < 0 < 19470765412654
    IQE (CV) : 47748535 (50,5)
    2333 valores distintos 0 (0,0%)
    patrimonio_bancos_publ [numeric]
    Média (dp) : 3598663230 (116432715033)
    mín < mediana < máx:
    0 < 23199252 < 8016164488595
    IQE (CV) : 199119090 (32,4)
    2921 valores distintos 0 (0,0%)
    carros [numeric]
    Média (dp) : 9839,8 (91757,3)
    mín < mediana < máx:
    0 < 1431,5 < 5740995
    IQE (CV) : 3485 (9,3)
    3577 valores distintos 0 (0,0%)
    motos [numeric]
    Média (dp) : 4869,6 (20916,7)
    mín < mediana < máx:
    0 < 1280 < 1134570
    IQE (CV) : 2704,8 (4,3)
    3358 valores distintos 0 (0,0%)
    tratores [numeric]
    Média (dp) : 5,7 (55,3)
    mín < mediana < máx:
    0 < 0 < 3236
    IQE (CV) : 1 (9,6)
    130 valores distintos 0 (0,0%)
    uber [logical]
    1. FALSE
    2. TRUE
    5453 ( 97,8% )
    125 ( 2,2% )
    0 (0,0%)
    mac [numeric]
    Média (dp) : 0,1 (2,2)
    mín < mediana < máx:
    0 < 0 < 130
    IQE (CV) : 0 (16,9)
    20 valores distintos 0 (0,0%)
    walmart [numeric]
    Média (dp) : 0 (0,5)
    mín < mediana < máx:
    0 < 0 < 26
    IQE (CV) : 0 (14,1)
    12 valores distintos 0 (0,0%)
    correios [numeric]
    Média (dp) : 2 (4,4)
    mín < mediana < máx:
    0 < 1 < 225
    IQE (CV) : 1 (2,2)
    36 valores distintos 0 (0,0%)

    Gerado por summarytools 1.0.0 (R versão 4.1.3)
    2022-05-03

2 Análise exploratória

2.1 IDHM

  1. Pesquise o que é IDHM.

  2. Qual o valor máximo possível? Qual o valor máximo na tibble?

2.2 Estados e capitais

  1. Compare a quantidade de estados com a quantidade de capitais. O que está errado? Conserte a situação.

2.3 Populações

  1. Verifique se a coluna pop_resid (população de residentes) é a soma de pop_resid_bras (população de residentes brasileiros) com pop_resid_estr (população de residentes estrangeiros). Use a função all.

2.4 Unidades domésticas

  1. Verifique se a coluna unidades_domest (unidades domésticas) é a soma de unidades_domest_urban (urbanas) com unidades_domest_rural (rurais). Use a função all.

2.5 Categorias de turismo

  1. Na coluna categoria_turismo, substitua os zeros por NA e converta tudo para um fator ordenado com níveis \(E < D < C < B < A\). Use a função factor.

2.6 Tipos

  1. Na coluna tipo, substitua os zeros por NA e converta tudo para um fator não-ordenado.

2.7 Atividades principais

  1. Na coluna atividade_principal, substitua os zeros por NA e converta tudo para um fator não-ordenado.

2.8 Regiões geográficas

  1. Crie uma nova coluna, do tipo fator, chamada regiao, com a região geográfica (Norte, Nordeste, Centro-Oeste, Sudeste, ou Sul) onde está cada município. Use os níveis ‘N’, ‘NE’, ‘CO’, ‘SE’, ‘S’.

2.9 Regiões de turismo

  1. Na coluna regiao_turismo, substitua os zeros por NA.

  2. Quantas regiões de turismo são?

  3. Qual tem mais municípios?

  4. Qual tem menos municípios?

  5. Quantos municípios não fazem parte de região de turismo?

  6. Existe alguma região de turismo contendo cidades de estados diferentes?

2.10 Nomes das regiões de turismo

  1. Gere uma tibble com todos os valores distintos de regiao_turismo, sem repetições.

  2. Quais são as \(10\) palavras mais comuns que iniciam os nomes de regiões de turismo? Use a função word.

  3. Liste, em ordem alfabética, os nomes completos das regiões de turismo cujos nomes começam com palavras desta lista.

2.11 PIB

  1. Verifique se a coluna pib_capita é o resultado da divisão de pib por pop_pib. Use a função all.

2.12 Carros

  1. Quais as \(10\) cidades que têm a maior quantidade de carros por habitante?

  2. Quais as \(10\) cidades que têm a menor quantidade de carros por habitante?

  3. Quais são os tipos destas cidades?

  4. Comente os resultados.

2.13 Motos

  1. Quais as \(10\) cidades que têm a maior quantidade de motos por habitante?

  2. Quais as \(10\) cidades que têm a menor quantidade de motos por habitante?

  3. Quais são os tipos destas cidades?

  4. Comente os resultados.

2.14 Tratores

  1. Quais as \(10\) cidades que têm a maior quantidade de tratores por habitante? Ignore as cidades que têm zero tratores.

  2. Quais as \(10\) cidades que têm a menor quantidade de tratores por habitante? Ignore as cidades que têm zero tratores.

  3. Quais são os tipos destas cidades?

  4. Comente os resultados.

2.15 Áreas

  1. Quais as \(10\) cidades que têm a maior área?

  2. Quais as \(10\) cidades que têm a menor área?

  3. Quais são os tipos destas cidades?

  4. Comente os resultados.

2.16 Produção rural

  1. Quais as \(10\) cidades que têm a maior produção rural?

  2. Quais as \(10\) cidades que têm a menor produção rural?

  3. Quais são os tipos destas cidades? Ignore as cidades que têm zero produção rural.

  4. Comente os resultados.

2.17 Produção rural per capita

  1. Quais as \(10\) cidades que têm a maior produção rural per capita?

  2. Quais as \(10\) cidades que têm a menor produção rural per capita?

  3. Quais são os tipos destas cidades? Ignore as cidades que têm zero produção rural.

  4. Comente os resultados.

2.18 Densidade demográfica

  1. Quais as \(10\) cidades que têm a maior densidade demográfica?

  2. Quais as \(10\) cidades que têm a menor densidade demográfica?

  3. Quais são os tipos destas cidades?

  4. Comente os resultados.

2.19 Cidades extremas

  1. Quais são as \(10\) cidades de maior e menor latitude?

  2. Quais são as \(10\) cidades de maior e menor longitude?

  3. Quais são as \(10\) cidades de maior e menor altitude?

  4. Responda as perguntas acima [por região geográfica]. Você vai precisar da resposta desta questão.

2.20 Faixas etárias

  1. Quais as \(10\) cidades com a maior proporção de idosos (60 anos ou mais)?

  2. Quais as \(10\) cidades com a menor proporção de idosos (60 anos ou mais)?

  3. Quais são os tipos destas cidades?

  4. Comente os resultados.

3 Visualização

  • Todos os gráficos devem ser feitos com o pacote ggplot2.

  • Todos os gráficos devem incluir títulos, rótulos, legendas, e outros elementos para facilitar a compreensão. Imagine que seus gráficos serão publicados em uma revista científica.

3.1 População e McDonald’s

  1. Apenas para as cidades que têm McDonald’s, faça um scatterplot de quantidade de McDonald’s (no eixo \(y\)) por população (no eixo \(x\)).

  2. Use geom_smooth para gerar uma reta de regressão (com method = 'lm' e se = FALSE).

  3. Existe alguma correlação entre as quantidades? Comente.

3.2 População e Walmart

  1. Apenas para as cidades que têm Walmart, faça um scatterplot de quantidade de Walmarts (no eixo \(y\)) por população (no eixo \(x\)).

  2. Use geom_smooth para gerar uma reta de regressão (com method = 'lm' e se = FALSE).

  3. Existe alguma correlação entre as quantidades? Comente.

3.3 IDHM e PIB per capita

  1. Faça um scatterplot de IDHM (no eixo \(y\)) por PIB per capita (no eixo \(x\)).

  2. Use geom_smooth para gerar uma reta de regressão (com method = 'lm' e se = FALSE).

  3. Existe alguma correlação entre as quantidades? Comente.

3.4 IDHM e despesas municipais

  1. Faça um scatterplot de IDHM (no eixo \(y\)) por despesas municipais (no eixo \(x\)).

  2. Use geom_smooth para gerar uma reta de regressão (com method = 'lm' e se = FALSE).

  3. Existe alguma correlação entre as quantidades? Comente.

3.5 IDHM e carros

  1. Faça um scatterplot de IDHM (no eixo \(y\)) por quantidade de carros (no eixo \(x\)).

  2. Use geom_smooth para gerar uma reta de regressão (com method = 'lm' e se = FALSE).

  3. Existe alguma correlação entre as quantidades? Comente.

3.6 IDHM e motos

  1. Faça um scatterplot de IDHM (no eixo \(y\)) por quantidade de motos (no eixo \(x\)).

  2. Use geom_smooth para gerar uma reta de regressão (com method = 'lm' e se = FALSE).

  3. Existe alguma correlação entre as quantidades? Comente.

3.7 IDHM e tratores

  1. Faça um scatterplot de IDHM (no eixo \(y\)) por quantidade de tratores (no eixo \(x\)). Ignore as cidades que têm zero tratores.

  2. Use geom_smooth para gerar uma reta de regressão (com method = 'lm' e se = FALSE).

  3. Existe alguma correlação entre as quantidades? Comente.

3.8 Correios

  1. Faça um histograma da quantidade de agências de correios. Use o número de classes que você achar mais adequado.

  2. Comente os resultados.

3.9 Correios per capita

  1. Faça um histograma da razão (número de agências de correio) / (população). Use o número de classes que você achar mais adequado.

  2. Comente os resultados.

3.10 Agências bancárias (públicas)

  1. Faça um histograma da quantidade de agências bancárias públicas. Use o número de classes que você achar mais adequado.

  2. Compare com a distribuição de agências privadas.

  3. Comente os resultados.

3.11 Agências bancárias (públicas) per capita

  1. Faça um histograma da razão (número de agências bancárias públicas) / (população). Use o número de classes que você achar mais adequado.

  2. Compare com a distribuição de agências privadas.

  3. Comente os resultados.

3.12 Agências bancárias (privadas)

  1. Faça um histograma da quantidade de agências bancárias privadas. Use o número de classes que você achar mais adequado.

  2. Compare com a distribuição de agências públicas.

  3. Comente os resultados.

3.13 Agências bancárias (privadas) per capita

  1. Faça um histograma da razão (número de agências bancárias privadas) / (população). Use o número de classes que você achar mais adequado.

  2. Compare com a distribuição de agências públicas.

  3. Comente os resultados.

3.14 Áreas

  1. Faça um histograma das áreas das cidades. Use o número de classes que você achar mais adequado.

  2. Comente os resultados.

3.15 Áreas (com facetas)

  1. Faça histogramas das áreas das cidades, facetados por região geográfica. Use o número de classes que você achar mais adequado. Você vai precisar da resposta desta questão.

  2. Comente os resultados.

3.16 Populações

  1. Faça um histograma das populações das cidades. Use o número de classes que você achar mais adequado.

  2. Comente os resultados.

3.17 Populações (com facetas)

  1. Faça histogramas das populações das cidades, facetados por região geográfica. Use o número de classes que você achar mais adequado. Você vai precisar da resposta desta questão.

  2. Comente os resultados.

3.18 PIB

  1. Faça um histograma do valor do PIB. Use o número de classes que você achar mais adequado.

  2. Comente os resultados.

3.19 PIB per capita

  1. Faça um histograma do valor do PIB per capita. Use o número de classes que você achar mais adequado.

  2. Comente os resultados.

3.20 Telefones fixos per capita (com facetas)

  1. Faça histogramas das quantidades de telefones fixos per capita, facetados por região geográfica. Use o número de classes que você achar mais adequado. Você vai precisar da resposta desta questão.

  2. Comente os resultados.

3.21 Assinaturas de TV per capita (com facetas)

  1. Faça histogramas das quantidades de assinaturas de TV por assinatura per capita, facetados por região geográfica. Use o número de classes que você achar mais adequado. Você vai precisar da resposta desta questão.

  2. Comente os resultados.

3.22 PIB e atividade principal

  1. Faça boxplots lado a lado (no mesmo gráfico, sem facetar) do PIB, com um boxplot para cada atividade principal. Faça com que os boxplots sejam horizontais, para facilitar a leitura dos nomes das atividades.

  2. Comente os resultados.

3.23 PIB per capita e atividade principal

  1. Faça boxplots lado a lado (no mesmo gráfico, sem facetar) do PIB per capita, com um boxplot para cada atividade principal. Faça com que os boxplots sejam horizontais, para facilitar a leitura dos nomes das atividades.

  2. Comente os resultados.

3.24 Hotéis e categoria de turismo

  1. Faça boxplots lado a lado (no mesmo gráfico, sem facetar) da quantidade de hotéis, com um boxplot para cada categoria de turismo.

  2. Comente os resultados.

3.25 Populações por região

  1. Faça boxplots lado a lado (no mesmo gráfico, sem facetar) das populações, com um boxplot para cada região geográfica. Você vai precisar da resposta desta questão.

  2. Comente os resultados.

3.26 Densidade demográfica por região

  1. Faça boxplots lado a lado (no mesmo gráfico, sem facetar) das densidades demográficas, com um boxplot para cada região geográfica. Você vai precisar da resposta desta questão.

  2. Comente os resultados.

3.27 Carros per capita por tipo de cidade

  1. Faça boxplots lado a lado (no mesmo gráfico, sem facetar) da quantidade de carros per capita, com um boxplot para cada tipo de cidade.

  2. Comente os resultados.

3.28 Motos per capita por tipo de cidade

  1. Faça boxplots lado a lado (no mesmo gráfico, sem facetar) da quantidade de motos per capita, com um boxplot para cada tipo de cidade.

  2. Comente os resultados.

3.29 Tratores per capita por tipo de cidade

  1. Faça boxplots lado a lado (no mesmo gráfico, sem facetar) da quantidade de tratores per capita, com um boxplot para cada tipo de cidade.

  2. Comente os resultados.

3.30 Hotéis e Uber

  1. Faça boxplots lado a lado (no mesmo gráfico, sem facetar) da quantidade de hotéis, com um boxplot para cada valor de uber.

  2. Comente os resultados.

3.31 PIB per capita e Uber

  1. Faça boxplots lado a lado (no mesmo gráfico, sem facetar) do valor do PIB per capita, com um boxplot para cada valor de uber.

  2. Comente os resultados.

3.32 Cidades por região geográfica

  1. Faça um gráfico de barras das quantidades de cidades, com uma barra por região. Você vai precisar da resposta desta questão.

  2. Use a função fct_reorder para dispor as barras em ordem decrescente de altura.

  3. Em outro gráfico, use a função fct_reorder para dispor as barras em ordem crescente de altura.

  4. Comente os resultados.

3.33 Populações por região geográfica

  1. Faça um gráfico de barras das populações totais, com uma barra por região. Você vai precisar da resposta desta questão.

  2. Use a função fct_reorder para dispor as barras em ordem decrescente de altura.

  3. Em outro gráfico, use a função fct_reorder para dispor as barras em ordem crescente de altura.

  4. Comente os resultados.

3.34 PIB por região geográfica

  1. Faça um gráfico de barras dos PIBs totais, com uma barra por região. Você vai precisar da resposta desta questão.

  2. Use a função fct_reorder para dispor as barras em ordem decrescente de altura.

  3. Em outro gráfico, use a função fct_reorder para dispor as barras em ordem crescente de altura.

  4. Comente os resultados.

3.35 Produção rural por região geográfica

  1. Faça um gráfico de barras das produções rurais totais, com uma barra por região. Você vai precisar da resposta desta questão.

  2. Use a função fct_reorder para dispor as barras em ordem decrescente de altura.

  3. Em outro gráfico, use a função fct_reorder para dispor as barras em ordem crescente de altura.

  4. Comente os resultados.

3.36 Faixas etárias

  1. Faça um gráfico de barras da população brasileira, com uma barra por faixa etária.

  2. Use a função fct_reorder para dispor as barras em ordem decrescente de altura.

  3. Em outro gráfico, use a função fct_reorder para dispor as barras em ordem crescente de altura.

  4. Em qual ordem você acha que as barras devem aparecer? Por quê?

  5. Comente os resultados.

3.37 Faixas etárias por região geográfica

  1. Faça um gráfico de barras da população brasileira, com um conjunto de barras para cada região. Você vai precisar da resposta desta questão.

  2. Cada conjunto deve ter \(6\) barras lado a lado, uma para cada faixa etária. Use o argumento dodge na geometria adequada.

  3. Comente os resultados.

3.38 Faixas etárias por região geográfica, proporções

  1. Faça um gráfico de barras da população brasileira, com uma barra por região. Você vai precisar da resposta desta questão.

  2. Todas as barras devem ser da mesma altura, e o eixo \(y\) deve ir de \(0\) até \(1\), representando proporções.

  3. Cada barra deve ser subdividida em faixas horizontais de cores diferentes, uma faixa colorida para cada faixa etária, de acordo com as proporções de cada faixa etária em cada região.

  4. Comente os resultados.

3.39 Faixas etárias por tipo de cidade

  1. Faça um gráfico de barras da população brasileira, com um conjunto de barras para cada tipo de cidade.

  2. Cada conjunto deve ter \(6\) barras lado a lado, uma para cada faixa etária. Use o argumento dodge na geometria adequada.

  3. Comente os resultados.

3.40 Faixas etárias por tipo de cidade, proporções

  1. Faça um gráfico de barras da população brasileira, com uma barra por tipo de cidade.

  2. Todas as barras devem ser da mesma altura, e o eixo \(y\) deve ir de \(0\) até \(1\), representando proporções.

  3. Cada barra deve ser subdividida em faixas horizontais de cores diferentes, uma faixa colorida para cada faixa etária, de acordo com as proporções de cada faixa etária em cada tipo de cidade.

  4. Comente os resultados.

4 Mapa interativo

4.1 Marcadores

  1. Leia algum tutorial sobre o pacote leaflet:

  2. Escolha qualquer uma das questões do tipo “Quais as \(10\) cidades…”, na seção de análise exploratória.

  3. Resolva a questão e modifique o código abaixo para criar marcadores mostrando as cidades da resposta, rotulados com os nomes das cidades (use o argumento label).

  4. Quando o usuário clicar o mouse sobre a cidade, deve aparecer a informação relevante pedida pela questão (use o argumento popup).

  5. Acrescente outras informações que você achar importantes — por exemplo, a classificação da cidade na ordenação que a questão pede.

    library(leaflet)
    
    # Um exemplo, apenas. Substitua com a tibble da sua resposta:
    df <- cidades %>% 
      filter(
        cidade %in% c('Manaus', 'Brasília', 'Porto Alegre')
      )
    
    # O mapa:
    leaflet(df) %>% 
      setView(
        lng = mean(df$longitude), 
        lat = mean(df$latitude),
        zoom = 4
      ) %>% 
      addTiles() %>% 
      addMarkers()
    ## Assuming "longitude" and "latitude" are longitude and latitude, respectively
  6. Faça um segundo mapa interativo com marcadores para as cidades que satisfazem algum critério que você ache interessante. Use a imaginação.

LS0tCnRpdGxlOiAnQ2lkYWRlcyBicmFzaWxlaXJhcycKc3VidGl0bGU6ICdMaXN0YSBhdmFsaWF0aXZhIC0tIFByb2JhYmlsaWRhZGUgZSBFc3RhdMOtc3RpY2EgLS0gMjAyMi4xJwphdXRob3I6ICdmbmF1ZmVsJwplbWFpbDogJ2h0dHBzOi8vZm5hdWZlbC5naXRodWIuaW8vJwpkYXRlOiAnKHYuIGByIGZvcm1hdChTeXMuRGF0ZSgpLCAiJWQvJW0vJVkiKWApJwpsYW5nOiAncHQtYnInCgpvdXRwdXQ6IAogICMgVG8gaW5zdGFsbCB0aGVzZSBvdXRwdXQgZm9ybWF0cywgcnVuCiAgIyAgIGluc3RhbGwucGFja2FnZXMoImRldnRvb2xzIikKICAjICAgZGV2dG9vbHM6Omluc3RhbGxfZ2l0aHViKCJmbmF1ZmVsL2ZuYXVmZWxSbWQiKQogIGZuYXVmZWxSbWQ6Omh0bWxfcmVwb3J0CgotLS0KCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQojIFRoZSBuZXh0IGNvbW1hbmQgY29uZmlndXJlcyBNQU5ZIHRoaW5ncyBhbmQgbG9hZHMgcXVpdGUgYSBmZXcgcGFja2FnZXMuCiMgCiMgSWYgeW91IHdhbnQgdG8gc2VlIHdoYXQncyBiZWluZyBkb25lLCBleGVjdXRlIAojIAojICAgY2F0KAojICAgICBzeXN0ZW0uZmlsZSgKIyAgICAgICAicm1hcmtkb3duL3Jlc291cmNlcy9SL19jb21tb25fcmVwb3J0LlIiLCAKIyAgICAgICBwYWNrYWdlID0gImZuYXVmZWxSbWQiCiMgICAgICkKIyAgICkKIyAKIyB0byBmaW5kIG91dCB0aGUgbG9jYXRpb24gb2YgdGhlIGZpbGUuIFRoZW4gb3BlbiB0aGUgZmlsZS4KIyAKIyBJZiB5b3Ugd2FudCB0byBjaGFuZ2UgdGhlIGNvbmZpZ3VyYXRpb24sIGNvcHkgdGhlIGZpbGUsIGVkaXQgaXQsIGFuZAojIHNvdXJjZSBpdCBpbnN0ZWFkIG9mIHRoZSBwYWNrYWdlIGZpbGUuIAojIAojIE9yIHNpbXBseSB3cml0ZSB5b3VyIGNvbW1hbmRzIGhlcmUgaW4gdGhpcyBjb2RlIGNodW5rLgoKc291cmNlKAogIHN5c3RlbS5maWxlKAogICAgInJtYXJrZG93bi9yZXNvdXJjZXMvUi9fY29tbW9uX3JlcG9ydC5SIiwKICAgIHBhY2thZ2UgPSAiZm5hdWZlbFJtZCIKICApCikKCiMgT3DDp8O1ZXMgcGFyYSBkZlN1bW1hcnkKc3Rfb3B0aW9ucygKICBkZlN1bW1hcnkuZ3JhcGguY29sID0gRkFMU0UsCikKCgojIDMgY2FzYXMgZGVjaW1haXMgZW0gbsO6bWVyb3Mgbm8gdGV4dG8Kb3B0aW9ucyhmbWRpZ2l0cyA9IDMpCgojIFBhcmEgbWFwYXMgaW50ZXJhdGl2b3MKbGlicmFyeShsZWFmbGV0KQpgYGAKCgojIEluc3RydcOnw7VlcyB7LX0KCiogVmVqYSBuYSB0YWJlbGEgYWJhaXhvIG9zIG7Dum1lcm9zIGRhcyBxdWVzdMO0ZXMgcXVlIGZvcmFtIHNvcnRlYWRhcyBwYXJhIHZvY8OqLiBbU2Ugc2V1IG7Dum1lcm8gZGUgbWF0csOtY3VsYSBuw6NvIGVzdGl2ZXIgbmEgdGFiZWxhLCBlbnRyZSBlbSBjb250YXRvIGNvbWlnbyBwZWxvIFRlbGVncmFtLl17LmhsfQoKICAgIGBgYHtyIGVjaG89RkFMU0V9CiAgICBzZXQuc2VlZCgxMjM1KQogICAgZWRhIDwtIHNhbXBsZSgxOjIwKQogICAgdml6MSA8LSBzYW1wbGUoMToyMCkKICAgIHZpejIgPC0gc2FtcGxlKDIxOjQwKQogICAgbWFwYSA8LSAxCiAgICBtYXRyaWN1bGFzIDwtIGMoCiAgICAgICcyMTgwNjAwNTInLAogICAgICAnMTE1MDYwMDQ3JywKICAgICAgJzExOTA2MDAxMScsCiAgICAgICcyMTgwNjAwNzYnLAogICAgICAnMTE5MDYwMDI1JywKICAgICAgJzIxODA2MDA1MycsCiAgICAgICcxMjAwNjAwMDUnLAogICAgICAnMDIwMDYwMDAzJywKICAgICAgJzkyMDA2MDA3MycsCiAgICAgICcyMTkwNjAwODYnLAogICAgICAnMjIwMDYwMDQ3JywKICAgICAgJzEyMDA2MDAwOScsCiAgICAgICcyMTgwNjAwNzAnLAogICAgICAnMDIwMDYwMDAxJywKICAgICAgJzExNDA2MDA0MycsCiAgICAgICcxMTkwNjAwMDcnLAogICAgICAnMjIwMDYwMDU5JywKICAgICAgJzEyMDA2MDAwNycsCiAgICAgICcyMjAwNjAwNjMnLAogICAgICAnMTE4MDYwMDI5JyAgICAgIAogICAgKQogICAgCiAgICB0aWJibGUoCiAgICAgIG1hdHLDrWN1bGEgPSBtYXRyaWN1bGFzLAogICAgICAnYW7DoWxpc2UgZXhwbG9yYXTDs3JpYScgPSBwYXN0ZTAoJzIuJywgYXMuY2hhcmFjdGVyKGVkYSksICcsJyksCiAgICAgICd2aXN1YWxpemHDp8OjbycgPSBwYXN0ZTAoCiAgICAgICAgcGFzdGUwKCczLicsIGFzLmNoYXJhY3Rlcih2aXoxKSksCiAgICAgICAgJywgJywKICAgICAgICBwYXN0ZTAoJzMuJywgYXMuY2hhcmFjdGVyKHZpejIpKSwKICAgICAgICAnLCcKICAgICAgKSwKICAgICAgJ21hcGEnID0gJzQuMScKICAgICkgJT4lIAogICAgICBhcnJhbmdlKG1hdHLDrWN1bGEpICU+JSAKICAgICAga2JsKAogICAgICAgIGFsaWduID0gJ3InLAogICAgICAgIGNvbC5uYW1lcyA9IGMoCiAgICAgICAgICAnJywgJycsICcnLCAnJwogICAgICAgICkKICAgICAgKSAlPiUgCiAgICAgIGthYmxlX3BhcGVyKAogICAgICAgIGMoJ3N0cmlwZWQnLCAnaG92ZXInKSwKICAgICAgICBmdWxsX3dpZHRoID0gRkFMU0UKICAgICAgKQogICAgYGBgCgoqIENsaXF1ZSBvIGJvdMOjbyBgQ29kZWAsIG5vIGluw61jaW8gZGVzdGEgcMOhZ2luYSwgcGFyYSBiYWl4YXIgbyBhcnF1aXZvIFJtZCBkZXN0ZSBkb2N1bWVudG8uCgoqIEVkaXRlIG8gYXJxdWl2byBSbWQgcGFyYSByZXNvbHZlciBhcyBzdWFzIHF1ZXN0w7Vlcy4gCgoqIFNlIHF1aXNlciByZXNvbHZlciBxdWVzdMO1ZXMgcXVlIG7Do28gZm9yYW0gc29ydGVhZGFzIHBhcmEgdm9jw6osIGZpcXVlIMOgIHZvbnRhZGUuIE5hIHZlcmRhZGUsIGVtIGFsZ3VucyBjYXNvcywgdW1hIHF1ZXN0w6NvIHN1YSBwb2RlIGRlcGVuZGVyIGRhIHJlc3Bvc3RhIGRhIHF1ZXN0w6NvIGRlIG91dHJvIGFsdW5vLgoKKiBFc2NyZXZhIG8gbcOheGltbyBwb3Nzw612ZWwgc29icmUgbyBzZXUgcmFjaW9jw61uaW8uIEp1c3RpZmlxdWUgc3VhcyByZXNwb3N0YXMuCgoqIFRlc3RlIHN1YXMgcmVzcG9zdGFzLiBUdWRvIGRldmUgZXN0YXIgZXhlY3V0YW5kbyBzZW0gZXJyb3MuCgoqIFtFbnZpZSBubyBNb29kbGU6IF17LmhsfQoKICAxLiBPIGFycXVpdm8gUm1kIGNvbSBhcyBzdWFzIHJlc29sdcOnw7VlcyBlCiAgCiAgMS4gVW0gdsOtZGVvIGRlIGF0w6kgJDUkIG1pbnV0b3MgZXhwbGljYW5kbyBhcyBzdWFzIHJlc29sdcOnw7Vlcy4KCiogQm9tIHRyYWJhbGhvLgoKCiMgQW1iaWVudGUgey19CgoqIFBhcmEgZ2VyYXIgdW0gYXJxdWl2byBIVE1MIGEgcGFydGlyIGRlc3RlIGRvY3VtZW50bywgdm9jw6ogcHJlY2lzYSBkb3Mgc2VndWludGVzIHBhY290ZXMgZG8gUjoKCiAgYGBge3IgZWNobz1GQUxTRSwgcmVzdWx0cz0nYXNpcyd9CiAgcGFjb3RlcyA8LSBzZXNzaW9uX2luZm8oJ2F0dGFjaGVkJykkcGFja2FnZXMkcGFja2FnZQogIHBhY290ZXNfdGlkeSA8LSBnZXROYW1lc3BhY2UoInRpZHl2ZXJzZSIpJGNvcmUKICBwYWNvdGVzIDwtIGMoCiAgICBzZXRkaWZmKHBhY290ZXMsIHBhY290ZXNfdGlkeSksCiAgICAnZm5hdWZlbFJtZCcsCiAgICAnZGV2dG9vbHMnCiAgKSAlPiUgCiAgICBzb3J0KCkKICAgCiAgcGFzdGUoJyAgKiBgJywgcGFjb3RlcywgJ2AnLCBjb2xsYXBzZSA9ICdcblxuJykgJT4lIAogICAgY2F0KCkKICBgYGAKCiogU2Ugdm9jw6ogZXN0aXZlciB1c2FuZG8gbyBVYnVudHUsIHZvY8OqIHByZWNpc2EgaW5zdGFsYXIgLS0tIFtwZWxvIHNpc3RlbWEsIG7Do28gcGVsbyBSXXsuaGx9IC0tLSBvIHBhY290ZSBgbGliZ2RhbC1kZXZgLiBGYcOnYSBpc3RvIFthbnRlc117LmhsfSBkZSBleGVjdXRhciBvIGPDs2RpZ28gYWJhaXhvLgoKKiBFeGVjdXRlIG8gc2VndWludGUgY8OzZGlnbyBwYXJhIGluc3RhbGFyIG9zIHBhY290ZXMgcXVlIGVzdMOjbyBmYWx0YW5kbyBubyBzZXUgYW1iaWVudGU6CgogICAgYGBge3IgbWVzc2FnZT1GQUxTRX0KICAgIGlmICghcmVxdWlyZSgnZGV2dG9vbHMnKSkKICAgICAgaW5zdGFsbC5wYWNrYWdlcygnZGV2dG9vbHMnKQogICAgCiAgICBpZiAoIXJlcXVpcmUoJ2ZuYXVmZWxSbWQnKSkKICAgICAgZGV2dG9vbHM6Omluc3RhbGxfZ2l0aHViKCJmbmF1ZmVsL2ZuYXVmZWxSbWQiKQogICAgCiAgICBwYWNvdGVzIDwtIGMoCiAgICAgICdjb25mbGljdGVkJywKICAgICAgJ2thYmxlRXh0cmEnLAogICAgICAna25pdHInLAogICAgICAnbGF0ZXgyZXhwJywKICAgICAgJ2xlYWZsZXQnLAogICAgICAnc2Vzc2lvbmluZm8nLAogICAgICAnc3VtbWFyeXRvb2xzJywKICAgICAgJ3RpZHl2ZXJzZScKICAgICkKICAgIAogICAgaW5zdGFsYXJfc2VfcHJlY2lzbyA8LSBmdW5jdGlvbih4KSB7CiAgICAgIAogICAgICBpZiAoIXJlcXVpcmUoeCwgY2hhcmFjdGVyLm9ubHkgPSBUUlVFKSkKICAgICAgICBpbnN0YWxsLnBhY2thZ2VzKHgpCiAgICAgIAogICAgfQogICAgCiAgICBpbnZpc2libGUoc2FwcGx5KHBhY290ZXMsIGluc3RhbGFyX3NlX3ByZWNpc28pKQogICAgYGBgCgoqIFNlIGhvdXZlciBlcnJvIG5hIGluc3RhbGHDp8OjbywgZW50cmUgZW0gY29udGF0byBjb21pZ28gcGVsbyBUZWxlZ3JhbSwgW2VudmlhbmRvIHRvZGFzIGFzIG1lbnNhZ2VucyBlbWl0aWRhcyBxdWFuZG8gdm9jw6ogZXhlY3V0b3Ugb3MgY29tYW5kb3Ndey5obH0uCgoKIyBMZWl0dXJhIGUgbGltcGV6YSBkb3MgZGFkb3MKCjEuIE9zIG5vbWVzIGRhcyBjb2x1bmFzIG9yaWdpbmFpcyBlc3TDo28gZW0gaW5nbMOqcy4gUGFyYSB2ZXIgbyBbZGljaW9uw6FyaW8gZGUgZGFkb3Ndey5obH0gLS0tIGRvY3VtZW50YcOnw6NvIHNvYnJlIGNhZGEgdW1hIGRhcyBjb2x1bmFzIC0tLSB2aXNpdGUgaHR0cHM6Ly93d3cua2FnZ2xlLmNvbS9kYXRhc2V0cy9jcmlzcGFyYWRhL2JyYXppbGlhbi1jaXRpZXM/c2VsZWN0PURhdGFfRGljdGlvbmFyeS5jc3YuCgoxLiBFaXMgdW1hIGZ1bsOnw6NvIHBhcmEgcmVub21lYXIgYXMgY29sdW5hcyBwYXJhIHBvcnR1Z3XDqnMuIEVsYSBzaW1wbGVzbWVudGUgcmV0b3JuYSB1bSB2ZXRvciBjb20gb3Mgbm92b3Mgbm9tZXMsIG5hIG1lc21hIG9yZGVtIHF1ZSBhcyBjb2x1bmFzIG9yaWdpbmFpcy4KCiAgICBgYGB7cn0KICAgIHJlbm9tZWFyIDwtIGZ1bmN0aW9uKHgpIHsKICAgICAgCiAgICAgIGMoCiAgICAgICAgJ2NpZGFkZScsCiAgICAgICAgJ2VzdGFkbycsCiAgICAgICAgJ2NhcGl0YWwnLAogICAgICAgICdwb3BfcmVzaWQnLAogICAgICAgICdwb3BfcmVzaWRfYnJhcycsCiAgICAgICAgJ3BvcF9yZXNpZF9lc3RyJywKICAgICAgICAndW5pZGFkZXNfZG9tZXN0JywKICAgICAgICAndW5pZGFkZXNfZG9tZXN0X3VyYmFuJywKICAgICAgICAndW5pZGFkZXNfZG9tZXN0X3J1cmFsJywKICAgICAgICAncG9wX3JlZ3VsYXInLAogICAgICAgICdwb3BfcmVndWxhcl8xJywKICAgICAgICAncG9wX3JlZ3VsYXJfMV80JywKICAgICAgICAncG9wX3JlZ3VsYXJfNV85JywKICAgICAgICAncG9wX3JlZ3VsYXJfMTBfMTQnLAogICAgICAgICdwb3BfcmVndWxhcl8xNV81OScsCiAgICAgICAgJ3BvcF9yZWd1bGFyXzYwX21haXMnLAogICAgICAgICdhcmVhX2N1bHRpdmFkYScsCiAgICAgICAgJ3Byb2R1Y2FvX3J1cmFsJywKICAgICAgICAnaWRobV9yYW5raW5nJywKICAgICAgICAnaWRobScsCiAgICAgICAgJ2lkaG1fcmVuZGEnLAogICAgICAgICdpZGhtX2xvbmdldmlkYWRlJywKICAgICAgICAnaWRobV9lZHVjYWNhbycsCiAgICAgICAgJ2xvbmdpdHVkZScsCiAgICAgICAgJ2xhdGl0dWRlJywKICAgICAgICAnYWx0aXR1ZGUnLAogICAgICAgICd0dl9hc3NpbmF0dXJhJywKICAgICAgICAndGVsZWZvbmVzX2ZpeG9zJywKICAgICAgICAnYXJlYScsCiAgICAgICAgJ3JlZ2lhb190dXJpc21vJywKICAgICAgICAnY2F0ZWdvcmlhX3R1cmlzbW8nLAogICAgICAgICdwb3BfZXN0aW1hZGEnLAogICAgICAgICd0aXBvJywKICAgICAgICAnZ3ZhX2Fncm9wZWMnLAogICAgICAgICdndmFfaW5kdXN0cmlhJywKICAgICAgICAnZ3ZhX3NlcnZpY29zJywKICAgICAgICAnZ3ZhX3B1YmxpY28nLAogICAgICAgICdndmFfdG90YWwnLAogICAgICAgICdpbXBvc3RvcycsCiAgICAgICAgJ3BpYicsCiAgICAgICAgJ3BvcF9waWInLAogICAgICAgICdwaWJfY2FwaXRhJywKICAgICAgICAnYXRpdmlkYWRlX3ByaW5jaXBhbCcsCiAgICAgICAgJ2Rlc3Blc2FzX211bmljaXBhaXMnLAogICAgICAgICdlbXByZXNhc190b3QnLAogICAgICAgICdlbXByZXNhc19hJywKICAgICAgICAnZW1wcmVzYXNfYicsCiAgICAgICAgJ2VtcHJlc2FzX2MnLAogICAgICAgICdlbXByZXNhc19kJywKICAgICAgICAnZW1wcmVzYXNfZScsCiAgICAgICAgJ2VtcHJlc2FzX2YnLAogICAgICAgICdlbXByZXNhc19nJywKICAgICAgICAnZW1wcmVzYXNfaCcsCiAgICAgICAgJ2VtcHJlc2FzX2knLAogICAgICAgICdlbXByZXNhc19qJywKICAgICAgICAnZW1wcmVzYXNfaycsCiAgICAgICAgJ2VtcHJlc2FzX2wnLAogICAgICAgICdlbXByZXNhc19tJywKICAgICAgICAnZW1wcmVzYXNfbicsCiAgICAgICAgJ2VtcHJlc2FzX28nLAogICAgICAgICdlbXByZXNhc19wJywKICAgICAgICAnZW1wcmVzYXNfcScsCiAgICAgICAgJ2VtcHJlc2FzX3InLAogICAgICAgICdlbXByZXNhc19zJywKICAgICAgICAnZW1wcmVzYXNfdCcsCiAgICAgICAgJ2VtcHJlc2FzX3UnLAogICAgICAgICdob3RlaXMnLAogICAgICAgICdjYW1hcycsCiAgICAgICAgJ2FnZW5jaWFzX3ByaXYnLAogICAgICAgICdhZ2VuY2lhc19wdWJsJywKICAgICAgICAnYmFuY29zX3ByaXYnLAogICAgICAgICdiYW5jb3NfcHVibCcsCiAgICAgICAgJ3BhdHJpbW9uaW9fYmFuY29zX3ByaXYnLAogICAgICAgICdwYXRyaW1vbmlvX2JhbmNvc19wdWJsJywKICAgICAgICAnY2Fycm9zJywKICAgICAgICAnbW90b3MnLAogICAgICAgICd0cmF0b3JlcycsCiAgICAgICAgJ3ViZXInLAogICAgICAgICdtYWMnLAogICAgICAgICd3YWxtYXJ0JywKICAgICAgICAnY29ycmVpb3MnCiAgICAgICkKICAgICAgCiAgICB9CiAgICBgYGAKCjEuIExlciBvcyBkYWRvcywgcmVub21lYXIgYXMgY29sdW5hcyBlIG11ZGFyIG8gdGlwbyBkZSBkdWFzIGRlbGFzOgoKICAgIGBgYHtyfQogICAgY2lkYWRlcyA8LSByZWFkX2NzdigKICAgICAgJ2h0dHBzOi8vZ2l0aHViLmNvbS9mbmF1ZmVsL2xpc3RhMS1jaWRhZGVzLWJyL3Jhdy9tYXN0ZXIvZGFkb3MvQlJBWklMX0NJVElFU19SRVYyMDIyLkNTVicKICAgICkgJT4lIAogICAgICByZW5hbWVfd2l0aCguZm4gPSByZW5vbWVhcikgJT4lIAogICAgICBtdXRhdGUoCiAgICAgICAgY2FwaXRhbCA9IGFzLmxvZ2ljYWwoY2FwaXRhbCksCiAgICAgICAgdWJlciA9IGFzLmxvZ2ljYWwodWJlcikKICAgICAgKQogICAgYGBgCgoxLiBFeGFtaW5hciBhICp0aWJibGUqIGNvbSBgZGZTdW1tYXJ5YDoKCiAgICBgYGB7ciBjYWNoZT1UUlVFfQogICAgY2lkYWRlcyAlPiUgCiAgICAgIGRmU3VtbWFyeSgpICU+JSAKICAgICAgcHJpbnQobWV0aG9kID0gJ3JlbmRlcicpCiAgICBgYGAKCgojIEFuw6FsaXNlIGV4cGxvcmF0w7NyaWEgeyNlZGF9CgojIyBJREhNCgoxLiBQZXNxdWlzZSBvIHF1ZSDDqSBJREhNLgoKMS4gUXVhbCBvIHZhbG9yIG3DoXhpbW8gcG9zc8OtdmVsPyBRdWFsIG8gdmFsb3IgbcOheGltbyBuYSAqdGliYmxlKj8KICAKCiMjIEVzdGFkb3MgZSBjYXBpdGFpcwoKMS4gQ29tcGFyZSBhIHF1YW50aWRhZGUgZGUgZXN0YWRvcyBjb20gYSBxdWFudGlkYWRlIGRlIGNhcGl0YWlzLiBPIHF1ZSBlc3TDoSBlcnJhZG8/IENvbnNlcnRlIGEgc2l0dWHDp8Ojby4KCgojIyBQb3B1bGHDp8O1ZXMKCjEuIFZlcmlmaXF1ZSBzZSBhIGNvbHVuYSBgcG9wX3Jlc2lkYCAocG9wdWxhw6fDo28gZGUgcmVzaWRlbnRlcykgw6kgYSBzb21hIGRlIGBwb3BfcmVzaWRfYnJhc2AgKHBvcHVsYcOnw6NvIGRlIHJlc2lkZW50ZXMgYnJhc2lsZWlyb3MpIGNvbSBgcG9wX3Jlc2lkX2VzdHJgIChwb3B1bGHDp8OjbyBkZSByZXNpZGVudGVzIGVzdHJhbmdlaXJvcykuIFVzZSBhIGZ1bsOnw6NvIGBhbGxgLgoKCiMjIFVuaWRhZGVzIGRvbcOpc3RpY2FzCgoxLiBWZXJpZmlxdWUgc2UgYSBjb2x1bmEgYHVuaWRhZGVzX2RvbWVzdGAgKHVuaWRhZGVzIGRvbcOpc3RpY2FzKSDDqSBhIHNvbWEgZGUgYHVuaWRhZGVzX2RvbWVzdF91cmJhbmAgKHVyYmFuYXMpIGNvbSBgdW5pZGFkZXNfZG9tZXN0X3J1cmFsYCAocnVyYWlzKS4gVXNlIGEgZnVuw6fDo28gYGFsbGAuCgoKIyMgQ2F0ZWdvcmlhcyBkZSB0dXJpc21vCgoxLiBOYSBjb2x1bmEgYGNhdGVnb3JpYV90dXJpc21vYCwgc3Vic3RpdHVhIG9zIHplcm9zIHBvciBgTkFgIGUgY29udmVydGEgdHVkbyBwYXJhIHVtIFtmYXRvciBvcmRlbmFkb117LmhsfSBjb20gbsOtdmVpcyAkRSA8IEQgPCBDIDwgQiA8IEEkLiBVc2UgYSBmdW7Dp8OjbyBgZmFjdG9yYC4KCgojIyBUaXBvcwoKMS4gTmEgY29sdW5hIGB0aXBvYCwgc3Vic3RpdHVhIG9zIHplcm9zIHBvciBgTkFgIGUgY29udmVydGEgdHVkbyBwYXJhIHVtIFtmYXRvciBuw6NvLW9yZGVuYWRvXXsuaGx9LgoKCiMjIEF0aXZpZGFkZXMgcHJpbmNpcGFpcwoKMS4gTmEgY29sdW5hIGBhdGl2aWRhZGVfcHJpbmNpcGFsYCwgc3Vic3RpdHVhIG9zIHplcm9zIHBvciBgTkFgIGUgY29udmVydGEgdHVkbyBwYXJhIHVtIFtmYXRvciBuw6NvLW9yZGVuYWRvXXsuaGx9LgoKCiMjIFJlZ2nDtWVzIGdlb2dyw6FmaWNhcyB7I3JlZ2lvZXMtZ2VvfQoKMS4gQ3JpZSB1bWEgbm92YSBjb2x1bmEsIFtkbyB0aXBvIGZhdG9yXXsuaGx9LCBjaGFtYWRhIGByZWdpYW9gLCBjb20gYSByZWdpw6NvIGdlb2dyw6FmaWNhIChOb3J0ZSwgTm9yZGVzdGUsIENlbnRyby1PZXN0ZSwgU3VkZXN0ZSwgb3UgU3VsKSBvbmRlIGVzdMOhIGNhZGEgbXVuaWPDrXBpby4gVXNlIG9zIG7DrXZlaXMgJ04nLCAnTkUnLCAnQ08nLCAnU0UnLCAnUycuCgoKIyMgUmVnacO1ZXMgZGUgdHVyaXNtbwoKMS4gTmEgY29sdW5hIGByZWdpYW9fdHVyaXNtb2AsIHN1YnN0aXR1YSBvcyB6ZXJvcyBwb3IgYE5BYC4KCjEuIFF1YW50YXMgcmVnacO1ZXMgZGUgdHVyaXNtbyBzw6NvPwoKMS4gUXVhbCB0ZW0gbWFpcyBtdW5pY8OtcGlvcz8KCjEuIFF1YWwgdGVtIG1lbm9zIG11bmljw61waW9zPwoKMS4gUXVhbnRvcyBtdW5pY8OtcGlvcyBuw6NvIGZhemVtIHBhcnRlIGRlIHJlZ2nDo28gZGUgdHVyaXNtbz8KCjEuIEV4aXN0ZSBhbGd1bWEgcmVnacOjbyBkZSB0dXJpc21vIGNvbnRlbmRvIGNpZGFkZXMgZGUgZXN0YWRvcyBkaWZlcmVudGVzPwoKCiMjIE5vbWVzIGRhcyByZWdpw7VlcyBkZSB0dXJpc21vCgoxLiBHZXJlIHVtYSAqdGliYmxlKiBjb20gdG9kb3Mgb3MgdmFsb3JlcyBkaXN0aW50b3MgZGUgYHJlZ2lhb190dXJpc21vYCwgc2VtIHJlcGV0acOnw7Vlcy4gCgoxLiBRdWFpcyBzw6NvIGFzICQxMCQgcGFsYXZyYXMgbWFpcyBjb211bnMgcXVlIGluaWNpYW0gb3Mgbm9tZXMgZGUgcmVnacO1ZXMgZGUgdHVyaXNtbz8gVXNlIGEgZnVuw6fDo28gYHdvcmRgLgogICAKCjEuIExpc3RlLCBlbSBvcmRlbSBhbGZhYsOpdGljYSwgb3Mgbm9tZXMgY29tcGxldG9zIGRhcyByZWdpw7VlcyBkZSB0dXJpc21vIGN1am9zIG5vbWVzIGNvbWXDp2FtIGNvbSBwYWxhdnJhcyBkZXN0YSBsaXN0YS4gCgoKIyMgUElCCgoxLiBWZXJpZmlxdWUgc2UgYSBjb2x1bmEgYHBpYl9jYXBpdGFgIMOpIG8gcmVzdWx0YWRvIGRhIGRpdmlzw6NvIGRlIGBwaWJgIHBvciBgcG9wX3BpYmAuIFVzZSBhIGZ1bsOnw6NvIGBhbGxgLgoKCiMjIENhcnJvcwoKMS4gUXVhaXMgYXMgJDEwJCBjaWRhZGVzIHF1ZSB0w6ptIGEgW21haW9yIHF1YW50aWRhZGUgZGUgY2Fycm9zIHBvciBoYWJpdGFudGVdey5obH0/CgoxLiBRdWFpcyBhcyAkMTAkIGNpZGFkZXMgcXVlIHTDqm0gYSBbbWVub3IgcXVhbnRpZGFkZSBkZSBjYXJyb3MgcG9yIGhhYml0YW50ZV17LmhsfT8KCjEuIFF1YWlzIHPDo28gb3MgdGlwb3MgZGVzdGFzIGNpZGFkZXM/CgoxLiBDb21lbnRlIG9zIHJlc3VsdGFkb3MuCgoKIyMgTW90b3MKCjEuIFF1YWlzIGFzICQxMCQgY2lkYWRlcyBxdWUgdMOqbSBhIFttYWlvciBxdWFudGlkYWRlIGRlIG1vdG9zIHBvciBoYWJpdGFudGVdey5obH0/CgoxLiBRdWFpcyBhcyAkMTAkIGNpZGFkZXMgcXVlIHTDqm0gYSBbbWVub3IgcXVhbnRpZGFkZSBkZSBtb3RvcyBwb3IgaGFiaXRhbnRlXXsuaGx9PwoKMS4gUXVhaXMgc8OjbyBvcyB0aXBvcyBkZXN0YXMgY2lkYWRlcz8KCjEuIENvbWVudGUgb3MgcmVzdWx0YWRvcy4KCgojIyBUcmF0b3JlcwoKMS4gUXVhaXMgYXMgJDEwJCBjaWRhZGVzIHF1ZSB0w6ptIGEgW21haW9yIHF1YW50aWRhZGUgZGUgdHJhdG9yZXMgcG9yIGhhYml0YW50ZV17LmhsfT8gSWdub3JlIGFzIGNpZGFkZXMgcXVlIHTDqm0gemVybyB0cmF0b3Jlcy4KCjEuIFF1YWlzIGFzICQxMCQgY2lkYWRlcyBxdWUgdMOqbSBhIFttZW5vciBxdWFudGlkYWRlIGRlIHRyYXRvcmVzIHBvciBoYWJpdGFudGVdey5obH0/IElnbm9yZSBhcyBjaWRhZGVzIHF1ZSB0w6ptIHplcm8gdHJhdG9yZXMuCgoxLiBRdWFpcyBzw6NvIG9zIHRpcG9zIGRlc3RhcyBjaWRhZGVzPwoKMS4gQ29tZW50ZSBvcyByZXN1bHRhZG9zLgoKCiMjIMOBcmVhcwoKMS4gUXVhaXMgYXMgJDEwJCBjaWRhZGVzIHF1ZSB0w6ptIGEgW21haW9yIMOhcmVhXXsuaGx9PwoKMS4gUXVhaXMgYXMgJDEwJCBjaWRhZGVzIHF1ZSB0w6ptIGEgW21lbm9yIMOhcmVhXXsuaGx9PwoKMS4gUXVhaXMgc8OjbyBvcyB0aXBvcyBkZXN0YXMgY2lkYWRlcz8KCjEuIENvbWVudGUgb3MgcmVzdWx0YWRvcy4KCgojIyBQcm9kdcOnw6NvIHJ1cmFsCgoxLiBRdWFpcyBhcyAkMTAkIGNpZGFkZXMgcXVlIHTDqm0gYSBbbWFpb3IgcHJvZHXDp8OjbyBydXJhbF17LmhsfT8KCjEuIFF1YWlzIGFzICQxMCQgY2lkYWRlcyBxdWUgdMOqbSBhIFttZW5vciBwcm9kdcOnw6NvIHJ1cmFsXXsuaGx9PwoKMS4gUXVhaXMgc8OjbyBvcyB0aXBvcyBkZXN0YXMgY2lkYWRlcz8gSWdub3JlIGFzIGNpZGFkZXMgcXVlIHTDqm0gemVybyBwcm9kdcOnw6NvIHJ1cmFsLgoKMS4gQ29tZW50ZSBvcyByZXN1bHRhZG9zLgoKCiMjIFByb2R1w6fDo28gcnVyYWwgKnBlciBjYXBpdGEqCgoxLiBRdWFpcyBhcyAkMTAkIGNpZGFkZXMgcXVlIHTDqm0gYSBbbWFpb3IgcHJvZHXDp8OjbyBydXJhbCAqcGVyIGNhcGl0YSpdey5obH0/CgoxLiBRdWFpcyBhcyAkMTAkIGNpZGFkZXMgcXVlIHTDqm0gYSBbbWVub3IgcHJvZHXDp8OjbyBydXJhbCAqcGVyIGNhcGl0YSpdey5obH0/CgoxLiBRdWFpcyBzw6NvIG9zIHRpcG9zIGRlc3RhcyBjaWRhZGVzPyBJZ25vcmUgYXMgY2lkYWRlcyBxdWUgdMOqbSB6ZXJvIHByb2R1w6fDo28gcnVyYWwuCgoxLiBDb21lbnRlIG9zIHJlc3VsdGFkb3MuCgoKIyMgRGVuc2lkYWRlIGRlbW9ncsOhZmljYQoKMS4gUXVhaXMgYXMgJDEwJCBjaWRhZGVzIHF1ZSB0w6ptIGEgW21haW9yIGRlbnNpZGFkZSBkZW1vZ3LDoWZpY2Fdey5obH0/CgoxLiBRdWFpcyBhcyAkMTAkIGNpZGFkZXMgcXVlIHTDqm0gYSBbbWVub3IgZGVuc2lkYWRlIGRlbW9ncsOhZmljYV17LmhsfT8KCjEuIFF1YWlzIHPDo28gb3MgdGlwb3MgZGVzdGFzIGNpZGFkZXM/IAoKMS4gQ29tZW50ZSBvcyByZXN1bHRhZG9zLgoKCiMjIENpZGFkZXMgZXh0cmVtYXMKCjEuIFF1YWlzIHPDo28gYXMgJDEwJCBjaWRhZGVzIGRlIFttYWlvciBlIG1lbm9yIGxhdGl0dWRlXXsuaGx9PwoKMS4gUXVhaXMgc8OjbyBhcyAkMTAkIGNpZGFkZXMgZGUgW21haW9yIGUgbWVub3IgbG9uZ2l0dWRlXXsuaGx9PwoKMS4gUXVhaXMgc8OjbyBhcyAkMTAkIGNpZGFkZXMgZGUgW21haW9yIGUgbWVub3IgYWx0aXR1ZGVdey5obH0/CgoxLiBSZXNwb25kYSBhcyBwZXJndW50YXMgYWNpbWEgW3BvciByZWdpw6NvIGdlb2dyw6FmaWNhXS4gVm9jw6ogdmFpIHByZWNpc2FyIGRhIHJlc3Bvc3RhIFtkZXN0YSBxdWVzdMOjb10oI3JlZ2lvZXMtZ2VvKS4KCgojIyBGYWl4YXMgZXTDoXJpYXMKCjEuIFF1YWlzIGFzICQxMCQgY2lkYWRlcyBjb20gYSBbbWFpb3IgcHJvcG9yw6fDo28gZGUgaWRvc29zICg2MCBhbm9zIG91IG1haXMpXXsuaGx9PwoKMS4gUXVhaXMgYXMgJDEwJCBjaWRhZGVzIGNvbSBhIFttZW5vciBwcm9wb3LDp8OjbyBkZSBpZG9zb3MgKDYwIGFub3Mgb3UgbWFpcyldey5obH0/CgoxLiBRdWFpcyBzw6NvIG9zIHRpcG9zIGRlc3RhcyBjaWRhZGVzPyAKCjEuIENvbWVudGUgb3MgcmVzdWx0YWRvcy4KCgojIFZpc3VhbGl6YcOnw6NvCgo6Ojogey5ybWRpbXBvcnRhbnQgbGF0ZXg9MX0KCiogVG9kb3Mgb3MgZ3LDoWZpY29zIGRldmVtIHNlciBmZWl0b3MgY29tIG8gcGFjb3RlIGdncGxvdDIuCgoqIFRvZG9zIG9zIGdyw6FmaWNvcyBkZXZlbSBpbmNsdWlyIHTDrXR1bG9zLCByw7N0dWxvcywgbGVnZW5kYXMsIGUgb3V0cm9zIGVsZW1lbnRvcyBwYXJhIGZhY2lsaXRhciBhIGNvbXByZWVuc8Ojby4gSW1hZ2luZSBxdWUgc2V1cyBncsOhZmljb3Mgc2Vyw6NvIHB1YmxpY2Fkb3MgZW0gdW1hIHJldmlzdGEgY2llbnTDrWZpY2EuCgo6OjoKCgojIyBQb3B1bGHDp8OjbyBlIE1jRG9uYWxkJ3MKCjEuIFtBcGVuYXMgcGFyYSBhcyBjaWRhZGVzIHF1ZSB0w6ptIE1jRG9uYWxkJ3Ndey5obH0sIGZhw6dhIHVtICpzY2F0dGVycGxvdCogZGUgcXVhbnRpZGFkZSBkZSBNY0RvbmFsZCdzIChubyBlaXhvICR5JCkgcG9yIHBvcHVsYcOnw6NvIChubyBlaXhvICR4JCkuCgoxLiBVc2UgYGdlb21fc21vb3RoYCBwYXJhIGdlcmFyIHVtYSByZXRhIGRlIHJlZ3Jlc3PDo28gKGNvbSBgbWV0aG9kID0gJ2xtJ2AgZSBgc2UgPSBGQUxTRWApLgoKMS4gRXhpc3RlIGFsZ3VtYSBjb3JyZWxhw6fDo28gZW50cmUgYXMgcXVhbnRpZGFkZXM/IENvbWVudGUuCgoKIyMgUG9wdWxhw6fDo28gZSBXYWxtYXJ0CgoxLiBbQXBlbmFzIHBhcmEgYXMgY2lkYWRlcyBxdWUgdMOqbSBXYWxtYXJ0XXsuaGx9LCBmYcOnYSB1bSAqc2NhdHRlcnBsb3QqIGRlIHF1YW50aWRhZGUgZGUgV2FsbWFydHMgKG5vIGVpeG8gJHkkKSBwb3IgcG9wdWxhw6fDo28gKG5vIGVpeG8gJHgkKS4KCjEuIFVzZSBgZ2VvbV9zbW9vdGhgIHBhcmEgZ2VyYXIgdW1hIHJldGEgZGUgcmVncmVzc8OjbyAoY29tIGBtZXRob2QgPSAnbG0nYCBlIGBzZSA9IEZBTFNFYCkuCgoxLiBFeGlzdGUgYWxndW1hIGNvcnJlbGHDp8OjbyBlbnRyZSBhcyBxdWFudGlkYWRlcz8gQ29tZW50ZS4KCgojIyBJREhNIGUgUElCICpwZXIgY2FwaXRhKgoKMS4gRmHDp2EgdW0gKnNjYXR0ZXJwbG90KiBkZSBJREhNIChubyBlaXhvICR5JCkgcG9yIFBJQiAqcGVyIGNhcGl0YSogKG5vIGVpeG8gJHgkKS4KCjEuIFVzZSBgZ2VvbV9zbW9vdGhgIHBhcmEgZ2VyYXIgdW1hIHJldGEgZGUgcmVncmVzc8OjbyAoY29tIGBtZXRob2QgPSAnbG0nYCBlIGBzZSA9IEZBTFNFYCkuCgoxLiBFeGlzdGUgYWxndW1hIGNvcnJlbGHDp8OjbyBlbnRyZSBhcyBxdWFudGlkYWRlcz8gQ29tZW50ZS4KCgojIyBJREhNIGUgZGVzcGVzYXMgbXVuaWNpcGFpcwoKMS4gRmHDp2EgdW0gKnNjYXR0ZXJwbG90KiBkZSBJREhNIChubyBlaXhvICR5JCkgcG9yIGRlc3Blc2FzIG11bmljaXBhaXMgKG5vIGVpeG8gJHgkKS4KCjEuIFVzZSBgZ2VvbV9zbW9vdGhgIHBhcmEgZ2VyYXIgdW1hIHJldGEgZGUgcmVncmVzc8OjbyAoY29tIGBtZXRob2QgPSAnbG0nYCBlIGBzZSA9IEZBTFNFYCkuCgoxLiBFeGlzdGUgYWxndW1hIGNvcnJlbGHDp8OjbyBlbnRyZSBhcyBxdWFudGlkYWRlcz8gQ29tZW50ZS4KCgojIyBJREhNIGUgY2Fycm9zCgoxLiBGYcOnYSB1bSAqc2NhdHRlcnBsb3QqIGRlIElESE0gKG5vIGVpeG8gJHkkKSBwb3IgcXVhbnRpZGFkZSBkZSBjYXJyb3MgKG5vIGVpeG8gJHgkKS4KCjEuIFVzZSBgZ2VvbV9zbW9vdGhgIHBhcmEgZ2VyYXIgdW1hIHJldGEgZGUgcmVncmVzc8OjbyAoY29tIGBtZXRob2QgPSAnbG0nYCBlIGBzZSA9IEZBTFNFYCkuCgoxLiBFeGlzdGUgYWxndW1hIGNvcnJlbGHDp8OjbyBlbnRyZSBhcyBxdWFudGlkYWRlcz8gQ29tZW50ZS4KCgojIyBJREhNIGUgbW90b3MKCjEuIEZhw6dhIHVtICpzY2F0dGVycGxvdCogZGUgSURITSAobm8gZWl4byAkeSQpIHBvciBxdWFudGlkYWRlIGRlIG1vdG9zIChubyBlaXhvICR4JCkuCgoxLiBVc2UgYGdlb21fc21vb3RoYCBwYXJhIGdlcmFyIHVtYSByZXRhIGRlIHJlZ3Jlc3PDo28gKGNvbSBgbWV0aG9kID0gJ2xtJ2AgZSBgc2UgPSBGQUxTRWApLgoKMS4gRXhpc3RlIGFsZ3VtYSBjb3JyZWxhw6fDo28gZW50cmUgYXMgcXVhbnRpZGFkZXM/IENvbWVudGUuCgoKIyMgSURITSBlIHRyYXRvcmVzCgoxLiBGYcOnYSB1bSAqc2NhdHRlcnBsb3QqIGRlIElESE0gKG5vIGVpeG8gJHkkKSBwb3IgcXVhbnRpZGFkZSBkZSB0cmF0b3JlcyAobm8gZWl4byAkeCQpLiBJZ25vcmUgYXMgY2lkYWRlcyBxdWUgdMOqbSB6ZXJvIHRyYXRvcmVzLgoKMS4gVXNlIGBnZW9tX3Ntb290aGAgcGFyYSBnZXJhciB1bWEgcmV0YSBkZSByZWdyZXNzw6NvIChjb20gYG1ldGhvZCA9ICdsbSdgIGUgYHNlID0gRkFMU0VgKS4KCjEuIEV4aXN0ZSBhbGd1bWEgY29ycmVsYcOnw6NvIGVudHJlIGFzIHF1YW50aWRhZGVzPyBDb21lbnRlLgoKCiMjIENvcnJlaW9zCgoxLiBGYcOnYSB1bSBoaXN0b2dyYW1hIGRhIHF1YW50aWRhZGUgZGUgYWfDqm5jaWFzIGRlIGNvcnJlaW9zLiBVc2UgbyBuw7ptZXJvIGRlIGNsYXNzZXMgcXVlIHZvY8OqIGFjaGFyIG1haXMgYWRlcXVhZG8uCgoxLiBDb21lbnRlIG9zIHJlc3VsdGFkb3MuCgoKIyMgQ29ycmVpb3MgKnBlciBjYXBpdGEqCgoxLiBGYcOnYSB1bSBoaXN0b2dyYW1hIGRhIHJhesOjbyBbKG7Dum1lcm8gZGUgYWfDqm5jaWFzIGRlIGNvcnJlaW8pIC8gKHBvcHVsYcOnw6NvKV17LmhsfS4gVXNlIG8gbsO6bWVybyBkZSBjbGFzc2VzIHF1ZSB2b2PDqiBhY2hhciBtYWlzIGFkZXF1YWRvLgoKMS4gQ29tZW50ZSBvcyByZXN1bHRhZG9zLgoKCiMjIEFnw6puY2lhcyBiYW5jw6FyaWFzIChww7pibGljYXMpCgoxLiBGYcOnYSB1bSBoaXN0b2dyYW1hIGRhIHF1YW50aWRhZGUgZGUgYWfDqm5jaWFzIGJhbmPDoXJpYXMgcMO6YmxpY2FzLiBVc2UgbyBuw7ptZXJvIGRlIGNsYXNzZXMgcXVlIHZvY8OqIGFjaGFyIG1haXMgYWRlcXVhZG8uCgoxLiBDb21wYXJlIGNvbSBhIGRpc3RyaWJ1acOnw6NvIGRlIGFnw6puY2lhcyBwcml2YWRhcy4KCjEuIENvbWVudGUgb3MgcmVzdWx0YWRvcy4KCgojIyBBZ8OqbmNpYXMgYmFuY8OhcmlhcyAocMO6YmxpY2FzKSAqcGVyIGNhcGl0YSoKCjEuIEZhw6dhIHVtIGhpc3RvZ3JhbWEgZGEgcmF6w6NvIFsobsO6bWVybyBkZSBhZ8OqbmNpYXMgYmFuY8OhcmlhcyBww7pibGljYXMpIC8gKHBvcHVsYcOnw6NvKV17LmhsfS4gVXNlIG8gbsO6bWVybyBkZSBjbGFzc2VzIHF1ZSB2b2PDqiBhY2hhciBtYWlzIGFkZXF1YWRvLgoKMS4gQ29tcGFyZSBjb20gYSBkaXN0cmlidWnDp8OjbyBkZSBhZ8OqbmNpYXMgcHJpdmFkYXMuCgoxLiBDb21lbnRlIG9zIHJlc3VsdGFkb3MuCgoKIyMgQWfDqm5jaWFzIGJhbmPDoXJpYXMgKHByaXZhZGFzKQoKMS4gRmHDp2EgdW0gaGlzdG9ncmFtYSBkYSBxdWFudGlkYWRlIGRlIGFnw6puY2lhcyBiYW5jw6FyaWFzIHByaXZhZGFzLiBVc2UgbyBuw7ptZXJvIGRlIGNsYXNzZXMgcXVlIHZvY8OqIGFjaGFyIG1haXMgYWRlcXVhZG8uCgoxLiBDb21wYXJlIGNvbSBhIGRpc3RyaWJ1acOnw6NvIGRlIGFnw6puY2lhcyBww7pibGljYXMuCgoxLiBDb21lbnRlIG9zIHJlc3VsdGFkb3MuCgoKIyMgQWfDqm5jaWFzIGJhbmPDoXJpYXMgKHByaXZhZGFzKSAqcGVyIGNhcGl0YSoKCjEuIEZhw6dhIHVtIGhpc3RvZ3JhbWEgZGEgcmF6w6NvIFsobsO6bWVybyBkZSBhZ8OqbmNpYXMgYmFuY8OhcmlhcyBwcml2YWRhcykgLyAocG9wdWxhw6fDo28pXXsuaGx9LiBVc2UgbyBuw7ptZXJvIGRlIGNsYXNzZXMgcXVlIHZvY8OqIGFjaGFyIG1haXMgYWRlcXVhZG8uCgoxLiBDb21wYXJlIGNvbSBhIGRpc3RyaWJ1acOnw6NvIGRlIGFnw6puY2lhcyBww7pibGljYXMuCgoxLiBDb21lbnRlIG9zIHJlc3VsdGFkb3MuCgoKIyMgw4FyZWFzCgoxLiBGYcOnYSB1bSBoaXN0b2dyYW1hIGRhcyDDoXJlYXMgZGFzIGNpZGFkZXMuIFVzZSBvIG7Dum1lcm8gZGUgY2xhc3NlcyBxdWUgdm9jw6ogYWNoYXIgbWFpcyBhZGVxdWFkby4KCjEuIENvbWVudGUgb3MgcmVzdWx0YWRvcy4KCgojIyDDgXJlYXMgKGNvbSBmYWNldGFzKQoKMS4gRmHDp2EgaGlzdG9ncmFtYXMgZGFzIMOhcmVhcyBkYXMgY2lkYWRlcywgW2ZhY2V0YWRvcyBwb3IgcmVnacOjbyBnZW9ncsOhZmljYV17LmhsfS4gVXNlIG8gbsO6bWVybyBkZSBjbGFzc2VzIHF1ZSB2b2PDqiBhY2hhciBtYWlzIGFkZXF1YWRvLiBWb2PDqiB2YWkgcHJlY2lzYXIgZGEgcmVzcG9zdGEgW2Rlc3RhIHF1ZXN0w6NvXSgjcmVnaW9lcy1nZW8pLgoKMS4gQ29tZW50ZSBvcyByZXN1bHRhZG9zLgoKCiMjIFBvcHVsYcOnw7VlcwoKMS4gRmHDp2EgdW0gaGlzdG9ncmFtYSBkYXMgcG9wdWxhw6fDtWVzIGRhcyBjaWRhZGVzLiBVc2UgbyBuw7ptZXJvIGRlIGNsYXNzZXMgcXVlIHZvY8OqIGFjaGFyIG1haXMgYWRlcXVhZG8uCgoxLiBDb21lbnRlIG9zIHJlc3VsdGFkb3MuCgoKIyMgUG9wdWxhw6fDtWVzIChjb20gZmFjZXRhcykKCjEuIEZhw6dhIGhpc3RvZ3JhbWFzIGRhcyBwb3B1bGHDp8O1ZXMgZGFzIGNpZGFkZXMsIFtmYWNldGFkb3MgcG9yIHJlZ2nDo28gZ2VvZ3LDoWZpY2Fdey5obH0uIFVzZSBvIG7Dum1lcm8gZGUgY2xhc3NlcyBxdWUgdm9jw6ogYWNoYXIgbWFpcyBhZGVxdWFkby4gVm9jw6ogdmFpIHByZWNpc2FyIGRhIHJlc3Bvc3RhIFtkZXN0YSBxdWVzdMOjb10oI3JlZ2lvZXMtZ2VvKS4KCjEuIENvbWVudGUgb3MgcmVzdWx0YWRvcy4KCgojIyBQSUIKCjEuIEZhw6dhIHVtIGhpc3RvZ3JhbWEgZG8gdmFsb3IgZG8gUElCLiBVc2UgbyBuw7ptZXJvIGRlIGNsYXNzZXMgcXVlIHZvY8OqIGFjaGFyIG1haXMgYWRlcXVhZG8uCgoxLiBDb21lbnRlIG9zIHJlc3VsdGFkb3MuCgoKIyMgUElCICpwZXIgY2FwaXRhKgoKMS4gRmHDp2EgdW0gaGlzdG9ncmFtYSBkbyB2YWxvciBkbyBQSUIgKnBlciBjYXBpdGEqLiBVc2UgbyBuw7ptZXJvIGRlIGNsYXNzZXMgcXVlIHZvY8OqIGFjaGFyIG1haXMgYWRlcXVhZG8uCgoxLiBDb21lbnRlIG9zIHJlc3VsdGFkb3MuCgoKIyMgVGVsZWZvbmVzIGZpeG9zICpwZXIgY2FwaXRhKiAoY29tIGZhY2V0YXMpCgoxLiBGYcOnYSBoaXN0b2dyYW1hcyBkYXMgcXVhbnRpZGFkZXMgZGUgdGVsZWZvbmVzIGZpeG9zICpwZXIgY2FwaXRhKiwgW2ZhY2V0YWRvcyBwb3IgcmVnacOjbyBnZW9ncsOhZmljYV17LmhsfS4gVXNlIG8gbsO6bWVybyBkZSBjbGFzc2VzIHF1ZSB2b2PDqiBhY2hhciBtYWlzIGFkZXF1YWRvLiBWb2PDqiB2YWkgcHJlY2lzYXIgZGEgcmVzcG9zdGEgW2Rlc3RhIHF1ZXN0w6NvXSgjcmVnaW9lcy1nZW8pLgoKMS4gQ29tZW50ZSBvcyByZXN1bHRhZG9zLgoKCiMjIEFzc2luYXR1cmFzIGRlIFRWICpwZXIgY2FwaXRhKiAoY29tIGZhY2V0YXMpCgoxLiBGYcOnYSBoaXN0b2dyYW1hcyBkYXMgcXVhbnRpZGFkZXMgZGUgYXNzaW5hdHVyYXMgZGUgVFYgcG9yIGFzc2luYXR1cmEgKnBlciBjYXBpdGEqLCBbZmFjZXRhZG9zIHBvciByZWdpw6NvIGdlb2dyw6FmaWNhXXsuaGx9LiBVc2UgbyBuw7ptZXJvIGRlIGNsYXNzZXMgcXVlIHZvY8OqIGFjaGFyIG1haXMgYWRlcXVhZG8uIFZvY8OqIHZhaSBwcmVjaXNhciBkYSByZXNwb3N0YSBbZGVzdGEgcXVlc3TDo29dKCNyZWdpb2VzLWdlbykuCgoxLiBDb21lbnRlIG9zIHJlc3VsdGFkb3MuCgoKIyMgUElCIGUgYXRpdmlkYWRlIHByaW5jaXBhbAoKMS4gRmHDp2EgKmJveHBsb3RzKiBsYWRvIGEgbGFkbyBbKG5vIG1lc21vIGdyw6FmaWNvLCBzZW0gZmFjZXRhcildey5obH0gZG8gUElCLCBjb20gdW0gKmJveHBsb3QqIHBhcmEgY2FkYSBhdGl2aWRhZGUgcHJpbmNpcGFsLiBGYcOnYSBjb20gcXVlIG9zICpib3hwbG90cyogc2VqYW0gaG9yaXpvbnRhaXMsIHBhcmEgZmFjaWxpdGFyIGEgbGVpdHVyYSBkb3Mgbm9tZXMgZGFzIGF0aXZpZGFkZXMuCgoxLiBDb21lbnRlIG9zIHJlc3VsdGFkb3MuCgoKIyMgUElCICpwZXIgY2FwaXRhKiBlIGF0aXZpZGFkZSBwcmluY2lwYWwKCjEuIEZhw6dhICpib3hwbG90cyogbGFkbyBhIGxhZG8gWyhubyBtZXNtbyBncsOhZmljbywgc2VtIGZhY2V0YXIpXXsuaGx9IGRvIFBJQiAqcGVyIGNhcGl0YSosIGNvbSB1bSAqYm94cGxvdCogcGFyYSBjYWRhIGF0aXZpZGFkZSBwcmluY2lwYWwuIEZhw6dhIGNvbSBxdWUgb3MgKmJveHBsb3RzKiBzZWphbSBob3Jpem9udGFpcywgcGFyYSBmYWNpbGl0YXIgYSBsZWl0dXJhIGRvcyBub21lcyBkYXMgYXRpdmlkYWRlcy4KCjEuIENvbWVudGUgb3MgcmVzdWx0YWRvcy4KCgojIyBIb3TDqWlzIGUgY2F0ZWdvcmlhIGRlIHR1cmlzbW8KCjEuIEZhw6dhICpib3hwbG90cyogbGFkbyBhIGxhZG8gWyhubyBtZXNtbyBncsOhZmljbywgc2VtIGZhY2V0YXIpXXsuaGx9IGRhIHF1YW50aWRhZGUgZGUgaG90w6lpcywgY29tIHVtICpib3hwbG90KiBwYXJhIGNhZGEgY2F0ZWdvcmlhIGRlIHR1cmlzbW8uIAoKMS4gQ29tZW50ZSBvcyByZXN1bHRhZG9zLgoKCiMjIFBvcHVsYcOnw7VlcyBwb3IgcmVnacOjbwoKMS4gRmHDp2EgKmJveHBsb3RzKiBsYWRvIGEgbGFkbyBbKG5vIG1lc21vIGdyw6FmaWNvLCBzZW0gZmFjZXRhcildey5obH0gZGFzIHBvcHVsYcOnw7VlcywgY29tIHVtICpib3hwbG90KiBwYXJhIGNhZGEgcmVnacOjbyBnZW9ncsOhZmljYS4gVm9jw6ogdmFpIHByZWNpc2FyIGRhIHJlc3Bvc3RhIFtkZXN0YSBxdWVzdMOjb10oI3JlZ2lvZXMtZ2VvKS4KCjEuIENvbWVudGUgb3MgcmVzdWx0YWRvcy4KCgojIyBEZW5zaWRhZGUgZGVtb2dyw6FmaWNhIHBvciByZWdpw6NvCgoxLiBGYcOnYSAqYm94cGxvdHMqIGxhZG8gYSBsYWRvIFsobm8gbWVzbW8gZ3LDoWZpY28sIHNlbSBmYWNldGFyKV17LmhsfSBkYXMgZGVuc2lkYWRlcyBkZW1vZ3LDoWZpY2FzLCBjb20gdW0gKmJveHBsb3QqIHBhcmEgY2FkYSByZWdpw6NvIGdlb2dyw6FmaWNhLiBWb2PDqiB2YWkgcHJlY2lzYXIgZGEgcmVzcG9zdGEgW2Rlc3RhIHF1ZXN0w6NvXSgjcmVnaW9lcy1nZW8pLgoKMS4gQ29tZW50ZSBvcyByZXN1bHRhZG9zLgoKCiMjIENhcnJvcyAqcGVyIGNhcGl0YSogcG9yIHRpcG8gZGUgY2lkYWRlCgoxLiBGYcOnYSAqYm94cGxvdHMqIGxhZG8gYSBsYWRvIFsobm8gbWVzbW8gZ3LDoWZpY28sIHNlbSBmYWNldGFyKV17LmhsfSBkYSBxdWFudGlkYWRlIGRlIGNhcnJvcyAqcGVyIGNhcGl0YSosIGNvbSB1bSAqYm94cGxvdCogcGFyYSBjYWRhIHRpcG8gZGUgY2lkYWRlLiAKCjEuIENvbWVudGUgb3MgcmVzdWx0YWRvcy4KCgojIyBNb3RvcyAqcGVyIGNhcGl0YSogcG9yIHRpcG8gZGUgY2lkYWRlCgoxLiBGYcOnYSAqYm94cGxvdHMqIGxhZG8gYSBsYWRvIFsobm8gbWVzbW8gZ3LDoWZpY28sIHNlbSBmYWNldGFyKV17LmhsfSBkYSBxdWFudGlkYWRlIGRlIG1vdG9zICpwZXIgY2FwaXRhKiwgY29tIHVtICpib3hwbG90KiBwYXJhIGNhZGEgdGlwbyBkZSBjaWRhZGUuIAoKMS4gQ29tZW50ZSBvcyByZXN1bHRhZG9zLgoKCiMjIFRyYXRvcmVzICpwZXIgY2FwaXRhKiBwb3IgdGlwbyBkZSBjaWRhZGUKCjEuIEZhw6dhICpib3hwbG90cyogbGFkbyBhIGxhZG8gWyhubyBtZXNtbyBncsOhZmljbywgc2VtIGZhY2V0YXIpXXsuaGx9IGRhIHF1YW50aWRhZGUgZGUgdHJhdG9yZXMgKnBlciBjYXBpdGEqLCBjb20gdW0gKmJveHBsb3QqIHBhcmEgY2FkYSB0aXBvIGRlIGNpZGFkZS4gCgoxLiBDb21lbnRlIG9zIHJlc3VsdGFkb3MuCgoKIyMgSG90w6lpcyBlIFViZXIKCjEuIEZhw6dhICpib3hwbG90cyogbGFkbyBhIGxhZG8gWyhubyBtZXNtbyBncsOhZmljbywgc2VtIGZhY2V0YXIpXXsuaGx9IGRhIHF1YW50aWRhZGUgZGUgaG90w6lpcywgY29tIHVtICpib3hwbG90KiBwYXJhIGNhZGEgdmFsb3IgZGUgYHViZXJgLiAKCjEuIENvbWVudGUgb3MgcmVzdWx0YWRvcy4KCgojIyBQSUIgKnBlciBjYXBpdGEqIGUgVWJlcgoKMS4gRmHDp2EgKmJveHBsb3RzKiBsYWRvIGEgbGFkbyBbKG5vIG1lc21vIGdyw6FmaWNvLCBzZW0gZmFjZXRhcildey5obH0gZG8gdmFsb3IgZG8gUElCICpwZXIgY2FwaXRhKiwgY29tIHVtICpib3hwbG90KiBwYXJhIGNhZGEgdmFsb3IgZGUgYHViZXJgLiAKCjEuIENvbWVudGUgb3MgcmVzdWx0YWRvcy4KCgojIyBDaWRhZGVzIHBvciByZWdpw6NvIGdlb2dyw6FmaWNhCgoxLiBGYcOnYSB1bSBncsOhZmljbyBkZSBiYXJyYXMgZGFzIHF1YW50aWRhZGVzIGRlIGNpZGFkZXMsIGNvbSB1bWEgYmFycmEgcG9yIHJlZ2nDo28uIFZvY8OqIHZhaSBwcmVjaXNhciBkYSByZXNwb3N0YSBbZGVzdGEgcXVlc3TDo29dKCNyZWdpb2VzLWdlbykuCgoxLiBVc2UgYSBmdW7Dp8OjbyBgZmN0X3Jlb3JkZXJgIHBhcmEgZGlzcG9yIGFzIGJhcnJhcyBlbSBvcmRlbSBbZGVjcmVzY2VudGVdey5obH0gZGUgYWx0dXJhLiAKCjEuIEVtIG91dHJvIGdyw6FmaWNvLCB1c2UgYSBmdW7Dp8OjbyBgZmN0X3Jlb3JkZXJgIHBhcmEgZGlzcG9yIGFzIGJhcnJhcyBlbSBvcmRlbSBbY3Jlc2NlbnRlXXsuaGx9IGRlIGFsdHVyYS4gCgoxLiBDb21lbnRlIG9zIHJlc3VsdGFkb3MuCgoKIyMgUG9wdWxhw6fDtWVzIHBvciByZWdpw6NvIGdlb2dyw6FmaWNhCgoxLiBGYcOnYSB1bSBncsOhZmljbyBkZSBiYXJyYXMgZGFzIHBvcHVsYcOnw7VlcyB0b3RhaXMsIGNvbSB1bWEgYmFycmEgcG9yIHJlZ2nDo28uIFZvY8OqIHZhaSBwcmVjaXNhciBkYSByZXNwb3N0YSBbZGVzdGEgcXVlc3TDo29dKCNyZWdpb2VzLWdlbykuCgoxLiBVc2UgYSBmdW7Dp8OjbyBgZmN0X3Jlb3JkZXJgIHBhcmEgZGlzcG9yIGFzIGJhcnJhcyBlbSBvcmRlbSBbZGVjcmVzY2VudGVdey5obH0gZGUgYWx0dXJhLiAKCjEuIEVtIG91dHJvIGdyw6FmaWNvLCB1c2UgYSBmdW7Dp8OjbyBgZmN0X3Jlb3JkZXJgIHBhcmEgZGlzcG9yIGFzIGJhcnJhcyBlbSBvcmRlbSBbY3Jlc2NlbnRlXXsuaGx9IGRlIGFsdHVyYS4gCgoxLiBDb21lbnRlIG9zIHJlc3VsdGFkb3MuCgoKIyMgUElCIHBvciByZWdpw6NvIGdlb2dyw6FmaWNhCgoxLiBGYcOnYSB1bSBncsOhZmljbyBkZSBiYXJyYXMgZG9zIFBJQnMgdG90YWlzLCBjb20gdW1hIGJhcnJhIHBvciByZWdpw6NvLiBWb2PDqiB2YWkgcHJlY2lzYXIgZGEgcmVzcG9zdGEgW2Rlc3RhIHF1ZXN0w6NvXSgjcmVnaW9lcy1nZW8pLgoKMS4gVXNlIGEgZnVuw6fDo28gYGZjdF9yZW9yZGVyYCBwYXJhIGRpc3BvciBhcyBiYXJyYXMgZW0gb3JkZW0gW2RlY3Jlc2NlbnRlXXsuaGx9IGRlIGFsdHVyYS4gCgoxLiBFbSBvdXRybyBncsOhZmljbywgdXNlIGEgZnVuw6fDo28gYGZjdF9yZW9yZGVyYCBwYXJhIGRpc3BvciBhcyBiYXJyYXMgZW0gb3JkZW0gW2NyZXNjZW50ZV17LmhsfSBkZSBhbHR1cmEuIAoKMS4gQ29tZW50ZSBvcyByZXN1bHRhZG9zLgoKCiMjIFByb2R1w6fDo28gcnVyYWwgcG9yIHJlZ2nDo28gZ2VvZ3LDoWZpY2EKCjEuIEZhw6dhIHVtIGdyw6FmaWNvIGRlIGJhcnJhcyBkYXMgcHJvZHXDp8O1ZXMgcnVyYWlzIHRvdGFpcywgY29tIHVtYSBiYXJyYSBwb3IgcmVnacOjby4gVm9jw6ogdmFpIHByZWNpc2FyIGRhIHJlc3Bvc3RhIFtkZXN0YSBxdWVzdMOjb10oI3JlZ2lvZXMtZ2VvKS4KCjEuIFVzZSBhIGZ1bsOnw6NvIGBmY3RfcmVvcmRlcmAgcGFyYSBkaXNwb3IgYXMgYmFycmFzIGVtIG9yZGVtIFtkZWNyZXNjZW50ZV17LmhsfSBkZSBhbHR1cmEuIAoKMS4gRW0gb3V0cm8gZ3LDoWZpY28sIHVzZSBhIGZ1bsOnw6NvIGBmY3RfcmVvcmRlcmAgcGFyYSBkaXNwb3IgYXMgYmFycmFzIGVtIG9yZGVtIFtjcmVzY2VudGVdey5obH0gZGUgYWx0dXJhLiAKCjEuIENvbWVudGUgb3MgcmVzdWx0YWRvcy4KCgojIyBGYWl4YXMgZXTDoXJpYXMKCjEuIEZhw6dhIHVtIGdyw6FmaWNvIGRlIGJhcnJhcyBkYSBwb3B1bGHDp8OjbyBicmFzaWxlaXJhLCBjb20gdW1hIGJhcnJhIHBvciBmYWl4YSBldMOhcmlhLgoKMS4gVXNlIGEgZnVuw6fDo28gYGZjdF9yZW9yZGVyYCBwYXJhIGRpc3BvciBhcyBiYXJyYXMgZW0gb3JkZW0gW2RlY3Jlc2NlbnRlXXsuaGx9IGRlIGFsdHVyYS4gCgoxLiBFbSBvdXRybyBncsOhZmljbywgdXNlIGEgZnVuw6fDo28gYGZjdF9yZW9yZGVyYCBwYXJhIGRpc3BvciBhcyBiYXJyYXMgZW0gb3JkZW0gW2NyZXNjZW50ZV17LmhsfSBkZSBhbHR1cmEuCgoxLiBFbSBxdWFsIG9yZGVtIHZvY8OqIGFjaGEgcXVlIGFzIGJhcnJhcyBkZXZlbSBhcGFyZWNlcj8gUG9yIHF1w6o/CgoxLiBDb21lbnRlIG9zIHJlc3VsdGFkb3MuCgoKIyMgRmFpeGFzIGV0w6FyaWFzIHBvciByZWdpw6NvIGdlb2dyw6FmaWNhCgoxLiBGYcOnYSB1bSBncsOhZmljbyBkZSBiYXJyYXMgZGEgcG9wdWxhw6fDo28gYnJhc2lsZWlyYSwgY29tIHVtIFtjb25qdW50byBkZSBiYXJyYXMgcGFyYSBjYWRhIHJlZ2nDo29dey5obH0uIFZvY8OqIHZhaSBwcmVjaXNhciBkYSByZXNwb3N0YSBbZGVzdGEgcXVlc3TDo29dKCNyZWdpb2VzLWdlbykuCgoxLiBDYWRhIGNvbmp1bnRvIGRldmUgdGVyICQ2JCBiYXJyYXMgbGFkbyBhIGxhZG8sIHVtYSBwYXJhIGNhZGEgZmFpeGEgZXTDoXJpYS4gVXNlIG8gYXJndW1lbnRvIGBkb2RnZWAgbmEgZ2VvbWV0cmlhIGFkZXF1YWRhLgoKMS4gQ29tZW50ZSBvcyByZXN1bHRhZG9zLgoKCiMjIEZhaXhhcyBldMOhcmlhcyBwb3IgcmVnacOjbyBnZW9ncsOhZmljYSwgcHJvcG9yw6fDtWVzCgoxLiBGYcOnYSB1bSBncsOhZmljbyBkZSBiYXJyYXMgZGEgcG9wdWxhw6fDo28gYnJhc2lsZWlyYSwgY29tIHVtYSBiYXJyYSBwb3IgcmVnacOjby4gVm9jw6ogdmFpIHByZWNpc2FyIGRhIHJlc3Bvc3RhIFtkZXN0YSBxdWVzdMOjb10oI3JlZ2lvZXMtZ2VvKS4KCjEuIFRvZGFzIGFzIGJhcnJhcyBkZXZlbSBzZXIgZGEgbWVzbWEgYWx0dXJhLCBlIG8gZWl4byAkeSQgZGV2ZSBpciBkZSAkMCQgYXTDqSAkMSQsIHJlcHJlc2VudGFuZG8gcHJvcG9yw6fDtWVzLgoKMS4gQ2FkYSBiYXJyYSBkZXZlIHNlciBzdWJkaXZpZGlkYSBlbSBmYWl4YXMgaG9yaXpvbnRhaXMgZGUgY29yZXMgZGlmZXJlbnRlcywgdW1hIGZhaXhhIGNvbG9yaWRhIHBhcmEgY2FkYSBmYWl4YSBldMOhcmlhLCBkZSBhY29yZG8gY29tIGFzIHByb3BvcsOnw7VlcyBkZSBjYWRhIGZhaXhhIGV0w6FyaWEgZW0gY2FkYSByZWdpw6NvLgoKMS4gQ29tZW50ZSBvcyByZXN1bHRhZG9zLgoKCiMjIEZhaXhhcyBldMOhcmlhcyBwb3IgdGlwbyBkZSBjaWRhZGUKCjEuIEZhw6dhIHVtIGdyw6FmaWNvIGRlIGJhcnJhcyBkYSBwb3B1bGHDp8OjbyBicmFzaWxlaXJhLCBjb20gdW0gW2Nvbmp1bnRvIGRlIGJhcnJhcyBwYXJhIGNhZGEgdGlwbyBkZSBjaWRhZGVdey5obH0uCgoxLiBDYWRhIGNvbmp1bnRvIGRldmUgdGVyICQ2JCBiYXJyYXMgbGFkbyBhIGxhZG8sIHVtYSBwYXJhIGNhZGEgZmFpeGEgZXTDoXJpYS4gVXNlIG8gYXJndW1lbnRvIGBkb2RnZWAgbmEgZ2VvbWV0cmlhIGFkZXF1YWRhLgoKMS4gQ29tZW50ZSBvcyByZXN1bHRhZG9zLgoKCiMjIEZhaXhhcyBldMOhcmlhcyBwb3IgdGlwbyBkZSBjaWRhZGUsIHByb3BvcsOnw7VlcwoKMS4gRmHDp2EgdW0gZ3LDoWZpY28gZGUgYmFycmFzIGRhIHBvcHVsYcOnw6NvIGJyYXNpbGVpcmEsIGNvbSB1bWEgYmFycmEgcG9yIHRpcG8gZGUgY2lkYWRlLgoKMS4gVG9kYXMgYXMgYmFycmFzIGRldmVtIHNlciBkYSBtZXNtYSBhbHR1cmEsIGUgbyBlaXhvICR5JCBkZXZlIGlyIGRlICQwJCBhdMOpICQxJCwgcmVwcmVzZW50YW5kbyBwcm9wb3LDp8O1ZXMuCgoxLiBDYWRhIGJhcnJhIGRldmUgc2VyIHN1YmRpdmlkaWRhIGVtIGZhaXhhcyBob3Jpem9udGFpcyBkZSBjb3JlcyBkaWZlcmVudGVzLCB1bWEgZmFpeGEgY29sb3JpZGEgcGFyYSBjYWRhIGZhaXhhIGV0w6FyaWEsIGRlIGFjb3JkbyBjb20gYXMgcHJvcG9yw6fDtWVzIGRlIGNhZGEgZmFpeGEgZXTDoXJpYSBlbSBjYWRhIHRpcG8gZGUgY2lkYWRlLgoKMS4gQ29tZW50ZSBvcyByZXN1bHRhZG9zLgoKCiMgTWFwYSBpbnRlcmF0aXZvCgojIyBNYXJjYWRvcmVzCgoxLiBMZWlhIGFsZ3VtIHR1dG9yaWFsIHNvYnJlIG8gcGFjb3RlIGBsZWFmbGV0YDoKCiAgICogRW0gaW5nbMOqczogaHR0cHM6Ly9yc3R1ZGlvLmdpdGh1Yi5pby9sZWFmbGV0LyAoYmFzdGEgbGVyIG9zICQ1JCBwcmltZWlyb3MgaXRlbnMgZG8gbWVudSkuCiAgIAogICAqIEVtIHBvcnR1Z3XDqnM6IGh0dHA6Ly9zaWxsYXNnb256YWdhLmNvbS9tYXRlcmlhbC9jZHIvaHRtbHdpZGdldHMuaHRtbCNsZWFmbGV0IChhdMOpICJNYXJjYWRvcmVzIikuCiAgICAgCjEuIEVzY29saGEgcXVhbHF1ZXIgdW1hIGRhcyBxdWVzdMO1ZXMgZG8gdGlwbyAiUXVhaXMgYXMgJDEwJCBjaWRhZGVzLi4uIiwgbmEgW3Nlw6fDo28gZGUgYW7DoWxpc2UgZXhwbG9yYXTDs3JpYV0oI2VkYSkuCgoxLiBSZXNvbHZhIGEgcXVlc3TDo28gZSBtb2RpZmlxdWUgbyBjw7NkaWdvIGFiYWl4byBwYXJhIGNyaWFyIG1hcmNhZG9yZXMgbW9zdHJhbmRvIGFzIGNpZGFkZXMgZGEgcmVzcG9zdGEsIFtyb3R1bGFkb3MgY29tIG9zIG5vbWVzIGRhcyBjaWRhZGVzXXsuaGx9ICh1c2UgbyBhcmd1bWVudG8gYGxhYmVsYCkuCgoxLiBRdWFuZG8gbyB1c3XDoXJpbyBjbGljYXIgbyAqbW91c2UqIHNvYnJlIGEgY2lkYWRlLCBkZXZlIGFwYXJlY2VyIGEgaW5mb3JtYcOnw6NvIHJlbGV2YW50ZSBwZWRpZGEgcGVsYSBxdWVzdMOjbyAodXNlIG8gYXJndW1lbnRvIGBwb3B1cGApLgoKMS4gQWNyZXNjZW50ZSBvdXRyYXMgaW5mb3JtYcOnw7VlcyBxdWUgdm9jw6ogYWNoYXIgaW1wb3J0YW50ZXMgLS0tIHBvciBleGVtcGxvLCBhIGNsYXNzaWZpY2HDp8OjbyBkYSBjaWRhZGUgbmEgb3JkZW5hw6fDo28gcXVlIGEgcXVlc3TDo28gcGVkZS4KCiAgICBgYGB7cn0KICAgIGxpYnJhcnkobGVhZmxldCkKICAgIAogICAgIyBVbSBleGVtcGxvLCBhcGVuYXMuIFN1YnN0aXR1YSBjb20gYSB0aWJibGUgZGEgc3VhIHJlc3Bvc3RhOgogICAgZGYgPC0gY2lkYWRlcyAlPiUgCiAgICAgIGZpbHRlcigKICAgICAgICBjaWRhZGUgJWluJSBjKCdNYW5hdXMnLCAnQnJhc8OtbGlhJywgJ1BvcnRvIEFsZWdyZScpCiAgICAgICkKICAgIAogICAgIyBPIG1hcGE6CiAgICBsZWFmbGV0KGRmKSAlPiUgCiAgICAgIHNldFZpZXcoCiAgICAgICAgbG5nID0gbWVhbihkZiRsb25naXR1ZGUpLCAKICAgICAgICBsYXQgPSBtZWFuKGRmJGxhdGl0dWRlKSwKICAgICAgICB6b29tID0gNAogICAgICApICU+JSAKICAgICAgYWRkVGlsZXMoKSAlPiUgCiAgICAgIGFkZE1hcmtlcnMoKQogICAgYGBgCgoxLiBGYcOnYSBbdW0gc2VndW5kbyBtYXBhIGludGVyYXRpdm9dey5obH0gY29tIG1hcmNhZG9yZXMgcGFyYSBhcyBjaWRhZGVzIHF1ZSBzYXRpc2ZhemVtIGFsZ3VtIGNyaXTDqXJpbyBxdWUgdm9jw6ogYWNoZSBpbnRlcmVzc2FudGUuIFVzZSBhIGltYWdpbmHDp8Ojby4KCg==