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Á", "UNIV…
$ Programa                     <chr> "INFORMÁTICA (12001015012P2)", "CIÊNCIA DA COMPUTAÇÃO (15001016047P9)", "…
$ 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…
$ Sigla                        <chr> "UFAM", "UFPA", "UFMA", "UEMA", "FUFPI", "UFC", "UNIFOR", "UECE/Prof", "U…
$ `Tem doutorado`              <chr> "Sim", "Sim", "Não", "Não", "Não", "Sim", "Sim", "Não", "Não", "Não", "Si…
$ `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…
$ `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,…
$ `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…
$ `Resumos em conf`            <int> 20, 23, 15, 5, 4, 10, 6, 136, 0, 24, 27, 4, 30, 20, 5, 14, 49, 63, 33, 3,…
$ `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, …
$ `Artigos em conf`            <int> 390, 284, 115, 73, 150, 269, 179, 0, 120, 92, 389, 60, 127, 322, 338, 763…
$ Dissertacoes                 <int> 108, 77, 50, 25, 31, 75, 60, 129, 45, 3, 108, 12, 94, 108, 104, 433, 92, …
$ Teses                        <int> 14, 0, 0, 0, 0, 24, 5, 0, 0, 0, 29, 0, 0, 0, 40, 144, 0, 0, 0, 0, 0, 0, 2…
$ periodicos_A1                <int> 15, 19, 5, 1, 7, 21, 21, 0, 3, 8, 44, 0, 6, 21, 20, 93, 70, 16, 16, 0, 22…
$ periodicos_A2                <int> 19, 21, 11, 1, 4, 32, 13, 0, 9, 2, 23, 2, 6, 20, 15, 43, 23, 5, 5, 1, 12,…
$ periodicos_B1                <int> 19, 38, 7, 3, 6, 26, 16, 2, 6, 4, 32, 4, 2, 11, 29, 51, 29, 11, 8, 1, 14,…
$ 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…
$ 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, …
$ 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…
$ periodicos_B5                <int> 10, 16, 8, 4, 12, 4, 16, 2, 6, 2, 11, 0, 4, 16, 9, 29, 18, 16, 18, 0, 3, …
$ periodicos_C                 <int> 9, 34, 12, 5, 2, 3, 11, 9, 5, 10, 16, 1, 14, 28, 8, 19, 24, 23, 9, 0, 7, …
$ periodicos_NA                <int> 7, 15, 8, 11, 12, 6, 19, 31, 7, 14, 19, 0, 27, 26, 18, 29, 19, 21, 25, 0,…
$ 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,…
$ 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, …
$ 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, …
$ 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…
$ 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,…
$ 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…
$ 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, …
$ 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…
$ 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, …

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)

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

t1
g1

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?

Normalmente reportaríamos o resultado da seguinte maneira, substituindo VarIndepX e todos os x’s e y’s pelos nomes e valores de fato:

Regressão múltipla foi utilizada para analisar se VarIndep1 e VarIndep2 tem uma associação significativa com VarDep. Os resultados da regressão indicam que um modelo com os 2 preditores no formato VarDep = XXX.VarIndep1 + YYY.VarIndep2 explicam XX,XX% da variância da variável de resposta (R2 = XX,XX). VarIndep1, medida como/em [unidade ou o que é o 0 e o que é 1] tem uma relação significativa com o erro (b = [yy,yy; zz,zz], IC com 95%), assim como VarIndep2 medida como [unidade ou o que é o 0 e o que é 1] (b = [yy,yy; zz,zz], IC com 95%). O aumento de 1 unidade de VarIndep1 produz uma mudança de xxx em VarDep, enquanto um aumento…

Produza aqui a sua versão desse texto, portanto:


Regressão linear simples foi utilizada para analisar se o número de docentes permanentes tem uma associação significativa com a produção de artigos (A1, A2, B1) de um programa. Os resultados da regressão indicam que um modelo com os dois preditores no formato Produção = -41.27 + 4.81 * Docentes explica 81.46% da variância da variável de resposta (R2 = 0.81). O número de docentes tem uma relação significativa e positiva com a produção (b = 4.81, IC com 95% [4.27; 5.36]). O aumento de 1 docente permanente produz uma mudança média de 4.81 artigos na produção do programa.


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 forte e positiva indica que o tamanho do corpo docente (docentes permanentes) é o principal motor do volume de publicações de alta qualidade (A1, A2, B1). Mais professores geram mais pesquisas e orientações, o que resulta em mais artigos. No entanto, focar apenas na produção total pode mascarar a eficiência de cada docente (produtividade), já que um programa maior naturalmente produzirá mais que um programa menor.


Mais fatores

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

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

t2_md
g2_md

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

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

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

t2
g2

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)
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?


