── Attaching core tidyverse packages ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── tidyverse 2.0.0 ──
✔ dplyr     1.1.4     ✔ readr     2.1.5
✔ forcats   1.0.0     ✔ stringr   1.5.1
✔ ggplot2   3.5.2     ✔ tibble    3.2.1
✔ lubridate 1.9.4     ✔ tidyr     1.3.1
✔ purrr     1.0.4     ── Conflicts ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── tidyverse_conflicts() ──
✖ dplyr::filter() masks stats::filter()
✖ dplyr::lag()    masks stats::lag()
ℹ Use the ]8;;http://conflicted.r-lib.org/conflicted package]8;; to force all conflicts to become errors
Attaching package: ‘broom’

The following object is masked _by_ ‘.GlobalEnv’:

    bootstrap


Attaching package: ‘modelr’

The following object is masked _by_ ‘.GlobalEnv’:

    bootstrap

The following object is masked from ‘package:broom’:

    bootstrap

Dados da CAPES sobre avaliação da pós-graduação

A CAPES é um órgão do MEC que tem a atribuição de acompanhar a pós-graduação na universidade brasileira. Uma das formas que ela encontrou de fazer isso e pela qual ela é bastante criticada é através de uma avaliação quantitativa a cada x anos (era 3, mudou para 4).

Usaremos dados da penúltima avaliação da CAPES:

cacc_tudo = read_projectdata()

