1. Defining malnutrition

1.1. Prerequisites

library(tidyverse)
library(zscorer)
library(readr)
library(dplyr)
library (lubridate)
library (ggplot2)
library (rmarkdown)
library(openxlsx)
library(writexl)
library(rstatix)
library(eeptools)
library(ggpubr)
library(readxl)
PSFI_df_malnutrition <- read_xlsx("Ben_cut_4_27.xlsx")
Sys.setenv(LANGUAGE = "en")

1.2. Anthroprometric analysis

# CREATE NEW CATEGORY THAT CALCULATES AGE IN YEARS BASED ON AGE IN DAYS
PSFI_df_malnutrition <- PSFI_df_malnutrition %>%
  mutate(age_years = age_days_exact / 365.25)

summary(PSFI_df_malnutrition$age_years)
    Min.  1st Qu.   Median     Mean  3rd Qu.     Max. 
 0.08768  0.79176  1.65535  3.07854  4.00176 14.92786 
# CREATES A SUMMARY OF CASES (ht=height, wt=weight, age_years= age in years, muac)
PSFI_df_malnutrition %>%
  filter(case_control == 1) %>%
  select(ht, wt, age_years, muac) %>%
  summary()
       ht               wt          age_years             muac      
 Min.   : 20.00   Min.   : 3.20   Min.   : 0.08768   Min.   : 9.00  
 1st Qu.: 67.00   1st Qu.: 7.00   1st Qu.: 0.73436   1st Qu.:14.00  
 Median : 78.00   Median : 9.50   Median : 1.40141   Median :15.00  
 Mean   : 85.23   Mean   :12.17   Mean   : 2.83539   Mean   :15.38  
 3rd Qu.: 98.00   3rd Qu.:14.00   3rd Qu.: 3.49267   3rd Qu.:17.00  
 Max.   :192.00   Max.   :72.00   Max.   :14.92786   Max.   :27.00  
 NAs    :1                                           NAs    :2      
# CREATES A HISTOGRAM AND BOXPLOT OF HEIGHT (CASES)
layout(mat = matrix(c(1,2),2,1, byrow=TRUE),  height = c(1,8))
par(mar=c(0, 3.1, 1.1, 2.1))
boxplot(PSFI_df_malnutrition$ht[PSFI_df_malnutrition$case_control == 1] , horizontal=TRUE , ylim=c(0,200), xaxt="n" , col=rgb(0.8,0.8,0,0.5) , frame=F)
par(mar=c(4, 3.1, 1.1, 2.1))
hist(PSFI_df_malnutrition$ht[PSFI_df_malnutrition$case_control == 1]
     , breaks=40 , col=rgb(1,0.8,0.8,1) , border=F , main="" , xlab="Height (cm)", xlim=c(0,200))

# CREATES A HISTOGRAM AND BOXPLOT OF WEIGHT (CASES)
layout(mat = matrix(c(1,2),2,1, byrow=TRUE),  height = c(1,8))
 par(mar=c(0, 3.1, 1.1, 2.1))
boxplot(PSFI_df_malnutrition$wt[PSFI_df_malnutrition$case_control == 1] , horizontal=TRUE , ylim=c(0,75), xaxt="n" , col=rgb(0.8,0.8,0,0.5) , frame=F)
par(mar=c(4, 3.1, 1.1, 2.1))
hist(PSFI_df_malnutrition$wt[PSFI_df_malnutrition$case_control == 1]
     , breaks=40 , col=rgb(1,0.8,0.8,1) , border=F , main="" , xlab="Weight (kg)", xlim=c(0,75))

# CREATES A HISTOGRAM AND BOXPLOT OF MUAC (CASES)
## BLUE LINE OUTLINES MODERATE MALNUTRITION (12.5cm)
## RED LINE OUTLINES SEVERE MALNUTRITION (11.5cm)
layout(mat = matrix(c(1,2),2,1, byrow=TRUE),  height = c(1,8))
par(mar=c(0, 3.1, 1.1, 2.1))
boxplot(PSFI_df_malnutrition$muac[PSFI_df_malnutrition$case_control == 1] , horizontal=TRUE , ylim=c(5,30), xaxt="n" , col=rgb(0.8,0.8,0,0.5) , frame=F)
par(mar=c(4, 3.1, 1.1, 2.1))
hist(PSFI_df_malnutrition$muac[PSFI_df_malnutrition$case_control == 1]
     , breaks=20 , col=rgb(1,0.8,0.8,1) , border=F , main="" , xlab="Mid-upper arm circumference (cm)", xlim=c(5,30))
abline(v = 11.5, col = "red", lwd = 2, lty = 2)   # severe
abline(v = 12.5, col = "blue", lwd = 2, lty = 2)  # moderate

# HISTOGRAM AND BOXPLOT OF AGE (CASES)
layout(mat = matrix(c(1,2),2,1, byrow=TRUE),  height = c(1,8))
 par(mar=c(0, 3.1, 1.1, 2.1))
boxplot(PSFI_df_malnutrition$age_years[PSFI_df_malnutrition$case_control == 1] , horizontal=TRUE , ylim=c(0,15), xaxt="n" , col=rgb(0.8,0.8,0,0.5) , frame=F)
par(mar=c(4, 3.1, 1.1, 2.1))
hist(PSFI_df_malnutrition$age_years[PSFI_df_malnutrition$case_control == 1], breaks=40 , col=rgb(1,0.8,0.8,1) , border=F , main="" , xlab="Age (years)", xlim=c(0,15))

1.3. Z-scorer

# CREATES A NEW CATEGORY DEFINING SEX AS 1/2, INSTEAD OF 0/1 (NECESSARY FOR ZSCORER PACKAGE)
PSFI_df_malnutrition <- PSFI_df_malnutrition %>%
  mutate(sex_who = if_else(sex == 1, 1, 2))

summary(PSFI_df_malnutrition$sex_who)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  1.000   1.000   1.000   1.427   2.000   2.000 
# CREATES A NEW CATEGORY CALCULATING AGE IN MONTHS BASED ON AGE IN DAYS
PSFI_df_malnutrition <- PSFI_df_malnutrition %>%
  mutate(age_months = age_days_exact / 30.4375)

summary(PSFI_df_malnutrition$age_months)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  1.052   9.501  19.864  36.942  48.021 179.134 
# CREATES A NEW CATEGORY (AGE<6M = 0, AGE 6M - 5J = 1, AGE > 5J = 2)
PSFI_df_malnutrition <- PSFI_df_malnutrition %>%
  mutate(
    age_group = case_when(
      age_months < 6 ~ 0L,
      age_months >= 6 & age_years < 5 ~ 1L,
      age_years >= 5 ~ 2L,
      TRUE ~ NA_integer_
    )
  )
# ZSCORER PACKAGE CALCULATES ZSCORE OF WEIGHT FOR LENGTH (wflz), WEIGHT FOR AGE (wfaz), HEIGHT FOR AGE (hfaz), WEIGHT FOR HEIGHT (wfhz), BMI FOR AGE (baz)
PSFI_df_malnutrition <- PSFI_df_malnutrition %>%
  mutate(
    wflz = addWGSR(
      data = .,
      sex = "sex_who",
      firstPart = "wt",
      secondPart = "ht",
      index = "wfl"
    )$wflz,
    
    wfaz = addWGSR(
      data = .,
      sex = "sex_who",
      firstPart = "wt",
      secondPart = "age_days_exact",
      index = "wfa"
    )$wfaz,
    
    hfaz = addWGSR(
      data = .,
      sex = "sex_who",
      firstPart = "ht",
      secondPart = "age_days_exact",
      index = "hfa"
    )$hfaz,

    wfhz = addWGSR(
      data = .,
      sex = "sex_who",
      firstPart = "wt",
      secondPart = "ht",
      index = "wfh"
    )$wfhz,
    
    baz = addWGSR(
      data = .,
      sex = "sex_who",
      firstPart = "wt",
      secondPart = "ht",
      thirdPart = "age_days_exact",
      index = "bfa"
    )$bfaz
  )
============================================================================================================================================
============================================================================================================================================
============================================================================================================================================
============================================================================================================================================
============================================================================================================================================
# ASSIGNS Z-SCORE TO MUAC BASED ON THE 11.5 & 12.5CM LIMITS, THIS IS A PROXY SINCE LATER A Z-SCORE OF 0 WILL EQUAL NO MALNUTRITION, -2.5 WILL EQUAL MODERATE MALNUTRITION AND -4 WILL EQUAL SEVERE MALNUTRITION
PSFI_df_malnutrition <- PSFI_df_malnutrition %>%
  mutate(
    muacz = case_when(
      muac >= 12.5 ~ 0,
      muac >= 11.5 & muac < 12.5 ~ -2.5,
      muac < 11.5 ~ -4,
      TRUE ~ NA_real_
    )
  )
# CREATE MALNUTRITION ZSCORE BASED ON WFHL, BAZ, MUACZ (to be defined later)
PSFI_df_malnutrition <- PSFI_df_malnutrition %>%
  mutate(
    zscore_unified = case_when(
      age_group == 1 & ht >= 45 & ht < 65 ~ wflz,
      age_group == 1 & ht >= 65 & ht < 120 ~ wfhz,
      age_group == 1 & (ht < 45 | ht >= 120 | is.na(ht)) ~ muacz,
      age_group == 2 ~ baz,
      TRUE ~ NA_real_
    )
  )
# CREATE MALNUTRITION CATEGORY BASED ON PREVIOUS Z SCORE
PSFI_df_malnutrition <- PSFI_df_malnutrition %>%
  mutate(
    malnutrition = case_when(
  is.na(zscore_unified) ~ NA_integer_,
  zscore_unified < -3 ~ 2L,
  zscore_unified >= -3 & zscore_unified < -2 ~ 1L,
  TRUE ~ 0L
    )
  )
