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: heteroscedasticidade: salários de advogados - Wooldridge(exemplo 7.8). Campo Grande-MS, Brasil: RStudio/Rpubs, 2020. Disponível em https://rpubs.com/amrofi/wooldridge_ex7_8_heterosc.

1 Introdução - Primeiros passos

Wooldridge Source: Collected by Kelly Barnett, an MSU economics student, for use in a term project. The data come from two sources: The Official Guide to U.S. Law Schools, 1986, Law School Admission Services, and The Gourman Report: A Ranking of Graduate and Professional Programs in American and International Universities, 1995, Washington, D.C. Data loads lazily.

O dataset do Wooldridge contém dados sobre a mediana dos salarios iniciais dos formados em Direito. Uma variável explicativa é a classificação da faculdade cursada. O grupo base é das faculdades com rank maior que 100.

O script foi adaptado de https://www.r-econometrics.com/reproduction/wooldridge/wooldridge07/.

No presente post faremos a análise específica da heteroscedasticidade complementando o post anterior em https://rpubs.com/amrofi/wooldridge_ex7_8 e https://rpubs.com/amrofi/wooldridge_ex7_8_spec, como também ao video da discussão de especificação em https://youtu.be/J7NK23J54bI.

Temos um data.frame com 156 observações para 21 variáveis:

rank: law school ranking    
salary: median starting salary    
cost: law school cost    
LSAT: median LSAT score    
GPA: median college GPA    
libvol: no. volumes in lib., 1000s    
faculty: no. of faculty    
age: age of law sch., years    
clsize: size of entering class    
north: =1 if law sch in north    
south: =1 if law sch in south    
east: =1 if law sch in east    
west: =1 if law sch in west    
lsalary: log(salary)    
studfac: student-faculty ratio    
top10: =1 if ranked in top 10    
r11_25: =1 if ranked 11-25    
r26_40: =1 if ranked 26-40    
r41_60: =1 if ranked 41-60    
llibvol: log(libvol)    
lcost: log(cost)    

2 Modelagem

A parte inicial reproduz o post de https://rpubs.com/amrofi/wooldridge_ex7_8_spec.

2.1 Carregar os dados

> library(wooldridge)
> data("lawsch85")

Vamos gerar dummies (não era necessário, pois já estavam no dataset) para os rankings das faculdades. Criamos abaixo para ver como ficam, pois o dataset contém uma variável rank para os salarios (salary). O leitor pode investigar a forma como criamos dummies usando a variável rank e critérios de classes.

> lawsch85$top10 <- as.numeric(lawsch85$rank <= 10)
> lawsch85$r11.25 <- as.numeric(lawsch85$rank >= 11 & lawsch85$rank <= 25)
> lawsch85$r26.40 <- as.numeric(lawsch85$rank >= 26 & lawsch85$rank <= 40)
> lawsch85$r41.60 <- as.numeric(lawsch85$rank >= 41 & lawsch85$rank <= 60)
> lawsch85$r61.100 <- as.numeric(lawsch85$rank >= 61 & lawsch85$rank <= 100)

As dummies foram criadas e já incorporadas ao dataset lawsch85. Podemos conferir, olhando pelo pacote knitr e função kable.

> library(knitr)
> kable(lawsch85[1:15,c(16:19,22:25)],caption="Dummies do dataset: recorte de 15 linhas")
Dummies do dataset: recorte de 15 linhas
top10 r11_25 r26_40 r41_60 r11.25 r26.40 r41.60 r61.100
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 1 0 0 1 0 0
0 0 0 1 0 0 1 0
0 0 0 0 0 0 0 1
0 0 0 0 0 0 0 1
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 1
0 0 0 1 0 0 1 0
0 1 0 0 1 0 0 0
0 0 0 0 0 0 0 1
1 0 0 0 0 0 0 0
0 0 1 0 0 1 0 0

Com essas variáveis, criamos um modelo inicial (mod1) do tipo log-log:

\[ \operatorname{log(salary)} = \alpha + \beta_{1}(\operatorname{log(rank)}) + \beta_{2}(\operatorname{log(LSAT)}) + \beta_{3}(\operatorname{log(GPA)}) + \beta_{4}(\operatorname{log(libvol)}) + \beta_{5}(\operatorname{log(cost)}) + \epsilon \] Depois um (mod2) linear:

\[ \operatorname{(salary)} = \alpha + \beta_{1}(\operatorname{rank}) + \beta_{2}(\operatorname{LSAT}) + \beta_{3}(\operatorname{GPA}) + \beta_{4}(\operatorname{libvol}) + \beta_{5}(\operatorname{cost}) + \epsilon \] e um modelo log-log (mod3) com as dummies:

\[ \begin{array}{l} \operatorname{log(salary)} = \alpha + \beta_{1}(\operatorname{top10}) + \beta_{2}(\operatorname{r11\_25}) + \beta_{3}(\operatorname{r26\_40}) +\\ \beta_{4}(\operatorname{r41\_60}) + \beta_{5}(\operatorname{r61.100}) + \beta_{6}(\operatorname{log(LSAT)}) + \beta_{7}(\operatorname{log(GPA)}) +\\ \beta_{8}(\operatorname{log(libvol)}) + \beta_{9}(\operatorname{log(cost)}) + \epsilon \end{array} \]

2.2 Primeiros resultados

Portanto, os modelos são estimados e os resultados estão abaixo.

> mod1 <- lm(log(salary) ~ log(rank) + log(LSAT) + log(GPA) 
+            + log(libvol) + log(cost), data = lawsch85)
> mod2 <- lm((salary) ~ (rank) + (LSAT) + (GPA) 
+            + (libvol) + (cost), data = lawsch85)
> mod3 <- lm(log(salary) ~ top10 + r11_25 + r26_40 + r41_60 + r61.100 
+            + log(LSAT) + log(GPA) + log(libvol) + log(cost), data = lawsch85)
> mod1$AIC <- AIC(mod1)
> mod2$AIC <- AIC(mod2)
> mod3$AIC <- AIC(mod3)
> mod1$BIC <- BIC(mod1)
> mod2$BIC <- BIC(mod2)
> mod3$BIC <- BIC(mod3)
> library(stargazer)
> star.1 <- stargazer(mod1, mod2, mod3,
+                     title="Título: Resultados das Regressões",
+                     align=TRUE,
+                     type = "text",
+                     keep.stat=c("aic","bic","rsq", "adj.rsq","n")
+ )

Título: Resultados das Regressões
=========================================================
                             Dependent variable:         
                    -------------------------------------
                    log(salary)   (salary)    log(salary)
                        (1)          (2)          (3)    
---------------------------------------------------------
log(rank)            -0.227***                           
                      (0.019)                            
                                                         
top10                                          0.700***  
                                                (0.053)  
                                                         
r11_25                                         0.593***  
                                                (0.039)  
                                                         
r26_40                                         0.374***  
                                                (0.034)  
                                                         
r41_60                                         0.262***  
                                                (0.028)  
                                                         
r61.100                                        0.131***  
                                                (0.021)  
                                                         
log(LSAT)              0.726                    0.885*   
                      (0.559)                   (0.472)  
                                                         
log(GPA)               0.191                     0.057   
                      (0.282)                   (0.239)  
                                                         
log(libvol)            0.017                     0.036   
                      (0.033)                   (0.026)  
                                                         
log(cost)              0.008                     0.001   
                      (0.029)                   (0.025)  
                                                         
rank                             -115.815***             
                                  (16.153)               
                                                         
LSAT                               155.286               
                                  (192.598)              
                                                         
GPA                             14,500.240***            
                                 (4,357.070)             
                                                         
libvol                            12.956***              
                                   (3.261)               
                                                         
cost                               0.366**               
                                   (0.146)               
                                                         
Constant             7.383***    -33,124.550    5.562**  
                      (2.577)   (25,210.760)    (2.141)  
                                                         
---------------------------------------------------------
Observations            136          136          136    
R2                     0.870        0.806        0.911   
Adjusted R2            0.865        0.798        0.905   
Akaike Inf. Crit.    -227.844     2,737.692    -271.086  
Bayesian Inf. Crit.  -207.455     2,758.080    -239.046  
=========================================================
Note:                         *p<0.1; **p<0.05; ***p<0.01

Conforme o post https://rpubs.com/amrofi/wooldridge_ex7_8_spec, o melhor modelo foi identificado para o modelo 3 (como indicado no video da discussão de especificação em https://youtu.be/J7NK23J54bI).

Daremos prosseguimento então para a avaliação da heteroscedasticidade neste modelo 3.

2.3 Heteroscedasticidade no modelo 3

2.3.1 Teste de White sem termos cruzados

Optamos por realizar o teste de White com a função bptest e a especificação sem termos cruzados em virtude de julgarmos pequeno o número de observações do modelo. A hipótese nula é:
H0: resíduos são homoscedásticos. A alternativa será então H1: resíduos heteroscedásticos.

> lmtest::bptest(mod3,~ log(LSAT) + log(GPA) + log(libvol) + log(cost)+
+                    I(log(LSAT)^2)+I(log(GPA)^2)+
+                    I(log(libvol)^2)+I(log(cost)^2), data = lawsch85)

    studentized Breusch-Pagan test

data:  mod3
BP = 15.673, df = 8, p-value = 0.04731

Concluo pela presença de heteroscedasticidade dos resíduos em mod3, uma vez que o p-value = 0.047 é menor que 0.10 e rejeita-se a hipótese nula de resíduos homoscedásticos. Uma alternativa direta seria aplicar a correção pela matriz de variância-covariância pela função hccm , do pacote car .

2.3.2 Correção de Var-cov conforme White

A correção pela função car::hccm (heteroskedasticity-corrected covariance matrix) admite diferentes formatos de especificação da var-cov (“hc0”,“hc1”,“hc2”,“hc3”,“hc4”), e trabalharemos aqui com a opção hc1, em seu formato mais tradicional. Para a matriz de var-cov dos parâmetros no formato

