Loading the dataset:
library(readr)
dataset <- read_csv("D:/Dropbox/MsC UABC/TESIS/Evarista/micronucleos/stats pack/2 dataset modifications/Datos Completos con LatLong.csv")
This renders a dataset with blanks from rows 52 : 79 and columns x34, x39:x68. It is important to get rid of them:
dataset <- dataset[-52:-79,-34]
dataset <- dataset[,-38:-39]
Now we have a dataset with the following dimensions: 51 rows and 37 columns.
Getting to know the data
[1] "Exposicion" "X" "Y" "# de Muestra"
[5] "Colonia" "Genero" "Edad" "Lugar de procedencia"
[9] "Estado civil" "A\xf1os viviendo en la colonia" "Distancia a CEMEX m" "Log (10) Distancia"
[13] "Escolaridad" "Trabajo" "Lugar de Trabajo Antes /Ahora" "Usa o Uso Qimicos"
[17] "Seguro Medico" "Estado de Salud" "Estilo de Vida" "Alimentaci\xf3n"
[21] "Condici\xf3n de la vivienda" "Condici\xf3n de Exteriores" "Peso en Kilos" "Estatura (m)"
[25] "Diametro Cintura (cm)" "Glucosa" "Micronucleo" "Nucleo lobulado"
[29] "Binucleadas" "Pignosis" "Cromatina Condensada" "Cariolisis"
[33] "Cariorrexis" "Estatura (m)_1" "Peso en Kilos_1" "Talla2 (m)"
[37] "IMC"
Boolean variables
- Exposicion
- Género
- Trabajo
- Usa o usó químicos
- Seguro médico
- Cariorrexis
Variables with nominal values
- Colonia
- Lugar de procedencia
- Estado Civil
- No. de muestra
- Lugar de trabajo antes/ahora (no sirve pa nada)
- Estado de salud
- Estilo de vida
- Alimentación
- Condición de la vivienda
- Condición de exteriores
Variables with ordinal values
- Años viviendo en la colonia
- Escolaridad
Variables with discrete values
- x
- y
- Edad
- Peso en \(kg\)
- Diámetro de cintura en cm
- Micronucleo
- Nucleo lobulado
- Binucleadas
- Pignosis
- Cromatina condensada
- Cariolisis
Variables with continious values
- Distancia a CEMEX m
- Log(10) distancia
- Estatura en m
- Glucosa (\(\mu g/dL\))
- Talla\(^2\) en \(m\)
- IMC
Descriptive Statistics


Correlation Matrices
The dataset comes from a study on the influence of contamination generated by a cement factory in a local population, evaluated through citotoxic damage.
Target Variables will, therefore, be:
Micronucleo
Nucleo lobulado
Binucleadas
Pignosis
Cromatina condensada
Cariolisis
Calculating to all 6 target variables:
Computing the correlation matrix:
Micronucleo Nucleo lobulado Binucleadas Pignosis Cromatina Condensada Cariolisis Cariorrexis Distancia a CEMEX m Glucosa IMC
Micronucleo 1.00 0.28 0.46 0.21 0.48 0.26 0.03 -0.42 0.42 0.22
Nucleo lobulado 0.28 1.00 0.64 0.25 -0.13 0.32 0.15 0.02 0.43 0.29
Binucleadas 0.46 0.64 1.00 0.27 0.14 0.42 0.22 -0.07 0.19 0.35
Pignosis 0.21 0.25 0.27 1.00 0.15 0.25 -0.11 -0.35 0.41 0.29
Cromatina Condensada 0.48 -0.13 0.14 0.15 1.00 0.06 -0.03 -0.35 0.13 0.12
Cariolisis 0.26 0.32 0.42 0.25 0.06 1.00 0.45 -0.14 0.55 0.38
Cariorrexis 0.03 0.15 0.22 -0.11 -0.03 0.45 1.00 0.08 0.11 0.42
Distancia a CEMEX m -0.42 0.02 -0.07 -0.35 -0.35 -0.14 0.08 1.00 -0.30 0.04
Glucosa 0.42 0.43 0.19 0.41 0.13 0.55 0.11 -0.30 1.00 0.22
IMC 0.22 0.29 0.35 0.29 0.12 0.38 0.42 0.04 0.22 1.00
Computing significance levels and visualizing the results in a formated table:
Generating a correlogram:
library(corrplot)
corrplot(res, type = "upper", order = "hclust",
tl.col = "black", tl.srt = 45)

