Contexto

Calidad del Suelo: o SPH: pH del Suelo o NC: Contenido de Nutrientes o OM: Materia Orgánica • Calidad del Agua: o CL: Niveles de Contaminantes o DO: Oxígeno Disuelto o WPH: pH del Agua • Salud del Ecosistema o SD: Diversidad de Especies o BM: Biomasa o EP: Productividad del Ecosistema

Fuente Parte 1: “C:\Users\gabri\Downloads\Tec\Sem 9\Generacion de Escenarios Futuros\M1\hogares.xlsx” Fuente parte 2: “C:\Users\gabri\Downloads\Tec\Sem 9\Generacion de Escenarios Futuros\M1\population.csv” Fuente Parte 3:“C:\Users\gabri\Downloads\Tec\Sem 9\Generacion de Escenarios Futuros\M1\ecosistema.csv”

Instalar paquetes y llamar libreriras

#install.packages("tidyverse")
library(tidyverse)
#install.packages("gplots")
library(gplots)
#install.packages("plm")
library(plm)
#install.packages("DataExplorer")
library(DataExplorer)
#install.packages("forecast")
library(forecast)
#install.packages("lavaan")
library(lavaan)
#install.packages("lavaanPlot")
library(lavaanPlot)
#install.packages("readxl")
library(readxl)
#install.packages("lmtest")
library(lmtest)
# install.packages("WDI")
library(WDI)
# install.packages("wbstats")
library(wbstats)
# install.packages("tidyverse")
library(tidyverse)
#install.packages("devtools")
library(devtools)
#devtools::install_github("diegovalle/mxmaps")
library(mxmaps)
#install.packages("remotes")
library(remotes)
#install.packages("sf")
library(sf)
#install.packages("forescast")
library(forecast)

Tema 1. Datos de panel: Hogares

Importar la base de datos

dfP1 <- read_excel("C:\\Users\\gabri\\Downloads\\Tec\\Sem 9\\Generacion de Escenarios Futuros\\M1\\hogares.xlsx")
panel1 <- pdata.frame(dfP1, index = c("HogarID", "Año"))

Revisar Heterogeneidad

plotmeans(Ingreso ~ HogarID, main = "Heterogeneidad entre higares para el ingreso", data = panel1)

Modelo 1, Regresion agrupada

pooled <- plm(Ingreso ~ Satisfacción, data = panel1, model = "pooling")
summary(pooled)
## Pooling Model
## 
## Call:
## plm(formula = Ingreso ~ Satisfacción, data = panel1, model = "pooling")
## 
## Balanced Panel: n = 100, T = 10, N = 1000
## 
## Residuals:
##      Min.   1st Qu.    Median   3rd Qu.      Max. 
## -20196.53  -5106.46   -575.98   5095.02  23468.66 
## 
## Coefficients:
##              Estimate Std. Error t-value  Pr(>|t|)    
## (Intercept)  10597.75     976.80  10.850 < 2.2e-16 ***
## Satisfacción  2890.77     166.68  17.343 < 2.2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Total Sum of Squares:    6.8145e+10
## Residual Sum of Squares: 5.2364e+10
## R-Squared:      0.23158
## Adj. R-Squared: 0.23081
## F-statistic: 300.772 on 1 and 998 DF, p-value: < 2.22e-16

Modelo 2, Efectos fijos (whitin)

within <- plm(Ingreso ~ Satisfacción , data = panel1, model = "within")
summary(within)
## Oneway (individual) effect Within Model
## 
## Call:
## plm(formula = Ingreso ~ Satisfacción, data = panel1, model = "within")
## 
## Balanced Panel: n = 100, T = 10, N = 1000
## 
## Residuals:
##       Min.    1st Qu.     Median    3rd Qu.       Max. 
## -15591.951  -3123.123    -74.284   3010.168  13134.979 
## 
## Coefficients:
##              Estimate Std. Error t-value  Pr(>|t|)    
## Satisfacción  1698.14     132.73  12.794 < 2.2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Total Sum of Squares:    2.3013e+10
## Residual Sum of Squares: 1.9469e+10
## R-Squared:      0.15403
## Adj. R-Squared: 0.05993
## F-statistic: 163.687 on 1 and 899 DF, p-value: < 2.22e-16