glimpse(cacc_tudo)
Rows: 73
Columns: 31
$ Instituição                  <chr> "UNIVERSIDADE FEDERAL DO AMAZONAS", "UNIVERSIDADE FEDERAL DO PARÁ", "UNIVERSIDADE FEDERAL DO MARANHÃO", "UNIVERSIDADE ESTADUAL DO MARANHÃO", "FUNDA…
$ Programa                     <chr> "INFORMÁTICA (12001015012P2)", "CIÊNCIA DA COMPUTAÇÃO (15001016047P9)", "CIÊNCIA DA COMPUTAÇÃO (20001010022P0)", "ENGENHARIA DE COMPUTAÇÃO E SISTEM…
$ Nível                        <int> 5, 4, 3, 3, 3, 5, 4, 3, 3, 3, 5, 3, 3, 3, 4, 6, 3, 3, 3, 3, 3, 3, 4, 3, 4, 3, 4, 7, 4, 5, 7, 3, 4, 7, 3, 3, 3, 3, 4, 4, 4, 4, 3, 6, 3, 6, 7, 4, 3, …
$ Sigla                        <chr> "UFAM", "UFPA", "UFMA", "UEMA", "FUFPI", "UFC", "UNIFOR", "UECE/Prof", "UECE", "IFCE", "UFRN", "UFRN/Prof", "UERN/UFERSA", "UFPB/J.P", "UFCG", "UFP…
$ `Tem doutorado`              <chr> "Sim", "Sim", "Não", "Não", "Não", "Sim", "Sim", "Não", "Não", "Não", "Sim", "Não", "Não", "Não", "Sim", "Sim", "Não", "Não", "Não", "Não", "Não", …
$ `Docentes colaboradores`     <dbl> 0.25, 5.50, 3.00, 6.25, 1.75, 2.00, 1.00, 6.25, 2.75, 0.75, 2.25, 2.00, 4.25, 5.00, 9.25, 22.25, 8.50, 3.50, 6.50, 13.75, 5.75, 3.75, 3.00, 0.50, 3…
$ `Docentes permanentes`       <dbl> 24.75, 14.00, 10.00, 14.00, 9.50, 20.75, 16.00, 15.75, 8.50, 9.00, 26.25, 8.50, 13.50, 20.00, 31.00, 58.50, 32.00, 14.00, 10.75, 12.50, 14.00, 17.2…
$ `Docentes visitantes`        <dbl> 0.00, 0.00, 0.00, 0.00, 0.00, 0.75, 0.50, 1.00, 0.50, 0.00, 0.00, 0.00, 0.50, 0.00, 0.00, 0.00, 0.00, 0.50, 0.75, 4.00, 0.00, 0.50, 0.00, 0.00, 0.0…
$ `Resumos em conf`            <int> 20, 23, 15, 5, 4, 10, 6, 136, 0, 24, 27, 4, 30, 20, 5, 14, 49, 63, 33, 3, 8, 3, 17, 14, 19, 6, 23, 69, 46, 33, 29, 5, 9, 29, 0, 1, 47, 21, 10, 7, 2…
$ `Resumos expandidos em conf` <int> 25, 24, 7, 10, 1, 68, 9, 13, 4, 6, 16, 5, 25, 29, 28, 81, 65, 38, 14, 6, 18, 101, 58, 26, 27, 6, 22, 75, 44, 48, 67, 10, 24, 100, 10, 3, 9, 9, 14, …
$ `Artigos em conf`            <int> 390, 284, 115, 73, 150, 269, 179, 0, 120, 92, 389, 60, 127, 322, 338, 763, 585, 132, 255, 79, 185, 124, 277, 255, 230, 130, 336, 359, 288, 504, 367…
$ Dissertacoes                 <int> 108, 77, 50, 25, 31, 75, 60, 129, 45, 3, 108, 12, 94, 108, 104, 433, 92, 26, 71, 93, 23, 54, 0, 41, 8, 41, 110, 154, 101, 110, 146, 55, 89, 213, 73…
$ Teses                        <int> 14, 0, 0, 0, 0, 24, 5, 0, 0, 0, 29, 0, 0, 0, 40, 144, 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 5, 87, 16, 56, 68, 0, 0, 49, 0, 0, 0, 0, 4, 0, 0, 34, 0, 57, 0…
$ periodicos_A1                <int> 15, 19, 5, 1, 7, 21, 21, 0, 3, 8, 44, 0, 6, 21, 20, 93, 70, 16, 16, 0, 22, 8, 7, 11, 17, 2, 23, 46, 21, 52, 30, 3, 8, 90, 11, 5, 1, 8, 17, 20, 11, …
$ periodicos_A2                <int> 19, 21, 11, 1, 4, 32, 13, 0, 9, 2, 23, 2, 6, 20, 15, 43, 23, 5, 5, 1, 12, 4, 25, 18, 17, 2, 14, 89, 46, 52, 47, 3, 9, 95, 5, 2, 3, 3, 12, 11, 8, 24…
$ periodicos_B1                <int> 19, 38, 7, 3, 6, 26, 16, 2, 6, 4, 32, 4, 2, 11, 29, 51, 29, 11, 8, 1, 14, 6, 18, 16, 17, 4, 6, 59, 34, 34, 29, 2, 10, 46, 13, 2, 6, 8, 19, 8, 7, 19…
$ periodicos_B2                <int> 1, 12, 2, 6, 0, 0, 11, 0, 0, 2, 1, 0, 0, 4, 1, 10, 6, 1, 2, 0, 1, 3, 2, 1, 1, 0, 2, 11, 7, 10, 3, 1, 2, 11, 0, 7, 1, 3, 8, 1, 0, 5, 1, 15, 12, 33, …
$ periodicos_B3                <int> 3, 16, 2, 2, 3, 16, 15, 0, 4, 6, 9, 0, 2, 6, 16, 20, 13, 9, 2, 0, 12, 0, 6, 5, 6, 3, 1, 19, 10, 21, 11, 4, 12, 26, 1, 7, 0, 0, 13, 8, 4, 24, 5, 24,…
$ periodicos_B4                <int> 0, 4, 0, 3, 3, 0, 1, 3, 1, 6, 0, 0, 4, 5, 1, 3, 3, 5, 3, 0, 4, 2, 2, 2, 2, 0, 0, 4, 4, 3, 0, 3, 0, 3, 1, 3, 2, 5, 7, 0, 0, 5, 0, 6, 6, 22, 8, 2, 2,…
$ periodicos_B5                <int> 10, 16, 8, 4, 12, 4, 16, 2, 6, 2, 11, 0, 4, 16, 9, 29, 18, 16, 18, 0, 3, 15, 6, 6, 4, 5, 2, 29, 20, 11, 7, 2, 8, 19, 10, 5, 7, 2, 3, 1, 6, 15, 4, 1…
$ periodicos_C                 <int> 9, 34, 12, 5, 2, 3, 11, 9, 5, 10, 16, 1, 14, 28, 8, 19, 24, 23, 9, 0, 7, 26, 10, 2, 2, 16, 6, 10, 16, 5, 14, 2, 15, 6, 3, 5, 4, 19, 22, 6, 1, 9, 2,…
$ periodicos_NA                <int> 7, 15, 8, 11, 12, 6, 19, 31, 7, 14, 19, 0, 27, 26, 18, 29, 19, 21, 25, 0, 7, 43, 18, 4, 14, 6, 15, 24, 32, 16, 15, 15, 25, 22, 11, 6, 9, 17, 3, 10,…
$ per_comaluno_A1              <int> 4, 1, 0, 0, 1, 7, 5, 0, 1, 0, 10, 0, 0, 2, 8, 63, 1, 1, 3, 0, 5, 0, 3, 1, 1, 0, 12, 12, 9, 13, 10, 2, 2, 40, 2, 0, 0, 4, 0, 9, 5, 11, 1, 12, 3, 96,…
$ per_comaluno_A2              <int> 5, 5, 5, 0, 2, 15, 3, 0, 3, 0, 3, 0, 0, 1, 11, 22, 0, 0, 0, 0, 2, 0, 13, 2, 3, 1, 6, 39, 9, 23, 21, 0, 1, 42, 2, 0, 1, 3, 3, 5, 2, 11, 1, 10, 4, 41…
$ per_comaluno_B1              <int> 4, 2, 5, 2, 2, 14, 6, 0, 2, 0, 17, 0, 1, 5, 18, 37, 0, 1, 1, 0, 2, 0, 9, 0, 1, 0, 2, 21, 10, 15, 14, 2, 1, 25, 6, 0, 1, 2, 7, 4, 2, 8, 2, 18, 7, 56…
$ per_comaluno_B2              <int> 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 4, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 1, 1, 2, 1, 0, 0, 5, 0, 0, 1, 3, 1, 1, 0, 1, 1, 1, 3, 9, 9, 1, 0, …
$ per_comaluno_B3              <int> 2, 2, 0, 1, 0, 7, 9, 0, 2, 0, 4, 0, 0, 1, 10, 12, 0, 0, 0, 0, 2, 0, 6, 4, 0, 0, 1, 8, 4, 10, 7, 1, 6, 16, 1, 1, 0, 0, 3, 4, 4, 14, 4, 2, 8, 37, 13,…
$ per_comaluno_B4              <int> 0, 0, 0, 0, 2, 0, 1, 0, 1, 3, 0, 0, 2, 0, 0, 2, 0, 2, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 3, 2, 0, 1, 0, 2, 0, 0, 0, 4, 0, 0, 0, 1, 0, 2, 1, 9, 7, 2, 0, …
$ per_comaluno_B5              <int> 5, 0, 4, 0, 8, 3, 6, 0, 4, 0, 4, 0, 2, 5, 3, 17, 1, 4, 5, 0, 0, 5, 2, 0, 1, 0, 2, 12, 7, 5, 4, 0, 4, 9, 5, 2, 4, 2, 0, 0, 4, 6, 2, 2, 5, 27, 11, 3,…
$ per_comaluno_C               <int> 6, 5, 3, 1, 2, 3, 7, 1, 2, 4, 8, 0, 11, 3, 8, 13, 4, 5, 2, 0, 0, 13, 6, 1, 0, 7, 5, 5, 8, 1, 9, 2, 8, 1, 3, 3, 0, 2, 2, 2, 1, 8, 1, 0, 2, 24, 9, 24…
$ per_comaluno_NA              <int> 6, 14, 2, 2, 9, 3, 6, 4, 5, 1, 10, 0, 17, 6, 7, 17, 0, 3, 5, 0, 1, 8, 6, 1, 2, 1, 5, 12, 14, 4, 4, 8, 11, 14, 6, 2, 4, 5, 1, 6, 9, 4, 4, 3, 18, 29,…

Produção e produtividade de artigos

Uma das maneiras de avaliar a produção dos docentes que a CAPES utiliza é quantificando a produção de artigos pelos docentes. Os artigos são categorizados em extratos ordenados (A1 é o mais alto), e separados entre artigos em conferências e periódicos. Usaremos para esse lab a produção em periódicos avaliados com A1, A2 e B1.

cacc = cacc_tudo %>%
  transmute(
    docentes = `Docentes permanentes`,
    producao = (periodicos_A1 + periodicos_A2 + periodicos_B1),
    produtividade = producao / docentes,
    mestrados = Dissertacoes,
    doutorados = Teses,
    tem_doutorado = tolower(`Tem doutorado`) == "sim",
    mestrados_pprof = mestrados / docentes,
    doutorados_pprof = doutorados / docentes
  )

