Generar modelo predictivo

Paso 1. Importar base de datos

bd <- read.csv("/Users/georginamartinez/Documents/Tec/Séptimo Semestre/Analítica para negocios, de los datos a decisiones/rentadebicis.csv")

Paso 2. Entender la base de datos

resumen <- summary(bd)
resumen
##       hora            dia              mes              año      
##  Min.   : 0.00   Min.   : 1.000   Min.   : 1.000   Min.   :2011  
##  1st Qu.: 6.00   1st Qu.: 5.000   1st Qu.: 4.000   1st Qu.:2011  
##  Median :12.00   Median :10.000   Median : 7.000   Median :2012  
##  Mean   :11.54   Mean   : 9.993   Mean   : 6.521   Mean   :2012  
##  3rd Qu.:18.00   3rd Qu.:15.000   3rd Qu.:10.000   3rd Qu.:2012  
##  Max.   :23.00   Max.   :19.000   Max.   :12.000   Max.   :2012  
##     estacion     dia_de_la_semana     asueto         temperatura   
##  Min.   :1.000   Min.   :1.000    Min.   :0.00000   Min.   : 0.82  
##  1st Qu.:2.000   1st Qu.:2.000    1st Qu.:0.00000   1st Qu.:13.94  
##  Median :3.000   Median :4.000    Median :0.00000   Median :20.50  
##  Mean   :2.507   Mean   :4.014    Mean   :0.02857   Mean   :20.23  
##  3rd Qu.:4.000   3rd Qu.:6.000    3rd Qu.:0.00000   3rd Qu.:26.24  
##  Max.   :4.000   Max.   :7.000    Max.   :1.00000   Max.   :41.00  
##  sensacion_termica    humedad       velocidad_del_viento
##  Min.   : 0.76     Min.   :  0.00   Min.   : 0.000      
##  1st Qu.:16.66     1st Qu.: 47.00   1st Qu.: 7.002      
##  Median :24.24     Median : 62.00   Median :12.998      
##  Mean   :23.66     Mean   : 61.89   Mean   :12.799      
##  3rd Qu.:31.06     3rd Qu.: 77.00   3rd Qu.:16.998      
##  Max.   :45.45     Max.   :100.00   Max.   :56.997      
##  rentas_de_no_registrados rentas_de_registrados rentas_totales 
##  Min.   :  0.00           Min.   :  0.0         Min.   :  1.0  
##  1st Qu.:  4.00           1st Qu.: 36.0         1st Qu.: 42.0  
##  Median : 17.00           Median :118.0         Median :145.0  
##  Mean   : 36.02           Mean   :155.6         Mean   :191.6  
##  3rd Qu.: 49.00           3rd Qu.:222.0         3rd Qu.:284.0  
##  Max.   :367.00           Max.   :886.0         Max.   :977.0
plot(bd$temperatura,bd$rentas_totales, main= "Influencia de la temperatura sobre la renta total", xlab= "Temperatura (ºC)", ylab= "Rentas totales")

Observaciones

1. ¿Por qué los días llegan hasta el 19 y no hasta el 31?

2. ¿Qué significan los números en las estaciones? R: 1 es primavera, 2 es verano, 3 es otroño y 4 es invierno.

Herramienta “El Generador de Valor de Datos”

Paso 1. Definir el área del negocio que buscamos impactar o mejorar y su KPI.

El departamento de mercadotecnia y se busca impactar el indicador de Rentas Totales.

Paso 2. Seleccionar plantilla(s-) para crear valor a partir de los datos de los clientes.

Visión | Segmentación | Personalización | Contextualización

Paso 3. Generar ideas o conceptos específicos.

Elaborar un modelo predictivo de rentas totales.

Paso 4. Reunir los datos requeridos.

Elaborar una base de datos con la variable dependiente (Rentas Totales) y las variables independientes (por definir TBD).

Paso 5. Plan de ejecución.

Conocer que días tienen más rentas y menos rentas.
Descuentos o Promociones cuando haya menos rentas de bicis.
Pruebas con muestras de personas.

Paso 3. Generar regresión lineal

