Índice de Producción Industrial

Apartado 1

Divide las muestras de la tarea anterior en la muestra de estimaciĂłn y la muestra de predicciĂłn.

Calcula las predicciones con los modelos ARIMA y obtén las medidas de ajuste de la predicción.

Tenemos 116 observaciones para el indice de producciĂłn industrial, por lo que usaremos 92 observaciones de training y 24 de test.

EstimaciĂłn de modelos

Series: Y 
ARIMA(0,1,4)                    

Coefficients:
         ma1     ma2     ma3      ma4
      0.4826  0.3680  0.1529  -0.3053
s.e.  0.1015  0.1176  0.1122   0.1012

sigma^2 estimated as 0.0001636:  log likelihood=269.01
AIC=-528.02   AICc=-527.32   BIC=-515.47
Series: Y 
ARIMA(1,1,3)                    

Coefficients:
          ar1     ma1     ma2     ma3
      -0.4653  1.0212  0.7218  0.4795
s.e.   0.1915  0.1592  0.1473  0.1224

sigma^2 estimated as 0.0001706:  log likelihood=267.23
AIC=-524.46   AICc=-523.76   BIC=-511.91

Testing set

Medidas de ajuste de la predicciĂłn

                  ME       RMSE        MAE      MPE     MAPE
MA(4)     0.06435959 0.06879345 0.06435959 5.950505 5.950505
ARMA(1,3) 0.06208330 0.06655213 0.06208330 5.738906 5.738906

A priori parece que el modelo ARMA(1,3) hace mejores predicciones ya que su MAE, RMASE y MAPE son mĂĄs bajos, en el siguiente apartado se realizan los contrastes.

Apartado 2

Realiza los contrastes de potencia de predicciĂłn.

Morgan-Granger-Newbold Test


t test of coefficients:

              Estimate Std. Error t value  Pr(>|t|)    
(Intercept)  0.0441369  0.0070602  6.2515 2.721e-06 ***
vx          36.1579083  8.1236391  4.4509 0.0002005 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1


    Breusch-Godfrey test for serial correlation of order up to 4

data:  mgnreg
LM test = 19.197, df = 4, p-value = 0.0007189


    studentized Breusch-Pagan test

data:  mgnreg
BP = 2.9431, df = 1, p-value = 0.08625

Vemos como el coeficiente \(\beta\) es igual a 0 y por tanto no rechazamos la hipĂłtesis nula de que ambos modelos tienen la misma potencia de predicciĂłn.

Diebold-Mariano Test


    Diebold-Mariano Test

data:  e1e2
DM = 11.996, Forecast horizon = 1, Loss function power = 2, p-value = 2.224e-11
alternative hypothesis: two.sided


    Diebold-Mariano Test

data:  e1e2
DM = 11.996, Forecast horizon = 1, Loss function power = 2, p-value = 1.112e-11
alternative hypothesis: greater


    Diebold-Mariano Test

data:  e1e2
DM = 11.996, Forecast horizon = 1, Loss function power = 2, p-value = 1
alternative hypothesis: less

No rechazamos la hipĂłtesis nula de que las potencias de predicciĂłn son iguales, y tampoco que ningĂșn modelo es mejor que el otro.

El modelo ARMA(1,3) es igual de preciso que el modelo MA(4).

Apartado 3

Realiza combinaciones de las predicciones.

Pesos iguales

X <- diff(X)
Y <- diff(Y)
m1 <- Arima(Y, c(0,0,4), include.mean=F)
m2 <- Arima(Y, c(1,0,3), include.mean=F)
m1.f <- forecast.Arima(m1, h=24, fan=T)
m2.f <- forecast.Arima(m2, h=24, fan=T)
m1.pred <- xts(m1.f$mean, index(X)[93:116])
m2.pred <- xts(m2.f$mean, index(X)[93:116])
p1 <- as.zoo(m1.pred)
p2 <- as.zoo(m2.pred)
YZ <- as.zoo(X[93:116])
pew <- (1/2)*(p1+p2)

Basados en regresiĂłn

Modelo sin restricciĂłnes


Time series regression with "zoo" data:
Start = 2011-01-01, End = 2016-10-01

Call:
dynlm(formula = YZ ~ p1 + p2)

Residuals:
       Min         1Q     Median         3Q        Max 
-0.0100223 -0.0036489 -0.0000221  0.0040239  0.0114820 

Coefficients:
             Estimate Std. Error t value Pr(>|t|)  
(Intercept)  0.003322   0.001305   2.546   0.0188 *
p1          -2.732024   3.101730  -0.881   0.3884  
p2           4.521504   4.748141   0.952   0.3518  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.006178 on 21 degrees of freedom
Multiple R-squared:  0.04169,   Adjusted R-squared:  -0.04957 
F-statistic: 0.4568 on 2 and 21 DF,  p-value: 0.6394

Modelo parcialmente restringido


Time series regression with "zoo" data:
Start = 2011-01-01, End = 2016-10-01

Call:
dynlm(formula = YZ ~ 0 + p1 + p2)

Residuals:
       Min         1Q     Median         3Q        Max 
-0.0067000 -0.0002943  0.0032270  0.0075054  0.0157646 

Coefficients:
   Estimate Std. Error t value Pr(>|t|)
p1   -4.754      3.351  -1.419    0.170
p2    7.532      5.140   1.465    0.157

Residual standard error: 0.006905 on 22 degrees of freedom
Multiple R-squared:  0.08924,   Adjusted R-squared:  0.00644 
F-statistic: 1.078 on 2 and 22 DF,  p-value: 0.3577

Modelo restringido


Time series regression with "zoo" data:
Start = 2011-01-01, End = 2016-10-01

Call:
dynlm(formula = YZstar ~ 0 + X1star)

Residuals:
       Min         1Q     Median         3Q        Max 
-0.0067000 -0.0003329  0.0033002  0.0072584  0.0152754 

Coefficients:
       Estimate Std. Error t value Pr(>|t|)
X1star    3.930      2.429   1.618    0.119

Residual standard error: 0.00685 on 23 degrees of freedom
Multiple R-squared:  0.1022,    Adjusted R-squared:  0.06318 
F-statistic: 2.619 on 1 and 23 DF,  p-value: 0.1193

Comparaciones de las combinaciones

MAE:

  IPI.ereqw IPI.ercreg1 IPI.ercreg2 IPI.ercreg3 
0.005933532 0.004704732 0.005375359 0.005580605 

En este caso son mejor las predicciones con el modelo sin restringir y con constante (Reg. 1).

Apartado 4

Realiza predicciones fuera de la muestra.

EstimaciĂłn de los modelos con toda la muestra:

Series: Y 
ARIMA(0,0,4) with zero mean     

Coefficients:
         ma1     ma2     ma3      ma4
      0.4861  0.3866  0.1698  -0.2917
s.e.  0.0899  0.1034  0.0979   0.0900

sigma^2 estimated as 0.0001347:  log likelihood=350.75
AIC=-691.5   AICc=-690.95   BIC=-677.78
Series: Y 
ARIMA(1,0,3) with zero mean     

Coefficients:
          ar1     ma1     ma2     ma3
      -0.4688  1.0181  0.7341  0.4931
s.e.   0.1724  0.1429  0.1233  0.1040

sigma^2 estimated as 0.0001394:  log likelihood=348.86
AIC=-687.73   AICc=-687.18   BIC=-674

Predicciones 8 pasos por delante:

Combinaciones

Tipo de interés a largo plazo

Apartado 1

Divide las muestras de la tarea anterior en la muestra de estimaciĂłn y la muestra de predicciĂłn.

Calcula las predicciones con los modelos ARIMA y obtén las medidas de ajuste de la predicción.

Tenemos 183 observaciones para el tipo de interés a largo plazo, por lo que usaremos 147 observaciones de training y 36 de test.

EstimaciĂłn de modelos

Series: Y 
ARIMA(3,1,1)                    

Coefficients:
         ar1     ar2    ar3    ma1
      -0.418  -0.054  0.232  0.502
s.e.   0.165   0.088  0.089  0.157

sigma^2 estimated as 0.00297:  log likelihood=219.49
AIC=-428.99   AICc=-428.56   BIC=-414.07
Series: Y 
ARIMA(3,1,0)                    

Coefficients:
        ar1     ar2    ar3
      0.039  -0.066  0.244
s.e.  0.080   0.081  0.082

sigma^2 estimated as 0.00304:  log likelihood=217.24
AIC=-426.49   AICc=-426.2   BIC=-414.55

Testing set

Medidas de ajuste de la predicciĂłn

                ME    RMSE     MAE    MPE   MAPE
ARMA(3,1) 0.077158 0.25015 0.17467 3.0924 11.501
AR(3)     0.074749 0.24945 0.17489 2.9126 11.540

Apartado 2

Realiza los contrastes de potencia de predicciĂłn.

Morgan-Granger-Newbold Test


t test of coefficients:

            Estimate Std. Error t value Pr(>|t|)    
(Intercept)    0.238      0.113    2.11    0.042 *  
vx           -35.663      1.199  -29.74   <2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1


    Breusch-Godfrey test for serial correlation of order up to 4

data:  mgnreg
LM test = 34.3, df = 4, p-value = 6.6e-07


    studentized Breusch-Pagan test

data:  mgnreg
BP = 0.0165, df = 1, p-value = 0.9

Vemos como el coeficiente \(\beta\) es claramente distinto de 0 y por tanto rechazamos la hipĂłtesis nula de que ambos modelos tienen la misma potencia de predicciĂłn.

Diebold-Mariano Test


    Diebold-Mariano Test

data:  e1e2
DM = 1.75, Forecast horizon = 1, Loss function power = 2, p-value = 0.089
alternative hypothesis: two.sided


    Diebold-Mariano Test

data:  e1e2
DM = 1.75, Forecast horizon = 1, Loss function power = 2, p-value = 0.044
alternative hypothesis: greater


    Diebold-Mariano Test

data:  e1e2
DM = 1.75, Forecast horizon = 1, Loss function power = 2, p-value = 0.96
alternative hypothesis: less

No rechazamos la hipĂłtesis nula de que las potencias de predicciĂłn son iguales, aunque el p-valor asociado a las dos colas es 0,089 y se queda muy cerca del 0.05 de nivel de significaciĂłn.

Si nos fijamos solamente en una cola tenemos que el modelo ARMA(3,1) es mĂĄs preciso que el AR(3) con un p-valor de 0,044.

Apartado 3

Realiza combinaciones de las predicciones.

Pesos iguales

X <- diff(X)
Y <- diff(Y)
m1 <- Arima(Y, c(3,0,1), include.mean=F)
m2 <- Arima(Y, c(3,0,0), include.mean=F)
m1.f <- forecast.Arima(m1, h=36, fan=T)
m2.f <- forecast.Arima(m2, h=36, fan=T)
m1.pred <- xts(m1.f$mean, index(X)[148:183])
m2.pred <- xts(m2.f$mean, index(X)[148:183])
p1 <- as.zoo(m1.pred)
p2 <- as.zoo(m2.pred)
YZ <- as.zoo(X[148:183])
pew <- (1/2)*(p1+p2)

Basados en regresiĂłn

Modelo sin restricciĂłnes


Time series regression with "zoo" data:
Start = 2014-04-01, End = 2017-03-01

Call:
dynlm(formula = YZ ~ p1 + p2)

Residuals:
    Min      1Q  Median      3Q     Max 
-0.1108 -0.0243 -0.0121  0.0224  0.1385 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)  
(Intercept)  0.01804    0.00912    1.98    0.056 .
p1           9.47844    7.86617    1.20    0.237  
p2          -6.47946   10.63232   -0.61    0.546  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.0546 on 33 degrees of freedom
Multiple R-squared:  0.0754,    Adjusted R-squared:  0.0194 
F-statistic: 1.35 on 2 and 33 DF,  p-value: 0.274

Modelo parcialmente restringido


Time series regression with "zoo" data:
Start = 2014-04-01, End = 2017-03-01

Call:
dynlm(formula = YZ ~ 0 + p1 + p2)

Residuals:
     Min       1Q   Median       3Q      Max 
-0.09467 -0.00680  0.00584  0.04043  0.15657 

Coefficients:
   Estimate Std. Error t value Pr(>|t|)
p1     8.45       8.18    1.03     0.31
p2    -5.02      11.05   -0.45     0.65

Residual standard error: 0.0569 on 34 degrees of freedom
Multiple R-squared:  0.0633,    Adjusted R-squared:  0.00823 
F-statistic: 1.15 on 2 and 34 DF,  p-value: 0.329

Modelo restringido


Time series regression with "zoo" data:
Start = 2014-04-01, End = 2017-03-01

Call:
dynlm(formula = YZstar ~ 0 + X1star)

Residuals:
     Min       1Q   Median       3Q      Max 
-0.10329 -0.00632  0.00658  0.04044  0.15657 

Coefficients:
       Estimate Std. Error t value Pr(>|t|)
X1star    -8.83       7.57   -1.17     0.25

Residual standard error: 0.0562 on 35 degrees of freedom
Multiple R-squared:  0.0374,    Adjusted R-squared:  0.00992 
F-statistic: 1.36 on 1 and 35 DF,  p-value: 0.251

Comparaciones de las combinaciones

MAE:

  IPI.ereqw IPI.ercreg1 IPI.ercreg2 IPI.ercreg3 
   0.036633    0.038316    0.037691    0.037295 

En este caso resultan mucho mejor las predicciones combinando con la misma ponderaciĂłn.

Apartado 4

Realiza predicciones fuera de la muestra.

EstimaciĂłn de los modelos con toda la muestra:

Series: Y 
ARIMA(3,0,1) with zero mean     

Coefficients:
         ar1    ar2    ar3    ma1
      -0.327  0.026  0.223  0.388
s.e.   0.208  0.077  0.075  0.207

sigma^2 estimated as 0.00308:  log likelihood=269.8
AIC=-529.59   AICc=-529.25   BIC=-513.57
Series: Y 
ARIMA(3,0,0) with zero mean     

Coefficients:
        ar1    ar2    ar3
      0.040  0.010  0.214
s.e.  0.072  0.073  0.074

sigma^2 estimated as 0.0031:  log likelihood=268.87
AIC=-529.74   AICc=-529.51   BIC=-516.92

Predicciones 12 pasos por delante:

Combinaciones

Tipo de interés a medio plazo

Apartado 1

Divide las muestras de la tarea anterior en la muestra de estimaciĂłn y la muestra de predicciĂłn.

Calcula las predicciones con los modelos ARIMA y obtén las medidas de ajuste de la predicción.

Tenemos 183 observaciones para el tipo de interés a medio plazo, por lo que usaremos 147 observaciones de training y 36 de test.

EstimaciĂłn de modelos

Series: Y 
ARIMA(1,1,0)                    

Coefficients:
        ar1
      0.278
s.e.  0.080

sigma^2 estimated as 0.00244:  log likelihood=232.44
AIC=-460.88   AICc=-460.8   BIC=-454.91
Series: Y 
ARIMA(0,1,1)                    

Coefficients:
        ma1
      0.279
s.e.  0.079

sigma^2 estimated as 0.00244:  log likelihood=232.31
AIC=-460.62   AICc=-460.53   BIC=-454.65

Testing set

Medidas de ajuste de la predicciĂłn

            ME    RMSE     MAE        MPE   MAPE
AR(1) 0.030628 0.22552 0.17602 -0.0309838 12.037
MA(1) 0.030910 0.22556 0.17596 -0.0099777 12.030

Apartado 2

