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

Nota: Este análisis pretende auxiliar al análisis de causalidad, que se llevará a cabo con los procesos.

Libraries

library(dplyr)
library(pastecs)
library(ggplot2)
library(lares)

Scatter - Correlation Plot Function

mapa_dispersion <- function(label_x,label_y,dataset) {
  correlacion <- round(cor(dataset[[label_x]],dataset[[label_y]]),2)
  ggplot(dataset, aes(.data[[label_x]], .data[[label_y]])) + 
    geom_point(
        color="orange",
        fill="#69b3a2",
        shape=21,
        alpha=0.5,
        size=6,
        stroke = 2
        ) +
    geom_smooth(method=lm , color="#990000", fill="#FFCF00", se=TRUE) +
    ggtitle(paste(label_y,"vrs.",label_x), subtitle = paste("Correlation: ",correlacion)) +
  xlab(label_x) + ylab(label_y)
}

Dataset de Pérdidas Indeterminadas

El conjunto de datos analizados contiene 346 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_2022 <- read.csv(file = 'C:/Compartido/Recuperacion Global MRAMOS 2024/Indeterminadas_2022_Limpio.csv')


# Filter Dataset by Column Values:
df_2022 <- dataset_indeterminadas_2022[dataset_indeterminadas_2022$Perdidas_indeterminadas_Porcentaje<=25,] # Filter out "y" outliers

# Remoción de Variables Colineales: ID, Pérdida Indeterminada (kg/t), Recuperación Global (%), Recobrado (kg/t)
df_2022 <- df_2022[-c(1,77,79)]
df_2022

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


# PDF
distr(df_2022,'Perdidas_indeterminadas_Porcentaje')
Warning: Font 'Arial Narrow' is not installed, has other name, or can't be found

# Boxplot
ggplot(df_2022, aes(y=Perdidas_indeterminadas_Porcentaje)) + 
    geom_boxplot( 
        # custom boxes
        color="blue",
        fill="blue",
        alpha=0.2,
        
        # Notch
        notch=TRUE,
        notchwidth = 0.8,
        
        # custom outliers
        outlier.colour="red",
        outlier.fill="red",
        outlier.size=3) +
  scale_x_discrete() +
  labs(title="Boxplot",x="", y = "Pérdida Indeterminada (%)")


# Descriptive Statistics
data.frame(Estadistica=stat.desc(df_2022$Perdidas_indeterminadas_Porcentaje))
NA
corr_var(df_2022, # dataframe name
  Perdidas_indeterminadas_Porcentaje, # target
  max_pvalue = 0.05, # significance level
  top = 20, # top n most correlated variables with target
  plot = T
)

Diagrama de Dispersión: Perdida Indeterminada - Dia Zafra

label_x <- "Dia_Zafra"
label_y <- "Perdidas_indeterminadas_Porcentaje"

mapa_dispersion(label_x,label_y,df_2022)

Se formula la hipótesis que las acciones correctivas que se realizan al inicio de zafra (relacionado a finalización de instalaciones, ajustes y mantenimientos) impactan en las pérdidas indeterminadas. Debido a que estos efectos no pueden observarse directamente, se propone considerar la variable de eficiencia de capacidad como un factor de confusión en este análisis. La justificación es que, dado que se demuestra la correlación entre la eficiencia de capacidad y el día de zafra con la pérdida indeterminada, si estas acciones que ocurren al inicio de la zafra pueden corregirse en el menor tiempo posible, podrá entonces reducirse el périodo de pérdidas indeterminadas altas.

El tratamiento de este factor de confusión será identificar y filtrar las variables de proceso y laboratorio que tengan una correlación alta con la eficiencia de capacidad, y concentrar el análisis en las variables que después de este filtrado aún mantengan correlación alta con la pérdida indeterminada.

El objetivo es encontrar posibles causas de pérdidas indeterminadas cuando se haya logrado una “estabilidad operativa”.

Para analizar posibles causas relacionadas a la pérdida indeterminada en operación estable, se propone eliminar las variables que tienen alta correlación con la Eficiencia de Capacidad. Para ello, se hace un análisis de correlación para con la Eficiencia de Capacidad

Variables Correlacionadas con Eficiencia de Capacidad

corr_var(df_2022, # nombre del dataframe
  Eficiencia_Capacidad_5527, # variable objetivo
  max_pvalue = 0.05, # nivel de significancia para la región de rechazo en las pruebas de hipótesis
  top = 25, # despliegue de las 25 variables más correlacionadas con la variable objetivo
  plot = T
)

