Datos

Abajo las instrucciones para cargar los datos del experimento.

##   Cama Comb Replica Humedad Temp Dieta Peso  pH Tiempo
## 1    1   11      II      80   15     1 5221 6.3     14
## 2    2   26      IV      80   25     2 5342 6.6     14
## 3    3   11     III      80   15     1 5221 6.3     14
## 4    4   18      IV      89   25     1 4903 6.7     14
## 5    5   24      II      89   20     2 5283 6.4     14
## 6    6    3     III      89   15     0 5110 6.6     14

Vamos a convertir a factor la variable Dieta.

Vamos a quedarnos con las filas distintas de la base datos y la almacenamos en datis.

Distribuciones que mejor explican el Peso

## Error in solve.default(oout$hessian) : 
##   Lapack routine dgesv: system is exactly singular: U[1,1] = 0
## Error in solve.default(oout$hessian) : 
##   Lapack routine dgesv: system is exactly singular: U[3,3] = 0
## Error in solve.default(oout$hessian) : 
##   Lapack routine dgesv: system is exactly singular: U[4,4] = 0
## Error in solve.default(oout$hessian) : 
##   Lapack routine dgesv: system is exactly singular: U[4,4] = 0
##           GG       IGAMMA           IG        LOGNO       LOGNO2 
##     721.0011     733.9338     734.3123     734.3525     734.3525 
##           GA          GB2         BCCG        BCCGo       exGAUS 
##     734.8076     735.6651     736.4313     736.4313     739.7765 
##         BCTo          BCT          WEI         WEI3          EXP 
##     740.3025     740.3025     741.4169     741.4169     926.3476 
##           GP      PARETO2     PARETO2o         WEI2 
##     930.2188     930.2188     930.2189 5200099.1739
## NULL

Aplicación de modelos gamlss

El código mostrado a continuación modifica algunos parámteros internos para hacer más exhaustiva la estimación de los parámetros.

Para la construcción de los modelos se utilizará un proceso de selección de variables hacia adelante y el horizonte de modelación para cada parámetro será el horizonte de abajo.

Modelo con respuesta normal modelando \(\mu\) solamente (de referencia)

El parámetro \(\mu\) es la media y \(\sigma\) es la desviación de la distribución.

## --------------------------------------------------- 
## Start:  AIC= 732.16 
##  Peso ~ 1 
## 
## --------------------------------------------------- 
## Start:  AIC= 699.56 
##  ~1 
## 
## --------------------------------------------------- 
## Start:  AIC= 699.56 
##  Peso ~ Tiempo + Dieta + I(Tiempo^2) + I(Temp^2) 
## 
## ---------------------------------------------------
## ******************************************************************
## Family:  c("NO", "Normal") 
## 
## Call:  gamlss(formula = Peso ~ Tiempo + Dieta + I(Tiempo^2) +  
##     I(Temp^2), family = NO, data = datis, control = control1,  
##     i.control = control2, trace = FALSE, sigma.formula = ~1) 
## 
## Fitting method: RS() 
## 
## ------------------------------------------------------------------
## Mu link function:  identity
## Mu Coefficients:
##              Estimate Std. Error t value Pr(>|t|)   
## (Intercept) 2284.5252   781.6918   2.923  0.00563 **
## Tiempo       267.6698    79.2660   3.377  0.00162 **
## Dieta1      -291.2293   102.7449  -2.834  0.00709 **
## Dieta2       -75.4635   122.7581  -0.615  0.54213   
## I(Tiempo^2)   -5.2409     1.9293  -2.716  0.00962 **
## I(Temp^2)      0.6468     0.2785   2.322  0.02528 * 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## ------------------------------------------------------------------
## Sigma link function:  log
## Sigma Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)   5.7223     0.1021   56.07   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## ------------------------------------------------------------------
## No. of observations in the fit:  48 
## Degrees of Freedom for the fit:  7
##       Residual Deg. of Freedom:  41 
##                       at cycle:  2 
##  
## Global Deviance:     685.5562 
##             AIC:     699.5562 
##             SBC:     712.6546 
## ******************************************************************

A continuación se construye el gráfico de gusano el cual es un herramienta para explorar el comportamiento de los residuales. Si el modelo está bien ajustado se espera que los puntos (residuales) queden dentro de las hipérbolas.

De la figura anterior se observa que los residuales caen en la parte central (dentro de las hipérbolas).

A continuación calculamos el coeficiente de correlación lineal entre los \(y_i\) y \(\hat{E}(y | x)\) para el modelo en cuestión.

## [1] 0.7670557

El valor de \(R^2_{pseudo}\) es:

## [1] 0.5883744

Para ver si los valores \(\hat{E}(y | x)\) acompaña el valor de \(y_i\) podemos hacer el siguiente diagrama de dispersión.

Modelo con respuesta normal modelando \(\mu\) y \(\sigma\)

El parámetro \(\mu\) es la media y \(\sigma\) es la desviación de la distribución.

## --------------------------------------------------- 
## Start:  AIC= 732.16 
##  Peso ~ 1 
## 
## --------------------------------------------------- 
## Start:  AIC= 699.56 
##  ~1 
## 
## --------------------------------------------------- 
## Start:  AIC= 596.71 
##  Peso ~ Tiempo + Dieta + I(Tiempo^2) + I(Temp^2) 
## 
## ---------------------------------------------------
## ******************************************************************
## Family:  c("NO", "Normal") 
## 
## Call:  gamlss(formula = Peso ~ Tiempo + Dieta + I(Tiempo^2) +  
##     I(Temp^2), sigma.formula = ~I(Temp^2) + Temp +  
##     Dieta + I(Humedad^2) + Humedad, family = NO, data = datis,  
##     control = control1, i.control = control2, trace = FALSE) 
## 
## Fitting method: RS() 
## 
## ------------------------------------------------------------------
## Mu link function:  identity
## Mu Coefficients:
##               Estimate Std. Error   t value Pr(>|t|)    
## (Intercept) -2.674e+02  2.434e+01   -10.987 6.83e-13 ***
## Tiempo       4.724e+02  5.674e-02  8325.956  < 2e-16 ***
## Dieta1      -1.786e+02  4.047e+00   -44.133  < 2e-16 ***
## Dieta2       1.055e+02  3.488e+01     3.025  0.00464 ** 
## I(Tiempo^2) -9.388e+00  1.391e-03 -6751.324  < 2e-16 ***
## I(Temp^2)    9.203e-01  3.900e-02    23.601  < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## ------------------------------------------------------------------
## Sigma link function:  log
## Sigma Coefficients:
##                Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  -7.431e+01  1.816e+00 -40.925  < 2e-16 ***
## I(Temp^2)    -7.331e-02  3.747e-03 -19.564  < 2e-16 ***
## Temp          2.293e+00  1.510e-01  15.184  < 2e-16 ***
## Dieta1       -1.651e+00  2.285e-01  -7.227 1.95e-08 ***
## Dieta2        2.734e+00  3.196e-01   8.556 4.25e-10 ***
## I(Humedad^2) -1.235e-02  1.823e-04 -67.760  < 2e-16 ***
## Humedad       1.795e+00  2.704e-02  66.375  < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## ------------------------------------------------------------------
## No. of observations in the fit:  48 
## Degrees of Freedom for the fit:  13
##       Residual Deg. of Freedom:  35 
##                       at cycle:  16 
##  
## Global Deviance:     570.709 
##             AIC:     596.709 
##             SBC:     621.0346 
## ******************************************************************

A continuación se construye el gráfico de gusano el cual es un herramienta para explorar el comportamiento de los residuales. Si el modelo está bien ajustado se espera que los puntos (residuales) queden dentro de las hipérbolas.

De la figura anterior se observa que los residuales caen en la parte central (dentro de las hipérbolas).

A continuación calculamos el coeficiente de correlación lineal entre los \(y_i\) y \(\hat{E}(y | x)\) para el modelo en cuestión.

## [1] 0.609807

El valor de \(R^2_{pseudo}\) es:

## [1] 0.8963201

Para ver si los valores \(\hat{E}(y | x)\) acompaña el valor de \(y_i\) podemos hacer el siguiente diagrama de dispersión.

Modelo con respuesta IGAMMA (Inverse Gamma)

El parámetro \(\mu\) es la moda de la distribución.

## --------------------------------------------------- 
## Distribution parameter:  mu 
## Start:  AIC= 730.19 
##  Peso ~ 1 
## 
##                Df    AIC
## + Tiempo        1 711.80
## + I(Tiempo^2)   1 714.40
## + Dieta         2 726.26
## + Temp          1 728.40
## + I(Temp^2)     1 728.46
## <none>            730.19
## + Humedad       1 730.57
## + I(Humedad^2)  1 730.88
## 
## Step:  AIC= 711.8 
##  Peso ~ Tiempo 
## 
##                Df    AIC
## + Dieta         2 704.67
## + Temp          1 706.80
## + I(Temp^2)     1 706.84
## + I(Tiempo^2)   1 708.08
## + Humedad       1 711.78
## <none>            711.80
## + I(Humedad^2)  1 712.19
## 
## Step:  AIC= 704.67 
##  Peso ~ Tiempo + Dieta 
## 
##                Df    AIC
## + I(Tiempo^2)   1 700.68
## + I(Temp^2)     1 702.56
## + Temp          1 702.69
## <none>            704.67
## + Humedad       1 706.10
## + I(Humedad^2)  1 706.32
## 
## Step:  AIC= 700.68 
##  Peso ~ Tiempo + Dieta + I(Tiempo^2) 
## 
##                Df    AIC
## + I(Temp^2)     1 697.71
## + Temp          1 697.82
## <none>            700.68
## + Humedad       1 702.12
## + I(Humedad^2)  1 702.34
## 
## Step:  AIC= 697.71 
##  Peso ~ Tiempo + Dieta + I(Tiempo^2) + I(Temp^2) 
## 
##                Df    AIC
## <none>            697.71
## + Humedad       1 698.68
## + I(Humedad^2)  1 699.01
## + Temp          1 699.64
## --------------------------------------------------- 
## Distribution parameter:  sigma 
## Start:  AIC= 697.71 
##  ~1 
## 
##                Df    AIC
## + I(Temp^2)     1 681.16
## + Temp          1 685.44
## + Tiempo        1 694.95
## + I(Tiempo^2)   1 695.97
## + Dieta         2 696.93
## <none>            697.71
## + I(Humedad^2)  1 698.62
## + Humedad       1 698.77
## 
## Step:  AIC= 681.16 
##  ~I(Temp^2) 
## 
##                Df    AIC
## + Temp          1 667.83
## <none>            681.16
## + Tiempo        1 681.88
## + I(Tiempo^2)   1 682.48
## + Dieta         2 683.12
## + Humedad       1 683.14
## + I(Humedad^2)  1 683.15
## 
## Step:  AIC= 667.83 
##  ~I(Temp^2) + Temp 
## 
##                Df    AIC
## + Dieta         2 652.93
## <none>            667.83
## + Tiempo        1 669.35
## + I(Tiempo^2)   1 669.61
## + I(Humedad^2)  1 669.77
## + Humedad       1 669.79
## 
## Step:  AIC= 652.93 
##  ~I(Temp^2) + Temp + Dieta 
## 
##                Df    AIC
## + I(Humedad^2)  1 613.88
## + Humedad       1 615.76
## <none>            652.93
## + I(Tiempo^2)   1 654.79
## + Tiempo        1 654.85
## 
## Step:  AIC= 613.88 
##  ~I(Temp^2) + Temp + Dieta + I(Humedad^2) 
## 
##               Df    AIC
## <none>           613.88
## + Tiempo       1 615.33
## + I(Tiempo^2)  1 615.63
## + Humedad      1 680.30
## --------------------------------------------------- 
## Distribution parameter:  mu 
## Start:  AIC= 613.88 
##  Peso ~ Tiempo + Dieta + I(Tiempo^2) + I(Temp^2) 
## 
##               Df    AIC
## <none>           613.88
## - I(Temp^2)    1 614.42
## - Dieta        2 692.94
## - I(Tiempo^2)  1 707.76
## - Tiempo       1 712.05
## ---------------------------------------------------
## Warning in summary.gamlss(mod2): summary: vcov has failed, option qr is used instead
## ******************************************************************
## Family:  c("IGAMMA", "Inverse Gamma") 
## 
## Call:  gamlss(formula = Peso ~ Tiempo + Dieta + I(Tiempo^2) + I(Temp^2),  
##     sigma.formula = ~I(Temp^2) + Temp + Dieta + I(Humedad^2),  
##     nu.formula = ~1, family = IGAMMA, data = datis, control = control1,  
##     i.control = control2, trace = FALSE) 
## 
## Fitting method: RS() 
## 
## ------------------------------------------------------------------
## Mu link function:  log
## Mu Coefficients:
##               Estimate Std. Error   t value Pr(>|t|)    
## (Intercept)  7.596e+00  2.646e-02   287.103   <2e-16 ***
## Tiempo       8.818e-02  1.202e-05  7337.215   <2e-16 ***
## Dieta1      -3.262e-02  1.567e-03   -20.823   <2e-16 ***
## Dieta2       1.798e-02  7.408e-03     2.427   0.0196 *  
## I(Tiempo^2) -1.757e-03  2.944e-07 -5967.233   <2e-16 ***
## I(Temp^2)    7.116e-05  4.239e-05     1.679   0.1006    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## ------------------------------------------------------------------
## Sigma link function:  log
## Sigma Coefficients:
##                Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  -5.923e+00  3.638e+00  -1.628    0.111    
## I(Temp^2)    -5.949e-02  9.117e-03  -6.525 6.96e-08 ***
## Temp          1.740e+00  3.687e-01   4.718 2.64e-05 ***
## Dieta1       -1.830e+00  2.392e-01  -7.650 1.73e-09 ***
## Dieta2        3.350e+00  2.901e-01  11.548 1.29e-14 ***
## I(Humedad^2) -1.213e-03  8.537e-05 -14.212  < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## ------------------------------------------------------------------
## No. of observations in the fit:  48 
## Degrees of Freedom for the fit:  12
##       Residual Deg. of Freedom:  36 
##                       at cycle:  26 
##  
## Global Deviance:     589.8823 
##             AIC:     613.8823 
##             SBC:     636.3367 
## ******************************************************************