EXPLICAÇÃO: Regressão múltipla foi utilizada para analisar se o número de docentes, de mestrados (dissertações) e de doutorados (teses) possuem uma associação significativa com a produção de artigos. O modelo explica 87.07% da variância da produção (R2 = 0.87). O número de docentes (3.5, IC 95% [2.58; 4.42]) e o número de doutorados (1, IC 95% [0.64; 1.37]) possuem relação significativa e positiva com a produção. Já a quantidade de mestrados (-0.19, IC 95% [-0.36; -0.03]) tem um efeito bem menor. Esse modelo explica mais variância do que o Modelo 1, indicando que a formação de doutores agrega uma contribuição própria à produção do programa além do simples número de professores.

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_prod = lm(produtividade ~ tem_doutorado + mestrados_pprof + doutorados_pprof, data = cacc)

t3 = tidy(modelo_prod, conf.int = TRUE, conf.level = 0.95)
g3 = glance(modelo_prod)

t3
g3

Discussão do Modelo de Produtividade: Regressão múltipla foi utilizada para analisar se a presença de doutorado (tem_doutorado), a razão de mestrados por professor (mestrados_pprof) e a razão de doutorados por professor (doutorados_pprof) estão associados à produtividade de um programa. O modelo gerado explica cerca de 51.34% da variância na produtividade (R2 = 0.51).

Analisando as estimativas (coeficientes):

Implicações: O que aprendemos é que a formação de doutores é a grande engrenagem de produtividade na pós-graduação em Computação no Brasil. Programas que orientam e titulam mais doutores tendem a ser mais eficientes na produção acadêmica do que aqueles focados no mestrado.

