Primero, traemos la base de datos solicitada
library(rio)
link="https://github.com/DataPolitica/salidas/raw/master/Data/Cajamarca.sav"
Cajamarca=import(link)
- Creamos una subdata con las variables a factorizar
subdata <- Cajamarca[,c(2:10)]
- Primero realizamos la matriz de correlaciones y el gráfico respectivo. ¿qué podemos visualizar?

Si tomamos en consideración, la significancia.
ggcorrplot(matriz_corr,
p.mat = cor_pmat(matriz_corr),
insig = "blank")

round(matriz_corr, 2)
prural desnutcr mortinf analfab inasiesc nintrab hacinam sinagua
prural 1.00 0.68 0.03 0.45 0.23 0.01 0.47 0.98
desnutcr 0.68 1.00 0.40 0.63 0.55 0.16 0.53 0.62
mortinf 0.03 0.40 1.00 0.47 0.70 0.56 0.23 0.03
analfab 0.45 0.63 0.47 1.00 0.76 0.30 0.60 0.41
inasiesc 0.23 0.55 0.70 0.76 1.00 0.78 0.37 0.20
nintrab 0.01 0.16 0.56 0.30 0.78 1.00 -0.07 -0.03
hacinam 0.47 0.53 0.23 0.60 0.37 -0.07 1.00 0.46
sinagua 0.98 0.62 0.03 0.41 0.20 -0.03 0.46 1.00
sindesag 0.88 0.50 -0.05 0.30 0.10 -0.01 0.21 0.91
sindesag
prural 0.88
desnutcr 0.50
mortinf -0.05
analfab 0.30
inasiesc 0.10
nintrab -0.01
hacinam 0.21
sinagua 0.91
sindesag 1.00
RPTA De acuerdo con lo observado, vemos que existe la correlación entre las mismas variables. Hay un par de nubes con una correlación relativamente fuerte que podría indicarnos la presencia de entre 3 o 4 factores. Los siguientes pasos nos ayudarán a esclarecer esto. Pareciera que hay variables que guardan entre ellas una correlación fuerte, como sería el caso de % de vivienda sin agua y % de población rural.
- Realizamos el diagnóstico de la matriz de correlaciones. ¿Existen problemas? ¿cuáles son?
Test de Kaiser, Meyer - Olkin
library(psych)
KMO(matriz_corr) #útil si MSA es mayor a 0.6
Kaiser-Meyer-Olkin factor adequacy
Call: KMO(r = matriz_corr)
Overall MSA = 0.4
MSA for each item =
prural desnutcr mortinf analfab inasiesc nintrab hacinam sinagua sindesag
0.42 0.40 0.54 0.38 0.37 0.22 0.72 0.40 0.48
Segundo, verificamos si la matriz de correlaciones es adecuada. Para ello, se tienen dos funciones:
- Test de Bartlett: H0: La matriz de correlacion es una matriz identidad.
cortest.bartlett(matriz_corr,n=nrow(subdata))$p.value>0.05
[1] FALSE
#Se rechaza la H0, por lo que la correlación no es solo con la variable misma, es decir, no es una matriz identidad.
- Test For Singular Square Matrix: H0: La matriz de correlacion es una matriz singular
library(matrixcalc)
is.singular.matrix(matriz_corr)
[1] FALSE
#Rechazamos la hipótesis nula si sale FALSE
RPTA: El Overall MSA nos sale igual a 0.4, esto podría implicar un problema pues nuestro análisis factorial exploratorio podría ser un tanto problemático o inadecuado si este valor es menor a 0.5. Cuando realizamos la verificación mediante el test de identidad y singularidad, rechazamos la hipótesis nula, por lo que no habría problema alguno en ese sentido.
- Identificamos el número de factores recomendados y calculamos el análisis factorial
factorial <- fa(subdata,nfactors = 2,cor = 'mixed',rotate = "varimax",fm="minres")
The estimated weights for the factor scores are probably incorrect. Try a different factor score estimation method.An ultra-Heywood case was detected. Examine the results carefully
Visualizamos el resultado inicial:
print(factorial$loadings)
Loadings:
MR1 MR2
prural 0.999
desnutcr 0.661 0.451
mortinf 0.747
analfab 0.460 0.659
inasiesc 0.185 1.000
nintrab 0.663
hacinam 0.470 0.299
sinagua 0.992
sindesag 0.843
MR1 MR2
SS loadings 3.603 2.733
Proportion Var 0.400 0.304
Cumulative Var 0.400 0.704
RPTA: El número de factores recomendados es 2. A partir de ello, creamos una data EFA que nos indique los elementos que compone dicho análisis factorial. Al visualizar el resultado obtenido, podemos ver que el factor 1 explica el 40% del modelo, mientras que el 2 explica el 30%. Hay que tener en consideración que hay variables que aportan, en distinta medidad, a ambos factores.
- Exploramos el AFE calculado. ¿Qué notamos en el resultado mejorado (realizando un corte al 0.5)?
print(factorial$loadings,cutoff = 0.5) #0.5 siguiendo la interpretación de la correlación.
Loadings:
MR1 MR2
prural 0.999
desnutcr 0.661
mortinf 0.747
analfab 0.659
inasiesc 1.000
nintrab 0.663
hacinam
sinagua 0.992
sindesag 0.843
MR1 MR2
SS loadings 3.603 2.733
Proportion Var 0.400 0.304
Cumulative Var 0.400 0.704
RPTA: Notamos que variables como %de población rural, % de desnutrición crónica, % de población sin servicio de agua y sin desagüe se agrupan en un mismo factor. Por otro lado, variables tales como analgabetismo, inasistencia escolar, mortalidad infantil y niños que trabajan se agrupan en el segundo factor. En todos los casos (pues son mayores de 0.6) podríamos decir que las variables aportan bastante al modelo.
- Veamos el diagrama de la distribución de las variables según factores
fa.diagram(factorial)

