Librerías

# install.packages("rpart")
# install.packages("rpart.plot")
library(rpart)
library(rpart.plot)

Importar la base de datos

cancer <- read.csv("cancer_de_mama.csv")
colnames(cancer)[colnames(cancer) == "X...diagnosis"] <- "diagnosis"
cancer$diagnosis <- as.factor(cancer$diagnosis)

Entender la base de datos

El dataset contiene mediciones de núcleos celulares obtenidas mediante imágenes digitalizadas de biopsias de mama. Cada fila es un paciente y la variable objetivo indica si el tumor es Maligno (M) o Benigno (B).

str(cancer)
## 'data.frame':    569 obs. of  31 variables:
##  $ diagnosis              : Factor w/ 2 levels "B","M": 2 2 2 2 2 2 2 2 2 2 ...
##  $ radius_mean            : num  18 20.6 19.7 11.4 20.3 ...
##  $ texture_mean           : num  10.4 17.8 21.2 20.4 14.3 ...
##  $ perimeter_mean         : num  122.8 132.9 130 77.6 135.1 ...
##  $ area_mean              : num  1001 1326 1203 386 1297 ...
##  $ smoothness_mean        : num  0.1184 0.0847 0.1096 0.1425 0.1003 ...
##  $ compactness_mean       : num  0.2776 0.0786 0.1599 0.2839 0.1328 ...
##  $ concavity_mean         : num  0.3001 0.0869 0.1974 0.2414 0.198 ...
##  $ concave.points_mean    : num  0.1471 0.0702 0.1279 0.1052 0.1043 ...
##  $ symmetry_mean          : num  0.242 0.181 0.207 0.26 0.181 ...
##  $ fractal_dimension_mean : num  0.0787 0.0567 0.06 0.0974 0.0588 ...
##  $ radius_se              : num  1.095 0.543 0.746 0.496 0.757 ...
##  $ texture_se             : num  0.905 0.734 0.787 1.156 0.781 ...
##  $ perimeter_se           : num  8.59 3.4 4.58 3.44 5.44 ...
##  $ area_se                : num  153.4 74.1 94 27.2 94.4 ...
##  $ smoothness_se          : num  0.0064 0.00522 0.00615 0.00911 0.01149 ...
##  $ compactness_se         : num  0.049 0.0131 0.0401 0.0746 0.0246 ...
##  $ concavity_se           : num  0.0537 0.0186 0.0383 0.0566 0.0569 ...
##  $ concave.points_se      : num  0.0159 0.0134 0.0206 0.0187 0.0188 ...
##  $ symmetry_se            : num  0.03 0.0139 0.0225 0.0596 0.0176 ...
##  $ fractal_dimension_se   : num  0.00619 0.00353 0.00457 0.00921 0.00511 ...
##  $ radius_worst           : num  25.4 25 23.6 14.9 22.5 ...
##  $ texture_worst          : num  17.3 23.4 25.5 26.5 16.7 ...
##  $ perimeter_worst        : num  184.6 158.8 152.5 98.9 152.2 ...
##  $ area_worst             : num  2019 1956 1709 568 1575 ...
##  $ smoothness_worst       : num  0.162 0.124 0.144 0.21 0.137 ...
##  $ compactness_worst      : num  0.666 0.187 0.424 0.866 0.205 ...
##  $ concavity_worst        : num  0.712 0.242 0.45 0.687 0.4 ...
##  $ concave.points_worst   : num  0.265 0.186 0.243 0.258 0.163 ...
##  $ symmetry_worst         : num  0.46 0.275 0.361 0.664 0.236 ...
##  $ fractal_dimension_worst: num  0.1189 0.089 0.0876 0.173 0.0768 ...
summary(cancer)
##  diagnosis  radius_mean      texture_mean   perimeter_mean     area_mean     
##  B:357     Min.   : 6.981   Min.   : 9.71   Min.   : 43.79   Min.   : 143.5  
##  M:212     1st Qu.:11.700   1st Qu.:16.17   1st Qu.: 75.17   1st Qu.: 420.3  
##            Median :13.370   Median :18.84   Median : 86.24   Median : 551.1  
##            Mean   :14.127   Mean   :19.29   Mean   : 91.97   Mean   : 654.9  
##            3rd Qu.:15.780   3rd Qu.:21.80   3rd Qu.:104.10   3rd Qu.: 782.7  
##            Max.   :28.110   Max.   :39.28   Max.   :188.50   Max.   :2501.0  
##  smoothness_mean   compactness_mean  concavity_mean    concave.points_mean
##  Min.   :0.05263   Min.   :0.01938   Min.   :0.00000   Min.   :0.00000    
##  1st Qu.:0.08637   1st Qu.:0.06492   1st Qu.:0.02956   1st Qu.:0.02031    
##  Median :0.09587   Median :0.09263   Median :0.06154   Median :0.03350    
##  Mean   :0.09636   Mean   :0.10434   Mean   :0.08880   Mean   :0.04892    
##  3rd Qu.:0.10530   3rd Qu.:0.13040   3rd Qu.:0.13070   3rd Qu.:0.07400    
##  Max.   :0.16340   Max.   :0.34540   Max.   :0.42680   Max.   :0.20120    
##  symmetry_mean    fractal_dimension_mean   radius_se        texture_se    
##  Min.   :0.1060   Min.   :0.04996        Min.   :0.1115   Min.   :0.3602  
##  1st Qu.:0.1619   1st Qu.:0.05770        1st Qu.:0.2324   1st Qu.:0.8339  
##  Median :0.1792   Median :0.06154        Median :0.3242   Median :1.1080  
##  Mean   :0.1812   Mean   :0.06280        Mean   :0.4052   Mean   :1.2169  
##  3rd Qu.:0.1957   3rd Qu.:0.06612        3rd Qu.:0.4789   3rd Qu.:1.4740  
##  Max.   :0.3040   Max.   :0.09744        Max.   :2.8730   Max.   :4.8850  
##   perimeter_se       area_se        smoothness_se      compactness_se    
##  Min.   : 0.757   Min.   :  6.802   Min.   :0.001713   Min.   :0.002252  
##  1st Qu.: 1.606   1st Qu.: 17.850   1st Qu.:0.005169   1st Qu.:0.013080  
##  Median : 2.287   Median : 24.530   Median :0.006380   Median :0.020450  
##  Mean   : 2.866   Mean   : 40.337   Mean   :0.007041   Mean   :0.025478  
##  3rd Qu.: 3.357   3rd Qu.: 45.190   3rd Qu.:0.008146   3rd Qu.:0.032450  
##  Max.   :21.980   Max.   :542.200   Max.   :0.031130   Max.   :0.135400  
##   concavity_se     concave.points_se   symmetry_se       fractal_dimension_se
##  Min.   :0.00000   Min.   :0.000000   Min.   :0.007882   Min.   :0.0008948   
##  1st Qu.:0.01509   1st Qu.:0.007638   1st Qu.:0.015160   1st Qu.:0.0022480   
##  Median :0.02589   Median :0.010930   Median :0.018730   Median :0.0031870   
##  Mean   :0.03189   Mean   :0.011796   Mean   :0.020542   Mean   :0.0037949   
##  3rd Qu.:0.04205   3rd Qu.:0.014710   3rd Qu.:0.023480   3rd Qu.:0.0045580   
##  Max.   :0.39600   Max.   :0.052790   Max.   :0.078950   Max.   :0.0298400   
##   radius_worst   texture_worst   perimeter_worst    area_worst    
##  Min.   : 7.93   Min.   :12.02   Min.   : 50.41   Min.   : 185.2  
##  1st Qu.:13.01   1st Qu.:21.08   1st Qu.: 84.11   1st Qu.: 515.3  
##  Median :14.97   Median :25.41   Median : 97.66   Median : 686.5  
##  Mean   :16.27   Mean   :25.68   Mean   :107.26   Mean   : 880.6  
##  3rd Qu.:18.79   3rd Qu.:29.72   3rd Qu.:125.40   3rd Qu.:1084.0  
##  Max.   :36.04   Max.   :49.54   Max.   :251.20   Max.   :4254.0  
##  smoothness_worst  compactness_worst concavity_worst  concave.points_worst
##  Min.   :0.07117   Min.   :0.02729   Min.   :0.0000   Min.   :0.00000     
##  1st Qu.:0.11660   1st Qu.:0.14720   1st Qu.:0.1145   1st Qu.:0.06493     
##  Median :0.13130   Median :0.21190   Median :0.2267   Median :0.09993     
##  Mean   :0.13237   Mean   :0.25427   Mean   :0.2722   Mean   :0.11461     
##  3rd Qu.:0.14600   3rd Qu.:0.33910   3rd Qu.:0.3829   3rd Qu.:0.16140     
##  Max.   :0.22260   Max.   :1.05800   Max.   :1.2520   Max.   :0.29100     
##  symmetry_worst   fractal_dimension_worst
##  Min.   :0.1565   Min.   :0.05504        
##  1st Qu.:0.2504   1st Qu.:0.07146        
##  Median :0.2822   Median :0.08004        
##  Mean   :0.2901   Mean   :0.08395        
##  3rd Qu.:0.3179   3rd Qu.:0.09208        
##  Max.   :0.6638   Max.   :0.20750
head(cancer)
##   diagnosis radius_mean texture_mean perimeter_mean area_mean smoothness_mean
## 1         M       17.99        10.38         122.80    1001.0         0.11840
## 2         M       20.57        17.77         132.90    1326.0         0.08474
## 3         M       19.69        21.25         130.00    1203.0         0.10960
## 4         M       11.42        20.38          77.58     386.1         0.14250
## 5         M       20.29        14.34         135.10    1297.0         0.10030
## 6         M       12.45        15.70          82.57     477.1         0.12780
##   compactness_mean concavity_mean concave.points_mean symmetry_mean
## 1          0.27760         0.3001             0.14710        0.2419
## 2          0.07864         0.0869             0.07017        0.1812
## 3          0.15990         0.1974             0.12790        0.2069
## 4          0.28390         0.2414             0.10520        0.2597
## 5          0.13280         0.1980             0.10430        0.1809
## 6          0.17000         0.1578             0.08089        0.2087
##   fractal_dimension_mean radius_se texture_se perimeter_se area_se
## 1                0.07871    1.0950     0.9053        8.589  153.40
## 2                0.05667    0.5435     0.7339        3.398   74.08
## 3                0.05999    0.7456     0.7869        4.585   94.03
## 4                0.09744    0.4956     1.1560        3.445   27.23
## 5                0.05883    0.7572     0.7813        5.438   94.44
## 6                0.07613    0.3345     0.8902        2.217   27.19
##   smoothness_se compactness_se concavity_se concave.points_se symmetry_se
## 1      0.006399        0.04904      0.05373           0.01587     0.03003
## 2      0.005225        0.01308      0.01860           0.01340     0.01389
## 3      0.006150        0.04006      0.03832           0.02058     0.02250
## 4      0.009110        0.07458      0.05661           0.01867     0.05963
## 5      0.011490        0.02461      0.05688           0.01885     0.01756
## 6      0.007510        0.03345      0.03672           0.01137     0.02165
##   fractal_dimension_se radius_worst texture_worst perimeter_worst area_worst
## 1             0.006193        25.38         17.33          184.60     2019.0
## 2             0.003532        24.99         23.41          158.80     1956.0
## 3             0.004571        23.57         25.53          152.50     1709.0
## 4             0.009208        14.91         26.50           98.87      567.7
## 5             0.005115        22.54         16.67          152.20     1575.0
## 6             0.005082        15.47         23.75          103.40      741.6
##   smoothness_worst compactness_worst concavity_worst concave.points_worst
## 1           0.1622            0.6656          0.7119               0.2654
## 2           0.1238            0.1866          0.2416               0.1860
## 3           0.1444            0.4245          0.4504               0.2430
## 4           0.2098            0.8663          0.6869               0.2575
## 5           0.1374            0.2050          0.4000               0.1625
## 6           0.1791            0.5249          0.5355               0.1741
##   symmetry_worst fractal_dimension_worst
## 1         0.4601                 0.11890
## 2         0.2750                 0.08902
## 3         0.3613                 0.08758
## 4         0.6638                 0.17300
## 5         0.2364                 0.07678
## 6         0.3985                 0.12440

