Introdução


O documento a seguir detalha o passo a passo da apuração da Variação da Despesa Assistencial por Beneficiário (VDA) do ano de 2023 sobre o ano de 2022. Espera-se que esse documento possa auxiliar o público a replicar o cálculo da VDA e acompanhar a evolução da mesma ao longo do ano.

A VDA é um dos principais componentes do cálculo do Índice de Reajuste de Planos Individuais (IRPI), que estabelece o teto máximo para o reajuste anual por variação de custos das mensalidades dos planos de saúde de contratação individual ou familiar. A metodologia de cálculo do IRPI e da própria VDA foi estabelecida pela Resolução Normativa - RN nº 441, de 19 de dezembro de 2018 e está detalhada no site da ANS em Espaço do Consumidor > Reajuste/Variação de mensalidade > Reajuste anual de planos individuais/familiares > Metodologia de Cálculo.

A VDA expressa a variação da despesa assistencial média por beneficiário dos contratos dos planos individuais de cobertura médico-hospitalar regulamentados pela Lei nº 9.656/1998. A VDA, para fins do cálculo do IRPI, tem como base as despesas assistenciais incorridas de janeiro a dezembro e a média de beneficiários ao longo dos 12 meses de janeiro a dezembro nos dois anos imediatamente anteriores ao ano de divulgação do índice de reajuste.

A medida de tendência central do setor de saúde suplementar é a média da VDA das operadoras ponderada pela quantidade de beneficiários do período mais recente, conforme consignada no Anexo II da RN nº 441/2018. Assim, fórmula para o cálculo da média ponderada da VDA das operadoras do setor em determinado ano é:


\[VDA_{p} = \sum_{i=1}^{n} \left[\left(\displaystyle\frac{\frac{DA_{p}}{Ben_{p}}}{\frac{DA_{p-1}}{Ben_{p-1}}} - 1\right) \times Ben_{p}\right]\div\sum_{i=1}^{n} Ben_{p}\]

Onde:
i = Operadora na base de cálculo
n = Todas as operadoras na base de cálculo
p = Período de janeiro a dezembro do ano calendário
DA = Despesa assistencial em carteira própria acumulada no período
Ben = Média mensal de beneficiários em carteira própria ao longo do período


Três conjuntos de dados do setor de saúde suplementar foram utilizados para extrair informações de despesa assistencial, quantidade de beneficiários com vínculos ativos e características das operadoras de planos de saúde. Esses conjuntos de dados podem ser acessados pelo Portal Brasileiro de Dados Abertos do Governo Federal. Os links para cada conjunto de dados utilizado neste cálculo estão disponíveis a seguir na seção de “Limpeza e Tratamento de Dados”.


Setup

Desenvolvido em R 4.3.2 (2023-10-31 ucrt)

# bibliotecas
library(tidyverse)

# período de análise
periodo <- c(as.Date("2022-12-01"), as.Date("2023-12-01"))

# url do FTP PDA ANS
url_raiz <- "https://dadosabertos.ans.gov.br/FTP/PDA/"

Limpeza e tratamento dos dados


Operadoras


As características das operadoras são obtidas do Sistema de Cadastro de Operadoras (CADOP).