# ADD A MALNUTRITION SOURCE SO WE KNOW WHICH ANTHROPOMETRIC MEASURE IS BEING USED TO DEFINE MALNUTRITION
PSFI_df_malnutrition <- PSFI_df_malnutrition %>%
  mutate(
    malnutrition_source = case_when(
      age_group == 1 & ht >= 45 & ht < 65  ~ "WFL",
      age_group == 1 & ht >= 65 & ht < 120 ~ "WFH",
      age_group == 1 & (ht < 45 | ht >= 120 | is.na(ht)) ~ "MUAC",
      age_group == 2 ~ "BFA",
      TRUE ~ NA_character_
    )
  )

1.4 Z score check

subset_wfaz <- PSFI_df_malnutrition %>%
  filter(case_control == 1) %>%
  pull(wfaz)

# SUMMARY OF WEIGHT FOR AGE Z-SCORE (CASES)
summary(subset_wfaz)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max.     NAs 
-7.5400 -2.3050 -0.9700 -1.0971  0.0475 10.2500      49 
# NUMBER OF CASES IN WEIGHT FOR AGE Z SCORE
length(subset_wfaz)
[1] 755
subset_wfaz1 <- PSFI_df_malnutrition %>%
  filter(case_control == 1) %>%
  identify_outliers(wfaz) %>%
  pull(wfaz)

# NUMBER OF OUTLIERS IN WEIGHT FOR AGE Z SCORE
length(subset_wfaz1)
[1] 10
subset_hfaz <- PSFI_df_malnutrition %>%
  filter(case_control == 1) %>%
  pull(hfaz)

# SUMMARY OF HEIGHT FOR AGE Z SCORE (CASES)
summary(subset_hfaz)
    Min.  1st Qu.   Median     Mean  3rd Qu.     Max.      NAs 
-18.2600  -2.8700  -1.1800  -0.9338   0.6350  44.5600        1 
# NUMBER OF CASES IN HEIGHT FOR AGE Z SCORE
length(subset_hfaz)
[1] 755
subset_hfaz1 <- PSFI_df_malnutrition %>%
  filter(case_control == 1) %>%
  identify_outliers(hfaz) %>%
  pull(hfaz)

# NUMBER OF OUTLIERS FOR HEIGHT FOR AGE Z SCORE
length(subset_hfaz1)
[1] 29
subset_wfhz <- PSFI_df_malnutrition %>%
  filter(case_control == 1) %>%
  pull(wfhz)

# SUMMARY OF WEIGHT FOR HEIGHT Z SCORE (CASES)
summary(subset_wfhz)
    Min.  1st Qu.   Median     Mean  3rd Qu.     Max.      NAs 
-10.5900  -2.2300  -0.5700  -0.4132   1.1875  42.7700       93 
# NUMBER OF CASES IN WEIGHT FOR HEIGHT Z SCORE
length(subset_wfhz)
[1] 755
subset_wfhz1 <- PSFI_df_malnutrition %>%
  filter(case_control == 1) %>%
  identify_outliers(wfhz) %>%
  pull(wfhz)

# NUMBER OF OUTLIERS IN WEIGHT FOR HEIGHT Z SCORE
length(subset_wfhz1)
[1] 20
subset_baz <- PSFI_df_malnutrition %>%
  filter(case_control == 1) %>%
  pull(baz)

# SUMMARY OF BMI FOR AGE Z SCORE (CASES)
summary(subset_baz)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max.     NAs 
-12.560  -2.250  -0.695  -0.583   1.060  50.500       1 
# NUMBER OF CASES IN BMI FOR AGE Z SCORE
length(subset_baz)
[1] 755
subset_baz1 <- PSFI_df_malnutrition %>%
  filter(case_control == 1) %>%
  identify_outliers(baz) %>%
  pull(baz)

# NUMBER OF OUTLIERS IN BMI FOR AGE Z SCORE
length(subset_baz1)
[1] 29
subset_muac <- PSFI_df_malnutrition %>%
  filter(age_group == 1 & case_control == 1) %>%
  pull(muac)

# SUMMARY OF MUAC (CASES, 6-59 MONTHS)
summary(subset_muac)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max.     NAs 
   9.00   14.00   15.00   15.02   16.00   23.00       2 
# NUMBER OF CASES IN MUAC
length(subset_muac)
[1] 535
subset_muac1 <- PSFI_df_malnutrition %>%
  filter(age_group == 1 & case_control == 1) %>%
  identify_outliers(muac) %>%
  pull(muac)

# NUMBER OF OUTLIERS IN MUAC
length(subset_muac1)
[1] 18
# CREATES BOXPLOT AND HISTOGRAM FOR WEIGHT FOR HEIGHT Z SCORE (CASES)
layout(mat = matrix(c(1,2),2,1, byrow=TRUE),  height = c(1,8))
 par(mar=c(0, 3.1, 1.1, 2.1))
boxplot(PSFI_df_malnutrition$wfhz[PSFI_df_malnutrition$case_control == 1] , horizontal=TRUE , ylim=c(-11,43), xaxt="n" , col=rgb(0.8,0.8,0,0.5) , frame=F)
par(mar=c(4, 3.1, 1.1, 2.1))
hist(PSFI_df_malnutrition$wfhz[PSFI_df_malnutrition$case_control == 1]
     , breaks=50 , col=rgb(1,0.8,0.8,1) , border=F , main="" , xlab="Weight-for-height (z-score)", xlim=c(-11,43))

# CREATES BOXPLOT AND HISTOGRAM OF WEIGHT FOR AGE (CASES)
layout(mat = matrix(c(1,2),2,1, byrow=TRUE),  height = c(1,8))
 par(mar=c(0, 3.1, 1.1, 2.1))
boxplot(PSFI_df_malnutrition$wfaz[PSFI_df_malnutrition$case_control == 1] , horizontal=TRUE , ylim=c(-8,11), xaxt="n" , col=rgb(0.8,0.8,0,0.5) , frame=F)
par(mar=c(4, 3.1, 1.1, 2.1))
hist(PSFI_df_malnutrition$wfaz[PSFI_df_malnutrition$case_control == 1]
     , breaks=50 , col=rgb(1,0.8,0.8,1) , border=F , main="" , xlab="Weight-for-age (z-score)", xlim=c(-8,11))

# CREATES BOXPLOT AND HISTOGRAM OF BMI FOR AGE (CASES)
layout(mat = matrix(c(1,2),2,1, byrow=TRUE),  height = c(1,8))
 par(mar=c(0, 3.1, 1.1, 2.1))
boxplot(PSFI_df_malnutrition$baz[PSFI_df_malnutrition$case_control == 1] , horizontal=TRUE , ylim=c(-13,51), xaxt="n" , col=rgb(0.8,0.8,0,0.5) , frame=F)
par(mar=c(4, 3.1, 1.1, 2.1))
hist(PSFI_df_malnutrition$baz[PSFI_df_malnutrition$case_control == 1]
     , breaks=50 , col=rgb(1,0.8,0.8,1) , border=F , main="" , xlab="BMI-for-age (z-score)", xlim=c(-13,51))

# CREATE BOXPLOT AND HISTOGRAM OF HEIGHT FOR AGE 
layout(mat = matrix(c(1,2),2,1, byrow=TRUE),  height = c(1,8))
 par(mar=c(0, 3.1, 1.1, 2.1))
boxplot(PSFI_df_malnutrition$hfaz[PSFI_df_malnutrition$case_control == 1] , horizontal=TRUE , ylim=c(-19,45), xaxt="n" , col=rgb(0.8,0.8,0,0.5) , frame=F)
par(mar=c(4, 3.1, 1.1, 2.1))
hist(PSFI_df_malnutrition$hfaz[PSFI_df_malnutrition$case_control == 1]
     , breaks=50 , col=rgb(1,0.8,0.8,1) , border=F , main="" , xlab="Height-for-age (z-score)", xlim=c(-19,45))

# CREATES HISTOGRAM AND BOXPLOT OF MUAC (CASES, 6-59 MONTHS)
layout(mat = matrix(c(1,2),2,1, byrow=TRUE),  height = c(1,8))
par(mar=c(0, 3.1, 1.1, 2.1))
boxplot(PSFI_df_malnutrition$muac[PSFI_df_malnutrition$case_control == 1] , horizontal=TRUE , ylim=c(5,30), xaxt="n" , col=rgb(0.8,0.8,0,0.5) , frame=F)
par(mar=c(4, 3.1, 1.1, 2.1))
hist(PSFI_df_malnutrition$muac[PSFI_df_malnutrition$case_control == 1]
     , breaks=20 , col=rgb(1,0.8,0.8,1) , border=F , main="" , xlab="Mid-upper arm circumference (cm)", xlim=c(5,30))
abline(v = 11.5, col = "red", lwd = 2, lty = 2)   # severe
abline(v = 12.5, col = "blue", lwd = 2, lty = 2)  # moderate

# MAKES A TABLE OF OUTLIERS FOR WEIGHT FOR HEIGHT
wfhz_outliers <- PSFI_df_malnutrition %>%
  filter(case_control == 1) %>%
  identify_outliers(wfhz) %>%
  select(record_id, wt, ht, wfhz, age_months, is.outlier, is.extreme)

wfhz_outliers
# MAKES A TABLE OF OUTLIERS FOR WEIGHT FOR AGE
wfaz_outliers <- PSFI_df_malnutrition %>%
  filter(case_control == 1) %>%
  identify_outliers(wfaz) %>%
  select(record_id,ht, wt, age_months, wfaz, is.outlier, is.extreme)

