Llamar librerías

library(ggplot2)
library(gridExtra)
library(magick)
## Linking to ImageMagick 6.9.12.93
## Enabled features: cairo, fontconfig, freetype, heic, lcms, pango, raw, rsvg, webp
## Disabled features: fftw, ghostscript, x11
library(knitr)

Set Working Directory

setwd("/Users/estefanyvillalobos/Desktop/RPortfolio")

Distribución y Densidad de Probabilidad Normal

Distribuciones de Probabilidad Continua:
Pueden tomar varias formas, pero un gran número de variables aleatorias observadas en la naturaleza poseen una distribución de frecuencia que tiene más o menos la forma de montículo, o bien, como se diría en estadística, es aproximadamente una distribución normal de probabilidad.

Formula que genera esta distribución:

  • e = 2.72
  • pi = 3.141592653589793

\[ f(x) = \frac{1}{\sigma \sqrt{2\pi}} e^{-\frac{1}{2}\left(\frac{x - \mu}{\sigma}\right)^2} \]

  • El área bajo la curva es igual a 1.
  • Para variables aleatorias continuas, área = probabilidad.
  • El área a la izquierda de la media es igual a .S.
  • ” ” ” ” ” ” derechas ” ” ” ” ” ” ” ” ” ” ” “

Para hallar la probabilidad de que una variable aleatoria normal “x” se encuentre en el intervalo de “a” a “b” necesitamos obtener el área bajo la curva normal entre los puntos “a” y “b”. No obstante, hay un número infinitamente grande de distribuciones normales, uno para cada media y desviación estándar diferentes.

Variable Aleatoriamente Normal Estándar

Beneficio: nos permite usar la misma tabla para todas las distribuciones normales.
Formula:

\[z = \frac{x - \mu}{\sigma}\]

La distribución de probabilidad para “z” se denomina “Distribución Normal Estandarizada”

Ejercicio 3

a. Un estudio demostró que el uso de gasolina para autos compactos vendidos en EE.UU. está distribuido normalmente, con una media de 25.5 millas por galón (mpg) y una desviación estándar de 4.5 mpg. ¿Qué porcentaje de autos recorre 30 mpg o más?

Datos:

x = 30
μ = 25.5
σ = 4.5
P = ?

Formula:
\[z = \frac{x - \mu}{\sigma}\] \[z = \frac{30 - 25.5}{4.5}=1.00\] \[P = 1 - 0.8413 = 0.1587\]

Porcentaje bajo la curva (Probabilidad)

1-pnorm(30,25.5,4.5) # se le pone 1 - ya que en el ejercicio se le restó
## [1] 0.1586553

Respuesta: El 15.9% de autos recorre 30 mpg o más.

b. Si un fabricante desea desarrollar un auto que supere al 95% de los compactos actuales, ¿Cuál debe ser el rendimiento (mpg)?

\[X₀ = μ + Z₀ σ\] \[X₀ = 25.5 + 1.645(4.5)\] \[X₀ = 32.9\]

De Tablas, Z₀ = 1.645

Valor en el Eje X

qnorm(0.95,25.5,4.5)
## [1] 32.90184

Respuesta:El nuevo auto compacto debe recorrer 32.9 mpg para superar al 95% de los autos actuales.

Ejercicio 4

Suponga que los diámetros de tallos no sorportados en la base, de una especie particular de girasol, tienen una distribución normal con un diámetro promedio de 35mm y una desviación estándar de 3mm.

a. ¿Cuál es la probabilidad de que una planta de girasol tenga un diámetro de base de más de 40 mm?

? = Probabilidad base más de 40 mm

fomula
\[ \displaystyle f(x) = \frac{1}{\sigma \sqrt{2\pi}} \int_{-\infty}^{x} e^{-\frac{(x - \mu)^2}{2\sigma^2}} \]

z = (40 - 35) / 3
z = 1.67
P = 1 - 0.9525
P = 0.0475 = 4.75%

La probabilidad es de 4.75%

Za <- (40-35)/3
Za
## [1] 1.666667
Pa <- 1-pnorm(40,35,3) 
Pa
## [1] 0.04779035

Función de Densidad de Probabilidad (Normal)

x<- 40
promedio<- 35
sd<- 3
# Lo maximo que nos podemos alejar del promedio es 3 deviaciones estandar de la media (99.7%)

x_den <- seq(promedio-3*sd,promedio+3*sd,length=1000)
y_den <- dnorm(x_den, promedio, sd)

plot(x_den, y_den, type="l", lty = 1, xlab = "x", ylab = "f(x)", main = "Función de Densidad de Probabilidad (Normal)", col = "darkgreen")

Función de Distribución de Probabilidad (Normal)

x_dist <- seq(promedio-3*sd,promedio+3*sd,length=1000)
y_dist <- pnorm(x_dist,promedio,sd)

plot(x_dist, y_dist, type="l", lty = 1, xlab = "x", ylab = "f(x)", main = "Función de Distribución de Probabilidad (Normal)", col = "blue")

b. Si 2 plantas de girasol se seleccionan al azar, ¿cuál es la probabilidad de que ambas plantas tengan un diámetro de base de más de 40 mm?

Por definición, la probabilidad de que dos eventos mutuamente excluyentes ocurran es la de multiplicar la probabilidad individual de cada una.

P1 * P2 = 0.0485 * 0.0485
P = 0.0023 = 0.23%

La probabilidad es de 0.23%

Pb <- Pa * Pa
Pb
## [1] 0.002283918

c. ¿Dentro de qué límites esperaría usted que se encuentren los diámetros de base, con probabilidad de 0.95?

? = Límites de la base
Sería calcular los extremos que quedan afuera del 95% (2.5% y 97.5%)

p1 = 0.025
x1 = 35 + -1.96(3)
x1 = 29.12

