Paso num. 1: crear conjunto de datos
set.seed(123) # Función para asegurar reproducibilidad
niveles_glucosa <- rnorm(50, mean = 100, sd = 15) # La media es = 100, la desviasion estandar es = 15
niveles_glucosa
[1] 91.59287 96.54734 123.38062 101.05763 101.93932 125.72597 106.91374 81.02408 89.69721 93.31507 118.36123
[12] 105.39721 106.01157 101.66024 91.66238 126.80370 107.46776 70.50074 110.52034 92.90813 83.98264 96.73038
[23] 84.60993 89.06663 90.62441 74.69960 112.56681 102.30060 82.92795 118.80722 106.39696 95.57393 113.42688
[34] 113.17200 112.32372 110.32960 108.30876 99.07132 95.41056 94.29293 89.57940 96.88124 81.01905 132.53434
[45] 118.11943 83.15337 93.95673 93.00017 111.69948 98.74946
plot(cars)

str(niveles_glucosa)
num [1:50] 91.6 96.5 123.4 101.1 101.9 ...
Paso num. 2: calculo de la media y el error estandar
media <- mean(niveles_glucosa) # Media de los datos
sd <- sd(niveles_glucosa) # Desviacion estandar
n <- length(niveles_glucosa) # Tamaño de la muestra
se <- sd / sqrt(n) # Error estandar de la media
media
[1] 100.5161
sd
[1] 13.88805
n
[1] 50
se
[1] 1.964067
Paso num. 3: Calcular elintervalo de confianza del 95%
df <- n-1
alpha <- 0.05 # Nivel de significancia (1 - 95%)
t_critico <- qt(1 - alpha / 2, df = n - 1) # valos critico t para el 95%
margen_error <- t_critico * se #Margen de error
margen_error
[1] 3.94694
ic_inf <- media - margen_error
ic_inf
[1] 96.56911
ic_sup <- media + margen_error
ic_sup
[1] 104.463
# resultado
cat("Media:", round(media,2), "\n")
Media: 100.52
cat("Intervalo de Confianza del 95%: [", round(ic_inf, 2), ",", round(ic_sup, 2), "]\n")
Intervalo de Confianza del 95%: [ 96.57 , 104.46 ]
Elaboracion de ejemplo práctico
# Media muestral (x)= 100
# Desviación estándar (S)= 15
# Tamaño de muestra (n)= 30
#Establecimiento de paramentros
alpha <- 0.05
n <- 15
S <- 30
media <- 100
# Error estándar
se <- S / sqrt(n)
# Valor crítico t
t_critico <- qt(1 - alpha / 2, df = n - 1)
# Margen de error
margen_error <- t_critico * se
# Intervalo de confianza
ic_inf <- media - margen_error
ic_sup <- media + margen_error
cat("intervalo de confianza del 95%:", round(ic_inf, 2), "-", round(ic_sup, 2), "\n")
intervalo de confianza del 95%: 83.39 - 116.61
Elaboración de grafico
# Creacion de data frame
df <- data.frame(media = media, ic_inf = ic_inf, ic_sup = ic_sup)
# Grafico
ggplot(df, aes(x = 1, y = media)) + geom_point(size = 3, color = "red") + ylim(0,200) + geom_errorbar(aes_q(ymin = ic_inf, ymax = ic_sup), width = 0.2, color = "blue") + labs(title = "Intervalo de Confianza del 95% para la Media", x = "Muestra", y = "Media") + theme_minimal()

