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 FE…
$ Programa                     <chr> "INFORMÁTICA (12001015012P2)", "CIÊNCIA DA COMPUTAÇÃ…
$ Nível                        <int> 5, 4, 3, 3, 3, 5, 4, 3, 3, 3, 5, 3, 3, 3, 4, 6, 3, 3…
$ Sigla                        <chr> "UFAM", "UFPA", "UFMA", "UEMA", "FUFPI", "UFC", "UNI…
$ `Tem doutorado`              <chr> "Sim", "Sim", "Não", "Não", "Não", "Sim", "Sim", "Nã…
$ `Docentes colaboradores`     <dbl> 0.25, 5.50, 3.00, 6.25, 1.75, 2.00, 1.00, 6.25, 2.75…
$ `Docentes permanentes`       <dbl> 24.75, 14.00, 10.00, 14.00, 9.50, 20.75, 16.00, 15.7…
$ `Docentes visitantes`        <dbl> 0.00, 0.00, 0.00, 0.00, 0.00, 0.75, 0.50, 1.00, 0.50…
$ `Resumos em conf`            <int> 20, 23, 15, 5, 4, 10, 6, 136, 0, 24, 27, 4, 30, 20, …
$ `Resumos expandidos em conf` <int> 25, 24, 7, 10, 1, 68, 9, 13, 4, 6, 16, 5, 25, 29, 28…
$ `Artigos em conf`            <int> 390, 284, 115, 73, 150, 269, 179, 0, 120, 92, 389, 6…
$ Dissertacoes                 <int> 108, 77, 50, 25, 31, 75, 60, 129, 45, 3, 108, 12, 94…
$ Teses                        <int> 14, 0, 0, 0, 0, 24, 5, 0, 0, 0, 29, 0, 0, 0, 40, 144…
$ periodicos_A1                <int> 15, 19, 5, 1, 7, 21, 21, 0, 3, 8, 44, 0, 6, 21, 20, …
$ periodicos_A2                <int> 19, 21, 11, 1, 4, 32, 13, 0, 9, 2, 23, 2, 6, 20, 15,…
$ periodicos_B1                <int> 19, 38, 7, 3, 6, 26, 16, 2, 6, 4, 32, 4, 2, 11, 29, …
$ periodicos_B2                <int> 1, 12, 2, 6, 0, 0, 11, 0, 0, 2, 1, 0, 0, 4, 1, 10, 6…
$ periodicos_B3                <int> 3, 16, 2, 2, 3, 16, 15, 0, 4, 6, 9, 0, 2, 6, 16, 20,…
$ periodicos_B4                <int> 0, 4, 0, 3, 3, 0, 1, 3, 1, 6, 0, 0, 4, 5, 1, 3, 3, 5…
$ periodicos_B5                <int> 10, 16, 8, 4, 12, 4, 16, 2, 6, 2, 11, 0, 4, 16, 9, 2…
$ periodicos_C                 <int> 9, 34, 12, 5, 2, 3, 11, 9, 5, 10, 16, 1, 14, 28, 8, …
$ periodicos_NA                <int> 7, 15, 8, 11, 12, 6, 19, 31, 7, 14, 19, 0, 27, 26, 1…
$ per_comaluno_A1              <int> 4, 1, 0, 0, 1, 7, 5, 0, 1, 0, 10, 0, 0, 2, 8, 63, 1,…
$ per_comaluno_A2              <int> 5, 5, 5, 0, 2, 15, 3, 0, 3, 0, 3, 0, 0, 1, 11, 22, 0…
$ per_comaluno_B1              <int> 4, 2, 5, 2, 2, 14, 6, 0, 2, 0, 17, 0, 1, 5, 18, 37, …
$ per_comaluno_B2              <int> 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 4, 0, 0…
$ per_comaluno_B3              <int> 2, 2, 0, 1, 0, 7, 9, 0, 2, 0, 4, 0, 0, 1, 10, 12, 0,…
$ per_comaluno_B4              <int> 0, 0, 0, 0, 2, 0, 1, 0, 1, 3, 0, 0, 2, 0, 0, 2, 0, 2…
$ per_comaluno_B5              <int> 5, 0, 4, 0, 8, 3, 6, 0, 4, 0, 4, 0, 2, 5, 3, 17, 1, …
$ per_comaluno_C               <int> 6, 5, 3, 1, 2, 3, 7, 1, 2, 4, 8, 0, 11, 3, 8, 13, 4,…
$ per_comaluno_NA              <int> 6, 14, 2, 2, 9, 3, 6, 4, 5, 1, 10, 0, 17, 6, 7, 17, …

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?

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 simples foi utilizada para analisar se docentes (medida como o número de docentes permanentes) tem uma associação significativa com producao (medida como o número de artigos publicados pelos docentes em periódicos avaliados como A1, A2 e B1) nas universidades. Os resultados da regressão indicam que um modelo com um preditor no formato \[producao = 4.81337 * docentes -41.27309\] explica 81.46% da variância da variável de resposta (\(R^2 = 0.8145886\)). docentes tem uma relação significativa com o erro (b = [4.269955; 5.356786], IC com 95%). Segundo o modelo, o aumento de 1 unidade de docentes produz um aumento de 4.81337 unidades em producao.


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?


Através da análise dos dados percebemos uma relação positiva muito forte entre docentes e producao, indicando que quanto maior o número de docentes permanentes em uma universidade, maior é a quantidade de artigos publicados por eles em periódicos A1, A2 e B1.

Um palpite para esta forte relação é a maturidade de um docente permanente como pesquisador. O docente permanente acompanha várias pesquisas, orienta vários alunos em graduação e pós graduação, além de ter suas próprias pesquisas pessoais, tendo consequentemente conteúdo suficiente para produzir conhecimento relevante para a comunidade científica, reportando resultados publicados em artigos avaliados como A1, A2 ou B1. É importante pontuar que este palpite não exclui as contribuições oriundas de docentes não permanentes ou de discentes, mas o esperado é que a produção dos pesquisadores docentes permanentes seja maior e melhor qualificada.


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…
$ docentes   <dbl> 8.25000, 8.25000, 8.25000, 27.91667, 27.91667, 27.91667, 47.58333, 47.…
$ mestrados  <int> 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58…
$ doutorados <dbl> 0, 76, 152, 0, 76, 152, 0, 76, 152, 0, 76, 152, 0, 76, 152, 0, 76, 152…
$ pred       <dbl> 3.199123, 79.257725, 155.316327, 72.026777, 148.085378, 224.143980, 14…
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 docentes (medida como o número de docentes permanentes), mestrados_pprof (medida como a relação do número de dissertações por docente permanente) e doutorados_pprof (medida como a relação do número de teses por docente permanente) tem uma associação significativa com producao (medida como o número de artigos publicados pelos docentes em em periódicos avaliados como A1, A2 e B1) nas universidades. Os resultados da regressão indicam que um modelo com os 3 preditores no formato \[producao = 4.38981679*docentes+0.03183872*mestrados\_pprof+16.10750304*doutorados\_pprof-39.47122811\] explicam 81.62% da variância da variável de resposta (\(R^2\) = 0.8162424). A variável docentes tem uma relação significativa com o erro (b = [3.288230;5.491403], IC com 95%, p-valor 4.383268e-09). Por outro lado, não conseguimos afirmar estatisticamente que doutorados_pprof tem uma relação significativa com o erro, pois o intervalo de confiança inclui o valor zero e o p-valor está acima de 5%, fazendo com que não seja possível descartar a hipótese nula de que o coeficiente para esta variável preditiva é zero (b = [-1.866295;34.081301], IC com 95%, p-valor 7.717000e-02). O mesmo se aplica a mestrados_pprof, para o qual não podemos afirmar estatisticamente que tem relação com o erro, pois o valor zero está dentro do intervalo de confiança e o p-valor também está acima de 5% (b = [-7.086640,7.150317], IC com 95%). Segundo o modelo, O aumento de 1 unidade de docentes produz um aumento de 4.38981679 em producao, o aumento de 1 unidade de doutorados_pprof produz um aumento de 16.10750304 em producao e o aumento de 1 unidade de mestrados_pprof produz um decréscimo de 0.03183872 em producao.


Regressão múltipla também foi utilizada para analisar se docentes (medida como o número de docentes permanentes), mestrados (medida como o número de dissertações) e doutorados (medida como o número de teses) tem uma associação significativa com producao (medida como o número de artigos publicados pelos docentes em em periódicos avaliados como A1, A2 e B1) nas universidades. Os resultados da regressão indicam que um modelo com os 3 preditores no formato \[producao=3.4997112*docentes-0.1949515*mestrados+1.0007711*doutorados-14.3663077\] explicam 87.07% da variância da variável de resposta (\(R^2\) = 0.8706642). A variável docentes tem uma relação significativa com o erro (b = [2.5827257;4.4166967], IC com 95%). A variável doutorados também apresenta uma relação com um erro, não tão significativa como docentes mas ainda significativa (b = [0.6355112;1.3660309], IC com 95%). Já mestrados tem uma relação pouco significativa com o erro (b = [-0.3577316;-0.0321714], IC com 95%). Segundo o modelo, O aumento de 1 unidade de docentes produz um aumento de 3.4997112 em producao, o aumento de 1 unidade de doutorados produz um aumento de 1.0007711 em producao e o aumento de 1 unidade de mestrados produz um decréscimo de 0.1949515 em producao.


Analisando os dois modelos:

De maneira prática, nos dois modelos considerando mais fatores, percebemos a relação forte que o número de teses de doutorado tem com a quantidade de produções científicas dos docentes da universidade. Isso pode ser explicado novamente pela característica de maturidade dos pesquisadores. Espera-se que pesquisas desenvolvidas em um doutorado tenham um impacto científico muito maior quando comparadas com as pequisas desenvolvidas em um mestrado ou graduação. Muitas vezes a pesquisa do doutorado de algum aluno é uma ramificação de uma pesquisa existente do docente orientador. O docente a frente de tais pesquisas, coordenando, orientando, participando ativamente, terá um acervo de conteúdos e resultados que o permita sintetizar em artigos que possam ser publicados em periódicos avaliados com A1, A2 ou B1.

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