Realiza los contrastes de potencia de predicciĂłn.

Morgan-Granger-Newbold Test


t test of coefficients:

             Estimate Std. Error t value Pr(>|t|)
(Intercept)   -0.0450     0.0655   -0.69     0.50
vx          -378.8491   919.7852   -0.41     0.68


    Breusch-Godfrey test for serial correlation of order up to 24

data:  mgnreg
LM test = 35.7, df = 24, p-value = 0.059


    studentized Breusch-Pagan test

data:  mgnreg
BP = 0.836, df = 1, p-value = 0.36

En este caso el coeficiente \(\beta\) es igual 0, no rechazamos la hipĂłtesis nula y por tanto ambos modelos tienen la misma potencia de predicciĂłn.

Los modelos AR(1) y MA(1) tienen la misma potencia.

Diebold-Mariano Test


    Diebold-Mariano Test

data:  e1e2
DM = -0.824, Forecast horizon = 1, Loss function power = 2, p-value = 0.42
alternative hypothesis: two.sided


    Diebold-Mariano Test

data:  e1e2
DM = -0.824, Forecast horizon = 1, Loss function power = 2, p-value = 0.79
alternative hypothesis: greater


    Diebold-Mariano Test

data:  e1e2
DM = -0.824, Forecast horizon = 1, Loss function power = 2, p-value = 0.21
alternative hypothesis: less

Rechazamos la hipĂłtesis nula de que las potencias de predicciĂłn son iguales.

Confirmamos los resultados obtenidos en el test anterior, el AR(1) es igual de preciso que el MA(1).

Apartado 3

Realiza combinaciones de las predicciones.

Pesos iguales

X <- diff(X)
Y <- diff(Y)
m1 <- Arima(Y, c(1,0,0), include.mean=F)
m2 <- Arima(Y, c(0,0,1), include.mean=F)
m1.f <- forecast.Arima(m1, h=36, fan=T)
m2.f <- forecast.Arima(m2, h=36, fan=T)
m1.pred <- xts(m1.f$mean, index(X)[148:183])
m2.pred <- xts(m2.f$mean, index(X)[148:183])
p1 <- as.zoo(m1.pred)
p2 <- as.zoo(m2.pred)
YZ <- as.zoo(X[148:183])
pew <- (1/2)*(p1+p2)

Basados en regresiĂłn

Modelo sin restricciĂłnes


Time series regression with "zoo" data:
Start = 2014-04-01, End = 2017-03-01

Call:
dynlm(formula = YZ ~ p1 + p2)

Residuals:
    Min      1Q  Median      3Q     Max 
-0.1091 -0.0185 -0.0123  0.0182  0.0831 

Coefficients:
             Estimate Std. Error t value Pr(>|t|)   
(Intercept)  1.85e-02   6.62e-03    2.79   0.0086 **
p1          -2.50e+02   1.85e+02   -1.35   0.1853   
p2           2.28e+02   1.93e+02    1.18   0.2460   
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.0382 on 33 degrees of freedom
Multiple R-squared:  0.0575,    Adjusted R-squared:  0.000333 
F-statistic: 1.01 on 2 and 33 DF,  p-value: 0.377

Modelo parcialmente restringido


Time series regression with "zoo" data:
Start = 2014-04-01, End = 2017-03-01

Call:
dynlm(formula = YZ ~ 0 + p1 + p2)

Residuals:
     Min       1Q   Median       3Q      Max 
-0.09719  0.00000  0.00543  0.03232  0.10155 

Coefficients:
   Estimate Std. Error t value Pr(>|t|)
p1     -134        197   -0.68     0.50
p2      136        208    0.65     0.52

Residual standard error: 0.0418 on 34 degrees of freedom
Multiple R-squared:  0.0134,    Adjusted R-squared:  -0.0447 
F-statistic: 0.231 on 2 and 34 DF,  p-value: 0.795

Modelo restringido


Time series regression with "zoo" data:
Start = 2014-04-01, End = 2017-03-01

Call:
dynlm(formula = YZstar ~ 0 + X1star)

Residuals:
     Min       1Q   Median       3Q      Max 
-0.09720  0.00001  0.00543  0.03232  0.10155 

Coefficients:
       Estimate Std. Error t value Pr(>|t|)
X1star      135        194    0.69     0.49

Residual standard error: 0.0412 on 35 degrees of freedom
Multiple R-squared:  0.0136,    Adjusted R-squared:  -0.0146 
F-statistic: 0.482 on 1 and 35 DF,  p-value: 0.492

Comparaciones de las combinaciones

MAE:

  IPI.ereqw IPI.ercreg1 IPI.ercreg2 IPI.ercreg3 
   0.025157    0.027277    0.025640    0.025657 

En este caso resultan mejor las predicciones con pesos iguales.

Apartado 4

Realiza predicciones fuera de la muestra.

EstimaciĂłn de los modelos con toda la muestra:

Series: Y 
ARIMA(1,0,0) with zero mean     

Coefficients:
        ar1
      0.316
s.e.  0.071

sigma^2 estimated as 0.00221:  log likelihood=298.74
AIC=-593.49   AICc=-593.42   BIC=-587.08
Series: Y 
ARIMA(0,0,1) with zero mean     

Coefficients:
        ma1
      0.307
s.e.  0.069

sigma^2 estimated as 0.00222:  log likelihood=298.18
AIC=-592.36   AICc=-592.29   BIC=-585.95

Predicciones 12 pasos por delante:

Combinaciones

Tipo de interés a corto plazo

Apartado 1

Divide las muestras de la tarea anterior en la muestra de estimaciĂłn y la muestra de predicciĂłn.

Calcula las predicciones con los modelos ARIMA y obtén las medidas de ajuste de la predicción.

Tenemos 183 observaciones para el tipo de interés a corto plazo, por lo que usaremos 147 observaciones de training y 36 de test.

EstimaciĂłn de modelos

Series: Y 
ARIMA(3,1,2)                    

Coefficients:
        ar1     ar2    ar3     ma1    ma2
      0.781  -1.105  0.506  -0.426  1.000
s.e.  0.072   0.034  0.074   0.020  0.038

sigma^2 estimated as 0.00183:  log likelihood=251.75
AIC=-491.5   AICc=-490.89   BIC=-473.59
Series: Y 
ARIMA(1,1,0)                    

Coefficients:
        ar1
      0.376
s.e.  0.077

sigma^2 estimated as 0.00213:  log likelihood=242.19
AIC=-480.38   AICc=-480.3   BIC=-474.41

Testing set

Medidas de ajuste de la predicciĂłn

                 ME    RMSE     MAE      MPE   MAPE
ARMA(3,2)  0.017104 0.16754 0.12742 -0.91091 13.150
AR(1)     -0.007070 0.16667 0.13251 -3.64492 14.079

Apartado 2

Realiza los contrastes de potencia de predicciĂłn.

Morgan-Granger-Newbold Test


t test of coefficients:

            Estimate Std. Error t value Pr(>|t|)  
(Intercept)  -0.0284     0.1313   -0.22    0.830  
vx            1.5910     0.7608    2.09    0.044 *
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1


    Breusch-Godfrey test for serial correlation of order up to 24

data:  mgnreg
LM test = 35.8, df = 24, p-value = 0.058


    studentized Breusch-Pagan test

data:  mgnreg
BP = 0.000217, df = 1, p-value = 0.99

En este caso el coeficiente \(\beta\) es distinto de 0, con un p-valor de 0.044 rechazamos la hipĂłtesis nula y por tanto los modelos tienen distinta potencia de predicciĂłn.

En este caso los modelos ARMA(3,2) y AR(1) tienen distinta potencia.

Diebold-Mariano Test


    Diebold-Mariano Test

data:  e1e2
DM = 0.211, Forecast horizon = 1, Loss function power = 2, p-value = 0.83
alternative hypothesis: two.sided


    Diebold-Mariano Test

data:  e1e2
DM = 0.211, Forecast horizon = 1, Loss function power = 2, p-value = 0.42
alternative hypothesis: greater


    Diebold-Mariano Test

data:  e1e2
DM = 0.211, Forecast horizon = 1, Loss function power = 2, p-value = 0.58
alternative hypothesis: less

Rechazamos la hipĂłtesis nula de que las potencias de predicciĂłn son iguales.

En este caso los resultados obtenidos son contrarios al test anterior, el ARMA(3,2) es igual de preciso que el AR(1).

El nivel de significaciĂłn del test anterior se encontraba muy al lĂ­mite de no rechazar la hipĂłtesis nula y por tanto haremos caso al test de Diebold-Mariano.

Apartado 3

Realiza combinaciones de las predicciones.

Pesos iguales

X <- diff(X)
Y <- diff(Y)
m1 <- Arima(Y, c(3,0,2), include.mean=F)
m2 <- Arima(Y, c(1,0,0), include.mean=F)
m1.f <- forecast.Arima(m1, h=36, fan=T)
m2.f <- forecast.Arima(m2, h=36, fan=T)
m1.pred <- xts(m1.f$mean, index(X)[148:183])
m2.pred <- xts(m2.f$mean, index(X)[148:183])
p1 <- as.zoo(m1.pred)
p2 <- as.zoo(m2.pred)
YZ <- as.zoo(X[148:183])
pew <- (1/2)*(p1+p2)

Basados en regresiĂłn

Modelo sin restricciĂłnes


Time series regression with "zoo" data:
Start = 2014-04-01, End = 2017-03-01

Call:
dynlm(formula = YZ ~ p1 + p2)

Residuals:
     Min       1Q   Median       3Q      Max 
-0.06672 -0.01875 -0.00078  0.02089  0.08794 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)  
(Intercept)  0.01285    0.00568    2.26     0.03 *
p1          -0.94283    0.75854   -1.24     0.22  
p2           4.14293    3.72113    1.11     0.27  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.033 on 33 degrees of freedom
Multiple R-squared:  0.0518,    Adjusted R-squared:  -0.00566 
F-statistic: 0.902 on 2 and 33 DF,  p-value: 0.416

Modelo parcialmente restringido


Time series regression with "zoo" data:
Start = 2014-04-01, End = 2017-03-01

Call:
dynlm(formula = YZ ~ 0 + p1 + p2)

Residuals:
     Min       1Q   Median       3Q      Max 
-0.05484 -0.00586  0.01024  0.03374  0.10076 

Coefficients:
   Estimate Std. Error t value Pr(>|t|)
p1   -0.939      0.803   -1.17     0.25
p2    2.401      3.855    0.62     0.54

Residual standard error: 0.035 on 34 degrees of freedom
Multiple R-squared:  0.0387,    Adjusted R-squared:  -0.0178 
F-statistic: 0.684 on 2 and 34 DF,  p-value: 0.511

Modelo restringido


Time series regression with "zoo" data:
Start = 2014-04-01, End = 2017-03-01

Call:
dynlm(formula = YZstar ~ 0 + X1star)

Residuals:
     Min       1Q   Median       3Q      Max 
-0.05537 -0.00544  0.01050  0.03366  0.10041 

Coefficients:
       Estimate Std. Error t value Pr(>|t|)  
X1star    1.896      0.726    2.61    0.013 *
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.0345 on 35 degrees of freedom
Multiple R-squared:  0.163, Adjusted R-squared:  0.139 
F-statistic: 6.83 on 1 and 35 DF,  p-value: 0.0131

Comparaciones de las combinaciones

MAE:

  IPI.ereqw IPI.ercreg1 IPI.ercreg2 IPI.ercreg3 
   0.029439    0.024777    0.026131    0.026159 

En este caso resultan mejor las predicciones con la combinacion sin restricciones y constante (Reg. 1).

Apartado 4

Realiza predicciones fuera de la muestra.

EstimaciĂłn de los modelos con toda la muestra:

Series: Y 
ARIMA(3,0,2) with zero mean     

Coefficients:
        ar1     ar2    ar3     ma1    ma2
      0.785  -1.097  0.523  -0.383  0.921
s.e.  0.119   0.049  0.067   0.137  0.067

sigma^2 estimated as 0.00169:  log likelihood=323.64
AIC=-635.29   AICc=-634.81   BIC=-616.06
Series: Y 
ARIMA(1,0,0) with zero mean     

Coefficients:
        ar1
      0.404
s.e.  0.068

sigma^2 estimated as 0.00187:  log likelihood=313.86
AIC=-623.73   AICc=-623.66   BIC=-617.32

Predicciones 12 pasos por delante:

Combinaciones

Diferencial de tipo de interes a largo plazo

Apartado 1

Divide las muestras de la tarea anterior en la muestra de estimaciĂłn y la muestra de predicciĂłn.

Calcula las predicciones con los modelos ARIMA y obtén las medidas de ajuste de la predicción.

Tenemos 183 observaciones para el diferencial del tipo de interés a largo plazo, por lo que usaremos 147 observaciones de training y 36 de test.

EstimaciĂłn de modelos

Series: Y 
ARIMA(1,1,1)                    

Coefficients:
        ar1     ma1
      0.690  -0.890
s.e.  0.092   0.051

sigma^2 estimated as 0.0193:  log likelihood=81.94
AIC=-157.88   AICc=-157.71   BIC=-148.93
Series: Y 
ARIMA(3,1,0)                    

Coefficients:
         ar1     ar2    ar3
      -0.091  -0.198  0.135
s.e.   0.082   0.082  0.083

sigma^2 estimated as 0.0194:  log likelihood=81.97
AIC=-155.94   AICc=-155.66   BIC=-144.01

Testing set

Medidas de ajuste de la predicciĂłn

               ME    RMSE     MAE    MPE   MAPE
ARMA(1,1) 0.27841 0.50926 0.41640 58.921 126.03
AR(3)     0.22587 0.47958 0.39189 41.892 146.00

Apartado 2

Realiza los contrastes de potencia de predicciĂłn.

Morgan-Granger-Newbold Test


t test of coefficients:

            Estimate Std. Error t value Pr(>|t|)    
(Intercept)   -2.025      0.426   -4.75  3.6e-05 ***
vx            48.154     11.514    4.18  0.00019 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1


    Breusch-Godfrey test for serial correlation of order up to 4

data:  mgnreg
LM test = 25.4, df = 4, p-value = 4.1e-05


    studentized Breusch-Pagan test

data:  mgnreg
BP = 4.68, df = 1, p-value = 0.031

En este caso el coeficiente \(\beta\) es distinto de 0, con un p-valor de 0.00019 rechazamos la hipĂłtesis nula y por tanto los modelos tienen distinta potencia de predicciĂłn.

En este caso los modelos ARMA(1,1) y AR(3) tienen distinta potencia.

Diebold-Mariano Test


    Diebold-Mariano Test

data:  e1e2
DM = 3.86, Forecast horizon = 1, Loss function power = 2, p-value = 0.00046
alternative hypothesis: two.sided


    Diebold-Mariano Test

data:  e1e2
DM = 3.86, Forecast horizon = 1, Loss function power = 2, p-value = 0.00023
alternative hypothesis: greater


    Diebold-Mariano Test

data:  e1e2
DM = 3.86, Forecast horizon = 1, Loss function power = 2, p-value = 1
alternative hypothesis: less

Rechazamos la hipĂłtesis nula de que las potencias de predicciĂłn son iguales.

En este caso el modelo ARMA(1,1) se ajusta mejor que el modelo AR(3)

Apartado 3

Realiza combinaciones de las predicciones.

Pesos iguales