p2 = 0.975
x2 = 35 + 1.96(3)
x2 = 40.88

Los límites en los que se encuentran los diámetros de la base son 29.1 mm y 40.8 mm.

Esperaría que los girasoles con probabilidad de 0.95 se encuentren dentro de los límites.

Pc1 <- qnorm(0.025,35,3) #Límite 1
Pc1
## [1] 29.12011
Pc2 <- qnorm(0.975,35,3) #Límite 2
Pc2
## [1] 40.87989

d. ¿Qué diámetro representa al 90avo percentil de la distribución de diámetros?

p = 0.90
x = 35 + 1.28(3)
x = 38.84

El 90vo percentil está en un diámetro de 38.8 mm.

Pd <- qnorm(0.90,35,3)
Pd
## [1] 38.84465

Shiny App

## PhantomJS not found. You can install it with webshot::install_phantomjs(). If it is installed, please make sure the phantomjs executable can be found via the PATH variable.
Shiny applications not supported in static R Markdown documents

Ejercicio 5

Un nuevo proceso para producir diamantes sintéticos es rentable sólo di el peso de éstos es mayor a 0.5 quilates. Para evaluarlo se generaron 6 diamantes con los siguientes pesos:

Pesos: 0.46, 0.61, 0.52, 0.48, 0.57, 0.54

¿El proceso es rentable?

Solución:

  1. Ho: μ ≤ 0.5
    Ha: μ > 0.5

  2. α = 0.05

  3. Grafica de zonas de aceptación/rechazo

Valor crítico = 2.015
Grados de libertad = 5

  1. Formula
    \[\displaystyle t = \frac{\bar{x} - \mu}{\frac{s}{\sqrt{n}}} \]

  2. Procedimiento

#Insertar formula

peso_diamante <- c(0.46, 0.61, 0.52, 0.48, 0.57, 0.54)
promedio <- mean(peso_diamante)
promedio
## [1] 0.53
sd_muestral <- sqrt(var(peso_diamante))
sd_muestral
## [1] 0.05585696
n <- 6
miu_o <- 0.5

t <- (promedio-miu_o)/(sd_muestral/sqrt(n))
t
## [1] 1.315587
  1. Respuesta: No se rechaza Ho, los datos no presentan suficiente evidencia para indicar que el peso medio de los diamantes exceda los 0.5 quilates.

Función de Densidad de Probabilidad (t de Student)

x_den <- seq(-4,4,length=1000)
y_den <- dt(x_den, df=5)
plot(x_den,y_den,type="l",lty=1,xlab="t",ylab="f(t)", main="Función de Densidad de Probabilidad (t de Student)")

plot
## function (x, y, ...) 
## UseMethod("plot")
## <bytecode: 0x11aa4a1f8>
## <environment: namespace:base>

Función de Distribución de Probabilidad (t de Student)

x_den <- seq(-4,4,length=1000)
y_den <- pt(x_den, df=5)
plot(x_den,y_den,type="l",lty=1,xlab="t",ylab="f(t)", main="Función de Distribución de Probabilidad (t de Student)")

plot
## function (x, y, ...) 
## UseMethod("plot")
## <bytecode: 0x11aa4a1f8>
## <environment: namespace:base>

Ejercicio 6

Contenido de O2 disuelto

Los desechos industriales y residuales descargados en nuestros ríos y arroyos absorben oxígeno y, por tanto, reducen la cantidad de oxígeno disuelto disponible para peces y otras formas de fauna acuática. Una agencia estatal requiere un mínimo de 5 partes por millón (ppm) de oxígeno disuelto para que el contenido de oxígeno sea suficiente para sostener vida acuática. Seis especímenes de agua tomados de un río en un lugar específico durante la estación de aguas bajas (julio) dio lecturas de 4.9, 5.1, 4.9, 5.0, 5.0 y 4.7 de oxígeno disuelto.

¿Los datos dan suficiente evidencia para indicar que el contenido de oxígeno disuelto es menor a 5 ppm? Pruebe usando α = 0.05

  1. Ho: μ ≤ 0.5
    Ha: μ < 0.5

  2. α = 0.05

  3. Grafica de zonas de aceptación/rechazo
    Valor crítico = -2.015
    Grados de libertad = 5

  4. Formula
    \[\displaystyle t = \frac{\bar{x} - \mu}{\frac{s}{\sqrt{n}}} \]

  5. Procedimiento

ppm <- c(4.9, 5.1, 4.9, 5.0, 5.0, 4.7)
promedio <- mean(ppm)
promedio
## [1] 4.933333
sd_muestra <- sqrt(var(ppm))
sd_muestra
## [1] 0.136626
n <- 6
miu_o <- 5

t <- (promedio-miu_o)/(sd_muestra/sqrt(n))
t
## [1] -1.195229
  1. Respuesta: No se rechaza Ho.

Winsorizing vs Trimming

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

peso_diamante_error <- c(0.46, 0.61, 0.52, 0.48, 0.57, 54)
boxplot(peso_diamante_error,horizontal=TRUE)

