Ejercicio 1
library(MASS)
data(ships)
head(ships)
## type year period service incidents
## 1 A 60 60 127 0
## 2 A 60 75 63 0
## 3 A 65 60 1095 3
## 4 A 65 75 1095 4
## 5 A 70 60 1512 6
## 6 A 70 75 3353 18
a)¿Cuántas filas y variables tiene
esta base de datos?
dim (ships)
## [1] 40 5
# 2da manera
str (ships)
## 'data.frame': 40 obs. of 5 variables:
## $ type : Factor w/ 5 levels "A","B","C","D",..: 1 1 1 1 1 1 1 1 2 2 ...
## $ year : int 60 60 65 65 70 70 75 75 60 60 ...
## $ period : int 60 75 60 75 60 75 60 75 60 75 ...
## $ service : int 127 63 1095 1095 1512 3353 0 2244 44882 17176 ...
## $ incidents: int 0 0 3 4 6 18 0 11 39 29 ...
b) ¿Hay alguna variable cualitativa?
¿Está almacenada en R como factor, integer o num?
Si, la variable “type” esta registrada como factor
c)Representa los boxplots de la
variable incidentes por tipo de barcoen un mismo gráfico.
boxplot(ships$incidents~ ships$type, col=c("aquamarine","pink", "ivory1","navajowhite1","skyblue1"),
main="INCIDENTES", xlab="Incidentes", ylab="Tipo")
medias <- tapply(ships$incidents, ships$type, mean, na.rm=TRUE)
points(1:length(medias), medias, col=c("yellow"), pch=16)

¿En cuáles ves datos
atípicos?
En los incidentes C y D
d) Dibuja el histograma y el boxplot
de los incidentes de los barcos uno al lado del otro en el mismo
canvas
par(mfrow=c(1,2))
boxplot(ships$incidents, col=c("pink"),
main="INCIDENTES")
points(1,mean(ships$incidents), col="yellow", pch=16)
hist(ships$incidents, col=c("skyblue1","pink", "plum1","navajowhite1","aquamarine","ivory1"), main="Hisotgrama de Incidentes",
xlab="Incidentes", ylab="Frecuencias")
abline(v=mean(ships$incidents, na.rm=TRUE), col="yellow", lty=2)

¿Qué tipo de asimetría presenta la
variable incidentes?
La variable “Incidentes” muestra una asimetría positiva. En el
histograma, se observa que la cola larga está hacia la derecha, lo que
indica que la mayoría de los barcos tienen pocos incidentes, pero hay
algunos con valores atípicos que presentan un número significativamente
mayor de incidentes. Por otro lado, el boxplot confirma esta asimetría
positiva, ya que la mediana está más cerca del borde inferior de la
caja, lo que significa que la mayoría de los datos son valores bajos.
Además, el bigote superior es más largo, lo que indica una mayor
dispersión en los valores altos, asimismo la existencia de valores
atipicos, confirman que hay incidentes excepcionalmente altos que
afectan la distribución.
e) Crea una nueva base de datos, que
se llame ships_new en la que todas las variables son iguales a las
originales, salvo type: deberás seleccionar solo los valores de la
variable que sean iguales a A.
ships_new<- subset(ships, type=="A")
head(ships_new)
## type year period service incidents
## 1 A 60 60 127 0
## 2 A 60 75 63 0
## 3 A 65 60 1095 3
## 4 A 65 75 1095 4
## 5 A 70 60 1512 6
## 6 A 70 75 3353 18
#2da Manera
library(dplyr)
##
## Attaching package: 'dplyr'
## The following object is masked from 'package:MASS':
##
## select
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
ships_new2 <- ships%>%filter(type == "A")
head(ships_new2)
## type year period service incidents
## 1 A 60 60 127 0
## 2 A 60 75 63 0
## 3 A 65 60 1095 3
## 4 A 65 75 1095 4
## 5 A 70 60 1512 6
## 6 A 70 75 3353 18
g) Coloca los resultados del apartado
anterior en una tabla con dos columnas, una será el nombre del
estadístico y otra contendrá su valor.
min_inc <- min(ships_new$incidents)
max_inc <- max(ships_new$incidents)
mean_inc <- mean(ships_new$incidents)
sd_inc <- sd(ships_new$incidents)
tabla_estadisticos <- data.frame(
Estadístico = c("Mínimo", "Máximo", "Media", "Desviación Estándar"),
Valor = c(min_inc, max_inc, mean_inc, sd_inc))
print(tabla_estadisticos)
## Estadístico Valor
## 1 Mínimo 0.000000
## 2 Máximo 18.000000
## 3 Media 5.250000
## 4 Desviación Estándar 6.386369
Ejercicio 2
head(USArrests)
## Murder Assault UrbanPop Rape
## Alabama 13.2 236 58 21.2
## Alaska 10.0 263 48 44.5
## Arizona 8.1 294 80 31.0
## Arkansas 8.8 190 50 19.5
## California 9.0 276 91 40.6
## Colorado 7.9 204 78 38.7
a) ¿Hay valores NA en la base de
datos? En caso de que los contenga, cuenta cuántos son y elimínalos de
la base de datos.
sum(is.na((USArrests)))
## [1] 0
b) Crea una nueva base de datos, que
se llame USArrests_new en la que todas las variables son iguales a las
originales, salvo Rape: deberás seleccionar los valores de la variable
Rape que sean mayores que 4.
USArrests_new<-subset(USArrests, Rape>4)
head(USArrests_new)
## Murder Assault UrbanPop Rape
## Alabama 13.2 236 58 21.2
## Alaska 10.0 263 48 44.5
## Arizona 8.1 294 80 31.0
## Arkansas 8.8 190 50 19.5
## California 9.0 276 91 40.6
## Colorado 7.9 204 78 38.7
c) Utilizando la nueva base
USArrests_new, obtén el gráfico de dispersión de las variables Rape (eje
x) y Murder (eje y)
plot(USArrests_new$Rape, USArrests_new$Murder, col= "lightskyblue", xlab="Rape", ylab= "Murder", pch=16)