wfaz_outliers
# MAKES A TABLE OF OUTLIERS FOR HEIGHT FOR AGE
hfaz_outliers <- PSFI_df_malnutrition %>%
  filter(case_control == 1) %>%
  identify_outliers(hfaz) %>%
  select(record_id, ht, wt, age_months, hfaz, is.outlier, is.extreme)

hfaz_outliers
# MAKES A TABLE OF OUTLIERS FOR BMI FOR AGE
baz_outliers <- PSFI_df_malnutrition %>%
  filter(case_control == 1) %>%
  identify_outliers(baz) %>%
  select(record_id, wt, ht, baz, age_months, is.outlier, is.extreme)

baz_outliers
# MAKES A TABLE OF OUTLIERS FOR MUAC

muac_outliers <- PSFI_df_malnutrition %>%
  filter(age_group == 1 & case_control == 1) %>%
  identify_outliers(muac) %>%
  select(record_id, ht, wt, age_months, muac, is.outlier, is.extreme)

muac_outliers
# CREATES AN EXCEL FILE OF ALL OUTLIER TABLES
write.xlsx(
  list(
    WFHZ = wfhz_outliers,
    WFAZ = wfaz_outliers,
    HAZ = hfaz_outliers,
    MUAC = muac_outliers, 
    BAZ = baz_outliers
  ),
  file = "anthropometric_outliers.xlsx"
)
# CREATE A TABLE OF ALL NA'S
na_table <- PSFI_df_malnutrition %>%
  filter(case_control == 1) %>%
  mutate(
    hfaz_missing = is.na(hfaz),
    wfaz_missing  = is.na(wfaz),
    wfhz_missing = is.na(wfhz), 
    muac_missing = is.na (muac), 
    baz_missing = is.na (baz)
  ) %>%
  filter(hfaz_missing | wfaz_missing | wfhz_missing | baz_missing | muac_missing) %>%
  select(
    record_id,
    ht,
    wt,
    age_months,
    hfaz,
    wfaz,
    wfhz,
    baz,
    muac, 
    hfaz_missing,
    wfaz_missing,
    wfhz_missing, 
    baz_missing,
    muac_missing
  )

na_table
anthro_vars <- c("hfaz", "wfaz", "wfhz", "baz", "muac")

cases_df <- PSFI_df_malnutrition %>%
  filter(case_control == 1)

anthro_summary <- lapply(anthro_vars, function(var) {

  x <- cases_df[[var]]

  outlier_info <- cases_df %>%
    select(all_of(var)) %>%
    identify_outliers(!!sym(var))

  tibble(
    measure = var,
    n = sum(!is.na(x)),
    n_missing = sum(is.na(x)),
    pct_missing = round(mean(is.na(x)) * 100, 2),
    n_outliers = sum(outlier_info$is.outlier, na.rm = TRUE),
    n_extreme_outliers = sum(outlier_info$is.extreme, na.rm = TRUE)
  )

}) %>%
  bind_rows()

anthro_summary
write.xlsx(
  list(
    Missing = na_table,
    Summary = anthro_summary
  ),
  file = "NA.xlsx")

1.5 Data check

PSFI_df_malnutrition %>%
  group_by(malnutrition, case_control) %>%
  summarize(
    malnutrition_missing = sum(is.na(malnutrition))
  )
 #103 mort_inhosp_missing  = controls
PSFI_df_malnutrition %>%
  filter (case_control == 1) %>%
  group_by(malnutrition_source) %>%
  summarize(
    count_malnut = n()
  )

# NA due to child with height of 20 cm (under WHO curve for wfh/wfl) and 38 days old (too young for MUAC)
PSFI_df_malnutrition %>%
  filter (case_control == 1) %>%
  group_by(malnutrition) %>%
  summarize(
    count_malnut = n()
  )
PSFI_df_malnutrition %>%
  drop_na(malnutrition, mort_inhosp) %>%
  ggplot(aes(x = factor(malnutrition))) +
  geom_bar() +
  labs(
    x = "Malnutrition",
    y = "N"
  )

NA
PSFI_df_malnutrition%>%
  filter (case_control == 1) %>%
  count(malnutrition, mort_inhosp) %>%
  group_by(malnutrition) %>%
  mutate(prop = n / sum(n))
PSFI_df_malnutrition %>%
  drop_na(mort_inhosp, malnutrition) %>% #only cases & minus the one previously mentioned NA
  ggplot +
  (aes(x = factor(malnutrition), fill = factor(mort_inhosp))) +
  geom_bar(stat = "count", position = "fill") +
  labs(
    x = "Malnutrition",
    y = "Proportion",
    fill = "Mortality"
  )

PSFI_df_malnutrition %>%
  count(malnutrition, case_control) %>%
  group_by(malnutrition) %>%
  mutate(prop = n / sum(n))
PSFI_df_malnutrition %>%
  drop_na(malnutrition) %>%
  ggplot +
  (aes(x = factor(malnutrition), fill = factor(case_control))) +
  geom_bar(stat = "count", position = "fill") +
  labs(
    x = "Malnutrition",
    y = "Proportion",
    fill = "Case/Control"
  )

PSFI_df_malnutrition %>%

ggplot +
  (aes(x = whz, y = wfhz)) +
  geom_point(alpha = 0.5) +
  geom_abline(slope = 1, intercept = 0, linetype = "dashed") +
    stat_cor(method = "pearson") +
  theme_minimal()

PSFI_df_malnutrition %>%

ggplot +
  (aes(x = waz, y = wfaz)) +
  geom_point(alpha = 0.5) +
  geom_abline(slope = 1, intercept = 0, linetype = "dashed") +
    stat_cor(method = "pearson") +
  theme_minimal()