- Realizamos una evaluación del Análisis Factorial solicitado. Indicamos qué variable aporta más a los factores creados
Comenzamos con la raíz de error cuadrático. EstaComprueba validez del factorial. Si no sale cerca a cero, el análisis no es suficientemente válido. Hay que reportar. - ¿La Raíz del error cuadrático medio corregida está cerca a cero?
factorial$crms
[1] 0.1021802
RPTA No se acerca tanto a 0, pues el valor que nos arroja es 0.1. Es importante mencionarlo pues puede que el análisis no sea lo suficientemente válido.
- ¿La Raíz del error cuadrático medio de aproximación es menor a 0.05? (UPPER MENOR A 0.05)
factorial$RMSEA
RMSEA lower upper confidence
0.1364794 0.0000000 0.3202334 0.9000000
RPTA El valor de RMSEA parece indicarnos que hay una suerte de problema de validez, pues el valor de la raíz del error cuadrático medio de aproximación es 0.1364794.
- ¿El índice de Tucker-Lewis es mayor a 0.9?
factorial$TLI
[1] 0.7525446
#Varias regresiones para determinar cuál es el factor que explique mejor la variabilidad de cada una de las variables.
RPTA: El hecho de que sea menor a 0.9, nos indica que hay un problema.
¿Qué variables aportaron más a los factores?
sort(factorial$communality)
hacinam nintrab mortinf desnutcr analfab sindesag sinagua prural
0.3100542 0.4456448 0.5577819 0.6406220 0.6456363 0.7163766 0.9847289 0.9994019
inasiesc
1.0350391
RPTA Podríamos considerar que las variables que aportan más a los factores son % de la población sin servicio de agua, % de la población rural y % de niños que no asisten a la escuela. Respecto al factor 1, población rural y población sin agua son los que aportan más. En el caso del factor 2, es la inasistencia a la escuela.
- Colocamos los factores encontrados como variables en la base de datos y presente los principales descriptivos.
RPTA: Podemos consiserar que, con respecto al factor 1, el mínimo es -2.0182, la mediana es 0.5141 y el valor máximo es de 1.1390. En el caso del factor 2, el mínimo es -2.04658, la mediana es -0.0049 y el valor máximo es 2.23909
factorial_casos<-as.data.frame(factorial$scores) #Creamos la data
head(factorial_casos)
summary(factorial_casos) #Pedimos los principales descriptivos.
MR1 MR2
Min. :-2.0182 Min. :-2.04658
1st Qu.:-0.4092 1st Qu.:-1.07783
Median : 0.5141 Median :-0.00491
Mean : 0.0000 Mean : 0.00000
3rd Qu.: 0.7217 3rd Qu.: 0.29312
Max. : 1.1390 Max. : 2.23909
LS0tCnRpdGxlOiAiUGFzb3MgcGFyYSBFRkEiCm91dHB1dDogaHRtbF9ub3RlYm9vawotLS0KClByaW1lcm8sIHRyYWVtb3MgbGEgYmFzZSBkZSBkYXRvcyBzb2xpY2l0YWRhCmBgYHtyfQpsaWJyYXJ5KHJpbykKbGluaz0iaHR0cHM6Ly9naXRodWIuY29tL0RhdGFQb2xpdGljYS9zYWxpZGFzL3Jhdy9tYXN0ZXIvRGF0YS9DYWphbWFyY2Euc2F2IgpDYWphbWFyY2E9aW1wb3J0KGxpbmspCmBgYAoKMSkgQ3JlYW1vcyB1bmEgc3ViZGF0YSBjb24gbGFzIHZhcmlhYmxlcyBhIGZhY3Rvcml6YXIKYGBge3J9CnN1YmRhdGEgPC0gQ2FqYW1hcmNhWyxjKDI6MTApXSAjU0FDQU1PUyBMT1MgTk9NQlJFUwpgYGAKCjIpIFByaW1lcm8gcmVhbGl6YW1vcyBsYSBtYXRyaXogZGUgY29ycmVsYWNpb25lcyB5IGVsIGdyw6FmaWNvIHJlc3BlY3Rpdm8uIMK/cXXDqSBwb2RlbW9zIHZpc3VhbGl6YXI/CmBgYHtyfQpsaWJyYXJ5KHBvbHljb3IpCm1hdHJpejwtaGV0Y29yKHN1YmRhdGEpCm1hdHJpel9jb3JyPC0gbWF0cml6JGNvcnJlbGF0aW9ucwpsaWJyYXJ5KGdnY29ycnBsb3QpCmdnY29ycnBsb3QobWF0cml6X2NvcnIpCmBgYApTaSB0b21hbW9zIGVuIGNvbnNpZGVyYWNpw7NuLCBsYSBzaWduaWZpY2FuY2lhLiAKYGBge3J9CmdnY29ycnBsb3QobWF0cml6X2NvcnIsCiAgICAgICAgICAgcC5tYXQgPSBjb3JfcG1hdChtYXRyaXpfY29yciksCiAgICAgICAgICAgaW5zaWcgPSAiYmxhbmsiKQpyb3VuZChtYXRyaXpfY29yciwgMikKYGBgCipSUFRBKiBEZSBhY3VlcmRvIGNvbiBsbyBvYnNlcnZhZG8sIHZlbW9zIHF1ZSBleGlzdGUgbGEgY29ycmVsYWNpw7NuIGVudHJlIGxhcyBtaXNtYXMgdmFyaWFibGVzLiBIYXkgdW4gcGFyIGRlIG51YmVzIGNvbiB1bmEgY29ycmVsYWNpw7NuIHJlbGF0aXZhbWVudGUgZnVlcnRlIHF1ZSBwb2Ryw61hIGluZGljYXJub3MgbGEgcHJlc2VuY2lhIGRlICBlbnRyZSAzIG8gNCBmYWN0b3Jlcy4gTG9zIHNpZ3VpZW50ZXMgcGFzb3Mgbm9zIGF5dWRhcsOhbiBhIGVzY2xhcmVjZXIgZXN0by4gUGFyZWNpZXJhIHF1ZSBoYXkgdmFyaWFibGVzIHF1ZSBndWFyZGFuIGVudHJlIGVsbGFzIHVuYSBjb3JyZWxhY2nDs24gZnVlcnRlLCBjb21vIHNlcsOtYSBlbCBjYXNvIGRlICUgZGUgdml2aWVuZGEgc2luIGFndWEgeSAlIGRlIHBvYmxhY2nDs24gcnVyYWwuCgozLiBSZWFsaXphbW9zIGVsIGRpYWduw7NzdGljbyBkZSBsYSBtYXRyaXogZGUgY29ycmVsYWNpb25lcy4gwr9FeGlzdGVuIHByb2JsZW1hcz8gwr9jdcOhbGVzIHNvbj8KClRlc3QgZGUgS2Fpc2VyLCBNZXllciAtIE9sa2luCmBgYHtyfQpsaWJyYXJ5KHBzeWNoKQpLTU8obWF0cml6X2NvcnIpICPDunRpbCBzaSBNU0EgZXMgbWF5b3IgYSAwLjYKYGBgCgpTZWd1bmRvLCB2ZXJpZmljYW1vcyBzaSBsYSBtYXRyaXogZGUgY29ycmVsYWNpb25lcyBlcyBhZGVjdWFkYS4gUGFyYSBlbGxvLCBzZSB0aWVuZW4gZG9zIGZ1bmNpb25lczoKCi0gVGVzdCBkZSBCYXJ0bGV0dDogSDA6IExhIG1hdHJpeiBkZSBjb3JyZWxhY2lvbiBlcyB1bmEgbWF0cml6IGlkZW50aWRhZC4KCmBgYHtyfQpjb3J0ZXN0LmJhcnRsZXR0KG1hdHJpel9jb3JyLG49bnJvdyhzdWJkYXRhKSkkcC52YWx1ZT4wLjA1CiNTZSByZWNoYXphIGxhIEgwLCBwb3IgbG8gcXVlIGxhIGNvcnJlbGFjacOzbiBubyBlcyBzb2xvIGNvbiBsYSB2YXJpYWJsZSBtaXNtYSwgZXMgZGVjaXIsIG5vIGVzIHVuYSBtYXRyaXogaWRlbnRpZGFkLgpgYGAKLSBUZXN0IEZvciBTaW5ndWxhciBTcXVhcmUgTWF0cml4OiBIMDogTGEgbWF0cml6IGRlIGNvcnJlbGFjaW9uIGVzIHVuYSBtYXRyaXogc2luZ3VsYXIKYGBge3J9CmxpYnJhcnkobWF0cml4Y2FsYykKaXMuc2luZ3VsYXIubWF0cml4KG1hdHJpel9jb3JyKQojUmVjaGF6YW1vcyBsYSBoaXDDs3Rlc2lzIG51bGEgc2kgc2FsZSBGQUxTRQpgYGAKCipSUFRBKjogRWwgT3ZlcmFsbCBNU0Egbm9zIHNhbGUgaWd1YWwgYSAwLjQsIGVzdG8gcG9kcsOtYSBpbXBsaWNhciB1biBwcm9ibGVtYSBwdWVzIG51ZXN0cm8gYW7DoWxpc2lzIGZhY3RvcmlhbCBleHBsb3JhdG9yaW8gcG9kcsOtYSBzZXIgdW4gdGFudG8gcHJvYmxlbcOhdGljbyBvIGluYWRlY3VhZG8gc2kgZXN0ZSB2YWxvciBlcyBtZW5vciBhIDAuNS4gQ3VhbmRvIHJlYWxpemFtb3MgbGEgdmVyaWZpY2FjacOzbiBtZWRpYW50ZSBlbCB0ZXN0IGRlIGlkZW50aWRhZCB5IHNpbmd1bGFyaWRhZCwgcmVjaGF6YW1vcyBsYSBoaXDDs3Rlc2lzIG51bGEsIHBvciBsbyBxdWUgbm8gaGFicsOtYSBwcm9ibGVtYSBhbGd1bm8gZW4gZXNlIHNlbnRpZG8uIAoKCjQuIElkZW50aWZpY2Ftb3MgZWwgbsO6bWVybyBkZSBmYWN0b3JlcyByZWNvbWVuZGFkb3MgeSBjYWxjdWxhbW9zIGVsIGFuw6FsaXNpcyBmYWN0b3JpYWwKYGBge3J9CmZhLnBhcmFsbGVsKHN1YmRhdGEsZm0gPSAnTUwnLCBmYSA9ICdmYScpCgojU29saWNpdGFtb3MgZWwgbsO6bWVybyBkZSBmYWN0b3JlcywuIENBTUJJQVIgRUwgTkZBQ1RPUiBwb3IgZWwgdmFsb3IgcXVlIHRlIGRhbgpsaWJyYXJ5KEdQQXJvdGF0aW9uKQpmYWN0b3JpYWwgPC0gZmEoc3ViZGF0YSxuZmFjdG9ycyA9IDIsY29yID0gJ21peGVkJyxyb3RhdGUgPSAidmFyaW1heCIsZm09Im1pbnJlcyIpCmBgYAoKVmlzdWFsaXphbW9zIGVsIHJlc3VsdGFkbyBpbmljaWFsOiAKYGBge3J9CnByaW50KGZhY3RvcmlhbCRsb2FkaW5ncykKYGBgCgoqUlBUQSo6IEVsIG7Dum1lcm8gZGUgZmFjdG9yZXMgcmVjb21lbmRhZG9zIGVzIDIuIEEgcGFydGlyIGRlIGVsbG8sIGNyZWFtb3MgdW5hIGRhdGEgRUZBIHF1ZSBub3MgaW5kaXF1ZSBsb3MgZWxlbWVudG9zIHF1ZSBjb21wb25lIGRpY2hvIGFuw6FsaXNpcyBmYWN0b3JpYWwuIEFsIHZpc3VhbGl6YXIgZWwgcmVzdWx0YWRvIG9idGVuaWRvLCBwb2RlbW9zIHZlciBxdWUgZWwgZmFjdG9yIDEgZXhwbGljYSBlbCA0MCUgZGVsIG1vZGVsbywgbWllbnRyYXMgcXVlIGVsIDIgZXhwbGljYSBlbCAzMCUuIEhheSBxdWUgdGVuZXIgZW4gY29uc2lkZXJhY2nDs24gcXVlIGhheSB2YXJpYWJsZXMgcXVlIGFwb3J0YW4sIGVuIGRpc3RpbnRhIG1lZGlkYWQsIGEgYW1ib3MgZmFjdG9yZXMuCgo1LiBFeHBsb3JhbW9zIGVsIEFGRSBjYWxjdWxhZG8uIMK/UXXDqSBub3RhbW9zIGVuIGVsIHJlc3VsdGFkbyBtZWpvcmFkbyAocmVhbGl6YW5kbyB1biBjb3J0ZSBhbCAwLjUpPwoKYGBge3J9CnByaW50KGZhY3RvcmlhbCRsb2FkaW5ncyxjdXRvZmYgPSAwLjUpICAjMC41IHNpZ3VpZW5kbyBsYSBpbnRlcnByZXRhY2nDs24gZGUgbGEgY29ycmVsYWNpw7NuLiAKYGBgCipSUFRBKjogTm90YW1vcyBxdWUgdmFyaWFibGVzIGNvbW8gJWRlIHBvYmxhY2nDs24gcnVyYWwsICUgZGUgZGVzbnV0cmljacOzbiBjcsOzbmljYSwgJSBkZSBwb2JsYWNpw7NuIHNpbiBzZXJ2aWNpbyBkZSBhZ3VhIHkgc2luIGRlc2Fnw7xlIHNlIGFncnVwYW4gZW4gdW4gbWlzbW8gZmFjdG9yLiBQb3Igb3RybyBsYWRvLCB2YXJpYWJsZXMgdGFsZXMgY29tbyBhbmFsZ2FiZXRpc21vLCBpbmFzaXN0ZW5jaWEgZXNjb2xhciwgbW9ydGFsaWRhZCBpbmZhbnRpbCB5IG5pw7FvcyBxdWUgdHJhYmFqYW4gc2UgYWdydXBhbiBlbiBlbCBzZWd1bmRvIGZhY3Rvci4gRW4gdG9kb3MgbG9zIGNhc29zIChwdWVzIHNvbiBtYXlvcmVzIGRlIDAuNikgcG9kcsOtYW1vcyBkZWNpciBxdWUgbGFzIHZhcmlhYmxlcyBhcG9ydGFuIGJhc3RhbnRlIGFsIG1vZGVsby4KCjYuIFZlYW1vcyBlbCBkaWFncmFtYSBkZSBsYSBkaXN0cmlidWNpw7NuIGRlIGxhcyB2YXJpYWJsZXMgc2Vnw7puIGZhY3RvcmVzIApgYGB7cn0KZmEuZGlhZ3JhbShmYWN0b3JpYWwpCmBgYAoKNy4gUmVhbGl6YW1vcyB1bmEgZXZhbHVhY2nDs24gZGVsIEFuw6FsaXNpcyBGYWN0b3JpYWwgc29saWNpdGFkby4gSW5kaWNhbW9zIHF1w6kgdmFyaWFibGUgYXBvcnRhIG3DoXMgYSBsb3MgZmFjdG9yZXMgY3JlYWRvcwoKQ29tZW56YW1vcyBjb24gbGEgcmHDrXogZGUgZXJyb3IgY3VhZHLDoXRpY28uIEVzdGFDb21wcnVlYmEgdmFsaWRleiBkZWwgZmFjdG9yaWFsLiBTaSBubyBzYWxlIGNlcmNhIGEgY2VybywgZWwgYW7DoWxpc2lzIG5vIGVzIHN1ZmljaWVudGVtZW50ZSB2w6FsaWRvLiBIYXkgcXVlIHJlcG9ydGFyLgotIMK/TGEgUmHDrXogZGVsIGVycm9yIGN1YWRyw6F0aWNvIG1lZGlvIGNvcnJlZ2lkYSBlc3TDoSBjZXJjYSBhIGNlcm8/CmBgYHtyfQpmYWN0b3JpYWwkY3JtcwpgYGAKKlJQVEEqIE5vIHNlIGFjZXJjYSB0YW50byBhIDAsIHB1ZXMgZWwgdmFsb3IgcXVlIG5vcyBhcnJvamEgZXMgMC4xLiBFcyBpbXBvcnRhbnRlIG1lbmNpb25hcmxvIHB1ZXMgcHVlZGUgcXVlIGVsIGFuw6FsaXNpcyBubyBzZWEgbG8gc3VmaWNpZW50ZW1lbnRlIHbDoWxpZG8uCgotIMK/TGEgUmHDrXogZGVsIGVycm9yIGN1YWRyw6F0aWNvIG1lZGlvIGRlIGFwcm94aW1hY2nDs24gZXMgbWVub3IgYSAwLjA1PwooVVBQRVIgTUVOT1IgQSAwLjA1KQpgYGB7cn0KZmFjdG9yaWFsJFJNU0VBCmBgYAoqUlBUQSogRWwgdmFsb3IgZGUgUk1TRUEgcGFyZWNlIGluZGljYXJub3MgcXVlIGhheSB1bmEgc3VlcnRlIGRlIHByb2JsZW1hIGRlIHZhbGlkZXosIHB1ZXMgZWwgdmFsb3IgZGUgbGEgcmHDrXogZGVsIGVycm9yIGN1YWRyw6F0aWNvICBtZWRpbyBkZSBhcHJveGltYWNpw7NuIGVzIDAuMTM2NDc5NC4KCgotIMK/RWwgw61uZGljZSBkZSBUdWNrZXItTGV3aXMgZXMgbWF5b3IgYSAwLjk/CmBgYHtyfQpmYWN0b3JpYWwkVExJCiNWYXJpYXMgcmVncmVzaW9uZXMgcGFyYSBkZXRlcm1pbmFyIGN1w6FsIGVzIGVsIGZhY3RvciBxdWUgZXhwbGlxdWUgbWVqb3IgbGEgdmFyaWFiaWxpZGFkIGRlIGNhZGEgdW5hIGRlIGxhcyB2YXJpYWJsZXMuIApgYGAKKlJQVEEqOiBFbCBoZWNobyBkZSBxdWUgc2VhIG1lbm9yIGEgMC45LCBub3MgaW5kaWNhIHF1ZSBoYXkgdW4gcHJvYmxlbWEuCgrCv1F1w6kgdmFyaWFibGVzIGFwb3J0YXJvbiBtw6FzIGEgbG9zIGZhY3RvcmVzPwpgYGB7cn0Kc29ydChmYWN0b3JpYWwkY29tbXVuYWxpdHkpCmBgYAoqUlBUQSogUG9kcsOtYW1vcyBjb25zaWRlcmFyIHF1ZSBsYXMgdmFyaWFibGVzIHF1ZSBhcG9ydGFuIG3DoXMgYSBsb3MgZmFjdG9yZXMgc29uICUgZGUgbGEgcG9ibGFjacOzbiBzaW4gc2VydmljaW8gZGUgYWd1YSwgJSBkZSBsYSBwb2JsYWNpw7NuIHJ1cmFsIHkgJSBkZSBuacOxb3MgcXVlIG5vIGFzaXN0ZW4gYSBsYSBlc2N1ZWxhLiBSZXNwZWN0byBhbCBmYWN0b3IgMSwgcG9ibGFjacOzbiBydXJhbCB5IHBvYmxhY2nDs24gc2luIGFndWEgc29uIGxvcyBxdWUgYXBvcnRhbiBtw6FzLiBFbiBlbCBjYXNvIGRlbCBmYWN0b3IgMiwgZXMgbGEgaW5hc2lzdGVuY2lhIGEgbGEgZXNjdWVsYS4KCjguIENvbG9jYW1vcyBsb3MgZmFjdG9yZXMgZW5jb250cmFkb3MgY29tbyB2YXJpYWJsZXMgZW4gbGEgYmFzZSBkZSBkYXRvcyB5IHByZXNlbnRlIGxvcyBwcmluY2lwYWxlcyBkZXNjcmlwdGl2b3MuCgoqUlBUQSo6IFBvZGVtb3MgY29uc2lzZXJhciBxdWUsIGNvbiByZXNwZWN0byBhbCBmYWN0b3IgMSwgZWwgbcOtbmltbyBlcyAtMi4wMTgyLCBsYSBtZWRpYW5hIGVzIDAuNTE0MSB5IGVsIHZhbG9yIG3DoXhpbW8gZXMgZGUgMS4xMzkwLiBFbiBlbCBjYXNvIGRlbCBmYWN0b3IgMiwgZWwgbcOtbmltbyBlcyAtMi4wNDY1OCwgbGEgbWVkaWFuYSBlcyAtMC4wMDQ5IHkgZWwgdmFsb3IgbcOheGltbyBlcyAyLjIzOTA5CmBgYHtyfQpmYWN0b3JpYWxfY2Fzb3M8LWFzLmRhdGEuZnJhbWUoZmFjdG9yaWFsJHNjb3JlcykgI0NyZWFtb3MgbGEgZGF0YQpoZWFkKGZhY3RvcmlhbF9jYXNvcykKc3VtbWFyeShmYWN0b3JpYWxfY2Fzb3MpICNQZWRpbW9zIGxvcyBwcmluY2lwYWxlcyBkZXNjcmlwdGl2b3MuCmBgYAo=