cacc_md = cacc %>% 
  filter(tem_doutorado)

EDA

skimr::skim(cacc)
── Data Summary ────────────────────────
                           Values
Name                       cacc  
Number of rows             73    
Number of columns          8     
_______________________          
Column type frequency:           
  logical                  1     
  numeric                  7     
________________________         
Group variables            None  
cacc %>% 
  ggplot(aes(x = docentes)) + 
  geom_histogram(bins = 15, fill = paleta[1])


cacc %>% 
  ggplot(aes(x = producao)) + 
  geom_histogram(bins = 15, fill = paleta[2])


cacc %>% 
  ggplot(aes(x = produtividade)) + 
  geom_histogram(bins = 15, fill = paleta[3])

Se quisermos modelar o efeito do tamanho do programa em termos de docentes (permanentes) na quantidade de artigos publicados, podemos usar regressão.

Importante: sempre queremos ver os dados antes de fazermos qualquer modelo ou sumário:

cacc %>% 
  ggplot(aes(x = docentes, y = producao)) + 
  geom_point()

Parece que existe uma relação. Vamos criar um modelo então:

modelo1 = lm(producao ~ docentes, data = cacc)

tidy(modelo1, conf.int = TRUE, conf.level = 0.95)
glance(modelo1)

Para visualizar o modelo:

cacc_augmented = cacc %>% 
  add_predictions(modelo1) 

cacc_augmented %>% 
  ggplot(aes(x = docentes)) + 
  geom_line(aes(y = pred), colour = "brown") + 
  geom_point(aes(y = producao)) + 
  labs(y = "Produção do programa")

Se considerarmos que temos apenas uma amostra de todos os programas de pós em CC no Brasil, o que podemos inferir a partir desse modelo sobre a relação entre número de docentes permanentes e produção de artigos em programas de pós?

Regressão simples foi utilizada para analisar se número de docentes permanentes (docentes) tem uma associação significativa com a produção de artigos (producao) em programas de pós-graduação. Os resultados da regressão indicam que um modelo com um preditor no formato \(produção de artigos = -41.27 + 4.81 * numero de docentes permanentes\) explica \(81.46\%\) da variância na produção de artigos (\(R2 = 0.81458\)). O número de docentes permanentes, medida como unidade tem uma relação significativa com o erro (b = \([4.27; 5.36]\), IC com \(95%\)), assim como produção de artigos medido como unidade (b = \([-54.29; -28.25]\), IC com \(95%\)). O aumento de 1 unidade no número de docentes permanentes produz uma mudança de 4.81 na produção de artigos.

Dito isso, o que significa a relação que você encontrou na prática para entendermos os programas de pós graduação no Brasil? E algum palpite de por que a relação que encontramos é forte?

A relação encontrada indica que programas de pós-graduação com mais docentes permanentes tendem a produzir mais artigos. Esta forte relação pode ser explicada pela divisão mais equitativa da carga de trabalho, aumento das oportunidades de colaboração, maior diversidade de especializações e sinergia entre docentes, além de melhor acesso a recursos e infraestrutura, e possibilidade de mais parcerias de pesquisa.

Mais fatores

modelo2 = lm(producao ~ docentes + mestrados_pprof + doutorados_pprof + tem_doutorado, 
             data = cacc_md)

tidy(modelo2, conf.int = TRUE, conf.level = 0.95)
glance(modelo2)

E se considerarmos também o número de alunos?

modelo2 = lm(producao ~ docentes + mestrados + doutorados, data = cacc)

tidy(modelo2, conf.int = TRUE, conf.level = 0.95)
glance(modelo2)

Visualizar o modelo com muitas variáveis independentes fica mais difícil

para_plotar_modelo = cacc %>% 
  data_grid(producao = seq_range(producao, 10), # Crie um vetor de 10 valores no range
            docentes = seq_range(docentes, 4),  
            # mestrados = seq_range(mestrados, 3),
            mestrados = median(mestrados),
            doutorados = seq_range(doutorados, 3)) %>% 
  add_predictions(modelo2)

glimpse(para_plotar_modelo)
Rows: 120
Columns: 5
$ producao   <dbl> 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 39.44444, 39.44444, 39.44444, 39.44444, 39.44444, 39.4444…
$ docentes   <dbl> 8.25000, 8.25000, 8.25000, 27.91667, 27.91667, 27.91667, 47.58333, 47.58333, 47.58333, 67.25000, 67.25000, 67.25000, 8.25000, 8.25000, 8.25000, 27.91667, 27.91667, 2…
$ mestrados  <int> 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 5…
$ doutorados <dbl> 0, 76, 152, 0, 76, 152, 0, 76, 152, 0, 76, 152, 0, 76, 152, 0, 76, 152, 0, 76, 152, 0, 76, 152, 0, 76, 152, 0, 76, 152, 0, 76, 152, 0, 76, 152, 0, 76, 152, 0, 76, 15…
$ pred       <dbl> 3.199123, 79.257725, 155.316327, 72.026777, 148.085378, 224.143980, 140.854430, 216.913032, 292.971634, 209.682084, 285.740686, 361.799287, 3.199123, 79.257725, 155.…
para_plotar_modelo %>% 
  ggplot(aes(x = docentes, y = pred)) + 
  geom_line(aes(group = doutorados, colour = doutorados)) + 
  geom_point(data = cacc, aes(y = producao, colour = doutorados))

Considerando agora esses três fatores, o que podemos dizer sobre como cada um deles se relaciona com a produção de um programa de pós em CC? E sobre o modelo? Ele explica mais que o modelo 1?

Regressão múltipla foi utilizada para analisar se o número de docentes permanentes, mestrados e doutorados tem uma associação significativa com a produção de artigos. Os resultados da regressão indicam que um modelo com os 3 preditores no formato \(produção de artigos = -14.37 + 3.50 * Docentes - 0.19 * Mestrados + 1 * Doutorados\) explica \(87.07\%\) da variância da produção de artigos (R2 = \(0.8707\)). O número de docentes permanentes, medido como unidade, tem uma relação significativa com o erro (b = \([2.5827, 4.4167]\), IC com 95%), número de mestrados, medido como unidade (b = \([-0.3577, 0.0322]\), IC com 95%) assim como o número de doutorados medido como unidade (b = \([0.6355; 1.3660]\), IC com 95%). O aumento de 1 unidade do numero de docentes permanentes produz uma mudança de +3.5 unidades na produçao de artigos. O aumento de 1 unidade mestrados produz uma mudança de -0.2 unidades na produçao de artigos. O aumento de 1 unidade nos doutorados produz uma mudança de +1 unidade na produçao de artigos.

