Licença

This work is licensed under the Creative Commons Attribution-ShareAlike 4.0 International License. To view a copy of this license, visit http://creativecommons.org/licenses/by-sa/4.0/ or send a letter to Creative Commons, PO Box 1866, Mountain View, CA 94042, USA.

License: CC BY-SA 4.0

Citação

Sugestão de citação: FIGUEIREDO, Adriano Marcos Rodrigues. Econometria: regressão com dados do Índice de Competitividade Global do WEF e o pacote data360r. Campo Grande-MS,Brasil: RStudio/Rpubs, 2019. Disponível em http://rpubs.com/amrofi/competitiveness_data360r.

1 Introdução

Vamos examinar os metadados do conjunto de dados e identificar um conjunto de dados que queremos usar. Para este caso de uso, vamos nos concentrar no conjunto de dados do Índice de Competitividade Global (GCI) do WEF com o conjunto de dados id == 53. Um website importante destes dados é, por exemplo para o Brasil (BRA), https://tcdata360.worldbank.org/indicators/gci?country=BRA&indicator=632&viz=line_chart&years=2007,2017.

2 Dados

Nosso pacote básico é o data360r, que pode ser instalado a partir do CRAN (install.packages("data360r")) ou a partir do repositório github (devtools::install_github("mrpsonglao/data360r")). Nosso caso foi pelo github.

# install.packages('data360r') devtools::install_github('mrpsonglao/data360r')
library(data360r)

Faremos uma regressão rápida com o conjunto de dados do Índice de Competitividade Global (GCI) do WEF com o conjunto de dados id == 53. Primeiro puxarei os metadados do dataset desejado. Nesse caso, temos 101 observações com 7 variáveis.

df_usecase3_datasets <- get_metadata360(metadata_type = "datasets")

Esse dataframe contém a descrição das variáveis dentro desse conjunto de id == 53. Pegaremos uma variável específica, acompanhando o exemplo do #Case 3 em https://tcdata360.worldbank.org/tools/data360r. O indicador do WEF GCI é de id == 53 dentro do df_usecase3_datasets, ou com slug igual a global_competitiveness_index, na linha 52 do df_usecase3_datasets.

Portanto, escolherei para o último ano disponível (2017-2018). Existem informações desde 2007-2008. São vários indicadores e vários países, de modo que o usuário pode fazer um (View(df_usecase3_result)) caso deseje maiores detalhes.

library(tidyverse)
df_usecase3_result <- get_data360(dataset_id = c(53), output_type = "long") %>% filter(Period == 
    c("2017-2018"))

Para a regressão, manteremos apenas os indicadores GCI do WEF para Subindicator type == ‘Value’. Em seguida, reformulamos o quadro de dados resultante para que os indicadores sejam os nomes das colunas que estão sendo usados fazendo uso da função reshape::acast. Isso facilita a utilização dos dados do indicador nos modelos de regressão.

df2 <- filter(df_usecase3_result, df_usecase3_result$"Subindicator Type" == "Value", 
    !is.na(Observation))

knitr::kable(head(df2))

df3 <- as.data.frame(reshape2::acast(df2, df2$"Country ISO3" ~ df2$Indicator, value.var = "Observation"))

knitr::kable(head(df3))

Agora faremos a regressão com o dataset organizado (df3). A regressão nos indicadores “Inovação” (Innovation) e “Prontidão tecnológica” (Technological Readiness). Como o quadro de dados foi processado adequadamente, é fácil implementar a regressão nos indicadores WEF GCI 2017-2018. Antes de ajustar os dados a um modelo de regressão, primeiro vamos gerar um gráfico de dispersão para indicadores GCI WEF selecionados. Para simplificar, vamos nos concentrar nos dois indicadores citados.

load("df3.Rdata")
# o arquivo está em meu github em https://github.com/amrofi/datasets

Como parece que o site ou o pacote mudaram de nomes das variáveis, para preservar o algoritmo eu salvei o arquivo no diretorio de projeto.

library(ggplot2)
qplot(x = `12th pillar Innovation`, y = `9th pillar Technological readiness`, main = "Gráfico de dispersão entre Inovação x Prontidão tecnológica,
      2017-2018, países do GCI WEF", 
    xlab = "Inovação - pilar 12", ylab = "Prontidão Tecnológica - pilar 9", data = df3)

O gráfico de dispersão sugere que a inovação aumenta quadraticamente com a prontidão tecnológica. Vamos ajustar um modelo de regressão quadrática a esses pontos de dados. Com base nos resultados resumidos, o modelo é um bom ajuste. Também geramos os gráficos suplementares do modelo para ver se os resultados fazem sentido.

3 Modelo quadrático

mod_usecase3_quad <- lm(df3$`12th pillar Innovation` ~ poly(df3$`9th pillar Technological readiness`, 
    2) + df3$`1st pillar Institutions` + df3$`2nd pillar Infrastructure`, data = df3)
summary(mod_usecase3_quad)

Call:
lm(formula = df3$`12th pillar Innovation` ~ poly(df3$`9th pillar Technological readiness`, 
    2) + df3$`1st pillar Institutions` + df3$`2nd pillar Infrastructure`, 
    data = df3)

Residuals:
     Min       1Q   Median       3Q      Max 
-0.83633 -0.25348 -0.00226  0.24333  1.06116 

Coefficients:
                                                   Estimate Std. Error t value
(Intercept)                                         1.30264    0.30309   4.298
poly(df3$`9th pillar Technological readiness`, 2)1  2.83413    0.94459   3.000
poly(df3$`9th pillar Technological readiness`, 2)2  2.21608    0.41620   5.325
df3$`1st pillar Institutions`                       0.38144    0.06498   5.870
df3$`2nd pillar Infrastructure`                     0.17087    0.07643   2.236
                                                   Pr(>|t|)    
(Intercept)                                        3.34e-05 ***
poly(df3$`9th pillar Technological readiness`, 2)1  0.00323 ** 
poly(df3$`9th pillar Technological readiness`, 2)2 4.27e-07 ***
df3$`1st pillar Institutions`                      3.38e-08 ***
df3$`2nd pillar Infrastructure`                     0.02706 *  
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 0.3668 on 131 degrees of freedom
Multiple R-squared:  0.8213,    Adjusted R-squared:  0.8158 
F-statistic: 150.5 on 4 and 131 DF,  p-value: < 2.2e-16
mod_usecase3_quad$AIC <- AIC(mod_usecase3_quad)
mod_usecase3_quad$BIC <- BIC(mod_usecase3_quad)
par(mfrow = c(2, 2))
plot(mod_usecase3_quad)

4 Modelo log-log