De la tabla de resumen anterior se observa que \(Temp^2\) no es significativo en la modelación de \(\mu\), por esta razón se va a ajustar nuevamente el modelo si él.

A continuación se construye el gráfico de gusano el cual es un herramienta para explorar el comportamiento de los residuales. Si el modelo está bien ajustado se espera que los puntos (residuales) queden dentro de las hipérbolas.

De la figura anterior se observa que los residuales caen en la parte central (dentro de las hipérbolas).

A continuación calculamos el coeficiente de correlación lineal entre los \(y_i\) y \(\hat{E}(y | x)\) para el modelo en cuestión.

## [1] 0.7078815

El valor de \(R^2_{pseudo}\) es:

## [1] 0.9383854

Para ver si los valores \(\hat{E}(y | x)\) acompaña el valor de \(y_i\) podemos hacer el siguiente diagrama de dispersión.

Modelo con respuesta IG (Inverse Gaussian)

El parámetro \(\mu\) es la media de la distribución.

## --------------------------------------------------- 
## Distribution parameter:  mu 
## Start:  AIC= 730.57 
##  Peso ~ 1 
## 
##                Df    AIC
## + Tiempo        1 710.29
## + I(Tiempo^2)   1 713.21
## + Dieta         2 726.93
## + Temp          1 728.25
## + I(Temp^2)     1 728.32
## <none>            730.57
## + Humedad       1 731.19
## + I(Humedad^2)  1 731.50
## 
## Step:  AIC= 710.29 
##  Peso ~ Tiempo 
## 
##                Df    AIC
## + Dieta         2 703.78
## + Temp          1 705.95
## + I(Temp^2)     1 706.04
## + I(Tiempo^2)   1 706.13
## <none>            710.29
## + Humedad       1 710.72
## + I(Humedad^2)  1 711.10
## 
## Step:  AIC= 703.78 
##  Peso ~ Tiempo + Dieta 
## 
##                Df    AIC
## + I(Tiempo^2)   1 699.32
## + I(Temp^2)     1 702.44
## + Temp          1 702.56
## <none>            703.78
## + Humedad       1 705.00
## + I(Humedad^2)  1 705.27
## 
## Step:  AIC= 699.32 
##  Peso ~ Tiempo + Dieta + I(Tiempo^2) 
## 
##                Df    AIC
## + I(Temp^2)     1 697.63
## + Temp          1 697.72
## <none>            699.32
## + Humedad       1 700.55
## + I(Humedad^2)  1 700.82
## 
## Step:  AIC= 697.63 
##  Peso ~ Tiempo + Dieta + I(Tiempo^2) + I(Temp^2) 
## 
##                Df    AIC
## <none>            697.63
## + Humedad       1 698.57
## + I(Humedad^2)  1 698.92
## + Temp          1 699.56
## --------------------------------------------------- 
## Distribution parameter:  sigma 
## Start:  AIC= 697.63 
##  ~1 
## 
##                Df    AIC
## + I(Temp^2)     1 679.99
## + Temp          1 684.28
## + Tiempo        1 695.12
## + I(Tiempo^2)   1 696.04
## + Dieta         2 696.56
## <none>            697.63
## + I(Humedad^2)  1 698.30
## + Humedad       1 698.38
## 
## Step:  AIC= 679.99 
##  ~I(Temp^2) 
## 
##                Df    AIC
## + Temp          1 667.16
## + Dieta         2 674.30
## + Tiempo        1 677.43
## + I(Tiempo^2)   1 679.18
## <none>            679.99
## + I(Humedad^2)  1 681.99
## + Humedad       1 681.99
## 
## Step:  AIC= 667.16 
##  ~I(Temp^2) + Temp 
## 
##                Df    AIC
## + Dieta         2 649.52
## + Tiempo        1 666.91
## <none>            667.16
## + I(Tiempo^2)   1 668.45
## + I(Humedad^2)  1 669.08
## + Humedad       1 669.10
## 
## Step:  AIC= 649.52 
##  ~I(Temp^2) + Temp + Dieta 
## 
##                Df    AIC
## + I(Humedad^2)  1 610.16
## + Humedad       1 611.24
## + Tiempo        1 646.20
## + I(Tiempo^2)   1 648.03
## <none>            649.52
## 
## Step:  AIC= 610.16 
##  ~I(Temp^2) + Temp + Dieta + I(Humedad^2) 
## 
##               Df    AIC
## <none>           610.16
## + Tiempo       1 611.75
## + I(Tiempo^2)  1 611.87
## + Humedad      1 650.89
## --------------------------------------------------- 
## Distribution parameter:  mu 
## Start:  AIC= 610.16 
##  Peso ~ Tiempo + Dieta + I(Tiempo^2) + I(Temp^2) 
## 
##               Df    AIC
## - I(Temp^2)    1 608.36
## <none>           610.16
## - Dieta        2 692.03
## - I(Tiempo^2)  1 706.94
## - Tiempo       1 709.64
## 
## Step:  AIC= 608.36 
##  Peso ~ Tiempo + Dieta + I(Tiempo^2) 
## 
##               Df    AIC
## <none>           608.36
## - Dieta        2 692.71
## - I(Tiempo^2)  1 710.10
## - Tiempo       1 715.26
## ---------------------------------------------------
## Warning in summary.gamlss(mod3): summary: vcov has failed, option qr is used instead
## ******************************************************************
## Family:  c("IG", "Inverse Gaussian") 
## 
## Call:  
## gamlss(formula = Peso ~ Tiempo + Dieta + I(Tiempo^2), sigma.formula = ~I(Temp^2) +  
##     Temp + Dieta + I(Humedad^2), family = IG, data = datis, control = control1,  
##     i.control = control2, trace = FALSE) 
## 
## Fitting method: RS() 
## 
## ------------------------------------------------------------------
## Mu link function:  log
## Mu Coefficients:
##               Estimate Std. Error   t value Pr(>|t|)    
## (Intercept)  7.640e+00  1.512e-03  5053.882  < 2e-16 ***
## Tiempo       8.818e-02  1.241e-05  7106.686  < 2e-16 ***
## Dieta1      -3.284e-02  1.507e-03   -21.791  < 2e-16 ***
## Dieta2       2.120e-02  7.780e-03     2.725  0.00927 ** 
## I(Tiempo^2) -1.757e-03  3.053e-07 -5754.272  < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## ------------------------------------------------------------------
## Sigma link function:  log
## Sigma Coefficients:
##                Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  -1.085e+01  3.732e+00  -2.907  0.00581 ** 
## I(Temp^2)    -6.083e-02  9.300e-03  -6.541 6.63e-08 ***
## Temp          1.791e+00  3.763e-01   4.760 2.31e-05 ***
## Dieta1       -1.857e+00  2.411e-01  -7.700 1.47e-09 ***
## Dieta2        3.374e+00  2.965e-01  11.379 2.07e-14 ***
## I(Humedad^2) -1.188e-03  8.742e-05 -13.589  < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## ------------------------------------------------------------------
## No. of observations in the fit:  48 
## Degrees of Freedom for the fit:  11
##       Residual Deg. of Freedom:  37 
##                       at cycle:  18 
##  
## Global Deviance:     586.3558 
##             AIC:     608.3558 
##             SBC:     628.939 
## ******************************************************************

A continuación se construye el gráfico de gusano el cual es un herramienta para explorar el comportamiento de los residuales. Si el modelo está bien ajustado se espera que los puntos (residuales) queden dentro de las hipérbolas.

De la figura anterior se observa que los residuales caen en la parte central (dentro de las hipérbolas).

A continuación calculamos el coeficiente de correlación lineal entre los \(y_i\) y \(\hat{E}(y | x)\) para el modelo en cuestión.

## [1] 0.708554

El valor de \(R^2_{pseudo}\) es:

## [1] 0.9461271

Para ver si los valores \(\hat{E}(y | x)\) acompaña el valor de \(y_i\) podemos hacer el siguiente diagrama de dispersión.

Modelo con respuesta GA (Gamma)

El parámetro \(\mu\) es la media de la distribución.