regresion <- lm(rentas_totales ~ hora + dia + mes + año + estacion + dia_de_la_semana + asueto + temperatura + sensacion_termica + humedad + velocidad_del_viento, data=bd)
summary(regresion)
## 
## Call:
## lm(formula = rentas_totales ~ hora + dia + mes + año + estacion + 
##     dia_de_la_semana + asueto + temperatura + sensacion_termica + 
##     humedad + velocidad_del_viento, data = bd)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -305.52  -93.64  -27.70   61.85  649.10 
## 
## Coefficients:
##                        Estimate Std. Error t value Pr(>|t|)    
## (Intercept)          -1.661e+05  5.496e+03 -30.217  < 2e-16 ***
## hora                  7.735e+00  2.070e-01  37.368  < 2e-16 ***
## dia                   3.844e-01  2.482e-01   1.549  0.12150    
## mes                   9.996e+00  1.682e+00   5.943 2.89e-09 ***
## año                   8.258e+01  2.732e+00  30.225  < 2e-16 ***
## estacion             -7.774e+00  5.177e+00  -1.502  0.13324    
## dia_de_la_semana      4.393e-01  6.918e-01   0.635  0.52545    
## asueto               -4.864e+00  8.365e+00  -0.582  0.56089    
## temperatura           1.582e+00  1.038e+00   1.524  0.12752    
## sensacion_termica     4.748e+00  9.552e-01   4.971 6.76e-07 ***
## humedad              -2.115e+00  7.884e-02 -26.827  < 2e-16 ***
## velocidad_del_viento  5.582e-01  1.809e-01   3.086  0.00203 ** 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 141.7 on 10874 degrees of freedom
## Multiple R-squared:  0.3891, Adjusted R-squared:  0.3885 
## F-statistic: 629.6 on 11 and 10874 DF,  p-value: < 2.2e-16
# Evaluar y en caso necesario ajustar la regresión lineal
regresion <- lm(rentas_totales ~ hora + mes + año + sensacion_termica + humedad + velocidad_del_viento, data=bd)
summary(regresion)
## 
## Call:
## lm(formula = rentas_totales ~ hora + mes + año + sensacion_termica + 
##     humedad + velocidad_del_viento, data = bd)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -308.60  -93.85  -28.34   61.05  648.09 
## 
## Coefficients:
##                        Estimate Std. Error t value Pr(>|t|)    
## (Intercept)          -1.662e+05  5.496e+03 -30.250  < 2e-16 ***
## hora                  7.734e+00  2.070e-01  37.364  < 2e-16 ***
## mes                   7.574e+00  4.207e-01  18.002  < 2e-16 ***
## año                   8.266e+01  2.732e+00  30.258  < 2e-16 ***
## sensacion_termica     6.172e+00  1.689e-01  36.539  < 2e-16 ***
## humedad              -2.121e+00  7.858e-02 -26.988  < 2e-16 ***
## velocidad_del_viento  6.208e-01  1.771e-01   3.506 0.000457 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 141.7 on 10879 degrees of freedom
## Multiple R-squared:  0.3886, Adjusted R-squared:  0.3883 
## F-statistic:  1153 on 6 and 10879 DF,  p-value: < 2.2e-16
# Construir Modelo Predictivo
Datos_nuevos <- data.frame(hora=12, mes=1:12, año=2013, sensacion_termica=24, humedad=62, velocidad_del_viento=13)
predict(regresion, Datos_nuevos)
##        1        2        3        4        5        6        7        8 
## 279.1478 286.7215 294.2952 301.8690 309.4427 317.0164 324.5901 332.1638 
##        9       10       11       12 
## 339.7375 347.3112 354.8849 362.4587

Gráfica para conocer relación

plot(bd$sensacion_termica,bd$rentas_totales, main= "Influencia de la sensación térmica sobre la renta total", xlab= "Sensación Térmica", ylab= "Rentas totales")

plot(bd$humedad,bd$rentas_totales, main= "Influencia de la humedad sobre la renta total", xlab= "Humedad", ylab= "Rentas totales")

plot(bd$velocidad_del_viento,bd$rentas_totales, main= "Influencia de la velocidad del viento sobre la renta total", xlab= "Velocidad del viento", ylab= "Rentas totales")

Conclusiones

Un modelo predictivo se construye con la recolección de datos y nos sirve para predecir y pronosticar futuros resultados que permiten poder tomar decisiones que sean precisas.

