Resuelva las situaicones que se le presentan a continuación. Para cada una de las situaciones deberán generar un gráfico en ggplot que acompañe a la resolución.

Problema 1

En un laboratorio de botánica se sembraron plántulas de frijol (Phaseolus vulgaris) bajo condiciones controladas: luz constante, temperatura de 25 °C y riego regular. Cada 2 días se midió la altura de 10 plántulas y se registró el promedio. Su grupo debe estimar la tasa de crecimiento de las plántulas con un modelo lineal. Si ustedes tuvieran a cargo de laboratorio, qué decisiones tomarían para que el crecimiento sea mayor.

Ahora, con ese modelo, haga una predicción de cuál será el tamañao de las plantas en los días 40 y 52.

predict(modelol, nuevos_datos)
       1        2 
45.68988 58.78060 
library(readxl)
Problema1 <- read_excel("C:/Users/elean/OneDrive/Escritorio/Modelosb_III/Problemas_Modelos.xlsx", 
    sheet = "Problema1")
View(Problema1)
Problema1
Problema1 <- data.frame(
  Tiempo = c(40, 52),
  Altura = problema1
)
class(problema1)
problema1 <- Problema1
promedio <- mean(Problema1$Altura)
grafico1 <- ggplot(Problema1, aes(x = Tiempo, y = Altura)) +
  # Línea del promedio (azul cielo claro)
  geom_hline(yintercept = promedio, linetype = "dashed",
             color = "#7FA3C7", linewidth = 0.7) +
  annotate("text", x = max(Problema1$Tiempo), y = promedio,
           label = paste0("Promedio = ", round(promedio, 1), " cm"),
           hjust = 1, vjust = -0.6, color = "#A9C4E0", size = 4) +
  # Recta de tendencia con banda de confianza (amarillo luna)
  geom_smooth(method = "lm", color = "#F4D35E", fill = "#E9B44C",
              alpha = 0.3, linewidth = 1.2) +
  # Puntos rojizos
  geom_point(color = "#F28C28", fill = "#FFE066", shape = 21,
             size = 4, stroke = 1, alpha = 0.9) +
  labs(
    x = "Tiempo (días)",
    y = "Altura (cm)"
  ) +
  theme_minimal(base_size = 14) +
  theme(
    # Fondo azul noche
    plot.background  = element_rect(fill = "#0B1F4B", color = NA),
    panel.background = element_rect(fill = "#10285E", color = NA),
    # Textos claros
    plot.title       = element_text(face = "bold", color = "#F4D35E"),
    plot.subtitle    = element_text(color = "#A9C4E0"),
    axis.title       = element_text(color = "#DCE6F2"),
    axis.text        = element_text(color = "#A9C4E0"),
    # Cuadrícula sutil azulada
    panel.grid.minor = element_blank(),
    panel.grid.major = element_line(color = "#1E3A78")
  )
grafico1
mod_prob1 <- lm(Altura~ Tiempo, data = Problema1)
summary(mod_prob1)
nuevos_datos <- data.frame(Tiempo= c(40,52))

predict(mod_prob1, nuevos_datos)

Respuesta

1 2 17.32667 17.32667

Problema 2

La lapa roja o guacamaya roja (Ara macao) fue casi eliminada de buena parte del Pacífico de Costa Rica por la pérdida de bosque y la captura de polluelos. Gracias a programas de conservación y reintroducción, algunas poblaciones se han recuperado.

Imaginen que un programa de conservación liberó un grupo pequeño de lapas rojas en un bosque protegido del Pacífico central y las censó cada año durante 20 años. Ustedes deben ajustar un modelo logístico a los datos y estimar los parámetros que describen el crecimiento de esta población. Como tomadores de decisión, especifiquen cuándo deberá de terminar el monitoreo ecológico, según el comportamiento poblacional.


library(growthrates)


datos <- data.frame(
  ano = 0:20,
  poblacion = c(
    12, 15, 24, 29, 43, 50, 69, 79, 101, 109,
    131, 136, 152, 154, 166, 165, 174, 171, 179, 174, 181
  )

)

==========================================

MODELO LOGÍSTICO

==========================================

modelo <- nls(
  poblacion ~ K / (1 + A * exp(-r * ano)),
  data = datos,
  start = list(K = 190, A = 15, r = 0.3)
)

