Fin Documento
Diagramas de Barras
El diagrama de barras (Bar Chart) es un gráfico
estadístico que nos permite representar la distribución de frecuencias
de variables cualitativas y cuantitativas discretas; nuestro objetivo es
pasar del lápiz y papel al uso de los lenguajes de programación R
version 4.2.1 (2022-06-23 ucrt)(R Core Team,
2022) y Python 3.9.7(Van Rossum & Drake
Jr, 1995) , así como el paquete RMarkdown,
recomendamos la lectura del libro El Arte de Programar en
R(Santana Sepúlveda et al., 2014);
compartimos la siguiente imagen como referencia.

Data Set - mtcars
mtcars es un data set que ya viene precargado al
momento de instalar el lenguaje de programación R en
nuestro sistema, haremos uso de dicho data set para la creación de
distintos diagramas de barras, de las 11 variables y 32 observaciones
que lo componen nos enfocaremos en las variables cyl
(cilindro) y gear (engranajes) como se muestra a
continuación.
mtcars
summary(mtcars)
## mpg cyl disp hp
## Min. :10.40 Min. :4.000 Min. : 71.1 Min. : 52.0
## 1st Qu.:15.43 1st Qu.:4.000 1st Qu.:120.8 1st Qu.: 96.5
## Median :19.20 Median :6.000 Median :196.3 Median :123.0
## Mean :20.09 Mean :6.188 Mean :230.7 Mean :146.7
## 3rd Qu.:22.80 3rd Qu.:8.000 3rd Qu.:326.0 3rd Qu.:180.0
## Max. :33.90 Max. :8.000 Max. :472.0 Max. :335.0
## drat wt qsec vs
## Min. :2.760 Min. :1.513 Min. :14.50 Min. :0.0000
## 1st Qu.:3.080 1st Qu.:2.581 1st Qu.:16.89 1st Qu.:0.0000
## Median :3.695 Median :3.325 Median :17.71 Median :0.0000
## Mean :3.597 Mean :3.217 Mean :17.85 Mean :0.4375
## 3rd Qu.:3.920 3rd Qu.:3.610 3rd Qu.:18.90 3rd Qu.:1.0000
## Max. :4.930 Max. :5.424 Max. :22.90 Max. :1.0000
## am gear carb
## Min. :0.0000 Min. :3.000 Min. :1.000
## 1st Qu.:0.0000 1st Qu.:3.000 1st Qu.:2.000
## Median :0.0000 Median :4.000 Median :2.000
## Mean :0.4062 Mean :3.688 Mean :2.812
## 3rd Qu.:1.0000 3rd Qu.:4.000 3rd Qu.:4.000
## Max. :1.0000 Max. :5.000 Max. :8.000
var_cyl
summary(mtcars$cyl)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 4.000 4.000 6.000 6.188 8.000 8.000
var_gear
summary(mtcars$gear)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 3.000 3.000 4.000 3.688 4.000 5.000
var_carb
summary(mtcars$carb)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 1.000 2.000 2.000 2.812 4.000 8.000
Bar Chart -
barplot()
La función barplot()
nos permite crear diagramas de
barras (Bar Charts) en el lenguaje de programación R,
utilizaremos la variable cyl (cilindros) para crear el
gráfico estadístico respectivo, como se muestra en la siguiente
imagen.
x <- table(mtcars$cyl)
colores <- c("orange","blue","purple")
barplot(x,xlab="Cilindros",ylab="Frecuencias",main="Número de Cilindros",col=colores)
Bar Chart -
ggplot2
ggplot2(Wickham, 2016) es un
paquete del lenguaje de programación que nos permite crear gráficos
estadísticos de gran calidad, haremos uso de la variable cyl
(cilindros) para la creación del gráfico estadístico
respectivo, como se muestra a continuación.
Mostrar/Ocultar Código
colores <- c("orange","blue","purple")
ggplot(mtcars,aes(cyl)) + geom_bar(fill=colores) + labs(x="Cillindros",y="Frecuencias",title="Número de Cilindros") + theme_dark()