LS0tDQp0aXRsZTogIlJlZ3Jlc3PDo28gbGluZWFyIG5hIHByw6F0aWNhIg0Kb3V0cHV0OiBodG1sX25vdGVib29rDQplZGl0b3Jfb3B0aW9uczogDQogIG1hcmtkb3duOiANCiAgICB3cmFwOiA3Mg0KLS0tDQoNCmBgYHtyIHdhcm5pbmc9RkFMU0UsIGVjaG89RkFMU0V9DQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkoYnJvb20pDQpsaWJyYXJ5KG1vZGVscikNCnNvdXJjZShoZXJlOjpoZXJlKCJjb2RlL2xpYi5SIikpDQp0aGVtZV9zZXQodGhlbWVfYncoKSkNCg0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KHRpZHkgPSBGQUxTRSwNCiAgICAgICAgICAgICAgICAgICAgICBmaWcud2lkdGggPSA2LA0KICAgICAgICAgICAgICAgICAgICAgIGZpZy5oZWlnaHQgPSA1KQ0KDQpwYWxldGEgPSBjKCIjNDA0RTREIiwNCiAgICAgICAgICAgIiM5MkRDRTUiLA0KICAgICAgICAgICAiIzkzOEJBMSIsDQogICAgICAgICAgICIjMkQzMTQyIiwNCiAgICAgICAgICAgIiNGNDc0M0IiKQ0KYGBgDQoNCiMjIERhZG9zIGRhIENBUEVTIHNvYnJlIGF2YWxpYcOnw6NvIGRhIHDDs3MtZ3JhZHVhw6fDo28NCg0KQSBDQVBFUyDDqSB1bSDDs3Jnw6NvIGRvIE1FQyBxdWUgdGVtIGEgYXRyaWJ1acOnw6NvIGRlIGFjb21wYW5oYXIgYQ0KcMOzcy1ncmFkdWHDp8OjbyBuYSB1bml2ZXJzaWRhZGUgYnJhc2lsZWlyYS4gVW1hIGRhcyBmb3JtYXMgcXVlIGVsYQ0KZW5jb250cm91IGRlIGZhemVyIGlzc28gZSBwZWxhIHF1YWwgZWxhIMOpIGJhc3RhbnRlIGNyaXRpY2FkYSDDqSBhdHJhdsOpcw0KZGUgdW1hIGF2YWxpYcOnw6NvIHF1YW50aXRhdGl2YSBhIGNhZGEgeCBhbm9zIChlcmEgMywgbXVkb3UgcGFyYSA0KS4NCg0KVXNhcmVtb3MgZGFkb3MgZGEgcGVuw7psdGltYSBhdmFsaWHDp8OjbyBkYSBDQVBFUzoNCg0KYGBge3J9DQpjYWNjX3R1ZG8gPSByZWFkX3Byb2plY3RkYXRhKCkNCg0KZ2xpbXBzZShjYWNjX3R1ZG8pDQpgYGANCg0KIyMjIFByb2R1w6fDo28gZSBwcm9kdXRpdmlkYWRlIGRlIGFydGlnb3MNCg0KVW1hIGRhcyBtYW5laXJhcyBkZSBhdmFsaWFyIGEgcHJvZHXDp8OjbyBkb3MgZG9jZW50ZXMgcXVlIGEgQ0FQRVMgdXRpbGl6YQ0Kw6kgcXVhbnRpZmljYW5kbyBhIHByb2R1w6fDo28gZGUgYXJ0aWdvcyBwZWxvcyBkb2NlbnRlcy4gT3MgYXJ0aWdvcyBzw6NvDQpjYXRlZ29yaXphZG9zIGVtIGV4dHJhdG9zIG9yZGVuYWRvcyAoQTEgw6kgbyBtYWlzIGFsdG8pLCBlIHNlcGFyYWRvcw0KZW50cmUgYXJ0aWdvcyBlbSBjb25mZXLDqm5jaWFzIGUgcGVyacOzZGljb3MuIFVzYXJlbW9zIHBhcmEgZXNzZSBsYWIgYQ0KcHJvZHXDp8OjbyBlbSBwZXJpw7NkaWNvcyBhdmFsaWFkb3MgY29tIEExLCBBMiBlIEIxLg0KDQpgYGB7cn0NCmNhY2MgPSBjYWNjX3R1ZG8gJT4lDQogIHRyYW5zbXV0ZSgNCiAgICBkb2NlbnRlcyA9IGBEb2NlbnRlcyBwZXJtYW5lbnRlc2AsDQogICAgcHJvZHVjYW8gPSAocGVyaW9kaWNvc19BMSArIHBlcmlvZGljb3NfQTIgKyBwZXJpb2RpY29zX0IxKSwNCiAgICBwcm9kdXRpdmlkYWRlID0gcHJvZHVjYW8gLyBkb2NlbnRlcywNCiAgICBtZXN0cmFkb3MgPSBEaXNzZXJ0YWNvZXMsDQogICAgZG91dG9yYWRvcyA9IFRlc2VzLA0KICAgIHRlbV9kb3V0b3JhZG8gPSB0b2xvd2VyKGBUZW0gZG91dG9yYWRvYCkgPT0gInNpbSIsDQogICAgbWVzdHJhZG9zX3Bwcm9mID0gbWVzdHJhZG9zIC8gZG9jZW50ZXMsDQogICAgZG91dG9yYWRvc19wcHJvZiA9IGRvdXRvcmFkb3MgLyBkb2NlbnRlcw0KICApDQoNCmNhY2NfbWQgPSBjYWNjICU+JSANCiAgZmlsdGVyKHRlbV9kb3V0b3JhZG8pDQpgYGANCg0KIyMjIEVEQQ0KDQpgYGB7cn0NCnNraW1yOjpza2ltKGNhY2MpDQpgYGANCg0KYGBge3J9DQpjYWNjICU+JSANCiAgZ2dwbG90KGFlcyh4ID0gZG9jZW50ZXMpKSArIA0KICBnZW9tX2hpc3RvZ3JhbShiaW5zID0gMTUsIGZpbGwgPSBwYWxldGFbMV0pDQoNCmNhY2MgJT4lIA0KICBnZ3Bsb3QoYWVzKHggPSBwcm9kdWNhbykpICsgDQogIGdlb21faGlzdG9ncmFtKGJpbnMgPSAxNSwgZmlsbCA9IHBhbGV0YVsyXSkNCg0KY2FjYyAlPiUgDQogIGdncGxvdChhZXMoeCA9IHByb2R1dGl2aWRhZGUpKSArIA0KICBnZW9tX2hpc3RvZ3JhbShiaW5zID0gMTUsIGZpbGwgPSBwYWxldGFbM10pDQpgYGANCg0KU2UgcXVpc2VybW9zIG1vZGVsYXIgbyBlZmVpdG8gZG8gdGFtYW5obyBkbyBwcm9ncmFtYSBlbSB0ZXJtb3MgZGUNCmRvY2VudGVzIChwZXJtYW5lbnRlcykgbmEgcXVhbnRpZGFkZSBkZSBhcnRpZ29zIHB1YmxpY2Fkb3MsIHBvZGVtb3MgdXNhcg0KcmVncmVzc8Ojby4NCg0KKkltcG9ydGFudGUqOiBzZW1wcmUgcXVlcmVtb3MgdmVyIG9zIGRhZG9zIGFudGVzIGRlIGZhemVybW9zIHF1YWxxdWVyDQptb2RlbG8gb3Ugc3Vtw6FyaW86DQoNCmBgYHtyfQ0KY2FjYyAlPiUgDQogIGdncGxvdChhZXMoeCA9IGRvY2VudGVzLCB5ID0gcHJvZHVjYW8pKSArIA0KICBnZW9tX3BvaW50KCkNCmBgYA0KDQpQYXJlY2UgcXVlIGV4aXN0ZSB1bWEgcmVsYcOnw6NvLiBWYW1vcyBjcmlhciB1bSBtb2RlbG8gZW50w6NvOg0KDQpgYGB7cn0NCm1vZGVsbzEgPSBsbShwcm9kdWNhbyB+IGRvY2VudGVzLCBkYXRhID0gY2FjYykNCg0KdDEgPSB0aWR5KG1vZGVsbzEsIGNvbmYuaW50ID0gVFJVRSwgY29uZi5sZXZlbCA9IDAuOTUpDQpnMSA9IGdsYW5jZShtb2RlbG8xKQ0KDQp0MQ0KZzENCmBgYA0KDQpQYXJhIHZpc3VhbGl6YXIgbyBtb2RlbG86DQoNCmBgYHtyfQ0KY2FjY19hdWdtZW50ZWQgPSBjYWNjICU+JSANCiAgYWRkX3ByZWRpY3Rpb25zKG1vZGVsbzEpIA0KDQpjYWNjX2F1Z21lbnRlZCAlPiUgDQogIGdncGxvdChhZXMoeCA9IGRvY2VudGVzKSkgKyANCiAgZ2VvbV9saW5lKGFlcyh5ID0gcHJlZCksIGNvbG91ciA9ICJicm93biIpICsgDQogIGdlb21fcG9pbnQoYWVzKHkgPSBwcm9kdWNhbykpICsgDQogIGxhYnMoeSA9ICJQcm9kdcOnw6NvIGRvIHByb2dyYW1hIikNCmBgYA0KDQpTZSBjb25zaWRlcmFybW9zIHF1ZSB0ZW1vcyBhcGVuYXMgdW1hIGFtb3N0cmEgZGUgdG9kb3Mgb3MgcHJvZ3JhbWFzIGRlDQpww7NzIGVtIENDIG5vIEJyYXNpbCwgbyBxdWUgcG9kZW1vcyBpbmZlcmlyIGEgcGFydGlyIGRlc3NlIG1vZGVsbyBzb2JyZSBhDQpyZWxhw6fDo28gZW50cmUgbsO6bWVybyBkZSBkb2NlbnRlcyBwZXJtYW5lbnRlcyBlIHByb2R1w6fDo28gZGUgYXJ0aWdvcyBlbQ0KcHJvZ3JhbWFzIGRlIHDDs3M/DQoNCk5vcm1hbG1lbnRlIHJlcG9ydGFyw61hbW9zIG8gcmVzdWx0YWRvIGRhIHNlZ3VpbnRlIG1hbmVpcmEsIHN1YnN0aXR1aW5kbw0KVmFySW5kZXBYIGUgdG9kb3Mgb3MgeCdzIGUgeSdzIHBlbG9zIG5vbWVzIGUgdmFsb3JlcyBkZSBmYXRvOg0KDQo+IFJlZ3Jlc3PDo28gbcO6bHRpcGxhIGZvaSB1dGlsaXphZGEgcGFyYSBhbmFsaXNhciBzZSBWYXJJbmRlcDEgZQ0KPiBWYXJJbmRlcDIgdGVtIHVtYSBhc3NvY2lhw6fDo28gc2lnbmlmaWNhdGl2YSBjb20gVmFyRGVwLiBPcyByZXN1bHRhZG9zDQo+IGRhIHJlZ3Jlc3PDo28gaW5kaWNhbSBxdWUgdW0gbW9kZWxvIGNvbSBvcyAyIHByZWRpdG9yZXMgbm8gZm9ybWF0bw0KPiBWYXJEZXAgPSBYWFguVmFySW5kZXAxICsgWVlZLlZhckluZGVwMiBleHBsaWNhbSBYWCxYWCUgZGEgdmFyacOibmNpYSBkYQ0KPiB2YXJpw6F2ZWwgZGUgcmVzcG9zdGEgKFIyID0gWFgsWFgpLiBWYXJJbmRlcDEsIG1lZGlkYSBjb21vL2VtIFt1bmlkYWRlDQo+IG91IG8gcXVlIMOpIG8gMCBlIG8gcXVlIMOpIDFdIHRlbSB1bWEgcmVsYcOnw6NvIHNpZ25pZmljYXRpdmEgY29tIG8gZXJybw0KPiAoYiA9IFt5eSx5eTsgenosenpdLCBJQyBjb20gOTUlKSwgYXNzaW0gY29tbyBWYXJJbmRlcDIgbWVkaWRhIGNvbW8NCj4gW3VuaWRhZGUgb3UgbyBxdWUgw6kgbyAwIGUgbyBxdWUgw6kgMV0gKGIgPSBbeXkseXk7IHp6LHp6XSwgSUMgY29tIDk1JSkuDQo+IE8gYXVtZW50byBkZSAxIHVuaWRhZGUgZGUgVmFySW5kZXAxIHByb2R1eiB1bWEgbXVkYW7Dp2EgZGUgeHh4IGVtDQo+IFZhckRlcCwgZW5xdWFudG8gdW0gYXVtZW50by4uLg0KDQpQcm9kdXphIGFxdWkgYSBzdWEgdmVyc8OjbyBkZXNzZSB0ZXh0bywgcG9ydGFudG86DQoNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQpSZWdyZXNzw6NvIGxpbmVhciBzaW1wbGVzIGZvaSB1dGlsaXphZGEgcGFyYSBhbmFsaXNhciBzZSBvIG7Dum1lcm8gZGUNCmRvY2VudGVzIHBlcm1hbmVudGVzIHRlbSB1bWEgYXNzb2NpYcOnw6NvIHNpZ25pZmljYXRpdmEgY29tIGEgcHJvZHXDp8OjbyBkZQ0KYXJ0aWdvcyAoQTEsIEEyLCBCMSkgZGUgdW0gcHJvZ3JhbWEuIE9zIHJlc3VsdGFkb3MgZGEgcmVncmVzc8OjbyBpbmRpY2FtDQpxdWUgdW0gbW9kZWxvIGNvbSBvcyBkb2lzIHByZWRpdG9yZXMgbm8gZm9ybWF0byBQcm9kdcOnw6NvID0NCmByIHJvdW5kKHQxJGVzdGltYXRlWzFdLCAyKWAgKyBgciByb3VuZCh0MSRlc3RpbWF0ZVsyXSwgMilgIFwqIERvY2VudGVzDQpleHBsaWNhIGByIHJvdW5kKGcxJHIuc3F1YXJlZCAqIDEwMCwgMilgJSBkYSB2YXJpw6JuY2lhIGRhIHZhcmnDoXZlbCBkZQ0KcmVzcG9zdGEgKFIyID0gYHIgcm91bmQoZzEkci5zcXVhcmVkLCAyKWApLiBPIG7Dum1lcm8gZGUgZG9jZW50ZXMgdGVtIHVtYQ0KcmVsYcOnw6NvIHNpZ25pZmljYXRpdmEgZSBwb3NpdGl2YSBjb20gYSBwcm9kdcOnw6NvIChiID0NCmByIHJvdW5kKHQxJGVzdGltYXRlWzJdLCAyKWAsIElDIGNvbSA5NSUgW2ByIHJvdW5kKHQxJGNvbmYubG93WzJdLCAyKWA7DQpgciByb3VuZCh0MSRjb25mLmhpZ2hbMl0sIDIpYF0pLiBPIGF1bWVudG8gZGUgMSBkb2NlbnRlIHBlcm1hbmVudGUNCnByb2R1eiB1bWEgbXVkYW7Dp2EgbcOpZGlhIGRlIGByIHJvdW5kKHQxJGVzdGltYXRlWzJdLCAyKWAgYXJ0aWdvcyBuYQ0KcHJvZHXDp8OjbyBkbyBwcm9ncmFtYS4NCg0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCkRpdG8gaXNzbywgbyBxdWUgc2lnbmlmaWNhIGEgcmVsYcOnw6NvIHF1ZSB2b2PDqiBlbmNvbnRyb3UgbmEgcHLDoXRpY2EgcGFyYQ0KZW50ZW5kZXJtb3Mgb3MgcHJvZ3JhbWFzIGRlIHDDs3MgZ3JhZHVhw6fDo28gbm8gQnJhc2lsPyBFIGFsZ3VtIHBhbHBpdGUgZGUNCnBvciBxdWUgYSByZWxhw6fDo28gcXVlIGVuY29udHJhbW9zIMOpIGZvcnRlPw0KDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KQSByZWxhw6fDo28gZm9ydGUgZSBwb3NpdGl2YSBpbmRpY2EgcXVlIG8gdGFtYW5obyBkbyBjb3JwbyBkb2NlbnRlDQooZG9jZW50ZXMgcGVybWFuZW50ZXMpIMOpIG8gcHJpbmNpcGFsIG1vdG9yIGRvIHZvbHVtZSBkZSBwdWJsaWNhw6fDtWVzIGRlDQphbHRhIHF1YWxpZGFkZSAoQTEsIEEyLCBCMSkuIE1haXMgcHJvZmVzc29yZXMgZ2VyYW0gbWFpcyBwZXNxdWlzYXMgZQ0Kb3JpZW50YcOnw7VlcywgbyBxdWUgcmVzdWx0YSBlbSBtYWlzIGFydGlnb3MuIE5vIGVudGFudG8sIGZvY2FyIGFwZW5hcyBuYQ0KcHJvZHXDp8OjbyB0b3RhbCBwb2RlIG1hc2NhcmFyIGEgZWZpY2nDqm5jaWEgZGUgY2FkYSBkb2NlbnRlDQoocHJvZHV0aXZpZGFkZSksIGrDoSBxdWUgdW0gcHJvZ3JhbWEgbWFpb3IgbmF0dXJhbG1lbnRlIHByb2R1emlyw6EgbWFpcw0KcXVlIHVtIHByb2dyYW1hIG1lbm9yLg0KDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KIyMgTWFpcyBmYXRvcmVzDQoNCmBgYHtyfQ0KbW9kZWxvMiA9IGxtKHByb2R1Y2FvIH4gZG9jZW50ZXMgKyBtZXN0cmFkb3NfcHByb2YgKyBkb3V0b3JhZG9zX3Bwcm9mICsgdGVtX2RvdXRvcmFkbywgDQogICAgICAgICAgICAgZGF0YSA9IGNhY2NfbWQpDQoNCnQyX21kID0gdGlkeShtb2RlbG8yLCBjb25mLmludCA9IFRSVUUsIGNvbmYubGV2ZWwgPSAwLjk1KQ0KZzJfbWQgPSBnbGFuY2UobW9kZWxvMikNCg0KdDJfbWQNCmcyX21kDQpgYGANCg0KRSBzZSBjb25zaWRlcmFybW9zIHRhbWLDqW0gbyBuw7ptZXJvIGRlIGFsdW5vcz8NCg0KYGBge3J9DQptb2RlbG8yID0gbG0ocHJvZHVjYW8gfiBkb2NlbnRlcyArIG1lc3RyYWRvcyArIGRvdXRvcmFkb3MsIGRhdGEgPSBjYWNjKQ0KDQp0MiA9IHRpZHkobW9kZWxvMiwgY29uZi5pbnQgPSBUUlVFLCBjb25mLmxldmVsID0gMC45NSkNCmcyID0gZ2xhbmNlKG1vZGVsbzIpDQoNCnQyDQpnMg0KYGBgDQoNClZpc3VhbGl6YXIgbyBtb2RlbG8gY29tIG11aXRhcyB2YXJpw6F2ZWlzIGluZGVwZW5kZW50ZXMgZmljYSBtYWlzIGRpZsOtY2lsDQoNCmBgYHtyfQ0KcGFyYV9wbG90YXJfbW9kZWxvID0gY2FjYyAlPiUgDQogIGRhdGFfZ3JpZChwcm9kdWNhbyA9IHNlcV9yYW5nZShwcm9kdWNhbywgMTApLCAjIENyaWUgdW0gdmV0b3IgZGUgMTAgdmFsb3JlcyBubyByYW5nZQ0KICAgICAgICAgICAgZG9jZW50ZXMgPSBzZXFfcmFuZ2UoZG9jZW50ZXMsIDQpLCAgDQogICAgICAgICAgICAjIG1lc3RyYWRvcyA9IHNlcV9yYW5nZShtZXN0cmFkb3MsIDMpLA0KICAgICAgICAgICAgbWVzdHJhZG9zID0gbWVkaWFuKG1lc3RyYWRvcyksDQogICAgICAgICAgICBkb3V0b3JhZG9zID0gc2VxX3JhbmdlKGRvdXRvcmFkb3MsIDMpKSAlPiUgDQogIGFkZF9wcmVkaWN0aW9ucyhtb2RlbG8yKQ0KDQpnbGltcHNlKHBhcmFfcGxvdGFyX21vZGVsbykNCg0KYGBgDQoNCmBgYHtyfQ0KcGFyYV9wbG90YXJfbW9kZWxvICU+JSANCiAgZ2dwbG90KGFlcyh4ID0gZG9jZW50ZXMsIHkgPSBwcmVkKSkgKyANCiAgZ2VvbV9saW5lKGFlcyhncm91cCA9IGRvdXRvcmFkb3MsIGNvbG91ciA9IGRvdXRvcmFkb3MpKSArIA0KICBnZW9tX3BvaW50KGRhdGEgPSBjYWNjLCBhZXMoeSA9IHByb2R1Y2FvLCBjb2xvdXIgPSBkb3V0b3JhZG9zKSkNCmBgYA0KDQpDb25zaWRlcmFuZG8gYWdvcmEgZXNzZXMgdHLDqnMgZmF0b3JlcywgbyBxdWUgcG9kZW1vcyBkaXplciBzb2JyZSBjb21vDQpjYWRhIHVtIGRlbGVzIHNlIHJlbGFjaW9uYSBjb20gYSBwcm9kdcOnw6NvIGRlIHVtIHByb2dyYW1hIGRlIHDDs3MgZW0gQ0M/IEUNCnNvYnJlIG8gbW9kZWxvPyBFbGUgZXhwbGljYSBtYWlzIHF1ZSBvIG1vZGVsbyAxPw0KDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KIyMgKipFWFBMSUNBw4fDg08qKjogUmVncmVzc8OjbyBtw7psdGlwbGEgZm9pIHV0aWxpemFkYSBwYXJhIGFuYWxpc2FyIHNlIG8gbsO6bWVybyBkZSBkb2NlbnRlcywgZGUgbWVzdHJhZG9zIChkaXNzZXJ0YcOnw7VlcykgZSBkZSBkb3V0b3JhZG9zICh0ZXNlcykgcG9zc3VlbSB1bWEgYXNzb2NpYcOnw6NvIHNpZ25pZmljYXRpdmEgY29tIGEgcHJvZHXDp8OjbyBkZSBhcnRpZ29zLiBPIG1vZGVsbyBleHBsaWNhIGByIHJvdW5kKGcyJHIuc3F1YXJlZCAqIDEwMCwgMilgJSBkYSB2YXJpw6JuY2lhIGRhIHByb2R1w6fDo28gKFIyID0gYHIgcm91bmQoZzIkci5zcXVhcmVkLCAyKWApLiBPIG7Dum1lcm8gZGUgZG9jZW50ZXMgKGByIHJvdW5kKHQyJGVzdGltYXRlWzJdLCAyKWAsIElDIDk1JSBbYHIgcm91bmQodDIkY29uZi5sb3dbMl0sIDIpYDsgYHIgcm91bmQodDIkY29uZi5oaWdoWzJdLCAyKWBdKSBlIG8gbsO6bWVybyBkZSBkb3V0b3JhZG9zIChgciByb3VuZCh0MiRlc3RpbWF0ZVs0XSwgMilgLCBJQyA5NSUgW2ByIHJvdW5kKHQyJGNvbmYubG93WzRdLCAyKWA7IGByIHJvdW5kKHQyJGNvbmYuaGlnaFs0XSwgMilgXSkgcG9zc3VlbSByZWxhw6fDo28gc2lnbmlmaWNhdGl2YSBlIHBvc2l0aXZhIGNvbSBhIHByb2R1w6fDo28uIErDoSBhIHF1YW50aWRhZGUgZGUgbWVzdHJhZG9zIChgciByb3VuZCh0MiRlc3RpbWF0ZVszXSwgMilgLCBJQyA5NSUgW2ByIHJvdW5kKHQyJGNvbmYubG93WzNdLCAyKWA7IGByIHJvdW5kKHQyJGNvbmYuaGlnaFszXSwgMilgXSkgdGVtIHVtIGVmZWl0byBiZW0gbWVub3IuIEVzc2UgbW9kZWxvIGV4cGxpY2EgbWFpcyB2YXJpw6JuY2lhIGRvIHF1ZSBvIE1vZGVsbyAxLCBpbmRpY2FuZG8gcXVlIGEgZm9ybWHDp8OjbyBkZSBkb3V0b3JlcyBhZ3JlZ2EgdW1hIGNvbnRyaWJ1acOnw6NvIHByw7NwcmlhIMOgIHByb2R1w6fDo28gZG8gcHJvZ3JhbWEgYWzDqW0gZG8gc2ltcGxlcyBuw7ptZXJvIGRlIHByb2Zlc3NvcmVzLg0KDQojIyBBZ29yYSBwcm9kdXRpdmlkYWRlDQoNCkRpZmVyZW50ZSBkZSBtZWRpcm1vcyBwcm9kdcOnw6NvICh0b3RhbCBwcm9kdXppZG8pLCDDqSBtZWRpcm1vcw0KcHJvZHV0aXZpZGFkZSAocHJvZHV6aWRvIC8gdXRpbGl6YWRvKS4gQWJhaXhvIGZvY2FyZW1vcyBuZXNzYSBhbsOhbGlzZS4NClBhcmEgaXNzbyBjcmllIHVtIG1vZGVsbyBxdWUgaW52ZXN0aWdhIGNvbW8gdW0gY29uanVudG8gZGUgZmF0b3JlcyBxdWUNCnZvY8OqIGp1bGdhIHF1ZSBzw6NvIHJlbGV2YW50ZXMgc2UgcmVsYWNpb25hbSBjb20gYSBwcm9kdXRpdmlkYWRlIGRvcw0KcHJvZ3JhbWFzLiBDcmllIHVtIG1vZGVsbyBxdWUgYXZhbGllIGNvbW8gKnBlbG8gbWVub3MgMyBmYXRvcmVzKiBzZQ0KcmVsYWNpb25hbSBjb20gYSBwcm9kdXRpdmlkYWRlIGRlIHVtIHByb2dyYW1hLiBQb2RlIHJldXRpbGl6YXIgZmF0b3Jlcw0KcXVlIGrDoSBkZWZpbmltb3MgZSBhbmFsaXphbW9zIHBhcmEgcHJvZHXDp8Ojby4gTWFzIGN1aWRhZG8gcGFyYSBuw6NvDQppbmNsdWlyIGZhdG9yZXMgcXVlIHNlamFtIGZ1bsOnw6NvIGxpbmVhciBkZSBvdXRyb3MgasOhIGluY2x1w61kb3MgKGV4Og0KaW5jbHVpciBBLCBCIGUgdW0gdGVyY2VybyBDPUErQikNCg0KUHJvZHV6YSBhYmFpeG8gbyBtb2RlbG8gZSB1bSB0ZXh0byBxdWUgY29tZW50ZSAoaSkgbyBtb2RlbG8sIHRhbCBjb21vIG9zDQpxdWUgZml6ZW1vcyBhbnRlcywgZSAoaWkpIGFzIGltcGxpY2HDp8O1ZXMgLSBvIHF1ZSBhcHJlbmRlbW9zIHNvYnJlIGNvbW8NCmZ1bmNpb25hbSBwcm9ncmFtYXMgZGUgcMOzcyBubyBicmFzaWw/Lg0KDQpgYGB7cn0NCm1vZGVsb19wcm9kID0gbG0ocHJvZHV0aXZpZGFkZSB+IHRlbV9kb3V0b3JhZG8gKyBtZXN0cmFkb3NfcHByb2YgKyBkb3V0b3JhZG9zX3Bwcm9mLCBkYXRhID0gY2FjYykNCg0KdDMgPSB0aWR5KG1vZGVsb19wcm9kLCBjb25mLmludCA9IFRSVUUsIGNvbmYubGV2ZWwgPSAwLjk1KQ0KZzMgPSBnbGFuY2UobW9kZWxvX3Byb2QpDQoNCnQzDQpnMw0KYGBgDQoNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQoqKkRpc2N1c3PDo28gZG8gTW9kZWxvIGRlIFByb2R1dGl2aWRhZGUqKjogUmVncmVzc8OjbyBtw7psdGlwbGEgZm9pDQp1dGlsaXphZGEgcGFyYSBhbmFsaXNhciBzZSBhIHByZXNlbsOnYSBkZSBkb3V0b3JhZG8gKGB0ZW1fZG91dG9yYWRvYCksIGENCnJhesOjbyBkZSBtZXN0cmFkb3MgcG9yIHByb2Zlc3NvciAoYG1lc3RyYWRvc19wcHJvZmApIGUgYSByYXrDo28gZGUNCmRvdXRvcmFkb3MgcG9yIHByb2Zlc3NvciAoYGRvdXRvcmFkb3NfcHByb2ZgKSBlc3TDo28gYXNzb2NpYWRvcyDDoA0KcHJvZHV0aXZpZGFkZSBkZSB1bSBwcm9ncmFtYS4gTyBtb2RlbG8gZ2VyYWRvIGV4cGxpY2EgY2VyY2EgZGUNCmByIHJvdW5kKGczJHIuc3F1YXJlZCAqIDEwMCwgMilgJSBkYSB2YXJpw6JuY2lhIG5hIHByb2R1dGl2aWRhZGUgKFIyID0NCmByIHJvdW5kKGczJHIuc3F1YXJlZCwgMilgKS4NCg0KQW5hbGlzYW5kbyBhcyBlc3RpbWF0aXZhcyAoY29lZmljaWVudGVzKToNCg0KLSAqKlByZXNlbsOnYSBkZSBEb3V0b3JhZG8qKiAoYHIgcm91bmQodDMkZXN0aW1hdGVbMl0sIDIpYCwgSUMgOTUlDQogIFtgciByb3VuZCh0MyRjb25mLmxvd1syXSwgMilgOyBgciByb3VuZCh0MyRjb25mLmhpZ2hbMl0sIDIpYF0pOg0KICBQcm9ncmFtYXMgY29tIGN1cnNvIGRlIGRvdXRvcmFkbyBwb3NzdWVtIHVtIGF1bWVudG8gZXNwZXJhZG8gbcOpZGlvDQogIHNpZ25pZmljYXRpdm8gbmEgc3VhIHByb2R1dGl2aWRhZGUgKGVmZWl0byBwb3NpdGl2byBmb3J0ZSkuDQoNCi0gKipEb3V0b3JhZG9zIHBvciBQcm9mZXNzb3IqKiAoYHIgcm91bmQodDMkZXN0aW1hdGVbNF0sIDIpYCwgSUMgOTUlDQogIFtgciByb3VuZCh0MyRjb25mLmxvd1s0XSwgMilgOyBgciByb3VuZCh0MyRjb25mLmhpZ2hbNF0sIDIpYF0pOiBBIHRheGENCiAgZGUgdGVzZXMgY29uY2x1w61kYXMgcG9yIHByb2Zlc3NvciB0YW1iw6ltIGNvbnRyaWJ1aSBwb3NpdGl2YW1lbnRlLg0KICBRdWFudG8gbWFpb3IgYSBmb3JtYcOnw6NvIGRlIGRvdXRvcmVzLCBtYWlzIHByb2R1dGl2byDDqSBvIGNvcnBvIGRvY2VudGUuDQoNCi0gKipNZXN0cmFkb3MgcG9yIFByb2Zlc3NvcioqIChgciByb3VuZCh0MyRlc3RpbWF0ZVszXSwgMilgLCBJQyA5NSUNCiAgW2ByIHJvdW5kKHQzJGNvbmYubG93WzNdLCAyKWA7IGByIHJvdW5kKHQzJGNvbmYuaGlnaFszXSwgMilgXSk6IFRlbQ0KICBpbXBhY3RvIG1lbm9yLCBpbmRpY2FuZG8gcXVlIHVtIGFsdG8gdm9sdW1lIGRlIGRpc3NlcnRhw6fDtWVzIHBvciBzaSBzw7MNCiAgbsOjbyBhbGF2YW5jYSBhcyBwdWJsaWNhw6fDtWVzIGRlIGFsdG8gZXN0cmF0byAoQTEtQjEpIGNvbXBhcmFkbyBhbw0KICBkb3V0b3JhZG8uDQoNCioqSW1wbGljYcOnw7VlcyoqOiBPIHF1ZSBhcHJlbmRlbW9zIMOpIHF1ZSBhIGZvcm1hw6fDo28gZGUgZG91dG9yZXMgw6kgYQ0KZ3JhbmRlIGVuZ3JlbmFnZW0gZGUgcHJvZHV0aXZpZGFkZSBuYSBww7NzLWdyYWR1YcOnw6NvIGVtIENvbXB1dGHDp8OjbyBubw0KQnJhc2lsLiBQcm9ncmFtYXMgcXVlIG9yaWVudGFtIGUgdGl0dWxhbSBtYWlzIGRvdXRvcmVzIHRlbmRlbSBhIHNlciBtYWlzDQplZmljaWVudGVzIG5hIHByb2R1w6fDo28gYWNhZMOqbWljYSBkbyBxdWUgYXF1ZWxlcyBmb2NhZG9zIG5vIG1lc3RyYWRvLg0K