mod_usecase3_loglog <- lm(log(df3$`12th pillar Innovation`) ~ log(df3$`9th pillar Technological readiness`) + 
    log(df3$`1st pillar Institutions`) + log(df3$`2nd pillar Infrastructure`), data = df3)
summary(mod_usecase3_loglog)

Call:
lm(formula = log(df3$`12th pillar Innovation`) ~ log(df3$`9th pillar Technological readiness`) + 
    log(df3$`1st pillar Institutions`) + log(df3$`2nd pillar Infrastructure`), 
    data = df3)

Residuals:
      Min        1Q    Median        3Q       Max 
-0.260358 -0.069793 -0.000115  0.076542  0.269855 

Coefficients:
                                               Estimate Std. Error t value
(Intercept)                                    0.009349   0.064182   0.146
log(df3$`9th pillar Technological readiness`)  0.278406   0.077962   3.571
log(df3$`1st pillar Institutions`)             0.638497   0.067009   9.529
log(df3$`2nd pillar Infrastructure`)          -0.028972   0.082934  -0.349
                                              Pr(>|t|)    
(Intercept)                                   0.884404    
log(df3$`9th pillar Technological readiness`) 0.000497 ***
log(df3$`1st pillar Institutions`)             < 2e-16 ***
log(df3$`2nd pillar Infrastructure`)          0.727394    
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 0.1087 on 132 degrees of freedom
Multiple R-squared:  0.7688,    Adjusted R-squared:  0.7636 
F-statistic: 146.3 on 3 and 132 DF,  p-value: < 2.2e-16
mod_usecase3_loglog$AIC <- AIC(mod_usecase3_loglog)
mod_usecase3_loglog$BIC <- BIC(mod_usecase3_loglog)
par(mfrow = c(2, 2))
plot(mod_usecase3_loglog)

5 Resumo

suppressMessages(library(stargazer))
stargazer(list(mod_usecase3_quad, mod_usecase3_loglog), title = "Título: Resultados das Regressões Quadrática e Log-Log", 
    align = TRUE, type = "text", style = "all", keep.stat = c("AIC", "BIC", "rsq", 
        "adj.rsq", "n"), column.labels = c("Quadrática", "Log-Log"), dep.var.labels.include = FALSE)

Título: Resultados das Regressões Quadrática e Log-Log
======================================================================
                                              Dependent variable:     
                                          ----------------------------
                                            Quadrática      Log-Log   
                                               (1)            (2)     
----------------------------------------------------------------------
`9th pillar Technological readiness`, 2)1    2.834***                 
                                             (0.945)                  
                                            t = 3.000                 
                                            p = 0.004                 
`9th pillar Technological readiness`, 2)2    2.216***                 
                                             (0.416)                  
                                            t = 5.325                 
                                           p = 0.00000                
`1st pillar Institutions`                    0.381***                 
                                             (0.065)                  
                                            t = 5.870                 
                                           p = 0.00000                
`2nd pillar Infrastructure`                  0.171**                  
                                             (0.076)                  
                                            t = 2.236                 
                                            p = 0.028                 
`9th pillar Technological readiness`)                      0.278***   
                                                            (0.078)   
                                                           t = 3.571  
                                                          p = 0.0005  
`1st pillar Institutions`)                                 0.638***   
                                                            (0.067)   
                                                           t = 9.529  
                                                           p = 0.000  
`2nd pillar Infrastructure`)                                -0.029    
                                                            (0.083)   
                                                          t = -0.349  
                                                           p = 0.728  
Constant                                     1.303***        0.009    
                                             (0.303)        (0.064)   
                                            t = 4.298      t = 0.146  
                                           p = 0.00004     p = 0.885  
----------------------------------------------------------------------
Observations                                   136            136     
R2                                            0.821          0.769    
Adjusted R2                                   0.816          0.764    
Akaike Inf. Crit.                            120.050       -211.667   
Bayesian Inf. Crit.                          137.526       -197.103   
======================================================================
Note:                                      *p<0.1; **p<0.05; ***p<0.01

6 Teste de Especificação do modelo quadrático: RESET e outliers

Os modelos rejeitam H0 e acusam erro de especificação. Vamos checar eventuais outliers.

library(lmtest)
resettest(mod_usecase3_quad, power = 2:3, type = "fitted")

    RESET test

data:  mod_usecase3_quad
RESET = 4.2149, df1 = 2, df2 = 129, p-value = 0.01686
resettest(mod_usecase3_loglog, power = 2:3, type = "fitted")

    RESET test

data:  mod_usecase3_loglog
RESET = 9.7877, df1 = 2, df2 = 130, p-value = 0.0001098

7 Investigação de outliers das regressões

O teste para outliers foi o Bonferonni do pacote car. Conforme resultados abaixo, foi identificado outlier da regressão da observação 58, correspondente a ISR = Israel.

library(car)
outlierTest(mod_usecase3_quad)
No Studentized residuals with Bonferroni p < 0.05
Largest |rstudent|:
   rstudent unadjusted p-value Bonferroni p
58  3.05004          0.0027737      0.37722
outlierTest(mod_usecase3_loglog)
No Studentized residuals with Bonferroni p < 0.05
Largest |rstudent|:
   rstudent unadjusted p-value Bonferroni p
58 2.565249           0.011436           NA

8 Testes para Média zero e normalidade dos resíduos

Embora as observações 58 e 118 apareçam em destaque no qqplot, eles ainda estão dentro da banda de confiança. Os testes de normalidade Jarque-Bera não indicam violação do pressuposto de normalidade dos resíduos.

# obtendo residuos do modelo da tendencia cúbica
u.hat.quad <- resid(mod_usecase3_quad)
u.hat.loglog <- resid(mod_usecase3_loglog)
# teste de media zero dos residuos
t.test(u.hat.quad)

    One Sample t-test

data:  u.hat.quad
t = -3.4254e-17, df = 135, p-value = 1
alternative hypothesis: true mean is not equal to 0
95 percent confidence interval:
 -0.06127377  0.06127377
sample estimates:
    mean of x 
-1.061282e-18 
t.test(u.hat.loglog)

    One Sample t-test

data:  u.hat.loglog
t = -1.4306e-16, df = 135, p-value = 1
alternative hypothesis: true mean is not equal to 0
95 percent confidence interval:
 -0.01823166  0.01823166
sample estimates:
   mean of x 
-1.31878e-18 
# testes dos residuos da regressao cubica
library(car)
## normalidade dos residuos no R
qqPlot(mod_usecase3_quad)  #car

[1]  58 118
qqPlot(mod_usecase3_loglog)

[1]  58 118
# teste de jarque-bera para normalidade

