Teoría

El paquete CARET (clasification and Regression Training) es un paquete integral con una amplpia variedad de algoritmos para el aprendizaje automático.

Instalar paquetes y llamar librerías

#install.packages("ggplot2") #Graficos
library(ggplot2)
#install.packages("lattice") #Graficos
library(lattice)
#install.packages("caret") #Algoritmos de aprendizaje automático
library(caret)
#install.packages("datasets") #Usar bases de datos, en caso Iris
library(datasets)
#install.packages("DataExplorer") #Análisis exploratorio
library(DataExplorer)

Crear la base de datos

df <- data.frame(iris)

Crear la base de datos

summary(df)
##   Sepal.Length    Sepal.Width     Petal.Length    Petal.Width   
##  Min.   :4.300   Min.   :2.000   Min.   :1.000   Min.   :0.100  
##  1st Qu.:5.100   1st Qu.:2.800   1st Qu.:1.600   1st Qu.:0.300  
##  Median :5.800   Median :3.000   Median :4.350   Median :1.300  
##  Mean   :5.843   Mean   :3.057   Mean   :3.758   Mean   :1.199  
##  3rd Qu.:6.400   3rd Qu.:3.300   3rd Qu.:5.100   3rd Qu.:1.800  
##  Max.   :7.900   Max.   :4.400   Max.   :6.900   Max.   :2.500  
##        Species  
##  setosa    :50  
##  versicolor:50  
##  virginica :50  
##                 
##                 
## 
str(df)
## 'data.frame':    150 obs. of  5 variables:
##  $ Sepal.Length: num  5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...
##  $ Sepal.Width : num  3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ...
##  $ Petal.Length: num  1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ...
##  $ Petal.Width : num  0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ...
##  $ Species     : Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 1 1 1 ...
#create_report(df)
plot_missing(df) #graficar cuantos NA´s hay por variable

plot_histogram(df)

plot_correlation(df)

NOTA: La variable que queremos predecir debe tener formato de FACTOR

Partir la base de datos

#Normalmente 80-20
set.seed(123)
renglones_entrenamiento <- createDataPartition(df$Species, p=0.8, list=FALSE)
entrenamiento <-df[renglones_entrenamiento, ]
prueba <-df[-renglones_entrenamiento, ] #[reglones,columna]

Distintos tipos de Métodos para modelar

Los métodos más utilizados para modelar aprendizaje automático son:

  • SVM: Support Vector Machine o Máquina de Vectores de Soporte. Hay varios subtipos: Lineal (svmLinear), Radial (svmRadial), Polinómico (svmPoly), etc.
  • Árbol de Desiciones: rpart
  • Redes Neuronales: nmet
  • Random Forest o Bosques Aleatorios: rf

Model 1. SVM Lineal

modelo1 <- train(Species ~ ., data=entrenamiento,
                 method = "svmLinear", #Cambiar
                 preProcess = c("scale","center"),
                 trControl = trainControl(method = "cv", number=10),
                 tuneGride = data.frame(C=1) #Cambiar hiperparametros, se pueden justar
)

resultado_entrenamiento1 <- predict(modelo1, entrenamiento)
resultado_prueba1 <- predict(modelo1, prueba)

#Matriz de Confusión
#Es una tabla de evaluación que desglosa el rendimiento del modelo de clasificación.

#Matriz de confusión del resultado del entrenamiento
mcre1 <- confusionMatrix(resultado_entrenamiento1, entrenamiento$Species)
mcre1
## Confusion Matrix and Statistics
## 
##             Reference
## Prediction   setosa versicolor virginica
##   setosa         40          0         0
##   versicolor      0         39         0
##   virginica       0          1        40
## 
## Overall Statistics
##                                           
##                Accuracy : 0.9917          
##                  95% CI : (0.9544, 0.9998)
##     No Information Rate : 0.3333          
##     P-Value [Acc > NIR] : < 2.2e-16       
##                                           
##                   Kappa : 0.9875          
##                                           
##  Mcnemar's Test P-Value : NA              
## 
## Statistics by Class:
## 
##                      Class: setosa Class: versicolor Class: virginica
## Sensitivity                 1.0000            0.9750           1.0000
## Specificity                 1.0000            1.0000           0.9875
## Pos Pred Value              1.0000            1.0000           0.9756
## Neg Pred Value              1.0000            0.9877           1.0000
## Prevalence                  0.3333            0.3333           0.3333
## Detection Rate              0.3333            0.3250           0.3333
## Detection Prevalence        0.3333            0.3250           0.3417
## Balanced Accuracy           1.0000            0.9875           0.9938
#Matriz de Confusión del Resultado de prueba
mcrp1 <- confusionMatrix(resultado_prueba1, prueba$Species)
mcrp1
## Confusion Matrix and Statistics
## 
##             Reference
## Prediction   setosa versicolor virginica
##   setosa         10          0         0
##   versicolor      0         10         1
##   virginica       0          0         9
## 
## Overall Statistics
##                                           
##                Accuracy : 0.9667          
##                  95% CI : (0.8278, 0.9992)
##     No Information Rate : 0.3333          
##     P-Value [Acc > NIR] : 2.963e-13       
##                                           
##                   Kappa : 0.95            
##                                           
##  Mcnemar's Test P-Value : NA              
## 
## Statistics by Class:
## 
##                      Class: setosa Class: versicolor Class: virginica
## Sensitivity                 1.0000            1.0000           0.9000
## Specificity                 1.0000            0.9500           1.0000
## Pos Pred Value              1.0000            0.9091           1.0000
## Neg Pred Value              1.0000            1.0000           0.9524
## Prevalence                  0.3333            0.3333           0.3333
## Detection Rate              0.3333            0.3333           0.3000
## Detection Prevalence        0.3333            0.3667           0.3000
## Balanced Accuracy           1.0000            0.9750           0.9500
#Con las matrices, comparo la presición del entrenamiento y de prueba .99 y .96 respectivamente, está bien el modelo

Model 2. SVM Radial

modelo2 <- train(Species ~ ., data=entrenamiento,
                 method = "svmRadial", #Cambiar
                 preProcess = c("scale","center"),
                 trControl = trainControl(method = "cv", number=10),
                 tuneGride = data.frame(sigma=1,C=1) #Cambiar hiperparametros, se pueden justar
)

resultado_entrenamiento2 <- predict(modelo2, entrenamiento)
resultado_prueba2 <- predict(modelo2, prueba)

#Matriz de Confusión
#Es una tabla de evaluación que desglosa el rendimiento del modelo de clasificación.

#Matriz de confusión del resultado del entrenamiento
mcre2 <- confusionMatrix(resultado_entrenamiento2, entrenamiento$Species)
mcre2
## Confusion Matrix and Statistics
## 
##             Reference
## Prediction   setosa versicolor virginica
##   setosa         40          0         0
##   versicolor      0         39         0
##   virginica       0          1        40
## 
## Overall Statistics
##                                           
##                Accuracy : 0.9917          
##                  95% CI : (0.9544, 0.9998)
##     No Information Rate : 0.3333          
##     P-Value [Acc > NIR] : < 2.2e-16       
##                                           
##                   Kappa : 0.9875          
##                                           
##  Mcnemar's Test P-Value : NA              
## 
## Statistics by Class:
## 
##                      Class: setosa Class: versicolor Class: virginica
## Sensitivity                 1.0000            0.9750           1.0000
## Specificity                 1.0000            1.0000           0.9875
## Pos Pred Value              1.0000            1.0000           0.9756
## Neg Pred Value              1.0000            0.9877           1.0000
## Prevalence                  0.3333            0.3333           0.3333
## Detection Rate              0.3333            0.3250           0.3333
## Detection Prevalence        0.3333            0.3250           0.3417
## Balanced Accuracy           1.0000            0.9875           0.9938
#Matriz de Confusión del Resultado de prueba
mcrp2 <- confusionMatrix(resultado_prueba2, prueba$Species)
mcrp2
## Confusion Matrix and Statistics
## 
##             Reference
## Prediction   setosa versicolor virginica
##   setosa         10          0         0
##   versicolor      0         10         2
##   virginica       0          0         8
## 
## Overall Statistics
##                                           
##                Accuracy : 0.9333          
##                  95% CI : (0.7793, 0.9918)
##     No Information Rate : 0.3333          
##     P-Value [Acc > NIR] : 8.747e-12       
##                                           
##                   Kappa : 0.9             
##                                           
##  Mcnemar's Test P-Value : NA              
## 
## Statistics by Class:
## 
##                      Class: setosa Class: versicolor Class: virginica
## Sensitivity                 1.0000            1.0000           0.8000
## Specificity                 1.0000            0.9000           1.0000
## Pos Pred Value              1.0000            0.8333           1.0000
## Neg Pred Value              1.0000            1.0000           0.9091
## Prevalence                  0.3333            0.3333           0.3333
## Detection Rate              0.3333            0.3333           0.2667
## Detection Prevalence        0.3333            0.4000           0.2667
## Balanced Accuracy           1.0000            0.9500           0.9000

Model 3. SVM Polinómico

modelo3 <- train(Species ~ ., data=entrenamiento,
                 method = "svmPoly", #Cambiar
                 preProcess = c("scale","center"),
                 trControl = trainControl(method = "cv", number=10),
                 tuneGride = data.frame(degree=1,scale=1, C=1) #Cambiar hiperparametros, se pueden justar
)

resultado_entrenamiento3 <- predict(modelo3, entrenamiento)
resultado_prueba3 <- predict(modelo3, prueba)

#Matriz de Confusión
#Es una tabla de evaluación que desglosa el rendimiento del modelo de clasificación.

#Matriz de confusión del resultado del entrenamiento
mcre3 <- confusionMatrix(resultado_entrenamiento3, entrenamiento$Species)
mcre3
## Confusion Matrix and Statistics
## 
##             Reference
## Prediction   setosa versicolor virginica
##   setosa         40          0         0
##   versicolor      0         40         4
##   virginica       0          0        36
## 
## Overall Statistics
##                                           
##                Accuracy : 0.9667          
##                  95% CI : (0.9169, 0.9908)
##     No Information Rate : 0.3333          
##     P-Value [Acc > NIR] : < 2.2e-16       
##                                           
##                   Kappa : 0.95            
##                                           
##  Mcnemar's Test P-Value : NA              
## 
## Statistics by Class:
## 
##                      Class: setosa Class: versicolor Class: virginica
## Sensitivity                 1.0000            1.0000           0.9000
## Specificity                 1.0000            0.9500           1.0000
## Pos Pred Value              1.0000            0.9091           1.0000
## Neg Pred Value              1.0000            1.0000           0.9524
## Prevalence                  0.3333            0.3333           0.3333
## Detection Rate              0.3333            0.3333           0.3000
## Detection Prevalence        0.3333            0.3667           0.3000
## Balanced Accuracy           1.0000            0.9750           0.9500
#Matriz de Confusión del Resultado de prueba
mcrp3 <- confusionMatrix(resultado_prueba3, prueba$Species)
mcrp3
## Confusion Matrix and Statistics
## 
##             Reference
## Prediction   setosa versicolor virginica
##   setosa         10          0         0
##   versicolor      0         10         2
##   virginica       0          0         8
## 
## Overall Statistics
##                                           
##                Accuracy : 0.9333          
##                  95% CI : (0.7793, 0.9918)
##     No Information Rate : 0.3333          
##     P-Value [Acc > NIR] : 8.747e-12       
##                                           
##                   Kappa : 0.9             
##                                           
##  Mcnemar's Test P-Value : NA              
## 
## Statistics by Class:
## 
##                      Class: setosa Class: versicolor Class: virginica
## Sensitivity                 1.0000            1.0000           0.8000
## Specificity                 1.0000            0.9000           1.0000
## Pos Pred Value              1.0000            0.8333           1.0000
## Neg Pred Value              1.0000            1.0000           0.9091
## Prevalence                  0.3333            0.3333           0.3333
## Detection Rate              0.3333            0.3333           0.2667
## Detection Prevalence        0.3333            0.4000           0.2667
## Balanced Accuracy           1.0000            0.9500           0.9000

Model 4. Árbol de decisión

modelo4 <- train(Species ~ ., data=entrenamiento,
                 method = "rpart", #Cambiar
                 preProcess = c("scale","center"),
                 trControl = trainControl(method = "cv", number=10),
                 tuneLength =10 #Cambiar hiperparametros, se pueden justar
)

resultado_entrenamiento4 <- predict(modelo4, entrenamiento)
resultado_prueba4 <- predict(modelo4, prueba)

#Matriz de Confusión
#Es una tabla de evaluación que desglosa el rendimiento del modelo de clasificación.

#Matriz de confusión del resultado del entrenamiento
mcre4 <- confusionMatrix(resultado_entrenamiento4, entrenamiento$Species)
mcre4
## Confusion Matrix and Statistics
## 
##             Reference
## Prediction   setosa versicolor virginica
##   setosa         40          0         0
##   versicolor      0         39         3
##   virginica       0          1        37
## 
## Overall Statistics
##                                           
##                Accuracy : 0.9667          
##                  95% CI : (0.9169, 0.9908)
##     No Information Rate : 0.3333          
##     P-Value [Acc > NIR] : < 2.2e-16       
##                                           
##                   Kappa : 0.95            
##                                           
##  Mcnemar's Test P-Value : NA              
## 
## Statistics by Class:
## 
##                      Class: setosa Class: versicolor Class: virginica
## Sensitivity                 1.0000            0.9750           0.9250
## Specificity                 1.0000            0.9625           0.9875
## Pos Pred Value              1.0000            0.9286           0.9737
## Neg Pred Value              1.0000            0.9872           0.9634
## Prevalence                  0.3333            0.3333           0.3333
## Detection Rate              0.3333            0.3250           0.3083
## Detection Prevalence        0.3333            0.3500           0.3167
## Balanced Accuracy           1.0000            0.9688           0.9563
#Matriz de Confusión del Resultado de prueba
mcrp4 <- confusionMatrix(resultado_prueba4, prueba$Species)
mcrp4
## Confusion Matrix and Statistics
## 
##             Reference
## Prediction   setosa versicolor virginica
##   setosa         10          0         0
##   versicolor      0         10         2
##   virginica       0          0         8
## 
## Overall Statistics
##                                           
##                Accuracy : 0.9333          
##                  95% CI : (0.7793, 0.9918)
##     No Information Rate : 0.3333          
##     P-Value [Acc > NIR] : 8.747e-12       
##                                           
##                   Kappa : 0.9             
##                                           
##  Mcnemar's Test P-Value : NA              
## 
## Statistics by Class:
## 
##                      Class: setosa Class: versicolor Class: virginica
## Sensitivity                 1.0000            1.0000           0.8000
## Specificity                 1.0000            0.9000           1.0000
## Pos Pred Value              1.0000            0.8333           1.0000
## Neg Pred Value              1.0000            1.0000           0.9091
## Prevalence                  0.3333            0.3333           0.3333
## Detection Rate              0.3333            0.3333           0.2667
## Detection Prevalence        0.3333            0.4000           0.2667
## Balanced Accuracy           1.0000            0.9500           0.9000

Model 5. Redes Neuronales

