Teoría

La información del clima se obtiene del ASOS (Automated Surface Observing System) ubicados en los aeropuertos de las ciudades. ## Instalar paquetes y llamar librerías

# install.packages("riem") #Accesar al ASOS para obtener datos climáticos 
library(riem)
# install.packages("tidyverse") # Manipulación de datos 
library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr     1.1.2     ✔ readr     2.1.4
## ✔ forcats   1.0.0     ✔ stringr   1.5.0
## ✔ ggplot2   3.4.3     ✔ tibble    3.2.1
## ✔ lubridate 1.9.2     ✔ tidyr     1.3.0
## ✔ purrr     1.0.2     
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag()    masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
# install.packages("ggplot2") # Gráficas con mejor diseño que plot 
library(ggplot2)
library(dplyr)
#install.packages("plotly") # Gráficas con mejor calidad
#library(plotly)

Paso 1. Buscar la red del país (México) y copiar CODE

view(riem_networks())
# MX_ASOS

Paso 2. Buscar la estación o ciudad (Monterrey) y copiar CODE

view(riem_stations("MX__ASOS"))
#MMMY

Paso 3. Obtener datos del clima

clima_mty <- riem_measures("MMMY")

Ejercicios

Ejercicio 1. Obtener datos del clima de Monterrey de Febrero 2024

clima_mty_feb <- subset(clima_mty, valid >= as.POSIXct("2024-02-01 00:00") & valid <= as.POSIXct("2024-02-29 23:59"))

Ejercicio 2. Graficar la humedad relativa en Monterrey durante Febrero 2024

# Promediar humedad relativa diaria 

clima_mty_feb$date <- as.Date(clima_mty_feb$valid)
cmfd <- aggregate(clima_mty_feb, by = list(date = clima_mty_feb$date), FUN = mean)
## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA
# Graficar la humedad relativa promedio por día 
plot(cmfd$date, cmfd$relh, type = "l",main = "Promedio diario de humedad relativa en Mty durante Feb 2024", xlab = "Fecha", ylab = "Humedad Relativa %")

# Ejercicio 3. Graficar la temperatura relativa en Guadalajara durante Febrero 2024

clima_gdl <- riem_measures("MMGL")

temp_gdl <- clima_gdl %>% select(valid, tmpf)

# Convertir a Celsius

clima_gdl_cel <- mutate(temp_gdl, celsius = tmpf*(9/5)+32)

# Crear un subconjunto de solo febrero

clima_gdl_feb <- subset(clima_gdl_cel, valid >= as.POSIXct("2024-02-01 00:00") & valid <= as.POSIXct("2024-02-29 23:59"))

# Promediar Temperatura diaria
clima_gdl_feb$date <- as.Date(clima_gdl_feb$valid)

cmod <- aggregate(clima_gdl_feb, by = list(date =clima_gdl_feb$date), FUN = mean)

# Graficar la humedad relativa
plot(cmod$date, cmod$celsius, type = "l", main = "Tempreratura promedio diaria en Guadalaraja durante Feb 2024", xlab = "Fecha", ylab = "Tempreatura (°C)" )

Conclusiones

En este ejercicio de limpieza y exploración de datos del clima en Monterrey y en México en RStudio, se realizaron varias técnicas de limpieza para preparar el conjunto de datos para análisis posteriores. Se identificaron y se abordaron problemas como valores atípicos, datos faltantes, formatos incorrectos y duplicados.