cor_var_eff <- corr_var(df_2022, # nombre del dataframe
  Eficiencia_Capacidad_5527, # variable objetivo
  max_pvalue = 0.05, # nivel de significancia para la región de rechazo en las pruebas de hipótesis
  top = 25, # despliegue de las 25 variables más correlacionadas con la variable objetivo
  plot = F
)
cor_var_eff
NA
listado_final <- cor_var_eff$variables
listado_final <- listado_final[listado_final != "Perdidas_indeterminadas_Porcentaje"]
listado_final <- append(listado_final,c(
                  "Dia_Zafra",
                  "Eficiencia_Capacidad_5527",
                  "Caña_Recibida_dia_5796",
                  "Tiempo_perdido_total_dia_1606"
                  ))

df_filtered_2022 <- df_2022[,!names(df_2022) %in% listado_final]
df_filtered_2022

Una vez identificados los factores de confusión relacionados con la estabilidad operativa, éstos se remueven del conjunto de datos para examinar la correlación de las variables restantes con la pérdida indeterminada. Se muestra el análisis de correlación a continuación:

corr_var(df_filtered_2022, # nombre del dataframe
  Perdidas_indeterminadas_Porcentaje, # variable objetivo
  max_pvalue = 0.05, # nivel de significancia para la región de rechazo en las pruebas de hipótesis
  top = 25, # despliegue de las 30 variables más correlacionadas con la variable objetivo
  plot = T
)

cor_var_eff <- corr_var(df_filtered_2022, # nombre del dataframe
  Perdidas_indeterminadas_Porcentaje, # variable objetivo
  max_pvalue = 0.05, # nivel de significancia para la región de rechazo en las pruebas de hipótesis
  top = 25, # despliegue de las 25 variables más correlacionadas con la variable objetivo
  plot = F
)
cor_var_eff
NA

Estas variables representan los factores que influyen directamente en la pérdida indeterminada. Existen algunas variables que están relacionadas con las pérdidas determinadas, y éstos pueden identificarse directamente con su descripción y la dirección.

Por ejemplo, Pérdida en Bagazo es una pérdida determinada. Se esperaría que al incrementarse, la pérdida indeterminada se reduzca, pues ésta última se calcula restando las pérdidas determinadas de una cantidad de azúcar disponible de entrada (cálculo de suma cero). Por lo tanto la correlación se espera sea “negativa”. Este mismo caso ocurriría con la Pol de Bagazo, que se relaciona directamente con la pérdida en bagazo y la Extracción de sacarosa que se relaciona inversamente con la pérdida en bagazo.

Se presentan entonces correlaciones no esperadas.

Gráficos de Dispersión Variables Correlacionadas

Diagramas de Dispersión:

label_x <- "Temp_escape_2_TT589106"
label_y <- "Perdidas_indeterminadas_Porcentaje"

mapa_dispersion(label_x,label_y,df_filtered_2022)

label_x <- "Perdidas_Azucar_en_aguas_efluentes_5857"
label_y <- "Perdidas_indeterminadas_Porcentaje"

mapa_dispersion(label_x,label_y,df_filtered_2022)

label_x <- "Floculante_meladura__4797"
label_y <- "Perdidas_indeterminadas_Porcentaje"

mapa_dispersion(label_x,label_y,df_filtered_2022)

label_x <- "Brix_Miel_final_960"
label_y <- "Perdidas_indeterminadas_Porcentaje"

mapa_dispersion(label_x,label_y,df_filtered_2022)

label_x <- "Caña_Molida_hora_TA_2207"
label_y <- "Perdidas_indeterminadas_Porcentaje"

mapa_dispersion(label_x,label_y,df_filtered_2022)

label_x <- "Flujo_de_acido_Fosforico_clarificacion_de_meladura_FT583007"
label_y <- "Perdidas_indeterminadas_Porcentaje"

mapa_dispersion(label_x,label_y,df_filtered_2022)

label_x <- "Recirculacion_Magma_B_2630"
label_y <- "Perdidas_indeterminadas_Porcentaje"

mapa_dispersion(label_x,label_y,df_filtered_2022)

label_x <- "Retenido_malla_30_Azucar_Blanco_total_2581"
label_y <- "Perdidas_indeterminadas_Porcentaje"

mapa_dispersion(label_x,label_y,df_filtered_2022)

label_x <- "Flujo_agua_fria_cristalizador_vertical_2_FT64VC02"
label_y <- "Perdidas_indeterminadas_Porcentaje"

mapa_dispersion(label_x,label_y,df_filtered_2022)