\(Var\left( {\hat \beta |X} \right) = {\left( {X'X} \right)^{ - 1}}X'\Omega X{\left( {X'X} \right)^{ - 1}}\)

têm-se então diferentes possibilidades para \[\Omega\].

  • “hc0”:  matriz clássica de correção de Eicker (1963) e popularizada por White (1980);

  • “hc1”, “hc2” e “hc3”: matrizes de correção sugeridas por MacKinnon e White (1985) e aperfeiçoadas para pequenas amostras conforme Long e Ervin (2000);

  • “hc4”: matriz de correção conforme Cribari-Neto (2004) para aperfeiçoar a performance em pequenas amostras com presença de observações influentes.

As matriz modificam conforme a composição da matriz de ponderação:

Diferentes possibilidades para as matrizes de variância-covariância dos resíduos. Fonte: KLEIBER e ZEILEIS (2008).

> library(car) 
> #possibilidades: hccm(regressao1,type=c("hc0","hc1","hc2","hc3","hc4"))
> vcov.white0<-hccm(mod3,type=c("hc1"))
> # pelo coeftest
> lmtest::coeftest(mod3,vcov.white0)

t test of coefficients:

             Estimate Std. Error t value  Pr(>|t|)    
(Intercept) 5.5619076  2.1432862  2.5950   0.01058 *  
top10       0.7002290  0.0572244 12.2365 < 2.2e-16 ***
r11_25      0.5931739  0.0467471 12.6890 < 2.2e-16 ***
r26_40      0.3744336  0.0524192  7.1431 6.463e-11 ***
r41_60      0.2623891  0.0263407  9.9613 < 2.2e-16 ***
r61.100     0.1311293  0.0181522  7.2239 4.248e-11 ***
log(LSAT)   0.8847047  0.4854581  1.8224   0.07076 .  
log(GPA)    0.0570718  0.2579492  0.2213   0.82525    
log(libvol) 0.0362878  0.0259046  1.4008   0.16372    
log(cost)   0.0010463  0.0293381  0.0357   0.97161    
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
> # ou no sumário
> summary(mod3)

Call:
lm(formula = log(salary) ~ top10 + r11_25 + r26_40 + r41_60 + 
    r61.100 + log(LSAT) + log(GPA) + log(libvol) + log(cost), 
    data = lawsch85)

Residuals:
      Min        1Q    Median        3Q       Max 
-0.294920 -0.040379 -0.001164  0.044715  0.277004 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept) 5.561908   2.140706   2.598   0.0105 *  
top10       0.700229   0.052517  13.333  < 2e-16 ***
r11_25      0.593174   0.039208  15.129  < 2e-16 ***
r26_40      0.374434   0.034036  11.001  < 2e-16 ***
r41_60      0.262389   0.027979   9.378 3.57e-16 ***
r61.100     0.131129   0.021049   6.230 6.42e-09 ***
log(LSAT)   0.884705   0.471736   1.875   0.0630 .  
log(GPA)    0.057072   0.239032   0.239   0.8117    
log(libvol) 0.036288   0.025998   1.396   0.1652    
log(cost)   0.001046   0.025055   0.042   0.9668    
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 0.08558 on 126 degrees of freedom
  (20 observations deleted due to missingness)
Multiple R-squared:  0.9111,    Adjusted R-squared:  0.9047 
F-statistic: 143.4 on 9 and 126 DF,  p-value: < 2.2e-16

Será preciso pequenos passos para expressar adequadamente na tabela do stargazer. O modelo 3 inicial está colocado ao lado do modelo 3 robusto, ou seja, com correção para heteroscedasticidade.

> # fazer stargazer com dois modelos
> cov <- vcov.white0
> robust.se <- sqrt(diag(cov))
> 
> stargazer(mod3, mod3,
+           se=list(NULL, robust.se),
+           column.labels=c("MQO-mod3","mod3 robusto"), 
+           title="Título: Resultado da Regressão",
+           align=TRUE,
+           type = "text", style = "all",
+           keep.stat=c("aic","bic","rsq", "adj.rsq","n"))

Título: Resultado da Regressão
================================================
                        Dependent variable:     
                    ----------------------------
                            log(salary)         
                       MQO-mod3    mod3 robusto 
                         (1)            (2)     
------------------------------------------------
top10                  0.700***      0.700***   
                       (0.053)        (0.057)   
                      t = 13.333    t = 12.237  
                      p = 0.000      p = 0.000  
r11_25                 0.593***      0.593***   
                       (0.039)        (0.047)   
                      t = 15.129    t = 12.689  
                      p = 0.000      p = 0.000  
r26_40                 0.374***      0.374***   
                       (0.034)        (0.052)   
                      t = 11.001     t = 7.143  
                      p = 0.000      p = 0.000  
r41_60                 0.262***      0.262***   
                       (0.028)        (0.026)   
                      t = 9.378      t = 9.961  
                      p = 0.000      p = 0.000  
r61.100                0.131***      0.131***   
                       (0.021)        (0.018)   
                      t = 6.230      t = 7.224  
                      p = 0.000      p = 0.000  
log(LSAT)               0.885*        0.885*    
                       (0.472)        (0.485)   
                      t = 1.875      t = 1.822  
                      p = 0.064      p = 0.069  
log(GPA)                0.057          0.057    
                       (0.239)        (0.258)   
                      t = 0.239      t = 0.221  
                      p = 0.812      p = 0.825  
log(libvol)             0.036          0.036    
                       (0.026)        (0.026)   
                      t = 1.396      t = 1.401  
                      p = 0.166      p = 0.162  
log(cost)               0.001          0.001    
                       (0.025)        (0.029)   
                      t = 0.042      t = 0.036  
                      p = 0.967      p = 0.972  
Constant               5.562**       5.562***   
                       (2.141)        (2.143)   
                      t = 2.598      t = 2.595  
                      p = 0.011      p = 0.010  
------------------------------------------------
Observations             136            136     
R2                      0.911          0.911    
Adjusted R2             0.905          0.905    
Akaike Inf. Crit.      -271.086      -271.086   
Bayesian Inf. Crit.    -239.046      -239.046   
================================================
Note:                *p<0.1; **p<0.05; ***p<0.01

Embora do ponto de vista de resultados tenhamos as mesmas variáveis significativas que antes (no modelo 3), sabemos que foi feita a correção para heteroscedasticidade no modelo 3 robusto. Não cabe agora refazer o teste de heteroscedasticidade sobre o modelo 3 robusto.

Entretanto, levantamos algumas indagações na próxima seção, para o leitor compreender um pouco mais sobre esse problema da heteroscedasticidade. No exercício de Figueiredo (2019), concluiu-se que os resíduos do modelo 3 não são normalmente distribuídos.

> ## Teste de Jarque-Bera para normalidade
> 
> u.hat<-resid(mod3)
> library(tseries)
> JB.mod3<-jarque.bera.test(u.hat)
> JB.mod3

    Jarque Bera Test

data:  u.hat
X-squared = 20.538, df = 2, p-value = 3.47e-05

Fez-se na sequência a análise de presença de outliers.

2.4 Investigação de outliers - teste de Bonferroni para outlier

> outlierTest(mod3)
   rstudent unadjusted p-value Bonferroni p
3 -3.850327          0.0001873     0.025473
> qqPlot(mod3)

[1]  3 47
> vif(mod3)
      top10      r11_25      r26_40      r41_60     r61.100   log(LSAT) 
   3.488650    2.635882    1.730471    1.589780    1.542470    3.478267 
   log(GPA) log(libvol)   log(cost) 
   3.693818    2.225695    1.653360 

As observações 3 e 47 sugerem outliers a serem controlados. Colocarei uma dummy para ambos.

> attach(lawsch85)
> dados<-as.data.frame(cbind(salary,rank,LSAT,GPA,libvol,cost,top10,r11_25,r26_40,r41_60,r61.100))
> detach(lawsch85)
> attach(dados)
> dados$dummy<-0
> dados$dummy[3]=1
> dados$dummy[47]=1
> dados$dummy[79]=1 # detectei no outro post que o 79 também é outlier

Farei novas regressões partindo de mod3 para inclusão de dummies alterando, para os outliers, intercepto e inclinações em diferentes variáveis.

> attach(dados)
> mod4 <- lm(log(salary) ~ top10 + r11_25 + r26_40 + r41_60 + r61.100 
+            + log(LSAT) + log(GPA) + log(libvol) + log(cost)+dummy+
+              I(dummy*LSAT), data = dados)
> mod4$AIC <- AIC(mod4)
> mod4$BIC <- BIC(mod4)
> mod5 <- lm(log(salary) ~ top10 + r11_25 + r26_40 + r41_60 + r61.100 
+            + log(LSAT) + log(GPA) + log(libvol) + log(cost)+dummy+
+              I(dummy*GPA), data = dados)
> mod5$AIC <- AIC(mod5)
> mod5$BIC <- BIC(mod5)
> mod6 <- lm(log(salary) ~ top10 + r11_25 + r26_40 + r41_60 + r61.100 
+            + log(LSAT) + log(GPA) + log(libvol) + log(cost)+dummy+
+              I(dummy*libvol), data = dados)
> mod6$AIC <- AIC(mod6)
> mod6$BIC <- BIC(mod6)
> mod7 <- lm(log(salary) ~ top10 + r11_25 + r26_40 + r41_60 + r61.100 
+            + log(LSAT) + log(GPA) + log(libvol) + log(cost)+dummy+
+              I(dummy*cost), data = dados)
> mod7$AIC <- AIC(mod7)
> mod7$BIC <- BIC(mod7)
> library(stargazer)
> star.2 <- stargazer(mod4, mod5,mod6,mod7,
+                     title="Título: Resultados das Regressões",
+                     column.labels=c("MQO-mod4","MQO-mod5","MQO-mod6","MQO-mod7"),
+                     align=TRUE,
+                     type = "text",
+                     keep.stat=c("aic","bic","rsq", "adj.rsq","n")
+ )

Título: Resultados das Regressões
==========================================================
                             Dependent variable:          
                    --------------------------------------
                                 log(salary)              
                    MQO-mod4  MQO-mod5 MQO-mod6  MQO-mod7 
                       (1)      (2)       (3)       (4)   
----------------------------------------------------------
top10               0.717***  0.713*** 0.752***  0.745*** 
                     (0.051)  (0.052)   (0.047)   (0.046) 
                                                          
r11_25              0.604***  0.602*** 0.630***  0.624*** 
                     (0.038)  (0.039)   (0.035)   (0.035) 
                                                          
r26_40              0.356***  0.356*** 0.412***  0.389*** 
                     (0.033)  (0.034)   (0.031)   (0.030) 
                                                          
r41_60              0.268***  0.267*** 0.285***  0.280*** 
                     (0.027)  (0.027)   (0.025)   (0.025) 
                                                          
r61.100             0.134***  0.134*** 0.148***  0.143*** 
                     (0.020)  (0.021)   (0.019)   (0.018) 
                                                          
log(LSAT)            0.853*    0.898*   0.923**   0.774*  
                     (0.461)  (0.468)   (0.417)   (0.417) 
                                                          
log(GPA)             -0.003    0.005    -0.090    -0.074  
                     (0.231)  (0.235)   (0.211)   (0.210) 
                                                          
log(libvol)           0.035    0.034     0.023     0.031  
                     (0.025)  (0.026)   (0.023)   (0.023) 
                                                          
log(cost)            -0.005    -0.005   -0.017    -0.011  
                     (0.025)  (0.025)   (0.022)   (0.022) 
                                                          
dummy               -5.833*** -2.467** 8.269***  -8.352***
                     (2.031)  (1.211)   (1.368)   (1.385) 
                                                          
I(dummy * LSAT)     0.038***                              
                     (0.013)                              
                                                          
I(dummy * GPA)                0.775**                     
                              (0.365)                     
                                                          
I(dummy * libvol)                      -0.020***          
                                        (0.003)           
                                                          
I(dummy * cost)                                  0.0005***
                                                 (0.0001) 
                                                          
Constant            5.852***  5.623*** 5.772***  6.410*** 
                     (2.087)  (2.118)   (1.890)   (1.889) 
                                                          
----------------------------------------------------------
Observations           136      136       136       136   
R2                    0.919    0.917     0.933     0.934  
Adjusted R2           0.912    0.909     0.927     0.928  
Akaike Inf. Crit.   -280.148  -275.942 -305.474  -306.833 
Bayesian Inf. Crit. -242.284  -238.077 -267.610  -268.968 
==========================================================
Note:                          *p<0.1; **p<0.05; ***p<0.01

O modelo 7 aparenta melhor ajustamento e continuarei análises a partir dele. Testarei novamente para normalidade:

> dados$obs<-1:156
> u.hat<-resid(mod7)
> library(tseries)
> JB.mod7<-jarque.bera.test(u.hat)
> JB.mod7

    Jarque Bera Test

data:  u.hat
X-squared = 0.44485, df = 2, p-value = 0.8006
> outlierTest(mod7)
No Studentized residuals with Bonferroni p < 0.05
Largest |rstudent|:
   rstudent unadjusted p-value Bonferroni p
96 2.444258           0.015933           NA
> qqPlot(mod7)

[1]  96 134

Agora sim, colocando 3, 47 e 79 como dummies consegui resíduos normais no modelo 7. Vou olhar o teste RESET para especificação.

> TesteRESET.power<-lmtest::resettest(mod7, power = 2:3)
> TesteRESET.power

    RESET test

data:  mod7
RESET = 2.2131, df1 = 2, df2 = 122, p-value = 0.1137

Embora ainda com probabilidade baixa, vou considerar o modelo 7 bem especificado e investigar outros itens como a heteroscedasticidade.

2.5 Teste de heteroscedasticidade no modelo 7

Vou checar a heterocedasticidade. A dummy somente entra em nível, não adiantando colocar ao quadrado.

> lmtest::bptest(mod7,~ log(LSAT) + log(GPA) + log(libvol) + log(cost)
+ 
+                  +dummy+I(dummy*cost)+
+ 
+                    I(log(LSAT)^2)+I(log(GPA)^2)+
+ 
+                    I(log(libvol)^2)+I(log(cost)^2), data = dados)

    studentized Breusch-Pagan test

data:  mod7
BP = 14.633, df = 10, p-value = 0.146

Não detecto heterocedasticidade. OU seja, ao controlar pelos outliers, resolvi o problema de heterocedasticidade. Como a probabilidade foi próxima a 0.10, sugiro investigar outras possibilidades. Farei o teste padrão de BP.

> BP_t <- lmtest::bptest(mod7)
> print(BP_t)

    studentized Breusch-Pagan test

data:  mod7
BP = 29.246, df = 11, p-value = 0.002079

Ou seja, o modelo apresenta heteroscedasticidade sem controlar outliers e como visto, pode obter outro resultado se optar por controlar para os outliers. O pesquisador deve estar atento pois cada caso pode levar a alternativas diferentes. Como o teste BP acusou heterocedasticidade, faz-se a correção e estimação robusta. Agora utilizaremos o pacote sandwich e a função vcovHC. Esta função opera de modo semelhante ao do pacote car e também se pode especificar tipos de ponderação. Usarei a opção HC1 para ficar como na forma do hccm.

> V_HC_1 <- sandwich::vcovHC(mod7, type = "HC1")

Vamos apresentar a tabela de coeficientes com erros robustos:

> print(lmtest::coeftest(mod7, vcov. = V_HC_1))

t test of coefficients:

                   Estimate  Std. Error t value  Pr(>|t|)    
(Intercept)      6.4102e+00  1.8605e+00  3.4454 0.0007788 ***
top10            7.4497e-01  4.7493e-02 15.6859 < 2.2e-16 ***
r11_25           6.2351e-01  4.1367e-02 15.0726 < 2.2e-16 ***
r26_40           3.8881e-01  4.0996e-02  9.4841 2.243e-16 ***
r41_60           2.7962e-01  2.1732e-02 12.8667 < 2.2e-16 ***
r61.100          1.4318e-01  1.4309e-02 10.0062 < 2.2e-16 ***
log(LSAT)        7.7380e-01  4.1461e-01  1.8663 0.0643582 .  
log(GPA)        -7.3788e-02  2.4278e-01 -0.3039 0.7616933    
log(libvol)      3.1176e-02  2.1683e-02  1.4378 0.1530143    
log(cost)       -1.1273e-02  2.4602e-02 -0.4582 0.6476093    
dummy           -8.3518e+00  9.5763e-01 -8.7214 1.509e-14 ***
I(dummy * cost)  4.9380e-04  5.7356e-05  8.6095 2.782e-14 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

E agora com os erros viesados pela heteroscedasticidade:

> print(lmtest::coeftest(mod7))

t test of coefficients:

                   Estimate  Std. Error t value  Pr(>|t|)    
(Intercept)      6.4102e+00  1.8893e+00  3.3928 0.0009291 ***
top10            7.4497e-01  4.6412e-02 16.0514 < 2.2e-16 ***
r11_25           6.2351e-01  3.4590e-02 18.0257 < 2.2e-16 ***
r26_40           3.8881e-01  3.0177e-02 12.8843 < 2.2e-16 ***
r41_60           2.7962e-01  2.4595e-02 11.3690 < 2.2e-16 ***
r61.100          1.4318e-01  1.8482e-02  7.7472 2.894e-12 ***
log(LSAT)        7.7380e-01  4.1695e-01  1.8559 0.0658484 .  
log(GPA)        -7.3788e-02  2.0985e-01 -0.3516 0.7257230    
log(libvol)      3.1176e-02  2.2902e-02  1.3612 0.1759067    
log(cost)       -1.1273e-02  2.2222e-02 -0.5073 0.6128562    
dummy           -8.3518e+00  1.3855e+00 -6.0281 1.760e-08 ***
I(dummy * cost)  4.9380e-04  8.0869e-05  6.1062 1.210e-08 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Embora tenhamos alteracoes nos desvios padrões e consequentes estatísticas t e probabilidades, o resultado por MQG - HCE (heteroskedastic consistent estimator) neste caso não alterou a interpretação relativamente ao modelo por MQO.

2.6 Outra estimação robusta pelo estimatr

> library(estimatr)
> library(car)
> # Erros padrões robustos HC1 – padrão do Stata
> model <- lm_robust(log(salary) ~ top10 + r11_25 + r26_40 + r41_60 + r61.100 
+            + log(LSAT) + log(GPA) + log(libvol) + log(cost)+dummy+
+              I(dummy*cost), data = dados,
+                    se_type = "stata")
> summary(model)

Call:
lm_robust(formula = log(salary) ~ top10 + r11_25 + r26_40 + r41_60 + 
    r61.100 + log(LSAT) + log(GPA) + log(libvol) + log(cost) + 
    dummy + I(dummy * cost), data = dados, se_type = "stata")

Standard error type:  HC1 

Coefficients:
                  Estimate Std. Error t value  Pr(>|t|)   CI Lower   CI Upper
(Intercept)      6.4101833  1.861e+00  3.4454 7.788e-04  2.728e+00 10.0926428
top10            0.7449703  4.749e-02 15.6859 3.173e-31  6.510e-01  0.8389722
r11_25           0.6235082  4.137e-02 15.0726 8.242e-30  5.416e-01  0.7053849
r26_40           0.3888092  4.100e-02  9.4841 2.243e-16  3.077e-01  0.4699515
r41_60           0.2796213  2.173e-02 12.8667 1.375e-24  2.366e-01  0.3226353
r61.100          0.1431794  1.431e-02 10.0062 1.222e-17  1.149e-01  0.1715011
log(LSAT)        0.7738031  4.146e-01  1.8663 6.436e-02 -4.683e-02  1.5944390
log(GPA)        -0.0737878  2.428e-01 -0.3039 7.617e-01 -5.543e-01  0.4067455
log(libvol)      0.0311757  2.168e-02  1.4378 1.530e-01 -1.174e-02  0.0740928
log(cost)       -0.0112726  2.460e-02 -0.4582 6.476e-01 -5.997e-02  0.0374214
dummy           -8.3518485  9.576e-01 -8.7214 1.509e-14 -1.025e+01 -6.4564349
I(dummy * cost)  0.0004938  5.736e-05  8.6095 2.782e-14  3.803e-04  0.0006073
                 DF
(Intercept)     124
top10           124
r11_25          124
r26_40          124
r41_60          124
r61.100         124
log(LSAT)       124
log(GPA)        124
log(libvol)     124
log(cost)       124
dummy           124
I(dummy * cost) 124

Multiple R-squared:  0.9336 ,   Adjusted R-squared:  0.9277 
F-statistic:   169 on 11 and 124 DF,  p-value: < 2.2e-16

3 Referências

FIGUEIREDO, Adriano Marcos Rodrigues. Econometria: Salários de advogados - Wooldridge(exemplo 7.8) adaptado de MOHR (2018). Campo Grande-MS,Brasil: RStudio/Rpubs, 2019. Disponível em <http://rpubs.com/amrofi/wooldridge_ex7_8%3E.

HEISS, Florian. Using R for Introductory Econometrics. 2.ed. Florian Heiss, 2020. Recurso online. Disponível em: http://www.urfie.net/.

KLEIBER, Christian;·ZEILEIS, Achim. Applied Econometrics with R. New York-NY: Springer Science+Business Media, LLC, 2008.

SHEA, Justin M. wooldridge: vignette. 2020. Disponível em: https://justinmshea.github.io/wooldridge/articles/Introductory-Econometrics-Examples.html.

SHEA, Justin M. wooldridge: 111 Data Sets from “Introductory Econometrics: A Modern Approach, 6e” by Jeffrey M. Wooldridge. R package version 1.3.1. 2018. Disponível em: https://CRAN.R-project.org/package=wooldridge.

WOOLDRIDGE, J.M. Introdução à Econometria: uma abordagem moderna. São Paulo: Pioneira Thomson Learning, 2006.(tradução da segunda edição americana).

WOOLDRIDGE, Jeffrey M. Introductory econometrics: A modern approach. Nelson Education, 2016.

LS0tDQp0aXRsZTogIkVjb25vbWV0cmlhOiBoZXRlcm9zY2VkYXN0aWNpZGFkZTogc2Fsw6FyaW9zIGRlIGFkdm9nYWRvcyAtIFdvb2xkcmlkZ2UoZXhlbXBsbyA3LjgpIg0KYXV0aG9yOiAiQWRyaWFubyBNYXJjb3MgUm9kcmlndWVzIEZpZ3VlaXJlZG8sICplLW1haWw6IGFkcmlhbm8uZmlndWVpcmVkb0B1Zm1zLmJyKiINCmFic3RyYWN0OiANCiAgVGhpcyBpcyBhbiB1bmRlcmdyYWQgc3R1ZGVudCBsZXZlbCBleGVyY2lzZSBmb3IgY2xhc3MgdXNlLiANCmRhdGU6ICJgciBmb3JtYXQoU3lzLkRhdGUoKSwgJyVkICVCICVZJylgIg0Kb3V0cHV0Og0KICBodG1sX2RvY3VtZW50Og0KICAgIGNvZGVfZG93bmxvYWQ6IHllcw0KICAgIHRoZW1lOiBkZWZhdWx0DQogICAgbnVtYmVyX3NlY3Rpb25zOiB5ZXMNCiAgICB0b2M6IHllcw0KICAgIHRvY19mbG9hdDogeWVzDQogICAgZGZfcHJpbnQ6IHBhZ2VkDQogICAgZmlnX2NhcHRpb246IHllcw0KICBwZGZfZG9jdW1lbnQ6DQogICAgdG9jOiB5ZXMNCiAgd29yZF9kb2N1bWVudDoNCiAgICB0b2M6IHllcw0KLS0tDQoNCiMgTGljZW7Dp2EgeyNMaWNlbsOnYSAudW5udW1iZXJlZH0NCg0KVGhpcyB3b3JrIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBDcmVhdGl2ZSBDb21tb25zIEF0dHJpYnV0aW9uLVNoYXJlQWxpa2UgNC4wIEludGVybmF0aW9uYWwgTGljZW5zZS4gVG8gdmlldyBhIGNvcHkgb2YgdGhpcyBsaWNlbnNlLCB2aXNpdCA8aHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvYnktc2EvNC4wLz4gb3Igc2VuZCBhIGxldHRlciB0byBDcmVhdGl2ZSBDb21tb25zLCBQTyBCb3ggMTg2NiwgTW91bnRhaW4gVmlldywgQ0EgOTQwNDIsIFVTQS4NCg0KIVtMaWNlbnNlOiBDQyBCWS1TQSA0LjBdKGh0dHBzOi8vbWlycm9ycy5jcmVhdGl2ZWNvbW1vbnMub3JnL3ByZXNza2l0L2J1dHRvbnMvODh4MzEvcG5nL2J5LXNhLnBuZyl7d2lkdGg9IjI1JSJ9DQoNCiMgQ2l0YcOnw6NvIHsjQ2l0YcOnw6NvIC51bm51bWJlcmVkfQ0KDQpTdWdlc3TDo28gZGUgY2l0YcOnw6NvOiBGSUdVRUlSRURPLCBBZHJpYW5vIE1hcmNvcyBSb2RyaWd1ZXMuIEVjb25vbWV0cmlhOiBoZXRlcm9zY2VkYXN0aWNpZGFkZTogc2Fsw6FyaW9zIGRlIGFkdm9nYWRvcyAtIFdvb2xkcmlkZ2UoZXhlbXBsbyA3LjgpLiBDYW1wbyBHcmFuZGUtTVMsIEJyYXNpbDogUlN0dWRpby9ScHVicywgMjAyMC4gRGlzcG9uw612ZWwgZW0gPGh0dHBzOi8vcnB1YnMuY29tL2Ftcm9maS93b29sZHJpZGdlX2V4N184X2hldGVyb3NjPi4NCg0KIyBJbnRyb2R1w6fDo28gLSBQcmltZWlyb3MgcGFzc29zDQoNCj4gV29vbGRyaWRnZSBTb3VyY2U6IENvbGxlY3RlZCBieSBLZWxseSBCYXJuZXR0LCBhbiBNU1UgZWNvbm9taWNzIHN0dWRlbnQsIGZvciB1c2UgaW4gYSB0ZXJtIHByb2plY3QuIFRoZSBkYXRhIGNvbWUgZnJvbSB0d28gc291cmNlczogVGhlIE9mZmljaWFsIEd1aWRlIHRvIFUuUy4gTGF3IFNjaG9vbHMsIDE5ODYsIExhdyBTY2hvb2wgQWRtaXNzaW9uIFNlcnZpY2VzLCBhbmQgVGhlIEdvdXJtYW4gUmVwb3J0OiBBIFJhbmtpbmcgb2YgR3JhZHVhdGUgYW5kIFByb2Zlc3Npb25hbCBQcm9ncmFtcyBpbiBBbWVyaWNhbiBhbmQgSW50ZXJuYXRpb25hbCBVbml2ZXJzaXRpZXMsIDE5OTUsIFdhc2hpbmd0b24sIEQuQy4gRGF0YSBsb2FkcyBsYXppbHkuDQoNCj4gTyBkYXRhc2V0IGRvIFdvb2xkcmlkZ2UgY29udMOpbSBkYWRvcyBzb2JyZSBhIG1lZGlhbmEgZG9zIHNhbGFyaW9zIGluaWNpYWlzIGRvcyBmb3JtYWRvcyBlbSBEaXJlaXRvLiBVbWEgdmFyacOhdmVsIGV4cGxpY2F0aXZhIMOpIGEgY2xhc3NpZmljYcOnw6NvIGRhIGZhY3VsZGFkZSBjdXJzYWRhLiBPIGdydXBvIGJhc2Ugw6kgZGFzIGZhY3VsZGFkZXMgY29tIHJhbmsgbWFpb3IgcXVlIDEwMC4NCg0KTyBzY3JpcHQgZm9pIGFkYXB0YWRvIGRlIDxodHRwczovL3d3dy5yLWVjb25vbWV0cmljcy5jb20vcmVwcm9kdWN0aW9uL3dvb2xkcmlkZ2Uvd29vbGRyaWRnZTA3Lz4uDQoNCk5vIHByZXNlbnRlIHBvc3QgZmFyZW1vcyBhIGFuw6FsaXNlIGVzcGVjw61maWNhIGRhIGhldGVyb3NjZWRhc3RpY2lkYWRlIGNvbXBsZW1lbnRhbmRvIG8gcG9zdCBhbnRlcmlvciBlbSA8aHR0cHM6Ly9ycHVicy5jb20vYW1yb2ZpL3dvb2xkcmlkZ2VfZXg3Xzg+IGUgPGh0dHBzOi8vcnB1YnMuY29tL2Ftcm9maS93b29sZHJpZGdlX2V4N184X3NwZWM+LCBjb21vIHRhbWLDqW0gYW8gdmlkZW8gZGEgZGlzY3Vzc8OjbyBkZSBlc3BlY2lmaWNhw6fDo28gZW0gPGh0dHBzOi8veW91dHUuYmUvSjdOSzIzSjU0Ykk+Lg0KDQpUZW1vcyB1bSBkYXRhLmZyYW1lIGNvbSAxNTYgb2JzZXJ2YcOnw7VlcyBwYXJhIDIxIHZhcmnDoXZlaXM6DQoNCiAgICByYW5rOiBsYXcgc2Nob29sIHJhbmtpbmcgICAgDQogICAgc2FsYXJ5OiBtZWRpYW4gc3RhcnRpbmcgc2FsYXJ5ICAgIA0KICAgIGNvc3Q6IGxhdyBzY2hvb2wgY29zdCAgICANCiAgICBMU0FUOiBtZWRpYW4gTFNBVCBzY29yZSAgICANCiAgICBHUEE6IG1lZGlhbiBjb2xsZWdlIEdQQSAgICANCiAgICBsaWJ2b2w6IG5vLiB2b2x1bWVzIGluIGxpYi4sIDEwMDBzICAgIA0KICAgIGZhY3VsdHk6IG5vLiBvZiBmYWN1bHR5ICAgIA0KICAgIGFnZTogYWdlIG9mIGxhdyBzY2guLCB5ZWFycyAgICANCiAgICBjbHNpemU6IHNpemUgb2YgZW50ZXJpbmcgY2xhc3MgICAgDQogICAgbm9ydGg6ID0xIGlmIGxhdyBzY2ggaW4gbm9ydGggICAgDQogICAgc291dGg6ID0xIGlmIGxhdyBzY2ggaW4gc291dGggICAgDQogICAgZWFzdDogPTEgaWYgbGF3IHNjaCBpbiBlYXN0ICAgIA0KICAgIHdlc3Q6ID0xIGlmIGxhdyBzY2ggaW4gd2VzdCAgICANCiAgICBsc2FsYXJ5OiBsb2coc2FsYXJ5KSAgICANCiAgICBzdHVkZmFjOiBzdHVkZW50LWZhY3VsdHkgcmF0aW8gICAgDQogICAgdG9wMTA6ID0xIGlmIHJhbmtlZCBpbiB0b3AgMTAgICAgDQogICAgcjExXzI1OiA9MSBpZiByYW5rZWQgMTEtMjUgICAgDQogICAgcjI2XzQwOiA9MSBpZiByYW5rZWQgMjYtNDAgICAgDQogICAgcjQxXzYwOiA9MSBpZiByYW5rZWQgNDEtNjAgICAgDQogICAgbGxpYnZvbDogbG9nKGxpYnZvbCkgICAgDQogICAgbGNvc3Q6IGxvZyhjb3N0KSAgICANCg0KYGBge3IsIGVjaG89RkFMU0UsIGV2YWw9VH0NCiMgaW5jbHVkZSB0aGlzIGNvZGUgY2h1bmsgYXMtaXMgdG8gc2V0IG9wdGlvbnMNCmtuaXRyOjpvcHRzX2NodW5rJHNldChjb21tZW50PU5BLCBwcm9tcHQ9VFJVRSwgb3V0LndpZHRoPTc1MCwgZmlnLmhlaWdodD04LCBmaWcud2lkdGg9OCkNCmBgYA0KDQojIE1vZGVsYWdlbQ0KDQpBIHBhcnRlIGluaWNpYWwgcmVwcm9kdXogbyBwb3N0IGRlIDxodHRwczovL3JwdWJzLmNvbS9hbXJvZmkvd29vbGRyaWRnZV9leDdfOF9zcGVjPi4NCg0KIyMgQ2FycmVnYXIgb3MgZGFkb3MNCg0KYGBge3IsIHdhcm5pbmc9RkFMU0UsbWVzc2FnZT1GQUxTRX0NCmxpYnJhcnkod29vbGRyaWRnZSkNCmRhdGEoImxhd3NjaDg1IikNCmBgYA0KDQpWYW1vcyBnZXJhciBkdW1taWVzIChuw6NvIGVyYSBuZWNlc3PDoXJpbywgcG9pcyBqw6EgZXN0YXZhbSBubyBkYXRhc2V0KSBwYXJhIG9zIHJhbmtpbmdzIGRhcyBmYWN1bGRhZGVzLiBDcmlhbW9zIGFiYWl4byBwYXJhIHZlciBjb21vIGZpY2FtLCBwb2lzIG8gZGF0YXNldCBjb250w6ltIHVtYSB2YXJpw6F2ZWwgcmFuayBwYXJhIG9zIHNhbGFyaW9zIChzYWxhcnkpLiBPIGxlaXRvciBwb2RlIGludmVzdGlnYXIgYSBmb3JtYSBjb21vIGNyaWFtb3MgZHVtbWllcyB1c2FuZG8gYSB2YXJpw6F2ZWwgcmFuayBlIGNyaXTDqXJpb3MgZGUgY2xhc3Nlcy4NCg0KYGBge3IsIHdhcm5pbmc9RkFMU0UsbWVzc2FnZT1GQUxTRX0NCmxhd3NjaDg1JHRvcDEwIDwtIGFzLm51bWVyaWMobGF3c2NoODUkcmFuayA8PSAxMCkNCmxhd3NjaDg1JHIxMS4yNSA8LSBhcy5udW1lcmljKGxhd3NjaDg1JHJhbmsgPj0gMTEgJiBsYXdzY2g4NSRyYW5rIDw9IDI1KQ0KbGF3c2NoODUkcjI2LjQwIDwtIGFzLm51bWVyaWMobGF3c2NoODUkcmFuayA+PSAyNiAmIGxhd3NjaDg1JHJhbmsgPD0gNDApDQpsYXdzY2g4NSRyNDEuNjAgPC0gYXMubnVtZXJpYyhsYXdzY2g4NSRyYW5rID49IDQxICYgbGF3c2NoODUkcmFuayA8PSA2MCkNCmxhd3NjaDg1JHI2MS4xMDAgPC0gYXMubnVtZXJpYyhsYXdzY2g4NSRyYW5rID49IDYxICYgbGF3c2NoODUkcmFuayA8PSAxMDApDQpgYGANCg0KQXMgZHVtbWllcyBmb3JhbSBjcmlhZGFzIGUgasOhIGluY29ycG9yYWRhcyBhbyBkYXRhc2V0IGBsYXdzY2g4NWAuIFBvZGVtb3MgY29uZmVyaXIsIG9saGFuZG8gcGVsbyBwYWNvdGUgYGtuaXRyYCBlIGZ1bsOnw6NvIGBrYWJsZWAuDQoNCmBgYHtyLCB3YXJuaW5nPUZBTFNFLG1lc3NhZ2U9RkFMU0V9DQpsaWJyYXJ5KGtuaXRyKQ0Ka2FibGUobGF3c2NoODVbMToxNSxjKDE2OjE5LDIyOjI1KV0sY2FwdGlvbj0iRHVtbWllcyBkbyBkYXRhc2V0OiByZWNvcnRlIGRlIDE1IGxpbmhhcyIpDQoNCmBgYA0KDQpDb20gZXNzYXMgdmFyacOhdmVpcywgY3JpYW1vcyB1bSBtb2RlbG8gaW5pY2lhbCAobW9kMSkgZG8gdGlwbyBsb2ctbG9nOg0KDQokJA0KXG9wZXJhdG9ybmFtZXtsb2coc2FsYXJ5KX0gPSBcYWxwaGEgKyBcYmV0YV97MX0oXG9wZXJhdG9ybmFtZXtsb2cocmFuayl9KSArIFxiZXRhX3syfShcb3BlcmF0b3JuYW1le2xvZyhMU0FUKX0pICsgXGJldGFfezN9KFxvcGVyYXRvcm5hbWV7bG9nKEdQQSl9KSArIFxiZXRhX3s0fShcb3BlcmF0b3JuYW1le2xvZyhsaWJ2b2wpfSkgKyBcYmV0YV97NX0oXG9wZXJhdG9ybmFtZXtsb2coY29zdCl9KSArIFxlcHNpbG9uDQokJCBEZXBvaXMgdW0gKG1vZDIpIGxpbmVhcjoNCg0KJCQNClxvcGVyYXRvcm5hbWV7KHNhbGFyeSl9ID0gXGFscGhhICsgXGJldGFfezF9KFxvcGVyYXRvcm5hbWV7cmFua30pICsgXGJldGFfezJ9KFxvcGVyYXRvcm5hbWV7TFNBVH0pICsgXGJldGFfezN9KFxvcGVyYXRvcm5hbWV7R1BBfSkgKyBcYmV0YV97NH0oXG9wZXJhdG9ybmFtZXtsaWJ2b2x9KSArIFxiZXRhX3s1fShcb3BlcmF0b3JuYW1le2Nvc3R9KSArIFxlcHNpbG9uDQokJCBlIHVtIG1vZGVsbyBsb2ctbG9nIChtb2QzKSBjb20gYXMgZHVtbWllczoNCg0KJCQNClxiZWdpbnthcnJheX17bH0NClxvcGVyYXRvcm5hbWV7bG9nKHNhbGFyeSl9ID0gXGFscGhhICsgXGJldGFfezF9KFxvcGVyYXRvcm5hbWV7dG9wMTB9KSArIFxiZXRhX3syfShcb3BlcmF0b3JuYW1le3IxMVxfMjV9KSArIFxiZXRhX3szfShcb3BlcmF0b3JuYW1le3IyNlxfNDB9KSArXFwNClxiZXRhX3s0fShcb3BlcmF0b3JuYW1le3I0MVxfNjB9KSArIFxiZXRhX3s1fShcb3BlcmF0b3JuYW1le3I2MS4xMDB9KSArIFxiZXRhX3s2fShcb3BlcmF0b3JuYW1le2xvZyhMU0FUKX0pICsgXGJldGFfezd9KFxvcGVyYXRvcm5hbWV7bG9nKEdQQSl9KSArXFwNClxiZXRhX3s4fShcb3BlcmF0b3JuYW1le2xvZyhsaWJ2b2wpfSkgKyBcYmV0YV97OX0oXG9wZXJhdG9ybmFtZXtsb2coY29zdCl9KSArIFxlcHNpbG9uDQpcZW5ke2FycmF5fQ0KJCQNCg0KIyMgUHJpbWVpcm9zIHJlc3VsdGFkb3MNCg0KUG9ydGFudG8sIG9zIG1vZGVsb3Mgc8OjbyBlc3RpbWFkb3MgZSBvcyByZXN1bHRhZG9zIGVzdMOjbyBhYmFpeG8uDQoNCmBgYHtyLCBtZXNzYWdlPUZBTFNFLHdhcm5pbmc9RkFMU0V9DQptb2QxIDwtIGxtKGxvZyhzYWxhcnkpIH4gbG9nKHJhbmspICsgbG9nKExTQVQpICsgbG9nKEdQQSkgDQogICAgICAgICAgICsgbG9nKGxpYnZvbCkgKyBsb2coY29zdCksIGRhdGEgPSBsYXdzY2g4NSkNCm1vZDIgPC0gbG0oKHNhbGFyeSkgfiAocmFuaykgKyAoTFNBVCkgKyAoR1BBKSANCiAgICAgICAgICAgKyAobGlidm9sKSArIChjb3N0KSwgZGF0YSA9IGxhd3NjaDg1KQ0KbW9kMyA8LSBsbShsb2coc2FsYXJ5KSB+IHRvcDEwICsgcjExXzI1ICsgcjI2XzQwICsgcjQxXzYwICsgcjYxLjEwMCANCiAgICAgICAgICAgKyBsb2coTFNBVCkgKyBsb2coR1BBKSArIGxvZyhsaWJ2b2wpICsgbG9nKGNvc3QpLCBkYXRhID0gbGF3c2NoODUpDQptb2QxJEFJQyA8LSBBSUMobW9kMSkNCm1vZDIkQUlDIDwtIEFJQyhtb2QyKQ0KbW9kMyRBSUMgPC0gQUlDKG1vZDMpDQptb2QxJEJJQyA8LSBCSUMobW9kMSkNCm1vZDIkQklDIDwtIEJJQyhtb2QyKQ0KbW9kMyRCSUMgPC0gQklDKG1vZDMpDQpsaWJyYXJ5KHN0YXJnYXplcikNCnN0YXIuMSA8LSBzdGFyZ2F6ZXIobW9kMSwgbW9kMiwgbW9kMywNCiAgICAgICAgICAgICAgICAgICAgdGl0bGU9IlTDrXR1bG86IFJlc3VsdGFkb3MgZGFzIFJlZ3Jlc3PDtWVzIiwNCiAgICAgICAgICAgICAgICAgICAgYWxpZ249VFJVRSwNCiAgICAgICAgICAgICAgICAgICAgdHlwZSA9ICJ0ZXh0IiwNCiAgICAgICAgICAgICAgICAgICAga2VlcC5zdGF0PWMoImFpYyIsImJpYyIsInJzcSIsICJhZGoucnNxIiwibiIpDQopDQoNCmBgYA0KDQpDb25mb3JtZSBvIHBvc3QgPGh0dHBzOi8vcnB1YnMuY29tL2Ftcm9maS93b29sZHJpZGdlX2V4N184X3NwZWM+LCBvIG1lbGhvciBtb2RlbG8gZm9pIGlkZW50aWZpY2FkbyBwYXJhIG8gbW9kZWxvIDMgKGNvbW8gaW5kaWNhZG8gbm8gdmlkZW8gZGEgZGlzY3Vzc8OjbyBkZSBlc3BlY2lmaWNhw6fDo28gZW0gPGh0dHBzOi8veW91dHUuYmUvSjdOSzIzSjU0Ykk+KS4NCg0KRGFyZW1vcyBwcm9zc2VndWltZW50byBlbnTDo28gcGFyYSBhIGF2YWxpYcOnw6NvIGRhIGhldGVyb3NjZWRhc3RpY2lkYWRlIG5lc3RlIG1vZGVsbyAzLg0KDQojIyBIZXRlcm9zY2VkYXN0aWNpZGFkZSBubyBtb2RlbG8gMw0KDQojIyMgVGVzdGUgZGUgV2hpdGUgc2VtIHRlcm1vcyBjcnV6YWRvcw0KDQpPcHRhbW9zIHBvciByZWFsaXphciBvIHRlc3RlIGRlIFdoaXRlIGNvbSBhIGZ1bsOnw6NvIGJwdGVzdCBlIGEgZXNwZWNpZmljYcOnw6NvIHNlbSB0ZXJtb3MgY3J1emFkb3MgZW0gdmlydHVkZSBkZSBqdWxnYXJtb3MgcGVxdWVubyBvIG7Dum1lcm8gZGUgb2JzZXJ2YcOnw7VlcyBkbyBtb2RlbG8uIEEgaGlww7N0ZXNlIG51bGEgw6k6XA0KKioqSDA6IHJlc8OtZHVvcyBzw6NvIGhvbW9zY2Vkw6FzdGljb3MqKiouIEEgYWx0ZXJuYXRpdmEgc2Vyw6EgZW50w6NvIEgxOiByZXPDrWR1b3MgaGV0ZXJvc2NlZMOhc3RpY29zLg0KDQpgYGB7ciwgd2FybmluZz1GQUxTRSxtZXNzYWdlPUZBTFNFfQ0KbG10ZXN0OjpicHRlc3QobW9kMyx+IGxvZyhMU0FUKSArIGxvZyhHUEEpICsgbG9nKGxpYnZvbCkgKyBsb2coY29zdCkrDQogICAgICAgICAgICAgICAgICAgSShsb2coTFNBVCleMikrSShsb2coR1BBKV4yKSsNCiAgICAgICAgICAgICAgICAgICBJKGxvZyhsaWJ2b2wpXjIpK0kobG9nKGNvc3QpXjIpLCBkYXRhID0gbGF3c2NoODUpDQpgYGANCg0KQ29uY2x1byBwZWxhIHByZXNlbsOnYSBkZSBoZXRlcm9zY2VkYXN0aWNpZGFkZSBkb3MgcmVzw61kdW9zIGVtIG1vZDMsIHVtYSB2ZXogcXVlIG8gcC12YWx1ZSA9IDAuMDQ3IMOpIG1lbm9yIHF1ZSAwLjEwIGUgcmVqZWl0YS1zZSBhIGhpcMOzdGVzZSBudWxhIGRlIHJlc8OtZHVvcyBob21vc2NlZMOhc3RpY29zLiBVbWEgYWx0ZXJuYXRpdmEgZGlyZXRhIHNlcmlhIGFwbGljYXIgYSBjb3JyZcOnw6NvIHBlbGEgbWF0cml6IGRlIHZhcmnDom5jaWEtY292YXJpw6JuY2lhIHBlbGEgZnVuw6fDo28gYGhjY21gICwgZG8gcGFjb3RlIGBjYXJgIC4NCg0KIyMjIENvcnJlw6fDo28gZGUgVmFyLWNvdiBjb25mb3JtZSBXaGl0ZQ0KDQpBIGNvcnJlw6fDo28gcGVsYSBmdW7Dp8OjbyBgY2FyOjpoY2NtYCAoKmhldGVyb3NrZWRhc3RpY2l0eS1jb3JyZWN0ZWQgY292YXJpYW5jZSBtYXRyaXgqKSBhZG1pdGUgZGlmZXJlbnRlcyBmb3JtYXRvcyBkZSBlc3BlY2lmaWNhw6fDo28gZGEgdmFyLWNvdiAoImhjMCIsImhjMSIsImhjMiIsImhjMyIsImhjNCIpLCBlIHRyYWJhbGhhcmVtb3MgYXF1aSBjb20gYSBvcMOnw6NvIGhjMSwgZW0gc2V1IGZvcm1hdG8gbWFpcyB0cmFkaWNpb25hbC4gUGFyYSBhIG1hdHJpeiBkZSB2YXItY292IGRvcyBwYXLDom1ldHJvcyBubyBmb3JtYXRvDQoNCiRWYXJcbGVmdCgge1xoYXQgXGJldGEgfFh9IFxyaWdodCkgPSB7XGxlZnQoIHtYJ1h9IFxyaWdodCleeyAtIDF9fVgnXE9tZWdhIFh7XGxlZnQoIHtYJ1h9IFxyaWdodCleeyAtIDF9fSQNCg0KdMOqbS1zZSBlbnTDo28gZGlmZXJlbnRlcyBwb3NzaWJpbGlkYWRlcyBwYXJhICQkXE9tZWdhJCQuDQoNCi0gICAiaGMwIjrCoCBtYXRyaXogY2zDoXNzaWNhIGRlIGNvcnJlw6fDo28gZGUgRWlja2VyICgxOTYzKSBlIHBvcHVsYXJpemFkYSBwb3IgV2hpdGUgKDE5ODApOw0KDQotICAgImhjMSIsICJoYzIiIGUgImhjMyI6wqBtYXRyaXplcyBkZSBjb3JyZcOnw6NvIHN1Z2VyaWRhcyBwb3IgTWFjS2lubm9uIGUgV2hpdGUgKDE5ODUpIGUgYXBlcmZlacOnb2FkYXMgcGFyYSBwZXF1ZW5hcyBhbW9zdHJhcyBjb25mb3JtZSBMb25nIGUgRXJ2aW4gKDIwMDApOw0KDQotICAgImhjNCI6IG1hdHJpeiBkZSBjb3JyZcOnw6NvIGNvbmZvcm1lIENyaWJhcmktTmV0byAoMjAwNCkgcGFyYSBhcGVyZmVpw6dvYXIgYSBwZXJmb3JtYW5jZSBlbSBwZXF1ZW5hcyBhbW9zdHJhcyBjb20gcHJlc2Vuw6dhIGRlIG9ic2VydmHDp8O1ZXMgaW5mbHVlbnRlcy4NCg0KQXMgbWF0cml6IG1vZGlmaWNhbSBjb25mb3JtZSBhIGNvbXBvc2nDp8OjbyBkYSBtYXRyaXogZGUgcG9uZGVyYcOnw6NvOg0KDQohW0RpZmVyZW50ZXMgcG9zc2liaWxpZGFkZXMgcGFyYSBhcyBtYXRyaXplcyBkZSB2YXJpw6JuY2lhLWNvdmFyacOibmNpYSBkb3MgcmVzw61kdW9zLiBGb250ZTogS0xFSUJFUiBlIFpFSUxFSVMgKDIwMDgpLl0oSW1hZ2VtMS5wbmcgIkRpZmVyZW50ZXMgcG9zc2liaWxpZGFkZXMgcGFyYSBhcyBtYXRyaXplcyBkZSB2YXJpw6JuY2lhLWNvdmFyacOibmNpYSBkb3MgcmVzw61kdW9zIil7LmlsbHVzdHJhdGlvbiBzdHlsZT0iY29sb3I6IGdyYXkiIHdpZHRoPSIyNTQifQ0KDQpgYGB7ciwgd2FybmluZz1GQUxTRSxtZXNzYWdlPUZBTFNFfQ0KbGlicmFyeShjYXIpIA0KI3Bvc3NpYmlsaWRhZGVzOiBoY2NtKHJlZ3Jlc3NhbzEsdHlwZT1jKCJoYzAiLCJoYzEiLCJoYzIiLCJoYzMiLCJoYzQiKSkNCnZjb3Yud2hpdGUwPC1oY2NtKG1vZDMsdHlwZT1jKCJoYzEiKSkNCiMgcGVsbyBjb2VmdGVzdA0KbG10ZXN0Ojpjb2VmdGVzdChtb2QzLHZjb3Yud2hpdGUwKQ0KYGBgDQoNCmBgYHtyLCB3YXJuaW5nPUZBTFNFLG1lc3NhZ2U9RkFMU0V9DQojIG91IG5vIHN1bcOhcmlvDQpzdW1tYXJ5KG1vZDMpDQpgYGANCg0KU2Vyw6EgcHJlY2lzbyBwZXF1ZW5vcyBwYXNzb3MgcGFyYSBleHByZXNzYXIgYWRlcXVhZGFtZW50ZSBuYSB0YWJlbGEgZG8gc3RhcmdhemVyLiBPIG1vZGVsbyAzIGluaWNpYWwgZXN0w6EgY29sb2NhZG8gYW8gbGFkbyBkbyBtb2RlbG8gMyByb2J1c3RvLCBvdSBzZWphLCBjb20gY29ycmXDp8OjbyBwYXJhIGhldGVyb3NjZWRhc3RpY2lkYWRlLg0KDQpgYGB7ciwgd2FybmluZz1GQUxTRSxtZXNzYWdlPUZBTFNFfQ0KIyBmYXplciBzdGFyZ2F6ZXIgY29tIGRvaXMgbW9kZWxvcw0KY292IDwtIHZjb3Yud2hpdGUwDQpyb2J1c3Quc2UgPC0gc3FydChkaWFnKGNvdikpDQoNCnN0YXJnYXplcihtb2QzLCBtb2QzLA0KICAgICAgICAgIHNlPWxpc3QoTlVMTCwgcm9idXN0LnNlKSwNCiAgICAgICAgICBjb2x1bW4ubGFiZWxzPWMoIk1RTy1tb2QzIiwibW9kMyByb2J1c3RvIiksIA0KICAgICAgICAgIHRpdGxlPSJUw610dWxvOiBSZXN1bHRhZG8gZGEgUmVncmVzc8OjbyIsDQogICAgICAgICAgYWxpZ249VFJVRSwNCiAgICAgICAgICB0eXBlID0gInRleHQiLCBzdHlsZSA9ICJhbGwiLA0KICAgICAgICAgIGtlZXAuc3RhdD1jKCJhaWMiLCJiaWMiLCJyc3EiLCAiYWRqLnJzcSIsIm4iKSkNCmBgYA0KDQpFbWJvcmEgZG8gcG9udG8gZGUgdmlzdGEgZGUgcmVzdWx0YWRvcyB0ZW5oYW1vcyBhcyBtZXNtYXMgdmFyacOhdmVpcyBzaWduaWZpY2F0aXZhcyBxdWUgYW50ZXMgKG5vIG1vZGVsbyAzKSwgc2FiZW1vcyBxdWUgZm9pIGZlaXRhIGEgY29ycmXDp8OjbyBwYXJhIGhldGVyb3NjZWRhc3RpY2lkYWRlIG5vIG1vZGVsbyAzIHJvYnVzdG8uIE7Do28gY2FiZSBhZ29yYSByZWZhemVyIG8gdGVzdGUgZGUgaGV0ZXJvc2NlZGFzdGljaWRhZGUgc29icmUgbyBtb2RlbG8gMyByb2J1c3RvLg0KDQpFbnRyZXRhbnRvLCBsZXZhbnRhbW9zIGFsZ3VtYXMgaW5kYWdhw6fDtWVzIG5hIHByw7N4aW1hIHNlw6fDo28sIHBhcmEgbyBsZWl0b3IgY29tcHJlZW5kZXIgdW0gcG91Y28gbWFpcyBzb2JyZSBlc3NlIHByb2JsZW1hIGRhIGhldGVyb3NjZWRhc3RpY2lkYWRlLiBObyBleGVyY8OtY2lvIGRlIEZpZ3VlaXJlZG8gKDIwMTkpLCBjb25jbHVpdS1zZSBxdWUgb3MgcmVzw61kdW9zIGRvIG1vZGVsbyAzIG7Do28gc8OjbyBub3JtYWxtZW50ZSBkaXN0cmlidcOtZG9zLg0KDQpgYGB7ciwgd2FybmluZz1GQUxTRSxtZXNzYWdlPUZBTFNFfQ0KIyMgVGVzdGUgZGUgSmFycXVlLUJlcmEgcGFyYSBub3JtYWxpZGFkZQ0KDQp1LmhhdDwtcmVzaWQobW9kMykNCmxpYnJhcnkodHNlcmllcykNCkpCLm1vZDM8LWphcnF1ZS5iZXJhLnRlc3QodS5oYXQpDQpKQi5tb2QzDQoNCmBgYA0KDQpGZXotc2UgbmEgc2VxdcOqbmNpYSBhIGFuw6FsaXNlIGRlIHByZXNlbsOnYSBkZSBvdXRsaWVycy4NCg0KIyMgSW52ZXN0aWdhw6fDo28gZGUgb3V0bGllcnMgLSB0ZXN0ZSBkZSBCb25mZXJyb25pIHBhcmEgb3V0bGllcg0KDQpgYGB7ciwgd2FybmluZz1GQUxTRSxtZXNzYWdlPUZBTFNFfQ0Kb3V0bGllclRlc3QobW9kMykNCnFxUGxvdChtb2QzKQ0KdmlmKG1vZDMpDQpgYGANCg0KQXMgb2JzZXJ2YcOnw7VlcyAzIGUgNDcgc3VnZXJlbSBvdXRsaWVycyBhIHNlcmVtIGNvbnRyb2xhZG9zLiBDb2xvY2FyZWkgdW1hIGR1bW15IHBhcmEgYW1ib3MuDQoNCmBgYHtyLCB3YXJuaW5nPUZBTFNFLG1lc3NhZ2U9RkFMU0V9DQphdHRhY2gobGF3c2NoODUpDQpkYWRvczwtYXMuZGF0YS5mcmFtZShjYmluZChzYWxhcnkscmFuayxMU0FULEdQQSxsaWJ2b2wsY29zdCx0b3AxMCxyMTFfMjUscjI2XzQwLHI0MV82MCxyNjEuMTAwKSkNCmRldGFjaChsYXdzY2g4NSkNCmF0dGFjaChkYWRvcykNCmRhZG9zJGR1bW15PC0wDQpkYWRvcyRkdW1teVszXT0xDQpkYWRvcyRkdW1teVs0N109MQ0KZGFkb3MkZHVtbXlbNzldPTEgIyBkZXRlY3RlaSBubyBvdXRybyBwb3N0IHF1ZSBvIDc5IHRhbWLDqW0gw6kgb3V0bGllcg0KYGBgDQoNCkZhcmVpIG5vdmFzIHJlZ3Jlc3PDtWVzIHBhcnRpbmRvIGRlIG1vZDMgcGFyYSBpbmNsdXPDo28gZGUgZHVtbWllcyBhbHRlcmFuZG8sIHBhcmEgb3Mgb3V0bGllcnMsIGludGVyY2VwdG8gZSBpbmNsaW5hw6fDtWVzIGVtIGRpZmVyZW50ZXMgdmFyacOhdmVpcy4NCg0KYGBge3IsIHdhcm5pbmc9RkFMU0UsbWVzc2FnZT1GQUxTRX0NCmF0dGFjaChkYWRvcykNCm1vZDQgPC0gbG0obG9nKHNhbGFyeSkgfiB0b3AxMCArIHIxMV8yNSArIHIyNl80MCArIHI0MV82MCArIHI2MS4xMDAgDQogICAgICAgICAgICsgbG9nKExTQVQpICsgbG9nKEdQQSkgKyBsb2cobGlidm9sKSArIGxvZyhjb3N0KStkdW1teSsNCiAgICAgICAgICAgICBJKGR1bW15KkxTQVQpLCBkYXRhID0gZGFkb3MpDQptb2Q0JEFJQyA8LSBBSUMobW9kNCkNCm1vZDQkQklDIDwtIEJJQyhtb2Q0KQ0KbW9kNSA8LSBsbShsb2coc2FsYXJ5KSB+IHRvcDEwICsgcjExXzI1ICsgcjI2XzQwICsgcjQxXzYwICsgcjYxLjEwMCANCiAgICAgICAgICAgKyBsb2coTFNBVCkgKyBsb2coR1BBKSArIGxvZyhsaWJ2b2wpICsgbG9nKGNvc3QpK2R1bW15Kw0KICAgICAgICAgICAgIEkoZHVtbXkqR1BBKSwgZGF0YSA9IGRhZG9zKQ0KbW9kNSRBSUMgPC0gQUlDKG1vZDUpDQptb2Q1JEJJQyA8LSBCSUMobW9kNSkNCm1vZDYgPC0gbG0obG9nKHNhbGFyeSkgfiB0b3AxMCArIHIxMV8yNSArIHIyNl80MCArIHI0MV82MCArIHI2MS4xMDAgDQogICAgICAgICAgICsgbG9nKExTQVQpICsgbG9nKEdQQSkgKyBsb2cobGlidm9sKSArIGxvZyhjb3N0KStkdW1teSsNCiAgICAgICAgICAgICBJKGR1bW15KmxpYnZvbCksIGRhdGEgPSBkYWRvcykNCm1vZDYkQUlDIDwtIEFJQyhtb2Q2KQ0KbW9kNiRCSUMgPC0gQklDKG1vZDYpDQptb2Q3IDwtIGxtKGxvZyhzYWxhcnkpIH4gdG9wMTAgKyByMTFfMjUgKyByMjZfNDAgKyByNDFfNjAgKyByNjEuMTAwIA0KICAgICAgICAgICArIGxvZyhMU0FUKSArIGxvZyhHUEEpICsgbG9nKGxpYnZvbCkgKyBsb2coY29zdCkrZHVtbXkrDQogICAgICAgICAgICAgSShkdW1teSpjb3N0KSwgZGF0YSA9IGRhZG9zKQ0KbW9kNyRBSUMgPC0gQUlDKG1vZDcpDQptb2Q3JEJJQyA8LSBCSUMobW9kNykNCmxpYnJhcnkoc3RhcmdhemVyKQ0Kc3Rhci4yIDwtIHN0YXJnYXplcihtb2Q0LCBtb2Q1LG1vZDYsbW9kNywNCiAgICAgICAgICAgICAgICAgICAgdGl0bGU9IlTDrXR1bG86IFJlc3VsdGFkb3MgZGFzIFJlZ3Jlc3PDtWVzIiwNCiAgICAgICAgICAgICAgICAgICAgY29sdW1uLmxhYmVscz1jKCJNUU8tbW9kNCIsIk1RTy1tb2Q1IiwiTVFPLW1vZDYiLCJNUU8tbW9kNyIpLA0KICAgICAgICAgICAgICAgICAgICBhbGlnbj1UUlVFLA0KICAgICAgICAgICAgICAgICAgICB0eXBlID0gInRleHQiLA0KICAgICAgICAgICAgICAgICAgICBrZWVwLnN0YXQ9YygiYWljIiwiYmljIiwicnNxIiwgImFkai5yc3EiLCJuIikNCikNCg0KYGBgDQoNCk8gbW9kZWxvIDcgYXBhcmVudGEgbWVsaG9yIGFqdXN0YW1lbnRvIGUgY29udGludWFyZWkgYW7DoWxpc2VzIGEgcGFydGlyIGRlbGUuIFRlc3RhcmVpIG5vdmFtZW50ZSBwYXJhIG5vcm1hbGlkYWRlOg0KDQpgYGB7ciwgd2FybmluZz1GQUxTRSxtZXNzYWdlPUZBTFNFfQ0KZGFkb3Mkb2JzPC0xOjE1Ng0KdS5oYXQ8LXJlc2lkKG1vZDcpDQpsaWJyYXJ5KHRzZXJpZXMpDQpKQi5tb2Q3PC1qYXJxdWUuYmVyYS50ZXN0KHUuaGF0KQ0KSkIubW9kNw0Kb3V0bGllclRlc3QobW9kNykNCnFxUGxvdChtb2Q3KQ0KYGBgDQoNCkFnb3JhIHNpbSwgY29sb2NhbmRvIDMsIDQ3IGUgNzkgY29tbyBkdW1taWVzIGNvbnNlZ3VpIHJlc8OtZHVvcyBub3JtYWlzIG5vIG1vZGVsbyA3LiBWb3Ugb2xoYXIgbyB0ZXN0ZSBSRVNFVCBwYXJhIGVzcGVjaWZpY2HDp8Ojby4NCg0KYGBge3J9DQpUZXN0ZVJFU0VULnBvd2VyPC1sbXRlc3Q6OnJlc2V0dGVzdChtb2Q3LCBwb3dlciA9IDI6MykNClRlc3RlUkVTRVQucG93ZXINCg0KYGBgDQoNCkVtYm9yYSBhaW5kYSBjb20gcHJvYmFiaWxpZGFkZSBiYWl4YSwgdm91IGNvbnNpZGVyYXIgbyBtb2RlbG8gNyBiZW0gZXNwZWNpZmljYWRvIGUgaW52ZXN0aWdhciBvdXRyb3MgaXRlbnMgY29tbyBhIGhldGVyb3NjZWRhc3RpY2lkYWRlLg0KDQojIyBUZXN0ZSBkZSBoZXRlcm9zY2VkYXN0aWNpZGFkZSBubyBtb2RlbG8gNw0KDQpWb3UgY2hlY2FyIGEgaGV0ZXJvY2VkYXN0aWNpZGFkZS4gQSBkdW1teSBzb21lbnRlIGVudHJhIGVtIG7DrXZlbCwgbsOjbyBhZGlhbnRhbmRvIGNvbG9jYXIgYW8gcXVhZHJhZG8uDQoNCmBgYHtyfQ0KbG10ZXN0OjpicHRlc3QobW9kNyx+IGxvZyhMU0FUKSArIGxvZyhHUEEpICsgbG9nKGxpYnZvbCkgKyBsb2coY29zdCkNCg0KICAgICAgICAgICAgICAgICArZHVtbXkrSShkdW1teSpjb3N0KSsNCg0KICAgICAgICAgICAgICAgICAgIEkobG9nKExTQVQpXjIpK0kobG9nKEdQQSleMikrDQoNCiAgICAgICAgICAgICAgICAgICBJKGxvZyhsaWJ2b2wpXjIpK0kobG9nKGNvc3QpXjIpLCBkYXRhID0gZGFkb3MpDQpgYGANCg0KTsOjbyBkZXRlY3RvIGhldGVyb2NlZGFzdGljaWRhZGUuIE9VIHNlamEsIGFvIGNvbnRyb2xhciBwZWxvcyBvdXRsaWVycywgcmVzb2x2aSBvIHByb2JsZW1hIGRlIGhldGVyb2NlZGFzdGljaWRhZGUuIENvbW8gYSBwcm9iYWJpbGlkYWRlIGZvaSBwcsOzeGltYSBhIDAuMTAsIHN1Z2lybyBpbnZlc3RpZ2FyIG91dHJhcyBwb3NzaWJpbGlkYWRlcy4gRmFyZWkgbyB0ZXN0ZSBwYWRyw6NvIGRlIEJQLg0KDQpgYGB7cn0NCkJQX3QgPC0gbG10ZXN0OjpicHRlc3QobW9kNykNCnByaW50KEJQX3QpDQpgYGANCg0KT3Ugc2VqYSwgbyBtb2RlbG8gYXByZXNlbnRhIGhldGVyb3NjZWRhc3RpY2lkYWRlIHNlbSBjb250cm9sYXIgb3V0bGllcnMgZSBjb21vIHZpc3RvLCBwb2RlIG9idGVyIG91dHJvIHJlc3VsdGFkbyBzZSBvcHRhciBwb3IgY29udHJvbGFyIHBhcmEgb3Mgb3V0bGllcnMuIE8gcGVzcXVpc2Fkb3IgZGV2ZSBlc3RhciBhdGVudG8gcG9pcyBjYWRhIGNhc28gcG9kZSBsZXZhciBhIGFsdGVybmF0aXZhcyBkaWZlcmVudGVzLiBDb21vIG8gdGVzdGUgQlAgYWN1c291IGhldGVyb2NlZGFzdGljaWRhZGUsIGZhei1zZSBhIGNvcnJlw6fDo28gZSBlc3RpbWHDp8OjbyByb2J1c3RhLiBBZ29yYSB1dGlsaXphcmVtb3MgbyBwYWNvdGUgYHNhbmR3aWNoYCBlIGEgZnVuw6fDo28gYHZjb3ZIQ2AuIEVzdGEgZnVuw6fDo28gb3BlcmEgZGUgbW9kbyBzZW1lbGhhbnRlIGFvIGRvIHBhY290ZSBgY2FyYCBlIHRhbWLDqW0gc2UgcG9kZSBlc3BlY2lmaWNhciB0aXBvcyBkZSBwb25kZXJhw6fDo28uIFVzYXJlaSBhIG9ww6fDo28gYEhDMWAgcGFyYSBmaWNhciBjb21vIG5hIGZvcm1hIGRvIGBoY2NtYC4NCg0KYGBge3Isd2FybmluZz1GQUxTRSxtZXNzYWdlPUZBTFNFfQ0KVl9IQ18xIDwtIHNhbmR3aWNoOjp2Y292SEMobW9kNywgdHlwZSA9ICJIQzEiKQ0KYGBgDQoNClZhbW9zIGFwcmVzZW50YXIgYSB0YWJlbGEgZGUgY29lZmljaWVudGVzIGNvbSBlcnJvcyByb2J1c3RvczoNCg0KYGBge3J9DQpwcmludChsbXRlc3Q6OmNvZWZ0ZXN0KG1vZDcsIHZjb3YuID0gVl9IQ18xKSkNCmBgYA0KDQpFIGFnb3JhIGNvbSBvcyBlcnJvcyB2aWVzYWRvcyBwZWxhIGhldGVyb3NjZWRhc3RpY2lkYWRlOg0KDQpgYGB7cn0NCnByaW50KGxtdGVzdDo6Y29lZnRlc3QobW9kNykpDQpgYGANCg0KRW1ib3JhIHRlbmhhbW9zIGFsdGVyYWNvZXMgbm9zIGRlc3Zpb3MgcGFkcsO1ZXMgZSBjb25zZXF1ZW50ZXMgZXN0YXTDrXN0aWNhcyB0IGUgcHJvYmFiaWxpZGFkZXMsIG8gcmVzdWx0YWRvIHBvciBNUUcgLSBIQ0UgKCpoZXRlcm9za2VkYXN0aWMgY29uc2lzdGVudCBlc3RpbWF0b3IqKSBuZXN0ZSBjYXNvIG7Do28gYWx0ZXJvdSBhIGludGVycHJldGHDp8OjbyByZWxhdGl2YW1lbnRlIGFvIG1vZGVsbyBwb3IgTVFPLg0KDQojIyBPdXRyYSBlc3RpbWHDp8OjbyByb2J1c3RhIHBlbG8gZXN0aW1hdHINCg0KYGBge3J9DQpsaWJyYXJ5KGVzdGltYXRyKQ0KbGlicmFyeShjYXIpDQojIEVycm9zIHBhZHLDtWVzIHJvYnVzdG9zIEhDMSDigJMgcGFkcsOjbyBkbyBTdGF0YQ0KbW9kZWwgPC0gbG1fcm9idXN0KGxvZyhzYWxhcnkpIH4gdG9wMTAgKyByMTFfMjUgKyByMjZfNDAgKyByNDFfNjAgKyByNjEuMTAwIA0KICAgICAgICAgICArIGxvZyhMU0FUKSArIGxvZyhHUEEpICsgbG9nKGxpYnZvbCkgKyBsb2coY29zdCkrZHVtbXkrDQogICAgICAgICAgICAgSShkdW1teSpjb3N0KSwgZGF0YSA9IGRhZG9zLA0KICAgICAgICAgICAgICAgICAgIHNlX3R5cGUgPSAic3RhdGEiKQ0Kc3VtbWFyeShtb2RlbCkNCg0KYGBgDQoNCiMgUmVmZXLDqm5jaWFzDQoNCkZJR1VFSVJFRE8sIEFkcmlhbm8gTWFyY29zIFJvZHJpZ3Vlcy4gRWNvbm9tZXRyaWE6IFNhbMOhcmlvcyBkZSBhZHZvZ2Fkb3MgLSBXb29sZHJpZGdlKGV4ZW1wbG8gNy44KSBhZGFwdGFkbyBkZSBNT0hSICgyMDE4KS4gQ2FtcG8gR3JhbmRlLU1TLEJyYXNpbDogUlN0dWRpby9ScHVicywgMjAxOS4gRGlzcG9uw612ZWwgZW0gXDw8aHR0cDovL3JwdWJzLmNvbS9hbXJvZmkvd29vbGRyaWRnZV9leDdfOCUzRS4+DQoNCkhFSVNTLCBGbG9yaWFuLiBVc2luZyBSIGZvciBJbnRyb2R1Y3RvcnkgRWNvbm9tZXRyaWNzLiAyLmVkLiBGbG9yaWFuIEhlaXNzLCAyMDIwLiBSZWN1cnNvIG9ubGluZS4gRGlzcG9uw612ZWwgZW06IDxodHRwOi8vd3d3LnVyZmllLm5ldC8+Lg0KDQpLTEVJQkVSLCBDaHJpc3RpYW47wrdaRUlMRUlTLCBBY2hpbS4gQXBwbGllZCBFY29ub21ldHJpY3Mgd2l0aCBSLiBOZXcgWW9yay1OWTogU3ByaW5nZXIgU2NpZW5jZStCdXNpbmVzcyBNZWRpYSwgTExDLCAyMDA4Lg0KDQpTSEVBLCBKdXN0aW4gTS4gd29vbGRyaWRnZTogdmlnbmV0dGUuIDIwMjAuIERpc3BvbsOtdmVsIGVtOiA8aHR0cHM6Ly9qdXN0aW5tc2hlYS5naXRodWIuaW8vd29vbGRyaWRnZS9hcnRpY2xlcy9JbnRyb2R1Y3RvcnktRWNvbm9tZXRyaWNzLUV4YW1wbGVzLmh0bWw+Lg0KDQpTSEVBLCBKdXN0aW4gTS4gd29vbGRyaWRnZTogMTExIERhdGEgU2V0cyBmcm9tICJJbnRyb2R1Y3RvcnkgRWNvbm9tZXRyaWNzOiBBIE1vZGVybiBBcHByb2FjaCwgNmUiIGJ5IEplZmZyZXkgTS4gV29vbGRyaWRnZS4gUiBwYWNrYWdlIHZlcnNpb24gMS4zLjEuIDIwMTguIERpc3BvbsOtdmVsIGVtOiA8aHR0cHM6Ly9DUkFOLlItcHJvamVjdC5vcmcvcGFja2FnZT13b29sZHJpZGdlPi4NCg0KV09PTERSSURHRSwgSi5NLiBJbnRyb2R1w6fDo28gw6AgRWNvbm9tZXRyaWE6IHVtYSBhYm9yZGFnZW0gbW9kZXJuYS4gU8OjbyBQYXVsbzogUGlvbmVpcmEgVGhvbXNvbiBMZWFybmluZywgMjAwNi4odHJhZHXDp8OjbyBkYSBzZWd1bmRhIGVkacOnw6NvIGFtZXJpY2FuYSkuDQoNCldPT0xEUklER0UsIEplZmZyZXkgTS4gSW50cm9kdWN0b3J5IGVjb25vbWV0cmljczogQSBtb2Rlcm4gYXBwcm9hY2guIE5lbHNvbiBFZHVjYXRpb24sIDIwMTYuDQo=