Modelo Pooled vs >Modelo de efectos fijos

pFtest(within, pooled)
## 
##  F test for individual effects
## 
## data:  Ingreso ~ Satisfacción
## F = 15.343, df1 = 99, df2 = 899, p-value < 2.2e-16
## alternative hypothesis: significant effects

Modelo 3. Efectos Aleatorios (random) - metodo walhus

walhus <- plm(Ingreso ~ Satisfacción, data = panel1, model = "random", random.method = "walhus")
summary(walhus)
## Oneway (individual) effect Random Effect Model 
##    (Wallace-Hussain's transformation)
## 
## Call:
## plm(formula = Ingreso ~ Satisfacción, data = panel1, model = "random", 
##     random.method = "walhus")
## 
## Balanced Panel: n = 100, T = 10, N = 1000
## 
## Effects:
##                    var  std.dev share
## idiosyncratic 23574420     4855  0.45
## individual    28789336     5366  0.55
## theta: 0.7249
## 
## Residuals:
##      Min.   1st Qu.    Median   3rd Qu.      Max. 
## -16507.33  -3220.23   -147.96   3184.91  15215.46 
## 
## Coefficients:
##              Estimate Std. Error z-value  Pr(>|z|)    
## (Intercept)  16632.69     925.15  17.978 < 2.2e-16 ***
## Satisfacción  1831.41     131.69  13.907 < 2.2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Total Sum of Squares:    2.6429e+10
## Residual Sum of Squares: 2.2139e+10
## R-Squared:      0.16233
## Adj. R-Squared: 0.16149
## Chisq: 193.404 on 1 DF, p-value: < 2.22e-16

Modelo 3. Efectos Aleatorios (random) - metodo amemiya

amemiya <- plm(Ingreso ~ Satisfacción, data = panel1, model = "random", random.method = "amemiya")
summary(amemiya)
## Oneway (individual) effect Random Effect Model 
##    (Amemiya's transformation)
## 
## Call:
## plm(formula = Ingreso ~ Satisfacción, data = panel1, model = "random", 
##     random.method = "amemiya")
## 
## Balanced Panel: n = 100, T = 10, N = 1000
## 
## Effects:
##                    var  std.dev share
## idiosyncratic 21631698     4651 0.393
## individual    33418160     5781 0.607
## theta: 0.7534
## 
## Residuals:
##      Min.   1st Qu.    Median   3rd Qu.      Max. 
## -16370.54  -3188.47   -210.78   3188.52  14905.18 
## 
## Coefficients:
##              Estimate Std. Error z-value  Pr(>|z|)    
## (Intercept)  16777.35     953.98  17.587 < 2.2e-16 ***
## Satisfacción  1806.01     130.63  13.825 < 2.2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Total Sum of Squares:    2.5757e+10
## Residual Sum of Squares: 2.1617e+10
## R-Squared:      0.16074
## Adj. R-Squared: 0.1599
## Chisq: 191.14 on 1 DF, p-value: < 2.22e-16

Modelo 3. Efectos Aleatorios (random) - metodo nerlove

nerlove <- plm(Ingreso ~ Satisfacción, data = panel1, model = "random", random.method = "nerlove")
summary(nerlove)
## Oneway (individual) effect Random Effect Model 
##    (Nerlove's transformation)
## 
## Call:
## plm(formula = Ingreso ~ Satisfacción, data = panel1, model = "random", 
##     random.method = "nerlove")
## 
## Balanced Panel: n = 100, T = 10, N = 1000
## 
## Effects:
##                    var  std.dev share
## idiosyncratic 19468528     4412 0.351
## individual    35940737     5995 0.649
## theta: 0.7733
## 
## Residuals:
##      Min.   1st Qu.    Median   3rd Qu.      Max. 
## -16275.51  -3113.76   -212.49   3188.29  14690.19 
## 
## Coefficients:
##              Estimate Std. Error z-value  Pr(>|z|)    
## (Intercept)  16869.92     981.37  17.190 < 2.2e-16 ***
## Satisfacción  1789.76     129.95  13.773 < 2.2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Total Sum of Squares:    2.5332e+10
## Residual Sum of Squares: 2.1286e+10
## R-Squared:      0.15972
## Adj. R-Squared: 0.15888
## Chisq: 189.701 on 1 DF, p-value: < 2.22e-16