Pelos resultados anteriores, docentes e doutorados tiveram relação forte com producao e espera-se que também tenham uma relação forte com produtividade. Como os dados de produtividade foram gerados utilizando docentes, vamos desconsiderar docentes como fator. Será considerada também a variável tem_doutorado.

Análise descritiva

Antes de gerar modelos precisamos ver os dados e buscar visualmente por relações entre eles. Primeiramente vamos avaliar a relação do números de teses de doutorado com a produtividade e ver se ter doutorado ou não na universidade tem impacto na produtividade.

cacc %>% 
    ggplot(aes(x = doutorados, y = produtividade)) + 
    geom_point() +
    ggtitle("Produtividade x doutorados")


cacc %>% 
    filter(doutorados > 0) %>%
    ggplot(aes(x = doutorados, y = produtividade)) + 
    geom_point() +
    ggtitle("Produtividade x doutorados (filtrando doutorados = 0)")


cacc %>% 
    ggplot(aes(x = tem_doutorado, y = produtividade)) + 
    geom_boxplot() +
    geom_jitter(height = 0, width = 0.1) +
    geom_hline(yintercept = mean(cacc$produtividade), color = "red", linetype = "dashed", size = 1) +
    annotate("text", x = 0, y = mean(cacc$produtividade), label = "Média", hjust = -0.5, vjust = -1, color = "red", size = 4) +
    ggtitle("Produtividade x tem_doutorado (Análise por boxplots)")

O gráfico produtividade x doutorados mostrou que há uma produtividade considerável em cursos que não tem doutorado, valendo a pena considerar o fator mestrados como possível preditivo para produtividade. Ao filtrar as universidades que tem alguma tese de doutorado, fica visível uma possível relação linear entre produtividade e doutorado. No gráfico produtividade x tem_doutorado, analisando os boxplots, como não há sobreposição de IQR conseguimos inferir que ter doutorado em uma universidade implica que a produtividade é maior do que na universidade que não tem. Percebemos que 75% das amostras de universidades que tem doutorado tem uma produtividade maior do que 75% das amostras de universidade que não tem doutorado. É importante observar também que 75% das amostras de produtividade das universidades que tem doutorado estão acima da média de produtividade.

Antes de tomar a decisão pelos fatores doutorados, tem_doutorado e mestrados, vamos analisar a matriz de correlação em busca de outros fatores que possam nos ajudar a encontrar um modelo que explique bem a variância de produtividade e/ou confirmar que os fatores pré-selecionados fazem sentido:

correlacao_spearman <- cor(cacc, method = "spearman")

corrplot(correlacao_spearman, method = "circle", addCoef.col=TRUE, number.cex=0.7, tl.srt = 30)

O primeiro passo é eliminar as variáveis docentes e producao por terem relação direta com a variável dependente produtividade. Das restantes, doutorados_pprof será eliminada por ser função de doutorados e mestrados_pprof será eliminada por ser função de mestrados. Os fatores restantes são os que foram julgados como relevantes na primeira análise: doutorados, tem_doutorado e mestrados. A matriz de correlação serviu para confirmar que existe uma relação entre cada um dos fatores preditivos e a variável de resposta, mesmo que moderada para doutorados e tem_doutorado e fraca para mestrados. Espera-se que juntos em um modelo linear eles consigam explicar bem a produtividade.

Regressão Linear

Dando continuidade com a regressão linear múltipla com os 3 fatores doutorados, tem_doutorado e mestrados:

modelo_produtividade = lm(produtividade ~ mestrados+doutorados+tem_doutorado, data = cacc)

tidy(modelo_produtividade, conf.int = TRUE, conf.level = 0.95)

glance(modelo_produtividade)

Uma forma de visualizar o modelo:

para_plotar_modelo = cacc %>% 
  data_grid(produtividade = seq_range(produtividade, 10), # Crie um vetor de 10 valores no range
            doutorados = seq_range(doutorados, 4),
            mestrados = median(mestrados),
            tem_doutorado = tem_doutorado) %>% 
  add_predictions(modelo_produtividade)

para_plotar_modelo %>% 
  ggplot(aes(x = doutorados, y = pred)) + 
  geom_line(aes(group = tem_doutorado, colour = tem_doutorado)) + 
  geom_point(data = cacc, aes(y = produtividade, colour = tem_doutorado))

  1. Sobre o modelo:

Regressão múltipla foi utilizada para analisar se mestrados (medida como o número de dissertações), doutorados (medida como o número de teses) e tem_doutorado (variável categórica que define ter ou não doutorado) tem uma associação significativa com produtividade (medida como a relação entre a produção de artigos científicos A1, A2 e B1 e o número de docentes permanentes) na universidade. Os resultados da regressão indicam que um modelo com os 3 preditores no formato \[produtividade=-0.002488487*mestrados+0.019598340*doutorados+1.275795664*tem\_doutorado+1.665653302\] explicam 51.5% da variância da variável de resposta (\(R^2\) = 0.515007). Não conseguimos afirmar estatisticamente que mestrados tem uma relação com o erro, pois o intervalo de confiança para o coeficiente contém o zero e o p-valor está acima de 5%, impedindo que a hipótese nula do coeficiente ser zero seja descartada (b = [-0.008572572;0.003595598], IC com 95%, p-valor 4.173286e-01). Por outro lado, doutorados tem uma relação significativa com o erro (b = [0.006442110;0.032754570], IC com 95%, p-valor 4.072949e-03). Do mesmo modo, a variável independente categórica tem_doutorado também tem relação significativa com o erro (b = [0.740456651;1.811134677], IC com 95%, p-valor 1.052403e-05). Segundo o modelo, o aumento de 1 unidade de mestrados produz um decréscimo de 0.002488487 em produtividade, o aumento de 1 unidade de doutorados produz um aumento de 0.019598340 em produtividade e tem_doutorado produz um aumento de 1.275795664 na produtividade quando muda de 0 para 1 (não ter doutorado para ter doutorado).

  1. Sobre as implicações

Como conclusão de todas as análises executadas neste laboratório com os dados da última avaliação quantitativa da CAPES, percebemos que o número de docentes e o número de teses de doutorado tem relação forte com a produção e a produtividade em uma universidade. Podemos dizer que quanto maiores forem o número de docentes e o número de teses de doutorados em uma universidade, maiores serão a produção e a produtividade, ou seja, veremos mais artigos A1, A2 e B1 serem publicados pelos docentes.

Falando especialmente sobre a produtividade, que foi gerada como o número de artigos A1, A2 e B1 por docente permanente, concluimos que, estatisticamente, se uma universidade tem um número maior de teses em comparação com outra, isso implicará que, em média, um docente da primeira contribuiu com mais conhecimento relevante para a comunidade científica do que um docente da segunda.

Podemos sintetizar a conclusão como: estatisticamente, programas de pós com mais docentes permanentes e mais teses de doutorado contribuem com mais conhecimento relevante para a comunidade científica.