Agora produtividade

Diferente de medirmos produção (total produzido), é medirmos produtividade (produzido / utilizado). Abaixo focaremos nessa análise. Para isso crie um modelo que investiga como um conjunto de fatores que você julga que são relevantes se relacionam com a produtividade dos programas. Crie um modelo que avalie como pelo menos 3 fatores se relacionam com a produtividade de um programa. Pode reutilizar fatores que já definimos e analizamos para produção. Mas cuidado para não incluir fatores que sejam função linear de outros já incluídos (ex: incluir A, B e um tercero C=A+B)

Produza abaixo o modelo e um texto que comente (i) o modelo, tal como os que fizemos antes, e (ii) as implicações - o que aprendemos sobre como funcionam programas de pós no brasil?.

Modelo

modelo3 = lm(produtividade ~ docentes + doutorados_pprof + tem_doutorado, data = cacc)

tidy(modelo3, conf.int = TRUE, conf.level = 0.95)
glance(modelo3)

Regressão múltipla foi utilizada para analisar se a quantidade de professores (docentes), a relação de doutorados por professore do programa de pós-graduação (doutorados_pprof) e se o programa possui curso de doutorado (tem_doutorado) têm uma associação significativa com produtividade. Os resultados da regressão indicam que um modelo com os 3 preditores no formato \(produtividade = 1.33 + 0.014 * docentes + 0.59 * doutorados_pprof + 1.02 * tem_doutorado\) explicam \(52.11\%\) da variância da variável de resposta (R2 = 0.52107).

A variável independente docentes, medida em unidade, tem uma relação não significativa com a variável produtividade (b = \([-0.012; 0.04]\), IC com 95%). Já a variável independente doutorados_pprof, tem uma relação significativa com a variável produtividade (b = \([0.013; 1.07]\), IC com 95%). A variável independente tem_doutorado também tem uma relação significativa com a variável produtividade (b = \([0.43; 1.63]\), IC com 95%).

O aumento de 1 unidade de docentes produz uma mudança de 0.014 em produtividade, enquanto um aumento de 1 unidade em doutorados_pprof resulta em uma mudança de 0.59 em produtividade. Já a presença de um (1 unidade) curso de doutorado (tem_doutorado), produz uma mudança de 1.02 em produtividade.

Com o modelo utilizado, aprendemos que a presença de um curso de doutorado, assim como a quantidade de doutorados orientados por professor do programa, tem bastante influência no aumento da produtividade de um determinado programa.