## --------------------------------------------------- 
## Distribution parameter:  mu 
## Start:  AIC= 731.07 
##  Peso ~ 1 
## 
##                Df    AIC
## + Tiempo        1 711.31
## + I(Tiempo^2)   1 714.18
## + Dieta         2 727.49
## + Temp          1 728.77
## + I(Temp^2)     1 728.85
## <none>            731.07
## + Humedad       1 731.74
## + I(Humedad^2)  1 732.04
## 
## Step:  AIC= 711.31 
##  Peso ~ Tiempo 
## 
##                Df    AIC
## + Dieta         2 704.80
## + Temp          1 706.48
## + I(Temp^2)     1 706.56
## + I(Tiempo^2)   1 707.04
## <none>            711.31
## + Humedad       1 711.77
## + I(Humedad^2)  1 712.14
## 
## Step:  AIC= 704.8 
##  Peso ~ Tiempo + Dieta 
## 
##                Df    AIC
## + I(Tiempo^2)   1 700.23
## + I(Temp^2)     1 702.91
## + Temp          1 703.03
## <none>            704.80
## + Humedad       1 706.20
## + I(Humedad^2)  1 706.42
## 
## Step:  AIC= 700.23 
##  Peso ~ Tiempo + Dieta + I(Tiempo^2) 
## 
##                Df    AIC
## + I(Temp^2)     1 697.78
## + Temp          1 697.87
## <none>            700.23
## + Humedad       1 701.64
## + I(Humedad^2)  1 701.87
## 
## Step:  AIC= 697.78 
##  Peso ~ Tiempo + Dieta + I(Tiempo^2) + I(Temp^2) 
## 
##                Df    AIC
## <none>            697.78
## + Humedad       1 698.78
## + I(Humedad^2)  1 699.12
## + Temp          1 699.72
## --------------------------------------------------- 
## Distribution parameter:  sigma 
## Start:  AIC= 697.78 
##  ~1 
## 
##                Df    AIC
## + I(Temp^2)     1 680.55
## + Temp          1 684.81
## + Tiempo        1 695.02
## + I(Tiempo^2)   1 695.99
## + Dieta         2 697.01
## <none>            697.78
## + I(Humedad^2)  1 698.55
## + Humedad       1 698.65
## 
## Step:  AIC= 680.55 
##  ~I(Temp^2) 
## 
##                Df    AIC
## + Temp          1 667.29
## + Dieta         2 676.54
## + Tiempo        1 678.68
## + I(Tiempo^2)   1 680.23
## <none>            680.55
## + Humedad       1 682.53
## + I(Humedad^2)  1 682.53
## 
## Step:  AIC= 667.29 
##  ~I(Temp^2) + Temp 
## 
##                Df    AIC
## + Dieta         2 650.38
## <none>            667.29
## + Tiempo        1 668.30
## + I(Tiempo^2)   1 669.12
## + I(Humedad^2)  1 669.22
## + Humedad       1 669.24
## 
## Step:  AIC= 650.38 
##  ~I(Temp^2) + Temp + Dieta 
## 
##                Df    AIC
## + I(Humedad^2)  1 610.70
## + Humedad       1 611.92
## + Tiempo        1 648.91
## + I(Tiempo^2)   1 650.16
## <none>            650.38
## 
## Step:  AIC= 610.7 
##  ~I(Temp^2) + Temp + Dieta + I(Humedad^2) 
## 
##               Df    AIC
## <none>           610.70
## + I(Tiempo^2)  1 612.64
## + Tiempo       1 612.68
## + Humedad      1 652.47
## --------------------------------------------------- 
## Distribution parameter:  mu 
## Start:  AIC= 610.7 
##  Peso ~ Tiempo + Dieta + I(Tiempo^2) + I(Temp^2) 
## 
##               Df    AIC
## - I(Temp^2)    1 609.26
## <none>           610.70
## - Dieta        2 691.28
## - I(Tiempo^2)  1 707.86
## - Tiempo       1 711.05
## 
## Step:  AIC= 609.26 
##  Peso ~ Tiempo + Dieta + I(Tiempo^2) 
## 
##               Df    AIC
## <none>           609.26
## - Dieta        2 640.48
## - I(Tiempo^2)  1 711.88
## - Tiempo       1 716.62
## ---------------------------------------------------
## Warning in summary.gamlss(mod4): summary: vcov has failed, option qr is used instead
## ******************************************************************
## Family:  c("GA", "Gamma") 
## 
## Call:  
## gamlss(formula = Peso ~ Tiempo + Dieta + I(Tiempo^2), sigma.formula = ~I(Temp^2) +  
##     Temp + Dieta + I(Humedad^2), family = GA, data = datis, control = control1,  
##     i.control = control2, trace = FALSE) 
## 
## Fitting method: RS() 
## 
## ------------------------------------------------------------------
## Mu link function:  log
## Mu Coefficients:
##               Estimate Std. Error   t value Pr(>|t|)    
## (Intercept)  7.640e+00  1.549e-03  4932.799   <2e-16 ***
## Tiempo       8.818e-02  1.160e-05  7598.815   <2e-16 ***
## Dieta1      -3.258e-02  1.545e-03   -21.088   <2e-16 ***
## Dieta2       1.921e-02  7.570e-03     2.538   0.0149 *  
## I(Tiempo^2) -1.757e-03  2.843e-07 -6179.988   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## ------------------------------------------------------------------
## Sigma link function:  log
## Sigma Coefficients:
##                Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  -6.585e+00  3.713e+00  -1.773   0.0835 .  
## I(Temp^2)    -6.118e-02  9.263e-03  -6.605 5.35e-08 ***
## Temp          1.804e+00  3.747e-01   4.814 1.94e-05 ***
## Dieta1       -1.906e+00  2.408e-01  -7.917 7.31e-10 ***
## Dieta2        3.358e+00  2.952e-01  11.375 2.09e-14 ***
## I(Humedad^2) -1.195e-03  8.704e-05 -13.729  < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## ------------------------------------------------------------------
## No. of observations in the fit:  48 
## Degrees of Freedom for the fit:  11
##       Residual Deg. of Freedom:  37 
##                       at cycle:  17 
##  
## Global Deviance:     587.2553 
##             AIC:     609.2553 
##             SBC:     629.8385 
## ******************************************************************

A continuación se construye el gráfico de gusano el cual es un herramienta para explorar el comportamiento de los residuales. Si el modelo está bien ajustado se espera que los puntos (residuales) queden dentro de las hipérbolas.

De la figura anterior se observa que los residuales caen en la parte central (dentro de las hipérbolas).

A continuación calculamos el coeficiente de correlación lineal entre los \(y_i\) y \(\hat{E}(y | x)\) para el modelo en cuestión.

## [1] 0.7081088

El valor de \(R^2_{pseudo}\) es:

## [1] 0.9456714

Para ver si los valores \(\hat{E}(y | x)\) acompaña el valor de \(y_i\) podemos hacer el siguiente diagrama de dispersión.

Modelo con respuesta GG (Generalized Gamma)

Para este modelo se tuvo que cambiar el párametro de control control1.

## --------------------------------------------------- 
## Start:  AIC= 715.69 
##  Peso ~ 1 
## 
## Model with term  Dieta has failed 
## Model with term  Dieta has failed 
## --------------------------------------------------- 
## Start:  AIC= 698.42 
##  ~1 
## 
## --------------------------------------------------- 
## Start:  AIC= 611.22 
##  ~1 
## 
## Model with term  Temp has failed 
## Model with term  Humedad has failed 
## Model with term  I(Temp^2) has failed 
## Model with term  I(Humedad^2) has failed 
## --------------------------------------------------- 
## Start:  AIC= 595.21 
##  ~I(Temp^2) + Temp + Dieta + I(Humedad^2) 
## 
## Model with term  I(Humedad^2) has failed 
## --------------------------------------------------- 
## Start:  AIC= 595.21 
##  Peso ~ Tiempo + I(Tiempo^2) + Dieta 
## 
## Model with term  I(Tiempo^2) has failed 
## ---------------------------------------------------
## Warning in summary.gamlss(mod5): summary: vcov has failed, option qr is used instead
## ******************************************************************
## Family:  c("GG", "generalised Gamma Lopatatsidis-Green") 
## 
## Call:  
## gamlss(formula = Peso ~ Tiempo + I(Tiempo^2) + Dieta, sigma.formula = ~I(Temp^2) +  
##     Temp + Dieta + I(Humedad^2), nu.formula = ~Tiempo + I(Tiempo^2) +  
##     Dieta, family = GG, data = datis, control = control1, i.control = control2,  
##     trace = FALSE) 
## 
## Fitting method: RS() 
## 
## ------------------------------------------------------------------
## Mu link function:  log
## Mu Coefficients:
##               Estimate Std. Error   t value Pr(>|t|)    
## (Intercept)  7.639e+00  9.147e-04  8351.824   <2e-16 ***
## Tiempo       8.818e-02  1.346e-05  6553.090   <2e-16 ***
## I(Tiempo^2) -1.757e-03  3.297e-07 -5329.520   <2e-16 ***
## Dieta1      -3.157e-02  9.056e-04   -34.863   <2e-16 ***
## Dieta2       3.417e-03  1.845e-03     1.853   0.0708 .  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## ------------------------------------------------------------------
## Sigma link function:  log
## Sigma Coefficients:
##                Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  -1.117e+01  2.835e+00  -3.940 0.000302 ***
## I(Temp^2)    -5.595e-02  7.059e-03  -7.927 7.09e-10 ***
## Temp          1.752e+00  2.840e-01   6.169 2.27e-07 ***
## Dieta1       -2.512e+00  1.985e-01 -12.654 6.40e-16 ***
## Dieta2        1.721e+00  2.403e-01   7.159 8.61e-09 ***
## I(Humedad^2) -7.681e-04  7.451e-05 -10.308 4.50e-13 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## ------------------------------------------------------------------
## Nu link function:  identity 
## Nu Coefficients:
##              Estimate Std. Error t value Pr(>|t|)    
## (Intercept) -7008.715   1269.699  -5.520 1.82e-06 ***
## Tiempo        593.838    106.784   5.561 1.58e-06 ***
## I(Tiempo^2)   -12.211      2.203  -5.544 1.68e-06 ***
## Dieta1        598.584    187.876   3.186  0.00269 ** 
## Dieta2        -19.762     36.702  -0.538  0.59304    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## ------------------------------------------------------------------
## No. of observations in the fit:  48 
## Degrees of Freedom for the fit:  16
##       Residual Deg. of Freedom:  32 
##                       at cycle:  60 
##  
## Global Deviance:     563.2089 
##             AIC:     595.2089 
##             SBC:     625.1481 
## ******************************************************************

A continuación se construye el gráfico de gusano el cual es un herramienta para explorar el comportamiento de los residuales. Si el modelo está bien ajustado se espera que los puntos (residuales) queden dentro de las hipérbolas.

De la figura anterior se observa que los residuales caen en la parte central (dentro de las hipérbolas).

A continuación calculamos el coeficiente de correlación lineal entre los \(y_i\) y \(\hat{E}(y | x)\) para el modelo en cuestión.

## [1] 0.7035563

El valor de \(R^2_{pseudo}\) es:

## [1] 0.9524221

Para ver si los valores \(\hat{E}(y | x)\) acompaña el valor de \(y_i\) podemos hacer el siguiente diagrama de dispersión.

Comparación los modelos

En esta sección se muestran los resultados comparando los modelos.

Usando \(\rho(y, \hat{E}(y | x))\) y \(R^2_{pseudo}\)

## Warning: package 'kableExtra' was built under R version 3.6.3
correlacion r2_pseudo
mod0 0.77 0.59
mod1 0.61 0.90
mod2 0.71 0.94
mod3 0.71 0.95
mod4 0.71 0.95
mod5 0.70 0.95

De la tabla anterior se observa que mod1 tiene el segundo mejor \(\rho\) y el mejor \(R^2_{pseudo}\).

Usando el criterio del GAIC

Otra forma de comparar modelos no anidados es por medio del GAIC.

