Se presenta un análisis preliminar de correlación de la Pérdida Indeterminada Porcentual (%) de PSA para la Zafra 2023-2024.

Nota: No es un análisis de causalidad. Este se proveerá al discutir los resultados con expertos del proceso.

Librerías

library(dplyr)
library(magrittr)
library(mlbench)
library(caret)
library(ggplot2)
library(plotly)
library(hrbrthemes)
library(lares)

Dataset de Pérdidas Indeterminadas

El conjunto de datos analizados contiene 229 variables del Sistema de Control (Procesos de Fabricación) y Laboratorio Industrial. La variable objetivo es la Pérdida Indeterminada Porcentual (%), que es la proporción de pérdida que corresponde a la Pérdida Indeterminada (kg/t) respecto al Total de Pérdidas (kg/t) desde el Core Sampler.

dataset_indeterminadas <- read.csv(file = 'c:/users/100346/OneDrive - Pantaleon. S.A/Desktop/DataScience/Perdidas Indeterminadas/Perdidas Indeterminadas 2024.csv')
dataset_indeterminadas

El dataset incluye 24 días de operación.

Función de Densidad: Pérdidas Indeterminadas (%)

distr(df,Pérdidas.indeterminadas)

La mayor cantidad de días muestran una pérdida entre el 5% y el 9%, sin embargo existen días con pérdidas bastante elevadas, hasta un 13%.

distr(df,Dia.Zafra,Pérdidas.indeterminadas)

La mayor parte de las pérdidas indeterminadas altas ocurren en la primera semana de zafra.

Análisis de Correlación

Se comparan todas las variables con la variable objetivo de Pérdida Indeterminada, y para cada una, se determina su correlación, a un nivel de confianza del 95% (significancia 5%, p<= 0.05).

Entre ellas, se seleccionan las variables que muestran correlación moderada a correlación fuerte (valores mayores a 0.5)

df <- dataset_indeterminadas[-c(40,76,78)]

corr_var(df, # nombre del dataframe
  Pérdidas.indeterminadas, # variable objetivo
  max_pvalue = 0.05, # nivel de significancia para la región de rechazo en las pruebas de hipótesis
  top = 30, # despliegue de las 30 variables más correlacionadas con la variable objetivo
  plot = T
)
New names:

Gráficos de Dispersión Variables Correlacionadas

Temperatura Masa Tacho Continuo 1A

ggplot(df, aes(x=Temperatura.masa.1A...F..TT595504, y=Pérdidas.indeterminadas)) + 
    geom_point(
        color="orange",
        fill="#69b3a2",
        shape=21,
        alpha=0.5,
        size=6,
        stroke = 2
        ) +
    geom_smooth(method=lm , color="blue", fill="#69b3a2", se=TRUE) +
 ggtitle("Pérdida Indeterminada vrs. Temperatura Masa 1A") +
  xlab("Temperatura Masa 1A (°F)") + ylab("Pérdida Indeterminada (%)")

Nivel Vaso A4

ggplot(df, aes(x=Nivel.Vaso.A4.....LT58A404, y=Pérdidas.indeterminadas)) + 
    geom_point(
        color="orange",
        fill="#69b3a2",
        shape=21,
        alpha=0.5,
        size=6,
        stroke = 2
        ) +
    geom_smooth(method=lm , color="blue", fill="#69b3a2", se=TRUE) +
 ggtitle("Perdida Indeterminada vrs. Nivel Vaso A4") +
  xlab("Nivel Vaso A4 (%)") + ylab("Pérdida Indeterminada (%)")

Caña Quemada

ggplot(df, aes(x=Total.de.caña.quemada..t..4737, y=Pérdidas.indeterminadas)) + 
    geom_point(
        color="orange",
        fill="#69b3a2",
        shape=21,
        alpha=0.5,
        size=6,
        stroke = 2
        ) +
    geom_smooth(method=lm , color="blue", fill="#69b3a2", se=TRUE) +
 ggtitle("Perdida Indeterminada vrs. Caña Quemada") +
  xlab("Caña Quemada (t)") + ylab("Pérdida Indeterminada (%)")

Transmitancia Jugo Claro

ggplot(df, aes(x=Transmitancia.Jugo.Claro, y=Pérdidas.indeterminadas)) + 
    geom_point(
        color="orange",
        fill="#69b3a2",
        shape=21,
        alpha=0.5,
        size=6,
        stroke = 2
        ) +
    geom_smooth(method=lm , color="blue", fill="#69b3a2", se=TRUE) +
 ggtitle("Perdida Indeterminada vrs. Transmitancia Jugo Claro") +
  xlab("Transmitancia Jugo Claro (%)") + ylab("Pérdida Indeterminada (%)")

Dia de Zafra

ggplot(df, aes(x=Dia.Zafra, y=Pérdidas.indeterminadas)) + 
    geom_point(
        color="orange",
        fill="#69b3a2",
        shape=21,
        alpha=0.5,
        size=6,
        stroke = 2
        ) +
    geom_smooth(method=lm , color="blue", fill="#69b3a2", se=TRUE) +
 ggtitle("Perdida Indeterminada vrs. Dia de Zafra") +
  xlab("Dia de Zafra") + ylab("Pérdida Indeterminada (%)")

Nivel Vaso D4

ggplot(df, aes(x=Nivel.Vaso.D4.....LT584704, y=Pérdidas.indeterminadas)) + 
    geom_point(
        color="orange",
        fill="#69b3a2",
        shape=21,
        alpha=0.5,
        size=6,
        stroke = 2
        ) +
    geom_smooth(method=lm , color="blue", fill="#69b3a2", se=TRUE) +
 ggtitle("Perdida Indeterminada vrs. Nivel Vaso D4") +
  xlab("Nivel Vaso D4 (%)") + ylab("Pérdida Indeterminada (%)")

Retención de Masa C (%)