LS0tCnRpdGxlOiAiUmVncmVzc8OjbyBsaW5lYXIgbmEgcHLDoXRpY2EiCm91dHB1dDogaHRtbF9ub3RlYm9vawotLS0KCmBgYHtyIHdhcm5pbmc9RkFMU0UsIGVjaG89RkFMU0V9CmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KGJyb29tKQpsaWJyYXJ5KG1vZGVscikKc291cmNlKGhlcmU6OmhlcmUoImNvZGUvbGliLlIiKSkKdGhlbWVfc2V0KHRoZW1lX2J3KCkpCgprbml0cjo6b3B0c19jaHVuayRzZXQodGlkeSA9IEZBTFNFLAogICAgICAgICAgICAgICAgICAgICAgZmlnLndpZHRoID0gNiwKICAgICAgICAgICAgICAgICAgICAgIGZpZy5oZWlnaHQgPSA1KQoKcGFsZXRhID0gYygiIzQwNEU0RCIsCiAgICAgICAgICAgIiM5MkRDRTUiLAogICAgICAgICAgICIjOTM4QkExIiwKICAgICAgICAgICAiIzJEMzE0MiIsCiAgICAgICAgICAgIiNGNDc0M0IiKQpgYGAKCiMjIERhZG9zIGRhIENBUEVTIHNvYnJlIGF2YWxpYcOnw6NvIGRhIHDDs3MtZ3JhZHVhw6fDo28KCkEgQ0FQRVMgw6kgdW0gw7NyZ8OjbyBkbyBNRUMgcXVlIHRlbSBhIGF0cmlidWnDp8OjbyBkZSBhY29tcGFuaGFyIGEgcMOzcy1ncmFkdWHDp8OjbyBuYSB1bml2ZXJzaWRhZGUgYnJhc2lsZWlyYS4gVW1hIGRhcyBmb3JtYXMgcXVlIGVsYSBlbmNvbnRyb3UgZGUgZmF6ZXIgaXNzbyBlIHBlbGEgcXVhbCBlbGEgw6kgYmFzdGFudGUgY3JpdGljYWRhIMOpIGF0cmF2w6lzIGRlIHVtYSBhdmFsaWHDp8OjbyBxdWFudGl0YXRpdmEgYSBjYWRhIHggYW5vcyAoZXJhIDMsIG11ZG91IHBhcmEgNCkuIAoKVXNhcmVtb3MgZGFkb3MgZGEgcGVuw7psdGltYSBhdmFsaWHDp8OjbyBkYSBDQVBFUzogCgpgYGB7cn0KY2FjY190dWRvID0gcmVhZF9wcm9qZWN0ZGF0YSgpCgpnbGltcHNlKGNhY2NfdHVkbykKYGBgCgojIyMgUHJvZHXDp8OjbyBlIHByb2R1dGl2aWRhZGUgZGUgYXJ0aWdvcwoKVW1hIGRhcyBtYW5laXJhcyBkZSBhdmFsaWFyIGEgcHJvZHXDp8OjbyBkb3MgZG9jZW50ZXMgcXVlIGEgQ0FQRVMgdXRpbGl6YSDDqSBxdWFudGlmaWNhbmRvIGEgcHJvZHXDp8OjbyBkZSBhcnRpZ29zIHBlbG9zIGRvY2VudGVzLiBPcyBhcnRpZ29zIHPDo28gY2F0ZWdvcml6YWRvcyBlbSBleHRyYXRvcyBvcmRlbmFkb3MgKEExIMOpIG8gbWFpcyBhbHRvKSwgZSBzZXBhcmFkb3MgZW50cmUgYXJ0aWdvcyBlbSBjb25mZXLDqm5jaWFzIGUgcGVyacOzZGljb3MuIFVzYXJlbW9zIHBhcmEgZXNzZSBsYWIgYSBwcm9kdcOnw6NvIGVtIHBlcmnDs2RpY29zIGF2YWxpYWRvcyBjb20gQTEsIEEyIGUgQjEuIAoKYGBge3J9CmNhY2MgPSBjYWNjX3R1ZG8gJT4lCiAgdHJhbnNtdXRlKAogICAgZG9jZW50ZXMgPSBgRG9jZW50ZXMgcGVybWFuZW50ZXNgLAogICAgcHJvZHVjYW8gPSAocGVyaW9kaWNvc19BMSArIHBlcmlvZGljb3NfQTIgKyBwZXJpb2RpY29zX0IxKSwKICAgIHByb2R1dGl2aWRhZGUgPSBwcm9kdWNhbyAvIGRvY2VudGVzLAogICAgbWVzdHJhZG9zID0gRGlzc2VydGFjb2VzLAogICAgZG91dG9yYWRvcyA9IFRlc2VzLAogICAgdGVtX2RvdXRvcmFkbyA9IHRvbG93ZXIoYFRlbSBkb3V0b3JhZG9gKSA9PSAic2ltIiwKICAgIG1lc3RyYWRvc19wcHJvZiA9IG1lc3RyYWRvcyAvIGRvY2VudGVzLAogICAgZG91dG9yYWRvc19wcHJvZiA9IGRvdXRvcmFkb3MgLyBkb2NlbnRlcwogICkKCmNhY2NfbWQgPSBjYWNjICU+JSAKICBmaWx0ZXIodGVtX2RvdXRvcmFkbykKYGBgCgoKIyMjIEVEQQoKYGBge3J9CnNraW1yOjpza2ltKGNhY2MpCmBgYAoKCmBgYHtyfQpjYWNjICU+JSAKICBnZ3Bsb3QoYWVzKHggPSBkb2NlbnRlcykpICsgCiAgZ2VvbV9oaXN0b2dyYW0oYmlucyA9IDE1LCBmaWxsID0gcGFsZXRhWzFdKQoKY2FjYyAlPiUgCiAgZ2dwbG90KGFlcyh4ID0gcHJvZHVjYW8pKSArIAogIGdlb21faGlzdG9ncmFtKGJpbnMgPSAxNSwgZmlsbCA9IHBhbGV0YVsyXSkKCmNhY2MgJT4lIAogIGdncGxvdChhZXMoeCA9IHByb2R1dGl2aWRhZGUpKSArIAogIGdlb21faGlzdG9ncmFtKGJpbnMgPSAxNSwgZmlsbCA9IHBhbGV0YVszXSkKYGBgCgpTZSBxdWlzZXJtb3MgbW9kZWxhciBvIGVmZWl0byBkbyB0YW1hbmhvIGRvIHByb2dyYW1hIGVtIHRlcm1vcyBkZSBkb2NlbnRlcyAocGVybWFuZW50ZXMpIG5hIHF1YW50aWRhZGUgZGUgYXJ0aWdvcyBwdWJsaWNhZG9zLCBwb2RlbW9zIHVzYXIgcmVncmVzc8Ojby4gCgoqSW1wb3J0YW50ZSo6IHNlbXByZSBxdWVyZW1vcyB2ZXIgb3MgZGFkb3MgYW50ZXMgZGUgZmF6ZXJtb3MgcXVhbHF1ZXIgbW9kZWxvIG91IHN1bcOhcmlvOiAKCmBgYHtyfQpjYWNjICU+JSAKICBnZ3Bsb3QoYWVzKHggPSBkb2NlbnRlcywgeSA9IHByb2R1Y2FvKSkgKyAKICBnZW9tX3BvaW50KCkKYGBgCgpQYXJlY2UgcXVlIGV4aXN0ZSB1bWEgcmVsYcOnw6NvLiBWYW1vcyBjcmlhciB1bSBtb2RlbG8gZW50w6NvOgoKYGBge3J9Cm1vZGVsbzEgPSBsbShwcm9kdWNhbyB+IGRvY2VudGVzLCBkYXRhID0gY2FjYykKCnRpZHkobW9kZWxvMSwgY29uZi5pbnQgPSBUUlVFLCBjb25mLmxldmVsID0gMC45NSkKYGBgCgpgYGB7cn0KZ2xhbmNlKG1vZGVsbzEpCmBgYAoKUGFyYSB2aXN1YWxpemFyIG8gbW9kZWxvOgoKYGBge3J9CmNhY2NfYXVnbWVudGVkID0gY2FjYyAlPiUgCiAgYWRkX3ByZWRpY3Rpb25zKG1vZGVsbzEpIAoKY2FjY19hdWdtZW50ZWQgJT4lIAogIGdncGxvdChhZXMoeCA9IGRvY2VudGVzKSkgKyAKICBnZW9tX2xpbmUoYWVzKHkgPSBwcmVkKSwgY29sb3VyID0gImJyb3duIikgKyAKICBnZW9tX3BvaW50KGFlcyh5ID0gcHJvZHVjYW8pKSArIAogIGxhYnMoeSA9ICJQcm9kdcOnw6NvIGRvIHByb2dyYW1hIikKYGBgCgpTZSBjb25zaWRlcmFybW9zIHF1ZSB0ZW1vcyBhcGVuYXMgdW1hIGFtb3N0cmEgZGUgdG9kb3Mgb3MgcHJvZ3JhbWFzIGRlIHDDs3MgZW0gQ0Mgbm8gQnJhc2lsLCBvIHF1ZSBwb2RlbW9zIGluZmVyaXIgYSBwYXJ0aXIgZGVzc2UgbW9kZWxvIHNvYnJlIGEgcmVsYcOnw6NvIGVudHJlIG7Dum1lcm8gZGUgZG9jZW50ZXMgcGVybWFuZW50ZXMgZSBwcm9kdcOnw6NvIGRlIGFydGlnb3MgZW0gcHJvZ3JhbWFzIGRlIHDDs3M/IAoKUmVncmVzc8OjbyBzaW1wbGVzIGZvaSB1dGlsaXphZGEgcGFyYSBhbmFsaXNhciBzZSBuw7ptZXJvIGRlIGRvY2VudGVzIHBlcm1hbmVudGVzIChkb2NlbnRlcykgdGVtIHVtYSBhc3NvY2lhw6fDo28gc2lnbmlmaWNhdGl2YSBjb20gYSBwcm9kdcOnw6NvIGRlIGFydGlnb3MgKHByb2R1Y2FvKSBlbSBwcm9ncmFtYXMgZGUgcMOzcy1ncmFkdWHDp8Ojby4gT3MgcmVzdWx0YWRvcyBkYSByZWdyZXNzw6NvIGluZGljYW0gcXVlIHVtIG1vZGVsbyBjb20gdW0gcHJlZGl0b3Igbm8gZm9ybWF0byAkcHJvZHXDp8OjbyBkZSBhcnRpZ29zID0gLTQxLjI3ICsgNC44MSAqIG51bWVybyBkZSBkb2NlbnRlcyBwZXJtYW5lbnRlcyQgZXhwbGljYSAkODEuNDZcJSQgZGEgdmFyacOibmNpYSBuYSBwcm9kdcOnw6NvIGRlIGFydGlnb3MgKCRSMiA9IDAuODE0NTgkKS4gTyBuw7ptZXJvIGRlIGRvY2VudGVzIHBlcm1hbmVudGVzLCBtZWRpZGEgY29tbyB1bmlkYWRlIHRlbSB1bWEgcmVsYcOnw6NvIHNpZ25pZmljYXRpdmEgY29tIG8gZXJybyAoYiA9ICRbNC4yNzsgNS4zNl0kLCBJQyBjb20gJDk1JSQpLCBhc3NpbSBjb21vIHByb2R1w6fDo28gZGUgYXJ0aWdvcyBtZWRpZG8gY29tbyB1bmlkYWRlIChiID0gJFstNTQuMjk7IC0yOC4yNV0kLCBJQyBjb20gJDk1JSQpLiBPIGF1bWVudG8gZGUgMSB1bmlkYWRlIG5vIG7Dum1lcm8gZGUgZG9jZW50ZXMgcGVybWFuZW50ZXMgcHJvZHV6IHVtYSBtdWRhbsOnYSBkZSA0LjgxIG5hIHByb2R1w6fDo28gZGUgYXJ0aWdvcy4KCkRpdG8gaXNzbywgbyBxdWUgc2lnbmlmaWNhIGEgcmVsYcOnw6NvIHF1ZSB2b2PDqiBlbmNvbnRyb3UgbmEgcHLDoXRpY2EgcGFyYSBlbnRlbmRlcm1vcyBvcyBwcm9ncmFtYXMgZGUgcMOzcyBncmFkdWHDp8OjbyBubyBCcmFzaWw/IEUgYWxndW0gcGFscGl0ZSBkZSBwb3IgcXVlIGEgcmVsYcOnw6NvIHF1ZSBlbmNvbnRyYW1vcyDDqSBmb3J0ZT8KCkEgcmVsYcOnw6NvIGVuY29udHJhZGEgaW5kaWNhIHF1ZSBwcm9ncmFtYXMgZGUgcMOzcy1ncmFkdWHDp8OjbyBjb20gbWFpcyBkb2NlbnRlcyBwZXJtYW5lbnRlcyB0ZW5kZW0gYSBwcm9kdXppciBtYWlzIGFydGlnb3MuIEVzdGEgZm9ydGUgcmVsYcOnw6NvIHBvZGUgc2VyIGV4cGxpY2FkYSBwZWxhIGRpdmlzw6NvIG1haXMgZXF1aXRhdGl2YSBkYSBjYXJnYSBkZSB0cmFiYWxobywgYXVtZW50byBkYXMgb3BvcnR1bmlkYWRlcyBkZSBjb2xhYm9yYcOnw6NvLCBtYWlvciBkaXZlcnNpZGFkZSBkZSBlc3BlY2lhbGl6YcOnw7VlcyBlIHNpbmVyZ2lhIGVudHJlIGRvY2VudGVzLCBhbMOpbSBkZSBtZWxob3IgYWNlc3NvIGEgcmVjdXJzb3MgZSBpbmZyYWVzdHJ1dHVyYSwgZSBwb3NzaWJpbGlkYWRlIGRlIG1haXMgcGFyY2VyaWFzIGRlIHBlc3F1aXNhLgoKIyMgTWFpcyBmYXRvcmVzCgpgYGB7cn0KbW9kZWxvMiA9IGxtKHByb2R1Y2FvIH4gZG9jZW50ZXMgKyBtZXN0cmFkb3NfcHByb2YgKyBkb3V0b3JhZG9zX3Bwcm9mICsgdGVtX2RvdXRvcmFkbywgCiAgICAgICAgICAgICBkYXRhID0gY2FjY19tZCkKCnRpZHkobW9kZWxvMiwgY29uZi5pbnQgPSBUUlVFLCBjb25mLmxldmVsID0gMC45NSkKZ2xhbmNlKG1vZGVsbzIpCmBgYAoKRSBzZSBjb25zaWRlcmFybW9zIHRhbWLDqW0gbyBuw7ptZXJvIGRlIGFsdW5vcz8KCmBgYHtyfQptb2RlbG8yID0gbG0ocHJvZHVjYW8gfiBkb2NlbnRlcyArIG1lc3RyYWRvcyArIGRvdXRvcmFkb3MsIGRhdGEgPSBjYWNjKQoKdGlkeShtb2RlbG8yLCBjb25mLmludCA9IFRSVUUsIGNvbmYubGV2ZWwgPSAwLjk1KQpnbGFuY2UobW9kZWxvMikKYGBgCgpWaXN1YWxpemFyIG8gbW9kZWxvIGNvbSBtdWl0YXMgdmFyacOhdmVpcyBpbmRlcGVuZGVudGVzIGZpY2EgbWFpcyBkaWbDrWNpbAoKYGBge3J9CnBhcmFfcGxvdGFyX21vZGVsbyA9IGNhY2MgJT4lIAogIGRhdGFfZ3JpZChwcm9kdWNhbyA9IHNlcV9yYW5nZShwcm9kdWNhbywgMTApLCAjIENyaWUgdW0gdmV0b3IgZGUgMTAgdmFsb3JlcyBubyByYW5nZQogICAgICAgICAgICBkb2NlbnRlcyA9IHNlcV9yYW5nZShkb2NlbnRlcywgNCksICAKICAgICAgICAgICAgIyBtZXN0cmFkb3MgPSBzZXFfcmFuZ2UobWVzdHJhZG9zLCAzKSwKICAgICAgICAgICAgbWVzdHJhZG9zID0gbWVkaWFuKG1lc3RyYWRvcyksCiAgICAgICAgICAgIGRvdXRvcmFkb3MgPSBzZXFfcmFuZ2UoZG91dG9yYWRvcywgMykpICU+JSAKICBhZGRfcHJlZGljdGlvbnMobW9kZWxvMikKCmdsaW1wc2UocGFyYV9wbG90YXJfbW9kZWxvKQoKYGBgCgpgYGB7cn0KcGFyYV9wbG90YXJfbW9kZWxvICU+JSAKICBnZ3Bsb3QoYWVzKHggPSBkb2NlbnRlcywgeSA9IHByZWQpKSArIAogIGdlb21fbGluZShhZXMoZ3JvdXAgPSBkb3V0b3JhZG9zLCBjb2xvdXIgPSBkb3V0b3JhZG9zKSkgKyAKICBnZW9tX3BvaW50KGRhdGEgPSBjYWNjLCBhZXMoeSA9IHByb2R1Y2FvLCBjb2xvdXIgPSBkb3V0b3JhZG9zKSkKYGBgCgpDb25zaWRlcmFuZG8gYWdvcmEgZXNzZXMgdHLDqnMgZmF0b3JlcywgbyBxdWUgcG9kZW1vcyBkaXplciBzb2JyZSBjb21vIGNhZGEgdW0gZGVsZXMgc2UgcmVsYWNpb25hIGNvbSBhIHByb2R1w6fDo28gZGUgdW0gcHJvZ3JhbWEgZGUgcMOzcyBlbSBDQz8gRSBzb2JyZSBvIG1vZGVsbz8gRWxlIGV4cGxpY2EgbWFpcyBxdWUgbyBtb2RlbG8gMT8gCgpSZWdyZXNzw6NvIG3Dumx0aXBsYSBmb2kgdXRpbGl6YWRhIHBhcmEgYW5hbGlzYXIgc2UgbyBuw7ptZXJvIGRlIGRvY2VudGVzIHBlcm1hbmVudGVzLCBtZXN0cmFkb3MgZSBkb3V0b3JhZG9zIHRlbSB1bWEgYXNzb2NpYcOnw6NvIHNpZ25pZmljYXRpdmEgY29tIGEgcHJvZHXDp8OjbyBkZSBhcnRpZ29zLiBPcyByZXN1bHRhZG9zIGRhIHJlZ3Jlc3PDo28gaW5kaWNhbSBxdWUgdW0gbW9kZWxvIGNvbSBvcyAzIHByZWRpdG9yZXMgbm8gZm9ybWF0byAkcHJvZHXDp8OjbyBkZSBhcnRpZ29zID0gLTE0LjM3ICsgMy41MCAqIERvY2VudGVzIC0gMC4xOSAqIE1lc3RyYWRvcyArIDEgKiBEb3V0b3JhZG9zJCBleHBsaWNhICQ4Ny4wN1wlJCBkYSB2YXJpw6JuY2lhIGRhIHByb2R1w6fDo28gZGUgYXJ0aWdvcyAoUjIgPSAkMC44NzA3JCkuIE8gbsO6bWVybyBkZSBkb2NlbnRlcyBwZXJtYW5lbnRlcywgbWVkaWRvIGNvbW8gdW5pZGFkZSwgdGVtIHVtYSByZWxhw6fDo28gc2lnbmlmaWNhdGl2YSBjb20gbyBlcnJvIChiID0gJFsyLjU4MjcsIDQuNDE2N10kLCBJQyBjb20gOTUlKSwgbsO6bWVybyBkZSBtZXN0cmFkb3MsIG1lZGlkbyBjb21vIHVuaWRhZGUgKGIgPSAkWy0wLjM1NzcsIDAuMDMyMl0kLCBJQyBjb20gOTUlKSBhc3NpbSBjb21vIG8gbsO6bWVybyBkZSBkb3V0b3JhZG9zIG1lZGlkbyBjb21vIHVuaWRhZGUgKGIgPSAkWzAuNjM1NTsgMS4zNjYwXSQsIElDIGNvbSA5NSUpLiBPIGF1bWVudG8gZGUgMSB1bmlkYWRlIGRvIG51bWVybyBkZSBkb2NlbnRlcyBwZXJtYW5lbnRlcyBwcm9kdXogdW1hIG11ZGFuw6dhIGRlICszLjUgdW5pZGFkZXMgbmEgcHJvZHXDp2FvIGRlIGFydGlnb3MuIE8gYXVtZW50byBkZSAxIHVuaWRhZGUgbWVzdHJhZG9zIHByb2R1eiB1bWEgbXVkYW7Dp2EgZGUgLTAuMiB1bmlkYWRlcyBuYSBwcm9kdcOnYW8gZGUgYXJ0aWdvcy4gTyBhdW1lbnRvIGRlIDEgdW5pZGFkZSBub3MgZG91dG9yYWRvcyBwcm9kdXogdW1hIG11ZGFuw6dhIGRlICsxIHVuaWRhZGUgbmEgcHJvZHXDp2FvIGRlIGFydGlnb3MuCgojIyBBZ29yYSBwcm9kdXRpdmlkYWRlIAoKRGlmZXJlbnRlIGRlIG1lZGlybW9zIHByb2R1w6fDo28gKHRvdGFsIHByb2R1emlkbyksIMOpIG1lZGlybW9zIHByb2R1dGl2aWRhZGUgKHByb2R1emlkbyAvIHV0aWxpemFkbykuIEFiYWl4byBmb2NhcmVtb3MgbmVzc2EgYW7DoWxpc2UuIFBhcmEgaXNzbyBjcmllIHVtIG1vZGVsbyBxdWUgaW52ZXN0aWdhIGNvbW8gdW0gY29uanVudG8gZGUgZmF0b3JlcyBxdWUgdm9jw6oganVsZ2EgcXVlIHPDo28gcmVsZXZhbnRlcyBzZSByZWxhY2lvbmFtIGNvbSBhIHByb2R1dGl2aWRhZGUgZG9zIHByb2dyYW1hcy4gQ3JpZSB1bSBtb2RlbG8gcXVlIGF2YWxpZSBjb21vIF9wZWxvIG1lbm9zIDMgZmF0b3Jlc18gc2UgcmVsYWNpb25hbSBjb20gYSBwcm9kdXRpdmlkYWRlIGRlIHVtIHByb2dyYW1hLiBQb2RlIHJldXRpbGl6YXIgZmF0b3JlcyBxdWUgasOhIGRlZmluaW1vcyBlIGFuYWxpemFtb3MgcGFyYSBwcm9kdcOnw6NvLiBNYXMgY3VpZGFkbyBwYXJhIG7Do28gaW5jbHVpciBmYXRvcmVzIHF1ZSBzZWphbSBmdW7Dp8OjbyBsaW5lYXIgZGUgb3V0cm9zIGrDoSBpbmNsdcOtZG9zIChleDogaW5jbHVpciBBLCBCIGUgdW0gdGVyY2VybyBDPUErQikKClByb2R1emEgYWJhaXhvIG8gbW9kZWxvIGUgdW0gdGV4dG8gcXVlIGNvbWVudGUgKGkpIG8gbW9kZWxvLCB0YWwgY29tbyBvcyBxdWUgZml6ZW1vcyBhbnRlcywgZSAoaWkpIGFzIGltcGxpY2HDp8O1ZXMgLSBvIHF1ZSBhcHJlbmRlbW9zIHNvYnJlIGNvbW8gZnVuY2lvbmFtIHByb2dyYW1hcyBkZSBww7NzIG5vIGJyYXNpbD8uCgojIyMgTW9kZWxvCgpgYGB7cn0KbW9kZWxvMyA9IGxtKHByb2R1dGl2aWRhZGUgfiBkb2NlbnRlcyArIGRvdXRvcmFkb3NfcHByb2YgKyB0ZW1fZG91dG9yYWRvLCBkYXRhID0gY2FjYykKCnRpZHkobW9kZWxvMywgY29uZi5pbnQgPSBUUlVFLCBjb25mLmxldmVsID0gMC45NSkKYGBgCgpgYGB7cn0KZ2xhbmNlKG1vZGVsbzMpCmBgYAoKUmVncmVzc8OjbyBtw7psdGlwbGEgZm9pIHV0aWxpemFkYSBwYXJhIGFuYWxpc2FyIHNlIGEgcXVhbnRpZGFkZSBkZSBwcm9mZXNzb3JlcyAoZG9jZW50ZXMpLCBhIHJlbGHDp8OjbyBkZSBkb3V0b3JhZG9zIHBvciBwcm9mZXNzb3JlIGRvIHByb2dyYW1hIGRlIHDDs3MtZ3JhZHVhw6fDo28gKGRvdXRvcmFkb3NfcHByb2YpIGUgc2UgbyBwcm9ncmFtYSBwb3NzdWkgY3Vyc28gZGUgZG91dG9yYWRvICh0ZW1fZG91dG9yYWRvKSB0w6ptIHVtYSBhc3NvY2lhw6fDo28gc2lnbmlmaWNhdGl2YSBjb20gcHJvZHV0aXZpZGFkZS4gT3MgcmVzdWx0YWRvcyBkYSByZWdyZXNzw6NvIGluZGljYW0gcXVlIHVtIG1vZGVsbyBjb20gb3MgMyBwcmVkaXRvcmVzIG5vIGZvcm1hdG8gJHByb2R1dGl2aWRhZGUgPSAxLjMzICsgMC4wMTQgKiBkb2NlbnRlcyArIDAuNTkgKiBkb3V0b3JhZG9zX3Bwcm9mICsgMS4wMiAqIHRlbV9kb3V0b3JhZG8kIGV4cGxpY2FtICQ1Mi4xMVwlJCBkYSB2YXJpw6JuY2lhIGRhIHZhcmnDoXZlbCBkZSByZXNwb3N0YSAoUjIgPSAwLjUyMTA3KS4KCkEgdmFyacOhdmVsIGluZGVwZW5kZW50ZSBkb2NlbnRlcywgbWVkaWRhIGVtIHVuaWRhZGUsIHRlbSB1bWEgcmVsYcOnw6NvIG7Do28gc2lnbmlmaWNhdGl2YSBjb20gYSB2YXJpw6F2ZWwgcHJvZHV0aXZpZGFkZSAoYiA9ICRbLTAuMDEyOyAwLjA0XSQsIElDIGNvbSA5NSUpLiBKw6EgYSB2YXJpw6F2ZWwgaW5kZXBlbmRlbnRlIGRvdXRvcmFkb3NfcHByb2YsIHRlbSB1bWEgcmVsYcOnw6NvIHNpZ25pZmljYXRpdmEgY29tIGEgdmFyacOhdmVsIHByb2R1dGl2aWRhZGUgKGIgPSAkWzAuMDEzOyAxLjA3XSQsIElDIGNvbSA5NSUpLiBBIHZhcmnDoXZlbCBpbmRlcGVuZGVudGUgdGVtX2RvdXRvcmFkbyB0YW1iw6ltIHRlbSB1bWEgcmVsYcOnw6NvIHNpZ25pZmljYXRpdmEgY29tIGEgdmFyacOhdmVsIHByb2R1dGl2aWRhZGUgKGIgPSAkWzAuNDM7IDEuNjNdJCwgSUMgY29tIDk1JSkuCgpPIGF1bWVudG8gZGUgMSB1bmlkYWRlIGRlIGRvY2VudGVzIHByb2R1eiB1bWEgbXVkYW7Dp2EgZGUgMC4wMTQgZW0gcHJvZHV0aXZpZGFkZSwgZW5xdWFudG8gdW0gYXVtZW50byBkZSAxIHVuaWRhZGUgZW0gZG91dG9yYWRvc19wcHJvZiByZXN1bHRhIGVtIHVtYSBtdWRhbsOnYSBkZSAwLjU5IGVtIHByb2R1dGl2aWRhZGUuIErDoSBhIHByZXNlbsOnYSBkZSB1bSAoMSB1bmlkYWRlKSBjdXJzbyBkZSBkb3V0b3JhZG8gKHRlbV9kb3V0b3JhZG8pLCBwcm9kdXogdW1hIG11ZGFuw6dhIGRlIDEuMDIgZW0gcHJvZHV0aXZpZGFkZS4KCkNvbSBvIG1vZGVsbyB1dGlsaXphZG8sIGFwcmVuZGVtb3MgcXVlIGEgcHJlc2Vuw6dhIGRlIHVtIGN1cnNvIGRlIGRvdXRvcmFkbywgYXNzaW0gY29tbyBhIHF1YW50aWRhZGUgZGUgZG91dG9yYWRvcyBvcmllbnRhZG9zIHBvciBwcm9mZXNzb3IgZG8gcHJvZ3JhbWEsIHRlbSBiYXN0YW50ZSBpbmZsdcOqbmNpYSBubyBhdW1lbnRvIGRhIHByb2R1dGl2aWRhZGUgZGUgdW0gZGV0ZXJtaW5hZG8gcHJvZ3JhbWEu