Valor critico
t_critico <- qt(1 - alpha / 2, df = n - 1)
Calculo de R
# Datos simulados
set.seed(123)
datos <- rnorm(30, mean = 100, sd = 15)
# Calcular estadísticas
media <- mean(datos) # Media muestral
sd <- sd(datos) # Desviacion estandar muestral
n <- length(datos) # Tamaño de la muestra
se <- sd / sqrt(n) # Error estandar
# Nivel de significancia
alpha <- 0.05
# Valor critico t
t_critico <- qt(1 - alpha / 2, df = n - 1)
# Margen de error
margen_error <- t_critico * se
# Intervalo de confianza
ic_inf <- media - margen_error
ic_sup <- media + margen_error
cat("media:", round(media, 2), "\n")
media: 99.29
cat("Intervalo de Confianza del 95%: [", round(ic_inf, 2), ",", round(ic_sup, 2), "]\n")
Intervalo de Confianza del 95%: [ 93.8 , 104.79 ]
Calculo en R para la comparacion entre el IC y el valor de P
# Paso 1: datos del ejemplo anterior, sumando los datos de los niveles de glucosa
set.seed(123)
niveles_glucosa <- rnorm(200, mean = 100, sd = 15) # Media = 100, sd = 15
# Paso 2: calculo del Ic 95%
media <- mean(niveles_glucosa) # Media muestral
sd <- sd(niveles_glucosa) # Desviación estándar muestral
n <- length(niveles_glucosa) # Tamaño de la muestra
se <- sd / sqrt(n) # Error estándar
# IC 95%
alpha <- 0.05
t_critico <- qt(1 - alpha / 2, df = n - 1) # Valor crítico de t
margen_error <- t_critico * se # Margen de error
ic_inf <- media - margen_error
ic_sup <- media + margen_error
cat("Intervalo de Confianza del 95%: [", round(ic_inf, 2), ",", round(ic_sup, 2), "]\n")
Intervalo de Confianza del 95%: [ 97.9 , 101.84 ]
# Paso 3: calculo de valor de P
# Prueba t para media poblacional de 95
t_test <- t.test(niveles_glucosa, mu = 95) # Hipótesis nula: media = 95
# Resultado del valor p
cat("Valor p:", t_test$p.value, "\n")
Valor p: 2.2747e-06
Elaboracion del grafico de IC vs Valor de P
# Crear un data frame para el gráfico
df <- data.frame(
media = media,
ic_inf = ic_inf,
ic_sup = ic_sup
)
# Graficar
ggplot(df, aes(x = 1)) +
geom_errorbar(aes(ymin = ic_inf, ymax = ic_sup), width = 0.2, color = "blue") + ylim(0,200)+
geom_point(aes(y = media), size = 4, color = "red") +
geom_hline(yintercept = 95, linetype = "dashed", color = "black", size = 1.2) +
labs(
title = "Comparación entre Intervalos de Confianza e Hipótesis Nula",
x = "Muestra (niveles de glucosa)",
y = "Niveles de Glucosa (mg/dL)"
) +
theme_minimal()

Comparación de dos grupos Paso num. 1: Cálculo del Intervalo de
Confianza para la Diferencia de Medias
set.seed(123) # Reproducibilidad
#Simulador de datos
grupo_control <- rnorm(30, mean = 100, sd = 15 ) # media = 100, sd = 15
grupo_experimental <- rnorm(30, mean = 110, sd = 15) # media = 110, sd = 15
# codigo para el calculo de intervalos de confianza
media_control <- mean(grupo_control)
media_experimental <- mean(grupo_experimental)
sd_control <- sd(grupo_control)
sd_experimental <- sd(grupo_experimental)
n_control <- length(grupo_control)
n_expertimental <- length(grupo_experimental)
#calculo para diferencias de medias
diferencia <- media_experimental - media_control
#Calculo para error estandar combinado
se <- sqrt((sd_control^2 / n_control) + (sd_experimental^2 / n_expertimental))
#Calculo para el valor critico t para IC del 95%
alpha <- 0.05
t_critico <- qt(1 - alpha / 2, df = n_control + n_expertimental - 2)
#Calculo de margen de error
margen_error <- t_critico * se
# Calculo de límites del IC
ic_inf <- diferencia - margen_error
ic_sup <- diferencia + margen_error
cat("Diferencia de medias:", round(diferencia, 2), "\n")
Diferencia de medias: 13.38
cat("Intervalo de Confianza del 95%: [", round(ic_inf, 2), ",", round(ic_sup, 2), "]\n")
Intervalo de Confianza del 95%: [ 6.32 , 20.44 ]
Paso num. 2: Pueba de hipotesis y valor de p
# Prueba t para dos muestras independientes
t_test <- t.test(grupo_control, grupo_experimental, var.equal = TRUE)
# Resultados
cat("Valor p:", t_test$p.value, "\n")
Valor p: 0.0003576581
cat("Diferencia estimada (t-test):", t_test$estimate, "\n")
Diferencia estimada (t-test): 99.29344 112.6751
Paso num. 3: Visualizacion de los resultado por medio de ggplot2
library(ggplot2)
# Crear un data frame con los datos
df <- data.frame(
grupo = rep(c("Control", "Experimental"), each = 30),
niveles_glucosa = c(grupo_control, grupo_experimental)
)
# Graficar los datos
ggplot(df, aes(x = grupo, y = niveles_glucosa, fill = grupo)) +
geom_boxplot(alpha = 0.7, outlier.colour = "red") +
geom_point(position = position_jitter(width = 0.1), alpha = 0.5) +
labs(
title = "Comparación de Niveles de Glucosa entre Grupos",
x = "Grupo",
y = "Niveles de Glucosa (mg/dL)"
) +
theme_minimal() +
scale_fill_manual(values = c("#00BFC4", "#F8766D"))