modelo5 <- train(Species ~ ., data=entrenamiento,
                 method = "nnet", #Cambiar
                 preProcess = c("scale","center"),
                 trControl = trainControl(method = "cv", number=10)

)
## # weights:  11
## initial  value 117.009298 
## iter  10 value 30.693062
## iter  20 value 4.480530
## iter  30 value 2.124646
## iter  40 value 1.724334
## iter  50 value 1.558463
## iter  60 value 1.384759
## iter  70 value 1.194959
## iter  80 value 1.157489
## iter  90 value 1.037588
## iter 100 value 1.021675
## final  value 1.021675 
## stopped after 100 iterations
## # weights:  27
## initial  value 144.555680 
## iter  10 value 7.295675
## iter  20 value 0.951236
## iter  30 value 0.019779
## iter  40 value 0.001778
## final  value 0.000054 
## converged
## # weights:  43
## initial  value 159.941630 
## iter  10 value 29.130468
## iter  20 value 2.433214
## iter  30 value 0.203630
## iter  40 value 0.008716
## final  value 0.000085 
## converged
## # weights:  11
## initial  value 122.779692 
## iter  10 value 57.486922
## iter  20 value 43.651900
## iter  30 value 43.557151
## final  value 43.557011 
## converged
## # weights:  27
## initial  value 125.993185 
## iter  10 value 26.004322
## iter  20 value 19.109050
## iter  30 value 18.927620
## iter  40 value 18.923505
## final  value 18.923489 
## converged
## # weights:  43
## initial  value 162.888687 
## iter  10 value 20.938843
## iter  20 value 18.031113
## iter  30 value 17.715120
## iter  40 value 17.596630
## iter  50 value 17.399696
## iter  60 value 17.368518
## iter  70 value 17.368513
## iter  70 value 17.368513
## iter  70 value 17.368513
## final  value 17.368513 
## converged
## # weights:  11
## initial  value 118.505234 
## iter  10 value 40.039271
## iter  20 value 5.135436
## iter  30 value 3.734191
## iter  40 value 3.277615
## iter  50 value 3.145069
## iter  60 value 2.954089
## iter  70 value 2.904871
## iter  80 value 2.904015
## iter  90 value 2.903149
## iter 100 value 2.902252
## final  value 2.902252 
## stopped after 100 iterations
## # weights:  27
## initial  value 122.899975 
## iter  10 value 7.401054
## iter  20 value 0.334446
## iter  30 value 0.315600
## iter  40 value 0.297078
## iter  50 value 0.290032
## iter  60 value 0.266801
## iter  70 value 0.252113
## iter  80 value 0.242813
## iter  90 value 0.232748
## iter 100 value 0.223962
## final  value 0.223962 
## stopped after 100 iterations
## # weights:  43
## initial  value 130.368788 
## iter  10 value 6.085146
## iter  20 value 0.541576
## iter  30 value 0.324721
## iter  40 value 0.310666
## iter  50 value 0.288764
## iter  60 value 0.261876
## iter  70 value 0.241344
## iter  80 value 0.232620
## iter  90 value 0.221434
## iter 100 value 0.211098
## final  value 0.211098 
## stopped after 100 iterations
## # weights:  11
## initial  value 114.821771 
## iter  10 value 44.055072
## iter  20 value 11.932704
## iter  30 value 3.206457
## iter  40 value 2.877159
## iter  50 value 2.634047
## iter  60 value 2.327700
## iter  70 value 2.138623
## iter  80 value 1.010075
## iter  90 value 0.852535
## iter 100 value 0.693471
## final  value 0.693471 
## stopped after 100 iterations
## # weights:  27
## initial  value 121.119589 
## iter  10 value 4.241406
## iter  20 value 0.011919
## final  value 0.000059 
## converged
## # weights:  43
## initial  value 146.114510 
## iter  10 value 5.225415
## iter  20 value 0.151541
## iter  30 value 0.000108
## iter  30 value 0.000056
## iter  30 value 0.000055
## final  value 0.000055 
## converged
## # weights:  11
## initial  value 117.838276 
## iter  10 value 43.963261
## iter  20 value 42.933568
## iter  20 value 42.933567
## iter  20 value 42.933567
## final  value 42.933567 
## converged
## # weights:  27
## initial  value 150.828476 
## iter  10 value 24.131661
## iter  20 value 19.605948
## iter  30 value 19.530553
## iter  40 value 19.527242
## final  value 19.527057 
## converged
## # weights:  43
## initial  value 125.354310 
## iter  10 value 21.660478
## iter  20 value 17.958628
## iter  30 value 17.736044
## iter  40 value 17.719752
## iter  50 value 17.719581
## iter  50 value 17.719581
## iter  50 value 17.719581
## final  value 17.719581 
## converged
## # weights:  11
## initial  value 118.990031 
## iter  10 value 46.484314
## iter  20 value 39.225686
## iter  30 value 9.650620
## iter  40 value 4.514044
## iter  50 value 3.865438
## iter  60 value 3.508071
## iter  70 value 3.041838
## iter  80 value 2.965815
## iter  90 value 2.953655
## iter 100 value 2.950243
## final  value 2.950243 
## stopped after 100 iterations
## # weights:  27
## initial  value 122.010199 
## iter  10 value 10.036298
## iter  20 value 0.341101
## iter  30 value 0.272783
## iter  40 value 0.249672
## iter  50 value 0.228956
## iter  60 value 0.219568
## iter  70 value 0.215171
## iter  80 value 0.210042
## iter  90 value 0.197683
## iter 100 value 0.188999
## final  value 0.188999 
## stopped after 100 iterations
## # weights:  43
## initial  value 129.722314 
## iter  10 value 4.282782
## iter  20 value 0.309622
## iter  30 value 0.272824
## iter  40 value 0.255595
## iter  50 value 0.245836
## iter  60 value 0.226164
## iter  70 value 0.216460
## iter  80 value 0.208423
## iter  90 value 0.204559
## iter 100 value 0.200969
## final  value 0.200969 
## stopped after 100 iterations
## # weights:  11
## initial  value 129.077732 
## iter  10 value 50.893757
## iter  20 value 49.341214
## iter  30 value 47.711365
## iter  40 value 45.883507
## iter  50 value 45.433657
## iter  60 value 44.762037
## iter  70 value 20.639842
## iter  80 value 5.307883
## iter  90 value 4.186131
## iter 100 value 3.928824
## final  value 3.928824 
## stopped after 100 iterations
## # weights:  27
## initial  value 129.835217 
## iter  10 value 9.829857
## iter  20 value 1.817620
## iter  30 value 0.001192
## final  value 0.000064 
## converged
## # weights:  43
## initial  value 157.390266 
## iter  10 value 8.338611
## iter  20 value 1.541313
## iter  30 value 0.005079
## final  value 0.000075 
## converged
## # weights:  11
## initial  value 129.818872 
## iter  10 value 75.525777
## iter  20 value 57.964228
## iter  30 value 43.875992
## final  value 43.827214 
## converged
## # weights:  27
## initial  value 130.968358 
## iter  10 value 45.968354
## iter  20 value 22.634991
## iter  30 value 21.409538
## iter  40 value 21.358119
## iter  50 value 21.351406
## iter  60 value 21.351186
## final  value 21.351182 
## converged
## # weights:  43
## initial  value 213.775591 
## iter  10 value 21.725412
## iter  20 value 18.822673
## iter  30 value 18.513150
## iter  40 value 18.456837
## iter  50 value 18.449317
## final  value 18.449280 
## converged
## # weights:  11
## initial  value 118.962754 
## iter  10 value 26.053147
## iter  20 value 6.333793
## iter  30 value 4.570285
## iter  40 value 4.297908
## iter  50 value 4.105559
## iter  60 value 3.903061
## iter  70 value 3.826761
## iter  80 value 3.823960
## iter  90 value 3.823294
## iter 100 value 3.822242
## final  value 3.822242 
## stopped after 100 iterations
## # weights:  27
## initial  value 132.606102 
## iter  10 value 22.897922
## iter  20 value 1.809082
## iter  30 value 0.796543
## iter  40 value 0.759424
## iter  50 value 0.614426
## iter  60 value 0.580862
## iter  70 value 0.550861
## iter  80 value 0.541313
## iter  90 value 0.484870
## iter 100 value 0.476444
## final  value 0.476444 
## stopped after 100 iterations
## # weights:  43
## initial  value 108.487853 
## iter  10 value 9.006639
## iter  20 value 1.563172
## iter  30 value 0.682425
## iter  40 value 0.633490
## iter  50 value 0.545956
## iter  60 value 0.496924
## iter  70 value 0.473405
## iter  80 value 0.439298
## iter  90 value 0.395353
## iter 100 value 0.365287
## final  value 0.365287 
## stopped after 100 iterations
## # weights:  11
## initial  value 119.337907 
## iter  10 value 53.721540
## iter  20 value 51.519354
## iter  30 value 50.670578
## iter  40 value 49.482013
## iter  50 value 40.619548
## iter  60 value 14.073622
## iter  70 value 5.816424
## iter  80 value 4.847922
## iter  90 value 3.451476
## iter 100 value 2.080745
## final  value 2.080745 
## stopped after 100 iterations
## # weights:  27
## initial  value 140.648336 
## iter  10 value 49.133514
## iter  20 value 34.297381
## iter  30 value 33.313181
## iter  40 value 17.096108
## iter  50 value 9.985887
## iter  60 value 1.717089
## iter  70 value 0.288081
## iter  80 value 0.001470
## final  value 0.000094 
## converged
## # weights:  43
## initial  value 125.329208 
## iter  10 value 4.485921
## iter  20 value 0.228080
## iter  30 value 0.006659
## final  value 0.000088 
## converged
## # weights:  11
## initial  value 124.049774 
## iter  10 value 57.031473
## iter  20 value 44.512638
## iter  30 value 44.385507
## final  value 44.384992 
## converged
## # weights:  27
## initial  value 126.045603 
## iter  10 value 39.049105
## iter  20 value 22.776253
## iter  30 value 20.135451
## iter  40 value 19.958468
## iter  50 value 19.949415
## iter  60 value 19.949154
## final  value 19.949153 
## converged
## # weights:  43
## initial  value 131.415649 
## iter  10 value 23.127808
## iter  20 value 19.282709
## iter  30 value 19.178237
## iter  40 value 19.174237
## iter  50 value 19.173870
## iter  60 value 19.173657
## final  value 19.173655 
## converged
## # weights:  11
## initial  value 121.517667 
## iter  10 value 70.104915
## iter  20 value 51.842884
## iter  30 value 37.560847
## iter  40 value 17.174634
## iter  50 value 7.825111
## iter  60 value 4.130372
## iter  70 value 4.047645
## iter  80 value 3.974757
## iter  90 value 3.892953
## iter 100 value 3.880627
## final  value 3.880627 
## stopped after 100 iterations
## # weights:  27
## initial  value 156.724237 
## iter  10 value 31.687326
## iter  20 value 13.871604
## iter  30 value 11.415025
## iter  40 value 4.734947
## iter  50 value 1.658477
## iter  60 value 1.395765
## iter  70 value 0.901869
## iter  80 value 0.612757
## iter  90 value 0.549314
## iter 100 value 0.538747
## final  value 0.538747 
## stopped after 100 iterations
## # weights:  43
## initial  value 132.598227 
## iter  10 value 13.217554
## iter  20 value 3.162245
## iter  30 value 0.557260
## iter  40 value 0.448381
## iter  50 value 0.415241
## iter  60 value 0.381674
## iter  70 value 0.363224
## iter  80 value 0.355472
## iter  90 value 0.350360
## iter 100 value 0.345746
## final  value 0.345746 
## stopped after 100 iterations
## # weights:  11
## initial  value 132.139541 
## iter  10 value 53.874624
## iter  20 value 49.262219
## iter  30 value 49.200325
## iter  40 value 48.489657
## iter  50 value 47.952170
## iter  60 value 47.819369
## iter  70 value 47.659295
## iter  80 value 47.630938
## iter  90 value 47.585539
## iter 100 value 47.552074
## final  value 47.552074 
## stopped after 100 iterations
## # weights:  27
## initial  value 122.797825 
## iter  10 value 11.536029
## iter  20 value 1.166215
## iter  30 value 0.002579
## final  value 0.000066 
## converged
## # weights:  43
## initial  value 111.656108 
## iter  10 value 4.672364
## iter  20 value 0.141012
## iter  30 value 0.001779
## iter  40 value 0.000649
## final  value 0.000068 
## converged
## # weights:  11
## initial  value 123.343747 
## iter  10 value 54.681912
## iter  20 value 43.801812
## iter  30 value 43.746268
## final  value 43.745415 
## converged
## # weights:  27
## initial  value 123.511781 
## iter  10 value 25.492386
## iter  20 value 20.202171
## iter  30 value 19.920891
## final  value 19.919737 
## converged
## # weights:  43
## initial  value 109.464495 
## iter  10 value 21.689217
## iter  20 value 18.433883
## iter  30 value 18.149227
## iter  40 value 18.115337
## iter  50 value 18.114134
## final  value 18.114127 
## converged
## # weights:  11
## initial  value 128.961908 
## iter  10 value 49.469897
## iter  20 value 44.367486
## iter  30 value 21.778378
## iter  40 value 6.844399
## iter  50 value 4.596111
## iter  60 value 4.420636
## iter  70 value 3.971717
## iter  80 value 3.937134
## iter  90 value 3.837716
## iter 100 value 3.831022
## final  value 3.831022 
## stopped after 100 iterations
## # weights:  27
## initial  value 117.146045 
## iter  10 value 7.488152
## iter  20 value 0.471752
## iter  30 value 0.421101
## iter  40 value 0.368511
## iter  50 value 0.342218
## iter  60 value 0.331822
## iter  70 value 0.317132
## iter  80 value 0.306914
## iter  90 value 0.296449
## iter 100 value 0.281767
## final  value 0.281767 
## stopped after 100 iterations
## # weights:  43
## initial  value 140.529472 
## iter  10 value 19.875220
## iter  20 value 2.954415
## iter  30 value 1.161097
## iter  40 value 1.019260
## iter  50 value 0.890732
## iter  60 value 0.728691
## iter  70 value 0.663176
## iter  80 value 0.613073
## iter  90 value 0.578710
## iter 100 value 0.540378
## final  value 0.540378 
## stopped after 100 iterations
## # weights:  11
## initial  value 127.631173 
## iter  10 value 21.873628
## iter  20 value 4.440109
## iter  30 value 0.177788
## iter  40 value 0.094798
## iter  50 value 0.024690
## iter  60 value 0.024059
## iter  70 value 0.023937
## iter  80 value 0.020992
## iter  90 value 0.020810
## iter 100 value 0.020705
## final  value 0.020705 
## stopped after 100 iterations
## # weights:  27
## initial  value 127.012445 
## iter  10 value 33.312366
## iter  20 value 1.204810
## iter  30 value 0.003554
## final  value 0.000078 
## converged
## # weights:  43
## initial  value 121.024455 
## iter  10 value 1.700603
## iter  20 value 0.003619
## final  value 0.000088 
## converged
## # weights:  11
## initial  value 121.802701 
## iter  10 value 67.660888
## iter  20 value 55.525621
## iter  30 value 42.687102
## final  value 42.579623 
## converged
## # weights:  27
## initial  value 116.162681 
## iter  10 value 27.378517
## iter  20 value 19.998507
## iter  30 value 19.985737
## iter  40 value 19.985715
## iter  40 value 19.985715
## iter  40 value 19.985715
## final  value 19.985715 
## converged
## # weights:  43
## initial  value 118.143759 
## iter  10 value 22.054136
## iter  20 value 17.989103
## iter  30 value 17.619595
## iter  40 value 17.317946
## iter  50 value 17.225372
## iter  60 value 17.222953
## iter  70 value 17.222487
## iter  80 value 17.222437
## iter  80 value 17.222437
## iter  80 value 17.222437
## final  value 17.222437 
## converged
## # weights:  11
## initial  value 118.355062 
## iter  10 value 49.818324
## iter  20 value 38.647325
## iter  30 value 15.844677
## iter  40 value 2.582960
## iter  50 value 2.136811
## iter  60 value 2.035498
## iter  70 value 2.033350
## iter  80 value 2.021573
## iter  90 value 1.995371
## iter 100 value 1.994256
## final  value 1.994256 
## stopped after 100 iterations
## # weights:  27
## initial  value 130.821997 
## iter  10 value 19.933529
## iter  20 value 0.975068
## iter  30 value 0.473534
## iter  40 value 0.432481
## iter  50 value 0.372884
## iter  60 value 0.295422
## iter  70 value 0.276597
## iter  80 value 0.263857
## iter  90 value 0.216302
## iter 100 value 0.209542
## final  value 0.209542 
## stopped after 100 iterations
## # weights:  43
## initial  value 144.732840 
## iter  10 value 10.040236
## iter  20 value 0.345443
## iter  30 value 0.298449
## iter  40 value 0.270041
## iter  50 value 0.225858
## iter  60 value 0.195855
## iter  70 value 0.176125
## iter  80 value 0.164022
## iter  90 value 0.152679
## iter 100 value 0.150088
## final  value 0.150088 
## stopped after 100 iterations
## # weights:  11
## initial  value 129.869113 
## iter  10 value 50.042465
## iter  20 value 49.908565
## iter  30 value 49.906746
## final  value 49.906672 
## converged
## # weights:  27
## initial  value 136.216049 
## iter  10 value 10.058478
## iter  20 value 0.927014
## iter  30 value 0.000386
## final  value 0.000089 
## converged
## # weights:  43
## initial  value 116.240399 
## iter  10 value 2.687573
## iter  20 value 0.910154
## iter  30 value 0.001158
## final  value 0.000058 
## converged
## # weights:  11
## initial  value 122.548705 
## iter  10 value 48.475518
## iter  20 value 43.263734
## final  value 43.262103 
## converged
## # weights:  27
## initial  value 151.969882 
## iter  10 value 29.866683
## iter  20 value 20.041938
## iter  30 value 19.181326
## iter  40 value 18.658426
## iter  50 value 18.646346
## iter  60 value 18.646228
## final  value 18.646221 
## converged
## # weights:  43
## initial  value 123.857709 
## iter  10 value 21.867276
## iter  20 value 18.327082
## iter  30 value 18.061485
## iter  40 value 18.034598
## iter  50 value 18.032834
## final  value 18.032819 
## converged
## # weights:  11
## initial  value 133.691360 
## iter  10 value 27.686299
## iter  20 value 3.688826
## iter  30 value 2.998116
## iter  40 value 2.982774
## iter  50 value 2.975593
## iter  60 value 2.973846
## iter  70 value 2.972998
## iter  80 value 2.972919
## final  value 2.972915 
## converged
## # weights:  27
## initial  value 121.910769 
## iter  10 value 4.186175
## iter  20 value 1.397080
## iter  30 value 0.429392
## iter  40 value 0.403901
## iter  50 value 0.371671
## iter  60 value 0.353374
## iter  70 value 0.346994
## iter  80 value 0.340640
## iter  90 value 0.326373
## iter 100 value 0.320888
## final  value 0.320888 
## stopped after 100 iterations
## # weights:  43
## initial  value 150.467908 
## iter  10 value 2.516940
## iter  20 value 0.515624
## iter  30 value 0.419086
## iter  40 value 0.400951
## iter  50 value 0.356741
## iter  60 value 0.321748
## iter  70 value 0.269242
## iter  80 value 0.257949
## iter  90 value 0.244026
## iter 100 value 0.230916
## final  value 0.230916 
## stopped after 100 iterations
## # weights:  11
## initial  value 130.397834 
## iter  10 value 50.573102
## iter  20 value 49.909353
## final  value 49.906794 
## converged
## # weights:  27
## initial  value 142.795978 
## iter  10 value 8.325156
## iter  20 value 1.733508
## iter  30 value 0.008474
## final  value 0.000056 
## converged
## # weights:  43
## initial  value 147.890271 
## iter  10 value 14.812090
## iter  20 value 0.484823
## iter  30 value 0.000580
## final  value 0.000074 
## converged
## # weights:  11
## initial  value 122.928070 
## iter  10 value 67.652212
## iter  20 value 46.324443
## iter  30 value 44.176746
## final  value 44.154954 
## converged
## # weights:  27
## initial  value 118.635144 
## iter  10 value 27.365477
## iter  20 value 20.236166
## iter  30 value 19.919856
## final  value 19.919323 
## converged
## # weights:  43
## initial  value 123.713602 
## iter  10 value 23.115917
## iter  20 value 19.181439
## iter  30 value 19.146092
## iter  40 value 19.135538
## iter  50 value 19.135363
## iter  60 value 19.135305
## final  value 19.135297 
## converged
## # weights:  11
## initial  value 124.268451 
## iter  10 value 50.415686
## iter  20 value 50.122205
## iter  30 value 50.099925
## iter  40 value 50.039219
## iter  50 value 48.795443
## iter  60 value 45.810850
## iter  70 value 44.976509
## iter  80 value 44.652199
## iter  90 value 43.655722
## iter 100 value 21.549290
## final  value 21.549290 
## stopped after 100 iterations
## # weights:  27
## initial  value 121.168989 
## iter  10 value 12.887627
## iter  20 value 1.421530
## iter  30 value 0.596446
## iter  40 value 0.525751
## iter  50 value 0.482633
## iter  60 value 0.455870
## iter  70 value 0.441781
## iter  80 value 0.405097
## iter  90 value 0.379758
## iter 100 value 0.359516
## final  value 0.359516 
## stopped after 100 iterations
## # weights:  43
## initial  value 154.331260 
## iter  10 value 9.135896
## iter  20 value 1.287634
## iter  30 value 0.536307
## iter  40 value 0.516772
## iter  50 value 0.444990
## iter  60 value 0.422222
## iter  70 value 0.414269
## iter  80 value 0.388936
## iter  90 value 0.382924
## iter 100 value 0.374877
## final  value 0.374877 
## stopped after 100 iterations
## # weights:  11
## initial  value 119.161548 
## iter  10 value 49.944558
## iter  20 value 48.322924
## iter  30 value 46.428533
## iter  40 value 46.268965
## iter  50 value 46.227049
## iter  60 value 46.155518
## iter  70 value 45.699558
## iter  80 value 37.848275
## iter  90 value 7.852629
## iter 100 value 4.666912
## final  value 4.666912 
## stopped after 100 iterations
## # weights:  27
## initial  value 121.994742 
## iter  10 value 4.269484
## iter  20 value 0.323645
## iter  30 value 0.000228
## final  value 0.000073 
## converged
## # weights:  43
## initial  value 120.712721 
## iter  10 value 11.633228
## iter  20 value 1.928801
## iter  30 value 0.089821
## iter  40 value 0.000470
## final  value 0.000048 
## converged
## # weights:  11
## initial  value 125.023647 
## iter  10 value 52.033224
## iter  20 value 43.475534
## iter  30 value 43.428235
## final  value 43.428214 
## converged
## # weights:  27
## initial  value 150.243876 
## iter  10 value 32.636911
## iter  20 value 21.467254
## iter  30 value 19.692563
## iter  40 value 19.331538
## iter  50 value 19.321372
## iter  60 value 19.321093
## final  value 19.321088 
## converged
## # weights:  43
## initial  value 137.965234 
## iter  10 value 22.585768
## iter  20 value 18.845985
## iter  30 value 18.359487
## iter  40 value 18.060579
## iter  50 value 17.805017
## iter  60 value 17.768557
## iter  70 value 17.768156
## iter  80 value 17.768097
## final  value 17.768090 
## converged
## # weights:  11
## initial  value 127.936624 
## iter  10 value 64.892982
## iter  20 value 52.457973
## iter  30 value 51.893780
## iter  40 value 46.822596
## iter  50 value 20.931506
## iter  60 value 5.855746
## iter  70 value 4.449348
## iter  80 value 3.934110
## iter  90 value 3.778873
## iter 100 value 3.726881
## final  value 3.726881 
## stopped after 100 iterations
## # weights:  27
## initial  value 124.538161 
## iter  10 value 19.935878
## iter  20 value 1.179326
## iter  30 value 0.515886
## iter  40 value 0.495212
## iter  50 value 0.459550
## iter  60 value 0.425014
## iter  70 value 0.408161
## iter  80 value 0.387730
## iter  90 value 0.360044
## iter 100 value 0.337881
## final  value 0.337881 
## stopped after 100 iterations
## # weights:  43
## initial  value 133.979878 
## iter  10 value 12.011468
## iter  20 value 0.941094
## iter  30 value 0.495870
## iter  40 value 0.477345
## iter  50 value 0.464609
## iter  60 value 0.425356
## iter  70 value 0.381548
## iter  80 value 0.333472
## iter  90 value 0.319381
## iter 100 value 0.304457
## final  value 0.304457 
## stopped after 100 iterations
## # weights:  11
## initial  value 129.556405 
## iter  10 value 49.342383
## iter  20 value 35.419965
## iter  30 value 5.074745
## iter  40 value 2.940088
## iter  50 value 2.543858
## iter  60 value 2.312929
## iter  70 value 2.281995
## iter  80 value 2.059116
## iter  90 value 2.012601
## iter 100 value 1.857343
## final  value 1.857343 
## stopped after 100 iterations
## # weights:  27
## initial  value 155.931952 
## iter  10 value 9.651371
## iter  20 value 1.510703
## iter  30 value 0.025766
## iter  40 value 0.003870
## iter  50 value 0.000229
## final  value 0.000085 
## converged
## # weights:  43
## initial  value 139.919182 
## iter  10 value 7.001515
## iter  20 value 2.265308
## iter  30 value 0.480211
## iter  40 value 0.046809
## iter  50 value 0.001016
## iter  60 value 0.000148
## final  value 0.000085 
## converged
## # weights:  11
## initial  value 137.379619 
## iter  10 value 58.587747
## iter  20 value 45.493964
## final  value 43.369230 
## converged
## # weights:  27
## initial  value 122.183968 
## iter  10 value 34.103176
## iter  20 value 19.778653
## iter  30 value 19.482816
## iter  40 value 19.412523
## iter  50 value 19.406639
## final  value 19.406612 
## converged
## # weights:  43
## initial  value 127.464513 
## iter  10 value 20.014903
## iter  20 value 18.283826
## iter  30 value 17.864550
## iter  40 value 17.854806
## iter  50 value 17.852930
## final  value 17.852879 
## converged
## # weights:  11
## initial  value 126.686154 
## iter  10 value 47.126881
## iter  20 value 13.760512
## iter  30 value 5.663815
## iter  40 value 4.107040
## iter  50 value 3.970174
## iter  60 value 3.913599
## iter  70 value 3.760966
## iter  80 value 3.757224
## iter  90 value 3.753338
## iter 100 value 3.748772
## final  value 3.748772 
## stopped after 100 iterations
## # weights:  27
## initial  value 144.486253 
## iter  10 value 4.284520
## iter  20 value 0.488472
## iter  30 value 0.440576
## iter  40 value 0.431107
## iter  50 value 0.424352
## iter  60 value 0.415746
## iter  70 value 0.413581
## iter  80 value 0.410783
## iter  90 value 0.409591
## iter 100 value 0.408124
## final  value 0.408124 
## stopped after 100 iterations
## # weights:  43
## initial  value 127.608663 
## iter  10 value 4.647335
## iter  20 value 1.221540
## iter  30 value 0.611939
## iter  40 value 0.560234
## iter  50 value 0.535709
## iter  60 value 0.477525
## iter  70 value 0.419169
## iter  80 value 0.399554
## iter  90 value 0.391996
## iter 100 value 0.375996
## final  value 0.375996 
## stopped after 100 iterations
## # weights:  11
## initial  value 138.169000 
## iter  10 value 58.741341
## iter  20 value 46.635586
## final  value 46.598157 
## converged
resultado_entrenamiento5 <- predict(modelo5, entrenamiento)
resultado_prueba5 <- predict(modelo5, prueba)

