1 Scrips y tipos de datos

1.1 Scripts de R

Hasta ahora hemos usado únicamente la consola. Llegó la hora de llevar un registro de los comandos que vamos usando, o que necesitaremos usar, y poder guardarlos en un archivo.

Para ellos vamos a crear un archivo .R usando File > New File > R script, esto generará un archivo donde podremos ir escribiendo comandos de R sin necesidad de tener que ejecutarlos directamente sobre la consola.

1.1.1 Guardar el archivo “.R

Puedes guardar el archivo desde File > Save, o presionando Ctrl + S. Guárdalo en el Escritorio dentro de una carpeta llamada Taller_R, nombrando el archivo como Intro_R.R.

¡Atención!

Es importante usar la extensión .R.

Una vez guardado vamos a la ventana de navegación de archivos (Files) dentro de RStudio (panel inferior derecho). Puedes navegar hasta la carpeta de trabajo.
En la pestaña More del panel de navegación de archivos, selecciona Set As Working Directory.

¿Qué ocurrió en la consola?

Se ha usado el comando setwd(), set working directory, que justamente establece como directorio de trabajo a la carpeta especificada.

Ahora prueba el siguiente comando:

Este comando nos dice la ruta del directorio de trabajo donde estamos. Lo usaremos más adelante cuando trabajemos con archivos.

A partir de ahora puedes escribir los comandos que vayamos viendo directamente en el archivo Intro_R.R, escribiendo un comando por línea.
Puedes ejecutar una línea colocándo el cursor sobre ella y presionando Crtl + Enter. También puedes ejecutar múltiples líneas si las seleccionas todas con el cursor y luego presionas Crtl + Enter.


1.2 Variables y asignaciones

En R, es posible almacenar valores en variables usando el operador de asignación <-, o =:

Al ejecutar el comando, R no devúelve una respuesta. Sin embargo, si escribimos el nombre de la variable R nos retornará el valor que le corresponde:

## [1] 25

Nota: ¿Qué pasa si en lugar de escribir temp (minúscula) en la consola, escribímos TEMP (mayúscula)?

Como es de esperarse, ahora puedes hacer operaciones usando dicha variable:

## [1] 30
## [1] 125
## [1] 1.39794

Observa que el valor de temp no ha cambiado aunque hayamos operado sobre él.
Ejecuta lo siguiente:

## [1] "El valor actual de temp es: 25"
## [1] "El nuevo valor de temp es: 50"

Crea ahora una variable temp_K que contenga el valor de temp más 273.15. ¿Cuánto vale temp_K?

## [1] 323.15

Crea una nueva variable temp_F que convierta el valor de temp a grados Fahrenheit.

x °C * 9/5 + 32 = y °F

Ojo: Si tratas de ejecutar el comando así, te dará error. ¿Por qué?


1.2.1 ¿Cómo nombrar variables?

  • Los nombres de las variables pueden contener letras, números, guiones bajos y puntos.
  • No pueden comenzar con un número ni contener espacios o guiones medios entre palabras.

Ejercicio: Verifica cuales de las siguientes formas de nombrar una variables son válidas (ejecuta cada comando uno a uno):

¿Cuántas variables pudiste crear?


1.2.2 Paneles Environment y History

Tras ejecutar los comandos anteriores verás que en el panel superior derecho, en la pestaña Environment se han ido guardando las variables que has creado. Dichas variables están guardadas en memoria y pueden ser usadas para realizar operaciones.
Por otro lado, el panel History posee el historial de todos los comandos que has ido ejecutando en la sesión.


1.4 Tipos de datos

En R, casi todos los datos con los que trabajamos son considerados Objetos, lo que significa que cada dato pertenece a una clase en particular, y por ello tiene atributos particulares.
Los tipos de datos básicos más comunes en R son los siguientes:

  • numeric: número real
  • integer: número entero
  • character: cadena de texto
  • logical: valores lógicos (verdadero o falso)