ggplot(df, aes(x=Retención.Masa.C, y=Pérdidas.indeterminadas)) + 
    geom_point(
        color="orange",
        fill="#69b3a2",
        shape=21,
        alpha=0.5,
        size=6,
        stroke = 2
        ) +
    geom_smooth(method=lm , color="blue", fill="#69b3a2", se=TRUE) +
 ggtitle("Perdida Indeterminada vrs. Retención Masa C") +
  xlab("Retención Masa C (%)") + ylab("Pérdida Indeterminada (%)")

Flujo Wash 1A (gpm)

ggplot(df, aes(x=Flujo.Wash.1A..gpm..FT594704, y=Pérdidas.indeterminadas)) + 
    geom_point(
        color="orange",
        fill="#69b3a2",
        shape=21,
        alpha=0.5,
        size=6,
        stroke = 2
        ) +
    geom_smooth(method=lm , color="blue", fill="#69b3a2", se=TRUE) +
 ggtitle("Perdida Indeterminada vrs. Flujo Wash 1A") +
  xlab("Flujo Wash 1A (gpm)") + ylab("Pérdida Indeterminada (%)")

Trash Total (%)

ggplot(df, aes(x=Trash.Total, y=Pérdidas.indeterminadas)) + 
    geom_point(
        color="orange",
        fill="#69b3a2",
        shape=21,
        alpha=0.5,
        size=6,
        stroke = 2
        ) +
    geom_smooth(method=lm , color="blue", fill="#69b3a2", se=TRUE) +
 ggtitle("Perdida Indeterminada vrs. Trash Total") +
  xlab("Trash Total (%)") + ylab("Pérdida Indeterminada (%)")

Vacio Tacho 13 Semilla (%)

ggplot(df, aes(x=Vacio.tacho.13.semilla.tacho.continuo..PSIA..PT594102, y=Pérdidas.indeterminadas)) + 
    geom_point(
        color="orange",
        fill="#69b3a2",
        shape=21,
        alpha=0.5,
        size=6,
        stroke = 2
        ) +
    geom_smooth(method=lm , color="blue", fill="#69b3a2", se=TRUE) +
 ggtitle("Perdida Indeterminada vrs. Vacío Tacho 13") +
  xlab("Vacío Tacho 13 (psia)") + ylab("Pérdida Indeterminada (%)")

Trash Caña Mecanizada

ggplot(df, aes(x=Trash.de.caña.mecanizada..Kg..6054, y=Pérdidas.indeterminadas)) + 
    geom_point(
        color="orange",
        fill="#69b3a2",
        shape=21,
        alpha=0.5,
        size=6,
        stroke = 2
        ) +
    geom_smooth(method=lm , color="blue", fill="#69b3a2", se=TRUE) +
 ggtitle("Perdida Indeterminada vrs. Trash Caña Mecanizada") +
  xlab("Trash Caña Mecanizada (%)") + ylab("Pérdida Indeterminada (%)")

Carrera Tacho Continuo 2A

ggplot(df, aes(x=Flujo.meladura.tacho.continuo.2A...gal.min..FT59650Ta, y=Pérdidas.indeterminadas)) + 
    geom_point(
        color="orange",
        fill="#69b3a2",
        shape=21,
        alpha=0.5,
        size=6,
        stroke = 2
        ) +
    geom_smooth(method=lm , color="blue", fill="#69b3a2", se=TRUE) +
 ggtitle("Perdida Indeterminada vrs. Carrera Tacho Continuo") +
  xlab("Flujo Tacho Continuo 2A (gpm)") + ylab("Pérdida Indeterminada (%)")

Caña Quemada antes de 36 horas

ggplot(df, aes(x=Caña.quemada.antes.de.36.h..t..4738, y=Pérdidas.indeterminadas)) + 
    geom_point(
        color="orange",
        fill="#69b3a2",
        shape=21,
        alpha=0.5,
        size=6,
        stroke = 2
        ) +
    geom_smooth(method=lm , color="blue", fill="#69b3a2", se=TRUE) +
 ggtitle("Perdida Indeterminada vrs. Caña Quemada < 36 horas") +
  xlab("Caña Quemada < 36 horas (t)") + ylab("Pérdida Indeterminada (%)")

Floculante a Meladura

ggplot(df, aes(x=Floculante.meladura...Kg..4796, y=Pérdidas.indeterminadas)) + 
    geom_point(
        color="orange",
        fill="#69b3a2",
        shape=21,
        alpha=0.5,
        size=6,
        stroke = 2
        ) +
    geom_smooth(method=lm , color="blue", fill="#69b3a2", se=TRUE) +
 ggtitle("Perdida Indeterminada vrs. Caña Quemada < 36 horas") +
  xlab("Caña Quemada < 36 horas (t)") + ylab("Pérdida Indeterminada (%)")

Hojas Maleza Trash

ggplot(df, aes(x=Hojas.maleza.trash, y=Pérdidas.indeterminadas)) + 
    geom_point(
        color="orange",
        fill="#69b3a2",
        shape=21,
        alpha=0.5,
        size=6,
        stroke = 2
        ) +
    geom_smooth(method=lm , color="blue", fill="#69b3a2", se=TRUE) +
 ggtitle("Perdida Indeterminada vrs. Hojas Maleza Trash") +
  xlab("Hojas Maleza Trash (%)") + ylab("Pérdida Indeterminada (%)")

Nivel Promedio Efecto C

ggplot(df, aes(x=Nivel.promedio.efecto.C.....LT_MediaQuintuplesC, y=Pérdidas.indeterminadas)) + 
    geom_point(
        color="orange",
        fill="#69b3a2",
        shape=21,
        alpha=0.5,
        size=6,
        stroke = 2
        ) +
    geom_smooth(method=lm , color="blue", fill="#69b3a2", se=TRUE) +
 ggtitle("Perdida Indeterminada vrs. Nivel Medio Efecto C") +
  xlab("Nivel Medio Efecto C (%)") + ylab("Pérdida Indeterminada (%)")

Caña Molida Diaria