LS0tDQp0aXRsZTogIlJlZ3Jlc3PDo28gbGluZWFyIG5hIHByw6F0aWNhIg0Kb3V0cHV0OiBodG1sX25vdGVib29rDQphdXRob3I6IFBsYXRlbnkgZGUgQnJpdG8gUG9uY2hldCAtIDAxMjQwMTU4MTQtMjdNDQotLS0NCg0KYGBge3Igd2FybmluZz1GQUxTRSwgZWNobz1GQUxTRX0NCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShicm9vbSkNCmxpYnJhcnkobW9kZWxyKQ0KbGlicmFyeShjb3JycGxvdCkNCnNvdXJjZShoZXJlOjpoZXJlKCJjb2RlL2xpYi5SIikpDQp0aGVtZV9zZXQodGhlbWVfYncoKSkNCg0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KHRpZHkgPSBGQUxTRSwNCiAgICAgICAgICAgICAgICAgICAgICBmaWcud2lkdGggPSA2LA0KICAgICAgICAgICAgICAgICAgICAgIGZpZy5oZWlnaHQgPSA1KQ0KDQpwYWxldGEgPSBjKCIjNDA0RTREIiwNCiAgICAgICAgICAgIiM5MkRDRTUiLA0KICAgICAgICAgICAiIzkzOEJBMSIsDQogICAgICAgICAgICIjMkQzMTQyIiwNCiAgICAgICAgICAgIiNGNDc0M0IiKQ0KYGBgDQoNCiMjIERhZG9zIGRhIENBUEVTIHNvYnJlIGF2YWxpYcOnw6NvIGRhIHDDs3MtZ3JhZHVhw6fDo28NCg0KQSBDQVBFUyDDqSB1bSDDs3Jnw6NvIGRvIE1FQyBxdWUgdGVtIGEgYXRyaWJ1acOnw6NvIGRlIGFjb21wYW5oYXIgYSBww7NzLWdyYWR1YcOnw6NvIG5hIHVuaXZlcnNpZGFkZSBicmFzaWxlaXJhLiBVbWEgZGFzIGZvcm1hcyBxdWUgZWxhIGVuY29udHJvdSBkZSBmYXplciBpc3NvIGUgcGVsYSBxdWFsIGVsYSDDqSBiYXN0YW50ZSBjcml0aWNhZGEgw6kgYXRyYXbDqXMgZGUgdW1hIGF2YWxpYcOnw6NvIHF1YW50aXRhdGl2YSBhIGNhZGEgeCBhbm9zIChlcmEgMywgbXVkb3UgcGFyYSA0KS4gDQoNClVzYXJlbW9zIGRhZG9zIGRhIHBlbsO6bHRpbWEgYXZhbGlhw6fDo28gZGEgQ0FQRVM6IA0KDQpgYGB7cn0NCmNhY2NfdHVkbyA9IHJlYWRfcHJvamVjdGRhdGEoKQ0KDQpnbGltcHNlKGNhY2NfdHVkbykNCmBgYA0KDQojIyMgUHJvZHXDp8OjbyBlIHByb2R1dGl2aWRhZGUgZGUgYXJ0aWdvcw0KDQpVbWEgZGFzIG1hbmVpcmFzIGRlIGF2YWxpYXIgYSBwcm9kdcOnw6NvIGRvcyBkb2NlbnRlcyBxdWUgYSBDQVBFUyB1dGlsaXphIMOpIHF1YW50aWZpY2FuZG8gYSBwcm9kdcOnw6NvIGRlIGFydGlnb3MgcGVsb3MgZG9jZW50ZXMuIE9zIGFydGlnb3Mgc8OjbyBjYXRlZ29yaXphZG9zIGVtIGV4dHJhdG9zIG9yZGVuYWRvcyAoQTEgw6kgbyBtYWlzIGFsdG8pLCBlIHNlcGFyYWRvcyBlbnRyZSBhcnRpZ29zIGVtIGNvbmZlcsOqbmNpYXMgZSBwZXJpw7NkaWNvcy4gVXNhcmVtb3MgcGFyYSBlc3NlIGxhYiBhIHByb2R1w6fDo28gZW0gcGVyacOzZGljb3MgYXZhbGlhZG9zIGNvbSBBMSwgQTIgZSBCMS4gDQoNCmBgYHtyfQ0KY2FjYyA9IGNhY2NfdHVkbyAlPiUNCiAgdHJhbnNtdXRlKA0KICAgIGRvY2VudGVzID0gYERvY2VudGVzIHBlcm1hbmVudGVzYCwNCiAgICBwcm9kdWNhbyA9IChwZXJpb2RpY29zX0ExICsgcGVyaW9kaWNvc19BMiArIHBlcmlvZGljb3NfQjEpLA0KICAgIHByb2R1dGl2aWRhZGUgPSBwcm9kdWNhbyAvIGRvY2VudGVzLA0KICAgIG1lc3RyYWRvcyA9IERpc3NlcnRhY29lcywNCiAgICBkb3V0b3JhZG9zID0gVGVzZXMsDQogICAgdGVtX2RvdXRvcmFkbyA9IHRvbG93ZXIoYFRlbSBkb3V0b3JhZG9gKSA9PSAic2ltIiwNCiAgICBtZXN0cmFkb3NfcHByb2YgPSBtZXN0cmFkb3MgLyBkb2NlbnRlcywNCiAgICBkb3V0b3JhZG9zX3Bwcm9mID0gZG91dG9yYWRvcyAvIGRvY2VudGVzDQogICkNCg0KY2FjY19tZCA9IGNhY2MgJT4lIA0KICBmaWx0ZXIodGVtX2RvdXRvcmFkbykNCmBgYA0KDQoNCiMjIyBFREENCg0KYGBge3J9DQpza2ltcjo6c2tpbShjYWNjKQ0KYGBgDQoNCg0KYGBge3J9DQpjYWNjICU+JSANCiAgZ2dwbG90KGFlcyh4ID0gZG9jZW50ZXMpKSArIA0KICBnZW9tX2hpc3RvZ3JhbShiaW5zID0gMTUsIGZpbGwgPSBwYWxldGFbMV0pDQoNCmNhY2MgJT4lIA0KICBnZ3Bsb3QoYWVzKHggPSBwcm9kdWNhbykpICsgDQogIGdlb21faGlzdG9ncmFtKGJpbnMgPSAxNSwgZmlsbCA9IHBhbGV0YVsyXSkNCg0KY2FjYyAlPiUgDQogIGdncGxvdChhZXMoeCA9IHByb2R1dGl2aWRhZGUpKSArIA0KICBnZW9tX2hpc3RvZ3JhbShiaW5zID0gMTUsIGZpbGwgPSBwYWxldGFbM10pDQpgYGANCg0KU2UgcXVpc2VybW9zIG1vZGVsYXIgbyBlZmVpdG8gZG8gdGFtYW5obyBkbyBwcm9ncmFtYSBlbSB0ZXJtb3MgZGUgZG9jZW50ZXMgKHBlcm1hbmVudGVzKSBuYSBxdWFudGlkYWRlIGRlIGFydGlnb3MgcHVibGljYWRvcywgcG9kZW1vcyB1c2FyIHJlZ3Jlc3PDo28uIA0KDQoqSW1wb3J0YW50ZSo6IHNlbXByZSBxdWVyZW1vcyB2ZXIgb3MgZGFkb3MgYW50ZXMgZGUgZmF6ZXJtb3MgcXVhbHF1ZXIgbW9kZWxvIG91IHN1bcOhcmlvOiANCg0KYGBge3J9DQpjYWNjICU+JSANCiAgZ2dwbG90KGFlcyh4ID0gZG9jZW50ZXMsIHkgPSBwcm9kdWNhbykpICsgDQogIGdlb21fcG9pbnQoKQ0KYGBgDQoNClBhcmVjZSBxdWUgZXhpc3RlIHVtYSByZWxhw6fDo28uIFZhbW9zIGNyaWFyIHVtIG1vZGVsbyBlbnTDo286DQoNCmBgYHtyfQ0KbW9kZWxvMSA9IGxtKHByb2R1Y2FvIH4gZG9jZW50ZXMsIGRhdGEgPSBjYWNjKQ0KDQp0aWR5KG1vZGVsbzEsIGNvbmYuaW50ID0gVFJVRSwgY29uZi5sZXZlbCA9IDAuOTUpDQpnbGFuY2UobW9kZWxvMSkNCmBgYA0KDQpQYXJhIHZpc3VhbGl6YXIgbyBtb2RlbG86DQoNCmBgYHtyfQ0KY2FjY19hdWdtZW50ZWQgPSBjYWNjICU+JSANCiAgYWRkX3ByZWRpY3Rpb25zKG1vZGVsbzEpIA0KDQpjYWNjX2F1Z21lbnRlZCAlPiUgDQogIGdncGxvdChhZXMoeCA9IGRvY2VudGVzKSkgKyANCiAgZ2VvbV9saW5lKGFlcyh5ID0gcHJlZCksIGNvbG91ciA9ICJicm93biIpICsgDQogIGdlb21fcG9pbnQoYWVzKHkgPSBwcm9kdWNhbykpICsgDQogIGxhYnMoeSA9ICJQcm9kdcOnw6NvIGRvIHByb2dyYW1hIikNCmBgYA0KDQpTZSBjb25zaWRlcmFybW9zIHF1ZSB0ZW1vcyBhcGVuYXMgdW1hIGFtb3N0cmEgZGUgdG9kb3Mgb3MgcHJvZ3JhbWFzIGRlIHDDs3MgZW0gQ0Mgbm8gQnJhc2lsLCBvIHF1ZSBwb2RlbW9zIGluZmVyaXIgYSBwYXJ0aXIgZGVzc2UgbW9kZWxvIHNvYnJlIGEgcmVsYcOnw6NvIGVudHJlIG7Dum1lcm8gZGUgZG9jZW50ZXMgcGVybWFuZW50ZXMgZSBwcm9kdcOnw6NvIGRlIGFydGlnb3MgZW0gcHJvZ3JhbWFzIGRlIHDDs3M/IA0KDQpOb3JtYWxtZW50ZSByZXBvcnRhcsOtYW1vcyBvIHJlc3VsdGFkbyBkYSBzZWd1aW50ZSBtYW5laXJhLCBzdWJzdGl0dWluZG8gVmFySW5kZXBYIGUgdG9kb3Mgb3MgeCdzIGUgeSdzIHBlbG9zIG5vbWVzIGUgdmFsb3JlcyBkZSBmYXRvOg0KDQo+IFJlZ3Jlc3PDo28gbcO6bHRpcGxhIGZvaSB1dGlsaXphZGEgcGFyYSBhbmFsaXNhciBzZSBWYXJJbmRlcDEgZSBWYXJJbmRlcDIgdGVtIHVtYSBhc3NvY2lhw6fDo28gc2lnbmlmaWNhdGl2YSBjb20gVmFyRGVwLiBPcyByZXN1bHRhZG9zIGRhIHJlZ3Jlc3PDo28gaW5kaWNhbSBxdWUgdW0gbW9kZWxvIGNvbSBvcyAyIHByZWRpdG9yZXMgbm8gZm9ybWF0byBWYXJEZXAgPSBYWFguVmFySW5kZXAxICsgWVlZLlZhckluZGVwMiBleHBsaWNhbSBYWCxYWCUgZGEgdmFyacOibmNpYSBkYSB2YXJpw6F2ZWwgZGUgcmVzcG9zdGEgKFIyID0gWFgsWFgpLiBWYXJJbmRlcDEsIG1lZGlkYSBjb21vL2VtIFt1bmlkYWRlIG91IG8gcXVlIMOpIG8gMCBlIG8gcXVlIMOpIDFdIHRlbSB1bWEgcmVsYcOnw6NvIHNpZ25pZmljYXRpdmEgY29tIG8gZXJybyAoYiA9IFt5eSx5eTsgenosenpdLCBJQyBjb20gOTUlKSwgYXNzaW0gY29tbyBWYXJJbmRlcDIgbWVkaWRhIGNvbW8gW3VuaWRhZGUgb3UgbyBxdWUgw6kgbyAwIGUgbyBxdWUgw6kgMV0gKGIgPSBbeXkseXk7IHp6LHp6XSwgSUMgY29tIDk1JSkuIE8gYXVtZW50byBkZSAxIHVuaWRhZGUgZGUgVmFySW5kZXAxIHByb2R1eiB1bWEgbXVkYW7Dp2EgZGUgeHh4IGVtIFZhckRlcCwgZW5xdWFudG8gdW0gYXVtZW50by4uLg0KDQpQcm9kdXphIGFxdWkgYSBzdWEgdmVyc8OjbyBkZXNzZSB0ZXh0bywgcG9ydGFudG86DQoNCi0tLS0tDQoNCipSZWdyZXNzw6NvIHNpbXBsZXMgZm9pIHV0aWxpemFkYSBwYXJhIGFuYWxpc2FyIHNlICoqZG9jZW50ZXMqKiAobWVkaWRhIGNvbW8gbyBuw7ptZXJvIGRlIGRvY2VudGVzIHBlcm1hbmVudGVzKSB0ZW0gdW1hIGFzc29jaWHDp8OjbyBzaWduaWZpY2F0aXZhIGNvbSAqKnByb2R1Y2FvKiogKG1lZGlkYSBjb21vIG8gbsO6bWVybyBkZSBhcnRpZ29zIHB1YmxpY2Fkb3MgcGVsb3MgZG9jZW50ZXMgZW0gcGVyacOzZGljb3MgYXZhbGlhZG9zIGNvbW8gQTEsIEEyIGUgQjEpIG5hcyB1bml2ZXJzaWRhZGVzLiBPcyByZXN1bHRhZG9zIGRhIHJlZ3Jlc3PDo28gaW5kaWNhbSBxdWUgdW0gbW9kZWxvIGNvbSB1bSBwcmVkaXRvciBubyBmb3JtYXRvDQpcW3Byb2R1Y2FvID0gNC44MTMzNyAqIGRvY2VudGVzIC00MS4yNzMwOVxdDQpleHBsaWNhIDgxLjQ2JSBkYSB2YXJpw6JuY2lhIGRhIHZhcmnDoXZlbCBkZSByZXNwb3N0YSAoJFJeMiA9IDAuODE0NTg4NiQpLiAqKmRvY2VudGVzKiogdGVtIHVtYSByZWxhw6fDo28gc2lnbmlmaWNhdGl2YSBjb20gbyBlcnJvIChiID0gWzQuMjY5OTU1OyA1LjM1Njc4Nl0sIElDIGNvbSA5NSUpLiBTZWd1bmRvIG8gbW9kZWxvLCBvIGF1bWVudG8gZGUgMSB1bmlkYWRlIGRlICoqZG9jZW50ZXMqKiBwcm9kdXogdW0gYXVtZW50byBkZSA0LjgxMzM3IHVuaWRhZGVzIGVtICoqcHJvZHVjYW8qKi4qDQoNCi0tLS0tDQoNCkRpdG8gaXNzbywgbyBxdWUgc2lnbmlmaWNhIGEgcmVsYcOnw6NvIHF1ZSB2b2PDqiBlbmNvbnRyb3UgbmEgcHLDoXRpY2EgcGFyYSBlbnRlbmRlcm1vcyBvcyBwcm9ncmFtYXMgZGUgcMOzcyBncmFkdWHDp8OjbyBubyBCcmFzaWw/IEUgYWxndW0gcGFscGl0ZSBkZSBwb3IgcXVlIGEgcmVsYcOnw6NvIHF1ZSBlbmNvbnRyYW1vcyDDqSBmb3J0ZT8NCg0KLS0tLS0NCg0KKkF0cmF2w6lzIGRhIGFuw6FsaXNlIGRvcyBkYWRvcyBwZXJjZWJlbW9zIHVtYSByZWxhw6fDo28gcG9zaXRpdmEgbXVpdG8gZm9ydGUgZW50cmUgKipkb2NlbnRlcyoqIGUgKipwcm9kdWNhbyoqLCBpbmRpY2FuZG8gcXVlIHF1YW50byBtYWlvciBvIG7Dum1lcm8gZGUgZG9jZW50ZXMgcGVybWFuZW50ZXMgZW0gdW1hIHVuaXZlcnNpZGFkZSwgbWFpb3Igw6kgYSBxdWFudGlkYWRlIGRlIGFydGlnb3MgcHVibGljYWRvcyBwb3IgZWxlcyBlbSBwZXJpw7NkaWNvcyBBMSwgQTIgZSBCMS4qDQoNCipVbSBwYWxwaXRlIHBhcmEgZXN0YSBmb3J0ZSByZWxhw6fDo28gw6kgYSBtYXR1cmlkYWRlIGRlIHVtIGRvY2VudGUgcGVybWFuZW50ZSBjb21vIHBlc3F1aXNhZG9yLiBPIGRvY2VudGUgcGVybWFuZW50ZSBhY29tcGFuaGEgdsOhcmlhcyBwZXNxdWlzYXMsIG9yaWVudGEgdsOhcmlvcyBhbHVub3MgZW0gZ3JhZHVhw6fDo28gZSBww7NzIGdyYWR1YcOnw6NvLCBhbMOpbSBkZSB0ZXIgc3VhcyBwcsOzcHJpYXMgcGVzcXVpc2FzIHBlc3NvYWlzLCB0ZW5kbyBjb25zZXF1ZW50ZW1lbnRlIGNvbnRlw7pkbyBzdWZpY2llbnRlIHBhcmEgcHJvZHV6aXIgY29uaGVjaW1lbnRvIHJlbGV2YW50ZSBwYXJhIGEgY29tdW5pZGFkZSBjaWVudMOtZmljYSwgcmVwb3J0YW5kbyByZXN1bHRhZG9zIHB1YmxpY2Fkb3MgZW0gYXJ0aWdvcyBhdmFsaWFkb3MgY29tbyBBMSwgQTIgb3UgQjEuIMOJIGltcG9ydGFudGUgcG9udHVhciBxdWUgZXN0ZSBwYWxwaXRlIG7Do28gZXhjbHVpIGFzIGNvbnRyaWJ1acOnw7VlcyBvcml1bmRhcyBkZSBkb2NlbnRlcyBuw6NvIHBlcm1hbmVudGVzIG91IGRlIGRpc2NlbnRlcywgbWFzIG8gZXNwZXJhZG8gw6kgcXVlIGEgcHJvZHXDp8OjbyBkb3MgcGVzcXVpc2Fkb3JlcyBkb2NlbnRlcyBwZXJtYW5lbnRlcyBzZWphIG1haW9yIGUgbWVsaG9yIHF1YWxpZmljYWRhLioNCg0KLS0tLS0NCg0KIyMgTWFpcyBmYXRvcmVzDQoNCmBgYHtyfQ0KbW9kZWxvMiA9IGxtKHByb2R1Y2FvIH4gZG9jZW50ZXMgKyBtZXN0cmFkb3NfcHByb2YgKyBkb3V0b3JhZG9zX3Bwcm9mICsgdGVtX2RvdXRvcmFkbywgDQogICAgICAgICAgICAgZGF0YSA9IGNhY2NfbWQpDQoNCnRpZHkobW9kZWxvMiwgY29uZi5pbnQgPSBUUlVFLCBjb25mLmxldmVsID0gMC45NSkNCmdsYW5jZShtb2RlbG8yKQ0KYGBgDQoNCkUgc2UgY29uc2lkZXJhcm1vcyB0YW1iw6ltIG8gbsO6bWVybyBkZSBhbHVub3M/DQoNCmBgYHtyfQ0KbW9kZWxvMiA9IGxtKHByb2R1Y2FvIH4gZG9jZW50ZXMgKyBtZXN0cmFkb3MgKyBkb3V0b3JhZG9zLCBkYXRhID0gY2FjYykNCg0KdGlkeShtb2RlbG8yLCBjb25mLmludCA9IFRSVUUsIGNvbmYubGV2ZWwgPSAwLjk1KQ0KZ2xhbmNlKG1vZGVsbzIpDQpgYGANCg0KVmlzdWFsaXphciBvIG1vZGVsbyBjb20gbXVpdGFzIHZhcmnDoXZlaXMgaW5kZXBlbmRlbnRlcyBmaWNhIG1haXMgZGlmw61jaWwNCg0KYGBge3J9DQpwYXJhX3Bsb3Rhcl9tb2RlbG8gPSBjYWNjICU+JSANCiAgZGF0YV9ncmlkKHByb2R1Y2FvID0gc2VxX3JhbmdlKHByb2R1Y2FvLCAxMCksICMgQ3JpZSB1bSB2ZXRvciBkZSAxMCB2YWxvcmVzIG5vIHJhbmdlDQogICAgICAgICAgICBkb2NlbnRlcyA9IHNlcV9yYW5nZShkb2NlbnRlcywgNCksICANCiAgICAgICAgICAgICMgbWVzdHJhZG9zID0gc2VxX3JhbmdlKG1lc3RyYWRvcywgMyksDQogICAgICAgICAgICBtZXN0cmFkb3MgPSBtZWRpYW4obWVzdHJhZG9zKSwNCiAgICAgICAgICAgIGRvdXRvcmFkb3MgPSBzZXFfcmFuZ2UoZG91dG9yYWRvcywgMykpICU+JSANCiAgYWRkX3ByZWRpY3Rpb25zKG1vZGVsbzIpDQoNCmdsaW1wc2UocGFyYV9wbG90YXJfbW9kZWxvKQ0KDQpgYGANCg0KYGBge3J9DQpwYXJhX3Bsb3Rhcl9tb2RlbG8gJT4lIA0KICBnZ3Bsb3QoYWVzKHggPSBkb2NlbnRlcywgeSA9IHByZWQpKSArIA0KICBnZW9tX2xpbmUoYWVzKGdyb3VwID0gZG91dG9yYWRvcywgY29sb3VyID0gZG91dG9yYWRvcykpICsgDQogIGdlb21fcG9pbnQoZGF0YSA9IGNhY2MsIGFlcyh5ID0gcHJvZHVjYW8sIGNvbG91ciA9IGRvdXRvcmFkb3MpKQ0KYGBgDQoNCkNvbnNpZGVyYW5kbyBhZ29yYSBlc3NlcyB0csOqcyBmYXRvcmVzLCBvIHF1ZSBwb2RlbW9zIGRpemVyIHNvYnJlIGNvbW8gY2FkYSB1bSBkZWxlcyBzZSByZWxhY2lvbmEgY29tIGEgcHJvZHXDp8OjbyBkZSB1bSBwcm9ncmFtYSBkZSBww7NzIGVtIENDPyBFIHNvYnJlIG8gbW9kZWxvPyBFbGUgZXhwbGljYSBtYWlzIHF1ZSBvIG1vZGVsbyAxPyANCg0KLS0tLS0NCg0KKlJlZ3Jlc3PDo28gbcO6bHRpcGxhIGZvaSB1dGlsaXphZGEgcGFyYSBhbmFsaXNhciBzZSAqKmRvY2VudGVzKiogKG1lZGlkYSBjb21vIG8gbsO6bWVybyBkZSBkb2NlbnRlcyBwZXJtYW5lbnRlcyksICoqbWVzdHJhZG9zX3Bwcm9mKiogKG1lZGlkYSBjb21vIGEgcmVsYcOnw6NvIGRvIG7Dum1lcm8gZGUgZGlzc2VydGHDp8O1ZXMgcG9yIGRvY2VudGUgcGVybWFuZW50ZSkgZSAqKmRvdXRvcmFkb3NfcHByb2YqKiAobWVkaWRhIGNvbW8gYSByZWxhw6fDo28gZG8gbsO6bWVybyBkZSB0ZXNlcyBwb3IgZG9jZW50ZSBwZXJtYW5lbnRlKSB0ZW0gdW1hIGFzc29jaWHDp8OjbyBzaWduaWZpY2F0aXZhIGNvbSAqKnByb2R1Y2FvKiogKG1lZGlkYSBjb21vIG8gbsO6bWVybyBkZSBhcnRpZ29zIHB1YmxpY2Fkb3MgcGVsb3MgZG9jZW50ZXMgZW0gZW0gcGVyacOzZGljb3MgYXZhbGlhZG9zIGNvbW8gQTEsIEEyIGUgQjEpIG5hcyB1bml2ZXJzaWRhZGVzLg0KT3MgcmVzdWx0YWRvcyBkYSByZWdyZXNzw6NvIGluZGljYW0gcXVlIHVtIG1vZGVsbyBjb20gb3MgMyBwcmVkaXRvcmVzIG5vIGZvcm1hdG8NClxbcHJvZHVjYW8gPSA0LjM4OTgxNjc5KmRvY2VudGVzKzAuMDMxODM4NzIqbWVzdHJhZG9zXF9wcHJvZisxNi4xMDc1MDMwNCpkb3V0b3JhZG9zXF9wcHJvZi0zOS40NzEyMjgxMVxdDQpleHBsaWNhbSA4MS42MiUgZGEgdmFyacOibmNpYSBkYSB2YXJpw6F2ZWwgZGUgcmVzcG9zdGEgKCRSXjIkID0gMC44MTYyNDI0KS4NCkEgdmFyacOhdmVsICoqZG9jZW50ZXMqKiB0ZW0gdW1hIHJlbGHDp8OjbyBzaWduaWZpY2F0aXZhIGNvbSBvIGVycm8gKGIgPSBbMy4yODgyMzA7NS40OTE0MDNdLCBJQyBjb20gOTUlLCBwLXZhbG9yIDQuMzgzMjY4ZS0wOSkuIFBvciBvdXRybyBsYWRvLCBuw6NvIGNvbnNlZ3VpbW9zIGFmaXJtYXIgZXN0YXRpc3RpY2FtZW50ZSBxdWUgKipkb3V0b3JhZG9zX3Bwcm9mKiogdGVtIHVtYSByZWxhw6fDo28gc2lnbmlmaWNhdGl2YSBjb20gbyBlcnJvLCBwb2lzIG8gaW50ZXJ2YWxvIGRlIGNvbmZpYW7Dp2EgaW5jbHVpIG8gdmFsb3IgemVybyBlIG8gcC12YWxvciBlc3TDoSBhY2ltYSBkZSA1JSwgZmF6ZW5kbyBjb20gcXVlIG7Do28gc2VqYSBwb3Nzw612ZWwgZGVzY2FydGFyIGEgaGlww7N0ZXNlIG51bGEgZGUgcXVlIG8gY29lZmljaWVudGUgcGFyYSBlc3RhIHZhcmnDoXZlbCBwcmVkaXRpdmEgw6kgemVybyAoYiA9IFstMS44NjYyOTU7MzQuMDgxMzAxXSwgSUMgY29tIDk1JSwgcC12YWxvciA3LjcxNzAwMGUtMDIpLg0KTyBtZXNtbyBzZSBhcGxpY2EgYSAqKm1lc3RyYWRvc19wcHJvZioqLCBwYXJhIG8gcXVhbCBuw6NvIHBvZGVtb3MgYWZpcm1hciBlc3RhdGlzdGljYW1lbnRlIHF1ZSB0ZW0gcmVsYcOnw6NvIGNvbSBvIGVycm8sIHBvaXMgbyB2YWxvciB6ZXJvIGVzdMOhIGRlbnRybyBkbyBpbnRlcnZhbG8gZGUgY29uZmlhbsOnYSBlIG8gcC12YWxvciB0YW1iw6ltIGVzdMOhIGFjaW1hIGRlIDUlIChiID0gWy03LjA4NjY0MCw3LjE1MDMxN10sIElDIGNvbSA5NSUpLg0KU2VndW5kbyBvIG1vZGVsbywgTyBhdW1lbnRvIGRlIDEgdW5pZGFkZSBkZSAqKmRvY2VudGVzKiogcHJvZHV6IHVtIGF1bWVudG8gZGUgNC4zODk4MTY3OSBlbSAqKnByb2R1Y2FvKiosIG8gYXVtZW50byBkZSAxIHVuaWRhZGUgZGUgKipkb3V0b3JhZG9zX3Bwcm9mKiogcHJvZHV6IHVtIGF1bWVudG8gZGUgMTYuMTA3NTAzMDQgZW0gKipwcm9kdWNhbyoqIGUgbyBhdW1lbnRvIGRlIDEgdW5pZGFkZSBkZSAqKm1lc3RyYWRvc19wcHJvZioqIHByb2R1eiB1bSBkZWNyw6lzY2ltbyBkZSAwLjAzMTgzODcyIGVtICoqcHJvZHVjYW8qKi4qDQoNCi0tLS0tDQoNCipSZWdyZXNzw6NvIG3Dumx0aXBsYSB0YW1iw6ltIGZvaSB1dGlsaXphZGEgcGFyYSBhbmFsaXNhciBzZSAqKmRvY2VudGVzKiogKG1lZGlkYSBjb21vIG8gbsO6bWVybyBkZSBkb2NlbnRlcyBwZXJtYW5lbnRlcyksICoqbWVzdHJhZG9zKiogKG1lZGlkYSBjb21vIG8gbsO6bWVybyBkZSBkaXNzZXJ0YcOnw7VlcykgZSAqKmRvdXRvcmFkb3MqKiAobWVkaWRhIGNvbW8gbyBuw7ptZXJvIGRlIHRlc2VzKSB0ZW0gdW1hIGFzc29jaWHDp8OjbyBzaWduaWZpY2F0aXZhIGNvbSAqKnByb2R1Y2FvKiogKG1lZGlkYSBjb21vIG8gbsO6bWVybyBkZSBhcnRpZ29zIHB1YmxpY2Fkb3MgcGVsb3MgZG9jZW50ZXMgZW0gZW0gcGVyacOzZGljb3MgYXZhbGlhZG9zIGNvbW8gQTEsIEEyIGUgQjEpIG5hcyB1bml2ZXJzaWRhZGVzLg0KT3MgcmVzdWx0YWRvcyBkYSByZWdyZXNzw6NvIGluZGljYW0gcXVlIHVtIG1vZGVsbyBjb20gb3MgMyBwcmVkaXRvcmVzIG5vIGZvcm1hdG8NClxbcHJvZHVjYW89My40OTk3MTEyKmRvY2VudGVzLTAuMTk0OTUxNSptZXN0cmFkb3MrMS4wMDA3NzExKmRvdXRvcmFkb3MtMTQuMzY2MzA3N1xdDQpleHBsaWNhbSA4Ny4wNyUgZGEgdmFyacOibmNpYSBkYSB2YXJpw6F2ZWwgZGUgcmVzcG9zdGEgKCRSXjIkID0gMC44NzA2NjQyKS4NCkEgdmFyacOhdmVsICoqZG9jZW50ZXMqKiB0ZW0gdW1hIHJlbGHDp8OjbyBzaWduaWZpY2F0aXZhIGNvbSBvIGVycm8gKGIgPSBbMi41ODI3MjU3OzQuNDE2Njk2N10sIElDIGNvbSA5NSUpLiBBIHZhcmnDoXZlbCAqKmRvdXRvcmFkb3MqKiB0YW1iw6ltIGFwcmVzZW50YSB1bWEgcmVsYcOnw6NvIGNvbSB1bSBlcnJvLCBuw6NvIHTDo28gc2lnbmlmaWNhdGl2YSBjb21vICoqZG9jZW50ZXMqKiBtYXMgYWluZGEgc2lnbmlmaWNhdGl2YSAoYiA9IFswLjYzNTUxMTI7MS4zNjYwMzA5XSwgSUMgY29tIDk1JSkuIErDoSAqKm1lc3RyYWRvcyoqIHRlbSB1bWEgcmVsYcOnw6NvIHBvdWNvIHNpZ25pZmljYXRpdmEgY29tIG8gZXJybyAoYiA9IFstMC4zNTc3MzE2Oy0wLjAzMjE3MTRdLCBJQyBjb20gOTUlKS4NClNlZ3VuZG8gbyBtb2RlbG8sIE8gYXVtZW50byBkZSAxIHVuaWRhZGUgZGUgKipkb2NlbnRlcyoqIHByb2R1eiB1bSBhdW1lbnRvIGRlIDMuNDk5NzExMiBlbSAqKnByb2R1Y2FvKiosIG8gYXVtZW50byBkZSAxIHVuaWRhZGUgZGUgKipkb3V0b3JhZG9zKiogcHJvZHV6IHVtIGF1bWVudG8gZGUgMS4wMDA3NzExIGVtICoqcHJvZHVjYW8qKiBlIG8gYXVtZW50byBkZSAxIHVuaWRhZGUgZGUgKiptZXN0cmFkb3MqKiBwcm9kdXogdW0gZGVjcsOpc2NpbW8gZGUgMC4xOTQ5NTE1IGVtICoqcHJvZHVjYW8qKi4qDQoNCi0tLS0tDQoNCkFuYWxpc2FuZG8gb3MgZG9pcyBtb2RlbG9zOg0KDQotIE8gbW9kZWxvIHF1ZSBjb25zaWRlcmEgZG9jZW50ZXMsIG1lc3RyYWRvc19wcHJvZiBlIGRvdXRvcmFkb3NfcHByb2YsIGV4cGxpY2EgYmVtIGEgdmFyacOibmNpYSAoJFJeMiQ9MC44MTYyNDI0KSBtYXMgbsOjbyBob3V2ZSBnYW5obyBzaWduZmljYXRpdm8gcXVhbmRvIGNvbXBhcmFkbyBjb20gbyBwcmltZWlybyBtb2RlbG8gKCRSXjIkPTAuODE0NTg4NikgcXVlIHV0aWxpemEgYXBlbmFzICoqZG9jZW50ZXMqKiBjb21vIHZhcmnDoXZlbCBpbmRlcGVuZGVudGUuIFNlIGNvbnNpZGVyYXIgbyAkUl4yJCBhanVzdGFkbyAoMC43OTc4NjY3KSwgcXVlIHBlbmFsaXphIGFkacOnw6NvIGRlIHZhcmnDoXZlaXMgcHJlZGl0aXZhcywgZXN0ZSBtb2RlbG8gZm9pIGF0w6kgdW0gcG91Y28gcGlvciBkbyBxdWUgbyBwcmltZWlyby4NCg0KLSBPIG1vZGVsbyBxdWUgY29uc2lkZXJhIGRvY2VudGVzLCBtZXN0cmFkb3MgZSBkb3V0b3JhZG9zLCBleHBsaWNhIG11aXRvIGJlbSBhIHZhcmnDom5jaWEsIG1lbGhvciBxdWUgbyBtb2RlbG8gMSwgYXByZXNlbnRhbmRvIHVtICRSXjIkIGRlIDAuODcwNjY0MiBlIHVtICRSXjIkIGFqdXN0YWRvIGRlIDAuODY1MDQwOS4NCg0KRGUgbWFuZWlyYSBwcsOhdGljYSwgbm9zIGRvaXMgbW9kZWxvcyBjb25zaWRlcmFuZG8gbWFpcyBmYXRvcmVzLCBwZXJjZWJlbW9zIGEgcmVsYcOnw6NvIGZvcnRlIHF1ZSBvIG7Dum1lcm8gZGUgdGVzZXMgZGUgZG91dG9yYWRvIHRlbSBjb20gYSBxdWFudGlkYWRlIGRlIHByb2R1w6fDtWVzIGNpZW50w61maWNhcyBkb3MgZG9jZW50ZXMgZGEgdW5pdmVyc2lkYWRlLiBJc3NvIHBvZGUgc2VyIGV4cGxpY2FkbyBub3ZhbWVudGUgcGVsYSBjYXJhY3RlcsOtc3RpY2EgZGUgbWF0dXJpZGFkZSBkb3MgcGVzcXVpc2Fkb3Jlcy4gRXNwZXJhLXNlIHF1ZSBwZXNxdWlzYXMgZGVzZW52b2x2aWRhcyBlbSB1bSBkb3V0b3JhZG8gdGVuaGFtIHVtIGltcGFjdG8gY2llbnTDrWZpY28gbXVpdG8gbWFpb3IgcXVhbmRvIGNvbXBhcmFkYXMgY29tIGFzIHBlcXVpc2FzIGRlc2Vudm9sdmlkYXMgZW0gdW0gbWVzdHJhZG8gb3UgZ3JhZHVhw6fDo28uIE11aXRhcyB2ZXplcyBhIHBlc3F1aXNhIGRvIGRvdXRvcmFkbyBkZSBhbGd1bSBhbHVubyDDqSB1bWEgcmFtaWZpY2HDp8OjbyBkZSB1bWEgcGVzcXVpc2EgZXhpc3RlbnRlIGRvIGRvY2VudGUgb3JpZW50YWRvci4gTyBkb2NlbnRlIGEgZnJlbnRlIGRlIHRhaXMgcGVzcXVpc2FzLCBjb29yZGVuYW5kbywgb3JpZW50YW5kbywgcGFydGljaXBhbmRvIGF0aXZhbWVudGUsIHRlcsOhIHVtIGFjZXJ2byBkZSBjb250ZcO6ZG9zIGUgcmVzdWx0YWRvcyBxdWUgbyBwZXJtaXRhIHNpbnRldGl6YXIgZW0gYXJ0aWdvcyBxdWUgcG9zc2FtIHNlciBwdWJsaWNhZG9zIGVtIHBlcmnDs2RpY29zIGF2YWxpYWRvcyBjb20gQTEsIEEyIG91IEIxLg0KDQoNCiMjIEFnb3JhIHByb2R1dGl2aWRhZGUgDQoNCkRpZmVyZW50ZSBkZSBtZWRpcm1vcyBwcm9kdcOnw6NvICh0b3RhbCBwcm9kdXppZG8pLCDDqSBtZWRpcm1vcyBwcm9kdXRpdmlkYWRlIChwcm9kdXppZG8gLyB1dGlsaXphZG8pLiBBYmFpeG8gZm9jYXJlbW9zIG5lc3NhIGFuw6FsaXNlLiBQYXJhIGlzc28gY3JpZSB1bSBtb2RlbG8gcXVlIGludmVzdGlnYSBjb21vIHVtIGNvbmp1bnRvIGRlIGZhdG9yZXMgcXVlIHZvY8OqIGp1bGdhIHF1ZSBzw6NvIHJlbGV2YW50ZXMgc2UgcmVsYWNpb25hbSBjb20gYSBwcm9kdXRpdmlkYWRlIGRvcyBwcm9ncmFtYXMuIENyaWUgdW0gbW9kZWxvIHF1ZSBhdmFsaWUgY29tbyBfcGVsbyBtZW5vcyAzIGZhdG9yZXNfIHNlIHJlbGFjaW9uYW0gY29tIGEgcHJvZHV0aXZpZGFkZSBkZSB1bSBwcm9ncmFtYS4gUG9kZSByZXV0aWxpemFyIGZhdG9yZXMgcXVlIGrDoSBkZWZpbmltb3MgZSBhbmFsaXphbW9zIHBhcmEgcHJvZHXDp8Ojby4gTWFzIGN1aWRhZG8gcGFyYSBuw6NvIGluY2x1aXIgZmF0b3JlcyBxdWUgc2VqYW0gZnVuw6fDo28gbGluZWFyIGRlIG91dHJvcyBqw6EgaW5jbHXDrWRvcyAoZXg6IGluY2x1aXIgQSwgQiBlIHVtIHRlcmNlcm8gQz1BK0IpDQoNClByb2R1emEgYWJhaXhvIG8gbW9kZWxvIGUgdW0gdGV4dG8gcXVlIGNvbWVudGUgKGkpIG8gbW9kZWxvLCB0YWwgY29tbyBvcyBxdWUgZml6ZW1vcyBhbnRlcywgZSAoaWkpIGFzIGltcGxpY2HDp8O1ZXMgLSBvIHF1ZSBhcHJlbmRlbW9zIHNvYnJlIGNvbW8gZnVuY2lvbmFtIHByb2dyYW1hcyBkZSBww7NzIG5vIGJyYXNpbD8uDQoNCi0tLS0tDQoNClBlbG9zIHJlc3VsdGFkb3MgYW50ZXJpb3JlcywgKipkb2NlbnRlcyoqIGUgKipkb3V0b3JhZG9zKiogdGl2ZXJhbSByZWxhw6fDo28gZm9ydGUgY29tICoqcHJvZHVjYW8qKiBlIGVzcGVyYS1zZSBxdWUgdGFtYsOpbSB0ZW5oYW0gdW1hIHJlbGHDp8OjbyBmb3J0ZSBjb20gKipwcm9kdXRpdmlkYWRlKiouIENvbW8gb3MgZGFkb3MgZGUgKipwcm9kdXRpdmlkYWRlKiogZm9yYW0gZ2VyYWRvcyB1dGlsaXphbmRvICoqZG9jZW50ZXMqKiwgdmFtb3MgZGVzY29uc2lkZXJhciAqKmRvY2VudGVzKiogY29tbyBmYXRvci4gU2Vyw6EgY29uc2lkZXJhZGEgdGFtYsOpbSBhIHZhcmnDoXZlbCAqKnRlbV9kb3V0b3JhZG8qKi4NCg0KIyMjIEFuw6FsaXNlIGRlc2NyaXRpdmENCg0KQW50ZXMgZGUgZ2VyYXIgbW9kZWxvcyBwcmVjaXNhbW9zIHZlciBvcyBkYWRvcyBlIGJ1c2NhciB2aXN1YWxtZW50ZSBwb3IgcmVsYcOnw7VlcyBlbnRyZSBlbGVzLiBQcmltZWlyYW1lbnRlIHZhbW9zIGF2YWxpYXIgYSByZWxhw6fDo28gZG8gbsO6bWVyb3MgZGUgdGVzZXMgZGUgZG91dG9yYWRvIGNvbSBhIHByb2R1dGl2aWRhZGUgZSB2ZXIgc2UgdGVyIGRvdXRvcmFkbyBvdSBuw6NvIG5hIHVuaXZlcnNpZGFkZSB0ZW0gaW1wYWN0byBuYSBwcm9kdXRpdmlkYWRlLg0KDQpgYGB7cn0NCmNhY2MgJT4lIA0KICAgIGdncGxvdChhZXMoeCA9IGRvdXRvcmFkb3MsIHkgPSBwcm9kdXRpdmlkYWRlKSkgKyANCiAgICBnZW9tX3BvaW50KCkgKw0KICAgIGdndGl0bGUoIlByb2R1dGl2aWRhZGUgeCBkb3V0b3JhZG9zIikNCg0KY2FjYyAlPiUgDQogICAgZmlsdGVyKGRvdXRvcmFkb3MgPiAwKSAlPiUNCiAgICBnZ3Bsb3QoYWVzKHggPSBkb3V0b3JhZG9zLCB5ID0gcHJvZHV0aXZpZGFkZSkpICsgDQogICAgZ2VvbV9wb2ludCgpICsNCiAgICBnZ3RpdGxlKCJQcm9kdXRpdmlkYWRlIHggZG91dG9yYWRvcyAoZmlsdHJhbmRvIGRvdXRvcmFkb3MgPSAwKSIpDQoNCmNhY2MgJT4lIA0KICAgIGdncGxvdChhZXMoeCA9IHRlbV9kb3V0b3JhZG8sIHkgPSBwcm9kdXRpdmlkYWRlKSkgKyANCiAgICBnZW9tX2JveHBsb3QoKSArDQogICAgZ2VvbV9qaXR0ZXIoaGVpZ2h0ID0gMCwgd2lkdGggPSAwLjEpICsNCiAgICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSBtZWFuKGNhY2MkcHJvZHV0aXZpZGFkZSksIGNvbG9yID0gInJlZCIsIGxpbmV0eXBlID0gImRhc2hlZCIsIHNpemUgPSAxKSArDQogICAgYW5ub3RhdGUoInRleHQiLCB4ID0gMCwgeSA9IG1lYW4oY2FjYyRwcm9kdXRpdmlkYWRlKSwgbGFiZWwgPSAiTcOpZGlhIiwgaGp1c3QgPSAtMC41LCB2anVzdCA9IC0xLCBjb2xvciA9ICJyZWQiLCBzaXplID0gNCkgKw0KICAgIGdndGl0bGUoIlByb2R1dGl2aWRhZGUgeCB0ZW1fZG91dG9yYWRvIChBbsOhbGlzZSBwb3IgYm94cGxvdHMpIikNCmBgYA0KTyBncsOhZmljbyAqKnByb2R1dGl2aWRhZGUqKiB4ICoqZG91dG9yYWRvcyoqIG1vc3Ryb3UgcXVlIGjDoSB1bWEgcHJvZHV0aXZpZGFkZSBjb25zaWRlcsOhdmVsIGVtIGN1cnNvcyBxdWUgbsOjbyB0ZW0gZG91dG9yYWRvLCB2YWxlbmRvIGEgcGVuYSBjb25zaWRlcmFyIG8gZmF0b3IgKiptZXN0cmFkb3MqKiBjb21vIHBvc3PDrXZlbCBwcmVkaXRpdm8gcGFyYSAqKnByb2R1dGl2aWRhZGUqKi4NCkFvIGZpbHRyYXIgYXMgdW5pdmVyc2lkYWRlcyBxdWUgdGVtIGFsZ3VtYSB0ZXNlIGRlIGRvdXRvcmFkbywgZmljYSB2aXPDrXZlbCB1bWEgcG9zc8OtdmVsIHJlbGHDp8OjbyBsaW5lYXIgZW50cmUgKipwcm9kdXRpdmlkYWRlKiogZSAqKmRvdXRvcmFkbyoqLg0KTm8gZ3LDoWZpY28gKipwcm9kdXRpdmlkYWRlKiogeCAqKnRlbV9kb3V0b3JhZG8qKiwgYW5hbGlzYW5kbyBvcyBib3hwbG90cywgY29tbyBuw6NvIGjDoSBzb2JyZXBvc2nDp8OjbyBkZSBJUVIgY29uc2VndWltb3MgaW5mZXJpciBxdWUgdGVyIGRvdXRvcmFkbyBlbSB1bWEgdW5pdmVyc2lkYWRlIGltcGxpY2EgcXVlIGEgcHJvZHV0aXZpZGFkZSDDqSBtYWlvciBkbyBxdWUgbmEgdW5pdmVyc2lkYWRlIHF1ZSBuw6NvIHRlbS4gUGVyY2ViZW1vcyBxdWUgNzUlIGRhcyBhbW9zdHJhcyBkZSB1bml2ZXJzaWRhZGVzIHF1ZSB0ZW0gZG91dG9yYWRvIHRlbSB1bWEgcHJvZHV0aXZpZGFkZSBtYWlvciBkbyBxdWUgNzUlIGRhcyBhbW9zdHJhcyBkZSB1bml2ZXJzaWRhZGUgcXVlIG7Do28gdGVtIGRvdXRvcmFkby4gw4kgaW1wb3J0YW50ZSBvYnNlcnZhciB0YW1iw6ltIHF1ZSA3NSUgZGFzIGFtb3N0cmFzIGRlIHByb2R1dGl2aWRhZGUgZGFzIHVuaXZlcnNpZGFkZXMgcXVlIHRlbSBkb3V0b3JhZG8gZXN0w6NvIGFjaW1hIGRhIG3DqWRpYSBkZSBwcm9kdXRpdmlkYWRlLg0KDQpBbnRlcyBkZSB0b21hciBhIGRlY2lzw6NvIHBlbG9zIGZhdG9yZXMgKipkb3V0b3JhZG9zKiosICoqdGVtX2RvdXRvcmFkbyoqIGUgKiptZXN0cmFkb3MqKiwgdmFtb3MgYW5hbGlzYXIgYSBtYXRyaXogZGUgY29ycmVsYcOnw6NvIGVtIGJ1c2NhIGRlIG91dHJvcyBmYXRvcmVzIHF1ZSBwb3NzYW0gbm9zIGFqdWRhciBhIGVuY29udHJhciB1bSBtb2RlbG8gcXVlIGV4cGxpcXVlIGJlbSBhIHZhcmnDom5jaWEgZGUgKipwcm9kdXRpdmlkYWRlKiogZS9vdSBjb25maXJtYXIgcXVlIG9zIGZhdG9yZXMgcHLDqS1zZWxlY2lvbmFkb3MgZmF6ZW0gc2VudGlkbzoNCg0KYGBge3J9DQpjb3JyZWxhY2FvX3NwZWFybWFuIDwtIGNvcihjYWNjLCBtZXRob2QgPSAic3BlYXJtYW4iKQ0KDQpjb3JycGxvdChjb3JyZWxhY2FvX3NwZWFybWFuLCBtZXRob2QgPSAiY2lyY2xlIiwgYWRkQ29lZi5jb2w9VFJVRSwgbnVtYmVyLmNleD0wLjcsIHRsLnNydCA9IDMwKQ0KDQpgYGANCg0KTyBwcmltZWlybyBwYXNzbyDDqSBlbGltaW5hciBhcyB2YXJpw6F2ZWlzICoqZG9jZW50ZXMqKiBlICoqcHJvZHVjYW8qKiBwb3IgdGVyZW0gcmVsYcOnw6NvIGRpcmV0YSBjb20gYSB2YXJpw6F2ZWwgZGVwZW5kZW50ZSAqKnByb2R1dGl2aWRhZGUqKi4gRGFzIHJlc3RhbnRlcywgKipkb3V0b3JhZG9zX3Bwcm9mKiogc2Vyw6EgZWxpbWluYWRhIHBvciBzZXIgZnVuw6fDo28gZGUgKipkb3V0b3JhZG9zKiogZSAqKm1lc3RyYWRvc19wcHJvZioqIHNlcsOhIGVsaW1pbmFkYSBwb3Igc2VyIGZ1bsOnw6NvIGRlICoqbWVzdHJhZG9zKiouIE9zIGZhdG9yZXMgcmVzdGFudGVzIHPDo28gb3MgcXVlIGZvcmFtIGp1bGdhZG9zIGNvbW8gcmVsZXZhbnRlcyBuYSBwcmltZWlyYSBhbsOhbGlzZTogKipkb3V0b3JhZG9zKiosICoqdGVtX2RvdXRvcmFkbyoqIGUgKiptZXN0cmFkb3MqKi4gQSBtYXRyaXogZGUgY29ycmVsYcOnw6NvIHNlcnZpdSBwYXJhIGNvbmZpcm1hciBxdWUgZXhpc3RlIHVtYSByZWxhw6fDo28gZW50cmUgY2FkYSB1bSBkb3MgZmF0b3JlcyBwcmVkaXRpdm9zIGUgYSB2YXJpw6F2ZWwgZGUgcmVzcG9zdGEsIG1lc21vIHF1ZSBtb2RlcmFkYSBwYXJhICoqZG91dG9yYWRvcyoqIGUgKip0ZW1fZG91dG9yYWRvKiogZSBmcmFjYSBwYXJhICoqbWVzdHJhZG9zKiouIEVzcGVyYS1zZSBxdWUganVudG9zIGVtIHVtIG1vZGVsbyBsaW5lYXIgZWxlcyBjb25zaWdhbSBleHBsaWNhciBiZW0gYSBwcm9kdXRpdmlkYWRlLg0KDQojIyMgUmVncmVzc8OjbyBMaW5lYXINCg0KRGFuZG8gY29udGludWlkYWRlIGNvbSBhIHJlZ3Jlc3PDo28gbGluZWFyIG3Dumx0aXBsYSBjb20gb3MgMyBmYXRvcmVzICoqZG91dG9yYWRvcyoqLCAqKnRlbV9kb3V0b3JhZG8qKiBlICoqbWVzdHJhZG9zKio6DQoNCmBgYHtyfQ0KbW9kZWxvX3Byb2R1dGl2aWRhZGUgPSBsbShwcm9kdXRpdmlkYWRlIH4gbWVzdHJhZG9zK2RvdXRvcmFkb3MrdGVtX2RvdXRvcmFkbywgZGF0YSA9IGNhY2MpDQoNCnRpZHkobW9kZWxvX3Byb2R1dGl2aWRhZGUsIGNvbmYuaW50ID0gVFJVRSwgY29uZi5sZXZlbCA9IDAuOTUpDQoNCmdsYW5jZShtb2RlbG9fcHJvZHV0aXZpZGFkZSkNCmBgYA0KDQpVbWEgZm9ybWEgZGUgdmlzdWFsaXphciBvIG1vZGVsbzoNCg0KYGBge3J9DQpwYXJhX3Bsb3Rhcl9tb2RlbG8gPSBjYWNjICU+JSANCiAgZGF0YV9ncmlkKHByb2R1dGl2aWRhZGUgPSBzZXFfcmFuZ2UocHJvZHV0aXZpZGFkZSwgMTApLCAjIENyaWUgdW0gdmV0b3IgZGUgMTAgdmFsb3JlcyBubyByYW5nZQ0KICAgICAgICAgICAgZG91dG9yYWRvcyA9IHNlcV9yYW5nZShkb3V0b3JhZG9zLCA0KSwNCiAgICAgICAgICAgIG1lc3RyYWRvcyA9IG1lZGlhbihtZXN0cmFkb3MpLA0KICAgICAgICAgICAgdGVtX2RvdXRvcmFkbyA9IHRlbV9kb3V0b3JhZG8pICU+JSANCiAgYWRkX3ByZWRpY3Rpb25zKG1vZGVsb19wcm9kdXRpdmlkYWRlKQ0KDQpwYXJhX3Bsb3Rhcl9tb2RlbG8gJT4lIA0KICBnZ3Bsb3QoYWVzKHggPSBkb3V0b3JhZG9zLCB5ID0gcHJlZCkpICsgDQogIGdlb21fbGluZShhZXMoZ3JvdXAgPSB0ZW1fZG91dG9yYWRvLCBjb2xvdXIgPSB0ZW1fZG91dG9yYWRvKSkgKyANCiAgZ2VvbV9wb2ludChkYXRhID0gY2FjYywgYWVzKHkgPSBwcm9kdXRpdmlkYWRlLCBjb2xvdXIgPSB0ZW1fZG91dG9yYWRvKSkNCmBgYA0KDQooaSkgKipTb2JyZSBvIG1vZGVsbyoqOg0KDQoqUmVncmVzc8OjbyBtw7psdGlwbGEgZm9pIHV0aWxpemFkYSBwYXJhIGFuYWxpc2FyIHNlICoqbWVzdHJhZG9zKiogKG1lZGlkYSBjb21vIG8gbsO6bWVybyBkZSBkaXNzZXJ0YcOnw7VlcyksICoqZG91dG9yYWRvcyoqIChtZWRpZGEgY29tbyBvIG7Dum1lcm8gZGUgdGVzZXMpIGUgKip0ZW1fZG91dG9yYWRvKiogKHZhcmnDoXZlbCBjYXRlZ8OzcmljYSBxdWUgZGVmaW5lIHRlciBvdSBuw6NvIGRvdXRvcmFkbykgdGVtIHVtYSBhc3NvY2lhw6fDo28gc2lnbmlmaWNhdGl2YSBjb20gKipwcm9kdXRpdmlkYWRlKiogKG1lZGlkYSBjb21vIGEgcmVsYcOnw6NvIGVudHJlIGEgcHJvZHXDp8OjbyBkZSBhcnRpZ29zIGNpZW50w61maWNvcyBBMSwgQTIgZSBCMSBlIG8gbsO6bWVybyBkZSBkb2NlbnRlcyBwZXJtYW5lbnRlcykgbmEgdW5pdmVyc2lkYWRlLiBPcyByZXN1bHRhZG9zIGRhIHJlZ3Jlc3PDo28gaW5kaWNhbSBxdWUgdW0gbW9kZWxvIGNvbSBvcyAzIHByZWRpdG9yZXMgbm8gZm9ybWF0bw0KXFtwcm9kdXRpdmlkYWRlPS0wLjAwMjQ4ODQ4NyptZXN0cmFkb3MrMC4wMTk1OTgzNDAqZG91dG9yYWRvcysxLjI3NTc5NTY2NCp0ZW1cX2RvdXRvcmFkbysxLjY2NTY1MzMwMlxdDQpleHBsaWNhbSA1MS41JSBkYSB2YXJpw6JuY2lhIGRhIHZhcmnDoXZlbCBkZSByZXNwb3N0YSAoJFJeMiQgPSAwLjUxNTAwNykuDQpOw6NvIGNvbnNlZ3VpbW9zIGFmaXJtYXIgZXN0YXRpc3RpY2FtZW50ZSBxdWUgKiptZXN0cmFkb3MqKiB0ZW0gdW1hIHJlbGHDp8OjbyBjb20gbyBlcnJvLCBwb2lzIG8gaW50ZXJ2YWxvIGRlIGNvbmZpYW7Dp2EgcGFyYSBvIGNvZWZpY2llbnRlIGNvbnTDqW0gbyB6ZXJvIGUgbyBwLXZhbG9yIGVzdMOhIGFjaW1hIGRlIDUlLCBpbXBlZGluZG8gcXVlIGEgaGlww7N0ZXNlIG51bGEgZG8gY29lZmljaWVudGUgc2VyIHplcm8gc2VqYSBkZXNjYXJ0YWRhIChiID0gWy0wLjAwODU3MjU3MjswLjAwMzU5NTU5OF0sIElDIGNvbSA5NSUsIHAtdmFsb3IgNC4xNzMyODZlLTAxKS4NClBvciBvdXRybyBsYWRvLCAqKmRvdXRvcmFkb3MqKiB0ZW0gdW1hIHJlbGHDp8OjbyBzaWduaWZpY2F0aXZhIGNvbSBvIGVycm8gKGIgPSBbMC4wMDY0NDIxMTA7MC4wMzI3NTQ1NzBdLCBJQyBjb20gOTUlLCBwLXZhbG9yIDQuMDcyOTQ5ZS0wMykuDQpEbyBtZXNtbyBtb2RvLCBhIHZhcmnDoXZlbCBpbmRlcGVuZGVudGUgY2F0ZWfDs3JpY2EgKip0ZW1fZG91dG9yYWRvKiogdGFtYsOpbSB0ZW0gcmVsYcOnw6NvIHNpZ25pZmljYXRpdmEgY29tIG8gZXJybyAoYiA9IFswLjc0MDQ1NjY1MTsxLjgxMTEzNDY3N10sIElDIGNvbSA5NSUsIHAtdmFsb3IgMS4wNTI0MDNlLTA1KS4NClNlZ3VuZG8gbyBtb2RlbG8sIG8gYXVtZW50byBkZSAxIHVuaWRhZGUgZGUgKiptZXN0cmFkb3MqKiBwcm9kdXogdW0gZGVjcsOpc2NpbW8gZGUgMC4wMDI0ODg0ODcgZW0gKipwcm9kdXRpdmlkYWRlKiosIG8gYXVtZW50byBkZSAxIHVuaWRhZGUgZGUgKipkb3V0b3JhZG9zKiogcHJvZHV6IHVtIGF1bWVudG8gZGUgMC4wMTk1OTgzNDAgZW0gKipwcm9kdXRpdmlkYWRlKiogZSAqKnRlbV9kb3V0b3JhZG8qKiBwcm9kdXogdW0gYXVtZW50byBkZSAxLjI3NTc5NTY2NCBuYSBwcm9kdXRpdmlkYWRlIHF1YW5kbyBtdWRhIGRlIDAgcGFyYSAxIChuw6NvIHRlciBkb3V0b3JhZG8gcGFyYSB0ZXIgZG91dG9yYWRvKS4qDQoNCihpaSkgKipTb2JyZSBhcyBpbXBsaWNhw6fDtWVzKioNCg0KQ29tbyBjb25jbHVzw6NvIGRlIHRvZGFzIGFzIGFuw6FsaXNlcyBleGVjdXRhZGFzIG5lc3RlIGxhYm9yYXTDs3JpbyBjb20gb3MgZGFkb3MgZGEgw7psdGltYSBhdmFsaWHDp8OjbyBxdWFudGl0YXRpdmEgZGEgQ0FQRVMsIHBlcmNlYmVtb3MgcXVlIG8gbsO6bWVybyBkZSBkb2NlbnRlcyBlIG8gbsO6bWVybyBkZSB0ZXNlcyBkZSBkb3V0b3JhZG8gdGVtIHJlbGHDp8OjbyBmb3J0ZSBjb20gYSBwcm9kdcOnw6NvIGUgYSBwcm9kdXRpdmlkYWRlIGVtIHVtYSB1bml2ZXJzaWRhZGUuIFBvZGVtb3MgZGl6ZXIgcXVlIHF1YW50byBtYWlvcmVzIGZvcmVtIG8gbsO6bWVybyBkZSBkb2NlbnRlcyBlIG8gbsO6bWVybyBkZSB0ZXNlcyBkZSBkb3V0b3JhZG9zIGVtIHVtYSB1bml2ZXJzaWRhZGUsIG1haW9yZXMgc2Vyw6NvIGEgcHJvZHXDp8OjbyBlIGEgcHJvZHV0aXZpZGFkZSwgb3Ugc2VqYSwgdmVyZW1vcyBtYWlzIGFydGlnb3MgQTEsIEEyIGUgQjEgc2VyZW0gcHVibGljYWRvcyBwZWxvcyBkb2NlbnRlcy4NCg0KRmFsYW5kbyBlc3BlY2lhbG1lbnRlIHNvYnJlIGEgcHJvZHV0aXZpZGFkZSwgcXVlIGZvaSBnZXJhZGEgY29tbyBvIG7Dum1lcm8gZGUgYXJ0aWdvcyBBMSwgQTIgZSBCMSBwb3IgZG9jZW50ZSBwZXJtYW5lbnRlLCBjb25jbHVpbW9zIHF1ZSwgZXN0YXRpc3RpY2FtZW50ZSwgc2UgdW1hIHVuaXZlcnNpZGFkZSB0ZW0gdW0gbsO6bWVybyBtYWlvciBkZSB0ZXNlcyBlbSBjb21wYXJhw6fDo28gY29tIG91dHJhLCBpc3NvIGltcGxpY2Fyw6EgcXVlLCBlbSBtw6lkaWEsIHVtIGRvY2VudGUgZGEgcHJpbWVpcmEgY29udHJpYnVpdSBjb20gbWFpcyBjb25oZWNpbWVudG8gcmVsZXZhbnRlIHBhcmEgYSBjb211bmlkYWRlIGNpZW50w61maWNhIGRvIHF1ZSB1bSBkb2NlbnRlIGRhIHNlZ3VuZGEuDQoNClBvZGVtb3Mgc2ludGV0aXphciBhIGNvbmNsdXPDo28gY29tbzogZXN0YXRpc3RpY2FtZW50ZSwgcHJvZ3JhbWFzIGRlIHDDs3MgY29tIG1haXMgZG9jZW50ZXMgcGVybWFuZW50ZXMgZSBtYWlzIHRlc2VzIGRlIGRvdXRvcmFkbyBjb250cmlidWVtIGNvbSBtYWlzIGNvbmhlY2ltZW50byByZWxldmFudGUgcGFyYSBhIGNvbXVuaWRhZGUgY2llbnTDrWZpY2Eu