Hasta ahora hemos utilizado algunos de ellos, y es importante saber con que tipo de datos estamos trabajando, pues de ello depende qué operaciones podemos realizar con ellos. A cotinuación usamos la función class() que nos indica qué tipo de dato es un objeto:

Ejercicio:

  • ¿Cuáles de las siguientes operaciones es posible realizar?
  • ¿Qué tipo de dato es el resultado de cada una?

Usa la función class() para evaluar cada resultado (por ejemplo: class(100 + 2))

¡Atención!

Recuerda que si hay algún cambio que desees guardar en tu archivo .R puedes utilizar File > Save o Ctrl + S. No olvides tampoco utilizar los comentarios (#) para documentar los comandos y pasos que has realizado.


¡Listo!
Puedes continuar hacia la siguiente sección.


Anterior

Siguiente

LS0tCnRpdGxlOiAnSW50cm9kdWNjacOzbiBhIFI6IFRpcG9zIGRlIGRhdG9zJwotLS0KKioqCiMgU2NyaXBzIHkgdGlwb3MgZGUgZGF0b3MKCiMjICpTY3JpcHRzKiBkZSBSCgpIYXN0YSBhaG9yYSBoZW1vcyB1c2FkbyDDum5pY2FtZW50ZSBsYSBjb25zb2xhLiBMbGVnw7MgbGEgaG9yYSBkZSBsbGV2YXIgdW4gcmVnaXN0cm8gZGUgbG9zIGNvbWFuZG9zIHF1ZSB2YW1vcyB1c2FuZG8sIG8gcXVlIG5lY2VzaXRhcmVtb3MgdXNhciwgeSBwb2RlciBndWFyZGFybG9zIGVuIHVuIGFyY2hpdm8uCgpQYXJhIGVsbG9zIHZhbW9zIGEgY3JlYXIgdW4gYXJjaGl2byAqLlIqIHVzYW5kbyBgRmlsZSA+IE5ldyBGaWxlID4gUiBzY3JpcHRgLCBlc3RvIGdlbmVyYXLDoSB1biBhcmNoaXZvIGRvbmRlIHBvZHJlbW9zIGlyIGVzY3JpYmllbmRvIGNvbWFuZG9zIGRlICoqUioqIHNpbiBuZWNlc2lkYWQgZGUgdGVuZXIgcXVlIGVqZWN1dGFybG9zIGRpcmVjdGFtZW50ZSBzb2JyZSBsYSBjb25zb2xhLgoKIyMjIEd1YXJkYXIgZWwgYXJjaGl2byAiKi5SKiIKUHVlZGVzIGd1YXJkYXIgZWwgYXJjaGl2byBkZXNkZSBgRmlsZSA+IFNhdmVgLCBvIHByZXNpb25hbmRvIGBDdHJsICsgU2AuIEd1w6FyZGFsbyBlbiBlbCAqKkVzY3JpdG9yaW8qKiBkZW50cm8gZGUgdW5hIGNhcnBldGEgbGxhbWFkYSAqVGFsbGVyX1IqLCBub21icmFuZG8gZWwgYXJjaGl2byBjb21vICpJbnRyb19SLlIqLiAKCjxkaXYgY2xhc3M9ImFsZXJ0IGFsZXJ0LWRpc21pc3NpYmxlIGFsZXJ0LWRhbmdlciI+CjxoNCBjbGFzcz0iYWxlcnQtaGVhZGluZyI+wqFBdGVuY2nDs24hPC9oND4KICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9ImNsb3NlIiBkYXRhLWRpc21pc3M9ImFsZXJ0Ij48L2J1dHRvbj4KICBFcyBpbXBvcnRhbnRlIHVzYXIgbGEgZXh0ZW5zacOzbiA8c3Ryb25nPi5SPC9zdHJvbmc+Lgo8L2Rpdj4KClVuYSB2ZXogZ3VhcmRhZG8gdmFtb3MgYSBsYSB2ZW50YW5hIGRlIG5hdmVnYWNpw7NuIGRlIGFyY2hpdm9zICgqYEZpbGVzYCopIGRlbnRybyBkZSAqKlJTdHVkaW8qKiAocGFuZWwgaW5mZXJpb3IgZGVyZWNobykuIFB1ZWRlcyBuYXZlZ2FyIGhhc3RhIGxhIGNhcnBldGEgZGUgdHJhYmFqby4gIApFbiBsYSBwZXN0YcOxYSAqYE1vcmVgKiBkZWwgcGFuZWwgZGUgbmF2ZWdhY2nDs24gZGUgYXJjaGl2b3MsIHNlbGVjY2lvbmEgKmBTZXQgQXMgV29ya2luZyBEaXJlY3RvcnlgKi4KCioqwr9RdcOpIG9jdXJyacOzIGVuIGxhIGNvbnNvbGE/KioKCltTZSBoYSB1c2FkbyBlbCBjb21hbmRvIGBzZXR3ZCgpYCwgKnNldCB3b3JraW5nIGRpcmVjdG9yeSosIHF1ZSBqdXN0YW1lbnRlIGVzdGFibGVjZSBjb21vIGRpcmVjdG9yaW8gZGUgdHJhYmFqbyBhIGxhIGNhcnBldGEgZXNwZWNpZmljYWRhLl17LnNwb2lsZXJ9CgpBaG9yYSBwcnVlYmEgZWwgc2lndWllbnRlIGNvbWFuZG86CgpgYGB7ciBldmFsPUZBTFNFfQpnZXR3ZCgpCmBgYAoKRXN0ZSBjb21hbmRvIG5vcyBkaWNlIGxhIHJ1dGEgZGVsIGRpcmVjdG9yaW8gZGUgdHJhYmFqbyBkb25kZSBlc3RhbW9zLiBMbyB1c2FyZW1vcyBtw6FzIGFkZWxhbnRlIGN1YW5kbyB0cmFiYWplbW9zIGNvbiBhcmNoaXZvcy4KCkEgcGFydGlyIGRlIGFob3JhIHB1ZWRlcyBlc2NyaWJpciBsb3MgY29tYW5kb3MgcXVlIHZheWFtb3MgdmllbmRvIGRpcmVjdGFtZW50ZSBlbiBlbCBhcmNoaXZvICpJbnRyb19SLlIqLCBlc2NyaWJpZW5kbyB1biBjb21hbmRvIHBvciBsw61uZWEuICAKUHVlZGVzIGVqZWN1dGFyIHVuYSBsw61uZWEgY29sb2PDoW5kbyBlbCBjdXJzb3Igc29icmUgZWxsYSB5IHByZXNpb25hbmRvIGBDcnRsICsgRW50ZXJgLiBUYW1iacOpbiBwdWVkZXMgZWplY3V0YXIgbcO6bHRpcGxlcyBsw61uZWFzIHNpIGxhcyBzZWxlY2Npb25hcyAqKnRvZGFzKiogY29uIGVsIGN1cnNvciB5IGx1ZWdvIHByZXNpb25hcyBgQ3J0bCArIEVudGVyYC4KCjxicj4KCiMjIFZhcmlhYmxlcyB5IGFzaWduYWNpb25lcwoKRW4gKipSKiosIGVzIHBvc2libGUgYWxtYWNlbmFyIHZhbG9yZXMgZW4gdmFyaWFibGVzIHVzYW5kbyBlbCBvcGVyYWRvciBkZSBhc2lnbmFjacOzbiBgPC1gLCBvIGA9YDogCmBgYHtyfQojIEFzaWduYW1vcyBhIGxhIHZhcmlhYmxlIGxsYW1hZGEgInRlbXAiIGVsIHZhbG9yIG51bcOpcmljbyAyNQp0ZW1wID0gMjUKYGBgCkFsIGVqZWN1dGFyIGVsIGNvbWFuZG8sICoqUioqIG5vIGRldsO6ZWx2ZSB1bmEgcmVzcHVlc3RhLiBTaW4gZW1iYXJnbywgc2kgZXNjcmliaW1vcyBlbCBub21icmUgZGUgbGEgdmFyaWFibGUgKipSKiogbm9zIHJldG9ybmFyw6EgZWwgdmFsb3IgcXVlIGxlIGNvcnJlc3BvbmRlOgpgYGB7cn0KIyAiTGxhbcOhbW9zIiBhIGxhIHZhcmlhYmxlICJ0ZW1wIgp0ZW1wCmBgYAoKKipfTm90YTpfKiogwr9RdcOpIHBhc2Egc2kgZW4gbHVnYXIgZGUgZXNjcmliaXIgYHRlbXBgIChtaW7DunNjdWxhKSBlbiBsYSBjb25zb2xhLCBlc2NyaWLDrW1vcyBgVEVNUGAgKG1hecO6c2N1bGEpPwoKCkNvbW8gZXMgZGUgZXNwZXJhcnNlLCBhaG9yYSBwdWVkZXMgaGFjZXIgb3BlcmFjaW9uZXMgdXNhbmRvIGRpY2hhIHZhcmlhYmxlOgpgYGB7cn0KdGVtcCArIDUuMAp0ZW1wICogNQpsb2cxMCggdGVtcCApCmBgYAoKT2JzZXJ2YSBxdWUgZWwgdmFsb3IgZGUgYHRlbXBgIG5vIGhhIGNhbWJpYWRvIGF1bnF1ZSBoYXlhbW9zIG9wZXJhZG8gc29icmUgw6lsLiAgCkVqZWN1dGEgbG8gc2lndWllbnRlOgpgYGB7cn0KIyBwcmludCB5IHBhc3RlIG5vcyBzaXJ2ZW4gcGFyYSAiaW1wcmltaXIiIGVuIGxhIGNvbnNvbGE6CnByaW50KCBwYXN0ZSggIkVsIHZhbG9yIGFjdHVhbCBkZSB0ZW1wIGVzOiIsIHRlbXAgKSApCiMgQWN0dWFsaXphbW9zIHgKIyBVc2Ftb3MgZWwgb3BlcmFkb3IgIj0iIG8gIjwtIgp0ZW1wIDwtIHRlbXAgKiAyIApwcmludCggcGFzdGUoICJFbCBudWV2byB2YWxvciBkZSB0ZW1wIGVzOiIsIHRlbXAgKSApCmBgYAoKQ3JlYSBhaG9yYSB1bmEgdmFyaWFibGUgYHRlbXBfS2AgcXVlIGNvbnRlbmdhIGVsIHZhbG9yIGRlIGB0ZW1wYCBtw6FzIGAyNzMuMTVgLiAqKsK/Q3XDoW50byB2YWxlIGB0ZW1wX0tgPyoqCmBgYHtyfQp0ZW1wX0sgPSB0ZW1wICsgMjczLjE1CnRlbXBfSwpgYGAKCkNyZWEgdW5hIG51ZXZhIHZhcmlhYmxlIGB0ZW1wX0ZgIHF1ZSBjb252aWVydGEgZWwgdmFsb3IgZGUgYHRlbXBgIGEgZ3JhZG9zICpGYWhyZW5oZWl0Ki4KClsgXyoqeCoqXyAqwrBDKiAqIDkvNSArIDMyID0gXyoqeSoqXyAqwrBGKl17LnNwb2lsZXJ9CgpgYGB7ciBldmFsPUZBTFNFfQojIEFjdHVhbGl6YSBlbCB2YWxvciBkZSB4Lgp0ZW1wX0YgPC0gaW5ncmVzYSB0dSByZXNwdWVzdGEKdGVtcF9GCmBgYAoKKipPam8qKjogU2kgdHJhdGFzIGRlIGVqZWN1dGFyIGVsIGNvbWFuZG8gYXPDrSwgdGUgZGFyw6EgZXJyb3IuIMK/UG9yIHF1w6k/Cgo8YnI+CgojIyMgwr9Dw7NtbyBub21icmFyIHZhcmlhYmxlcz8KCiogTG9zIG5vbWJyZXMgZGUgbGFzIHZhcmlhYmxlcyBwdWVkZW4gY29udGVuZXIgbGV0cmFzLCBuw7ptZXJvcywgZ3Vpb25lcyBiYWpvcyB5IHB1bnRvcy4gCiogKipObyBwdWVkZW4gY29tZW56YXIgY29uIHVuIG7Dum1lcm8gbmkgY29udGVuZXIgZXNwYWNpb3MgbyBndWlvbmVzIG1lZGlvcyBlbnRyZSBwYWxhYnJhcy4qKiAgCgoqKkVqZXJjaWNpbzoqKiBWZXJpZmljYSBjdWFsZXMgZGUgbGFzIHNpZ3VpZW50ZXMgZm9ybWFzIGRlIG5vbWJyYXIgdW5hIHZhcmlhYmxlcyBzb24gdsOhbGlkYXMgKGVqZWN1dGEgY2FkYSBjb21hbmRvIHVubyBhIHVubyk6CmBgYHtyIGV2YWw9RkFMU0V9Cm51bWVyb19kb3MgPSAyCm51bWVyby10cmVzID0gMwpudW1lcm8gY3VhdHJvID0gNApudW1lcm8uNSA9IDUKbnVtZXJvU2VpcyA9IDYKNy5udW1lcm8gPSA3Cl84ID0gOQouOSA9IDkKbnVtXzEwID0gMTAKb25jZSA9ICJvbmNlIgpgYGAKCmBgYHtyIGluY2x1ZGU9RkFMU0V9Cm51bWVyb19kb3MgPSAyCm51bWVyby41ID0gNQpudW1lcm9TZWlzID0gNgpudW1fMTAgPSAxMApvbmNlID0gIm9uY2UiCmBgYAoKKirCv0N1w6FudGFzIHZhcmlhYmxlcyBwdWRpc3RlIGNyZWFyPyoqCgo8YnI+CgojIyMgUGFuZWxlcyAqYEVudmlyb25tZW50YCogeSAqYEhpc3RvcnlgKgpUcmFzIGVqZWN1dGFyIGxvcyBjb21hbmRvcyBhbnRlcmlvcmVzIHZlcsOhcyBxdWUgZW4gZWwgcGFuZWwgc3VwZXJpb3IgZGVyZWNobywgZW4gbGEgcGVzdGHDsWEgKmBFbnZpcm9ubWVudGAqIHNlIGhhbiBpZG8gZ3VhcmRhbmRvIGxhcyB2YXJpYWJsZXMgcXVlIGhhcyBjcmVhZG8uIERpY2hhcyB2YXJpYWJsZXMgZXN0w6FuIGd1YXJkYWRhcyBlbiBtZW1vcmlhIHkgcHVlZGVuIHNlciB1c2FkYXMgcGFyYSByZWFsaXphciBvcGVyYWNpb25lcy4gIApQb3Igb3RybyBsYWRvLCBlbCBwYW5lbCAqYEhpc3RvcnlgKiBwb3NlZSBlbCBoaXN0b3JpYWwgZGUgdG9kb3MgbG9zIGNvbWFuZG9zIHF1ZSBoYXMgaWRvIGVqZWN1dGFuZG8gZW4gbGEgc2VzacOzbi4KCjxicj4KCiMjIE9wZXJhY2lvbmVzIHJlbGFjaW9uYWxlcwoKYGBge3J9CjIgPT0gMiAjIMK/U29uIGlndWFsZXM/OiBEZXZ1ZWx2ZSBUUlVFCm51bWVyb19kb3MgPT0gMiAjIMK/U29uIGlndWFsZXM/OiBPYnNlcnZhIHF1ZSBlc3RhIHZleiB1c2Ftb3MgIj09IiwgeSBubyAiPSIKCjIgPT0gMSAjIMK/U29uIGlndWFsZXM/OiBEZXZ1ZWx2ZSBGQUxTRQoyICE9IDEgIyDCv1NvbiBERVNpZ3VhbGVzPzogRGV2dWVsdmUgVFJVRQoyID4gMSAjIMK/RXMgbWF5b3IgcXVlPzogRGV2dWVsdmUgVFJVRQoyIDwgMSAjIMK/RXMgbWVub3IgcXVlPzogRGV2dWVsdmUgRkFMU0UKYGBgCgo8YnI+CgojIyBUaXBvcyBkZSBkYXRvcwoKRW4gKipSKiosIGNhc2kgdG9kb3MgbG9zIGRhdG9zIGNvbiBsb3MgcXVlIHRyYWJhamFtb3Mgc29uIGNvbnNpZGVyYWRvcyAqKl9PYmpldG9zXyoqLCBsbyBxdWUgc2lnbmlmaWNhIHF1ZSBjYWRhIGRhdG8gcGVydGVuZWNlIGEgdW5hICoqY2xhc2UqKiBlbiBwYXJ0aWN1bGFyLCB5IHBvciBlbGxvIHRpZW5lIGF0cmlidXRvcyBwYXJ0aWN1bGFyZXMuICAKTG9zIHRpcG9zIGRlIGRhdG9zICoqYsOhc2ljb3MqKiBtw6FzIGNvbXVuZXMgZW4gUiBzb24gbG9zIHNpZ3VpZW50ZXM6CgoqICoqbnVtZXJpYyoqOiBuw7ptZXJvIHJlYWwKKiAqKmludGVnZXIqKjogbsO6bWVybyBlbnRlcm8KKiAqKmNoYXJhY3RlcioqOiBjYWRlbmEgZGUgdGV4dG8KKiAqKmxvZ2ljYWwqKjogdmFsb3JlcyBsw7NnaWNvcyAodmVyZGFkZXJvIG8gZmFsc28pCgpIYXN0YSBhaG9yYSBoZW1vcyB1dGlsaXphZG8gYWxndW5vcyBkZSBlbGxvcywgeSBlcyBpbXBvcnRhbnRlIHNhYmVyIGNvbiBxdWUgdGlwbyBkZSBkYXRvcyBlc3RhbW9zIHRyYWJhamFuZG8sIHB1ZXMgZGUgZWxsbyBkZXBlbmRlIHF1w6kgb3BlcmFjaW9uZXMgcG9kZW1vcyByZWFsaXphciBjb24gZWxsb3MuIEEgY290aW51YWNpw7NuIHVzYW1vcyBsYSBmdW5jacOzbiBgY2xhc3MoKWAgcXVlIG5vcyBpbmRpY2EgcXXDqSB0aXBvIGRlIGRhdG8gZXMgdW4gb2JqZXRvOgoKYGBge3IgY29sbGFwc2U9VFJVRX0KbnVtZXJvX3JlYWwgPSAxMDAuNQpjbGFzcyhudW1lcm9fcmVhbCkKYGBgCgpgYGB7ciBjb2xsYXBzZT1UUlVFfQpudW1lcm9fZW50ZXJvID0gMTAwTApjbGFzcyhudW1lcm9fZW50ZXJvKQpgYGAKCmBgYHtyIGNvbGxhcHNlPVRSVUV9CmNhZGVuYV9kZV90ZXh0byA9ICIxMDAiICMgTyBjYWRlbmEgZGUgY2FyYWN0ZXJlcwpjbGFzcyhjYWRlbmFfZGVfdGV4dG8pCmBgYAoKYGBge3IgY29sbGFwc2U9VFJVRX0KdmFsb3JfbG9naWNvID0gVFJVRSAjIFRhbWJpw6luIHB1ZWRlIHNlciBGQUxTRQpjbGFzcyh2YWxvcl9sb2dpY28pCmBgYAoKKipFamVyY2ljaW8qKjogCgotIMK/Q3XDoWxlcyBkZSBsYXMgc2lndWllbnRlcyBvcGVyYWNpb25lcyBlcyBwb3NpYmxlIHJlYWxpemFyPwotIMK/UXXDqSB0aXBvIGRlIGRhdG8gZXMgZWwgcmVzdWx0YWRvIGRlIGNhZGEgdW5hPwoKVXNhIGxhIGZ1bmNpw7NuIGBjbGFzcygpYCBwYXJhIGV2YWx1YXIgY2FkYSByZXN1bHRhZG8gKHBvciBlamVtcGxvOiBgY2xhc3MoMTAwICsgMilgKQoKYGBge3IgZXZhbD1GQUxTRX0KMTAwICsgMgkJCQkgIygxCjEwMEwgKyAyLjAJCSAgIAkjKDIKMTAwTCArIDJMCQkgICAjKDMKMTAwICsgVFJVRSArIFRSVUUJIyg0ClRSVUUgPT0gMQkJCSMoNQoiMTAwIiArICIyIgkJICAJIyg2CnBhc3RlKCIxMDAiICsgIjIiKQkjKDcKcGFzdGUoIjEwMCIgKyAyKSAJIyg4CnBhc3RlKDEwMCArIDIpCQkjKDkKcGFzdGUoMTAwLCAyKSAgICAgIygxMApgYGAKCjxkaXYgY2xhc3M9ImFsZXJ0IGFsZXJ0LWRpc21pc3NpYmxlIGFsZXJ0LXN1Y2Nlc3MiPgo8aDQgY2xhc3M9ImFsZXJ0LWhlYWRpbmciPsKhQXRlbmNpw7NuITwvaDQ+CiAgPGJ1dHRvbiB0eXBlPSJidXR0b24iIGNsYXNzPSJjbG9zZSIgZGF0YS1kaXNtaXNzPSJhbGVydCI+PC9idXR0b24+CiAgUmVjdWVyZGEgcXVlIHNpIGhheSBhbGfDum4gY2FtYmlvIHF1ZSBkZXNlZXMgZ3VhcmRhciBlbiB0dSBhcmNoaXZvIF8qKi5SKipfIHB1ZWRlcyB1dGlsaXphciBgRmlsZSA+IFNhdmVgIG8gYEN0cmwgKyBTYC4gTm8gb2x2aWRlcyB0YW1wb2NvIHV0aWxpemFyIGxvcyBjb21lbnRhcmlvcyAoYCNgKSBwYXJhIGRvY3VtZW50YXIgbG9zIGNvbWFuZG9zIHkgcGFzb3MgcXVlIGhhcyByZWFsaXphZG8uCjwvZGl2PgoKKioqCgoqKsKhTGlzdG8hKiogIApQdWVkZXMgY29udGludWFyIGhhY2lhIGxhIHNpZ3VpZW50ZSBzZWNjacOzbi4KCioqKgoKPGEgY2xhc3M9ImJ0biBidG4tcHJpbWFyeSBwdWxsLWxlZnQiIGhyZWY9Ii4vaW50cm9fUl9wMS5odG1sIiByb2xlPSJidXR0b24iPiBBbnRlcmlvciA8L2E+Cgo8YSBjbGFzcz0iYnRuIGJ0bi1wcmltYXJ5IHB1bGwtcmlnaHQiIGhyZWY9Ii4vaW50cm9fUl9wMy5odG1sIiByb2xlPSJidXR0b24iPiBTaWd1aWVudGUgPC9hPgoK