Análisis de Sentimientos

El análisis de sentimientos, o minería de opinión es utilizado para extraer de forma automática información sobre la conotación positiva o negativa del lenguaje de un documento

El análisis mostrará el resultado en 8 emociones básicas y 2 sentimientos

Emociones Básicas:
1. Alegría (joy)
2. Trsiteza (sadness)
3. Ira (anger)
4. Sorpresa (surprise)
5. Asco (disgust)
6. Miedo (fear)
7. Anticipación (anticipation)
8. Confianza (trust)

Sentimientos
1. Positivo (positive)
2. Negativo (negative)

Ejercicio “Miau”

1. Cargar Texto

texto_cadena_miau <- scan(file = "https://raw.githubusercontent.com/programminghistorian/jekyll/gh-pages/assets/galdos_miau.txt", fileEncoding = "UTF-8", what = character(), sep = "\n", allowEscapes = T)

2. Instalar paquetes y Llamar Librerias

# install.packages("syuzhet")
library(syuzhet)

# install.packages("RColorBrewer")
library(RColorBrewer)

3. Tokenizar texto (dividir un texto en palabras)

texto_palabras_miau <- get_tokens(texto_cadena_miau)

4. Explorar texto

head(texto_palabras_miau)
## [1] "miau"   "por"    "b"      "pérez"  "galdós" "14"
length(texto_palabras_miau)
## [1] 97254
oraciones_vector <- get_sentences(texto_cadena_miau)
length(oraciones_vector)
## [1] 13136

5. Realizar análisis de sentimientos

sentimientos_miau <- get_nrc_sentiment(texto_palabras_miau , lang = "spanish")   

summary(sentimientos_miau)
##      anger          anticipation        disgust             fear        
##  Min.   :0.00000   Min.   :0.00000   Min.   :0.00000   Min.   :0.00000  
##  1st Qu.:0.00000   1st Qu.:0.00000   1st Qu.:0.00000   1st Qu.:0.00000  
##  Median :0.00000   Median :0.00000   Median :0.00000   Median :0.00000  
##  Mean   :0.01596   Mean   :0.02114   Mean   :0.01263   Mean   :0.02243  
##  3rd Qu.:0.00000   3rd Qu.:0.00000   3rd Qu.:0.00000   3rd Qu.:0.00000  
##  Max.   :5.00000   Max.   :3.00000   Max.   :6.00000   Max.   :5.00000  
##       joy             sadness           surprise           trust        
##  Min.   :0.00000   Min.   :0.00000   Min.   :0.00000   Min.   :0.00000  
##  1st Qu.:0.00000   1st Qu.:0.00000   1st Qu.:0.00000   1st Qu.:0.00000  
##  Median :0.00000   Median :0.00000   Median :0.00000   Median :0.00000  
##  Mean   :0.01929   Mean   :0.02564   Mean   :0.01035   Mean   :0.03004  
##  3rd Qu.:0.00000   3rd Qu.:0.00000   3rd Qu.:0.00000   3rd Qu.:0.00000  
##  Max.   :5.00000   Max.   :7.00000   Max.   :2.00000   Max.   :3.00000  
##     negative          positive      
##  Min.   :0.00000   Min.   :0.00000  
##  1st Qu.:0.00000   1st Qu.:0.00000  
##  Median :0.00000   Median :0.00000  
##  Mean   :0.04658   Mean   :0.05153  
##  3rd Qu.:0.00000   3rd Qu.:0.00000  
##  Max.   :7.00000   Max.   :5.00000
head(sentimientos_miau)
##   anger anticipation disgust fear joy sadness surprise trust negative positive
## 1     0            0       0    0   0       0        0     0        0        0
## 2     0            0       0    0   0       0        0     0        0        0
## 3     0            0       0    0   0       0        0     0        0        0
## 4     0            0       0    0   0       0        0     0        0        0
## 5     0            0       0    0   0       0        0     0        0        0
## 6     0            0       0    0   0       0        0     0        0        0

6. Graficar Resultados

barplot(
  colSums(prop.table(sentimientos_miau[,1:8])), 
  space = 0.2, 
  horiz = FALSE, 
  las = 1, 
  cex.names = 0.7, 
  col = brewer.pal(n=8, name="Set3"), 
  main = "Análisis de Sentimientos de la Novela Miau", 
  xlab = "Emociones"
  
)

7. Profundizar Análisis