ggplot(df, aes(x=Caña.molida.dia..t..1, y=Pérdidas.indeterminadas)) + 
    geom_point(
        color="orange",
        fill="#69b3a2",
        shape=21,
        alpha=0.5,
        size=6,
        stroke = 2
        ) +
    geom_smooth(method=lm , color="blue", fill="#69b3a2", se=TRUE) +
 ggtitle("Perdida Indeterminada vrs. Caña Molida por Día") +
  xlab("Caña Molida por Día (t)") + ylab("Pérdida Indeterminada (%)")

Pureza Miel Final

ggplot(df, aes(x=Pureza.Miel.final, y=Pérdidas.indeterminadas)) + 
    geom_point(
        color="orange",
        fill="#69b3a2",
        shape=21,
        alpha=0.5,
        size=6,
        stroke = 2
        ) +
    geom_smooth(method=lm , color="blue", fill="#69b3a2", se=TRUE) +
 ggtitle("Perdida Indeterminada vrs. Pureza Miel Final") +
  xlab("Pureza Miel Final (%)") + ylab("Pérdida Indeterminada (%)")

LS0tDQp0aXRsZTogIkFuw6FsaXNpcyBQw6lyZGlkYXMgSW5kZXRlcm1pbmFkYXMgUFNBIDIwMjQiDQpvdXRwdXQ6DQogIGh0bWxfZG9jdW1lbnQ6DQogICAgZGZfcHJpbnQ6IHBhZ2VkDQotLS0NCg0KU2UgcHJlc2VudGEgdW4gYW7DoWxpc2lzIHByZWxpbWluYXIgZGUgY29ycmVsYWNpw7NuIGRlIGxhIFDDqXJkaWRhIEluZGV0ZXJtaW5hZGEgUG9yY2VudHVhbCAoJSkgZGUgUFNBIHBhcmEgbGEgKipaYWZyYSAyMDIzLTIwMjQqKi4NCg0KKk5vdGE6IE5vIGVzIHVuIGFuw6FsaXNpcyBkZSBjYXVzYWxpZGFkLiBFc3RlIHNlIHByb3ZlZXLDoSBhbCBkaXNjdXRpciBsb3MgcmVzdWx0YWRvcyBjb24gZXhwZXJ0b3MgZGVsIHByb2Nlc28uKg0KDQpMaWJyZXLDrWFzDQpgYGB7cn0NCmxpYnJhcnkoZHBseXIpDQpsaWJyYXJ5KG1hZ3JpdHRyKQ0KbGlicmFyeShtbGJlbmNoKQ0KbGlicmFyeShjYXJldCkNCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkocGxvdGx5KQ0KbGlicmFyeShocmJydGhlbWVzKQ0KbGlicmFyeShsYXJlcykNCmBgYA0KDQoNCg0KIyMjIERhdGFzZXQgZGUgUMOpcmRpZGFzIEluZGV0ZXJtaW5hZGFzDQoNCkVsIGNvbmp1bnRvIGRlIGRhdG9zIGFuYWxpemFkb3MgY29udGllbmUgKioqMjI5IHZhcmlhYmxlcyoqKiBkZWwgU2lzdGVtYSBkZSBDb250cm9sIChQcm9jZXNvcyBkZSBGYWJyaWNhY2nDs24pIHkgTGFib3JhdG9yaW8gSW5kdXN0cmlhbC4NCkxhIHZhcmlhYmxlIG9iamV0aXZvIGVzIGxhIFDDqXJkaWRhIEluZGV0ZXJtaW5hZGEgUG9yY2VudHVhbCAoJSksIHF1ZSBlcyAqbGEgcHJvcG9yY2nDs24gZGUgcMOpcmRpZGEgcXVlIGNvcnJlc3BvbmRlIGEgbGEgUMOpcmRpZGEgSW5kZXRlcm1pbmFkYSAoa2cvdCkgcmVzcGVjdG8gYWwgVG90YWwgZGUgUMOpcmRpZGFzIChrZy90KSBkZXNkZSBlbCBDb3JlIFNhbXBsZXIqLg0KYGBge3J9DQpkYXRhc2V0X2luZGV0ZXJtaW5hZGFzIDwtIHJlYWQuY3N2KGZpbGUgPSAnYzovdXNlcnMvMTAwMzQ2L09uZURyaXZlIC0gUGFudGFsZW9uLiBTLkEvRGVza3RvcC9EYXRhU2NpZW5jZS9QZXJkaWRhcyBJbmRldGVybWluYWRhcy9QZXJkaWRhcyBJbmRldGVybWluYWRhcyAyMDI0LmNzdicpDQpkYXRhc2V0X2luZGV0ZXJtaW5hZGFzDQpgYGANCkVsIGRhdGFzZXQgaW5jbHV5ZSAqKjI0IGTDrWFzIGRlIG9wZXJhY2nDs24qKi4NCg0KDQojIyMgRnVuY2nDs24gZGUgRGVuc2lkYWQ6IFDDqXJkaWRhcyBJbmRldGVybWluYWRhcyAoJSkNCmBgYHtyfQ0KZGlzdHIoZGYsUMOpcmRpZGFzLmluZGV0ZXJtaW5hZGFzKQ0KYGBgDQpMYSBtYXlvciBjYW50aWRhZCBkZSBkw61hcyBtdWVzdHJhbiB1bmEgcMOpcmRpZGEgZW50cmUgZWwgNSUgeSBlbCA5JSwgc2luIGVtYmFyZ28gZXhpc3RlbiBkw61hcyBjb24gcMOpcmRpZGFzIGJhc3RhbnRlIGVsZXZhZGFzLCBoYXN0YSB1biAxMyUuDQoNCmBgYHtyfQ0KZGlzdHIoZGYsRGlhLlphZnJhLFDDqXJkaWRhcy5pbmRldGVybWluYWRhcykNCmBgYA0KKioqTGEgbWF5b3IgcGFydGUgZGUgbGFzIHDDqXJkaWRhcyBpbmRldGVybWluYWRhcyBhbHRhcyBvY3VycmVuIGVuIGxhIHByaW1lcmEgc2VtYW5hIGRlIHphZnJhLioqKg0KDQojIyMgQW7DoWxpc2lzIGRlIENvcnJlbGFjacOzbg0KU2UgY29tcGFyYW4gdG9kYXMgbGFzIHZhcmlhYmxlcyBjb24gbGEgdmFyaWFibGUgb2JqZXRpdm8gZGUgUMOpcmRpZGEgSW5kZXRlcm1pbmFkYSwgeSBwYXJhIGNhZGEgdW5hLCBzZSBkZXRlcm1pbmEgc3UgY29ycmVsYWNpw7NuLCBhIHVuIG5pdmVsIGRlIGNvbmZpYW56YSBkZWwgOTUlIChzaWduaWZpY2FuY2lhIDUlLCBwPD0gMC4wNSkuDQoNCkVudHJlIGVsbGFzLCBzZSBzZWxlY2Npb25hbiBsYXMgdmFyaWFibGVzIHF1ZSBtdWVzdHJhbiAqKmNvcnJlbGFjacOzbiBtb2RlcmFkYSBhIGNvcnJlbGFjacOzbiBmdWVydGUqKiAodmFsb3JlcyBtYXlvcmVzIGEgMC41KQ0KDQpgYGB7cn0NCmRmIDwtIGRhdGFzZXRfaW5kZXRlcm1pbmFkYXNbLWMoNDAsNzYsNzgpXQ0KDQpjb3JyX3ZhcihkZiwgIyBub21icmUgZGVsIGRhdGFmcmFtZQ0KICBQw6lyZGlkYXMuaW5kZXRlcm1pbmFkYXMsICMgdmFyaWFibGUgb2JqZXRpdm8NCiAgbWF4X3B2YWx1ZSA9IDAuMDUsICMgbml2ZWwgZGUgc2lnbmlmaWNhbmNpYSBwYXJhIGxhIHJlZ2nDs24gZGUgcmVjaGF6byBlbiBsYXMgcHJ1ZWJhcyBkZSBoaXDDs3Rlc2lzDQogIHRvcCA9IDMwLCAjIGRlc3BsaWVndWUgZGUgbGFzIDMwIHZhcmlhYmxlcyBtw6FzIGNvcnJlbGFjaW9uYWRhcyBjb24gbGEgdmFyaWFibGUgb2JqZXRpdm8NCiAgcGxvdCA9IFQNCikNCg0KYGBgDQoNCiMjIyBHcsOhZmljb3MgZGUgRGlzcGVyc2nDs24gVmFyaWFibGVzIENvcnJlbGFjaW9uYWRhcw0KDQoqKlRlbXBlcmF0dXJhIE1hc2EgVGFjaG8gQ29udGludW8gMUEqKg0KYGBge3J9DQpnZ3Bsb3QoZGYsIGFlcyh4PVRlbXBlcmF0dXJhLm1hc2EuMUEuLi5GLi5UVDU5NTUwNCwgeT1Qw6lyZGlkYXMuaW5kZXRlcm1pbmFkYXMpKSArIA0KICAgIGdlb21fcG9pbnQoDQogICAgICAgIGNvbG9yPSJvcmFuZ2UiLA0KICAgICAgICBmaWxsPSIjNjliM2EyIiwNCiAgICAgICAgc2hhcGU9MjEsDQogICAgICAgIGFscGhhPTAuNSwNCiAgICAgICAgc2l6ZT02LA0KICAgICAgICBzdHJva2UgPSAyDQogICAgICAgICkgKw0KICAgIGdlb21fc21vb3RoKG1ldGhvZD1sbSAsIGNvbG9yPSJibHVlIiwgZmlsbD0iIzY5YjNhMiIsIHNlPVRSVUUpICsNCiBnZ3RpdGxlKCJQw6lyZGlkYSBJbmRldGVybWluYWRhIHZycy4gVGVtcGVyYXR1cmEgTWFzYSAxQSIpICsNCiAgeGxhYigiVGVtcGVyYXR1cmEgTWFzYSAxQSAowrBGKSIpICsgeWxhYigiUMOpcmRpZGEgSW5kZXRlcm1pbmFkYSAoJSkiKQ0KYGBgDQoqKk5pdmVsIFZhc28gQTQqKg0KYGBge3J9DQpnZ3Bsb3QoZGYsIGFlcyh4PU5pdmVsLlZhc28uQTQuLi4uLkxUNThBNDA0LCB5PVDDqXJkaWRhcy5pbmRldGVybWluYWRhcykpICsgDQogICAgZ2VvbV9wb2ludCgNCiAgICAgICAgY29sb3I9Im9yYW5nZSIsDQogICAgICAgIGZpbGw9IiM2OWIzYTIiLA0KICAgICAgICBzaGFwZT0yMSwNCiAgICAgICAgYWxwaGE9MC41LA0KICAgICAgICBzaXplPTYsDQogICAgICAgIHN0cm9rZSA9IDINCiAgICAgICAgKSArDQogICAgZ2VvbV9zbW9vdGgobWV0aG9kPWxtICwgY29sb3I9ImJsdWUiLCBmaWxsPSIjNjliM2EyIiwgc2U9VFJVRSkgKw0KIGdndGl0bGUoIlBlcmRpZGEgSW5kZXRlcm1pbmFkYSB2cnMuIE5pdmVsIFZhc28gQTQiKSArDQogIHhsYWIoIk5pdmVsIFZhc28gQTQgKCUpIikgKyB5bGFiKCJQw6lyZGlkYSBJbmRldGVybWluYWRhICglKSIpDQpgYGANCioqQ2HDsWEgUXVlbWFkYSoqDQpgYGB7cn0NCmdncGxvdChkZiwgYWVzKHg9VG90YWwuZGUuY2HDsWEucXVlbWFkYS4udC4uNDczNywgeT1Qw6lyZGlkYXMuaW5kZXRlcm1pbmFkYXMpKSArIA0KICAgIGdlb21fcG9pbnQoDQogICAgICAgIGNvbG9yPSJvcmFuZ2UiLA0KICAgICAgICBmaWxsPSIjNjliM2EyIiwNCiAgICAgICAgc2hhcGU9MjEsDQogICAgICAgIGFscGhhPTAuNSwNCiAgICAgICAgc2l6ZT02LA0KICAgICAgICBzdHJva2UgPSAyDQogICAgICAgICkgKw0KICAgIGdlb21fc21vb3RoKG1ldGhvZD1sbSAsIGNvbG9yPSJibHVlIiwgZmlsbD0iIzY5YjNhMiIsIHNlPVRSVUUpICsNCiBnZ3RpdGxlKCJQZXJkaWRhIEluZGV0ZXJtaW5hZGEgdnJzLiBDYcOxYSBRdWVtYWRhIikgKw0KICB4bGFiKCJDYcOxYSBRdWVtYWRhICh0KSIpICsgeWxhYigiUMOpcmRpZGEgSW5kZXRlcm1pbmFkYSAoJSkiKQ0KYGBgDQoNCioqVHJhbnNtaXRhbmNpYSBKdWdvIENsYXJvKioNCmBgYHtyfQ0KZ2dwbG90KGRmLCBhZXMoeD1UcmFuc21pdGFuY2lhLkp1Z28uQ2xhcm8sIHk9UMOpcmRpZGFzLmluZGV0ZXJtaW5hZGFzKSkgKyANCiAgICBnZW9tX3BvaW50KA0KICAgICAgICBjb2xvcj0ib3JhbmdlIiwNCiAgICAgICAgZmlsbD0iIzY5YjNhMiIsDQogICAgICAgIHNoYXBlPTIxLA0KICAgICAgICBhbHBoYT0wLjUsDQogICAgICAgIHNpemU9NiwNCiAgICAgICAgc3Ryb2tlID0gMg0KICAgICAgICApICsNCiAgICBnZW9tX3Ntb290aChtZXRob2Q9bG0gLCBjb2xvcj0iYmx1ZSIsIGZpbGw9IiM2OWIzYTIiLCBzZT1UUlVFKSArDQogZ2d0aXRsZSgiUGVyZGlkYSBJbmRldGVybWluYWRhIHZycy4gVHJhbnNtaXRhbmNpYSBKdWdvIENsYXJvIikgKw0KICB4bGFiKCJUcmFuc21pdGFuY2lhIEp1Z28gQ2xhcm8gKCUpIikgKyB5bGFiKCJQw6lyZGlkYSBJbmRldGVybWluYWRhICglKSIpDQpgYGANCg0KDQoNCioqRGlhIGRlIFphZnJhKioNCmBgYHtyfQ0KZ2dwbG90KGRmLCBhZXMoeD1EaWEuWmFmcmEsIHk9UMOpcmRpZGFzLmluZGV0ZXJtaW5hZGFzKSkgKyANCiAgICBnZW9tX3BvaW50KA0KICAgICAgICBjb2xvcj0ib3JhbmdlIiwNCiAgICAgICAgZmlsbD0iIzY5YjNhMiIsDQogICAgICAgIHNoYXBlPTIxLA0KICAgICAgICBhbHBoYT0wLjUsDQogICAgICAgIHNpemU9NiwNCiAgICAgICAgc3Ryb2tlID0gMg0KICAgICAgICApICsNCiAgICBnZW9tX3Ntb290aChtZXRob2Q9bG0gLCBjb2xvcj0iYmx1ZSIsIGZpbGw9IiM2OWIzYTIiLCBzZT1UUlVFKSArDQogZ2d0aXRsZSgiUGVyZGlkYSBJbmRldGVybWluYWRhIHZycy4gRGlhIGRlIFphZnJhIikgKw0KICB4bGFiKCJEaWEgZGUgWmFmcmEiKSArIHlsYWIoIlDDqXJkaWRhIEluZGV0ZXJtaW5hZGEgKCUpIikNCmBgYA0KDQoqKk5pdmVsIFZhc28gRDQqKg0KYGBge3J9DQpnZ3Bsb3QoZGYsIGFlcyh4PU5pdmVsLlZhc28uRDQuLi4uLkxUNTg0NzA0LCB5PVDDqXJkaWRhcy5pbmRldGVybWluYWRhcykpICsgDQogICAgZ2VvbV9wb2ludCgNCiAgICAgICAgY29sb3I9Im9yYW5nZSIsDQogICAgICAgIGZpbGw9IiM2OWIzYTIiLA0KICAgICAgICBzaGFwZT0yMSwNCiAgICAgICAgYWxwaGE9MC41LA0KICAgICAgICBzaXplPTYsDQogICAgICAgIHN0cm9rZSA9IDINCiAgICAgICAgKSArDQogICAgZ2VvbV9zbW9vdGgobWV0aG9kPWxtICwgY29sb3I9ImJsdWUiLCBmaWxsPSIjNjliM2EyIiwgc2U9VFJVRSkgKw0KIGdndGl0bGUoIlBlcmRpZGEgSW5kZXRlcm1pbmFkYSB2cnMuIE5pdmVsIFZhc28gRDQiKSArDQogIHhsYWIoIk5pdmVsIFZhc28gRDQgKCUpIikgKyB5bGFiKCJQw6lyZGlkYSBJbmRldGVybWluYWRhICglKSIpDQpgYGANCg0KDQoNCioqUmV0ZW5jacOzbiBkZSBNYXNhIEMgKCUpKioNCmBgYHtyfQ0KZ2dwbG90KGRmLCBhZXMoeD1SZXRlbmNpw7NuLk1hc2EuQywgeT1Qw6lyZGlkYXMuaW5kZXRlcm1pbmFkYXMpKSArIA0KICAgIGdlb21fcG9pbnQoDQogICAgICAgIGNvbG9yPSJvcmFuZ2UiLA0KICAgICAgICBmaWxsPSIjNjliM2EyIiwNCiAgICAgICAgc2hhcGU9MjEsDQogICAgICAgIGFscGhhPTAuNSwNCiAgICAgICAgc2l6ZT02LA0KICAgICAgICBzdHJva2UgPSAyDQogICAgICAgICkgKw0KICAgIGdlb21fc21vb3RoKG1ldGhvZD1sbSAsIGNvbG9yPSJibHVlIiwgZmlsbD0iIzY5YjNhMiIsIHNlPVRSVUUpICsNCiBnZ3RpdGxlKCJQZXJkaWRhIEluZGV0ZXJtaW5hZGEgdnJzLiBSZXRlbmNpw7NuIE1hc2EgQyIpICsNCiAgeGxhYigiUmV0ZW5jacOzbiBNYXNhIEMgKCUpIikgKyB5bGFiKCJQw6lyZGlkYSBJbmRldGVybWluYWRhICglKSIpDQpgYGANCg0KKipGbHVqbyBXYXNoIDFBIChncG0pKioNCmBgYHtyfQ0KZ2dwbG90KGRmLCBhZXMoeD1GbHVqby5XYXNoLjFBLi5ncG0uLkZUNTk0NzA0LCB5PVDDqXJkaWRhcy5pbmRldGVybWluYWRhcykpICsgDQogICAgZ2VvbV9wb2ludCgNCiAgICAgICAgY29sb3I9Im9yYW5nZSIsDQogICAgICAgIGZpbGw9IiM2OWIzYTIiLA0KICAgICAgICBzaGFwZT0yMSwNCiAgICAgICAgYWxwaGE9MC41LA0KICAgICAgICBzaXplPTYsDQogICAgICAgIHN0cm9rZSA9IDINCiAgICAgICAgKSArDQogICAgZ2VvbV9zbW9vdGgobWV0aG9kPWxtICwgY29sb3I9ImJsdWUiLCBmaWxsPSIjNjliM2EyIiwgc2U9VFJVRSkgKw0KIGdndGl0bGUoIlBlcmRpZGEgSW5kZXRlcm1pbmFkYSB2cnMuIEZsdWpvIFdhc2ggMUEiKSArDQogIHhsYWIoIkZsdWpvIFdhc2ggMUEgKGdwbSkiKSArIHlsYWIoIlDDqXJkaWRhIEluZGV0ZXJtaW5hZGEgKCUpIikNCmBgYA0KDQoNCioqVHJhc2ggVG90YWwgKCUpKioNCmBgYHtyfQ0KZ2dwbG90KGRmLCBhZXMoeD1UcmFzaC5Ub3RhbCwgeT1Qw6lyZGlkYXMuaW5kZXRlcm1pbmFkYXMpKSArIA0KICAgIGdlb21fcG9pbnQoDQogICAgICAgIGNvbG9yPSJvcmFuZ2UiLA0KICAgICAgICBmaWxsPSIjNjliM2EyIiwNCiAgICAgICAgc2hhcGU9MjEsDQogICAgICAgIGFscGhhPTAuNSwNCiAgICAgICAgc2l6ZT02LA0KICAgICAgICBzdHJva2UgPSAyDQogICAgICAgICkgKw0KICAgIGdlb21fc21vb3RoKG1ldGhvZD1sbSAsIGNvbG9yPSJibHVlIiwgZmlsbD0iIzY5YjNhMiIsIHNlPVRSVUUpICsNCiBnZ3RpdGxlKCJQZXJkaWRhIEluZGV0ZXJtaW5hZGEgdnJzLiBUcmFzaCBUb3RhbCIpICsNCiAgeGxhYigiVHJhc2ggVG90YWwgKCUpIikgKyB5bGFiKCJQw6lyZGlkYSBJbmRldGVybWluYWRhICglKSIpDQpgYGANCioqVmFjaW8gVGFjaG8gMTMgU2VtaWxsYSAoJSkqKg0KYGBge3J9DQpnZ3Bsb3QoZGYsIGFlcyh4PVZhY2lvLnRhY2hvLjEzLnNlbWlsbGEudGFjaG8uY29udGludW8uLlBTSUEuLlBUNTk0MTAyLCB5PVDDqXJkaWRhcy5pbmRldGVybWluYWRhcykpICsgDQogICAgZ2VvbV9wb2ludCgNCiAgICAgICAgY29sb3I9Im9yYW5nZSIsDQogICAgICAgIGZpbGw9IiM2OWIzYTIiLA0KICAgICAgICBzaGFwZT0yMSwNCiAgICAgICAgYWxwaGE9MC41LA0KICAgICAgICBzaXplPTYsDQogICAgICAgIHN0cm9rZSA9IDINCiAgICAgICAgKSArDQogICAgZ2VvbV9zbW9vdGgobWV0aG9kPWxtICwgY29sb3I9ImJsdWUiLCBmaWxsPSIjNjliM2EyIiwgc2U9VFJVRSkgKw0KIGdndGl0bGUoIlBlcmRpZGEgSW5kZXRlcm1pbmFkYSB2cnMuIFZhY8OtbyBUYWNobyAxMyIpICsNCiAgeGxhYigiVmFjw61vIFRhY2hvIDEzIChwc2lhKSIpICsgeWxhYigiUMOpcmRpZGEgSW5kZXRlcm1pbmFkYSAoJSkiKQ0KYGBgDQoNCioqVHJhc2ggQ2HDsWEgTWVjYW5pemFkYSoqDQpgYGB7cn0NCmdncGxvdChkZiwgYWVzKHg9VHJhc2guZGUuY2HDsWEubWVjYW5pemFkYS4uS2cuLjYwNTQsIHk9UMOpcmRpZGFzLmluZGV0ZXJtaW5hZGFzKSkgKyANCiAgICBnZW9tX3BvaW50KA0KICAgICAgICBjb2xvcj0ib3JhbmdlIiwNCiAgICAgICAgZmlsbD0iIzY5YjNhMiIsDQogICAgICAgIHNoYXBlPTIxLA0KICAgICAgICBhbHBoYT0wLjUsDQogICAgICAgIHNpemU9NiwNCiAgICAgICAgc3Ryb2tlID0gMg0KICAgICAgICApICsNCiAgICBnZW9tX3Ntb290aChtZXRob2Q9bG0gLCBjb2xvcj0iYmx1ZSIsIGZpbGw9IiM2OWIzYTIiLCBzZT1UUlVFKSArDQogZ2d0aXRsZSgiUGVyZGlkYSBJbmRldGVybWluYWRhIHZycy4gVHJhc2ggQ2HDsWEgTWVjYW5pemFkYSIpICsNCiAgeGxhYigiVHJhc2ggQ2HDsWEgTWVjYW5pemFkYSAoJSkiKSArIHlsYWIoIlDDqXJkaWRhIEluZGV0ZXJtaW5hZGEgKCUpIikNCmBgYA0KKipDYXJyZXJhIFRhY2hvIENvbnRpbnVvIDJBKioNCmBgYHtyfQ0KZ2dwbG90KGRmLCBhZXMoeD1GbHVqby5tZWxhZHVyYS50YWNoby5jb250aW51by4yQS4uLmdhbC5taW4uLkZUNTk2NTBUYSwgeT1Qw6lyZGlkYXMuaW5kZXRlcm1pbmFkYXMpKSArIA0KICAgIGdlb21fcG9pbnQoDQogICAgICAgIGNvbG9yPSJvcmFuZ2UiLA0KICAgICAgICBmaWxsPSIjNjliM2EyIiwNCiAgICAgICAgc2hhcGU9MjEsDQogICAgICAgIGFscGhhPTAuNSwNCiAgICAgICAgc2l6ZT02LA0KICAgICAgICBzdHJva2UgPSAyDQogICAgICAgICkgKw0KICAgIGdlb21fc21vb3RoKG1ldGhvZD1sbSAsIGNvbG9yPSJibHVlIiwgZmlsbD0iIzY5YjNhMiIsIHNlPVRSVUUpICsNCiBnZ3RpdGxlKCJQZXJkaWRhIEluZGV0ZXJtaW5hZGEgdnJzLiBDYXJyZXJhIFRhY2hvIENvbnRpbnVvIikgKw0KICB4bGFiKCJGbHVqbyBUYWNobyBDb250aW51byAyQSAoZ3BtKSIpICsgeWxhYigiUMOpcmRpZGEgSW5kZXRlcm1pbmFkYSAoJSkiKQ0KYGBgDQoqKkNhw7FhIFF1ZW1hZGEgYW50ZXMgZGUgMzYgaG9yYXMqKg0KYGBge3J9DQpnZ3Bsb3QoZGYsIGFlcyh4PUNhw7FhLnF1ZW1hZGEuYW50ZXMuZGUuMzYuaC4udC4uNDczOCwgeT1Qw6lyZGlkYXMuaW5kZXRlcm1pbmFkYXMpKSArIA0KICAgIGdlb21fcG9pbnQoDQogICAgICAgIGNvbG9yPSJvcmFuZ2UiLA0KICAgICAgICBmaWxsPSIjNjliM2EyIiwNCiAgICAgICAgc2hhcGU9MjEsDQogICAgICAgIGFscGhhPTAuNSwNCiAgICAgICAgc2l6ZT02LA0KICAgICAgICBzdHJva2UgPSAyDQogICAgICAgICkgKw0KICAgIGdlb21fc21vb3RoKG1ldGhvZD1sbSAsIGNvbG9yPSJibHVlIiwgZmlsbD0iIzY5YjNhMiIsIHNlPVRSVUUpICsNCiBnZ3RpdGxlKCJQZXJkaWRhIEluZGV0ZXJtaW5hZGEgdnJzLiBDYcOxYSBRdWVtYWRhIDwgMzYgaG9yYXMiKSArDQogIHhsYWIoIkNhw7FhIFF1ZW1hZGEgPCAzNiBob3JhcyAodCkiKSArIHlsYWIoIlDDqXJkaWRhIEluZGV0ZXJtaW5hZGEgKCUpIikNCmBgYA0KKipGbG9jdWxhbnRlIGEgTWVsYWR1cmEqKg0KYGBge3J9DQpnZ3Bsb3QoZGYsIGFlcyh4PUZsb2N1bGFudGUubWVsYWR1cmEuLi5LZy4uNDc5NiwgeT1Qw6lyZGlkYXMuaW5kZXRlcm1pbmFkYXMpKSArIA0KICAgIGdlb21fcG9pbnQoDQogICAgICAgIGNvbG9yPSJvcmFuZ2UiLA0KICAgICAgICBmaWxsPSIjNjliM2EyIiwNCiAgICAgICAgc2hhcGU9MjEsDQogICAgICAgIGFscGhhPTAuNSwNCiAgICAgICAgc2l6ZT02LA0KICAgICAgICBzdHJva2UgPSAyDQogICAgICAgICkgKw0KICAgIGdlb21fc21vb3RoKG1ldGhvZD1sbSAsIGNvbG9yPSJibHVlIiwgZmlsbD0iIzY5YjNhMiIsIHNlPVRSVUUpICsNCiBnZ3RpdGxlKCJQZXJkaWRhIEluZGV0ZXJtaW5hZGEgdnJzLiBDYcOxYSBRdWVtYWRhIDwgMzYgaG9yYXMiKSArDQogIHhsYWIoIkNhw7FhIFF1ZW1hZGEgPCAzNiBob3JhcyAodCkiKSArIHlsYWIoIlDDqXJkaWRhIEluZGV0ZXJtaW5hZGEgKCUpIikNCmBgYA0KDQoqKkhvamFzIE1hbGV6YSBUcmFzaCoqDQpgYGB7cn0NCmdncGxvdChkZiwgYWVzKHg9SG9qYXMubWFsZXphLnRyYXNoLCB5PVDDqXJkaWRhcy5pbmRldGVybWluYWRhcykpICsgDQogICAgZ2VvbV9wb2ludCgNCiAgICAgICAgY29sb3I9Im9yYW5nZSIsDQogICAgICAgIGZpbGw9IiM2OWIzYTIiLA0KICAgICAgICBzaGFwZT0yMSwNCiAgICAgICAgYWxwaGE9MC41LA0KICAgICAgICBzaXplPTYsDQogICAgICAgIHN0cm9rZSA9IDINCiAgICAgICAgKSArDQogICAgZ2VvbV9zbW9vdGgobWV0aG9kPWxtICwgY29sb3I9ImJsdWUiLCBmaWxsPSIjNjliM2EyIiwgc2U9VFJVRSkgKw0KIGdndGl0bGUoIlBlcmRpZGEgSW5kZXRlcm1pbmFkYSB2cnMuIEhvamFzIE1hbGV6YSBUcmFzaCIpICsNCiAgeGxhYigiSG9qYXMgTWFsZXphIFRyYXNoICglKSIpICsgeWxhYigiUMOpcmRpZGEgSW5kZXRlcm1pbmFkYSAoJSkiKQ0KYGBgDQoNCg0KDQoNCioqTml2ZWwgUHJvbWVkaW8gRWZlY3RvIEMqKg0KYGBge3J9DQpnZ3Bsb3QoZGYsIGFlcyh4PU5pdmVsLnByb21lZGlvLmVmZWN0by5DLi4uLi5MVF9NZWRpYVF1aW50dXBsZXNDLCB5PVDDqXJkaWRhcy5pbmRldGVybWluYWRhcykpICsgDQogICAgZ2VvbV9wb2ludCgNCiAgICAgICAgY29sb3I9Im9yYW5nZSIsDQogICAgICAgIGZpbGw9IiM2OWIzYTIiLA0KICAgICAgICBzaGFwZT0yMSwNCiAgICAgICAgYWxwaGE9MC41LA0KICAgICAgICBzaXplPTYsDQogICAgICAgIHN0cm9rZSA9IDINCiAgICAgICAgKSArDQogICAgZ2VvbV9zbW9vdGgobWV0aG9kPWxtICwgY29sb3I9ImJsdWUiLCBmaWxsPSIjNjliM2EyIiwgc2U9VFJVRSkgKw0KIGdndGl0bGUoIlBlcmRpZGEgSW5kZXRlcm1pbmFkYSB2cnMuIE5pdmVsIE1lZGlvIEVmZWN0byBDIikgKw0KICB4bGFiKCJOaXZlbCBNZWRpbyBFZmVjdG8gQyAoJSkiKSArIHlsYWIoIlDDqXJkaWRhIEluZGV0ZXJtaW5hZGEgKCUpIikNCmBgYA0KDQoqKkNhw7FhIE1vbGlkYSBEaWFyaWEqKg0KYGBge3J9DQpnZ3Bsb3QoZGYsIGFlcyh4PUNhw7FhLm1vbGlkYS5kaWEuLnQuLjEsIHk9UMOpcmRpZGFzLmluZGV0ZXJtaW5hZGFzKSkgKyANCiAgICBnZW9tX3BvaW50KA0KICAgICAgICBjb2xvcj0ib3JhbmdlIiwNCiAgICAgICAgZmlsbD0iIzY5YjNhMiIsDQogICAgICAgIHNoYXBlPTIxLA0KICAgICAgICBhbHBoYT0wLjUsDQogICAgICAgIHNpemU9NiwNCiAgICAgICAgc3Ryb2tlID0gMg0KICAgICAgICApICsNCiAgICBnZW9tX3Ntb290aChtZXRob2Q9bG0gLCBjb2xvcj0iYmx1ZSIsIGZpbGw9IiM2OWIzYTIiLCBzZT1UUlVFKSArDQogZ2d0aXRsZSgiUGVyZGlkYSBJbmRldGVybWluYWRhIHZycy4gQ2HDsWEgTW9saWRhIHBvciBEw61hIikgKw0KICB4bGFiKCJDYcOxYSBNb2xpZGEgcG9yIETDrWEgKHQpIikgKyB5bGFiKCJQw6lyZGlkYSBJbmRldGVybWluYWRhICglKSIpDQpgYGANCg0KKipQdXJlemEgTWllbCBGaW5hbCoqDQpgYGB7cn0NCmdncGxvdChkZiwgYWVzKHg9UHVyZXphLk1pZWwuZmluYWwsIHk9UMOpcmRpZGFzLmluZGV0ZXJtaW5hZGFzKSkgKyANCiAgICBnZW9tX3BvaW50KA0KICAgICAgICBjb2xvcj0ib3JhbmdlIiwNCiAgICAgICAgZmlsbD0iIzY5YjNhMiIsDQogICAgICAgIHNoYXBlPTIxLA0KICAgICAgICBhbHBoYT0wLjUsDQogICAgICAgIHNpemU9NiwNCiAgICAgICAgc3Ryb2tlID0gMg0KICAgICAgICApICsNCiAgICBnZW9tX3Ntb290aChtZXRob2Q9bG0gLCBjb2xvcj0iYmx1ZSIsIGZpbGw9IiM2OWIzYTIiLCBzZT1UUlVFKSArDQogZ2d0aXRsZSgiUGVyZGlkYSBJbmRldGVybWluYWRhIHZycy4gUHVyZXphIE1pZWwgRmluYWwiKSArDQogIHhsYWIoIlB1cmV6YSBNaWVsIEZpbmFsICglKSIpICsgeWxhYigiUMOpcmRpZGEgSW5kZXRlcm1pbmFkYSAoJSkiKQ0KYGBgDQoNCg0KDQoNCg==