d) Cambia el rango de los ejes del
gráfico anterior: el eje y debe ir desde 0 hasta 20 y el eje x desde 0
hasta 50.
plot(USArrests_new$Rape, USArrests_new$Murder, col= "lightskyblue", xlab="Rape", ylab= "Murder", pch=16,xlim=c(0,50), ylim=c(0,20))

Ejercicio 3
head(mtcars)
## mpg cyl disp hp drat wt qsec vs am gear carb
## Mazda RX4 21.0 6 160 110 3.90 2.620 16.46 0 1 4 4
## Mazda RX4 Wag 21.0 6 160 110 3.90 2.875 17.02 0 1 4 4
## Datsun 710 22.8 4 108 93 3.85 2.320 18.61 1 1 4 1
## Hornet 4 Drive 21.4 6 258 110 3.08 3.215 19.44 1 0 3 1
## Hornet Sportabout 18.7 8 360 175 3.15 3.440 17.02 0 0 3 2
## Valiant 18.1 6 225 105 2.76 3.460 20.22 1 0 3 1
mtcars <- mtcars
a) Añade al dataframe una variable de
nombre am_new que sea de tipo factor en la que haya dos categorías,
transmisión automática o manual, a partir de la variable am
mtcars$am_new <- ifelse(mtcars$am == 0, "automático", "manual")
mtcars$am_new <- factor(mtcars$am_new)
b) Representa el diagrama de barras
que muestre el número de coches por tipo de transmisión
plot(mtcars$am_new, main = "Tipo de Transmisión",
xlab = "Transmisión", ylab = "Frecuencia", col= "palegreen4" )

c) Representa el gráfico de sectores
que muestre el número de coches por tipo de transmisión
counts <- table(mtcars$am_new)
pie(counts, labels = names(counts), main = "Número de coches por tipo de transmisión", col = c("pink", "skyblue"))

Ejercicio 5
Reproduce el gráfico que se muestra a
continuación sobre la base de datos PimaIndiansDiabetes. Para acceder a
dicha base, instala y carga el paquete mlbench. Las variables a utilizar
son mass, glucose and diabetes
#install.packages("mlbench")
library(mlbench)
## Warning: package 'mlbench' was built under R version 4.3.3
data(PimaIndiansDiabetes)
plot(x=PimaIndiansDiabetes$mass, y=PimaIndiansDiabetes$glucose, col= PimaIndiansDiabetes$diabetes, pch=16, xlab = "Mass", ylab = "Glucose")
legend(x = "topright", legend = c("neg", "pos"), fill = c("Black", "Red"))