palabras_confianza_miau <- texto_palabras_miau[sentimientos_miau$trust >0]
palabras_confianza_miau_orden <- sort(table(unlist(palabras_confianza_miau)), decreasing = TRUE)
head(palabras_confianza_miau_orden, n=10)
## 
##    dios   amigo   padre  abuelo   hecho  puerta  verdad   bueno palabra iglesia 
##     142      97      77      69      56      53      51      41      41      37

8. Graficar Resultado de Sentimientos

secuencia_sentimientos_miau <- (sentimientos_miau$negative*-1) + sentimientos_miau$positive
simple_plot(secuencia_sentimientos_miau)

Ejercicio “Himno Nacional Mexicano”

1. Cargar Texto

himno <- read.delim("C:\\Users\\HUAWEI\\OneDrive\\Documentos\\himno_nacional.txt")
himno <- as.character(himno)
# texto_cadena <- scan("C:\\Users\\HUAWEI\\OneDrive\\Documentos\\himno_nacional.txt")

2. Instalar paquetes y Llamar Librerias

# install.packages("syuzhet")
library(syuzhet)
# install.packages("RColorBrewer")
library(RColorBrewer)

3. Tokenizar texto (dividir un texto en palabras)

texto_palabras <- get_tokens(himno)
class(himno)
## [1] "character"

4. Explorar texto

head(texto_palabras)
## [1] "c"        "el"       "acero"    "aprestad" "y"        "el"
length(texto_palabras)
## [1] 502
oraciones_vector <- get_sentences(himno)
length(oraciones_vector)
## [1] 10

5. Realizar análisis de sentimientos

sentimientos_df <- get_nrc_sentiment(texto_palabras, lang = "spanish")   

summary(sentimientos_df)
##      anger          anticipation        disgust             fear        
##  Min.   :0.00000   Min.   :0.00000   Min.   :0.00000   Min.   :0.00000  
##  1st Qu.:0.00000   1st Qu.:0.00000   1st Qu.:0.00000   1st Qu.:0.00000  
##  Median :0.00000   Median :0.00000   Median :0.00000   Median :0.00000  
##  Mean   :0.05578   Mean   :0.04183   Mean   :0.02191   Mean   :0.06773  
##  3rd Qu.:0.00000   3rd Qu.:0.00000   3rd Qu.:0.00000   3rd Qu.:0.00000  
##  Max.   :3.00000   Max.   :2.00000   Max.   :2.00000   Max.   :2.00000  
##       joy             sadness           surprise           trust        
##  Min.   :0.00000   Min.   :0.00000   Min.   :0.00000   Min.   :0.00000  
##  1st Qu.:0.00000   1st Qu.:0.00000   1st Qu.:0.00000   1st Qu.:0.00000  
##  Median :0.00000   Median :0.00000   Median :0.00000   Median :0.00000  
##  Mean   :0.04781   Mean   :0.03785   Mean   :0.02191   Mean   :0.03984  
##  3rd Qu.:0.00000   3rd Qu.:0.00000   3rd Qu.:0.00000   3rd Qu.:0.00000  
##  Max.   :2.00000   Max.   :2.00000   Max.   :2.00000   Max.   :2.00000  
##     negative          positive     
##  Min.   :0.00000   Min.   :0.0000  
##  1st Qu.:0.00000   1st Qu.:0.0000  
##  Median :0.00000   Median :0.0000  
##  Mean   :0.07371   Mean   :0.0996  
##  3rd Qu.:0.00000   3rd Qu.:0.0000  
##  Max.   :3.00000   Max.   :3.0000
head(sentimientos_df)
##   anger anticipation disgust fear joy sadness surprise trust negative positive
## 1     0            0       0    0   0       0        0     0        0        0
## 2     0            0       0    0   0       0        0     0        0        0
## 3     0            0       0    0   0       0        0     0        0        0
## 4     0            0       0    0   0       0        0     0        0        0
## 5     0            0       0    0   0       0        0     0        0        0
## 6     0            0       0    0   0       0        0     0        0        0

6. Graficar Resultados

barplot(
  colSums(prop.table(sentimientos_df[,1:8])), 
  space = 0.2, 
  horiz = FALSE, 
  las = 1, 
  cex.names = 0.7, 
  col = brewer.pal(n=8, name="Set3"), 
  main = "Análisis de Sentimientos del Himno Nacional Mexicano", 
  xlab = "Emociones"
  
)

