Teoría

La minería de textO (TM) es el proceso de extraer información útil patrones o conocimiento de textos no estructurados.

Consta de 3 estapas:
1. Obtener datos: El reconocimiento óptico de caracteres (OCR) es una tecnología que permite convertir imágenes de texto editable. También es conocido como extracción de texto de imágenes.
2. Explorar datos: Representación gráfica o visual de los datos para su interpretación. Los métodos más comunes son el Análisis de Sentimientos, la Nube de Palabras y el Topic Modeling.
3. Análisis predictivo: Son las técnicas y modelos stadísticos para predecir resultados futuros. Los modelos más usados son el Random Forest, redes neuronales y regresiones.

1. Instalar paquetes y llamar librerías

#install.packages("tidyverse") #Data  wrangling
library(tidyverse)
#install.packages("tesseract") #Generar OCR
library(tesseract)
#install.packages("magick") #Imágenes PNG
library(magick)
#install.packages("officer") #Exportar en formatos office (word)
library(officer)
#install.packages("pdftools") #Leer PDFs
library(pdftools)
#install.packages("purrr") #Función Map para aplicar una función a cada elemento de un vector
library(purrr)
#install.packages("tm") #Text Mining
library(tm)
#install.packages("RColorBrewer") #Colores
library(RColorBrewer)
#install.packages("wordcloud") #Nube de palabras
library(wordcloud)
#install.packages("topicmodels") #Modelo de temas
library(topicmodels)
#install.packages("ggplot2")
library(ggplot2)
#install.packages("stringi")
library(stringi)

2. Obtener Datos mediante OCR

De imagen PNG a texto en WORD

IMAGEN1<-image_read("C:\\Users\\Diego Pérez\\Downloads\\imagen1.PNG")
texto1<- ocr(IMAGEN1)
texto1
## [1] "Linear regression with one variable x is also known as univariate linear regression\nor simple linear regression. Simple linear regression is used to predict a single\noutput from a single input. This is an example of supervised learning, which means\nthat the data is labeled, i.e., the output values are known in the training data. Let us\nfit a line through the data using simple linear regression as shown in Fig. 4.1.\n"
doc1 <- read_docx() #Crea un documento de word en blanco
doc1 <- doc1 %>% body_add_par(texto1, style = "Normal") #Pega el texto en el word
#print(doc1, target= "texto1.docx") #Guarda el word en la computadora

Imagen en Español PNG a texto en WORD

Cosultar idiomas disponibles

IMAGEN2<-image_read("C:\\Users\\Diego Pérez\\Downloads\\imagen2.PNG")
tesseract_download("spa")
## [1] "C:\\Users\\Diego Pérez\\AppData\\Local\\tesseract5\\tesseract5\\tessdata/spa.traineddata"
texto2<- ocr(IMAGEN2, engine = tesseract("spa"))
texto2
## [1] "Un importante, y quizá controversial, asunto político es el que se refiere al efecto del salario mínimo sobre\nlas tasas de desempleo en diversos grupos de trabajadores. Aunque este problema puede ser estudiado con\ndiversos tipos de datos (corte transversal, series de tiempo o datos de panel), suelen usarse las series de\ntiempo para observar los efectos agregados. En la tabla 1.3 se presenta un ejemplo de una base de datos\nde series de tiempo sobre tasas de desempleo y salarios mínimos.\n"
doc2 <- read_docx() #Crea un documento de word en blanco
doc2 <- doc2 %>% body_add_par(texto2, style = "Normal") #Pega el texto en el word
#print(doc2, target= "texto2.docx") #Guarda el word en la computadora

De PDF a texto en WORD

#pdf1 <- pdf_convert("C:\\Users\\Diego Pérez\\Downloads\\pdf1.pdf", dpi = 600) %>% map(ocr)

Actividad 1. Novela “IT”

Contexto

La novela “IT” se cambiara a un documento en WORD.

Paso 1. convertir el pdf a imagen

pdf2 <- pdf_convert("C:\\Users\\Diego Pérez\\Downloads\\eso3.pdf", dpi = 600) %>% map(ocr)
## Converting page 1 to eso3_1.png... done!
## Converting page 2 to eso3_2.png... done!
## Converting page 3 to eso3_3.png... done!

Paso 2. Obtener texto de cada PNG