Distribución del diagnóstico

tabla <- table(cancer$diagnosis)
porcentaje <- round(prop.table(tabla) * 100, 2)

barplot(tabla,
        col  = c("steelblue", "tomato"),
        main = "Distribución del Diagnóstico",
        xlab = "Diagnóstico (B = Benigno, M = Maligno)",
        ylab = "Número de pacientes")

cat("Benigno: ", tabla["B"], "(", porcentaje["B"], "%)\n")
## Benigno:  357 ( 62.74 %)
cat("Maligno: ", tabla["M"], "(", porcentaje["M"], "%)\n")
## Maligno:  212 ( 37.26 %)

Preparación de datos

Variables

El dataset tiene 30 variables numéricas agrupadas en 3 grupos por cada una de las 10 características celulares:

Grupo Descripción
_mean Valor promedio de la característica
_se Error estándar (variabilidad)
_worst Peor valor (más extremo) observado

Las 10 características medidas son: radio, textura, perímetro, área, suavidad, compacidad, concavidad, puntos cóncavos, simetría y dimensión fractal.

# Verificar — sin valores NA
cat("Total de NAs en el dataset:", sum(is.na(cancer)), "\n")
## Total de NAs en el dataset: 0
str(cancer$diagnosis)
##  Factor w/ 2 levels "B","M": 2 2 2 2 2 2 2 2 2 2 ...