7. Profundizar Análisis

# Profundizar Análisis
palabras_miedo <- texto_palabras[sentimientos_df$fear >0]
palabras_miedo_orden <- sort(table(unlist(palabras_miedo)), decreasing = TRUE)
head(palabras_miedo_orden, n=10)
## 
##    guerra    sangre     golpe  guerrero  metralla   destino      dios   enemigo 
##         7         4         2         2         2         1         1         1 
## impotente    muerte 
##         1         1

8. Graficar Resultado de Sentimientos

secuencia_sentimientos <- (sentimientos_df$negative*-1) + sentimientos_df$positive
simple_plot(secuencia_sentimientos)

Redes Neuronales”

Series de Tiempo”

LS0tDQp0aXRsZTogIkFjdGl2aWRhZCA0LjQgU2VudGltZW50IEFuYWx5c2lzIE5hdGlvbmFsIEFudGhlbSINCmF1dGhvcjogIlZhbGVyaWEgUGXDsWEgQTAwODI5MzMyIg0KZGF0ZTogIjIwMjMtMDktMjUiDQpvdXRwdXQ6IA0KICBodG1sX2RvY3VtZW50OiANCiAgICB0b2M6IFRSVUUNCiAgICB0b2NfZmxvYXQ6IFRSVUUNCiAgICBjb2RlX2Rvd25sb2FkOiBUUlVFDQogICAgDQotLS0NCiMgPHNwYW4gc3R5bGU9ImNvbG9yOiBkZWVwcGluazsiPkFuw6FsaXNpcyBkZSBTZW50aW1pZW50b3M8L3NwYW4+DQoNCkVsIGFuw6FsaXNpcyBkZSBzZW50aW1pZW50b3MsIG8gbWluZXLDrWEgZGUgb3BpbmnDs24gZXMgdXRpbGl6YWRvIHBhcmEgZXh0cmFlciBkZSBmb3JtYSBhdXRvbcOhdGljYSANCmluZm9ybWFjacOzbiBzb2JyZSBsYSBjb25vdGFjacOzbiBwb3NpdGl2YSBvIG5lZ2F0aXZhIGRlbCBsZW5ndWFqZSBkZSB1biBkb2N1bWVudG8NCg0KRWwgYW7DoWxpc2lzIG1vc3RyYXLDoSBlbCByZXN1bHRhZG8gZW4gOCBlbW9jaW9uZXMgYsOhc2ljYXMgeSAyIHNlbnRpbWllbnRvcyAgDQoNCipFbW9jaW9uZXMgQsOhc2ljYXM6KiAgDQoxLiBBbGVncsOtYSAoam95KSAgDQoyLiBUcnNpdGV6YSAoc2FkbmVzcykgIA0KMy4gSXJhIChhbmdlcikgIA0KNC4gU29ycHJlc2EgKHN1cnByaXNlKSAgDQo1LiBBc2NvIChkaXNndXN0KSAgDQo2LiBNaWVkbyAoZmVhcikgIA0KNy4gQW50aWNpcGFjacOzbiAoYW50aWNpcGF0aW9uKSAgDQo4LiBDb25maWFuemEgKHRydXN0KSAgDQoNCipTZW50aW1pZW50b3MqICAgDQoxLiBQb3NpdGl2byAocG9zaXRpdmUpICANCjIuIE5lZ2F0aXZvIChuZWdhdGl2ZSkgIA0KDQoNCiMgPHNwYW4gc3R5bGU9ImNvbG9yOiBkZWVwcGluazsiPkVqZXJjaWNpbyAiTWlhdSI8L3NwYW4+DQoNCiMjIDxzcGFuIHN0eWxlPSJjb2xvcjogZGVlcHBpbms7Ij4xLiBDYXJnYXIgVGV4dG88L3NwYW4+DQpgYGB7cn0NCnRleHRvX2NhZGVuYV9taWF1IDwtIHNjYW4oZmlsZSA9ICJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vcHJvZ3JhbW1pbmdoaXN0b3JpYW4vamVreWxsL2doLXBhZ2VzL2Fzc2V0cy9nYWxkb3NfbWlhdS50eHQiLCBmaWxlRW5jb2RpbmcgPSAiVVRGLTgiLCB3aGF0ID0gY2hhcmFjdGVyKCksIHNlcCA9ICJcbiIsIGFsbG93RXNjYXBlcyA9IFQpDQpgYGANCg0KIyMgPHNwYW4gc3R5bGU9ImNvbG9yOiBkZWVwcGluazsiPjIuIEluc3RhbGFyIHBhcXVldGVzIHkgTGxhbWFyIExpYnJlcmlhczwvc3Bhbj4NCmBgYHtyfQ0KIyBpbnN0YWxsLnBhY2thZ2VzKCJzeXV6aGV0IikNCmxpYnJhcnkoc3l1emhldCkNCg0KIyBpbnN0YWxsLnBhY2thZ2VzKCJSQ29sb3JCcmV3ZXIiKQ0KbGlicmFyeShSQ29sb3JCcmV3ZXIpDQpgYGANCg0KIyMgPHNwYW4gc3R5bGU9ImNvbG9yOiBkZWVwcGluazsiPjMuIFRva2VuaXphciB0ZXh0byAoZGl2aWRpciB1biB0ZXh0byBlbiBwYWxhYnJhcyk8L3NwYW4+DQpgYGB7cn0NCnRleHRvX3BhbGFicmFzX21pYXUgPC0gZ2V0X3Rva2Vucyh0ZXh0b19jYWRlbmFfbWlhdSkNCmBgYA0KDQojIyA8c3BhbiBzdHlsZT0iY29sb3I6IGRlZXBwaW5rOyI+NC4gRXhwbG9yYXIgdGV4dG88L3NwYW4+DQpgYGB7cn0NCmhlYWQodGV4dG9fcGFsYWJyYXNfbWlhdSkNCmxlbmd0aCh0ZXh0b19wYWxhYnJhc19taWF1KQ0Kb3JhY2lvbmVzX3ZlY3RvciA8LSBnZXRfc2VudGVuY2VzKHRleHRvX2NhZGVuYV9taWF1KQ0KbGVuZ3RoKG9yYWNpb25lc192ZWN0b3IpDQpgYGANCg0KIyMgPHNwYW4gc3R5bGU9ImNvbG9yOiBkZWVwcGluazsiPjUuIFJlYWxpemFyIGFuw6FsaXNpcyBkZSBzZW50aW1pZW50b3M8L3NwYW4+DQpgYGB7cn0NCnNlbnRpbWllbnRvc19taWF1IDwtIGdldF9ucmNfc2VudGltZW50KHRleHRvX3BhbGFicmFzX21pYXUgLCBsYW5nID0gInNwYW5pc2giKSAgIA0KDQpzdW1tYXJ5KHNlbnRpbWllbnRvc19taWF1KQ0KaGVhZChzZW50aW1pZW50b3NfbWlhdSkNCmBgYA0KDQojIyA8c3BhbiBzdHlsZT0iY29sb3I6IGRlZXBwaW5rOyI+Ni4gR3JhZmljYXIgUmVzdWx0YWRvczwvc3Bhbj4NCmBgYHtyfQ0KYmFycGxvdCgNCiAgY29sU3Vtcyhwcm9wLnRhYmxlKHNlbnRpbWllbnRvc19taWF1WywxOjhdKSksIA0KICBzcGFjZSA9IDAuMiwgDQogIGhvcml6ID0gRkFMU0UsIA0KICBsYXMgPSAxLCANCiAgY2V4Lm5hbWVzID0gMC43LCANCiAgY29sID0gYnJld2VyLnBhbChuPTgsIG5hbWU9IlNldDMiKSwgDQogIG1haW4gPSAiQW7DoWxpc2lzIGRlIFNlbnRpbWllbnRvcyBkZSBsYSBOb3ZlbGEgTWlhdSIsIA0KICB4bGFiID0gIkVtb2Npb25lcyINCiAgDQopDQpgYGANCg0KIyMgPHNwYW4gc3R5bGU9ImNvbG9yOiBkZWVwcGluazsiPjcuIFByb2Z1bmRpemFyIEFuw6FsaXNpczwvc3Bhbj4NCmBgYHtyfQ0KcGFsYWJyYXNfY29uZmlhbnphX21pYXUgPC0gdGV4dG9fcGFsYWJyYXNfbWlhdVtzZW50aW1pZW50b3NfbWlhdSR0cnVzdCA+MF0NCnBhbGFicmFzX2NvbmZpYW56YV9taWF1X29yZGVuIDwtIHNvcnQodGFibGUodW5saXN0KHBhbGFicmFzX2NvbmZpYW56YV9taWF1KSksIGRlY3JlYXNpbmcgPSBUUlVFKQ0KaGVhZChwYWxhYnJhc19jb25maWFuemFfbWlhdV9vcmRlbiwgbj0xMCkNCmBgYA0KDQojIyA8c3BhbiBzdHlsZT0iY29sb3I6IGRlZXBwaW5rOyI+OC4gR3JhZmljYXIgUmVzdWx0YWRvIGRlIFNlbnRpbWllbnRvczwvc3Bhbj4NCmBgYHtyfQ0Kc2VjdWVuY2lhX3NlbnRpbWllbnRvc19taWF1IDwtIChzZW50aW1pZW50b3NfbWlhdSRuZWdhdGl2ZSotMSkgKyBzZW50aW1pZW50b3NfbWlhdSRwb3NpdGl2ZQ0Kc2ltcGxlX3Bsb3Qoc2VjdWVuY2lhX3NlbnRpbWllbnRvc19taWF1KQ0KYGBgDQoNCg0KIyA8c3BhbiBzdHlsZT0iY29sb3I6IGRlZXBwaW5rOyI+RWplcmNpY2lvICJIaW1ubyBOYWNpb25hbCBNZXhpY2FubyI8L3NwYW4+DQoNCiFbXShDOlxcVXNlcnNcXEhVQVdFSVxcRG93bmxvYWRzXFxiYW5kZXJhLmpwZykNCg0KIyMgPHNwYW4gc3R5bGU9ImNvbG9yOiBkZWVwcGluazsiPjEuIENhcmdhciBUZXh0bzwvc3Bhbj4NCmBgYHtyfQ0KaGltbm8gPC0gcmVhZC5kZWxpbSgiQzpcXFVzZXJzXFxIVUFXRUlcXE9uZURyaXZlXFxEb2N1bWVudG9zXFxoaW1ub19uYWNpb25hbC50eHQiKQ0KaGltbm8gPC0gYXMuY2hhcmFjdGVyKGhpbW5vKQ0KIyB0ZXh0b19jYWRlbmEgPC0gc2NhbigiQzpcXFVzZXJzXFxIVUFXRUlcXE9uZURyaXZlXFxEb2N1bWVudG9zXFxoaW1ub19uYWNpb25hbC50eHQiKQ0KYGBgDQoNCiMjIDxzcGFuIHN0eWxlPSJjb2xvcjogZGVlcHBpbms7Ij4yLiBJbnN0YWxhciBwYXF1ZXRlcyB5IExsYW1hciBMaWJyZXJpYXM8L3NwYW4+DQpgYGB7cn0NCiMgaW5zdGFsbC5wYWNrYWdlcygic3l1emhldCIpDQpsaWJyYXJ5KHN5dXpoZXQpDQojIGluc3RhbGwucGFja2FnZXMoIlJDb2xvckJyZXdlciIpDQpsaWJyYXJ5KFJDb2xvckJyZXdlcikNCmBgYA0KDQojIyA8c3BhbiBzdHlsZT0iY29sb3I6IGRlZXBwaW5rOyI+My4gVG9rZW5pemFyIHRleHRvIChkaXZpZGlyIHVuIHRleHRvIGVuIHBhbGFicmFzKTwvc3Bhbj4NCmBgYHtyfQ0KdGV4dG9fcGFsYWJyYXMgPC0gZ2V0X3Rva2VucyhoaW1ubykNCmNsYXNzKGhpbW5vKQ0KYGBgDQoNCiMjIDxzcGFuIHN0eWxlPSJjb2xvcjogZGVlcHBpbms7Ij40LiBFeHBsb3JhciB0ZXh0bzwvc3Bhbj4NCmBgYHtyfQ0KaGVhZCh0ZXh0b19wYWxhYnJhcykNCmxlbmd0aCh0ZXh0b19wYWxhYnJhcykNCm9yYWNpb25lc192ZWN0b3IgPC0gZ2V0X3NlbnRlbmNlcyhoaW1ubykNCmxlbmd0aChvcmFjaW9uZXNfdmVjdG9yKQ0KYGBgDQoNCiMjIDxzcGFuIHN0eWxlPSJjb2xvcjogZGVlcHBpbms7Ij41LiBSZWFsaXphciBhbsOhbGlzaXMgZGUgc2VudGltaWVudG9zPC9zcGFuPg0KYGBge3J9DQpzZW50aW1pZW50b3NfZGYgPC0gZ2V0X25yY19zZW50aW1lbnQodGV4dG9fcGFsYWJyYXMsIGxhbmcgPSAic3BhbmlzaCIpICAgDQoNCnN1bW1hcnkoc2VudGltaWVudG9zX2RmKQ0KaGVhZChzZW50aW1pZW50b3NfZGYpDQpgYGANCg0KIyMgPHNwYW4gc3R5bGU9ImNvbG9yOiBkZWVwcGluazsiPjYuIEdyYWZpY2FyIFJlc3VsdGFkb3M8L3NwYW4+DQpgYGB7cn0NCmJhcnBsb3QoDQogIGNvbFN1bXMocHJvcC50YWJsZShzZW50aW1pZW50b3NfZGZbLDE6OF0pKSwgDQogIHNwYWNlID0gMC4yLCANCiAgaG9yaXogPSBGQUxTRSwgDQogIGxhcyA9IDEsIA0KICBjZXgubmFtZXMgPSAwLjcsIA0KICBjb2wgPSBicmV3ZXIucGFsKG49OCwgbmFtZT0iU2V0MyIpLCANCiAgbWFpbiA9ICJBbsOhbGlzaXMgZGUgU2VudGltaWVudG9zIGRlbCBIaW1ubyBOYWNpb25hbCBNZXhpY2FubyIsIA0KICB4bGFiID0gIkVtb2Npb25lcyINCiAgDQopDQpgYGANCg0KIyMgPHNwYW4gc3R5bGU9ImNvbG9yOiBkZWVwcGluazsiPjcuIFByb2Z1bmRpemFyIEFuw6FsaXNpczwvc3Bhbj4NCmBgYHtyfQ0KIyBQcm9mdW5kaXphciBBbsOhbGlzaXMNCnBhbGFicmFzX21pZWRvIDwtIHRleHRvX3BhbGFicmFzW3NlbnRpbWllbnRvc19kZiRmZWFyID4wXQ0KcGFsYWJyYXNfbWllZG9fb3JkZW4gPC0gc29ydCh0YWJsZSh1bmxpc3QocGFsYWJyYXNfbWllZG8pKSwgZGVjcmVhc2luZyA9IFRSVUUpDQpoZWFkKHBhbGFicmFzX21pZWRvX29yZGVuLCBuPTEwKQ0KYGBgDQoNCiMjIDxzcGFuIHN0eWxlPSJjb2xvcjogZGVlcHBpbms7Ij44LiBHcmFmaWNhciBSZXN1bHRhZG8gZGUgU2VudGltaWVudG9zPC9zcGFuPg0KYGBge3J9DQpzZWN1ZW5jaWFfc2VudGltaWVudG9zIDwtIChzZW50aW1pZW50b3NfZGYkbmVnYXRpdmUqLTEpICsgc2VudGltaWVudG9zX2RmJHBvc2l0aXZlDQpzaW1wbGVfcGxvdChzZWN1ZW5jaWFfc2VudGltaWVudG9zKQ0KYGBgDQoNCiMgPHNwYW4gc3R5bGU9ImNvbG9yOiBkZWVwcGluazsiPlJlZGVzIE5ldXJvbmFsZXMiPC9zcGFuPg0KDQojIyA8c3BhbiBzdHlsZT0iY29sb3I6IGRlZXBwaW5rOyI+TGluayBkZSBBY2Nlc28gYSBBY3RpdmlkYWQ8L3NwYW4+DQpbTGluayB0ZXh0XWh0dHBzOi8vcnB1YnMuY29tL3ZhbGVyaWFwZW5hLzEwOTI0MDQNCg0KIyA8c3BhbiBzdHlsZT0iY29sb3I6IGRlZXBwaW5rOyI+U2VyaWVzIGRlIFRpZW1wbyI8L3NwYW4+DQoNCiMjIDxzcGFuIHN0eWxlPSJjb2xvcjogZGVlcHBpbms7Ij5MaW5rIGRlIEFjY2VzbyBhIEFjdGl2aWRhZDwvc3Bhbj4NCltMaW5rIHRleHRdaHR0cHM6Ly9ycHVicy5jb20vdmFsZXJpYXBlbmEvMTA5MjM4Ng0KDQo=