#file.choose()
IMAGEN_IT1<-image_read("C:\\Users\\Diego Pérez\\Downloads\\eso3_1.png")
IMAGEN_IT2<-image_read("C:\\Users\\Diego Pérez\\Downloads\\eso3_2.png")
IMAGEN_IT3<-image_read("C:\\Users\\Diego Pérez\\Downloads\\eso3_3.png")
tesseract_download("spa")
## [1] "C:\\Users\\Diego Pérez\\AppData\\Local\\tesseract5\\tesseract5\\tessdata/spa.traineddata"
texto_it1<- ocr(IMAGEN_IT1, engine = tesseract("spa"))
texto_it1
## [1] "Y alli estaba, persiguiendo su barco de papel por el lado izquierdo de Witcham Street. Corría\ndeprisa, pero el agua le ganaba y el barquito estaba sacando ventaja. Oyó un rugido profundo y\nvio cómo cincuenta metros más adelante, colina abajo, el agua de la cuneta se precipitaba\ndentro de una boca de tormenta que aún continuaba abierta. Era un largo semicirculo oscuro\nabierto en el bordillo de la acera y mientras George miraba, una rama desgarrada, con la corteza\noscura y reluciente se hundió en aquellas fauces. Allí pendió por un momento y luego se deslizó\nhacia el interior. Hacia allí se encaminaba su bote.\n\n— ¡Mierda! —chilló horrorizado.\n\nForzó el paso y, por un momento, pareció que iba a alcanzar al barquito. Pero uno de sus ples\nresbaló y George cayo despatarrado despellejándose la rodilla con un grito de dolor. Desde su\nnueva perspectiva, a la altura del pavimento, vio que su barco giraba en redondo dos veces,\nmomentáneamente atrapado en otro remolino, antes de desaparecer.\n\n—|¡Mierda y más mierda! —volvió a chillar, estrellando el puño contra el pavimento.\n\nEso también dolió, y se echó a sollozar. ¡Qué manera tan estupida de perder el barco!\n\nSe levantó para caminar hacia la boca de tormenta y allí se dejó caer de rodillas, para mirar hacia\nel interior. El agua hacia un ruido hueco y humedo al caer en la oscuridad, Ese sonido le daba\nescalofrios. Hacía pensar en..\n\n—¡Eh!\n\nLa exclamación le fue arrancada como con un cordel. Retrocedioó.\n\nAllí adentro había unos ojos amarillos. Ese tipo de ojos que el siempre imaginaba, sin verlos\nnunca, en la oscuridad del sótano. Es un animal —penso, incoherente—,; eso es todo: un animal; a lo\nmejor un gato que quedó atrapado...\n\nDe todos modos, estaba por echar a correr; habria corrido uno o dos segundos, cuando su\ntablero mental se hubiera hecho cargo del espanto que le produjeron esos dos ojos amarillos y\nbrillantes. Sintió la áspera superficie del pavimento bajo los dedos y la fina lámina de agua fría\nque corría alrededor. Se vio a sí mismo levantándose y retrocediendo. Y fue entonces cuando\nuna voz, una voz perfectamente razonable y bastante simpática, le habló desde dentro de la\nboca de tormenta:\n\n—Hola, George —dijo.\n\nGeorge parpadeo y volvió a mirar. Apenas podía dar crédito a lo que vela; era como algo sacado\nde un cuento o de una película donde uno sabe que los animales hablan y bailan. Si hubiera\ntenido diez años más, no habria creido en lo que estaba viendo; pero no tenia dieciséis años, sino\nseis.\n\nEn la boca de tormenta habia un payaso. La luz distaba de ser buena, pero bastó para que\nGeorge Denbrough estuviese seguro de lo que veía. Era un payaso, como en el circo o en la tele.\nParecía una mezcla de Bozo y Clarabell, el que hablaba haciendo sonar su bocina en Howdy\nDoody, los sábados por la mañana. Búfalo Bob era el único que entendía a Clarabell, y eso\nsiempre hacia reir a George. La cara del payaso metido en la boca de tormenta era blanca; tenia\ncómicos mechones de pelo rojo a cada lado de la calva y una gran sonrisa de payaso pintada\n"
texto_it2<- ocr(IMAGEN_IT2, engine = tesseract("spa"))
texto_it2
## [1] "alrededor de la boca. Si George hubiese vivido años después, habria pensado en Ronald\nMcDonald antes que en Bozo o en Clarabell.\n\nEl payaso tenía en una mano un manojo de globos de todos los colores, como tentadora fruta\nmadura.\n\nEn la otra, el barquito de papel de George.\n\n—¿Quieres tu barquito, Georgie? —El payaso sonrela.\n\nGeorge también sonrió. No podía evitarlo; aquella sonrisa era del tipo que uno devuelve sin\nquerer.\n\n—Por supuesto.\n\nEl payaso se echó a reir.\n\n—«Por supuesto». ¡Así me gusta! ¡Así me gusta! ¿Y un globo? ¿Que te parece? ¿Quieres un globo”\n—Bueno.. sí, por supuesto. —Alargó la mano, pero de inmediato la retiró contra su voluntad—. No\ndebo coger nada que me ofrezca un desconocido. Lo dice mi papá.\n\n—Y tu papa tiene mucha razón —replicó el payaso de la boca de tormenta sonriendo. George se\npreguntó cómo podia haber creido que sus ojos eran amarillos, si eran de un color azul brillante,\nbailarin, como los ojos de su mamá y de Bill —. Muchísima razón, ya lo creo. Por lo tanto, voy a\npresentarme. George, soy el señor Bob Gray, también conocido como Pennywise, el payaso\nBallarin. Pennywise, te presento a George Denbrough. George, te presento a Pennywise. Y ahora\nya nos conocemos. Yo no soy un desconocido y tu tampoco. ¿Correcto?\n\nGeorge soltó una risita.\n\n—Correcto. —Volvió a estirar la mano.. y a retirarla—. ¿Cómo te metiste alli adentro?\n\n—La tormenta me trajo volaaaando —dijo Pennywise, el payaso Bailarin—. Se llevó todo el circo.\n¿No sientes olor a circo, George?\n\nGeorge se inclinó hacia adelante. ¡De pronto olía a cacahuetes! ¡Cacahuetes tostados! ¡Y vinagre\nblanco, del que se pone en las patatas fritas por un agujero de la tapa! Y olía a algodón de\nazucar, a buñuelos, y también, leve, pero poderosamente, a estiercol de animales salvajes. Olia el\naroma regocijante del aserrin. Y sin embargo..\n\nSin embargo, bajo todo eso olía a inundación, a hojas deshechas y a oscuras sombras en bocas\nde tormenta. Era un olor húmedo y putrido. El olor del sótano.\n\nPero los otros olores eran más fuertes.\n\n—Claro que lo huelo —dijo.\n\n—¿Quieres tu barquito, George? —preguntó Pennywise—. Te lo pregunto otra vez porque no\npareces desearlo mucho.\n"
texto_it3<- ocr(IMAGEN_IT3, engine = tesseract("spa"))
texto_it3
## [1] "Y lo mostró en alto, sonriendo. Llevaba un traje de seda abolsado con grandes botones color\nnaranja. Una corbata brillante, de color azul eléctrico, se le derramaba por la pechera. En las\nmanos llevaba grandes guantes blancos, como Mickey y Donald.\n\n—Si, claro —dijo George, mirando dentro de la boca de tormenta.\n\n—¿Y un globo? Los tengo rojos, verdes, amarillos, aZules..\n\n—¿Flotan?\n\n—¿Que si flotan? —La sonrisa del payaso se acentuó—. Oh, sí, claro que sí. ¡Flotan! También tengo\nalgodón de azucar.\n\nGeorge estiró la mano.\n\nEl payaso le sujeto el brazo.\n\nY entonces George vio cómo la cara del payaso cambiaba.\n\nLo que vio entonces fue tan terrible que lo peor que había imaginado sobre la cosa del sótano\nparecía un dulce sueño. Lo que vio destruyó su cordura de un zarpazo.\n\n—Flotan —croó la cosa de la alcantarilla con una voz que reía como entre coágulos.\n\nSujetaba el brazo de George con su puño grueso y agusanado. Tiró de él hacia esa horrible\noscuridad por donde el agua corría y rugía y aullaba llevando hacia el mar los desechos de la\ntormenta. George estiró el cuello para apartarse de esa negrura definitiva y empezó a gritar hacia\nla lluvia, a gritar como un loco hacia el gris cielo otoñal que se curvaba sobre Derry aquel día de\notoño de 1957. Sus gritos eran agudos y penetrantes y a lo largo de toda la calle, la gente se\nasomó a las ventanas o se lanzó a los porches.\n\n—Flotan —gruñó la cosa—, flotan, Georgie. Y cuando estés aqui abajo, conmigo, tú también\nflotarás.\n\nEl hombro de George se clavó contra el cemento del bordillo. Dave Gardener, que ese día no\nhabia ido a trabajar al Shoeboat debido a la inundación, vio sólo a un niño de impermeable\namarillo, un niño que gritaba y se retorcia en el arroyo mientras el agua lodosa le corría sobre la\ncara haciendo que sus alaridos sonaran burbujeantes.\n\n—Aqui abajo todo flota —susurró esa voz podrida, riendo, y de pronto sonó un desgarro y hubo\nun destello de agonía y George Denbrough ya no supo más.\n\nDave Gardener fue el primero en llegar. Aunque llegó sólo cuarenta y cinco segundos después\ndel primer grito, George Denbrough ya habia muerto. Gardener lo agarró por el impermeable, tiró\nde él hasta sacarlo a la calle.. y al girar en sus manos el cuerpo de George, también el empezó a\ngritar. El lado izquierdo del impermeable del niño estaba de un rojo intenso. La sangre fluía hacia\nla alcantarilla desde el agujero donde había estado el brazo izquierdo. Un trozo de hueso,\nhorriblemente brillante, asomaba por la tela rota.\n\nLos ojos del niño miraban fijamente el cielo gris y mientras Dave retrocedía a tropezones hacia\nlos otros que ya corrian por la calle, empezaron a llenarse de lluvia.\n"
doc_it <- read_docx() #Crea un documento de word en blanco
doc_it <- doc_it %>% body_add_par(texto_it1, style = "Normal") %>% body_add_par(texto_it2, style = "Normal") %>% body_add_par(texto_it3, style = "Normal") #Pega el texto en el word
print(doc_it, target= "texto_it.docx") #Guarda el word en la computadora