X <- diff(X)
Y <- diff(Y)
m1 <- Arima(Y, c(1,0,1), include.mean=F)
m2 <- Arima(Y, c(3,0,0), include.mean=F)
m1.f <- forecast.Arima(m1, h=36, fan=T)
m2.f <- forecast.Arima(m2, h=36, fan=T)
m1.pred <- xts(m1.f$mean, index(X)[148:183])
m2.pred <- xts(m2.f$mean, index(X)[148:183])
p1 <- as.zoo(m1.pred)
p2 <- as.zoo(m2.pred)
YZ <- as.zoo(X[148:183])
pew <- (1/2)*(p1+p2)

Basados en regresiĂłn

Modelo sin restricciĂłnes


Time series regression with "zoo" data:
Start = 2014-04-01, End = 2017-03-01

Call:
dynlm(formula = YZ ~ p1 + p2)

Residuals:
    Min      1Q  Median      3Q     Max 
-0.4106 -0.0858 -0.0180  0.0939  0.2657 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)  
(Intercept)   0.0460     0.0257    1.79    0.083 .
p1           16.9268     8.3473    2.03    0.051 .
p2            8.6149     9.4460    0.91    0.368  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.142 on 33 degrees of freedom
Multiple R-squared:  0.112, Adjusted R-squared:  0.0585 
F-statistic: 2.09 on 2 and 33 DF,  p-value: 0.14

Modelo parcialmente restringido


Time series regression with "zoo" data:
Start = 2014-04-01, End = 2017-03-01

Call:
dynlm(formula = YZ ~ 0 + p1 + p2)

Residuals:
    Min      1Q  Median      3Q     Max 
-0.4060 -0.0405  0.0257  0.1339  0.3104 

Coefficients:
   Estimate Std. Error t value Pr(>|t|)
p1    11.26       7.97    1.41     0.17
p2     7.97       9.74    0.82     0.42

Residual standard error: 0.147 on 34 degrees of freedom
Multiple R-squared:  0.0588,    Adjusted R-squared:  0.00342 
F-statistic: 1.06 on 2 and 34 DF,  p-value: 0.357

Modelo restringido


Time series regression with "zoo" data:
Start = 2014-04-01, End = 2017-03-01

Call:
dynlm(formula = YZstar ~ 0 + X1star)

Residuals:
    Min      1Q  Median      3Q     Max 
-0.5092 -0.0373  0.0213  0.1202  0.3091 

Coefficients:
       Estimate Std. Error t value Pr(>|t|)
X1star    -2.50       5.05   -0.49     0.62

Residual standard error: 0.148 on 35 degrees of freedom
Multiple R-squared:  0.00693,   Adjusted R-squared:  -0.0214 
F-statistic: 0.244 on 1 and 35 DF,  p-value: 0.624

Comparaciones de las combinaciones

MAE:

  IPI.ereqw IPI.ercreg1 IPI.ercreg2 IPI.ercreg3 
    0.10264     0.10686     0.10669     0.10163 

En este caso resultan mejor las predicciones con la regresion restringida (Reg. 3).

Apartado 4

Realiza predicciones fuera de la muestra.

EstimaciĂłn de los modelos con toda la muestra:

Series: Y 
ARIMA(1,0,1) with zero mean     

Coefficients:
        ar1     ma1
      0.676  -0.825
s.e.  0.131   0.098

sigma^2 estimated as 0.0201:  log likelihood=98.16
AIC=-190.32   AICc=-190.18   BIC=-180.7
Series: Y 
ARIMA(3,0,0) with zero mean     

Coefficients:
         ar1     ar2    ar3
      -0.100  -0.142  0.102
s.e.   0.074   0.075  0.075

sigma^2 estimated as 0.0202:  log likelihood=98.54
AIC=-189.07   AICc=-188.84   BIC=-176.25

Predicciones 12 pasos por delante:

Combinaciones

Diferencial de tipo de interes a medio plazo

Al calcular esta serie obtuvimos ruido blanco y por tanto no contamos con ningĂșn modelo arima.