#Winsorizing
peso_diamante_winsorizado <- Winsorize(peso_diamante_error,0.10) #el segundo argumento es el porcentaje a quitar
peso_diamante_winsorizado
## [1]  0.4600  0.6100  0.5200  0.4800  0.5700 40.6525
#Trimming
peso_diamante_recortado <- Trim(peso_diamante_error,1)
peso_diamante_recortado
## [1] 0.61 0.52 0.48 0.57
## attr(,"trim")
## [1] 1 6
LS0tCnRpdGxlOiAiQWN0aXZpZGFkIDMuMiIKYXV0aG9yOiAiRXN0ZWZhbnkgZGUgbG9zIEFuZ2VsZXMgVmlsbGFsb2JvcyBGZXJuYW5kZXoiCmRhdGU6ICIyMDIzLTA5LTAzIgpvdXRwdXQ6IAogIGh0bWxfZG9jdW1lbnQ6CiAgICB0b2M6IFRSVUUKICAgIHRvY19mbG9hdDogVFJVRQogICAgY29kZV9kb3dubG9hZDogVFJVRQogICAgdGhlbWU6ICJzYW5kc3RvbmUiCi0tLQoKIVtdKC9Vc2Vycy9lc3RlZmFueXZpbGxhbG9ib3MvRGVza3RvcC9SUG9ydGZvbGlvL2Rlc2lkaXMuZ2lmKQoKIyMjIExsYW1hciBsaWJyZXLDrWFzCmBgYHtyfQoKbGlicmFyeShnZ3Bsb3QyKQpsaWJyYXJ5KGdyaWRFeHRyYSkKbGlicmFyeShtYWdpY2spCmxpYnJhcnkoa25pdHIpCgpgYGAKCiMjIyBTZXQgV29ya2luZyBEaXJlY3RvcnkKYGBge3J9CnNldHdkKCIvVXNlcnMvZXN0ZWZhbnl2aWxsYWxvYm9zL0Rlc2t0b3AvUlBvcnRmb2xpbyIpCmBgYAoKIyBEaXN0cmlidWNpw7NuIHkgRGVuc2lkYWQgZGUgUHJvYmFiaWxpZGFkIE5vcm1hbAoKKipEaXN0cmlidWNpb25lcyBkZSBQcm9iYWJpbGlkYWQgQ29udGludWE6KiogPGJyPgpQdWVkZW4gdG9tYXIgdmFyaWFzIGZvcm1hcywgcGVybyB1biBncmFuIG7Dum1lcm8gZGUgdmFyaWFibGVzIGFsZWF0b3JpYXMgb2JzZXJ2YWRhcyBlbiBsYSBuYXR1cmFsZXphIHBvc2VlbiB1bmEgZGlzdHJpYnVjacOzbiBkZSBmcmVjdWVuY2lhIHF1ZSB0aWVuZSBtw6FzIG8gbWVub3MgbGEgZm9ybWEgZGUgbW9udMOtY3VsbywgbyBiaWVuLCBjb21vIHNlIGRpcsOtYSBlbiBlc3RhZMOtc3RpY2EsIGVzIGFwcm94aW1hZGFtZW50ZSB1bmEgZGlzdHJpYnVjacOzbiBub3JtYWwgZGUgcHJvYmFiaWxpZGFkLiA8YnI+CgoqKkZvcm11bGEgcXVlIGdlbmVyYSBlc3RhIGRpc3RyaWJ1Y2nDs246KiogPGJyPgoKLSBlID0gMi43MiA8YnI+Ci0gcGkgPSAzLjE0MTU5MjY1MzU4OTc5MyA8YnI+CgokJApmKHgpID0gXGZyYWN7MX17XHNpZ21hIFxzcXJ0ezJccGl9fSBlXnstXGZyYWN7MX17Mn1cbGVmdChcZnJhY3t4IC0gXG11fXtcc2lnbWF9XHJpZ2h0KV4yfQokJAoKIVtdKC9Vc2Vycy9lc3RlZmFueXZpbGxhbG9ib3MvRGVza3RvcC9SUG9ydGZvbGlvL3QyMV9ub3JtYWx0aXAuZ2lmKQoKLSBFbCDDoXJlYSBiYWpvIGxhIGN1cnZhIGVzIGlndWFsIGEgMS4gPGJyPgotIFBhcmEgdmFyaWFibGVzIGFsZWF0b3JpYXMgY29udGludWFzLCDDoXJlYSA9IHByb2JhYmlsaWRhZC4gPGJyPiAKLSBFbCDDoXJlYSBhIGxhIGl6cXVpZXJkYSBkZSBsYSBtZWRpYSBlcyBpZ3VhbCBhIC5TLiA8YnI+Ci0gKiIgIiAiICIgIiAiIGRlcmVjaGFzICIgIiAiICIgIiAiICIgIiAiICIgIiAiKiA8YnI+CgohW10oL1VzZXJzL2VzdGVmYW55dmlsbGFsb2Jvcy9EZXNrdG9wL1JQb3J0Zm9saW8vZ3JhZmljYS1kaXN0cmlidWNpb24tbm9ybWFsLTEwMjR4NjcwLnBuZykKClBhcmEgaGFsbGFyIGxhIHByb2JhYmlsaWRhZCBkZSBxdWUgdW5hIHZhcmlhYmxlIGFsZWF0b3JpYSBub3JtYWwgIngiIHNlIGVuY3VlbnRyZSBlbiBlbCBpbnRlcnZhbG8gZGUgImEiIGEgImIiIG5lY2VzaXRhbW9zIG9idGVuZXIgZWwgw6FyZWEgYmFqbyBsYSBjdXJ2YSBub3JtYWwgZW50cmUgbG9zIHB1bnRvcyAiYSIgeSAiYiIuIE5vIG9ic3RhbnRlLCBoYXkgdW4gbsO6bWVybyBpbmZpbml0YW1lbnRlIGdyYW5kZSBkZSBkaXN0cmlidWNpb25lcyBub3JtYWxlcywgdW5vIHBhcmEgY2FkYSBtZWRpYSB5IGRlc3ZpYWNpw7NuIGVzdMOhbmRhciBkaWZlcmVudGVzLiA8YnI+CgoqKlZhcmlhYmxlIEFsZWF0b3JpYW1lbnRlIE5vcm1hbCBFc3TDoW5kYXIqKiA8YnI+IAoKKkJlbmVmaWNpbyo6IG5vcyBwZXJtaXRlIHVzYXIgbGEgbWlzbWEgdGFibGEgcGFyYSB0b2RhcyBsYXMgZGlzdHJpYnVjaW9uZXMgbm9ybWFsZXMuIDxicj4KKkZvcm11bGEqOiA8YnI+ICAKXFt6ID0gXGZyYWN7eCAtIFxtdX17XHNpZ21hfVxdCgpMYSBkaXN0cmlidWNpw7NuIGRlIHByb2JhYmlsaWRhZCBwYXJhICJ6IiBzZSBkZW5vbWluYSAgIkRpc3RyaWJ1Y2nDs24gTm9ybWFsIEVzdGFuZGFyaXphZGEiIDxicj4KCgojIyBFamVyY2ljaW8gMyAgPGJyPgoqKmEuIFVuIGVzdHVkaW8gZGVtb3N0csOzIHF1ZSBlbCB1c28gZGUgZ2Fzb2xpbmEgcGFyYSBhdXRvcyBjb21wYWN0b3MgdmVuZGlkb3MgZW4gRUUuVVUuIGVzdMOhIGRpc3RyaWJ1aWRvIG5vcm1hbG1lbnRlLCBjb24gdW5hIG1lZGlhIGRlIDI1LjUgbWlsbGFzIHBvciBnYWzDs24gKG1wZykgeSB1bmEgZGVzdmlhY2nDs24gZXN0w6FuZGFyIGRlIDQuNSBtcGcuIMK/UXXDqSBwb3JjZW50YWplIGRlIGF1dG9zIHJlY29ycmUgMzAgbXBnIG8gbcOhcz8qKiA8YnI+CgoqRGF0b3M6KiAgPGJyPgoKeCA9IDMwIDxicj4KzrwgPSAyNS41IDxicj4Kz4MgPSA0LjUgPGJyPgpQID0gPyA8YnI+CgoqRm9ybXVsYToqICA8YnI+ClxbeiA9IFxmcmFje3ggLSBcbXV9e1xzaWdtYX1cXQpcW3ogPSBcZnJhY3szMCAtIDI1LjV9ezQuNX09MS4wMFxdClxbUCA9IDEgLSAwLjg0MTMgPSAwLjE1ODdcXQoKIyMjIFBvcmNlbnRhamUgYmFqbyBsYSBjdXJ2YSAoUHJvYmFiaWxpZGFkKQpgYGB7cn0KMS1wbm9ybSgzMCwyNS41LDQuNSkgIyBzZSBsZSBwb25lIDEgLSB5YSBxdWUgZW4gZWwgZWplcmNpY2lvIHNlIGxlIHJlc3TDswpgYGAKClJlc3B1ZXN0YTogRWwgMTUuOSUgZGUgYXV0b3MgcmVjb3JyZSAzMCBtcGcgbyBtw6FzLiA8YnI+CgoqKmIuIFNpIHVuIGZhYnJpY2FudGUgZGVzZWEgZGVzYXJyb2xsYXIgdW4gYXV0byBxdWUgc3VwZXJlIGFsIDk1JSBkZSBsb3MgY29tcGFjdG9zIGFjdHVhbGVzLCDCv0N1w6FsIGRlYmUgc2VyIGVsIHJlbmRpbWllbnRvIChtcGcpPyoqIDxicj4KClxbWOKCgCA9IM68ICsgWuKCgCDPg1xdClxbWOKCgCA9IDI1LjUgKyAxLjY0NSg0LjUpXF0KXFtY4oKAID0gMzIuOVxdCgpEZSBUYWJsYXMsIFrigoAgPSAxLjY0NSA8YnI+CgojIyMgVmFsb3IgZW4gZWwgRWplIFgKYGBge3J9CnFub3JtKDAuOTUsMjUuNSw0LjUpCmBgYAoKUmVzcHVlc3RhOkVsIG51ZXZvIGF1dG8gY29tcGFjdG8gZGViZSByZWNvcnJlciAzMi45IG1wZyBwYXJhIHN1cGVyYXIgYWwgOTUlIGRlIGxvcyBhdXRvcyBhY3R1YWxlcy4gPGJyPgoKIyMgRWplcmNpY2lvIDQKClN1cG9uZ2EgcXVlIGxvcyBkacOhbWV0cm9zIGRlIHRhbGxvcyBubyBzb3Jwb3J0YWRvcyBlbiBsYSBiYXNlLCBkZSB1bmEgZXNwZWNpZSBwYXJ0aWN1bGFyIGRlIGdpcmFzb2wsIHRpZW5lbiB1bmEgZGlzdHJpYnVjacOzbiBub3JtYWwgY29uIHVuIGRpw6FtZXRybyBwcm9tZWRpbyBkZSAzNW1tIHkgdW5hIGRlc3ZpYWNpw7NuIGVzdMOhbmRhciBkZSAzbW0uIDxicj4KCioqYS4gwr9DdcOhbCBlcyBsYSBwcm9iYWJpbGlkYWQgZGUgcXVlIHVuYSBwbGFudGEgZGUgZ2lyYXNvbCB0ZW5nYSB1biBkacOhbWV0cm8gIGRlIGJhc2UgZGUgbcOhcyBkZSA0MCBtbT8qKiA8YnI+Cgo/ID0gUHJvYmFiaWxpZGFkIGJhc2UgbcOhcyBkZSA0MCBtbSA8YnI+CgoqKmZvbXVsYSoqIDxicj4KJCQKXGRpc3BsYXlzdHlsZSBmKHgpID0gXGZyYWN7MX17XHNpZ21hIFxzcXJ0ezJccGl9fSBcaW50X3stXGluZnR5fV57eH0gZV57LVxmcmFjeyh4IC0gXG11KV4yfXsyXHNpZ21hXjJ9fSAKJCQKCnogPSAoNDAgLSAzNSkgLyAzIDxicj4KeiA9IDEuNjcgPGJyPgpQID0gMSAtIDAuOTUyNSA8YnI+ClAgPSAwLjA0NzUgPSA0Ljc1JSA8YnI+CgpMYSBwcm9iYWJpbGlkYWQgZXMgZGUgNC43NSUgPGJyPgoKCmBgYHtyfQpaYSA8LSAoNDAtMzUpLzMKWmEKUGEgPC0gMS1wbm9ybSg0MCwzNSwzKSAKUGEKYGBgCgoqKkZ1bmNpw7NuIGRlIERlbnNpZGFkIGRlIFByb2JhYmlsaWRhZCAoTm9ybWFsKSoqIDxicj4KCmBgYHtyfQp4PC0gNDAKcHJvbWVkaW88LSAzNQpzZDwtIDMKYGBgCgoKYGBge3J9CiMgTG8gbWF4aW1vIHF1ZSBub3MgcG9kZW1vcyBhbGVqYXIgZGVsIHByb21lZGlvIGVzIDMgZGV2aWFjaW9uZXMgZXN0YW5kYXIgZGUgbGEgbWVkaWEgKDk5LjclKQoKeF9kZW4gPC0gc2VxKHByb21lZGlvLTMqc2QscHJvbWVkaW8rMypzZCxsZW5ndGg9MTAwMCkKeV9kZW4gPC0gZG5vcm0oeF9kZW4sIHByb21lZGlvLCBzZCkKCnBsb3QoeF9kZW4sIHlfZGVuLCB0eXBlPSJsIiwgbHR5ID0gMSwgeGxhYiA9ICJ4IiwgeWxhYiA9ICJmKHgpIiwgbWFpbiA9ICJGdW5jacOzbiBkZSBEZW5zaWRhZCBkZSBQcm9iYWJpbGlkYWQgKE5vcm1hbCkiLCBjb2wgPSAiZGFya2dyZWVuIikKCmBgYAoKKipGdW5jacOzbiBkZSBEaXN0cmlidWNpw7NuIGRlIFByb2JhYmlsaWRhZCAoTm9ybWFsKSoqIDxicj4KCmBgYHtyfQoKeF9kaXN0IDwtIHNlcShwcm9tZWRpby0zKnNkLHByb21lZGlvKzMqc2QsbGVuZ3RoPTEwMDApCnlfZGlzdCA8LSBwbm9ybSh4X2Rpc3QscHJvbWVkaW8sc2QpCgpwbG90KHhfZGlzdCwgeV9kaXN0LCB0eXBlPSJsIiwgbHR5ID0gMSwgeGxhYiA9ICJ4IiwgeWxhYiA9ICJmKHgpIiwgbWFpbiA9ICJGdW5jacOzbiBkZSBEaXN0cmlidWNpw7NuIGRlIFByb2JhYmlsaWRhZCAoTm9ybWFsKSIsIGNvbCA9ICJibHVlIikKCmBgYAoKCioqYi4gU2kgMiBwbGFudGFzIGRlIGdpcmFzb2wgc2Ugc2VsZWNjaW9uYW4gYWwgYXphciwgwr9jdcOhbCBlcyBsYSBwcm9iYWJpbGlkYWQgZGUgcXVlIGFtYmFzIHBsYW50YXMgdGVuZ2FuIHVuIGRpw6FtZXRybyBkZSBiYXNlIGRlIG3DoXMgZGUgNDAgbW0/KiogPGJyPgoKUG9yIGRlZmluaWNpw7NuLCBsYSBwcm9iYWJpbGlkYWQgZGUgcXVlIGRvcyBldmVudG9zIG11dHVhbWVudGUgZXhjbHV5ZW50ZXMgb2N1cnJhbiBlcyBsYSBkZSBtdWx0aXBsaWNhciBsYSBwcm9iYWJpbGlkYWQgaW5kaXZpZHVhbCBkZSBjYWRhIHVuYS4gPGJyPgoKUDEgKiBQMiA9IDAuMDQ4NSAqIDAuMDQ4NSA8YnI+ClAgPSAwLjAwMjMgPSAwLjIzJSA8YnI+CgpMYSBwcm9iYWJpbGlkYWQgZXMgZGUgMC4yMyUgPGJyPgoKYGBge3J9ClBiIDwtIFBhICogUGEKUGIKYGBgCgoqKmMuIMK/RGVudHJvIGRlIHF1w6kgbMOtbWl0ZXMgZXNwZXJhcsOtYSB1c3RlZCBxdWUgc2UgZW5jdWVudHJlbiBsb3MgZGnDoW1ldHJvcyBkZSBiYXNlLCBjb24gcHJvYmFiaWxpZGFkIGRlIDAuOTU/KiogPGJyPgoKPyA9IEzDrW1pdGVzIGRlIGxhIGJhc2UgPGJyPgpTZXLDrWEgY2FsY3VsYXIgbG9zIGV4dHJlbW9zIHF1ZSBxdWVkYW4gYWZ1ZXJhIGRlbCA5NSUgKDIuNSUgeSA5Ny41JSkgPGJyPgoKcDEgPSAwLjAyNSA8YnI+CngxID0gMzUgKyAtMS45NigzKSA8YnI+CngxID0gMjkuMTIgPGJyPgoKcDIgPSAwLjk3NSA8YnI+CngyID0gMzUgKyAxLjk2KDMpIDxicj4KeDIgPSA0MC44OCA8YnI+CgpMb3MgbMOtbWl0ZXMgZW4gbG9zIHF1ZSBzZSBlbmN1ZW50cmFuIGxvcyBkacOhbWV0cm9zIGRlIGxhIGJhc2Ugc29uIDI5LjEgbW0geSA0MC44IG1tLiA8YnI+CgpFc3BlcmFyw61hIHF1ZSBsb3MgZ2lyYXNvbGVzIGNvbiBwcm9iYWJpbGlkYWQgZGUgMC45NSBzZSBlbmN1ZW50cmVuIGRlbnRybyBkZSBsb3MgbMOtbWl0ZXMuIDxicj4KYGBge3J9ClBjMSA8LSBxbm9ybSgwLjAyNSwzNSwzKSAjTMOtbWl0ZSAxClBjMQpQYzIgPC0gcW5vcm0oMC45NzUsMzUsMykgI0zDrW1pdGUgMgpQYzIKCmBgYAoKKipkLiDCv1F1w6kgZGnDoW1ldHJvIHJlcHJlc2VudGEgYWwgOTBhdm8gcGVyY2VudGlsIGRlIGxhIGRpc3RyaWJ1Y2nDs24gZGUgZGnDoW1ldHJvcz8qKiA8YnI+CgpwID0gMC45MCA8YnI+CnggPSAzNSArIDEuMjgoMykgPGJyPgp4ID0gMzguODQgPGJyPgoKRWwgOTB2byBwZXJjZW50aWwgZXN0w6EgZW4gdW4gZGnDoW1ldHJvIGRlIDM4LjggbW0uIDxicj4KCmBgYHtyfQpQZCA8LSBxbm9ybSgwLjkwLDM1LDMpClBkCmBgYAoKIyMgU2hpbnkgQXBwCgpgYGB7ciwgZWNobz1GQUxTRX0KCiMiZWNobz1GQUxTRSIgaGFjZSBxdWUgbm8gc2UgdmVhIGVsIGNvZGlnbwoKbGlicmFyeShzaGlueSkKbGlicmFyeShnZ3Bsb3QyKQpsaWJyYXJ5KHNoaW55dGhlbWVzKQoKc2hpbnlBcHAoCiAgCnVpIDwtIGZsdWlkUGFnZSh0aGVtZT0gc2hpbnl0aGVtZSgic2FuZHN0b25lIiksCiAgICAgICAgICAgICAgICBuYXZiYXJQYWdlKCJBcHBsaWNhdGlvbnMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJQYW5lbCgiTm9ybWFsIERpc3RyaWJ1dGlvbnMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZVBhbmVsKCJWaXN1YWxpemF0aW9uIG9mIE5vcm1hbCBEaXN0cmlidXRpb24iKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lkZWJhckxheW91dCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWRlYmFyUGFuZWwoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWdzJGg1ICgiRW50ZXIgdGhlIGZvbGxvd2luZyBkYXRhOiIpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bWVyaWNJbnB1dCgibWVhbiIsICJNZWFuOiIsICIxIiksICNTZSBwb25lIGVsIHZhbG9yIG8gY29uICIiIG8gY29uICJ2YWx1ZSA9ICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bWVyaWNJbnB1dCgieCIsICJWYWx1ZSBvZiB4OiIsICIwIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1lcmljSW5wdXQoInNkIiwgIlN0YW5kYXJkIERldmlhdGlvbjoiLCAiMSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uQnV0dG9uKCJwbG90QnV0dG9uIiwgIkdlbmVyYXRlIEdyYXBoIikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1haW5QYW5lbCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsb3RPdXRwdXQoImRlbnNpdHkiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsb3RPdXRwdXQoImRpc3QiKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYlBhbmVsKCJUYWIgMiIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJQYW5lbCgiVGFiIDMiKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgKSksCgpzZXJ2ZXIgPC0gZnVuY3Rpb24oaW5wdXQsIG91dHB1dCkgewogIAogIG9ic2VydmVFdmVudChpbnB1dCRwbG90QnV0dG9uLCB7CiAgICBtZWFuX2luIDwtIGlucHV0JG1lYW4KICAgIHNkX2luIDwtIGlucHV0JHNkCiAgICB4X2luIDwtIGlucHV0JHgKICAgIAogICAgIyBGdW5jacOzbiB5IEdyw6FmaWNvIGRlIGRlbnNpZGFkIGRlIHByb2JhYmlsaWRhZCBub3JtYWwKICAgIHhfcmFuZ2UgPC0gc2VxKG1lYW5faW4tMypzZF9pbixtZWFuX2luKzMqc2RfaW4sbGVuZ3RoPTEwMDApCiAgICB5X2RlbnNpdHkgPC0gZG5vcm0oeF9yYW5nZSwgbWVhbiA9IG1lYW5faW4sIHNkID0gc2RfaW4pCiAgICB4X2RlbnNpdHkgPC0gZGF0YS5mcmFtZSh4ID0geF9yYW5nZSwgZGVuc2l0eSA9IHlfZGVuc2l0eSkKICAgIAogICAgcGxvdERlbnNpdHkgPC0gZ2dwbG90KHhfZGVuc2l0eSwgYWVzKHgsIGRlbnNpdHkpKSArCiAgICAgIGdlb21fbGluZSgpICsKICAgICAgZ2d0aXRsZSgiRGVuc2lkYWQgZGUgUHJvYmFiaWxpZGFkIChOb3JtYWwpIikgKwogICAgICB4bGFiKCJ4IikgKyB5bGFiKCJEZW5zaWRhZCIpCiAgICAKICAgICMgQ8OhbGN1bG8geSBHcsOhZmljbyBkZSBsYSBkaXN0cmlidWNpw7NuIGRlIHByb2JhYmlsaWRhZCBub3JtYWwKICAgIHlfZGlzdCA8LSBwbm9ybSh4X3JhbmdlLCBtZWFuID0gbWVhbl9pbiwgc2QgPSBzZF9pbikKICAgIHhfZGlzdCA8LSBkYXRhLmZyYW1lKHggPSB4X3JhbmdlLCBkaXN0cmlidXRpb24gPSB5X2Rpc3QpCiAgICAKCiAgICBwbG90RGlzdHJpYnV0aW9uIDwtIGdncGxvdCh4X2Rpc3QsIGFlcyh4LCBkaXN0cmlidXRpb24pKSArCiAgICAgIGdlb21fbGluZSgpICsKICAgICAgZ2d0aXRsZSgiRGlzdHJpYnVjacOzbiBkZSBQcm9iYWJpbGlkYWQgKE5vcm1hbCkiKSArCiAgICAgIHhsYWIoIngiKSArIHlsYWIoIlByb2JhYmlsaWRhZCIpCiAgICAKICAgIG91dHB1dCRkZW5zaXR5IDwtIHJlbmRlclBsb3QoewogICAgICBwbG90RGVuc2l0eQogICAgfSkKICAgIAogICAgb3V0cHV0JGRpc3QgPC0gcmVuZGVyUGxvdCh7CiAgICAgIHBsb3REaXN0cmlidXRpb24KICAgIH0pCiAgfSkKfQoKKQoKYGBgCgojIyBFamVyY2ljaW8gNQoKVW4gbnVldm8gcHJvY2VzbyBwYXJhIHByb2R1Y2lyIGRpYW1hbnRlcyBzaW50w6l0aWNvcyBlcyByZW50YWJsZSBzw7NsbyBkaSBlbCBwZXNvIGRlIMOpc3RvcyBlcyBtYXlvciBhIDAuNSBxdWlsYXRlcy4gUGFyYSBldmFsdWFybG8gc2UgZ2VuZXJhcm9uIDYgZGlhbWFudGVzIGNvbiBsb3Mgc2lndWllbnRlcyBwZXNvczogPGJyPgoKUGVzb3M6IDAuNDYsIDAuNjEsIDAuNTIsIDAuNDgsIDAuNTcsIDAuNTQgPGJyPgoKKirCv0VsIHByb2Nlc28gZXMgcmVudGFibGU/KiogPGJyPgoKKlNvbHVjacOzbjoqIDxicj4KCjEuIEhvOiDOvCDiiaQgMC41IDxicj4KICAgSGE6IM68ID4gMC41IDxicj4KCjIuIM6xID0gMC4wNSA8YnI+CgozLiBHcmFmaWNhIGRlIHpvbmFzIGRlIGFjZXB0YWNpw7NuL3JlY2hhem8gPGJyPgoKIVtdKC9Vc2Vycy9lc3RlZmFueXZpbGxhbG9ib3MvRGVza3RvcC9TY3JlZW4gU2hvdCAyMDIzLTA4LTMxIGF0IDE1LjMzLjA0LnBuZykKKlZhbG9yIGNyw610aWNvKiA9IDIuMDE1IDxicj4KKkdyYWRvcyBkZSBsaWJlcnRhZCogPSA1IDxicj4KCjQuIEZvcm11bGEgIDxicj4KJCRcZGlzcGxheXN0eWxlIHQgPSBcZnJhY3tcYmFye3h9IC0gXG11fXtcZnJhY3tzfXtcc3FydHtufX19ICQkCgo1LiBQcm9jZWRpbWllbnRvICA8YnI+CmBgYHtyfQojSW5zZXJ0YXIgZm9ybXVsYQoKcGVzb19kaWFtYW50ZSA8LSBjKDAuNDYsIDAuNjEsIDAuNTIsIDAuNDgsIDAuNTcsIDAuNTQpCnByb21lZGlvIDwtIG1lYW4ocGVzb19kaWFtYW50ZSkKcHJvbWVkaW8KCnNkX211ZXN0cmFsIDwtIHNxcnQodmFyKHBlc29fZGlhbWFudGUpKQpzZF9tdWVzdHJhbAoKbiA8LSA2Cm1pdV9vIDwtIDAuNQoKdCA8LSAocHJvbWVkaW8tbWl1X28pLyhzZF9tdWVzdHJhbC9zcXJ0KG4pKQp0CgpgYGAKCjYuICpSZXNwdWVzdGE6KiBObyBzZSByZWNoYXphIEhvLCBsb3MgZGF0b3Mgbm8gcHJlc2VudGFuIHN1ZmljaWVudGUgZXZpZGVuY2lhIHBhcmEgaW5kaWNhciBxdWUgZWwgcGVzbyBtZWRpbyBkZSBsb3MgZGlhbWFudGVzIGV4Y2VkYSBsb3MgMC41IHF1aWxhdGVzLiA8YnI+CgoqKkZ1bmNpw7NuIGRlIERlbnNpZGFkIGRlIFByb2JhYmlsaWRhZCAodCBkZSBTdHVkZW50KSoqIDxicj4KYGBge3J9Cgp4X2RlbiA8LSBzZXEoLTQsNCxsZW5ndGg9MTAwMCkKeV9kZW4gPC0gZHQoeF9kZW4sIGRmPTUpCnBsb3QoeF9kZW4seV9kZW4sdHlwZT0ibCIsbHR5PTEseGxhYj0idCIseWxhYj0iZih0KSIsIG1haW49IkZ1bmNpw7NuIGRlIERlbnNpZGFkIGRlIFByb2JhYmlsaWRhZCAodCBkZSBTdHVkZW50KSIpCnBsb3QKCmBgYAoKKipGdW5jacOzbiBkZSBEaXN0cmlidWNpw7NuIGRlIFByb2JhYmlsaWRhZCAodCBkZSBTdHVkZW50KSoqIDxicj4KYGBge3J9Cgp4X2RlbiA8LSBzZXEoLTQsNCxsZW5ndGg9MTAwMCkKeV9kZW4gPC0gcHQoeF9kZW4sIGRmPTUpCnBsb3QoeF9kZW4seV9kZW4sdHlwZT0ibCIsbHR5PTEseGxhYj0idCIseWxhYj0iZih0KSIsIG1haW49IkZ1bmNpw7NuIGRlIERpc3RyaWJ1Y2nDs24gZGUgUHJvYmFiaWxpZGFkICh0IGRlIFN0dWRlbnQpIikKcGxvdAoKYGBgCgojIyBFamVyY2ljaW8gNiAKCioqQ29udGVuaWRvIGRlIE8yIGRpc3VlbHRvKiogPGJyPgoKTG9zIGRlc2VjaG9zIGluZHVzdHJpYWxlcyB5IHJlc2lkdWFsZXMgZGVzY2FyZ2Fkb3MgZW4gbnVlc3Ryb3MgcsOtb3MgeSBhcnJveW9zIGFic29yYmVuIG94w61nZW5vIHksIHBvciB0YW50bywgcmVkdWNlbiBsYSBjYW50aWRhZCBkZSBveMOtZ2VubyBkaXN1ZWx0byBkaXNwb25pYmxlIHBhcmEgcGVjZXMgeSBvdHJhcyBmb3JtYXMgZGUgZmF1bmEgYWN1w6F0aWNhLiBVbmEgYWdlbmNpYSBlc3RhdGFsIHJlcXVpZXJlIHVuIG3DrW5pbW8gZGUgNSBwYXJ0ZXMgcG9yIG1pbGzDs24gKHBwbSkgZGUgb3jDrWdlbm8gZGlzdWVsdG8gcGFyYSBxdWUgZWwgY29udGVuaWRvIGRlIG94w61nZW5vIHNlYSBzdWZpY2llbnRlIHBhcmEgc29zdGVuZXIgdmlkYSBhY3XDoXRpY2EuIFNlaXMgZXNwZWPDrW1lbmVzIGRlIGFndWEgdG9tYWRvcyBkZSB1biByw61vIGVuIHVuIGx1Z2FyIGVzcGVjw61maWNvIGR1cmFudGUgbGEgZXN0YWNpw7NuIGRlIGFndWFzIGJhamFzIChqdWxpbykgZGlvIGxlY3R1cmFzIGRlIDQuOSwgNS4xLCA0LjksIDUuMCwgNS4wIHkgNC43IGRlIG94w61nZW5vIGRpc3VlbHRvLiA8YnI+CgoqKsK/TG9zIGRhdG9zIGRhbiBzdWZpY2llbnRlIGV2aWRlbmNpYSBwYXJhIGluZGljYXIgcXVlIGVsIGNvbnRlbmlkbyBkZSBveMOtZ2VubyBkaXN1ZWx0byBlcyBtZW5vciBhIDUgcHBtPyoqIFBydWViZSB1c2FuZG8gzrEgPSAwLjA1IDxicj4KCjEuIEhvOiDOvCDiiaQgMC41IDxicj4KICAgSGE6IM68IDwgMC41IDxicj4KCjIuIM6xID0gMC4wNSA8YnI+CgozLiBHcmFmaWNhIGRlIHpvbmFzIGRlIGFjZXB0YWNpw7NuL3JlY2hhem8gPGJyPgohW10oL1VzZXJzL2VzdGVmYW55dmlsbGFsb2Jvcy9EZXNrdG9wL1NjcmVlbiBTaG90IDIwMjMtMDgtMzEgYXQgMTUuMzIuNTMucG5nKQoqVmFsb3IgY3LDrXRpY28qID0gLTIuMDE1ICA8YnI+CipHcmFkb3MgZGUgbGliZXJ0YWQqID0gNSAgPGJyPgoKNC4gRm9ybXVsYSAgPGJyPgokJFxkaXNwbGF5c3R5bGUgdCA9IFxmcmFje1xiYXJ7eH0gLSBcbXV9e1xmcmFje3N9e1xzcXJ0e259fX0gJCQKCjUuIFByb2NlZGltaWVudG8gPGJyPgpgYGB7cn0KCnBwbSA8LSBjKDQuOSwgNS4xLCA0LjksIDUuMCwgNS4wLCA0LjcpCnByb21lZGlvIDwtIG1lYW4ocHBtKQpwcm9tZWRpbwoKc2RfbXVlc3RyYSA8LSBzcXJ0KHZhcihwcG0pKQpzZF9tdWVzdHJhCgpuIDwtIDYKbWl1X28gPC0gNQoKdCA8LSAocHJvbWVkaW8tbWl1X28pLyhzZF9tdWVzdHJhL3NxcnQobikpCnQKCmBgYAoKNi4gKlJlc3B1ZXN0YToqIE5vIHNlIHJlY2hhemEgSG8uIDxicj4KCiMgV2luc29yaXppbmcgdnMgVHJpbW1pbmcKCmBgYHtyfQojaW5zdGFsbC5wYWNrYWdlcygiRGVzY1Rvb2xzIikKbGlicmFyeShEZXNjVG9vbHMpCgpwZXNvX2RpYW1hbnRlX2Vycm9yIDwtIGMoMC40NiwgMC42MSwgMC41MiwgMC40OCwgMC41NywgNTQpCmJveHBsb3QocGVzb19kaWFtYW50ZV9lcnJvcixob3Jpem9udGFsPVRSVUUpCgojV2luc29yaXppbmcKcGVzb19kaWFtYW50ZV93aW5zb3JpemFkbyA8LSBXaW5zb3JpemUocGVzb19kaWFtYW50ZV9lcnJvciwwLjEwKSAjZWwgc2VndW5kbyBhcmd1bWVudG8gZXMgZWwgcG9yY2VudGFqZSBhIHF1aXRhcgpwZXNvX2RpYW1hbnRlX3dpbnNvcml6YWRvCgojVHJpbW1pbmcKcGVzb19kaWFtYW50ZV9yZWNvcnRhZG8gPC0gVHJpbShwZXNvX2RpYW1hbnRlX2Vycm9yLDEpCnBlc29fZGlhbWFudGVfcmVjb3J0YWRvCgpgYGAKCg==