Modelo de efectos fijos vs modelo de efectos aleatorios

phtest(walhus,within)
## 
##  Hausman Test
## 
## data:  Ingreso ~ Satisfacción
## chisq = 64.632, df = 1, p-value = 9.03e-16
## alternative hypothesis: one model is inconsistent

Si es pvalue es <0.05 usamos efecctos fijos.

Por lo tanto nos quedamos con el modelo de efectos fijos

Tema 2. Series de Tiempo: Mapas

Generar Serie de Tiempo y mapa

dfP2 <- df_mxstate_2020

df_mxstate_2020$value <- dfP2$pop
mxstate_choropleth(df_mxstate_2020)

Importar base de datos

dfP3 <- read.csv("C:\\Users\\gabri\\Downloads\\Tec\\Sem 9\\Generacion de Escenarios Futuros\\M1\\population.csv")

Generar serie de tiempo: TX

dfP3_1 <- dfP3 %>% filter(state == "TX")
ts <- ts (dfP3_1$population, start= 1900, frequency = 1)

Generar el modelo ARIMA

arima <- auto.arima(ts)
summary(arima)
## Series: ts 
## ARIMA(0,2,2) 
## 
## Coefficients:
##           ma1      ma2
##       -0.5950  -0.1798
## s.e.   0.0913   0.0951
## 
## sigma^2 = 1.031e+10:  log likelihood = -1527.14
## AIC=3060.28   AICc=3060.5   BIC=3068.6
## 
## Training set error measures:
##                    ME     RMSE      MAE       MPE      MAPE      MASE
## Training set 12147.62 99818.31 59257.39 0.1046163 0.5686743 0.2672197
##                     ACF1
## Training set -0.02136734

Generar el Pronostico

pronostico <- forecast(arima, level= 95, h = 5)
pronostico
##      Point Forecast    Lo 95    Hi 95
## 2020       29398472 29199487 29597457
## 2021       29806827 29463665 30149990
## 2022       30215183 29742956 30687410
## 2023       30623538 30024100 31222977
## 2024       31031894 30303359 31760429
plot(pronostico, main = "Poblacion Texas")

Tema 3, Modelos de ecuaciones estructurales

Importar la base de datos

dfP3 <- read.csv("C:\\Users\\gabri\\Downloads\\Tec\\Sem 9\\Generacion de Escenarios Futuros\\M1\\ecosistema.csv")

Generar el Modelo

modelo <- ' #Regresiones
              EcoSalud ~ SueloCalidad + AguaCalidad
              # Variables latentes
              SueloCalidad =~ SPH + NC + OM
              AguaCalidad =~ CL + DO + WPH
              EcoSalud =~ SD + BM + EP
              # Varianzas y covarianzas
              #Intercepto
              '

Generar el Diagrama