Para este análisis se construyó un modelo con una linea de regresión, al principio se tenía la hipótesis de que el Clima era un factor importante donde las ventas dependendían de este, al realizar la gráfica podemos ver que entre más temperatura más son las rentas de bicis, pero al momento de realizar la regresión los resultados mostraron que las variables día, estación, día de la semana, asueto y temperatura no tenían significancia ya que no muestran ni un asterisco, por lo que las variables con las que si hay significancia y forman parte del modelo predictivo son:

  • Hora

  • Mes

  • Año

  • Sensación térmica

  • Humedad

  • Velocidad del viento

Se realizaron tres gráficas para ahora que conocemos que variables tienen relación, ver como se comportan la influencia que tiene una de otra y podemos observar que entre más sea la sensación térmica más rentas se tienen, que cuando hay una humedad intermedia hay mas rentas y que entre menos viento haya la gente utiliza más las bicicletas.

Al final nuestro modelo tiene una Rsquared de 38.85%, lo que nos dice que es un buen modelo predictivo ya que se encuentra entre los valores aceptables de significancia. Entre más se acerque al 100% más validez tiene.

LS0tCnRpdGxlOiA8c3BhbiBzdHlsZT0iY29sb3I6Z3JlZW4iPk1vZGVsbyBQcmVkaWN0aXZvIFJlbnRhIGRlIEJpY2lzPC9zcGFuPgphdXRob3I6ICJLYXJsYSBHZW9yZ2luYSBNYXJ0w61uZXogR29uesOhbGV6IEEwMDgyNzUwMCIKZGF0ZTogIjIwMjItMDktMDYiCm91dHB1dDogCiAgaHRtbF9kb2N1bWVudDoKICAgIHRvYzogdHJ1ZQogICAgdG9jX2Zsb2F0OiB0cnVlCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlCi0tLQoKPGltZyBzcmM9ICIvVXNlcnMvZ2VvcmdpbmFtYXJ0aW5lei9Eb2N1bWVudHMvVGVjL1NlzIFwdGltbyBTZW1lc3RyZS9BbmFsacyBdGljYSBwYXJhIG5lZ29jaW9zLCBkZSBsb3MgZGF0b3MgYSBkZWNpc2lvbmVzL3JlbnRhIGJpY2lzLmpwZWciPgoKIyMgPHNwYW4gc3R5bGU9ImNvbG9yOmRhcmtibHVlIj4qKkdlbmVyYXIgbW9kZWxvIHByZWRpY3Rpdm8qKjwvc3Bhbj4gCiMjIDxzcGFuIHN0eWxlPSJjb2xvcjpkYXJrYmx1ZSI+UGFzbyAxLiBJbXBvcnRhciBiYXNlIGRlIGRhdG9zPC9zcGFuPgpgYGB7cn0KYmQgPC0gcmVhZC5jc3YoIi9Vc2Vycy9nZW9yZ2luYW1hcnRpbmV6L0RvY3VtZW50cy9UZWMvU2XMgXB0aW1vIFNlbWVzdHJlL0FuYWxpzIF0aWNhIHBhcmEgbmVnb2Npb3MsIGRlIGxvcyBkYXRvcyBhIGRlY2lzaW9uZXMvcmVudGFkZWJpY2lzLmNzdiIpCmBgYAoKIyMgPHNwYW4gc3R5bGU9ImNvbG9yOmRhcmtibHVlIj5QYXNvIDIuIEVudGVuZGVyIGxhIGJhc2UgZGUgZGF0b3M8L3NwYW4+IApgYGB7cn0KcmVzdW1lbiA8LSBzdW1tYXJ5KGJkKQpyZXN1bWVuCnBsb3QoYmQkdGVtcGVyYXR1cmEsYmQkcmVudGFzX3RvdGFsZXMsIG1haW49ICJJbmZsdWVuY2lhIGRlIGxhIHRlbXBlcmF0dXJhIHNvYnJlIGxhIHJlbnRhIHRvdGFsIiwgeGxhYj0gIlRlbXBlcmF0dXJhICjCukMpIiwgeWxhYj0gIlJlbnRhcyB0b3RhbGVzIikKYGBgCgojIyMgT2JzZXJ2YWNpb25lcwojIyMjIDEuIMK/UG9yIHF1w6kgbG9zIGTDrWFzIGxsZWdhbiBoYXN0YSBlbCAxOSB5IG5vIGhhc3RhIGVsIDMxPyAgCiMjIyMgMi4gwr9RdcOpIHNpZ25pZmljYW4gbG9zIG7Dum1lcm9zIGVuIGxhcyBlc3RhY2lvbmVzPyBSOiAxIGVzIHByaW1hdmVyYSwgMiBlcyB2ZXJhbm8sIDMgZXMgb3Ryb8OxbyB5IDQgZXMgaW52aWVybm8uCgojIyA8c3BhbiBzdHlsZT0iY29sb3I6ZGFya2JsdWUiPiBIZXJyYW1pZW50YSAiRWwgR2VuZXJhZG9yIGRlIFZhbG9yIGRlIERhdG9zIjwvc3Bhbj4gIAoKIyMjIyAqKlBhc28gMS4gRGVmaW5pciBlbCDDoXJlYSBkZWwgbmVnb2NpbyBxdWUgYnVzY2Ftb3MgaW1wYWN0YXIgbyBtZWpvcmFyIHkgc3UgS1BJLioqICAKIyMjIyMgRWwgZGVwYXJ0YW1lbnRvIGRlIG1lcmNhZG90ZWNuaWEgeSBzZSBidXNjYSBpbXBhY3RhciBlbCBpbmRpY2Fkb3IgZGUgUmVudGFzIFRvdGFsZXMuCiMjIyMgKipQYXNvIDIuIFNlbGVjY2lvbmFyIHBsYW50aWxsYShzLSkgcGFyYSBjcmVhciB2YWxvciBhIHBhcnRpciBkZSBsb3MgZGF0b3MgZGUgbG9zIGNsaWVudGVzLioqCiMjIyMjIDxzcGFuIHN0eWxlPSJjb2xvcjpyZWQiPlZpc2nDs248L3NwYW4+IHwgU2VnbWVudGFjacOzbiB8IFBlcnNvbmFsaXphY2nDs24gfCBDb250ZXh0dWFsaXphY2nDs24KIyMjIyAqKlBhc28gMy4gR2VuZXJhciBpZGVhcyBvIGNvbmNlcHRvcyBlc3BlY8OtZmljb3MuKioKIyMjIyMgRWxhYm9yYXIgdW4gbW9kZWxvIHByZWRpY3Rpdm8gZGUgcmVudGFzIHRvdGFsZXMuCiMjIyMgKipQYXNvIDQuIFJldW5pciBsb3MgZGF0b3MgcmVxdWVyaWRvcy4qKgojIyMjIyBFbGFib3JhciB1bmEgYmFzZSBkZSBkYXRvcyBjb24gbGEgdmFyaWFibGUgZGVwZW5kaWVudGUgKFJlbnRhcyBUb3RhbGVzKSB5IGxhcyB2YXJpYWJsZXMgaW5kZXBlbmRpZW50ZXMgKHBvciBkZWZpbmlyIFRCRCkuCiMjIyMgKipQYXNvIDUuIFBsYW4gZGUgZWplY3VjacOzbi4qKgojIyMjIyBDb25vY2VyIHF1ZSBkw61hcyB0aWVuZW4gbcOhcyByZW50YXMgeSBtZW5vcyByZW50YXMuICAgCiMjIyMjIERlc2N1ZW50b3MgbyBQcm9tb2Npb25lcyBjdWFuZG8gaGF5YSBtZW5vcyByZW50YXMgZGUgYmljaXMuICAgIAojIyMjIyBQcnVlYmFzIGNvbiBtdWVzdHJhcyBkZSBwZXJzb25hcy4gIAoKIyMgPHNwYW4gc3R5bGU9ImNvbG9yOmRhcmtibHVlIj5QYXNvIDMuIEdlbmVyYXIgcmVncmVzacOzbiBsaW5lYWw8L3NwYW4+IApgYGB7cn0KcmVncmVzaW9uIDwtIGxtKHJlbnRhc190b3RhbGVzIH4gaG9yYSArIGRpYSArIG1lcyArIGHDsW8gKyBlc3RhY2lvbiArIGRpYV9kZV9sYV9zZW1hbmEgKyBhc3VldG8gKyB0ZW1wZXJhdHVyYSArIHNlbnNhY2lvbl90ZXJtaWNhICsgaHVtZWRhZCArIHZlbG9jaWRhZF9kZWxfdmllbnRvLCBkYXRhPWJkKQpzdW1tYXJ5KHJlZ3Jlc2lvbikKCiMgRXZhbHVhciB5IGVuIGNhc28gbmVjZXNhcmlvIGFqdXN0YXIgbGEgcmVncmVzacOzbiBsaW5lYWwKcmVncmVzaW9uIDwtIGxtKHJlbnRhc190b3RhbGVzIH4gaG9yYSArIG1lcyArIGHDsW8gKyBzZW5zYWNpb25fdGVybWljYSArIGh1bWVkYWQgKyB2ZWxvY2lkYWRfZGVsX3ZpZW50bywgZGF0YT1iZCkKc3VtbWFyeShyZWdyZXNpb24pCgojIENvbnN0cnVpciBNb2RlbG8gUHJlZGljdGl2bwpEYXRvc19udWV2b3MgPC0gZGF0YS5mcmFtZShob3JhPTEyLCBtZXM9MToxMiwgYcOxbz0yMDEzLCBzZW5zYWNpb25fdGVybWljYT0yNCwgaHVtZWRhZD02MiwgdmVsb2NpZGFkX2RlbF92aWVudG89MTMpCnByZWRpY3QocmVncmVzaW9uLCBEYXRvc19udWV2b3MpCmBgYAoKIyMjIDxzcGFuIHN0eWxlPSJjb2xvcjpkYXJrYmx1ZSI+R3LDoWZpY2EgcGFyYSBjb25vY2VyIHJlbGFjacOzbjwvc3Bhbj4gCmBgYHtyfQpwbG90KGJkJHNlbnNhY2lvbl90ZXJtaWNhLGJkJHJlbnRhc190b3RhbGVzLCBtYWluPSAiSW5mbHVlbmNpYSBkZSBsYSBzZW5zYWNpw7NuIHTDqXJtaWNhIHNvYnJlIGxhIHJlbnRhIHRvdGFsIiwgeGxhYj0gIlNlbnNhY2nDs24gVMOpcm1pY2EiLCB5bGFiPSAiUmVudGFzIHRvdGFsZXMiKQoKcGxvdChiZCRodW1lZGFkLGJkJHJlbnRhc190b3RhbGVzLCBtYWluPSAiSW5mbHVlbmNpYSBkZSBsYSBodW1lZGFkIHNvYnJlIGxhIHJlbnRhIHRvdGFsIiwgeGxhYj0gIkh1bWVkYWQiLCB5bGFiPSAiUmVudGFzIHRvdGFsZXMiKQoKcGxvdChiZCR2ZWxvY2lkYWRfZGVsX3ZpZW50byxiZCRyZW50YXNfdG90YWxlcywgbWFpbj0gIkluZmx1ZW5jaWEgZGUgbGEgdmVsb2NpZGFkIGRlbCB2aWVudG8gc29icmUgbGEgcmVudGEgdG90YWwiLCB4bGFiPSAiVmVsb2NpZGFkIGRlbCB2aWVudG8iLCB5bGFiPSAiUmVudGFzIHRvdGFsZXMiKQpgYGAKCiMjIDxzcGFuIHN0eWxlPSJjb2xvcjpkYXJrYmx1ZSI+KipDb25jbHVzaW9uZXMqKjwvc3Bhbj4gClVuIDxzcGFuIHN0eWxlPSJjb2xvcjpyZWQiPiptb2RlbG8gcHJlZGljdGl2byo8L3NwYW4+IHNlIGNvbnN0cnV5ZSBjb24gbGEgcmVjb2xlY2Npw7NuIGRlIGRhdG9zIHkgbm9zIHNpcnZlIHBhcmEgcHJlZGVjaXIgeSBwcm9ub3N0aWNhciBmdXR1cm9zIHJlc3VsdGFkb3MgcXVlIHBlcm1pdGVuIHBvZGVyIHRvbWFyIGRlY2lzaW9uZXMgcXVlIHNlYW4gcHJlY2lzYXMuICAKClBhcmEgZXN0ZSBhbsOhbGlzaXMgc2UgY29uc3RydXnDsyB1biBtb2RlbG8gY29uIHVuYSBsaW5lYSBkZSByZWdyZXNpw7NuLCBhbCBwcmluY2lwaW8gc2UgdGVuw61hIGxhIGhpcMOzdGVzaXMgZGUgcXVlIGVsIENsaW1hIGVyYSB1biBmYWN0b3IgaW1wb3J0YW50ZSBkb25kZSBsYXMgdmVudGFzIGRlcGVuZGVuZMOtYW4gZGUgZXN0ZSwgYWwgcmVhbGl6YXIgbGEgZ3LDoWZpY2EgcG9kZW1vcyB2ZXIgcXVlIGVudHJlIG3DoXMgdGVtcGVyYXR1cmEgbcOhcyBzb24gbGFzIHJlbnRhcyBkZSBiaWNpcywgcGVybyBhbCBtb21lbnRvIGRlIHJlYWxpemFyIGxhIHJlZ3Jlc2nDs24gbG9zIHJlc3VsdGFkb3MgbW9zdHJhcm9uIHF1ZSBsYXMgdmFyaWFibGVzIGTDrWEsIGVzdGFjacOzbiwgZMOtYSBkZSBsYSBzZW1hbmEsIGFzdWV0byB5IHRlbXBlcmF0dXJhIG5vIHRlbsOtYW4gc2lnbmlmaWNhbmNpYSB5YSBxdWUgbm8gbXVlc3RyYW4gbmkgdW4gYXN0ZXJpc2NvLCBwb3IgbG8gcXVlIGxhcyB2YXJpYWJsZXMgY29uIGxhcyBxdWUgKipzaSBoYXkgc2lnbmlmaWNhbmNpYSoqIHkgKipmb3JtYW4gcGFydGUgZGVsIG1vZGVsbyBwcmVkaWN0aXZvKiogc29uOiAgIAoKKiBIb3JhICAgCgoqIE1lcyAgIAoKKiBBw7FvICAgCgoqIFNlbnNhY2nDs24gdMOpcm1pY2EgICAKCiogSHVtZWRhZCAgIAoKKiBWZWxvY2lkYWQgZGVsIHZpZW50byAgCgpTZSByZWFsaXphcm9uIHRyZXMgZ3LDoWZpY2FzIHBhcmEgYWhvcmEgcXVlIGNvbm9jZW1vcyBxdWUgdmFyaWFibGVzIHRpZW5lbiByZWxhY2nDs24sIHZlciBjb21vIHNlIGNvbXBvcnRhbiBsYSBpbmZsdWVuY2lhIHF1ZSB0aWVuZSB1bmEgZGUgb3RyYSB5IHBvZGVtb3Mgb2JzZXJ2YXIgcXVlIGVudHJlIG3DoXMgc2VhIGxhIHNlbnNhY2nDs24gdMOpcm1pY2EgbcOhcyByZW50YXMgc2UgdGllbmVuLCBxdWUgY3VhbmRvIGhheSB1bmEgaHVtZWRhZCBpbnRlcm1lZGlhIGhheSBtYXMgcmVudGFzIHkgcXVlIGVudHJlIG1lbm9zIHZpZW50byBoYXlhIGxhIGdlbnRlIHV0aWxpemEgbcOhcyBsYXMgYmljaWNsZXRhcy4gIAoKQWwgZmluYWwgbnVlc3RybyBtb2RlbG8gdGllbmUgdW5hIDxzcGFuIHN0eWxlPSJjb2xvcjpyZWQiPipSc3F1YXJlZCBkZSAzOC44NSUqPC9zcGFuPiwgbG8gcXVlIG5vcyBkaWNlIHF1ZSBlcyB1biAqKmJ1ZW4gbW9kZWxvIHByZWRpY3Rpdm8qKiB5YSBxdWUgc2UgZW5jdWVudHJhIGVudHJlIGxvcyB2YWxvcmVzIGFjZXB0YWJsZXMgZGUgc2lnbmlmaWNhbmNpYS4gRW50cmUgbcOhcyBzZSBhY2VycXVlIGFsIDEwMCUgbcOhcyB2YWxpZGV6IHRpZW5lLiAgCg==