LS0tCnRpdGxlOiAiRWplcmNpY2lvcyIKYXV0aG9yOiAiS2FybGEgTWlyZXlhIFZlbGRlcnJhaW4iCmRhdGU6ICIyMDI1LTAzLTE0IgpvdXRwdXQ6IAogIGh0bWxfZG9jdW1lbnQ6CiAgICB0b2M6IFRSVUUKICAgIHRvY19mbG9hdDogVFJVRQogICAgY29kZV9kb3dubG9hZDogVFJVRQogICAgdGhlbWU6IGNvc21vCi0tLQojIDxzcGFuIHN0eWxlID0gImNvbG9yOiAjQ0Q5NkNEOyI+RWplcmNpY2lvIDE8L3NwYW4+CgpgYGB7cn0KbGlicmFyeShNQVNTKQpkYXRhKHNoaXBzKSAgCmBgYAoKYGBge3J9CmhlYWQoc2hpcHMpCmBgYAoKIyMgPHNwYW4gc3R5bGUgPSAiY29sb3I6ICM2M0I4RkY7Ij4gYSnCv0N1w6FudGFzIGZpbGFzIHkgdmFyaWFibGVzIHRpZW5lIGVzdGEgYmFzZSBkZSBkYXRvcz88L3NwYW4+CgpgYGB7cn0KZGltIChzaGlwcykKYGBgCmBgYHtyfQojIDJkYSBtYW5lcmEKc3RyIChzaGlwcykKYGBgCiMjIDxzcGFuIHN0eWxlID0gImNvbG9yOiAjNjNCOEZGOyI+IGIpIMK/SGF5IGFsZ3VuYSB2YXJpYWJsZSBjdWFsaXRhdGl2YT8gwr9Fc3TDoSBhbG1hY2VuYWRhIGVuIFIgY29tbyBmYWN0b3IsIGludGVnZXIgbyBudW0/PC9zcGFuPgoKU2ksIGxhIHZhcmlhYmxlICJ0eXBlIiBlc3RhIHJlZ2lzdHJhZGEgY29tbyBmYWN0b3IKCiMjIDxzcGFuIHN0eWxlID0gImNvbG9yOiAjNjNCOEZGOyI+IGMpUmVwcmVzZW50YSBsb3MgYm94cGxvdHMgZGUgbGEgdmFyaWFibGUgaW5jaWRlbnRlcyBwb3IgdGlwbyBkZSBiYXJjb2VuIHVuIG1pc21vIGdyw6FmaWNvLiAgPC9zcGFuPgoKYGBge3J9CmJveHBsb3Qoc2hpcHMkaW5jaWRlbnRzfiBzaGlwcyR0eXBlLCBjb2w9YygiYXF1YW1hcmluZSIsInBpbmsiLCAiaXZvcnkxIiwibmF2YWpvd2hpdGUxIiwic2t5Ymx1ZTEiKSwKICAgICAgICBtYWluPSJJTkNJREVOVEVTIiwgeGxhYj0iSW5jaWRlbnRlcyIsIHlsYWI9IlRpcG8iKQptZWRpYXMgPC0gdGFwcGx5KHNoaXBzJGluY2lkZW50cywgc2hpcHMkdHlwZSwgbWVhbiwgbmEucm09VFJVRSkKcG9pbnRzKDE6bGVuZ3RoKG1lZGlhcyksIG1lZGlhcywgY29sPWMoInllbGxvdyIpLCBwY2g9MTYpCmBgYAoKIyMgPHNwYW4gc3R5bGUgPSAiY29sb3I6ICM2M0I4RkY7Ij7Cv0VuIGN1w6FsZXMgdmVzIGRhdG9zIGF0w61waWNvcz88L3NwYW4+CkVuIGxvcyBpbmNpZGVudGVzIEMgeSBEIAoKIyMgPHNwYW4gc3R5bGUgPSAiY29sb3I6ICM2M0I4RkY7Ij4gZCkgRGlidWphIGVsIGhpc3RvZ3JhbWEgeSBlbCBib3hwbG90IGRlIGxvcyBpbmNpZGVudGVzIGRlIGxvcyBiYXJjb3MgdW5vIGFsIGxhZG8gZGVsIG90cm8gZW4gZWwgbWlzbW8gY2FudmFzPC9zcGFuPgoKYGBge3J9CnBhcihtZnJvdz1jKDEsMikpCmJveHBsb3Qoc2hpcHMkaW5jaWRlbnRzLCBjb2w9YygicGluayIpLAogICAgICAgIG1haW49IklOQ0lERU5URVMiKQpwb2ludHMoMSxtZWFuKHNoaXBzJGluY2lkZW50cyksIGNvbD0ieWVsbG93IiwgcGNoPTE2KQoKaGlzdChzaGlwcyRpbmNpZGVudHMsIGNvbD1jKCJza3libHVlMSIsInBpbmsiLCAicGx1bTEiLCJuYXZham93aGl0ZTEiLCJhcXVhbWFyaW5lIiwiaXZvcnkxIiksIG1haW49Ikhpc290Z3JhbWEgZGUgSW5jaWRlbnRlcyIsCiAgICAgeGxhYj0iSW5jaWRlbnRlcyIsIHlsYWI9IkZyZWN1ZW5jaWFzIikKYWJsaW5lKHY9bWVhbihzaGlwcyRpbmNpZGVudHMsIG5hLnJtPVRSVUUpLCBjb2w9InllbGxvdyIsIGx0eT0yKQpgYGAKCiMjIDxzcGFuIHN0eWxlID0gImNvbG9yOiAjNjNCOEZGOyI+wr9RdcOpIHRpcG8gZGUgYXNpbWV0csOtYSBwcmVzZW50YSBsYSB2YXJpYWJsZSBpbmNpZGVudGVzPzwvc3Bhbj4KCkxhIHZhcmlhYmxlICJJbmNpZGVudGVzIiBtdWVzdHJhIHVuYSBhc2ltZXRyw61hIHBvc2l0aXZhLiBFbiBlbCBoaXN0b2dyYW1hLCBzZSBvYnNlcnZhIHF1ZSBsYSBjb2xhIGxhcmdhIGVzdMOhIGhhY2lhIGxhIGRlcmVjaGEsIGxvIHF1ZSBpbmRpY2EgcXVlIGxhIG1heW9yw61hIGRlIGxvcyBiYXJjb3MgdGllbmVuIHBvY29zIGluY2lkZW50ZXMsIHBlcm8gaGF5IGFsZ3Vub3MgY29uIHZhbG9yZXMgYXTDrXBpY29zIHF1ZSBwcmVzZW50YW4gdW4gbsO6bWVybyBzaWduaWZpY2F0aXZhbWVudGUgbWF5b3IgZGUgaW5jaWRlbnRlcy4KUG9yIG90cm8gbGFkbywgZWwgYm94cGxvdCBjb25maXJtYSBlc3RhIGFzaW1ldHLDrWEgcG9zaXRpdmEsIHlhIHF1ZSBsYSBtZWRpYW5hIGVzdMOhIG3DoXMgY2VyY2EgZGVsIGJvcmRlIGluZmVyaW9yIGRlIGxhIGNhamEsIGxvIHF1ZSBzaWduaWZpY2EgcXVlIGxhIG1heW9yw61hIGRlIGxvcyBkYXRvcyBzb24gdmFsb3JlcyBiYWpvcy4gQWRlbcOhcywgZWwgYmlnb3RlIHN1cGVyaW9yIGVzIG3DoXMgbGFyZ28sIGxvIHF1ZSBpbmRpY2EgdW5hIG1heW9yIGRpc3BlcnNpw7NuIGVuIGxvcyB2YWxvcmVzIGFsdG9zLCBhc2ltaXNtbyBsYSBleGlzdGVuY2lhIGRlIHZhbG9yZXMgYXRpcGljb3MsIGNvbmZpcm1hbiBxdWUgaGF5IGluY2lkZW50ZXMgZXhjZXBjaW9uYWxtZW50ZSBhbHRvcyBxdWUgYWZlY3RhbiBsYSBkaXN0cmlidWNpw7NuLgoKIyMgPHNwYW4gc3R5bGUgPSAiY29sb3I6ICM2M0I4RkY7Ij4gZSkgQ3JlYSB1bmEgbnVldmEgYmFzZSBkZSBkYXRvcywgcXVlIHNlIGxsYW1lIHNoaXBzX25ldyBlbiBsYSBxdWUgdG9kYXMgbGFzIHZhcmlhYmxlcyBzb24gaWd1YWxlcyBhIGxhcyBvcmlnaW5hbGVzLCBzYWx2byB0eXBlOiBkZWJlcsOhcyBzZWxlY2Npb25hciBzb2xvIGxvcyB2YWxvcmVzIGRlIGxhIHZhcmlhYmxlIHF1ZSBzZWFuIGlndWFsZXMgYSBBLjwvc3Bhbj4KCmBgYHtyfQpzaGlwc19uZXc8LSBzdWJzZXQoc2hpcHMsIHR5cGU9PSJBIikKYGBgCgpgYGB7cn0KaGVhZChzaGlwc19uZXcpCmBgYAoKYGBge3J9CiMyZGEgTWFuZXJhCmxpYnJhcnkoZHBseXIpCnNoaXBzX25ldzIgPC0gc2hpcHMlPiVmaWx0ZXIodHlwZSA9PSAiQSIpCmBgYAoKYGBge3J9CmhlYWQoc2hpcHNfbmV3MikKYGBgCgoKIyMgPHNwYW4gc3R5bGUgPSAiY29sb3I6ICM2M0I4RkY7Ij4gZikgwr9DdcOhbCBlcyBlbCBtw61uaW1vLCBtw6F4aW1vLCBtZWRpYSB5IGRlc3ZpYWNpw7NuIHTDrXBpY2EgZGUgbG9zIGluY2lkZW50ZXMgZGUgbG9zIGJhcmNvcyBkZSB0aXBvIEE/PC9zcGFuPgoKYGBge3J9CnN1bW1hcnkoc2hpcHNfbmV3KQpgYGAKYGBge3J9CnNkX2luYyA8LSBzZChzaGlwc19uZXckaW5jaWRlbnRzKQpjYXQoIkRlc3ZpYWNpw7NuIGVzdMOhbmRhcjoiLCBzZF9pbmMsICJcbiIpCmBgYAoKIyMgPHNwYW4gc3R5bGUgPSAiY29sb3I6ICM2M0I4RkY7Ij4gZykgQ29sb2NhIGxvcyByZXN1bHRhZG9zIGRlbCBhcGFydGFkbyBhbnRlcmlvciBlbiB1bmEgdGFibGEgY29uIGRvcyBjb2x1bW5hcywgdW5hIHNlcsOhIGVsIG5vbWJyZSBkZWwgZXN0YWTDrXN0aWNvIHkgb3RyYSBjb250ZW5kcsOhIHN1IHZhbG9yLjwvc3Bhbj4KCmBgYHtyfQoKbWluX2luYyA8LSBtaW4oc2hpcHNfbmV3JGluY2lkZW50cykKbWF4X2luYyA8LSBtYXgoc2hpcHNfbmV3JGluY2lkZW50cykKbWVhbl9pbmMgPC0gbWVhbihzaGlwc19uZXckaW5jaWRlbnRzKQpzZF9pbmMgPC0gc2Qoc2hpcHNfbmV3JGluY2lkZW50cykKCnRhYmxhX2VzdGFkaXN0aWNvcyA8LSBkYXRhLmZyYW1lKAogIEVzdGFkw61zdGljbyA9IGMoIk3DrW5pbW8iLCAiTcOheGltbyIsICJNZWRpYSIsICJEZXN2aWFjacOzbiBFc3TDoW5kYXIiKSwKICBWYWxvciA9IGMobWluX2luYywgbWF4X2luYywgbWVhbl9pbmMsIHNkX2luYykpCgpwcmludCh0YWJsYV9lc3RhZGlzdGljb3MpCmBgYAoKIyA8c3BhbiBzdHlsZSA9ICJjb2xvcjogI0NEOTZDRDsiPkVqZXJjaWNpbyAyPC9zcGFuPgoKYGBge3J9CmhlYWQoVVNBcnJlc3RzKQpgYGAKCiMjIDxzcGFuIHN0eWxlID0gImNvbG9yOiAjNjNCOEZGOyI+YSkgwr9IYXkgdmFsb3JlcyBOQSBlbiBsYSBiYXNlIGRlIGRhdG9zPyBFbiBjYXNvIGRlIHF1ZSBsb3MgY29udGVuZ2EsIGN1ZW50YSBjdcOhbnRvcyBzb24geSBlbGltw61uYWxvcyBkZSBsYSBiYXNlIGRlIGRhdG9zLjwvc3Bhbj4KCmBgYHtyfQpzdW0oaXMubmEoKFVTQXJyZXN0cykpKQpgYGAKCiMjIDxzcGFuIHN0eWxlID0gImNvbG9yOiAjNjNCOEZGOyI+YikgQ3JlYSB1bmEgbnVldmEgYmFzZSBkZSBkYXRvcywgcXVlIHNlIGxsYW1lIFVTQXJyZXN0c19uZXcgZW4gbGEgcXVlIHRvZGFzIGxhcyB2YXJpYWJsZXMgc29uIGlndWFsZXMgYSBsYXMgb3JpZ2luYWxlcywgc2Fsdm8gUmFwZTogZGViZXLDoXMgc2VsZWNjaW9uYXIgbG9zIHZhbG9yZXMgZGUgbGEgdmFyaWFibGUgUmFwZSBxdWUgc2VhbiBtYXlvcmVzIHF1ZSA0Ljwvc3Bhbj4KCmBgYHtyfQpVU0FycmVzdHNfbmV3PC1zdWJzZXQoVVNBcnJlc3RzLCBSYXBlPjQpCmBgYAoKYGBge3J9CmhlYWQoVVNBcnJlc3RzX25ldykKYGBgCgoKIyMgPHNwYW4gc3R5bGUgPSAiY29sb3I6ICM2M0I4RkY7Ij5jKSBVdGlsaXphbmRvIGxhIG51ZXZhIGJhc2UgVVNBcnJlc3RzX25ldywgb2J0w6luIGVsIGdyw6FmaWNvIGRlIGRpc3BlcnNpw7NuIGRlIGxhcyB2YXJpYWJsZXMgUmFwZSAoZWplIHgpIHkgTXVyZGVyIChlamUgeSk8L3NwYW4+CgpgYGB7cn0KcGxvdChVU0FycmVzdHNfbmV3JFJhcGUsIFVTQXJyZXN0c19uZXckTXVyZGVyLCBjb2w9ICJsaWdodHNreWJsdWUiLCB4bGFiPSJSYXBlIiwgeWxhYj0gIk11cmRlciIsIHBjaD0xNikKYGBgCgojIyA8c3BhbiBzdHlsZSA9ICJjb2xvcjogIzYzQjhGRjsiPmQpIENhbWJpYSBlbCByYW5nbyBkZSBsb3MgZWplcyBkZWwgZ3LDoWZpY28gYW50ZXJpb3I6IGVsIGVqZSB5IGRlYmUgaXIgZGVzZGUgMCBoYXN0YSAyMCB5IGVsIGVqZSB4IGRlc2RlIDAgaGFzdGEgNTAuPC9zcGFuPgoKYGBge3J9CnBsb3QoVVNBcnJlc3RzX25ldyRSYXBlLCBVU0FycmVzdHNfbmV3JE11cmRlciwgY29sPSAibGlnaHRza3libHVlIiwgeGxhYj0iUmFwZSIsIHlsYWI9ICJNdXJkZXIiLCBwY2g9MTYseGxpbT1jKDAsNTApLCB5bGltPWMoMCwyMCkpCmBgYAoKIyA8c3BhbiBzdHlsZSA9ICJjb2xvcjogI0NEOTZDRDsiPkVqZXJjaWNpbyAzPC9zcGFuPgoKYGBge3J9CmhlYWQobXRjYXJzKQpgYGAKYGBge3J9Cm10Y2FycyA8LSBtdGNhcnMKCmBgYAoKIyMgPHNwYW4gc3R5bGUgPSAiY29sb3I6ICM2M0I4RkY7Ij5hKSBBw7FhZGUgYWwgZGF0YWZyYW1lIHVuYSB2YXJpYWJsZSBkZSBub21icmUgYW1fbmV3IHF1ZSBzZWEgZGUgdGlwbyBmYWN0b3IgZW4gbGEgcXVlIGhheWEgZG9zIGNhdGVnb3LDrWFzLCB0cmFuc21pc2nDs24gYXV0b23DoXRpY2EgbyBtYW51YWwsIGEgcGFydGlyIGRlIGxhIHZhcmlhYmxlIGFtPC9zcGFuPgoKCmBgYHtyfQptdGNhcnMkYW1fbmV3IDwtIGlmZWxzZShtdGNhcnMkYW0gPT0gMCwgImF1dG9tw6F0aWNvIiwgIm1hbnVhbCIpCm10Y2FycyRhbV9uZXcgPC0gZmFjdG9yKG10Y2FycyRhbV9uZXcpICAKCmBgYAoKIyMgPHNwYW4gc3R5bGUgPSAiY29sb3I6ICM2M0I4RkY7Ij5iKSBSZXByZXNlbnRhIGVsIGRpYWdyYW1hIGRlIGJhcnJhcyBxdWUgbXVlc3RyZSBlbCBuw7ptZXJvIGRlIGNvY2hlcyBwb3IgdGlwbyBkZSB0cmFuc21pc2nDs248L3NwYW4+CgpgYGB7cn0KcGxvdChtdGNhcnMkYW1fbmV3LCBtYWluID0gIlRpcG8gZGUgVHJhbnNtaXNpw7NuIiwKICAgICB4bGFiID0gIlRyYW5zbWlzacOzbiIsIHlsYWIgPSAiRnJlY3VlbmNpYSIsICBjb2w9ICJwYWxlZ3JlZW40IiApCgpgYGAKCiMjIDxzcGFuIHN0eWxlID0gImNvbG9yOiAjNjNCOEZGOyI+YykgUmVwcmVzZW50YSBlbCBncsOhZmljbyBkZSBzZWN0b3JlcyBxdWUgbXVlc3RyZSBlbCBuw7ptZXJvIGRlIGNvY2hlcyBwb3IgdGlwbyBkZSB0cmFuc21pc2nDs248L3NwYW4+CgpgYGB7cn0KY291bnRzIDwtIHRhYmxlKG10Y2FycyRhbV9uZXcpCnBpZShjb3VudHMsIGxhYmVscyA9IG5hbWVzKGNvdW50cyksIG1haW4gPSAiTsO6bWVybyBkZSBjb2NoZXMgcG9yIHRpcG8gZGUgdHJhbnNtaXNpw7NuIiwgY29sID0gYygicGluayIsICJza3libHVlIikpCmBgYAoKIyA8c3BhbiBzdHlsZSA9ICJjb2xvcjogI0NEOTZDRDsiPkVqZXJjaWNpbyA0PC9zcGFuPgohW10oL1VzZXJzL2thcmxhbG9wZXovRGVza3RvcC9kYXRvcy5wbmcpCgojIyA8c3BhbiBzdHlsZSA9ICJjb2xvcjogIzYzQjhGRjsiPmEpwr9RdcOpIGRhdG9zIGRlbCBkYXRhZnJhbWUgc2VsZWNjaW9uYXLDoSBsYSBzaWd1aWVudGUgaW5zdHJ1Y2Npw7NuPzwvc3Bhbj4KIVtdKC9Vc2Vycy9rYXJsYWxvcGV6L0Rlc2t0b3AvYi5wbmcpCgpFbCBkYXRhZnJhbWUgYXJyb2phcsOhIHVuYSBjb2luY2lkZW5jaWEuIEVsIHJlc3VsdGFkbyBzZXLDoSB1bmEgZmlsYSBjb24gIsOBbHZhcm8iLCAiU29sZXIiIHkgIkJhaWxlIi4KCiMjIDxzcGFuIHN0eWxlID0gImNvbG9yOiAjNjNCOEZGOyI+IGIpwr9RdcOpIG90cmEgaW5zdHJ1Y2Npw7NuIGRhcsOhIGVsIG1pc21vIG91dHB1dCBxdWUgbGEgZGVsIGFwYXJ0YWRvIGEpPyBFc2NyaWJlIGV4YWN0YW1lbnRlIGN1w6FsIHNlcsOtYSBsYSBsw61uZWEgZGUgY8OzZGlnbyBhIGVqZWN1dGFyPC9zcGFuPgpVbmEgbWFuZXJhIGFsdGVybmF0aXZhIGRlIG9idGVuZXIgZWwgcmVzdWx0YWRvIGRlbCBwdW50byBhIGVzIGNvbjogIAoKYHByb2Zlc29yZXNbcHJvZmVzb3JlcyRhcGVsbGlkb3MgPT0gIlNvbGVyIiAmIHByb2Zlc29yZXMkYXNpZ25hdHVyYSA9PSAiQmFpbGUiLCBdYAoKIyMgPHNwYW4gc3R5bGUgPSAiY29sb3I6ICM2M0I4RkY7Ij5jKcK/UXXDqSBkYXRvcyBkZWwgZGF0YWZyYW1lIHNlbGVjY2lvbmFyw6EgbGEgc2lndWllbnRlIGluc3RydWNjacOzbj88L3NwYW4+CiFbXSgvVXNlcnMva2FybGFsb3Blei9EZXNrdG9wL2MucG5nKQoKRWwgcmVzdWx0YWRvIHNlcsOhICB0cmVzIGZpbGFzOiB1bmEgY29ycmVzcG9uZGllbnRlIGEgIk1hcsOtYSIgY29uIGxhIGFzaWduYXR1cmEgIkJhaWxlIiB5IGRvcyBmaWxhcyBkb25kZSBsYSBhc2lnbmF0dXJhIGVzICJDYW50byIsIGF1bnF1ZSBlbCBub21icmUgbm8gc2VhICJNYXLDrWEiLgogCiMgPHNwYW4gc3R5bGUgPSAiY29sb3I6ICNDRDk2Q0Q7Ij5FamVyY2ljaW8gNTwvc3Bhbj4KCiMjIDxzcGFuIHN0eWxlID0gImNvbG9yOiAjNjNCOEZGOyI+UmVwcm9kdWNlIGVsIGdyw6FmaWNvIHF1ZSBzZSBtdWVzdHJhIGEgY29udGludWFjacOzbiBzb2JyZSBsYSBiYXNlIGRlIGRhdG9zIFBpbWFJbmRpYW5zRGlhYmV0ZXMuIFBhcmEgYWNjZWRlciBhIGRpY2hhIGJhc2UsIGluc3RhbGEgeSBjYXJnYSBlbCBwYXF1ZXRlIG1sYmVuY2guIExhcyB2YXJpYWJsZXMgYSB1dGlsaXphciBzb24gbWFzcywgZ2x1Y29zZSBhbmQgZGlhYmV0ZXM8L3NwYW4+CgpgYGB7cn0KI2luc3RhbGwucGFja2FnZXMoIm1sYmVuY2giKQpsaWJyYXJ5KG1sYmVuY2gpCmBgYAoKCmBgYHtyfQpkYXRhKFBpbWFJbmRpYW5zRGlhYmV0ZXMpCgpgYGAKCmBgYHtyfQpwbG90KHg9UGltYUluZGlhbnNEaWFiZXRlcyRtYXNzLCB5PVBpbWFJbmRpYW5zRGlhYmV0ZXMkZ2x1Y29zZSwgY29sPSBQaW1hSW5kaWFuc0RpYWJldGVzJGRpYWJldGVzLCBwY2g9MTYsICB4bGFiID0gIk1hc3MiLCB5bGFiID0gIkdsdWNvc2UiKQpsZWdlbmQoeCA9ICJ0b3ByaWdodCIsIGxlZ2VuZCA9IGMoIm5lZyIsICJwb3MiKSwgZmlsbCA9IGMoIkJsYWNrIiwgIlJlZCIpKQpgYGAKCgoK