2. Exploración de Datos

Análisis de Frecuencias

text <- readLines("http://www.sthda.com/sthda/RDoc/example-files/martin-luther-king-i-have-a-dream-speech.txt") #Traer u texto de internet
corpus<- Corpus(VectorSource(text)) #Pone cada renglón en una celda de vector
#inspect(Corpus)
corpus<- tm_map(corpus, content_transformer(tolower))
## Warning in tm_map.SimpleCorpus(corpus, content_transformer(tolower)):
## transformation drops documents
#minúsculas
corpus <- tm_map(corpus, removePunctuation) # Elimina puntuación
## Warning in tm_map.SimpleCorpus(corpus, removePunctuation): transformation drops
## documents
corpus <- tm_map(corpus, removeNumbers) # Elimina números
## Warning in tm_map.SimpleCorpus(corpus, removeNumbers): transformation drops
## documents
corpus <- tm_map(corpus, removeWords, stopwords("en")) # Elimina palabras que no hablan del tema
## Warning in tm_map.SimpleCorpus(corpus, removeWords, stopwords("en")):
## transformation drops documents
#corpus <- tm_map(corpus, removeWords, c("dream", "will")) #Elimina palabras puntuales
inspect(corpus)
## <<SimpleCorpus>>
## Metadata:  corpus specific: 1, document level (indexed): 0
## Content:  documents: 46
## 
##  [1]                                                                                                                                                                                                                                                                                                       
##  [2]   even though  face  difficulties  today  tomorrow  still   dream    dream deeply rooted   american dream                                                                                                                                                                                             
##  [3]                                                                                                                                                                                                                                                                                                       
##  [4]    dream  one day  nation will rise   live   true meaning   creed                                                                                                                                                                                                                                     
##  [5]                                                                                                                                                                                                                                                                                                       
##  [6]  hold  truths   selfevident   men  created equal                                                                                                                                                                                                                                                      
##  [7]                                                                                                                                                                                                                                                                                                       
##  [8]    dream  one day   red hills  georgia  sons  former slaves   sons  former slave owners will  able  sit  together   table  brotherhood                                                                                                                                                                
##  [9]                                                                                                                                                                                                                                                                                                       
## [10]    dream  one day even  state  mississippi  state sweltering   heat  injustice sweltering   heat  oppression will  transformed   oasis  freedom  justice                                                                                                                                              
## [11]                                                                                                                                                                                                                                                                                                       
## [12]    dream   four little children will one day live   nation   will   judged   color   skin    content   character                                                                                                                                                                                      
## [13]                                                                                                                                                                                                                                                                                                       
## [14]    dream today                                                                                                                                                                                                                                                                                        
## [15]                                                                                                                                                                                                                                                                                                       
## [16]    dream  one day   alabama   vicious racists   governor   lips dripping   words  interposition  nullification one day right   alabama little black boys  black girls will  able  join hands  little white boys  white girls  sisters  brothers                                                       
## [17]                                                                                                                                                                                                                                                                                                       
## [18]    dream today                                                                                                                                                                                                                                                                                        
## [19]                                                                                                                                                                                                                                                                                                       
## [20]    dream  one day every valley shall  exalted  every hill  mountain shall  made low  rough places will  made plain   crooked places will  made straight   glory   lord shall  revealed   flesh shall see  together                                                                                    
## [21]                                                                                                                                                                                                                                                                                                       
## [22]    hope     faith   go back   south                                                                                                                                                                                                                                                                   
## [23]                                                                                                                                                                                                                                                                                                       
## [24]   faith  will  able  hew    mountain  despair  stone  hope   faith  will  able  transform  jangling discords   nation   beautiful symphony  brotherhood   faith  will  able  work together  pray together  struggle together  go  jail together  stand   freedom together knowing   will  free one day
## [25]                                                                                                                                                                                                                                                                                                       
## [26]   will   day  will   day    god s children will  able  sing  new meaning                                                                                                                                                                                                                              
## [27]                                                                                                                                                                                                                                                                                                       
## [28]  country  tis  thee sweet land  liberty  thee  sing                                                                                                                                                                                                                                                   
## [29] land   fathers died land   pilgrim s pride                                                                                                                                                                                                                                                            
## [30]  every mountainside let freedom ring                                                                                                                                                                                                                                                                  
## [31]   america     great nation  must become true                                                                                                                                                                                                                                                          
## [32]   let freedom ring   prodigious hilltops  new hampshire                                                                                                                                                                                                                                               
## [33] let freedom ring   mighty mountains  new york                                                                                                                                                                                                                                                         
## [34] let freedom ring   heightening alleghenies  pennsylvania                                                                                                                                                                                                                                              
## [35] let freedom ring   snowcapped rockies  colorado                                                                                                                                                                                                                                                       
## [36] let freedom ring   curvaceous slopes  california                                                                                                                                                                                                                                                      
## [37]                                                                                                                                                                                                                                                                                                       
## [38]                                                                                                                                                                                                                                                                                                       
## [39] let freedom ring  stone mountain  georgia                                                                                                                                                                                                                                                             
## [40] let freedom ring  lookout mountain  tennessee                                                                                                                                                                                                                                                         
## [41] let freedom ring  every hill  molehill  mississippi                                                                                                                                                                                                                                                   
## [42]  every mountainside let freedom ring                                                                                                                                                                                                                                                                  
## [43]    happens   allow freedom ring   let  ring  every village  every hamlet  every state  every city  will  able  speed   day    god s children black men  white men jews  gentiles protestants  catholics will  able  join hands  sing   words   old negro spiritual                                    
## [44] free  last free  last                                                                                                                                                                                                                                                                                 
## [45]                                                                                                                                                                                                                                                                                                       
## [46] thank god almighty   free  last
tdm <- TermDocumentMatrix(corpus) 
m <- as.matrix(tdm) #Cuenta las veces que aparece cada palabra por renglón