(JB.regquad <- tseries::jarque.bera.test(u.hat.quad))

    Jarque Bera Test

data:  u.hat.quad
X-squared = 0.87481, df = 2, p-value = 0.6457
(JB.regloglog <- tseries::jarque.bera.test(u.hat.loglog))

    Jarque Bera Test

data:  u.hat.loglog
X-squared = 0.64692, df = 2, p-value = 0.7236

9 Teste de White para heterocedasticidade do modelo quadrático

Usarei o pacote lmtest para realizar o teste. A hipótese nula é H0: resíduos homocedásticos. A rejeição de H0 leva à adoção de modelo robusto a heterocedasticidade dos resíduos.

# mod_usecase3_quad <- lm(df3$`12th pillar Innovation` ~ poly(df3$`9th pillar
# Technological readiness`, 2)+ df3$`1st pillar Institutions`+ df3$`2nd pillar
# Infrastructure`)
library(lmtest)
mquad <- mod_usecase3_quad
bptest(mquad, ~poly(df3$`9th pillar Technological readiness`, 2) + df3$`1st pillar Institutions` + 
    df3$`2nd pillar Infrastructure` + I(df3$`9th pillar Technological readiness`^2) + 
    I(df3$`9th pillar Technological readiness`^4) + I(df3$`1st pillar Institutions`^2) + 
    I(df3$`2nd pillar Infrastructure`^2))

    studentized Breusch-Pagan test

data:  mquad
BP = 12.75, df = 7, p-value = 0.07845

A correção de White para o modelo robusto será:

vcov.white0 <- car::hccm(mod_usecase3_quad, type = c("hc1"))
coeftest(mod_usecase3_quad, vcov.white0)

t test of coefficients:

                                                   Estimate Std. Error t value
(Intercept)                                        1.302639   0.325046  4.0076
poly(df3$`9th pillar Technological readiness`, 2)1 2.834125   1.051113  2.6963
poly(df3$`9th pillar Technological readiness`, 2)2 2.216079   0.430958  5.1422
df3$`1st pillar Institutions`                      0.381438   0.062005  6.1517
df3$`2nd pillar Infrastructure`                    0.170869   0.083825  2.0384
                                                    Pr(>|t|)    
(Intercept)                                        0.0001024 ***
poly(df3$`9th pillar Technological readiness`, 2)1 0.0079324 ** 
poly(df3$`9th pillar Technological readiness`, 2)2 9.656e-07 ***
df3$`1st pillar Institutions`                      8.663e-09 ***
df3$`2nd pillar Infrastructure`                    0.0435222 *  
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Ou de outra forma,

library(sandwich)
modrob <- coeftest(mod_usecase3_quad, vcov = vcovHC(mod_usecase3_quad, type = "HC1"))
suppressMessages(library(stargazer))
stargazer(list(mod_usecase3_quad, mod_usecase3_loglog, modrob), title = "Título: Resultados das Regressões Quadrática e Log-Log", 
    align = TRUE, type = "text", style = "all", keep.stat = c("AIC", "BIC", "rsq", 
        "adj.rsq", "n"), column.labels = c("Quadrática", "Log-Log", "Quad.Robusto"), 
    dep.var.labels.include = FALSE, model.numbers = FALSE, model.names = FALSE)

Título: Resultados das Regressões Quadrática e Log-Log
=============================================================================
                                                  Dependent variable:        
                                          -----------------------------------
                                          Quadrática   Log-Log   Quad.Robusto
-----------------------------------------------------------------------------
`9th pillar Technological readiness`, 2)1  2.834***                2.834***  
                                            (0.945)                (1.051)   
                                           t = 3.000              t = 2.696  
                                           p = 0.004              p = 0.008  
`9th pillar Technological readiness`, 2)2  2.216***                2.216***  
                                            (0.416)                (0.431)   
                                           t = 5.325              t = 5.142  
                                          p = 0.00000            p = 0.00000 
`1st pillar Institutions`                  0.381***                0.381***  
                                            (0.065)                (0.062)   
                                           t = 5.870              t = 6.152  
                                          p = 0.00000             p = 0.000  
`2nd pillar Infrastructure`                 0.171**                0.171**   
                                            (0.076)                (0.084)   
                                           t = 2.236              t = 2.038  
                                           p = 0.028              p = 0.044  
`9th pillar Technological readiness`)                  0.278***              
                                                       (0.078)               
                                                      t = 3.571              
                                                      p = 0.0005             
`1st pillar Institutions`)                             0.638***              
                                                       (0.067)               
                                                      t = 9.529              
                                                      p = 0.000              
`2nd pillar Infrastructure`)                            -0.029               
                                                       (0.083)               
                                                      t = -0.349             
                                                      p = 0.728              
Constant                                   1.303***     0.009      1.303***  
                                            (0.303)    (0.064)     (0.325)   
                                           t = 4.298  t = 0.146   t = 4.008  
                                          p = 0.00004 p = 0.885   p = 0.0002 
-----------------------------------------------------------------------------
Observations                                  136        136                 
R2                                           0.821      0.769                
Adjusted R2                                  0.816      0.764                
Akaike Inf. Crit.                           120.050    -211.667              
Bayesian Inf. Crit.                         137.526    -197.103              
=============================================================================
Note:                                             *p<0.1; **p<0.05; ***p<0.01

10 Teste de multicolinearidade do modelo quadrático

Não houve evidência de multicolinearidade prejudicial ao modelo.

regquad.vif <- vif(mod_usecase3_quad)
regquad.vif
                                                      GVIF Df GVIF^(1/(2*Df))
poly(df3$`9th pillar Technological readiness`, 2) 8.506647  2        1.707810
df3$`1st pillar Institutions`                     3.252166  1        1.803376
df3$`2nd pillar Infrastructure`                   8.503978  1        2.916158

Referências

Ma. Regina Paz S. Onglao (2018). data360r: Wrapper for TC/Govdata360 API. R package version 1.0.2. Disponível em: https://github.com/mrpsonglao/data360r