Bar Chart -
Lattice
Lattice(Sarkar, 2008) es un
paquete del lenguaje de programación R, que nos permite crear gráficos
estadísticos de muy buena calidad, nos enfocaremos en la variable cyl
(cilindros) para la creación del gráfico estadístico
respectivo, como se muestra a continuación.
x <- table(mtcars$cyl)
barchart(x,xlab="Cilindros",ylab="Frecuencias",main="Número de Cilindros",col=colores,horizontal=FALSE)

SQL - MySQL
select Code,Country_name,Continente from country;
Displaying records 1 - 20
ABW |
Aruba |
North America |
AFG |
Afghanistan |
Asia |
AGO |
Angola |
Africa |
AIA |
Anguilla |
North America |
ALB |
Albania |
Europe |
AND |
Andorra |
Europe |
ANT |
Netherlands Antilles |
North America |
ARE |
United Arab Emirates |
Asia |
ARG |
Argentina |
South America |
ARM |
Armenia |
Asia |
ASM |
American Samoa |
Oceania |
ATA |
Antarctica |
Antarctica |
ATF |
French Southern territories |
Antarctica |
ATG |
Antigua and Barbuda |
North America |
AUS |
Australia |
Oceania |
AUT |
Austria |
Europe |
AZE |
Azerbaijan |
Asia |
BDI |
Burundi |
Africa |
BEL |
Belgium |
Europe |
BEN |
Benin |
Africa |
mtcars - cyl &
gear
A continuación, mostramos como unir dos diagramas de barras
(Bar Charts) en un solo gráfico, tomando como base el
data set mtcars, así como sus variables
cyl (cilindros) y gear
(engranajes).
y <- table(mtcars$gear)
par(mfrow=c(1,2))
barplot(x,xlab="Cilindros",ylab="Frecuencias",main="Número de Cilindros",col=colores)
barplot(y,xlab="Engranajes",ylab="Frecuencias",main="Número de Engranajes",col=rainbow(3))

Bar Charts -
Matplotlib
Matplotlib(Hunter, 2007) es
una librería del lenguaje de programación Python, que nos permite crear
gráficos estadísticos de gran calidad, RMarkdown(Allaire
et al., 2022) nos permite trabajar con otros lenguajes de
programación tales como C++, SQL, Julia, entre muchos
otros; a continuación mostramos un diagrama de barras (Bar
Chart) creado con Matplotlib.
eje_x = ['Python', 'R', 'Node.js', 'PHP']
eje_y = [50,20,35,47]
plt.bar(eje_x, eje_y)
plt.ylabel('Cantidad de usuarios')
plt.xlabel('Lenguajes de programación')
plt.title('Usuarios de lenguajes de programación')
plt.show()