Using INEGI data to have an idea of the magnitud of the sample, compared to the population of these colonias.
The queary was made through this link, data was downloaded in SPSS format after sekectin the state of Baja California. Since the open data provided by INEGI does not include the name of colonias, I had to manually consult the Inventario Nacional de Viviendas 2016, an interactive map with layers of information where I was able to spot the names of some of the colonies mentioned in the report I am analyzing. Once I located the colonias, the AGEB number was extracted (manually) and then the database can be manipulated:
- Industrial: 0200100017930
- Jalisco: 0200100017930
- Villa Bonita: 020010001845A
I have not been able to locate the following colonias:
- Costa Bella II
- Este
- Norte
- Oeste
- Sur
Loading SPSS data into this R project:
library(foreign)
db <- file.choose()
inegi <- read.spss(db, to.data.frame = TRUE)
Subsetting the dataframe to retain only the AGEBs of interest
- Subsetting AGEB
0200100017930 (Industrial and Jalisco):
inegi7930 <- subset(inegi, AGEB == "7930",
select=c(POBTOT, AGEB))
head(inegi7930)
This produces a table with 2 columns and 44 rows. And a total population living in this area of 4193 people.
- Subsetting AGEB
020010001845A(Villa Bonita):
inegi845A <- subset(inegi, AGEB == "845A",
select=c(POBTOT, AGEB))
head(inegi845A)
This produces a table with 2 columns and 32 rows. And a total population living in this area of 2254 people.
Considering the data accuired from INEGI and, according to the law of large numbers we can make the following declarations:
- For the Industrial and Jalisco, AGEB 7930:
- The percentage of the population tested (including controls) was 1.049368%
- For Villa Bonita, AGEB 845A:
- The percentage of the population tested (including controls) was 1.4196983 %.
Chart of Correlation Matrix