LS0tDQp0aXRsZTogIkVjb25vbWV0cmlhOiByZWdyZXNzw6NvIGNvbSBkYWRvcyBkbyDDjW5kaWNlIGRlIENvbXBldGl0aXZpZGFkZSBHbG9iYWwgZG8gV0VGIGUgbyBwYWNvdGUgYGRhdGEzNjByYCINCmF1dGhvcjogIkFkcmlhbm8gTWFyY29zIFJvZHJpZ3VlcyBGaWd1ZWlyZWRvIg0KZS1tYWlsOiAiYWRyaWFuby5maWd1ZWlyZWRvQHVmbXMuYnIiDQphYnN0cmFjdDogDQogIFdlIGFuYWx5c2UgYSByZWdyZXNzaW9uIG1vZGVsIHVzaW5nIHRoZSBXRUYgR2xvYmFsIENvbXBldGl0aXZlbmVzcyBJbmRleCAoR0NJKSBkYXRhc2V0IGFuZCB0aGUgV29ybGQgQmFuaydzIHBhY2thZ2UgYGRhdGEzNjByYC4gDQpkYXRlOiAiYHIgZm9ybWF0KFN5cy5EYXRlKCksICclZCAlQiAlWScpYCINCmxpbmtjb2xvcjogYmx1ZQ0Kb3V0cHV0Og0KICBodG1sX2RvY3VtZW50Og0KICAgIGNvZGVfZG93bmxvYWQ6IHRydWUNCiAgICB0aGVtZTogZGVmYXVsdA0KICAgIG51bWJlcl9zZWN0aW9uczogdHJ1ZQ0KICAgIHRvYzogeWVzDQogICAgdG9jX2Zsb2F0OiB5ZXMNCiAgICBkZl9wcmludDogcGFnZWQNCiAgICBmaWdfY2FwdGlvbjogdHJ1ZQ0KICBwZGZfZG9jdW1lbnQ6DQogICAgdG9jOiB5ZXMNCi0tLQ0KDQpgYGB7ciBrbml0cl9pbml0LCBlY2hvPUZBTFNFLCBjYWNoZT1GQUxTRX0NCmxpYnJhcnkoa25pdHIpDQpsaWJyYXJ5KHJtYXJrZG93bikNCmxpYnJhcnkocm1kZm9ybWF0cykNCg0KIyMgR2xvYmFsIG9wdGlvbnMNCm9wdGlvbnMobWF4LnByaW50PSIxMDAiKQ0Kb3B0c19jaHVuayRzZXQoZWNobz1UUlVFLA0KCSAgICAgICAgICAgICBjYWNoZT1UUlVFLA0KICAgICAgICAgICAgICAgcHJvbXB0PUZBTFNFLA0KICAgICAgICAgICAgICAgdGlkeT1UUlVFLA0KICAgICAgICAgICAgICAgY29tbWVudD1OQSwNCiAgICAgICAgICAgICAgIG1lc3NhZ2U9RkFMU0UsDQogICAgICAgICAgICAgICB3YXJuaW5nPUZBTFNFKQ0Kb3B0c19rbml0JHNldCh3aWR0aD0xMDApDQpgYGANCg0KDQpMaWNlbsOnYSB7LSNMaWNlbsOnYX0NCj09PT09PT09PT09PT09PT09PT0NCg0KVGhpcyB3b3JrIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBDcmVhdGl2ZSBDb21tb25zIEF0dHJpYnV0aW9uLVNoYXJlQWxpa2UgNC4wIEludGVybmF0aW9uYWwgTGljZW5zZS4gVG8gdmlldyBhIGNvcHkgb2YgdGhpcyBsaWNlbnNlLCB2aXNpdCA8aHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvYnktc2EvNC4wLz4gb3Igc2VuZCBhIGxldHRlciB0byBDcmVhdGl2ZSBDb21tb25zLCBQTyBCb3ggMTg2NiwgTW91bnRhaW4gVmlldywgQ0EgOTQwNDIsIFVTQS4NCg0KIVtMaWNlbnNlOiBDQyBCWS1TQSA0LjBdKGh0dHBzOi8vbWlycm9ycy5jcmVhdGl2ZWNvbW1vbnMub3JnL3ByZXNza2l0L2J1dHRvbnMvODh4MzEvcG5nL2J5LXNhLnBuZyl7IHdpZHRoPTI1JSB9DQoNCkNpdGHDp8OjbyB7LSNDaXRhw6fDo299DQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KDQpTdWdlc3TDo28gZGUgY2l0YcOnw6NvOg0KRklHVUVJUkVETywgQWRyaWFubyBNYXJjb3MgUm9kcmlndWVzLiBFY29ub21ldHJpYTogcmVncmVzc8OjbyBjb20gZGFkb3MgZG8gw41uZGljZSBkZSBDb21wZXRpdGl2aWRhZGUgR2xvYmFsIGRvIFdFRiBlIG8gcGFjb3RlIGBkYXRhMzYwcmAuIENhbXBvIEdyYW5kZS1NUyxCcmFzaWw6IFJTdHVkaW8vUnB1YnMsIDIwMTkuIERpc3BvbsOtdmVsIGVtIDxodHRwOi8vcnB1YnMuY29tL2Ftcm9maS9jb21wZXRpdGl2ZW5lc3NfZGF0YTM2MHI+LiANCg0KSW50cm9kdcOnw6NvDQo9PT09PT09PT09PT09PT09PT09DQoNClZhbW9zIGV4YW1pbmFyIG9zIG1ldGFkYWRvcyBkbyBjb25qdW50byBkZSBkYWRvcyBlIGlkZW50aWZpY2FyIHVtIGNvbmp1bnRvIGRlIGRhZG9zIHF1ZSBxdWVyZW1vcyB1c2FyLiBQYXJhIGVzdGUgY2FzbyBkZSB1c28sIHZhbW9zIG5vcyBjb25jZW50cmFyIG5vIGNvbmp1bnRvIGRlIGRhZG9zIGRvIMONbmRpY2UgZGUgQ29tcGV0aXRpdmlkYWRlIEdsb2JhbCAoR0NJKSBkbyBXRUYgY29tIG8gY29uanVudG8gZGUgZGFkb3MgaWQgPT0gNTMuIFVtIHdlYnNpdGUgaW1wb3J0YW50ZSBkZXN0ZXMgZGFkb3Mgw6ksIHBvciBleGVtcGxvIHBhcmEgbyBCcmFzaWwgKEJSQSksICAgPGh0dHBzOi8vdGNkYXRhMzYwLndvcmxkYmFuay5vcmcvaW5kaWNhdG9ycy9nY2k/Y291bnRyeT1CUkEmaW5kaWNhdG9yPTYzMiZ2aXo9bGluZV9jaGFydCZ5ZWFycz0yMDA3LDIwMTc+Lg0KDQpEYWRvcw0KPT09PT09PT09PT09PT09PT09PT0NCg0KTm9zc28gcGFjb3RlIGLDoXNpY28gw6kgbyBgZGF0YTM2MHJgLCBxdWUgcG9kZSBzZXIgaW5zdGFsYWRvIGEgcGFydGlyIGRvIENSQU4gKGBpbnN0YWxsLnBhY2thZ2VzKCJkYXRhMzYwciIpYCkgb3UgYSBwYXJ0aXIgZG8gcmVwb3NpdMOzcmlvIGdpdGh1YiAoYGRldnRvb2xzOjppbnN0YWxsX2dpdGh1YigibXJwc29uZ2xhby9kYXRhMzYwciIpYCkuIE5vc3NvIGNhc28gZm9pIHBlbG8gZ2l0aHViLg0KDQpgYGB7cixldmFsPUZBTFNFfQ0KI2luc3RhbGwucGFja2FnZXMoImRhdGEzNjByIikNCiNkZXZ0b29sczo6aW5zdGFsbF9naXRodWIoIm1ycHNvbmdsYW8vZGF0YTM2MHIiKQ0KbGlicmFyeShkYXRhMzYwcikNCmBgYA0KDQpGYXJlbW9zIHVtYSByZWdyZXNzw6NvIHLDoXBpZGEgY29tIG8gY29uanVudG8gZGUgZGFkb3MgZG8gw41uZGljZSBkZSBDb21wZXRpdGl2aWRhZGUgR2xvYmFsIChHQ0kpIGRvIFdFRiBjb20gbyBjb25qdW50byBkZSBkYWRvcyBpZCA9PSA1My4gUHJpbWVpcm8gcHV4YXJlaSBvcyBtZXRhZGFkb3MgZG8gZGF0YXNldCBkZXNlamFkby4gTmVzc2UgY2FzbywgdGVtb3MgMTAxIG9ic2VydmHDp8O1ZXMgY29tIDcgdmFyacOhdmVpcy4gICANCg0KYGBge3IsZXZhbD1GQUxTRX0NCmRmX3VzZWNhc2UzX2RhdGFzZXRzIDwtIGdldF9tZXRhZGF0YTM2MChtZXRhZGF0YV90eXBlID0gImRhdGFzZXRzIikNCmBgYA0KDQpFc3NlIGRhdGFmcmFtZSBjb250w6ltIGEgZGVzY3Jpw6fDo28gZGFzIHZhcmnDoXZlaXMgZGVudHJvIGRlc3NlIGNvbmp1bnRvIGRlIGlkID09IDUzLiBQZWdhcmVtb3MgdW1hIHZhcmnDoXZlbCBlc3BlY8OtZmljYSwgYWNvbXBhbmhhbmRvIG8gZXhlbXBsbyBkbyBfI0Nhc2UgM18gZW0gIDxodHRwczovL3RjZGF0YTM2MC53b3JsZGJhbmsub3JnL3Rvb2xzL2RhdGEzNjByPi4gTyBpbmRpY2Fkb3IgZG8gV0VGIEdDSSDDqSBkZSBpZCA9PSA1MyBkZW50cm8gZG8gYGRmX3VzZWNhc2UzX2RhdGFzZXRzYCwgb3UgY29tICpzbHVnKiBpZ3VhbCBhICpnbG9iYWxfY29tcGV0aXRpdmVuZXNzX2luZGV4KiwgbmEgbGluaGEgNTIgZG8gYGRmX3VzZWNhc2UzX2RhdGFzZXRzYC4gICAgDQoNClBvcnRhbnRvLCBlc2NvbGhlcmVpIHBhcmEgbyDDumx0aW1vIGFubyBkaXNwb27DrXZlbCAoMjAxNy0yMDE4KS4gRXhpc3RlbSBpbmZvcm1hw6fDtWVzIGRlc2RlIDIwMDctMjAwOC4gU8OjbyB2w6FyaW9zIGluZGljYWRvcmVzIGUgdsOhcmlvcyBwYcOtc2VzLCBkZSBtb2RvIHF1ZSBvIHVzdcOhcmlvIHBvZGUgZmF6ZXIgdW0gKGBWaWV3KGRmX3VzZWNhc2UzX3Jlc3VsdClgKSBjYXNvIGRlc2VqZSBtYWlvcmVzIGRldGFsaGVzLiAgICANCg0KYGBge3IsZXZhbD1GQUxTRX0NCmxpYnJhcnkodGlkeXZlcnNlKQ0KZGZfdXNlY2FzZTNfcmVzdWx0IDwtIGdldF9kYXRhMzYwKGRhdGFzZXRfaWQ9Yyg1MyksIG91dHB1dF90eXBlID0gJ2xvbmcnKSAlPiUNCglmaWx0ZXIoUGVyaW9kPT1jKCIyMDE3LTIwMTgiKSkNCmBgYCAgICANCg0KUGFyYSBhIHJlZ3Jlc3PDo28sIG1hbnRlcmVtb3MgYXBlbmFzIG9zIGluZGljYWRvcmVzIEdDSSBkbyBXRUYgcGFyYSBgU3ViaW5kaWNhdG9yIHR5cGUgPT0g4oCYVmFsdWXigJlgLiBFbSBzZWd1aWRhLCByZWZvcm11bGFtb3MgbyBxdWFkcm8gZGUgZGFkb3MgcmVzdWx0YW50ZSBwYXJhIHF1ZSBvcyBpbmRpY2Fkb3JlcyBzZWphbSBvcyBub21lcyBkYXMgY29sdW5hcyBxdWUgZXN0w6NvIHNlbmRvIHVzYWRvcyBmYXplbmRvIHVzbyBkYSBmdW7Dp8OjbyBgcmVzaGFwZTo6YWNhc3RgLiBJc3NvIGZhY2lsaXRhIGEgdXRpbGl6YcOnw6NvIGRvcyBkYWRvcyBkbyBpbmRpY2Fkb3Igbm9zIG1vZGVsb3MgZGUgcmVncmVzc8Ojby4gICAgDQoNCmBgYHtyLGV2YWw9RkFMU0V9DQpkZjIgPC0gZmlsdGVyKGRmX3VzZWNhc2UzX3Jlc3VsdCwgZGZfdXNlY2FzZTNfcmVzdWx0JCJTdWJpbmRpY2F0b3IgVHlwZSIgPT0gIlZhbHVlIiwgIWlzLm5hKE9ic2VydmF0aW9uKSkNCg0Ka25pdHI6OmthYmxlKGhlYWQoZGYyKSkNCg0KZGYzIDwtIGFzLmRhdGEuZnJhbWUocmVzaGFwZTI6OmFjYXN0KGRmMiwgZGYyJCJDb3VudHJ5IElTTzMiIH4gZGYyJEluZGljYXRvciwgdmFsdWUudmFyPSJPYnNlcnZhdGlvbiIpKQ0KDQprbml0cjo6a2FibGUoaGVhZChkZjMpKQ0KYGBgDQoNCkFnb3JhIGZhcmVtb3MgYSByZWdyZXNzw6NvIGNvbSBvIGRhdGFzZXQgb3JnYW5pemFkbyAoYGRmM2ApLiBBIHJlZ3Jlc3PDo28gbm9zIGluZGljYWRvcmVzICJJbm92YcOnw6NvIiAoX0lubm92YXRpb25fKSBlICJQcm9udGlkw6NvIHRlY25vbMOzZ2ljYSIgKF9UZWNobm9sb2dpY2FsIFJlYWRpbmVzc18pLiBDb21vIG8gcXVhZHJvIGRlIGRhZG9zIGZvaSBwcm9jZXNzYWRvIGFkZXF1YWRhbWVudGUsIMOpIGbDoWNpbCBpbXBsZW1lbnRhciBhIHJlZ3Jlc3PDo28gbm9zIGluZGljYWRvcmVzIFdFRiBHQ0kgMjAxNy0yMDE4LiBBbnRlcyBkZSBhanVzdGFyIG9zIGRhZG9zIGEgdW0gbW9kZWxvIGRlIHJlZ3Jlc3PDo28sIHByaW1laXJvIHZhbW9zIGdlcmFyIHVtIGdyw6FmaWNvIGRlIGRpc3BlcnPDo28gcGFyYSBpbmRpY2Fkb3JlcyBHQ0kgV0VGIHNlbGVjaW9uYWRvcy4gUGFyYSBzaW1wbGlmaWNhciwgdmFtb3Mgbm9zIGNvbmNlbnRyYXIgbm9zIGRvaXMgaW5kaWNhZG9yZXMgY2l0YWRvcy4NCg0KYGBge3J9DQpsb2FkKCJkZjMuUmRhdGEiKQ0KIyBvIGFycXVpdm8gZXN0w6EgZW0gbWV1IGdpdGh1YiBlbSBodHRwczovL2dpdGh1Yi5jb20vYW1yb2ZpL2RhdGFzZXRzDQpgYGANCg0KQ29tbyBwYXJlY2UgcXVlIG8gc2l0ZSBvdSBvIHBhY290ZSBtdWRhcmFtIGRlIG5vbWVzIGRhcyB2YXJpw6F2ZWlzLCBwYXJhIHByZXNlcnZhciBvIGFsZ29yaXRtbyBldSBzYWx2ZWkgbyBhcnF1aXZvIG5vIGRpcmV0b3JpbyBkZSBwcm9qZXRvLg0KDQpgYGB7cn0NCmxpYnJhcnkoZ2dwbG90MikNCnFwbG90KHg9YDEydGggcGlsbGFyIElubm92YXRpb25gLCANCiAgICAgIHk9YDl0aCBwaWxsYXIgVGVjaG5vbG9naWNhbCByZWFkaW5lc3NgLCANCiAgICAgIG1haW4gPSAiR3LDoWZpY28gZGUgZGlzcGVyc8OjbyBlbnRyZSBJbm92YcOnw6NvIHggUHJvbnRpZMOjbyB0ZWNub2zDs2dpY2EsDQogICAgICAyMDE3LTIwMTgsIHBhw61zZXMgZG8gR0NJIFdFRiIsDQogICAgICB4bGFiID0gIklub3Zhw6fDo28gLSBwaWxhciAxMiIsDQogICAgICB5bGFiID0gIlByb250aWTDo28gVGVjbm9sw7NnaWNhIC0gcGlsYXIgOSIsDQogICAgICBkYXRhID0gZGYzKQ0KYGBgDQoNCk8gZ3LDoWZpY28gZGUgZGlzcGVyc8OjbyBzdWdlcmUgcXVlIGEgaW5vdmHDp8OjbyBhdW1lbnRhIHF1YWRyYXRpY2FtZW50ZSBjb20gYSBwcm9udGlkw6NvIHRlY25vbMOzZ2ljYS4gVmFtb3MgYWp1c3RhciB1bSBtb2RlbG8gZGUgcmVncmVzc8OjbyBxdWFkcsOhdGljYSBhIGVzc2VzIHBvbnRvcyBkZSBkYWRvcy4gQ29tIGJhc2Ugbm9zIHJlc3VsdGFkb3MgcmVzdW1pZG9zLCBvIG1vZGVsbyDDqSB1bSBib20gYWp1c3RlLiBUYW1iw6ltIGdlcmFtb3Mgb3MgZ3LDoWZpY29zIHN1cGxlbWVudGFyZXMgZG8gbW9kZWxvIHBhcmEgdmVyIHNlIG9zIHJlc3VsdGFkb3MgZmF6ZW0gc2VudGlkby4gICANCg0KIyBNb2RlbG8gcXVhZHLDoXRpY28NCg0KYGBge3J9DQptb2RfdXNlY2FzZTNfcXVhZCA8LSANCiAgbG0oZGYzJGAxMnRoIHBpbGxhciBJbm5vdmF0aW9uYCB+IA0KICAgICAgIHBvbHkoZGYzJGA5dGggcGlsbGFyIFRlY2hub2xvZ2ljYWwgcmVhZGluZXNzYCwgMikrDQogICAgICAgZGYzJGAxc3QgcGlsbGFyIEluc3RpdHV0aW9uc2ArDQogICAgICAgZGYzJGAybmQgcGlsbGFyIEluZnJhc3RydWN0dXJlYCwNCiAgICAgZGF0YSA9IGRmMykNCnN1bW1hcnkobW9kX3VzZWNhc2UzX3F1YWQpDQptb2RfdXNlY2FzZTNfcXVhZCRBSUM8LUFJQyhtb2RfdXNlY2FzZTNfcXVhZCkNCm1vZF91c2VjYXNlM19xdWFkJEJJQzwtQklDKG1vZF91c2VjYXNlM19xdWFkKQ0KcGFyKG1mcm93ID0gYygyLCAyKSkNCnBsb3QobW9kX3VzZWNhc2UzX3F1YWQpDQpgYGANCg0KIyBNb2RlbG8gbG9nLWxvZw0KDQpgYGB7cn0NCm1vZF91c2VjYXNlM19sb2dsb2cgPC0gDQogIGxtKGxvZyhkZjMkYDEydGggcGlsbGFyIElubm92YXRpb25gKSB+IA0KICAgICAgIGxvZyhkZjMkYDl0aCBwaWxsYXIgVGVjaG5vbG9naWNhbCByZWFkaW5lc3NgKSsNCiAgICAgICBsb2coZGYzJGAxc3QgcGlsbGFyIEluc3RpdHV0aW9uc2ApKw0KICAgICAgIGxvZyhkZjMkYDJuZCBwaWxsYXIgSW5mcmFzdHJ1Y3R1cmVgKSwNCiAgICAgZGF0YSA9IGRmMykNCnN1bW1hcnkobW9kX3VzZWNhc2UzX2xvZ2xvZykNCm1vZF91c2VjYXNlM19sb2dsb2ckQUlDPC1BSUMobW9kX3VzZWNhc2UzX2xvZ2xvZykNCm1vZF91c2VjYXNlM19sb2dsb2ckQklDPC1CSUMobW9kX3VzZWNhc2UzX2xvZ2xvZykNCnBhcihtZnJvdyA9IGMoMiwgMikpDQpwbG90KG1vZF91c2VjYXNlM19sb2dsb2cpDQpgYGANCg0KIyBSZXN1bW8NCg0KYGBge3J9DQpzdXBwcmVzc01lc3NhZ2VzKGxpYnJhcnkoc3RhcmdhemVyKSkNCnN0YXJnYXplcihsaXN0KG1vZF91c2VjYXNlM19xdWFkLG1vZF91c2VjYXNlM19sb2dsb2cpLCANCiAgICAgICAgICB0aXRsZSA9ICJUw610dWxvOiBSZXN1bHRhZG9zIGRhcyBSZWdyZXNzw7VlcyBRdWFkcsOhdGljYSBlIExvZy1Mb2ciLCANCiAgICAgICAgICBhbGlnbiA9IFRSVUUsIHR5cGUgPSAidGV4dCIsIA0KICAgICAgICAgIHN0eWxlID0gImFsbCIsIA0KICAgICAgICAgIGtlZXAuc3RhdCA9IGMoIkFJQyIsICJCSUMiLCAicnNxIiwgImFkai5yc3EiLCAibiIpLA0KICAgICAgICAgIGNvbHVtbi5sYWJlbHM9YygiUXVhZHLDoXRpY2EiLCJMb2ctTG9nIiksDQogICAgICAgICAgZGVwLnZhci5sYWJlbHMuaW5jbHVkZSA9IEZBTFNFKQ0KYGBgDQoNCiMgVGVzdGUgZGUgRXNwZWNpZmljYcOnw6NvIGRvIG1vZGVsbyBxdWFkcsOhdGljbzogUkVTRVQgZSBvdXRsaWVycw0KDQpPcyBtb2RlbG9zIHJlamVpdGFtIEgwIGUgYWN1c2FtIGVycm8gZGUgZXNwZWNpZmljYcOnw6NvLiBWYW1vcyBjaGVjYXIgZXZlbnR1YWlzIG91dGxpZXJzLg0KDQpgYGB7cn0NCmxpYnJhcnkobG10ZXN0KQ0KcmVzZXR0ZXN0KG1vZF91c2VjYXNlM19xdWFkLHBvd2VyID0gMjozLHR5cGUgPSAiZml0dGVkIikNCnJlc2V0dGVzdChtb2RfdXNlY2FzZTNfbG9nbG9nLHBvd2VyID0gMjozLHR5cGUgPSAiZml0dGVkIikNCmBgYA0KDQojIEludmVzdGlnYcOnw6NvIGRlIG91dGxpZXJzIGRhcyByZWdyZXNzw7Vlcw0KDQpPIHRlc3RlIHBhcmEgb3V0bGllcnMgZm9pIG8gQm9uZmVyb25uaSBkbyBwYWNvdGUgYGNhcmAuIENvbmZvcm1lIHJlc3VsdGFkb3MgYWJhaXhvLCBmb2kgaWRlbnRpZmljYWRvIG91dGxpZXIgZGEgcmVncmVzc8OjbyBkYSBvYnNlcnZhw6fDo28gNTgsIGNvcnJlc3BvbmRlbnRlIGEgSVNSID0gSXNyYWVsLiANCg0KYGBge3J9DQpsaWJyYXJ5KGNhcikNCm91dGxpZXJUZXN0KG1vZF91c2VjYXNlM19xdWFkKQ0Kb3V0bGllclRlc3QobW9kX3VzZWNhc2UzX2xvZ2xvZykNCmBgYA0KDQojIFRlc3RlcyBwYXJhIE3DqWRpYSB6ZXJvIGUgbm9ybWFsaWRhZGUgZG9zIHJlc8OtZHVvcw0KDQpFbWJvcmEgYXMgb2JzZXJ2YcOnw7VlcyA1OCBlIDExOCBhcGFyZcOnYW0gZW0gZGVzdGFxdWUgbm8gcXFwbG90LCBlbGVzIGFpbmRhIGVzdMOjbyBkZW50cm8gZGEgYmFuZGEgZGUgY29uZmlhbsOnYS4gT3MgdGVzdGVzIGRlIG5vcm1hbGlkYWRlIEphcnF1ZS1CZXJhIG7Do28gaW5kaWNhbSB2aW9sYcOnw6NvIGRvIHByZXNzdXBvc3RvIGRlIG5vcm1hbGlkYWRlIGRvcyByZXPDrWR1b3MuICAgICAgICANCg0KYGBge3J9DQojb2J0ZW5kbyByZXNpZHVvcyBkbyBtb2RlbG8gZGEgdGVuZGVuY2lhIGPDumJpY2ENCnUuaGF0LnF1YWQ8LXJlc2lkKG1vZF91c2VjYXNlM19xdWFkKQ0KdS5oYXQubG9nbG9nPC1yZXNpZChtb2RfdXNlY2FzZTNfbG9nbG9nKQ0KIyB0ZXN0ZSBkZSBtZWRpYSB6ZXJvIGRvcyByZXNpZHVvcw0KdC50ZXN0KHUuaGF0LnF1YWQpDQp0LnRlc3QodS5oYXQubG9nbG9nKQ0KDQojdGVzdGVzIGRvcyByZXNpZHVvcyBkYSByZWdyZXNzYW8gY3ViaWNhDQpsaWJyYXJ5KGNhcikNCiMjIG5vcm1hbGlkYWRlIGRvcyByZXNpZHVvcyBubyBSDQpxcVBsb3QobW9kX3VzZWNhc2UzX3F1YWQpICAjY2FyDQpxcVBsb3QobW9kX3VzZWNhc2UzX2xvZ2xvZykNCiN0ZXN0ZSBkZSBqYXJxdWUtYmVyYSBwYXJhIG5vcm1hbGlkYWRlDQoNCihKQi5yZWdxdWFkPC10c2VyaWVzOjpqYXJxdWUuYmVyYS50ZXN0KHUuaGF0LnF1YWQpKQ0KKEpCLnJlZ2xvZ2xvZzwtdHNlcmllczo6amFycXVlLmJlcmEudGVzdCh1LmhhdC5sb2dsb2cpKQ0KYGBgDQoNCiMgVGVzdGUgZGUgV2hpdGUgcGFyYSBoZXRlcm9jZWRhc3RpY2lkYWRlIGRvIG1vZGVsbyBxdWFkcsOhdGljbw0KDQpVc2FyZWkgbyBwYWNvdGUgYGxtdGVzdGAgcGFyYSByZWFsaXphciBvIHRlc3RlLiBBIGhpcMOzdGVzZSBudWxhIMOpIEgwOiByZXPDrWR1b3MgaG9tb2NlZMOhc3RpY29zLiBBIHJlamVpw6fDo28gZGUgSDAgbGV2YSDDoCBhZG/Dp8OjbyBkZSBtb2RlbG8gcm9idXN0byBhIGhldGVyb2NlZGFzdGljaWRhZGUgZG9zIHJlc8OtZHVvcy4gICAgDQoNCmBgYHtyfQ0KI21vZF91c2VjYXNlM19xdWFkIDwtIA0KIyAgbG0oZGYzJGAxMnRoIHBpbGxhciBJbm5vdmF0aW9uYCB+IA0KIyAgICBwb2x5KGRmMyRgOXRoIHBpbGxhciBUZWNobm9sb2dpY2FsIHJlYWRpbmVzc2AsIDIpKw0KIyAgICBkZjMkYDFzdCBwaWxsYXIgSW5zdGl0dXRpb25zYCsNCiMgICAgZGYzJGAybmQgcGlsbGFyIEluZnJhc3RydWN0dXJlYCkNCmxpYnJhcnkobG10ZXN0KQ0KbXF1YWQ8LW1vZF91c2VjYXNlM19xdWFkDQpicHRlc3QobXF1YWQsfiBwb2x5KGRmMyRgOXRoIHBpbGxhciBUZWNobm9sb2dpY2FsIHJlYWRpbmVzc2AsIDIpKw0KICAgICAgICAgZGYzJGAxc3QgcGlsbGFyIEluc3RpdHV0aW9uc2ArDQogICAgICAgICBkZjMkYDJuZCBwaWxsYXIgSW5mcmFzdHJ1Y3R1cmVgKw0KICAgICAgICAgSShkZjMkYDl0aCBwaWxsYXIgVGVjaG5vbG9naWNhbCByZWFkaW5lc3NgXjIpKw0KICAgICAgICAgSShkZjMkYDl0aCBwaWxsYXIgVGVjaG5vbG9naWNhbCByZWFkaW5lc3NgXjQpKw0KICAgICAgICAgSShkZjMkYDFzdCBwaWxsYXIgSW5zdGl0dXRpb25zYF4yKSsNCiAgICAgICAgIEkoZGYzJGAybmQgcGlsbGFyIEluZnJhc3RydWN0dXJlYF4yKSkNCmBgYA0KDQpBIGNvcnJlw6fDo28gZGUgV2hpdGUgcGFyYSBvIG1vZGVsbyByb2J1c3RvIHNlcsOhOg0KDQpgYGB7cn0NCnZjb3Yud2hpdGUwPC1jYXI6OmhjY20obW9kX3VzZWNhc2UzX3F1YWQsdHlwZT1jKCJoYzEiKSkNCmNvZWZ0ZXN0KG1vZF91c2VjYXNlM19xdWFkLHZjb3Yud2hpdGUwKQ0KYGBgDQoNCk91IGRlIG91dHJhIGZvcm1hLCANCg0KYGBge3J9DQpsaWJyYXJ5KHNhbmR3aWNoKSAgICANCm1vZHJvYjwtY29lZnRlc3QobW9kX3VzZWNhc2UzX3F1YWQsIA0KICAgICAgICAgdmNvdj12Y292SEMobW9kX3VzZWNhc2UzX3F1YWQsIHR5cGUgPSAiSEMxIikpDQpgYGANCg0KYGBge3J9DQpzdXBwcmVzc01lc3NhZ2VzKGxpYnJhcnkoc3RhcmdhemVyKSkNCnN0YXJnYXplcihsaXN0KG1vZF91c2VjYXNlM19xdWFkLG1vZF91c2VjYXNlM19sb2dsb2csbW9kcm9iKSwgDQogICAgICAgICAgdGl0bGUgPSAiVMOtdHVsbzogUmVzdWx0YWRvcyBkYXMgUmVncmVzc8O1ZXMgUXVhZHLDoXRpY2EgZSBMb2ctTG9nIiwgDQogICAgICAgICAgYWxpZ24gPSBUUlVFLCB0eXBlID0gInRleHQiLCANCiAgICAgICAgICBzdHlsZSA9ICJhbGwiLCANCiAgICAgICAgICBrZWVwLnN0YXQgPSBjKCJBSUMiLCAiQklDIiwgInJzcSIsICJhZGoucnNxIiwgIm4iKSwNCiAgICAgICAgICBjb2x1bW4ubGFiZWxzPWMoIlF1YWRyw6F0aWNhIiwiTG9nLUxvZyIsIlF1YWQuUm9idXN0byIpLA0KICAgICAgICAgIGRlcC52YXIubGFiZWxzLmluY2x1ZGUgPSBGQUxTRSwNCiAgICAgICAgICBtb2RlbC5udW1iZXJzID0gRkFMU0UsDQogICAgICAgICAgbW9kZWwubmFtZXMgPSBGQUxTRSkNCmBgYA0KDQojIFRlc3RlIGRlIG11bHRpY29saW5lYXJpZGFkZSBkbyBtb2RlbG8gcXVhZHLDoXRpY28NCg0KTsOjbyBob3V2ZSBldmlkw6puY2lhIGRlIG11bHRpY29saW5lYXJpZGFkZSBwcmVqdWRpY2lhbCBhbyBtb2RlbG8uICAgIA0KDQpgYGB7cn0NCnJlZ3F1YWQudmlmPC12aWYobW9kX3VzZWNhc2UzX3F1YWQpDQpyZWdxdWFkLnZpZg0KYGBgDQoNCg0KUmVmZXLDqm5jaWFzIHstI1JlZmVyw6puY2lhc30NCj09PT09PT09PT09PT09PT09PT09PT09PQ0KDQpNYS4gUmVnaW5hIFBheiBTLiBPbmdsYW8gKDIwMTgpLiBfZGF0YTM2MHI6IFdyYXBwZXIgZm9yIFRDL0dvdmRhdGEzNjAgQVBJXy4gUiBwYWNrYWdlDQogIHZlcnNpb24gMS4wLjIuIERpc3BvbsOtdmVsIGVtOiA8aHR0cHM6Ly9naXRodWIuY29tL21ycHNvbmdsYW8vZGF0YTM2MHI+