#Matriz de Confusión
#Es una tabla de evaluación que desglosa el rendimiento del modelo de clasificación.

#Matriz de confusión del resultado del entrenamiento
mcre5 <- confusionMatrix(resultado_entrenamiento5, entrenamiento$Species)
mcre5
## Confusion Matrix and Statistics
## 
##             Reference
## Prediction   setosa versicolor virginica
##   setosa         40          0         0
##   versicolor      0         36         0
##   virginica       0          4        40
## 
## Overall Statistics
##                                           
##                Accuracy : 0.9667          
##                  95% CI : (0.9169, 0.9908)
##     No Information Rate : 0.3333          
##     P-Value [Acc > NIR] : < 2.2e-16       
##                                           
##                   Kappa : 0.95            
##                                           
##  Mcnemar's Test P-Value : NA              
## 
## Statistics by Class:
## 
##                      Class: setosa Class: versicolor Class: virginica
## Sensitivity                 1.0000            0.9000           1.0000
## Specificity                 1.0000            1.0000           0.9500
## Pos Pred Value              1.0000            1.0000           0.9091
## Neg Pred Value              1.0000            0.9524           1.0000
## Prevalence                  0.3333            0.3333           0.3333
## Detection Rate              0.3333            0.3000           0.3333
## Detection Prevalence        0.3333            0.3000           0.3667
## Balanced Accuracy           1.0000            0.9500           0.9750
#Matriz de Confusión del Resultado de prueba
mcrp5 <- confusionMatrix(resultado_prueba5, prueba$Species)
mcrp5
## Confusion Matrix and Statistics
## 
##             Reference
## Prediction   setosa versicolor virginica
##   setosa         10          0         0
##   versicolor      0          9         0
##   virginica       0          1        10
## 
## Overall Statistics
##                                           
##                Accuracy : 0.9667          
##                  95% CI : (0.8278, 0.9992)
##     No Information Rate : 0.3333          
##     P-Value [Acc > NIR] : 2.963e-13       
##                                           
##                   Kappa : 0.95            
##                                           
##  Mcnemar's Test P-Value : NA              
## 
## Statistics by Class:
## 
##                      Class: setosa Class: versicolor Class: virginica
## Sensitivity                 1.0000            0.9000           1.0000
## Specificity                 1.0000            1.0000           0.9500
## Pos Pred Value              1.0000            1.0000           0.9091
## Neg Pred Value              1.0000            0.9524           1.0000
## Prevalence                  0.3333            0.3333           0.3333
## Detection Rate              0.3333            0.3000           0.3333
## Detection Prevalence        0.3333            0.3000           0.3667
## Balanced Accuracy           1.0000            0.9500           0.9750

Model 6. Bosques Aleatorios

modelo6 <- train(Species ~ ., data=entrenamiento,
                 method = "rf", #Cambiar
                 preProcess = c("scale","center"),
                 trControl = trainControl(method = "cv", number=10),
                 tuneGrid = expand.grid(mtry = c(2,4,6)) #Cambiar
                 
)
## Warning in randomForest.default(x, y, mtry = param$mtry, ...): invalid mtry:
## reset to within valid range
## Warning in randomForest.default(x, y, mtry = param$mtry, ...): invalid mtry:
## reset to within valid range
## Warning in randomForest.default(x, y, mtry = param$mtry, ...): invalid mtry:
## reset to within valid range
## Warning in randomForest.default(x, y, mtry = param$mtry, ...): invalid mtry:
## reset to within valid range
## Warning in randomForest.default(x, y, mtry = param$mtry, ...): invalid mtry:
## reset to within valid range
## Warning in randomForest.default(x, y, mtry = param$mtry, ...): invalid mtry:
## reset to within valid range
## Warning in randomForest.default(x, y, mtry = param$mtry, ...): invalid mtry:
## reset to within valid range
## Warning in randomForest.default(x, y, mtry = param$mtry, ...): invalid mtry:
## reset to within valid range
## Warning in randomForest.default(x, y, mtry = param$mtry, ...): invalid mtry:
## reset to within valid range
## Warning in randomForest.default(x, y, mtry = param$mtry, ...): invalid mtry:
## reset to within valid range
resultado_entrenamiento6 <- predict(modelo6, entrenamiento)
resultado_prueba6 <- predict(modelo6, prueba)

#Matriz de Confusión
#Es una tabla de evaluación que desglosa el rendimiento del modelo de clasificación.

#Matriz de confusión del resultado del entrenamiento
mcre6 <- confusionMatrix(resultado_entrenamiento6, entrenamiento$Species)
mcre6
## Confusion Matrix and Statistics
## 
##             Reference
## Prediction   setosa versicolor virginica
##   setosa         40          0         0
##   versicolor      0         40         0
##   virginica       0          0        40
## 
## Overall Statistics
##                                      
##                Accuracy : 1          
##                  95% CI : (0.9697, 1)
##     No Information Rate : 0.3333     
##     P-Value [Acc > NIR] : < 2.2e-16  
##                                      
##                   Kappa : 1          
##                                      
##  Mcnemar's Test P-Value : NA         
## 
## Statistics by Class:
## 
##                      Class: setosa Class: versicolor Class: virginica
## Sensitivity                 1.0000            1.0000           1.0000
## Specificity                 1.0000            1.0000           1.0000
## Pos Pred Value              1.0000            1.0000           1.0000
## Neg Pred Value              1.0000            1.0000           1.0000
## Prevalence                  0.3333            0.3333           0.3333
## Detection Rate              0.3333            0.3333           0.3333
## Detection Prevalence        0.3333            0.3333           0.3333
## Balanced Accuracy           1.0000            1.0000           1.0000
#Matriz de Confusión del Resultado de prueba
mcrp6 <- confusionMatrix(resultado_prueba6, prueba$Species)
mcrp6
## Confusion Matrix and Statistics
## 
##             Reference
## Prediction   setosa versicolor virginica
##   setosa         10          0         0
##   versicolor      0         10         2
##   virginica       0          0         8
## 
## Overall Statistics
##                                           
##                Accuracy : 0.9333          
##                  95% CI : (0.7793, 0.9918)
##     No Information Rate : 0.3333          
##     P-Value [Acc > NIR] : 8.747e-12       
##                                           
##                   Kappa : 0.9             
##                                           
##  Mcnemar's Test P-Value : NA              
## 
## Statistics by Class:
## 
##                      Class: setosa Class: versicolor Class: virginica
## Sensitivity                 1.0000            1.0000           0.8000
## Specificity                 1.0000            0.9000           1.0000
## Pos Pred Value              1.0000            0.8333           1.0000
## Neg Pred Value              1.0000            1.0000           0.9091
## Prevalence                  0.3333            0.3333           0.3333
## Detection Rate              0.3333            0.3333           0.2667
## Detection Prevalence        0.3333            0.4000           0.2667
## Balanced Accuracy           1.0000            0.9500           0.9000

Model 6. Bosques Aleatorios

resultados <-data.frame(
  "svmLinear" = c(mcre1$overall["Accuracy"], mcrp1$overall["Accuracy"]),
  "svmRadial" = c(mcre2$overall["Accuracy"], mcrp2$overall["Accuracy"]),
  "svmPoly" = c(mcre3$overall["Accuracy"], mcrp3$overall["Accuracy"]),
  "rpart" = c(mcre4$overall["Accuracy"], mcrp4$overall["Accuracy"]),
  "nnet" = c(mcre5$overall["Accuracy"], mcrp5$overall["Accuracy"]),
  "rf" = c(mcre6$overall["Accuracy"], mcrp6$overall["Accuracy"])
)