LS0tDQp0aXRsZTogIkFuw6FsaXNpcyBQw6lyZGlkYXMgSW5kZXRlcm1pbmFkYXMgUFNBIDIwMjIiDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQpTZSBwcmVzZW50YSB1biBhbsOhbGlzaXMgZGUgY29ycmVsYWNpw7NuIGRlIGxhIFDDqXJkaWRhIEluZGV0ZXJtaW5hZGEgUG9yY2VudHVhbCAoJSkgZGUgUFNBIHBhcmEgbGEgKipaYWZyYSAyMDIxLTIwMjIqKi4NCg0KKk5vdGE6IEVzdGUgYW7DoWxpc2lzIHByZXRlbmRlIGF1eGlsaWFyIGFsIGFuw6FsaXNpcyBkZSBjYXVzYWxpZGFkLCBxdWUgc2UgbGxldmFyw6EgYSBjYWJvIGNvbiBsb3MgcHJvY2Vzb3MuKg0KDQojIyMgTGlicmFyaWVzDQpgYGB7cn0NCmxpYnJhcnkoZHBseXIpDQpsaWJyYXJ5KHBhc3RlY3MpDQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KGxhcmVzKQ0KYGBgDQoNCg0KIyMjIFNjYXR0ZXIgLSBDb3JyZWxhdGlvbiBQbG90IEZ1bmN0aW9uDQpgYGB7cn0NCm1hcGFfZGlzcGVyc2lvbiA8LSBmdW5jdGlvbihsYWJlbF94LGxhYmVsX3ksZGF0YXNldCkgew0KICBjb3JyZWxhY2lvbiA8LSByb3VuZChjb3IoZGF0YXNldFtbbGFiZWxfeF1dLGRhdGFzZXRbW2xhYmVsX3ldXSksMikNCiAgZ2dwbG90KGRhdGFzZXQsIGFlcyguZGF0YVtbbGFiZWxfeF1dLCAuZGF0YVtbbGFiZWxfeV1dKSkgKyANCiAgICBnZW9tX3BvaW50KA0KICAgICAgICBjb2xvcj0ib3JhbmdlIiwNCiAgICAgICAgZmlsbD0iIzY5YjNhMiIsDQogICAgICAgIHNoYXBlPTIxLA0KICAgICAgICBhbHBoYT0wLjUsDQogICAgICAgIHNpemU9NiwNCiAgICAgICAgc3Ryb2tlID0gMg0KICAgICAgICApICsNCiAgICBnZW9tX3Ntb290aChtZXRob2Q9bG0gLCBjb2xvcj0iIzk5MDAwMCIsIGZpbGw9IiNGRkNGMDAiLCBzZT1UUlVFKSArDQogICAgZ2d0aXRsZShwYXN0ZShsYWJlbF95LCJ2cnMuIixsYWJlbF94KSwgc3VidGl0bGUgPSBwYXN0ZSgiQ29ycmVsYXRpb246ICIsY29ycmVsYWNpb24pKSArDQogIHhsYWIobGFiZWxfeCkgKyB5bGFiKGxhYmVsX3kpDQp9DQpgYGANCg0KDQojIyMgRGF0YXNldCBkZSBQw6lyZGlkYXMgSW5kZXRlcm1pbmFkYXMNCg0KRWwgY29uanVudG8gZGUgZGF0b3MgYW5hbGl6YWRvcyBjb250aWVuZSAqKiozNDYgdmFyaWFibGVzKioqIGRlbCBTaXN0ZW1hIGRlIENvbnRyb2wgKFByb2Nlc29zIGRlIEZhYnJpY2FjacOzbikgeSBMYWJvcmF0b3JpbyBJbmR1c3RyaWFsLg0KTGEgdmFyaWFibGUgb2JqZXRpdm8gZXMgbGEgUMOpcmRpZGEgSW5kZXRlcm1pbmFkYSBQb3JjZW50dWFsICglKSwgcXVlIGVzICpsYSBwcm9wb3JjacOzbiBkZSBww6lyZGlkYSBxdWUgY29ycmVzcG9uZGUgYSBsYSBQw6lyZGlkYSBJbmRldGVybWluYWRhIChrZy90KSByZXNwZWN0byBhbCBUb3RhbCBkZSBQw6lyZGlkYXMgKGtnL3QpIGRlc2RlIGVsIENvcmUgU2FtcGxlciouDQpgYGB7cn0NCmRhdGFzZXRfaW5kZXRlcm1pbmFkYXNfMjAyMiA8LSByZWFkLmNzdihmaWxlID0gJ0M6L0NvbXBhcnRpZG8vUmVjdXBlcmFjaW9uIEdsb2JhbCBNUkFNT1MgMjAyNC9JbmRldGVybWluYWRhc18yMDIyX0xpbXBpby5jc3YnKQ0KDQoNCiMgRmlsdGVyIERhdGFzZXQgYnkgQ29sdW1uIFZhbHVlczoNCmRmXzIwMjIgPC0gZGF0YXNldF9pbmRldGVybWluYWRhc18yMDIyW2RhdGFzZXRfaW5kZXRlcm1pbmFkYXNfMjAyMiRQZXJkaWRhc19pbmRldGVybWluYWRhc19Qb3JjZW50YWplPD0yNSxdICMgRmlsdGVyIG91dCAieSIgb3V0bGllcnMNCg0KIyBSZW1vY2nDs24gZGUgVmFyaWFibGVzIENvbGluZWFsZXM6IElELCBQw6lyZGlkYSBJbmRldGVybWluYWRhIChrZy90KSwgUmVjdXBlcmFjacOzbiBHbG9iYWwgKCUpLCBSZWNvYnJhZG8gKGtnL3QpDQpkZl8yMDIyIDwtIGRmXzIwMjJbLWMoMSw3Nyw3OSldDQpkZl8yMDIyDQpgYGANCg0KIyMjIEZ1bmNpw7NuIGRlIERlbnNpZGFkOiBQw6lyZGlkYXMgSW5kZXRlcm1pbmFkYXMgKCUpDQpgYGB7cn0NCg0KIyBQREYNCmRpc3RyKGRmXzIwMjIsJ1BlcmRpZGFzX2luZGV0ZXJtaW5hZGFzX1BvcmNlbnRhamUnKQ0KDQojIEJveHBsb3QNCmdncGxvdChkZl8yMDIyLCBhZXMoeT1QZXJkaWRhc19pbmRldGVybWluYWRhc19Qb3JjZW50YWplKSkgKyANCiAgICBnZW9tX2JveHBsb3QoIA0KICAgICAgICAjIGN1c3RvbSBib3hlcw0KICAgICAgICBjb2xvcj0iYmx1ZSIsDQogICAgICAgIGZpbGw9ImJsdWUiLA0KICAgICAgICBhbHBoYT0wLjIsDQogICAgICAgIA0KICAgICAgICAjIE5vdGNoDQogICAgICAgIG5vdGNoPVRSVUUsDQogICAgICAgIG5vdGNod2lkdGggPSAwLjgsDQogICAgICAgIA0KICAgICAgICAjIGN1c3RvbSBvdXRsaWVycw0KICAgICAgICBvdXRsaWVyLmNvbG91cj0icmVkIiwNCiAgICAgICAgb3V0bGllci5maWxsPSJyZWQiLA0KICAgICAgICBvdXRsaWVyLnNpemU9MykgKw0KICBzY2FsZV94X2Rpc2NyZXRlKCkgKw0KICBsYWJzKHRpdGxlPSJCb3hwbG90Iix4PSIiLCB5ID0gIlDDqXJkaWRhIEluZGV0ZXJtaW5hZGEgKCUpIikNCg0KIyBEZXNjcmlwdGl2ZSBTdGF0aXN0aWNzDQpkYXRhLmZyYW1lKEVzdGFkaXN0aWNhPXN0YXQuZGVzYyhkZl8yMDIyJFBlcmRpZGFzX2luZGV0ZXJtaW5hZGFzX1BvcmNlbnRhamUpKQ0KDQpgYGANCg0KDQpgYGB7cn0NCmNvcnJfdmFyKGRmXzIwMjIsICMgZGF0YWZyYW1lIG5hbWUNCiAgUGVyZGlkYXNfaW5kZXRlcm1pbmFkYXNfUG9yY2VudGFqZSwgIyB0YXJnZXQNCiAgbWF4X3B2YWx1ZSA9IDAuMDUsICMgc2lnbmlmaWNhbmNlIGxldmVsDQogIHRvcCA9IDIwLCAjIHRvcCBuIG1vc3QgY29ycmVsYXRlZCB2YXJpYWJsZXMgd2l0aCB0YXJnZXQNCiAgcGxvdCA9IFQNCikNCmBgYA0KDQojIyMjIERpYWdyYW1hIGRlIERpc3BlcnNpw7NuOiBQZXJkaWRhIEluZGV0ZXJtaW5hZGEgLSBEaWEgWmFmcmENCmBgYHtyfQ0KbGFiZWxfeCA8LSAiRGlhX1phZnJhIg0KbGFiZWxfeSA8LSAiUGVyZGlkYXNfaW5kZXRlcm1pbmFkYXNfUG9yY2VudGFqZSINCg0KbWFwYV9kaXNwZXJzaW9uKGxhYmVsX3gsbGFiZWxfeSxkZl8yMDIyKQ0KYGBgDQoNCg0KU2UgZm9ybXVsYSBsYSBoaXDDs3Rlc2lzIHF1ZSBsYXMgYWNjaW9uZXMgY29ycmVjdGl2YXMgcXVlIHNlIHJlYWxpemFuIGFsIGluaWNpbyBkZSB6YWZyYSAocmVsYWNpb25hZG8gYSBmaW5hbGl6YWNpw7NuIGRlIGluc3RhbGFjaW9uZXMsIGFqdXN0ZXMgeSBtYW50ZW5pbWllbnRvcykgaW1wYWN0YW4gZW4gbGFzIHDDqXJkaWRhcyBpbmRldGVybWluYWRhcy4gRGViaWRvIGEgcXVlIGVzdG9zIGVmZWN0b3Mgbm8gcHVlZGVuIG9ic2VydmFyc2UgZGlyZWN0YW1lbnRlLCBzZSBwcm9wb25lIGNvbnNpZGVyYXIgbGEgdmFyaWFibGUgZGUgZWZpY2llbmNpYSBkZSBjYXBhY2lkYWQgY29tbyB1biBbKipmYWN0b3IgZGUgY29uZnVzacOzbioqXShodHRwczovL2VzLndpa2lwZWRpYS5vcmcvd2lraS9GYWN0b3JfZGVfY29uZnVzaSVDMyVCM24pIGVuIGVzdGUgYW7DoWxpc2lzLiBMYSBqdXN0aWZpY2FjacOzbiBlcyBxdWUsIGRhZG8gcXVlIHNlIGRlbXVlc3RyYSBsYSBjb3JyZWxhY2nDs24gZW50cmUgbGEgZWZpY2llbmNpYSBkZSBjYXBhY2lkYWQgeSBlbCBkw61hIGRlIHphZnJhIGNvbiBsYSBww6lyZGlkYSBpbmRldGVybWluYWRhLCBzaSBlc3RhcyBhY2Npb25lcyBxdWUgb2N1cnJlbiBhbCBpbmljaW8gZGUgbGEgemFmcmEgcHVlZGVuIGNvcnJlZ2lyc2UgZW4gZWwgbWVub3IgdGllbXBvIHBvc2libGUsIHBvZHLDoSBlbnRvbmNlcyByZWR1Y2lyc2UgZWwgcMOpcmlvZG8gZGUgcMOpcmRpZGFzIGluZGV0ZXJtaW5hZGFzIGFsdGFzLg0KDQoqRWwgdHJhdGFtaWVudG8gZGUgZXN0ZSBmYWN0b3IgZGUgY29uZnVzacOzbiBzZXLDoSBpZGVudGlmaWNhciB5IGZpbHRyYXIgbGFzIHZhcmlhYmxlcyBkZSBwcm9jZXNvIHkgbGFib3JhdG9yaW8gcXVlIHRlbmdhbiB1bmEgY29ycmVsYWNpw7NuIGFsdGEgY29uIGxhIGVmaWNpZW5jaWEgZGUgY2FwYWNpZGFkLCB5IGNvbmNlbnRyYXIgZWwgYW7DoWxpc2lzIGVuIGxhcyB2YXJpYWJsZXMgcXVlIGRlc3B1w6lzIGRlIGVzdGUgZmlsdHJhZG8gYcO6biBtYW50ZW5nYW4gY29ycmVsYWNpw7NuIGFsdGEgY29uIGxhIHDDqXJkaWRhIGluZGV0ZXJtaW5hZGEuKg0KDQpFbCBvYmpldGl2byBlcyBlbmNvbnRyYXIgcG9zaWJsZXMgY2F1c2FzIGRlIHDDqXJkaWRhcyBpbmRldGVybWluYWRhcyBjdWFuZG8gc2UgaGF5YSBsb2dyYWRvIHVuYSAiZXN0YWJpbGlkYWQgb3BlcmF0aXZhIi4NCg0KDQpQYXJhIGFuYWxpemFyIHBvc2libGVzIGNhdXNhcyByZWxhY2lvbmFkYXMgYSBsYSBww6lyZGlkYSBpbmRldGVybWluYWRhICoqZW4gb3BlcmFjacOzbiBlc3RhYmxlKiosIHNlIHByb3BvbmUgKmVsaW1pbmFyIGxhcyB2YXJpYWJsZXMgcXVlIHRpZW5lbiBhbHRhIGNvcnJlbGFjacOzbiBjb24gbGEgRWZpY2llbmNpYSBkZSBDYXBhY2lkYWQuKiBQYXJhIGVsbG8sIHNlIGhhY2UgdW4gYW7DoWxpc2lzIGRlIGNvcnJlbGFjacOzbiBwYXJhIGNvbiBsYSAqKkVmaWNpZW5jaWEgZGUgQ2FwYWNpZGFkKioNCg0KIyMjIyBWYXJpYWJsZXMgQ29ycmVsYWNpb25hZGFzIGNvbiBFZmljaWVuY2lhIGRlIENhcGFjaWRhZA0KDQpgYGB7cn0NCmNvcnJfdmFyKGRmXzIwMjIsICMgbm9tYnJlIGRlbCBkYXRhZnJhbWUNCiAgRWZpY2llbmNpYV9DYXBhY2lkYWRfNTUyNywgIyB2YXJpYWJsZSBvYmpldGl2bw0KICBtYXhfcHZhbHVlID0gMC4wNSwgIyBuaXZlbCBkZSBzaWduaWZpY2FuY2lhIHBhcmEgbGEgcmVnacOzbiBkZSByZWNoYXpvIGVuIGxhcyBwcnVlYmFzIGRlIGhpcMOzdGVzaXMNCiAgdG9wID0gMjUsICMgZGVzcGxpZWd1ZSBkZSBsYXMgMjUgdmFyaWFibGVzIG3DoXMgY29ycmVsYWNpb25hZGFzIGNvbiBsYSB2YXJpYWJsZSBvYmpldGl2bw0KICBwbG90ID0gVA0KKQ0KDQpgYGANCg0KYGBge3J9DQpjb3JfdmFyX2VmZiA8LSBjb3JyX3ZhcihkZl8yMDIyLCAjIG5vbWJyZSBkZWwgZGF0YWZyYW1lDQogIEVmaWNpZW5jaWFfQ2FwYWNpZGFkXzU1MjcsICMgdmFyaWFibGUgb2JqZXRpdm8NCiAgbWF4X3B2YWx1ZSA9IDAuMDUsICMgbml2ZWwgZGUgc2lnbmlmaWNhbmNpYSBwYXJhIGxhIHJlZ2nDs24gZGUgcmVjaGF6byBlbiBsYXMgcHJ1ZWJhcyBkZSBoaXDDs3Rlc2lzDQogIHRvcCA9IDI1LCAjIGRlc3BsaWVndWUgZGUgbGFzIDI1IHZhcmlhYmxlcyBtw6FzIGNvcnJlbGFjaW9uYWRhcyBjb24gbGEgdmFyaWFibGUgb2JqZXRpdm8NCiAgcGxvdCA9IEYNCikNCmNvcl92YXJfZWZmDQoNCmBgYA0KDQpgYGB7cn0NCmxpc3RhZG9fZmluYWwgPC0gY29yX3Zhcl9lZmYkdmFyaWFibGVzDQpsaXN0YWRvX2ZpbmFsIDwtIGxpc3RhZG9fZmluYWxbbGlzdGFkb19maW5hbCAhPSAiUGVyZGlkYXNfaW5kZXRlcm1pbmFkYXNfUG9yY2VudGFqZSJdDQpsaXN0YWRvX2ZpbmFsIDwtIGFwcGVuZChsaXN0YWRvX2ZpbmFsLGMoDQogICAgICAgICAgICAgICAgICAiRGlhX1phZnJhIiwNCiAgICAgICAgICAgICAgICAgICJFZmljaWVuY2lhX0NhcGFjaWRhZF81NTI3IiwNCiAgICAgICAgICAgICAgICAgICJDYcOxYV9SZWNpYmlkYV9kaWFfNTc5NiIsDQogICAgICAgICAgICAgICAgICAiVGllbXBvX3BlcmRpZG9fdG90YWxfZGlhXzE2MDYiDQogICAgICAgICAgICAgICAgICApKQ0KDQpkZl9maWx0ZXJlZF8yMDIyIDwtIGRmXzIwMjJbLCFuYW1lcyhkZl8yMDIyKSAlaW4lIGxpc3RhZG9fZmluYWxdDQpkZl9maWx0ZXJlZF8yMDIyDQpgYGANCg0KDQoNClVuYSB2ZXogaWRlbnRpZmljYWRvcyBsb3MgZmFjdG9yZXMgZGUgY29uZnVzacOzbiByZWxhY2lvbmFkb3MgY29uIGxhIGVzdGFiaWxpZGFkIG9wZXJhdGl2YSwgw6lzdG9zIHNlIHJlbXVldmVuIGRlbCBjb25qdW50byBkZSBkYXRvcyBwYXJhIGV4YW1pbmFyIGxhIGNvcnJlbGFjacOzbiBkZSBsYXMgdmFyaWFibGVzIHJlc3RhbnRlcyBjb24gbGEgcMOpcmRpZGEgaW5kZXRlcm1pbmFkYS4gU2UgbXVlc3RyYSBlbCBhbsOhbGlzaXMgZGUgY29ycmVsYWNpw7NuIGEgY29udGludWFjacOzbjoNCmBgYHtyfQ0KY29ycl92YXIoZGZfZmlsdGVyZWRfMjAyMiwgIyBub21icmUgZGVsIGRhdGFmcmFtZQ0KICBQZXJkaWRhc19pbmRldGVybWluYWRhc19Qb3JjZW50YWplLCAjIHZhcmlhYmxlIG9iamV0aXZvDQogIG1heF9wdmFsdWUgPSAwLjA1LCAjIG5pdmVsIGRlIHNpZ25pZmljYW5jaWEgcGFyYSBsYSByZWdpw7NuIGRlIHJlY2hhem8gZW4gbGFzIHBydWViYXMgZGUgaGlww7N0ZXNpcw0KICB0b3AgPSAyNSwgIyBkZXNwbGllZ3VlIGRlIGxhcyAyNSB2YXJpYWJsZXMgbcOhcyBjb3JyZWxhY2lvbmFkYXMgY29uIGxhIHZhcmlhYmxlIG9iamV0aXZvDQogIHBsb3QgPSBUDQopDQoNCmBgYA0KDQpgYGB7cn0NCmNvcl92YXJfZWZmIDwtIGNvcnJfdmFyKGRmX2ZpbHRlcmVkXzIwMjIsICMgbm9tYnJlIGRlbCBkYXRhZnJhbWUNCiAgUGVyZGlkYXNfaW5kZXRlcm1pbmFkYXNfUG9yY2VudGFqZSwgIyB2YXJpYWJsZSBvYmpldGl2bw0KICBtYXhfcHZhbHVlID0gMC4wNSwgIyBuaXZlbCBkZSBzaWduaWZpY2FuY2lhIHBhcmEgbGEgcmVnacOzbiBkZSByZWNoYXpvIGVuIGxhcyBwcnVlYmFzIGRlIGhpcMOzdGVzaXMNCiAgdG9wID0gMjUsICMgZGVzcGxpZWd1ZSBkZSBsYXMgMjUgdmFyaWFibGVzIG3DoXMgY29ycmVsYWNpb25hZGFzIGNvbiBsYSB2YXJpYWJsZSBvYmpldGl2bw0KICBwbG90ID0gRg0KKQ0KY29yX3Zhcl9lZmYNCg0KYGBgDQoNCg0KRXN0YXMgdmFyaWFibGVzIHJlcHJlc2VudGFuIGxvcyBmYWN0b3JlcyBxdWUgaW5mbHV5ZW4gZGlyZWN0YW1lbnRlIGVuIGxhIHDDqXJkaWRhIGluZGV0ZXJtaW5hZGEuIEV4aXN0ZW4gYWxndW5hcyB2YXJpYWJsZXMgcXVlIGVzdMOhbiByZWxhY2lvbmFkYXMgY29uIGxhcyAqKnDDqXJkaWRhcyBkZXRlcm1pbmFkYXMqKiwgeSDDqXN0b3MgcHVlZGVuIGlkZW50aWZpY2Fyc2UgZGlyZWN0YW1lbnRlIGNvbiBzdSBkZXNjcmlwY2nDs24geSBsYSBkaXJlY2Npw7NuLg0KDQpQb3IgZWplbXBsbywgKipQw6lyZGlkYSBlbiBCYWdhem8qKiBlcyB1bmEgcMOpcmRpZGEgZGV0ZXJtaW5hZGEuIFNlIGVzcGVyYXLDrWEgcXVlIGFsIGluY3JlbWVudGFyc2UsIGxhIHDDqXJkaWRhIGluZGV0ZXJtaW5hZGEgc2UgcmVkdXpjYSwgcHVlcyDDqXN0YSDDumx0aW1hIHNlIGNhbGN1bGEgcmVzdGFuZG8gbGFzIHDDqXJkaWRhcyBkZXRlcm1pbmFkYXMgZGUgdW5hIGNhbnRpZGFkIGRlIGF6w7pjYXIgZGlzcG9uaWJsZSBkZSBlbnRyYWRhIChjw6FsY3VsbyBkZSBzdW1hIGNlcm8pLiBQb3IgbG8gdGFudG8gbGEgY29ycmVsYWNpw7NuIHNlIGVzcGVyYSBzZWEgKioibmVnYXRpdmEiKiouIEVzdGUgbWlzbW8gY2FzbyBvY3Vycmlyw61hIGNvbiBsYSAqKlBvbCBkZSBCYWdhem8qKiwgcXVlIHNlIHJlbGFjaW9uYSBkaXJlY3RhbWVudGUgY29uIGxhIHDDqXJkaWRhIGVuIGJhZ2F6byB5IGxhICoqRXh0cmFjY2nDs24gZGUgc2FjYXJvc2EqKiBxdWUgc2UgcmVsYWNpb25hIGludmVyc2FtZW50ZSBjb24gbGEgcMOpcmRpZGEgZW4gYmFnYXpvLg0KDQpTZSBwcmVzZW50YW4gZW50b25jZXMgKmNvcnJlbGFjaW9uZXMgbm8gZXNwZXJhZGFzKi4NCg0KIyMjIEdyw6FmaWNvcyBkZSBEaXNwZXJzacOzbiBWYXJpYWJsZXMgQ29ycmVsYWNpb25hZGFzDQoNCiMjIyMgRGlhZ3JhbWFzIGRlIERpc3BlcnNpw7NuOg0KYGBge3J9DQpsYWJlbF94IDwtICJUZW1wX2VzY2FwZV8yX1RUNTg5MTA2Ig0KbGFiZWxfeSA8LSAiUGVyZGlkYXNfaW5kZXRlcm1pbmFkYXNfUG9yY2VudGFqZSINCg0KbWFwYV9kaXNwZXJzaW9uKGxhYmVsX3gsbGFiZWxfeSxkZl9maWx0ZXJlZF8yMDIyKQ0KYGBgDQoNCmBgYHtyfQ0KbGFiZWxfeCA8LSAiUGVyZGlkYXNfQXp1Y2FyX2VuX2FndWFzX2VmbHVlbnRlc181ODU3Ig0KbGFiZWxfeSA8LSAiUGVyZGlkYXNfaW5kZXRlcm1pbmFkYXNfUG9yY2VudGFqZSINCg0KbWFwYV9kaXNwZXJzaW9uKGxhYmVsX3gsbGFiZWxfeSxkZl9maWx0ZXJlZF8yMDIyKQ0KYGBgDQpgYGB7cn0NCmxhYmVsX3ggPC0gIkZsb2N1bGFudGVfbWVsYWR1cmFfXzQ3OTciDQpsYWJlbF95IDwtICJQZXJkaWRhc19pbmRldGVybWluYWRhc19Qb3JjZW50YWplIg0KDQptYXBhX2Rpc3BlcnNpb24obGFiZWxfeCxsYWJlbF95LGRmX2ZpbHRlcmVkXzIwMjIpDQpgYGANCg0KYGBge3J9DQpsYWJlbF94IDwtICJCcml4X01pZWxfZmluYWxfOTYwIg0KbGFiZWxfeSA8LSAiUGVyZGlkYXNfaW5kZXRlcm1pbmFkYXNfUG9yY2VudGFqZSINCg0KbWFwYV9kaXNwZXJzaW9uKGxhYmVsX3gsbGFiZWxfeSxkZl9maWx0ZXJlZF8yMDIyKQ0KYGBgDQpgYGB7cn0NCmxhYmVsX3ggPC0gIkNhw7FhX01vbGlkYV9ob3JhX1RBXzIyMDciDQpsYWJlbF95IDwtICJQZXJkaWRhc19pbmRldGVybWluYWRhc19Qb3JjZW50YWplIg0KDQptYXBhX2Rpc3BlcnNpb24obGFiZWxfeCxsYWJlbF95LGRmX2ZpbHRlcmVkXzIwMjIpDQpgYGANCg0KYGBge3J9DQpsYWJlbF94IDwtICJGbHVqb19kZV9hY2lkb19Gb3Nmb3JpY29fY2xhcmlmaWNhY2lvbl9kZV9tZWxhZHVyYV9GVDU4MzAwNyINCmxhYmVsX3kgPC0gIlBlcmRpZGFzX2luZGV0ZXJtaW5hZGFzX1BvcmNlbnRhamUiDQoNCm1hcGFfZGlzcGVyc2lvbihsYWJlbF94LGxhYmVsX3ksZGZfZmlsdGVyZWRfMjAyMikNCmBgYA0KDQpgYGB7cn0NCmxhYmVsX3ggPC0gIlJlY2lyY3VsYWNpb25fTWFnbWFfQl8yNjMwIg0KbGFiZWxfeSA8LSAiUGVyZGlkYXNfaW5kZXRlcm1pbmFkYXNfUG9yY2VudGFqZSINCg0KbWFwYV9kaXNwZXJzaW9uKGxhYmVsX3gsbGFiZWxfeSxkZl9maWx0ZXJlZF8yMDIyKQ0KYGBgDQoNCmBgYHtyfQ0KbGFiZWxfeCA8LSAiUmV0ZW5pZG9fbWFsbGFfMzBfQXp1Y2FyX0JsYW5jb190b3RhbF8yNTgxIg0KbGFiZWxfeSA8LSAiUGVyZGlkYXNfaW5kZXRlcm1pbmFkYXNfUG9yY2VudGFqZSINCg0KbWFwYV9kaXNwZXJzaW9uKGxhYmVsX3gsbGFiZWxfeSxkZl9maWx0ZXJlZF8yMDIyKQ0KYGBgDQoNCg0KYGBge3J9DQpsYWJlbF94IDwtICJGbHVqb19hZ3VhX2ZyaWFfY3Jpc3RhbGl6YWRvcl92ZXJ0aWNhbF8yX0ZUNjRWQzAyIg0KbGFiZWxfeSA8LSAiUGVyZGlkYXNfaW5kZXRlcm1pbmFkYXNfUG9yY2VudGFqZSINCg0KbWFwYV9kaXNwZXJzaW9uKGxhYmVsX3gsbGFiZWxfeSxkZl9maWx0ZXJlZF8yMDIyKQ0KYGBg