df AIC
mod5 16 625.1481
mod3 11 628.9390
mod4 11 629.8385
mod2 11 635.0056
mod1 14 673.5703
mod0 7 712.6546

De la tabla anterior se observa que el mejor modelo es mod1 ya que presenta el menor GAIC.

El mejor modelo

El mejor modelo identificado hasta ahora fue el modelo mod1 que tiene respuesta normal y para el cual se modeló \(\mu\) y \(\sigma\).

A continuación la tabla de resumen del modelo.

## ******************************************************************
## Family:  c("NO", "Normal") 
## 
## Call:  gamlss(formula = Peso ~ Tiempo + I(Tiempo^2) + Dieta +  
##     Temp + I(Temp^2), sigma.formula = ~I(Temp^2) +  
##     Temp + Dieta + I(Humedad^2) + Humedad, family = NO,  
##     data = datis, control = control1, i.control = control2,  
##     trace = FALSE) 
## 
## Fitting method: RS() 
## 
## ------------------------------------------------------------------
## Mu link function:  identity
## Mu Coefficients:
##               Estimate Std. Error   t value Pr(>|t|)    
## (Intercept) 9098.00719   98.36123    92.496  < 2e-16 ***
## Tiempo       357.89672    0.12770  2802.583  < 2e-16 ***
## I(Tiempo^2)   -7.05358    0.00311 -2268.099  < 2e-16 ***
## Dieta1      -183.14956   58.33909    -3.139 0.003492 ** 
## Dieta2       139.11145   34.22307     4.065 0.000269 ***
## Temp        -771.08472    1.89764  -406.340  < 2e-16 ***
## I(Temp^2)     18.80639    0.19103    98.446  < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## ------------------------------------------------------------------
## Sigma link function:  log
## Sigma Coefficients:
##                Estimate Std. Error  t value Pr(>|t|)    
## (Intercept)   1.329e+02  1.341e+00   99.093   <2e-16 ***
## I(Temp^2)    -1.221e-01  2.888e-03  -42.276   <2e-16 ***
## Temp          4.625e+00  1.174e-01   39.408   <2e-16 ***
## Dieta1       -2.344e-01  2.982e-01   -0.786    0.437    
## Dieta2       -4.002e+00  2.142e-01  -18.681   <2e-16 ***
## I(Humedad^2)  2.729e-02  1.406e-04  194.132   <2e-16 ***
## Humedad      -4.307e+00  1.786e-02 -241.149   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## ------------------------------------------------------------------
## No. of observations in the fit:  48 
## Degrees of Freedom for the fit:  14
##       Residual Deg. of Freedom:  34 
##                       at cycle:  10 
##  
## Global Deviance:     619.3734 
##             AIC:     647.3734 
##             SBC:     673.5703 
## ******************************************************************

La media estimada para el peso está dada por:

\[ \widehat{E}(y) = 9098.01 + 357.9 \times Time + -7.05 \times Time^2 + -183.15 \times Dieta1 + 139.11 \times Dieta2 + -771.08 \times Temp + 18.81 \times Temp^2 \]

La desviación estimada para el peso está dada por:

\[ \log(\widehat{Des}(y)) = 132.92 + 4.62 \times Temp + -0.12 \times Temp^2 + -0.23 \times Dieta1 + -4 \times Dieta2 + -4.31 \times Hum + 0.03 \times Hum^2 \]

Maximizando

A continuación se muestra tres diagramas de contornos para \(\widehat{E}(y | tiempo, temp)\) para cada una de las dietas. Los puntos en rojo representan la combinación de tiempo y temperatura que maximizan el peso.

A continuación las tres superficies.

Los valores de tiempo y temperatura que maximizan el peso son los siguientes:

Tiempo Temperatura Peso máximo
Dieta 0 25.36987 15 6303.072
Dieta 1 25.36987 15 6119.923
Dieta 2 25.36987 15 6442.184
LS0tDQp0aXRsZTogIk1vZGVsb3MgZ2FtbHNzIGFwbGljYWRvcyBhIGxhIHByb2R1Y2Npw7NuIGRlIGxhIGxvbWJyaXogcm9qYSBjYWxpZm9ybmlhbmEiDQphdXRob3I6ICJMb3MgYXV0b3JlcyINCmRhdGU6ICJgciBmb3JtYXQoU3lzLnRpbWUoKSwgJyVkICVCLCAlWScpYCINCm91dHB1dDogDQogIGh0bWxfZG9jdW1lbnQ6IA0KICAgIGNvZGVfZG93bmxvYWQ6IHllcw0KICAgIGhpZ2hsaWdodDogcHlnbWVudHMNCiAgICB0aGVtZTogdW5pdGVkDQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZmxvYXQ6DQogICAgICBjb2xsYXBzZWQ6IHllcw0KLS0tDQoNCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFKQ0KYGBgDQoNCjxwIGFsaWduPSJjZW50ZXIiPg0KICA8aW1nIHNyYz0ibG9tYnJpei5wbmciIHdpZHRoPSIzMDAiPg0KPC9wPg0KDQojIERhdG9zDQpBYmFqbyBsYXMgaW5zdHJ1Y2Npb25lcyBwYXJhIGNhcmdhciBsb3MgZGF0b3MgZGVsIGV4cGVyaW1lbnRvLg0KDQpgYGB7cn0NCmRhdG9zIDwtIHJlYWQudGFibGUoJ2RhdG9zbG9tYicsIGhlYWRlciA9IFRSVUUpDQpoZWFkKGRhdG9zKQ0KYGBgDQoNClZhbW9zIGEgY29udmVydGlyIGEgZmFjdG9yIGxhIHZhcmlhYmxlIERpZXRhLg0KDQpgYGB7cn0NCmRhdG9zJERpZXRhIDwtIGZhY3RvcihkYXRvcyREaWV0YSkNCmBgYA0KDQpWYW1vcyBhIHF1ZWRhcm5vcyBjb24gbGFzIGZpbGFzIGRpc3RpbnRhcyBkZSBsYSBiYXNlIGBkYXRvc2AgeSBsYSBhbG1hY2VuYW1vcyBlbiBgZGF0aXNgLg0KDQpgYGB7ciBtZXNzYWdlPUZBTFNFfQ0KbGlicmFyeShkcGx5cikNCmRhdGlzIDwtIGRpc3RpbmN0KGRhdG9zLCBIdW1lZGFkLCBUZW1wLCBEaWV0YSwgVGllbXBvLCBQZXNvKQ0KYGBgDQoNCiMgRGlzdHJpYnVjaW9uZXMgcXVlIG1lam9yIGV4cGxpY2FuIGVsIFBlc28NCg0KYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCmxpYnJhcnkoZ2FtbHNzKQ0KbW9kIDwtIGZpdERpc3QoeT1kYXRpcyRQZXNvLCB0eXBlPSJyZWFscGx1cyIsIGs9bG9nKG5yb3coZGF0aXMpKSkNCm1vZCRmaXRzDQptb2QkZmFpbHMNCmBgYA0KDQojIEV4cGxvcmFuZG8gYWxndW5hcyByZWxhY2lvbmVzIGVudHJlIFBlc28geSBsYXMgb3RyYXMgdmFyaWFibGVzDQoNCmBgYHtyIGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD0xMH0NCnBhcihtZnJvdz1jKDIsIDIpKQ0Kd2l0aChkYXRpcywgcGxvdChQZXNvIH4gVGllbXBvLCBsYXM9MSwgcGNoPTIwKSkNCndpdGgoZGF0aXMsIHBsb3QoUGVzbyB+IEh1bWVkYWQsIGxhcz0xLCBwY2g9MjApKQ0Kd2l0aChkYXRpcywgcGxvdChQZXNvIH4gVGVtcCwgbGFzPTEsIHBjaD0yMCkpDQp3aXRoKGRhdGlzLCBwbG90KFBlc28gfiBEaWV0YSwgbGFzPTEsIHBjaD0yMCkpDQpgYGANCg0KIyBBcGxpY2FjacOzbiBkZSBtb2RlbG9zIGdhbWxzcw0KRWwgY8OzZGlnbyBtb3N0cmFkbyBhIGNvbnRpbnVhY2nDs24gbW9kaWZpY2EgYWxndW5vcyBwYXLDoW10ZXJvcyBpbnRlcm5vcyBwYXJhIGhhY2VyIG3DoXMgZXhoYXVzdGl2YSBsYSBlc3RpbWFjacOzbiBkZSBsb3MgcGFyw6FtZXRyb3MuDQoNCmBgYHtyfQ0KbGlicmFyeShnYW1sc3MpDQpjb250cm9sMSA8LSBnYW1sc3MuY29udHJvbChuLmN5Yz0xNTAwMCwgYy5jcml0PTAuMDAwMDEsIHRyYWNlPUZBTFNFKQ0KY29udHJvbDIgPC0gZ2xpbS5jb250cm9sKGN5Yz0xNTAwMCwgYmYuY3ljPTMwMDAsIHRyYWNlPUZBTFNFKQ0KYGBgDQoNClBhcmEgbGEgY29uc3RydWNjacOzbiBkZSBsb3MgbW9kZWxvcyBzZSB1dGlsaXphcsOhIHVuIHByb2Nlc28gZGUgc2VsZWNjacOzbiBkZSB2YXJpYWJsZXMgaGFjaWEgYWRlbGFudGUgeSBlbCBob3Jpem9udGUgZGUgbW9kZWxhY2nDs24gcGFyYSBjYWRhIHBhcsOhbWV0cm8gc2Vyw6EgZWwgYGhvcml6b250ZWAgZGUgYWJham8uIA0KDQpgYGB7cn0NCmhvcml6b250ZSA8LSBmb3JtdWxhKH4gVGVtcCArIEh1bWVkYWQgKyBUaWVtcG8gKyBEaWV0YSArDQogICAgICAgICAgICAgICAgICAgICAgIEkoVGVtcF4yKSArIEkoSHVtZWRhZF4yKSArIEkoVGllbXBvXjIpKQ0KYGBgDQoNCiMjIE1vZGVsbyBjb24gcmVzcHVlc3RhIG5vcm1hbCBtb2RlbGFuZG8gJFxtdSQgc29sYW1lbnRlIChkZSByZWZlcmVuY2lhKQ0KRWwgcGFyw6FtZXRybyAkXG11JCBlcyBsYSBtZWRpYSB5ICRcc2lnbWEkIGVzIGxhIGRlc3ZpYWNpw7NuIGRlIGxhIGRpc3RyaWJ1Y2nDs24uDQoNCmBgYHtyfQ0KY29udHJvbDEgPC0gZ2FtbHNzLmNvbnRyb2wobi5jeWM9MTUwMDAsIGMuY3JpdD0wLjAwMSwgdHJhY2U9RkFMU0UpDQpjb250cm9sMiA8LSBnbGltLmNvbnRyb2woY3ljPTE1MDAwLCBiZi5jeWM9MzAwMCwgdHJhY2U9RkFMU0UpDQptb2QwIDwtIGdhbWxzcyhQZXNvIH4gMSwNCiAgICAgICAgICAgICAgIGRhdGE9ZGF0aXMsIGNvbnRyb2w9Y29udHJvbDEsIGkuY29udHJvbD1jb250cm9sMiwNCiAgICAgICAgICAgICAgIGZhbWlseT1OTykNCg0KbW9kMCA8LSBzdGVwR0FJQ0FsbC5BKG9iamVjdD1tb2QwLCB0cmFjZT0wLA0KICAgICAgICAgICAgICAgICAgICAgIHNjb3BlPWhvcml6b250ZSwgDQogICAgICAgICAgICAgICAgICAgICAgc2lnbWEuc2NvcGU9Zm9ybXVsYSh+MSkpDQoNCnN1bW1hcnkobW9kMCkNCmBgYA0KDQpBIGNvbnRpbnVhY2nDs24gc2UgY29uc3RydXllIGVsIGdyw6FmaWNvIGRlIGd1c2FubyBlbCBjdWFsIGVzIHVuIGhlcnJhbWllbnRhIHBhcmEgZXhwbG9yYXIgZWwgY29tcG9ydGFtaWVudG8gZGUgbG9zIHJlc2lkdWFsZXMuIFNpIGVsIG1vZGVsbyBlc3TDoSBiaWVuIGFqdXN0YWRvIHNlIGVzcGVyYSBxdWUgbG9zIHB1bnRvcyAocmVzaWR1YWxlcykgcXVlZGVuIGRlbnRybyBkZSBsYXMgaGlww6lyYm9sYXMuDQoNCmBgYHtyfQ0Kd3AobW9kMCkNCmBgYA0KDQpEZSBsYSBmaWd1cmEgYW50ZXJpb3Igc2Ugb2JzZXJ2YSBxdWUgbG9zIHJlc2lkdWFsZXMgY2FlbiBlbiBsYSBwYXJ0ZSBjZW50cmFsIChkZW50cm8gZGUgbGFzIGhpcMOpcmJvbGFzKS4NCg0KQSBjb250aW51YWNpw7NuIGNhbGN1bGFtb3MgZWwgY29lZmljaWVudGUgZGUgY29ycmVsYWNpw7NuIGxpbmVhbCBlbnRyZSBsb3MgJHlfaSQgeSAkXGhhdHtFfSh5IHwgeCkkIHBhcmEgZWwgbW9kZWxvIGVuIGN1ZXN0acOzbi4gDQoNCmBgYHtyfQ0KeTAgPC0gZml0dGVkKG9iamVjdD1tb2QwLCB3aGF0PSdtdScpDQpjb3IoZGF0aXMkUGVzbywgeTApDQpgYGANCg0KRWwgdmFsb3IgZGUgJFJeMl97cHNldWRvfSQgZXM6DQoNCmBgYHtyfQ0KUnNxKG1vZDApDQpgYGANCg0KUGFyYSB2ZXIgc2kgbG9zIHZhbG9yZXMgJFxoYXR7RX0oeSB8IHgpJCBhY29tcGHDsWEgZWwgdmFsb3IgZGUgJHlfaSQgcG9kZW1vcyBoYWNlciBlbCBzaWd1aWVudGUgZGlhZ3JhbWEgZGUgZGlzcGVyc2nDs24uDQoNCmBgYHtyfQ0KcGxvdCh4PWRhdGlzJFBlc28sIHk9eTAsIGxhcz0xKQ0KYWJsaW5lKGE9MCwgYj0xLCBsdHk9J2Rhc2hlZCcpDQpgYGANCg0KIyMgTW9kZWxvIGNvbiByZXNwdWVzdGEgbm9ybWFsIG1vZGVsYW5kbyAkXG11JCB5ICRcc2lnbWEkDQpFbCBwYXLDoW1ldHJvICRcbXUkIGVzIGxhIG1lZGlhIHkgJFxzaWdtYSQgZXMgbGEgZGVzdmlhY2nDs24gZGUgbGEgZGlzdHJpYnVjacOzbi4NCg0KYGBge3J9DQptb2QxIDwtIGdhbWxzcyhQZXNvIH4gMSwNCiAgICAgICAgICAgICAgIHNpZ21hLmZvPSB+IDEsIA0KICAgICAgICAgICAgICAgZGF0YT1kYXRpcywgY29udHJvbD1jb250cm9sMSwgaS5jb250cm9sPWNvbnRyb2wyLA0KICAgICAgICAgICAgICAgZmFtaWx5PU5PKQ0KDQptb2QxIDwtIHN0ZXBHQUlDQWxsLkEob2JqZWN0PW1vZDEsIHRyYWNlPTAsDQogICAgICAgICAgICAgICAgICAgICAgc2NvcGU9aG9yaXpvbnRlLCANCiAgICAgICAgICAgICAgICAgICAgICBzaWdtYS5zY29wZT1ob3Jpem9udGUpDQpzdW1tYXJ5KG1vZDEpDQpgYGANCg0KYGBge3J9DQptb2QxIDwtIHVwZGF0ZShtb2QxLCB3aGF0PSdtdScsDQogICAgICAgICAgICAgICBmb3JtdWxhPVBlc28gfiBUaWVtcG8gKyBJKFRpZW1wb14yKSArIERpZXRhICsgVGVtcCArIEkoVGVtcF4yKSkNCmBgYA0KDQoNCkEgY29udGludWFjacOzbiBzZSBjb25zdHJ1eWUgZWwgZ3LDoWZpY28gZGUgZ3VzYW5vIGVsIGN1YWwgZXMgdW4gaGVycmFtaWVudGEgcGFyYSBleHBsb3JhciBlbCBjb21wb3J0YW1pZW50byBkZSBsb3MgcmVzaWR1YWxlcy4gU2kgZWwgbW9kZWxvIGVzdMOhIGJpZW4gYWp1c3RhZG8gc2UgZXNwZXJhIHF1ZSBsb3MgcHVudG9zIChyZXNpZHVhbGVzKSBxdWVkZW4gZGVudHJvIGRlIGxhcyBoaXDDqXJib2xhcy4NCg0KYGBge3J9DQp3cChtb2QxKQ0KYGBgDQoNCkRlIGxhIGZpZ3VyYSBhbnRlcmlvciBzZSBvYnNlcnZhIHF1ZSBsb3MgcmVzaWR1YWxlcyBjYWVuIGVuIGxhIHBhcnRlIGNlbnRyYWwgKGRlbnRybyBkZSBsYXMgaGlww6lyYm9sYXMpLg0KDQpBIGNvbnRpbnVhY2nDs24gY2FsY3VsYW1vcyBlbCBjb2VmaWNpZW50ZSBkZSBjb3JyZWxhY2nDs24gbGluZWFsIGVudHJlIGxvcyAkeV9pJCB5ICRcaGF0e0V9KHkgfCB4KSQgcGFyYSBlbCBtb2RlbG8gZW4gY3Vlc3Rpw7NuLiANCg0KYGBge3J9DQp5MSA8LSBmaXR0ZWQob2JqZWN0PW1vZDEsIHdoYXQ9J211JykNCmNvcihkYXRpcyRQZXNvLCB5MSkNCmBgYA0KDQpFbCB2YWxvciBkZSAkUl4yX3twc2V1ZG99JCBlczoNCg0KYGBge3J9DQpSc3EobW9kMSkNCmBgYA0KDQpQYXJhIHZlciBzaSBsb3MgdmFsb3JlcyAkXGhhdHtFfSh5IHwgeCkkIGFjb21wYcOxYSBlbCB2YWxvciBkZSAkeV9pJCBwb2RlbW9zIGhhY2VyIGVsIHNpZ3VpZW50ZSBkaWFncmFtYSBkZSBkaXNwZXJzacOzbi4NCg0KYGBge3J9DQpwbG90KHg9ZGF0aXMkUGVzbywgeT15MSwgbGFzPTEpDQphYmxpbmUoYT0wLCBiPTEsIGx0eT0nZGFzaGVkJykNCmBgYA0KDQojIyBNb2RlbG8gY29uIHJlc3B1ZXN0YSBJR0FNTUEgKEludmVyc2UgR2FtbWEpDQpFbCBwYXLDoW1ldHJvICRcbXUkIGVzIGxhIG1vZGEgZGUgbGEgZGlzdHJpYnVjacOzbi4NCg0KYGBge3J9DQptb2QyIDwtIGdhbWxzcyhQZXNvIH4gMSwNCiAgICAgICAgICAgICAgIHNpZ21hLmZvPSB+IDEsIA0KICAgICAgICAgICAgICAgbnUuZm89IH4gMSwNCiAgICAgICAgICAgICAgIGRhdGE9ZGF0aXMsIGNvbnRyb2w9Y29udHJvbDEsIGkuY29udHJvbD1jb250cm9sMiwgDQogICAgICAgICAgICAgICBmYW1pbHk9SUdBTU1BKQ0KDQptb2QyIDwtIHN0ZXBHQUlDQWxsLkEob2JqZWN0PW1vZDIsDQogICAgICAgICAgICAgICAgICAgICAgc2NvcGUgPSBob3Jpem9udGUsIA0KICAgICAgICAgICAgICAgICAgICAgIHNpZ21hLnNjb3BlID0gaG9yaXpvbnRlLA0KICAgICAgICAgICAgICAgICAgICAgIG51LnNjb3BlID0gaG9yaXpvbnRlKQ0Kc3VtbWFyeShtb2QyKQ0KYGBgDQoNCkRlIGxhIHRhYmxhIGRlIHJlc3VtZW4gYW50ZXJpb3Igc2Ugb2JzZXJ2YSBxdWUgJFRlbXBeMiQgbm8gZXMgc2lnbmlmaWNhdGl2byBlbiBsYSBtb2RlbGFjacOzbiBkZSAkXG11JCwgcG9yIGVzdGEgcmF6w7NuIHNlIHZhIGEgYWp1c3RhciBudWV2YW1lbnRlIGVsIG1vZGVsbyBzaSDDqWwuDQoNCmBgYHtyfQ0KbW9kMiA8LSB1cGRhdGUobW9kMiwgd2hhdD0nbXUnLA0KICAgICAgICAgICAgICAgZm9ybXVsYT1QZXNvIH4gVGllbXBvICsgRGlldGEgKyBJKFRpZW1wb14yKSkNCmBgYA0KDQpBIGNvbnRpbnVhY2nDs24gc2UgY29uc3RydXllIGVsIGdyw6FmaWNvIGRlIGd1c2FubyBlbCBjdWFsIGVzIHVuIGhlcnJhbWllbnRhIHBhcmEgZXhwbG9yYXIgZWwgY29tcG9ydGFtaWVudG8gZGUgbG9zIHJlc2lkdWFsZXMuIFNpIGVsIG1vZGVsbyBlc3TDoSBiaWVuIGFqdXN0YWRvIHNlIGVzcGVyYSBxdWUgbG9zIHB1bnRvcyAocmVzaWR1YWxlcykgcXVlZGVuIGRlbnRybyBkZSBsYXMgaGlww6lyYm9sYXMuDQoNCmBgYHtyfQ0Kd3AobW9kMikNCmBgYA0KDQpEZSBsYSBmaWd1cmEgYW50ZXJpb3Igc2Ugb2JzZXJ2YSBxdWUgbG9zIHJlc2lkdWFsZXMgY2FlbiBlbiBsYSBwYXJ0ZSBjZW50cmFsIChkZW50cm8gZGUgbGFzIGhpcMOpcmJvbGFzKS4NCg0KQSBjb250aW51YWNpw7NuIGNhbGN1bGFtb3MgZWwgY29lZmljaWVudGUgZGUgY29ycmVsYWNpw7NuIGxpbmVhbCBlbnRyZSBsb3MgJHlfaSQgeSAkXGhhdHtFfSh5IHwgeCkkIHBhcmEgZWwgbW9kZWxvIGVuIGN1ZXN0acOzbi4gDQoNCmBgYHtyfQ0KeTIgPC0gZml0dGVkKG9iamVjdD1tb2QyLCB3aGF0PSdtdScpDQpjb3IoZGF0aXMkUGVzbywgeTIpDQpgYGANCg0KRWwgdmFsb3IgZGUgJFJeMl97cHNldWRvfSQgZXM6DQoNCmBgYHtyfQ0KUnNxKG1vZDIpDQpgYGANCg0KUGFyYSB2ZXIgc2kgbG9zIHZhbG9yZXMgJFxoYXR7RX0oeSB8IHgpJCBhY29tcGHDsWEgZWwgdmFsb3IgZGUgJHlfaSQgcG9kZW1vcyBoYWNlciBlbCBzaWd1aWVudGUgZGlhZ3JhbWEgZGUgZGlzcGVyc2nDs24uDQoNCmBgYHtyfQ0KcGxvdCh4PWRhdGlzJFBlc28sIHk9eTIsIGxhcz0xKQ0KYWJsaW5lKGE9MCwgYj0xLCBsdHk9J2Rhc2hlZCcpDQpgYGANCg0KIyMgTW9kZWxvIGNvbiByZXNwdWVzdGEgSUcgKEludmVyc2UgR2F1c3NpYW4pDQpFbCBwYXLDoW1ldHJvICRcbXUkIGVzIGxhIG1lZGlhIGRlIGxhIGRpc3RyaWJ1Y2nDs24uDQoNCmBgYHtyfQ0KbW9kMyA8LSBnYW1sc3MoUGVzbyB+IDEsDQogICAgICAgICAgICAgICBzaWdtYS5mbz0gfiAxLCANCiAgICAgICAgICAgICAgIGRhdGE9ZGF0aXMsIGNvbnRyb2w9Y29udHJvbDEsIGkuY29udHJvbD1jb250cm9sMiwgDQogICAgICAgICAgICAgICBmYW1pbHk9SUcpDQoNCm1vZDMgPC0gc3RlcEdBSUNBbGwuQShvYmplY3Q9bW9kMywNCiAgICAgICAgICAgICAgICAgICAgICBzY29wZSA9IGhvcml6b250ZSwgDQogICAgICAgICAgICAgICAgICAgICAgc2lnbWEuc2NvcGUgPSBob3Jpem9udGUsDQogICAgICAgICAgICAgICAgICAgICAgbnUuc2NvcGUgPSBob3Jpem9udGUpDQpzdW1tYXJ5KG1vZDMpDQpgYGANCg0KQSBjb250aW51YWNpw7NuIHNlIGNvbnN0cnV5ZSBlbCBncsOhZmljbyBkZSBndXNhbm8gZWwgY3VhbCBlcyB1biBoZXJyYW1pZW50YSBwYXJhIGV4cGxvcmFyIGVsIGNvbXBvcnRhbWllbnRvIGRlIGxvcyByZXNpZHVhbGVzLiBTaSBlbCBtb2RlbG8gZXN0w6EgYmllbiBhanVzdGFkbyBzZSBlc3BlcmEgcXVlIGxvcyBwdW50b3MgKHJlc2lkdWFsZXMpIHF1ZWRlbiBkZW50cm8gZGUgbGFzIGhpcMOpcmJvbGFzLg0KDQpgYGB7cn0NCndwKG1vZDMpDQpgYGANCg0KRGUgbGEgZmlndXJhIGFudGVyaW9yIHNlIG9ic2VydmEgcXVlIGxvcyByZXNpZHVhbGVzIGNhZW4gZW4gbGEgcGFydGUgY2VudHJhbCAoZGVudHJvIGRlIGxhcyBoaXDDqXJib2xhcykuDQoNCkEgY29udGludWFjacOzbiBjYWxjdWxhbW9zIGVsIGNvZWZpY2llbnRlIGRlIGNvcnJlbGFjacOzbiBsaW5lYWwgZW50cmUgbG9zICR5X2kkIHkgJFxoYXR7RX0oeSB8IHgpJCBwYXJhIGVsIG1vZGVsbyBlbiBjdWVzdGnDs24uIA0KDQpgYGB7cn0NCnkzIDwtIGZpdHRlZChvYmplY3Q9bW9kMywgd2hhdD0nbXUnKQ0KY29yKGRhdGlzJFBlc28sIHkzKQ0KYGBgDQoNCkVsIHZhbG9yIGRlICRSXjJfe3BzZXVkb30kIGVzOg0KDQpgYGB7cn0NClJzcShtb2QzKQ0KYGBgDQoNClBhcmEgdmVyIHNpIGxvcyB2YWxvcmVzICRcaGF0e0V9KHkgfCB4KSQgYWNvbXBhw7FhIGVsIHZhbG9yIGRlICR5X2kkIHBvZGVtb3MgaGFjZXIgZWwgc2lndWllbnRlIGRpYWdyYW1hIGRlIGRpc3BlcnNpw7NuLg0KDQpgYGB7cn0NCnBsb3QoeD1kYXRpcyRQZXNvLCB5PXkzLCBsYXM9MSkNCmFibGluZShhPTAsIGI9MSwgbHR5PSdkYXNoZWQnKQ0KYGBgDQoNCiMjIE1vZGVsbyBjb24gcmVzcHVlc3RhIEdBIChHYW1tYSkNCkVsIHBhcsOhbWV0cm8gJFxtdSQgZXMgbGEgbWVkaWEgZGUgbGEgZGlzdHJpYnVjacOzbi4NCg0KYGBge3J9DQptb2Q0IDwtIGdhbWxzcyhQZXNvIH4gMSwNCiAgICAgICAgICAgICAgIHNpZ21hLmZvPSB+IDEsIA0KICAgICAgICAgICAgICAgZGF0YT1kYXRpcywgY29udHJvbD1jb250cm9sMSwgaS5jb250cm9sPWNvbnRyb2wyLCANCiAgICAgICAgICAgICAgIGZhbWlseT1HQSkNCg0KbW9kNCA8LSBzdGVwR0FJQ0FsbC5BKG9iamVjdD1tb2Q0LA0KICAgICAgICAgICAgICAgICAgICAgIHNjb3BlID0gaG9yaXpvbnRlLCANCiAgICAgICAgICAgICAgICAgICAgICBzaWdtYS5zY29wZSA9IGhvcml6b250ZSwNCiAgICAgICAgICAgICAgICAgICAgICBudS5zY29wZSA9IGhvcml6b250ZSkNCnN1bW1hcnkobW9kNCkNCmBgYA0KDQpBIGNvbnRpbnVhY2nDs24gc2UgY29uc3RydXllIGVsIGdyw6FmaWNvIGRlIGd1c2FubyBlbCBjdWFsIGVzIHVuIGhlcnJhbWllbnRhIHBhcmEgZXhwbG9yYXIgZWwgY29tcG9ydGFtaWVudG8gZGUgbG9zIHJlc2lkdWFsZXMuIFNpIGVsIG1vZGVsbyBlc3TDoSBiaWVuIGFqdXN0YWRvIHNlIGVzcGVyYSBxdWUgbG9zIHB1bnRvcyAocmVzaWR1YWxlcykgcXVlZGVuIGRlbnRybyBkZSBsYXMgaGlww6lyYm9sYXMuDQoNCmBgYHtyfQ0Kd3AobW9kNCkNCmBgYA0KDQpEZSBsYSBmaWd1cmEgYW50ZXJpb3Igc2Ugb2JzZXJ2YSBxdWUgbG9zIHJlc2lkdWFsZXMgY2FlbiBlbiBsYSBwYXJ0ZSBjZW50cmFsIChkZW50cm8gZGUgbGFzIGhpcMOpcmJvbGFzKS4NCg0KQSBjb250aW51YWNpw7NuIGNhbGN1bGFtb3MgZWwgY29lZmljaWVudGUgZGUgY29ycmVsYWNpw7NuIGxpbmVhbCBlbnRyZSBsb3MgJHlfaSQgeSAkXGhhdHtFfSh5IHwgeCkkIHBhcmEgZWwgbW9kZWxvIGVuIGN1ZXN0acOzbi4gDQoNCmBgYHtyfQ0KeTQgPC0gZml0dGVkKG9iamVjdD1tb2Q0LCB3aGF0PSdtdScpDQpjb3IoZGF0aXMkUGVzbywgeTQpDQpgYGANCg0KRWwgdmFsb3IgZGUgJFJeMl97cHNldWRvfSQgZXM6DQoNCmBgYHtyfQ0KUnNxKG1vZDQpDQpgYGANCg0KUGFyYSB2ZXIgc2kgbG9zIHZhbG9yZXMgJFxoYXR7RX0oeSB8IHgpJCBhY29tcGHDsWEgZWwgdmFsb3IgZGUgJHlfaSQgcG9kZW1vcyBoYWNlciBlbCBzaWd1aWVudGUgZGlhZ3JhbWEgZGUgZGlzcGVyc2nDs24uDQoNCmBgYHtyfQ0KcGxvdCh4PWRhdGlzJFBlc28sIHk9eTQsIGxhcz0xKQ0KYWJsaW5lKGE9MCwgYj0xLCBsdHk9J2Rhc2hlZCcpDQpgYGANCg0KIyMgTW9kZWxvIGNvbiByZXNwdWVzdGEgR0cgKEdlbmVyYWxpemVkIEdhbW1hKQ0KUGFyYSBlc3RlIG1vZGVsbyBzZSB0dXZvIHF1ZSBjYW1iaWFyIGVsIHDDoXJhbWV0cm8gZGUgY29udHJvbCBgY29udHJvbDFgLg0KDQpgYGB7cn0NCmNvbnRyb2wxIDwtIGdhbWxzcy5jb250cm9sKG4uY3ljPTE1MDAwLCBjLmNyaXQ9MC4wMSwgdHJhY2U9RkFMU0UpDQpjb250cm9sMiA8LSBnbGltLmNvbnRyb2woY3ljPTUwMDAsIGJmLmN5Yz0zMDAwLCB0cmFjZT1GQUxTRSkNCg0KbW9kNSA8LSBnYW1sc3MoUGVzbyB+IDEsDQogICAgICAgICAgICAgICBzaWdtYS5mbz0gfiAxLCANCiAgICAgICAgICAgICAgIG51LmZvPSB+IDEsDQogICAgICAgICAgICAgICBkYXRhPWRhdGlzLCBjb250cm9sPWNvbnRyb2wxLCBpLmNvbnRyb2w9Y29udHJvbDIsDQogICAgICAgICAgICAgICBmYW1pbHk9R0cpDQoNCm1vZDUgPC0gc3RlcEdBSUNBbGwuQShvYmplY3Q9bW9kNSwgdHJhY2U9MCwNCiAgICAgICAgICAgICAgICAgICAgICBzY29wZSA9IGhvcml6b250ZSwgDQogICAgICAgICAgICAgICAgICAgICAgc2lnbWEuc2NvcGUgPSBob3Jpem9udGUsDQogICAgICAgICAgICAgICAgICAgICAgbnUuc2NvcGUgPSBob3Jpem9udGUpDQpzdW1tYXJ5KG1vZDUpDQpgYGANCg0KQSBjb250aW51YWNpw7NuIHNlIGNvbnN0cnV5ZSBlbCBncsOhZmljbyBkZSBndXNhbm8gZWwgY3VhbCBlcyB1biBoZXJyYW1pZW50YSBwYXJhIGV4cGxvcmFyIGVsIGNvbXBvcnRhbWllbnRvIGRlIGxvcyByZXNpZHVhbGVzLiBTaSBlbCBtb2RlbG8gZXN0w6EgYmllbiBhanVzdGFkbyBzZSBlc3BlcmEgcXVlIGxvcyBwdW50b3MgKHJlc2lkdWFsZXMpIHF1ZWRlbiBkZW50cm8gZGUgbGFzIGhpcMOpcmJvbGFzLg0KDQpgYGB7cn0NCndwKG1vZDUpDQpgYGANCg0KRGUgbGEgZmlndXJhIGFudGVyaW9yIHNlIG9ic2VydmEgcXVlIGxvcyByZXNpZHVhbGVzIGNhZW4gZW4gbGEgcGFydGUgY2VudHJhbCAoZGVudHJvIGRlIGxhcyBoaXDDqXJib2xhcykuDQoNCkEgY29udGludWFjacOzbiBjYWxjdWxhbW9zIGVsIGNvZWZpY2llbnRlIGRlIGNvcnJlbGFjacOzbiBsaW5lYWwgZW50cmUgbG9zICR5X2kkIHkgJFxoYXR7RX0oeSB8IHgpJCBwYXJhIGVsIG1vZGVsbyBlbiBjdWVzdGnDs24uIA0KDQpgYGB7cn0NCnk1IDwtIGZpdHRlZChvYmplY3Q9bW9kNSwgd2hhdD0nbXUnKQ0KY29yKGRhdGlzJFBlc28sIHk1KQ0KYGBgDQoNCkVsIHZhbG9yIGRlICRSXjJfe3BzZXVkb30kIGVzOg0KDQpgYGB7cn0NClJzcShtb2Q1KQ0KYGBgDQoNClBhcmEgdmVyIHNpIGxvcyB2YWxvcmVzICRcaGF0e0V9KHkgfCB4KSQgYWNvbXBhw7FhIGVsIHZhbG9yIGRlICR5X2kkIHBvZGVtb3MgaGFjZXIgZWwgc2lndWllbnRlIGRpYWdyYW1hIGRlIGRpc3BlcnNpw7NuLg0KDQpgYGB7cn0NCnBsb3QoeD1kYXRpcyRQZXNvLCB5PXk1LCBsYXM9MSkNCmFibGluZShhPTAsIGI9MSwgbHR5PSdkYXNoZWQnKQ0KYGBgDQoNCiMgQ29tcGFyYWNpw7NuIGxvcyBtb2RlbG9zDQpFbiBlc3RhIHNlY2Npw7NuIHNlIG11ZXN0cmFuIGxvcyByZXN1bHRhZG9zIGNvbXBhcmFuZG8gbG9zIG1vZGVsb3MuDQoNCiMjIFVzYW5kbyAkXHJobyh5LCBcaGF0e0V9KHkgfCB4KSkkIHkgJFJeMl97cHNldWRvfSQNCg0KYGBge3IgbWVzc2FnZT1GQUxTRX0NCmNvcnJlbCA8LSBjKGNvcihkYXRpcyRQZXNvLCB5MCksIGNvcihkYXRpcyRQZXNvLCB5MSksIGNvcihkYXRpcyRQZXNvLCB5MiksDQogICAgICAgICAgICBjb3IoZGF0aXMkUGVzbywgeTMpLCBjb3IoZGF0aXMkUGVzbywgeTQpLCBjb3IoZGF0aXMkUGVzbywgeTUpKQ0KDQpyMl9wc2V1ZG8gPC0gYyhSc3EobW9kMCksIFJzcShtb2QxKSwgUnNxKG1vZDIpLCANCiAgICAgICAgICAgICAgIFJzcShtb2QzKSwgUnNxKG1vZDQpLCBSc3EobW9kNSkpDQoNCnRhYmxhIDwtIGNiaW5kKGNvcnJlbGFjaW9uPWNvcnJlbCwgcjJfcHNldWRvPXIyX3BzZXVkbykNCnRhYmxhIDwtIHJvdW5kKHRhYmxhLCAyKQ0Kcm93bmFtZXModGFibGEpIDwtIHBhc3RlMCgnbW9kJywgMDo1KQ0KDQpsaWJyYXJ5KGthYmxlRXh0cmEpDQprYWJsZSh0YWJsYSkgJT4lIA0KICBrYWJsZV9zdHlsaW5nKGJvb3RzdHJhcF9vcHRpb25zID0gInN0cmlwZWQiLCBmdWxsX3dpZHRoID0gRikNCmBgYA0KDQpEZSBsYSB0YWJsYSBhbnRlcmlvciBzZSBvYnNlcnZhIHF1ZSBgbW9kMWAgdGllbmUgZWwgc2VndW5kbyBtZWpvciAkXHJobyQgeSBlbCBtZWpvciAkUl4yX3twc2V1ZG99JC4NCg0KIyMgVXNhbmRvIGVsIGNyaXRlcmlvIGRlbCBHQUlDDQpPdHJhIGZvcm1hIGRlIGNvbXBhcmFyIG1vZGVsb3Mgbm8gYW5pZGFkb3MgZXMgcG9yIG1lZGlvIGRlbCBbR0FJQ10oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQWthaWtlX2luZm9ybWF0aW9uX2NyaXRlcmlvbikuDQoNCmBgYHtyfQ0KYWljIDwtIEFJQyhtb2QwLCBtb2QxLCBtb2QyLCBtb2QzLCBtb2Q0LCBtb2Q1LCBrPWxvZyhucm93KGRhdGlzKSkpDQoNCmthYmxlKGFpYykgJT4lDQogIGthYmxlX3N0eWxpbmcoYm9vdHN0cmFwX29wdGlvbnMgPSAic3RyaXBlZCIsIGZ1bGxfd2lkdGggPSBGKQ0KYGBgDQoNCkRlIGxhIHRhYmxhIGFudGVyaW9yIHNlIG9ic2VydmEgcXVlIGVsIG1lam9yIG1vZGVsbyBlcyBgbW9kMWAgeWEgcXVlIHByZXNlbnRhIGVsIG1lbm9yIEdBSUMuDQoNCiMgUmVzaWR1YWxlcyANCkxvcyByZXNpZHVhbGVzIGRlIGxvcyBtb2RlbG9zIGNvbnNpZGVyYWRvcyBzZSBtdWVzdHJhbiBhIGNvbnRpbnVhY2nDs24uIFNpIGVsIG1vZGVsbyBmdWUgYmllbiBhanVzdGFkbywgbG9zIHJlc2lkdWFsZXMgZGViZW4gdGVuZXIgdW5hIGRpc3RyaWJ1Y2nDs24gJE4oMCwgMSkkLg0KDQpgYGB7ciBmaWcuaGVpZ2h0PTEwLCBmaWcud2lkdGg9OCwgbWVzc2FnZT1GQUxTRX0NCmxpYnJhcnkoY2FyKQ0KcGFyKG1mcm93PWMoMywgMikpDQpxcVBsb3QocmVzaWQobW9kMCksIGRpc3Q9Im5vcm0iLCBtZWFuPTAsIHNkPTEsIHBjaD0yMCwgaWQ9RkFMU0UpDQpxcVBsb3QocmVzaWQobW9kMSksIGRpc3Q9Im5vcm0iLCBtZWFuPTAsIHNkPTEsIHBjaD0yMCwgaWQ9RkFMU0UpDQpxcVBsb3QocmVzaWQobW9kMiksIGRpc3Q9Im5vcm0iLCBtZWFuPTAsIHNkPTEsIHBjaD0yMCwgaWQ9RkFMU0UpDQpxcVBsb3QocmVzaWQobW9kMyksIGRpc3Q9Im5vcm0iLCBtZWFuPTAsIHNkPTEsIHBjaD0yMCwgaWQ9RkFMU0UpDQpxcVBsb3QocmVzaWQobW9kNCksIGRpc3Q9Im5vcm0iLCBtZWFuPTAsIHNkPTEsIHBjaD0yMCwgaWQ9RkFMU0UpDQpxcVBsb3QocmVzaWQobW9kNSksIGRpc3Q9Im5vcm0iLCBtZWFuPTAsIHNkPTEsIHBjaD0yMCwgaWQ9RkFMU0UpDQpgYGANCg0KTG9zIHJlc2lkdWFsZXMgZGVsIG1vZGVsbyBgbW9kMWAgbm8gdmlvbGFuIGdyYXZlbWVudGUgZWwgc3VwdWVzdG8gZGUgbm9ybWFsaWRhZC4NCg0KIyBFbCBtZWpvciBtb2RlbG8NCkVsIG1lam9yIG1vZGVsbyBpZGVudGlmaWNhZG8gaGFzdGEgYWhvcmEgZnVlIGVsIG1vZGVsbyBgbW9kMWAgcXVlIHRpZW5lIHJlc3B1ZXN0YSBub3JtYWwgeSBwYXJhIGVsIGN1YWwgc2UgbW9kZWzDsyAkXG11JCB5ICRcc2lnbWEkLg0KDQpgYGB7ciBlY2hvPUZBTFNFfQ0KYSA8LSByb3VuZChjb2VmKG1vZDEsIHdoYXQ9Im11IiksIGRpZ2l0cz0yKQ0KYiA8LSByb3VuZChjb2VmKG1vZDEsIHdoYXQ9InNpZ21hIiksIGRpZ2l0cz0yKQ0KYGBgDQoNCkEgY29udGludWFjacOzbiBsYSB0YWJsYSBkZSByZXN1bWVuIGRlbCBtb2RlbG8uDQoNCmBgYHtyfQ0Kc3VtbWFyeShtb2QxKQ0KYGBgDQoNCkxhIG1lZGlhIGVzdGltYWRhIHBhcmEgZWwgcGVzbyBlc3TDoSBkYWRhIHBvcjoNCg0KJCQNClx3aWRlaGF0e0V9KHkpID0gYHIgYVsxXWAgKyBgciBhWzJdYCBcdGltZXMgVGltZSArIGByIGFbM11gIFx0aW1lcyBUaW1lXjIgKyBgciBhWzRdYCBcdGltZXMgRGlldGExICsgYHIgYVs1XWAgXHRpbWVzIERpZXRhMiArIGByIGFbNl1gIFx0aW1lcyBUZW1wICsgYHIgYVs3XWAgXHRpbWVzIFRlbXBeMiANCiQkDQoNCkxhIGRlc3ZpYWNpw7NuIGVzdGltYWRhIHBhcmEgZWwgcGVzbyBlc3TDoSBkYWRhIHBvcjoNCg0KJCQNClxsb2coXHdpZGVoYXR7RGVzfSh5KSkgPSBgciBiWzFdYCArIGByIGJbM11gIFx0aW1lcyBUZW1wICsgYHIgYlsyXWAgXHRpbWVzIFRlbXBeMiArIGByIGJbNF1gIFx0aW1lcyBEaWV0YTEgKyBgciBiWzVdYCBcdGltZXMgRGlldGEyICsgYHIgYls3XWAgXHRpbWVzIEh1bSArIGByIGJbNl1gIFx0aW1lcyBIdW1eMg0KJCQNCg0KIyBNYXhpbWl6YW5kbw0KQSBjb250aW51YWNpw7NuIHNlIG11ZXN0cmEgdHJlcyBkaWFncmFtYXMgZGUgY29udG9ybm9zIHBhcmEgJFx3aWRlaGF0e0V9KHkgfCB0aWVtcG8sIHRlbXApJCBwYXJhIGNhZGEgdW5hIGRlIGxhcyBkaWV0YXMuIExvcyBwdW50b3MgZW4gcm9qbyByZXByZXNlbnRhbiBsYSBjb21iaW5hY2nDs24gZGUgdGllbXBvIHkgdGVtcGVyYXR1cmEgcXVlIG1heGltaXphbiBlbCBwZXNvLg0KDQpgYGB7ciBlY2hvPUZBTFNFfQ0KIyBEaWV0YSAwDQpmdW4wIDwtIGZ1bmN0aW9uKHgpIHsNCiAgdGllbXBvIDwtIHhbMV0NCiAgdGVtcCA8LSB4WzJdDQogIGF1eCA8LSBjKDEsIHRpZW1wbywgdGllbXBvXjIsIDAsIDAsIHRlbXAsIHRlbXBeMikNCiAgLXN1bShhdXggKiBjb2VmKG1vZDEpKQ0KfQ0KDQpyZXMwIDwtIG9wdGltKHBhcj1jKDE4LCAxOCksIGZuPWZ1bjAsDQogICAgICAgICAgICAgIG1ldGhvZD0nTC1CRkdTLUInLA0KICAgICAgICAgICAgICBsb3dlcj1jKG1pbihkYXRpcyRUaWVtcG8pLCBtaW4oZGF0aXMkVGVtcCkpLA0KICAgICAgICAgICAgICB1cHBlcj1jKG1heChkYXRpcyRUaWVtcG8pLCBtYXgoZGF0aXMkVGVtcCkpKQ0KDQojIERpZXRhIDENCmZ1bjEgPC0gZnVuY3Rpb24oeCkgew0KICB0aWVtcG8gPC0geFsxXQ0KICB0ZW1wIDwtIHhbMl0NCiAgYXV4IDwtIGMoMSwgdGllbXBvLCB0aWVtcG9eMiwgMSwgMCwgdGVtcCwgdGVtcF4yKQ0KICAtc3VtKGF1eCAqIGNvZWYobW9kMSkpDQp9DQoNCnJlczEgPC0gb3B0aW0ocGFyPWMoMTgsIDE4KSwgZm49ZnVuMSwNCiAgICAgICAgICAgICAgbWV0aG9kPSdMLUJGR1MtQicsDQogICAgICAgICAgICAgIGxvd2VyPWMobWluKGRhdGlzJFRpZW1wbyksIG1pbihkYXRpcyRUZW1wKSksDQogICAgICAgICAgICAgIHVwcGVyPWMobWF4KGRhdGlzJFRpZW1wbyksIG1heChkYXRpcyRUZW1wKSkpDQoNCiMgRGlldGEgMg0KZnVuMiA8LSBmdW5jdGlvbih4KSB7DQogIHRpZW1wbyA8LSB4WzFdDQogIHRlbXAgPC0geFsyXQ0KICBhdXggPC0gYygxLCB0aWVtcG8sIHRpZW1wb14yLCAwLCAxLCB0ZW1wLCB0ZW1wXjIpDQogIC1zdW0oYXV4ICogY29lZihtb2QxKSkNCn0NCg0KcmVzMiA8LSBvcHRpbShwYXI9YygxOCwgMTgpLCBmbj1mdW4yLA0KICAgICAgICAgICAgICBtZXRob2Q9J0wtQkZHUy1CJywNCiAgICAgICAgICAgICAgbG93ZXI9YyhtaW4oZGF0aXMkVGllbXBvKSwgbWluKGRhdGlzJFRlbXApKSwNCiAgICAgICAgICAgICAgdXBwZXI9YyhtYXgoZGF0aXMkVGllbXBvKSwgbWF4KGRhdGlzJFRlbXApKSkNCmBgYA0KDQoNCmBgYHtyIGVjaG89RkFMU0V9DQpwZXNvX2RpZXRhMCA8LSBmdW5jdGlvbih0aWVtcG8sIHRlbXApIHsNCiAgYXV4IDwtIGMoMSwgdGllbXBvLCB0aWVtcG9eMiwgMCwgMCwgdGVtcCwgdGVtcF4yKQ0KICBzdW0oYXV4ICogY29lZihtb2QxKSkNCn0NCg0KcGVzb19kaWV0YTEgPC0gZnVuY3Rpb24odGllbXBvLCB0ZW1wKSB7DQogIGF1eCA8LSBjKDEsIHRpZW1wbywgdGllbXBvXjIsIDEsIDAsIHRlbXAsIHRlbXBeMikNCiAgc3VtKGF1eCAqIGNvZWYobW9kMSkpDQp9DQoNCnBlc29fZGlldGEyIDwtIGZ1bmN0aW9uKHRpZW1wbywgdGVtcCkgew0KICBhdXggPC0gYygxLCB0aWVtcG8sIHRpZW1wb14yLCAwLCAxLCB0ZW1wLCB0ZW1wXjIpDQogIHN1bShhdXggKiBjb2VmKG1vZDEpKQ0KfQ0KDQpwZXNvX2RpZXRhMCA8LSBWZWN0b3JpemUocGVzb19kaWV0YTApDQpwZXNvX2RpZXRhMSA8LSBWZWN0b3JpemUocGVzb19kaWV0YTEpDQpwZXNvX2RpZXRhMiA8LSBWZWN0b3JpemUocGVzb19kaWV0YTIpDQpgYGANCg0KYGBge3IgZWNobz1GQUxTRX0NCnggPC0gc2VxKGZyb209bWluKGRhdGlzJFRpZW1wbyksIHRvPW1heChkYXRpcyRUaWVtcG8pLCBsZW5ndGgub3V0PTI1KQ0KeSA8LSBzZXEoZnJvbT1taW4oZGF0aXMkVGVtcCksIHRvPW1heChkYXRpcyRUZW1wKSwgbGVuZ3RoLm91dD0yNSkNCnowIDwtIG91dGVyKHgsIHksIHBlc29fZGlldGEwKQ0KejEgPC0gb3V0ZXIoeCwgeSwgcGVzb19kaWV0YTEpDQp6MiA8LSBvdXRlcih4LCB5LCBwZXNvX2RpZXRhMikNCmBgYA0KDQpgYGB7ciBmaWcud2lkdGg9MTUsIGZpZy5oZWlnaHQ9NSwgZWNobz1GQUxTRX0NCnBhcihtZnJvdz1jKDEsIDMpKQ0KDQpjb250b3VyKHg9eCwgeT15LCB6PXowLCBubGV2ZWxzPTUwLA0KICAgICAgICBjb2w9Z3JheSgwLjMpLCBsd2Q9MiwgbHR5PSdzb2xpZCcsDQogICAgICAgIHhsYWI9J1RpZW1wbycsIHlsYWI9J1RlbXBlcmF0dXJhJywNCiAgICAgICAgbWFpbj0nRGlldGEgMCcpDQpwb2ludHMoeD1yZXMwJHBhclsxXSwgeT1yZXMwJHBhclsyXSwgcGNoPTE5LCBjZXg9MywgY29sPSdyZWQnKQ0KDQpjb250b3VyKHg9eCwgeT15LCB6PXoxLCBubGV2ZWxzPTUwLA0KICAgICAgICBjb2w9Z3JheSgwLjMpLCBsd2Q9MiwgbHR5PSdzb2xpZCcsDQogICAgICAgIHhsYWI9J1RpZW1wbycsIHlsYWI9J1RlbXBlcmF0dXJhJywNCiAgICAgICAgbWFpbj0nRGlldGEgMScpDQpwb2ludHMoeD1yZXMxJHBhclsxXSwgeT1yZXMxJHBhclsyXSwgcGNoPTE5LCBjZXg9MywgY29sPSdyZWQnKQ0KY29udG91cih4PXgsIHk9eSwgej16MiwgbmxldmVscz01MCwNCiAgICAgICAgY29sPWdyYXkoMC4zKSwgbHdkPTIsIGx0eT0nc29saWQnLA0KICAgICAgICB4bGFiPSdUaWVtcG8nLCB5bGFiPSdUZW1wZXJhdHVyYScsDQogICAgICAgIG1haW49J0RpZXRhIDInKQ0KcG9pbnRzKHg9cmVzMiRwYXJbMV0sIHk9cmVzMiRwYXJbMl0sIHBjaD0xOSwgY2V4PTMsIGNvbD0ncmVkJykNCmBgYA0KDQpBIGNvbnRpbnVhY2nDs24gbGFzIHRyZXMgc3VwZXJmaWNpZXMuDQoNCmBgYHtyIGZpZy53aWR0aD0xNSwgZmlnLmhlaWdodD0xMCwgZWNobz1GQUxTRX0NCnBhcihtZnJvdz1jKDEsIDMpKQ0KDQpwZXJzcCh4LCB5LCB6MCwgdGhldGE9NDUsIHBoaT0zMCwgY29sPSdsaWdodHBpbmsnLCBtYWluPSdEaWV0YSAwJykNCnBlcnNwKHgsIHksIHoxLCB0aGV0YT00NSwgcGhpPTMwLCBjb2w9J2FxdWFtYXJpbmUnLCBtYWluPSdEaWV0YSAxJykNCnBlcnNwKHgsIHksIHoyLCB0aGV0YT00NSwgcGhpPTMwLCBjb2w9J2xpZ2h0Ymx1ZScsIG1haW49J0RpZXRhIDInKQ0KYGBgDQoNCg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCmxpYnJhcnkocGxvdGx5KQ0KZmlnIDwtIHBsb3RfbHkoeCA9IHgsIHkgPSB5LCB6ID0gejApICU+JSBhZGRfc3VyZmFjZSgpDQpmaWcgPC0gZmlnICU+JSBsYXlvdXQoDQogICAgdGl0bGUgPSAiU3VwZXJmaWNpZSBkZWwgUGVzbyBjb24gZGlldGEgMCIsDQogICAgc2NlbmUgPSBsaXN0KA0KICAgICAgeGF4aXMgPSBsaXN0KHRpdGxlID0gIlRpZW1wbyIpLA0KICAgICAgeWF4aXMgPSBsaXN0KHRpdGxlID0gIlRlbXBlcmF0dXJhIiksDQogICAgICB6YXhpcyA9IGxpc3QodGl0bGUgPSAiUGVzbyIpDQogICAgKSkNCmZpZw0KYGBgDQoNCkxvcyB2YWxvcmVzIGRlIHRpZW1wbyB5IHRlbXBlcmF0dXJhIHF1ZSBtYXhpbWl6YW4gZWwgcGVzbyBzb24gbG9zIHNpZ3VpZW50ZXM6DQoNCmBgYHtyLCBlY2hvPUZBTFNFfQ0KcmVzdWwgPC0gcmJpbmQoYyhyZXMwJHBhciwgLXJlczAkdmFsdWUpLA0KICAgICAgICAgICAgICAgYyhyZXMxJHBhciwgLXJlczEkdmFsdWUpLA0KICAgICAgICAgICAgICAgYyhyZXMyJHBhciwgLXJlczIkdmFsdWUpKQ0KY29sbmFtZXMocmVzdWwpIDwtIGMoJ1RpZW1wbycsICdUZW1wZXJhdHVyYScsICdQZXNvIG3DoXhpbW8nKQ0Kcm93bmFtZXMocmVzdWwpIDwtIHBhc3RlMCgnRGlldGEgJywgMDoyKQ0KDQprYWJsZShyZXN1bCkgJT4lDQogIGthYmxlX3N0eWxpbmcoYm9vdHN0cmFwX29wdGlvbnMgPSAic3RyaXBlZCIsIGZ1bGxfd2lkdGggPSBGKQ0KYGBgDQoNCg==