==========================================

VER LOS RESULTADOS DEL MODELO

==========================================

summary(modelo)

==========================================

OBTENER LOS PARÁMETROS

==========================================

K <- coef(modelo)["K"]
A <- coef(modelo)["A"]
r <- coef(modelo)["r"]

K A r

==========================================

CREAR LA CURVA LOGÍSTICA

==========================================

ano_curva <- seq(0, 20, length.out = 200)

poblacion_curva <- K / (1 + A * exp(-r * ano_curva))

==========================================

GRÁFICA

==========================================

plot(
  datos$ano,
  datos$poblacion,
  pch = 19,
  xlab = "Muestreo",
  ylab = "Número de individuos",
  main = "Crecimiento poblacional de la lapa roja (Ara macao)",
  xlim = c(0, 20),
  ylim = c(0, K * 1.1)
)

Curva logística

lines(
  ano_curva,
  poblacion_curva,
  lwd = 3
)

Capacidad de carga

abline(
  h = K,
  lty = 2,
  lwd = 2
)

Leyenda

legend(
  "bottomright",
  legend = c(
    "Datos observados",
    "Modelo logístico",
    "Capacidad de carga (K)"
  ),
  pch = c(19, NA, NA),
  lty = c(NA, 1, 2),
  lwd = c(NA, 3, 2)
)

Respuesta

Problema 3

En los bosques nubosos de la cordillera de Tilarán, un anfibio endémico (especie ficticia, inspirada en lo ocurrido con el sapo dorado de Monteverde) mantenía una población estable de unos 500 individuos. A partir de cierto momento, la llegada de un hongo patógeno (quitridiomicosis) y el aumento de la temperatura hicieron que las muertes superaran a los nacimientos. Un equipo de biólogos censó la población cada año durante 12 años. (mumax = -0.3, K = 550)

Ustedes deben ajustar un modelo logístico con tasa de crecimiento y usarlo para predecir cuándo desaparecerá la población.


## Para predecir:

ajuste <- fit_growthmodel(
  FUN   = grow_logistic,
  p     = c(y0 = , mumax = , K = ),   # valores iniciales
  time  = tiempo,
  y     = individuos,
  lower = c(y0 = 1,    mumax = -3, K = 1),
  upper = c(y0 = 2000, mumax = 0,  K = 5000)
)

summary(ajuste)
coef(ajuste)


## Predicción de cuál será el número de individuos en un tiempo determinado

p <- coef(ajuste)
t_pred <- c(20,40,50)
N_pred <- grow_logistic(t_pred, p)[, "y"]

## Predicción de en qué momento la población va a ser 0

t_alcanza <- function(N, p) {
  with(as.list(p), log(N * (K - y0) / (y0 * (K - N))) / mumax)
}
t_alcanza(0.1, p)    # K/2 y 90 % de K

library(readxl)
Problema3 <- read_excel("C:/Users/elean/OneDrive/Escritorio/Modelosb_III/Problemas_Modelos.xlsx", 
    sheet = "Problema3")
View(Problema3)

Problema3

ggplot(Problema3, aes(x = Muestreo, y = Individuos)) +
  geom_line(color = "#2E8B57", linewidth = 1.2) +
  geom_point(color = "#1B4332", fill = "#B7E04A", shape = 21,
             size = 3, stroke = 0.8, alpha = 0.95) +
  theme_classic() +
  labs(x = "Año", y = "Individuos")

Problema3

tiempo <- Problema3$Muestreo
individuos <- Problema3$Individuos

library(growthrates)
library(ggplot2)

# 1. Ajuste del modelo logístico
ajuste <- fit_growthmodel(
  FUN   = grow_logistic,
  p     = c(y0 = 500, mumax = -0.3, K = 550),   # valores iniciales
  time  = Problema3$Muestreo,
  y     = Problema3$Individuos,
  lower = c(y0 = 1,    mumax = -3, K = 1),
  upper = c(y0 = 2000, mumax = 0,  K = 5000)
)

summary(ajuste)
p <- coef(ajuste)
p

# 2. Individuos en tiempos futuros
t_pred <- c(20, 40, 50)
N_pred <- grow_logistic(t_pred, p)[, "y"]
N_pred