Crear árbol de decisión

arbol <- rpart(diagnosis ~ ., data = cancer, method = "class")

rpart.plot(arbol,
           extra     = 104,
           fallen.leaves = TRUE,
           main      = "Árbol de Decisión - Cáncer de Mama",
           cex       = 0.75)


Importancia de variables

importancia <- sort(arbol$variable.importance, decreasing = TRUE)
top10       <- head(importancia, 10)

par(mar = c(10, 4, 4, 2))  # margen inferior ampliado para etiquetas verticales
barplot(top10,
        main      = "Top 10 Variables más Importantes",
        col       = "steelblue",
        las       = 2,
        ylab      = "Importancia",
        cex.names = 0.8)

par(mar = c(5, 4, 4, 2))   # restaurar márgenes por defecto

Conclusiones

  • El árbol clasifica tumores como Malignos (M) o Benignos (B) usando mediciones celulares del núcleo.
  • Las variables del grupo _worst (peores valores observados) tienden a ser las más importantes, especialmente perimeter_worst y concave.points_mean — indicando que la forma más extrema del núcleo es el mejor predictor.
  • Tumores malignos tienden a tener núcleos más grandes e irregulares que los benignos.
LS0tCnRpdGxlOiAiQ8OhbmNlciBkZSBNYW1hIC0gw4FyYm9sIGRlIERlY2lzacOzbiIKYXV0aG9yOiAiIgpkYXRlOiAiIgpvdXRwdXQ6CiAgaHRtbF9kb2N1bWVudDoKICAgIHRvYzogVFJVRQogICAgdG9jX2Zsb2F0OiBUUlVFCiAgICBjb2RlX2Rvd25sb2FkOiBUUlVFCiAgICB0aGVtZTogY29zbW8KLS0tCgojIDxzcGFuIHN0eWxlPSJjb2xvcjpibHVlIj4gTGlicmVyw61hcyA8L3NwYW4+CmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CiMgaW5zdGFsbC5wYWNrYWdlcygicnBhcnQiKQojIGluc3RhbGwucGFja2FnZXMoInJwYXJ0LnBsb3QiKQpsaWJyYXJ5KHJwYXJ0KQpsaWJyYXJ5KHJwYXJ0LnBsb3QpCmBgYAoKLS0tCgojIDxzcGFuIHN0eWxlPSJjb2xvcjpibHVlIj4gSW1wb3J0YXIgbGEgYmFzZSBkZSBkYXRvcyA8L3NwYW4+CmBgYHtyfQpjYW5jZXIgPC0gcmVhZC5jc3YoImNhbmNlcl9kZV9tYW1hLmNzdiIpCmNvbG5hbWVzKGNhbmNlcilbY29sbmFtZXMoY2FuY2VyKSA9PSAiWC4uLmRpYWdub3NpcyJdIDwtICJkaWFnbm9zaXMiCmNhbmNlciRkaWFnbm9zaXMgPC0gYXMuZmFjdG9yKGNhbmNlciRkaWFnbm9zaXMpCmBgYAoKLS0tCgojIDxzcGFuIHN0eWxlPSJjb2xvcjpibHVlIj4gRW50ZW5kZXIgbGEgYmFzZSBkZSBkYXRvcyA8L3NwYW4+CgpFbCBkYXRhc2V0IGNvbnRpZW5lIG1lZGljaW9uZXMgZGUgbsO6Y2xlb3MgY2VsdWxhcmVzIG9idGVuaWRhcyBtZWRpYW50ZSBpbcOhZ2VuZXMgZGlnaXRhbGl6YWRhcyBkZSBiaW9wc2lhcyBkZSBtYW1hLgpDYWRhIGZpbGEgZXMgdW4gcGFjaWVudGUgeSBsYSB2YXJpYWJsZSBvYmpldGl2byBpbmRpY2Egc2kgZWwgdHVtb3IgZXMgKipNYWxpZ25vIChNKSoqIG8gKipCZW5pZ25vIChCKSoqLgoKYGBge3J9CnN0cihjYW5jZXIpCnN1bW1hcnkoY2FuY2VyKQpoZWFkKGNhbmNlcikKYGBgCgojIyBEaXN0cmlidWNpw7NuIGRlbCBkaWFnbsOzc3RpY28KCmBgYHtyfQp0YWJsYSA8LSB0YWJsZShjYW5jZXIkZGlhZ25vc2lzKQpwb3JjZW50YWplIDwtIHJvdW5kKHByb3AudGFibGUodGFibGEpICogMTAwLCAyKQoKYmFycGxvdCh0YWJsYSwKICAgICAgICBjb2wgID0gYygic3RlZWxibHVlIiwgInRvbWF0byIpLAogICAgICAgIG1haW4gPSAiRGlzdHJpYnVjacOzbiBkZWwgRGlhZ27Ds3N0aWNvIiwKICAgICAgICB4bGFiID0gIkRpYWduw7NzdGljbyAoQiA9IEJlbmlnbm8sIE0gPSBNYWxpZ25vKSIsCiAgICAgICAgeWxhYiA9ICJOw7ptZXJvIGRlIHBhY2llbnRlcyIpCgpjYXQoIkJlbmlnbm86ICIsIHRhYmxhWyJCIl0sICIoIiwgcG9yY2VudGFqZVsiQiJdLCAiJSlcbiIpCmNhdCgiTWFsaWdubzogIiwgdGFibGFbIk0iXSwgIigiLCBwb3JjZW50YWplWyJNIl0sICIlKVxuIikKYGBgCgotLS0KCiMgPHNwYW4gc3R5bGU9ImNvbG9yOmJsdWUiPiBQcmVwYXJhY2nDs24gZGUgZGF0b3MgPC9zcGFuPgoKIyMgVmFyaWFibGVzCgpFbCBkYXRhc2V0IHRpZW5lICoqMzAgdmFyaWFibGVzIG51bcOpcmljYXMqKiBhZ3J1cGFkYXMgZW4gMyBncnVwb3MgcG9yIGNhZGEgdW5hIGRlIGxhcyAxMCBjYXJhY3RlcsOtc3RpY2FzIGNlbHVsYXJlczoKCnwgR3J1cG8gfCBEZXNjcmlwY2nDs24gfAp8LS0tfC0tLXwKfCBgX21lYW5gIHwgVmFsb3IgcHJvbWVkaW8gZGUgbGEgY2FyYWN0ZXLDrXN0aWNhIHwKfCBgX3NlYCB8IEVycm9yIGVzdMOhbmRhciAodmFyaWFiaWxpZGFkKSB8CnwgYF93b3JzdGAgfCBQZW9yIHZhbG9yIChtw6FzIGV4dHJlbW8pIG9ic2VydmFkbyB8CgpMYXMgMTAgY2FyYWN0ZXLDrXN0aWNhcyBtZWRpZGFzIHNvbjogcmFkaW8sIHRleHR1cmEsIHBlcsOtbWV0cm8sIMOhcmVhLCBzdWF2aWRhZCwgY29tcGFjaWRhZCwgY29uY2F2aWRhZCwgcHVudG9zIGPDs25jYXZvcywgc2ltZXRyw61hIHkgZGltZW5zacOzbiBmcmFjdGFsLgoKYGBge3J9CiMgVmVyaWZpY2FyIOKAlCBzaW4gdmFsb3JlcyBOQQpjYXQoIlRvdGFsIGRlIE5BcyBlbiBlbCBkYXRhc2V0OiIsIHN1bShpcy5uYShjYW5jZXIpKSwgIlxuIikKc3RyKGNhbmNlciRkaWFnbm9zaXMpCmBgYAoKLS0tCgojIDxzcGFuIHN0eWxlPSJjb2xvcjpibHVlIj4gQ3JlYXIgw6FyYm9sIGRlIGRlY2lzacOzbiA8L3NwYW4+CgpgYGB7ciBmaWcud2lkdGg9MTIsIGZpZy5oZWlnaHQ9N30KYXJib2wgPC0gcnBhcnQoZGlhZ25vc2lzIH4gLiwgZGF0YSA9IGNhbmNlciwgbWV0aG9kID0gImNsYXNzIikKCnJwYXJ0LnBsb3QoYXJib2wsCiAgICAgICAgICAgZXh0cmEgICAgID0gMTA0LAogICAgICAgICAgIGZhbGxlbi5sZWF2ZXMgPSBUUlVFLAogICAgICAgICAgIG1haW4gICAgICA9ICLDgXJib2wgZGUgRGVjaXNpw7NuIC0gQ8OhbmNlciBkZSBNYW1hIiwKICAgICAgICAgICBjZXggICAgICAgPSAwLjc1KQpgYGAKCi0tLQoKIyA8c3BhbiBzdHlsZT0iY29sb3I6Ymx1ZSI+IEltcG9ydGFuY2lhIGRlIHZhcmlhYmxlcyA8L3NwYW4+CgpgYGB7ciBmaWcud2lkdGg9MTAsIGZpZy5oZWlnaHQ9Nn0KaW1wb3J0YW5jaWEgPC0gc29ydChhcmJvbCR2YXJpYWJsZS5pbXBvcnRhbmNlLCBkZWNyZWFzaW5nID0gVFJVRSkKdG9wMTAgICAgICAgPC0gaGVhZChpbXBvcnRhbmNpYSwgMTApCgpwYXIobWFyID0gYygxMCwgNCwgNCwgMikpICAjIG1hcmdlbiBpbmZlcmlvciBhbXBsaWFkbyBwYXJhIGV0aXF1ZXRhcyB2ZXJ0aWNhbGVzCmJhcnBsb3QodG9wMTAsCiAgICAgICAgbWFpbiAgICAgID0gIlRvcCAxMCBWYXJpYWJsZXMgbcOhcyBJbXBvcnRhbnRlcyIsCiAgICAgICAgY29sICAgICAgID0gInN0ZWVsYmx1ZSIsCiAgICAgICAgbGFzICAgICAgID0gMiwKICAgICAgICB5bGFiICAgICAgPSAiSW1wb3J0YW5jaWEiLAogICAgICAgIGNleC5uYW1lcyA9IDAuOCkKcGFyKG1hciA9IGMoNSwgNCwgNCwgMikpICAgIyByZXN0YXVyYXIgbcOhcmdlbmVzIHBvciBkZWZlY3RvCmBgYAoKLS0tCgojIDxzcGFuIHN0eWxlPSJjb2xvcjpibHVlIj4gQ29uY2x1c2lvbmVzIDwvc3Bhbj4KCiogRWwgw6FyYm9sIGNsYXNpZmljYSB0dW1vcmVzIGNvbW8gKipNYWxpZ25vcyAoTSkqKiBvICoqQmVuaWdub3MgKEIpKiogdXNhbmRvIG1lZGljaW9uZXMgY2VsdWxhcmVzIGRlbCBuw7pjbGVvLgoqIExhcyB2YXJpYWJsZXMgZGVsIGdydXBvICoqYF93b3JzdGAqKiAocGVvcmVzIHZhbG9yZXMgb2JzZXJ2YWRvcykgdGllbmRlbiBhIHNlciBsYXMgbcOhcyBpbXBvcnRhbnRlcywgZXNwZWNpYWxtZW50ZSBgcGVyaW1ldGVyX3dvcnN0YCB5IGBjb25jYXZlLnBvaW50c19tZWFuYCDigJQgaW5kaWNhbmRvIHF1ZSBsYSBmb3JtYSBtw6FzIGV4dHJlbWEgZGVsIG7DumNsZW8gZXMgZWwgbWVqb3IgcHJlZGljdG9yLgoqIFR1bW9yZXMgbWFsaWdub3MgdGllbmRlbiBhIHRlbmVyIG7DumNsZW9zIG3DoXMgZ3JhbmRlcyBlIGlycmVndWxhcmVzIHF1ZSBsb3MgYmVuaWdub3MuCg==