frecuencia <- sort(rowSums(m), decreasing = TRUE) #cuenta la frecuencia de cada palabra en el texto completo

frecuencia_df <- data.frame(word=names (frecuencia),
                            freq= frecuencia) #Convierte la frecuecia en un data frame

ggplot(head(frecuencia_df, 10), aes(x=reorder (word, -freq), y=freq)) +
         geom_bar(stat="identity", fill="lightblue") + geom_text(aes(label=freq), vjust = -0.5)  +labs(title= "TOP 10 palabras más frecuentes", subtitle = "Discurso 'I have a Dream' de M. L. King", x="Palabra", y = "frecuencia") + ylim(0,20)

Nube de Palabras

# El procesamiento de datos antes de la nube de palabras es igual que en el Análisis de Frecuencias, desde importar el texto hasta frecuencia_df
set.seed(123)
wordcloud(words=frecuencia_df$word, freq=frecuencia_df$freq, min.freq = 1, random.order = FALSE, colors = brewer.pal(8, "RdPu"))

LS0tDQp0aXRsZTogIlRleHQgTWluaW5nIg0KYXV0aG9yOiAiRGllZ28gUGVyZXogYTAxMjc1NTYxIg0KZGF0ZTogIjIvMjYvMjAyNCINCm91dHB1dDogDQogIGh0bWxfZG9jdW1lbnQ6DQogICAgdG9jOiB0cnVlDQogICAgdG9jX2Zsb2F0OiB0cnVlDQogICAgY29kZV9kb3dubG9hZDogdHJ1ZSANCiAgICB0aGVtZTogImNvc21vIg0KLS0tDQoNCiFbXShDOlxcVXNlcnNcXERpZWdvIFDDqXJlelxcRG93bmxvYWRzXFxLQ2NpeHcuZ2lmKQ0KDQojIDxzcGFuIHN0eWxlPSJjb2xvcjogcmVkOyI+VGVvcsOtYTwvc3Bhbj4NCkxhICoqbWluZXLDrWEgZGUgdGV4dE8qKiAoVE0pIGVzIGVsIHByb2Nlc28gZGUgZXh0cmFlciBpbmZvcm1hY2nDs24gw7p0aWwgcGF0cm9uZXMgbyBjb25vY2ltaWVudG8gZGUgdGV4dG9zIG5vIGVzdHJ1Y3R1cmFkb3MuICANCiAgDQpDb25zdGEgZGUgMyBlc3RhcGFzOiAgDQoxLiBPYnRlbmVyIGRhdG9zOiBFbCByZWNvbm9jaW1pZW50byDDs3B0aWNvIGRlIGNhcmFjdGVyZXMgKE9DUikgZXMgdW5hIHRlY25vbG9nw61hIHF1ZSBwZXJtaXRlIGNvbnZlcnRpciBpbcOhZ2VuZXMgZGUgdGV4dG8gZWRpdGFibGUuIFRhbWJpw6luIGVzIGNvbm9jaWRvIGNvbW8gKipleHRyYWNjacOzbiBkZSB0ZXh0byBkZSBpbcOhZ2VuZXMqKi4gIA0KMi4gRXhwbG9yYXIgZGF0b3M6IFJlcHJlc2VudGFjacOzbiBncsOhZmljYSBvIHZpc3VhbCBkZSBsb3MgZGF0b3MgcGFyYSBzdSBpbnRlcnByZXRhY2nDs24uIExvcyBtw6l0b2RvcyBtw6FzIGNvbXVuZXMgc29uIGVsIEFuw6FsaXNpcyBkZSBTZW50aW1pZW50b3MsIGxhIE51YmUgZGUgUGFsYWJyYXMgeSBlbCBUb3BpYyBNb2RlbGluZy4gICANCjMuIEFuw6FsaXNpcyBwcmVkaWN0aXZvOiBTb24gbGFzIHTDqWNuaWNhcyB5IG1vZGVsb3Mgc3RhZMOtc3RpY29zIHBhcmEgcHJlZGVjaXIgcmVzdWx0YWRvcyBmdXR1cm9zLiBMb3MgbW9kZWxvcyBtw6FzIHVzYWRvcyBzb24gZWwgUmFuZG9tIEZvcmVzdCwgcmVkZXMgbmV1cm9uYWxlcyB5IHJlZ3Jlc2lvbmVzLiAgDQoNCiMgPHNwYW4gc3R5bGU9ImNvbG9yOiByZWQ7Ij4xLiBJbnN0YWxhciBwYXF1ZXRlcyB5IGxsYW1hciBsaWJyZXLDrWFzPC9zcGFuPg0KYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCiNpbnN0YWxsLnBhY2thZ2VzKCJ0aWR5dmVyc2UiKSAjRGF0YSAgd3JhbmdsaW5nDQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCiNpbnN0YWxsLnBhY2thZ2VzKCJ0ZXNzZXJhY3QiKSAjR2VuZXJhciBPQ1INCmxpYnJhcnkodGVzc2VyYWN0KQ0KI2luc3RhbGwucGFja2FnZXMoIm1hZ2ljayIpICNJbcOhZ2VuZXMgUE5HDQpsaWJyYXJ5KG1hZ2ljaykNCiNpbnN0YWxsLnBhY2thZ2VzKCJvZmZpY2VyIikgI0V4cG9ydGFyIGVuIGZvcm1hdG9zIG9mZmljZSAod29yZCkNCmxpYnJhcnkob2ZmaWNlcikNCiNpbnN0YWxsLnBhY2thZ2VzKCJwZGZ0b29scyIpICNMZWVyIFBERnMNCmxpYnJhcnkocGRmdG9vbHMpDQojaW5zdGFsbC5wYWNrYWdlcygicHVycnIiKSAjRnVuY2nDs24gTWFwIHBhcmEgYXBsaWNhciB1bmEgZnVuY2nDs24gYSBjYWRhIGVsZW1lbnRvIGRlIHVuIHZlY3Rvcg0KbGlicmFyeShwdXJycikNCiNpbnN0YWxsLnBhY2thZ2VzKCJ0bSIpICNUZXh0IE1pbmluZw0KbGlicmFyeSh0bSkNCiNpbnN0YWxsLnBhY2thZ2VzKCJSQ29sb3JCcmV3ZXIiKSAjQ29sb3Jlcw0KbGlicmFyeShSQ29sb3JCcmV3ZXIpDQojaW5zdGFsbC5wYWNrYWdlcygid29yZGNsb3VkIikgI051YmUgZGUgcGFsYWJyYXMNCmxpYnJhcnkod29yZGNsb3VkKQ0KI2luc3RhbGwucGFja2FnZXMoInRvcGljbW9kZWxzIikgI01vZGVsbyBkZSB0ZW1hcw0KbGlicmFyeSh0b3BpY21vZGVscykNCiNpbnN0YWxsLnBhY2thZ2VzKCJnZ3Bsb3QyIikNCmxpYnJhcnkoZ2dwbG90MikNCiNpbnN0YWxsLnBhY2thZ2VzKCJzdHJpbmdpIikNCmxpYnJhcnkoc3RyaW5naSkNCmBgYA0KDQojIDxzcGFuIHN0eWxlPSJjb2xvcjogcmVkOyI+Mi4gT2J0ZW5lciBEYXRvcyBtZWRpYW50ZSBPQ1I8L3NwYW4+DQoNCiMjIDxzcGFuIHN0eWxlPSJjb2xvcjogcmVkOyI+RGUgaW1hZ2VuIFBORyBhIHRleHRvIGVuIFdPUkQ8L3NwYW4+DQpgYGB7cn0NCklNQUdFTjE8LWltYWdlX3JlYWQoIkM6XFxVc2Vyc1xcRGllZ28gUMOpcmV6XFxEb3dubG9hZHNcXGltYWdlbjEuUE5HIikNCnRleHRvMTwtIG9jcihJTUFHRU4xKQ0KdGV4dG8xDQpkb2MxIDwtIHJlYWRfZG9jeCgpICNDcmVhIHVuIGRvY3VtZW50byBkZSB3b3JkIGVuIGJsYW5jbw0KZG9jMSA8LSBkb2MxICU+JSBib2R5X2FkZF9wYXIodGV4dG8xLCBzdHlsZSA9ICJOb3JtYWwiKSAjUGVnYSBlbCB0ZXh0byBlbiBlbCB3b3JkDQojcHJpbnQoZG9jMSwgdGFyZ2V0PSAidGV4dG8xLmRvY3giKSAjR3VhcmRhIGVsIHdvcmQgZW4gbGEgY29tcHV0YWRvcmENCmBgYA0KDQoNCiMjIDxzcGFuIHN0eWxlPSJjb2xvcjogcmVkOyI+SW1hZ2VuIGVuIEVzcGHDsW9sIFBORyBhIHRleHRvIGVuIFdPUkQ8L3NwYW4+DQpbQ29zdWx0YXIgaWRpb21hcyBkaXNwb25pYmxlc10oaHR0cHM6Ly90ZXNzZXJhY3Qtb2NyLmdpdGh1Yi5pby90ZXNzZG9jL0RhdGEtRmlsZXMtaW4tZGlmZmVyZW50LXZlcnNpb25zLmh0bWwpDQpgYGB7cn0NCklNQUdFTjI8LWltYWdlX3JlYWQoIkM6XFxVc2Vyc1xcRGllZ28gUMOpcmV6XFxEb3dubG9hZHNcXGltYWdlbjIuUE5HIikNCnRlc3NlcmFjdF9kb3dubG9hZCgic3BhIikNCnRleHRvMjwtIG9jcihJTUFHRU4yLCBlbmdpbmUgPSB0ZXNzZXJhY3QoInNwYSIpKQ0KdGV4dG8yDQpkb2MyIDwtIHJlYWRfZG9jeCgpICNDcmVhIHVuIGRvY3VtZW50byBkZSB3b3JkIGVuIGJsYW5jbw0KZG9jMiA8LSBkb2MyICU+JSBib2R5X2FkZF9wYXIodGV4dG8yLCBzdHlsZSA9ICJOb3JtYWwiKSAjUGVnYSBlbCB0ZXh0byBlbiBlbCB3b3JkDQojcHJpbnQoZG9jMiwgdGFyZ2V0PSAidGV4dG8yLmRvY3giKSAjR3VhcmRhIGVsIHdvcmQgZW4gbGEgY29tcHV0YWRvcmENCmBgYA0KDQojIyA8c3BhbiBzdHlsZT0iY29sb3I6IHJlZDsiPkRlIFBERiBhIHRleHRvIGVuIFdPUkQ8L3NwYW4+DQpgYGB7cn0NCiNwZGYxIDwtIHBkZl9jb252ZXJ0KCJDOlxcVXNlcnNcXERpZWdvIFDDqXJlelxcRG93bmxvYWRzXFxwZGYxLnBkZiIsIGRwaSA9IDYwMCkgJT4lIG1hcChvY3IpDQpgYGANCiMjIDxzcGFuIHN0eWxlPSJjb2xvcjogcmVkOyI+QWN0aXZpZGFkIDEuIE5vdmVsYSAiSVQiPC9zcGFuPg0KDQojIyMgQ29udGV4dG8NCkxhIG5vdmVsYSAiSVQiIHNlIGNhbWJpYXJhIGEgdW4gZG9jdW1lbnRvIGVuIFdPUkQuDQoNCiMjIyBQYXNvIDEuIGNvbnZlcnRpciBlbCBwZGYgYSBpbWFnZW4NCmBgYHtyfQ0KcGRmMiA8LSBwZGZfY29udmVydCgiQzpcXFVzZXJzXFxEaWVnbyBQw6lyZXpcXERvd25sb2Fkc1xcZXNvMy5wZGYiLCBkcGkgPSA2MDApICU+JSBtYXAob2NyKQ0KYGBgDQojIyMgUGFzbyAyLiBPYnRlbmVyIHRleHRvIGRlIGNhZGEgUE5HDQpgYGB7cn0NCiNmaWxlLmNob29zZSgpDQpJTUFHRU5fSVQxPC1pbWFnZV9yZWFkKCJDOlxcVXNlcnNcXERpZWdvIFDDqXJlelxcRG93bmxvYWRzXFxlc28zXzEucG5nIikNCklNQUdFTl9JVDI8LWltYWdlX3JlYWQoIkM6XFxVc2Vyc1xcRGllZ28gUMOpcmV6XFxEb3dubG9hZHNcXGVzbzNfMi5wbmciKQ0KSU1BR0VOX0lUMzwtaW1hZ2VfcmVhZCgiQzpcXFVzZXJzXFxEaWVnbyBQw6lyZXpcXERvd25sb2Fkc1xcZXNvM18zLnBuZyIpDQp0ZXNzZXJhY3RfZG93bmxvYWQoInNwYSIpDQp0ZXh0b19pdDE8LSBvY3IoSU1BR0VOX0lUMSwgZW5naW5lID0gdGVzc2VyYWN0KCJzcGEiKSkNCnRleHRvX2l0MQ0KdGV4dG9faXQyPC0gb2NyKElNQUdFTl9JVDIsIGVuZ2luZSA9IHRlc3NlcmFjdCgic3BhIikpDQp0ZXh0b19pdDINCnRleHRvX2l0MzwtIG9jcihJTUFHRU5fSVQzLCBlbmdpbmUgPSB0ZXNzZXJhY3QoInNwYSIpKQ0KdGV4dG9faXQzDQpkb2NfaXQgPC0gcmVhZF9kb2N4KCkgI0NyZWEgdW4gZG9jdW1lbnRvIGRlIHdvcmQgZW4gYmxhbmNvDQpkb2NfaXQgPC0gZG9jX2l0ICU+JSBib2R5X2FkZF9wYXIodGV4dG9faXQxLCBzdHlsZSA9ICJOb3JtYWwiKSAlPiUgYm9keV9hZGRfcGFyKHRleHRvX2l0Miwgc3R5bGUgPSAiTm9ybWFsIikgJT4lIGJvZHlfYWRkX3Bhcih0ZXh0b19pdDMsIHN0eWxlID0gIk5vcm1hbCIpICNQZWdhIGVsIHRleHRvIGVuIGVsIHdvcmQNCnByaW50KGRvY19pdCwgdGFyZ2V0PSAidGV4dG9faXQuZG9jeCIpICNHdWFyZGEgZWwgd29yZCBlbiBsYSBjb21wdXRhZG9yYQ0KYGBgDQoNCiMgPHNwYW4gc3R5bGU9ImNvbG9yOiByZWQ7Ij4yLiBFeHBsb3JhY2nDs24gZGUgRGF0b3M8L3NwYW4+DQoNCiMjIDxzcGFuIHN0eWxlPSJjb2xvcjogcmVkOyI+QW7DoWxpc2lzIGRlIEZyZWN1ZW5jaWFzPC9zcGFuPg0KYGBge3J9DQp0ZXh0IDwtIHJlYWRMaW5lcygiaHR0cDovL3d3dy5zdGhkYS5jb20vc3RoZGEvUkRvYy9leGFtcGxlLWZpbGVzL21hcnRpbi1sdXRoZXIta2luZy1pLWhhdmUtYS1kcmVhbS1zcGVlY2gudHh0IikgI1RyYWVyIHUgdGV4dG8gZGUgaW50ZXJuZXQNCmNvcnB1czwtIENvcnB1cyhWZWN0b3JTb3VyY2UodGV4dCkpICNQb25lIGNhZGEgcmVuZ2zDs24gZW4gdW5hIGNlbGRhIGRlIHZlY3Rvcg0KI2luc3BlY3QoQ29ycHVzKQ0KY29ycHVzPC0gdG1fbWFwKGNvcnB1cywgY29udGVudF90cmFuc2Zvcm1lcih0b2xvd2VyKSkNCiNtaW7DunNjdWxhcw0KY29ycHVzIDwtIHRtX21hcChjb3JwdXMsIHJlbW92ZVB1bmN0dWF0aW9uKSAjIEVsaW1pbmEgcHVudHVhY2nDs24NCmNvcnB1cyA8LSB0bV9tYXAoY29ycHVzLCByZW1vdmVOdW1iZXJzKSAjIEVsaW1pbmEgbsO6bWVyb3MNCmNvcnB1cyA8LSB0bV9tYXAoY29ycHVzLCByZW1vdmVXb3Jkcywgc3RvcHdvcmRzKCJlbiIpKSAjIEVsaW1pbmEgcGFsYWJyYXMgcXVlIG5vIGhhYmxhbiBkZWwgdGVtYQ0KI2NvcnB1cyA8LSB0bV9tYXAoY29ycHVzLCByZW1vdmVXb3JkcywgYygiZHJlYW0iLCAid2lsbCIpKSAjRWxpbWluYSBwYWxhYnJhcyBwdW50dWFsZXMNCmluc3BlY3QoY29ycHVzKQ0KDQp0ZG0gPC0gVGVybURvY3VtZW50TWF0cml4KGNvcnB1cykgDQptIDwtIGFzLm1hdHJpeCh0ZG0pICNDdWVudGEgbGFzIHZlY2VzIHF1ZSBhcGFyZWNlIGNhZGEgcGFsYWJyYSBwb3IgcmVuZ2zDs24NCg0KZnJlY3VlbmNpYSA8LSBzb3J0KHJvd1N1bXMobSksIGRlY3JlYXNpbmcgPSBUUlVFKSAjY3VlbnRhIGxhIGZyZWN1ZW5jaWEgZGUgY2FkYSBwYWxhYnJhIGVuIGVsIHRleHRvIGNvbXBsZXRvDQoNCmZyZWN1ZW5jaWFfZGYgPC0gZGF0YS5mcmFtZSh3b3JkPW5hbWVzIChmcmVjdWVuY2lhKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmVxPSBmcmVjdWVuY2lhKSAjQ29udmllcnRlIGxhIGZyZWN1ZWNpYSBlbiB1biBkYXRhIGZyYW1lDQoNCmdncGxvdChoZWFkKGZyZWN1ZW5jaWFfZGYsIDEwKSwgYWVzKHg9cmVvcmRlciAod29yZCwgLWZyZXEpLCB5PWZyZXEpKSArDQogICAgICAgICBnZW9tX2JhcihzdGF0PSJpZGVudGl0eSIsIGZpbGw9ImxpZ2h0Ymx1ZSIpICsgZ2VvbV90ZXh0KGFlcyhsYWJlbD1mcmVxKSwgdmp1c3QgPSAtMC41KSAgK2xhYnModGl0bGU9ICJUT1AgMTAgcGFsYWJyYXMgbcOhcyBmcmVjdWVudGVzIiwgc3VidGl0bGUgPSAiRGlzY3Vyc28gJ0kgaGF2ZSBhIERyZWFtJyBkZSBNLiBMLiBLaW5nIiwgeD0iUGFsYWJyYSIsIHkgPSAiZnJlY3VlbmNpYSIpICsgeWxpbSgwLDIwKQ0KICAgICAgIA0KYGBgDQoNCiMjIDxzcGFuIHN0eWxlPSJjb2xvcjogcmVkOyI+TnViZSBkZSBQYWxhYnJhczwvc3Bhbj4NCmBgYHtyfQ0KIyBFbCBwcm9jZXNhbWllbnRvIGRlIGRhdG9zIGFudGVzIGRlIGxhIG51YmUgZGUgcGFsYWJyYXMgZXMgaWd1YWwgcXVlIGVuIGVsIEFuw6FsaXNpcyBkZSBGcmVjdWVuY2lhcywgZGVzZGUgaW1wb3J0YXIgZWwgdGV4dG8gaGFzdGEgZnJlY3VlbmNpYV9kZg0Kc2V0LnNlZWQoMTIzKQ0Kd29yZGNsb3VkKHdvcmRzPWZyZWN1ZW5jaWFfZGYkd29yZCwgZnJlcT1mcmVjdWVuY2lhX2RmJGZyZXEsIG1pbi5mcmVxID0gMSwgcmFuZG9tLm9yZGVyID0gRkFMU0UsIGNvbG9ycyA9IGJyZXdlci5wYWwoOCwgIlJkUHUiKSkNCg0KYGBgDQo=