Elaboracion de la grafica pero agregando la significancia
library(ggplot2)
library(ggpubr)
# Crear un data frame con los datos
df <- data.frame(
grupo = rep(c("Control", "Experimental"), each = 30),
niveles_glucosa = c(grupo_control, grupo_experimental)
)
# Graficar los datos con significancia
ggplot(df, aes(x = grupo, y = niveles_glucosa, fill = grupo)) +
geom_boxplot(alpha = 0.7, outlier.colour = "red") +
geom_point(position = position_jitter(width = 0.1), alpha = 0.5) +
labs(
title = "Comparación de Niveles de Glucosa entre Grupos",
x = "Grupo",
y = "Niveles de Glucosa (mg/dL)"
) +
theme_minimal() +
scale_fill_manual(values = c("#00BFC4", "#F8766D")) +
stat_compare_means(
method = "t.test", # Realizar prueba t
label = "p.format", # Mostrar el valor p en formato estándar o lo puedes cambiar por "p.signif" para asteriscos
label.y = max(df$niveles_glucosa) + 5 # Ajustar la posición de la etiqueta
,label.x=1.5)

LS0tDQp0aXRsZTogIlIgTm90ZWJvb2sgOSBFbnJpcXVlVmVyZHVnbyBJbnRlcnZhbG9zIGRlIGNvbmZpYW56YSB5IFRlb3JlbWEgZGUgbGltaXRlIGNlbnRyYWwiDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KUGFzbyBudW0uIDE6IGNyZWFyIGNvbmp1bnRvIGRlIGRhdG9zDQpgYGB7cn0NCnNldC5zZWVkKDEyMykgIyBGdW5jacOzbiBwYXJhIGFzZWd1cmFyIHJlcHJvZHVjaWJpbGlkYWQNCm5pdmVsZXNfZ2x1Y29zYSA8LSBybm9ybSg1MCwgbWVhbiA9IDEwMCwgc2QgPSAxNSkgIyBMYSBtZWRpYSBlcyA9IDEwMCwgbGEgZGVzdmlhc2lvbiBlc3RhbmRhciBlcyA9IDE1DQpuaXZlbGVzX2dsdWNvc2ENCnBsb3QoY2FycykNCmBgYA0KDQpgYGB7cn0NCnN0cihuaXZlbGVzX2dsdWNvc2EpDQpgYGANClBhc28gbnVtLiAyOiBjYWxjdWxvIGRlIGxhIG1lZGlhIHkgZWwgZXJyb3IgZXN0YW5kYXIgDQpgYGB7cn0NCm1lZGlhIDwtIG1lYW4obml2ZWxlc19nbHVjb3NhKSAjIE1lZGlhIGRlIGxvcyBkYXRvcw0Kc2QgPC0gc2Qobml2ZWxlc19nbHVjb3NhKSAgICAgICMgRGVzdmlhY2lvbiBlc3RhbmRhciANCm4gPC0gbGVuZ3RoKG5pdmVsZXNfZ2x1Y29zYSkgICAjIFRhbWHDsW8gZGUgbGEgbXVlc3RyYSANCnNlIDwtIHNkIC8gc3FydChuKSAgICAgICAgICAgICAjIEVycm9yIGVzdGFuZGFyIGRlIGxhIG1lZGlhIA0KDQptZWRpYQ0KYGBgDQpgYGB7cn0NCnNkDQpuDQpzZQ0KYGBgDQpQYXNvIG51bS4gMzogQ2FsY3VsYXIgZWxpbnRlcnZhbG8gZGUgY29uZmlhbnphIGRlbCA5NSUNCmBgYHtyfQ0KZGYgPC0gbi0xIA0KYWxwaGEgPC0gMC4wNSAjIE5pdmVsIGRlIHNpZ25pZmljYW5jaWEgKDEgLSA5NSUpDQp0X2NyaXRpY28gPC0gcXQoMSAtIGFscGhhIC8gMiwgZGYgPSBuIC0gMSkgIyB2YWxvcyBjcml0aWNvIHQgcGFyYSBlbCA5NSUNCm1hcmdlbl9lcnJvciA8LSB0X2NyaXRpY28gKiBzZSAjTWFyZ2VuIGRlIGVycm9yDQptYXJnZW5fZXJyb3INCg0KYGBgDQpgYGB7cn0NCmljX2luZiA8LSBtZWRpYSAtIG1hcmdlbl9lcnJvcg0KaWNfaW5mDQppY19zdXAgPC0gbWVkaWEgKyBtYXJnZW5fZXJyb3INCmljX3N1cA0KIyByZXN1bHRhZG8NCmNhdCgiTWVkaWE6Iiwgcm91bmQobWVkaWEsMiksICJcbiIpDQpjYXQoIkludGVydmFsbyBkZSBDb25maWFuemEgZGVsIDk1JTogWyIsIHJvdW5kKGljX2luZiwgMiksICIsIiwgcm91bmQoaWNfc3VwLCAyKSwgIl1cbiIpDQpgYGANCkVsYWJvcmFjaW9uIGRlIGVqZW1wbG8gcHLDoWN0aWNvDQpgYGB7cn0NCiMgTWVkaWEgbXVlc3RyYWwgKHgpPSAxMDANCiMgRGVzdmlhY2nDs24gZXN0w6FuZGFyIChTKT0gMTUNCiMgVGFtYcOxbyBkZSBtdWVzdHJhIChuKT0gMzANCiNFc3RhYmxlY2ltaWVudG8gZGUgcGFyYW1lbnRyb3MNCmFscGhhIDwtIDAuMDUNCm4gPC0gMTUNClMgPC0gMzANCm1lZGlhIDwtIDEwMA0KICMgRXJyb3IgZXN0w6FuZGFyIA0Kc2UgPC0gUyAvIHNxcnQobikNCiANCiMgVmFsb3IgY3LDrXRpY28gdA0KdF9jcml0aWNvIDwtIHF0KDEgLSBhbHBoYSAvIDIsIGRmID0gbiAtIDEpDQoNCiMgTWFyZ2VuIGRlIGVycm9yIA0KbWFyZ2VuX2Vycm9yIDwtIHRfY3JpdGljbyAqIHNlDQoNCiMgSW50ZXJ2YWxvIGRlIGNvbmZpYW56YQ0KaWNfaW5mIDwtIG1lZGlhIC0gbWFyZ2VuX2Vycm9yDQppY19zdXAgPC0gbWVkaWEgKyBtYXJnZW5fZXJyb3INCg0KY2F0KCJpbnRlcnZhbG8gZGUgY29uZmlhbnphIGRlbCA5NSU6Iiwgcm91bmQoaWNfaW5mLCAyKSwgIi0iLCByb3VuZChpY19zdXAsIDIpLCAiXG4iKQ0KYGBgDQpFbGFib3JhY2nDs24gZGUgZ3JhZmljbyANCmBgYHtyfQ0KIyBDcmVhY2lvbiBkZSBkYXRhIGZyYW1lDQpkZiA8LSBkYXRhLmZyYW1lKG1lZGlhID0gbWVkaWEsIGljX2luZiA9IGljX2luZiwgaWNfc3VwID0gaWNfc3VwKQ0KDQojIEdyYWZpY28gDQpnZ3Bsb3QoZGYsIGFlcyh4ID0gMSwgeSA9IG1lZGlhKSkgKyBnZW9tX3BvaW50KHNpemUgPSAzLCBjb2xvciA9ICJyZWQiKSArIHlsaW0oMCwyMDApICsgZ2VvbV9lcnJvcmJhcihhZXNfcSh5bWluID0gaWNfaW5mLCB5bWF4ID0gaWNfc3VwKSwgd2lkdGggPSAwLjIsIGNvbG9yID0gImJsdWUiKSArIGxhYnModGl0bGUgPSAiSW50ZXJ2YWxvIGRlIENvbmZpYW56YSBkZWwgOTUlIHBhcmEgbGEgTWVkaWEiLCB4ID0gIk11ZXN0cmEiLCB5ID0gIk1lZGlhIikgKyB0aGVtZV9taW5pbWFsKCkNCmBgYA0KDQpWYWxvciBjcml0aWNvIA0KYGBge3J9DQp0X2NyaXRpY28gPC0gcXQoMSAtIGFscGhhIC8gMiwgZGYgPSBuIC0gMSkNCmBgYA0KDQpDYWxjdWxvIGRlIFIgDQpgYGB7cn0NCiMgRGF0b3Mgc2ltdWxhZG9zDQpzZXQuc2VlZCgxMjMpDQpkYXRvcyA8LSBybm9ybSgzMCwgbWVhbiA9IDEwMCwgc2QgPSAxNSkNCg0KIyBDYWxjdWxhciBlc3RhZMOtc3RpY2FzIA0KbWVkaWEgPC0gbWVhbihkYXRvcykgIyBNZWRpYSBtdWVzdHJhbCANCnNkIDwtIHNkKGRhdG9zKSAgICAgICMgRGVzdmlhY2lvbiBlc3RhbmRhciBtdWVzdHJhbA0KbiA8LSBsZW5ndGgoZGF0b3MpICAgIyBUYW1hw7FvIGRlIGxhIG11ZXN0cmEgDQpzZSA8LSBzZCAvIHNxcnQobikgICAjIEVycm9yIGVzdGFuZGFyIA0KDQojIE5pdmVsIGRlIHNpZ25pZmljYW5jaWEgDQphbHBoYSA8LSAwLjA1DQoNCiMgVmFsb3IgY3JpdGljbyB0DQp0X2NyaXRpY28gPC0gcXQoMSAtIGFscGhhIC8gMiwgZGYgPSBuIC0gMSkNCg0KIyBNYXJnZW4gZGUgZXJyb3INCm1hcmdlbl9lcnJvciA8LSB0X2NyaXRpY28gKiBzZSANCg0KIyBJbnRlcnZhbG8gZGUgY29uZmlhbnphIA0KaWNfaW5mIDwtIG1lZGlhIC0gbWFyZ2VuX2Vycm9yDQppY19zdXAgPC0gbWVkaWEgKyBtYXJnZW5fZXJyb3INCg0KY2F0KCJtZWRpYToiLCByb3VuZChtZWRpYSwgMiksICJcbiIpDQpjYXQoIkludGVydmFsbyBkZSBDb25maWFuemEgZGVsIDk1JTogWyIsIHJvdW5kKGljX2luZiwgMiksICIsIiwgcm91bmQoaWNfc3VwLCAyKSwgIl1cbiIpDQpgYGANCkNhbGN1bG8gZW4gUiBwYXJhIGxhIGNvbXBhcmFjaW9uIGVudHJlIGVsIElDIHkgZWwgdmFsb3IgZGUgUCANCmBgYHtyfQ0KIyBQYXNvIDE6IGRhdG9zIGRlbCBlamVtcGxvIGFudGVyaW9yLCBzdW1hbmRvIGxvcyBkYXRvcyBkZSBsb3Mgbml2ZWxlcyBkZSBnbHVjb3NhIA0Kc2V0LnNlZWQoMTIzKQ0Kbml2ZWxlc19nbHVjb3NhIDwtIHJub3JtKDIwMCwgbWVhbiA9IDEwMCwgc2QgPSAxNSkgIyBNZWRpYSA9IDEwMCwgc2QgPSAxNQ0KIyBQYXNvIDI6IGNhbGN1bG8gZGVsIEljIDk1JQ0KbWVkaWEgPC0gbWVhbihuaXZlbGVzX2dsdWNvc2EpICAjIE1lZGlhIG11ZXN0cmFsDQpzZCA8LSBzZChuaXZlbGVzX2dsdWNvc2EpICAgICAgICMgRGVzdmlhY2nDs24gZXN0w6FuZGFyIG11ZXN0cmFsDQpuIDwtIGxlbmd0aChuaXZlbGVzX2dsdWNvc2EpICAgICMgVGFtYcOxbyBkZSBsYSBtdWVzdHJhDQpzZSA8LSBzZCAvIHNxcnQobikgICAgICAgICAgICAgICMgRXJyb3IgZXN0w6FuZGFyDQoNCiMgSUMgOTUlDQphbHBoYSA8LSAwLjA1DQp0X2NyaXRpY28gPC0gcXQoMSAtIGFscGhhIC8gMiwgZGYgPSBuIC0gMSkgICMgVmFsb3IgY3LDrXRpY28gZGUgdA0KbWFyZ2VuX2Vycm9yIDwtIHRfY3JpdGljbyAqIHNlICAgICAgICAgICAgICAjIE1hcmdlbiBkZSBlcnJvcg0KaWNfaW5mIDwtIG1lZGlhIC0gbWFyZ2VuX2Vycm9yDQppY19zdXAgPC0gbWVkaWEgKyBtYXJnZW5fZXJyb3INCg0KY2F0KCJJbnRlcnZhbG8gZGUgQ29uZmlhbnphIGRlbCA5NSU6IFsiLCByb3VuZChpY19pbmYsIDIpLCAiLCIsIHJvdW5kKGljX3N1cCwgMiksICJdXG4iKQ0KDQojIFBhc28gMzogY2FsY3VsbyBkZSB2YWxvciBkZSBQIA0KDQojIFBydWViYSB0IHBhcmEgbWVkaWEgcG9ibGFjaW9uYWwgZGUgOTUNCnRfdGVzdCA8LSB0LnRlc3Qobml2ZWxlc19nbHVjb3NhLCBtdSA9IDk1KSAgIyBIaXDDs3Rlc2lzIG51bGE6IG1lZGlhID0gOTUNCg0KIyBSZXN1bHRhZG8gZGVsIHZhbG9yIHANCmNhdCgiVmFsb3IgcDoiLCB0X3Rlc3QkcC52YWx1ZSwgIlxuIikNCmBgYA0KRWxhYm9yYWNpb24gZGVsIGdyYWZpY28gZGUgSUMgdnMgVmFsb3IgZGUgUA0KYGBge3J9DQojIENyZWFyIHVuIGRhdGEgZnJhbWUgcGFyYSBlbCBncsOhZmljbw0KZGYgPC0gZGF0YS5mcmFtZSgNCiAgbWVkaWEgPSBtZWRpYSwNCiAgaWNfaW5mID0gaWNfaW5mLA0KICBpY19zdXAgPSBpY19zdXANCikNCg0KIyBHcmFmaWNhcg0KZ2dwbG90KGRmLCBhZXMoeCA9IDEpKSArDQogIGdlb21fZXJyb3JiYXIoYWVzKHltaW4gPSBpY19pbmYsIHltYXggPSBpY19zdXApLCB3aWR0aCA9IDAuMiwgY29sb3IgPSAiYmx1ZSIpICsgeWxpbSgwLDIwMCkrDQogIGdlb21fcG9pbnQoYWVzKHkgPSBtZWRpYSksIHNpemUgPSA0LCBjb2xvciA9ICJyZWQiKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDk1LCBsaW5ldHlwZSA9ICJkYXNoZWQiLCBjb2xvciA9ICJibGFjayIsIHNpemUgPSAxLjIpICsNCiAgbGFicygNCiAgICB0aXRsZSA9ICJDb21wYXJhY2nDs24gZW50cmUgSW50ZXJ2YWxvcyBkZSBDb25maWFuemEgZSBIaXDDs3Rlc2lzIE51bGEiLA0KICAgIHggPSAiTXVlc3RyYSAobml2ZWxlcyBkZSBnbHVjb3NhKSIsDQogICAgeSA9ICJOaXZlbGVzIGRlIEdsdWNvc2EgKG1nL2RMKSINCiAgKSArDQogIHRoZW1lX21pbmltYWwoKQ0KYGBgDQpDb21wYXJhY2nDs24gZGUgZG9zIGdydXBvcw0KUGFzbyBudW0uIDE6IEPDoWxjdWxvIGRlbCBJbnRlcnZhbG8gZGUgQ29uZmlhbnphIHBhcmEgbGEgRGlmZXJlbmNpYSBkZSBNZWRpYXMNCmBgYHtyfQ0Kc2V0LnNlZWQoMTIzKSAjIFJlcHJvZHVjaWJpbGlkYWQgDQogI1NpbXVsYWRvciBkZSBkYXRvcw0KZ3J1cG9fY29udHJvbCA8LSBybm9ybSgzMCwgbWVhbiA9IDEwMCwgc2QgPSAxNSApICMgbWVkaWEgPSAxMDAsIHNkID0gMTUNCmdydXBvX2V4cGVyaW1lbnRhbCA8LSBybm9ybSgzMCwgbWVhbiA9IDExMCwgc2QgPSAxNSkgIyBtZWRpYSA9IDExMCwgc2QgPSAxNQ0KDQojIGNvZGlnbyBwYXJhIGVsIGNhbGN1bG8gZGUgaW50ZXJ2YWxvcyBkZSBjb25maWFuemEgDQptZWRpYV9jb250cm9sIDwtIG1lYW4oZ3J1cG9fY29udHJvbCkNCm1lZGlhX2V4cGVyaW1lbnRhbCA8LSBtZWFuKGdydXBvX2V4cGVyaW1lbnRhbCkNCnNkX2NvbnRyb2wgPC0gc2QoZ3J1cG9fY29udHJvbCkNCnNkX2V4cGVyaW1lbnRhbCA8LSBzZChncnVwb19leHBlcmltZW50YWwpDQpuX2NvbnRyb2wgPC0gbGVuZ3RoKGdydXBvX2NvbnRyb2wpDQpuX2V4cGVydGltZW50YWwgPC0gbGVuZ3RoKGdydXBvX2V4cGVyaW1lbnRhbCkNCg0KI2NhbGN1bG8gcGFyYSBkaWZlcmVuY2lhcyBkZSBtZWRpYXMNCmRpZmVyZW5jaWEgPC0gbWVkaWFfZXhwZXJpbWVudGFsIC0gbWVkaWFfY29udHJvbA0KDQojQ2FsY3VsbyBwYXJhIGVycm9yIGVzdGFuZGFyIGNvbWJpbmFkbw0Kc2UgPC0gc3FydCgoc2RfY29udHJvbF4yIC8gbl9jb250cm9sKSArIChzZF9leHBlcmltZW50YWxeMiAvIG5fZXhwZXJ0aW1lbnRhbCkpDQoNCiNDYWxjdWxvIHBhcmEgZWwgdmFsb3IgY3JpdGljbyB0IHBhcmEgSUMgZGVsIDk1JQ0KYWxwaGEgPC0gMC4wNQ0KdF9jcml0aWNvIDwtIHF0KDEgLSBhbHBoYSAvIDIsIGRmID0gbl9jb250cm9sICsgbl9leHBlcnRpbWVudGFsIC0gMikNCg0KI0NhbGN1bG8gZGUgbWFyZ2VuIGRlIGVycm9yDQptYXJnZW5fZXJyb3IgPC0gdF9jcml0aWNvICogc2UNCg0KIyAgQ2FsY3VsbyBkZSBsw61taXRlcyBkZWwgSUMNCmljX2luZiA8LSBkaWZlcmVuY2lhIC0gbWFyZ2VuX2Vycm9yDQppY19zdXAgPC0gZGlmZXJlbmNpYSArIG1hcmdlbl9lcnJvcg0KDQpjYXQoIkRpZmVyZW5jaWEgZGUgbWVkaWFzOiIsIHJvdW5kKGRpZmVyZW5jaWEsIDIpLCAiXG4iKQ0KDQpjYXQoIkludGVydmFsbyBkZSBDb25maWFuemEgZGVsIDk1JTogWyIsIHJvdW5kKGljX2luZiwgMiksICIsIiwgcm91bmQoaWNfc3VwLCAyKSwgIl1cbiIpDQpgYGANClBhc28gbnVtLiAyOiBQdWViYSBkZSBoaXBvdGVzaXMgeSB2YWxvciBkZSBwIA0KYGBge3J9DQojIFBydWViYSB0IHBhcmEgZG9zIG11ZXN0cmFzIGluZGVwZW5kaWVudGVzDQp0X3Rlc3QgPC0gdC50ZXN0KGdydXBvX2NvbnRyb2wsIGdydXBvX2V4cGVyaW1lbnRhbCwgdmFyLmVxdWFsID0gVFJVRSkNCg0KIyBSZXN1bHRhZG9zDQpjYXQoIlZhbG9yIHA6IiwgdF90ZXN0JHAudmFsdWUsICJcbiIpDQoNCmNhdCgiRGlmZXJlbmNpYSBlc3RpbWFkYSAodC10ZXN0KToiLCB0X3Rlc3QkZXN0aW1hdGUsICJcbiIpDQpgYGANClBhc28gbnVtLiAzOiBWaXN1YWxpemFjaW9uIGRlIGxvcyByZXN1bHRhZG8gcG9yIG1lZGlvIGRlIGdncGxvdDINCmBgYHtyfQ0KbGlicmFyeShnZ3Bsb3QyKQ0KDQojIENyZWFyIHVuIGRhdGEgZnJhbWUgY29uIGxvcyBkYXRvcw0KZGYgPC0gZGF0YS5mcmFtZSgNCiAgZ3J1cG8gPSByZXAoYygiQ29udHJvbCIsICJFeHBlcmltZW50YWwiKSwgZWFjaCA9IDMwKSwNCiAgbml2ZWxlc19nbHVjb3NhID0gYyhncnVwb19jb250cm9sLCBncnVwb19leHBlcmltZW50YWwpDQopDQoNCiMgR3JhZmljYXIgbG9zIGRhdG9zDQpnZ3Bsb3QoZGYsIGFlcyh4ID0gZ3J1cG8sIHkgPSBuaXZlbGVzX2dsdWNvc2EsIGZpbGwgPSBncnVwbykpICsNCiAgZ2VvbV9ib3hwbG90KGFscGhhID0gMC43LCBvdXRsaWVyLmNvbG91ciA9ICJyZWQiKSArDQogIGdlb21fcG9pbnQocG9zaXRpb24gPSBwb3NpdGlvbl9qaXR0ZXIod2lkdGggPSAwLjEpLCBhbHBoYSA9IDAuNSkgKw0KICBsYWJzKA0KICAgIHRpdGxlID0gIkNvbXBhcmFjacOzbiBkZSBOaXZlbGVzIGRlIEdsdWNvc2EgZW50cmUgR3J1cG9zIiwNCiAgICB4ID0gIkdydXBvIiwNCiAgICB5ID0gIk5pdmVsZXMgZGUgR2x1Y29zYSAobWcvZEwpIg0KICApICsNCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygiIzAwQkZDNCIsICIjRjg3NjZEIikpDQpgYGANCkVsYWJvcmFjaW9uIGRlIGxhIGdyYWZpY2EgcGVybyBhZ3JlZ2FuZG8gbGEgc2lnbmlmaWNhbmNpYSANCmBgYHtyfQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShnZ3B1YnIpDQoNCiMgQ3JlYXIgdW4gZGF0YSBmcmFtZSBjb24gbG9zIGRhdG9zDQpkZiA8LSBkYXRhLmZyYW1lKA0KICBncnVwbyA9IHJlcChjKCJDb250cm9sIiwgIkV4cGVyaW1lbnRhbCIpLCBlYWNoID0gMzApLA0KICBuaXZlbGVzX2dsdWNvc2EgPSBjKGdydXBvX2NvbnRyb2wsIGdydXBvX2V4cGVyaW1lbnRhbCkNCikNCg0KIyBHcmFmaWNhciBsb3MgZGF0b3MgY29uIHNpZ25pZmljYW5jaWENCmdncGxvdChkZiwgYWVzKHggPSBncnVwbywgeSA9IG5pdmVsZXNfZ2x1Y29zYSwgZmlsbCA9IGdydXBvKSkgKw0KICBnZW9tX2JveHBsb3QoYWxwaGEgPSAwLjcsIG91dGxpZXIuY29sb3VyID0gInJlZCIpICsNCiAgZ2VvbV9wb2ludChwb3NpdGlvbiA9IHBvc2l0aW9uX2ppdHRlcih3aWR0aCA9IDAuMSksIGFscGhhID0gMC41KSArDQogIGxhYnMoDQogICAgdGl0bGUgPSAiQ29tcGFyYWNpw7NuIGRlIE5pdmVsZXMgZGUgR2x1Y29zYSBlbnRyZSBHcnVwb3MiLA0KICAgIHggPSAiR3J1cG8iLA0KICAgIHkgPSAiTml2ZWxlcyBkZSBHbHVjb3NhIChtZy9kTCkiDQogICkgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCIjMDBCRkM0IiwgIiNGODc2NkQiKSkgKw0KICBzdGF0X2NvbXBhcmVfbWVhbnMoDQogICAgbWV0aG9kID0gInQudGVzdCIsICMgUmVhbGl6YXIgcHJ1ZWJhIHQNCiAgICBsYWJlbCA9ICJwLmZvcm1hdCIsICMgTW9zdHJhciBlbCB2YWxvciBwIGVuIGZvcm1hdG8gZXN0w6FuZGFyIG8gbG8gcHVlZGVzIGNhbWJpYXIgcG9yICJwLnNpZ25pZiIgcGFyYSBhc3RlcmlzY29zDQogICAgbGFiZWwueSA9IG1heChkZiRuaXZlbGVzX2dsdWNvc2EpICsgNSAjIEFqdXN0YXIgbGEgcG9zaWNpw7NuIGRlIGxhIGV0aXF1ZXRhDQogICxsYWJlbC54PTEuNSkNCmBgYA0KDQo=