rownames(resultados) <- c("Precisión de entrenamiento", "Precisión de prueba")
resultados
##                            svmLinear svmRadial   svmPoly     rpart      nnet
## Precisión de entrenamiento 0.9916667 0.9916667 0.9666667 0.9666667 0.9666667
## Precisión de prueba        0.9666667 0.9333333 0.9333333 0.9333333 0.9666667
##                                   rf
## Precisión de entrenamiento 1.0000000
## Precisión de prueba        0.9333333

Conclusiones

Acorde a la tabla de resultados, observamos que ningún método presenta sobreajuste. Podemos seleccionar el de redes neuronales por su desempeño.

LS0tDQp0aXRsZTogIkNhcmV0Ig0KYXV0aG9yOiAiQXRlbmVhIExvcGV6IENvcm9uYSINCmRhdGU6ICIyMDI1LTA4LTIyIg0Kb3V0cHV0Og0KICBodG1sX2RvY3VtZW50Og0KICAgIHRvYzogVFJVRSAjVGFibGEgZGUgY29udGVuaWRvcw0KICAgIHRvY19mbG9hdDogVFJVRSAjVGJsYSBkZSBhbGdvDQogICAgY29kZV9kb3dubG9hZDogVFJVRSAjUG9kZXIgZGVzY2FyZ2FyIGPDs2RpZ28NCiAgICB0aGVtZTogY29zbW8NCi0tLQ0KDQohW10oZGF0YTppbWFnZS9qcGVnO2Jhc2U2NCwvOWovNEFBUVNrWkpSZ0FCQVFBQUFRQUJBQUQvMndDRUFBa0dCeE1URWhVVEV4UVZGaFVYR0IwWUdCY1lHQmdlR0JvZUh4c2dJQjBZR0IwWUhTZ2dHUnNsSGg0WElURWhKU29yTGpBdUdCOHpPRE10TnlndExpc0JDZ29LRGcwT0d4QVFHeThsSUNZdEx5MHRMUzB0TFMwdExTMHZMUzB0TlM4dExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMZi9BQUJFSUFJa0Jid01CSWdBQ0VRRURFUUgveEFBY0FBQUNBZ01CQVFBQUFBQUFBQUFBQUFBRkJnUUhBQU1JQWdIL3hBQlNFQUFDQVFJREJRUUZCd2dHQndZSEFBQUJBaEVBQXdRU0lRVUdFekZCSWxGaGNRY3lnWkdoRkNOQ1VySEIwVE5pY3BLVDB1SHdGaVEwVTFSakZVTkVjNEt5d3lXRW90UGk4UmNtTldTRHM4TC94QUFhQVFBQ0F3RUJBQUFBQUFBQUFBQUFBQUFDQXdBQkJBVUcvOFFBTEJFQUFnSUJCQUVFQUFZQ0F3QUFBQUFBQUFFQ0VRTUVFaUV4UVJNaVVXRVVjWUdoc2ZDUjBRVWtNdi9hQUF3REFRQUNFUU1SQUQ4QXZCakFta1N6Nlh0a3NZRjl5ZjhBYzNmM2FlYjNxbnlOY1cyclJBQmlEVk1oMDZQU3hzdk5sNHpnOHRiTjBEekp5d0I0MGQvcFZodnJOK3EzNFZ5c2J3WlNUNjBSVDV1THRzTW93enRKVURoc2VvL3V6NGpwNGFkTlV6bkpLMFU3U0xzZmV2REFFNW1NQ2RFWW4yQ05UUWMrbExadjk2LzdHNys3U3pGVi92M3NkclZ3WWhKNFRtSEE1SzM0TnpIalBoUVF6U2s2QlVteTRybnBaMldPZDUvMk4zOTJ2QytsN1pKSUhIY2VKczNZOHoyZVZjK3ZiZ1JxUVdHdlBwV3NiUGVkRlB1MHAyLzVET2x0cGVrUEFXQXB1WEh5dHlaYmR4bE9ralZRUnFOUjM5S2pZUDBwYk11dGxTNjg5eHRYUjlxMVRHN2FPYlRZYStKdHNPd0NkUjFLK0FuVWR4SGpwdTJQc0piRHVYYlBIWlVjdERIT092NEdxd3VlV1RncXY5aXJ2aEZ1NHIwczdMdHNVZTdjRERvYk4zOTJ2aWVsblpaNVhibjdDOSs3VlhiUjJkWmVDRW5VQUFtWUI2cVRxdlRUa2U2aGVJMlVBU0piUXh5QTcrL1RTT2ZpSzBTdzVrNjIzL0JIWmM3K2xmWlk1M24vQUdOMzkydHVCOUoremJ4WVc3cnNWRXh3cmdKQTV3Q3V2a0twTk5qNGMrdWpQNHM3RC9rSUZiRTNjVE90ekQzSHRNcGtBd3dCKzJQT2FPV2x6S044V1hUTHN3L3BJMmUrYkxjYzVlZnpWejcxMXJTbnBSMmFUQXV2TXgrUnUvdTFWdC9BdGJianFCREQ1eFJ5bmtTdmdhV2RzVytGZlhTVmJ0S2ZPdWVzMG02QTNNdlovU3Jzd05sTjI1UEw4amQrM0xSaTN2ZmhXaUhiVVQ2amZoWE90akI4WEVvdjBUREh5NW44UGJUenRIRkczYXVYVkVrTENqeGlCSDIwTTlSSlVrVGN5MGRtYjRZUyt1SWExY0pYRENicEtPTW9oanBJN1dpdHlubFF1MzZVTm1IbGZZLy9BSXJ2N3RWMTZMbi9BT3o5c21kZmsrdjdLOVNSZ2NPY2dqMzA2VTJrbUd1dVMvcjNwTjJhcTVtdk1CL3VydjNMV1dmU1pzMWdHRjVvUCtWZEgyclZFbloyYjFqUGNLajRyQ1hWQlVjdVlpaDlac25CMFQvVHZBLzNqZnM3bjd0UkwvcEwyY2h5dGRjRWY1TjM3bHFrTUxpcmlKRE5Kb1JqTVdXUGY0MVVjczIvQlViWmY3K2xmWlkwTjUvMkY3OXl2amVsalpRLzE3L3NMMzdsYzlNMVpidFRyVGQ0ZEhRWjlMbXlmNzkvMkYvOXl2ZHYwcjdMSkFGOSswWUh6Tjd2ajZtbFVaZ3NHdDIweWlPSmJPWWVJUE1lK2hlSXVBS0NPYW5sK05Dc3Q4RkpIUjJQOUptemJKQXVYWEVpUkZtNmVzZEZyU25wVjJXZVY2NGRKL0lYdjNLcC9iZUpOMndsdFY3VnpocjQvV2srV3RTY1JnMHc5bGJTeG1lTXpIbWZIeTVtS1N0UzZWcmtHeTNtOUpXemdNeHV2Qi95YnMrN0xOR0Uza3d4d3d4ZWM4RnRBMlI1OWJMNnNaaHFDT1ZVQmN2aFJtSUJKRUNlbmQrSnF3c0NmL2w2MlpuNXh0Zis4dkpwaXl0cHY2STM3YkcreHY1Z0hiSXQ0NXU3aDNCOXExRS8rSnV6ZUtiUEdiaUFrRmVEZTZjOWNrUjQxVHUwclpVaDEwSTFCL0N2bUg0YmNTK0k0dDBoV0gxWUFtUE9KcGExRXUvN1lsWlhSZGx2ZjdBRVNMcmZzN3Y3dFFIOUsreWdTdnlocEgrUmYrNUtxTGJGL2gyU0JvVDJSN2VaOTFMMnhzT0d2VzFQSXNKOGhxZmdLT0dhVFRiQ1dSMWJPa0R2emdaVWNWcFpTNEhEdVRsSFdNdW5QbFFvK2x2WlArSWY5aGYvQVBMcW45MzlvRzlqcmx4dVdSZ0IwQ2c2QVVxWTJNN1plV1l4NVRWNDhrbTZsOUVqTjNUT21kbWVrWFoySUxDMWVac3NUTnE2T2N4NnlEdU5FUDZWNFgrOFA2ai9BSVZRSG82SGF2ZVNmYTFQWkd2c3BXWFVUaktsUU04clRvYnRwK2s3Wm1IZkpkdmxXak5IQ3VuVHYwVHdOYWIzcFoyU29CYkVrWmhJK1p2ZnVhVlJYcFR0QVg3VGRTaEh1UDhBNnFVY0phYTQ2cUpKSmdWcHh6Y29LVEd4ZHF6cVVlbFRaV1hOeDJnekh6TjdwejB5VmxqMHFiTGRncTMzTEV3QndMLzdsYzdXN2NadTVkQjdQNDB6ZWpqQkJudVhTUFZBQ254TWsvZFM4bWJaQnlBbE9sWmZ5YjA0VXNxaTRaWmdvR1IrWk1BY3ROVFJxcVN4T0liNVRnN2FhcytLcy9xcmNWbVBsbEJxN2FtbXl5eVEzU0x4eWNsYlBGMzFUNUd1TTBOeFFDdW8wK3l1emJ2cW55TmNuWGRoWGtVTmtuc2lRaG1DT29qb2U2bVRrbFZqQWJ4RzZxcE9XUUkrd2lpbXpka2NZSytiaDVlVUhXUWRDRDBJb2ExcGdnTEFpRGxJalVkWmlwQVJpdVU2Z0NVSTBNRG1EOGFDWFhBVkZyYk14WWRRcGFiaWpYbDJ2enRQalVxNVpWMUtPSlZ0Q0QvUE1WVW15N04yMHkzbGNoNTdBSjk1STdvKzJyUTJMdFZjUW1ZYU91anAxVTk0L05QUS9oV2FVTm9xVWFBVzBzUGJzc1ZZcU9vNUNSME5EanRDd28xZFNQT20vYkdGUjB6T0JLYTY5UWVoOEpnK3lsdi9BRVBocm5yV2dPcHlsaDBNOWEwWU5ETExIY241TFViQnQzYTFxSlNDUjFvN3MreDhxdzNGc21iaVN0eEFOVEpMQmgzYUUrY2FlcWFBYlMzUVltY0t3S1JKUm03V2I2cW1JSTdwSXJWdXB0RzVocjhGd0M4SXlnbVFaRUh6QjcrODFveFk1YVhKWmFWQit6Z2NRUlBDdVJQTWdnZC9NK0ZiZG9iSXVvTGYwMmRTN0JRWXRpVG9XNUU2YTl4S2pxS2JPT2wyMGM3RkdHWTVWQlAyNkNZR25oM2trajlsNHNXN1VNQWVSRFNGSTE2c2VTam1lZjBpQVRBcnErcktycjlBK1JRUlNUQUg4K004cTNManJWdm13WXhyRXdQeHJUdjl0Umx1TGJES2laQXpaSkVzU1l6ekRUbHk4K1ZCTFcwMWY1dTR1WkloTGk2dXY0citiN3F6WjljNDhSaUM1TkJWdDVTYnZZQzhNZEQ5SWRjMGN2TFdwTzBzTUx0b0ZJS2p0V3o0ZlNRK0lvQytCYTJTWUJCSFpjYXF3OXZJOTROSHR5OFNEY3VXM3lsZUc3dzJmS0dVYUg1dnRSM3hYR3lOemx2OGkzeTdQR3hNT1IyejZ4N0kvUkhNL3dBOTFidHNZODUxdGFaQUNXTTZ5ZEYrL3dDRk5GblpsZzVYRHdqRUFLRllpTXlxOEU2anRFa1p0Y3VXZFRTeGEySXQyNExyQjhoeE5zRmJnVlM5czRoYkpIWnVGdldKMWdEc25XYVZIRzVTdGxKQkwwWllZVzhCdHRRWi9xL2ovZFh1K2tQWWQyNUdpNWw4YXNEMFlYZyt6TnJtWmY1TjJvLzNWNlB2cXNzRmozdGFMeU5hNUp1STJyUXgzTGpEcEZhbXhVQ1NQQ2hHSTJoY2JyN3EzWWgyS0NhVHMrUWR0ZG4zRTN5UVlxT3NBYTg2M1diZzZpdDJKd0trU1BkUjJsd3cwNjRCak9LMmF4cFhwOFAwMEZiQTZnUlBLanNJMzdCNGkzMElCSVloU1BNeDlzVVkzbDJNTGJtN2I3VnRpQXhqa3g3eDNHaW15WFFxckpsMEJQa1FEOTlTTU03ZXM5c3RiTUF5SlV6cUNSSGlDRFQ5SmdXZU1wUGg5QXAyUTlscUNFdUdPd3BqejVmWUtnM2I1dTNtSjFWZEIrRk5BMlVqSVZ0UUNkVjdwN3ZJOHFWaW5CQkRBZ3pxT3M5UldITHA1WXB2ZCtnRXJRTDNoWWtaVm52TVZZTm5HR3p1cGF1SFdMcG55T0xZSDJ4U00rRkYwTk9oUFFkUERXbnphZXpXL290YnNKcXh1Z0QyNG9uNzZkamNhY1Fta2xRc0xjRHBFK1IreWc2WHVGY0RkT284UHhGSHRyWUlXT0dSNnVVS2ZNQ0o5djNVSXg5dVFUV2FEVFgwektpRnZOalFYVlZNd0o4TmRmd3JUc2ZFOEpicmthbTJWVStKN3FpWVRCRzVlVzJPWlB3LzlxUDdid3FXaGJ0aUdPclFSMmV6cnFPbzBJanVyUkdLdU9OZVJsZFJBK3dieFYzZ3hLNVo4Q3dCK0ZPK045SHFHMnQxVDYwQ0FmVlBnT1VIbjV6NFVEMlpzKzNpQnhiYXJidjJpQ2JhcXd0WFIxbUpOcHVmYUF5NmFnUkpkOXFZNjRMSlFhQUtENGd4bVdmSFNmZFhVeFlrdmEwcnY5aDhZQ3h1WHMxN0Y2K3Jqb2tIb1JMVXpXc2ZhdU1BdHhHWXJNQmdUSGZIT0swMjVXemF4T3I4UnhhSzhpQ1pLeHptWVlheDA3NjFZUGR6QzJzZzRjTkhyekxBaUNXQk1sZEppSTVuUVRYUHk2SjVNMGxIaElWTEEzSmloNlc3ZXVIUGVIQi84TkwyNjFvS3Q2OGVhTEMvcE5wVXpmdkYzU3dzWGlDMXAyQVBXREVDUnowQUk4NjI3cE9vQ0lSTXNYYi9BSVYwK05ES0R4WTlqOEZOT01LTkwyaWxrenpPbnZwNzNGdytUQ3o5WmlmaFNqdGxkRUhWbWswK2JHWEpoVThwUHROWXRWSzhhWHl4TTN3ZTlsMjV4dGx6ejRsdFY4QnhGSjk1QTlpaXJxcW05aEwvQUZteXgvdlUvd0NjVmNsYU5HL2EwTnc5SG03eVBrYTVqMkx0c3NHUjFCdUtKVWpUT0k4T1JycHU3NnA4alhKZUV2SmJhM2NPYm1KVTlERVFlb2tVM1BGU1Exak5aMnphZFJ4Rkt6TWhsREFaUkxBa2E2UWZkUnBOMXJOOUxWeTFMWnhJYTNCUWFFbFREU0dBQjBLamtZbnFzWDdZRjBOb2JXWUdSekU2YWp1Z2tUVXJZZUp4QkpzMnpiQlVPV2JJaUFyYnR0UEZPWHRBV3pjR3ZQTjNtYXpLRWUwVlh3RXp1VGRTNW56Z2hRd3lNUUhoVkRHQjFBVWcrVlNMdXg3dUhCdmpSMHl4R3F1ckZnVmFPa3I5NDZHbyt4dDVyM0RDbktZTEhNVldlMkZHVllIWkFDeHB6ekdmRXMyOFJ1eUhsZllDT1pQZFBObTk5RzdYMkRKODhuakY3UVM3WkJYVE1ZS25tSTVqeC9DaE5tWktucUQ5bjgrK2ltS0l5aU1wQkptTkFUcDNjanlvWmZTTzB2VDNqejZFZUlydmFLS2poaWtOajBFTm5DZVhmek9uU1NmWUpQdXJWZDNWdDNjV2pBRVQ4NjZqUUhVNm5ycVluOUt2V3pIa3FKQUIxSlBJY2daOXhNZDFNZTY2VHRERmdtVnRXcktMNEZnenQvOEF6clE2cFhTK3lTTjk3QlpTUjFNZTg4L2hOTG05MklPRXRxd1ZTWGZKRGNoMldKSjFFOGdJOGFheGR6NG9xUG8vd0g0ME0zeXdpWHI5bTJTTXRxYmx3SFdjMmlLWjVjaWZJMEdTVFNwZHNnaDdOM2N1WXd0aWNiTU5HVUxsR2FBQURFZGxJQUFFYTgvRW1YM1h3b0dUSzRqNlMzQ0R5bmw2dndvdmlMc3dPUmsreVFzSDJkcjNHc3dxS3hCYVFwMEo4SjFnRWpwQTlsSEhCQkxsV1hRTHcyNnlBRkZlNDRlRGthRFBjUkFFTjVWb3Q3ckpncmhmRTNUQkVKYXQvbGlEcVJjSjdOb2FqbkpQMWFiVzJxRUJGaGNnT25FSitjSTVUbStpUEJZSGlhU3RzWTFDNXp5QW4waDd6SS9ubFdQVllvUXh1U1ZDNXBKSHphRjRYVnVXcmZ6ZWZ0TGJ6RXJweVVrOC9NMG1iV3hGek5CdVhaVS9XWTlxUVMzcmV0SUd2UHNqdW9oaVZ1SmZXOHJaN1RmVFhsK2lmcWtkeHJadHZEcmRIR1V3UkdlT282UDl4cm53OXIvTUZjRFQ2SkNEczdiTVQvWitvai9WWHFyVjdkV2g2TFAvQUtmdGcvOEEyLzhBMHIxVmtFTGFWb1kySnRzVzVLMFJ4b2hEV29mTnFJRW12dDROY0VSQXBVdXlwSnRtellTSzJwNTBZWkFPbEw5dFh0a1pSUmE1aWN5ZU5LbXViQmtmY0pzQzdpeGNlMnlJRUlVWnA3VEVUR25JUkVueEhzVzcrRllGbFlGYmlraGxQTUVjeC9Hbi9kQzRGdFhVNmtoL1BTQ2ZaMlRXamJ1QlIzRndpQ3cxUGlQL0FFNWZkVzF3VWNDeUw5UTc0c1c5emJ0eGNTb0JJMEpqcHlqNzU5bFBIRnVXcmlFYUVRUjRaZVE3Z05PWGhXemN2ZGRWczNNVytrbkphMTVnSHRON1NBby9STlRzVnFlTVIyUVJsR25rT2VtdmpwMzFyMDJSUXd1VFh5dzByUG1Pd2oyVlM1R1Zib2xWSkVycnlnYWtkWmdhRWRhQWIxM3JXYTBXMWQ0MEJFeU9Ua2NvaU5Eek1lTk1HMWQ2YnpKa1V3b0FHWTZzeDcvcXFmRUNUU0hpTUxjZTd4VEpua2F5WnRaSExDcTVBM0lueW9CeWtrZ2F5dXZ0alNhcy9aV3V4TFJQMW0vL0FITlZTY2FKSHZxMWRodC8yRGJJNk04RHl2dldHdmJMOG1LYnRNQWJjczIzd0Z4eG1MSzl4Z0lNbGxWVkNqMnlZcXZjSmk4d2c4MU1FZFI1K1hLckcySDgzaG50WGRTem04eEhKU1FOQjRTRitOSVcvd0RzZzJiL0FCMDBXN3pqbzNVZTNuNzZrWndjdGkrQ25UU0JWNjQxaTh0eGVhbjNqcVBkWHZGN1E0bDRYSFBaRURUNnZXUFlUVVRGWG1hMnJYQkVraFQzNVlsdTRDU0I1MUJ1WE96SGpXcU1XbW41SWtNbXljU2NQZk1hZ1RJSFhwL1A4YWZzUGhpOWkreGtzYm9KNzROdFkrRWoyVlhsaTJYc0xlSHIyOHF1TzllU3Y5Z1B2cTJ0eFFMK0R2S0RMQUl4OWdaZnNXdW5reTh4a3VuL0FIL1pwVHBwK0R4dXVpdmdXejY4SzRHMTZRWUVlTXNEN0s4Ylpza2thQU5CUTkweVJNKzNuNFZMMkpiNFM0dE5PemR0bjJHNGsvQ2ErNHkycHltU2RCSjZUTW56SllONytnbUp2U2s1ZnFNZEpzcGJmMUI4c2NMM3JQN05mNFY5M2N0OXZ5WDdhMjc0Yk91REdzb0RPenNiZ0NxU1lZOXlqa0RLK3dVZTNjM2Z2cWdKczNGWjJPakl5d0IzNWdJMTc2NW1YSnZqdVhreFRsYTRCKzBsbTZvN2hUdytsdTJuY29KOTJuNCs2bCsxczVXRFlwblRob0ppZlhJa2xSMTBBV1luMTArdEk5amFiWDdIRUJLTzhqTU9RYVlsUjFnYStFanlwYzlCbXlOSkxvcjBaTWxiSzJ2eE5vMkxOdjFiZDYzeEQrZHhGaFBacVQ0Z0RvWnYydVg5eTFPRnhlSFFqTm54Vm9aaDQzRkFuM211b0tkangrbmNhNkRpcXRIbTd5UGthNVF3MWpTRDJyWkV3ZWFScVZucUJySHNycSs3NnA4alhMUzIyQW5rU0lJSGxNanVJNVVHWjlCTSs1d3RzT05WQU9hZTRuVUgyRTBhVlJhd2VKdjZnMzJHRlVrRWFhUGVPdk1GVnRyUCtZYTE3QnRBUTUraVlCanJ6TFI3Ujd2Q21mYVczQXlXMVVObFZlMU1hc1RMSFRTUFZBbm5sNmRYNGRGS2NWSyt5UmphRW5aSHFTT1JZbWlGczg2WXJlN3Eza3pXUXR0Z1BWZ2hDVHpCSDBHNjh1UjVSMm1HZjZLdktRR1FneE0vUjVUb3cwT2xJbmduR2RDNXhkbnJaK01DeXJFNVc2aWREM3dPWW9wY3dBWUJreXh6SjdSOXBLcjd4OFJRdloyNzF5NnhNaFI3U2ZkeStOTW1HM0pmNk9KZTJkREtBZy9CdGExNE1tYkd0c284QlFja0tyQTRlNnJzRHc1bm1EcnA3dVV3ZGRLYU56c1NueXJIdW9JQkZneVRJWWNNa1I0alVld1Z0eCs2bDRybHVZM092VVhiU3QxNk1DR0hJZGFTemlUcy9qMjJkWHpxQWpvZTR0b3c2SHRmYldqSms5U20wT1MzRHh1bmY0bCs2L2o5dXYzME52NHNYQmR1SFEzTXorT1VkbTJubjZ2dlBqUUhZVzNnbUZ1aFphNWNKVlFvSllBNkU2Y29YcjN4V3pabUd1WGRNeXlPYXlNd2pUMWRZQThlVlhjWGxza2x5RURpbExFODU1cUo5eFBkMDkvZkZTSWR0VG9CeUhJQWUzVSszMzFxR0FObytNVE9wUHZJa0gyUnFOWU5mYzdua1NKOC91MCtGYXVQQkR6ajhTRVZqb1F1cGdpZkRrU1NUb0pOSXVPdm8yWkh6U2UwV1dORFBVSG1LTjdmMnNGUW9wem1kVE1qbklVSDdUNFJyU3RlWUZnMHdTTlQwUGVEM1Z5ZFprM1NVVStGL0l1WExKT0N1NUZmS3d1Mm1YSzZySWJ6am1DSytzeldzc2RvRFFqNnlIdm9PbllPaElKYnlORWt4aXZtdE5vVHlQU1k1L2pXTnhCYUxFOUcyRkNZUGJBWFZHdzRLK1J0M3RQTVZYN2xVQTAxcDg5RnBkZG5iWFZvbGJKMDd2bTd0VnZhc1BjdUtnMVpqQTd2NEFDVDdLYlRwSVpIb2s0SzV4TGtRSXBrYkNka1FOTyt2T0V3Q1dSODJnZCt0eGdUK292SlI4ZnNwbzNRd0YyNjdPK1lvTk16WlNrOVZZWmczTHFBMGR3TUVQbm9KT082VXEraXBLL0lxZkk2SDdSQ1c5YWY4ZHN1MDRJbGJickk3Snlna0dPb2p2MWpyN0tGWUxjU3hkYWNUakFnUDBFeWw1N2l4T1gzQTFsL0NaWXlwOUZMR3hmMlh0RUxsdWNvK3pxUGRSTGFhRm50b3ZLNWRWRlBkbkgzQUQzVTFYTndNRmtpempHQi93QXdLdy84T1dLWDhYczU4UGlNTXJsV1JTY2x4REtrZ05BOENKNUg3cWRHOGVPVUpMaGhxSGdhOTRNVUJ3Y0phMFZWR2c2QUNCOEo5OUNOOE1jTGR1M1pSWllrTzJtb0EwVUFEbVNaOTNqVUxZdU9GMi9ldkU2S1RINksvd0FCV3pCWERjbTgydDE5ZVlpMkNQVm5rQ0JHdk9BZS9WelR5VmlqK29VbHhSR3Q3S3ZYY3Vpb1NwaFdidEFudkNnZ1FPODlhSDdSdG0xMlQ2eTlranhHbEdydTM3VmxzcXc5dzhvTXF2aXhQUDJmQ2xIYU9NTFhEbU1tU1NUMzk5WTlUaXhRYWpEOVJNa2tSK0ZMRUU2OHpWcDdPeGFXTjNVZCt5cXUzeHhEUjc2cWx3U2Mvd0RQdXF3ZHNxWDNXVUFFazNScC93QjZOQkNOMm44RWFYUXU3dTdjZkdZdDBVS3RvV2JoT2FaT2dBNUE2eVJURnQ3QURFNFpyZlVqTW42UTFINGUybG5jWEEvSkdONjQycm9WQ0NOWkloWlBMbE0rRlBlN053RWtaaE1GUXE1Mk1hVCtTVnBqVG5ITWQ4VXVPam5seWJvY1JYbjVCV055U3JwQ2p1Ymg3cVlacmQvRE1nSEpycWFNdVpqRU5xTzA1NmF5TmRLWDlzYkNzWWNRTGJYQXhnTWJoR1VDT2dIYUoxTWt3SjVWZDIxY0lIVXFaRXpvSXpBek9oQTdKblhTT3M4elZmN2MySVQyQVN5ekk4U05OT3JjeUpIMjFyaC95R0ZaSGp5SzY2WnBXUGdWY0ZobVVDNWJBZ3JseXd4VWpxQ0oxbmthKzdMeHoyQzl2MWMyblhrRElXRHIxTUUxQzJwamlqbTBNUmNYSVN1VlcwQkJpT3lKMGpXaE5pOWRMRUc3bkhPSFoyLzV0UjdLMkxWWStOc2FDVmRKREh0UGF6QmtNOG1CMDhQTHBSRCtrK0p4TEtsbkxadElBR3VQbDA3M1l0MlY2d05USHRwVDJoaVJBUE9KekR5NTAwdGd4ZVN4aDBUaXRhRTNBU1JZUjJnazNDTlhJNUJSM21aRWloMWVwZ21xVnI5Z1p0THNkOWtZdTJlemJ4aHVIdVMrRFBzVXhYM2JlMTdTMjNWbUpNRWRxZERHaElPaDlsVmp2QnRPL2J1OEZjUVdSUXNoQXFKUFZRcWFBRGw3NmRWeGNPRE1MbFU2QUhvRDd1aDhDZXNWbmpyV21yU3Avd0IrQmJ6eDRFekE0UEZYdXlpdTZBeHFKdHBKbVRNcXVwSms4cG1temVyQXBadG90dGl4Q3F1cHVFZ0FRQkdSRkFKbnZIbk5IRTIvYlcybHd0azVtUU5VWFBCVW5rWU1yQjV3U1pHaFhkOCtHcUl5Z2pQcXNIMVc3SlpTRE1CbGgxSU1qVVNkQlduU3l6TE0vVTYrZzIxZkFJM1p1ZjEvQ0tldCsyQ1BFT0NEN0NQalhTZGN4YmpLYnUwOEtSTVc3cXN4NkRXQjdTZnZycDJyMUxUeXV2b1czYlBOM2tmSTF6RW9tMEJKUElhRHVIeHJweTc2cDhqWEoyei9BRkJCaUlZaWRlV21uUVFCcDQxZ3pxNlpUR2kwK1VJdXNoQlBMbVpiV1JvZTFIc3FRTHBIYUJJSTZ5dnhuUStSQm55cUxkWWh4MDdGcysrMnArRTE3V1dZTHJKUElUSjhCQUpKNkFBRXpYb29SU2lrdmdaMGg1MlpZdUt1VXhvb1VaczZrSVNTRmRYVUE2am1TT2hBMWJQcXhET1N5dVQwS2tNQ0dCbVZMQWtOQlBRNnpKQUxHcHVIc0d5Vlc0M3p6QWRpMHFpNmdLdXdHSWEwMElJRFFjeWlRWUxWcDJpckVtU0RKMWtnekhPU1FDeDE4STZrdzJYbDVOUnN5VzFhK2lrck13bU1GdmxsOTBtcEwzY1JjOVVsUjV4OW40MEZ4bTA3VmxVdU1yUWVhcUJuQjU4aVJHaEIxUHgwcVRzamVzM3pOcGNpS0pZdEJZbVlFUm92WHZwOHNrYnBkbFdTN203RjI1cmN1SCtmT2t2ZlRZR0dTeTVXL21jR0FBU3d6YzhyWlpDbU5ZUFNtM2FPT1c2SXVIUCthVENId1pTUXArUGthWE5wNUxqQkNnVlZHaXFBQUJNa0FES08vcDBxNVJ5U1ZCSnM5YkIyUGlNQ0E5dUdVZ1NScUQ1L2lQalR0ZzcrSHhJQnVXMHp4RWtETi93dHorTlJOMUxxSmJ5VEtjNFAwVHJtSTFNQTh5c21DVDMxTHgrQlFIUGJJSFUvVlBqL0FCb09IN1pMa3B0UHNDYnliSnhGcFdmQzNDMGFpMWRBZjJJeDdRMCtpU1Fhcm5hbTA4U1lXNnhDc3VnQUN5STFtTlNPbXVtbFd2Y3hoWlN2MFJ6SjUrejhhVDlwN0NzWGJyWFdET1dCQkdhQUk2OUlqeisybHp4VGt2WTZRTmNGZllyRjkyblFkL25XcFZsY3A4NnNKZGlZZXdvWGhxVllrRnJpaHJoSjFGcTJoMVp4MUdnV0lZNWlZaTQzWkdIY2dGQmJqcW1qRFhRRmVVajg0S2VjQ2dXaWs0OE1sY2NDR05RUHpUL0lyUXpkb2tueG92dFRZejJ4eEY3U1R6R2hFOVdYb09taE5DdUUzV1BNVWlVSEIxTGdvdGIwV01Yd08xd0JMZkp4RWFremF2UjVucFhqY3JkWTJrYS9pUXd1TjJWUmxNaE9wam9XT2tIb3ZqWHYwUDRscmVEMnRjWFJrc3F5bU9xMjd4SG5yWHpaVzlneFF5c2NsMlBVSHF0NHJKSjluTWVJcHVuakcxWVVlamR0YThnTVpUQThSVHBzSGFTOEFMYU5xd3Nqc2hzempOeXpNd2pNZVdYS2ZETkJBUy85RVhycDdTdEhRYXhIdC9HS2g0ckUyc09jaU1yM1oxZ3lxZmNXNWFhK1BkVzNVdkdzZnVaSDhoUGZuRVdyUGF2WDVadTBvME54cE1TQWdqTDJmV09uTHZGS3V5dHRZSnpGMUx3MTFZQ1ZqeW1haC82TTQxNTcxNWl4SmtrblUxSnVJaWFBQVZ5UHhiaWxDSFNLZVVjTm00dlpEa0tsNTh4SVVLTGQ3TVNlNFpkYWk3NmJKVVdMbHl4Y0xaQm1JNjZhL0NQaFZkSnRGckdKVzliQ3NWSmhUeU1ncWVYZ1RSSGFtOFdJdlJaVExiQm5NRjhlWUpNbjdLMFJ5S1VQZTJHcE5kak51NXVoZU9DRDNPSXEzUm1hSW5LVHlNalNSNGRhTWJkM0thNWh6ZHdWKzVjeUpyaDN5aGpBMXlaUUpid2FlZWhIS2cyNkhwRnhlSHRKaDcxc1hyV29CYk54RkEraVduVUNSQklKKzVvLzBtQzR1WVppb1BOVDA1ZHg1K1JxOGV6Sjdlbi9BQ1h1M0lwbzNXQkd1dnQvblQ3cU1wWkROemtrYWltdkU3S1RFWExsMjB1Vzg4Zy9WN2VqRlFBTzJ3Sjd6MmpwcURRSEZidjM3YkU4TjlOSlVUeThxeVRoZk1lZnlGelZtdGJJQWlOS2Y4VWhHN3RzTC9lL2JpRFZaMjhjK2JLMnZmcHk4RFZxRzREdStqRG81UHV2dFE0b3ZjMTlDOXJFZkNxV0lZOGhvdmtPWkhtZnNGUGU1YUIyQW00eFhyTEJWR1U5bjF6bjVuc2hRTkNUT2lzbjROY3FnRFRRZWRIZDM5cG14ZEJpVkJMYUFaaWNwQ3FzalFUbDVSeTE4TzlLRlEyeDhHeHhxTklmTHVIQTBIWkdtdWdFUVNGSGtxczBlQzlERkxtOTJNWEMyTGw1b1owQnlpTk0wQXhQU005b0NmcU1PNGc1amRyb0E0VWdFY1FSUFZRRlhTUHE5Tk9kVkw2U051RzVoeUovS1pPekpnWkMwYytSeXg3NjVXSFF3eDNrcm43RnVUb3JyR1dIaGJqaU9KSlVuVE5yQkk4Sm5Yd1BkV2pEWWhrWVFlUm9sdlhqYytJT1hWRUF0b0lJQVJSQ3FBZVFVUVBFZ25yUTYxYUxPSUhJVDkxRTBrcVlyb04yY0lDV3VFZGdBa1IwTWFMNVQ4S2V0N2NVTUxoUmJ0REtYT1VkK3NsbS9TUGYzbWwzQ2JOeVkvNU5QWUxnK1lDNXdEN05LOWVrZG4rVUlDVGs0WUtqcE1tVDU4cTU4dmZsaXZIWXZKTGUwaGZ0WXNyYWRjcWtNdzdSNWlCeUZPbXlXTFdRVHp5RDdLcnVTU1I0MVkyekZpeVBCQlI2aFVoZVJBSGVDOHlvbzZIM2RubVBjOCt5aDJCUy9pNHNoamxVaGl6YTVZelI0azlwb0hnTzdSbzM0VUhaK0ZJaVV1UFB0TEQ3aDhLMjdvNFpWdzZGZWJhaytQOEFEbFhRbG1lUFR4ZmxvYktXMkNEKzVXeWtzWExLb1A4QVdvU1R6WTVocWF1aXF0MkRiK2V0K0RyL0FNd3EwcXg2YVRsdWJCeE83UEYzMVQ1R3VRY1BqaVZBVlJFYXpJUHZuV3V2cjNxbnlOY1pwZk1DQk9nOW51cDg0Mk9IaXcrZmhNT3R0UkprbVU3QitLbXBxWExpTUhSaWpMTU1EREFuU1FSMXFKdStCdzdKYlY0YlRsQUprTDdEbk05N0h1b3hpTEE3djUvbitUWGJ4VFVvTDhnd2hzdmE2akxhVkNoWWlia21aWTVaSjlZdDZwekV6bVp5SW1pR3o5bzIzdmRuTUEwb2l0QnlCV1ZVQkFPWFhOaURvSXlxbzVMU3ZoYmZhQmpscjRHTlFESGxIdG9sZzhLeUhNTk1uWHlOMEgzaGp6N3FESmpoeXdXalR2WHJldSt3RHc3STA5OURkeGNURHNoSkdiVFhsUFAyOGlQYlcvRXVXSlk2bGlTZk04NkE3UHU1TDdMTUVHUjlvcnp1UExVM05mTmlFK2JINVlMRVNmR1NZQStFKzBWRlREaG5aZ09oanc3dWZlVDd4Vy9CNGdPdWFOU01wam9lcEhkSWcxdXRDSjAxSTE5dXNhZVorRmVoaE5TVzVlVFFuWkd3bDRobEduZU5CbTloaWZmTkROcDd5Zko4d0JaMlp0TGM2SXMrc3dubkhUbWROUU5hTjRXMjBpUUlpVHBJUDV3bmw1MVhCdEF1N3pPWm1hZk1rNlZqMTBra21CTjBQWjJpeHRoeUFzNmdCdENPalQwQkVIWGwxcjYxbG5aSHltUnFBdnJhY3lveXNTd2c2QVpoMEIxaUpzRW8rRnN1WlpSY0NHT2k4WmdXUDVvVU9TVHBDK2NsOW0zMFFsV1dSbFF3TldQWnRFa0VHZUloZTJCbDFNcjFBakxxTW1lVVk3T3VMK3c0dFZ5UXNmYVpiT2NFTUlFT0hkV0lFeDJ4WXRnaGRRRVFxb25VRW1rdDdyWmlOQkhSZVh3bW5IZWF3MW1YVHRwZnlzbUlRcUJkQkVnRWc2dkFBMURBZ2dxRmdnSTZ2bVA4ajREVDNWMk5LN2hZSWEyZStrRWVCQk1xZElnNmZDbHJiT3hUYnV0dzI3SjdTZzlBZW5qR285bEg4RWgvbitBb2Z2WGRpNHVWdTBFR1pENWtqNEdrNitQc3Z5WExvYlBSWUdHejlzNXVtSC82VjZxczRocTFQUmZmemJPMnpwQkdILzZWNnF2dytITFZ5L0hKSWtsTm80aTdGdmpYV0hJS2JqbGZjVEZNV3o5aVhGRWtqeXI1czNDVzdTcXcxYWp3eHNwSFdzZWJLMzBLbExtZ0RqN3hSaFEyL2lXdXRDMFh4R0NMNkhXdHVCMmNsb0Z0REhNekNqelA0VmNXcSt3MGdQYTJVeUhOR1pvN0k2RHhQbFV1eGtzMjhvQUx1ZTAvVS9nSnFhMjA3ZDBzdHNhQUNXNmV3ZDFDc1ZlV1NlNmlsYjRaVW40UEl4VEJRb1BPU1QzQ25uY3ZDRzdoM0pJQlVrNjZFcmw3SWtIbk1uUUhrUjFrSVdEdnNXRERLb0JnZGtFK1publRqdTlqRGh5VjRoYmlxVUdibEpNZ0NJNTZySFdRS09FWXVTaStMNC95RkYwUDJ6OEVRV2lNeWdaMU9tWVRvNTZFVEtzRHlZSFZRU2FTZHRZbDdXSUtxQW9IY0dXSjFqS3hnQWN0SkduTTBhdjc1NUR4QmFsZzJ1dWhVa0ZsTWptYzF3OTBoYVRNWGlsdVhXWk13VXNTcWtuc2pubDluTHlycTZIU1BCYThCTnRzbDdVc3E5dDc2b3JYRlVzUkJHWUFTUVFJSk1EbjRSM1EzYkp2OFRkdTI1Q2lXZlJSQTB2dVB1cFcyVVJtR25XUDRVYjJnZmsrNjhMOUc0eWp5T0tZZmZTdFppVVpYSHRvQ1hUb0M3RnZpNm9ZRWFqcjA4UE9wOXhJRTh0UGg3UE1lNmwzMGQyaTlyRUVIOG1WYm5wQkVFRHg2KyttL0M0ZmlDQ2VjYThnQnJKbm9QdUZPanE4Ymc1dC93RG52Ky93YUl6dU5zamJRVjNYaXNSa1p5Rm5teHpFc3dXT1FrU1o3dWMxVlc5ZTErSmZoVEtXNVVlSitrYWVQU1B2QndWVkxZN1RMbFFFUmxUcTBkR1l6L0swcWJhMkNMV3pyRjBpSEprLzhYU3MrWFVTMnFNdUcvSHg5ZjcreFdTYVZJQXVnT3RNbTdPQ1VoVytrOTFFanVHWUUvQ2FXTUMwakwzVXk3bzJpMkpSWmhWRHY3UXBFL0VWbHk4UkV5NkdIZG04YjJQZTU0TTNzTUtCN2lQZFJmZm5aSXZXZUlQWHRBc1BFYzJId24yVkE5SFdIK2J1WGVyTmtIa29CMDh5M3dGR2Q4c1Jsd2Q4ekVwbC9XSVg3NjVjcGY4QVlTajRwQ0pQM2NGZTd2Yk1EV2IySlk2V3hvTzlpTkthc1BpRVN6Mm1BN0k1bWgrek1BNTJVUmJVczkyNW9CM0E4L0t2dXd0ejd1Yk5pTXNSMlZ6RWtld2FmR3RHU2NaYm5KOU1OeDNFYmJ1MGt1WVZrWFdIVXpCNWRZUG5GVFBSL2pzMXMyb0pLdFBnQWUraitOM2Z3eVd6OG9jTGJIYUlKalFmbXIycStiRDJ6c3l3U2JWdUVqVzZ3Q0lUMEJtV1B0NzZrOVM4dU5SakZ1dWhqZzNIa2FOa3JGeTE0M0UvNWhWbDFXdGpGaDc5bGhsQ2w3ZnF4bDFZUkVjNWthMVpWTTBMdUxCdythUEYzMVQ1R3VNOHpCQXZKWW5UcWZHdXpibkkrVmN5N1EyZGF1c0Q0YWdhQStOYWNrOXRXTWNxQm03ZU9hVmdma3hPWTZ6cm9JTlBPRHhLM2dBQ0ZidVBmK2IzaitOTDl2RHFnZ0FLSzEzcnNjdFB0b2NPcmVPWEM0QjlTbndPS1dyVm0yV3VzcUE2ZHJycHlBK2taNkNhWGJtOC9GZmcybEsyK3JONjdFVEhMUlJxZE5TZkRsUzY3RWtsaVNlODZuNDE1MmFJdVQzR201OVhMSW1sd2k1U3NhVFM5dExzWWxHNVpoQi9uM1VmQjBvSnZJblpWL3F0L1AzVno4ZmRDbDJNdTcrSWw4bjFob1BIL3dCcHJ6dk50UjdNSmJqaU1KMTFDTHBxUjlhUnA3NkJZWnpHWWFSeVA0VkZ1cHpaajRray9FMXV4YXB3eDdGMk1VNlZFdDlxMzdpbFh1c1ZQTWFETjU1UU5LRWJSdXZJVUtRcDYxUDJiY0RobUhJR0IrTlRjV2dBRVVwdVQ5MG5aVjArUXZnTVdMR0N0S0RybDFHa2FscmhFZFNUa1ZoMVY2RjNkdnRsR2dsU1k4UXhFbUo3MHNtUHphOVl5M21STlBveVBPUURQc0JGRGx3djgvejdUN0s5Qmd4eDJKanFzOGphYjhKck1uaHNTMlNaVUVrRWtCcDU4OUR6RTlUT3JDUk9wanhxWmF3TTFQdyt6bEdzVDU4cUxKa2ppaTVNcHJieXpMVnhMYXk3QUFEMm55SE1tZ0xiUHVZbTRiakRJQ3hQakhRTDN3SUUweGtnYUlCUGZHZy9HdmgwNW5YdnJqYWpWeXpjTGhDNVpHeHQ5SCtEQ1lIYWF3SU5pUEg4bmQ1bnJTSW1EV05CVC91UGNuQmJUanBZL3dDbmRwSHRQcE5Zc25Tb3EzU0E5bStFY3F4OHEyWW5FR1F6TmtUb1BwTjVDb1dQdUp4Slh0dDA3aCtOYUgwT2E0WmJvT2c4NkpRdmthb2VXRmNUdE5pcTY1VTZLT1o4Kyt2bU94UmUxTGd4SFpVY3ZNOTVvRmN2eTBrNWo4QlJUR1hQbVEyZVQzVkhHbXFMa2VOaXlpT1cwbnZyemF0NTIxOVg3YTAyd0NCckpPcHI1aU1WbEVMenEycmZBUG5nbTRaMU53cUkvbnBYdmJ5SElHQklJT2tIa2U4VUZ3akdjM2RYdkVZcG41blNyMlZLd3R0RDVzUEhMakxjNmNkUjg2dWducHhGSGNldmNaN3hQeS9zNG9jd0VkVDk1SHVxdjdMc2pCMEpWbE1obE1FSHdJcHkyYnYxY2dMaUxLWFkrbXA0YmVaQVVxVDVBVjFNV3NwVklzTDRhN2xocGdkWThOYVk5dllKcis3WXQyaG1MWEpHb0V4aUNUcWRPK3E2Mnh2RWpJVXRJVUI1NWlDWTdoQUVjcWZNSnRPNWEzWXMzYlpodU5Hb0JFSEZzQ05mQ3MycXliNVhEd24vQUpLZnlLTzVodVdiZDZ5UXltNWVSZFFlUTVuWHBFKzZuRGFRSVczWnRpR3ZzWlAxYlN3Ym42MHFua3pkMWFkMjhlK0tUTmR0VzFJZGdycUNDUUpCT3BNZDJuY2FNRzhwdVpkTXdHbmVGUDJTUjhLNE04MGxrYnJybHJ3MnVoTGx0ZG9wamZPNDdzOTE5V09JWmZBQlFBQVBDSW8xdnR0TlgyZGh3UHB3ZmNLaDczNEozWEtpRm1PS3U2S0o3dTZnb3dWMjZ0ckRuVmxKQVZTQ2Rla2pUVHZuU3VrbXBxTW0rblpGelRCR0FQYkh0K3cwNTdtcTRkMlcwNzVrS0t3SFpCTWFrbUJHbE1XNys1dGl3b2E0b3VYT1pMYXF2Z3M2ZTJwMk4zbXcxbnM1OHpENk5zVDdKR2c5OUp5NmpmY1lLeTVPK0NYdTNnbXNXUmJZQ1pKTWN0ZjVGUzhjYmVXYnhUSU5lM0dYVDlLdnV5OFFMdGxMc1JuRWdFekd0SVBwTnhHYS9hdGo2Q1NmTmorQStOWThVSGx5dGRmSXRWdUhadHIybGpMMmdVTHlORkMveDZVdDQzYlZ4MGJQaVZzVHlXMUV4NHNlMVBsRk51N0d4TEYzRFdHWkZkbWFHbG9HVzIwS2tFd1FTcmtpTlJTaHRUZHF4WXV1ckxKTnBzUUFHQkNwbU1LUU5RUUlFeEZPaGlndnpHT0V0dTRVc2RnNzExVkNLeFF1VHhHTUJ6eURTeDFINDBOMnpzZTdobUMzQ014RWpLWkJHWXJwL3dBU3NJOEtzNi9kUzVoTU1sc0FDRjBqdVlhZkExRzJuZ2IxdkUyc1N3UVdVRDVoTWtCZ1NaQkE1dEhLZFRXckhxRnRkOFBtbDhrM3hTTkd6TjRnMTNaMkd0cVVqRVlZT09tbHhOQjNpdWo2NVAySmpEZDJwaFhQMHNYWTkzRldLNndwK0tDaEdrWEJVanpjNUh5cWdsM1p4b0EvcXQ3OVExZjlaVnp4cWZaY28yYy9QdXpqZjhMZi9VTmEzM1V4c2YyVy9QNkJyb1dzb1BRWHlENmFPYlgzU3gvK0V2OEE3TnE5cnVqamdCL1ZML2VmbXpYUjlLdUwzenQyTVRpN2VJeTI3T0dTd3h1OW95YnpGUUNBTkFER3ZqVitpaTloV1NidDR5UDdOZS9VYXRXSzNTeFZ3Wld3MTZQMEdxeThKdjdaTnpFbTR3V3hhNEhESXQzK014dlNBcld6Ym1TdzBDZ21OVEZTOTRkNitCWXNZcEV6WWQ3eUplWnc5dHJTTzJYaUZYQUl5dEFJSUhPaC9EcjVKNmFLb2ZkZkZ4L1piMERrQWhxRmYzUnh0d1FjTGZBN3VHMzRWYmwvZmUybU12MkhFV3JJdHBuVmJqM0xsNXdYNFZ0TGFrdmx0aVdpWWtURlN4dnpnUzFwQmVrM2xEMjR0M0RLNXloSmhleGxZRU1HakxCbUlxMWdTOGxxQ1JUV0QzUXhpQUlNTGVBblhzTjk0cmRmM2F4dWNLTUpmSXl6bTRaaVo1VmFXTDM3dE1NTTJHT1piMkt0V0MxMjNpRURMZHpRMW9tM0RrNVRCOVhUVWpTcGx2ZnJBRmJsd1hqdzdRSmE1dzd2RE1NRVBEZkpsdW5PUXNJU1NUcE5GNlY5c2ppbVZYaDkyOGFCSHlhOFFlaFJxM0hkekUvNFcvOEFxSDdZcXc4WnZ2YlpzTU1ORGNURnJocnEzRXVKY3Q1a1o5VWNLeW1BSWtRUVRVdkM3OVlDNW15WHBDcGN1QThPNkZkYlU4UnJMRll2WllQcUUwL0hreVkxVVpGcE5kTXJMK2ptS0grelh2MUQ5dGVIM2R4aC93Qm12ZnFOVng3QzI1WXhkdmk0ZGk5dVl6RkhVSFFIczV3TXdnalVhVEk2VVJvTWlsa2R6ZGxPTjlsR0x1MWl3UDdOZS9VYXRHSzNXeHBIWXc5d0g4NjI1SHdJSStOWDFXVXYwa1ZzUlZHNE94Y1pid3UwcmQrd1VhNVpBdGlEMnprdWdoWk91cFh1NTBqN1MzUjJqRUxoYnplQVhUMjk5ZEgxbFg2UzRDU281aGZjM2FTRHM0Tyt6SG1jbWc5NXFEL1FmYWgxT0N4SDZ2OEFHdXJLQTc4YmZiQTRLNWlsUU9VS0FLU1FEbXVLbk1kMmFmWlJiVUZaemt1NHUwLzhEaVAxZjQxNE80KzFZajVGaUkvUi9qVis3d2IrV2JYRXQyR1ZyOXE2bHQxZEx3UmMxeEZJTEloRWtPSTc5ZWNHamVBM2p3OTY4OWkwek05c3NyRVc3bkRESVFHVVhDdVFzcElCQWFkYXZhU3puaTN1VHRFTC9ZNzh4OVdvajdqYlRQOEFzVi85WCtOWHBzN2ZSNzJQdTRWVXc2TFp1bTB5M2I1WEVzRldUZXQydUdRMXZ1N1V3SjByYnRIMGlZTkxGKzliWjdwdFdtdUt2RHVxTG9CeXpiWXBEVzg4QTNGa0NaT2xDb0pGTGdvcTV1UHRJS0ZHQ3ZudjdQOEFHdFg5QnRwLzRLLytyL0d1Z24zOHdTSmJhNDl4Qzl2aUZUWnY1a1RObHozUnc1dHBta0JuZ0htTkttMjk2c0sxNTdLdXpOYkJMbGJWMXJZaE01SEVWY21iS1FZbWRlK3IybHQyYzQvMEkybi9BSUxFZnEveHJGM0syblA5aHhINm8vR3VrOWlidzRmRkZ4WlppMXZMblY3ZHkyNmhoS2tyZFZXeXNKZ3hCaWl0VGFpV2NyM054dHBuL1lyL0FPci9BQnEwTUh1eGlYM2RzWU5yVHBlNDBzaEhhVmZsVE9USDZPdnRGV3hXVk52RkZQa3FqSDdPeFZpeEdId3R4MzlWVkM4aDNrKzc0MFAzWjNjMmhhNGozcmJ0Y3VFRTZFeEhUdTkxWFBXVmxXaWdvdFgyQThhWlFHM3RrN1J1RTI3T0R2cGJKT1o4aEJlVHFkTlF2eFB3cUpoOWo0L0RLVncyemNRN2tRMTI0c1QraW9NNWZDUjQxYlkzN3MyM3hJeFVXa3M0a1laR0FkeTdHM3hCb2lreVFHQUE3aDFOZk1KdjFhelhqZU1JTHFXN0twYnZ0ZWZOWkYyR3Q4UE1HQ2trd05PUmc4MnJUd1Nyd1dvcEZFN1QzYzI3aVB5dUd4SkgxUXNMK3FPZnRwdTNQOUhOek5hZkUyTG83SkxLUkFCamtTRDMxYXUyTjVlRGV3UFlCdytMZmhjUTVsWkhaTTFvWldFOXNnaURCSHdvU2Q5N3JYeXFXN1FzZkwwd1N1N1hNMXc1V04wcUZRZ0ZXRUtTWU1IVVVVOEtsSGFuWDVGMExXMk1GaXNPbkR3MkR2WENQVmhld281Nm5yNUNxNTJsdWx0YTlkYTYrQ3ZsakgwQkduSURYbFY5NGYwaGJQZTJMaVhYWlNRcTViRjhsaVF4aEFFbHlBckZzczVZMWlhaVcvU0ZoMnZNUTYvSkJoRGl1Smt2aTVBdkcyVGxOc0FwcDUrRWEwR0hUUXhkZC9JS2drN0ViWSs3K05PenJGczRhOGwrM2lDejVoQU50cmdabEk1c3BoQ011c3BYcTV1bmlDcEp3OXczSEMyMmJLY3hRc0NaUE9JRXg0VTlZN2Yyd1RaWER1ck0yTHM0YTR0MUx5TW92QmlwVlNreXdXVkpoVHJyUkhEYjU0TzV4Q2x4MlcyR0xPdG04VUlWZ3JjTmdtVzdERUNFSnFTMDZma09YS29ycS91M2llSUF1R3VCRlVBUXVuT2gyL214Tm9YQUxWbkMzbkhOaXE2ZUFxNXRpN2FzNHBHZXl4SVJ5amhrZEhWaEVxeVhBR1V3UWRSMW9oUXgwa0ZKU3ZvV3NTT1pOMTl5ZG9wamNLNzRPK3FyaUxMTXhYUlZXNHBKT3ZJQUd1bTZ5c3JVTU1yS3lzcUVNckt5c3FFTXBNM2czRk9KdVl1NXg4bnlnWWNSdzV5Y0M1bit1TTJibDBqeHB6cktoQlEybnVXYnQzRzNSZHRmMXI1UDJMdGppSXZCQkdvNGk1aTB5Q0NwV05LbllYZGNmNk9PQXZYWHZnMjJ0dGRmVmpta3lKSkl5eU1vSk1CVjFNVXcxbFFoWHErakZmazFtMjE5YnVJdDMzdnRldTJRNlhXdWFNTHRvdnFNZ1FldG9VQkhkUlhZdTVueWZFVzc0dVcreGhYdzJTM1lXMmt2ZDRodUJWYUZFNlpZUGVUVGJXVkNGZTRYMGJPcHRFNHBZdDRxeGlSYnQyU2xrY0lPQ3FXK0tSYmE1bmxtWFRRZG10OXJjQzRNSWNGOHNQQVNEaDRzcnhMYkxkRnhHZGl4RjNLUmxpRmtFOVlJZTZ5b1FSMTNBWnJ3eE43RUI3N1ltM2lMckxheW95MnJUV2t0S3ZFSlRzc2UxSjhxajRmMGJNRnQyM3haZTNoN04remhSd2dHVGpvVUxYU0hpNlZVd0lDY3FzQ3NxRUlHd05uZkpzTll3K2JQd2JTV3MwUm15S0Z6UkppWW1KTlQ2eXNxRU1yS3lzcUVNckt5c3FFTW9IdnJ1LzhBTDhIY3dvdWNMT1VPZkxtakpjVi9WekNaeXh6NjBjcktoQlB4bTVCZTNpazQ4ZktNV21LbmgrcGtOczVJejlxZUg2Mm5QbHBVblplNnJXc2RjeGZHWEsrZjVxM2E0WVlzd0lhOFE1VzY2Z1FHeXFkZFNhWjZ5b1FUOXBibFBpY1ZidllpK2x5M2F1bTdiVVlkVXZEUWdXamVWcGEwSjVaUVRBazZUUXpaL293VzNZdldPTFp5dllld2x4Y0tpM3dHT2pYYmdhYnBBQUVBTFBYWGxZZFpVSUl1TjNGdjNBNStXS3JYOE9NTmlTTVBwY1FGc3B0ZzNmbW55TVZKSllIbkFyN2MzQWZqTmN0WXMyRjRUV2s0TnNwY00yaGJRM25GeUwyU015a3FHQmp0Q0tlYXlvUVZOemQwR3dWMjlkZStMclhrdEkwSXk2MjgzYWxyanNTd1lUSk9vSjZ3R3VzcktoREt5c3JLaERLeXNyS2hCS3hXNFplOGJ2SEFuYUZySFJ3NS9Kb1U0VTUrc3ptNmR4cnp0amNOcjN5a3JmdGpqM3hlN2RndWJjV2hiR1FpNnJLNEl6QjFJUFNJcDNyS2hCZjJ2dXp4OEFNRzE1ODZvZ1RFTjJyZ3VXNEszanFKYk1vSjExazY2MUJ0YmtCY1BnTEMzZjdKZlhFTTVTVGVZQjg4OXJzbG1kbW1USExXbTZzcUVLdDJ2dVppTU5zL0FZVEQ1Ny95ZTljZDcxcFF0d0JoZElDcng3YlFUY0NuTGRYUWRScFcvQ2JnMzhSWnpYMnRZYTQrQU9DTm0zYmxiWUY4dWovbFRKeVpRVms2eWMxV1hXVkNDTnRIMGZHN2l2bFB5aVA2eGc3K1hoei9BR1ZIWEpPZjZlZVpqU09ScjdoZHlNUmF3ajRLMWoyU3hCRm5MYWk0Z053UEQzRnVBdUl6SjJjaGh6NFU4VmxRZ3U3bmJzbkJDK0RjRnczcnZGTUlVQ25JcWtBRm1NU3BJa3pCZ2s4eXhWbFpVSVpXVmxaVUlmL1opDQoNCiMgPHNwYW4gc3R5bGU9ImNvbG9yOiBibHVlOyI+IFRlb3LDrWEgPC9zcGFuPg0KRWwgcGFxdWV0ZSAqKkNBUkVUIChjbGFzaWZpY2F0aW9uIGFuZCBSZWdyZXNzaW9uIFRyYWluaW5nKSoqIGVzIHVuIHBhcXVldGUgaW50ZWdyYWwgY29uIHVuYSBhbXBscGlhIHZhcmllZGFkIGRlIGFsZ29yaXRtb3MgcGFyYSBlbCBhcHJlbmRpemFqZSBhdXRvbcOhdGljby4NCg0KIyA8c3BhbiBzdHlsZT0iY29sb3I6IGJsdWU7Ij4gSW5zdGFsYXIgcGFxdWV0ZXMgeSBsbGFtYXIgbGlicmVyw61hcyA8L3NwYW4+DQpgYGB7cn0NCiNpbnN0YWxsLnBhY2thZ2VzKCJnZ3Bsb3QyIikgI0dyYWZpY29zDQpsaWJyYXJ5KGdncGxvdDIpDQojaW5zdGFsbC5wYWNrYWdlcygibGF0dGljZSIpICNHcmFmaWNvcw0KbGlicmFyeShsYXR0aWNlKQ0KI2luc3RhbGwucGFja2FnZXMoImNhcmV0IikgI0FsZ29yaXRtb3MgZGUgYXByZW5kaXphamUgYXV0b23DoXRpY28NCmxpYnJhcnkoY2FyZXQpDQojaW5zdGFsbC5wYWNrYWdlcygiZGF0YXNldHMiKSAjVXNhciBiYXNlcyBkZSBkYXRvcywgZW4gY2FzbyBJcmlzDQpsaWJyYXJ5KGRhdGFzZXRzKQ0KI2luc3RhbGwucGFja2FnZXMoIkRhdGFFeHBsb3JlciIpICNBbsOhbGlzaXMgZXhwbG9yYXRvcmlvDQpsaWJyYXJ5KERhdGFFeHBsb3JlcikNCmBgYA0KIyA8c3BhbiBzdHlsZT0iY29sb3I6IGJsdWU7Ij4gIENyZWFyIGxhIGJhc2UgZGUgZGF0b3MgPC9zcGFuPg0KYGBge3J9DQpkZiA8LSBkYXRhLmZyYW1lKGlyaXMpDQpgYGANCg0KIyA8c3BhbiBzdHlsZT0iY29sb3I6IGJsdWU7Ij4gIENyZWFyIGxhIGJhc2UgZGUgZGF0b3MgPC9zcGFuPg0KYGBge3J9DQpzdW1tYXJ5KGRmKQ0Kc3RyKGRmKQ0KI2NyZWF0ZV9yZXBvcnQoZGYpDQpwbG90X21pc3NpbmcoZGYpICNncmFmaWNhciBjdWFudG9zIE5BwrRzIGhheSBwb3IgdmFyaWFibGUNCnBsb3RfaGlzdG9ncmFtKGRmKQ0KcGxvdF9jb3JyZWxhdGlvbihkZikNCmBgYA0KDQoqKk5PVEE6IExhIHZhcmlhYmxlIHF1ZSBxdWVyZW1vcyBwcmVkZWNpciBkZWJlIHRlbmVyIGZvcm1hdG8gZGUgRkFDVE9SKioNCg0KIyA8c3BhbiBzdHlsZT0iY29sb3I6IGJsdWU7Ij4gIFBhcnRpciBsYSBiYXNlIGRlIGRhdG9zIDwvc3Bhbj4NCmBgYHtyfQ0KI05vcm1hbG1lbnRlIDgwLTIwDQpzZXQuc2VlZCgxMjMpDQpyZW5nbG9uZXNfZW50cmVuYW1pZW50byA8LSBjcmVhdGVEYXRhUGFydGl0aW9uKGRmJFNwZWNpZXMsIHA9MC44LCBsaXN0PUZBTFNFKQ0KZW50cmVuYW1pZW50byA8LWRmW3Jlbmdsb25lc19lbnRyZW5hbWllbnRvLCBdDQpwcnVlYmEgPC1kZlstcmVuZ2xvbmVzX2VudHJlbmFtaWVudG8sIF0gI1tyZWdsb25lcyxjb2x1bW5hXQ0KYGBgDQoNCiMgPHNwYW4gc3R5bGU9ImNvbG9yOiBibHVlOyI+ICBEaXN0aW50b3MgdGlwb3MgZGUgTcOpdG9kb3MgcGFyYSBtb2RlbGFyIDwvc3Bhbj4NCkxvcyBtw6l0b2RvcyBtw6FzIHV0aWxpemFkb3MgcGFyYSBtb2RlbGFyIGFwcmVuZGl6YWplIGF1dG9tw6F0aWNvIHNvbjoNCg0KKiAqKlNWTSoqOiAqU3VwcG9ydCBWZWN0b3IgTWFjaGluZSogbyBNw6FxdWluYSBkZSBWZWN0b3JlcyBkZSBTb3BvcnRlLiBIYXkgdmFyaW9zIHN1YnRpcG9zOiBMaW5lYWwgKHN2bUxpbmVhciksIFJhZGlhbCAoc3ZtUmFkaWFsKSwgUG9saW7Ds21pY28gKHN2bVBvbHkpLCBldGMuDQoqICoqw4FyYm9sIGRlIERlc2ljaW9uZXMqKjogcnBhcnQNCiogKipSZWRlcyBOZXVyb25hbGVzKio6IG5tZXQNCiogKipSYW5kb20gRm9yZXN0KiogbyBCb3NxdWVzIEFsZWF0b3Jpb3M6IHJmDQoNCiMgPHNwYW4gc3R5bGU9ImNvbG9yOiBibHVlOyI+ICBNb2RlbCAxLiBTVk0gTGluZWFsIDwvc3Bhbj4NCmBgYHtyfQ0KbW9kZWxvMSA8LSB0cmFpbihTcGVjaWVzIH4gLiwgZGF0YT1lbnRyZW5hbWllbnRvLA0KICAgICAgICAgICAgICAgICBtZXRob2QgPSAic3ZtTGluZWFyIiwgI0NhbWJpYXINCiAgICAgICAgICAgICAgICAgcHJlUHJvY2VzcyA9IGMoInNjYWxlIiwiY2VudGVyIiksDQogICAgICAgICAgICAgICAgIHRyQ29udHJvbCA9IHRyYWluQ29udHJvbChtZXRob2QgPSAiY3YiLCBudW1iZXI9MTApLA0KICAgICAgICAgICAgICAgICB0dW5lR3JpZGUgPSBkYXRhLmZyYW1lKEM9MSkgI0NhbWJpYXIgaGlwZXJwYXJhbWV0cm9zLCBzZSBwdWVkZW4ganVzdGFyDQopDQoNCnJlc3VsdGFkb19lbnRyZW5hbWllbnRvMSA8LSBwcmVkaWN0KG1vZGVsbzEsIGVudHJlbmFtaWVudG8pDQpyZXN1bHRhZG9fcHJ1ZWJhMSA8LSBwcmVkaWN0KG1vZGVsbzEsIHBydWViYSkNCg0KI01hdHJpeiBkZSBDb25mdXNpw7NuDQojRXMgdW5hIHRhYmxhIGRlIGV2YWx1YWNpw7NuIHF1ZSBkZXNnbG9zYSBlbCByZW5kaW1pZW50byBkZWwgbW9kZWxvIGRlIGNsYXNpZmljYWNpw7NuLg0KDQojTWF0cml6IGRlIGNvbmZ1c2nDs24gZGVsIHJlc3VsdGFkbyBkZWwgZW50cmVuYW1pZW50bw0KbWNyZTEgPC0gY29uZnVzaW9uTWF0cml4KHJlc3VsdGFkb19lbnRyZW5hbWllbnRvMSwgZW50cmVuYW1pZW50byRTcGVjaWVzKQ0KbWNyZTENCg0KI01hdHJpeiBkZSBDb25mdXNpw7NuIGRlbCBSZXN1bHRhZG8gZGUgcHJ1ZWJhDQptY3JwMSA8LSBjb25mdXNpb25NYXRyaXgocmVzdWx0YWRvX3BydWViYTEsIHBydWViYSRTcGVjaWVzKQ0KbWNycDENCg0KI0NvbiBsYXMgbWF0cmljZXMsIGNvbXBhcm8gbGEgcHJlc2ljacOzbiBkZWwgZW50cmVuYW1pZW50byB5IGRlIHBydWViYSAuOTkgeSAuOTYgcmVzcGVjdGl2YW1lbnRlLCBlc3TDoSBiaWVuIGVsIG1vZGVsbw0KYGBgDQojIDxzcGFuIHN0eWxlPSJjb2xvcjogYmx1ZTsiPiAgTW9kZWwgMi4gU1ZNIFJhZGlhbCA8L3NwYW4+DQoNCmBgYHtyfQ0KbW9kZWxvMiA8LSB0cmFpbihTcGVjaWVzIH4gLiwgZGF0YT1lbnRyZW5hbWllbnRvLA0KICAgICAgICAgICAgICAgICBtZXRob2QgPSAic3ZtUmFkaWFsIiwgI0NhbWJpYXINCiAgICAgICAgICAgICAgICAgcHJlUHJvY2VzcyA9IGMoInNjYWxlIiwiY2VudGVyIiksDQogICAgICAgICAgICAgICAgIHRyQ29udHJvbCA9IHRyYWluQ29udHJvbChtZXRob2QgPSAiY3YiLCBudW1iZXI9MTApLA0KICAgICAgICAgICAgICAgICB0dW5lR3JpZGUgPSBkYXRhLmZyYW1lKHNpZ21hPTEsQz0xKSAjQ2FtYmlhciBoaXBlcnBhcmFtZXRyb3MsIHNlIHB1ZWRlbiBqdXN0YXINCikNCg0KcmVzdWx0YWRvX2VudHJlbmFtaWVudG8yIDwtIHByZWRpY3QobW9kZWxvMiwgZW50cmVuYW1pZW50bykNCnJlc3VsdGFkb19wcnVlYmEyIDwtIHByZWRpY3QobW9kZWxvMiwgcHJ1ZWJhKQ0KDQojTWF0cml6IGRlIENvbmZ1c2nDs24NCiNFcyB1bmEgdGFibGEgZGUgZXZhbHVhY2nDs24gcXVlIGRlc2dsb3NhIGVsIHJlbmRpbWllbnRvIGRlbCBtb2RlbG8gZGUgY2xhc2lmaWNhY2nDs24uDQoNCiNNYXRyaXogZGUgY29uZnVzacOzbiBkZWwgcmVzdWx0YWRvIGRlbCBlbnRyZW5hbWllbnRvDQptY3JlMiA8LSBjb25mdXNpb25NYXRyaXgocmVzdWx0YWRvX2VudHJlbmFtaWVudG8yLCBlbnRyZW5hbWllbnRvJFNwZWNpZXMpDQptY3JlMg0KDQojTWF0cml6IGRlIENvbmZ1c2nDs24gZGVsIFJlc3VsdGFkbyBkZSBwcnVlYmENCm1jcnAyIDwtIGNvbmZ1c2lvbk1hdHJpeChyZXN1bHRhZG9fcHJ1ZWJhMiwgcHJ1ZWJhJFNwZWNpZXMpDQptY3JwMg0KDQpgYGANCiMgPHNwYW4gc3R5bGU9ImNvbG9yOiBibHVlOyI+ICBNb2RlbCAzLiBTVk0gUG9saW7Ds21pY28gPC9zcGFuPg0KDQpgYGB7cn0NCm1vZGVsbzMgPC0gdHJhaW4oU3BlY2llcyB+IC4sIGRhdGE9ZW50cmVuYW1pZW50bywNCiAgICAgICAgICAgICAgICAgbWV0aG9kID0gInN2bVBvbHkiLCAjQ2FtYmlhcg0KICAgICAgICAgICAgICAgICBwcmVQcm9jZXNzID0gYygic2NhbGUiLCJjZW50ZXIiKSwNCiAgICAgICAgICAgICAgICAgdHJDb250cm9sID0gdHJhaW5Db250cm9sKG1ldGhvZCA9ICJjdiIsIG51bWJlcj0xMCksDQogICAgICAgICAgICAgICAgIHR1bmVHcmlkZSA9IGRhdGEuZnJhbWUoZGVncmVlPTEsc2NhbGU9MSwgQz0xKSAjQ2FtYmlhciBoaXBlcnBhcmFtZXRyb3MsIHNlIHB1ZWRlbiBqdXN0YXINCikNCg0KcmVzdWx0YWRvX2VudHJlbmFtaWVudG8zIDwtIHByZWRpY3QobW9kZWxvMywgZW50cmVuYW1pZW50bykNCnJlc3VsdGFkb19wcnVlYmEzIDwtIHByZWRpY3QobW9kZWxvMywgcHJ1ZWJhKQ0KDQojTWF0cml6IGRlIENvbmZ1c2nDs24NCiNFcyB1bmEgdGFibGEgZGUgZXZhbHVhY2nDs24gcXVlIGRlc2dsb3NhIGVsIHJlbmRpbWllbnRvIGRlbCBtb2RlbG8gZGUgY2xhc2lmaWNhY2nDs24uDQoNCiNNYXRyaXogZGUgY29uZnVzacOzbiBkZWwgcmVzdWx0YWRvIGRlbCBlbnRyZW5hbWllbnRvDQptY3JlMyA8LSBjb25mdXNpb25NYXRyaXgocmVzdWx0YWRvX2VudHJlbmFtaWVudG8zLCBlbnRyZW5hbWllbnRvJFNwZWNpZXMpDQptY3JlMw0KDQojTWF0cml6IGRlIENvbmZ1c2nDs24gZGVsIFJlc3VsdGFkbyBkZSBwcnVlYmENCm1jcnAzIDwtIGNvbmZ1c2lvbk1hdHJpeChyZXN1bHRhZG9fcHJ1ZWJhMywgcHJ1ZWJhJFNwZWNpZXMpDQptY3JwMw0KDQpgYGANCg0KIyA8c3BhbiBzdHlsZT0iY29sb3I6IGJsdWU7Ij4gIE1vZGVsIDQuIMOBcmJvbCBkZSBkZWNpc2nDs24gPC9zcGFuPg0KDQpgYGB7cn0NCm1vZGVsbzQgPC0gdHJhaW4oU3BlY2llcyB+IC4sIGRhdGE9ZW50cmVuYW1pZW50bywNCiAgICAgICAgICAgICAgICAgbWV0aG9kID0gInJwYXJ0IiwgI0NhbWJpYXINCiAgICAgICAgICAgICAgICAgcHJlUHJvY2VzcyA9IGMoInNjYWxlIiwiY2VudGVyIiksDQogICAgICAgICAgICAgICAgIHRyQ29udHJvbCA9IHRyYWluQ29udHJvbChtZXRob2QgPSAiY3YiLCBudW1iZXI9MTApLA0KICAgICAgICAgICAgICAgICB0dW5lTGVuZ3RoID0xMCAjQ2FtYmlhciBoaXBlcnBhcmFtZXRyb3MsIHNlIHB1ZWRlbiBqdXN0YXINCikNCg0KcmVzdWx0YWRvX2VudHJlbmFtaWVudG80IDwtIHByZWRpY3QobW9kZWxvNCwgZW50cmVuYW1pZW50bykNCnJlc3VsdGFkb19wcnVlYmE0IDwtIHByZWRpY3QobW9kZWxvNCwgcHJ1ZWJhKQ0KDQojTWF0cml6IGRlIENvbmZ1c2nDs24NCiNFcyB1bmEgdGFibGEgZGUgZXZhbHVhY2nDs24gcXVlIGRlc2dsb3NhIGVsIHJlbmRpbWllbnRvIGRlbCBtb2RlbG8gZGUgY2xhc2lmaWNhY2nDs24uDQoNCiNNYXRyaXogZGUgY29uZnVzacOzbiBkZWwgcmVzdWx0YWRvIGRlbCBlbnRyZW5hbWllbnRvDQptY3JlNCA8LSBjb25mdXNpb25NYXRyaXgocmVzdWx0YWRvX2VudHJlbmFtaWVudG80LCBlbnRyZW5hbWllbnRvJFNwZWNpZXMpDQptY3JlNA0KDQojTWF0cml6IGRlIENvbmZ1c2nDs24gZGVsIFJlc3VsdGFkbyBkZSBwcnVlYmENCm1jcnA0IDwtIGNvbmZ1c2lvbk1hdHJpeChyZXN1bHRhZG9fcHJ1ZWJhNCwgcHJ1ZWJhJFNwZWNpZXMpDQptY3JwNA0KDQpgYGANCg0KIyA8c3BhbiBzdHlsZT0iY29sb3I6IGJsdWU7Ij4gIE1vZGVsIDUuIFJlZGVzIE5ldXJvbmFsZXMgPC9zcGFuPg0KDQpgYGB7cn0NCm1vZGVsbzUgPC0gdHJhaW4oU3BlY2llcyB+IC4sIGRhdGE9ZW50cmVuYW1pZW50bywNCiAgICAgICAgICAgICAgICAgbWV0aG9kID0gIm5uZXQiLCAjQ2FtYmlhcg0KICAgICAgICAgICAgICAgICBwcmVQcm9jZXNzID0gYygic2NhbGUiLCJjZW50ZXIiKSwNCiAgICAgICAgICAgICAgICAgdHJDb250cm9sID0gdHJhaW5Db250cm9sKG1ldGhvZCA9ICJjdiIsIG51bWJlcj0xMCkNCg0KKQ0KDQpyZXN1bHRhZG9fZW50cmVuYW1pZW50bzUgPC0gcHJlZGljdChtb2RlbG81LCBlbnRyZW5hbWllbnRvKQ0KcmVzdWx0YWRvX3BydWViYTUgPC0gcHJlZGljdChtb2RlbG81LCBwcnVlYmEpDQoNCiNNYXRyaXogZGUgQ29uZnVzacOzbg0KI0VzIHVuYSB0YWJsYSBkZSBldmFsdWFjacOzbiBxdWUgZGVzZ2xvc2EgZWwgcmVuZGltaWVudG8gZGVsIG1vZGVsbyBkZSBjbGFzaWZpY2FjacOzbi4NCg0KI01hdHJpeiBkZSBjb25mdXNpw7NuIGRlbCByZXN1bHRhZG8gZGVsIGVudHJlbmFtaWVudG8NCm1jcmU1IDwtIGNvbmZ1c2lvbk1hdHJpeChyZXN1bHRhZG9fZW50cmVuYW1pZW50bzUsIGVudHJlbmFtaWVudG8kU3BlY2llcykNCm1jcmU1DQoNCiNNYXRyaXogZGUgQ29uZnVzacOzbiBkZWwgUmVzdWx0YWRvIGRlIHBydWViYQ0KbWNycDUgPC0gY29uZnVzaW9uTWF0cml4KHJlc3VsdGFkb19wcnVlYmE1LCBwcnVlYmEkU3BlY2llcykNCm1jcnA1DQoNCmBgYA0KDQoNCiMgPHNwYW4gc3R5bGU9ImNvbG9yOiBibHVlOyI+ICBNb2RlbCA2LiBCb3NxdWVzIEFsZWF0b3Jpb3MgPC9zcGFuPg0KDQpgYGB7cn0NCm1vZGVsbzYgPC0gdHJhaW4oU3BlY2llcyB+IC4sIGRhdGE9ZW50cmVuYW1pZW50bywNCiAgICAgICAgICAgICAgICAgbWV0aG9kID0gInJmIiwgI0NhbWJpYXINCiAgICAgICAgICAgICAgICAgcHJlUHJvY2VzcyA9IGMoInNjYWxlIiwiY2VudGVyIiksDQogICAgICAgICAgICAgICAgIHRyQ29udHJvbCA9IHRyYWluQ29udHJvbChtZXRob2QgPSAiY3YiLCBudW1iZXI9MTApLA0KICAgICAgICAgICAgICAgICB0dW5lR3JpZCA9IGV4cGFuZC5ncmlkKG10cnkgPSBjKDIsNCw2KSkgI0NhbWJpYXINCiAgICAgICAgICAgICAgICAgDQopDQoNCnJlc3VsdGFkb19lbnRyZW5hbWllbnRvNiA8LSBwcmVkaWN0KG1vZGVsbzYsIGVudHJlbmFtaWVudG8pDQpyZXN1bHRhZG9fcHJ1ZWJhNiA8LSBwcmVkaWN0KG1vZGVsbzYsIHBydWViYSkNCg0KI01hdHJpeiBkZSBDb25mdXNpw7NuDQojRXMgdW5hIHRhYmxhIGRlIGV2YWx1YWNpw7NuIHF1ZSBkZXNnbG9zYSBlbCByZW5kaW1pZW50byBkZWwgbW9kZWxvIGRlIGNsYXNpZmljYWNpw7NuLg0KDQojTWF0cml6IGRlIGNvbmZ1c2nDs24gZGVsIHJlc3VsdGFkbyBkZWwgZW50cmVuYW1pZW50bw0KbWNyZTYgPC0gY29uZnVzaW9uTWF0cml4KHJlc3VsdGFkb19lbnRyZW5hbWllbnRvNiwgZW50cmVuYW1pZW50byRTcGVjaWVzKQ0KbWNyZTYNCg0KI01hdHJpeiBkZSBDb25mdXNpw7NuIGRlbCBSZXN1bHRhZG8gZGUgcHJ1ZWJhDQptY3JwNiA8LSBjb25mdXNpb25NYXRyaXgocmVzdWx0YWRvX3BydWViYTYsIHBydWViYSRTcGVjaWVzKQ0KbWNycDYNCg0KYGBgDQojIDxzcGFuIHN0eWxlPSJjb2xvcjogYmx1ZTsiPiAgTW9kZWwgNi4gQm9zcXVlcyBBbGVhdG9yaW9zIDwvc3Bhbj4NCmBgYHtyfQ0KcmVzdWx0YWRvcyA8LWRhdGEuZnJhbWUoDQogICJzdm1MaW5lYXIiID0gYyhtY3JlMSRvdmVyYWxsWyJBY2N1cmFjeSJdLCBtY3JwMSRvdmVyYWxsWyJBY2N1cmFjeSJdKSwNCiAgInN2bVJhZGlhbCIgPSBjKG1jcmUyJG92ZXJhbGxbIkFjY3VyYWN5Il0sIG1jcnAyJG92ZXJhbGxbIkFjY3VyYWN5Il0pLA0KICAic3ZtUG9seSIgPSBjKG1jcmUzJG92ZXJhbGxbIkFjY3VyYWN5Il0sIG1jcnAzJG92ZXJhbGxbIkFjY3VyYWN5Il0pLA0KICAicnBhcnQiID0gYyhtY3JlNCRvdmVyYWxsWyJBY2N1cmFjeSJdLCBtY3JwNCRvdmVyYWxsWyJBY2N1cmFjeSJdKSwNCiAgIm5uZXQiID0gYyhtY3JlNSRvdmVyYWxsWyJBY2N1cmFjeSJdLCBtY3JwNSRvdmVyYWxsWyJBY2N1cmFjeSJdKSwNCiAgInJmIiA9IGMobWNyZTYkb3ZlcmFsbFsiQWNjdXJhY3kiXSwgbWNycDYkb3ZlcmFsbFsiQWNjdXJhY3kiXSkNCikNCg0Kcm93bmFtZXMocmVzdWx0YWRvcykgPC0gYygiUHJlY2lzacOzbiBkZSBlbnRyZW5hbWllbnRvIiwgIlByZWNpc2nDs24gZGUgcHJ1ZWJhIikNCnJlc3VsdGFkb3MNCmBgYA0KDQojIDxzcGFuIHN0eWxlPSJjb2xvcjogYmx1ZTsiPiAgQ29uY2x1c2lvbmVzIDwvc3Bhbj4NCkFjb3JkZSBhIGxhIHRhYmxhIGRlIHJlc3VsdGFkb3MsIG9ic2VydmFtb3MgcXVlIG5pbmfDum4gbcOpdG9kbyBwcmVzZW50YSBzb2JyZWFqdXN0ZS4gUG9kZW1vcyBzZWxlY2Npb25hciBlbCBkZSAqKnJlZGVzIG5ldXJvbmFsZXMgICoqIHBvciBzdSBkZXNlbXBlw7FvLg0K