LS0tDQp0aXRsZTogIkVqZXJjaWNpb3MgZGUgbW9kZWxvcyBBUklNQSAyIg0KYXV0aG9yOiAiQXJ0aWVsIFBhbG9tYXIgQ29sbCINCmRhdGU6ICIxMi8wNS8yMDE3Ig0Kb3V0cHV0Og0KICBodG1sX25vdGVib29rOg0KICAgIHRvYzogeWVzDQogIGh0bWxfZG9jdW1lbnQ6DQogICAgdG9jOiB5ZXMNCi0tLQ0KDQpgYGB7ciBsZWN0dXJhIGRlIHNlcmllcywgaW5jbHVkZT1GQUxTRX0NCmxpYnJhcnkocXVhbnRtb2QpDQpsaWJyYXJ5KGZvcmVjYXN0KQ0KbGlicmFyeShkeWdyYXBocykNCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkodHNvdXRsaWVycykNCmxpYnJhcnkoem9vKQ0KbGlicmFyeShkeW5sbSkNCmxpYnJhcnkobG10ZXN0KQ0KbGlicmFyeShzYW5kd2ljaCkNCmxpYnJhcnkocGxvdGx5KQ0KDQpnZXRTeW1ib2xzKCJQUklOVE8wMk1YUTY2MVMiLCBzcmM9IkZSRUQiKQ0KZ2V0U3ltYm9scygiSVJMVFNUMDFNWE0xNTZOIiwgc3JjPSJGUkVEIikNCmdldFN5bWJvbHMoIklSM1RJQjAxTVhNMTU2TiIsIHNyYz0iRlJFRCIpDQpnZXRTeW1ib2xzKCJJUlNUQ0kwMU1YTTE1Nk4iLCBzcmM9IkZSRUQiKQ0KDQpteCA8LSBQUklOVE8wMk1YUTY2MVNbJzE5ODgtMDEtMDEvJ10gI0luZHVzdHJpYWwgUHJvZHVjdGlvbiBJbmRleCBNZXhpY28NCmx0IDwtIElSTFRTVDAxTVhNMTU2TlsnMjAwMi0wMS0wMS8nXSAjTG9uZyB0ZXJtIA0KbXQgPC0gSVIzVElCMDFNWE0xNTZOWycyMDAyLTAxLTAxLyddICNNZWRpdW0gdGVybQ0Kc3QgPC0gSVJTVENJMDFNWE0xNTZOWycyMDAyLTAxLTAxLyddICNTaG9ydCB0ZXJtDQpkbHQgPC0gbHQtc3QNCmRtdCA8LSBtdC1zdA0KYGBgDQoNCiPDjW5kaWNlIGRlIFByb2R1Y2Npw7NuIEluZHVzdHJpYWwNCg0KIyNBcGFydGFkbyAxDQoNCkRpdmlkZSBsYXMgbXVlc3RyYXMgZGUgbGEgdGFyZWEgYW50ZXJpb3IgZW4gbGEgbXVlc3RyYSBkZSBlc3RpbWFjacOzbiB5IGxhIG11ZXN0cmEgZGUgcHJlZGljY2nDs24uDQoNCkNhbGN1bGEgbGFzIHByZWRpY2Npb25lcyBjb24gbG9zIG1vZGVsb3MgQVJJTUEgeSBvYnTDqW4gbGFzIG1lZGlkYXMgZGUgYWp1c3RlIGRlIGxhIHByZWRpY2Npw7NuLg0KDQpgYGB7ciwgZWNobz1GQUxTRX0NClggPC0gbXgNClkgPC0gbXhbMTo5Ml0NCmBgYA0KDQpUZW5lbW9zIDExNiBvYnNlcnZhY2lvbmVzIHBhcmEgZWwgaW5kaWNlIGRlIHByb2R1Y2Npw7NuIGluZHVzdHJpYWwsIHBvciBsbyBxdWUgdXNhcmVtb3MgOTIgb2JzZXJ2YWNpb25lcyBkZSB0cmFpbmluZyB5IDI0IGRlIHRlc3QuDQoNCioqRXN0aW1hY2nDs24gZGUgbW9kZWxvcyoqDQoNCmBgYHtyLCBlY2hvPUZBTFNFfQ0KbTEgPC0gQXJpbWEoWSwgYygwLDEsNCksIGluY2x1ZGUubWVhbj1GKQ0KbTENCm0xLmZpdCA8LSBmaXR0ZWQuQXJpbWEobTEpDQptMS5maXQgPC0geHRzKG0xLmZpdCwgaW5kZXgoWSkpDQptMS5kYXRhIDwtIG1lcmdlKFgsIG0xLmZpdCkNCm5hbWVzKG0xLmRhdGEpIDwtIGMoIkFjdHVhbCIsICJGaXQiKQ0KZHlncmFwaChtMS5kYXRhLCBtYWluPSJNQSg0KSIpDQpgYGANCg0KYGBge3IsIGVjaG89RkFMU0V9DQptMiA8LSBBcmltYShZLCBjKDEsMSwzKSwgaW5jbHVkZS5tZWFuPUYpDQptMg0KbTIuZml0IDwtIGZpdHRlZC5BcmltYShtMikNCm0yLmZpdCA8LSB4dHMobTIuZml0LCBpbmRleChZKSkNCm0yLmRhdGEgPC0gbWVyZ2UoWCwgbTIuZml0KQ0KbmFtZXMobTIuZGF0YSkgPC0gYygiQWN0dWFsIiwgIkZpdCIpDQpkeWdyYXBoKG0yLmRhdGEsIG1haW49IkFSTUEoMSwzKSIpDQpgYGANCg0KKipUZXN0aW5nIHNldCoqDQoNCmBgYHtyLCBlY2hvPUZBTFNFfQ0KbTEuZiA8LSBmb3JlY2FzdC5BcmltYShtMSwgaD0yNCwgZmFuPVQpDQphdXRvcGxvdChtMS5mKQ0KDQptMi5mIDwtIGZvcmVjYXN0LkFyaW1hKG0yLCBoPTI0LCBmYW49VCkNCmF1dG9wbG90KG0yLmYpDQpgYGANCg0KKipNZWRpZGFzIGRlIGFqdXN0ZSBkZSBsYSBwcmVkaWNjacOzbioqDQoNCmBgYHtyLCBlY2hvPUZBTFNFfQ0KQSA8LSBtYXRyaXgobnJvdz0yLCBuY29sPTUpDQpjb2xuYW1lcyhBKSA8LSBjb2xuYW1lcyhhY2N1cmFjeShtMS5mJG1lYW4sIFhbOTM6MTE2XSkpDQpBWzEsXSA8LSBhY2N1cmFjeShtMS5mJG1lYW4sIFhbOTM6MTE2XSkNCkFbMixdIDwtIGFjY3VyYWN5KG0yLmYkbWVhbiwgWFs5MzoxMTZdKQ0Kcm93bmFtZXMoQSkgPC0gYygiTUEoNCkiLCAiQVJNQSgxLDMpIikNCkENCmBgYA0KDQpBIHByaW9yaSBwYXJlY2UgcXVlIGVsIG1vZGVsbyBBUk1BKDEsMykgaGFjZSBtZWpvcmVzIHByZWRpY2Npb25lcyB5YSBxdWUgc3UgTUFFLCBSTUFTRSB5IE1BUEUgc29uIG3DoXMgYmFqb3MsIGVuIGVsIHNpZ3VpZW50ZSBhcGFydGFkbyBzZSByZWFsaXphbiBsb3MgY29udHJhc3Rlcy4NCg0KIyNBcGFydGFkbyAyDQoNClJlYWxpemEgbG9zIGNvbnRyYXN0ZXMgZGUgcG90ZW5jaWEgZGUgcHJlZGljY2nDs24uDQoNCmBgYHtyLCBlY2hvPUZBTFNFfQ0KbTEucHJlZCA8LSB4dHMobTEuZiRtZWFuLCBpbmRleChYKVs5MzoxMTZdKQ0KZTEgPC0gWFs5MzoxMTZdIC0gbTEucHJlZA0KDQptMi5wcmVkIDwtIHh0cyhtMi5mJG1lYW4sIGluZGV4KFgpWzkzOjExNl0pDQplMiA8LSBYWzkzOjExNl0gLSBtMi5wcmVkDQpgYGANCg0KKipNb3JnYW4tR3Jhbmdlci1OZXdib2xkIFRlc3QqKg0KDQpgYGB7ciwgZWNobz1GQUxTRX0NCnZ5IDwtIGUxICsgZTINCnZ4IDwtIGUxIC0gZTINCg0KdnkgPC0gYXMuem9vKHZ5KQ0KdnggPC0gYXMuem9vKHZ4KQ0KbWducmVnIDwtIGR5bmxtKHZ5IH52eCkNCg0KY29lZnRlc3QobWducmVnLCB2Y292PXZjb3ZIQUMpDQoNCmJndGVzdChtZ25yZWcsIG9yZGVyPTQpDQoNCmJwdGVzdChtZ25yZWcpDQpgYGANCg0KVmVtb3MgY29tbyBlbCBjb2VmaWNpZW50ZSAkXGJldGEkIGVzIGlndWFsIGEgMCB5IHBvciB0YW50byBubyByZWNoYXphbW9zIGxhIGhpcMOzdGVzaXMgbnVsYSBkZSBxdWUgYW1ib3MgbW9kZWxvcyB0aWVuZW4gbGEgbWlzbWEgcG90ZW5jaWEgZGUgcHJlZGljY2nDs24uDQoNCioqRGllYm9sZC1NYXJpYW5vIFRlc3QqKg0KDQpgYGB7ciwgZWNobz1GQUxTRX0NCmRtLnRlc3QoZTEsIGUyLCBhbHRlcm5hdGl2ZT0idHdvLnNpZGVkIiwgaD0xLCBwb3dlcj0yKQ0KDQpkbS50ZXN0KGUxLCBlMiwgYWx0ZXJuYXRpdmU9ImdyZWF0ZXIiLCBoPTEsIHBvd2VyPTIpDQoNCmRtLnRlc3QoZTEsIGUyLCBhbHRlcm5hdGl2ZT0ibGVzcyIsIGg9MSwgcG93ZXI9MikNCmBgYA0KDQpObyByZWNoYXphbW9zIGxhIGhpcMOzdGVzaXMgbnVsYSBkZSBxdWUgbGFzIHBvdGVuY2lhcyBkZSBwcmVkaWNjacOzbiBzb24gaWd1YWxlcywgeSB0YW1wb2NvIHF1ZSBuaW5nw7puIG1vZGVsbyBlcyBtZWpvciBxdWUgZWwgb3Ryby4NCg0KRWwgbW9kZWxvIEFSTUEoMSwzKSBlcyBpZ3VhbCBkZSBwcmVjaXNvIHF1ZSBlbCBtb2RlbG8gTUEoNCkuDQoNCiMjQXBhcnRhZG8gMw0KDQpSZWFsaXphIGNvbWJpbmFjaW9uZXMgZGUgbGFzIHByZWRpY2Npb25lcy4NCg0KKipQZXNvcyBpZ3VhbGVzKioNCg0KYGBge3J9DQpYIDwtIGRpZmYoWCkNClkgPC0gZGlmZihZKQ0KbTEgPC0gQXJpbWEoWSwgYygwLDAsNCksIGluY2x1ZGUubWVhbj1GKQ0KbTIgPC0gQXJpbWEoWSwgYygxLDAsMyksIGluY2x1ZGUubWVhbj1GKQ0KbTEuZiA8LSBmb3JlY2FzdC5BcmltYShtMSwgaD0yNCwgZmFuPVQpDQptMi5mIDwtIGZvcmVjYXN0LkFyaW1hKG0yLCBoPTI0LCBmYW49VCkNCm0xLnByZWQgPC0geHRzKG0xLmYkbWVhbiwgaW5kZXgoWClbOTM6MTE2XSkNCm0yLnByZWQgPC0geHRzKG0yLmYkbWVhbiwgaW5kZXgoWClbOTM6MTE2XSkNCnAxIDwtIGFzLnpvbyhtMS5wcmVkKQ0KcDIgPC0gYXMuem9vKG0yLnByZWQpDQpZWiA8LSBhcy56b28oWFs5MzoxMTZdKQ0KDQpwZXcgPC0gKDEvMikqKHAxK3AyKQ0KYGBgDQoNCioqQmFzYWRvcyBlbiByZWdyZXNpw7NuKioNCg0KKioqTW9kZWxvIHNpbiByZXN0cmljY2nDs25lcyoqKg0KYGBge3IsIGVjaG89RkFMU0V9DQojTW9kZWxvIHNpbiByZXN0cmljY2nDs25lcw0KY3JlZzEgPC0gZHlubG0oWVogfiBwMSArIHAyKQ0Kc3VtbWFyeShjcmVnMSkNCnloYXQxIDwtIGNyZWcxJGZpdA0KYGBgDQoqKipNb2RlbG8gcGFyY2lhbG1lbnRlIHJlc3RyaW5naWRvKioqDQpgYGB7ciwgZWNobz1GQUxTRX0NCiNNb2RlbG8gcGFyY2lhbG1lbnRlIHJlc3RyaW5naWRvDQpjcmVnMiA8LSBkeW5sbShZWiB+IDAgKyBwMSArIHAyKQ0Kc3VtbWFyeShjcmVnMikNCnloYXQyIDwtIGNyZWcyJGZpdA0KYGBgDQoNCioqKk1vZGVsbyByZXN0cmluZ2lkbyoqKg0KYGBge3IsIGVjaG89RkFMU0V9DQojTW9kZWxvIHJlc3RyaW5naWRvDQpZWnN0YXIgPC0gWVogLSBwMQ0KWDFzdGFyIDwtIHAyIC0gcDENCmNyZWczIDwtIGR5bmxtKFlac3RhciB+IDAgKyBYMXN0YXIpDQpzdW1tYXJ5KGNyZWczKQ0KeWhhdDMgPC0gY3JlZzMkZml0ICsgcDENCmBgYA0KDQoNCioqQ29tcGFyYWNpb25lcyBkZSBsYXMgY29tYmluYWNpb25lcyoqDQoNCk1BRToNCmBgYHtyLCBlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KZXJlcXcgPC0gWVogLSBwZXcNCmVyY3JlZzEgPC0gWVogLSB5aGF0MQ0KZXJjcmVnMiA8LSBZWiAtIHloYXQyDQplcmNyZWczIDwtIFlaIC0geWhhdDMNCg0KbXlNQUUgPC0gZnVuY3Rpb24oeCkNCnsNCiAgcmV0dXJuKG1lYW4oYWJzKHgpKSkNCn0NCg0KWE0gPC0gY2JpbmQoZXJlcXcsIGVyY3JlZzEsIGVyY3JlZzIsIGVyY3JlZzMpDQpjb21iTUFFIDwtIGFwcGx5KFhNLCAyLCBteU1BRSkNCm5hbWVzKGNvbWJNQUUpIDwtIGMoIklQSS5lcmVxdyIsIklQSS5lcmNyZWcxIiwiSVBJLmVyY3JlZzIiLCJJUEkuZXJjcmVnMyIpDQpjb21iTUFFDQoNClpNIDwtIG1lcmdlKFlaLCBwZXcsIHloYXQxLCB5aGF0MiwgeWhhdDMpDQpuYW1lcyhaTSkgPC0gYygiQWN0dWFsIiwgIkVxLiBXIiwgIlJlZy4gMSIsICJSZWcuIDIiLCAiUmVnLiAzIikNCnAgPC0gYXV0b3Bsb3QoWk0sIGZhY2V0cyA9IE5VTEwpDQpnZ3Bsb3RseShwKQ0KYGBgDQoNCkVuIGVzdGUgY2FzbyBzb24gbWVqb3IgbGFzIHByZWRpY2Npb25lcyBjb24gZWwgbW9kZWxvIHNpbiByZXN0cmluZ2lyIHkgY29uIGNvbnN0YW50ZSAoUmVnLiAxKS4NCg0KIyNBcGFydGFkbyA0DQoNClJlYWxpemEgcHJlZGljY2lvbmVzIGZ1ZXJhIGRlIGxhIG11ZXN0cmEuDQoNCkVzdGltYWNpw7NuIGRlIGxvcyBtb2RlbG9zIGNvbiB0b2RhIGxhIG11ZXN0cmE6DQoNCmBgYHtyLCBlY2hvPUZBTFNFfQ0KWCA8LSBkaWZmKG14KQ0KWSA8LSBYWy0xXQ0KDQptMW8gPC0gQXJpbWEoWSwgYygwLDAsNCksIGluY2x1ZGUubWVhbiA9IEYpDQptMW8NCg0KbTJvIDwtIEFyaW1hKFksIGMoMSwwLDMpLCBpbmNsdWRlLm1lYW4gPSBGKQ0KbTJvDQpgYGANCg0KUHJlZGljY2lvbmVzIDggcGFzb3MgcG9yIGRlbGFudGU6DQoNCmBgYHtyLCBlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KbTFvLmYgPC0gZm9yZWNhc3QuQXJpbWEobTFvLCBoPTgsIGxldmVsPTAuOTUpDQphdXRvcGxvdChtMW8uZikNCg0KbTJvLmYgPC0gZm9yZWNhc3QuQXJpbWEobTJvLCBoPTgsIGxldmVsPTAuOTUpDQphdXRvcGxvdChtMm8uZikNCg0KbmRhdGVzIDwtIHNlcS5EYXRlKGZyb209YXMuRGF0ZSgiMjAxNy0wMS0wMSIpLCBsZW5ndGgub3V0ID0gOCwgYnkgPSAicXVhcnRlciIpDQpwMSA8LSB6b28obTFvLmYkbWVhbiwgbmRhdGVzKQ0KcDIgPC0gem9vKG0yby5mJG1lYW4sIG5kYXRlcykNCnBtIDwtIG1lcmdlKHAxLCBwMikNCm5hbWVzKHBtKSA8LSBjKCJNQSg0KSIsICJBUk1BKDEsMykiKQ0KcCA8LSBhdXRvcGxvdChwbSwgZmFjZXRzPU5VTEwpDQpnZ3Bsb3RseShwKQ0KYGBgDQoNCioqQ29tYmluYWNpb25lcyoqDQoNCmBgYHtyLCBlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KI1Blc29zIGlndWFsZXMNCm5lcXcgPC0gKDEvMikqKHAxK3AyKQ0KDQojU2luIHJlc3RyaWNjaW9uZXMNCncgPC0gY3JlZzEkY29lZmZpY2llbnRzDQpueWhhdDEgPC0gd1sxXSArIHdbMl0qcDEgKyB3WzNdKnAyDQoNCiNTaW4gY29uc3RhbnRlDQp3IDwtIGNyZWcyJGNvZWZmaWNpZW50cw0KbnloYXQyIDwtIHdbMV0qcDEgKyB3WzJdKnAyDQoNCiNSZXN0cmluZ2lkbw0Kd3N0YXIgPC0gY3JlZzMkY29lZmZpY2llbnRzDQp3IDwtIGFycmF5KGRpbT0yKQ0Kd1syXSA8LSB3c3Rhcg0Kd1sxXSA8LSAxIC0gc3VtKHdzdGFyKQ0KDQpueWhhdDMgPC0gd1sxXSpwMSArIHdbMl0qcDINCg0KDQp4bSA8LSBtZXJnZShuZXF3LCBueWhhdDEsIG55aGF0MiwgbnloYXQzKQ0KcCA8LSBhdXRvcGxvdCh4bSwgZmFjZXRzPU5VTEwpDQpnZ3Bsb3RseShwKQ0KDQpvcHRpb25zKGRpZ2l0cyA9IDUpDQphdXggPC0gYXMuZGF0YS5mcmFtZShtZXJnZShwbSwgeG0pKQ0KYXV4DQpgYGANCg0KI1RpcG8gZGUgaW50ZXLDqXMgYSBsYXJnbyBwbGF6bw0KDQojI0FwYXJ0YWRvIDENCg0KRGl2aWRlIGxhcyBtdWVzdHJhcyBkZSBsYSB0YXJlYSBhbnRlcmlvciBlbiBsYSBtdWVzdHJhIGRlIGVzdGltYWNpw7NuIHkgbGEgbXVlc3RyYSBkZSBwcmVkaWNjacOzbi4NCg0KQ2FsY3VsYSBsYXMgcHJlZGljY2lvbmVzIGNvbiBsb3MgbW9kZWxvcyBBUklNQSB5IG9idMOpbiBsYXMgbWVkaWRhcyBkZSBhanVzdGUgZGUgbGEgcHJlZGljY2nDs24uDQoNCmBgYHtyLCBlY2hvPUZBTFNFfQ0KWCA8LSBsb2cobHQpDQpZIDwtIFhbMToxNDddDQpgYGANCg0KVGVuZW1vcyAxODMgb2JzZXJ2YWNpb25lcyBwYXJhIGVsIHRpcG8gZGUgaW50ZXLDqXMgYSBsYXJnbyBwbGF6bywgcG9yIGxvIHF1ZSB1c2FyZW1vcyAxNDcgb2JzZXJ2YWNpb25lcyBkZSB0cmFpbmluZyB5IDM2IGRlIHRlc3QuDQoNCioqRXN0aW1hY2nDs24gZGUgbW9kZWxvcyoqDQoNCmBgYHtyLCBlY2hvPUZBTFNFfQ0KbTEgPC0gQXJpbWEoWSwgYygzLDEsMSksIGluY2x1ZGUubWVhbj1GKQ0KbTENCm0xLmZpdCA8LSBmaXR0ZWQuQXJpbWEobTEpDQptMS5maXQgPC0geHRzKG0xLmZpdCwgaW5kZXgoWSkpDQptMS5kYXRhIDwtIG1lcmdlKFgsIG0xLmZpdCkNCm5hbWVzKG0xLmRhdGEpIDwtIGMoIkFjdHVhbCIsICJGaXQiKQ0KZHlncmFwaChtMS5kYXRhLCBtYWluPSJBUk1BKDMsMSkiKQ0KYGBgDQoNCmBgYHtyLCBlY2hvPUZBTFNFfQ0KbTIgPC0gQXJpbWEoWSwgYygzLDEsMCksIGluY2x1ZGUubWVhbj1GKQ0KbTINCm0yLmZpdCA8LSBmaXR0ZWQuQXJpbWEobTIpDQptMi5maXQgPC0geHRzKG0yLmZpdCwgaW5kZXgoWSkpDQptMi5kYXRhIDwtIG1lcmdlKFgsIG0yLmZpdCkNCm5hbWVzKG0yLmRhdGEpIDwtIGMoIkFjdHVhbCIsICJGaXQiKQ0KZHlncmFwaChtMi5kYXRhLCBtYWluPSJBUigzKSIpDQpgYGANCg0KKipUZXN0aW5nIHNldCoqDQoNCmBgYHtyLCBlY2hvPUZBTFNFfQ0KbTEuZiA8LSBmb3JlY2FzdC5BcmltYShtMSwgaD0zNiwgZmFuPVQpDQphdXRvcGxvdChtMS5mKQ0KDQptMi5mIDwtIGZvcmVjYXN0LkFyaW1hKG0yLCBoPTM2LCBmYW49VCkNCmF1dG9wbG90KG0yLmYpDQpgYGANCg0KKipNZWRpZGFzIGRlIGFqdXN0ZSBkZSBsYSBwcmVkaWNjacOzbioqDQoNCmBgYHtyLCBlY2hvPUZBTFNFfQ0KQSA8LSBtYXRyaXgobnJvdz0yLCBuY29sPTUpDQpjb2xuYW1lcyhBKSA8LSBjb2xuYW1lcyhhY2N1cmFjeShtMS5mJG1lYW4sIFhbMTQ4OjE4M10pKQ0KQVsxLF0gPC0gYWNjdXJhY3kobTEuZiRtZWFuLCBYWzE0ODoxODNdKQ0KQVsyLF0gPC0gYWNjdXJhY3kobTIuZiRtZWFuLCBYWzE0ODoxODNdKQ0Kcm93bmFtZXMoQSkgPC0gYygiQVJNQSgzLDEpIiwgIkFSKDMpIikNCkENCmBgYA0KDQoNCiMjQXBhcnRhZG8gMg0KDQpSZWFsaXphIGxvcyBjb250cmFzdGVzIGRlIHBvdGVuY2lhIGRlIHByZWRpY2Npw7NuLg0KDQpgYGB7ciwgZWNobz1GQUxTRX0NCm0xLnByZWQgPC0geHRzKG0xLmYkbWVhbiwgaW5kZXgoWClbMTQ4OjE4M10pDQplMSA8LSBYWzE0ODoxODNdIC0gbTEucHJlZA0KDQptMi5wcmVkIDwtIHh0cyhtMi5mJG1lYW4sIGluZGV4KFgpWzE0ODoxODNdKQ0KZTIgPC0gWFsxNDg6MTgzXSAtIG0yLnByZWQNCmBgYA0KDQoqKk1vcmdhbi1HcmFuZ2VyLU5ld2JvbGQgVGVzdCoqDQoNCmBgYHtyLCBlY2hvPUZBTFNFfQ0KdnkgPC0gZTEgKyBlMg0KdnggPC0gZTEgLSBlMg0KDQp2eSA8LSBhcy56b28odnkpDQp2eCA8LSBhcy56b28odngpDQptZ25yZWcgPC0gZHlubG0odnkgfnZ4KQ0KDQpjb2VmdGVzdChtZ25yZWcsIHZjb3Y9dmNvdkhBQykNCg0KYmd0ZXN0KG1nbnJlZywgb3JkZXI9NCkNCg0KYnB0ZXN0KG1nbnJlZykNCmBgYA0KDQpWZW1vcyBjb21vIGVsIGNvZWZpY2llbnRlICRcYmV0YSQgZXMgY2xhcmFtZW50ZSBkaXN0aW50byBkZSAwIHkgcG9yIHRhbnRvIHJlY2hhemFtb3MgbGEgaGlww7N0ZXNpcyBudWxhIGRlIHF1ZSBhbWJvcyBtb2RlbG9zIHRpZW5lbiBsYSBtaXNtYSBwb3RlbmNpYSBkZSBwcmVkaWNjacOzbi4NCg0KKipEaWVib2xkLU1hcmlhbm8gVGVzdCoqDQoNCmBgYHtyLCBlY2hvPUZBTFNFfQ0KZG0udGVzdChlMSwgZTIsIGFsdGVybmF0aXZlPSJ0d28uc2lkZWQiLCBoPTEsIHBvd2VyPTIpDQoNCmRtLnRlc3QoZTEsIGUyLCBhbHRlcm5hdGl2ZT0iZ3JlYXRlciIsIGg9MSwgcG93ZXI9MikNCg0KZG0udGVzdChlMSwgZTIsIGFsdGVybmF0aXZlPSJsZXNzIiwgaD0xLCBwb3dlcj0yKQ0KYGBgDQoNCk5vIHJlY2hhemFtb3MgbGEgaGlww7N0ZXNpcyBudWxhIGRlIHF1ZSBsYXMgcG90ZW5jaWFzIGRlIHByZWRpY2Npw7NuIHNvbiBpZ3VhbGVzLCBhdW5xdWUgZWwgcC12YWxvciBhc29jaWFkbyBhIGxhcyBkb3MgY29sYXMgZXMgMCwwODkgeSBzZSBxdWVkYSBtdXkgY2VyY2EgZGVsIDAuMDUgZGUgbml2ZWwgZGUgc2lnbmlmaWNhY2nDs24uDQoNClNpIG5vcyBmaWphbW9zIHNvbGFtZW50ZSBlbiB1bmEgY29sYSB0ZW5lbW9zIHF1ZSBlbCBtb2RlbG8gQVJNQSgzLDEpIGVzIG3DoXMgcHJlY2lzbyBxdWUgZWwgQVIoMykgY29uIHVuIHAtdmFsb3IgZGUgMCwwNDQuDQoNCiMjQXBhcnRhZG8gMw0KDQpSZWFsaXphIGNvbWJpbmFjaW9uZXMgZGUgbGFzIHByZWRpY2Npb25lcy4NCg0KKipQZXNvcyBpZ3VhbGVzKioNCg0KYGBge3J9DQpYIDwtIGRpZmYoWCkNClkgPC0gZGlmZihZKQ0KbTEgPC0gQXJpbWEoWSwgYygzLDAsMSksIGluY2x1ZGUubWVhbj1GKQ0KbTIgPC0gQXJpbWEoWSwgYygzLDAsMCksIGluY2x1ZGUubWVhbj1GKQ0KbTEuZiA8LSBmb3JlY2FzdC5BcmltYShtMSwgaD0zNiwgZmFuPVQpDQptMi5mIDwtIGZvcmVjYXN0LkFyaW1hKG0yLCBoPTM2LCBmYW49VCkNCm0xLnByZWQgPC0geHRzKG0xLmYkbWVhbiwgaW5kZXgoWClbMTQ4OjE4M10pDQptMi5wcmVkIDwtIHh0cyhtMi5mJG1lYW4sIGluZGV4KFgpWzE0ODoxODNdKQ0KcDEgPC0gYXMuem9vKG0xLnByZWQpDQpwMiA8LSBhcy56b28obTIucHJlZCkNCllaIDwtIGFzLnpvbyhYWzE0ODoxODNdKQ0KDQpwZXcgPC0gKDEvMikqKHAxK3AyKQ0KYGBgDQoNCioqQmFzYWRvcyBlbiByZWdyZXNpw7NuKioNCg0KKioqTW9kZWxvIHNpbiByZXN0cmljY2nDs25lcyoqKg0KYGBge3IsIGVjaG89RkFMU0V9DQojTW9kZWxvIHNpbiByZXN0cmljY2nDs25lcw0KY3JlZzEgPC0gZHlubG0oWVogfiBwMSArIHAyKQ0Kc3VtbWFyeShjcmVnMSkNCnloYXQxIDwtIGNyZWcxJGZpdA0KYGBgDQoqKipNb2RlbG8gcGFyY2lhbG1lbnRlIHJlc3RyaW5naWRvKioqDQpgYGB7ciwgZWNobz1GQUxTRX0NCiNNb2RlbG8gcGFyY2lhbG1lbnRlIHJlc3RyaW5naWRvDQpjcmVnMiA8LSBkeW5sbShZWiB+IDAgKyBwMSArIHAyKQ0Kc3VtbWFyeShjcmVnMikNCnloYXQyIDwtIGNyZWcyJGZpdA0KYGBgDQoNCioqKk1vZGVsbyByZXN0cmluZ2lkbyoqKg0KYGBge3IsIGVjaG89RkFMU0V9DQojTW9kZWxvIHJlc3RyaW5naWRvDQpZWnN0YXIgPC0gWVogLSBwMQ0KWDFzdGFyIDwtIHAyIC0gcDENCmNyZWczIDwtIGR5bmxtKFlac3RhciB+IDAgKyBYMXN0YXIpDQpzdW1tYXJ5KGNyZWczKQ0KeWhhdDMgPC0gY3JlZzMkZml0ICsgcDENCmBgYA0KDQoNCioqQ29tcGFyYWNpb25lcyBkZSBsYXMgY29tYmluYWNpb25lcyoqDQoNCk1BRToNCmBgYHtyLCBlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KZXJlcXcgPC0gWVogLSBwZXcNCmVyY3JlZzEgPC0gWVogLSB5aGF0MQ0KZXJjcmVnMiA8LSBZWiAtIHloYXQyDQplcmNyZWczIDwtIFlaIC0geWhhdDMNCg0KbXlNQUUgPC0gZnVuY3Rpb24oeCkNCnsNCiAgcmV0dXJuKG1lYW4oYWJzKHgpKSkNCn0NCg0KWE0gPC0gY2JpbmQoZXJlcXcsIGVyY3JlZzEsIGVyY3JlZzIsIGVyY3JlZzMpDQpjb21iTUFFIDwtIGFwcGx5KFhNLCAyLCBteU1BRSkNCm5hbWVzKGNvbWJNQUUpIDwtIGMoIklQSS5lcmVxdyIsIklQSS5lcmNyZWcxIiwiSVBJLmVyY3JlZzIiLCJJUEkuZXJjcmVnMyIpDQpjb21iTUFFDQoNClpNIDwtIG1lcmdlKFlaLCBwZXcsIHloYXQxLCB5aGF0MiwgeWhhdDMpDQpuYW1lcyhaTSkgPC0gYygiQWN0dWFsIiwgIkVxLiBXIiwgIlJlZy4gMSIsICJSZWcuIDIiLCAiUmVnLiAzIikNCnAgPC0gYXV0b3Bsb3QoWk0sIGZhY2V0cyA9IE5VTEwpDQpnZ3Bsb3RseShwKQ0KYGBgDQoNCkVuIGVzdGUgY2FzbyByZXN1bHRhbiBtdWNobyBtZWpvciBsYXMgcHJlZGljY2lvbmVzIGNvbWJpbmFuZG8gY29uIGxhIG1pc21hIHBvbmRlcmFjacOzbi4NCg0KIyNBcGFydGFkbyA0DQoNClJlYWxpemEgcHJlZGljY2lvbmVzIGZ1ZXJhIGRlIGxhIG11ZXN0cmEuDQoNCkVzdGltYWNpw7NuIGRlIGxvcyBtb2RlbG9zIGNvbiB0b2RhIGxhIG11ZXN0cmE6DQoNCmBgYHtyLCBlY2hvPUZBTFNFfQ0KWCA8LSBkaWZmKGxvZyhsdCkpDQpZIDwtIFhbLTFdDQoNCm0xbyA8LSBBcmltYShZLCBjKDMsMCwxKSwgaW5jbHVkZS5tZWFuID0gRikNCm0xbw0KDQptMm8gPC0gQXJpbWEoWSwgYygzLDAsMCksIGluY2x1ZGUubWVhbiA9IEYpDQptMm8NCmBgYA0KDQpQcmVkaWNjaW9uZXMgMTIgcGFzb3MgcG9yIGRlbGFudGU6DQoNCmBgYHtyLCBlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KbTFvLmYgPC0gZm9yZWNhc3QuQXJpbWEobTFvLCBoPTEyLCBsZXZlbD0wLjk1KQ0KYXV0b3Bsb3QobTFvLmYpDQoNCm0yby5mIDwtIGZvcmVjYXN0LkFyaW1hKG0ybywgaD0xMiwgbGV2ZWw9MC45NSkNCmF1dG9wbG90KG0yby5mKQ0KDQpuZGF0ZXMgPC0gc2VxLkRhdGUoZnJvbT1hcy5EYXRlKCIyMDE3LTA0LTAxIiksIGxlbmd0aC5vdXQgPSAxMiwgYnkgPSAibW9udGgiKQ0KcDEgPC0gem9vKG0xby5mJG1lYW4sIG5kYXRlcykNCnAyIDwtIHpvbyhtMm8uZiRtZWFuLCBuZGF0ZXMpDQpwbSA8LSBtZXJnZShwMSwgcDIpDQpuYW1lcyhwbSkgPC0gYygiQVJNQSgzLDEpIiwgIkFSKDMpIikNCnAgPC0gYXV0b3Bsb3QocG0sIGZhY2V0cz1OVUxMKQ0KZ2dwbG90bHkocCkNCmBgYA0KDQoqKkNvbWJpbmFjaW9uZXMqKg0KDQpgYGB7ciwgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRX0NCiNQZXNvcyBpZ3VhbGVzDQpuZXF3IDwtICgxLzIpKihwMStwMikNCg0KI1NpbiByZXN0cmljY2lvbmVzDQp3IDwtIGNyZWcxJGNvZWZmaWNpZW50cw0KbnloYXQxIDwtIHdbMV0gKyB3WzJdKnAxICsgd1szXSpwMg0KDQojU2luIGNvbnN0YW50ZQ0KdyA8LSBjcmVnMiRjb2VmZmljaWVudHMNCm55aGF0MiA8LSB3WzFdKnAxICsgd1syXSpwMg0KDQojUmVzdHJpbmdpZG8NCndzdGFyIDwtIGNyZWczJGNvZWZmaWNpZW50cw0KdyA8LSBhcnJheShkaW09MikNCndbMl0gPC0gd3N0YXINCndbMV0gPC0gMSAtIHN1bSh3c3RhcikNCg0KbnloYXQzIDwtIHdbMV0qcDEgKyB3WzJdKnAyDQoNCg0KeG0gPC0gbWVyZ2UobmVxdywgbnloYXQxLCBueWhhdDIsIG55aGF0MykNCnAgPC0gYXV0b3Bsb3QoeG0sIGZhY2V0cz1OVUxMKQ0KZ2dwbG90bHkocCkNCg0Kb3B0aW9ucyhkaWdpdHMgPSA1KQ0KYXV4IDwtIGFzLmRhdGEuZnJhbWUobWVyZ2UocG0sIHhtKSkNCmF1eA0KYGBgDQoNCiNUaXBvIGRlIGludGVyw6lzIGEgbWVkaW8gcGxhem8NCg0KIyNBcGFydGFkbyAxDQoNCkRpdmlkZSBsYXMgbXVlc3RyYXMgZGUgbGEgdGFyZWEgYW50ZXJpb3IgZW4gbGEgbXVlc3RyYSBkZSBlc3RpbWFjacOzbiB5IGxhIG11ZXN0cmEgZGUgcHJlZGljY2nDs24uDQoNCkNhbGN1bGEgbGFzIHByZWRpY2Npb25lcyBjb24gbG9zIG1vZGVsb3MgQVJJTUEgeSBvYnTDqW4gbGFzIG1lZGlkYXMgZGUgYWp1c3RlIGRlIGxhIHByZWRpY2Npw7NuLg0KDQpgYGB7ciwgZWNobz1GQUxTRX0NClggPC0gbG9nKG10KQ0KWSA8LSBYWzE6MTQ3XQ0KYGBgDQoNClRlbmVtb3MgMTgzIG9ic2VydmFjaW9uZXMgcGFyYSBlbCB0aXBvIGRlIGludGVyw6lzIGEgbWVkaW8gcGxhem8sIHBvciBsbyBxdWUgdXNhcmVtb3MgMTQ3IG9ic2VydmFjaW9uZXMgZGUgdHJhaW5pbmcgeSAzNiBkZSB0ZXN0Lg0KDQoqKkVzdGltYWNpw7NuIGRlIG1vZGVsb3MqKg0KDQpgYGB7ciwgZWNobz1GQUxTRX0NCm0xIDwtIEFyaW1hKFksIGMoMSwxLDApLCBpbmNsdWRlLm1lYW49RikNCm0xDQptMS5maXQgPC0gZml0dGVkLkFyaW1hKG0xKQ0KbTEuZml0IDwtIHh0cyhtMS5maXQsIGluZGV4KFkpKQ0KbTEuZGF0YSA8LSBtZXJnZShYLCBtMS5maXQpDQpuYW1lcyhtMS5kYXRhKSA8LSBjKCJBY3R1YWwiLCAiRml0IikNCmR5Z3JhcGgobTEuZGF0YSwgbWFpbj0iQVIoMSkiKQ0KYGBgDQoNCmBgYHtyLCBlY2hvPUZBTFNFfQ0KbTIgPC0gQXJpbWEoWSwgYygwLDEsMSksIGluY2x1ZGUubWVhbj1GKQ0KbTINCm0yLmZpdCA8LSBmaXR0ZWQuQXJpbWEobTIpDQptMi5maXQgPC0geHRzKG0yLmZpdCwgaW5kZXgoWSkpDQptMi5kYXRhIDwtIG1lcmdlKFgsIG0yLmZpdCkNCm5hbWVzKG0yLmRhdGEpIDwtIGMoIkFjdHVhbCIsICJGaXQiKQ0KZHlncmFwaChtMi5kYXRhLCBtYWluPSJNQSgxKSIpDQpgYGANCg0KKipUZXN0aW5nIHNldCoqDQoNCmBgYHtyLCBlY2hvPUZBTFNFfQ0KbTEuZiA8LSBmb3JlY2FzdC5BcmltYShtMSwgaD0zNiwgZmFuPVQpDQphdXRvcGxvdChtMS5mKQ0KDQptMi5mIDwtIGZvcmVjYXN0LkFyaW1hKG0yLCBoPTM2LCBmYW49VCkNCmF1dG9wbG90KG0yLmYpDQpgYGANCg0KKipNZWRpZGFzIGRlIGFqdXN0ZSBkZSBsYSBwcmVkaWNjacOzbioqDQoNCmBgYHtyLCBlY2hvPUZBTFNFfQ0KQSA8LSBtYXRyaXgobnJvdz0yLCBuY29sPTUpDQpjb2xuYW1lcyhBKSA8LSBjb2xuYW1lcyhhY2N1cmFjeShtMS5mJG1lYW4sIFhbMTQ4OjE4M10pKQ0KQVsxLF0gPC0gYWNjdXJhY3kobTEuZiRtZWFuLCBYWzE0ODoxODNdKQ0KQVsyLF0gPC0gYWNjdXJhY3kobTIuZiRtZWFuLCBYWzE0ODoxODNdKQ0Kcm93bmFtZXMoQSkgPC0gYygiQVIoMSkiLCAiTUEoMSkiKQ0KQQ0KYGBgDQoNCg0KIyNBcGFydGFkbyAyDQoNClJlYWxpemEgbG9zIGNvbnRyYXN0ZXMgZGUgcG90ZW5jaWEgZGUgcHJlZGljY2nDs24uDQoNCmBgYHtyLCBlY2hvPUZBTFNFfQ0KbTEucHJlZCA8LSB4dHMobTEuZiRtZWFuLCBpbmRleChYKVsxNDg6MTgzXSkNCmUxIDwtIFhbMTQ4OjE4M10gLSBtMS5wcmVkDQoNCm0yLnByZWQgPC0geHRzKG0yLmYkbWVhbiwgaW5kZXgoWClbMTQ4OjE4M10pDQplMiA8LSBYWzE0ODoxODNdIC0gbTIucHJlZA0KYGBgDQoNCioqTW9yZ2FuLUdyYW5nZXItTmV3Ym9sZCBUZXN0KioNCg0KYGBge3IsIGVjaG89RkFMU0V9DQp2eSA8LSBlMSArIGUyDQp2eCA8LSBlMSAtIGUyDQoNCnZ5IDwtIGFzLnpvbyh2eSkNCnZ4IDwtIGFzLnpvbyh2eCkNCm1nbnJlZyA8LSBkeW5sbSh2eSB+dngpDQoNCmNvZWZ0ZXN0KG1nbnJlZywgdmNvdj12Y292SEFDKQ0KDQpiZ3Rlc3QobWducmVnLCBvcmRlcj0yNCkNCg0KYnB0ZXN0KG1nbnJlZykNCmBgYA0KDQpFbiBlc3RlIGNhc28gZWwgY29lZmljaWVudGUgJFxiZXRhJCBlcyBpZ3VhbCAwLCBubyByZWNoYXphbW9zIGxhIGhpcMOzdGVzaXMgbnVsYSB5IHBvciB0YW50byBhbWJvcyBtb2RlbG9zIHRpZW5lbiBsYSBtaXNtYSBwb3RlbmNpYSBkZSBwcmVkaWNjacOzbi4NCg0KTG9zIG1vZGVsb3MgQVIoMSkgeSBNQSgxKSB0aWVuZW4gbGEgbWlzbWEgcG90ZW5jaWEuDQoNCioqRGllYm9sZC1NYXJpYW5vIFRlc3QqKg0KDQpgYGB7ciwgZWNobz1GQUxTRX0NCmRtLnRlc3QoZTEsIGUyLCBhbHRlcm5hdGl2ZT0idHdvLnNpZGVkIiwgaD0xLCBwb3dlcj0yKQ0KDQpkbS50ZXN0KGUxLCBlMiwgYWx0ZXJuYXRpdmU9ImdyZWF0ZXIiLCBoPTEsIHBvd2VyPTIpDQoNCmRtLnRlc3QoZTEsIGUyLCBhbHRlcm5hdGl2ZT0ibGVzcyIsIGg9MSwgcG93ZXI9MikNCmBgYA0KDQpSZWNoYXphbW9zIGxhIGhpcMOzdGVzaXMgbnVsYSBkZSBxdWUgbGFzIHBvdGVuY2lhcyBkZSBwcmVkaWNjacOzbiBzb24gaWd1YWxlcy4NCg0KQ29uZmlybWFtb3MgbG9zIHJlc3VsdGFkb3Mgb2J0ZW5pZG9zIGVuIGVsIHRlc3QgYW50ZXJpb3IsIGVsIEFSKDEpIGVzIGlndWFsIGRlIHByZWNpc28gcXVlIGVsIE1BKDEpLg0KDQojI0FwYXJ0YWRvIDMNCg0KUmVhbGl6YSBjb21iaW5hY2lvbmVzIGRlIGxhcyBwcmVkaWNjaW9uZXMuDQoNCioqUGVzb3MgaWd1YWxlcyoqDQoNCmBgYHtyfQ0KWCA8LSBkaWZmKFgpDQpZIDwtIGRpZmYoWSkNCm0xIDwtIEFyaW1hKFksIGMoMSwwLDApLCBpbmNsdWRlLm1lYW49RikNCm0yIDwtIEFyaW1hKFksIGMoMCwwLDEpLCBpbmNsdWRlLm1lYW49RikNCm0xLmYgPC0gZm9yZWNhc3QuQXJpbWEobTEsIGg9MzYsIGZhbj1UKQ0KbTIuZiA8LSBmb3JlY2FzdC5BcmltYShtMiwgaD0zNiwgZmFuPVQpDQptMS5wcmVkIDwtIHh0cyhtMS5mJG1lYW4sIGluZGV4KFgpWzE0ODoxODNdKQ0KbTIucHJlZCA8LSB4dHMobTIuZiRtZWFuLCBpbmRleChYKVsxNDg6MTgzXSkNCnAxIDwtIGFzLnpvbyhtMS5wcmVkKQ0KcDIgPC0gYXMuem9vKG0yLnByZWQpDQpZWiA8LSBhcy56b28oWFsxNDg6MTgzXSkNCg0KcGV3IDwtICgxLzIpKihwMStwMikNCmBgYA0KDQoqKkJhc2Fkb3MgZW4gcmVncmVzacOzbioqDQoNCioqKk1vZGVsbyBzaW4gcmVzdHJpY2Npw7NuZXMqKioNCmBgYHtyLCBlY2hvPUZBTFNFfQ0KI01vZGVsbyBzaW4gcmVzdHJpY2Npw7NuZXMNCmNyZWcxIDwtIGR5bmxtKFlaIH4gcDEgKyBwMikNCnN1bW1hcnkoY3JlZzEpDQp5aGF0MSA8LSBjcmVnMSRmaXQNCmBgYA0KKioqTW9kZWxvIHBhcmNpYWxtZW50ZSByZXN0cmluZ2lkbyoqKg0KYGBge3IsIGVjaG89RkFMU0V9DQojTW9kZWxvIHBhcmNpYWxtZW50ZSByZXN0cmluZ2lkbw0KY3JlZzIgPC0gZHlubG0oWVogfiAwICsgcDEgKyBwMikNCnN1bW1hcnkoY3JlZzIpDQp5aGF0MiA8LSBjcmVnMiRmaXQNCmBgYA0KDQoqKipNb2RlbG8gcmVzdHJpbmdpZG8qKioNCmBgYHtyLCBlY2hvPUZBTFNFfQ0KI01vZGVsbyByZXN0cmluZ2lkbw0KWVpzdGFyIDwtIFlaIC0gcDENClgxc3RhciA8LSBwMiAtIHAxDQpjcmVnMyA8LSBkeW5sbShZWnN0YXIgfiAwICsgWDFzdGFyKQ0Kc3VtbWFyeShjcmVnMykNCnloYXQzIDwtIGNyZWczJGZpdCArIHAxDQpgYGANCg0KDQoqKkNvbXBhcmFjaW9uZXMgZGUgbGFzIGNvbWJpbmFjaW9uZXMqKg0KDQpNQUU6DQpgYGB7ciwgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRX0NCmVyZXF3IDwtIFlaIC0gcGV3DQplcmNyZWcxIDwtIFlaIC0geWhhdDENCmVyY3JlZzIgPC0gWVogLSB5aGF0Mg0KZXJjcmVnMyA8LSBZWiAtIHloYXQzDQoNCm15TUFFIDwtIGZ1bmN0aW9uKHgpDQp7DQogIHJldHVybihtZWFuKGFicyh4KSkpDQp9DQoNClhNIDwtIGNiaW5kKGVyZXF3LCBlcmNyZWcxLCBlcmNyZWcyLCBlcmNyZWczKQ0KY29tYk1BRSA8LSBhcHBseShYTSwgMiwgbXlNQUUpDQpuYW1lcyhjb21iTUFFKSA8LSBjKCJJUEkuZXJlcXciLCJJUEkuZXJjcmVnMSIsIklQSS5lcmNyZWcyIiwiSVBJLmVyY3JlZzMiKQ0KY29tYk1BRQ0KDQpaTSA8LSBtZXJnZShZWiwgcGV3LCB5aGF0MSwgeWhhdDIsIHloYXQzKQ0KbmFtZXMoWk0pIDwtIGMoIkFjdHVhbCIsICJFcS4gVyIsICJSZWcuIDEiLCAiUmVnLiAyIiwgIlJlZy4gMyIpDQpwIDwtIGF1dG9wbG90KFpNLCBmYWNldHMgPSBOVUxMKQ0KZ2dwbG90bHkocCkNCmBgYA0KDQpFbiBlc3RlIGNhc28gcmVzdWx0YW4gbWVqb3IgbGFzIHByZWRpY2Npb25lcyBjb24gcGVzb3MgaWd1YWxlcy4NCg0KIyNBcGFydGFkbyA0DQoNClJlYWxpemEgcHJlZGljY2lvbmVzIGZ1ZXJhIGRlIGxhIG11ZXN0cmEuDQoNCkVzdGltYWNpw7NuIGRlIGxvcyBtb2RlbG9zIGNvbiB0b2RhIGxhIG11ZXN0cmE6DQoNCmBgYHtyLCBlY2hvPUZBTFNFfQ0KWCA8LSBkaWZmKGxvZyhtdCkpDQpZIDwtIFhbLTFdDQoNCm0xbyA8LSBBcmltYShZLCBjKDEsMCwwKSwgaW5jbHVkZS5tZWFuID0gRikNCm0xbw0KDQptMm8gPC0gQXJpbWEoWSwgYygwLDAsMSksIGluY2x1ZGUubWVhbiA9IEYpDQptMm8NCmBgYA0KDQpQcmVkaWNjaW9uZXMgMTIgcGFzb3MgcG9yIGRlbGFudGU6DQoNCmBgYHtyLCBlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KbTFvLmYgPC0gZm9yZWNhc3QuQXJpbWEobTFvLCBoPTEyLCBsZXZlbD0wLjk1KQ0KYXV0b3Bsb3QobTFvLmYpDQoNCm0yby5mIDwtIGZvcmVjYXN0LkFyaW1hKG0ybywgaD0xMiwgbGV2ZWw9MC45NSkNCmF1dG9wbG90KG0yby5mKQ0KDQpuZGF0ZXMgPC0gc2VxLkRhdGUoZnJvbT1hcy5EYXRlKCIyMDE3LTA0LTAxIiksIGxlbmd0aC5vdXQgPSAxMiwgYnkgPSAibW9udGgiKQ0KcDEgPC0gem9vKG0xby5mJG1lYW4sIG5kYXRlcykNCnAyIDwtIHpvbyhtMm8uZiRtZWFuLCBuZGF0ZXMpDQpwbSA8LSBtZXJnZShwMSwgcDIpDQpuYW1lcyhwbSkgPC0gYygiQVIoMSkiLCAiTUEoMSkiKQ0KcCA8LSBhdXRvcGxvdChwbSwgZmFjZXRzPU5VTEwpDQpnZ3Bsb3RseShwKQ0KYGBgDQoNCioqQ29tYmluYWNpb25lcyoqDQoNCmBgYHtyLCBlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KI1Blc29zIGlndWFsZXMNCm5lcXcgPC0gKDEvMikqKHAxK3AyKQ0KDQojU2luIHJlc3RyaWNjaW9uZXMNCncgPC0gY3JlZzEkY29lZmZpY2llbnRzDQpueWhhdDEgPC0gd1sxXSArIHdbMl0qcDEgKyB3WzNdKnAyDQoNCiNTaW4gY29uc3RhbnRlDQp3IDwtIGNyZWcyJGNvZWZmaWNpZW50cw0KbnloYXQyIDwtIHdbMV0qcDEgKyB3WzJdKnAyDQoNCiNSZXN0cmluZ2lkbw0Kd3N0YXIgPC0gY3JlZzMkY29lZmZpY2llbnRzDQp3IDwtIGFycmF5KGRpbT0yKQ0Kd1syXSA8LSB3c3Rhcg0Kd1sxXSA8LSAxIC0gc3VtKHdzdGFyKQ0KDQpueWhhdDMgPC0gd1sxXSpwMSArIHdbMl0qcDINCg0KDQp4bSA8LSBtZXJnZShuZXF3LCBueWhhdDEsIG55aGF0MiwgbnloYXQzKQ0KcCA8LSBhdXRvcGxvdCh4bSwgZmFjZXRzPU5VTEwpDQpnZ3Bsb3RseShwKQ0KDQpvcHRpb25zKGRpZ2l0cyA9IDUpDQphdXggPC0gYXMuZGF0YS5mcmFtZShtZXJnZShwbSwgeG0pKQ0KYXV4DQpgYGANCg0KI1RpcG8gZGUgaW50ZXLDqXMgYSBjb3J0byBwbGF6bw0KDQojI0FwYXJ0YWRvIDENCg0KRGl2aWRlIGxhcyBtdWVzdHJhcyBkZSBsYSB0YXJlYSBhbnRlcmlvciBlbiBsYSBtdWVzdHJhIGRlIGVzdGltYWNpw7NuIHkgbGEgbXVlc3RyYSBkZSBwcmVkaWNjacOzbi4NCg0KQ2FsY3VsYSBsYXMgcHJlZGljY2lvbmVzIGNvbiBsb3MgbW9kZWxvcyBBUklNQSB5IG9idMOpbiBsYXMgbWVkaWRhcyBkZSBhanVzdGUgZGUgbGEgcHJlZGljY2nDs24uDQoNCmBgYHtyLCBlY2hvPUZBTFNFfQ0KWCA8LSBsb2coc3QpDQpZIDwtIFhbMToxNDddDQpgYGANCg0KVGVuZW1vcyAxODMgb2JzZXJ2YWNpb25lcyBwYXJhIGVsIHRpcG8gZGUgaW50ZXLDqXMgYSBjb3J0byBwbGF6bywgcG9yIGxvIHF1ZSB1c2FyZW1vcyAxNDcgb2JzZXJ2YWNpb25lcyBkZSB0cmFpbmluZyB5IDM2IGRlIHRlc3QuDQoNCioqRXN0aW1hY2nDs24gZGUgbW9kZWxvcyoqDQoNCmBgYHtyLCBlY2hvPUZBTFNFfQ0KbTEgPC0gQXJpbWEoWSwgYygzLDEsMiksIGluY2x1ZGUubWVhbj1GKQ0KbTENCm0xLmZpdCA8LSBmaXR0ZWQuQXJpbWEobTEpDQptMS5maXQgPC0geHRzKG0xLmZpdCwgaW5kZXgoWSkpDQptMS5kYXRhIDwtIG1lcmdlKFgsIG0xLmZpdCkNCm5hbWVzKG0xLmRhdGEpIDwtIGMoIkFjdHVhbCIsICJGaXQiKQ0KZHlncmFwaChtMS5kYXRhLCBtYWluPSJBUk1BKDMsMikiKQ0KYGBgDQoNCmBgYHtyLCBlY2hvPUZBTFNFfQ0KbTIgPC0gQXJpbWEoWSwgYygxLDEsMCksIGluY2x1ZGUubWVhbj1GKQ0KbTINCm0yLmZpdCA8LSBmaXR0ZWQuQXJpbWEobTIpDQptMi5maXQgPC0geHRzKG0yLmZpdCwgaW5kZXgoWSkpDQptMi5kYXRhIDwtIG1lcmdlKFgsIG0yLmZpdCkNCm5hbWVzKG0yLmRhdGEpIDwtIGMoIkFjdHVhbCIsICJGaXQiKQ0KZHlncmFwaChtMi5kYXRhLCBtYWluPSJBUigxKSIpDQpgYGANCg0KKipUZXN0aW5nIHNldCoqDQoNCmBgYHtyLCBlY2hvPUZBTFNFfQ0KbTEuZiA8LSBmb3JlY2FzdC5BcmltYShtMSwgaD0zNiwgZmFuPVQpDQphdXRvcGxvdChtMS5mKQ0KDQptMi5mIDwtIGZvcmVjYXN0LkFyaW1hKG0yLCBoPTM2LCBmYW49VCkNCmF1dG9wbG90KG0yLmYpDQpgYGANCg0KKipNZWRpZGFzIGRlIGFqdXN0ZSBkZSBsYSBwcmVkaWNjacOzbioqDQoNCmBgYHtyLCBlY2hvPUZBTFNFfQ0KQSA8LSBtYXRyaXgobnJvdz0yLCBuY29sPTUpDQpjb2xuYW1lcyhBKSA8LSBjb2xuYW1lcyhhY2N1cmFjeShtMS5mJG1lYW4sIFhbMTQ4OjE4M10pKQ0KQVsxLF0gPC0gYWNjdXJhY3kobTEuZiRtZWFuLCBYWzE0ODoxODNdKQ0KQVsyLF0gPC0gYWNjdXJhY3kobTIuZiRtZWFuLCBYWzE0ODoxODNdKQ0Kcm93bmFtZXMoQSkgPC0gYygiQVJNQSgzLDIpIiwgIkFSKDEpIikNCkENCmBgYA0KDQoNCiMjQXBhcnRhZG8gMg0KDQpSZWFsaXphIGxvcyBjb250cmFzdGVzIGRlIHBvdGVuY2lhIGRlIHByZWRpY2Npw7NuLg0KDQpgYGB7ciwgZWNobz1GQUxTRX0NCm0xLnByZWQgPC0geHRzKG0xLmYkbWVhbiwgaW5kZXgoWClbMTQ4OjE4M10pDQplMSA8LSBYWzE0ODoxODNdIC0gbTEucHJlZA0KDQptMi5wcmVkIDwtIHh0cyhtMi5mJG1lYW4sIGluZGV4KFgpWzE0ODoxODNdKQ0KZTIgPC0gWFsxNDg6MTgzXSAtIG0yLnByZWQNCmBgYA0KDQoqKk1vcmdhbi1HcmFuZ2VyLU5ld2JvbGQgVGVzdCoqDQoNCmBgYHtyLCBlY2hvPUZBTFNFfQ0KdnkgPC0gZTEgKyBlMg0KdnggPC0gZTEgLSBlMg0KDQp2eSA8LSBhcy56b28odnkpDQp2eCA8LSBhcy56b28odngpDQptZ25yZWcgPC0gZHlubG0odnkgfnZ4KQ0KDQpjb2VmdGVzdChtZ25yZWcsIHZjb3Y9dmNvdkhBQykNCg0KYmd0ZXN0KG1nbnJlZywgb3JkZXI9MjQpDQoNCmJwdGVzdChtZ25yZWcpDQpgYGANCg0KRW4gZXN0ZSBjYXNvIGVsIGNvZWZpY2llbnRlICRcYmV0YSQgZXMgZGlzdGludG8gZGUgMCwgY29uIHVuIHAtdmFsb3IgZGUgMC4wNDQgcmVjaGF6YW1vcyBsYSBoaXDDs3Rlc2lzIG51bGEgeSBwb3IgdGFudG8gbG9zIG1vZGVsb3MgdGllbmVuIGRpc3RpbnRhIHBvdGVuY2lhIGRlIHByZWRpY2Npw7NuLg0KDQpFbiBlc3RlIGNhc28gbG9zIG1vZGVsb3MgQVJNQSgzLDIpIHkgQVIoMSkgdGllbmVuIGRpc3RpbnRhIHBvdGVuY2lhLg0KDQoqKkRpZWJvbGQtTWFyaWFubyBUZXN0KioNCg0KYGBge3IsIGVjaG89RkFMU0V9DQpkbS50ZXN0KGUxLCBlMiwgYWx0ZXJuYXRpdmU9InR3by5zaWRlZCIsIGg9MSwgcG93ZXI9MikNCg0KZG0udGVzdChlMSwgZTIsIGFsdGVybmF0aXZlPSJncmVhdGVyIiwgaD0xLCBwb3dlcj0yKQ0KDQpkbS50ZXN0KGUxLCBlMiwgYWx0ZXJuYXRpdmU9Imxlc3MiLCBoPTEsIHBvd2VyPTIpDQpgYGANCg0KUmVjaGF6YW1vcyBsYSBoaXDDs3Rlc2lzIG51bGEgZGUgcXVlIGxhcyBwb3RlbmNpYXMgZGUgcHJlZGljY2nDs24gc29uIGlndWFsZXMuDQoNCkVuIGVzdGUgY2FzbyBsb3MgcmVzdWx0YWRvcyBvYnRlbmlkb3Mgc29uIGNvbnRyYXJpb3MgYWwgdGVzdCBhbnRlcmlvciwgZWwgQVJNQSgzLDIpIGVzIGlndWFsIGRlIHByZWNpc28gcXVlIGVsIEFSKDEpLg0KDQpFbCBuaXZlbCBkZSBzaWduaWZpY2FjacOzbiBkZWwgdGVzdCBhbnRlcmlvciBzZSBlbmNvbnRyYWJhIG11eSBhbCBsw61taXRlIGRlIG5vIHJlY2hhemFyIGxhIGhpcMOzdGVzaXMgbnVsYSB5IHBvciB0YW50byBoYXJlbW9zIGNhc28gYWwgdGVzdCBkZSBEaWVib2xkLU1hcmlhbm8uDQoNCiMjQXBhcnRhZG8gMw0KDQpSZWFsaXphIGNvbWJpbmFjaW9uZXMgZGUgbGFzIHByZWRpY2Npb25lcy4NCg0KKipQZXNvcyBpZ3VhbGVzKioNCg0KYGBge3J9DQpYIDwtIGRpZmYoWCkNClkgPC0gZGlmZihZKQ0KbTEgPC0gQXJpbWEoWSwgYygzLDAsMiksIGluY2x1ZGUubWVhbj1GKQ0KbTIgPC0gQXJpbWEoWSwgYygxLDAsMCksIGluY2x1ZGUubWVhbj1GKQ0KbTEuZiA8LSBmb3JlY2FzdC5BcmltYShtMSwgaD0zNiwgZmFuPVQpDQptMi5mIDwtIGZvcmVjYXN0LkFyaW1hKG0yLCBoPTM2LCBmYW49VCkNCm0xLnByZWQgPC0geHRzKG0xLmYkbWVhbiwgaW5kZXgoWClbMTQ4OjE4M10pDQptMi5wcmVkIDwtIHh0cyhtMi5mJG1lYW4sIGluZGV4KFgpWzE0ODoxODNdKQ0KcDEgPC0gYXMuem9vKG0xLnByZWQpDQpwMiA8LSBhcy56b28obTIucHJlZCkNCllaIDwtIGFzLnpvbyhYWzE0ODoxODNdKQ0KDQpwZXcgPC0gKDEvMikqKHAxK3AyKQ0KYGBgDQoNCioqQmFzYWRvcyBlbiByZWdyZXNpw7NuKioNCg0KKioqTW9kZWxvIHNpbiByZXN0cmljY2nDs25lcyoqKg0KYGBge3IsIGVjaG89RkFMU0V9DQojTW9kZWxvIHNpbiByZXN0cmljY2nDs25lcw0KY3JlZzEgPC0gZHlubG0oWVogfiBwMSArIHAyKQ0Kc3VtbWFyeShjcmVnMSkNCnloYXQxIDwtIGNyZWcxJGZpdA0KYGBgDQoqKipNb2RlbG8gcGFyY2lhbG1lbnRlIHJlc3RyaW5naWRvKioqDQpgYGB7ciwgZWNobz1GQUxTRX0NCiNNb2RlbG8gcGFyY2lhbG1lbnRlIHJlc3RyaW5naWRvDQpjcmVnMiA8LSBkeW5sbShZWiB+IDAgKyBwMSArIHAyKQ0Kc3VtbWFyeShjcmVnMikNCnloYXQyIDwtIGNyZWcyJGZpdA0KYGBgDQoNCioqKk1vZGVsbyByZXN0cmluZ2lkbyoqKg0KYGBge3IsIGVjaG89RkFMU0V9DQojTW9kZWxvIHJlc3RyaW5naWRvDQpZWnN0YXIgPC0gWVogLSBwMQ0KWDFzdGFyIDwtIHAyIC0gcDENCmNyZWczIDwtIGR5bmxtKFlac3RhciB+IDAgKyBYMXN0YXIpDQpzdW1tYXJ5KGNyZWczKQ0KeWhhdDMgPC0gY3JlZzMkZml0ICsgcDENCmBgYA0KDQoNCioqQ29tcGFyYWNpb25lcyBkZSBsYXMgY29tYmluYWNpb25lcyoqDQoNCk1BRToNCmBgYHtyLCBlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KZXJlcXcgPC0gWVogLSBwZXcNCmVyY3JlZzEgPC0gWVogLSB5aGF0MQ0KZXJjcmVnMiA8LSBZWiAtIHloYXQyDQplcmNyZWczIDwtIFlaIC0geWhhdDMNCg0KbXlNQUUgPC0gZnVuY3Rpb24oeCkNCnsNCiAgcmV0dXJuKG1lYW4oYWJzKHgpKSkNCn0NCg0KWE0gPC0gY2JpbmQoZXJlcXcsIGVyY3JlZzEsIGVyY3JlZzIsIGVyY3JlZzMpDQpjb21iTUFFIDwtIGFwcGx5KFhNLCAyLCBteU1BRSkNCm5hbWVzKGNvbWJNQUUpIDwtIGMoIklQSS5lcmVxdyIsIklQSS5lcmNyZWcxIiwiSVBJLmVyY3JlZzIiLCJJUEkuZXJjcmVnMyIpDQpjb21iTUFFDQoNClpNIDwtIG1lcmdlKFlaLCBwZXcsIHloYXQxLCB5aGF0MiwgeWhhdDMpDQpuYW1lcyhaTSkgPC0gYygiQWN0dWFsIiwgIkVxLiBXIiwgIlJlZy4gMSIsICJSZWcuIDIiLCAiUmVnLiAzIikNCnAgPC0gYXV0b3Bsb3QoWk0sIGZhY2V0cyA9IE5VTEwpDQpnZ3Bsb3RseShwKQ0KYGBgDQoNCkVuIGVzdGUgY2FzbyByZXN1bHRhbiBtZWpvciBsYXMgcHJlZGljY2lvbmVzIGNvbiBsYSBjb21iaW5hY2lvbiBzaW4gcmVzdHJpY2Npb25lcyB5IGNvbnN0YW50ZSAoUmVnLiAxKS4NCg0KIyNBcGFydGFkbyA0DQoNClJlYWxpemEgcHJlZGljY2lvbmVzIGZ1ZXJhIGRlIGxhIG11ZXN0cmEuDQoNCkVzdGltYWNpw7NuIGRlIGxvcyBtb2RlbG9zIGNvbiB0b2RhIGxhIG11ZXN0cmE6DQoNCmBgYHtyLCBlY2hvPUZBTFNFfQ0KWCA8LSBkaWZmKGxvZyhzdCkpDQpZIDwtIFhbLTFdDQoNCm0xbyA8LSBBcmltYShZLCBjKDMsMCwyKSwgaW5jbHVkZS5tZWFuID0gRikNCm0xbw0KDQptMm8gPC0gQXJpbWEoWSwgYygxLDAsMCksIGluY2x1ZGUubWVhbiA9IEYpDQptMm8NCmBgYA0KDQpQcmVkaWNjaW9uZXMgMTIgcGFzb3MgcG9yIGRlbGFudGU6DQoNCmBgYHtyLCBlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KbTFvLmYgPC0gZm9yZWNhc3QuQXJpbWEobTFvLCBoPTEyLCBsZXZlbD0wLjk1KQ0KYXV0b3Bsb3QobTFvLmYpDQoNCm0yby5mIDwtIGZvcmVjYXN0LkFyaW1hKG0ybywgaD0xMiwgbGV2ZWw9MC45NSkNCmF1dG9wbG90KG0yby5mKQ0KDQpuZGF0ZXMgPC0gc2VxLkRhdGUoZnJvbT1hcy5EYXRlKCIyMDE3LTA0LTAxIiksIGxlbmd0aC5vdXQgPSAxMiwgYnkgPSAibW9udGgiKQ0KcDEgPC0gem9vKG0xby5mJG1lYW4sIG5kYXRlcykNCnAyIDwtIHpvbyhtMm8uZiRtZWFuLCBuZGF0ZXMpDQpwbSA8LSBtZXJnZShwMSwgcDIpDQpuYW1lcyhwbSkgPC0gYygiQVJNQSgzLDIpIiwgIkFSKDEpIikNCnAgPC0gYXV0b3Bsb3QocG0sIGZhY2V0cz1OVUxMKQ0KZ2dwbG90bHkocCkNCmBgYA0KDQoqKkNvbWJpbmFjaW9uZXMqKg0KDQpgYGB7ciwgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRX0NCiNQZXNvcyBpZ3VhbGVzDQpuZXF3IDwtICgxLzIpKihwMStwMikNCg0KI1NpbiByZXN0cmljY2lvbmVzDQp3IDwtIGNyZWcxJGNvZWZmaWNpZW50cw0KbnloYXQxIDwtIHdbMV0gKyB3WzJdKnAxICsgd1szXSpwMg0KDQojU2luIGNvbnN0YW50ZQ0KdyA8LSBjcmVnMiRjb2VmZmljaWVudHMNCm55aGF0MiA8LSB3WzFdKnAxICsgd1syXSpwMg0KDQojUmVzdHJpbmdpZG8NCndzdGFyIDwtIGNyZWczJGNvZWZmaWNpZW50cw0KdyA8LSBhcnJheShkaW09MikNCndbMl0gPC0gd3N0YXINCndbMV0gPC0gMSAtIHN1bSh3c3RhcikNCg0KbnloYXQzIDwtIHdbMV0qcDEgKyB3WzJdKnAyDQoNCg0KeG0gPC0gbWVyZ2UobmVxdywgbnloYXQxLCBueWhhdDIsIG55aGF0MykNCnAgPC0gYXV0b3Bsb3QoeG0sIGZhY2V0cz1OVUxMKQ0KZ2dwbG90bHkocCkNCg0Kb3B0aW9ucyhkaWdpdHMgPSA1KQ0KYXV4IDwtIGFzLmRhdGEuZnJhbWUobWVyZ2UocG0sIHhtKSkNCmF1eA0KYGBgDQoNCiNEaWZlcmVuY2lhbCBkZSB0aXBvIGRlIGludGVyZXMgYSBsYXJnbyBwbGF6bw0KDQojI0FwYXJ0YWRvIDENCg0KRGl2aWRlIGxhcyBtdWVzdHJhcyBkZSBsYSB0YXJlYSBhbnRlcmlvciBlbiBsYSBtdWVzdHJhIGRlIGVzdGltYWNpw7NuIHkgbGEgbXVlc3RyYSBkZSBwcmVkaWNjacOzbi4NCg0KQ2FsY3VsYSBsYXMgcHJlZGljY2lvbmVzIGNvbiBsb3MgbW9kZWxvcyBBUklNQSB5IG9idMOpbiBsYXMgbWVkaWRhcyBkZSBhanVzdGUgZGUgbGEgcHJlZGljY2nDs24uDQoNCmBgYHtyLCBlY2hvPUZBTFNFfQ0KWCA8LSBsb2coZGx0KQ0KWSA8LSBYWzE6MTQ3XQ0KYGBgDQoNClRlbmVtb3MgMTgzIG9ic2VydmFjaW9uZXMgcGFyYSBlbCBkaWZlcmVuY2lhbCBkZWwgdGlwbyBkZSBpbnRlcsOpcyBhIGxhcmdvIHBsYXpvLCBwb3IgbG8gcXVlIHVzYXJlbW9zIDE0NyBvYnNlcnZhY2lvbmVzIGRlIHRyYWluaW5nIHkgMzYgZGUgdGVzdC4NCg0KKipFc3RpbWFjacOzbiBkZSBtb2RlbG9zKioNCg0KYGBge3IsIGVjaG89RkFMU0V9DQptMSA8LSBBcmltYShZLCBjKDEsMSwxKSwgaW5jbHVkZS5tZWFuPUYpDQptMQ0KbTEuZml0IDwtIGZpdHRlZC5BcmltYShtMSkNCm0xLmZpdCA8LSB4dHMobTEuZml0LCBpbmRleChZKSkNCm0xLmRhdGEgPC0gbWVyZ2UoWCwgbTEuZml0KQ0KbmFtZXMobTEuZGF0YSkgPC0gYygiQWN0dWFsIiwgIkZpdCIpDQpkeWdyYXBoKG0xLmRhdGEsIG1haW49IkFSTUEoMSwxKSIpDQpgYGANCg0KYGBge3IsIGVjaG89RkFMU0V9DQptMiA8LSBBcmltYShZLCBjKDMsMSwwKSwgaW5jbHVkZS5tZWFuPUYpDQptMg0KbTIuZml0IDwtIGZpdHRlZC5BcmltYShtMikNCm0yLmZpdCA8LSB4dHMobTIuZml0LCBpbmRleChZKSkNCm0yLmRhdGEgPC0gbWVyZ2UoWCwgbTIuZml0KQ0KbmFtZXMobTIuZGF0YSkgPC0gYygiQWN0dWFsIiwgIkZpdCIpDQpkeWdyYXBoKG0yLmRhdGEsIG1haW49IkFSKDMpIikNCmBgYA0KDQoqKlRlc3Rpbmcgc2V0KioNCg0KYGBge3IsIGVjaG89RkFMU0V9DQptMS5mIDwtIGZvcmVjYXN0LkFyaW1hKG0xLCBoPTM2LCBmYW49VCkNCmF1dG9wbG90KG0xLmYpDQoNCm0yLmYgPC0gZm9yZWNhc3QuQXJpbWEobTIsIGg9MzYsIGZhbj1UKQ0KYXV0b3Bsb3QobTIuZikNCmBgYA0KDQoqKk1lZGlkYXMgZGUgYWp1c3RlIGRlIGxhIHByZWRpY2Npw7NuKioNCg0KYGBge3IsIGVjaG89RkFMU0V9DQpBIDwtIG1hdHJpeChucm93PTIsIG5jb2w9NSkNCmNvbG5hbWVzKEEpIDwtIGNvbG5hbWVzKGFjY3VyYWN5KG0xLmYkbWVhbiwgWFsxNDg6MTgzXSkpDQpBWzEsXSA8LSBhY2N1cmFjeShtMS5mJG1lYW4sIFhbMTQ4OjE4M10pDQpBWzIsXSA8LSBhY2N1cmFjeShtMi5mJG1lYW4sIFhbMTQ4OjE4M10pDQpyb3duYW1lcyhBKSA8LSBjKCJBUk1BKDEsMSkiLCAiQVIoMykiKQ0KQQ0KYGBgDQoNCg0KIyNBcGFydGFkbyAyDQoNClJlYWxpemEgbG9zIGNvbnRyYXN0ZXMgZGUgcG90ZW5jaWEgZGUgcHJlZGljY2nDs24uDQoNCmBgYHtyLCBlY2hvPUZBTFNFfQ0KbTEucHJlZCA8LSB4dHMobTEuZiRtZWFuLCBpbmRleChYKVsxNDg6MTgzXSkNCmUxIDwtIFhbMTQ4OjE4M10gLSBtMS5wcmVkDQoNCm0yLnByZWQgPC0geHRzKG0yLmYkbWVhbiwgaW5kZXgoWClbMTQ4OjE4M10pDQplMiA8LSBYWzE0ODoxODNdIC0gbTIucHJlZA0KYGBgDQoNCioqTW9yZ2FuLUdyYW5nZXItTmV3Ym9sZCBUZXN0KioNCg0KYGBge3IsIGVjaG89RkFMU0V9DQp2eSA8LSBlMSArIGUyDQp2eCA8LSBlMSAtIGUyDQoNCnZ5IDwtIGFzLnpvbyh2eSkNCnZ4IDwtIGFzLnpvbyh2eCkNCm1nbnJlZyA8LSBkeW5sbSh2eSB+dngpDQoNCmNvZWZ0ZXN0KG1nbnJlZywgdmNvdj12Y292SEFDKQ0KDQpiZ3Rlc3QobWducmVnLCBvcmRlcj00KQ0KDQpicHRlc3QobWducmVnKQ0KYGBgDQoNCkVuIGVzdGUgY2FzbyBlbCBjb2VmaWNpZW50ZSAkXGJldGEkIGVzIGRpc3RpbnRvIGRlIDAsIGNvbiB1biBwLXZhbG9yIGRlIDAuMDAwMTkgcmVjaGF6YW1vcyBsYSBoaXDDs3Rlc2lzIG51bGEgeSBwb3IgdGFudG8gbG9zIG1vZGVsb3MgdGllbmVuIGRpc3RpbnRhIHBvdGVuY2lhIGRlIHByZWRpY2Npw7NuLg0KDQpFbiBlc3RlIGNhc28gbG9zIG1vZGVsb3MgQVJNQSgxLDEpIHkgQVIoMykgdGllbmVuIGRpc3RpbnRhIHBvdGVuY2lhLg0KDQoqKkRpZWJvbGQtTWFyaWFubyBUZXN0KioNCg0KYGBge3IsIGVjaG89RkFMU0V9DQpkbS50ZXN0KGUxLCBlMiwgYWx0ZXJuYXRpdmU9InR3by5zaWRlZCIsIGg9MSwgcG93ZXI9MikNCg0KZG0udGVzdChlMSwgZTIsIGFsdGVybmF0aXZlPSJncmVhdGVyIiwgaD0xLCBwb3dlcj0yKQ0KDQpkbS50ZXN0KGUxLCBlMiwgYWx0ZXJuYXRpdmU9Imxlc3MiLCBoPTEsIHBvd2VyPTIpDQpgYGANCg0KUmVjaGF6YW1vcyBsYSBoaXDDs3Rlc2lzIG51bGEgZGUgcXVlIGxhcyBwb3RlbmNpYXMgZGUgcHJlZGljY2nDs24gc29uIGlndWFsZXMuDQoNCkVuIGVzdGUgY2FzbyBlbCBtb2RlbG8gQVJNQSgxLDEpIHNlIGFqdXN0YSBtZWpvciBxdWUgZWwgbW9kZWxvIEFSKDMpDQoNCg0KIyNBcGFydGFkbyAzDQoNClJlYWxpemEgY29tYmluYWNpb25lcyBkZSBsYXMgcHJlZGljY2lvbmVzLg0KDQoqKlBlc29zIGlndWFsZXMqKg0KDQpgYGB7cn0NClggPC0gZGlmZihYKQ0KWSA8LSBkaWZmKFkpDQptMSA8LSBBcmltYShZLCBjKDEsMCwxKSwgaW5jbHVkZS5tZWFuPUYpDQptMiA8LSBBcmltYShZLCBjKDMsMCwwKSwgaW5jbHVkZS5tZWFuPUYpDQptMS5mIDwtIGZvcmVjYXN0LkFyaW1hKG0xLCBoPTM2LCBmYW49VCkNCm0yLmYgPC0gZm9yZWNhc3QuQXJpbWEobTIsIGg9MzYsIGZhbj1UKQ0KbTEucHJlZCA8LSB4dHMobTEuZiRtZWFuLCBpbmRleChYKVsxNDg6MTgzXSkNCm0yLnByZWQgPC0geHRzKG0yLmYkbWVhbiwgaW5kZXgoWClbMTQ4OjE4M10pDQpwMSA8LSBhcy56b28obTEucHJlZCkNCnAyIDwtIGFzLnpvbyhtMi5wcmVkKQ0KWVogPC0gYXMuem9vKFhbMTQ4OjE4M10pDQoNCnBldyA8LSAoMS8yKSoocDErcDIpDQpgYGANCg0KKipCYXNhZG9zIGVuIHJlZ3Jlc2nDs24qKg0KDQoqKipNb2RlbG8gc2luIHJlc3RyaWNjacOzbmVzKioqDQpgYGB7ciwgZWNobz1GQUxTRX0NCiNNb2RlbG8gc2luIHJlc3RyaWNjacOzbmVzDQpjcmVnMSA8LSBkeW5sbShZWiB+IHAxICsgcDIpDQpzdW1tYXJ5KGNyZWcxKQ0KeWhhdDEgPC0gY3JlZzEkZml0DQpgYGANCioqKk1vZGVsbyBwYXJjaWFsbWVudGUgcmVzdHJpbmdpZG8qKioNCmBgYHtyLCBlY2hvPUZBTFNFfQ0KI01vZGVsbyBwYXJjaWFsbWVudGUgcmVzdHJpbmdpZG8NCmNyZWcyIDwtIGR5bmxtKFlaIH4gMCArIHAxICsgcDIpDQpzdW1tYXJ5KGNyZWcyKQ0KeWhhdDIgPC0gY3JlZzIkZml0DQpgYGANCg0KKioqTW9kZWxvIHJlc3RyaW5naWRvKioqDQpgYGB7ciwgZWNobz1GQUxTRX0NCiNNb2RlbG8gcmVzdHJpbmdpZG8NCllac3RhciA8LSBZWiAtIHAxDQpYMXN0YXIgPC0gcDIgLSBwMQ0KY3JlZzMgPC0gZHlubG0oWVpzdGFyIH4gMCArIFgxc3RhcikNCnN1bW1hcnkoY3JlZzMpDQp5aGF0MyA8LSBjcmVnMyRmaXQgKyBwMQ0KYGBgDQoNCg0KKipDb21wYXJhY2lvbmVzIGRlIGxhcyBjb21iaW5hY2lvbmVzKioNCg0KTUFFOg0KYGBge3IsIGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQplcmVxdyA8LSBZWiAtIHBldw0KZXJjcmVnMSA8LSBZWiAtIHloYXQxDQplcmNyZWcyIDwtIFlaIC0geWhhdDINCmVyY3JlZzMgPC0gWVogLSB5aGF0Mw0KDQpteU1BRSA8LSBmdW5jdGlvbih4KQ0Kew0KICByZXR1cm4obWVhbihhYnMoeCkpKQ0KfQ0KDQpYTSA8LSBjYmluZChlcmVxdywgZXJjcmVnMSwgZXJjcmVnMiwgZXJjcmVnMykNCmNvbWJNQUUgPC0gYXBwbHkoWE0sIDIsIG15TUFFKQ0KbmFtZXMoY29tYk1BRSkgPC0gYygiSVBJLmVyZXF3IiwiSVBJLmVyY3JlZzEiLCJJUEkuZXJjcmVnMiIsIklQSS5lcmNyZWczIikNCmNvbWJNQUUNCg0KWk0gPC0gbWVyZ2UoWVosIHBldywgeWhhdDEsIHloYXQyLCB5aGF0MykNCm5hbWVzKFpNKSA8LSBjKCJBY3R1YWwiLCAiRXEuIFciLCAiUmVnLiAxIiwgIlJlZy4gMiIsICJSZWcuIDMiKQ0KcCA8LSBhdXRvcGxvdChaTSwgZmFjZXRzID0gTlVMTCkNCmdncGxvdGx5KHApDQpgYGANCg0KRW4gZXN0ZSBjYXNvIHJlc3VsdGFuIG1lam9yIGxhcyBwcmVkaWNjaW9uZXMgY29uIGxhIHJlZ3Jlc2lvbiByZXN0cmluZ2lkYSAoUmVnLiAzKS4NCg0KIyNBcGFydGFkbyA0DQoNClJlYWxpemEgcHJlZGljY2lvbmVzIGZ1ZXJhIGRlIGxhIG11ZXN0cmEuDQoNCkVzdGltYWNpw7NuIGRlIGxvcyBtb2RlbG9zIGNvbiB0b2RhIGxhIG11ZXN0cmE6DQoNCmBgYHtyLCBlY2hvPUZBTFNFfQ0KWCA8LSBkaWZmKGxvZyhkbHQpKQ0KWSA8LSBYWy0xXQ0KDQptMW8gPC0gQXJpbWEoWSwgYygxLDAsMSksIGluY2x1ZGUubWVhbiA9IEYpDQptMW8NCg0KbTJvIDwtIEFyaW1hKFksIGMoMywwLDApLCBpbmNsdWRlLm1lYW4gPSBGKQ0KbTJvDQpgYGANCg0KUHJlZGljY2lvbmVzIDEyIHBhc29zIHBvciBkZWxhbnRlOg0KDQpgYGB7ciwgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRX0NCm0xby5mIDwtIGZvcmVjYXN0LkFyaW1hKG0xbywgaD0xMiwgbGV2ZWw9MC45NSkNCmF1dG9wbG90KG0xby5mKQ0KDQptMm8uZiA8LSBmb3JlY2FzdC5BcmltYShtMm8sIGg9MTIsIGxldmVsPTAuOTUpDQphdXRvcGxvdChtMm8uZikNCg0KbmRhdGVzIDwtIHNlcS5EYXRlKGZyb209YXMuRGF0ZSgiMjAxNy0wNC0wMSIpLCBsZW5ndGgub3V0ID0gMTIsIGJ5ID0gIm1vbnRoIikNCnAxIDwtIHpvbyhtMW8uZiRtZWFuLCBuZGF0ZXMpDQpwMiA8LSB6b28obTJvLmYkbWVhbiwgbmRhdGVzKQ0KcG0gPC0gbWVyZ2UocDEsIHAyKQ0KbmFtZXMocG0pIDwtIGMoIkFSTUEoMSwxKSIsICJBUigzKSIpDQpwIDwtIGF1dG9wbG90KHBtLCBmYWNldHM9TlVMTCkNCmdncGxvdGx5KHApDQpgYGANCg0KKipDb21iaW5hY2lvbmVzKioNCg0KYGBge3IsIGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQojUGVzb3MgaWd1YWxlcw0KbmVxdyA8LSAoMS8yKSoocDErcDIpDQoNCiNTaW4gcmVzdHJpY2Npb25lcw0KdyA8LSBjcmVnMSRjb2VmZmljaWVudHMNCm55aGF0MSA8LSB3WzFdICsgd1syXSpwMSArIHdbM10qcDINCg0KI1NpbiBjb25zdGFudGUNCncgPC0gY3JlZzIkY29lZmZpY2llbnRzDQpueWhhdDIgPC0gd1sxXSpwMSArIHdbMl0qcDINCg0KI1Jlc3RyaW5naWRvDQp3c3RhciA8LSBjcmVnMyRjb2VmZmljaWVudHMNCncgPC0gYXJyYXkoZGltPTIpDQp3WzJdIDwtIHdzdGFyDQp3WzFdIDwtIDEgLSBzdW0od3N0YXIpDQoNCm55aGF0MyA8LSB3WzFdKnAxICsgd1syXSpwMg0KDQoNCnhtIDwtIG1lcmdlKG5lcXcsIG55aGF0MSwgbnloYXQyLCBueWhhdDMpDQpwIDwtIGF1dG9wbG90KHhtLCBmYWNldHM9TlVMTCkNCmdncGxvdGx5KHApDQoNCm9wdGlvbnMoZGlnaXRzID0gNSkNCmF1eCA8LSBhcy5kYXRhLmZyYW1lKG1lcmdlKHBtLCB4bSkpDQphdXgNCmBgYA0KDQojRGlmZXJlbmNpYWwgZGUgdGlwbyBkZSBpbnRlcmVzIGEgbWVkaW8gcGxhem8NCg0KQWwgY2FsY3VsYXIgZXN0YSBzZXJpZSBvYnR1dmltb3MgcnVpZG8gYmxhbmNvIHkgcG9yIHRhbnRvIG5vIGNvbnRhbW9zIGNvbiBuaW5nw7puIG1vZGVsbyBhcmltYS4=