dfE <- scale(dfP3)
dfEE <- cfa(modelo, dfE)
## Warning: lavaan->lav_object_post_check():  
##    covariance matrix of latent variables is not positive definite ; use 
##    lavInspect(fit, "cov.lv") to investigate.
summary(dfEE)
## lavaan 0.6-19 ended normally after 145 iterations
## 
##   Estimator                                         ML
##   Optimization method                           NLMINB
##   Number of model parameters                        21
## 
##   Number of observations                           200
## 
## Model Test User Model:
##                                                       
##   Test statistic                                17.149
##   Degrees of freedom                                24
##   P-value (Chi-square)                           0.842
## 
## Parameter Estimates:
## 
##   Standard errors                             Standard
##   Information                                 Expected
##   Information saturated (h1) model          Structured
## 
## Latent Variables:
##                    Estimate  Std.Err  z-value  P(>|z|)
##   SueloCalidad =~                                     
##     SPH               1.000                           
##     NC                2.217    1.332    1.664    0.096
##     OM                0.167    0.402    0.414    0.679
##   AguaCalidad =~                                      
##     CL                1.000                           
##     DO               -0.827    0.427   -1.936    0.053
##     WPH               0.404    0.359    1.124    0.261
##   EcoSalud =~                                         
##     SD                1.000                           
##     BM               -1.899    3.995   -0.475    0.634
##     EP               -4.224    8.093   -0.522    0.602
## 
## Regressions:
##                    Estimate  Std.Err  z-value  P(>|z|)
##   EcoSalud ~                                          
##     SueloCalidad      0.530    1.499    0.353    0.724
##     AguaCalidad       0.583    1.507    0.387    0.699
## 
## Covariances:
##                    Estimate  Std.Err  z-value  P(>|z|)
##   SueloCalidad ~~                                     
##     AguaCalidad      -0.079    0.051   -1.558    0.119
## 
## Variances:
##                    Estimate  Std.Err  z-value  P(>|z|)
##    .SPH               0.926    0.103    9.016    0.000
##    .NC                0.657    0.226    2.906    0.004
##    .OM                0.993    0.100    9.978    0.000
##    .CL                0.953    0.118    8.086    0.000
##    .DO                0.966    0.108    8.977    0.000
##    .WPH               0.988    0.099    9.938    0.000
##    .SD                0.992    0.100    9.954    0.000
##    .BM                0.985    0.102    9.618    0.000
##    .EP                0.948    0.166    5.720    0.000
##     SueloCalidad      0.069    0.057    1.197    0.231
##     AguaCalidad       0.042    0.075    0.558    0.577
##    .EcoSalud          0.018    0.073    0.246    0.806
lavaanPlot(dfEE, coef= TRUE, cov = TRUE)
LS0tDQp0aXRsZTogIkFjdGl2aWRhZCAzIg0KYXV0aG9yOiAiR2FicmllbCBBMDE3MjIxODciDQpkYXRlOiAiMjAyNS0wOC0yMSINCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDoNCiAgICB0b2M6IFRydWUNCiAgICB0b2NfZmxvYXQ6IFRydWUNCiAgICBjb2RlX2Rvd25sb2FkOiBUcnVlDQogICAgdGhlbWU6IGRhcmsNCi0tLQ0KPGNlbnRlcj4NCiFbXShodHRwczovL3RzZTEubW0uYmluZy5uZXQvdGgvaWQvT0lQLnFuRm4weXBtekJPUHcyUDRGd1BzNXdIYUZqP3I9MCZjYj10aGZjMSZycz0xJnBpZD1JbWdEZXRNYWluJm89NyZybT0zKQ0KPC9jZW50ZXI+DQoNCg0KIyA8c3BhbiBzdHlsZSA9ImNvbG9yOiB5ZWxsb3ciPiBDb250ZXh0byA8L3NwYW4+DQoNCkNhbGlkYWQgZGVsIFN1ZWxvOg0KbyBTUEg6IHBIIGRlbCBTdWVsbw0KbyBOQzogQ29udGVuaWRvIGRlIE51dHJpZW50ZXMNCm8gT006IE1hdGVyaWEgT3Jnw6FuaWNhDQrigKIgQ2FsaWRhZCBkZWwgQWd1YToNCm8gQ0w6IE5pdmVsZXMgZGUgQ29udGFtaW5hbnRlcw0KbyBETzogT3jDrWdlbm8gRGlzdWVsdG8NCm8gV1BIOiBwSCBkZWwgQWd1YQ0K4oCiIFNhbHVkIGRlbCBFY29zaXN0ZW1hDQpvIFNEOiBEaXZlcnNpZGFkIGRlIEVzcGVjaWVzDQpvIEJNOiBCaW9tYXNhDQpvIEVQOiBQcm9kdWN0aXZpZGFkIGRlbCBFY29zaXN0ZW1hDQoNCkZ1ZW50ZSBQYXJ0ZSAxOiAiQzpcXFVzZXJzXFxnYWJyaVxcRG93bmxvYWRzXFxUZWNcXFNlbSA5XFxHZW5lcmFjaW9uIGRlIEVzY2VuYXJpb3MgRnV0dXJvc1xcTTFcXGhvZ2FyZXMueGxzeCINCkZ1ZW50ZSBwYXJ0ZSAyOiAiQzpcXFVzZXJzXFxnYWJyaVxcRG93bmxvYWRzXFxUZWNcXFNlbSA5XFxHZW5lcmFjaW9uIGRlIEVzY2VuYXJpb3MgRnV0dXJvc1xcTTFcXHBvcHVsYXRpb24uY3N2Ig0KRnVlbnRlIFBhcnRlIDM6IkM6XFxVc2Vyc1xcZ2FicmlcXERvd25sb2Fkc1xcVGVjXFxTZW0gOVxcR2VuZXJhY2lvbiBkZSBFc2NlbmFyaW9zIEZ1dHVyb3NcXE0xXFxlY29zaXN0ZW1hLmNzdiINCg0KDQojIDxzcGFuIHN0eWxlID0iY29sb3I6IHllbGxvdyI+IEluc3RhbGFyIHBhcXVldGVzIHkgbGxhbWFyIGxpYnJlcmlyYXM8L3NwYW4+DQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KI2luc3RhbGwucGFja2FnZXMoInRpZHl2ZXJzZSIpDQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCiNpbnN0YWxsLnBhY2thZ2VzKCJncGxvdHMiKQ0KbGlicmFyeShncGxvdHMpDQojaW5zdGFsbC5wYWNrYWdlcygicGxtIikNCmxpYnJhcnkocGxtKQ0KI2luc3RhbGwucGFja2FnZXMoIkRhdGFFeHBsb3JlciIpDQpsaWJyYXJ5KERhdGFFeHBsb3JlcikNCiNpbnN0YWxsLnBhY2thZ2VzKCJmb3JlY2FzdCIpDQpsaWJyYXJ5KGZvcmVjYXN0KQ0KI2luc3RhbGwucGFja2FnZXMoImxhdmFhbiIpDQpsaWJyYXJ5KGxhdmFhbikNCiNpbnN0YWxsLnBhY2thZ2VzKCJsYXZhYW5QbG90IikNCmxpYnJhcnkobGF2YWFuUGxvdCkNCiNpbnN0YWxsLnBhY2thZ2VzKCJyZWFkeGwiKQ0KbGlicmFyeShyZWFkeGwpDQojaW5zdGFsbC5wYWNrYWdlcygibG10ZXN0IikNCmxpYnJhcnkobG10ZXN0KQ0KIyBpbnN0YWxsLnBhY2thZ2VzKCJXREkiKQ0KbGlicmFyeShXREkpDQojIGluc3RhbGwucGFja2FnZXMoIndic3RhdHMiKQ0KbGlicmFyeSh3YnN0YXRzKQ0KIyBpbnN0YWxsLnBhY2thZ2VzKCJ0aWR5dmVyc2UiKQ0KbGlicmFyeSh0aWR5dmVyc2UpDQojaW5zdGFsbC5wYWNrYWdlcygiZGV2dG9vbHMiKQ0KbGlicmFyeShkZXZ0b29scykNCiNkZXZ0b29sczo6aW5zdGFsbF9naXRodWIoImRpZWdvdmFsbGUvbXhtYXBzIikNCmxpYnJhcnkobXhtYXBzKQ0KI2luc3RhbGwucGFja2FnZXMoInJlbW90ZXMiKQ0KbGlicmFyeShyZW1vdGVzKQ0KI2luc3RhbGwucGFja2FnZXMoInNmIikNCmxpYnJhcnkoc2YpDQojaW5zdGFsbC5wYWNrYWdlcygiZm9yZXNjYXN0IikNCmxpYnJhcnkoZm9yZWNhc3QpDQpgYGANCg0KIyA8c3BhbiBzdHlsZSA9ImNvbG9yOiB5ZWxsb3ciPiBUZW1hIDEuIERhdG9zIGRlIHBhbmVsOiBIb2dhcmVzIDwvc3Bhbj4NCg0KIyMgPHNwYW4gc3R5bGUgPSJjb2xvcjogeWVsbG93Ij4gSW1wb3J0YXIgbGEgYmFzZSBkZSBkYXRvcyA8L3NwYW4+DQpgYGB7cn0NCmRmUDEgPC0gcmVhZF9leGNlbCgiQzpcXFVzZXJzXFxnYWJyaVxcRG93bmxvYWRzXFxUZWNcXFNlbSA5XFxHZW5lcmFjaW9uIGRlIEVzY2VuYXJpb3MgRnV0dXJvc1xcTTFcXGhvZ2FyZXMueGxzeCIpDQpwYW5lbDEgPC0gcGRhdGEuZnJhbWUoZGZQMSwgaW5kZXggPSBjKCJIb2dhcklEIiwgIkHDsW8iKSkNCmBgYA0KDQojIyA8c3BhbiBzdHlsZSA9ImNvbG9yOiB5ZWxsb3ciPiBSZXZpc2FyIEhldGVyb2dlbmVpZGFkIDwvc3Bhbj4NCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpwbG90bWVhbnMoSW5ncmVzbyB+IEhvZ2FySUQsIG1haW4gPSAiSGV0ZXJvZ2VuZWlkYWQgZW50cmUgaGlnYXJlcyBwYXJhIGVsIGluZ3Jlc28iLCBkYXRhID0gcGFuZWwxKQ0KYGBgDQoNCiMjIDxzcGFuIHN0eWxlID0iY29sb3I6IHllbGxvdyI+IE1vZGVsbyAxLCBSZWdyZXNpb24gYWdydXBhZGEgPC9zcGFuPg0KYGBge3J9DQpwb29sZWQgPC0gcGxtKEluZ3Jlc28gfiBTYXRpc2ZhY2Npw7NuLCBkYXRhID0gcGFuZWwxLCBtb2RlbCA9ICJwb29saW5nIikNCnN1bW1hcnkocG9vbGVkKQ0KYGBgDQoNCiMjIDxzcGFuIHN0eWxlID0iY29sb3I6IHllbGxvdyI+IE1vZGVsbyAyLCBFZmVjdG9zIGZpam9zICh3aGl0aW4pIDwvc3Bhbj4NCmBgYHtyfQ0Kd2l0aGluIDwtIHBsbShJbmdyZXNvIH4gU2F0aXNmYWNjacOzbiAsIGRhdGEgPSBwYW5lbDEsIG1vZGVsID0gIndpdGhpbiIpDQpzdW1tYXJ5KHdpdGhpbikNCmBgYA0KDQojIyA8c3BhbiBzdHlsZSA9ImNvbG9yOiB5ZWxsb3ciPiBNb2RlbG8gUG9vbGVkIHZzID5Nb2RlbG8gZGUgZWZlY3RvcyBmaWpvcyA8L3NwYW4+DQpgYGB7cn0NCnBGdGVzdCh3aXRoaW4sIHBvb2xlZCkNCmBgYA0KIyMgPHNwYW4gc3R5bGUgPSJjb2xvcjogeWVsbG93Ij4gTW9kZWxvIDMuIEVmZWN0b3MgQWxlYXRvcmlvcyAocmFuZG9tKSAtIG1ldG9kbyB3YWxodXMgPC9zcGFuPg0KYGBge3J9DQp3YWxodXMgPC0gcGxtKEluZ3Jlc28gfiBTYXRpc2ZhY2Npw7NuLCBkYXRhID0gcGFuZWwxLCBtb2RlbCA9ICJyYW5kb20iLCByYW5kb20ubWV0aG9kID0gIndhbGh1cyIpDQpzdW1tYXJ5KHdhbGh1cykNCmBgYA0KIyMgPHNwYW4gc3R5bGUgPSJjb2xvcjogeWVsbG93Ij4gTW9kZWxvIDMuIEVmZWN0b3MgQWxlYXRvcmlvcyAocmFuZG9tKSAtIG1ldG9kbyBhbWVtaXlhIDwvc3Bhbj4NCmBgYHtyfQ0KYW1lbWl5YSA8LSBwbG0oSW5ncmVzbyB+IFNhdGlzZmFjY2nDs24sIGRhdGEgPSBwYW5lbDEsIG1vZGVsID0gInJhbmRvbSIsIHJhbmRvbS5tZXRob2QgPSAiYW1lbWl5YSIpDQpzdW1tYXJ5KGFtZW1peWEpDQpgYGANCiMjIDxzcGFuIHN0eWxlID0iY29sb3I6IHllbGxvdyI+IE1vZGVsbyAzLiBFZmVjdG9zIEFsZWF0b3Jpb3MgKHJhbmRvbSkgLSBtZXRvZG8gbmVybG92ZSA8L3NwYW4+DQpgYGB7cn0NCm5lcmxvdmUgPC0gcGxtKEluZ3Jlc28gfiBTYXRpc2ZhY2Npw7NuLCBkYXRhID0gcGFuZWwxLCBtb2RlbCA9ICJyYW5kb20iLCByYW5kb20ubWV0aG9kID0gIm5lcmxvdmUiKQ0Kc3VtbWFyeShuZXJsb3ZlKQ0KYGBgDQojIyA8c3BhbiBzdHlsZSA9ImNvbG9yOiB5ZWxsb3ciPiBNb2RlbG8gZGUgZWZlY3RvcyBmaWpvcyB2cyBtb2RlbG8gZGUgZWZlY3RvcyBhbGVhdG9yaW9zIDwvc3Bhbj4NCmBgYHtyfQ0KcGh0ZXN0KHdhbGh1cyx3aXRoaW4pDQpgYGANClNpIGVzIHB2YWx1ZSBlcyA8MC4wNSB1c2Ftb3MgZWZlY2N0b3MgZmlqb3MuDQoNClBvciBsbyB0YW50byBub3MgcXVlZGFtb3MgY29uIGVsIG1vZGVsbyBkZSBlZmVjdG9zIGZpam9zDQoNCg0KIyA8c3BhbiBzdHlsZSA9ImNvbG9yOiB5ZWxsb3ciPiBUZW1hIDIuIFNlcmllcyBkZSBUaWVtcG86IE1hcGFzIDwvc3Bhbj4NCg0KIyMgPHNwYW4gc3R5bGUgPSJjb2xvcjogeWVsbG93Ij4gR2VuZXJhciBTZXJpZSBkZSBUaWVtcG8geSBtYXBhIDwvc3Bhbj4NCmBgYHtyfQ0KZGZQMiA8LSBkZl9teHN0YXRlXzIwMjANCg0KZGZfbXhzdGF0ZV8yMDIwJHZhbHVlIDwtIGRmUDIkcG9wDQpteHN0YXRlX2Nob3JvcGxldGgoZGZfbXhzdGF0ZV8yMDIwKQ0KYGBgDQoNCiMjIDxzcGFuIHN0eWxlID0iY29sb3I6IHllbGxvdyI+IEltcG9ydGFyIGJhc2UgZGUgZGF0b3M8L3NwYW4+DQpgYGB7cn0NCmRmUDMgPC0gcmVhZC5jc3YoIkM6XFxVc2Vyc1xcZ2FicmlcXERvd25sb2Fkc1xcVGVjXFxTZW0gOVxcR2VuZXJhY2lvbiBkZSBFc2NlbmFyaW9zIEZ1dHVyb3NcXE0xXFxwb3B1bGF0aW9uLmNzdiIpDQpgYGANCg0KIyMgPHNwYW4gc3R5bGUgPSJjb2xvcjogeWVsbG93Ij4gR2VuZXJhciBzZXJpZSBkZSB0aWVtcG86IFRYPC9zcGFuPg0KYGBge3J9DQpkZlAzXzEgPC0gZGZQMyAlPiUgZmlsdGVyKHN0YXRlID09ICJUWCIpDQp0cyA8LSB0cyAoZGZQM18xJHBvcHVsYXRpb24sIHN0YXJ0PSAxOTAwLCBmcmVxdWVuY3kgPSAxKQ0KYGBgDQoNCg0KIyMgPHNwYW4gc3R5bGUgPSJjb2xvcjogeWVsbG93Ij4gR2VuZXJhciBlbCBtb2RlbG8gQVJJTUEgPC9zcGFuPg0KYGBge3J9DQphcmltYSA8LSBhdXRvLmFyaW1hKHRzKQ0Kc3VtbWFyeShhcmltYSkNCmBgYA0KIyMgPHNwYW4gc3R5bGUgPSJjb2xvcjogeWVsbG93Ij4gR2VuZXJhciBlbCBQcm9ub3N0aWNvIDwvc3Bhbj4NCmBgYHtyfQ0KcHJvbm9zdGljbyA8LSBmb3JlY2FzdChhcmltYSwgbGV2ZWw9IDk1LCBoID0gNSkNCnByb25vc3RpY28NCnBsb3QocHJvbm9zdGljbywgbWFpbiA9ICJQb2JsYWNpb24gVGV4YXMiKQ0KYGBgDQoNCiMgPHNwYW4gc3R5bGUgPSJjb2xvcjogeWVsbG93Ij4gVGVtYSAzLCBNb2RlbG9zIGRlIGVjdWFjaW9uZXMgZXN0cnVjdHVyYWxlcyA8L3NwYW4+DQoNCiMjIDxzcGFuIHN0eWxlID0iY29sb3I6IHllbGxvdyI+IEltcG9ydGFyIGxhIGJhc2UgZGUgZGF0b3MgPC9zcGFuPg0KYGBge3J9DQpkZlAzIDwtIHJlYWQuY3N2KCJDOlxcVXNlcnNcXGdhYnJpXFxEb3dubG9hZHNcXFRlY1xcU2VtIDlcXEdlbmVyYWNpb24gZGUgRXNjZW5hcmlvcyBGdXR1cm9zXFxNMVxcZWNvc2lzdGVtYS5jc3YiKQ0KYGBgDQoNCiMjIDxzcGFuIHN0eWxlID0iY29sb3I6IHllbGxvdyI+IEdlbmVyYXIgZWwgTW9kZWxvIDwvc3Bhbj4NCmBgYHtyfQ0KbW9kZWxvIDwtICcgI1JlZ3Jlc2lvbmVzDQogICAgICAgICAgICAgIEVjb1NhbHVkIH4gU3VlbG9DYWxpZGFkICsgQWd1YUNhbGlkYWQNCiAgICAgICAgICAgICAgIyBWYXJpYWJsZXMgbGF0ZW50ZXMNCiAgICAgICAgICAgICAgU3VlbG9DYWxpZGFkID1+IFNQSCArIE5DICsgT00NCiAgICAgICAgICAgICAgQWd1YUNhbGlkYWQgPX4gQ0wgKyBETyArIFdQSA0KICAgICAgICAgICAgICBFY29TYWx1ZCA9fiBTRCArIEJNICsgRVANCiAgICAgICAgICAgICAgIyBWYXJpYW56YXMgeSBjb3Zhcmlhbnphcw0KICAgICAgICAgICAgICAjSW50ZXJjZXB0bw0KICAgICAgICAgICAgICAnDQoNCmBgYA0KDQojIyA8c3BhbiBzdHlsZSA9ImNvbG9yOiB5ZWxsb3ciPiBHZW5lcmFyIGVsIERpYWdyYW1hIDwvc3Bhbj4NCmBgYHtyfQ0KZGZFIDwtIHNjYWxlKGRmUDMpDQpkZkVFIDwtIGNmYShtb2RlbG8sIGRmRSkNCnN1bW1hcnkoZGZFRSkNCmxhdmFhblBsb3QoZGZFRSwgY29lZj0gVFJVRSwgY292ID0gVFJVRSkNCmBgYA0KDQoNCg==