write.xlsx(PSFI_df_malnutrition, file = "PSFI_final_malnutrition.xlsx")
LS0tDQp0aXRsZTogIlIgTm90ZWJvb2siDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQojIDEuIERlZmluaW5nIG1hbG51dHJpdGlvbg0KDQojIyAxLjEuIFByZXJlcXVpc2l0ZXMNCg0KYGBge3J9DQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkoenNjb3JlcikNCmxpYnJhcnkocmVhZHIpDQpsaWJyYXJ5KGRwbHlyKQ0KbGlicmFyeSAobHVicmlkYXRlKQ0KbGlicmFyeSAoZ2dwbG90MikNCmxpYnJhcnkgKHJtYXJrZG93bikNCmxpYnJhcnkob3Blbnhsc3gpDQpsaWJyYXJ5KHdyaXRleGwpDQpsaWJyYXJ5KHJzdGF0aXgpDQpsaWJyYXJ5KGVlcHRvb2xzKQ0KbGlicmFyeShnZ3B1YnIpDQpsaWJyYXJ5KHJlYWR4bCkNCmBgYA0KDQpgYGB7cn0NClBTRklfZGZfbWFsbnV0cml0aW9uIDwtIHJlYWRfeGxzeCgiQmVuX2N1dF80XzI3Lnhsc3giKQ0KYGBgDQoNCmBgYHtyfQ0KU3lzLnNldGVudihMQU5HVUFHRSA9ICJlbiIpDQpgYGANCg0KIyMgMS4yLiBBbnRocm9wcm9tZXRyaWMgYW5hbHlzaXMNCg0KYGBge3J9DQojIENSRUFURSBORVcgQ0FURUdPUlkgVEhBVCBDQUxDVUxBVEVTIEFHRSBJTiBZRUFSUyBCQVNFRCBPTiBBR0UgSU4gREFZUw0KUFNGSV9kZl9tYWxudXRyaXRpb24gPC0gUFNGSV9kZl9tYWxudXRyaXRpb24gJT4lDQogIG11dGF0ZShhZ2VfeWVhcnMgPSBhZ2VfZGF5c19leGFjdCAvIDM2NS4yNSkNCg0Kc3VtbWFyeShQU0ZJX2RmX21hbG51dHJpdGlvbiRhZ2VfeWVhcnMpDQpgYGANCg0KYGBge3J9DQojIENSRUFURVMgQSBTVU1NQVJZIE9GIENBU0VTIChodD1oZWlnaHQsIHd0PXdlaWdodCwgYWdlX3llYXJzPSBhZ2UgaW4geWVhcnMsIG11YWMpDQpQU0ZJX2RmX21hbG51dHJpdGlvbiAlPiUNCiAgZmlsdGVyKGNhc2VfY29udHJvbCA9PSAxKSAlPiUNCiAgc2VsZWN0KGh0LCB3dCwgYWdlX3llYXJzLCBtdWFjKSAlPiUNCiAgc3VtbWFyeSgpDQpgYGANCg0KYGBge3J9DQojIENSRUFURVMgQSBISVNUT0dSQU0gQU5EIEJPWFBMT1QgT0YgSEVJR0hUIChDQVNFUykNCmxheW91dChtYXQgPSBtYXRyaXgoYygxLDIpLDIsMSwgYnlyb3c9VFJVRSksICBoZWlnaHQgPSBjKDEsOCkpDQpwYXIobWFyPWMoMCwgMy4xLCAxLjEsIDIuMSkpDQpib3hwbG90KFBTRklfZGZfbWFsbnV0cml0aW9uJGh0W1BTRklfZGZfbWFsbnV0cml0aW9uJGNhc2VfY29udHJvbCA9PSAxXSAsIGhvcml6b250YWw9VFJVRSAsIHlsaW09YygwLDIwMCksIHhheHQ9Im4iICwgY29sPXJnYigwLjgsMC44LDAsMC41KSAsIGZyYW1lPUYpDQpwYXIobWFyPWMoNCwgMy4xLCAxLjEsIDIuMSkpDQpoaXN0KFBTRklfZGZfbWFsbnV0cml0aW9uJGh0W1BTRklfZGZfbWFsbnV0cml0aW9uJGNhc2VfY29udHJvbCA9PSAxXQ0KICAgICAsIGJyZWFrcz00MCAsIGNvbD1yZ2IoMSwwLjgsMC44LDEpICwgYm9yZGVyPUYgLCBtYWluPSIiICwgeGxhYj0iSGVpZ2h0IChjbSkiLCB4bGltPWMoMCwyMDApKQ0KYGBgDQoNCmBgYHtyfQ0KIyBDUkVBVEVTIEEgSElTVE9HUkFNIEFORCBCT1hQTE9UIE9GIFdFSUdIVCAoQ0FTRVMpDQpsYXlvdXQobWF0ID0gbWF0cml4KGMoMSwyKSwyLDEsIGJ5cm93PVRSVUUpLCAgaGVpZ2h0ID0gYygxLDgpKQ0KIHBhcihtYXI9YygwLCAzLjEsIDEuMSwgMi4xKSkNCmJveHBsb3QoUFNGSV9kZl9tYWxudXRyaXRpb24kd3RbUFNGSV9kZl9tYWxudXRyaXRpb24kY2FzZV9jb250cm9sID09IDFdICwgaG9yaXpvbnRhbD1UUlVFICwgeWxpbT1jKDAsNzUpLCB4YXh0PSJuIiAsIGNvbD1yZ2IoMC44LDAuOCwwLDAuNSkgLCBmcmFtZT1GKQ0KcGFyKG1hcj1jKDQsIDMuMSwgMS4xLCAyLjEpKQ0KaGlzdChQU0ZJX2RmX21hbG51dHJpdGlvbiR3dFtQU0ZJX2RmX21hbG51dHJpdGlvbiRjYXNlX2NvbnRyb2wgPT0gMV0NCiAgICAgLCBicmVha3M9NDAgLCBjb2w9cmdiKDEsMC44LDAuOCwxKSAsIGJvcmRlcj1GICwgbWFpbj0iIiAsIHhsYWI9IldlaWdodCAoa2cpIiwgeGxpbT1jKDAsNzUpKQ0KYGBgDQoNCmBgYHtyfQ0KIyBDUkVBVEVTIEEgSElTVE9HUkFNIEFORCBCT1hQTE9UIE9GIE1VQUMgKENBU0VTKQ0KIyMgQkxVRSBMSU5FIE9VVExJTkVTIE1PREVSQVRFIE1BTE5VVFJJVElPTiAoMTIuNWNtKQ0KIyMgUkVEIExJTkUgT1VUTElORVMgU0VWRVJFIE1BTE5VVFJJVElPTiAoMTEuNWNtKQ0KbGF5b3V0KG1hdCA9IG1hdHJpeChjKDEsMiksMiwxLCBieXJvdz1UUlVFKSwgIGhlaWdodCA9IGMoMSw4KSkNCnBhcihtYXI9YygwLCAzLjEsIDEuMSwgMi4xKSkNCmJveHBsb3QoUFNGSV9kZl9tYWxudXRyaXRpb24kbXVhY1tQU0ZJX2RmX21hbG51dHJpdGlvbiRjYXNlX2NvbnRyb2wgPT0gMV0gLCBob3Jpem9udGFsPVRSVUUgLCB5bGltPWMoNSwzMCksIHhheHQ9Im4iICwgY29sPXJnYigwLjgsMC44LDAsMC41KSAsIGZyYW1lPUYpDQpwYXIobWFyPWMoNCwgMy4xLCAxLjEsIDIuMSkpDQpoaXN0KFBTRklfZGZfbWFsbnV0cml0aW9uJG11YWNbUFNGSV9kZl9tYWxudXRyaXRpb24kY2FzZV9jb250cm9sID09IDFdDQogICAgICwgYnJlYWtzPTIwICwgY29sPXJnYigxLDAuOCwwLjgsMSkgLCBib3JkZXI9RiAsIG1haW49IiIgLCB4bGFiPSJNaWQtdXBwZXIgYXJtIGNpcmN1bWZlcmVuY2UgKGNtKSIsIHhsaW09Yyg1LDMwKSkNCmFibGluZSh2ID0gMTEuNSwgY29sID0gInJlZCIsIGx3ZCA9IDIsIGx0eSA9IDIpICAgIyBzZXZlcmUNCmFibGluZSh2ID0gMTIuNSwgY29sID0gImJsdWUiLCBsd2QgPSAyLCBsdHkgPSAyKSAgIyBtb2RlcmF0ZQ0KYGBgDQoNCmBgYHtyfQ0KIyBISVNUT0dSQU0gQU5EIEJPWFBMT1QgT0YgQUdFIChDQVNFUykNCmxheW91dChtYXQgPSBtYXRyaXgoYygxLDIpLDIsMSwgYnlyb3c9VFJVRSksICBoZWlnaHQgPSBjKDEsOCkpDQogcGFyKG1hcj1jKDAsIDMuMSwgMS4xLCAyLjEpKQ0KYm94cGxvdChQU0ZJX2RmX21hbG51dHJpdGlvbiRhZ2VfeWVhcnNbUFNGSV9kZl9tYWxudXRyaXRpb24kY2FzZV9jb250cm9sID09IDFdICwgaG9yaXpvbnRhbD1UUlVFICwgeWxpbT1jKDAsMTUpLCB4YXh0PSJuIiAsIGNvbD1yZ2IoMC44LDAuOCwwLDAuNSkgLCBmcmFtZT1GKQ0KcGFyKG1hcj1jKDQsIDMuMSwgMS4xLCAyLjEpKQ0KaGlzdChQU0ZJX2RmX21hbG51dHJpdGlvbiRhZ2VfeWVhcnNbUFNGSV9kZl9tYWxudXRyaXRpb24kY2FzZV9jb250cm9sID09IDFdLCBicmVha3M9NDAgLCBjb2w9cmdiKDEsMC44LDAuOCwxKSAsIGJvcmRlcj1GICwgbWFpbj0iIiAsIHhsYWI9IkFnZSAoeWVhcnMpIiwgeGxpbT1jKDAsMTUpKQ0KYGBgDQoNCiMjIDEuMy4gWi1zY29yZXINCg0KYGBge3J9DQojIENSRUFURVMgQSBORVcgQ0FURUdPUlkgREVGSU5JTkcgU0VYIEFTIDEvMiwgSU5TVEVBRCBPRiAwLzEgKE5FQ0VTU0FSWSBGT1IgWlNDT1JFUiBQQUNLQUdFKQ0KUFNGSV9kZl9tYWxudXRyaXRpb24gPC0gUFNGSV9kZl9tYWxudXRyaXRpb24gJT4lDQogIG11dGF0ZShzZXhfd2hvID0gaWZfZWxzZShzZXggPT0gMSwgMSwgMikpDQoNCnN1bW1hcnkoUFNGSV9kZl9tYWxudXRyaXRpb24kc2V4X3dobykNCmBgYA0KDQpgYGB7cn0NCiMgQ1JFQVRFUyBBIE5FVyBDQVRFR09SWSBDQUxDVUxBVElORyBBR0UgSU4gTU9OVEhTIEJBU0VEIE9OIEFHRSBJTiBEQVlTDQpQU0ZJX2RmX21hbG51dHJpdGlvbiA8LSBQU0ZJX2RmX21hbG51dHJpdGlvbiAlPiUNCiAgbXV0YXRlKGFnZV9tb250aHMgPSBhZ2VfZGF5c19leGFjdCAvIDMwLjQzNzUpDQoNCnN1bW1hcnkoUFNGSV9kZl9tYWxudXRyaXRpb24kYWdlX21vbnRocykNCmBgYA0KDQpgYGB7cn0NCiMgQ1JFQVRFUyBBIE5FVyBDQVRFR09SWSAoQUdFPDZNID0gMCwgQUdFIDZNIC0gNUogPSAxLCBBR0UgPiA1SiA9IDIpDQpQU0ZJX2RmX21hbG51dHJpdGlvbiA8LSBQU0ZJX2RmX21hbG51dHJpdGlvbiAlPiUNCiAgbXV0YXRlKA0KICAgIGFnZV9ncm91cCA9IGNhc2Vfd2hlbigNCiAgICAgIGFnZV9tb250aHMgPCA2IH4gMEwsDQogICAgICBhZ2VfbW9udGhzID49IDYgJiBhZ2VfeWVhcnMgPCA1IH4gMUwsDQogICAgICBhZ2VfeWVhcnMgPj0gNSB+IDJMLA0KICAgICAgVFJVRSB+IE5BX2ludGVnZXJfDQogICAgKQ0KICApDQoNCmBgYA0KDQpgYGB7cn0NCiMgWlNDT1JFUiBQQUNLQUdFIENBTENVTEFURVMgWlNDT1JFIE9GIFdFSUdIVCBGT1IgTEVOR1RIICh3Zmx6KSwgV0VJR0hUIEZPUiBBR0UgKHdmYXopLCBIRUlHSFQgRk9SIEFHRSAoaGZheiksIFdFSUdIVCBGT1IgSEVJR0hUICh3Zmh6KSwgQk1JIEZPUiBBR0UgKGJheikNClBTRklfZGZfbWFsbnV0cml0aW9uIDwtIFBTRklfZGZfbWFsbnV0cml0aW9uICU+JQ0KICBtdXRhdGUoDQogICAgd2ZseiA9IGFkZFdHU1IoDQogICAgICBkYXRhID0gLiwNCiAgICAgIHNleCA9ICJzZXhfd2hvIiwNCiAgICAgIGZpcnN0UGFydCA9ICJ3dCIsDQogICAgICBzZWNvbmRQYXJ0ID0gImh0IiwNCiAgICAgIGluZGV4ID0gIndmbCINCiAgICApJHdmbHosDQogICAgDQogICAgd2ZheiA9IGFkZFdHU1IoDQogICAgICBkYXRhID0gLiwNCiAgICAgIHNleCA9ICJzZXhfd2hvIiwNCiAgICAgIGZpcnN0UGFydCA9ICJ3dCIsDQogICAgICBzZWNvbmRQYXJ0ID0gImFnZV9kYXlzX2V4YWN0IiwNCiAgICAgIGluZGV4ID0gIndmYSINCiAgICApJHdmYXosDQogICAgDQogICAgaGZheiA9IGFkZFdHU1IoDQogICAgICBkYXRhID0gLiwNCiAgICAgIHNleCA9ICJzZXhfd2hvIiwNCiAgICAgIGZpcnN0UGFydCA9ICJodCIsDQogICAgICBzZWNvbmRQYXJ0ID0gImFnZV9kYXlzX2V4YWN0IiwNCiAgICAgIGluZGV4ID0gImhmYSINCiAgICApJGhmYXosDQoNCiAgICB3Zmh6ID0gYWRkV0dTUigNCiAgICAgIGRhdGEgPSAuLA0KICAgICAgc2V4ID0gInNleF93aG8iLA0KICAgICAgZmlyc3RQYXJ0ID0gInd0IiwNCiAgICAgIHNlY29uZFBhcnQgPSAiaHQiLA0KICAgICAgaW5kZXggPSAid2ZoIg0KICAgICkkd2ZoeiwNCiAgICANCiAgICBiYXogPSBhZGRXR1NSKA0KICAgICAgZGF0YSA9IC4sDQogICAgICBzZXggPSAic2V4X3dobyIsDQogICAgICBmaXJzdFBhcnQgPSAid3QiLA0KICAgICAgc2Vjb25kUGFydCA9ICJodCIsDQogICAgICB0aGlyZFBhcnQgPSAiYWdlX2RheXNfZXhhY3QiLA0KICAgICAgaW5kZXggPSAiYmZhIg0KICAgICkkYmZheg0KICApDQpgYGANCg0KYGBge3J9DQojIEFTU0lHTlMgWi1TQ09SRSBUTyBNVUFDIEJBU0VEIE9OIFRIRSAxMS41ICYgMTIuNUNNIExJTUlUUywgVEhJUyBJUyBBIFBST1hZIFNJTkNFIExBVEVSIEEgWi1TQ09SRSBPRiAwIFdJTEwgRVFVQUwgTk8gTUFMTlVUUklUSU9OLCAtMi41IFdJTEwgRVFVQUwgTU9ERVJBVEUgTUFMTlVUUklUSU9OIEFORCAtNCBXSUxMIEVRVUFMIFNFVkVSRSBNQUxOVVRSSVRJT04NClBTRklfZGZfbWFsbnV0cml0aW9uIDwtIFBTRklfZGZfbWFsbnV0cml0aW9uICU+JQ0KICBtdXRhdGUoDQogICAgbXVhY3ogPSBjYXNlX3doZW4oDQogICAgICBtdWFjID49IDEyLjUgfiAwLA0KICAgICAgbXVhYyA+PSAxMS41ICYgbXVhYyA8IDEyLjUgfiAtMi41LA0KICAgICAgbXVhYyA8IDExLjUgfiAtNCwNCiAgICAgIFRSVUUgfiBOQV9yZWFsXw0KICAgICkNCiAgKQ0KYGBgDQoNCmBgYHtyfQ0KIyBDUkVBVEUgTUFMTlVUUklUSU9OIFpTQ09SRSBCQVNFRCBPTiBXRkhMLCBCQVosIE1VQUNaICh0byBiZSBkZWZpbmVkIGxhdGVyKQ0KUFNGSV9kZl9tYWxudXRyaXRpb24gPC0gUFNGSV9kZl9tYWxudXRyaXRpb24gJT4lDQogIG11dGF0ZSgNCiAgICB6c2NvcmVfdW5pZmllZCA9IGNhc2Vfd2hlbigNCiAgICAgIGFnZV9ncm91cCA9PSAxICYgaHQgPj0gNDUgJiBodCA8IDY1IH4gd2ZseiwNCiAgICAgIGFnZV9ncm91cCA9PSAxICYgaHQgPj0gNjUgJiBodCA8IDEyMCB+IHdmaHosDQogICAgICBhZ2VfZ3JvdXAgPT0gMSAmIChodCA8IDQ1IHwgaHQgPj0gMTIwIHwgaXMubmEoaHQpKSB+IG11YWN6LA0KICAgICAgYWdlX2dyb3VwID09IDIgfiBiYXosDQogICAgICBUUlVFIH4gTkFfcmVhbF8NCiAgICApDQogICkNCmBgYA0KDQpgYGB7cn0NCiMgQ1JFQVRFIE1BTE5VVFJJVElPTiBDQVRFR09SWSBCQVNFRCBPTiBQUkVWSU9VUyBaIFNDT1JFDQpQU0ZJX2RmX21hbG51dHJpdGlvbiA8LSBQU0ZJX2RmX21hbG51dHJpdGlvbiAlPiUNCiAgbXV0YXRlKA0KICAgIG1hbG51dHJpdGlvbiA9IGNhc2Vfd2hlbigNCiAgaXMubmEoenNjb3JlX3VuaWZpZWQpIH4gTkFfaW50ZWdlcl8sDQogIHpzY29yZV91bmlmaWVkIDwgLTMgfiAyTCwNCiAgenNjb3JlX3VuaWZpZWQgPj0gLTMgJiB6c2NvcmVfdW5pZmllZCA8IC0yIH4gMUwsDQogIFRSVUUgfiAwTA0KICAgICkNCiAgKQ0KYGBgDQoNCmBgYHtyfQ0KIyBBREQgQSBNQUxOVVRSSVRJT04gU09VUkNFIFNPIFdFIEtOT1cgV0hJQ0ggQU5USFJPUE9NRVRSSUMgTUVBU1VSRSBJUyBCRUlORyBVU0VEIFRPIERFRklORSBNQUxOVVRSSVRJT04NClBTRklfZGZfbWFsbnV0cml0aW9uIDwtIFBTRklfZGZfbWFsbnV0cml0aW9uICU+JQ0KICBtdXRhdGUoDQogICAgbWFsbnV0cml0aW9uX3NvdXJjZSA9IGNhc2Vfd2hlbigNCiAgICAgIGFnZV9ncm91cCA9PSAxICYgaHQgPj0gNDUgJiBodCA8IDY1ICB+ICJXRkwiLA0KICAgICAgYWdlX2dyb3VwID09IDEgJiBodCA+PSA2NSAmIGh0IDwgMTIwIH4gIldGSCIsDQogICAgICBhZ2VfZ3JvdXAgPT0gMSAmIChodCA8IDQ1IHwgaHQgPj0gMTIwIHwgaXMubmEoaHQpKSB+ICJNVUFDIiwNCiAgICAgIGFnZV9ncm91cCA9PSAyIH4gIkJGQSIsDQogICAgICBUUlVFIH4gTkFfY2hhcmFjdGVyXw0KICAgICkNCiAgKQ0KYGBgDQoNCiMjIDEuNCBaIHNjb3JlIGNoZWNrDQoNCmBgYHtyfQ0Kc3Vic2V0X3dmYXogPC0gUFNGSV9kZl9tYWxudXRyaXRpb24gJT4lDQogIGZpbHRlcihjYXNlX2NvbnRyb2wgPT0gMSkgJT4lDQogIHB1bGwod2ZheikNCg0KIyBTVU1NQVJZIE9GIFdFSUdIVCBGT1IgQUdFIFotU0NPUkUgKENBU0VTKQ0Kc3VtbWFyeShzdWJzZXRfd2ZheikNCiMgTlVNQkVSIE9GIENBU0VTIElOIFdFSUdIVCBGT1IgQUdFIFogU0NPUkUNCmxlbmd0aChzdWJzZXRfd2ZheikNCmBgYA0KDQpgYGB7cn0NCnN1YnNldF93ZmF6MSA8LSBQU0ZJX2RmX21hbG51dHJpdGlvbiAlPiUNCiAgZmlsdGVyKGNhc2VfY29udHJvbCA9PSAxKSAlPiUNCiAgaWRlbnRpZnlfb3V0bGllcnMod2ZheikgJT4lDQogIHB1bGwod2ZheikNCg0KIyBOVU1CRVIgT0YgT1VUTElFUlMgSU4gV0VJR0hUIEZPUiBBR0UgWiBTQ09SRQ0KbGVuZ3RoKHN1YnNldF93ZmF6MSkNCmBgYA0KDQpgYGB7cn0NCnN1YnNldF9oZmF6IDwtIFBTRklfZGZfbWFsbnV0cml0aW9uICU+JQ0KICBmaWx0ZXIoY2FzZV9jb250cm9sID09IDEpICU+JQ0KICBwdWxsKGhmYXopDQoNCiMgU1VNTUFSWSBPRiBIRUlHSFQgRk9SIEFHRSBaIFNDT1JFIChDQVNFUykNCnN1bW1hcnkoc3Vic2V0X2hmYXopDQojIE5VTUJFUiBPRiBDQVNFUyBJTiBIRUlHSFQgRk9SIEFHRSBaIFNDT1JFDQpsZW5ndGgoc3Vic2V0X2hmYXopDQpgYGANCg0KYGBge3J9DQpzdWJzZXRfaGZhejEgPC0gUFNGSV9kZl9tYWxudXRyaXRpb24gJT4lDQogIGZpbHRlcihjYXNlX2NvbnRyb2wgPT0gMSkgJT4lDQogIGlkZW50aWZ5X291dGxpZXJzKGhmYXopICU+JQ0KICBwdWxsKGhmYXopDQoNCiMgTlVNQkVSIE9GIE9VVExJRVJTIEZPUiBIRUlHSFQgRk9SIEFHRSBaIFNDT1JFDQpsZW5ndGgoc3Vic2V0X2hmYXoxKQ0KYGBgDQoNCmBgYHtyfQ0Kc3Vic2V0X3dmaHogPC0gUFNGSV9kZl9tYWxudXRyaXRpb24gJT4lDQogIGZpbHRlcihjYXNlX2NvbnRyb2wgPT0gMSkgJT4lDQogIHB1bGwod2ZoeikNCg0KIyBTVU1NQVJZIE9GIFdFSUdIVCBGT1IgSEVJR0hUIFogU0NPUkUgKENBU0VTKQ0Kc3VtbWFyeShzdWJzZXRfd2ZoeikNCiMgTlVNQkVSIE9GIENBU0VTIElOIFdFSUdIVCBGT1IgSEVJR0hUIFogU0NPUkUNCmxlbmd0aChzdWJzZXRfd2ZoeikNCmBgYA0KDQpgYGB7cn0NCnN1YnNldF93Zmh6MSA8LSBQU0ZJX2RmX21hbG51dHJpdGlvbiAlPiUNCiAgZmlsdGVyKGNhc2VfY29udHJvbCA9PSAxKSAlPiUNCiAgaWRlbnRpZnlfb3V0bGllcnMod2ZoeikgJT4lDQogIHB1bGwod2ZoeikNCg0KIyBOVU1CRVIgT0YgT1VUTElFUlMgSU4gV0VJR0hUIEZPUiBIRUlHSFQgWiBTQ09SRQ0KbGVuZ3RoKHN1YnNldF93Zmh6MSkNCmBgYA0KDQpgYGB7cn0NCnN1YnNldF9iYXogPC0gUFNGSV9kZl9tYWxudXRyaXRpb24gJT4lDQogIGZpbHRlcihjYXNlX2NvbnRyb2wgPT0gMSkgJT4lDQogIHB1bGwoYmF6KQ0KDQojIFNVTU1BUlkgT0YgQk1JIEZPUiBBR0UgWiBTQ09SRSAoQ0FTRVMpDQpzdW1tYXJ5KHN1YnNldF9iYXopDQojIE5VTUJFUiBPRiBDQVNFUyBJTiBCTUkgRk9SIEFHRSBaIFNDT1JFDQpsZW5ndGgoc3Vic2V0X2JheikNCmBgYA0KDQpgYGB7cn0NCnN1YnNldF9iYXoxIDwtIFBTRklfZGZfbWFsbnV0cml0aW9uICU+JQ0KICBmaWx0ZXIoY2FzZV9jb250cm9sID09IDEpICU+JQ0KICBpZGVudGlmeV9vdXRsaWVycyhiYXopICU+JQ0KICBwdWxsKGJheikNCg0KIyBOVU1CRVIgT0YgT1VUTElFUlMgSU4gQk1JIEZPUiBBR0UgWiBTQ09SRQ0KbGVuZ3RoKHN1YnNldF9iYXoxKQ0KYGBgDQoNCmBgYHtyfQ0Kc3Vic2V0X211YWMgPC0gUFNGSV9kZl9tYWxudXRyaXRpb24gJT4lDQogIGZpbHRlcihhZ2VfZ3JvdXAgPT0gMSAmIGNhc2VfY29udHJvbCA9PSAxKSAlPiUNCiAgcHVsbChtdWFjKQ0KDQojIFNVTU1BUlkgT0YgTVVBQyAoQ0FTRVMsIDYtNTkgTU9OVEhTKQ0Kc3VtbWFyeShzdWJzZXRfbXVhYykNCiMgTlVNQkVSIE9GIENBU0VTIElOIE1VQUMNCmxlbmd0aChzdWJzZXRfbXVhYykNCmBgYA0KDQpgYGB7cn0NCnN1YnNldF9tdWFjMSA8LSBQU0ZJX2RmX21hbG51dHJpdGlvbiAlPiUNCiAgZmlsdGVyKGFnZV9ncm91cCA9PSAxICYgY2FzZV9jb250cm9sID09IDEpICU+JQ0KICBpZGVudGlmeV9vdXRsaWVycyhtdWFjKSAlPiUNCiAgcHVsbChtdWFjKQ0KDQojIE5VTUJFUiBPRiBPVVRMSUVSUyBJTiBNVUFDDQpsZW5ndGgoc3Vic2V0X211YWMxKQ0KYGBgDQoNCmBgYHtyfQ0KIyBDUkVBVEVTIEJPWFBMT1QgQU5EIEhJU1RPR1JBTSBGT1IgV0VJR0hUIEZPUiBIRUlHSFQgWiBTQ09SRSAoQ0FTRVMpDQpsYXlvdXQobWF0ID0gbWF0cml4KGMoMSwyKSwyLDEsIGJ5cm93PVRSVUUpLCAgaGVpZ2h0ID0gYygxLDgpKQ0KIHBhcihtYXI9YygwLCAzLjEsIDEuMSwgMi4xKSkNCmJveHBsb3QoUFNGSV9kZl9tYWxudXRyaXRpb24kd2ZoeltQU0ZJX2RmX21hbG51dHJpdGlvbiRjYXNlX2NvbnRyb2wgPT0gMV0gLCBob3Jpem9udGFsPVRSVUUgLCB5bGltPWMoLTExLDQzKSwgeGF4dD0ibiIgLCBjb2w9cmdiKDAuOCwwLjgsMCwwLjUpICwgZnJhbWU9RikNCnBhcihtYXI9Yyg0LCAzLjEsIDEuMSwgMi4xKSkNCmhpc3QoUFNGSV9kZl9tYWxudXRyaXRpb24kd2ZoeltQU0ZJX2RmX21hbG51dHJpdGlvbiRjYXNlX2NvbnRyb2wgPT0gMV0NCiAgICAgLCBicmVha3M9NTAgLCBjb2w9cmdiKDEsMC44LDAuOCwxKSAsIGJvcmRlcj1GICwgbWFpbj0iIiAsIHhsYWI9IldlaWdodC1mb3ItaGVpZ2h0ICh6LXNjb3JlKSIsIHhsaW09YygtMTEsNDMpKQ0KYGBgDQoNCmBgYHtyfQ0KIyBDUkVBVEVTIEJPWFBMT1QgQU5EIEhJU1RPR1JBTSBPRiBXRUlHSFQgRk9SIEFHRSAoQ0FTRVMpDQpsYXlvdXQobWF0ID0gbWF0cml4KGMoMSwyKSwyLDEsIGJ5cm93PVRSVUUpLCAgaGVpZ2h0ID0gYygxLDgpKQ0KIHBhcihtYXI9YygwLCAzLjEsIDEuMSwgMi4xKSkNCmJveHBsb3QoUFNGSV9kZl9tYWxudXRyaXRpb24kd2ZheltQU0ZJX2RmX21hbG51dHJpdGlvbiRjYXNlX2NvbnRyb2wgPT0gMV0gLCBob3Jpem9udGFsPVRSVUUgLCB5bGltPWMoLTgsMTEpLCB4YXh0PSJuIiAsIGNvbD1yZ2IoMC44LDAuOCwwLDAuNSkgLCBmcmFtZT1GKQ0KcGFyKG1hcj1jKDQsIDMuMSwgMS4xLCAyLjEpKQ0KaGlzdChQU0ZJX2RmX21hbG51dHJpdGlvbiR3ZmF6W1BTRklfZGZfbWFsbnV0cml0aW9uJGNhc2VfY29udHJvbCA9PSAxXQ0KICAgICAsIGJyZWFrcz01MCAsIGNvbD1yZ2IoMSwwLjgsMC44LDEpICwgYm9yZGVyPUYgLCBtYWluPSIiICwgeGxhYj0iV2VpZ2h0LWZvci1hZ2UgKHotc2NvcmUpIiwgeGxpbT1jKC04LDExKSkNCmBgYA0KDQpgYGB7cn0NCiMgQ1JFQVRFUyBCT1hQTE9UIEFORCBISVNUT0dSQU0gT0YgQk1JIEZPUiBBR0UgKENBU0VTKQ0KbGF5b3V0KG1hdCA9IG1hdHJpeChjKDEsMiksMiwxLCBieXJvdz1UUlVFKSwgIGhlaWdodCA9IGMoMSw4KSkNCiBwYXIobWFyPWMoMCwgMy4xLCAxLjEsIDIuMSkpDQpib3hwbG90KFBTRklfZGZfbWFsbnV0cml0aW9uJGJheltQU0ZJX2RmX21hbG51dHJpdGlvbiRjYXNlX2NvbnRyb2wgPT0gMV0gLCBob3Jpem9udGFsPVRSVUUgLCB5bGltPWMoLTEzLDUxKSwgeGF4dD0ibiIgLCBjb2w9cmdiKDAuOCwwLjgsMCwwLjUpICwgZnJhbWU9RikNCnBhcihtYXI9Yyg0LCAzLjEsIDEuMSwgMi4xKSkNCmhpc3QoUFNGSV9kZl9tYWxudXRyaXRpb24kYmF6W1BTRklfZGZfbWFsbnV0cml0aW9uJGNhc2VfY29udHJvbCA9PSAxXQ0KICAgICAsIGJyZWFrcz01MCAsIGNvbD1yZ2IoMSwwLjgsMC44LDEpICwgYm9yZGVyPUYgLCBtYWluPSIiICwgeGxhYj0iQk1JLWZvci1hZ2UgKHotc2NvcmUpIiwgeGxpbT1jKC0xMyw1MSkpDQpgYGANCg0KYGBge3J9DQojIENSRUFURSBCT1hQTE9UIEFORCBISVNUT0dSQU0gT0YgSEVJR0hUIEZPUiBBR0UgDQpsYXlvdXQobWF0ID0gbWF0cml4KGMoMSwyKSwyLDEsIGJ5cm93PVRSVUUpLCAgaGVpZ2h0ID0gYygxLDgpKQ0KIHBhcihtYXI9YygwLCAzLjEsIDEuMSwgMi4xKSkNCmJveHBsb3QoUFNGSV9kZl9tYWxudXRyaXRpb24kaGZheltQU0ZJX2RmX21hbG51dHJpdGlvbiRjYXNlX2NvbnRyb2wgPT0gMV0gLCBob3Jpem9udGFsPVRSVUUgLCB5bGltPWMoLTE5LDQ1KSwgeGF4dD0ibiIgLCBjb2w9cmdiKDAuOCwwLjgsMCwwLjUpICwgZnJhbWU9RikNCnBhcihtYXI9Yyg0LCAzLjEsIDEuMSwgMi4xKSkNCmhpc3QoUFNGSV9kZl9tYWxudXRyaXRpb24kaGZheltQU0ZJX2RmX21hbG51dHJpdGlvbiRjYXNlX2NvbnRyb2wgPT0gMV0NCiAgICAgLCBicmVha3M9NTAgLCBjb2w9cmdiKDEsMC44LDAuOCwxKSAsIGJvcmRlcj1GICwgbWFpbj0iIiAsIHhsYWI9IkhlaWdodC1mb3ItYWdlICh6LXNjb3JlKSIsIHhsaW09YygtMTksNDUpKQ0KYGBgDQoNCmBgYHtyfQ0KIyBDUkVBVEVTIEhJU1RPR1JBTSBBTkQgQk9YUExPVCBPRiBNVUFDIChDQVNFUywgNi01OSBNT05USFMpDQpsYXlvdXQobWF0ID0gbWF0cml4KGMoMSwyKSwyLDEsIGJ5cm93PVRSVUUpLCAgaGVpZ2h0ID0gYygxLDgpKQ0KcGFyKG1hcj1jKDAsIDMuMSwgMS4xLCAyLjEpKQ0KYm94cGxvdChQU0ZJX2RmX21hbG51dHJpdGlvbiRtdWFjW1BTRklfZGZfbWFsbnV0cml0aW9uJGNhc2VfY29udHJvbCA9PSAxXSAsIGhvcml6b250YWw9VFJVRSAsIHlsaW09Yyg1LDMwKSwgeGF4dD0ibiIgLCBjb2w9cmdiKDAuOCwwLjgsMCwwLjUpICwgZnJhbWU9RikNCnBhcihtYXI9Yyg0LCAzLjEsIDEuMSwgMi4xKSkNCmhpc3QoUFNGSV9kZl9tYWxudXRyaXRpb24kbXVhY1tQU0ZJX2RmX21hbG51dHJpdGlvbiRjYXNlX2NvbnRyb2wgPT0gMV0NCiAgICAgLCBicmVha3M9MjAgLCBjb2w9cmdiKDEsMC44LDAuOCwxKSAsIGJvcmRlcj1GICwgbWFpbj0iIiAsIHhsYWI9Ik1pZC11cHBlciBhcm0gY2lyY3VtZmVyZW5jZSAoY20pIiwgeGxpbT1jKDUsMzApKQ0KYWJsaW5lKHYgPSAxMS41LCBjb2wgPSAicmVkIiwgbHdkID0gMiwgbHR5ID0gMikgICAjIHNldmVyZQ0KYWJsaW5lKHYgPSAxMi41LCBjb2wgPSAiYmx1ZSIsIGx3ZCA9IDIsIGx0eSA9IDIpICAjIG1vZGVyYXRlDQpgYGANCg0KYGBge3J9DQojIE1BS0VTIEEgVEFCTEUgT0YgT1VUTElFUlMgRk9SIFdFSUdIVCBGT1IgSEVJR0hUDQp3Zmh6X291dGxpZXJzIDwtIFBTRklfZGZfbWFsbnV0cml0aW9uICU+JQ0KICBmaWx0ZXIoY2FzZV9jb250cm9sID09IDEpICU+JQ0KICBpZGVudGlmeV9vdXRsaWVycyh3Zmh6KSAlPiUNCiAgc2VsZWN0KHJlY29yZF9pZCwgd3QsIGh0LCB3Zmh6LCBhZ2VfbW9udGhzLCBpcy5vdXRsaWVyLCBpcy5leHRyZW1lKQ0KDQp3Zmh6X291dGxpZXJzDQpgYGANCmBgYHtyfQ0KIyBNQUtFUyBBIFRBQkxFIE9GIE9VVExJRVJTIEZPUiBXRUlHSFQgRk9SIEFHRQ0Kd2Zhel9vdXRsaWVycyA8LSBQU0ZJX2RmX21hbG51dHJpdGlvbiAlPiUNCiAgZmlsdGVyKGNhc2VfY29udHJvbCA9PSAxKSAlPiUNCiAgaWRlbnRpZnlfb3V0bGllcnMod2ZheikgJT4lDQogIHNlbGVjdChyZWNvcmRfaWQsaHQsIHd0LCBhZ2VfbW9udGhzLCB3ZmF6LCBpcy5vdXRsaWVyLCBpcy5leHRyZW1lKQ0KDQp3ZmF6X291dGxpZXJzDQpgYGANCmBgYHtyfQ0KIyBNQUtFUyBBIFRBQkxFIE9GIE9VVExJRVJTIEZPUiBIRUlHSFQgRk9SIEFHRQ0KaGZhel9vdXRsaWVycyA8LSBQU0ZJX2RmX21hbG51dHJpdGlvbiAlPiUNCiAgZmlsdGVyKGNhc2VfY29udHJvbCA9PSAxKSAlPiUNCiAgaWRlbnRpZnlfb3V0bGllcnMoaGZheikgJT4lDQogIHNlbGVjdChyZWNvcmRfaWQsIGh0LCB3dCwgYWdlX21vbnRocywgaGZheiwgaXMub3V0bGllciwgaXMuZXh0cmVtZSkNCg0KaGZhel9vdXRsaWVycw0KYGBgDQpgYGB7cn0NCiMgTUFLRVMgQSBUQUJMRSBPRiBPVVRMSUVSUyBGT1IgQk1JIEZPUiBBR0UNCmJhel9vdXRsaWVycyA8LSBQU0ZJX2RmX21hbG51dHJpdGlvbiAlPiUNCiAgZmlsdGVyKGNhc2VfY29udHJvbCA9PSAxKSAlPiUNCiAgaWRlbnRpZnlfb3V0bGllcnMoYmF6KSAlPiUNCiAgc2VsZWN0KHJlY29yZF9pZCwgd3QsIGh0LCBiYXosIGFnZV9tb250aHMsIGlzLm91dGxpZXIsIGlzLmV4dHJlbWUpDQoNCmJhel9vdXRsaWVycw0KYGBgDQoNCmBgYHtyfQ0KIyBNQUtFUyBBIFRBQkxFIE9GIE9VVExJRVJTIEZPUiBNVUFDDQoNCm11YWNfb3V0bGllcnMgPC0gUFNGSV9kZl9tYWxudXRyaXRpb24gJT4lDQogIGZpbHRlcihhZ2VfZ3JvdXAgPT0gMSAmIGNhc2VfY29udHJvbCA9PSAxKSAlPiUNCiAgaWRlbnRpZnlfb3V0bGllcnMobXVhYykgJT4lDQogIHNlbGVjdChyZWNvcmRfaWQsIGh0LCB3dCwgYWdlX21vbnRocywgbXVhYywgaXMub3V0bGllciwgaXMuZXh0cmVtZSkNCg0KbXVhY19vdXRsaWVycw0KYGBgDQoNCmBgYHtyfQ0KIyBDUkVBVEVTIEFOIEVYQ0VMIEZJTEUgT0YgQUxMIE9VVExJRVIgVEFCTEVTDQp3cml0ZS54bHN4KA0KICBsaXN0KA0KICAgIFdGSFogPSB3Zmh6X291dGxpZXJzLA0KICAgIFdGQVogPSB3ZmF6X291dGxpZXJzLA0KICAgIEhBWiA9IGhmYXpfb3V0bGllcnMsDQogICAgTVVBQyA9IG11YWNfb3V0bGllcnMsIA0KICAgIEJBWiA9IGJhel9vdXRsaWVycw0KICApLA0KICBmaWxlID0gImFudGhyb3BvbWV0cmljX291dGxpZXJzLnhsc3giDQopDQpgYGANCg0KYGBge3J9DQojIENSRUFURSBBIFRBQkxFIE9GIEFMTCBOQSdTDQpuYV90YWJsZSA8LSBQU0ZJX2RmX21hbG51dHJpdGlvbiAlPiUNCiAgZmlsdGVyKGNhc2VfY29udHJvbCA9PSAxKSAlPiUNCiAgbXV0YXRlKA0KICAgIGhmYXpfbWlzc2luZyA9IGlzLm5hKGhmYXopLA0KICAgIHdmYXpfbWlzc2luZyAgPSBpcy5uYSh3ZmF6KSwNCiAgICB3Zmh6X21pc3NpbmcgPSBpcy5uYSh3Zmh6KSwgDQogICAgbXVhY19taXNzaW5nID0gaXMubmEgKG11YWMpLCANCiAgICBiYXpfbWlzc2luZyA9IGlzLm5hIChiYXopDQogICkgJT4lDQogIGZpbHRlcihoZmF6X21pc3NpbmcgfCB3ZmF6X21pc3NpbmcgfCB3Zmh6X21pc3NpbmcgfCBiYXpfbWlzc2luZyB8IG11YWNfbWlzc2luZykgJT4lDQogIHNlbGVjdCgNCiAgICByZWNvcmRfaWQsDQogICAgaHQsDQogICAgd3QsDQogICAgYWdlX21vbnRocywNCiAgICBoZmF6LA0KICAgIHdmYXosDQogICAgd2ZoeiwNCiAgICBiYXosDQogICAgbXVhYywgDQogICAgaGZhel9taXNzaW5nLA0KICAgIHdmYXpfbWlzc2luZywNCiAgICB3Zmh6X21pc3NpbmcsIA0KICAgIGJhel9taXNzaW5nLA0KICAgIG11YWNfbWlzc2luZw0KICApDQoNCm5hX3RhYmxlDQpgYGANCg0KYGBge3J9DQphbnRocm9fdmFycyA8LSBjKCJoZmF6IiwgIndmYXoiLCAid2ZoeiIsICJiYXoiLCAibXVhYyIpDQoNCmNhc2VzX2RmIDwtIFBTRklfZGZfbWFsbnV0cml0aW9uICU+JQ0KICBmaWx0ZXIoY2FzZV9jb250cm9sID09IDEpDQoNCmFudGhyb19zdW1tYXJ5IDwtIGxhcHBseShhbnRocm9fdmFycywgZnVuY3Rpb24odmFyKSB7DQoNCiAgeCA8LSBjYXNlc19kZltbdmFyXV0NCg0KICBvdXRsaWVyX2luZm8gPC0gY2FzZXNfZGYgJT4lDQogICAgc2VsZWN0KGFsbF9vZih2YXIpKSAlPiUNCiAgICBpZGVudGlmeV9vdXRsaWVycyghIXN5bSh2YXIpKQ0KDQogIHRpYmJsZSgNCiAgICBtZWFzdXJlID0gdmFyLA0KICAgIG4gPSBzdW0oIWlzLm5hKHgpKSwNCiAgICBuX21pc3NpbmcgPSBzdW0oaXMubmEoeCkpLA0KICAgIHBjdF9taXNzaW5nID0gcm91bmQobWVhbihpcy5uYSh4KSkgKiAxMDAsIDIpLA0KICAgIG5fb3V0bGllcnMgPSBzdW0ob3V0bGllcl9pbmZvJGlzLm91dGxpZXIsIG5hLnJtID0gVFJVRSksDQogICAgbl9leHRyZW1lX291dGxpZXJzID0gc3VtKG91dGxpZXJfaW5mbyRpcy5leHRyZW1lLCBuYS5ybSA9IFRSVUUpDQogICkNCg0KfSkgJT4lDQogIGJpbmRfcm93cygpDQoNCmFudGhyb19zdW1tYXJ5DQpgYGANCg0KDQpgYGB7cn0NCndyaXRlLnhsc3goDQogIGxpc3QoDQogICAgTWlzc2luZyA9IG5hX3RhYmxlLA0KICAgIFN1bW1hcnkgPSBhbnRocm9fc3VtbWFyeQ0KICApLA0KICBmaWxlID0gIk5BLnhsc3giKQ0KYGBgDQoNCg0KIyMgMS41IERhdGEgY2hlY2sNCg0KYGBge3J9DQpQU0ZJX2RmX21hbG51dHJpdGlvbiAlPiUNCiAgZ3JvdXBfYnkobWFsbnV0cml0aW9uLCBjYXNlX2NvbnRyb2wpICU+JQ0KICBzdW1tYXJpemUoDQogICAgbWFsbnV0cml0aW9uX21pc3NpbmcgPSBzdW0oaXMubmEobWFsbnV0cml0aW9uKSkNCiAgKQ0KICMxMDMgbW9ydF9pbmhvc3BfbWlzc2luZyAgPSBjb250cm9scw0KYGBgDQoNCmBgYHtyfQ0KUFNGSV9kZl9tYWxudXRyaXRpb24gJT4lDQogIGZpbHRlciAoY2FzZV9jb250cm9sID09IDEpICU+JQ0KICBncm91cF9ieShtYWxudXRyaXRpb25fc291cmNlKSAlPiUNCiAgc3VtbWFyaXplKA0KICAgIGNvdW50X21hbG51dCA9IG4oKQ0KICApDQoNCiMgTkEgZHVlIHRvIGNoaWxkIHdpdGggaGVpZ2h0IG9mIDIwIGNtICh1bmRlciBXSE8gY3VydmUgZm9yIHdmaC93ZmwpIGFuZCAzOCBkYXlzIG9sZCAodG9vIHlvdW5nIGZvciBNVUFDKQ0KYGBgDQoNCmBgYHtyfQ0KUFNGSV9kZl9tYWxudXRyaXRpb24gJT4lDQogIGZpbHRlciAoY2FzZV9jb250cm9sID09IDEpICU+JQ0KICBncm91cF9ieShtYWxudXRyaXRpb24pICU+JQ0KICBzdW1tYXJpemUoDQogICAgY291bnRfbWFsbnV0ID0gbigpDQogICkNCmBgYA0KDQpgYGB7cn0NClBTRklfZGZfbWFsbnV0cml0aW9uICU+JQ0KICBkcm9wX25hKG1hbG51dHJpdGlvbiwgbW9ydF9pbmhvc3ApICU+JQ0KICBnZ3Bsb3QoYWVzKHggPSBmYWN0b3IobWFsbnV0cml0aW9uKSkpICsNCiAgZ2VvbV9iYXIoKSArDQogIGxhYnMoDQogICAgeCA9ICJNYWxudXRyaXRpb24iLA0KICAgIHkgPSAiTiINCiAgKQ0KICAgIA0KYGBgDQoNCmBgYHtyfQ0KUFNGSV9kZl9tYWxudXRyaXRpb24lPiUNCiAgZmlsdGVyIChjYXNlX2NvbnRyb2wgPT0gMSkgJT4lDQogIGNvdW50KG1hbG51dHJpdGlvbiwgbW9ydF9pbmhvc3ApICU+JQ0KICBncm91cF9ieShtYWxudXRyaXRpb24pICU+JQ0KICBtdXRhdGUocHJvcCA9IG4gLyBzdW0obikpDQpgYGANCg0KYGBge3J9DQpQU0ZJX2RmX21hbG51dHJpdGlvbiAlPiUNCiAgZHJvcF9uYShtb3J0X2luaG9zcCwgbWFsbnV0cml0aW9uKSAlPiUgI29ubHkgY2FzZXMgJiBtaW51cyB0aGUgb25lIHByZXZpb3VzbHkgbWVudGlvbmVkIE5BDQogIGdncGxvdCArDQogIChhZXMoeCA9IGZhY3RvcihtYWxudXRyaXRpb24pLCBmaWxsID0gZmFjdG9yKG1vcnRfaW5ob3NwKSkpICsNCiAgZ2VvbV9iYXIoc3RhdCA9ICJjb3VudCIsIHBvc2l0aW9uID0gImZpbGwiKSArDQogIGxhYnMoDQogICAgeCA9ICJNYWxudXRyaXRpb24iLA0KICAgIHkgPSAiUHJvcG9ydGlvbiIsDQogICAgZmlsbCA9ICJNb3J0YWxpdHkiDQogICkNCmBgYA0KDQpgYGB7cn0NClBTRklfZGZfbWFsbnV0cml0aW9uICU+JQ0KICBjb3VudChtYWxudXRyaXRpb24sIGNhc2VfY29udHJvbCkgJT4lDQogIGdyb3VwX2J5KG1hbG51dHJpdGlvbikgJT4lDQogIG11dGF0ZShwcm9wID0gbiAvIHN1bShuKSkNCmBgYA0KDQpgYGB7cn0NClBTRklfZGZfbWFsbnV0cml0aW9uICU+JQ0KICBkcm9wX25hKG1hbG51dHJpdGlvbikgJT4lDQogIGdncGxvdCArDQogIChhZXMoeCA9IGZhY3RvcihtYWxudXRyaXRpb24pLCBmaWxsID0gZmFjdG9yKGNhc2VfY29udHJvbCkpKSArDQogIGdlb21fYmFyKHN0YXQgPSAiY291bnQiLCBwb3NpdGlvbiA9ICJmaWxsIikgKw0KICBsYWJzKA0KICAgIHggPSAiTWFsbnV0cml0aW9uIiwNCiAgICB5ID0gIlByb3BvcnRpb24iLA0KICAgIGZpbGwgPSAiQ2FzZS9Db250cm9sIg0KICApDQpgYGANCg0KYGBge3J9DQpQU0ZJX2RmX21hbG51dHJpdGlvbiAlPiUNCg0KZ2dwbG90ICsNCiAgKGFlcyh4ID0gd2h6LCB5ID0gd2ZoeikpICsNCiAgZ2VvbV9wb2ludChhbHBoYSA9IDAuNSkgKw0KICBnZW9tX2FibGluZShzbG9wZSA9IDEsIGludGVyY2VwdCA9IDAsIGxpbmV0eXBlID0gImRhc2hlZCIpICsNCiAgICBzdGF0X2NvcihtZXRob2QgPSAicGVhcnNvbiIpICsNCiAgdGhlbWVfbWluaW1hbCgpDQpgYGANCmBgYHtyfQ0KUFNGSV9kZl9tYWxudXRyaXRpb24gJT4lDQoNCmdncGxvdCArDQogIChhZXMoeCA9IHdheiwgeSA9IHdmYXopKSArDQogIGdlb21fcG9pbnQoYWxwaGEgPSAwLjUpICsNCiAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSAwLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArDQogICAgc3RhdF9jb3IobWV0aG9kID0gInBlYXJzb24iKSArDQogIHRoZW1lX21pbmltYWwoKQ0KYGBgDQoNCg0KYGBge3J9DQp3cml0ZS54bHN4KFBTRklfZGZfbWFsbnV0cml0aW9uLCBmaWxlID0gIlBTRklfZmluYWxfbWFsbnV0cml0aW9uLnhsc3giKQ0KYGBgDQo=