LS0tDQp0aXRsZTogIkRyYSBFdmFyaXN0YbRzIERhdGEgRXhwbG9yYXRpb24iDQphdXRob3I6ICJCeSBUdXR6aXBvcCINCm91dHB1dDoNCiAgaHRtbF9ub3RlYm9vazogZGVmYXVsdA0KLS0tDQoNCjwhLS0tIFR1dG9yaWFscyB1c2VkOg0KaHR0cDovL3d3dy5zdGhkYS5jb20vZW5nbGlzaC93aWtpL2NvcnJlbGF0aW9uLW1hdHJpeC1hLXF1aWNrLXN0YXJ0LWd1aWRlLXRvLWFuYWx5emUtZm9ybWF0LWFuZC12aXN1YWxpemUtYS1jb3JyZWxhdGlvbi1tYXRyaXgtdXNpbmctci1zb2Z0d2FyZQ0KaHR0cDovL3d3dy5zdGhkYS5jb20vZW5nbGlzaC93aWtpL2NvcnJlbGF0aW9uLW1hdHJpeC1hbi1yLWZ1bmN0aW9uLXRvLWRvLWFsbC15b3UtbmVlZA0KaHR0cDovL3d3dy5zdGhkYS5jb20vZW5nbGlzaC93aWtpL3Zpc3VhbGl6ZS1jb3JyZWxhdGlvbi1tYXRyaXgtdXNpbmctc3ltbnVtLWZ1bmN0aW9uDQpodHRwOi8vd3d3LnN0aGRhLmNvbS9lbmdsaXNoL3dpa2kvY29ycmVsYXRpb24tbWF0cml4LWEtcXVpY2stc3RhcnQtZ3VpZGUtdG8tYW5hbHl6ZS1mb3JtYXQtYW5kLXZpc3VhbGl6ZS1hLWNvcnJlbGF0aW9uLW1hdHJpeC11c2luZy1yLXNvZnR3YXJlDQpjb29yZGVuYWRhcyBVVE0NCi0tLT4NCg0KDQo8YnIgXD48YnIgXD4NCkxvYWRpbmcgdGhlIGRhdGFzZXQ6DQoNCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpsaWJyYXJ5KHJlYWRyKQ0KZGF0YXNldCA8LSByZWFkX2NzdigiRDovRHJvcGJveC9Nc0MgVUFCQy9URVNJUy9FdmFyaXN0YS9taWNyb251Y2xlb3Mvc3RhdHMgcGFjay8yIGRhdGFzZXQgbW9kaWZpY2F0aW9ucy9EYXRvcyBDb21wbGV0b3MgY29uIExhdExvbmcuY3N2IikNCg0KYGBgDQoNClRoaXMgcmVuZGVycyBhIGBkYXRhc2V0YCB3aXRoIGJsYW5rcyBmcm9tIHJvd3MgNTIgOiA3OSBhbmQgY29sdW1ucyBgeDM0YCwgYHgzOTp4NjhgLiBJdCBpcyBpbXBvcnRhbnQgdG8gZ2V0IHJpZCBvZiB0aGVtOg0KYGBge3IsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpkYXRhc2V0IDwtIGRhdGFzZXRbLTUyOi03OSwtMzRdDQpkYXRhc2V0IDwtIGRhdGFzZXRbLC0zODotMzldDQpgYGANCg0KYGBge3IsIGluY2x1ZGU9RkFMU0V9DQojU2F2aW5nIHRoZSB0aWR5ZGF0YXNldDoNCnNldHdkKCJEOi9Ecm9wYm94L01zQyBVQUJDL1RFU0lTL0V2YXJpc3RhL21pY3JvbnVjbGVvcy9zdGF0cyBwYWNrLzMgdGlkeSIpDQp3cml0ZS5jc3YoZGF0YXNldCxmaWxlID0gInRpZHlfZGF0YXNldC5jc3YiKQ0KYGBgDQoNCk5vdyB3ZSBoYXZlIGEgZGF0YXNldCB3aXRoIHRoZSBmb2xsb3dpbmcgZGltZW5zaW9uczogNTEgcm93cyBhbmQgMzcgY29sdW1ucy4NCg0KIyNHZXR0aW5nIHRvIGtub3cgdGhlIGRhdGENCg0KICAtIE5hbWVzIG9mIHRoZSB2YXJpYWJsZXM6DQpgYGB7ciBlY2hvPUZBTFNFfQ0KY29sbmFtZXMoZGF0YXNldCkNCmBgYA0KDQojIyNCb29sZWFuIHZhcmlhYmxlcw0KDQogIDEuIEV4cG9zaWNpb24NCiAgMS4gR+luZXJvDQogIDEuIFRyYWJham8NCiAgMS4gVXNhIG8gdXPzIHF17W1pY29zDQogIDEuIFNlZ3VybyBt6WRpY28NCiAgMS4gQ2FyaW9ycmV4aXMNCg0KIyMjVmFyaWFibGVzIHdpdGggbm9taW5hbCB2YWx1ZXMNCiAgMS4gQ29sb25pYQ0KICAxLiBMdWdhciBkZSBwcm9jZWRlbmNpYQ0KICAxLiBFc3RhZG8gQ2l2aWwNCiAgMS4gTm8uIGRlIG11ZXN0cmENCiAgMS4gTHVnYXIgZGUgdHJhYmFqbyBhbnRlcy9haG9yYSAobm8gc2lydmUgcGEgbmFkYSkNCiAgMS4gKkVzdGFkbyBkZSBzYWx1ZCoNCiAgMS4gKkVzdGlsbyBkZSB2aWRhKg0KICAxLiAqQWxpbWVudGFjafNuKg0KICAxLiAqQ29uZGljafNuIGRlIGxhIHZpdmllbmRhKg0KICAxLiAqQ29uZGljafNuIGRlIGV4dGVyaW9yZXMqDQogIA0KIyMjVmFyaWFibGVzIHdpdGggb3JkaW5hbCB2YWx1ZXMNCiAgMS4gQfFvcyB2aXZpZW5kbyBlbiBsYSBjb2xvbmlhDQogIDEuIEVzY29sYXJpZGFkICANCg0KIyMjVmFyaWFibGVzIHdpdGggZGlzY3JldGUgdmFsdWVzDQogIDEuIHgNCiAgMS4geQ0KICAxLiBFZGFkDQogIDEuIFBlc28gZW4gJGtnJA0KICAxLiBEacOhbWV0cm8gZGUgY2ludHVyYSBlbiAqY20qDQogIDEuIE1pY3JvbnVjbGVvDQogIDEuIE51Y2xlbyBsb2J1bGFkbw0KICAxLiBCaW51Y2xlYWRhcw0KICAxLiBQaWdub3Npcw0KICAxLiBDcm9tYXRpbmEgY29uZGVuc2FkYQ0KICAxLiBDYXJpb2xpc2lzDQogIA0KDQojIyNWYXJpYWJsZXMgd2l0aCBjb250aW5pb3VzIHZhbHVlcw0KICAxLiBEaXN0YW5jaWEgYSBDRU1FWCAqbSoNCiAgMS4gTG9nKDEwKSBkaXN0YW5jaWENCiAgMS4gRXN0YXR1cmEgZW4gbQ0KICAxLiBHbHVjb3NhICgkXG11IGcvZEwkKQ0KICAxLiBUYWxsYSReMiQgZW4gJG0kDQogIDEuIElNQw0KDQojI0Rlc2NyaXB0aXZlIFN0YXRpc3RpY3MNCg0KYGBge3IgZWNobz1GQUxTRX0NCmxpYnJhcnkoZ2dwbG90MikNCg0KYSA8LSBnZ3Bsb3QoZGF0YXNldCwgYWVzKENvbG9uaWEpKQ0KYStnZW9tX2JhcigNCiAgZmlsbCA9ICduYXZ5Ymx1ZScpICsNCiAgbGFicyh0aXRsZSA9ICJEaXN0cmlidXRpb24gYnkgQ29sb25pYXMiLCB4ID0gIkNvbG9uaWFzIiwgeSA9ICJDb3VudCIpDQpgYGANCg0KDQpgYGB7ciwgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCmdwcyA8LSByZWFkLmNzdigiRDovRHJvcGJveC9Nc0MgVUFCQy9URVNJUy9FdmFyaXN0YS9taWNyb251Y2xlb3Mvc3RhdHMgcGFjay8yIGRhdGFzZXQgbW9kaWZpY2F0aW9ucy9jb29yZGVuYWRhcyB0cmFuc2Zvcm1hZGFzLmNzdiIsDQogICAgICAgICAgICAgICAgaGVhZGVyID0gVFJVRSkNCg0KbGlicmFyeShnZ21hcCkNCm1hcEltYWdlRGF0YSA8LSBnZXRfbWFwKGxvY2F0aW9uID0gYyhsb24gPSBtZWFuKGdwcyRsb25nKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXQgPSAzMS44NjY3KSwNCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yID0gImNvbG9yIiwgIyBvciBidw0KICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlID0gImdvb2dsZSIsDQogICAgICAgICAgICAgICAgICAgICAgICBtYXB0eXBlID0gInJvYWRtYXAiLA0KICAgICAgICAgICAgICAgICAgICAgICAgIyBhcGlfa2V5ID0gInlvdXJfYXBpX2tleSIsICMgb25seSBuZWVkZWQgZm9yIHNvdXJjZSA9ICJjbG91ZG1hZGUiDQogICAgICAgICAgICAgICAgICAgICAgICB6b29tID0gMTMpDQplbnNlbmFkYW1hcCA8LSBnZ21hcChtYXBJbWFnZURhdGEsDQogICAgICAgICAgICAgICAgICAgICBleHRlbnQgPSAicGFuZWwiLA0KICAgICAgICAgICAgICAgICAgICAgbGVnZW5kID0gInRvcHJpZ2h0IikNCg0KZW5zZW5hZGFtYXAgKw0KICBnZW9tX3BvaW50KA0KICAgIGFlcyh4ID0gWSwgeSA9IFgsIGNvbG91ciA9IEdlbmVybyksDQogICAgZGF0YSA9IGRhdGFzZXQpICsNCiAgZ2d0aXRsZSgiR2VvZ3JhcGhpY2FsIERpc3RyaWJ1dGlvbiBvZiBQYXJ0aWNpcGFudHMiKSArDQogIGxhYnMoeCA9ICJsb25naXR1ZGUiLCB5ID0gImxhdGl0dWQiKQ0KDQpgYGANCg0KDQojIyNDb3JyZWxhdGlvbiBNYXRyaWNlcw0KDQo8IS0tLSB0dXRvcmlhbCBJIHVzZWQgdG8gY3JlYXRlIHRoaXM6IGh0dHA6Ly93d3cuc3RoZGEuY29tL2VuZ2xpc2gvd2lraS9jb3JyZWxhdGlvbi1tYXRyaXgtYS1xdWljay1zdGFydC1ndWlkZS10by1hbmFseXplLWZvcm1hdC1hbmQtdmlzdWFsaXplLWEtY29ycmVsYXRpb24tbWF0cml4LXVzaW5nLXItc29mdHdhcmUgLS0tPg0KDQpUaGUgYGRhdGFzZXRgIGNvbWVzIGZyb20gYSBzdHVkeSBvbiB0aGUgaW5mbHVlbmNlIG9mIGNvbnRhbWluYXRpb24gZ2VuZXJhdGVkIGJ5IGEgY2VtZW50IGZhY3RvcnkgaW4gYSBsb2NhbCBwb3B1bGF0aW9uLCBldmFsdWF0ZWQgdGhyb3VnaCBjaXRvdG94aWMgZGFtYWdlLiA8YnIgXD4NCioqVGFyZ2V0IFZhcmlhYmxlcyoqIHdpbGwsIHRoZXJlZm9yZSwgYmU6DQoNCiAgLSBgTWljcm9udWNsZW9gDQogIC0gYE51Y2xlbyBsb2J1bGFkb2ANCiAgLSBgQmludWNsZWFkYXNgDQogIC0gYFBpZ25vc2lzYA0KICAtIGBDcm9tYXRpbmEgY29uZGVuc2FkYWANCiAgLSBgQ2FyaW9saXNpc2ANCiAgDQojIyMjQ2FsY3VsYXRpbmcgdG8gYWxsIDYgdGFyZ2V0IHZhcmlhYmxlczoNCg0KYGBge3IsIGluY2x1ZGU9RkFMU0V9DQpkYXRhc2V0X21pY3JvbnVjbGVvIDwtIGRhdGFzZXRbLGMoIk1pY3JvbnVjbGVvIiwiTnVjbGVvIGxvYnVsYWRvIiwiQmludWNsZWFkYXMiLCJQaWdub3NpcyIsIkNyb21hdGluYSBDb25kZW5zYWRhIiwiQ2FyaW9saXNpcyIsIkNhcmlvcnJleGlzIiwiRGlzdGFuY2lhIGEgQ0VNRVggbSIsICJHbHVjb3NhIiwiSU1DIildDQpgYGANCg0KQ29tcHV0aW5nIHRoZSBjb3JyZWxhdGlvbiBtYXRyaXg6DQoNCmBgYHtyIGVjaG89RkFMU0V9DQpyZXMgPC0gY29yKGRhdGFzZXRfbWljcm9udWNsZW8sIHVzZSA9ICJjb21wbGV0ZS5vYnMiKSAjdGhpcyBpbmNsdWRlcyBpbiB0aGUgY29tcHV0YXRpb24gdmFyaWFibGVzIHdpdGggTkEgdmFsdWVzLg0Kcm91bmQocmVzLCAyKQ0KYGBgDQoNCkNvbXB1dGluZyBzaWduaWZpY2FuY2UgbGV2ZWxzIGFuZCB2aXN1YWxpemluZyB0aGUgcmVzdWx0cyBpbiBhIGZvcm1hdGVkIHRhYmxlOg0KDQpgYGB7ciBpbmNsdWRlPUZBTFNFfQ0KbGlicmFyeSgiSG1pc2MiKQ0KcmVzMiA8LSByY29ycihhcy5tYXRyaXgoZGF0YXNldF9taWNyb251Y2xlbykpDQpgYGANCg0KYGBge3IgZWNobz1GQUxTRX0NCiMgKysrKysrKysrKysrKysrKysrKysrKysrKysrKw0KIyBmbGF0dGVuQ29yck1hdHJpeA0KIyArKysrKysrKysrKysrKysrKysrKysrKysrKysrDQojIGNvcm1hdCA6IG1hdHJpeCBvZiB0aGUgY29ycmVsYXRpb24gY29lZmZpY2llbnRzDQojIHBtYXQgOiBtYXRyaXggb2YgdGhlIGNvcnJlbGF0aW9uIHAtdmFsdWVzDQpmbGF0dGVuQ29yck1hdHJpeCA8LSBmdW5jdGlvbihjb3JtYXQsIHBtYXQpIHsNCiAgdXQgPC0gdXBwZXIudHJpKGNvcm1hdCkNCiAgZGF0YS5mcmFtZSgNCiAgICByb3cgPSByb3duYW1lcyhjb3JtYXQpW3Jvdyhjb3JtYXQpW3V0XV0sDQogICAgY29sdW1uID0gcm93bmFtZXMoY29ybWF0KVtjb2woY29ybWF0KVt1dF1dLA0KICAgIGNvciAgPShjb3JtYXQpW3V0XSwNCiAgICBwID0gcG1hdFt1dF0NCiAgICApDQp9DQoNCmxpYnJhcnkoSG1pc2MpDQpyZXMyPC1yY29ycihhcy5tYXRyaXgoZGF0YXNldF9taWNyb251Y2xlbykpDQpmbGF0dGVuQ29yck1hdHJpeChyZXMyJHIsIHJlczIkUCkNCmBgYA0KDQpHZW5lcmF0aW5nIGEgKioqY29ycmVsb2dyYW0qKio6DQoNCmBgYHtyfQ0KbGlicmFyeShjb3JycGxvdCkNCmNvcnJwbG90KHJlcywgdHlwZSA9ICJ1cHBlciIsIG9yZGVyID0gImhjbHVzdCIsIA0KICAgICAgICAgdGwuY29sID0gImJsYWNrIiwgdGwuc3J0ID0gNDUpDQpgYGANCg0KIyMjVXNpbmcgKklORUdJKiBkYXRhIHRvIGhhdmUgYW4gaWRlYSBvZiB0aGUgbWFnbml0dWQgb2YgdGhlIHNhbXBsZSwgY29tcGFyZWQgdG8gdGhlIHBvcHVsYXRpb24gb2YgdGhlc2UgKmNvbG9uaWFzKi4NCg0KVGhlIHF1ZWFyeSB3YXMgbWFkZSB0aHJvdWdoIFt0aGlzIGxpbmtdKGh0dHA6Ly93d3czLmluZWdpLm9yZy5teC9zaXN0ZW1hcy9taWNyb2RhdG9zL2RlZmF1bHRfdXJiYW5vLmFzcHgpLCBkYXRhIHdhcyBkb3dubG9hZGVkIGluIFNQU1MgZm9ybWF0IGFmdGVyIHNla2VjdGluIHRoZSBzdGF0ZSBvZiAqQmFqYSBDYWxpZm9ybmlhKi4gU2luY2UgdGhlIG9wZW4gZGF0YSBwcm92aWRlZCBieSBJTkVHSSBkb2VzIG5vdCBpbmNsdWRlIHRoZSBuYW1lIG9mICpjb2xvbmlhcyosIEkgaGFkIHRvIG1hbnVhbGx5IGNvbnN1bHQgdGhlICpJbnZlbnRhcmlvIE5hY2lvbmFsIGRlIFZpdmllbmRhcyAyMDE2KiwgYW4gaW50ZXJhY3RpdmUgbWFwIHdpdGggbGF5ZXJzIG9mIGluZm9ybWF0aW9uIHdoZXJlIEkgd2FzIGFibGUgdG8gc3BvdCB0aGUgbmFtZXMgb2YgKipzb21lKiogb2YgdGhlIGNvbG9uaWVzIG1lbnRpb25lZCBpbiB0aGUgcmVwb3J0IEkgYW0gYW5hbHl6aW5nLiBPbmNlIEkgbG9jYXRlZCB0aGUgKmNvbG9uaWFzKiwgdGhlICoqQUdFQioqIG51bWJlciB3YXMgZXh0cmFjdGVkIChtYW51YWxseSkgYW5kIHRoZW4gdGhlIGRhdGFiYXNlIGNhbiBiZSBtYW5pcHVsYXRlZDoNCg0KPCEtLSBBR0VCUw0KaHR0cDovL3d3dy5iZXRhLmluZWdpLm9yZy5teC9hcHAvbWFwYS9pbnYvDQoNCi0gQ29zdGEgQmVsbGEgSUk6DQotIEVzdGU6DQotIEluZHVzdHJpYWw6IDAyMDAxMDAwMTc5MzANCi0gSmFsaXNjbzogMDIwMDEwMDAxNzkzMA0KLSBOb3J0ZToNCi0gT2VzdGU6DQotIFN1cjoNCi0gVmlsbGEgQm9uaXRhOiAwMjAwMTAwMDE4NDVBDQotLS0+DQoNCiAgLSBJbmR1c3RyaWFsOiAwMjAwMTAwMDEqKjc5MzAqKg0KICAtIEphbGlzY286IDAyMDAxMDAwMSoqNzkzMCoqDQogIC0gVmlsbGEgQm9uaXRhOiAwMjAwMTAwMDEqKjg0NUEqKg0KDQpJIGhhdmUgbm90IGJlZW4gYWJsZSB0byBsb2NhdGUgdGhlIGZvbGxvd2luZyAqY29sb25pYXMqOg0KDQogIC0gQ29zdGEgQmVsbGEgSUkNCiAgLSBFc3RlDQogIC0gTm9ydGUNCiAgLSBPZXN0ZQ0KICAtIFN1cg0KDQojIyMjTG9hZGluZyBTUFNTIGRhdGEgaW50byB0aGlzIFIgcHJvamVjdDoNCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KbGlicmFyeShmb3JlaWduKQ0KZGIgPC0gZmlsZS5jaG9vc2UoKQ0KaW5lZ2kgPC0gcmVhZC5zcHNzKGRiLCB0by5kYXRhLmZyYW1lID0gVFJVRSkNCmBgYA0KPGJyIFw+DQoNCiMjIyNTdWJzZXR0aW5nIHRoZSBkYXRhZnJhbWUgdG8gcmV0YWluIG9ubHkgdGhlIEFHRUJzIG9mIGludGVyZXN0DQo8YnIgXD4NCg0KICAtIFN1YnNldHRpbmcgQUdFQiBgMDIwMDEwMDAxNzkzMGAgKEluZHVzdHJpYWwgYW5kIEphbGlzY28pOg0KICANCmBgYHtyfQ0KaW5lZ2k3OTMwIDwtIHN1YnNldChpbmVnaSwgQUdFQiA9PSAiNzkzMCIsIA0Kc2VsZWN0PWMoUE9CVE9ULCBBR0VCKSkNCmhlYWQoaW5lZ2k3OTMwKQ0KYGBgDQoNClRoaXMgcHJvZHVjZXMgYSB0YWJsZSB3aXRoICoqYHIgbmNvbChpbmVnaTc5MzApYCoqIGNvbHVtbnMgYW5kICoqYHIgbnJvdyhpbmVnaTc5MzApYCoqIHJvd3MuIEFuZCBhICoqdG90YWwgcG9wdWxhdGlvbioqIGxpdmluZyBpbiB0aGlzIGFyZWEgb2YgKipgciBzdW0oaW5lZ2k3OTMwJFBPQlRPVClgKiogcGVvcGxlLg0KDQoNCiAgLSBTdWJzZXR0aW5nIEFHRUIgYDAyMDAxMDAwMTg0NUFgKFZpbGxhIEJvbml0YSk6DQpgYGB7cn0NCmluZWdpODQ1QSA8LSBzdWJzZXQoaW5lZ2ksIEFHRUIgPT0gIjg0NUEiLCANCnNlbGVjdD1jKFBPQlRPVCwgQUdFQikpDQpoZWFkKGluZWdpODQ1QSkNCmBgYA0KDQpUaGlzIHByb2R1Y2VzIGEgdGFibGUgd2l0aCAqKmByIG5jb2woaW5lZ2k4NDVBKWAqKiBjb2x1bW5zIGFuZCAqKmByIG5yb3coaW5lZ2k4NDVBKWAqKiByb3dzLiBBbmQgYSAqKnRvdGFsIHBvcHVsYXRpb24qKiBsaXZpbmcgaW4gdGhpcyBhcmVhIG9mICoqYHIgc3VtKGluZWdpODQ1QSRQT0JUT1QpYCoqIHBlb3BsZS4NCjxiciBcPg0KDQpDb25zaWRlcmluZyB0aGUgZGF0YSBhY2N1aXJlZCBmcm9tIElORUdJIGFuZCwgYWNjb3JkaW5nIHRvIHRoZSAqKmxhdyBvZiBsYXJnZSBudW1iZXJzKiogd2UgY2FuIG1ha2UgdGhlIGZvbGxvd2luZyBkZWNsYXJhdGlvbnM6DQoNCiAgLSBGb3IgdGhlICpJbmR1c3RyaWFsKiBhbmQgICpKYWxpc2NvKiwgQUdFQiA3OTMwOg0KICAgIC0gVGhlIHBlcmNlbnRhZ2Ugb2YgdGhlIHBvcHVsYXRpb24gdGVzdGVkIChpbmNsdWRpbmcgY29udHJvbHMpIHdhcyAqKmByICg0NC9zdW0oaW5lZ2k3OTMwJFBPQlRPVCkpKjEwMGAlICoqDQogIC0gRm9yICpWaWxsYSBCb25pdGEqLCBBR0VCIDg0NUE6DQogICAgLSBUaGUgcGVyY2VudGFnZSBvZiB0aGUgcG9wdWxhdGlvbiB0ZXN0ZWQgKGluY2x1ZGluZyBjb250cm9scykgd2FzICoqYHIgKDMyL3N1bShpbmVnaTg0NUEkUE9CVE9UKSkqMTAwYCAlKiouDQoNCjxiciBcPg0KDQojIyMjQ2hhcnQgb2YgQ29ycmVsYXRpb24gTWF0cml4ICANCg0KYGBge3IsIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpsaWJyYXJ5KCJQZXJmb3JtYW5jZUFuYWx5dGljcyIpDQpjaGFydC5Db3JyZWxhdGlvbihkYXRhc2V0X21pY3JvbnVjbGVvLCBoaXN0b2dyYW09VFJVRSwgcGNoPTE5KQ0KYGBg