YouTube -
Tutorial
Compartimos el siguiente tutorial tomado de la plataforma
YouTube que muestra como crear diagramas de barras
(Bar Charts) haciendo uso de la función
barplot()
y el paquete ggplot2 del
lenguaje de programación R;utilizaremos el paquete
vembedr(Lyttle, 2021) para añadir un vídeo de
YouTube a nuestro documento RMarkdown.
embed_url("https://www.youtube.com/watch?v=EkxRj02iaLk&t=6s") %>%
use_align("center")
Inicio Documento
Referencias Bibliográficas
Allaire, J., Xie, Y., McPherson, J., Luraschi, J., Ushey, K., Atkins,
A., Wickham, H., Cheng, J., Chang, W., & Iannone, R. (2022).
rmarkdown: Dynamic Documents for R.
https://github.com/rstudio/rmarkdown
Hunter, J. D. (2007). Matplotlib: A 2D graphics environment.
Computing in Science & Engineering,
9(3), 90-95.
https://doi.org/10.1109/MCSE.2007.55
Lyttle, I. (2021).
vembedr: Embed Video in HTML.
https://CRAN.R-project.org/package=vembedr
R Core Team. (2022).
R: A Language and Environment for Statistical
Computing. R Foundation for Statistical Computing.
https://www.R-project.org/
Santana Sepúlveda, S., Mateos Farfán, E., et al. (2014). El arte de
programar en R: un lenguaje para la estadı́stica.
México: Instituto Mexicano de Tecnologı́a del
Agua. UNESCO. Comité Nacional ….
Sarkar, D. (2008).
Lattice: Multivariate Data Visualization with
R. Springer.
http://lmdvr.r-forge.r-project.org
Van Rossum, G., & Drake Jr, F. L. (1995). Python reference
manual. Centrum voor Wiskunde en Informatica Amsterdam.
Wickham, H. (2016).
ggplot2: Elegant Graphics for Data
Analysis. Springer-Verlag New York.
https://ggplot2.tidyverse.org
LS0tDQp0aXRsZTogIkNyZWFyIGRpYWdyYW1hcyBkZSBCYXJyYXMgKEJhciBDaGFydHMpIFxuZW4gZWwgbGVuZ3VhamUgZGUgcHJvZ3JhbWFjacOzbiBSXG4iDQphdXRob3I6DQotIFJlbnpvIEPDoWNlcmVzIFJvc3NpDQotIEFuZHLDqXMgQ8OhY2VyZXMgUm9zc2kNCi0gVmluY2Vuem8gQ8OhY2VyZXMgTGFya3Nvbg0KZGF0ZTogImByIGZvcm1hdChTeXMuRGF0ZSgpLCclZC0lbS0lWScpYCINCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDoNCiAgICBjb2RlX2Rvd25sb2FkOiB5ZXMNCiAgICB0b2M6IHllcw0KICAgIHRvY19mbG9hdDogeWVzDQogICAgY3NzOiBzdHlsZV8wMDguY3NzDQogICAgbnVtYmVyX3NlY3Rpb25zOiB5ZXMNCiAgd29yZF9kb2N1bWVudDoNCiAgICB0b2M6IHllcw0KICBwZGZfZG9jdW1lbnQ6DQogICAgbGF0ZXhfZW5naW5lOiB4ZWxhdGV4DQpzdWJ0aXRsZTogfA0KICBVdGlsaXphbmRvIGxhIGZ1bmNpw7NuIGJhc2UgYmFycGxvdCgpIHkgbG9zIHBhcXVldGVzDQogIGdncGxvdDIgeSBsYXR0aWNlLg0KYmlibGlvZ3JhcGh5OiBiaWJsaW9fMDA3LmJpYg0KY3NsOiBhcGEuY3NsDQpsaW5rLWNpdGF0aW9uczogeWVzDQphbHdheXNfYWxsb3dfaHRtbDogeWVzDQplZGl0b3Jfb3B0aW9uczoNCiAgY2h1bmtfb3V0cHV0X3R5cGU6IGlubGluZQ0KbGFuZzogRXMtZXMgIA0KLS0tDQoNCg0KPCEtLSBSTWFya2Rvd24gbm9zIHBlcm1pdGUgY29tYmluYXIgdGV4dG8gcGxhbm8geSBjw7NkaWdvIGRlIGRpc3RpbnRvcyBsZW5ndWFqZXMgZGUgcHJvZ3JhbWFjacOzbiAtLT4NCg0KYGBge3Igc2V0dXAsaW5jbHVkZT1GQUxTRX0NCg0KbGlicmFyeShnZ3Bsb3QyKQ0KDQpsaWJyYXJ5KGxhdHRpY2UpDQoNCmxpYnJhcnkocmV0aWN1bGF0ZSkNCg0KbGlicmFyeSh2ZW1iZWRyKQ0KDQpsaWJyYXJ5KFJNeVNRTCkNCg0KY291bnRyeV90YWJsZSA8LSBkYkNvbm5lY3QoUk15U1FMOjpNeVNRTCgpLGRibmFtZT0nd29ybGQnLHVzZXJuYW1lPSdyb290JyxwYXNzd29yZD0nTGltaXRsZXNzMTk3OCcsaG9zdD0nbG9jYWxob3N0Jyxwb3J0PTMzMDYpDQoNCg0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFLGNvbm5lY3Rpb249ImNvdW50cnlfdGFibGUiKQ0KDQoNCmBgYA0KDQpgYGB7cHl0aG9uLGluY2x1ZGU9RkFMU0V9DQoNCmZyb20gcGxhdGZvcm0gaW1wb3J0IHB5dGhvbl92ZXJzaW9uDQoNCnZlcnNpb249cHl0aG9uX3ZlcnNpb24oKQ0KDQppbXBvcnQgbWF0cGxvdGxpYi5weXBsb3QgYXMgcGx0DQoNCmltcG9ydCBudW1weSBhcyBucA0KDQppbXBvcnQgc2VhYm9ybiBhcyBzbnMNCg0KDQpgYGANCg0KPGEgbmFtZT0iYWJjIj48L2E+DQoNClsqKkZpbiBEb2N1bWVudG8qKl0oI2RlZikNCg0KDQojIyBEaWFncmFtYXMgZGUgQmFycmFzICB7LX0NCg0KRWwgZGlhZ3JhbWEgZGUgYmFycmFzICgqKkJhciBDaGFydCoqKSBlcyB1biBncsOhZmljbyBlc3RhZMOtc3RpY28gcXVlIG5vcyBwZXJtaXRlIHJlcHJlc2VudGFyIGxhIGRpc3RyaWJ1Y2nDs24gZGUgZnJlY3VlbmNpYXMgZGUgdmFyaWFibGVzIGN1YWxpdGF0aXZhcyB5IGN1YW50aXRhdGl2YXMgZGlzY3JldGFzOyBudWVzdHJvIG9iamV0aXZvIGVzIHBhc2FyIGRlbCBsw6FwaXogeSBwYXBlbCBhbCB1c28gZGUgbG9zIGxlbmd1YWplcyBkZSBwcm9ncmFtYWNpw7NuIGByIFIudmVyc2lvbi5zdHJpbmdgW0BScHJvZ3JhbW1pbmddIHkgUHl0aG9uIGByIHB5JHZlcnNpb25gW0B2YW4xOTk1cHl0aG9uXSAsIGFzw60gY29tbyBlbCBwYXF1ZXRlICoqUk1hcmtkb3duKipbXjFdLCByZWNvbWVuZGFtb3MgbGEgbGVjdHVyYSBkZWwgbGlicm8gKipFbCBBcnRlIGRlIFByb2dyYW1hciBlbiBSKipbQHNhbnRhbmEyMDE0YXJ0ZV07IGNvbXBhcnRpbW9zIGxhIHNpZ3VpZW50ZSBpbWFnZW4gY29tbyByZWZlcmVuY2lhLg0KDQo8Y2VudGVyPg0KDQoNCiFbXShkaWFncmFtYV9iYXJyYXNfYW1hbm8uanBnKXt3aWR0aD00MDB9DQoNCjwvY2VudGVyPg0KDQoNCiMjIERhdGEgU2V0IC0gbXRjYXJzIHsudGFic2V0IC50YWJzZXQtcGlsbHN9DQoNCioqbXRjYXJzKiogZXMgdW4gZGF0YSBzZXQgcXVlIHlhIHZpZW5lIHByZWNhcmdhZG8gYWwgbW9tZW50byBkZSBpbnN0YWxhciBlbCAqKmxlbmd1YWplIGRlIHByb2dyYW1hY2nDs24gUioqIGVuIG51ZXN0cm8gc2lzdGVtYSwgaGFyZW1vcyB1c28gZGUgZGljaG8gZGF0YSBzZXQgcGFyYSBsYSBjcmVhY2nDs24gZGUgZGlzdGludG9zIGRpYWdyYW1hcyBkZSBiYXJyYXMsIGRlIGxhcyAxMSB2YXJpYWJsZXMgeSAzMiBvYnNlcnZhY2lvbmVzIHF1ZSBsbyBjb21wb25lbiBub3MgZW5mb2NhcmVtb3MgZW4gbGFzIHZhcmlhYmxlcyAqKmN5bCoqIChjaWxpbmRybykgeSAqKmdlYXIqKiAoZW5ncmFuYWplcykgY29tbyBzZSBtdWVzdHJhIGEgY29udGludWFjacOzbi4NCg0KDQojIyMgbXRjYXJzDQoNCmBgYHtyfQ0Kc3VtbWFyeShtdGNhcnMpDQoNCmBgYA0KDQoNCiMjIyB2YXJfY3lsDQoNCmBgYHtyfQ0KDQpzdW1tYXJ5KG10Y2FycyRjeWwpDQoNCg0KYGBgDQoNCg0KIyMjIHZhcl9nZWFyIHsuYWN0aXZlfQ0KDQpgYGB7cn0NCg0Kc3VtbWFyeShtdGNhcnMkZ2VhcikNCg0KDQoNCmBgYA0KDQoNCiMjIyB2YXJfY2FyYg0KDQpgYGB7cn0NCg0Kc3VtbWFyeShtdGNhcnMkY2FyYikNCg0KDQoNCmBgYA0KDQoNCg0KIyMgQmFyIENoYXJ0IC0gYmFycGxvdCgpDQoNCkxhIGZ1bmNpw7NuICBgYmFycGxvdCgpYCBub3MgcGVybWl0ZSBjcmVhciBkaWFncmFtYXMgZGUgYmFycmFzICgqKkJhciBDaGFydHMqKikgZW4gZWwgbGVuZ3VhamUgZGUgcHJvZ3JhbWFjacOzbiBSLCB1dGlsaXphcmVtb3MgbGEgdmFyaWFibGUgY3lsICgqKmNpbGluZHJvcyoqKSBwYXJhIGNyZWFyIGVsIGdyw6FmaWNvIGVzdGFkw61zdGljbyByZXNwZWN0aXZvLCBjb21vIHNlIG11ZXN0cmEgZW4gbGEgc2lndWllbnRlIGltYWdlbi4NCg0KDQoNCg0KYGBge3IgYmFycGxvdCxmaWcuYWxpZ249J2NlbnRlcicsY2xhc3Muc291cmNlPSJiZy1zdWNjZXNzIixmaWcuY2FwPSJCYXIgQ2hhcnQgY3JlYWRvIGNvbiBsYSBmdW5jacOzbiBiYXJwbG90KCkiLG91dC53aWR0aD0iNzAlIn0NCg0KeCA8LSB0YWJsZShtdGNhcnMkY3lsKQ0KDQpjb2xvcmVzIDwtIGMoIm9yYW5nZSIsImJsdWUiLCJwdXJwbGUiKQ0KDQpiYXJwbG90KHgseGxhYj0iQ2lsaW5kcm9zIix5bGFiPSJGcmVjdWVuY2lhcyIsbWFpbj0iTsO6bWVybyBkZSBDaWxpbmRyb3MiLGNvbD1jb2xvcmVzKQ0KDQpgYGANCg0KDQoNCg0KIyMgQmFyIENoYXJ0IC0gZ2dwbG90Mg0KDQoqKmdncGxvdDIqKltAZ2dwbG90Ml0gZXMgdW4gcGFxdWV0ZSBkZWwgbGVuZ3VhamUgZGUgcHJvZ3JhbWFjacOzbiBxdWUgbm9zIHBlcm1pdGUgY3JlYXIgZ3LDoWZpY29zIGVzdGFkw61zdGljb3MgZGUgZ3JhbiBjYWxpZGFkLCBoYXJlbW9zIHVzbyBkZSBsYSB2YXJpYWJsZSBjeWwgKCoqY2lsaW5kcm9zKiopIHBhcmEgbGEgY3JlYWNpw7NuIGRlbCBncsOhZmljbyBlc3RhZMOtc3RpY28gcmVzcGVjdGl2bywgY29tbyBzZSBtdWVzdHJhIGEgY29udGludWFjacOzbi4NCg0KPGRldGFpbHM+PHN1bW1hcnk+TW9zdHJhci9PY3VsdGFyIEPDs2RpZ288L3N1bW1hcnk+DQoNCmBgYHtyIGdncGxvdDIsZmlnLmFsaWduPSdjZW50ZXInfQ0KDQpjb2xvcmVzIDwtIGMoIm9yYW5nZSIsImJsdWUiLCJwdXJwbGUiKQ0KDQpnZ3Bsb3QobXRjYXJzLGFlcyhjeWwpKSArIGdlb21fYmFyKGZpbGw9Y29sb3JlcykgKyBsYWJzKHg9IkNpbGxpbmRyb3MiLHk9IkZyZWN1ZW5jaWFzIix0aXRsZT0iTsO6bWVybyBkZSBDaWxpbmRyb3MiKSArIHRoZW1lX2RhcmsoKQ0KDQoNCg0KYGBgDQoNCjwvZGV0YWlscz4NCg0KDQojIyBCYXIgQ2hhcnQgLSBMYXR0aWNlDQoNCioqTGF0dGljZSoqW0BsYXR0aWNlXSBlcyB1biBwYXF1ZXRlIGRlbCBsZW5ndWFqZSBkZSBwcm9ncmFtYWNpw7NuIFIsIHF1ZSBub3MgcGVybWl0ZSBjcmVhciBncsOhZmljb3MgZXN0YWTDrXN0aWNvcyBkZSBtdXkgYnVlbmEgY2FsaWRhZCwgbm9zIGVuZm9jYXJlbW9zIGVuIGxhIHZhcmlhYmxlIGN5bCAoKipjaWxpbmRyb3MqKikgcGFyYSBsYSBjcmVhY2nDs24gZGVsIGdyw6FmaWNvIGVzdGFkw61zdGljbyByZXNwZWN0aXZvLCBjb21vIHNlIG11ZXN0cmEgYSBjb250aW51YWNpw7NuLg0KDQpgYGB7ciBsYXR0aWNlLGZpZy5hbGlnbj0nY2VudGVyJ30NCg0KeCA8LSB0YWJsZShtdGNhcnMkY3lsKQ0KDQpiYXJjaGFydCh4LHhsYWI9IkNpbGluZHJvcyIseWxhYj0iRnJlY3VlbmNpYXMiLG1haW49Ik7Dum1lcm8gZGUgQ2lsaW5kcm9zIixjb2w9Y29sb3Jlcyxob3Jpem9udGFsPUZBTFNFKQ0KDQpgYGANCg0KDQojIyBTUUwgLSBNeVNRTA0KDQpgYGB7c3FsIGNvbm5lY3Rpb249Y291bnRyeV90YWJsZSxtYXgucHJpbnQ9MjB9DQoNCnNlbGVjdCBDb2RlLENvdW50cnlfbmFtZSxDb250aW5lbnRlIGZyb20gY291bnRyeTsNCg0KYGBgDQoNCg0KDQoNCiMjIG10Y2FycyAtIGN5bCAmIGdlYXINCg0KQSBjb250aW51YWNpw7NuLCBtb3N0cmFtb3MgY29tbyB1bmlyIGRvcyBkaWFncmFtYXMgZGUgYmFycmFzICgqKkJhciBDaGFydHMqKikgZW4gdW4gc29sbyBncsOhZmljbywgdG9tYW5kbyBjb21vIGJhc2UgZWwgZGF0YSBzZXQgKiptdGNhcnMqKiwgYXPDrSBjb21vIHN1cyB2YXJpYWJsZXMgKipjeWwqKiAoY2lsaW5kcm9zKSB5ICoqZ2VhcioqIChlbmdyYW5hamVzKS4NCg0KYGBge3IgY3lsX2dlYXIsZmlnLmFsaWduPSdjZW50ZXInfQ0KDQp5IDwtIHRhYmxlKG10Y2FycyRnZWFyKQ0KDQpwYXIobWZyb3c9YygxLDIpKQ0KDQpiYXJwbG90KHgseGxhYj0iQ2lsaW5kcm9zIix5bGFiPSJGcmVjdWVuY2lhcyIsbWFpbj0iTsO6bWVybyBkZSBDaWxpbmRyb3MiLGNvbD1jb2xvcmVzKQ0KDQpiYXJwbG90KHkseGxhYj0iRW5ncmFuYWplcyIseWxhYj0iRnJlY3VlbmNpYXMiLG1haW49Ik7Dum1lcm8gZGUgRW5ncmFuYWplcyIsY29sPXJhaW5ib3coMykpDQoNCg0KYGBgDQoNCg0KIyMgQmFyIENoYXJ0cyAtIE1hdHBsb3RsaWINCg0KKipNYXRwbG90bGliKipbQEh1bnRlcjoyMDA3XSBlcyB1bmEgbGlicmVyw61hIGRlbCBsZW5ndWFqZSBkZSBwcm9ncmFtYWNpw7NuIFB5dGhvbiwgcXVlIG5vcyBwZXJtaXRlIGNyZWFyIGdyw6FmaWNvcyBlc3RhZMOtc3RpY29zIGRlIGdyYW4gY2FsaWRhZCwgKipSTWFya2Rvd24qKltAUk1hcmtkb3duXSBub3MgcGVybWl0ZSB0cmFiYWphciBjb24gb3Ryb3MgbGVuZ3VhamVzIGRlIHByb2dyYW1hY2nDs24gdGFsZXMgY29tbyAqKkMrKywgU1FMLCBKdWxpYSoqLCBlbnRyZSBtdWNob3Mgb3Ryb3M7IGEgY29udGludWFjacOzbiBtb3N0cmFtb3MgdW4gZGlhZ3JhbWEgZGUgYmFycmFzICgqKkJhciBDaGFydCoqKSBjcmVhZG8gY29uIE1hdHBsb3RsaWIuDQoNCmBgYHtweXRob24scmVzdWx0cz0naGlkZScsY29sbGFwc2U9VFJVRSxmaWcuYWxpZ249ImNlbnRlciJ9DQoNCmVqZV94ID0gWydQeXRob24nLCAnUicsICdOb2RlLmpzJywgJ1BIUCddDQogDQoNCmVqZV95ID0gWzUwLDIwLDM1LDQ3XQ0KIA0KDQpwbHQuYmFyKGVqZV94LCBlamVfeSkNCiANCg0KcGx0LnlsYWJlbCgnQ2FudGlkYWQgZGUgdXN1YXJpb3MnKQ0KIA0KDQpwbHQueGxhYmVsKCdMZW5ndWFqZXMgZGUgcHJvZ3JhbWFjacOzbicpDQogDQoNCnBsdC50aXRsZSgnVXN1YXJpb3MgZGUgbGVuZ3VhamVzIGRlIHByb2dyYW1hY2nDs24nKQ0KIA0KDQpwbHQuc2hvdygpDQoNCg0KYGBgDQoNCg0KIyMgWW91VHViZSAtIFR1dG9yaWFsDQoNCkNvbXBhcnRpbW9zIGVsIHNpZ3VpZW50ZSB0dXRvcmlhbCB0b21hZG8gZGUgbGEgcGxhdGFmb3JtYSAqKllvdVR1YmUqKiBxdWUgbXVlc3RyYSBjb21vIGNyZWFyIGRpYWdyYW1hcyBkZSBiYXJyYXMgKCoqQmFyIENoYXJ0cyoqKSBoYWNpZW5kbyB1c28gZGUgbGEgZnVuY2nDs24gYGJhcnBsb3QoKWAgeSBlbCBwYXF1ZXRlICoqZ2dwbG90MioqIGRlbCBsZW5ndWFqZSBkZSBwcm9ncmFtYWNpw7NuIFI7dXRpbGl6YXJlbW9zIGVsIHBhcXVldGUgKip2ZW1iZWRyKipbQHZlbWJlZHJdIHBhcmEgYcOxYWRpciB1biB2w61kZW8gZGUgWW91VHViZSBhIG51ZXN0cm8gZG9jdW1lbnRvIFJNYXJrZG93bi4NCg0KYGBge3IgdmVtYmVkcn0NCg0KZW1iZWRfdXJsKCJodHRwczovL3d3dy55b3V0dWJlLmNvbS93YXRjaD92PUVreFJqMDJpYUxrJnQ9NnMiKSAlPiUgDQogIHVzZV9hbGlnbigiY2VudGVyIikNCg0KYGBgDQoNCjxkaXYgY2xhc3M9InRvY2lmeS1leHRlbmQtcGFnZSIgZGF0YS11bmlxdWU9InRvY2lmeS1leHRlbmQtcGFnZSIgc3R5bGU9ImhlaWdodDogMDsiPjwvZGl2Pg0KDQoNCg0KDQpbKipJbmljaW8gRG9jdW1lbnRvKipdKCNhYmMpDQoNCjxhIG5hbWU9ImRlZiI+PC9hPg0KDQoNCiMjIFJlZmVyZW5jaWFzIEJpYmxpb2dyw6FmaWNhcw0KDQoNCg0KW14xXTogUk1hcmtkb3duIGVzIHVuIHBhcXVldGUgZGVsIGxlbmd1YWplIGRlIHByb2dyYW1hY2nDs24gUixxdWUgbm9zIHBlcm1pdGUgY3JlYXIgZG9jdW1lbnRvcyBjaWVudMOtZmljb3MgeSB0w6ljbmljb3MgcGFyYSBsdWVnbyBjb252ZXJ0aXJsb3MgYSBmb3JtYXRvcyB0YWxlcyBjb21vIEhUTUwsUERGLCBNaWNyb3NvZnQgV29yZCBlbnRyZSBvdHJvcy4NCg0KDQoNCg0KDQoNCg0KDQoNCg==