Dois conjuntos de dados estão disponíveis no Portal Brasileiro de Dados Abertos (https://dados.gov.br/dados/conjuntos-dados):

Esses conjuntos de dados incluem características como o razão social, modalidade da operadora, assim como as datas de início (data do registro da operadora junto à ANS) e fim de operação (data do cancelamento do registro).

O código a seguir faz a leitura dos arquivos *.csv do cadastro de operadoras ativas e canceladas:

ta.cadop <- rbind(
  # dataset de operadoras com registro ativo
  read.csv2(
    paste0(url_raiz,"operadoras_de_plano_de_saude_ativas/Relatorio_cadop.csv"),
    colClasses = c(rep("character",20))
  ) |> 
    # Cria campos de cancelamento de registro para juntar com dataset de operadoras canceladas
    mutate(Data_Descredenciamento = "", Motivo_do_Descredenciamento = ""),
  # dataset de operadoras com registro cancelado
  read.csv2(
    paste0(url_raiz,"operadoras_de_plano_de_saude_canceladas/Relatorio_cadop_canceladas.csv"),
    colClasses = c(rep("character",22))
  ) 
) |>  
  rename_with(tolower) |> 
  # Formata as colunas relevantes
  mutate(
    id_ops = as.integer(registro_ans),
    dt_registro = as_date(data_registro_ans), 
    dt_cancelamento = as_date(data_descredenciamento),
    modalidade = if_else(modalidade=='Seguradora Especializada em Saúde', 'Seguradora', modalidade),
    razao_social = str_replace_all(str_trim(razao_social), "[\r\n]", " ") 
  ) |> 
  # Seleciona as colunas de interesse
  select(id_ops, razao_social, modalidade, dt_registro, dt_cancelamento) 


Para o cálculo da VDA no IRPI selecionam-se as operadoras médico-hospitalares e são desconsideradas

  1. Operadoras que iniciaram operação entre janeiro de 2022 e dezembro de 2023.
  2. Operadoras que tiveram registro cancelado até dezembro de 2023.
  3. Operadoras com ressalvas nas demonstrações financeiras protocoladas junto à ANS referentes a 2022 ou 2023.

O código a seguir filtra operadoras médico-hospitalares e identifica operadoras a serem desconsideradas na base de cálculo da VDA:

ressalvas <- read.csv2("_datasets/Ressalvas 2022-2023.csv") |>
  mutate(lg_ressalva = 1L) |> 
  select(id_ops, lg_ressalva)


ta.cadop <- ta.cadop |> 
  # Filtra apenas operadoras médico-hospitalares
  filter(modalidade %in% c('Autogestão', 'Cooperativa Médica', 'Filantropia',
                           'Medicina de Grupo', 'Seguradora')) |>  
  mutate(
    # Identifica operadoras que encerraram operações
    lg_cancelada = ( year(dt_cancelamento)<=year(periodo[2]) & !is.na(dt_cancelamento) ), 
    # Identifica operadoras que iniciaram operações
    lg_nova_ops  = ( year(dt_registro) >= year(periodo[1]) )
  ) |> 
  select(id_ops, razao_social, modalidade, lg_cancelada, lg_nova_ops) |>
  left_join(ressalvas, by = 'id_ops') |> 
  mutate(lg_ressalva = ( !is.na(lg_ressalva) ))

remove(ressalvas)


name value
Total de operadoras 2.628
Operadoras canceladas 1.916
Novas operadoras 33
Operadoras com ressalva 80


Despesa Assistencial

As informações das despesas incorridas na prestação de assistência médico-hospitalar são extraídas das demonstrações contábeis informadas pelas operadoras no Documento de Informações Periódicas das Operadoras de Planos de Assistência à Saúde (DIOPS). O prazo de envio das demonstrações contábeis ao DIOPS referente ao 4º trimestre se encerrou em 31 de março.

Todas as demonstrações contábeis publicadas seguem os critérios do Plano de Contas Padrão da ANS para as operadoras de planos de saúde, conforme estabelecido pela RN nº 528/2022, que dispõe sobre o plano de contas do exercício de 2022 e pela RN nº 435/2018, que dispõe sobre o plano de contas do exercício de 2021.

O conjunto de dados Demonstrações Contábeis do 4º trimestre de 2023 pode ser acessado no Portal Brasileiro de Dados Abertos do Governo Federal. Este conjunto de dados detalha o saldo acumulado em reais ao final do trimestre nas contas contábeis de cada operadora.

O conjunto de dados do 4º trimestre de 2022 foi atualizado para contemplar as retificações feitas ao longo do ano por operadoras com ressalvas. Esta base atualizada acompanha a Nota Técnica nº 2/2024/COREF/GEFAP/DIRAD-DIPRO/DIPRO que está publicada no site oficial da agência na página Portal ANS > Espaço do Consumidor > Reajuste > Individual ou Familiar > Metodologia de Cálculo > Reajuste 2023

O código a seguir faz a leitura dos arquivos *.csv:

diops0 <- rbind(
  read.csv2("_datasets/diops_4T2022_2024-04-17.csv"),
  read.csv2("_datasets/diops_4T2023.csv") |> mutate(DATA = as.character(dmy(DATA))) 
  ) |> as_tibble() |> 
  rename_with(tolower) |> 
  mutate(cd_conta_contabil = as.character(cd_conta_contabil)) |> 
  
  # altera data de referência para o último mês do trimestre
  mutate(id_calendar = as_date(data) + months(2)) |> 
  filter(
    id_calendar %in% c(periodo[1], periodo[2]), # ano 1 e ano 2
    nchar(cd_conta_contabil) == 9,              # apenas contas contábeis de 9 dígitos
    vl_saldo_final != 0                         # exclui linhas sem saldo final
  ) |>
  
  select(id_ops=reg_ans, cd_conta_contabil, id_calendar, vl_saldo_final)


O alvo da análise é a despesa assistencial incorrida pela operadora em carteira própria. Os valores de Despesa Assistencial em Carteira Própria correspondem à totalização dos saldos dos seguintes grupos de contas contábeis do Plano de Contas Padrão da ANS:

Conta contábil Descrição Totalização
411X1XXXX Eventos/sinistros conhecidos ou avisados de assistência à saúde médico-hospitalar (+)
411X1XX8X Corresponsabilidade Assumida (-)
31171XXXX (-) Contraprestações de corresponsabilidade cedida de assistência médico-hospitalar (+)

Dessa forma, o valor da despesa assistencial em carteira própria inclui valores de Eventos/ Sinistros conhecidos ou avisados e valores de gastos de corresponsabilidade de carteira própria cedida a terceiros (contas contábeis redutoras de receita 31171XXXX). Valores de corresponsabilidade assumida (contas contábeis de despesa 411X1XX8X) são desconsiderados, pois referem-se a despesas assistenciais incorridas em atendimento a carteira de terceiros (outras operadoras).

O código a seguir totaliza a despesa assistencial por trimestre, operadora e tipo de carteira:

diops1 <- diops0 |>  
  # filtra contas contábeis relevantes para a análise
  filter( 
    # eventos/sinistros conhecidos médico-hospitalar, incluindo corresponsabilidade assumida 
    (substr(cd_conta_contabil, 1, 3) == '411' & substr(cd_conta_contabil, 5, 5) == '1')
    # receita de contraprestações médico-hospitalares e 
    # corresponsabilidade cedida médico-hospitalar (redutor de receita)
    | (substr(cd_conta_contabil, 1, 5) == '31111' | substr(cd_conta_contabil, 1, 5) == '31171')
  ) |> 
  mutate(
    gr_cc = case_when(
      substr(cd_conta_contabil, 1, 1) == '4' ~ 'eventos',
      substr(cd_conta_contabil, 1, 5) == '31111' ~ 'receita', 
      substr(cd_conta_contabil, 1, 5) == '31171' ~ 'corr_cedida', # redutora de receita
      .default =  'EXCLUIR'), 
  ) |>
  # Totaliza por operadora, conta contábil e período
  summarise(vl_saldo_final = sum(vl_saldo_final), 
            .by = c(id_ops, cd_conta_contabil, id_calendar, gr_cc)) |>  
  # Separa os saldos por grupo de conta em colunas (eventos, receita e corr_cedida)
  pivot_wider(names_from = gr_cc, values_from = vl_saldo_final, values_fill = 0) |> 
  # identifica tipos de plano pela conta contábil
  mutate(
    vigencia = case_when(
      substr(cd_conta_contabil, 8, 8) == '8' ~ 'corr_assumida', 
      substr(cd_conta_contabil, 8, 8) %in% c('1','3','5') ~ 'A',
      substr(cd_conta_contabil, 8, 8) %in% c('2','4','6') ~ 'P',
      .default =  'EXCLUIR'), 
    contratacao = case_when(
      substr(cd_conta_contabil, 8, 8) == '8' ~ 'corr_assumida', 
      substr(cd_conta_contabil, 8, 8) %in% c('1','2') ~ 'Individual',
      substr(cd_conta_contabil, 8, 8) %in% c('3','4') ~ 'Adesão',
      substr(cd_conta_contabil, 8, 8) %in% c('5','6') ~ 'Empresarial',
      .default =  'EXCLUIR'), 
    financiamento = case_when(
      substr(cd_conta_contabil, 8, 8) == '8' ~ 'corr_assumida', 
      substr(cd_conta_contabil, 6, 6) == '1' ~ 'Pre-estabelecido',
      substr(cd_conta_contabil, 6, 6) == '2' ~ 'Pós-estabelecido',
      .default =  'EXCLUIR'), 
  ) |> 
  
  filter(vigencia != 'corr_assumida') |>          # Exclui corr assumida
  mutate(despesa = eventos - corr_cedida) |>      # Inclui corr cedida na despesa trocando o sinal
  
  summarise(receita = sum(receita), 
            despesa = sum(despesa), 
            .by = c(id_ops, vigencia, contratacao, financiamento, id_calendar))


Resumo
ano Operadoras Receita (R$bn) Despesa (R$bn)
2022 665 239,4 209,3
2023 653 272,9 231,5


Filtra planos novos (posteriores à Lei) com formação de preço preestabelecida e totaliza por período, operadora e tipo de plano:

diops <- diops1 |> 
  mutate(ano = as.integer(year(id_calendar)), .after=contratacao) |> select(-id_calendar) |> 
  filter( 
    vigencia == 'P',                     # Filtra planos novos (posteriores à Lei)
    financiamento == 'Pre-estabelecido', # Filtra formação de preço preestabelecida
  ) |> 
  select(-vigencia, -financiamento) |> 
  # Filtra operadoras
  inner_join(select(ta.cadop,id_ops),  join_by(id_ops)) |> 
  # Marca operadoras sem dados válidos de despesa
  mutate(lg_excl_despesa = sum(despesa>0) != 2, .by=c(id_ops, contratacao), .after=ano)


Resumo (R$ bilhões)
Apenas operadoras com dados de despesa nos 2 anos
ano operadoras receita despesa
Adesão
2022 440 32,2 28,4
2023 440 34,9 30,5
Empresarial
2022 527 139,1 118,2
2023 527 162,8 134,0
Individual
2022 464 46,7 39,8
2023 464 53,0 43,4
Total
2022 589 218,1 186,4
2023 589 250,8 208,0


Beneficiários (semi-aditivo)

As informações de vínculos ativos de beneficiários são obtidas através do Sistema de Informação de Beneficiários (SIB), que é atualizado mensalmente.

A base de dados do SIB referente aos anos de 2022 e 2023 pode ser acessada no Portal Brasileiro de Dados Abertos do Governo Federal, conjunto de dados Beneficiários por operadora e tipo de carteira para cálculo da VDA. Este conjunto de dados informa a quantidade de vínculos ativos de beneficiários em planos de saúde médico-hospitalar mês a mês por operadora e tipo de plano.

O código a seguir faz a leitura dos arquivos publicados no portal de dados abertos:

sib0 <- read.csv2("_datasets/beneficiarios_vda_2023-2022.csv") |> as_tibble() |> 
  rename_with(tolower) |> 
  rename(
    id_ops = cd_operadora, 
    vigencia = vigencia_plano, contratacao = gr_contratacao, financiamento = tipo_financiamento,
    benef = nr_benef
  ) |> 
  mutate(
    id_calendar = make_date(as.integer(mes/100), mes - (as.integer(mes/100)) * 100, 1),
    contratacao = case_when(contratacao == 'Coletivo empresarial'   ~ 'Empresarial',
                            contratacao == 'Coletivo por adesão'    ~ 'Adesão',
                            contratacao == 'Individual ou familiar' ~ 'Individual',
                            .default = 'Não identificado')
  ) |> 
  
  filter(
    id_calendar > (periodo[1] - years(1)), id_calendar <= periodo[2]  # Filtra período de análise
    & benef != 0 & !is.na(benef),                                     # Exclui zeros e nulos

    # Filtra planos de interesse para a análise
    cobertura == "Médico-hospitalar",                          # cobertura médico-hospitalar
    vigencia == 'P',                                           # planos novos (posteriores à Lei)
    financiamento != 'Pós-estabelecido',                       # formação de preço pré-estabelecida
    contratacao %in% c('Empresarial', 'Individual', 'Adesão')  # tipo de contratação
  ) |> 
  
  # filtra operadoras médico-hospitalares
  inner_join(select(ta.cadop,id_ops), join_by(id_ops)) |> 
  
  # Totaliza por operadora, tipo de contratação e mês
  summarise(benef = sum(benef), .by = c(id_ops, contratacao, id_calendar)) |> 
  
  arrange(id_ops, contratacao, id_calendar)


Calcula a média de beneficiários no ano por operadora e tipo de contratação e exclui operadoras que não tenham uma sequência ininterrupta de beneficiários nos 24 meses:

sib <- sib0 |> 
  mutate(ano = as.integer(year(id_calendar))) |> select(-id_calendar) |> 
  
  # Identifica operadoras que tiveram sequência ininterrupta de 24 meses
  mutate(lg_excl_benef = n()!=24, .by=c(id_ops, contratacao)) |> 
  
  # Calcula a média dos últimos 12 meses por operadora, contratacao e ano
  summarise(benefm = sum(benef, na.rm=T)/12, .by = c(id_ops, contratacao, ano, lg_excl_benef))


Resumo (Média de beneficiários)
Apenas operadoras com beneficiários nos 24 meses
ano Operadoras beneficiarios
Adesão
2022 471 4.826.379
2023 471 4.775.289
Empresarial
2022 548 29.115.943
2023 548 30.519.733
Individual
2022 470 7.896.844
2023 470 7.962.169
Total
2022 608 41.839.166
2023 608 43.257.190



Cálculo da VDA


Despesa por Beneficiário

Esta seção gera a base de despesa assistencial e beneficiários e calcula a despesa por beneficiário.

A despesa por beneficiário é a média mensal da despesa assistencial da carteira própria de uma operadora incorrida no ano, dividida pela média de vínculos ativos de beneficiários ao longo do ano. Essa métrica representa o principal componente de custo de um plano de saúde e está expressa de forma a permitir compará-la entre operadoras por tipo de carteira e acompanhar sua evolução ao longo do tempo.

A base de cálculo da VDA considera apenas:

  • Operadoras sem ressalvas com registro ativo nos dois anos

  • Observações que apresentam valor positivo de despesa nos dois anos

  • Observações que apresentam uma sequência ininterrupta de 12 meses de beneficiários nos dois anos

O código a seguir reune os dados de beneficiários e despesas, filtra as observações relevantes e calcula a Despesa por Beneficiário (média mensal):

df.vda0 <- inner_join(
  diops |> filter(!lg_excl_despesa) |> select(-receita, -lg_excl_despesa), 
  sib |> filter(!lg_excl_benef) |> select(-lg_excl_benef), 
  join_by(id_ops, contratacao, ano)
) |> 
  arrange(id_ops, contratacao, ano) |> 
  
  # Exclui operadoras inválidas por outros motivos:
  inner_join(ta.cadop, join_by(id_ops)) |> 
  filter( !lg_cancelada & !lg_nova_ops & !lg_ressalva ) |> 
  select(-c(lg_cancelada, lg_nova_ops, lg_ressalva, modalidade)) |>
  relocate(razao_social, .after = id_ops) |> 
  
  # Calcula despesa por beneficiário:
  mutate(dpb = if_else(!is.na(benefm) & benefm>0, despesa/benefm/12, NA))


Despesa mensal por beneficiário (R$)
média agregada
contratacao Despesa/benef
Individual 428
Empresarial 365
Adesão 521



Visualização gráfica da distribuição da despesa por beneficiário das operadoras.

Nota: O gráfico a seguir exclui os 5% maiores e menores valores de cada carteira para que seja possível visualizar a distribuição dos dados.


Estatísticas descritivas da despesa mensal por beneficiário das operadoras
ano mínimo q1 mediana q3 máximo média desvio iqr cv assimetria curtose
Individual
2022 3 253 350 482 3.707 404 360 228 89% 5,79 46,90
2023 4 278 384 526 7.531 465 552 247 119% 8,00 85,11
Empresarial
2022 1 148 208 289 56.281 429 2.699 141 629% 19,74 406,70
2023 0 165 225 314 146.788 648 6.900 149 1.064% 21,05 446,23
Adesão
2022 1 236 354 522 79.760 922 5.536 287 600% 12,94 174,19
2023 0 250 387 566 112.544 1.106 7.280 316 658% 13,47 190,44



VDA por operadora

A VDA de uma operadora é a variação da despesa por beneficiário desta operadora sobre o mesmo período do ano anterior, conforme a seguinte fórmula:

\[VDA_{ip} = \displaystyle\frac{\frac{DA_{ip}}{Ben_{ip}}}{\frac{DA_{i\ \left(p-1\right)}}{Ben_{i\ \left(p-1\right)}}} - 1\]

Onde:
i = Operadora na base de cálculo
p = Ano calendário anterior ao início da aplicação do IRPI
DA = Despesa assistencial em carteira própria acumulada ao fim do período
Ben = Média mensal de beneficiários em carteira própria ao longo do período


O código a seguir calcula a VDA por operadora:

df.vda <- df.vda0 |>
  arrange(id_ops, contratacao, ano) |> 
  mutate(ano = if_else(ano==year(periodo[1]), "ano1", "ano2")) |> 
  pivot_wider(names_from=ano, values_from=c(despesa,benefm,dpb)) |> 
  
  # CALCULA VDA POR OPERADORA EM CADA CARTEIRA
  mutate( vda = (dpb_ano2/dpb_ano1 - 1)*100 ) |> 
  
  # IDENTIFICA OUTLIERS (valores extremos) pelo critério BOXPLOT 1.5xIQR
  mutate(
    lg_outlier = vda>=(quantile(vda,0.75, na.rm=T) + 1.5*IQR(vda, na.rm=T)) 
                 | vda<=(quantile(vda,0.25, na.rm=T) - 1.5*IQR(vda, na.rm=T)),
    .by = contratacao
  )


Estatísticas descritivas da Variação da Despesa Assistencial por beneficiário das operadoras
contratacao n mínimo q1 mediana q3 máximo média desvio iqr cv assimetria curtose
Individual 388 −89,40 2,77 11,17 20,62 578,54 15,20 40,90 17,85 269% 8,00 101,58
Empresarial 453 −96,81 1,93 8,98 17,86 36.297,91 97,85 1.706,20 15,93 1.744% 21,15 449,30
Adesão 373 −98,67 −1,15 10,14 22,52 458,78 15,37 42,96 23,67 280% 4,23 38,43



Valores extremos (outliers)
Outliers identificados pela metodologia de intervalo interquartílico (1.5 x IQR)
contratacao Operadoras Outliers % Outliers inferiores Outliers superiores
Individual 388 39 10,1% 14 25
Empresarial 453 53 11,7% 19 34
Adesão 373 37 9,9% 13 24



VDA do setor


A metodologia de cálculo da VDA do setor para aplicação como componente do IRPI adota a VDA média ponderada pela quantidade de beneficiários no ano mais recente, após a exclusão dos valores extremos.




Base de cálculo


Gera uma base completa que reúne todas as observações dos dois anos e o cálculo da VDA para gravar.


df.reunida <-  full_join(
  sib |> 
    mutate(ano = if_else(ano==year(periodo[1]),"ano1","ano2"),
           lg_excl_benef = if_else(lg_excl_benef,1L,0L)) |> 
    pivot_wider(names_from=ano, values_from=benefm, values_fill=0, names_prefix="ben_"), 
  diops |> 
    mutate(ano = if_else(ano==year(periodo[1]),"ano1","ano2"),
           lg_excl_despesa = if_else(lg_excl_despesa,1L,0L)) |> 
    pivot_wider(names_from=ano, values_from=c(despesa, receita), values_fill=0), 
  join_by(id_ops, contratacao)
) |> 
  
  mutate(
    # Calcula despesa por beneficiário nos dois anos
    dpb_ano1 = if_else(despesa_ano1>0 & ben_ano1>0, despesa_ano1/ben_ano1/12, NA),
    dpb_ano2 = if_else(despesa_ano2>0 & ben_ano2>0, despesa_ano2/ben_ano2/12, NA),
  ) |> 
  
  # Inclui flags de operadoras excluídas por outros motivos
  inner_join(ta.cadop, join_by(id_ops)) |> 
  
  full_join(
    df.vda |> select(id_ops, contratacao, lg_outlier, vda) |> 
      mutate(lg_outlier = if_else(lg_outlier,1L,0L)), 
    join_by(id_ops, contratacao)
  ) |> 
  
  select(id_ops, razao_social, modalidade, contratacao, 
         starts_with('lg_'), starts_with('receita'), starts_with('despesa'), starts_with('ben'), 
         everything()) |> 
  
  mutate(
    # Se a variável estiver zerada, transforma em vazio
    across(receita_ano1:ben_ano2, ~na_if(.x, 0)),
    # Se o flag de exclusão estiver vazio, marca como exclusão
    across(lg_excl_benef:lg_ressalva, ~if_else(is.na(.x),1L,.x))
  ) |> 
  # Exclui observações que não tenham nem informação de despesa nem de beneficiários da base
  filter( !(is.na(despesa_ano1) & is.na(despesa_ano2) & is.na(ben_ano1) & is.na(ben_ano2)) )


Representatividade de base de cálculo da VDA (após exclusões por dados incompletos, ressalva, início de operação ou cancelamento de registro) sobre as bases extraídas dos sistemas de origem.


Representatividade da amostra - Beneficiários
contratacao Beneficiários Beneficiários VDA %
Empresarial 30.575.740 26.644.807 87,1%
Individual 8.011.166 7.026.839 87,7%
Adesão 4.832.157 3.976.310 82,3%

Glossário

Beneficiário: Indivíduo (pessoa física) beneficiário de cobertura de plano privado de assistência à saúde e consumidor de serviços de assistência à saúde.

Contratante: Pessoa física ou jurídica responsável pela contratação do plano privado de assistência à saúde.

Operadora: Pessoa jurídica constituída sob a modalidade de sociedade civil ou comercial, cooperativa ou entidade de autogestão, que opere produto, serviço ou contrato de plano privado de assistência à saúde.

Plano Privado de Assistência à Saúde: Prestação continuada de serviços ou cobertura de custos assistenciais a preço pré ou pós estabelecido, por prazo indeterminado, com a finalidade de garantir, sem limite financeiro, a assistência à saúde, pela faculdade de acesso e atendimento por profissionais ou serviços de saúde, livremente escolhidos, integrantes ou não de rede credenciada, contratada ou referenciada, visando a assistência médica, hospitalar e odontológica, a ser paga integral ou parcialmente às expensas da operadora contratada, mediante reembolso ou pagamento direto ao prestador, por conta e ordem do consumidor.

Tipo de contratação:

  • Individual ou Familiar, oferece cobertura da atenção prestada para a livre adesão de beneficiários, pessoas naturais, com ou sem grupo familiar

  • Coletivo empresarial, quando a contratação é feita por meio de pessoa jurídica para a cobertura de pessoas a ela vinculadas por relação empregatícia ou estatutária

  • Coletivo por adesão, quando a contratação é feita por meio de pessoa jurídica de caráter profissional, classista ou setorial (e.g. conselhos profissionais, entidades de classe, sindicatos, cooperativas, etc.)

Tipo de financiamento:

  • Pré-estabelecido, quando o valor da contraprestação pecuniária é pré-fixado mediante negociação anual, caracterizando contrato de risco.

  • Pós-estabelecido, quando o valor da contraprestação pecuniária é estabelecido após a ocorrência dos procedimentos de assistência à saúde.

LS0tDQp0aXRsZTogIlZhcmlhw6fDo28gZGEgRGVzcGVzYSBBc3Npc3RlbmNpYWwgKFZEQSkiDQphdXRob3I6ICJBZ8OqbmNpYSBOYWNpb25hbCBkZSBTYcO6ZGUgU3VwbGVtZW50YXIiDQpkYXRlOiAiQXR1YWxpemFkbyBlbSBgciBmb3JtYXQoU3lzLnRpbWUoKSwgJyVkLyVtLyVZJylgIg0Kb3V0cHV0Og0KICBodG1sX25vdGVib29rOg0KICAgIHRvYzogeWVzDQogICAgdG9jX2RlcHRoOiAzDQogICAgdG9jX2Zsb2F0OiB5ZXMNCi0tLQ0KDQoqKioNCg0KIyBJbnRyb2R1w6fDo28NCg0KXA0KDQpPIGRvY3VtZW50byBhIHNlZ3VpciBkZXRhbGhhIG8gcGFzc28gYSBwYXNzbyBkYSBhcHVyYcOnw6NvIGRhICoqVmFyaWHDp8OjbyBkYSBEZXNwZXNhIEFzc2lzdGVuY2lhbCBwb3IgQmVuZWZpY2nDoXJpbyAoVkRBKSoqIGRvIGFubyBkZSBgciB5ZWFyKHBlcmlvZG9bMl0pYCBzb2JyZSBvIGFubyBkZSBgciB5ZWFyKHBlcmlvZG9bMV0pYC4gRXNwZXJhLXNlIHF1ZSBlc3NlIGRvY3VtZW50byBwb3NzYSBhdXhpbGlhciBvIHDDumJsaWNvIGEgcmVwbGljYXIgbyBjw6FsY3VsbyBkYSBWREEgZSBhY29tcGFuaGFyIGEgZXZvbHXDp8OjbyBkYSBtZXNtYSBhbyBsb25nbyBkbyBhbm8uICAgIA0KDQpBIFZEQSDDqSB1bSBkb3MgcHJpbmNpcGFpcyBjb21wb25lbnRlcyBkbyBjw6FsY3VsbyBkbyAqKsONbmRpY2UgZGUgUmVhanVzdGUgZGUgUGxhbm9zIEluZGl2aWR1YWlzIChJUlBJKSoqLCBxdWUgZXN0YWJlbGVjZSBvIHRldG8gbcOheGltbyBwYXJhIG8gcmVhanVzdGUgYW51YWwgcG9yIHZhcmlhw6fDo28gZGUgY3VzdG9zIGRhcyBtZW5zYWxpZGFkZXMgZG9zIHBsYW5vcyBkZSBzYcO6ZGUgZGUgY29udHJhdGHDp8OjbyBpbmRpdmlkdWFsIG91IGZhbWlsaWFyLiAgQSBtZXRvZG9sb2dpYSBkZSBjw6FsY3VsbyBkbyBJUlBJIGUgZGEgcHLDs3ByaWEgVkRBIGZvaSBlc3RhYmVsZWNpZGEgcGVsYSBbUmVzb2x1w6fDo28gTm9ybWF0aXZhIC0gUk4gbsK6IDQ0MSwgZGUgMTkgZGUgZGV6ZW1icm8gZGUgMjAxOF0oaHR0cHM6Ly93d3cuYW5zLmdvdi5ici9jb21wb25lbnQvbGVnaXNsYWNhby8/dmlldz1sZWdpc2xhY2FvJnRhc2s9VGV4dG9MZWkmZm9ybWF0PXJhdyZpZD1NelkyTWc9PSkgZSBlc3TDoSBkZXRhbGhhZGEgbm8gc2l0ZSBkYSBBTlMgZW0gW0VzcGHDp28gZG8gQ29uc3VtaWRvciA+IFJlYWp1c3RlL1Zhcmlhw6fDo28gZGUgbWVuc2FsaWRhZGUgPiBSZWFqdXN0ZSBhbnVhbCBkZSBwbGFub3MgaW5kaXZpZHVhaXMvZmFtaWxpYXJlcyA+IE1ldG9kb2xvZ2lhIGRlIEPDoWxjdWxvXShodHRwczovL3d3dy5nb3YuYnIvYW5zL3B0LWJyL2Fzc3VudG9zL2NvbnN1bWlkb3IvcmVhanVzdGUtdmFyaWFjYW8tZGUtbWVuc2FsaWRhZGUvcmVhanVzdGUtYW51YWwtZGUtcGxhbm9zLWluZGl2aWR1YWlzLWZhbWlsaWFyZXMtMS9tZXRvZG9sb2dpYS1kZS1jYWxjdWxvKS4gICAgICAgICAgICAgIA0KDQpBIFZEQSBleHByZXNzYSBhIHZhcmlhw6fDo28gZGEgZGVzcGVzYSBhc3Npc3RlbmNpYWwgbcOpZGlhIHBvciBiZW5lZmljacOhcmlvIGRvcyBjb250cmF0b3MgZG9zIHBsYW5vcyBpbmRpdmlkdWFpcyBkZSBjb2JlcnR1cmEgbcOpZGljby1ob3NwaXRhbGFyIHJlZ3VsYW1lbnRhZG9zIHBlbGEgTGVpIG7CuiA5LjY1Ni8xOTk4LiBBIFZEQSwgcGFyYSBmaW5zIGRvIGPDoWxjdWxvIGRvIElSUEksIHRlbSBjb21vIGJhc2UgYXMgZGVzcGVzYXMgYXNzaXN0ZW5jaWFpcyBpbmNvcnJpZGFzIGRlIGphbmVpcm8gYSBkZXplbWJybyBlIGEgbcOpZGlhIGRlIGJlbmVmaWNpw6FyaW9zIGFvIGxvbmdvIGRvcyAxMiBtZXNlcyBkZSBqYW5laXJvIGEgZGV6ZW1icm8gbm9zIGRvaXMgYW5vcyBpbWVkaWF0YW1lbnRlIGFudGVyaW9yZXMgYW8gYW5vIGRlIGRpdnVsZ2HDp8OjbyBkbyDDrW5kaWNlIGRlIHJlYWp1c3RlLiAgICANCg0KQSBtZWRpZGEgZGUgdGVuZMOqbmNpYSBjZW50cmFsIGRvIHNldG9yIGRlIHNhw7pkZSBzdXBsZW1lbnRhciDDqSBhIG3DqWRpYSBkYSBWREEgZGFzIG9wZXJhZG9yYXMgcG9uZGVyYWRhIHBlbGEgcXVhbnRpZGFkZSBkZSBiZW5lZmljacOhcmlvcyBkbyBwZXLDrW9kbyBtYWlzIHJlY2VudGUsIGNvbmZvcm1lIGNvbnNpZ25hZGEgbm8gQW5leG8gSUkgZGEgW1JOIG7CuiA0NDEvMjAxOF0oaHR0cDovL3d3dy5hbnMuZ292LmJyL2NvbXBvbmVudC9sZWdpc2xhY2FvLz92aWV3PWxlZ2lzbGFjYW8mdGFzaz1UZXh0b0xlaSZmb3JtYXQ9cmF3JmlkPU16WTJNZz09KS4gQXNzaW0sIGbDs3JtdWxhIHBhcmEgbyBjw6FsY3VsbyBkYSBtw6lkaWEgcG9uZGVyYWRhIGRhIFZEQSBkYXMgb3BlcmFkb3JhcyBkbyBzZXRvciBlbSBkZXRlcm1pbmFkbyBhbm8gw6k6XA0KDQpcDQogICAgDQoNCiQkVkRBX3twfSA9IFxzdW1fe2k9MX1ee259IFxsZWZ0W1xsZWZ0KFxkaXNwbGF5c3R5bGVcZnJhY3tcZnJhY3tEQV97cH19e0Jlbl97cH19fXtcZnJhY3tEQV97cC0xfX17QmVuX3twLTF9fX0gLSAxXHJpZ2h0KSBcdGltZXMgQmVuX3twfVxyaWdodF1cZGl2XHN1bV97aT0xfV57bn0gQmVuX3twfSQkDQoNCg0KT25kZTpcDQogICAgaSA9IE9wZXJhZG9yYSBuYSBiYXNlIGRlIGPDoWxjdWxvICAgICAgICANCiAgICBuID0gVG9kYXMgYXMgb3BlcmFkb3JhcyBuYSBiYXNlIGRlIGPDoWxjdWxvICAgICAgICAgDQogICAgcCA9IFBlcsOtb2RvIGRlIGphbmVpcm8gYSBkZXplbWJybyBkbyBhbm8gY2FsZW5kw6FyaW8gICAgDQogICAgREEgPSBEZXNwZXNhIGFzc2lzdGVuY2lhbCBlbSBjYXJ0ZWlyYSBwcsOzcHJpYSBhY3VtdWxhZGEgbm8gcGVyw61vZG8gICAgIA0KICAgIEJlbiA9IE3DqWRpYSBtZW5zYWwgZGUgYmVuZWZpY2nDoXJpb3MgZW0gY2FydGVpcmEgcHLDs3ByaWEgYW8gbG9uZ28gZG8gcGVyw61vZG8gICAgIA0KDQpcDQoNClRyw6pzIGNvbmp1bnRvcyBkZSBkYWRvcyBkbyBzZXRvciBkZSBzYcO6ZGUgc3VwbGVtZW50YXIgZm9yYW0gdXRpbGl6YWRvcyBwYXJhIGV4dHJhaXIgaW5mb3JtYcOnw7VlcyBkZSAqKmRlc3Blc2EgYXNzaXN0ZW5jaWFsKiosICoqcXVhbnRpZGFkZSBkZSBiZW5lZmljacOhcmlvcyBjb20gdsOtbmN1bG9zIGF0aXZvcyoqIGUgKipjYXJhY3RlcsOtc3RpY2FzIGRhcyBvcGVyYWRvcmFzIGRlIHBsYW5vcyBkZSBzYcO6ZGUqKi4gRXNzZXMgY29uanVudG9zIGRlIGRhZG9zIHBvZGVtIHNlciBhY2Vzc2Fkb3MgcGVsbyBQb3J0YWwgQnJhc2lsZWlybyBkZSBEYWRvcyBBYmVydG9zIGRvIEdvdmVybm8gRmVkZXJhbC4gT3MgbGlua3MgcGFyYSBjYWRhIGNvbmp1bnRvIGRlIGRhZG9zIHV0aWxpemFkbyBuZXN0ZSBjw6FsY3VsbyBlc3TDo28gZGlzcG9uw612ZWlzIGEgc2VndWlyIG5hIHNlw6fDo28gZGUgKiJMaW1wZXphIGUgVHJhdGFtZW50byBkZSBEYWRvcyIqLiAgICAgICANCiAgICANClwNCg0KIyMgU2V0dXAgICANCg0KKkRlc2Vudm9sdmlkbyBlbSBSIDQuMy4yICgyMDIzLTEwLTMxIHVjcnQpKg0KDQpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0NCiMgIkRlc2xpZ2EiIG5vdGHDp8OjbyBjaWVudMOtZmljYS4gDQpvcHRpb25zKHNjaXBlbj05OTkpDQoNCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShndCkNCnRoZW1lX3NldCh0aGVtZV9saWdodCgpKQ0KdGhlbWVfdXBkYXRlKA0KICBwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpLA0KICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiwgY29sb3VyID0gImdyYXkzMCIsIGZhY2UgPSAiYm9sZCIpLA0KICBwbG90LnN1YnRpdGxlID0gZWxlbWVudF90ZXh0KGZhY2UgPSAnaXRhbGljJywgY29sb3VyID0gImdyYXk1MCIsIHNpemUgPSAxMCksDQogIHBsb3QuY2FwdGlvbiA9IGVsZW1lbnRfdGV4dChjb2xvdXIgPSAiZ3JheTUwIiwgaGp1c3Q9MCwgc2l6ZSA9IDgpLA0KICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X2JsYW5rKCksDQogIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT05KSwNCiAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KGNvbG9yPSJkYXJrZ3JheSIpDQopDQpgYGANCg0KDQpgYGB7cn0NCiMgYmlibGlvdGVjYXMNCmxpYnJhcnkodGlkeXZlcnNlKQ0KDQojIHBlcsOtb2RvIGRlIGFuw6FsaXNlDQpwZXJpb2RvIDwtIGMoYXMuRGF0ZSgiMjAyMi0xMi0wMSIpLCBhcy5EYXRlKCIyMDIzLTEyLTAxIikpDQoNCiMgdXJsIGRvIEZUUCBQREEgQU5TDQp1cmxfcmFpeiA8LSAiaHR0cHM6Ly9kYWRvc2FiZXJ0b3MuYW5zLmdvdi5ici9GVFAvUERBLyINCmBgYA0KDQoNCg0KKioqDQoNCiMgTGltcGV6YSBlIHRyYXRhbWVudG8gZG9zIGRhZG9zDQoNClwNCg0KIyMgT3BlcmFkb3Jhcw0KDQpcDQoNCkFzIGNhcmFjdGVyw61zdGljYXMgZGFzIG9wZXJhZG9yYXMgc8OjbyBvYnRpZGFzIGRvIFNpc3RlbWEgZGUgQ2FkYXN0cm8gZGUgT3BlcmFkb3JhcyAoQ0FET1ApLiAgICAgICANCg0KRG9pcyBjb25qdW50b3MgZGUgZGFkb3MgZXN0w6NvIGRpc3BvbsOtdmVpcyBubyBQb3J0YWwgQnJhc2lsZWlybyBkZSBEYWRvcyBBYmVydG9zIChodHRwczovL2RhZG9zLmdvdi5ici9kYWRvcy9jb25qdW50b3MtZGFkb3MpOiANCg0KKiBbT3BlcmFkb3JhcyBkZSBwbGFub3MgZGUgc2HDumRlIEF0aXZhc10oaHR0cHM6Ly9kYWRvcy5nb3YuYnIvZGFkb3MvY29uanVudG9zLWRhZG9zL29wZXJhZG9yYXMtZGUtcGxhbm9zLXByaXZhZG9zLWRlLXNhdWRlKSBlIA0KKiBbT3BlcmFkb3JhcyBkZSBwbGFub3MgZGUgc2HDumRlIENhbmNlbGFkYXNdKGh0dHBzOi8vZGFkb3MuZ292LmJyL2RhZG9zL2Nvbmp1bnRvcy1kYWRvcy9vcGVyYWRvcmFzLWRlLXBsYW5vcy1kZS1zYXVkZS1jb20tcmVnaXN0cm8tY2FuY2VsYWRvKS4gDQoNCkVzc2VzIGNvbmp1bnRvcyBkZSBkYWRvcyBpbmNsdWVtIGNhcmFjdGVyw61zdGljYXMgY29tbyBvIHJhesOjbyBzb2NpYWwsIG1vZGFsaWRhZGUgZGEgb3BlcmFkb3JhLCBhc3NpbSBjb21vIGFzIGRhdGFzIGRlIGluw61jaW8gKGRhdGEgZG8gcmVnaXN0cm8gZGEgb3BlcmFkb3JhIGp1bnRvIMOgIEFOUykgZSBmaW0gZGUgb3BlcmHDp8OjbyAoZGF0YSBkbyBjYW5jZWxhbWVudG8gZG8gcmVnaXN0cm8pLiAgICAgDQoNCk8gY8OzZGlnbyBhIHNlZ3VpciBmYXogYSBsZWl0dXJhIGRvcyBhcnF1aXZvcyAqLmNzdiBkbyBjYWRhc3RybyBkZSBvcGVyYWRvcmFzIGF0aXZhcyBlIGNhbmNlbGFkYXM6DQoNCmBgYHtyfQ0KdGEuY2Fkb3AgPC0gcmJpbmQoDQogICMgZGF0YXNldCBkZSBvcGVyYWRvcmFzIGNvbSByZWdpc3RybyBhdGl2bw0KICByZWFkLmNzdjIoDQogICAgcGFzdGUwKHVybF9yYWl6LCJvcGVyYWRvcmFzX2RlX3BsYW5vX2RlX3NhdWRlX2F0aXZhcy9SZWxhdG9yaW9fY2Fkb3AuY3N2IiksDQogICAgY29sQ2xhc3NlcyA9IGMocmVwKCJjaGFyYWN0ZXIiLDIwKSkNCiAgKSB8PiANCiAgICAjIENyaWEgY2FtcG9zIGRlIGNhbmNlbGFtZW50byBkZSByZWdpc3RybyBwYXJhIGp1bnRhciBjb20gZGF0YXNldCBkZSBvcGVyYWRvcmFzIGNhbmNlbGFkYXMNCiAgICBtdXRhdGUoRGF0YV9EZXNjcmVkZW5jaWFtZW50byA9ICIiLCBNb3Rpdm9fZG9fRGVzY3JlZGVuY2lhbWVudG8gPSAiIiksDQogICMgZGF0YXNldCBkZSBvcGVyYWRvcmFzIGNvbSByZWdpc3RybyBjYW5jZWxhZG8NCiAgcmVhZC5jc3YyKA0KICAgIHBhc3RlMCh1cmxfcmFpeiwib3BlcmFkb3Jhc19kZV9wbGFub19kZV9zYXVkZV9jYW5jZWxhZGFzL1JlbGF0b3Jpb19jYWRvcF9jYW5jZWxhZGFzLmNzdiIpLA0KICAgIGNvbENsYXNzZXMgPSBjKHJlcCgiY2hhcmFjdGVyIiwyMikpDQogICkgDQopIHw+ICANCiAgcmVuYW1lX3dpdGgodG9sb3dlcikgfD4gDQogICMgRm9ybWF0YSBhcyBjb2x1bmFzIHJlbGV2YW50ZXMNCiAgbXV0YXRlKA0KICAgIGlkX29wcyA9IGFzLmludGVnZXIocmVnaXN0cm9fYW5zKSwNCiAgICBkdF9yZWdpc3RybyA9IGFzX2RhdGUoZGF0YV9yZWdpc3Ryb19hbnMpLCANCiAgICBkdF9jYW5jZWxhbWVudG8gPSBhc19kYXRlKGRhdGFfZGVzY3JlZGVuY2lhbWVudG8pLA0KICAgIG1vZGFsaWRhZGUgPSBpZl9lbHNlKG1vZGFsaWRhZGU9PSdTZWd1cmFkb3JhIEVzcGVjaWFsaXphZGEgZW0gU2HDumRlJywgJ1NlZ3VyYWRvcmEnLCBtb2RhbGlkYWRlKSwNCiAgICByYXphb19zb2NpYWwgPSBzdHJfcmVwbGFjZV9hbGwoc3RyX3RyaW0ocmF6YW9fc29jaWFsKSwgIltcclxuXSIsICIgIikgDQogICkgfD4gDQogICMgU2VsZWNpb25hIGFzIGNvbHVuYXMgZGUgaW50ZXJlc3NlDQogIHNlbGVjdChpZF9vcHMsIHJhemFvX3NvY2lhbCwgbW9kYWxpZGFkZSwgZHRfcmVnaXN0cm8sIGR0X2NhbmNlbGFtZW50bykgDQpgYGANCg0KDQoNCg0KXA0KDQpQYXJhIG8gY8OhbGN1bG8gZGEgVkRBIG5vIElSUEkgc2VsZWNpb25hbS1zZSBhcyBvcGVyYWRvcmFzICptw6lkaWNvLWhvc3BpdGFsYXJlcyogZSBzw6NvIGRlc2NvbnNpZGVyYWRhcyAgICAgIA0KDQoxLiBPcGVyYWRvcmFzIHF1ZSBpbmljaWFyYW0gb3BlcmHDp8OjbyBlbnRyZSBqYW5laXJvIGRlIGByIHllYXIocGVyaW9kb1sxXSlgIGUgZGV6ZW1icm8gZGUgYHIgeWVhcihwZXJpb2RvWzJdKWAuDQoyLiBPcGVyYWRvcmFzIHF1ZSB0aXZlcmFtIHJlZ2lzdHJvIGNhbmNlbGFkbyBhdMOpIGRlemVtYnJvIGRlIGByIHllYXIocGVyaW9kb1syXSlgLg0KMy4gT3BlcmFkb3JhcyBjb20gcmVzc2FsdmFzIG5hcyBkZW1vbnN0cmHDp8O1ZXMgZmluYW5jZWlyYXMgcHJvdG9jb2xhZGFzIGp1bnRvIMOgIEFOUyByZWZlcmVudGVzIGEgYHIgeWVhcihwZXJpb2RvWzFdKWAgb3UgYHIgeWVhcihwZXJpb2RvWzJdKWAuDQoNCk8gY8OzZGlnbyBhIHNlZ3VpciBmaWx0cmEgb3BlcmFkb3JhcyBtw6lkaWNvLWhvc3BpdGFsYXJlcyBlIGlkZW50aWZpY2Egb3BlcmFkb3JhcyBhIHNlcmVtIGRlc2NvbnNpZGVyYWRhcyBuYSBiYXNlIGRlIGPDoWxjdWxvIGRhIFZEQToNCg0KYGBge3J9DQpyZXNzYWx2YXMgPC0gcmVhZC5jc3YyKCJfZGF0YXNldHMvUmVzc2FsdmFzIDIwMjItMjAyMy5jc3YiKSB8Pg0KICBtdXRhdGUobGdfcmVzc2FsdmEgPSAxTCkgfD4gDQogIHNlbGVjdChpZF9vcHMsIGxnX3Jlc3NhbHZhKQ0KDQoNCnRhLmNhZG9wIDwtIHRhLmNhZG9wIHw+IA0KICAjIEZpbHRyYSBhcGVuYXMgb3BlcmFkb3JhcyBtw6lkaWNvLWhvc3BpdGFsYXJlcw0KICBmaWx0ZXIobW9kYWxpZGFkZSAlaW4lIGMoJ0F1dG9nZXN0w6NvJywgJ0Nvb3BlcmF0aXZhIE3DqWRpY2EnLCAnRmlsYW50cm9waWEnLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgJ01lZGljaW5hIGRlIEdydXBvJywgJ1NlZ3VyYWRvcmEnKSkgfD4gIA0KICBtdXRhdGUoDQogICAgIyBJZGVudGlmaWNhIG9wZXJhZG9yYXMgcXVlIGVuY2VycmFyYW0gb3BlcmHDp8O1ZXMNCiAgICBsZ19jYW5jZWxhZGEgPSAoIHllYXIoZHRfY2FuY2VsYW1lbnRvKTw9eWVhcihwZXJpb2RvWzJdKSAmICFpcy5uYShkdF9jYW5jZWxhbWVudG8pICksIA0KICAgICMgSWRlbnRpZmljYSBvcGVyYWRvcmFzIHF1ZSBpbmljaWFyYW0gb3BlcmHDp8O1ZXMNCiAgICBsZ19ub3ZhX29wcyAgPSAoIHllYXIoZHRfcmVnaXN0cm8pID49IHllYXIocGVyaW9kb1sxXSkgKQ0KICApIHw+IA0KICBzZWxlY3QoaWRfb3BzLCByYXphb19zb2NpYWwsIG1vZGFsaWRhZGUsIGxnX2NhbmNlbGFkYSwgbGdfbm92YV9vcHMpIHw+DQogIGxlZnRfam9pbihyZXNzYWx2YXMsIGJ5ID0gJ2lkX29wcycpIHw+IA0KICBtdXRhdGUobGdfcmVzc2FsdmEgPSAoICFpcy5uYShsZ19yZXNzYWx2YSkgKSkNCg0KcmVtb3ZlKHJlc3NhbHZhcykNCmBgYA0KDQpcDQoNCmBgYHtyIGVjaG89RkFMU0V9DQp0YS5jYWRvcCB8PiBzdW1tYXJpc2UoDQogICJUb3RhbCBkZSBvcGVyYWRvcmFzIiA9IG5fZGlzdGluY3QoaWRfb3BzKSwNCiAgIk9wZXJhZG9yYXMgY2FuY2VsYWRhcyIgPSBzdW0obGdfY2FuY2VsYWRhKSwNCiAgIk5vdmFzIG9wZXJhZG9yYXMiID0gc3VtKGxnX25vdmFfb3BzKSwNCiAgIk9wZXJhZG9yYXMgY29tIHJlc3NhbHZhIiA9IHN1bShsZ19yZXNzYWx2YSkNCikgfD4gcGl2b3RfbG9uZ2VyKGV2ZXJ5dGhpbmcoKSkgfD4gDQogIGd0KHJvd25hbWVfY29sPSJzdHViIiwgbG9jYWxlPSJwdCIpIHw+IHN1Yl9taXNzaW5nKCkgfD4NCiAgZm10X2ludGVnZXIodmFsdWUpIHw+IA0KICB0YWJfb3B0aW9ucygNCiAgICBoZWFkaW5nLmFsaWduPSJsZWZ0IiwgaGVhZGluZy50aXRsZS5mb250LnNpemU9cGN0KDExMCksIGhlYWRpbmcuc3VidGl0bGUuZm9udC5zaXplPXBjdCg5MCksDQogICAgY29sdW1uX2xhYmVscy5mb250LndlaWdodD0iYm9sZCIsIGNvbHVtbl9sYWJlbHMuZm9udC5zaXplPXBjdCg4MCksDQogICAgY29sdW1uX2xhYmVscy50ZXh0X3RyYW5zZm9ybT0idXBwZXJjYXNlIiwgY29sdW1uX2xhYmVscy5iYWNrZ3JvdW5kLmNvbG9yPSJncmF5OTUiLA0KICAgIGRhdGFfcm93LnBhZGRpbmc9cHgoMiksIHJvd19ncm91cC5wYWRkaW5nPXB4KDIpLCByb3dfZ3JvdXAuZm9udC53ZWlnaHQ9ImJvbGQiLA0KICAgIHRhYmxlLmZvbnQuc2l6ZT1wY3QoOTApLCBzb3VyY2Vfbm90ZXMuZm9udC5zaXplID0gcGN0KDcwKSwNCiAgKQ0KYGBgDQoNCg0KXA0KDQojIyBEZXNwZXNhIEFzc2lzdGVuY2lhbA0KDQpBcyBpbmZvcm1hw6fDtWVzIGRhcyBkZXNwZXNhcyBpbmNvcnJpZGFzIG5hIHByZXN0YcOnw6NvIGRlIGFzc2lzdMOqbmNpYSBtw6lkaWNvLWhvc3BpdGFsYXIgc8OjbyBleHRyYcOtZGFzIGRhcyBkZW1vbnN0cmHDp8O1ZXMgY29udMOhYmVpcyBpbmZvcm1hZGFzIHBlbGFzIG9wZXJhZG9yYXMgbm8gRG9jdW1lbnRvIGRlIEluZm9ybWHDp8O1ZXMgUGVyacOzZGljYXMgZGFzIE9wZXJhZG9yYXMgZGUgUGxhbm9zIGRlIEFzc2lzdMOqbmNpYSDDoCBTYcO6ZGUgKERJT1BTKS4gIE8gcHJhem8gZGUgZW52aW8gZGFzIGRlbW9uc3RyYcOnw7VlcyBjb250w6FiZWlzIGFvIERJT1BTIHJlZmVyZW50ZSBhbyA0wrogdHJpbWVzdHJlIHNlIGVuY2Vycm91IGVtIDMxIGRlIG1hcsOnby4gIA0KDQpUb2RhcyBhcyBkZW1vbnN0cmHDp8O1ZXMgY29udMOhYmVpcyBwdWJsaWNhZGFzIHNlZ3VlbSBvcyBjcml0w6lyaW9zIGRvIFBsYW5vIGRlIENvbnRhcyBQYWRyw6NvIGRhIEFOUyBwYXJhIGFzIG9wZXJhZG9yYXMgZGUgcGxhbm9zIGRlIHNhw7pkZSwgY29uZm9ybWUgZXN0YWJlbGVjaWRvIHBlbGEgW1JOIG7CuiA1MjgvMjAyMl0oaHR0cHM6Ly93d3cuYW5zLmdvdi5ici9jb21wb25lbnQvbGVnaXNsYWNhby8/dmlldz1sZWdpc2xhY2FvJnRhc2s9dGV4dG9MZWkmZm9ybWF0PXJhdyZpZD1OREl6Tmc9PSksIHF1ZSBkaXNww7VlIHNvYnJlIG8gcGxhbm8gZGUgY29udGFzIGRvIGV4ZXJjw61jaW8gZGUgMjAyMiBlIHBlbGEgW1JOIG7CuiA0MzUvMjAxOF0oaHR0cDovL3d3dy5hbnMuZ292LmJyL2NvbXBvbmVudC9sZWdpc2xhY2FvLz92aWV3PWxlZ2lzbGFjYW8mdGFzaz1UZXh0b0xlaSZmb3JtYXQ9cmF3JmlkPU16WTBNZz09KSwgcXVlIGRpc3DDtWUgc29icmUgbyBwbGFubyBkZSBjb250YXMgZG8gZXhlcmPDrWNpbyBkZSAyMDIxLg0KDQpPIGNvbmp1bnRvIGRlIGRhZG9zIFsqKkRlbW9uc3RyYcOnw7VlcyBDb250w6FiZWlzKipdKGh0dHBzOi8vZGFkb3MuZ292LmJyL2RhZG9zL2Nvbmp1bnRvcy1kYWRvcy9odHRwLXd3dy1hbnMtZ292LWJyLXBlcmZpbC1kby1zZXRvci1kYWRvcy1hYmVydG9zLWRhZG9zLWFiZXJ0b3MtZGlzcG9uaXZlaXMtbjMpIGRvIDTCuiB0cmltZXN0cmUgZGUgYHIgeWVhcihwZXJpb2RvWzJdKWAgcG9kZSBzZXIgYWNlc3NhZG8gbm8gUG9ydGFsIEJyYXNpbGVpcm8gZGUgRGFkb3MgQWJlcnRvcyBkbyBHb3Zlcm5vIEZlZGVyYWwuIEVzdGUgY29uanVudG8gZGUgZGFkb3MgZGV0YWxoYSBvIHNhbGRvIGFjdW11bGFkbyBlbSByZWFpcyBhbyBmaW5hbCBkbyB0cmltZXN0cmUgbmFzIGNvbnRhcyBjb250w6FiZWlzIGRlIGNhZGEgb3BlcmFkb3JhLiAgICANCg0KTyBjb25qdW50byBkZSBkYWRvcyBkbyA0wrogdHJpbWVzdHJlIGRlIGByIHllYXIocGVyaW9kb1sxXSlgIGZvaSBhdHVhbGl6YWRvIHBhcmEgY29udGVtcGxhciBhcyByZXRpZmljYcOnw7VlcyBmZWl0YXMgYW8gbG9uZ28gZG8gYW5vIHBvciBvcGVyYWRvcmFzIGNvbSByZXNzYWx2YXMuIEVzdGEgYmFzZSBhdHVhbGl6YWRhIGFjb21wYW5oYSBhIE5vdGEgVMOpY25pY2EgbsK6IDIvMjAyNC9DT1JFRi9HRUZBUC9ESVJBRC1ESVBSTy9ESVBSTyBxdWUgZXN0w6EgcHVibGljYWRhIG5vIHNpdGUgb2ZpY2lhbCBkYSBhZ8OqbmNpYSBuYSBww6FnaW5hIFtQb3J0YWwgQU5TID4gRXNwYcOnbyBkbyBDb25zdW1pZG9yID4gUmVhanVzdGUgPiBJbmRpdmlkdWFsIG91IEZhbWlsaWFyID4gTWV0b2RvbG9naWEgZGUgQ8OhbGN1bG8gPiBSZWFqdXN0ZSAyMDIzXShodHRwczovL3d3dy5nb3YuYnIvYW5zL3B0LWJyL2Fzc3VudG9zL2NvbnN1bWlkb3IvcmVhanVzdGUtdmFyaWFjYW8tZGUtbWVuc2FsaWRhZGUvcmVhanVzdGUtYW51YWwtZGUtcGxhbm9zLWluZGl2aWR1YWlzLWZhbWlsaWFyZXMtMS9tZXRvZG9sb2dpYS1kZS1jYWxjdWxvKQ0KDQpPIGPDs2RpZ28gYSBzZWd1aXIgZmF6IGEgbGVpdHVyYSBkb3MgYXJxdWl2b3MgKi5jc3Y6DQoNCmBgYHtyfQ0KZGlvcHMwIDwtIHJiaW5kKA0KICByZWFkLmNzdjIoIl9kYXRhc2V0cy9kaW9wc180VDIwMjJfMjAyNC0wNC0xNy5jc3YiKSwNCiAgcmVhZC5jc3YyKCJfZGF0YXNldHMvZGlvcHNfNFQyMDIzLmNzdiIpIHw+IG11dGF0ZShEQVRBID0gYXMuY2hhcmFjdGVyKGRteShEQVRBKSkpIA0KICApIHw+IGFzX3RpYmJsZSgpIHw+IA0KICByZW5hbWVfd2l0aCh0b2xvd2VyKSB8PiANCiAgbXV0YXRlKGNkX2NvbnRhX2NvbnRhYmlsID0gYXMuY2hhcmFjdGVyKGNkX2NvbnRhX2NvbnRhYmlsKSkgfD4gDQogIA0KICAjIGFsdGVyYSBkYXRhIGRlIHJlZmVyw6puY2lhIHBhcmEgbyDDumx0aW1vIG3DqnMgZG8gdHJpbWVzdHJlDQogIG11dGF0ZShpZF9jYWxlbmRhciA9IGFzX2RhdGUoZGF0YSkgKyBtb250aHMoMikpIHw+IA0KICBmaWx0ZXIoDQogICAgaWRfY2FsZW5kYXIgJWluJSBjKHBlcmlvZG9bMV0sIHBlcmlvZG9bMl0pLCAjIGFubyAxIGUgYW5vIDINCiAgICBuY2hhcihjZF9jb250YV9jb250YWJpbCkgPT0gOSwgICAgICAgICAgICAgICMgYXBlbmFzIGNvbnRhcyBjb250w6FiZWlzIGRlIDkgZMOtZ2l0b3MNCiAgICB2bF9zYWxkb19maW5hbCAhPSAwICAgICAgICAgICAgICAgICAgICAgICAgICMgZXhjbHVpIGxpbmhhcyBzZW0gc2FsZG8gZmluYWwNCiAgKSB8Pg0KICANCiAgc2VsZWN0KGlkX29wcz1yZWdfYW5zLCBjZF9jb250YV9jb250YWJpbCwgaWRfY2FsZW5kYXIsIHZsX3NhbGRvX2ZpbmFsKQ0KYGBgDQoNClwNCg0KTyBhbHZvIGRhIGFuw6FsaXNlIMOpIGEgZGVzcGVzYSBhc3Npc3RlbmNpYWwgaW5jb3JyaWRhIHBlbGEgb3BlcmFkb3JhIGVtIGNhcnRlaXJhIHByw7NwcmlhLiBPcyB2YWxvcmVzIGRlIERlc3Blc2EgQXNzaXN0ZW5jaWFsIGVtIENhcnRlaXJhIFByw7NwcmlhIGNvcnJlc3BvbmRlbSDDoCB0b3RhbGl6YcOnw6NvIGRvcyBzYWxkb3MgZG9zIHNlZ3VpbnRlcyBncnVwb3MgZGUgY29udGFzIGNvbnTDoWJlaXMgZG8gUGxhbm8gZGUgQ29udGFzIFBhZHLDo28gZGEgQU5TOg0KDQoNCnwgQ29udGEgY29udMOhYmlsIHwgRGVzY3Jpw6fDo28gfCBUb3RhbGl6YcOnw6NvIHwNCnw6LS0tLS0tfDotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXw6LS0tLS0tOnwNCnwgNDExWDFYWFhYIHwgRXZlbnRvcy9zaW5pc3Ryb3MgY29uaGVjaWRvcyBvdSBhdmlzYWRvcyBkZSBhc3Npc3TDqm5jaWEgw6Agc2HDumRlIG3DqWRpY28taG9zcGl0YWxhciB8ICgrKSB8DQp8IDQxMVgxWFg4WCB8IENvcnJlc3BvbnNhYmlsaWRhZGUgQXNzdW1pZGEgfCAoLSkgfA0KfCAzMTE3MVhYWFggfCAoLSkgQ29udHJhcHJlc3Rhw6fDtWVzIGRlIGNvcnJlc3BvbnNhYmlsaWRhZGUgY2VkaWRhIGRlIGFzc2lzdMOqbmNpYSBtw6lkaWNvLWhvc3BpdGFsYXIgfCAoKykgfA0KDQoNCkRlc3NhIGZvcm1hLCBvIHZhbG9yIGRhIGRlc3Blc2EgYXNzaXN0ZW5jaWFsIGVtIGNhcnRlaXJhIHByw7NwcmlhIGluY2x1aSB2YWxvcmVzIGRlIEV2ZW50b3MvIFNpbmlzdHJvcyBjb25oZWNpZG9zIG91IGF2aXNhZG9zIGUgdmFsb3JlcyBkZSBnYXN0b3MgZGUgY29ycmVzcG9uc2FiaWxpZGFkZSBkZSBjYXJ0ZWlyYSBwcsOzcHJpYSAqY2VkaWRhKiBhIHRlcmNlaXJvcyAoY29udGFzIGNvbnTDoWJlaXMgcmVkdXRvcmFzIGRlIHJlY2VpdGEgMzExNzFYWFhYKS4gVmFsb3JlcyBkZSBjb3JyZXNwb25zYWJpbGlkYWRlICphc3N1bWlkYSogKGNvbnRhcyBjb250w6FiZWlzIGRlIGRlc3Blc2EgNDExWDFYWDhYKSBzw6NvIGRlc2NvbnNpZGVyYWRvcywgcG9pcyByZWZlcmVtLXNlIGEgZGVzcGVzYXMgYXNzaXN0ZW5jaWFpcyBpbmNvcnJpZGFzIGVtIGF0ZW5kaW1lbnRvIGEgY2FydGVpcmEgZGUgdGVyY2Vpcm9zIChvdXRyYXMgb3BlcmFkb3JhcykuICAgICAgICAgIA0KDQoNCk8gY8OzZGlnbyBhIHNlZ3VpciB0b3RhbGl6YSBhIGRlc3Blc2EgYXNzaXN0ZW5jaWFsIHBvciB0cmltZXN0cmUsIG9wZXJhZG9yYSBlIHRpcG8gZGUgY2FydGVpcmE6IA0KDQpgYGB7cn0NCmRpb3BzMSA8LSBkaW9wczAgfD4gIA0KICAjIGZpbHRyYSBjb250YXMgY29udMOhYmVpcyByZWxldmFudGVzIHBhcmEgYSBhbsOhbGlzZQ0KICBmaWx0ZXIoIA0KICAgICMgZXZlbnRvcy9zaW5pc3Ryb3MgY29uaGVjaWRvcyBtw6lkaWNvLWhvc3BpdGFsYXIsIGluY2x1aW5kbyBjb3JyZXNwb25zYWJpbGlkYWRlIGFzc3VtaWRhIA0KICAgIChzdWJzdHIoY2RfY29udGFfY29udGFiaWwsIDEsIDMpID09ICc0MTEnICYgc3Vic3RyKGNkX2NvbnRhX2NvbnRhYmlsLCA1LCA1KSA9PSAnMScpDQogICAgIyByZWNlaXRhIGRlIGNvbnRyYXByZXN0YcOnw7VlcyBtw6lkaWNvLWhvc3BpdGFsYXJlcyBlIA0KICAgICMgY29ycmVzcG9uc2FiaWxpZGFkZSBjZWRpZGEgbcOpZGljby1ob3NwaXRhbGFyIChyZWR1dG9yIGRlIHJlY2VpdGEpDQogICAgfCAoc3Vic3RyKGNkX2NvbnRhX2NvbnRhYmlsLCAxLCA1KSA9PSAnMzExMTEnIHwgc3Vic3RyKGNkX2NvbnRhX2NvbnRhYmlsLCAxLCA1KSA9PSAnMzExNzEnKQ0KICApIHw+IA0KICBtdXRhdGUoDQogICAgZ3JfY2MgPSBjYXNlX3doZW4oDQogICAgICBzdWJzdHIoY2RfY29udGFfY29udGFiaWwsIDEsIDEpID09ICc0JyB+ICdldmVudG9zJywNCiAgICAgIHN1YnN0cihjZF9jb250YV9jb250YWJpbCwgMSwgNSkgPT0gJzMxMTExJyB+ICdyZWNlaXRhJywgDQogICAgICBzdWJzdHIoY2RfY29udGFfY29udGFiaWwsIDEsIDUpID09ICczMTE3MScgfiAnY29ycl9jZWRpZGEnLCAjIHJlZHV0b3JhIGRlIHJlY2VpdGENCiAgICAgIC5kZWZhdWx0ID0gICdFWENMVUlSJyksIA0KICApIHw+DQogICMgVG90YWxpemEgcG9yIG9wZXJhZG9yYSwgY29udGEgY29udMOhYmlsIGUgcGVyw61vZG8NCiAgc3VtbWFyaXNlKHZsX3NhbGRvX2ZpbmFsID0gc3VtKHZsX3NhbGRvX2ZpbmFsKSwgDQogICAgICAgICAgICAuYnkgPSBjKGlkX29wcywgY2RfY29udGFfY29udGFiaWwsIGlkX2NhbGVuZGFyLCBncl9jYykpIHw+ICANCiAgIyBTZXBhcmEgb3Mgc2FsZG9zIHBvciBncnVwbyBkZSBjb250YSBlbSBjb2x1bmFzIChldmVudG9zLCByZWNlaXRhIGUgY29ycl9jZWRpZGEpDQogIHBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSBncl9jYywgdmFsdWVzX2Zyb20gPSB2bF9zYWxkb19maW5hbCwgdmFsdWVzX2ZpbGwgPSAwKSB8PiANCiAgIyBpZGVudGlmaWNhIHRpcG9zIGRlIHBsYW5vIHBlbGEgY29udGEgY29udMOhYmlsDQogIG11dGF0ZSgNCiAgICB2aWdlbmNpYSA9IGNhc2Vfd2hlbigNCiAgICAgIHN1YnN0cihjZF9jb250YV9jb250YWJpbCwgOCwgOCkgPT0gJzgnIH4gJ2NvcnJfYXNzdW1pZGEnLCANCiAgICAgIHN1YnN0cihjZF9jb250YV9jb250YWJpbCwgOCwgOCkgJWluJSBjKCcxJywnMycsJzUnKSB+ICdBJywNCiAgICAgIHN1YnN0cihjZF9jb250YV9jb250YWJpbCwgOCwgOCkgJWluJSBjKCcyJywnNCcsJzYnKSB+ICdQJywNCiAgICAgIC5kZWZhdWx0ID0gICdFWENMVUlSJyksIA0KICAgIGNvbnRyYXRhY2FvID0gY2FzZV93aGVuKA0KICAgICAgc3Vic3RyKGNkX2NvbnRhX2NvbnRhYmlsLCA4LCA4KSA9PSAnOCcgfiAnY29ycl9hc3N1bWlkYScsIA0KICAgICAgc3Vic3RyKGNkX2NvbnRhX2NvbnRhYmlsLCA4LCA4KSAlaW4lIGMoJzEnLCcyJykgfiAnSW5kaXZpZHVhbCcsDQogICAgICBzdWJzdHIoY2RfY29udGFfY29udGFiaWwsIDgsIDgpICVpbiUgYygnMycsJzQnKSB+ICdBZGVzw6NvJywNCiAgICAgIHN1YnN0cihjZF9jb250YV9jb250YWJpbCwgOCwgOCkgJWluJSBjKCc1JywnNicpIH4gJ0VtcHJlc2FyaWFsJywNCiAgICAgIC5kZWZhdWx0ID0gICdFWENMVUlSJyksIA0KICAgIGZpbmFuY2lhbWVudG8gPSBjYXNlX3doZW4oDQogICAgICBzdWJzdHIoY2RfY29udGFfY29udGFiaWwsIDgsIDgpID09ICc4JyB+ICdjb3JyX2Fzc3VtaWRhJywgDQogICAgICBzdWJzdHIoY2RfY29udGFfY29udGFiaWwsIDYsIDYpID09ICcxJyB+ICdQcmUtZXN0YWJlbGVjaWRvJywNCiAgICAgIHN1YnN0cihjZF9jb250YV9jb250YWJpbCwgNiwgNikgPT0gJzInIH4gJ1DDs3MtZXN0YWJlbGVjaWRvJywNCiAgICAgIC5kZWZhdWx0ID0gICdFWENMVUlSJyksIA0KICApIHw+IA0KICANCiAgZmlsdGVyKHZpZ2VuY2lhICE9ICdjb3JyX2Fzc3VtaWRhJykgfD4gICAgICAgICAgIyBFeGNsdWkgY29yciBhc3N1bWlkYQ0KICBtdXRhdGUoZGVzcGVzYSA9IGV2ZW50b3MgLSBjb3JyX2NlZGlkYSkgfD4gICAgICAjIEluY2x1aSBjb3JyIGNlZGlkYSBuYSBkZXNwZXNhIHRyb2NhbmRvIG8gc2luYWwNCiAgDQogIHN1bW1hcmlzZShyZWNlaXRhID0gc3VtKHJlY2VpdGEpLCANCiAgICAgICAgICAgIGRlc3Blc2EgPSBzdW0oZGVzcGVzYSksIA0KICAgICAgICAgICAgLmJ5ID0gYyhpZF9vcHMsIHZpZ2VuY2lhLCBjb250cmF0YWNhbywgZmluYW5jaWFtZW50bywgaWRfY2FsZW5kYXIpKQ0KYGBgDQoNClwNCg0KYGBge3IgZWNobz1GQUxTRX0NCmRpb3BzMSB8PiANCiAgbXV0YXRlKGFubyA9IHllYXIoaWRfY2FsZW5kYXIpKSB8PiANCiAgc3VtbWFyaXNlKE9wZXJhZG9yYXMgPSBuX2Rpc3RpbmN0KGlkX29wcyksIA0KICAgICAgICAgICAgIlJlY2VpdGEgKFIkYm4pIiA9IHN1bShyZWNlaXRhLCBuYS5ybSA9IFQpLCANCiAgICAgICAgICAgICJEZXNwZXNhIChSJGJuKSIgPSBzdW0oZGVzcGVzYSwgbmEucm0gPSBUKSwgDQogICAgICAgICAgICAuYnkgPSBhbm8pIHw+IA0KICBndChyb3duYW1lX2NvbD0ic3R1YiIsIGxvY2FsZT0icHQiKSB8PiBzdWJfbWlzc2luZygpIHw+DQogIGZtdF9pbnRlZ2VyKDIpIHw+IGZtdF9udW1iZXIoMzo0LCBkZWNpbWFscz0xLCBzY2FsZV9ieT0xLzFlOSkgfD4gDQogIHRhYl9vcHRpb25zKA0KICAgIGhlYWRpbmcuYWxpZ249ImxlZnQiLCBoZWFkaW5nLnRpdGxlLmZvbnQuc2l6ZT1wY3QoMTEwKSwgaGVhZGluZy5zdWJ0aXRsZS5mb250LnNpemU9cGN0KDkwKSwNCiAgICBjb2x1bW5fbGFiZWxzLmZvbnQud2VpZ2h0PSJib2xkIiwgY29sdW1uX2xhYmVscy5mb250LnNpemU9cGN0KDgwKSwNCiAgICBjb2x1bW5fbGFiZWxzLnRleHRfdHJhbnNmb3JtPSJ1cHBlcmNhc2UiLCBjb2x1bW5fbGFiZWxzLmJhY2tncm91bmQuY29sb3I9ImdyYXk5NSIsDQogICAgZGF0YV9yb3cucGFkZGluZz1weCgyKSwgcm93X2dyb3VwLnBhZGRpbmc9cHgoMiksIHJvd19ncm91cC5mb250LndlaWdodD0iYm9sZCIsDQogICAgdGFibGUuZm9udC5zaXplPXBjdCg5MCksIHNvdXJjZV9ub3Rlcy5mb250LnNpemUgPSBwY3QoNzApLA0KICApIHw+IHRhYl9oZWFkZXIodGl0bGU9bWQoIioqUmVzdW1vKioiKSkNCmBgYA0KDQoNCg0KXA0KDQpGaWx0cmEgcGxhbm9zIG5vdm9zIChwb3N0ZXJpb3JlcyDDoCBMZWkpIGNvbSBmb3JtYcOnw6NvIGRlIHByZcOnbyBwcmVlc3RhYmVsZWNpZGEgZSB0b3RhbGl6YSBwb3IgcGVyw61vZG8sIG9wZXJhZG9yYSBlIHRpcG8gZGUgcGxhbm86DQoNCmBgYHtyfQ0KZGlvcHMgPC0gZGlvcHMxIHw+IA0KICBtdXRhdGUoYW5vID0gYXMuaW50ZWdlcih5ZWFyKGlkX2NhbGVuZGFyKSksIC5hZnRlcj1jb250cmF0YWNhbykgfD4gc2VsZWN0KC1pZF9jYWxlbmRhcikgfD4gDQogIGZpbHRlciggDQogICAgdmlnZW5jaWEgPT0gJ1AnLCAgICAgICAgICAgICAgICAgICAgICMgRmlsdHJhIHBsYW5vcyBub3ZvcyAocG9zdGVyaW9yZXMgw6AgTGVpKQ0KICAgIGZpbmFuY2lhbWVudG8gPT0gJ1ByZS1lc3RhYmVsZWNpZG8nLCAjIEZpbHRyYSBmb3JtYcOnw6NvIGRlIHByZcOnbyBwcmVlc3RhYmVsZWNpZGENCiAgKSB8PiANCiAgc2VsZWN0KC12aWdlbmNpYSwgLWZpbmFuY2lhbWVudG8pIHw+IA0KICAjIEZpbHRyYSBvcGVyYWRvcmFzDQogIGlubmVyX2pvaW4oc2VsZWN0KHRhLmNhZG9wLGlkX29wcyksICBqb2luX2J5KGlkX29wcykpIHw+IA0KICAjIE1hcmNhIG9wZXJhZG9yYXMgc2VtIGRhZG9zIHbDoWxpZG9zIGRlIGRlc3Blc2ENCiAgbXV0YXRlKGxnX2V4Y2xfZGVzcGVzYSA9IHN1bShkZXNwZXNhPjApICE9IDIsIC5ieT1jKGlkX29wcywgY29udHJhdGFjYW8pLCAuYWZ0ZXI9YW5vKQ0KYGBgDQoNClwNCg0KYGBge3IgZWNobz1GQUxTRX0NCnJiaW5kKA0KICBkaW9wcyB8PiBmaWx0ZXIoIWxnX2V4Y2xfZGVzcGVzYSkgfD4gDQogICAgc3VtbWFyaXNlKG9wZXJhZG9yYXMgPSBuX2Rpc3RpbmN0KGlkX29wcyksIA0KICAgICAgICAgICAgICByZWNlaXRhID0gc3VtKHJlY2VpdGEsIG5hLnJtID0gVCksIA0KICAgICAgICAgICAgICBkZXNwZXNhID0gc3VtKGRlc3Blc2EsIG5hLnJtID0gVCksIA0KICAgICAgICAgICAgICAuYnkgPSBjKGFubywgY29udHJhdGFjYW8pKSwNCiAgZGlvcHMgfD4gZmlsdGVyKCFsZ19leGNsX2Rlc3Blc2EpIHw+IA0KICAgIHN1bW1hcmlzZShvcGVyYWRvcmFzID0gbl9kaXN0aW5jdChpZF9vcHMpLCANCiAgICAgICAgICAgICAgcmVjZWl0YSA9IHN1bShyZWNlaXRhLCBuYS5ybSA9IFQpLCANCiAgICAgICAgICAgICAgZGVzcGVzYSA9IHN1bShkZXNwZXNhLCBuYS5ybSA9IFQpLCANCiAgICAgICAgICAgICAgLmJ5ID0gYyhhbm8pKSB8PiANCiAgICBtdXRhdGUoY29udHJhdGFjYW8gPSAiVG90YWwiKQ0KKSB8PiBhcnJhbmdlKGNvbnRyYXRhY2FvLCBhbm8pIHw+IGdyb3VwX2J5KGNvbnRyYXRhY2FvKSB8PiANCiAgZ3Qocm93bmFtZV9jb2w9InN0dWIiLCBsb2NhbGU9InB0IikgfD4gc3ViX21pc3NpbmcoKSB8Pg0KICBmbXRfaW50ZWdlcihvcGVyYWRvcmFzKSB8PiBmbXRfbnVtYmVyKDQ6NSwgZGVjaW1hbHM9MSwgc2NhbGVfYnk9MS8xZTkpIHw+IA0KICB0YWJfb3B0aW9ucygNCiAgICBoZWFkaW5nLmFsaWduPSJsZWZ0IiwgaGVhZGluZy50aXRsZS5mb250LnNpemU9cGN0KDExMCksIGhlYWRpbmcuc3VidGl0bGUuZm9udC5zaXplPXBjdCg5MCksDQogICAgY29sdW1uX2xhYmVscy5mb250LndlaWdodD0iYm9sZCIsIGNvbHVtbl9sYWJlbHMuZm9udC5zaXplPXBjdCg4MCksDQogICAgY29sdW1uX2xhYmVscy50ZXh0X3RyYW5zZm9ybT0idXBwZXJjYXNlIiwgY29sdW1uX2xhYmVscy5iYWNrZ3JvdW5kLmNvbG9yPSJncmF5OTUiLA0KICAgIGRhdGFfcm93LnBhZGRpbmc9cHgoMiksIHJvd19ncm91cC5wYWRkaW5nPXB4KDIpLCByb3dfZ3JvdXAuZm9udC53ZWlnaHQ9ImJvbGQiLA0KICAgIHRhYmxlLmZvbnQuc2l6ZT1wY3QoOTApLCBzb3VyY2Vfbm90ZXMuZm9udC5zaXplID0gcGN0KDcwKSwNCiAgKSB8PiB0YWJfaGVhZGVyKHRpdGxlPW1kKCIqKlJlc3VtbyAoUiQgYmlsaMO1ZXMpKioiKSwNCiAgICAgICAgICAgICAgICAgIHN1YnRpdGxlPSJBcGVuYXMgb3BlcmFkb3JhcyBjb20gZGFkb3MgZGUgZGVzcGVzYSBub3MgMiBhbm9zIikNCmBgYA0KDQpgYGB7ciBpbmNsdWRlPUZBTFNFfQ0Kcm0oZGlvcHMwLCBkaW9wczEpOyBnYygpDQpgYGANCg0KDQpcDQoNCiMjIEJlbmVmaWNpw6FyaW9zIChzZW1pLWFkaXRpdm8pDQoNCkFzIGluZm9ybWHDp8O1ZXMgZGUgdsOtbmN1bG9zIGF0aXZvcyBkZSBiZW5lZmljacOhcmlvcyBzw6NvIG9idGlkYXMgYXRyYXbDqXMgZG8gU2lzdGVtYSBkZSBJbmZvcm1hw6fDo28gZGUgQmVuZWZpY2nDoXJpb3MgKFNJQiksIHF1ZSDDqSBhdHVhbGl6YWRvIG1lbnNhbG1lbnRlLiAgICAgICAgICAgIA0KDQpBIGJhc2UgZGUgZGFkb3MgZG8gU0lCIHJlZmVyZW50ZSBhb3MgYW5vcyBkZSBgciB5ZWFyKHBlcmlvZG9bMV0pYCBlIGByIHllYXIocGVyaW9kb1syXSlgIHBvZGUgc2VyIGFjZXNzYWRhIG5vIFBvcnRhbCBCcmFzaWxlaXJvIGRlIERhZG9zIEFiZXJ0b3MgZG8gR292ZXJubyBGZWRlcmFsLCBjb25qdW50byBkZSBkYWRvcyBbKipCZW5lZmljacOhcmlvcyBwb3Igb3BlcmFkb3JhIGUgdGlwbyBkZSBjYXJ0ZWlyYSBwYXJhIGPDoWxjdWxvIGRhIFZEQSoqXShodHRwczovL2RhZG9zLmdvdi5ici9kYWRvcy9jb25qdW50b3MtZGFkb3MvYmVuZWZpY2lhcmlvcy1jb20tdmluY3Vsb3MtYXRpdm9zLXBvci10aXBvLWRlLWNvbnRyYXRhY2FvLXBhcmEtY2FsY3Vsby1kYS12ZGEpLiBFc3RlIGNvbmp1bnRvIGRlIGRhZG9zIGluZm9ybWEgYSBxdWFudGlkYWRlIGRlIHbDrW5jdWxvcyBhdGl2b3MgZGUgYmVuZWZpY2nDoXJpb3MgZW0gcGxhbm9zIGRlIHNhw7pkZSBtw6lkaWNvLWhvc3BpdGFsYXIgbcOqcyBhIG3DqnMgcG9yIG9wZXJhZG9yYSBlIHRpcG8gZGUgcGxhbm8uICAgICAgIA0KDQpPIGPDs2RpZ28gYSBzZWd1aXIgZmF6IGEgbGVpdHVyYSBkb3MgYXJxdWl2b3MgcHVibGljYWRvcyBubyBwb3J0YWwgZGUgZGFkb3MgYWJlcnRvczoNCg0KYGBge3J9DQpzaWIwIDwtIHJlYWQuY3N2MigiX2RhdGFzZXRzL2JlbmVmaWNpYXJpb3NfdmRhXzIwMjMtMjAyMi5jc3YiKSB8PiBhc190aWJibGUoKSB8PiANCiAgcmVuYW1lX3dpdGgodG9sb3dlcikgfD4gDQogIHJlbmFtZSgNCiAgICBpZF9vcHMgPSBjZF9vcGVyYWRvcmEsIA0KICAgIHZpZ2VuY2lhID0gdmlnZW5jaWFfcGxhbm8sIGNvbnRyYXRhY2FvID0gZ3JfY29udHJhdGFjYW8sIGZpbmFuY2lhbWVudG8gPSB0aXBvX2ZpbmFuY2lhbWVudG8sDQogICAgYmVuZWYgPSBucl9iZW5lZg0KICApIHw+IA0KICBtdXRhdGUoDQogICAgaWRfY2FsZW5kYXIgPSBtYWtlX2RhdGUoYXMuaW50ZWdlcihtZXMvMTAwKSwgbWVzIC0gKGFzLmludGVnZXIobWVzLzEwMCkpICogMTAwLCAxKSwNCiAgICBjb250cmF0YWNhbyA9IGNhc2Vfd2hlbihjb250cmF0YWNhbyA9PSAnQ29sZXRpdm8gZW1wcmVzYXJpYWwnICAgfiAnRW1wcmVzYXJpYWwnLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyYXRhY2FvID09ICdDb2xldGl2byBwb3IgYWRlc8OjbycgICAgfiAnQWRlc8OjbycsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHJhdGFjYW8gPT0gJ0luZGl2aWR1YWwgb3UgZmFtaWxpYXInIH4gJ0luZGl2aWR1YWwnLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5kZWZhdWx0ID0gJ07Do28gaWRlbnRpZmljYWRvJykNCiAgKSB8PiANCiAgDQogIGZpbHRlcigNCiAgICBpZF9jYWxlbmRhciA+IChwZXJpb2RvWzFdIC0geWVhcnMoMSkpLCBpZF9jYWxlbmRhciA8PSBwZXJpb2RvWzJdICAjIEZpbHRyYSBwZXLDrW9kbyBkZSBhbsOhbGlzZQ0KICAgICYgYmVuZWYgIT0gMCAmICFpcy5uYShiZW5lZiksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgRXhjbHVpIHplcm9zIGUgbnVsb3MNCg0KICAgICMgRmlsdHJhIHBsYW5vcyBkZSBpbnRlcmVzc2UgcGFyYSBhIGFuw6FsaXNlDQogICAgY29iZXJ0dXJhID09ICJNw6lkaWNvLWhvc3BpdGFsYXIiLCAgICAgICAgICAgICAgICAgICAgICAgICAgIyBjb2JlcnR1cmEgbcOpZGljby1ob3NwaXRhbGFyDQogICAgdmlnZW5jaWEgPT0gJ1AnLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHBsYW5vcyBub3ZvcyAocG9zdGVyaW9yZXMgw6AgTGVpKQ0KICAgIGZpbmFuY2lhbWVudG8gIT0gJ1DDs3MtZXN0YWJlbGVjaWRvJywgICAgICAgICAgICAgICAgICAgICAgICMgZm9ybWHDp8OjbyBkZSBwcmXDp28gcHLDqS1lc3RhYmVsZWNpZGENCiAgICBjb250cmF0YWNhbyAlaW4lIGMoJ0VtcHJlc2FyaWFsJywgJ0luZGl2aWR1YWwnLCAnQWRlc8OjbycpICAjIHRpcG8gZGUgY29udHJhdGHDp8Ojbw0KICApIHw+IA0KICANCiAgIyBmaWx0cmEgb3BlcmFkb3JhcyBtw6lkaWNvLWhvc3BpdGFsYXJlcw0KICBpbm5lcl9qb2luKHNlbGVjdCh0YS5jYWRvcCxpZF9vcHMpLCBqb2luX2J5KGlkX29wcykpIHw+IA0KICANCiAgIyBUb3RhbGl6YSBwb3Igb3BlcmFkb3JhLCB0aXBvIGRlIGNvbnRyYXRhw6fDo28gZSBtw6pzDQogIHN1bW1hcmlzZShiZW5lZiA9IHN1bShiZW5lZiksIC5ieSA9IGMoaWRfb3BzLCBjb250cmF0YWNhbywgaWRfY2FsZW5kYXIpKSB8PiANCiAgDQogIGFycmFuZ2UoaWRfb3BzLCBjb250cmF0YWNhbywgaWRfY2FsZW5kYXIpDQpgYGANCg0KDQpcDQoNCkNhbGN1bGEgYSBtw6lkaWEgZGUgYmVuZWZpY2nDoXJpb3Mgbm8gYW5vIHBvciBvcGVyYWRvcmEgZSB0aXBvIGRlIGNvbnRyYXRhw6fDo28gZSBleGNsdWkgb3BlcmFkb3JhcyBxdWUgbsOjbyB0ZW5oYW0gdW1hIHNlcXXDqm5jaWEgaW5pbnRlcnJ1cHRhIGRlIGJlbmVmaWNpw6FyaW9zIG5vcyAyNCBtZXNlczoNCg0KYGBge3J9DQpzaWIgPC0gc2liMCB8PiANCiAgbXV0YXRlKGFubyA9IGFzLmludGVnZXIoeWVhcihpZF9jYWxlbmRhcikpKSB8PiBzZWxlY3QoLWlkX2NhbGVuZGFyKSB8PiANCiAgDQogICMgSWRlbnRpZmljYSBvcGVyYWRvcmFzIHF1ZSB0aXZlcmFtIHNlcXXDqm5jaWEgaW5pbnRlcnJ1cHRhIGRlIDI0IG1lc2VzDQogIG11dGF0ZShsZ19leGNsX2JlbmVmID0gbigpIT0yNCwgLmJ5PWMoaWRfb3BzLCBjb250cmF0YWNhbykpIHw+IA0KICANCiAgIyBDYWxjdWxhIGEgbcOpZGlhIGRvcyDDumx0aW1vcyAxMiBtZXNlcyBwb3Igb3BlcmFkb3JhLCBjb250cmF0YWNhbyBlIGFubw0KICBzdW1tYXJpc2UoYmVuZWZtID0gc3VtKGJlbmVmLCBuYS5ybT1UKS8xMiwgLmJ5ID0gYyhpZF9vcHMsIGNvbnRyYXRhY2FvLCBhbm8sIGxnX2V4Y2xfYmVuZWYpKQ0KYGBgDQoNClwNCg0KYGBge3IgZWNobz1GQUxTRX0NCnJiaW5kKHNpYiB8PiANCiAgICAgICAgZmlsdGVyKCFsZ19leGNsX2JlbmVmKSB8PiANCiAgICAgICAgc3VtbWFyaXNlKE9wZXJhZG9yYXMgPSBuX2Rpc3RpbmN0KGlkX29wcyksDQogICAgICAgICAgICAgICAgICBiZW5lZmljaWFyaW9zID0gc3VtKGJlbmVmbSksDQogICAgICAgICAgICAgICAgICAuYnkgPSBjKGFubywgY29udHJhdGFjYW8pKSwNCiAgICAgIA0KICAgICAgc2liIHw+IA0KICAgICAgICBmaWx0ZXIoIWxnX2V4Y2xfYmVuZWYpIHw+IA0KICAgICAgICBzdW1tYXJpc2UoT3BlcmFkb3JhcyA9IG5fZGlzdGluY3QoaWRfb3BzKSwNCiAgICAgICAgICAgICAgICAgIGJlbmVmaWNpYXJpb3MgPSBzdW0oYmVuZWZtKSwNCiAgICAgICAgICAgICAgICAgIC5ieSA9IGMoYW5vKSkgfD4gDQogICAgICAgIG11dGF0ZShjb250cmF0YWNhbz0iVG90YWwiKSkgfD4gDQogIA0KICBhcnJhbmdlKGNvbnRyYXRhY2FvLCBhbm8pIHw+IGdyb3VwX2J5KGNvbnRyYXRhY2FvKSB8PiANCiAgZ3Qocm93bmFtZV9jb2w9InN0dWIiLCBsb2NhbGU9InB0IikgfD4gc3ViX21pc3NpbmcoKSB8Pg0KICBmbXRfaW50ZWdlcigzOjQpIHw+IA0KICB0YWJfb3B0aW9ucygNCiAgICBoZWFkaW5nLmFsaWduPSJsZWZ0IiwgaGVhZGluZy50aXRsZS5mb250LnNpemU9cGN0KDExMCksIGhlYWRpbmcuc3VidGl0bGUuZm9udC5zaXplPXBjdCg5MCksDQogICAgY29sdW1uX2xhYmVscy5mb250LndlaWdodD0iYm9sZCIsIGNvbHVtbl9sYWJlbHMuZm9udC5zaXplPXBjdCg4MCksDQogICAgY29sdW1uX2xhYmVscy50ZXh0X3RyYW5zZm9ybT0idXBwZXJjYXNlIiwgY29sdW1uX2xhYmVscy5iYWNrZ3JvdW5kLmNvbG9yPSJncmF5OTUiLA0KICAgIGRhdGFfcm93LnBhZGRpbmc9cHgoMiksIHJvd19ncm91cC5wYWRkaW5nPXB4KDIpLCByb3dfZ3JvdXAuZm9udC53ZWlnaHQ9ImJvbGQiLA0KICAgIHRhYmxlLmZvbnQuc2l6ZT1wY3QoOTApLCBzb3VyY2Vfbm90ZXMuZm9udC5zaXplID0gcGN0KDcwKSwNCiAgKSB8PiANCiAgdGFiX2hlYWRlcih0aXRsZSA9IG1kKCIqKlJlc3VtbyAoTcOpZGlhIGRlIGJlbmVmaWNpw6FyaW9zKSoqIiksDQogICAgICAgICAgICAgc3VidGl0bGU9ICJBcGVuYXMgb3BlcmFkb3JhcyBjb20gYmVuZWZpY2nDoXJpb3Mgbm9zIDI0IG1lc2VzIikNCmBgYA0KDQpgYGB7ciBpbmNsdWRlPUZBTFNFfQ0Kcm0oc2liMCk7IGdjKCkNCmBgYA0KDQpcDQoNCioqKg0KDQojIEPDoWxjdWxvIGRhIFZEQQ0KDQpcDQoNCiMjIERlc3Blc2EgcG9yIEJlbmVmaWNpw6FyaW8NCg0KRXN0YSBzZcOnw6NvIGdlcmEgYSBiYXNlIGRlIGRlc3Blc2EgYXNzaXN0ZW5jaWFsIGUgYmVuZWZpY2nDoXJpb3MgZSBjYWxjdWxhIGEgKmRlc3Blc2EgcG9yIGJlbmVmaWNpw6FyaW8qLiAgICAgICAgICAgDQoNCkEgZGVzcGVzYSBwb3IgYmVuZWZpY2nDoXJpbyDDqSBhIG3DqWRpYSBtZW5zYWwgZGEgKmRlc3Blc2EgYXNzaXN0ZW5jaWFsKiBkYSBjYXJ0ZWlyYSBwcsOzcHJpYSBkZSB1bWEgb3BlcmFkb3JhIGluY29ycmlkYSBubyBhbm8sIGRpdmlkaWRhIHBlbGEgKm3DqWRpYSBkZSB2w61uY3Vsb3MgYXRpdm9zIGRlIGJlbmVmaWNpw6FyaW9zKiBhbyBsb25nbyBkbyBhbm8uIEVzc2EgbcOpdHJpY2EgcmVwcmVzZW50YSBvIHByaW5jaXBhbCBjb21wb25lbnRlIGRlIGN1c3RvIGRlIHVtIHBsYW5vIGRlIHNhw7pkZSBlIGVzdMOhIGV4cHJlc3NhIGRlIGZvcm1hIGEgcGVybWl0aXIgY29tcGFyw6EtbGEgZW50cmUgb3BlcmFkb3JhcyBwb3IgdGlwbyBkZSBjYXJ0ZWlyYSBlIGFjb21wYW5oYXIgc3VhIGV2b2x1w6fDo28gYW8gbG9uZ28gZG8gdGVtcG8uICAgICAgICAgICANCg0KICAgICAgICAgICAgDQpBIGJhc2UgZGUgY8OhbGN1bG8gZGEgVkRBIGNvbnNpZGVyYSBhcGVuYXM6ICAgICAgDQoNCiogT3BlcmFkb3JhcyBzZW0gcmVzc2FsdmFzIGNvbSByZWdpc3RybyBhdGl2byBub3MgZG9pcyBhbm9zICAgICANCg0KKiBPYnNlcnZhw6fDtWVzIHF1ZSBhcHJlc2VudGFtIHZhbG9yIHBvc2l0aXZvIGRlIGRlc3Blc2Egbm9zIGRvaXMgYW5vcyAgICAgICAgDQoNCiogT2JzZXJ2YcOnw7VlcyBxdWUgYXByZXNlbnRhbSB1bWEgc2VxdcOqbmNpYSBpbmludGVycnVwdGEgZGUgMTIgbWVzZXMgZGUgYmVuZWZpY2nDoXJpb3Mgbm9zIGRvaXMgYW5vcyAgICAgICAgDQoNCk8gY8OzZGlnbyBhIHNlZ3VpciByZXVuZSBvcyBkYWRvcyBkZSBiZW5lZmljacOhcmlvcyBlIGRlc3Blc2FzLCBmaWx0cmEgYXMgb2JzZXJ2YcOnw7VlcyByZWxldmFudGVzIGUgY2FsY3VsYSBhIERlc3Blc2EgcG9yIEJlbmVmaWNpw6FyaW8gKG3DqWRpYSBtZW5zYWwpOg0KDQoNCmBgYHtyfQ0KZGYudmRhMCA8LSBpbm5lcl9qb2luKA0KICBkaW9wcyB8PiBmaWx0ZXIoIWxnX2V4Y2xfZGVzcGVzYSkgfD4gc2VsZWN0KC1yZWNlaXRhLCAtbGdfZXhjbF9kZXNwZXNhKSwgDQogIHNpYiB8PiBmaWx0ZXIoIWxnX2V4Y2xfYmVuZWYpIHw+IHNlbGVjdCgtbGdfZXhjbF9iZW5lZiksIA0KICBqb2luX2J5KGlkX29wcywgY29udHJhdGFjYW8sIGFubykNCikgfD4gDQogIGFycmFuZ2UoaWRfb3BzLCBjb250cmF0YWNhbywgYW5vKSB8PiANCiAgDQogICMgRXhjbHVpIG9wZXJhZG9yYXMgaW52w6FsaWRhcyBwb3Igb3V0cm9zIG1vdGl2b3M6DQogIGlubmVyX2pvaW4odGEuY2Fkb3AsIGpvaW5fYnkoaWRfb3BzKSkgfD4gDQogIGZpbHRlciggIWxnX2NhbmNlbGFkYSAmICFsZ19ub3ZhX29wcyAmICFsZ19yZXNzYWx2YSApIHw+IA0KICBzZWxlY3QoLWMobGdfY2FuY2VsYWRhLCBsZ19ub3ZhX29wcywgbGdfcmVzc2FsdmEsIG1vZGFsaWRhZGUpKSB8Pg0KICByZWxvY2F0ZShyYXphb19zb2NpYWwsIC5hZnRlciA9IGlkX29wcykgfD4gDQogIA0KICAjIENhbGN1bGEgZGVzcGVzYSBwb3IgYmVuZWZpY2nDoXJpbzoNCiAgbXV0YXRlKGRwYiA9IGlmX2Vsc2UoIWlzLm5hKGJlbmVmbSkgJiBiZW5lZm0+MCwgZGVzcGVzYS9iZW5lZm0vMTIsIE5BKSkNCmBgYA0KDQoNClwNCg0KDQpgYGB7ciBlY2hvPUZBTFNFfQ0KZGYudmRhMCB8PiBmaWx0ZXIoYW5vID09IG1heChhbm8pKSB8PiANCiAgZmlsdGVyKCFpcy5uYShkZXNwZXNhKSAmICFpcy5uYShiZW5lZm0pICYgZGVzcGVzYT4wICYgYmVuZWZtPjApIHw+IA0KICBzdW1tYXJpc2UoDQogICAgIkRlc3Blc2EvYmVuZWYiID0gc3VtKGRlc3Blc2EpL3N1bShiZW5lZm0pLzEyLA0KICAgIC5ieSA9IGMoY29udHJhdGFjYW8pDQogICkgfD4gYXJyYW5nZShkZXNjKGNvbnRyYXRhY2FvKSkgfD4gDQogIGd0KGxvY2FsZT0icHQiKSB8PiBzdWJfbWlzc2luZygpIHw+DQogIGZtdF9udW1iZXIoMiwgZGVjaW1hbHM9MCkgfD4gDQogIHRhYl9vcHRpb25zKA0KICAgIGhlYWRpbmcuYWxpZ249ImxlZnQiLCBoZWFkaW5nLnRpdGxlLmZvbnQuc2l6ZT1wY3QoMTEwKSwgaGVhZGluZy5zdWJ0aXRsZS5mb250LnNpemU9cGN0KDkwKSwNCiAgICBjb2x1bW5fbGFiZWxzLmZvbnQud2VpZ2h0PSJib2xkIiwgY29sdW1uX2xhYmVscy5mb250LnNpemU9cGN0KDgwKSwNCiAgICBjb2x1bW5fbGFiZWxzLnRleHRfdHJhbnNmb3JtPSJ1cHBlcmNhc2UiLCBjb2x1bW5fbGFiZWxzLmJhY2tncm91bmQuY29sb3I9ImdyYXk5NSIsDQogICAgZGF0YV9yb3cucGFkZGluZz1weCgyKSwgcm93X2dyb3VwLnBhZGRpbmc9cHgoMiksIHJvd19ncm91cC5mb250LndlaWdodD0iYm9sZCIsDQogICAgdGFibGUuZm9udC5zaXplPXBjdCg5MCksIHNvdXJjZV9ub3Rlcy5mb250LnNpemUgPSBwY3QoNzApLA0KICApIHw+IA0KICB0YWJfaGVhZGVyKHRpdGxlID0gbWQoIioqRGVzcGVzYSBtZW5zYWwgcG9yIGJlbmVmaWNpw6FyaW8gKFIkKSoqIiksDQogICAgICAgICAgICAgc3VidGl0bGU9Im3DqWRpYSBhZ3JlZ2FkYSIpDQpgYGANCg0KXA0KDQpcDQoNCioqVmlzdWFsaXphw6fDo28gZ3LDoWZpY2EgZGEgZGlzdHJpYnVpw6fDo28gZGEgZGVzcGVzYSBwb3IgYmVuZWZpY2nDoXJpbyBkYXMgb3BlcmFkb3Jhcy4qKiAgICAgDQoNCipOb3RhOiBPIGdyw6FmaWNvIGEgc2VndWlyIGV4Y2x1aSBvcyA1JSBtYWlvcmVzIGUgbWVub3JlcyB2YWxvcmVzIGRlIGNhZGEgY2FydGVpcmEgcGFyYSBxdWUgc2VqYSBwb3Nzw612ZWwgdmlzdWFsaXphciBhIGRpc3RyaWJ1acOnw6NvIGRvcyBkYWRvcy4qDQoNCg0KYGBge3IgZWNobz1GQUxTRSwgZmlnLndpZHRoPTYsIGZpZy5hc3A9MX0NCmRmLnZkYTAgfD4gDQogIG11dGF0ZSgNCiAgICBsZ19vdXRsaWVyID0gKGRwYiA+IHF1YW50aWxlKGRwYiwwLjk1KSkgfCAoZHBiIDwgcXVhbnRpbGUoZHBiLDAuMDUpKSwNCiAgICAuYnkgPSBjKGFubywgY29udHJhdGFjYW8pKSB8Pg0KICBtdXRhdGUoYW5vPWFzLmZhY3Rvcihhbm8pKSB8PiANCiAgbXV0YXRlKGNvbnRyYXRhY2FvID0gZmFjdG9yKGNvbnRyYXRhY2FvLCBsZXZlbHM9YygiSW5kaXZpZHVhbCIsIkVtcHJlc2FyaWFsIiwiQWRlc8OjbyIpKSkgfD4gDQogIGZpbHRlciggIWxnX291dGxpZXIgKSB8Pg0KICBnZ3Bsb3QoYWVzKHg9ZHBiLCBmaWxsPWFubywgY29sb3I9YW5vLCB3ZWlnaHQ9YmVuZWZtKSkgKw0KICBnZW9tX2RlbnNpdHkoYWxwaGE9LjQsIGFkanVzdD0uNSkgKw0KICBzY2FsZV9jb2xvcl9icmV3ZXIocGFsZXR0ZT0iU2V0MSIpICsNCiAgc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZT0iU2V0MSIpICsNCiAgc2NhbGVfeV9jb250aW51b3VzKGV4cGFuZCA9IGV4cGFuc2lvbihtdWx0ID0gYygwLDAuMSkpKSArDQogIHNjYWxlX3hfY29udGludW91cyhleHBhbmQgPSBleHBhbnNpb24obXVsdCA9IGMoMCwwKSksIGJyZWFrcyA9IHNjYWxlczo6YnJlYWtzX3dpZHRoKDEwMCkpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gInRvcCIsDQogICAgICAgIHBhbmVsLnNwYWNpbmcgPSB1bml0KDAuMDIsIHVuaXRzID0gIm5wYyIpLA0KICAgICAgICBwYW5lbC5ncmlkLm1ham9yLnggPSBlbGVtZW50X2xpbmUobGluZXR5cGUgPSAiZGFzaGVkIikpICsNCiAgbGFicygNCiAgICB0aXRsZSA9ICJEaXN0cmlidWnDp8OjbyBQb25kZXJhZGEgZGEgRGVzcGVzYSBNZW5zYWwgcG9yIEJlbmVmaWNpw6FyaW8iLA0KICAgIHN1YnRpdGxlPSJGcmVxdcOqbmNpYSBwb25kZXJhZGEgcGVsbyB0YW1hbmhvIGRhIGNhcnRlaXJhIGRhIG9wZXJhZG9yYS4iLA0KICAgIGNhcHRpb24gPSBwYXN0ZTAoDQogICAgICAiTm90YXM6XG4iLA0KICAgICAgIkV4Y2x1aSBvcyA1JSBtYWlvcmVzIGUgbWVub3JlcyB2YWxvcmVzIGRlIGNhZGEgY2FydGVpcmEuXG4iLA0KICAgICAgIkVzdGltYXRpdmEgR2F1c3NpYW5hIGRlIGRlbnNpZGFkZSBwb3IgS2VybmVsIHBhcmEgZnVuw6fDo28gZGUgZGVuc2lkYWRlIGRlIHByb2JhYmlsaWRhZGUuIg0KICAgICksDQogICAgeCA9ICJEZXNwZXNhIG1lbnNhbCBwb3IgYmVuZWZpY2nDoXJpbyAoUiQvbcOqcykiLA0KICAgIHkgPSAiRGVuc2lkYWRlIg0KICApICsgDQogIGZhY2V0X3dyYXAofmNvbnRyYXRhY2FvLCBuY29sID0gMSwgc2NhbGVzPSJmcmVlX3kiKQ0KYGBgDQoNCg0KXA0KDQoNCmBgYHtyIGVjaG89RkFMU0V9DQpkZi52ZGEwIHw+IA0KICBzdW1tYXJpc2UoDQogICAgbcOtbmltbyA9IG1pbihkcGIpLA0KICAgIHExID0gcXVhbnRpbGUoZHBiLDAuMjUsbmFtZXMgPSBGKSwNCiAgICBtZWRpYW5hID0gbWVkaWFuKGRwYiksDQogICAgcTMgPSBxdWFudGlsZShkcGIsMC43NSxuYW1lcyA9IEYpLA0KICAgIG3DoXhpbW8gPSBtYXgoZHBiKSwNCiAgICBtw6lkaWEgPSBtZWFuKGRwYiksDQogICAgZGVzdmlvID0gc2QoZHBiKSwNCiAgICBpcXIgPSBJUVIoZHBiKSwNCiAgICBjdiA9IHNkKGRwYikvYG3DqWRpYWAsDQogICAgYXNzaW1ldHJpYSA9IG1vbWVudHM6OnNrZXduZXNzKGRwYiksDQogICAgY3VydG9zZSA9IG1vbWVudHM6Omt1cnRvc2lzKGRwYiksDQogICAgLmJ5ID0gYyhjb250cmF0YWNhbywgYW5vKQ0KICApIHw+IGFycmFuZ2UoZGVzYyhjb250cmF0YWNhbyksIGFubyl8PiBncm91cF9ieShjb250cmF0YWNhbykgfD4gDQogIGd0KHJvd25hbWVfY29sPSJzdHViIiwgbG9jYWxlPSJwdCIpIHw+IHN1Yl9taXNzaW5nKCkgfD4NCiAgZm10X251bWJlcigzOjEwLCBkZWNpbWFscz0wKSB8PiBmbXRfcGVyY2VudChjdiwgZGVjaW1hbHM9MCkgfD4gDQogIGZtdF9udW1iZXIoYyhhc3NpbWV0cmlhLCBjdXJ0b3NlKSwgZGVjaW1hbHM9MikgfD4gDQogIHRhYl9vcHRpb25zKA0KICAgIGhlYWRpbmcuYWxpZ249ImxlZnQiLCBoZWFkaW5nLnRpdGxlLmZvbnQuc2l6ZT1wY3QoMTEwKSwgaGVhZGluZy5zdWJ0aXRsZS5mb250LnNpemU9cGN0KDkwKSwNCiAgICBjb2x1bW5fbGFiZWxzLmZvbnQud2VpZ2h0PSJib2xkIiwgY29sdW1uX2xhYmVscy5mb250LnNpemU9cGN0KDgwKSwNCiAgICBjb2x1bW5fbGFiZWxzLnRleHRfdHJhbnNmb3JtPSJ1cHBlcmNhc2UiLCBjb2x1bW5fbGFiZWxzLmJhY2tncm91bmQuY29sb3I9ImdyYXk5NSIsDQogICAgZGF0YV9yb3cucGFkZGluZz1weCgyKSwgcm93X2dyb3VwLnBhZGRpbmc9cHgoMiksIHJvd19ncm91cC5mb250LndlaWdodD0iYm9sZCIsDQogICAgdGFibGUuZm9udC5zaXplPXBjdCg5MCksIHNvdXJjZV9ub3Rlcy5mb250LnNpemUgPSBwY3QoNzApLA0KICApIHw+IA0KICB0YWJfaGVhZGVyKHRpdGxlID0gbWQoIioqRXN0YXTDrXN0aWNhcyBkZXNjcml0aXZhcyBkYSBkZXNwZXNhIG1lbnNhbCBwb3IgYmVuZWZpY2nDoXJpbyBkYXMgb3BlcmFkb3JhcyoqIikpDQpgYGANCg0KXA0KDQpcDQoNCiMjIFZEQSBwb3Igb3BlcmFkb3JhDQoNCkEgVkRBIGRlIHVtYSBvcGVyYWRvcmEgw6kgYSB2YXJpYcOnw6NvIGRhIGRlc3Blc2EgcG9yIGJlbmVmaWNpw6FyaW8gZGVzdGEgb3BlcmFkb3JhIHNvYnJlIG8gbWVzbW8gcGVyw61vZG8gZG8gYW5vIGFudGVyaW9yLCBjb25mb3JtZSBhIHNlZ3VpbnRlIGbDs3JtdWxhOg0KXA0KDQokJFZEQV97aXB9ID0gXGRpc3BsYXlzdHlsZVxmcmFje1xmcmFje0RBX3tpcH19e0Jlbl97aXB9fX17XGZyYWN7REFfe2lcIFxsZWZ0KHAtMVxyaWdodCl9fXtCZW5fe2lcIFxsZWZ0KHAtMVxyaWdodCl9fX0gLSAxJCQNCg0KICAgIA0KDQpPbmRlOiAgICAgDQogICAgaSA9IE9wZXJhZG9yYSBuYSBiYXNlIGRlIGPDoWxjdWxvICAgICAgICAgDQogICAgcCA9IEFubyBjYWxlbmTDoXJpbyBhbnRlcmlvciBhbyBpbsOtY2lvIGRhIGFwbGljYcOnw6NvIGRvIElSUEkgICAgDQogICAgREEgPSBEZXNwZXNhIGFzc2lzdGVuY2lhbCBlbSBjYXJ0ZWlyYSBwcsOzcHJpYSBhY3VtdWxhZGEgYW8gZmltIGRvIHBlcsOtb2RvICAgIA0KICAgIEJlbiA9IE3DqWRpYSBtZW5zYWwgZGUgYmVuZWZpY2nDoXJpb3MgZW0gY2FydGVpcmEgcHLDs3ByaWEgYW8gbG9uZ28gZG8gcGVyw61vZG8gICAgDQoNClwNCg0KTyBjw7NkaWdvIGEgc2VndWlyIGNhbGN1bGEgYSBWREEgcG9yIG9wZXJhZG9yYToNCg0KYGBge3J9DQpkZi52ZGEgPC0gZGYudmRhMCB8Pg0KICBhcnJhbmdlKGlkX29wcywgY29udHJhdGFjYW8sIGFubykgfD4gDQogIG11dGF0ZShhbm8gPSBpZl9lbHNlKGFubz09eWVhcihwZXJpb2RvWzFdKSwgImFubzEiLCAiYW5vMiIpKSB8PiANCiAgcGl2b3Rfd2lkZXIobmFtZXNfZnJvbT1hbm8sIHZhbHVlc19mcm9tPWMoZGVzcGVzYSxiZW5lZm0sZHBiKSkgfD4gDQogIA0KICAjIENBTENVTEEgVkRBIFBPUiBPUEVSQURPUkEgRU0gQ0FEQSBDQVJURUlSQQ0KICBtdXRhdGUoIHZkYSA9IChkcGJfYW5vMi9kcGJfYW5vMSAtIDEpKjEwMCApIHw+IA0KICANCiAgIyBJREVOVElGSUNBIE9VVExJRVJTICh2YWxvcmVzIGV4dHJlbW9zKSBwZWxvIGNyaXTDqXJpbyBCT1hQTE9UIDEuNXhJUVINCiAgbXV0YXRlKA0KICAgIGxnX291dGxpZXIgPSB2ZGE+PShxdWFudGlsZSh2ZGEsMC43NSwgbmEucm09VCkgKyAxLjUqSVFSKHZkYSwgbmEucm09VCkpIA0KICAgICAgICAgICAgICAgICB8IHZkYTw9KHF1YW50aWxlKHZkYSwwLjI1LCBuYS5ybT1UKSAtIDEuNSpJUVIodmRhLCBuYS5ybT1UKSksDQogICAgLmJ5ID0gY29udHJhdGFjYW8NCiAgKQ0KYGBgDQoNCg0KXA0KDQoNCg0KYGBge3IgZWNobz1GQUxTRX0NCmRmLnZkYSB8PiANCiAgZmlsdGVyKCFpcy5uYSh2ZGEpKSB8PiANCiAgc3VtbWFyaXNlKA0KICAgIG4gPSBuX2Rpc3RpbmN0KGlkX29wcyksDQogICAgbcOtbmltbyA9IG1pbih2ZGEpLA0KICAgIHExID0gcXVhbnRpbGUodmRhLDAuMjUsbmFtZXMgPSBGKSwNCiAgICBtZWRpYW5hID0gbWVkaWFuKHZkYSksDQogICAgcTMgPSBxdWFudGlsZSh2ZGEsMC43NSxuYW1lcyA9IEYpLA0KICAgIG3DoXhpbW8gPSBtYXgodmRhKSwNCiAgICBtw6lkaWEgPSBtZWFuKHZkYSksDQogICAgZGVzdmlvID0gc2QodmRhKSwNCiAgICBpcXIgPSBJUVIodmRhKSwNCiAgICBjdiA9IHNkKHZkYSkvYG3DqWRpYWAsDQogICAgYXNzaW1ldHJpYSA9IG1vbWVudHM6OnNrZXduZXNzKHZkYSksDQogICAgY3VydG9zZSA9IG1vbWVudHM6Omt1cnRvc2lzKHZkYSksDQogICAgLmJ5ID0gY29udHJhdGFjYW8NCiAgKSB8Pg0KICBhcnJhbmdlKGRlc2MoY29udHJhdGFjYW8pKSB8PiANCiAgZ3Qocm93bmFtZV9jb2w9InN0dWIiLCBsb2NhbGU9InB0IikgfD4gc3ViX21pc3NpbmcoKSB8Pg0KICBmbXRfbnVtYmVyKGMoMzoxMCxhc3NpbWV0cmlhLGN1cnRvc2UpLCBkZWNpbWFscz0yKSB8PiBmbXRfcGVyY2VudChjdiwgZGVjaW1hbHM9MCkgfD4gDQogIHRhYl9vcHRpb25zKA0KICAgIGhlYWRpbmcuYWxpZ249ImxlZnQiLCBoZWFkaW5nLnRpdGxlLmZvbnQuc2l6ZT1wY3QoMTEwKSwgaGVhZGluZy5zdWJ0aXRsZS5mb250LnNpemU9cGN0KDkwKSwNCiAgICBjb2x1bW5fbGFiZWxzLmZvbnQud2VpZ2h0PSJib2xkIiwgY29sdW1uX2xhYmVscy5mb250LnNpemU9cGN0KDgwKSwNCiAgICBjb2x1bW5fbGFiZWxzLnRleHRfdHJhbnNmb3JtPSJ1cHBlcmNhc2UiLCBjb2x1bW5fbGFiZWxzLmJhY2tncm91bmQuY29sb3I9ImdyYXk5NSIsDQogICAgZGF0YV9yb3cucGFkZGluZz1weCgyKSwgcm93X2dyb3VwLnBhZGRpbmc9cHgoMiksIHJvd19ncm91cC5mb250LndlaWdodD0iYm9sZCIsDQogICAgdGFibGUuZm9udC5zaXplPXBjdCg5MCksIHNvdXJjZV9ub3Rlcy5mb250LnNpemUgPSBwY3QoNzApLA0KICApIHw+IA0KICB0YWJfaGVhZGVyKHRpdGxlID0gbWQoIioqRXN0YXTDrXN0aWNhcyBkZXNjcml0aXZhcyBkYSBWYXJpYcOnw6NvIGRhIERlc3Blc2EgQXNzaXN0ZW5jaWFsIHBvciBiZW5lZmljacOhcmlvIGRhcyBvcGVyYWRvcmFzKioiKSkNCmBgYA0KDQoNClwNCg0KDQoNCmBgYHtyIGVjaG89RkFMU0UsIGZpZy53aWR0aD05LCBmaWcuYXNwPS41fQ0KZGYucGx0IDwtIGRmLnZkYSB8PiBmaWx0ZXIoIWlzLm5hKHZkYSkpIHw+IA0KICAjIGZpbHRlcih2ZGEgPD0gMjAwMCkgfD4NCiAgbXV0YXRlKG49bigpLCAuYnkgPSBjb250cmF0YWNhbykgfD4gDQogIG11dGF0ZSgNCiAgICBvdXRsaWVyLmNvbG9yID0gaWZfZWxzZShsZ19vdXRsaWVyLCAicmVkIiwgTkEpLA0KICAgIGNvbnRyYXRhY2FvID0gZmFjdG9yKGNvbnRyYXRhY2FvLCANCiAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCJJbmRpdmlkdWFsIiwiRW1wcmVzYXJpYWwiLCJBZGVzw6NvIikpDQogICkgDQoNCmNvbnRyYXRhY2FvX24gPC0gZGYucGx0IHw+IA0KICAgIHN1bW1hcmlzZShuPW4oKSwgLmJ5ID0gY29udHJhdGFjYW8pIHw+IA0KICAgIG11dGF0ZShsYWJlbD1wYXN0ZTAoY29udHJhdGFjYW8sIiAoIixuLCIgb3BlcmFkb3JhcykiKSkgfD4gDQogICAgc2VsZWN0KC1uKSANCmNvbnRyYXRhY2FvX24gPC0gc2V0TmFtZXMoY29udHJhdGFjYW9fbiRsYWJlbCwgY29udHJhdGFjYW9fbiRjb250cmF0YWNhbykNCg0Kc3VwcHJlc3NXYXJuaW5ncyhwcmludCgNCmRmLnBsdCB8PiANCiAgZ2dwbG90KGFlcyh4PXZkYSwgeT1jb250cmF0YWNhbywgZmlsbD1jb250cmF0YWNhbykpICsNCiAgZ2VvbV9ib3hwbG90KGFscGhhPS41LCBzaG93LmxlZ2VuZD1GLCBvdXRsaWVyLmNvbG91cj1OQSwgc3RhcGxld2lkdGg9LjUpICsNCiAgIyBzdGF0X3N1bW1hcnkoZnVuLnk9bWVhbiwgZ2VvbT0icG9pbnQiLCBzaXplPTIpICsgICNkb3QgZm9yIHRoZSBtZWFuDQogIGdlb21faml0dGVyKGNvbG9yPWRmLnBsdCRvdXRsaWVyLmNvbG9yLCB3aWR0aCA9IC4zLCBhbHBoYT0uNCkgKw0KICBmYWNldF93cmFwKH5jb250cmF0YWNhbywgbmNvbCA9IDEsIHNjYWxlcyA9ICJmcmVlX3kiLCBsYWJlbGxlciA9IGFzX2xhYmVsbGVyKGNvbnRyYXRhY2FvX24pKSArDQogIHNjYWxlX2ZpbGxfYnJld2VyKHBhbGV0dGU9IkRhcmsyIiwgZGlyZWN0aW9uPS0xKSArDQogIHNjYWxlX3hfY29udGludW91cyhsYWJlbHMgPSBzY2FsZXM6OmxhYmVsX251bWJlcihiaWcubWFyayA9ICIuIiwgZGVjaW1hbC5tYXJrID0gIiwiKSkgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsDQogICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBwYW5lbC5ncmlkLm1ham9yLnggPSBlbGVtZW50X2xpbmUobGluZXR5cGUgPSAiZGFzaGVkIikpICArDQogIGxhYnMoDQogICAgdGl0bGUgPSAiQm94cGxvdCBkYSBWYXJpYcOnw6NvIGRhIERlc3Blc2EgcG9yIEJlbmVmaWNpw6FyaW8gKFZEQSkgZGFzIE9wZXJhZG9yYXMiLA0KICAgIHN1YnRpdGxlID0gIlZhbG9yZXMgZXh0cmVtb3MgKG91dGxpZXJzKSBlbSB2ZXJtZWxobyIsDQogICAgY2FwdGlvbiA9ICJGb250ZTogQU5TL0RJT1BTLCBBTlMvU0lCIiwNCiAgICB4PU5VTEwsIHk9IlZEQSAoJSkiDQogICkNCikpDQpgYGANCg0KDQpcDQoNCg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCmRmLnZkYSB8Pg0KICBmaWx0ZXIoIWlzLm5hKHZkYSkpIHw+IA0KICBtdXRhdGUoDQogICAgbGdfb3V0bGllciA9IGNhc2Vfd2hlbigNCiAgICAgIHZkYSA+PSAocXVhbnRpbGUodmRhLDAuNzUsbmEucm0gPSBUKSsxLjUqSVFSKHZkYSwgbmEucm0gPSBUKSkgfiAic3VwZXJpb3JlcyIsDQogICAgICB2ZGEgPD0gKHF1YW50aWxlKHZkYSwwLjI1LCBuYS5ybSA9IFQpLTEuNSpJUVIodmRhLCBuYS5ybSA9IFQpKSB+ICJpbmZlcmlvcmVzIiwNCiAgICAgIC5kZWZhdWx0ID0gTkENCiAgICApLA0KICAgIC5ieSA9IGNvbnRyYXRhY2FvDQogICkgfD4gDQogIHN1bW1hcmlzZSgNCiAgICBPcGVyYWRvcmFzID0gbigpLA0KICAgIE91dGxpZXJzID0gc3VtKCFpcy5uYShsZ19vdXRsaWVyKSksDQogICAgIiUiID0gT3V0bGllcnMvT3BlcmFkb3JhcywNCiAgICAiT3V0bGllcnMgaW5mZXJpb3JlcyIgPSBzdW0obGdfb3V0bGllcj09ImluZmVyaW9yZXMiLCBuYS5ybSA9IFQpLA0KICAgICJPdXRsaWVycyBzdXBlcmlvcmVzIiA9IHN1bShsZ19vdXRsaWVyPT0ic3VwZXJpb3JlcyIsIG5hLnJtID0gVCksDQogICAgLmJ5ID0gY29udHJhdGFjYW8NCiAgKSB8PiBhcnJhbmdlKGRlc2MoY29udHJhdGFjYW8pKSB8PiANCiAgZ3Qocm93bmFtZV9jb2w9InN0dWIiLCBsb2NhbGU9InB0IikgfD4gc3ViX21pc3NpbmcoKSB8Pg0KICBmbXRfcGVyY2VudCg0LCBkZWNpbWFscz0xKSB8PiANCiAgdGFiX29wdGlvbnMoDQogICAgaGVhZGluZy5hbGlnbj0ibGVmdCIsIGhlYWRpbmcudGl0bGUuZm9udC5zaXplPXBjdCgxMTApLCBoZWFkaW5nLnN1YnRpdGxlLmZvbnQuc2l6ZT1wY3QoOTApLA0KICAgIGNvbHVtbl9sYWJlbHMuZm9udC53ZWlnaHQ9ImJvbGQiLCBjb2x1bW5fbGFiZWxzLmZvbnQuc2l6ZT1wY3QoODApLA0KICAgIGNvbHVtbl9sYWJlbHMudGV4dF90cmFuc2Zvcm09InVwcGVyY2FzZSIsIGNvbHVtbl9sYWJlbHMuYmFja2dyb3VuZC5jb2xvcj0iZ3JheTk1IiwNCiAgICBkYXRhX3Jvdy5wYWRkaW5nPXB4KDIpLCByb3dfZ3JvdXAucGFkZGluZz1weCgyKSwgcm93X2dyb3VwLmZvbnQud2VpZ2h0PSJib2xkIiwNCiAgICB0YWJsZS5mb250LnNpemU9cGN0KDkwKSwgc291cmNlX25vdGVzLmZvbnQuc2l6ZSA9IHBjdCg3MCksDQogICkgfD4gDQogIHRhYl9oZWFkZXIodGl0bGUgPSBtZCgiKipWYWxvcmVzIGV4dHJlbW9zIChvdXRsaWVycykqKiIpLA0KICAgICAgICAgICAgIHN1YnRpdGxlPSJPdXRsaWVycyBpZGVudGlmaWNhZG9zIHBlbGEgbWV0b2RvbG9naWEgZGUgaW50ZXJ2YWxvIGludGVycXVhcnTDrWxpY28gKDEuNSB4IElRUikiKQ0KYGBgDQoNCg0KXA0KDQpcDQoNCg0KIyMgVkRBIGRvIHNldG9yDQoNClwNCg0KQSBtZXRvZG9sb2dpYSBkZSBjw6FsY3VsbyBkYSBWREEgZG8gc2V0b3IgcGFyYSBhcGxpY2HDp8OjbyBjb21vIGNvbXBvbmVudGUgZG8gSVJQSSBhZG90YSBhIFZEQSBtw6lkaWEgcG9uZGVyYWRhIHBlbGEgcXVhbnRpZGFkZSBkZSBiZW5lZmljacOhcmlvcyBubyBhbm8gbWFpcyByZWNlbnRlLCBhcMOzcyBhIGV4Y2x1c8OjbyBkb3MgdmFsb3JlcyBleHRyZW1vcy4gDQoNCmBgYHtyIGVjaG89RkFMU0UsIGZpZy53aWR0aD03LCBmaWcuYXNwPTEuMX0NCmRmLnBsdCA8LSBkZi52ZGEgfD4gZmlsdGVyKCFpcy5uYShsZ19vdXRsaWVyKSAmICFsZ19vdXRsaWVyKSB8PiANCiAgbXV0YXRlKGNvbnRyYXRhY2FvID0gZmFjdG9yKGNvbnRyYXRhY2FvLCBsZXZlbHM9YygiSW5kaXZpZHVhbCIsIkVtcHJlc2FyaWFsIiwiQWRlc8OjbyIpKSkgDQoNCmNvbnRyYXRhY2FvX24gPC0gZGYucGx0IHw+IA0KICAgIHN1bW1hcmlzZShuPW4oKSwgLmJ5ID0gY29udHJhdGFjYW8pIHw+IA0KICAgIG11dGF0ZShsYWJlbD1wYXN0ZTAoY29udHJhdGFjYW8sIiAobj0iLG4sIiBvcGVyYWRvcmFzKSIpKSB8PiANCiAgICBzZWxlY3QoLW4pIA0KY29udHJhdGFjYW9fbiA8LSBzZXROYW1lcyhjb250cmF0YWNhb19uJGxhYmVsLCBjb250cmF0YWNhb19uJGNvbnRyYXRhY2FvKQ0KDQptZWRpYVAgPC0gZGYucGx0IHw+IA0KICBzdW1tYXJpc2UoZ3IubWVkaWFQID0gd2VpZ2h0ZWQubWVhbih2ZGEsIHc9YmVuZWZtX2FubzIpLCAuYnk9Y29udHJhdGFjYW8pIHw+IA0KICBtdXRhdGUoYmVuZWZtX2FubzI9LjIpDQoNCmRmLnBsdCB8PiANCiAgZ2dwbG90KGFlcyh4PXZkYSwgZmlsbD1jb250cmF0YWNhbywgY29sb3I9Y29udHJhdGFjYW8sIHdlaWdodD1iZW5lZm1fYW5vMikpICsNCiAgZ2VvbV9oaXN0b2dyYW0oYWVzKHk9YWZ0ZXJfc3RhdChkZW5zaXR5KSksIGFscGhhPS41LCBiaW53aWR0aD0xKSArDQogICMgZ2VvbV9kZW5zaXR5KGFscGhhPS40LCBhZGp1c3Q9LjUpICsgDQogIGdlb21fdmxpbmUoZGF0YT1tZWRpYVAsIGFlcyh4aW50ZXJjZXB0PWdyLm1lZGlhUCksIGNvbG9yPSJibGFjayIpICsNCiAgZ2VvbV90ZXh0KGRhdGE9bWVkaWFQLCANCiAgICAgICAgICAgIGFlcyh4PWdyLm1lZGlhUCwgeT1iZW5lZm1fYW5vMiwgDQogICAgICAgICAgICAgICAgbGFiZWw9cGFzdGUwKCJNw6lkaWEgcG9uZGVyYWRhOiAiLHNjYWxlczo6bnVtYmVyKGdyLm1lZGlhUCwgYWNjdXJhY3k9LjAxKSwiJSIpKSwNCiAgICAgICAgICAgIG51ZGdlX3ggPSAxLCBjb2xvciA9ICJibGFjayIsIHNpemU9MywgaGp1c3Q9MCkgKw0KICBmYWNldF93cmFwKH5jb250cmF0YWNhbywgbmNvbCA9IDEsIGxhYmVsbGVyID0gYXNfbGFiZWxsZXIoY29udHJhdGFjYW9fbiksIHNjYWxlcz0iZnJlZV95IikgKw0KICANCiAgc2NhbGVfY29sb3JfYnJld2VyKHBhbGV0dGU9IkRhcmsyIiwgZGlyZWN0aW9uPS0xKSArDQogIHNjYWxlX2ZpbGxfYnJld2VyKHBhbGV0dGU9IkRhcmsyIiwgZGlyZWN0aW9uPS0xKSArDQogIHNjYWxlX3hfY29udGludW91cyhleHBhbmQgPSBleHBhbnNpb24obXVsdD1jKDAuMDEsMC4wMSkpLCBicmVha3M9c2NhbGVzOjpicmVha3Nfd2lkdGgoMTApKSArDQogIHNjYWxlX3lfY29udGludW91cyhleHBhbmQgPSBleHBhbnNpb24obXVsdCA9IGMoMCwuMSkpKSArDQogICMgY29vcmRfY2FydGVzaWFuKHhsaW09YygtMTAsNjUpKSArDQogIA0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsDQogICAgICAgIHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2xpbmUobGluZXR5cGU9ImRhc2hlZCIpKSAgKw0KICBsYWJzKA0KICAgIHRpdGxlID0gIkhpc3RvZ3JhbWEgZGEgdmFyaWHDp8OjbyBkYSBkZXNwZXNhIHBvciBiZW5lZmljacOhcmlvIChWREEpIGRhcyBPcGVyYWRvcmFzIiwNCiAgICBzdWJ0aXRsZT0iRnJlcXXDqm5jaWEgcG9uZGVyYWRhIHBlbG8gdGFtYW5obyBkYSBjYXJ0ZWlyYSBkYSBvcGVyYWRvcmEuIEV4Y2x1aSB2YWxvcmVzIGV4dHJlbW9zLiIsDQogICAgY2FwdGlvbiA9IHBhc3RlMCgNCiAgICAgICJGb250ZTogQU5TL0RJT1BTLCBBTlMvU0lCXG4iLA0KICAgICAgIk5vdGFzOiBFeGNsdWkgdmFsb3JlcyBleHRyZW1vcyBwZWxhIG1ldG9kb2xvZ2lhIGRlIGludGVydmFsbyBpbnRlcnF1YXJ0w61saWNvIChib3hwbG90KS4iDQogICAgKSwNCiAgICB5PSJEZW5zaWRhZGUiLA0KICAgIHg9IlZEQSAoJSkgLSBpbnRlcnZhbG9zOiAxIHB0IHBlcmNlbnR1YWwiDQogICkgDQpgYGANCg0KXA0KDQpgYGB7ciBpbmNsdWRlPUZBTFNFfQ0Kcm0oZGYucGx0LCBtZWRpYVAsIGNvbnRyYXRhY2FvX24sIGRmLnZkYTApOyBnYygpDQpgYGANCg0KXA0KDQpcDQoNCiMjIEJhc2UgZGUgY8OhbGN1bG8NCg0KDQpcDQoNCkdlcmEgdW1hIGJhc2UgY29tcGxldGEgcXVlIHJlw7puZSB0b2RhcyBhcyBvYnNlcnZhw6fDtWVzIGRvcyBkb2lzIGFub3MgZSBvIGPDoWxjdWxvIGRhIFZEQSBwYXJhIGdyYXZhci4NCg0KYGBge3IgaW5jbHVkZT1GQUxTRX0NCiMgR0VSQSBPIENBRE9QIE5PVkFNRU5URSBDT00gTk9NRVMgREUgT1BFUkFET1JBUyBBUMOTUyBUUkFUQU1FTlRPIGUgIkxHXyIgQUxURVJBRE8gUEFSQSAxLzANCnRhLmNhZG9wIDwtIGxlZnRfam9pbigNCiAgdGEuY2Fkb3AgfD4gc2VsZWN0KC1yYXphb19zb2NpYWwpLA0KICBhcnJvdzo6cmVhZF9wYXJxdWV0KCJfZGF0YXNldHMvdndfY2Fkb3AucGFycXVldCIpIHw+IHNlbGVjdChpZF9vcHMsIHJhemFvX3NvY2lhbCksIA0KICBqb2luX2J5KGlkX29wcykNCikgfD4gDQogIG11dGF0ZShhY3Jvc3Moc3RhcnRzX3dpdGgoImxnXyIpLCB+aWZfZWxzZSgueCwgMUwsIDBMKSkpDQpgYGANCg0KDQoNCg0KXA0KDQpgYGB7cn0NCmRmLnJldW5pZGEgPC0gIGZ1bGxfam9pbigNCiAgc2liIHw+IA0KICAgIG11dGF0ZShhbm8gPSBpZl9lbHNlKGFubz09eWVhcihwZXJpb2RvWzFdKSwiYW5vMSIsImFubzIiKSwNCiAgICAgICAgICAgbGdfZXhjbF9iZW5lZiA9IGlmX2Vsc2UobGdfZXhjbF9iZW5lZiwxTCwwTCkpIHw+IA0KICAgIHBpdm90X3dpZGVyKG5hbWVzX2Zyb209YW5vLCB2YWx1ZXNfZnJvbT1iZW5lZm0sIHZhbHVlc19maWxsPTAsIG5hbWVzX3ByZWZpeD0iYmVuXyIpLCANCiAgZGlvcHMgfD4gDQogICAgbXV0YXRlKGFubyA9IGlmX2Vsc2UoYW5vPT15ZWFyKHBlcmlvZG9bMV0pLCJhbm8xIiwiYW5vMiIpLA0KICAgICAgICAgICBsZ19leGNsX2Rlc3Blc2EgPSBpZl9lbHNlKGxnX2V4Y2xfZGVzcGVzYSwxTCwwTCkpIHw+IA0KICAgIHBpdm90X3dpZGVyKG5hbWVzX2Zyb209YW5vLCB2YWx1ZXNfZnJvbT1jKGRlc3Blc2EsIHJlY2VpdGEpLCB2YWx1ZXNfZmlsbD0wKSwgDQogIGpvaW5fYnkoaWRfb3BzLCBjb250cmF0YWNhbykNCikgfD4gDQogIA0KICBtdXRhdGUoDQogICAgIyBDYWxjdWxhIGRlc3Blc2EgcG9yIGJlbmVmaWNpw6FyaW8gbm9zIGRvaXMgYW5vcw0KICAgIGRwYl9hbm8xID0gaWZfZWxzZShkZXNwZXNhX2FubzE+MCAmIGJlbl9hbm8xPjAsIGRlc3Blc2FfYW5vMS9iZW5fYW5vMS8xMiwgTkEpLA0KICAgIGRwYl9hbm8yID0gaWZfZWxzZShkZXNwZXNhX2FubzI+MCAmIGJlbl9hbm8yPjAsIGRlc3Blc2FfYW5vMi9iZW5fYW5vMi8xMiwgTkEpLA0KICApIHw+IA0KICANCiAgIyBJbmNsdWkgZmxhZ3MgZGUgb3BlcmFkb3JhcyBleGNsdcOtZGFzIHBvciBvdXRyb3MgbW90aXZvcw0KICBpbm5lcl9qb2luKHRhLmNhZG9wLCBqb2luX2J5KGlkX29wcykpIHw+IA0KICANCiAgZnVsbF9qb2luKA0KICAgIGRmLnZkYSB8PiBzZWxlY3QoaWRfb3BzLCBjb250cmF0YWNhbywgbGdfb3V0bGllciwgdmRhKSB8PiANCiAgICAgIG11dGF0ZShsZ19vdXRsaWVyID0gaWZfZWxzZShsZ19vdXRsaWVyLDFMLDBMKSksIA0KICAgIGpvaW5fYnkoaWRfb3BzLCBjb250cmF0YWNhbykNCiAgKSB8PiANCiAgDQogIHNlbGVjdChpZF9vcHMsIHJhemFvX3NvY2lhbCwgbW9kYWxpZGFkZSwgY29udHJhdGFjYW8sIA0KICAgICAgICAgc3RhcnRzX3dpdGgoJ2xnXycpLCBzdGFydHNfd2l0aCgncmVjZWl0YScpLCBzdGFydHNfd2l0aCgnZGVzcGVzYScpLCBzdGFydHNfd2l0aCgnYmVuJyksIA0KICAgICAgICAgZXZlcnl0aGluZygpKSB8PiANCiAgDQogIG11dGF0ZSgNCiAgICAjIFNlIGEgdmFyacOhdmVsIGVzdGl2ZXIgemVyYWRhLCB0cmFuc2Zvcm1hIGVtIHZhemlvDQogICAgYWNyb3NzKHJlY2VpdGFfYW5vMTpiZW5fYW5vMiwgfm5hX2lmKC54LCAwKSksDQogICAgIyBTZSBvIGZsYWcgZGUgZXhjbHVzw6NvIGVzdGl2ZXIgdmF6aW8sIG1hcmNhIGNvbW8gZXhjbHVzw6NvDQogICAgYWNyb3NzKGxnX2V4Y2xfYmVuZWY6bGdfcmVzc2FsdmEsIH5pZl9lbHNlKGlzLm5hKC54KSwxTCwueCkpDQogICkgfD4gDQogICMgRXhjbHVpIG9ic2VydmHDp8O1ZXMgcXVlIG7Do28gdGVuaGFtIG5lbSBpbmZvcm1hw6fDo28gZGUgZGVzcGVzYSBuZW0gZGUgYmVuZWZpY2nDoXJpb3MgZGEgYmFzZQ0KICBmaWx0ZXIoICEoaXMubmEoZGVzcGVzYV9hbm8xKSAmIGlzLm5hKGRlc3Blc2FfYW5vMikgJiBpcy5uYShiZW5fYW5vMSkgJiBpcy5uYShiZW5fYW5vMikpICkNCmBgYA0KDQoNCg0KXA0KDQpSZXByZXNlbnRhdGl2aWRhZGUgZGUgYmFzZSBkZSBjw6FsY3VsbyBkYSBWREEgKGFww7NzIGV4Y2x1c8O1ZXMgcG9yIGRhZG9zIGluY29tcGxldG9zLCByZXNzYWx2YSwgaW7DrWNpbyBkZSBvcGVyYcOnw6NvIG91IGNhbmNlbGFtZW50byBkZSByZWdpc3Rybykgc29icmUgYXMgYmFzZXMgZXh0cmHDrWRhcyBkb3Mgc2lzdGVtYXMgZGUgb3JpZ2VtLg0KDQoNCmBgYHtyIGVjaG89RkFMU0UsIGZpZy5hc3A9LjgsIGZpZy53aWR0aD00fQ0KZGYucmV1bmlkYSB8PiANCiAgc3VtbWFyaXNlKA0KICAgICIlIEJlbmVmaWNpw6FyaW9zIiA9IHN1bShiZW5fYW5vMlshaXMubmEodmRhKV0pL3N1bShiZW5fYW5vMiwgbmEucm0gPSBUKSwNCiAgICAiJSBPcGVyYWRvcmFzIChTSUIpIiA9IHN1bSghaXMubmEodmRhKSkvc3VtKCFpcy5uYShiZW5fYW5vMikpLA0KICAgICIlIERlc3Blc2EiID0gc3VtKGRlc3Blc2FfYW5vMlshaXMubmEodmRhKV0pL3N1bShkZXNwZXNhX2FubzIsIG5hLnJtID0gVCksDQogICAgIiUgT3BlcmFkb3JhcyAoRElPUFMpIiA9IHN1bSghaXMubmEodmRhKSkvc3VtKCFpcy5uYShkZXNwZXNhX2FubzIpKSwNCiAgICAuYnkgPSBjb250cmF0YWNhbw0KICApIHw+IA0KICBwaXZvdF9sb25nZXIoY29scyA9IDI6NSwgdmFsdWVzX3RvID0gInBlcmNlbnR1YWwiLCBuYW1lc190byA9ICdNZXRyaWNhJykgfD4gDQogIG11dGF0ZShNZXRyaWNhID0gZmFjdG9yKE1ldHJpY2EsIGxldmVscz1jKCIlIEJlbmVmaWNpw6FyaW9zIiwiJSBPcGVyYWRvcmFzIChTSUIpIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiUgRGVzcGVzYSIsICIlIE9wZXJhZG9yYXMgKERJT1BTKSIpKSkgfD4gDQogIGdncGxvdChhZXMoeCA9IGNvbnRyYXRhY2FvLCB5PXBlcmNlbnR1YWwpKSArDQogIGdlb21fY29sKGZpbGwgPSAic2xhdGVncmF5NCIsd2lkdGg9Ljc1KSArDQogIGdlb21fdGV4dChhZXMobGFiZWwgPSBzY2FsZXM6OnBlcmNlbnQocGVyY2VudHVhbCwgYWNjdXJhY3kgPSAuMSksIHZqdXN0ID0gMiksIA0KICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSgxKSwgc2l6ZT0zLCBjb2xvciA9ICJ3aGl0ZSIpICsNCiAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcz1OVUxMLCBleHBhbmQgPSBleHBhbnNpb24obXVsdCA9IGMoMCwwKSksDQogICAgICAgICAgICAgICAgICAgICBsaW1pdHMgPSBjKDAsMSkpICsNCiAgdGhlbWUocGFuZWwuZ3JpZC5tYWpvci54ID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBheGlzLnRleHQ9ZWxlbWVudF90ZXh0KHNpemU9OCkpICsNCiAgbGFicyh4PU5VTEwsIHk9TlVMTCwgDQogICAgICAgdGl0bGUgPSAiUmVwcmVzZW50YXRpdmlkYWRlIGRhIGFtb3N0cmEiLA0KICAgICAgIHN1YnRpdGxlID0gIiUgZGEgYmFzZSBvcmlnaW5hbCIpICsNCiAgZmFjZXRfd3JhcChNZXRyaWNhIH4gLiwgbnJvdyA9IDIpDQpgYGANCg0KXA0KDQpgYGB7ciBlY2hvPUZBTFNFfQ0KZGYucmV1bmlkYSB8PiANCiAgc3VtbWFyaXNlKA0KICAgIEJlbmVmaWNpw6FyaW9zID0gc3VtKGJlbl9hbm8yLCBuYS5ybSA9IFQpLA0KICAgICJCZW5lZmljacOhcmlvcyBWREEiID0gc3VtKGJlbl9hbm8yWyFpcy5uYSh2ZGEpXSwgbmEucm0gPSBUKSwNCiAgICAiJSIgPSBgQmVuZWZpY2nDoXJpb3MgVkRBYC9gQmVuZWZpY2nDoXJpb3NgLA0KICAgIC5ieSA9IGNvbnRyYXRhY2FvDQogICkgfD4gDQogIGd0KHJvd25hbWVfY29sPSJzdHViIiwgbG9jYWxlPSJwdCIpIHw+IHN1Yl9taXNzaW5nKCkgfD4NCiAgZm10X2ludGVnZXIoMjozKSB8PiBmbXRfcGVyY2VudCg0LCBkZWNpbWFscz0xKSB8PiANCiAgdGFiX29wdGlvbnMoDQogICAgaGVhZGluZy5hbGlnbj0ibGVmdCIsIGhlYWRpbmcudGl0bGUuZm9udC5zaXplPXBjdCgxMTApLCBoZWFkaW5nLnN1YnRpdGxlLmZvbnQuc2l6ZT1wY3QoOTApLA0KICAgIGNvbHVtbl9sYWJlbHMuZm9udC53ZWlnaHQ9ImJvbGQiLCBjb2x1bW5fbGFiZWxzLmZvbnQuc2l6ZT1wY3QoODApLA0KICAgIGNvbHVtbl9sYWJlbHMudGV4dF90cmFuc2Zvcm09InVwcGVyY2FzZSIsIGNvbHVtbl9sYWJlbHMuYmFja2dyb3VuZC5jb2xvcj0iZ3JheTk1IiwNCiAgICBkYXRhX3Jvdy5wYWRkaW5nPXB4KDIpLCByb3dfZ3JvdXAucGFkZGluZz1weCgyKSwgcm93X2dyb3VwLmZvbnQud2VpZ2h0PSJib2xkIiwNCiAgICB0YWJsZS5mb250LnNpemU9cGN0KDkwKSwgc291cmNlX25vdGVzLmZvbnQuc2l6ZSA9IHBjdCg3MCksDQogICkgfD4gDQogIHRhYl9oZWFkZXIodGl0bGUgPSBtZCgiKipSZXByZXNlbnRhdGl2aWRhZGUgZGEgYW1vc3RyYSAtIEJlbmVmaWNpw6FyaW9zKioiKSkNCmBgYA0KDQoNCg0KYGBge3IgZXZhbD1GQUxTRSwgaW5jbHVkZT1GQUxTRX0NCnJtKGRmLnZkYSkNCmRmcyA8LSBscygpW3NhcHBseShtZ2V0KGxzKCksIC5HbG9iYWxFbnYpLCBpcy5kYXRhLmZyYW1lKV0NCmZvciAoZGYgaW4gZGZzKSB7DQogIGdldChkZikgfD4NCiAgICBtdXRhdGUoYWNyb3NzKHdoZXJlKGlzLmZhY3RvciksIH4gZW5jMnV0ZjgoYXMuY2hhcmFjdGVyKC54KSkpKSB8Pg0KICAgIG11dGF0ZShhY3Jvc3Mod2hlcmUoaXMuY2hhcmFjdGVyKSwgfiBlbmMydXRmOChhcy5jaGFyYWN0ZXIoLngpKSkpIHw+DQogICAgd3JpdGUuY3N2MigNCiAgICAgIHN0cl9jKGMoIkRvY3VtZW50b3MvX2Jhc2VzUi8iLCBkZiwgIi5jc3YiKSwgc2VwID0gIiIsIGNvbGxhcHNlID0gIiIpLA0KICAgICAgcm93Lm5hbWVzPUZBTFNFLCBmaWxlRW5jb2Rpbmc9IlVURi04IiwgbmE9IiINCiAgICApDQp9DQpyZW1vdmUoZGYsIGRmcykNCmBgYA0KDQoNCioqKg0KDQoNCiMgR2xvc3PDoXJpbyAgICANCg0KKipCZW5lZmljacOhcmlvKio6IEluZGl2w61kdW8gKHBlc3NvYSBmw61zaWNhKSBiZW5lZmljacOhcmlvIGRlIGNvYmVydHVyYSBkZSBwbGFubyBwcml2YWRvIGRlIGFzc2lzdMOqbmNpYSDDoCBzYcO6ZGUgZSBjb25zdW1pZG9yIGRlIHNlcnZpw6dvcyBkZSBhc3Npc3TDqm5jaWEgw6Agc2HDumRlLiAgICAgICAgICAgICAgDQoNCioqQ29udHJhdGFudGUqKjogUGVzc29hIGbDrXNpY2Egb3UganVyw61kaWNhIHJlc3BvbnPDoXZlbCBwZWxhIGNvbnRyYXRhw6fDo28gZG8gcGxhbm8gcHJpdmFkbyBkZSBhc3Npc3TDqm5jaWEgw6Agc2HDumRlLiAgICAgICAgICANCg0KKipPcGVyYWRvcmEqKjogUGVzc29hIGp1csOtZGljYSBjb25zdGl0dcOtZGEgc29iIGEgbW9kYWxpZGFkZSBkZSBzb2NpZWRhZGUgY2l2aWwgb3UgY29tZXJjaWFsLCBjb29wZXJhdGl2YSBvdSBlbnRpZGFkZSBkZSBhdXRvZ2VzdMOjbywgcXVlIG9wZXJlIHByb2R1dG8sIHNlcnZpw6dvIG91IGNvbnRyYXRvIGRlIHBsYW5vIHByaXZhZG8gZGUgYXNzaXN0w6puY2lhIMOgIHNhw7pkZS4gICAgICAgICAgICAgDQoNCioqUGxhbm8gUHJpdmFkbyBkZSBBc3Npc3TDqm5jaWEgw6AgU2HDumRlKio6IFByZXN0YcOnw6NvIGNvbnRpbnVhZGEgZGUgc2VydmnDp29zIG91IGNvYmVydHVyYSBkZSBjdXN0b3MgYXNzaXN0ZW5jaWFpcyBhIHByZcOnbyBwcsOpIG91IHDDs3MgZXN0YWJlbGVjaWRvLCBwb3IgcHJhem8gaW5kZXRlcm1pbmFkbywgY29tIGEgZmluYWxpZGFkZSBkZSBnYXJhbnRpciwgc2VtIGxpbWl0ZSBmaW5hbmNlaXJvLCBhIGFzc2lzdMOqbmNpYSDDoCBzYcO6ZGUsIHBlbGEgZmFjdWxkYWRlIGRlIGFjZXNzbyBlIGF0ZW5kaW1lbnRvIHBvciBwcm9maXNzaW9uYWlzIG91IHNlcnZpw6dvcyBkZSBzYcO6ZGUsIGxpdnJlbWVudGUgZXNjb2xoaWRvcywgaW50ZWdyYW50ZXMgb3UgbsOjbyBkZSByZWRlIGNyZWRlbmNpYWRhLCBjb250cmF0YWRhIG91IHJlZmVyZW5jaWFkYSwgdmlzYW5kbyBhIGFzc2lzdMOqbmNpYSBtw6lkaWNhLCBob3NwaXRhbGFyIGUgb2RvbnRvbMOzZ2ljYSwgYSBzZXIgcGFnYSBpbnRlZ3JhbCBvdSBwYXJjaWFsbWVudGUgw6BzIGV4cGVuc2FzIGRhIG9wZXJhZG9yYSBjb250cmF0YWRhLCBtZWRpYW50ZSByZWVtYm9sc28gb3UgcGFnYW1lbnRvIGRpcmV0byBhbyBwcmVzdGFkb3IsIHBvciBjb250YSBlIG9yZGVtIGRvIGNvbnN1bWlkb3IuICAgICAgICAgICAgIA0KDQoqKlRpcG8gZGUgY29udHJhdGHDp8OjbyoqOiAgICAgICAgICAgDQoNCiAgKyAqSW5kaXZpZHVhbCBvdSBGYW1pbGlhciosIG9mZXJlY2UgY29iZXJ0dXJhIGRhIGF0ZW7Dp8OjbyBwcmVzdGFkYSBwYXJhIGEgbGl2cmUgYWRlc8OjbyBkZSBiZW5lZmljacOhcmlvcywgcGVzc29hcyBuYXR1cmFpcywgY29tIG91IHNlbSBncnVwbyBmYW1pbGlhciAgICAgICAgICAgIA0KICANCiAgKyAqQ29sZXRpdm8gZW1wcmVzYXJpYWwqLCBxdWFuZG8gYSBjb250cmF0YcOnw6NvIMOpIGZlaXRhIHBvciBtZWlvIGRlIHBlc3NvYSBqdXLDrWRpY2EgcGFyYSBhIGNvYmVydHVyYSBkZSBwZXNzb2FzIGEgZWxhIHZpbmN1bGFkYXMgcG9yIHJlbGHDp8OjbyBlbXByZWdhdMOtY2lhIG91IGVzdGF0dXTDoXJpYSAgICAgICAgICAgDQogIA0KICArICpDb2xldGl2byBwb3IgYWRlc8OjbyosIHF1YW5kbyBhIGNvbnRyYXRhw6fDo28gw6kgZmVpdGEgcG9yIG1laW8gZGUgcGVzc29hIGp1csOtZGljYSBkZSBjYXLDoXRlciBwcm9maXNzaW9uYWwsIGNsYXNzaXN0YSBvdSBzZXRvcmlhbCAoZS5nLiBjb25zZWxob3MgcHJvZmlzc2lvbmFpcywgZW50aWRhZGVzIGRlIGNsYXNzZSwgc2luZGljYXRvcywgY29vcGVyYXRpdmFzLCBldGMuKSAgICAgICAgICAgIA0KICANCiAgICAgICAgICAgICAgDQogICAgICAgICAgICAgIA0KKipUaXBvIGRlIGZpbmFuY2lhbWVudG8qKjogICAgICAgICAgICAgICANCg0KICArICpQcsOpLWVzdGFiZWxlY2lkbyosIHF1YW5kbyBvIHZhbG9yIGRhIGNvbnRyYXByZXN0YcOnw6NvIHBlY3VuacOhcmlhIMOpIHByw6ktZml4YWRvIG1lZGlhbnRlIG5lZ29jaWHDp8OjbyBhbnVhbCwgY2FyYWN0ZXJpemFuZG8gY29udHJhdG8gZGUgcmlzY28uICAgICAgICAgICAgDQogIA0KICArICpQw7NzLWVzdGFiZWxlY2lkbyosIHF1YW5kbyBvIHZhbG9yIGRhIGNvbnRyYXByZXN0YcOnw6NvIHBlY3VuacOhcmlhIMOpIGVzdGFiZWxlY2lkbyBhcMOzcyBhIG9jb3Jyw6puY2lhIGRvcyBwcm9jZWRpbWVudG9zIGRlIGFzc2lzdMOqbmNpYSDDoCBzYcO6ZGUuICAgICAgICAgICAgICAgDQo=