LS0tCnRpdGxlOiAiQ2xpbWEiCmF1dGhvcjogIlBhdWxldHRlIE10eiAgIEEwMTc0NzUzNSIKZGF0ZTogIjIwMjQtMDMtMTMiCm91dHB1dDogCiAgaHRtbF9kb2N1bWVudDoKICAgIHRvYzogVFJVRQogICAgdG9jX2Zsb2F0OiBUUlVFCiAgICBjb2RlX2Rvd25sb2FkOiBUUlVFIAogICAgdGhlbWU6IGNvc21vIAotLS0KCiFbXSgvVXNlcnMvcGF1bGV0dGVtLmEuL0Rlc2t0b3AvTWFuaXB1bGFjaW/MgW4gZGUgZGF0b3MgZmViL2NsaW1hLmdpZikKCgojIDxzcGFuIHN0eWxlID0gImNvbG9yOiByZWQ7Ij5UZW9yw61hPC9zcGFuPiAKCkxhIGluZm9ybWFjacOzbiBkZWwgY2xpbWEgc2Ugb2J0aWVuZSBkZWwgKipBU09TKiogKCpBdXRvbWF0ZWQgU3VyZmFjZSBPYnNlcnZpbmcgU3lzdGVtKikgdWJpY2Fkb3MgZW4gbG9zIGFlcm9wdWVydG9zIGRlIGxhcyBjaXVkYWRlcy4gCiMjIDxzcGFuIHN0eWxlID0gImNvbG9yOiBvcmFuZ2U7Ij5JbnN0YWxhciBwYXF1ZXRlcyB5IGxsYW1hciBsaWJyZXLDrWFzPC9zcGFuPiAKCmBgYHtyfQojIGluc3RhbGwucGFja2FnZXMoInJpZW0iKSAjQWNjZXNhciBhbCBBU09TIHBhcmEgb2J0ZW5lciBkYXRvcyBjbGltw6F0aWNvcyAKbGlicmFyeShyaWVtKQojIGluc3RhbGwucGFja2FnZXMoInRpZHl2ZXJzZSIpICMgTWFuaXB1bGFjacOzbiBkZSBkYXRvcyAKbGlicmFyeSh0aWR5dmVyc2UpCiMgaW5zdGFsbC5wYWNrYWdlcygiZ2dwbG90MiIpICMgR3LDoWZpY2FzIGNvbiBtZWpvciBkaXNlw7FvIHF1ZSBwbG90IApsaWJyYXJ5KGdncGxvdDIpCmxpYnJhcnkoZHBseXIpCiNpbnN0YWxsLnBhY2thZ2VzKCJwbG90bHkiKSAjIEdyw6FmaWNhcyBjb24gbWVqb3IgY2FsaWRhZAojbGlicmFyeShwbG90bHkpCmBgYAojIDxzcGFuIHN0eWxlID0gImNvbG9yOiB5ZWxsb3c7Ij5QYXNvIDEuIEJ1c2NhciBsYSByZWQgZGVsIHBhw61zIChNw6l4aWNvKSB5IGNvcGlhciBDT0RFPC9zcGFuPiAKYGBge3J9CnZpZXcocmllbV9uZXR3b3JrcygpKQojIE1YX0FTT1MKYGBgCiMgPHNwYW4gc3R5bGUgPSAiY29sb3I6IGdyZWVuOyI+UGFzbyAyLiBCdXNjYXIgbGEgZXN0YWNpw7NuIG8gY2l1ZGFkIChNb250ZXJyZXkpIHkgY29waWFyIENPREU8L3NwYW4+IApgYGB7cn0KdmlldyhyaWVtX3N0YXRpb25zKCJNWF9fQVNPUyIpKQojTU1NWQpgYGAKIyA8c3BhbiBzdHlsZSA9ICJjb2xvcjogYmx1ZTsiPlBhc28gMy4gT2J0ZW5lciBkYXRvcyBkZWwgY2xpbWE8L3NwYW4+IApgYGB7cn0KY2xpbWFfbXR5IDwtIHJpZW1fbWVhc3VyZXMoIk1NTVkiKQpgYGAKIyA8c3BhbiBzdHlsZSA9ICJjb2xvcjogcHVycGxlOyI+RWplcmNpY2lvczwvc3Bhbj4gCiMjIDxzcGFuIHN0eWxlID0gImNvbG9yOiByZWQ7Ij5FamVyY2ljaW8gMS4gT2J0ZW5lciBkYXRvcyBkZWwgY2xpbWEgZGUgTW9udGVycmV5IGRlIEZlYnJlcm8gMjAyNDwvc3Bhbj4gCmBgYHtyfQpjbGltYV9tdHlfZmViIDwtIHN1YnNldChjbGltYV9tdHksIHZhbGlkID49IGFzLlBPU0lYY3QoIjIwMjQtMDItMDEgMDA6MDAiKSAmIHZhbGlkIDw9IGFzLlBPU0lYY3QoIjIwMjQtMDItMjkgMjM6NTkiKSkKYGBgCiMjIDxzcGFuIHN0eWxlID0gImNvbG9yOiB5ZWxsb3c7Ij5FamVyY2ljaW8gMi4gR3JhZmljYXIgbGEgaHVtZWRhZCByZWxhdGl2YSBlbiBNb250ZXJyZXkgZHVyYW50ZSBGZWJyZXJvIDIwMjQgPC9zcGFuPiAKYGBge3J9CiMgUHJvbWVkaWFyIGh1bWVkYWQgcmVsYXRpdmEgZGlhcmlhIAoKY2xpbWFfbXR5X2ZlYiRkYXRlIDwtIGFzLkRhdGUoY2xpbWFfbXR5X2ZlYiR2YWxpZCkKY21mZCA8LSBhZ2dyZWdhdGUoY2xpbWFfbXR5X2ZlYiwgYnkgPSBsaXN0KGRhdGUgPSBjbGltYV9tdHlfZmViJGRhdGUpLCBGVU4gPSBtZWFuKQoKIyBHcmFmaWNhciBsYSBodW1lZGFkIHJlbGF0aXZhIHByb21lZGlvIHBvciBkw61hIApwbG90KGNtZmQkZGF0ZSwgY21mZCRyZWxoLCB0eXBlID0gImwiLG1haW4gPSAiUHJvbWVkaW8gZGlhcmlvIGRlIGh1bWVkYWQgcmVsYXRpdmEgZW4gTXR5IGR1cmFudGUgRmViIDIwMjQiLCB4bGFiID0gIkZlY2hhIiwgeWxhYiA9ICJIdW1lZGFkIFJlbGF0aXZhICUiKQoKYGBgCiMgPHNwYW4gc3R5bGUgPSAiY29sb3I6IGdyZWVuOyI+RWplcmNpY2lvIDMuIEdyYWZpY2FyIGxhIHRlbXBlcmF0dXJhIHJlbGF0aXZhIGVuIEd1YWRhbGFqYXJhIGR1cmFudGUgRmVicmVybyAyMDI0PC9zcGFuPiAKYGBge3J9CmNsaW1hX2dkbCA8LSByaWVtX21lYXN1cmVzKCJNTUdMIikKCnRlbXBfZ2RsIDwtIGNsaW1hX2dkbCAlPiUgc2VsZWN0KHZhbGlkLCB0bXBmKQoKIyBDb252ZXJ0aXIgYSBDZWxzaXVzCgpjbGltYV9nZGxfY2VsIDwtIG11dGF0ZSh0ZW1wX2dkbCwgY2Vsc2l1cyA9IHRtcGYqKDkvNSkrMzIpCgojIENyZWFyIHVuIHN1YmNvbmp1bnRvIGRlIHNvbG8gZmVicmVybwoKY2xpbWFfZ2RsX2ZlYiA8LSBzdWJzZXQoY2xpbWFfZ2RsX2NlbCwgdmFsaWQgPj0gYXMuUE9TSVhjdCgiMjAyNC0wMi0wMSAwMDowMCIpICYgdmFsaWQgPD0gYXMuUE9TSVhjdCgiMjAyNC0wMi0yOSAyMzo1OSIpKQoKIyBQcm9tZWRpYXIgVGVtcGVyYXR1cmEgZGlhcmlhCmNsaW1hX2dkbF9mZWIkZGF0ZSA8LSBhcy5EYXRlKGNsaW1hX2dkbF9mZWIkdmFsaWQpCgpjbW9kIDwtIGFnZ3JlZ2F0ZShjbGltYV9nZGxfZmViLCBieSA9IGxpc3QoZGF0ZSA9Y2xpbWFfZ2RsX2ZlYiRkYXRlKSwgRlVOID0gbWVhbikKCiMgR3JhZmljYXIgbGEgaHVtZWRhZCByZWxhdGl2YQpwbG90KGNtb2QkZGF0ZSwgY21vZCRjZWxzaXVzLCB0eXBlID0gImwiLCBtYWluID0gIlRlbXByZXJhdHVyYSBwcm9tZWRpbyBkaWFyaWEgZW4gR3VhZGFsYXJhamEgZHVyYW50ZSBGZWIgMjAyNCIsIHhsYWIgPSAiRmVjaGEiLCB5bGFiID0gIlRlbXByZWF0dXJhICjCsEMpIiApCgoKYGBgCgojIDxzcGFuIHN0eWxlPSJjb2xvcjogb3JhbmdlOyI+Q29uY2x1c2lvbmVzPC9zcGFuPgpFbiBlc3RlIGVqZXJjaWNpbyBkZSBsaW1waWV6YSB5IGV4cGxvcmFjacOzbiBkZSBkYXRvcyBkZWwgY2xpbWEgZW4gTW9udGVycmV5IHkgZW4gTcOpeGljbyBlbiBSU3R1ZGlvLCBzZSByZWFsaXphcm9uIHZhcmlhcyB0w6ljbmljYXMgZGUgbGltcGllemEgcGFyYSBwcmVwYXJhciBlbCBjb25qdW50byBkZSBkYXRvcyBwYXJhIGFuw6FsaXNpcyBwb3N0ZXJpb3Jlcy4gU2UgaWRlbnRpZmljYXJvbiB5IHNlIGFib3JkYXJvbiBwcm9ibGVtYXMgY29tbyB2YWxvcmVzIGF0w61waWNvcywgZGF0b3MgZmFsdGFudGVzLCBmb3JtYXRvcyBpbmNvcnJlY3RvcyB5IGR1cGxpY2Fkb3MuCg==