# 3. Tiempo en que la población llega a un umbral de extinción
t_alcanza <- function(N, p) {
  with(as.list(p), log(N * (K - y0) / (y0 * (K - N))) / mumax)
}
t_alcanza(1, p)     # queda 1 individuo
t_alcanza(0.1, p)   # menos de 1 individuo (extinción práctica)

Respuesta

Según el modelo, en el año 20 quedarían aproximadamente [valor] individuos, en el año 40 [valor] y en el año 50 [valor].

LS0tDQp0aXRsZTogIlIgTm90ZWJvb2siDQpvdXRwdXQ6DQogIGh0bWxfbm90ZWJvb2s6DQogICAgdG9jOiB0cnVlDQogICAgdGhlbWU6IHVuaXRlZA0KICBodG1sX2RvY3VtZW50Og0KICAgIHRvYzogdHJ1ZQ0KICAgIGRmX3ByaW50OiBwYWdlZA0KLS0tDQoNClJlc3VlbHZhIGxhcyBzaXR1YWljb25lcyBxdWUgc2UgbGUgcHJlc2VudGFuIGEgY29udGludWFjacOzbi4gUGFyYSBjYWRhIHVuYSBkZSBsYXMgc2l0dWFjaW9uZXMgZGViZXLDoW4gZ2VuZXJhciB1biBncsOhZmljbyBlbiBnZ3Bsb3QgcXVlIGFjb21wYcOxZSBhIGxhIHJlc29sdWNpw7NuLg0KDQoNCiMgUHJvYmxlbWEgMQ0KDQpFbiB1biBsYWJvcmF0b3JpbyBkZSBib3TDoW5pY2Egc2Ugc2VtYnJhcm9uIHBsw6FudHVsYXMgZGUgZnJpam9sICgqUGhhc2VvbHVzIHZ1bGdhcmlzKikgYmFqbyBjb25kaWNpb25lcyBjb250cm9sYWRhczogbHV6IGNvbnN0YW50ZSwgdGVtcGVyYXR1cmEgZGUgMjUgwrBDIHkgcmllZ28gcmVndWxhci4gQ2FkYSAyIGTDrWFzIHNlIG1pZGnDsyBsYSBhbHR1cmEgZGUgMTAgcGzDoW50dWxhcyB5IHNlIHJlZ2lzdHLDsyBlbCBwcm9tZWRpby4gU3UgZ3J1cG8gZGViZSBlc3RpbWFyIGxhwqAqKnRhc2EgZGUgY3JlY2ltaWVudG8qKsKgZGUgbGFzIHBsw6FudHVsYXMgY29uIHVuIG1vZGVsbyBsaW5lYWwuIFNpIHVzdGVkZXMgdHV2aWVyYW4gYSBjYXJnbyBkZSBsYWJvcmF0b3JpbywgcXXDqSBkZWNpc2lvbmVzIHRvbWFyw61hbiBwYXJhIHF1ZSBlbCBjcmVjaW1pZW50byBzZWEgbWF5b3IuDQoNCkFob3JhLCBjb24gZXNlIG1vZGVsbywgaGFnYSB1bmEgcHJlZGljY2nDs24gZGUgY3XDoWwgc2Vyw6EgZWwgdGFtYcOxYW8gZGUgbGFzIHBsYW50YXMgZW4gbG9zIGTDrWFzIDQwIHkgNTIuDQoNCmBgYHtyfQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShyZWFkeGwpDQpsaWJyYXJ5KGdyb3d0aHJhdGVzKQ0KYGBgDQoNCmBgYHtyfQ0KbGlicmFyeShyZWFkeGwpDQpQcm9ibGVtYTEgPC0gcmVhZF9leGNlbCgiQzovVXNlcnMvZWxlYW4vT25lRHJpdmUvRXNjcml0b3Jpby9Nb2RlbG9zYl9JSUkvUHJvYmxlbWFzX01vZGVsb3MueGxzeCIsIA0KICAgIHNoZWV0ID0gIlByb2JsZW1hMSIpDQpWaWV3KFByb2JsZW1hMSkNCmBgYA0KDQpgYGB7cn0NClByb2JsZW1hMQ0KYGBgDQoNCg0KYGBge3J9DQpQcm9ibGVtYTEgPC0gZGF0YS5mcmFtZSgNCiAgVGllbXBvID0gYyg0MCwgNTIpLA0KICBBbHR1cmEgPSBwcm9ibGVtYTENCikNCmBgYA0KDQpgYGB7cn0NCmNsYXNzKHByb2JsZW1hMSkNCmBgYA0KDQoNCmBgYHtyfQ0KcHJvYmxlbWExIDwtIFByb2JsZW1hMQ0KcHJvbWVkaW8gPC0gbWVhbihQcm9ibGVtYTEkQWx0dXJhKQ0KYGBgDQoNCg0KDQpgYGB7cn0NCmdyYWZpY28xIDwtIGdncGxvdChQcm9ibGVtYTEsIGFlcyh4ID0gVGllbXBvLCB5ID0gQWx0dXJhKSkgKw0KICAjIEzDrW5lYSBkZWwgcHJvbWVkaW8gKGF6dWwgY2llbG8gY2xhcm8pDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IHByb21lZGlvLCBsaW5ldHlwZSA9ICJkYXNoZWQiLA0KICAgICAgICAgICAgIGNvbG9yID0gIiM3RkEzQzciLCBsaW5ld2lkdGggPSAwLjcpICsNCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gbWF4KFByb2JsZW1hMSRUaWVtcG8pLCB5ID0gcHJvbWVkaW8sDQogICAgICAgICAgIGxhYmVsID0gcGFzdGUwKCJQcm9tZWRpbyA9ICIsIHJvdW5kKHByb21lZGlvLCAxKSwgIiBjbSIpLA0KICAgICAgICAgICBoanVzdCA9IDEsIHZqdXN0ID0gLTAuNiwgY29sb3IgPSAiI0E5QzRFMCIsIHNpemUgPSA0KSArDQogICMgUmVjdGEgZGUgdGVuZGVuY2lhIGNvbiBiYW5kYSBkZSBjb25maWFuemEgKGFtYXJpbGxvIGx1bmEpDQogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIGNvbG9yID0gIiNGNEQzNUUiLCBmaWxsID0gIiNFOUI0NEMiLA0KICAgICAgICAgICAgICBhbHBoYSA9IDAuMywgbGluZXdpZHRoID0gMS4yKSArDQogICMgUHVudG9zIHJvaml6b3MNCiAgZ2VvbV9wb2ludChjb2xvciA9ICIjRjI4QzI4IiwgZmlsbCA9ICIjRkZFMDY2Iiwgc2hhcGUgPSAyMSwNCiAgICAgICAgICAgICBzaXplID0gNCwgc3Ryb2tlID0gMSwgYWxwaGEgPSAwLjkpICsNCiAgbGFicygNCiAgICB4ID0gIlRpZW1wbyAoZMOtYXMpIiwNCiAgICB5ID0gIkFsdHVyYSAoY20pIg0KICApICsNCiAgdGhlbWVfbWluaW1hbChiYXNlX3NpemUgPSAxNCkgKw0KICB0aGVtZSgNCiAgICAjIEZvbmRvIGF6dWwgbm9jaGUNCiAgICBwbG90LmJhY2tncm91bmQgID0gZWxlbWVudF9yZWN0KGZpbGwgPSAiIzBCMUY0QiIsIGNvbG9yID0gTkEpLA0KICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICIjMTAyODVFIiwgY29sb3IgPSBOQSksDQogICAgIyBUZXh0b3MgY2xhcm9zDQogICAgcGxvdC50aXRsZSAgICAgICA9IGVsZW1lbnRfdGV4dChmYWNlID0gImJvbGQiLCBjb2xvciA9ICIjRjREMzVFIiksDQogICAgcGxvdC5zdWJ0aXRsZSAgICA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICIjQTlDNEUwIiksDQogICAgYXhpcy50aXRsZSAgICAgICA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICIjRENFNkYyIiksDQogICAgYXhpcy50ZXh0ICAgICAgICA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICIjQTlDNEUwIiksDQogICAgIyBDdWFkcsOtY3VsYSBzdXRpbCBhenVsYWRhDQogICAgcGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICBwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9saW5lKGNvbG9yID0gIiMxRTNBNzgiKQ0KICApDQpgYGANCg0KYGBge3J9DQpncmFmaWNvMQ0KYGBgDQoNCmBgYHtyfQ0KbW9kX3Byb2IxIDwtIGxtKEFsdHVyYX4gVGllbXBvLCBkYXRhID0gUHJvYmxlbWExKQ0Kc3VtbWFyeShtb2RfcHJvYjEpDQpgYGANCg0KYGBge3J9DQpudWV2b3NfZGF0b3MgPC0gZGF0YS5mcmFtZShUaWVtcG89IGMoNDAsNTIpKQ0KDQpwcmVkaWN0KG1vZF9wcm9iMSwgbnVldm9zX2RhdG9zKQ0KYGBgDQoNCg0KIyMgUmVzcHVlc3RhDQogICAxICAgICAgICAyIA0KMTcuMzI2NjcgMTcuMzI2NjcgDQoNCiMgUHJvYmxlbWEgMg0KDQpMYSBsYXBhIHJvamEgbyBndWFjYW1heWEgcm9qYSAoKkFyYSBtYWNhbyopIGZ1ZSBjYXNpIGVsaW1pbmFkYSBkZSBidWVuYSBwYXJ0ZSBkZWwgUGFjw61maWNvIGRlIENvc3RhIFJpY2EgcG9yIGxhIHDDqXJkaWRhIGRlIGJvc3F1ZSB5IGxhIGNhcHR1cmEgZGUgcG9sbHVlbG9zLiBHcmFjaWFzIGEgcHJvZ3JhbWFzIGRlIGNvbnNlcnZhY2nDs24geSByZWludHJvZHVjY2nDs24sIGFsZ3VuYXMgcG9ibGFjaW9uZXMgc2UgaGFuIHJlY3VwZXJhZG8uDQoNCkltYWdpbmVuIHF1ZSB1biBwcm9ncmFtYSBkZSBjb25zZXJ2YWNpw7NuIGxpYmVyw7MgdW4gZ3J1cG8gcGVxdWXDsW8gZGUgbGFwYXMgcm9qYXMgZW4gdW4gYm9zcXVlIHByb3RlZ2lkbyBkZWwgUGFjw61maWNvIGNlbnRyYWwgeSBsYXMgY2Vuc8OzwqAqKmNhZGEgYcOxbyBkdXJhbnRlIDIwIGHDsW9zKiouIFVzdGVkZXMgZGViZW4gYWp1c3RhciB1bsKgKiptb2RlbG8gbG9nw61zdGljbyoqwqBhIGxvcyBkYXRvcyB5IGVzdGltYXIgbG9zIHBhcsOhbWV0cm9zIHF1ZSBkZXNjcmliZW4gZWwgY3JlY2ltaWVudG8gZGUgZXN0YSBwb2JsYWNpw7NuLiBDb21vIHRvbWFkb3JlcyBkZSBkZWNpc2nDs24sIGVzcGVjaWZpcXVlbiBjdcOhbmRvIGRlYmVyw6EgZGUgdGVybWluYXIgZWwgbW9uaXRvcmVvIGVjb2zDs2dpY28sIHNlZ8O6biBlbCBjb21wb3J0YW1pZW50byBwb2JsYWNpb25hbC4NCg0KDQpgYGB7cn0NCg0KbGlicmFyeShncm93dGhyYXRlcykNCg0KDQpkYXRvcyA8LSBkYXRhLmZyYW1lKA0KICBhbm8gPSAwOjIwLA0KICBwb2JsYWNpb24gPSBjKA0KICAgIDEyLCAxNSwgMjQsIDI5LCA0MywgNTAsIDY5LCA3OSwgMTAxLCAxMDksDQogICAgMTMxLCAxMzYsIDE1MiwgMTU0LCAxNjYsIDE2NSwgMTc0LCAxNzEsIDE3OSwgMTc0LCAxODENCiAgKQ0KDQopDQpgYGANCg0KDQoNCg0KIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCiMgTU9ERUxPIExPR8ONU1RJQ08NCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQoNCg0KYGBge3J9DQptb2RlbG8gPC0gbmxzKA0KICBwb2JsYWNpb24gfiBLIC8gKDEgKyBBICogZXhwKC1yICogYW5vKSksDQogIGRhdGEgPSBkYXRvcywNCiAgc3RhcnQgPSBsaXN0KEsgPSAxOTAsIEEgPSAxNSwgciA9IDAuMykNCikNCmBgYA0KDQoNCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQojIFZFUiBMT1MgUkVTVUxUQURPUyBERUwgTU9ERUxPDQojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KDQoNCmBgYHtyfQ0Kc3VtbWFyeShtb2RlbG8pDQpgYGANCg0KDQojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KIyBPQlRFTkVSIExPUyBQQVLDgU1FVFJPUw0KIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCmBgYHtyfQ0KSyA8LSBjb2VmKG1vZGVsbylbIksiXQ0KQSA8LSBjb2VmKG1vZGVsbylbIkEiXQ0KciA8LSBjb2VmKG1vZGVsbylbInIiXQ0KYGBgDQoNCksNCkENCnINCg0KDQojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KIyBDUkVBUiBMQSBDVVJWQSBMT0fDjVNUSUNBDQojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KDQoNCg0KYGBge3J9DQphbm9fY3VydmEgPC0gc2VxKDAsIDIwLCBsZW5ndGgub3V0ID0gMjAwKQ0KDQpwb2JsYWNpb25fY3VydmEgPC0gSyAvICgxICsgQSAqIGV4cCgtciAqIGFub19jdXJ2YSkpDQpgYGANCg0KDQojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KIyBHUsOBRklDQQ0KIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCg0KDQoNCmBgYHtyfQ0KcGxvdCgNCiAgZGF0b3MkYW5vLA0KICBkYXRvcyRwb2JsYWNpb24sDQogIHBjaCA9IDE5LA0KICB4bGFiID0gIk11ZXN0cmVvIiwNCiAgeWxhYiA9ICJOw7ptZXJvIGRlIGluZGl2aWR1b3MiLA0KICBtYWluID0gIkNyZWNpbWllbnRvIHBvYmxhY2lvbmFsIGRlIGxhIGxhcGEgcm9qYSAoQXJhIG1hY2FvKSIsDQogIHhsaW0gPSBjKDAsIDIwKSwNCiAgeWxpbSA9IGMoMCwgSyAqIDEuMSkNCikNCmBgYA0KDQoNCiMgQ3VydmEgbG9nw61zdGljYQ0KDQpgYGB7cn0NCmxpbmVzKA0KICBhbm9fY3VydmEsDQogIHBvYmxhY2lvbl9jdXJ2YSwNCiAgbHdkID0gMw0KKQ0KYGBgDQoNCg0KIyBDYXBhY2lkYWQgZGUgY2FyZ2ENCg0KDQpgYGB7cn0NCmFibGluZSgNCiAgaCA9IEssDQogIGx0eSA9IDIsDQogIGx3ZCA9IDINCikNCmBgYA0KDQojIExleWVuZGENCmBgYHtyfQ0KbGVnZW5kKA0KICAiYm90dG9tcmlnaHQiLA0KICBsZWdlbmQgPSBjKA0KICAgICJEYXRvcyBvYnNlcnZhZG9zIiwNCiAgICAiTW9kZWxvIGxvZ8Otc3RpY28iLA0KICAgICJDYXBhY2lkYWQgZGUgY2FyZ2EgKEspIg0KICApLA0KICBwY2ggPSBjKDE5LCBOQSwgTkEpLA0KICBsdHkgPSBjKE5BLCAxLCAyKSwNCiAgbHdkID0gYyhOQSwgMywgMikNCikNCmBgYA0KDQoNCg0KDQojIyBSZXNwdWVzdGENCg0KIyBQcm9ibGVtYSAzDQoNCkVuIGxvcyBib3NxdWVzIG51Ym9zb3MgZGUgbGEgY29yZGlsbGVyYSBkZSBUaWxhcsOhbiwgdW4gYW5maWJpbyBlbmTDqW1pY28gKGVzcGVjaWUgZmljdGljaWEsIGluc3BpcmFkYSBlbiBsbyBvY3VycmlkbyBjb24gZWwgc2FwbyBkb3JhZG8gZGUgTW9udGV2ZXJkZSkgbWFudGVuw61hIHVuYSBwb2JsYWNpw7NuIGVzdGFibGUgZGUgdW5vcyA1MDAgaW5kaXZpZHVvcy4gQSBwYXJ0aXIgZGUgY2llcnRvIG1vbWVudG8sIGxhIGxsZWdhZGEgZGUgdW4gaG9uZ28gcGF0w7NnZW5vIChxdWl0cmlkaW9taWNvc2lzKSB5IGVsIGF1bWVudG8gZGUgbGEgdGVtcGVyYXR1cmEgaGljaWVyb24gcXVlIGxhcyBtdWVydGVzIHN1cGVyYXJhbiBhIGxvcyBuYWNpbWllbnRvcy4gVW4gZXF1aXBvIGRlIGJpw7Nsb2dvcyBjZW5zw7MgbGEgcG9ibGFjacOzbsKgKipjYWRhIGHDsW8gZHVyYW50ZSAxMiBhw7FvcyoqLiAobXVtYXggPSAtMC4zLCBLID0gNTUwKQ0KDQpVc3RlZGVzIGRlYmVuIGFqdXN0YXIgdW7CoCoqbW9kZWxvIGxvZ8Otc3RpY28gY29uIHRhc2EgZGUgY3JlY2ltaWVudG8qKsKgeSB1c2FybG8gcGFyYSBwcmVkZWNpcsKgKipjdcOhbmRvIGRlc2FwYXJlY2Vyw6EgbGEgcG9ibGFjacOzbioqLg0KDQpgYGB7cn0NCg0KIyMgUGFyYSBwcmVkZWNpcjoNCg0KYWp1c3RlIDwtIGZpdF9ncm93dGhtb2RlbCgNCiAgRlVOICAgPSBncm93X2xvZ2lzdGljLA0KICBwICAgICA9IGMoeTAgPSAsIG11bWF4ID0gLCBLID0gKSwgICAjIHZhbG9yZXMgaW5pY2lhbGVzDQogIHRpbWUgID0gdGllbXBvLA0KICB5ICAgICA9IGluZGl2aWR1b3MsDQogIGxvd2VyID0gYyh5MCA9IDEsICAgIG11bWF4ID0gLTMsIEsgPSAxKSwNCiAgdXBwZXIgPSBjKHkwID0gMjAwMCwgbXVtYXggPSAwLCAgSyA9IDUwMDApDQopDQoNCnN1bW1hcnkoYWp1c3RlKQ0KY29lZihhanVzdGUpDQoNCg0KIyMgUHJlZGljY2nDs24gZGUgY3XDoWwgc2Vyw6EgZWwgbsO6bWVybyBkZSBpbmRpdmlkdW9zIGVuIHVuIHRpZW1wbyBkZXRlcm1pbmFkbw0KDQpwIDwtIGNvZWYoYWp1c3RlKQ0KdF9wcmVkIDwtIGMoMjAsNDAsNTApDQpOX3ByZWQgPC0gZ3Jvd19sb2dpc3RpYyh0X3ByZWQsIHApWywgInkiXQ0KDQojIyBQcmVkaWNjacOzbiBkZSBlbiBxdcOpIG1vbWVudG8gbGEgcG9ibGFjacOzbiB2YSBhIHNlciAwDQoNCnRfYWxjYW56YSA8LSBmdW5jdGlvbihOLCBwKSB7DQogIHdpdGgoYXMubGlzdChwKSwgbG9nKE4gKiAoSyAtIHkwKSAvICh5MCAqIChLIC0gTikpKSAvIG11bWF4KQ0KfQ0KdF9hbGNhbnphKDAuMSwgcCkgICAgIyBLLzIgeSA5MCAlIGRlIEsNCg0KDQoNCmBgYA0KDQoNCmBgYHtyfQ0KDQpsaWJyYXJ5KHJlYWR4bCkNClByb2JsZW1hMyA8LSByZWFkX2V4Y2VsKCJDOi9Vc2Vycy9lbGVhbi9PbmVEcml2ZS9Fc2NyaXRvcmlvL01vZGVsb3NiX0lJSS9Qcm9ibGVtYXNfTW9kZWxvcy54bHN4IiwgDQogICAgc2hlZXQgPSAiUHJvYmxlbWEzIikNClZpZXcoUHJvYmxlbWEzKQ0KDQpgYGANCg0KYGBge3J9DQoNClByb2JsZW1hMw0KDQpgYGANCg0KYGBge3J9DQoNCmdncGxvdChQcm9ibGVtYTMsIGFlcyh4ID0gTXVlc3RyZW8sIHkgPSBJbmRpdmlkdW9zKSkgKw0KICBnZW9tX2xpbmUoY29sb3IgPSAiIzJFOEI1NyIsIGxpbmV3aWR0aCA9IDEuMikgKw0KICBnZW9tX3BvaW50KGNvbG9yID0gIiMxQjQzMzIiLCBmaWxsID0gIiNCN0UwNEEiLCBzaGFwZSA9IDIxLA0KICAgICAgICAgICAgIHNpemUgPSAzLCBzdHJva2UgPSAwLjgsIGFscGhhID0gMC45NSkgKw0KICB0aGVtZV9jbGFzc2ljKCkgKw0KICBsYWJzKHggPSAiQcOxbyIsIHkgPSAiSW5kaXZpZHVvcyIpDQoNCmBgYA0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCmBgYHtyfQ0KDQpQcm9ibGVtYTMNCg0KdGllbXBvIDwtIFByb2JsZW1hMyRNdWVzdHJlbw0KaW5kaXZpZHVvcyA8LSBQcm9ibGVtYTMkSW5kaXZpZHVvcw0KDQpgYGANCg0KDQpgYGB7cn0NCg0KbGlicmFyeShncm93dGhyYXRlcykNCmxpYnJhcnkoZ2dwbG90MikNCg0KIyAxLiBBanVzdGUgZGVsIG1vZGVsbyBsb2fDrXN0aWNvDQphanVzdGUgPC0gZml0X2dyb3d0aG1vZGVsKA0KICBGVU4gICA9IGdyb3dfbG9naXN0aWMsDQogIHAgICAgID0gYyh5MCA9IDUwMCwgbXVtYXggPSAtMC4zLCBLID0gNTUwKSwgICAjIHZhbG9yZXMgaW5pY2lhbGVzDQogIHRpbWUgID0gUHJvYmxlbWEzJE11ZXN0cmVvLA0KICB5ICAgICA9IFByb2JsZW1hMyRJbmRpdmlkdW9zLA0KICBsb3dlciA9IGMoeTAgPSAxLCAgICBtdW1heCA9IC0zLCBLID0gMSksDQogIHVwcGVyID0gYyh5MCA9IDIwMDAsIG11bWF4ID0gMCwgIEsgPSA1MDAwKQ0KKQ0KDQpzdW1tYXJ5KGFqdXN0ZSkNCnAgPC0gY29lZihhanVzdGUpDQpwDQoNCiMgMi4gSW5kaXZpZHVvcyBlbiB0aWVtcG9zIGZ1dHVyb3MNCnRfcHJlZCA8LSBjKDIwLCA0MCwgNTApDQpOX3ByZWQgPC0gZ3Jvd19sb2dpc3RpYyh0X3ByZWQsIHApWywgInkiXQ0KTl9wcmVkDQoNCiMgMy4gVGllbXBvIGVuIHF1ZSBsYSBwb2JsYWNpw7NuIGxsZWdhIGEgdW4gdW1icmFsIGRlIGV4dGluY2nDs24NCnRfYWxjYW56YSA8LSBmdW5jdGlvbihOLCBwKSB7DQogIHdpdGgoYXMubGlzdChwKSwgbG9nKE4gKiAoSyAtIHkwKSAvICh5MCAqIChLIC0gTikpKSAvIG11bWF4KQ0KfQ0KdF9hbGNhbnphKDEsIHApICAgICAjIHF1ZWRhIDEgaW5kaXZpZHVvDQp0X2FsY2FuemEoMC4xLCBwKSAgICMgbWVub3MgZGUgMSBpbmRpdmlkdW8gKGV4dGluY2nDs24gcHLDoWN0aWNhKQ0KDQoNCmBgYA0KDQoNCiMjIFJlc3B1ZXN0YQ0KDQpTZWfDum4gZWwgbW9kZWxvLCBlbiBlbCBhw7FvIDIwIHF1ZWRhcsOtYW4gYXByb3hpbWFkYW1lbnRlIFt2YWxvcl0gaW5kaXZpZHVvcywgZW4gZWwgYcOxbyA0MCBbdmFsb3JdIHkgZW4gZWwgYcOxbyA1MCBbdmFsb3JdLg0K