Introduction

A three-year nutrition programme has been implemented in Liberia by the Ministry of Health and UNICEF aimed at tackling child undernutrition in the country. Funded by Power of Nutrition and UNICEF UK, the programme has been implemented across 15 counties in Liberia starting from January 2017 up to December 2019. The overall aim of the programme is to improve the coverage of direct nutrition interventions or what is commonly termed nutrition-specific interventions, i.e. interventions or programmes that address the immediate determinants of foetal and child nutrition and development — adequate food and nutrient intake, feeding, caregiving and parenting practices, and low burden of infectious diseases. The current programme supports the following specific key interventions: 1) treatment of severe acute malnutrition (SAM) within the community-based management of acute malnutrition (CMAM) programme for children 6-59 months; 2) vitamin A supplementation for children 6-59 months; 3) promotion of appropriate infant and young child feeding (IYCF) practices among pregnant or lactating women; 4) multiple micronutrient powder (MNP) supplementation for children 6-23 months; and, 5) iron and folic acid (IFA) supplementation for pregnant women.

To assess the programme’s progress towards its overall aim, two coverage assessments have been implemented - the first at the halfway point of the programme and the second at the end. Only two programme areas were selected for the assessments: Urban Montserrado (Greater Monrovia) district and Grand Bassa county.

This document reports on the results of the coverage assessment of the CMAM programme for treating SAM children 6-59 months old.

Description of the sample

Children by sex and location

The following table presents the number of children in the sample by sex.

sample_by_sex_table <- table(nut$sex, useNA = "ifany")

sample_by_sex_table
## 
##    1    2 <NA> 
## 6471 6239  101

There were a total of 6471 male children and 6239 female children in the survey sample. There were also a total of 101 children whose parents refused to participate in the survey.

The following table presents the number of children in the sample by location.

sample_by_location_table <- table(nut$county, useNA = "ifany")

sample_by_location_table
## 
##       Grand Bassa Urban Montserrado 
##              5355              7456

There were a total of 5355 children from Grand Bassa and 7456 children from Urban Montserrado.

The following table presents the number of children in the sample by sex and by location.

sample_by_sex_location_table <- table(nut$county, nut$sex, useNA = "ifany")

sample_by_sex_location_table
##                    
##                        1    2 <NA>
##   Grand Bassa       2709 2615   31
##   Urban Montserrado 3762 3624   70

In Grand Bassa, there were a total of 2709 male children and 2615 female children in the survey sample. A total of 31 children in Grand Bassa had parents who refused to participate in the survey.

In Urban Montserrado, there were a total of 3762 male children and 3624 female children in the survey sample. A total of 70 children in Urban Montserrado had parents who refused to participate in the survey.

Age distribution of children in the sample

Following is a barplot of ages of the children in the sample.

barplot(
  height = table(nut$county, nut$age),
  beside = FALSE,
  legend.text = TRUE,
  main = "Distribution of Ages of Children by Location",
  xlab = "Age (months)",
  ylab = "n"
)
Distribution of ages of children by location

Distribution of ages of children by location

Following is a histogram of ages of children in the sample.

ggplot(
  data = nut, 
  aes(
    x = age, 
    fill = factor(sex, labels = c("Male", "Female")),
    group = factor(sex, labels = c("Male", "Female"))
  )
) +
  geom_histogram(alpha = 0.5, bins = 60) +
  scale_x_continuous(n.breaks = 24) +
  facet_wrap( ~ county, ncol = 2) +
  labs(
    title = "Distribution of Ages of Children by Sex and Location", 
    x = "Age (months)", y = "n",
    fill = NULL
  ) +
  theme_bw() +
  theme(legend.position = "top")
Distribution of ages of children

Distribution of ages of children

Nutrition screening coverage

The following data processing was first performed on the data before continuing on with the analysis.

## Subset data: Transform variables of interest into table nut1 
nut1 <- nut %>% select(survey_round,county,sex,muac_screen,oedema_screen)

## Clean data in subset: Change 99 to NA 
### Clean data only after having made subset nut1. 
### Code don't work if data is cleaned in nut and then subset. ???
nut1$muac_screen <- ifelse(nut1$muac_screen == 99, NA, nut1$muac_screen)
nut1$muac_screen[nut$muac_screen == 1] <- "Y"
nut1$muac_screen[nut$muac_screen == 2] <- "N"

nut1$oedema_screen <- ifelse(nut1$oedema_screen == 99, NA, nut1$oedema_screen)
nut1$oedema_screen[nut$oedema_screen == 1] <- "Y"
nut1$oedema_screen[nut$oedema_screen == 2] <- "N"

nut1$sex <- ifelse(nut1$sex == 1, "Male", "Female")

MUAC screening coverage

The following table presents MUAC screening coverage by survey round.

nut1 %>% 
  tbl_summary(
    by = survey_round, 
    include = muac_screen,
    statistic = list(all_continuous() ~ "{mean} ({sd})")
  )
Characteristic Baseline, N = 6,2891 Endline, N = 6,5221
muac_screen
    N 4,556 (96%) 6,026 (96%)
    Y 208 (4.4%) 230 (3.7%)
    Unknown 1,525 266
1 n (%)

The endline data shows LITTLE if NO improvement in MUAC screening coverage among the sample children vs. baseline. Percentage of children had MUAC screened (answered 1 to survey) stayed relatively the same from baseline to endline. The percentage of children without MUAC screening went up from 73% to 93%, mainly due to children from the NA population at baseline moving over. This may suggest a better awareness in this population related to not having gotten MUAC screening (?).

The following table presents MUAC screening coverage by survey round and by sex of the child.

nut1 %>% 
  tbl_strata(
    strata = sex, 
    .tbl_fun = ~ .x %>% 
      tbl_summary(
        by = survey_round,
        include = muac_screen,
        statistic = list(all_continuous() ~ "{mean} ({sd})")
      )
  )
Characteristic Female Male NA
Baseline, N = 3,0481 Endline, N = 3,1911 Baseline, N = 3,1861 Endline, N = 3,2851 Baseline, N = 551 Endline, N = 461
muac_screen 0 (NA%) 0 (NA%)
    N 2,215 (96%) 2,995 (97%) 2,341 (95%) 3,031 (96%)
    Y 86 (3.7%) 102 (3.3%) 122 (5.0%) 128 (4.1%)
    Unknown 747 94 723 126 55 46
1 n (%)

There is no apparent difference in MUAC screening coverage between girls and boys in the sample. Or, gender doesn’t seem to influence MUAC screening in children.

The following table presents MUAC screening coverage by survey round and by survey location.

nut1 %>% 
  tbl_strata(
    strata=county,
    .tbl_fun = ~ .x %>% 
      tbl_summary(
        by = survey_round,
        include = muac_screen,
        statistic = list(all_continuous() ~ "{mean} ({sd})")
      )
   )
Characteristic Grand Bassa Urban Montserrado
Baseline, N = 2,4191 Endline, N = 2,9361 Baseline, N = 3,8701 Endline, N = 3,5861
muac_screen
    N 1,863 (98%) 2,742 (96%) 2,693 (94%) 3,284 (97%)
    Y 37 (1.9%) 124 (4.3%) 171 (6.0%) 106 (3.1%)
    Unknown 519 70 1,006 196
1 n (%)

The data suggests an increase in children receiving MUAC screening at endline in Grand Bassa vs. in Urban Montserrado. In fact, it seems that the coverage of MUAC screening in Urban Montserrado decreases (from 4.5% at baseline to 3% at endline). This suggests Grand Bassa to have done a better job in MUAC screening than Montserrado. However, neither location has a significant improvement in MUAC screening coverage. The overall trend of increasing in no screening is observed here but this is again due to population who answered NA at baseline moving to answered no to screening at endline.

Oedema screening coverage

The following table presents oedema screening by survey round.

nut1 %>% 
  tbl_summary(
    by = survey_round, 
    include = oedema_screen,
    statistic = list(all_continuous() ~ "{mean} ({sd})")
  )
Characteristic Baseline, N = 6,2891 Endline, N = 6,5221
oedema_screen
    N 4,586 (97%) 5,647 (97%)
    Y 140 (3.0%) 155 (2.7%)
    Unknown 1,563 720
1 n (%)

Similar to MUAC screening, the endline data shows little if no improvement in oedema screening coverage among the sample children vs. baseline. The same observation applies for movement of populations who answered NA for oedema screening at baseline to answering no to Oedema screening at endline. This may suggest again a better sense of awareness and may serve as a reflection of public engagement working?

The following table presents oedema screening by survey round and by sex.

nut1 %>% 
  tbl_strata(
    strata = sex,
    .tbl_fun = ~ .x %>% 
      tbl_summary(
        by = survey_round,
        include = oedema_screen, 
        statistic = list(all_continuous() ~ "{mean} ({sd})")
      )
  )
Characteristic Female Male NA
Baseline, N = 3,0481 Endline, N = 3,1911 Baseline, N = 3,1861 Endline, N = 3,2851 Baseline, N = 551 Endline, N = 461
oedema_screen 0 (NA%) 0 (NA%)
    N 2,227 (98%) 2,818 (98%) 2,359 (97%) 2,829 (97%)
    Y 55 (2.4%) 64 (2.2%) 85 (3.5%) 91 (3.1%)
    Unknown 766 309 742 365 55 46
1 n (%)

The data suggests oedema screening improves SLIGHTLY in females vs. in males. However, this difference does not seem big enough to call for gender as a determinant in improvement of oedema screening. p-value may be needed to determine if the difference is significant.

The following table presents oedema screening by survey round and by survey location.

nut1 %>% 
  tbl_strata(
    strata = county,
    .tbl_fun = ~ .x %>% 
      tbl_summary(
        by = survey_round,
        include = oedema_screen,
        statistic = list(all_continuous() ~ "{mean} ({sd})")
      )
  )
Characteristic Grand Bassa Urban Montserrado
Baseline, N = 2,4191 Endline, N = 2,9361 Baseline, N = 3,8701 Endline, N = 3,5861
oedema_screen
    N 1,879 (100%) 2,463 (97%) 2,707 (95%) 3,184 (98%)
    Y 7 (0.4%) 82 (3.2%) 133 (4.7%) 73 (2.2%)
    Unknown 533 391 1,030 329
1 n (%)

The same trend is observed here for oedema screening. The data suggests an increase in oedema screening coverage in Grand Bassa but a decrease in Urban Montserrado, suggesting Grand Bassa doing a better job.

The following table presents all the variables of interest with p-values for chi-squared test comparing results for each category.

nut1 %>% 
  tbl_summary(
    by = survey_round, 
    statistic = list(all_continuous() ~ "{mean} ({sd})")
  ) %>% 
  add_p() 
Characteristic Baseline, N = 6,2891 Endline, N = 6,5221 p-value2
county <0.001
    Grand Bassa 2,419 (38%) 2,936 (45%)
    Urban Montserrado 3,870 (62%) 3,586 (55%)
sex 0.7
    Female 3,048 (49%) 3,191 (49%)
    Male 3,186 (51%) 3,285 (51%)
    Unknown 55 46
muac_screen 0.066
    N 4,556 (96%) 6,026 (96%)
    Y 208 (4.4%) 230 (3.7%)
    Unknown 1,525 266
oedema_screen 0.4
    N 4,586 (97%) 5,647 (97%)
    Y 140 (3.0%) 155 (2.7%)
    Unknown 1,563 720
1 n (%)
2 Pearson's Chi-squared test

Pearson’s Chi-squared test at the end help to show that difference between endline and baseline is indeed statistically significant. But this may be driven mainly by the number answering no to screening increasing between baseline and endline, not a reflection of how well the screening has increased between the 2 time points.

Prevalence of acute undernutrition

MAM cases by sex and location

The following steps were taken to process the data to be able to tabulate the number of MAM cases by sex and location in the sample.

### Assigning male and female to sex
SEX <- ifelse(nut$sex == 1, "Male", "Female") 

### Assigning yes and No to oedema
OEDEMA <- ifelse(nut$oedema == 1, "Yes", "No") 

### Assigning nut$county to COUNTY
COUNTY <- nut$county 

### Assigning the total number of children between 6-59 to Den
Den <- sum(nut$age >= 6 & nut$age < 60, na.rm = TRUE) 

## NUMBER AND PREVALENCE OF MAM CASES

### Assigning the moderate MUAC criteria for children between 6-60 for Mod_MUAC
Mod_MUAC <- with(
  nut, 
  muac >= 11.5 & muac < 12.5 & age >= 6 & age < 60
) 

### Assigning MAM to table
MAM <- table(SEX, OEDEMA, Mod_MUAC, COUNTY, useNA = "ifany")  

### CREATING A DATA FRAME FOR TOTAL MAM CASES
#data.frame(MAM) 

### TOTAL MAM FEMALES IN URBAN MONTSERRADO
MAM_num_F1 <- MAM["Female", "No", "TRUE","Urban Montserrado"] 

### TOTAL MAM FEMALES IN GRAND BASSA
MAM_num_F2 <- MAM["Female", "No", "TRUE","Grand Bassa"] 

### TOTAL MAM MALES IN URBAN MONTSERRADO
MAM_num_M1 <- MAM["Male", "No", "TRUE","Urban Montserrado"]

### TOTAL MAM MALES IN GRAND BASSA
MAM_num_M2 <- MAM ["Male", "No", "TRUE","Grand Bassa"] 

MAM_number <- data.frame(
  Sex = c("Female", "Female", "Male", "Male"),
  County = c("Urban Montserrado", "Grand Bassa", "Urban Montserrado", "Grand Bassa"), 
  Number_of_MAM = c(MAM_num_F1, MAM_num_F2, MAM_num_M1, MAM_num_M2)
) 

## CREATING DATA FRAME FOR MAM CASES BY SEX AND COUNTY

### CREATING A TABLE BY SEX AND COUNTY
MAM_number_table <- xtabs(
  Number_of_MAM ~ Sex + County, data = MAM_number
) 

### VIEW MAM CASES BY SEX AND COUNTY
#MAM_number_table 

### PREVALENCE OF FEMALE MAM IN URBAN MONTSERRADO
Prev1_MAM <- MAM["Female", "No", "TRUE","Urban Montserrado"] / Den 

### PREVALENCE OF FEMALE MAM IN GRAND BASSA
Prev2_MAM <- MAM["Female", "No", "TRUE","Grand Bassa"] / Den 

### PREVALENCE OF MALE MAM IN URBAN MONTSERRADO
Prev3_MAM <- MAM["Male", "No", "TRUE","Urban Montserrado"] / Den 

### PREVALENCE OF FEMALE MAM IN GRAND BASSA
Prev4_MAM <- MAM["Male", "No", "TRUE","Grand Bassa"] / Den 

### PREVALENCE OF MAM CASES BY SEX AND COUNTY
MAM_prevalences <- data.frame(
  Sex = c("Female", "Female", "Male", "Male"),
  County = c("Urban Montserrado", "Grand Bassa", "Urban Montserrado", "Grand Bassa"),
  Prevalence_of_MAM = c(Prev1_MAM, Prev2_MAM, Prev3_MAM, Prev4_MAM)
) 

## CREATING TABLE FOR MAM PREVALENCE BY SEX AND COUNTY

MAM_prevalences_table <- xtabs(
  Prevalence_of_MAM ~ Sex + County, data = MAM_prevalences
) 

### VIEW MAM PREVALENCE CASES BY SEX AND COUNTY
#MAM_prevalences_table 

The following table presents the number of MAM cases by sex and by location.

### CREATING A TABLE BY SEX AND COUNTY
MAM_number_table
##         County
## Sex      Grand Bassa Urban Montserrado
##   Female          80                69
##   Male            45                41

In Grand Bassa, there were 80 female MAM cases and 45 male MAM cases. In Urban Montserrado, there were 69 female MAM cases and 41 male MAM cases.

The following table presents the prevalence of MAM by sex and by location.

### VIEW MAM PREVALENCE CASES BY SEX AND COUNTY
MAM_prevalences_table 
##         County
## Sex      Grand Bassa Urban Montserrado
##   Female 0.006321612       0.005452390
##   Male   0.003555907       0.003239826

Of the total MAM cases in the sample, 0.63% were females from Grand Bassa, 0.36% were males from Grand Bassa, 0.55% were females from Urban Montserrado and 0.32% were males from Urban Montserrado.

SAM cases by sex and location

The following steps were taken to process the data to be able to tabulate the number of SAM cases by sex and location in the sample.

### Assigning the severe MUAC criteria for children between 6-59 for Sev_MUAC
Sev_MUAC <- with(nut, age >= 6 & age < 60 & muac < 11.5) 

### Assigning SAM
SAM <- table (SEX, OEDEMA, Sev_MUAC, COUNTY, useNA = "ifany") 

#data.frame(SAM)

### TOTAL SAM FEMALES IN URBAN MONTSERRADO
SAM_num_F1 <- SAM["Female", "No", "TRUE","Urban Montserrado"] 

### TOTAL SAM FEMALES IN GRAND BASSA
SAM_num_F2 <- SAM["Female", "No", "TRUE","Grand Bassa"] 

### TOTAL SAM MALES IN URBAN MONTSERRADO
SAM_num_M1 <- SAM["Male", "No", "TRUE","Urban Montserrado"] 

### TOTAL SAM MALES IN GRAND BASSA
SAM_num_M2 <- SAM["Male", "No", "TRUE","Grand Bassa"] 

### CREATING DATA FRAME FOR SAM CASES BY SEX AND COUNTY
SAM_number <- data.frame(
  Sex = c("Female", "Female", "Male", "Male"),
  County = c("Urban Montserrado", "Grand Bassa", "Urban Montserrado", "Grand Bassa"), 
  Number_of_SAM = c(SAM_num_F1, SAM_num_F2, SAM_num_M1, SAM_num_M2)
)

## CREATING TABLE FOR SAM CASES BY SEX AND COUNTY
SAM_number_table <- xtabs(
  Number_of_SAM ~ Sex + County, data = SAM_number
) 

### VIEW SAM CASES BY SEX AND COUNTY
#SAM_number_table 

### PREVALENCE OF FEMALE SAM IN URBAN MONTSERRADO
Prev1_SAM <- SAM["Female", "Yes", "TRUE","Urban Montserrado"] / Den 

### PREVALENCE OF FEMALE SAM IN GRAND BASSA
Prev2_SAM <- SAM["Female", "No", "TRUE","Grand Bassa"] / Den 

### PREVALENCE OF MALE SAM IN URBAN MONTSERRADO
Prev3_SAM <- SAM["Male", "No", "TRUE","Urban Montserrado"] / Den 

### PREVALENCE OF MALE SAM IN GRAND BASSA
Prev4_SAM <- SAM["Male", "No", "TRUE","Grand Bassa"] / Den 

### PREVALENCE OF SAM CASES BY SEX AND COUNTY
SAM_prevalences <- data.frame(
  Sex = c("Female", "Female", "Male", "Male"),
  County = c("Urban Montserrado", "Grand Bassa", "Urban Montserrado", "Grand Bassa"),
  Prevalence_of_SAM = c(Prev1_SAM, Prev2_SAM, Prev3_SAM, Prev4_SAM)
) 

## CREATING TABLE FOR SAM PREVALENCE BY SEX AND COUNTY
SAM_prevalences_table <- xtabs(
  Prevalence_of_SAM ~ Sex + County, data = SAM_prevalences
) 

### VIEW SAM PREVALENCE BY SEX AND COUNTY
#SAM_prevalences_table

The following table presents the number of SAM cases by sex and by location.

SAM_number_table
##         County
## Sex      Grand Bassa Urban Montserrado
##   Female          22                27
##   Male            33                14

In Grand Bassa, there were 22 female SAM cases and 33 male SAM cases. In Urban Montserrado, there were 27 female SAM cases and 14 male SAM cases.

The following table presents the prevalence of SAM by sex and by location.

SAM_prevalences_table 
##         County
## Sex      Grand Bassa Urban Montserrado
##   Female 0.001738443       0.000000000
##   Male   0.002607665       0.001106282

Of the total SAM cases in the sample, 0.17% were females from Grand Bassa, 0.26% were males from Grand Bassa, 0% were females from Urban Montserrado and 0.11% were males from Urban Montserrado.

GAM cases by sex and location

The following steps were taken to process the data to be able to tabulate the number of GAM cases by sex and location in the sample.

## SAM OR MAM CASES:
MALNUTRITION <- ifelse(nut$muac < 11.5 | nut$oedema == 1, "SAM", "No SAM")

MALNUTRITION <- ifelse(
  nut$muac >= 11.5 & nut$muac < 12.5 & nut$oedema == 2, "MAM", MALNUTRITION
)

MALNUTRITION <- ifelse(MALNUTRITION == "No SAM", "not SAM or MAM", MALNUTRITION)

MALNUTRITION <- ifelse(nut$age >= 6 & nut$age < 60, MALNUTRITION, NA)

### CREATING A TABLE FOR EITHER MAM OR SAM CASES
final <- table(
  SEX, OEDEMA, MALNUTRITION, COUNTY, useNA = "ifany"
) 

### CREATING A DATA FRAME FOR TOTAL SAM OR MAM CASES
#data.frame(final) 

## NUMBER OF SAM OR MAM CASES

### TOTAL SAM OR MAM FEMALES IN URBAN MONTSERRADO
SAMorMAM_F1 <- final["Female", , c("MAM", "SAM"), "Urban Montserrado"] 

### TOTAL SAM OR MAM FEMALES IN GRAND BASSA
SAMorMAM_F2 <- final["Female", , c("MAM", "SAM"), "Grand Bassa"] 

### TOTAL SAM OR MAM MALES IN URBAN MONTSERRADO
SAMorMAM_M1 <- final["Male", , c("MAM", "SAM"), "Urban Montserrado"] 

### TOTAL SAM OR MAM FEMALES IN GRAND BASSA
SAMorMAM_M2 <- final["Male", , c("MAM", "SAM"), "Grand Bassa"] 

### CREATING A DATA FRAME FOR TOTAL SAM OR MAM CASES BY SEX AND COUNTY
SAMorMAM_number <- data.frame(
  Sex = c("Female", "Female", "Male", "Male"), 
  County = c("Urban Montserrado", "Grand Bassa", "Urban Montserrado", "Grand Bassa"), 
  Number_of_SAMorMAM = c(SAMorMAM_F1, SAMorMAM_F2, SAMorMAM_M1, SAMorMAM_M2)
) 

### CREATING A TABLE FOR SAM OR MAM CASES BY SEX AND COUNTY
SAMorMAM_number_table <- xtabs(
  Number_of_SAMorMAM ~ Sex + County, data = SAMorMAM_number
) 

### VIEW SAM OR MAM CASES BY SEX AND COUNTY
#SAMorMAM_number_table 

### PREVALENCE OF FEMALE MAM OR SAM CASES IN URBAN MONTSERRADO
Prev1_SAMorMAM <- final["Female", , c("MAM", "SAM"), "Urban Montserrado"] / Den 

### PREVALENCE OF FEMALE MAM OR SAM CASES IN GRAND BASSA
Prev2_SAMorMAM <- final["Female", , c("MAM", "SAM"), "Grand Bassa"] / Den 

### PREVALENCE OF MALE MAM OR SAM CASES IN URBAN MONTSERRADO
Prev3_SAMorMAM <- final["Female", , c("MAM", "SAM"), "Urban Montserrado"] / Den 

### PREVALENCE OF FEMALE MAM OR SAM CASES IN GRAND BASSA
Prev4_SAMorMAM <- final["Female", , c("MAM", "SAM"), "Grand Bassa"] / Den 

### CREATING A DATA FRAME FOR PREVALENCE OF SAM OR MAM CASES BY SEX AND COUNTY
SAMorMAM_prevalences <- data.frame(
  Sex = c("Female", "Female", "Male", "Male"),
  County = c("Urban Montserrado", "Grand Bassa", "Urban Montserrado", "Grand Bassa"),
  Prevalence_of_SAM = c(Prev1_SAMorMAM, Prev2_SAMorMAM, Prev3_SAMorMAM, Prev4_SAMorMAM)
) 

### CREATING A TABLE FOR PREVALENCE OF SAM OR MAM BY SEX AND COUNTY
SAMorMAM_prevalences_table <- xtabs(
  Prevalence_of_SAM ~ Sex + County, 
  data = SAMorMAM_prevalences
) 

### VIEW SAM OR MAM PREVALENCE BY SEX AND COUNTY
#SAMorMAM_prevalences_table 

The following table presents the number of GAM cases by sex and by location.

SAMorMAM_number_table
##         County
## Sex      Grand Bassa Urban Montserrado
##   Female          55               124
##   Male            41               139

In Grand Bassa, there were 55 female GAM cases and 41 male GAM cases. In Urban Montserrado, there were 124 female GAM cases and 139 male GAM cases.

The following table presents the prevalence of GAM by sex and by location.

SAMorMAM_prevalences_table 
##         County
## Sex      Grand Bassa Urban Montserrado
##   Female 0.003476887       0.011853023
##   Male   0.004267088       0.013749506

Of the total GAM cases in the sample, 0.35% were females from Grand Bassa, 0.43% were males from Grand Bassa, 1.19% were females from Urban Montserrado and 1.37% were males from Urban Montserrado.

Coverage of SAM treatment

Number of SAM cases found

The following table presents the number of cases of SAM found in the overall sample.

nut$sam[nut$age >= 6 & nut$age < 60 & (nut$muac >= 11.5 | nut$oedema == 2)] <- 'no'
nut$sam[nut$age >= 6 & nut$age < 60 & (nut$muac < 11.5 | nut$oedema == 1)] <-'yes'

sam_table <- table(nut$sam)

sam_table
## 
##    no   yes 
## 12531   124

There were a total of 124 SAM cases found in the overall sample.

The following table presents the number of SAM cases found in the sample by location.

sam_location_table <- table(nut$sam, nut$county)

sam_location_table
##      
##       Grand Bassa Urban Montserrado
##   no         5249              7282
##   yes          69                55

There were a total of 69 SAM cases found in Grand Bassa compared to 55 SAM cases found in Urban Montserrado.

The following table presents the number of SAM cases found in the sample by survey round.

sam_rounds_table <- table(nut$sam, nut$survey_round)

sam_rounds_table
##      
##       Baseline Endline
##   no      6136    6395
##   yes       51      73

There were a total of 51 SAM cases found at baseline survey round compared to 73 SAM cases found at endline survey round.

The following table presents the number of SAM cases found in the sample by location and survey round.

sam_location_rounds_table <- table(nut$sam, nut$survey_round, nut$county)

sam_location_rounds_table
## , ,  = Grand Bassa
## 
##      
##       Baseline Endline
##   no      2372    2877
##   yes       29      40
## 
## , ,  = Urban Montserrado
## 
##      
##       Baseline Endline
##   no      3764    3518
##   yes       22      33

In Grand Bassa, there were a total of 29 SAM cases found at baseline and 40 SAM cases found at endline.

In Urban Montserrado, there were a total of 22 SAM cases found at baseline and 33 SAM cases found at endline.

Case-finding effectiveness

The following table presents the case-finding effectiveness of the CMAM programme overall.

##      
##           1     2
##   no    111 12420
##   yes    16   108
##         1         2 
## 0.1290323 0.8709677

The case-finding effectiveness of the CMAM programme overall was at 0.13%.

The following table presents the case-finding effectiveness of the CMAM programme by location.

samcovloc <- table(nut$sam, nut$cov_status, nut$county)

samcovloc
## , ,  = Grand Bassa
## 
##      
##          1    2
##   no    22 5227
##   yes    4   65
## 
## , ,  = Urban Montserrado
## 
##      
##          1    2
##   no    89 7193
##   yes   12   43
## prop.table(samcovloc) * 100     This code gives proportion of SAM cases in the
                                ## programme by all children in the sample
                                ## which is not consistent with the coverage
                                ## estimator

## This code calculates the proportions for only those children who are SAM
## and in the programme for each location
samcov_grandbassa <- prop.table(samcovloc[2, , 1]) * 100

samcov_grandbassa
##         1         2 
##  5.797101 94.202899
samcov_urbanmontserrado <- prop.table(samcovloc[2, , 2]) * 100

samcov_urbanmontserrado
##        1        2 
## 21.81818 78.18182

In Grand Bassa, the case-finding effectiveness of the CMAM programme was at 5.8%. In Urban Montserrado, the case-finding effectiveness of the CMAM programme was at 21.82%.



LS0tCnRpdGxlOiAiTGliZXJpYSBDb21tdW5pdHktYmFzZWQgTWFuYWdlbWVudCBvZiBBY3V0ZSBNYWxudXRyaXRpb24gQ292ZXJhZ2UgQXNzZXNzbWVudCIKc3VidGl0bGU6ICJBIHJlcG9ydCBwcmVwYXJlZCBmb3IgdGhlIExpYmVyaWEgTWluaXN0cnkgb2YgSGVhbHRoIGFuZCBVTklDRUYgTGliZXJpYSIKYXV0aG9yOiAKICAgIC0gbmFtZTogTVNjIGluIEludGVybmF0aW9uYWwgSGVhbHRoIGFuZCBUcm9waWNhbCBNZWRpY2luZSBDbGFzcyAyMDIzCiAgICAtIG5hbWU6IFVuaXZlcnNpdHkgb2YgT3hmb3JkCmRhdGU6ICdgciBTeXMuRGF0ZSgpYCcKb3V0cHV0OiAKICBodG1sX2RvY3VtZW50OgogICAgdG9jOiB0cnVlCiAgICB0b2NfZGVwdGg6IDMKICAgIHNlbGZfY29udGFpbmVkOiB0cnVlCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlCi0tLQoKYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9CmtuaXRyOjpvcHRzX2NodW5rJHNldCgKICB3YXJuaW5nID0gRkFMU0UsCiAgZXJyb3IgPSBGQUxTRSwKICBtZXNzYWdlID0gRkFMU0UsCiAgZWNobyA9IEZBTFNFCikKCiMjIExvYWQgbGlicmFyaWVzCmxpYnJhcnkoZHBseXIpCmxpYnJhcnkoZ3RzdW1tYXJ5KQpsaWJyYXJ5KGdncGxvdDIpCgojIyBMb2FkIGZ1bmN0aW9ucyBpbiBSIGZvbGRlcgpmb3IgKGYgaW4gbGlzdC5maWxlcygiUiIsIGZ1bGwubmFtZXMgPSBUUlVFKSkgc291cmNlIChmKQoKIyMgR2V0IGRhdGEKbnV0IDwtIGdldF9kYXRhKCkKYGBgCgojIyBJbnRyb2R1Y3Rpb24KCkEgdGhyZWUteWVhciBudXRyaXRpb24gcHJvZ3JhbW1lIGhhcyBiZWVuIGltcGxlbWVudGVkIGluIExpYmVyaWEgYnkgdGhlIE1pbmlzdHJ5IG9mIEhlYWx0aCBhbmQgVU5JQ0VGIGFpbWVkIGF0IHRhY2tsaW5nIGNoaWxkIHVuZGVybnV0cml0aW9uIGluIHRoZSBjb3VudHJ5LiBGdW5kZWQgYnkgW1Bvd2VyIG9mIE51dHJpdGlvbl0oaHR0cDovL3d3dy5wb3dlcm9mbnV0cml0aW9uLm9yZykgYW5kIFtVTklDRUYgVUtdKGh0dHBzOi8vd3d3LnVuaWNlZi5vcmcudWspLCB0aGUgcHJvZ3JhbW1lIGhhcyBiZWVuIGltcGxlbWVudGVkIGFjcm9zcyAxNSBjb3VudGllcyBpbiBMaWJlcmlhIHN0YXJ0aW5nIGZyb20gSmFudWFyeSAyMDE3IHVwIHRvIERlY2VtYmVyIDIwMTkuIFRoZSBvdmVyYWxsIGFpbSBvZiB0aGUgcHJvZ3JhbW1lIGlzIHRvIGltcHJvdmUgdGhlIGNvdmVyYWdlIG9mIGRpcmVjdCBudXRyaXRpb24gaW50ZXJ2ZW50aW9ucyBvciB3aGF0IGlzIGNvbW1vbmx5IHRlcm1lZCBudXRyaXRpb24tc3BlY2lmaWMgaW50ZXJ2ZW50aW9ucywgaS5lLiBpbnRlcnZlbnRpb25zIG9yIHByb2dyYW1tZXMgdGhhdCBhZGRyZXNzIHRoZSBpbW1lZGlhdGUgZGV0ZXJtaW5hbnRzIG9mIGZvZXRhbCBhbmQgY2hpbGQgbnV0cml0aW9uIGFuZCBkZXZlbG9wbWVudCDigJQgYWRlcXVhdGUgZm9vZCBhbmQgbnV0cmllbnQgaW50YWtlLCBmZWVkaW5nLCBjYXJlZ2l2aW5nIGFuZCBwYXJlbnRpbmcgcHJhY3RpY2VzLCBhbmQgbG93IGJ1cmRlbiBvZiBpbmZlY3Rpb3VzIGRpc2Vhc2VzLiBUaGUgY3VycmVudCBwcm9ncmFtbWUgc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBzcGVjaWZpYyBrZXkgaW50ZXJ2ZW50aW9uczogMSkgKnRyZWF0bWVudCBvZiBzZXZlcmUgYWN1dGUgbWFsbnV0cml0aW9uIChTQU0pIHdpdGhpbiB0aGUgY29tbXVuaXR5LWJhc2VkIG1hbmFnZW1lbnQgb2YgYWN1dGUgbWFsbnV0cml0aW9uIChDTUFNKSBwcm9ncmFtbWUgZm9yIGNoaWxkcmVuIDYtNTkgbW9udGhzKjsgMikgKnZpdGFtaW4gQSBzdXBwbGVtZW50YXRpb24gZm9yIGNoaWxkcmVuIDYtNTkgbW9udGhzKjsgMykgKnByb21vdGlvbiBvZiBhcHByb3ByaWF0ZSBpbmZhbnQgYW5kIHlvdW5nIGNoaWxkIGZlZWRpbmcgKElZQ0YpIHByYWN0aWNlcyBhbW9uZyBwcmVnbmFudCBvciBsYWN0YXRpbmcgd29tZW4qOyA0KSAqbXVsdGlwbGUgbWljcm9udXRyaWVudCBwb3dkZXIgKE1OUCkgc3VwcGxlbWVudGF0aW9uIGZvciBjaGlsZHJlbiA2LTIzIG1vbnRocyo7IGFuZCwgNSkgKmlyb24gYW5kIGZvbGljIGFjaWQgKElGQSkgc3VwcGxlbWVudGF0aW9uIGZvciBwcmVnbmFudCB3b21lbiouCgpUbyBhc3Nlc3MgdGhlIHByb2dyYW1tZSdzIHByb2dyZXNzIHRvd2FyZHMgaXRzIG92ZXJhbGwgYWltLCB0d28gY292ZXJhZ2UgYXNzZXNzbWVudHMgaGF2ZSBiZWVuIGltcGxlbWVudGVkIC0gdGhlIGZpcnN0IGF0IHRoZSBoYWxmd2F5IHBvaW50IG9mIHRoZSBwcm9ncmFtbWUgYW5kIHRoZSBzZWNvbmQgYXQgdGhlIGVuZC4gT25seSB0d28gcHJvZ3JhbW1lIGFyZWFzIHdlcmUgc2VsZWN0ZWQgZm9yIHRoZSBhc3Nlc3NtZW50czogKlVyYmFuIE1vbnRzZXJyYWRvIChHcmVhdGVyIE1vbnJvdmlhKSogZGlzdHJpY3QgYW5kICpHcmFuZCBCYXNzYSogY291bnR5LgoKVGhpcyBkb2N1bWVudCByZXBvcnRzIG9uIHRoZSByZXN1bHRzIG9mIHRoZSBjb3ZlcmFnZSBhc3Nlc3NtZW50IG9mIHRoZSBDTUFNIHByb2dyYW1tZSBmb3IgdHJlYXRpbmcgU0FNIGNoaWxkcmVuIDYtNTkgbW9udGhzIG9sZC4KCiMjIERlc2NyaXB0aW9uIG9mIHRoZSBzYW1wbGUKPCEtLS0gSU5TRVJUIFRFWFQgQU5EIExJVEVSQVRFIENPREUgQkVMT1cgVEhJUyBMSU5FIC0tLT4KCiMjIyBDaGlsZHJlbiBieSBzZXggYW5kIGxvY2F0aW9uCgpUaGUgZm9sbG93aW5nIHRhYmxlIHByZXNlbnRzIHRoZSBudW1iZXIgb2YgY2hpbGRyZW4gaW4gdGhlIHNhbXBsZSBieSBzZXguCgpgYGB7ciBzYW1wbGVfYnlfc2V4LCBlY2hvID0gVFJVRX0Kc2FtcGxlX2J5X3NleF90YWJsZSA8LSB0YWJsZShudXQkc2V4LCB1c2VOQSA9ICJpZmFueSIpCgpzYW1wbGVfYnlfc2V4X3RhYmxlCmBgYAoKVGhlcmUgd2VyZSBhIHRvdGFsIG9mICoqYHIgc2FtcGxlX2J5X3NleF90YWJsZVsxXWAgbWFsZSBjaGlsZHJlbioqIGFuZCAqKmByIHNhbXBsZV9ieV9zZXhfdGFibGVbMl1gIGZlbWFsZSBjaGlsZHJlbioqIGluIHRoZSBzdXJ2ZXkgc2FtcGxlLiBUaGVyZSB3ZXJlIGFsc28gYSB0b3RhbCBvZiAqKmByIHNhbXBsZV9ieV9zZXhfdGFibGVbM11gIGNoaWxkcmVuKiogd2hvc2UgcGFyZW50cyByZWZ1c2VkIHRvIHBhcnRpY2lwYXRlIGluIHRoZSBzdXJ2ZXkuCgpUaGUgZm9sbG93aW5nIHRhYmxlIHByZXNlbnRzIHRoZSBudW1iZXIgb2YgY2hpbGRyZW4gaW4gdGhlIHNhbXBsZSBieSBsb2NhdGlvbi4KCmBgYHtyIHNhbXBsZV9ieV9sb2NhdGlvbiwgZWNobyA9IFRSVUV9CnNhbXBsZV9ieV9sb2NhdGlvbl90YWJsZSA8LSB0YWJsZShudXQkY291bnR5LCB1c2VOQSA9ICJpZmFueSIpCgpzYW1wbGVfYnlfbG9jYXRpb25fdGFibGUKYGBgCgpUaGVyZSB3ZXJlIGEgdG90YWwgb2YgKipgciBzYW1wbGVfYnlfbG9jYXRpb25fdGFibGVbMV1gIGNoaWxkcmVuIGZyb20gR3JhbmQgQmFzc2EqKiBhbmQgKipgciBzYW1wbGVfYnlfbG9jYXRpb25fdGFibGVbMl1gIGNoaWxkcmVuIGZyb20gVXJiYW4gTW9udHNlcnJhZG8qKi4KClRoZSBmb2xsb3dpbmcgdGFibGUgcHJlc2VudHMgdGhlIG51bWJlciBvZiBjaGlsZHJlbiBpbiB0aGUgc2FtcGxlIGJ5IHNleCBhbmQgYnkgbG9jYXRpb24uCgpgYGB7ciBzYW1wbGVfYnlfc2V4X2xvY2F0aW9uLCBlY2hvID0gVFJVRX0Kc2FtcGxlX2J5X3NleF9sb2NhdGlvbl90YWJsZSA8LSB0YWJsZShudXQkY291bnR5LCBudXQkc2V4LCB1c2VOQSA9ICJpZmFueSIpCgpzYW1wbGVfYnlfc2V4X2xvY2F0aW9uX3RhYmxlCmBgYAoKSW4gR3JhbmQgQmFzc2EsIHRoZXJlIHdlcmUgYSB0b3RhbCBvZiAqKmByIHNhbXBsZV9ieV9zZXhfbG9jYXRpb25fdGFibGVbMSwgMV1gIG1hbGUgY2hpbGRyZW4qKiBhbmQgKipgciBzYW1wbGVfYnlfc2V4X2xvY2F0aW9uX3RhYmxlWzEsIDJdYCBmZW1hbGUgY2hpbGRyZW4qKiBpbiB0aGUgc3VydmV5IHNhbXBsZS4gQSB0b3RhbCBvZiAqKmByIHNhbXBsZV9ieV9zZXhfbG9jYXRpb25fdGFibGVbMSwgM11gIGNoaWxkcmVuKiogaW4gR3JhbmQgQmFzc2EgaGFkIHBhcmVudHMgd2hvIHJlZnVzZWQgdG8gcGFydGljaXBhdGUgaW4gdGhlIHN1cnZleS4KCkluIFVyYmFuIE1vbnRzZXJyYWRvLCB0aGVyZSB3ZXJlIGEgdG90YWwgb2YgKipgciBzYW1wbGVfYnlfc2V4X2xvY2F0aW9uX3RhYmxlWzIsIDFdYCBtYWxlIGNoaWxkcmVuKiogYW5kICoqYHIgc2FtcGxlX2J5X3NleF9sb2NhdGlvbl90YWJsZVsyLCAyXWAgZmVtYWxlIGNoaWxkcmVuKiogaW4gdGhlIHN1cnZleSBzYW1wbGUuIEEgdG90YWwgb2YgKipgciBzYW1wbGVfYnlfc2V4X2xvY2F0aW9uX3RhYmxlWzIsIDNdYCBjaGlsZHJlbioqIGluIFVyYmFuIE1vbnRzZXJyYWRvIGhhZCBwYXJlbnRzIHdobyByZWZ1c2VkIHRvIHBhcnRpY2lwYXRlIGluIHRoZSBzdXJ2ZXkuCgojIyMgQWdlIGRpc3RyaWJ1dGlvbiBvZiBjaGlsZHJlbiBpbiB0aGUgc2FtcGxlCgpGb2xsb3dpbmcgaXMgYSBiYXJwbG90IG9mIGFnZXMgb2YgdGhlIGNoaWxkcmVuIGluIHRoZSBzYW1wbGUuCgpgYGB7ciBzYW1wbGUtYmFycGxvdCwgZWNobyA9IFRSVUUsIGZpZy5jYXAgPSAiRGlzdHJpYnV0aW9uIG9mIGFnZXMgb2YgY2hpbGRyZW4gYnkgbG9jYXRpb24iLCBmaWcuYWxpZ24gPSAiY2VudGVyIiwgZmlnLndpZHRoID0gMTIsIGZpZy5oZWlnaHQgPSA4fQpiYXJwbG90KAogIGhlaWdodCA9IHRhYmxlKG51dCRjb3VudHksIG51dCRhZ2UpLAogIGJlc2lkZSA9IEZBTFNFLAogIGxlZ2VuZC50ZXh0ID0gVFJVRSwKICBtYWluID0gIkRpc3RyaWJ1dGlvbiBvZiBBZ2VzIG9mIENoaWxkcmVuIGJ5IExvY2F0aW9uIiwKICB4bGFiID0gIkFnZSAobW9udGhzKSIsCiAgeWxhYiA9ICJuIgopCmBgYAoKRm9sbG93aW5nIGlzIGEgaGlzdG9ncmFtIG9mIGFnZXMgb2YgY2hpbGRyZW4gaW4gdGhlIHNhbXBsZS4KCmBgYHtyIHNhbXBsZS1oaXN0b2dyYW0sIGVjaG8gPSBUUlVFLCBmaWcuY2FwID0gIkRpc3RyaWJ1dGlvbiBvZiBhZ2VzIG9mIGNoaWxkcmVuIiwgZmlnLmFsaWduID0gImNlbnRlciIsIGZpZy53aWR0aCA9IDEyLCBmaWcuaGVpZ2h0ID0gOH0KZ2dwbG90KAogIGRhdGEgPSBudXQsIAogIGFlcygKICAgIHggPSBhZ2UsIAogICAgZmlsbCA9IGZhY3RvcihzZXgsIGxhYmVscyA9IGMoIk1hbGUiLCAiRmVtYWxlIikpLAogICAgZ3JvdXAgPSBmYWN0b3Ioc2V4LCBsYWJlbHMgPSBjKCJNYWxlIiwgIkZlbWFsZSIpKQogICkKKSArCiAgZ2VvbV9oaXN0b2dyYW0oYWxwaGEgPSAwLjUsIGJpbnMgPSA2MCkgKwogIHNjYWxlX3hfY29udGludW91cyhuLmJyZWFrcyA9IDI0KSArCiAgZmFjZXRfd3JhcCggfiBjb3VudHksIG5jb2wgPSAyKSArCiAgbGFicygKICAgIHRpdGxlID0gIkRpc3RyaWJ1dGlvbiBvZiBBZ2VzIG9mIENoaWxkcmVuIGJ5IFNleCBhbmQgTG9jYXRpb24iLCAKICAgIHggPSAiQWdlIChtb250aHMpIiwgeSA9ICJuIiwKICAgIGZpbGwgPSBOVUxMCiAgKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gInRvcCIpCmBgYAoKIyMgTnV0cml0aW9uIHNjcmVlbmluZyBjb3ZlcmFnZQo8IS0tLSBJTlNFUlQgVEVYVCBBTkQgTElURVJBVEUgQ09ERSBCRUxPVyBUSElTIExJTkUgLS0tPgoKVGhlIGZvbGxvd2luZyBkYXRhIHByb2Nlc3Npbmcgd2FzIGZpcnN0IHBlcmZvcm1lZCBvbiB0aGUgZGF0YSBiZWZvcmUgY29udGludWluZyBvbiB3aXRoIHRoZSBhbmFseXNpcy4KCmBgYHtyIHByb2Nlc3NfZGF0YV9zY3JlZW4sIGVjaG8gPSBUUlVFfQojIyBTdWJzZXQgZGF0YTogVHJhbnNmb3JtIHZhcmlhYmxlcyBvZiBpbnRlcmVzdCBpbnRvIHRhYmxlIG51dDEgCm51dDEgPC0gbnV0ICU+JSBzZWxlY3Qoc3VydmV5X3JvdW5kLGNvdW50eSxzZXgsbXVhY19zY3JlZW4sb2VkZW1hX3NjcmVlbikKCiMjIENsZWFuIGRhdGEgaW4gc3Vic2V0OiBDaGFuZ2UgOTkgdG8gTkEgCiMjIyBDbGVhbiBkYXRhIG9ubHkgYWZ0ZXIgaGF2aW5nIG1hZGUgc3Vic2V0IG51dDEuIAojIyMgQ29kZSBkb24ndCB3b3JrIGlmIGRhdGEgaXMgY2xlYW5lZCBpbiBudXQgYW5kIHRoZW4gc3Vic2V0LiA/Pz8KbnV0MSRtdWFjX3NjcmVlbiA8LSBpZmVsc2UobnV0MSRtdWFjX3NjcmVlbiA9PSA5OSwgTkEsIG51dDEkbXVhY19zY3JlZW4pCm51dDEkbXVhY19zY3JlZW5bbnV0JG11YWNfc2NyZWVuID09IDFdIDwtICJZIgpudXQxJG11YWNfc2NyZWVuW251dCRtdWFjX3NjcmVlbiA9PSAyXSA8LSAiTiIKCm51dDEkb2VkZW1hX3NjcmVlbiA8LSBpZmVsc2UobnV0MSRvZWRlbWFfc2NyZWVuID09IDk5LCBOQSwgbnV0MSRvZWRlbWFfc2NyZWVuKQpudXQxJG9lZGVtYV9zY3JlZW5bbnV0JG9lZGVtYV9zY3JlZW4gPT0gMV0gPC0gIlkiCm51dDEkb2VkZW1hX3NjcmVlbltudXQkb2VkZW1hX3NjcmVlbiA9PSAyXSA8LSAiTiIKCm51dDEkc2V4IDwtIGlmZWxzZShudXQxJHNleCA9PSAxLCAiTWFsZSIsICJGZW1hbGUiKQpgYGAKCiMjIyBNVUFDIHNjcmVlbmluZyBjb3ZlcmFnZQoKVGhlIGZvbGxvd2luZyB0YWJsZSBwcmVzZW50cyBNVUFDIHNjcmVlbmluZyBjb3ZlcmFnZSBieSBzdXJ2ZXkgcm91bmQuCgpgYGB7ciBtdWFjX3NjcmVlbl90YWJsZSwgZWNobyA9IFRSVUV9Cm51dDEgJT4lIAogIHRibF9zdW1tYXJ5KAogICAgYnkgPSBzdXJ2ZXlfcm91bmQsIAogICAgaW5jbHVkZSA9IG11YWNfc2NyZWVuLAogICAgc3RhdGlzdGljID0gbGlzdChhbGxfY29udGludW91cygpIH4gInttZWFufSAoe3NkfSkiKQogICkKYGBgCgpUaGUgZW5kbGluZSBkYXRhIHNob3dzIExJVFRMRSBpZiBOTyBpbXByb3ZlbWVudCBpbiBNVUFDIHNjcmVlbmluZyBjb3ZlcmFnZSBhbW9uZyB0aGUgc2FtcGxlIGNoaWxkcmVuIHZzLiBiYXNlbGluZS4gUGVyY2VudGFnZSBvZiBjaGlsZHJlbiBoYWQgTVVBQyBzY3JlZW5lZCAoYW5zd2VyZWQgMSB0byBzdXJ2ZXkpIHN0YXllZCByZWxhdGl2ZWx5IHRoZSBzYW1lIGZyb20gYmFzZWxpbmUgdG8gZW5kbGluZS4gVGhlIHBlcmNlbnRhZ2Ugb2YgY2hpbGRyZW4gd2l0aG91dCBNVUFDIHNjcmVlbmluZyB3ZW50IHVwIGZyb20gNzMlIHRvIDkzJSwgbWFpbmx5IGR1ZSB0byBjaGlsZHJlbiBmcm9tIHRoZSBOQSBwb3B1bGF0aW9uIGF0IGJhc2VsaW5lIG1vdmluZyBvdmVyLiBUaGlzIG1heSBzdWdnZXN0IGEgYmV0dGVyIGF3YXJlbmVzcyBpbiB0aGlzIHBvcHVsYXRpb24gcmVsYXRlZCB0byBub3QgaGF2aW5nIGdvdHRlbiBNVUFDIHNjcmVlbmluZyAoPykuCgpUaGUgZm9sbG93aW5nIHRhYmxlIHByZXNlbnRzIE1VQUMgc2NyZWVuaW5nIGNvdmVyYWdlIGJ5IHN1cnZleSByb3VuZCBhbmQgYnkgc2V4IG9mIHRoZSBjaGlsZC4KCmBgYHtyIG11YWNfc2NyZWVuX2J5X3NleF90YWJsZSwgZWNobyA9IFRSVUV9Cm51dDEgJT4lIAogIHRibF9zdHJhdGEoCiAgICBzdHJhdGEgPSBzZXgsIAogICAgLnRibF9mdW4gPSB+IC54ICU+JSAKICAgICAgdGJsX3N1bW1hcnkoCiAgICAgICAgYnkgPSBzdXJ2ZXlfcm91bmQsCiAgICAgICAgaW5jbHVkZSA9IG11YWNfc2NyZWVuLAogICAgICAgIHN0YXRpc3RpYyA9IGxpc3QoYWxsX2NvbnRpbnVvdXMoKSB+ICJ7bWVhbn0gKHtzZH0pIikKICAgICAgKQogICkKYGBgCgpUaGVyZSBpcyBubyBhcHBhcmVudCBkaWZmZXJlbmNlIGluIE1VQUMgc2NyZWVuaW5nIGNvdmVyYWdlIGJldHdlZW4gZ2lybHMgYW5kIGJveXMgaW4gdGhlIHNhbXBsZS4gT3IsIGdlbmRlciBkb2Vzbid0IHNlZW0gdG8gaW5mbHVlbmNlIE1VQUMgc2NyZWVuaW5nIGluIGNoaWxkcmVuLgoKVGhlIGZvbGxvd2luZyB0YWJsZSBwcmVzZW50cyBNVUFDIHNjcmVlbmluZyBjb3ZlcmFnZSBieSBzdXJ2ZXkgcm91bmQgYW5kIGJ5IHN1cnZleSBsb2NhdGlvbi4KCmBgYHtyIG11YWNfc2NyZWVuX2J5X2xvY2F0aW9uX3RhYmxlLCBlY2hvID0gVFJVRX0KbnV0MSAlPiUgCiAgdGJsX3N0cmF0YSgKICAgIHN0cmF0YT1jb3VudHksCiAgICAudGJsX2Z1biA9IH4gLnggJT4lIAogICAgICB0Ymxfc3VtbWFyeSgKICAgICAgICBieSA9IHN1cnZleV9yb3VuZCwKICAgICAgICBpbmNsdWRlID0gbXVhY19zY3JlZW4sCiAgICAgICAgc3RhdGlzdGljID0gbGlzdChhbGxfY29udGludW91cygpIH4gInttZWFufSAoe3NkfSkiKQogICAgICApCiAgICkKYGBgCgpUaGUgZGF0YSBzdWdnZXN0cyBhbiBpbmNyZWFzZSBpbiBjaGlsZHJlbiByZWNlaXZpbmcgTVVBQyBzY3JlZW5pbmcgYXQgZW5kbGluZSBpbiBHcmFuZCBCYXNzYSB2cy4gaW4gVXJiYW4gTW9udHNlcnJhZG8uIEluIGZhY3QsIGl0IHNlZW1zIHRoYXQgdGhlIGNvdmVyYWdlIG9mIE1VQUMgc2NyZWVuaW5nIGluIFVyYmFuIE1vbnRzZXJyYWRvIGRlY3JlYXNlcyAoZnJvbSA0LjUlIGF0IGJhc2VsaW5lIHRvIDMlIGF0IGVuZGxpbmUpLiBUaGlzIHN1Z2dlc3RzIEdyYW5kIEJhc3NhIHRvIGhhdmUgZG9uZSBhIGJldHRlciBqb2IgaW4gTVVBQyBzY3JlZW5pbmcgdGhhbiBNb250c2VycmFkby4gSG93ZXZlciwgbmVpdGhlciBsb2NhdGlvbiBoYXMgYSBzaWduaWZpY2FudCBpbXByb3ZlbWVudCBpbiBNVUFDIHNjcmVlbmluZyBjb3ZlcmFnZS4gVGhlIG92ZXJhbGwgdHJlbmQgb2YgaW5jcmVhc2luZyBpbiBubyBzY3JlZW5pbmcgaXMgb2JzZXJ2ZWQgaGVyZSBidXQgdGhpcyBpcyBhZ2FpbiBkdWUgdG8gcG9wdWxhdGlvbiB3aG8gYW5zd2VyZWQgTkEgYXQgYmFzZWxpbmUgbW92aW5nIHRvIGFuc3dlcmVkIG5vIHRvIHNjcmVlbmluZyBhdCBlbmRsaW5lLgoKIyMjIE9lZGVtYSBzY3JlZW5pbmcgY292ZXJhZ2UKClRoZSBmb2xsb3dpbmcgdGFibGUgcHJlc2VudHMgb2VkZW1hIHNjcmVlbmluZyBieSBzdXJ2ZXkgcm91bmQuCgpgYGB7ciBvZWRlbWFfc2NyZWVuX3RhYmxlLCBlY2hvID0gVFJVRX0KbnV0MSAlPiUgCiAgdGJsX3N1bW1hcnkoCiAgICBieSA9IHN1cnZleV9yb3VuZCwgCiAgICBpbmNsdWRlID0gb2VkZW1hX3NjcmVlbiwKICAgIHN0YXRpc3RpYyA9IGxpc3QoYWxsX2NvbnRpbnVvdXMoKSB+ICJ7bWVhbn0gKHtzZH0pIikKICApCmBgYAoKU2ltaWxhciB0byBNVUFDIHNjcmVlbmluZywgdGhlIGVuZGxpbmUgZGF0YSBzaG93cyBsaXR0bGUgaWYgbm8gaW1wcm92ZW1lbnQgaW4gb2VkZW1hIHNjcmVlbmluZyBjb3ZlcmFnZSBhbW9uZyB0aGUgc2FtcGxlIGNoaWxkcmVuIHZzLiBiYXNlbGluZS4gVGhlIHNhbWUgb2JzZXJ2YXRpb24gYXBwbGllcyBmb3IgbW92ZW1lbnQgb2YgcG9wdWxhdGlvbnMgd2hvIGFuc3dlcmVkIE5BIGZvciBvZWRlbWEgc2NyZWVuaW5nIGF0IGJhc2VsaW5lIHRvIGFuc3dlcmluZyBubyB0byBPZWRlbWEgc2NyZWVuaW5nIGF0IGVuZGxpbmUuIFRoaXMgbWF5IHN1Z2dlc3QgYWdhaW4gYSBiZXR0ZXIgc2Vuc2Ugb2YgYXdhcmVuZXNzIGFuZCBtYXkgc2VydmUgYXMgYSByZWZsZWN0aW9uIG9mIHB1YmxpYyBlbmdhZ2VtZW50IHdvcmtpbmc/CgpUaGUgZm9sbG93aW5nIHRhYmxlIHByZXNlbnRzIG9lZGVtYSBzY3JlZW5pbmcgYnkgc3VydmV5IHJvdW5kIGFuZCBieSBzZXguCgpgYGB7ciBvZWRlbWFfc2NyZWVuX2J5X3NleCwgZWNobyA9IFRSVUV9Cm51dDEgJT4lIAogIHRibF9zdHJhdGEoCiAgICBzdHJhdGEgPSBzZXgsCiAgICAudGJsX2Z1biA9IH4gLnggJT4lIAogICAgICB0Ymxfc3VtbWFyeSgKICAgICAgICBieSA9IHN1cnZleV9yb3VuZCwKICAgICAgICBpbmNsdWRlID0gb2VkZW1hX3NjcmVlbiwgCiAgICAgICAgc3RhdGlzdGljID0gbGlzdChhbGxfY29udGludW91cygpIH4gInttZWFufSAoe3NkfSkiKQogICAgICApCiAgKQpgYGAKClRoZSBkYXRhIHN1Z2dlc3RzIG9lZGVtYSBzY3JlZW5pbmcgaW1wcm92ZXMgU0xJR0hUTFkgaW4gZmVtYWxlcyB2cy4gaW4gbWFsZXMuIEhvd2V2ZXIsIHRoaXMgZGlmZmVyZW5jZSBkb2VzIG5vdCBzZWVtIGJpZyBlbm91Z2ggdG8gY2FsbCBmb3IgZ2VuZGVyIGFzIGEgZGV0ZXJtaW5hbnQgaW4gaW1wcm92ZW1lbnQgb2Ygb2VkZW1hIHNjcmVlbmluZy4gcC12YWx1ZSBtYXkgYmUgbmVlZGVkIHRvIGRldGVybWluZSBpZiB0aGUgZGlmZmVyZW5jZSBpcyBzaWduaWZpY2FudC4KClRoZSBmb2xsb3dpbmcgdGFibGUgcHJlc2VudHMgb2VkZW1hIHNjcmVlbmluZyBieSBzdXJ2ZXkgcm91bmQgYW5kIGJ5IHN1cnZleSBsb2NhdGlvbi4KCmBgYHtyIG9lZGVtYV9zY3JlZW5fYnlfbG9jYXRpb24sIGVjaG8gPSBUUlVFfQpudXQxICU+JSAKICB0Ymxfc3RyYXRhKAogICAgc3RyYXRhID0gY291bnR5LAogICAgLnRibF9mdW4gPSB+IC54ICU+JSAKICAgICAgdGJsX3N1bW1hcnkoCiAgICAgICAgYnkgPSBzdXJ2ZXlfcm91bmQsCiAgICAgICAgaW5jbHVkZSA9IG9lZGVtYV9zY3JlZW4sCiAgICAgICAgc3RhdGlzdGljID0gbGlzdChhbGxfY29udGludW91cygpIH4gInttZWFufSAoe3NkfSkiKQogICAgICApCiAgKQpgYGAKClRoZSBzYW1lIHRyZW5kIGlzIG9ic2VydmVkIGhlcmUgZm9yIG9lZGVtYSBzY3JlZW5pbmcuIFRoZSBkYXRhIHN1Z2dlc3RzIGFuIGluY3JlYXNlIGluIG9lZGVtYSBzY3JlZW5pbmcgY292ZXJhZ2UgaW4gR3JhbmQgQmFzc2EgYnV0IGEgZGVjcmVhc2UgaW4gVXJiYW4gTW9udHNlcnJhZG8sIHN1Z2dlc3RpbmcgR3JhbmQgQmFzc2EgZG9pbmcgYSBiZXR0ZXIgam9iLiAKClRoZSBmb2xsb3dpbmcgdGFibGUgcHJlc2VudHMgYWxsIHRoZSB2YXJpYWJsZXMgb2YgaW50ZXJlc3Qgd2l0aCAqcC12YWx1ZXMqIGZvciAqY2hpLXNxdWFyZWQgdGVzdCogY29tcGFyaW5nIHJlc3VsdHMgZm9yIGVhY2ggY2F0ZWdvcnkuCgpgYGB7ciBzdW1tYXJ5X3RhYmxlLCBlY2hvID0gVFJVRX0KbnV0MSAlPiUgCiAgdGJsX3N1bW1hcnkoCiAgICBieSA9IHN1cnZleV9yb3VuZCwgCiAgICBzdGF0aXN0aWMgPSBsaXN0KGFsbF9jb250aW51b3VzKCkgfiAie21lYW59ICh7c2R9KSIpCiAgKSAlPiUgCiAgYWRkX3AoKSAKYGBgCgoqUGVhcnNvbidzIENoaS1zcXVhcmVkIHRlc3QqIGF0IHRoZSBlbmQgaGVscCB0byBzaG93IHRoYXQgZGlmZmVyZW5jZSBiZXR3ZWVuIGVuZGxpbmUgYW5kIGJhc2VsaW5lIGlzIGluZGVlZCBzdGF0aXN0aWNhbGx5IHNpZ25pZmljYW50LiBCdXQgdGhpcyBtYXkgYmUgZHJpdmVuIG1haW5seSBieSB0aGUgbnVtYmVyIGFuc3dlcmluZyBubyB0byBzY3JlZW5pbmcgaW5jcmVhc2luZyBiZXR3ZWVuIGJhc2VsaW5lIGFuZCBlbmRsaW5lLCBub3QgYSByZWZsZWN0aW9uIG9mIGhvdyB3ZWxsIHRoZSBzY3JlZW5pbmcgaGFzIGluY3JlYXNlZCBiZXR3ZWVuIHRoZSAyIHRpbWUgcG9pbnRzLgoKIyMgUHJldmFsZW5jZSBvZiBhY3V0ZSB1bmRlcm51dHJpdGlvbgo8IS0tLSBJTlNFUlQgVEVYVCBBTkQgTElURVJBVEUgQ09ERSBCRUxPVyBUSElTIExJTkUgLS0tPgoKIyMjIE1BTSBjYXNlcyBieSBzZXggYW5kIGxvY2F0aW9uCgpUaGUgZm9sbG93aW5nIHN0ZXBzIHdlcmUgdGFrZW4gdG8gcHJvY2VzcyB0aGUgZGF0YSB0byBiZSBhYmxlIHRvIHRhYnVsYXRlIHRoZSBudW1iZXIgb2YgTUFNIGNhc2VzIGJ5IHNleCBhbmQgbG9jYXRpb24gaW4gdGhlIHNhbXBsZS4KCmBgYHtyIG1hbV90YWJsZV9jb2RlLCBlY2hvID0gVFJVRX0KIyMjIEFzc2lnbmluZyBtYWxlIGFuZCBmZW1hbGUgdG8gc2V4ClNFWCA8LSBpZmVsc2UobnV0JHNleCA9PSAxLCAiTWFsZSIsICJGZW1hbGUiKSAKCiMjIyBBc3NpZ25pbmcgeWVzIGFuZCBObyB0byBvZWRlbWEKT0VERU1BIDwtIGlmZWxzZShudXQkb2VkZW1hID09IDEsICJZZXMiLCAiTm8iKSAKCiMjIyBBc3NpZ25pbmcgbnV0JGNvdW50eSB0byBDT1VOVFkKQ09VTlRZIDwtIG51dCRjb3VudHkgCgojIyMgQXNzaWduaW5nIHRoZSB0b3RhbCBudW1iZXIgb2YgY2hpbGRyZW4gYmV0d2VlbiA2LTU5IHRvIERlbgpEZW4gPC0gc3VtKG51dCRhZ2UgPj0gNiAmIG51dCRhZ2UgPCA2MCwgbmEucm0gPSBUUlVFKSAKCiMjIE5VTUJFUiBBTkQgUFJFVkFMRU5DRSBPRiBNQU0gQ0FTRVMKCiMjIyBBc3NpZ25pbmcgdGhlIG1vZGVyYXRlIE1VQUMgY3JpdGVyaWEgZm9yIGNoaWxkcmVuIGJldHdlZW4gNi02MCBmb3IgTW9kX01VQUMKTW9kX01VQUMgPC0gd2l0aCgKICBudXQsIAogIG11YWMgPj0gMTEuNSAmIG11YWMgPCAxMi41ICYgYWdlID49IDYgJiBhZ2UgPCA2MAopIAoKIyMjIEFzc2lnbmluZyBNQU0gdG8gdGFibGUKTUFNIDwtIHRhYmxlKFNFWCwgT0VERU1BLCBNb2RfTVVBQywgQ09VTlRZLCB1c2VOQSA9ICJpZmFueSIpICAKCiMjIyBDUkVBVElORyBBIERBVEEgRlJBTUUgRk9SIFRPVEFMIE1BTSBDQVNFUwojZGF0YS5mcmFtZShNQU0pIAoKIyMjIFRPVEFMIE1BTSBGRU1BTEVTIElOIFVSQkFOIE1PTlRTRVJSQURPCk1BTV9udW1fRjEgPC0gTUFNWyJGZW1hbGUiLCAiTm8iLCAiVFJVRSIsIlVyYmFuIE1vbnRzZXJyYWRvIl0gCgojIyMgVE9UQUwgTUFNIEZFTUFMRVMgSU4gR1JBTkQgQkFTU0EKTUFNX251bV9GMiA8LSBNQU1bIkZlbWFsZSIsICJObyIsICJUUlVFIiwiR3JhbmQgQmFzc2EiXSAKCiMjIyBUT1RBTCBNQU0gTUFMRVMgSU4gVVJCQU4gTU9OVFNFUlJBRE8KTUFNX251bV9NMSA8LSBNQU1bIk1hbGUiLCAiTm8iLCAiVFJVRSIsIlVyYmFuIE1vbnRzZXJyYWRvIl0KCiMjIyBUT1RBTCBNQU0gTUFMRVMgSU4gR1JBTkQgQkFTU0EKTUFNX251bV9NMiA8LSBNQU0gWyJNYWxlIiwgIk5vIiwgIlRSVUUiLCJHcmFuZCBCYXNzYSJdIAoKTUFNX251bWJlciA8LSBkYXRhLmZyYW1lKAogIFNleCA9IGMoIkZlbWFsZSIsICJGZW1hbGUiLCAiTWFsZSIsICJNYWxlIiksCiAgQ291bnR5ID0gYygiVXJiYW4gTW9udHNlcnJhZG8iLCAiR3JhbmQgQmFzc2EiLCAiVXJiYW4gTW9udHNlcnJhZG8iLCAiR3JhbmQgQmFzc2EiKSwgCiAgTnVtYmVyX29mX01BTSA9IGMoTUFNX251bV9GMSwgTUFNX251bV9GMiwgTUFNX251bV9NMSwgTUFNX251bV9NMikKKSAKCiMjIENSRUFUSU5HIERBVEEgRlJBTUUgRk9SIE1BTSBDQVNFUyBCWSBTRVggQU5EIENPVU5UWQoKIyMjIENSRUFUSU5HIEEgVEFCTEUgQlkgU0VYIEFORCBDT1VOVFkKTUFNX251bWJlcl90YWJsZSA8LSB4dGFicygKICBOdW1iZXJfb2ZfTUFNIH4gU2V4ICsgQ291bnR5LCBkYXRhID0gTUFNX251bWJlcgopIAoKIyMjIFZJRVcgTUFNIENBU0VTIEJZIFNFWCBBTkQgQ09VTlRZCiNNQU1fbnVtYmVyX3RhYmxlIAoKIyMjIFBSRVZBTEVOQ0UgT0YgRkVNQUxFIE1BTSBJTiBVUkJBTiBNT05UU0VSUkFETwpQcmV2MV9NQU0gPC0gTUFNWyJGZW1hbGUiLCAiTm8iLCAiVFJVRSIsIlVyYmFuIE1vbnRzZXJyYWRvIl0gLyBEZW4gCgojIyMgUFJFVkFMRU5DRSBPRiBGRU1BTEUgTUFNIElOIEdSQU5EIEJBU1NBClByZXYyX01BTSA8LSBNQU1bIkZlbWFsZSIsICJObyIsICJUUlVFIiwiR3JhbmQgQmFzc2EiXSAvIERlbiAKCiMjIyBQUkVWQUxFTkNFIE9GIE1BTEUgTUFNIElOIFVSQkFOIE1PTlRTRVJSQURPClByZXYzX01BTSA8LSBNQU1bIk1hbGUiLCAiTm8iLCAiVFJVRSIsIlVyYmFuIE1vbnRzZXJyYWRvIl0gLyBEZW4gCgojIyMgUFJFVkFMRU5DRSBPRiBGRU1BTEUgTUFNIElOIEdSQU5EIEJBU1NBClByZXY0X01BTSA8LSBNQU1bIk1hbGUiLCAiTm8iLCAiVFJVRSIsIkdyYW5kIEJhc3NhIl0gLyBEZW4gCgojIyMgUFJFVkFMRU5DRSBPRiBNQU0gQ0FTRVMgQlkgU0VYIEFORCBDT1VOVFkKTUFNX3ByZXZhbGVuY2VzIDwtIGRhdGEuZnJhbWUoCiAgU2V4ID0gYygiRmVtYWxlIiwgIkZlbWFsZSIsICJNYWxlIiwgIk1hbGUiKSwKICBDb3VudHkgPSBjKCJVcmJhbiBNb250c2VycmFkbyIsICJHcmFuZCBCYXNzYSIsICJVcmJhbiBNb250c2VycmFkbyIsICJHcmFuZCBCYXNzYSIpLAogIFByZXZhbGVuY2Vfb2ZfTUFNID0gYyhQcmV2MV9NQU0sIFByZXYyX01BTSwgUHJldjNfTUFNLCBQcmV2NF9NQU0pCikgCgojIyBDUkVBVElORyBUQUJMRSBGT1IgTUFNIFBSRVZBTEVOQ0UgQlkgU0VYIEFORCBDT1VOVFkKCk1BTV9wcmV2YWxlbmNlc190YWJsZSA8LSB4dGFicygKICBQcmV2YWxlbmNlX29mX01BTSB+IFNleCArIENvdW50eSwgZGF0YSA9IE1BTV9wcmV2YWxlbmNlcwopIAoKIyMjIFZJRVcgTUFNIFBSRVZBTEVOQ0UgQ0FTRVMgQlkgU0VYIEFORCBDT1VOVFkKI01BTV9wcmV2YWxlbmNlc190YWJsZSAKYGBgCgpUaGUgZm9sbG93aW5nIHRhYmxlIHByZXNlbnRzIHRoZSBudW1iZXIgb2YgTUFNIGNhc2VzIGJ5IHNleCBhbmQgYnkgbG9jYXRpb24uCgpgYGB7ciBtYW1fY291bnRzX3RhYmxlLCBlY2hvID0gVFJVRX0KIyMjIENSRUFUSU5HIEEgVEFCTEUgQlkgU0VYIEFORCBDT1VOVFkKTUFNX251bWJlcl90YWJsZQpgYGAKCkluIEdyYW5kIEJhc3NhLCB0aGVyZSB3ZXJlICoqYHIgTUFNX251bWJlcl90YWJsZVsxLCAxXWAgZmVtYWxlIE1BTSBjYXNlcyoqIGFuZCAqKmByIE1BTV9udW1iZXJfdGFibGVbMiwgMV1gIG1hbGUgTUFNIGNhc2VzKiouIEluIFVyYmFuIE1vbnRzZXJyYWRvLCB0aGVyZSB3ZXJlICoqYHIgTUFNX251bWJlcl90YWJsZVsxLCAyXWAgZmVtYWxlIE1BTSBjYXNlcyoqIGFuZCAqKmByIE1BTV9udW1iZXJfdGFibGVbMiwgMl1gIG1hbGUgTUFNIGNhc2VzKiouIAoKVGhlIGZvbGxvd2luZyB0YWJsZSBwcmVzZW50cyB0aGUgcHJldmFsZW5jZSBvZiBNQU0gYnkgc2V4IGFuZCBieSBsb2NhdGlvbi4KCmBgYHtyIG1hbV9wcmV2YWxlbmNlX3RhYmxlLCBlY2hvID0gVFJVRX0KIyMjIFZJRVcgTUFNIFBSRVZBTEVOQ0UgQ0FTRVMgQlkgU0VYIEFORCBDT1VOVFkKTUFNX3ByZXZhbGVuY2VzX3RhYmxlIApgYGAKCk9mIHRoZSB0b3RhbCBNQU0gY2FzZXMgaW4gdGhlIHNhbXBsZSwgKipgciByb3VuZChNQU1fcHJldmFsZW5jZXNfdGFibGVbMSwgMV0gKiAxMDAsIGRpZ2l0cyA9IDIpYCUqKiB3ZXJlIGZlbWFsZXMgZnJvbSBHcmFuZCBCYXNzYSwgKipgciByb3VuZChNQU1fcHJldmFsZW5jZXNfdGFibGVbMiwgMV0gKiAxMDAsIGRpZ2l0cyA9IDIpYCUqKiB3ZXJlIG1hbGVzIGZyb20gR3JhbmQgQmFzc2EsICoqYHIgcm91bmQoTUFNX3ByZXZhbGVuY2VzX3RhYmxlWzEsIDJdICogMTAwLCBkaWdpdHMgPSAyKWAlKiogd2VyZSBmZW1hbGVzIGZyb20gVXJiYW4gTW9udHNlcnJhZG8gYW5kICoqYHIgcm91bmQoTUFNX3ByZXZhbGVuY2VzX3RhYmxlWzIsIDJdICogMTAwLCBkaWdpdHMgPSAyKWAlKiogd2VyZSBtYWxlcyBmcm9tIFVyYmFuIE1vbnRzZXJyYWRvLiAKCiMjIyBTQU0gY2FzZXMgYnkgc2V4IGFuZCBsb2NhdGlvbgoKVGhlIGZvbGxvd2luZyBzdGVwcyB3ZXJlIHRha2VuIHRvIHByb2Nlc3MgdGhlIGRhdGEgdG8gYmUgYWJsZSB0byB0YWJ1bGF0ZSB0aGUgbnVtYmVyIG9mIFNBTSBjYXNlcyBieSBzZXggYW5kIGxvY2F0aW9uIGluIHRoZSBzYW1wbGUuCgpgYGB7ciBzYW1fdGFibGVfY29kZSwgZWNobyA9IFRSVUV9CiMjIyBBc3NpZ25pbmcgdGhlIHNldmVyZSBNVUFDIGNyaXRlcmlhIGZvciBjaGlsZHJlbiBiZXR3ZWVuIDYtNTkgZm9yIFNldl9NVUFDClNldl9NVUFDIDwtIHdpdGgobnV0LCBhZ2UgPj0gNiAmIGFnZSA8IDYwICYgbXVhYyA8IDExLjUpIAoKIyMjIEFzc2lnbmluZyBTQU0KU0FNIDwtIHRhYmxlIChTRVgsIE9FREVNQSwgU2V2X01VQUMsIENPVU5UWSwgdXNlTkEgPSAiaWZhbnkiKSAKCiNkYXRhLmZyYW1lKFNBTSkKCiMjIyBUT1RBTCBTQU0gRkVNQUxFUyBJTiBVUkJBTiBNT05UU0VSUkFETwpTQU1fbnVtX0YxIDwtIFNBTVsiRmVtYWxlIiwgIk5vIiwgIlRSVUUiLCJVcmJhbiBNb250c2VycmFkbyJdIAoKIyMjIFRPVEFMIFNBTSBGRU1BTEVTIElOIEdSQU5EIEJBU1NBClNBTV9udW1fRjIgPC0gU0FNWyJGZW1hbGUiLCAiTm8iLCAiVFJVRSIsIkdyYW5kIEJhc3NhIl0gCgojIyMgVE9UQUwgU0FNIE1BTEVTIElOIFVSQkFOIE1PTlRTRVJSQURPClNBTV9udW1fTTEgPC0gU0FNWyJNYWxlIiwgIk5vIiwgIlRSVUUiLCJVcmJhbiBNb250c2VycmFkbyJdIAoKIyMjIFRPVEFMIFNBTSBNQUxFUyBJTiBHUkFORCBCQVNTQQpTQU1fbnVtX00yIDwtIFNBTVsiTWFsZSIsICJObyIsICJUUlVFIiwiR3JhbmQgQmFzc2EiXSAKCiMjIyBDUkVBVElORyBEQVRBIEZSQU1FIEZPUiBTQU0gQ0FTRVMgQlkgU0VYIEFORCBDT1VOVFkKU0FNX251bWJlciA8LSBkYXRhLmZyYW1lKAogIFNleCA9IGMoIkZlbWFsZSIsICJGZW1hbGUiLCAiTWFsZSIsICJNYWxlIiksCiAgQ291bnR5ID0gYygiVXJiYW4gTW9udHNlcnJhZG8iLCAiR3JhbmQgQmFzc2EiLCAiVXJiYW4gTW9udHNlcnJhZG8iLCAiR3JhbmQgQmFzc2EiKSwgCiAgTnVtYmVyX29mX1NBTSA9IGMoU0FNX251bV9GMSwgU0FNX251bV9GMiwgU0FNX251bV9NMSwgU0FNX251bV9NMikKKQoKIyMgQ1JFQVRJTkcgVEFCTEUgRk9SIFNBTSBDQVNFUyBCWSBTRVggQU5EIENPVU5UWQpTQU1fbnVtYmVyX3RhYmxlIDwtIHh0YWJzKAogIE51bWJlcl9vZl9TQU0gfiBTZXggKyBDb3VudHksIGRhdGEgPSBTQU1fbnVtYmVyCikgCgojIyMgVklFVyBTQU0gQ0FTRVMgQlkgU0VYIEFORCBDT1VOVFkKI1NBTV9udW1iZXJfdGFibGUgCgojIyMgUFJFVkFMRU5DRSBPRiBGRU1BTEUgU0FNIElOIFVSQkFOIE1PTlRTRVJSQURPClByZXYxX1NBTSA8LSBTQU1bIkZlbWFsZSIsICJZZXMiLCAiVFJVRSIsIlVyYmFuIE1vbnRzZXJyYWRvIl0gLyBEZW4gCgojIyMgUFJFVkFMRU5DRSBPRiBGRU1BTEUgU0FNIElOIEdSQU5EIEJBU1NBClByZXYyX1NBTSA8LSBTQU1bIkZlbWFsZSIsICJObyIsICJUUlVFIiwiR3JhbmQgQmFzc2EiXSAvIERlbiAKCiMjIyBQUkVWQUxFTkNFIE9GIE1BTEUgU0FNIElOIFVSQkFOIE1PTlRTRVJSQURPClByZXYzX1NBTSA8LSBTQU1bIk1hbGUiLCAiTm8iLCAiVFJVRSIsIlVyYmFuIE1vbnRzZXJyYWRvIl0gLyBEZW4gCgojIyMgUFJFVkFMRU5DRSBPRiBNQUxFIFNBTSBJTiBHUkFORCBCQVNTQQpQcmV2NF9TQU0gPC0gU0FNWyJNYWxlIiwgIk5vIiwgIlRSVUUiLCJHcmFuZCBCYXNzYSJdIC8gRGVuIAoKIyMjIFBSRVZBTEVOQ0UgT0YgU0FNIENBU0VTIEJZIFNFWCBBTkQgQ09VTlRZClNBTV9wcmV2YWxlbmNlcyA8LSBkYXRhLmZyYW1lKAogIFNleCA9IGMoIkZlbWFsZSIsICJGZW1hbGUiLCAiTWFsZSIsICJNYWxlIiksCiAgQ291bnR5ID0gYygiVXJiYW4gTW9udHNlcnJhZG8iLCAiR3JhbmQgQmFzc2EiLCAiVXJiYW4gTW9udHNlcnJhZG8iLCAiR3JhbmQgQmFzc2EiKSwKICBQcmV2YWxlbmNlX29mX1NBTSA9IGMoUHJldjFfU0FNLCBQcmV2Ml9TQU0sIFByZXYzX1NBTSwgUHJldjRfU0FNKQopIAoKIyMgQ1JFQVRJTkcgVEFCTEUgRk9SIFNBTSBQUkVWQUxFTkNFIEJZIFNFWCBBTkQgQ09VTlRZClNBTV9wcmV2YWxlbmNlc190YWJsZSA8LSB4dGFicygKICBQcmV2YWxlbmNlX29mX1NBTSB+IFNleCArIENvdW50eSwgZGF0YSA9IFNBTV9wcmV2YWxlbmNlcwopIAoKIyMjIFZJRVcgU0FNIFBSRVZBTEVOQ0UgQlkgU0VYIEFORCBDT1VOVFkKI1NBTV9wcmV2YWxlbmNlc190YWJsZQpgYGAKClRoZSBmb2xsb3dpbmcgdGFibGUgcHJlc2VudHMgdGhlIG51bWJlciBvZiBTQU0gY2FzZXMgYnkgc2V4IGFuZCBieSBsb2NhdGlvbi4KCmBgYHtyIHNhbV9jb3VudHNfdGFibGUsIGVjaG8gPSBUUlVFfQpTQU1fbnVtYmVyX3RhYmxlCmBgYAoKSW4gR3JhbmQgQmFzc2EsIHRoZXJlIHdlcmUgKipgciBTQU1fbnVtYmVyX3RhYmxlWzEsIDFdYCBmZW1hbGUgU0FNIGNhc2VzKiogYW5kICoqYHIgU0FNX251bWJlcl90YWJsZVsyLCAxXWAgbWFsZSBTQU0gY2FzZXMqKi4gSW4gVXJiYW4gTW9udHNlcnJhZG8sIHRoZXJlIHdlcmUgKipgciBTQU1fbnVtYmVyX3RhYmxlWzEsIDJdYCBmZW1hbGUgU0FNIGNhc2VzKiogYW5kICoqYHIgU0FNX251bWJlcl90YWJsZVsyLCAyXWAgbWFsZSBTQU0gY2FzZXMqKi4gCgpUaGUgZm9sbG93aW5nIHRhYmxlIHByZXNlbnRzIHRoZSBwcmV2YWxlbmNlIG9mIFNBTSBieSBzZXggYW5kIGJ5IGxvY2F0aW9uLgoKYGBge3Igc2FtX3ByZXZhbGVuY2VfdGFibGUsIGVjaG8gPSBUUlVFfQpTQU1fcHJldmFsZW5jZXNfdGFibGUgCmBgYAoKT2YgdGhlIHRvdGFsIFNBTSBjYXNlcyBpbiB0aGUgc2FtcGxlLCAqKmByIHJvdW5kKFNBTV9wcmV2YWxlbmNlc190YWJsZVsxLCAxXSAqIDEwMCwgZGlnaXRzID0gMilgJSoqIHdlcmUgZmVtYWxlcyBmcm9tIEdyYW5kIEJhc3NhLCAqKmByIHJvdW5kKFNBTV9wcmV2YWxlbmNlc190YWJsZVsyLCAxXSAqIDEwMCwgZGlnaXRzID0gMilgJSoqIHdlcmUgbWFsZXMgZnJvbSBHcmFuZCBCYXNzYSwgKipgciByb3VuZChTQU1fcHJldmFsZW5jZXNfdGFibGVbMSwgMl0gKiAxMDAsIGRpZ2l0cyA9IDIpYCUqKiB3ZXJlIGZlbWFsZXMgZnJvbSBVcmJhbiBNb250c2VycmFkbyBhbmQgKipgciByb3VuZChTQU1fcHJldmFsZW5jZXNfdGFibGVbMiwgMl0gKiAxMDAsIGRpZ2l0cyA9IDIpYCUqKiB3ZXJlIG1hbGVzIGZyb20gVXJiYW4gTW9udHNlcnJhZG8uIAoKIyMjIEdBTSBjYXNlcyBieSBzZXggYW5kIGxvY2F0aW9uCgpUaGUgZm9sbG93aW5nIHN0ZXBzIHdlcmUgdGFrZW4gdG8gcHJvY2VzcyB0aGUgZGF0YSB0byBiZSBhYmxlIHRvIHRhYnVsYXRlIHRoZSBudW1iZXIgb2YgR0FNIGNhc2VzIGJ5IHNleCBhbmQgbG9jYXRpb24gaW4gdGhlIHNhbXBsZS4KCmBgYHtyIGdhbV90YWJsZV9jb2RlLCBlY2hvID0gVFJVRX0KIyMgU0FNIE9SIE1BTSBDQVNFUzoKTUFMTlVUUklUSU9OIDwtIGlmZWxzZShudXQkbXVhYyA8IDExLjUgfCBudXQkb2VkZW1hID09IDEsICJTQU0iLCAiTm8gU0FNIikKCk1BTE5VVFJJVElPTiA8LSBpZmVsc2UoCiAgbnV0JG11YWMgPj0gMTEuNSAmIG51dCRtdWFjIDwgMTIuNSAmIG51dCRvZWRlbWEgPT0gMiwgIk1BTSIsIE1BTE5VVFJJVElPTgopCgpNQUxOVVRSSVRJT04gPC0gaWZlbHNlKE1BTE5VVFJJVElPTiA9PSAiTm8gU0FNIiwgIm5vdCBTQU0gb3IgTUFNIiwgTUFMTlVUUklUSU9OKQoKTUFMTlVUUklUSU9OIDwtIGlmZWxzZShudXQkYWdlID49IDYgJiBudXQkYWdlIDwgNjAsIE1BTE5VVFJJVElPTiwgTkEpCgojIyMgQ1JFQVRJTkcgQSBUQUJMRSBGT1IgRUlUSEVSIE1BTSBPUiBTQU0gQ0FTRVMKZmluYWwgPC0gdGFibGUoCiAgU0VYLCBPRURFTUEsIE1BTE5VVFJJVElPTiwgQ09VTlRZLCB1c2VOQSA9ICJpZmFueSIKKSAKCiMjIyBDUkVBVElORyBBIERBVEEgRlJBTUUgRk9SIFRPVEFMIFNBTSBPUiBNQU0gQ0FTRVMKI2RhdGEuZnJhbWUoZmluYWwpIAoKIyMgTlVNQkVSIE9GIFNBTSBPUiBNQU0gQ0FTRVMKCiMjIyBUT1RBTCBTQU0gT1IgTUFNIEZFTUFMRVMgSU4gVVJCQU4gTU9OVFNFUlJBRE8KU0FNb3JNQU1fRjEgPC0gZmluYWxbIkZlbWFsZSIsICwgYygiTUFNIiwgIlNBTSIpLCAiVXJiYW4gTW9udHNlcnJhZG8iXSAKCiMjIyBUT1RBTCBTQU0gT1IgTUFNIEZFTUFMRVMgSU4gR1JBTkQgQkFTU0EKU0FNb3JNQU1fRjIgPC0gZmluYWxbIkZlbWFsZSIsICwgYygiTUFNIiwgIlNBTSIpLCAiR3JhbmQgQmFzc2EiXSAKCiMjIyBUT1RBTCBTQU0gT1IgTUFNIE1BTEVTIElOIFVSQkFOIE1PTlRTRVJSQURPClNBTW9yTUFNX00xIDwtIGZpbmFsWyJNYWxlIiwgLCBjKCJNQU0iLCAiU0FNIiksICJVcmJhbiBNb250c2VycmFkbyJdIAoKIyMjIFRPVEFMIFNBTSBPUiBNQU0gRkVNQUxFUyBJTiBHUkFORCBCQVNTQQpTQU1vck1BTV9NMiA8LSBmaW5hbFsiTWFsZSIsICwgYygiTUFNIiwgIlNBTSIpLCAiR3JhbmQgQmFzc2EiXSAKCiMjIyBDUkVBVElORyBBIERBVEEgRlJBTUUgRk9SIFRPVEFMIFNBTSBPUiBNQU0gQ0FTRVMgQlkgU0VYIEFORCBDT1VOVFkKU0FNb3JNQU1fbnVtYmVyIDwtIGRhdGEuZnJhbWUoCiAgU2V4ID0gYygiRmVtYWxlIiwgIkZlbWFsZSIsICJNYWxlIiwgIk1hbGUiKSwgCiAgQ291bnR5ID0gYygiVXJiYW4gTW9udHNlcnJhZG8iLCAiR3JhbmQgQmFzc2EiLCAiVXJiYW4gTW9udHNlcnJhZG8iLCAiR3JhbmQgQmFzc2EiKSwgCiAgTnVtYmVyX29mX1NBTW9yTUFNID0gYyhTQU1vck1BTV9GMSwgU0FNb3JNQU1fRjIsIFNBTW9yTUFNX00xLCBTQU1vck1BTV9NMikKKSAKCiMjIyBDUkVBVElORyBBIFRBQkxFIEZPUiBTQU0gT1IgTUFNIENBU0VTIEJZIFNFWCBBTkQgQ09VTlRZClNBTW9yTUFNX251bWJlcl90YWJsZSA8LSB4dGFicygKICBOdW1iZXJfb2ZfU0FNb3JNQU0gfiBTZXggKyBDb3VudHksIGRhdGEgPSBTQU1vck1BTV9udW1iZXIKKSAKCiMjIyBWSUVXIFNBTSBPUiBNQU0gQ0FTRVMgQlkgU0VYIEFORCBDT1VOVFkKI1NBTW9yTUFNX251bWJlcl90YWJsZSAKCiMjIyBQUkVWQUxFTkNFIE9GIEZFTUFMRSBNQU0gT1IgU0FNIENBU0VTIElOIFVSQkFOIE1PTlRTRVJSQURPClByZXYxX1NBTW9yTUFNIDwtIGZpbmFsWyJGZW1hbGUiLCAsIGMoIk1BTSIsICJTQU0iKSwgIlVyYmFuIE1vbnRzZXJyYWRvIl0gLyBEZW4gCgojIyMgUFJFVkFMRU5DRSBPRiBGRU1BTEUgTUFNIE9SIFNBTSBDQVNFUyBJTiBHUkFORCBCQVNTQQpQcmV2Ml9TQU1vck1BTSA8LSBmaW5hbFsiRmVtYWxlIiwgLCBjKCJNQU0iLCAiU0FNIiksICJHcmFuZCBCYXNzYSJdIC8gRGVuIAoKIyMjIFBSRVZBTEVOQ0UgT0YgTUFMRSBNQU0gT1IgU0FNIENBU0VTIElOIFVSQkFOIE1PTlRTRVJSQURPClByZXYzX1NBTW9yTUFNIDwtIGZpbmFsWyJGZW1hbGUiLCAsIGMoIk1BTSIsICJTQU0iKSwgIlVyYmFuIE1vbnRzZXJyYWRvIl0gLyBEZW4gCgojIyMgUFJFVkFMRU5DRSBPRiBGRU1BTEUgTUFNIE9SIFNBTSBDQVNFUyBJTiBHUkFORCBCQVNTQQpQcmV2NF9TQU1vck1BTSA8LSBmaW5hbFsiRmVtYWxlIiwgLCBjKCJNQU0iLCAiU0FNIiksICJHcmFuZCBCYXNzYSJdIC8gRGVuIAoKIyMjIENSRUFUSU5HIEEgREFUQSBGUkFNRSBGT1IgUFJFVkFMRU5DRSBPRiBTQU0gT1IgTUFNIENBU0VTIEJZIFNFWCBBTkQgQ09VTlRZClNBTW9yTUFNX3ByZXZhbGVuY2VzIDwtIGRhdGEuZnJhbWUoCiAgU2V4ID0gYygiRmVtYWxlIiwgIkZlbWFsZSIsICJNYWxlIiwgIk1hbGUiKSwKICBDb3VudHkgPSBjKCJVcmJhbiBNb250c2VycmFkbyIsICJHcmFuZCBCYXNzYSIsICJVcmJhbiBNb250c2VycmFkbyIsICJHcmFuZCBCYXNzYSIpLAogIFByZXZhbGVuY2Vfb2ZfU0FNID0gYyhQcmV2MV9TQU1vck1BTSwgUHJldjJfU0FNb3JNQU0sIFByZXYzX1NBTW9yTUFNLCBQcmV2NF9TQU1vck1BTSkKKSAKCiMjIyBDUkVBVElORyBBIFRBQkxFIEZPUiBQUkVWQUxFTkNFIE9GIFNBTSBPUiBNQU0gQlkgU0VYIEFORCBDT1VOVFkKU0FNb3JNQU1fcHJldmFsZW5jZXNfdGFibGUgPC0geHRhYnMoCiAgUHJldmFsZW5jZV9vZl9TQU0gfiBTZXggKyBDb3VudHksIAogIGRhdGEgPSBTQU1vck1BTV9wcmV2YWxlbmNlcwopIAoKIyMjIFZJRVcgU0FNIE9SIE1BTSBQUkVWQUxFTkNFIEJZIFNFWCBBTkQgQ09VTlRZCiNTQU1vck1BTV9wcmV2YWxlbmNlc190YWJsZSAKYGBgCgpUaGUgZm9sbG93aW5nIHRhYmxlIHByZXNlbnRzIHRoZSBudW1iZXIgb2YgR0FNIGNhc2VzIGJ5IHNleCBhbmQgYnkgbG9jYXRpb24uCgpgYGB7ciBnYW1fY291bnRzX3RhYmxlLCBlY2hvID0gVFJVRX0KU0FNb3JNQU1fbnVtYmVyX3RhYmxlCmBgYAoKSW4gR3JhbmQgQmFzc2EsIHRoZXJlIHdlcmUgKipgciBTQU1vck1BTV9udW1iZXJfdGFibGVbMSwgMV1gIGZlbWFsZSBHQU0gY2FzZXMqKiBhbmQgKipgciBTQU1vck1BTV9udW1iZXJfdGFibGVbMiwgMV1gIG1hbGUgR0FNIGNhc2VzKiouIEluIFVyYmFuIE1vbnRzZXJyYWRvLCB0aGVyZSB3ZXJlICoqYHIgU0FNb3JNQU1fbnVtYmVyX3RhYmxlWzEsIDJdYCBmZW1hbGUgR0FNIGNhc2VzKiogYW5kICoqYHIgU0FNb3JNQU1fbnVtYmVyX3RhYmxlWzIsIDJdYCBtYWxlIEdBTSBjYXNlcyoqLiAKClRoZSBmb2xsb3dpbmcgdGFibGUgcHJlc2VudHMgdGhlIHByZXZhbGVuY2Ugb2YgR0FNIGJ5IHNleCBhbmQgYnkgbG9jYXRpb24uCgpgYGB7ciBnYW1fcHJldmFsZW5jZV90YWJsZSwgZWNobyA9IFRSVUV9ClNBTW9yTUFNX3ByZXZhbGVuY2VzX3RhYmxlIApgYGAKCk9mIHRoZSB0b3RhbCBHQU0gY2FzZXMgaW4gdGhlIHNhbXBsZSwgKipgciByb3VuZChTQU1vck1BTV9wcmV2YWxlbmNlc190YWJsZVsxLCAxXSAqIDEwMCwgZGlnaXRzID0gMilgJSoqIHdlcmUgZmVtYWxlcyBmcm9tIEdyYW5kIEJhc3NhLCAqKmByIHJvdW5kKFNBTW9yTUFNX3ByZXZhbGVuY2VzX3RhYmxlWzIsIDFdICogMTAwLCBkaWdpdHMgPSAyKWAlKiogd2VyZSBtYWxlcyBmcm9tIEdyYW5kIEJhc3NhLCAqKmByIHJvdW5kKFNBTW9yTUFNX3ByZXZhbGVuY2VzX3RhYmxlWzEsIDJdICogMTAwLCBkaWdpdHMgPSAyKWAlKiogd2VyZSBmZW1hbGVzIGZyb20gVXJiYW4gTW9udHNlcnJhZG8gYW5kICoqYHIgcm91bmQoU0FNb3JNQU1fcHJldmFsZW5jZXNfdGFibGVbMiwgMl0gKiAxMDAsIGRpZ2l0cyA9IDIpYCUqKiB3ZXJlIG1hbGVzIGZyb20gVXJiYW4gTW9udHNlcnJhZG8uIAoKIyMgQ292ZXJhZ2Ugb2YgU0FNIHRyZWF0bWVudAo8IS0tLSBJTlNFUlQgVEVYVCBBTkQgTElURVJBVEUgQ09ERSBCRUxPVyBUSElTIExJTkUgLS0tPgoKIyMjIE51bWJlciBvZiBTQU0gY2FzZXMgZm91bmQKClRoZSBmb2xsb3dpbmcgdGFibGUgcHJlc2VudHMgdGhlIG51bWJlciBvZiBjYXNlcyBvZiBTQU0gZm91bmQgaW4gdGhlIG92ZXJhbGwgc2FtcGxlLgoKYGBge3Igc2FtX2NvdW50cywgZWNobyA9IFRSVUV9Cm51dCRzYW1bbnV0JGFnZSA+PSA2ICYgbnV0JGFnZSA8IDYwICYgKG51dCRtdWFjID49IDExLjUgfCBudXQkb2VkZW1hID09IDIpXSA8LSAnbm8nCm51dCRzYW1bbnV0JGFnZSA+PSA2ICYgbnV0JGFnZSA8IDYwICYgKG51dCRtdWFjIDwgMTEuNSB8IG51dCRvZWRlbWEgPT0gMSldIDwtJ3llcycKCnNhbV90YWJsZSA8LSB0YWJsZShudXQkc2FtKQoKc2FtX3RhYmxlCmBgYAoKVGhlcmUgd2VyZSBhIHRvdGFsIG9mICoqYHIgc2FtX3RhYmxlWzJdYCBTQU0gY2FzZXMqKiBmb3VuZCBpbiB0aGUgb3ZlcmFsbCBzYW1wbGUuCgpUaGUgZm9sbG93aW5nIHRhYmxlIHByZXNlbnRzIHRoZSBudW1iZXIgb2YgU0FNIGNhc2VzIGZvdW5kIGluIHRoZSBzYW1wbGUgYnkgbG9jYXRpb24uCgpgYGB7ciBzYW1fY291bnRzX2xvY2F0aW9uLCBlY2hvID0gVFJVRX0Kc2FtX2xvY2F0aW9uX3RhYmxlIDwtIHRhYmxlKG51dCRzYW0sIG51dCRjb3VudHkpCgpzYW1fbG9jYXRpb25fdGFibGUKYGBgCgpUaGVyZSB3ZXJlIGEgdG90YWwgb2YgKipgciBzYW1fbG9jYXRpb25fdGFibGVbMiwgMV1gIFNBTSBjYXNlcyoqIGZvdW5kIGluIEdyYW5kIEJhc3NhIGNvbXBhcmVkIHRvICoqYHIgc2FtX2xvY2F0aW9uX3RhYmxlWzIsIDJdYCBTQU0gY2FzZXMqKiBmb3VuZCBpbiBVcmJhbiBNb250c2VycmFkby4KClRoZSBmb2xsb3dpbmcgdGFibGUgcHJlc2VudHMgdGhlIG51bWJlciBvZiBTQU0gY2FzZXMgZm91bmQgaW4gdGhlIHNhbXBsZSBieSBzdXJ2ZXkgcm91bmQuCgpgYGB7ciBzYW1fY291bnRzX3JvdW5kLCBlY2hvID0gVFJVRX0Kc2FtX3JvdW5kc190YWJsZSA8LSB0YWJsZShudXQkc2FtLCBudXQkc3VydmV5X3JvdW5kKQoKc2FtX3JvdW5kc190YWJsZQpgYGAKClRoZXJlIHdlcmUgYSB0b3RhbCBvZiAqKmByIHNhbV9yb3VuZHNfdGFibGVbMiwgMV1gIFNBTSBjYXNlcyoqIGZvdW5kIGF0IGJhc2VsaW5lIHN1cnZleSByb3VuZCBjb21wYXJlZCB0byAqKmByIHNhbV9yb3VuZHNfdGFibGVbMiwgMl1gIFNBTSBjYXNlcyoqIGZvdW5kIGF0IGVuZGxpbmUgc3VydmV5IHJvdW5kLgoKVGhlIGZvbGxvd2luZyB0YWJsZSBwcmVzZW50cyB0aGUgbnVtYmVyIG9mIFNBTSBjYXNlcyBmb3VuZCBpbiB0aGUgc2FtcGxlIGJ5IGxvY2F0aW9uIGFuZCBzdXJ2ZXkgcm91bmQuCgpgYGB7ciBzYW1fbG9jYXRpb25fcm91bmQsIGVjaG8gPSBUUlVFfQpzYW1fbG9jYXRpb25fcm91bmRzX3RhYmxlIDwtIHRhYmxlKG51dCRzYW0sIG51dCRzdXJ2ZXlfcm91bmQsIG51dCRjb3VudHkpCgpzYW1fbG9jYXRpb25fcm91bmRzX3RhYmxlCmBgYAoKSW4gR3JhbmQgQmFzc2EsIHRoZXJlIHdlcmUgYSB0b3RhbCBvZiAqKmByIHNhbV9sb2NhdGlvbl9yb3VuZHNfdGFibGVbMiwgMSwgMV1gIFNBTSBjYXNlcyoqIGZvdW5kIGF0IGJhc2VsaW5lIGFuZCAqKmByIHNhbV9sb2NhdGlvbl9yb3VuZHNfdGFibGVbMiwgMiwgMV1gKiogU0FNIGNhc2VzIGZvdW5kIGF0IGVuZGxpbmUuCgpJbiBVcmJhbiBNb250c2VycmFkbywgdGhlcmUgd2VyZSBhIHRvdGFsIG9mICoqYHIgc2FtX2xvY2F0aW9uX3JvdW5kc190YWJsZVsyLCAxLCAyXWAgU0FNIGNhc2VzKiogZm91bmQgYXQgYmFzZWxpbmUgYW5kICoqYHIgc2FtX2xvY2F0aW9uX3JvdW5kc190YWJsZVsyLCAyLCAyXWAqKiBTQU0gY2FzZXMgZm91bmQgYXQgZW5kbGluZS4KCiMjIyBDYXNlLWZpbmRpbmcgZWZmZWN0aXZlbmVzcwoKVGhlIGZvbGxvd2luZyB0YWJsZSBwcmVzZW50cyB0aGUgY2FzZS1maW5kaW5nIGVmZmVjdGl2ZW5lc3Mgb2YgdGhlIENNQU0gcHJvZ3JhbW1lIG92ZXJhbGwuCgpgYGB7ciBjYXNlLWZpbmRpbmd9CnNhbWNvdiA8LSB0YWJsZShudXQkc2FtLCBudXQkY292X3N0YXR1cykKCnNhbWNvdgojIyBwcm9wLnRhYmxlKHNhbWNvdikgKiAxMDAgICAgICBUaGlzIGNvZGUgZ2l2ZXMgcHJvcG9ydGlvbiBvZiBTQU0gY2FzZXMgaW4gdGhlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMjIHByb2dyYW1tZSBieSBhbGwgY2hpbGRyZW4gaW4gdGhlIHNhbXBsZSB3aGljaCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyMgaXMgbm90IGNvbnNpc3RlbnQgd2l0aCB0aGUgY292ZXJhZ2UgZXN0aW1hdG9yCgojIyBUaGlzIGNvZGUgY2FsY3VsYXRlcyB0aGUgcHJvcG9ydGlvbnMgZm9yIG9ubHkgdGhvc2UgY2hpbGRyZW4gd2hvIGFyZSBTQU0gYW5kIAojIyBpbiB0aGUgcHJvZ3JhbW1lCnNhbWNvdnByb3AgPC0gcHJvcC50YWJsZShzYW1jb3ZbMiwgXSAqIDEwMCkKCnNhbWNvdnByb3AKYGBgCgpUaGUgY2FzZS1maW5kaW5nIGVmZmVjdGl2ZW5lc3Mgb2YgdGhlIENNQU0gcHJvZ3JhbW1lIG92ZXJhbGwgd2FzIGF0ICoqYHIgcm91bmQoc2FtY292cHJvcFsxXSwgZGlnaXRzID0gMilgJSoqLiAKClRoZSBmb2xsb3dpbmcgdGFibGUgcHJlc2VudHMgdGhlIGNhc2UtZmluZGluZyBlZmZlY3RpdmVuZXNzIG9mIHRoZSBDTUFNIHByb2dyYW1tZSBieSBsb2NhdGlvbi4KCmBgYHtyIGNhc2UtZmluZGluZy1sb2NhdGlvbiwgZWNobyA9IFRSVUV9CnNhbWNvdmxvYyA8LSB0YWJsZShudXQkc2FtLCBudXQkY292X3N0YXR1cywgbnV0JGNvdW50eSkKCnNhbWNvdmxvYwoKIyMgcHJvcC50YWJsZShzYW1jb3Zsb2MpICogMTAwICAgICBUaGlzIGNvZGUgZ2l2ZXMgcHJvcG9ydGlvbiBvZiBTQU0gY2FzZXMgaW4gdGhlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyMgcHJvZ3JhbW1lIGJ5IGFsbCBjaGlsZHJlbiBpbiB0aGUgc2FtcGxlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyMgd2hpY2ggaXMgbm90IGNvbnNpc3RlbnQgd2l0aCB0aGUgY292ZXJhZ2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIyBlc3RpbWF0b3IKCiMjIFRoaXMgY29kZSBjYWxjdWxhdGVzIHRoZSBwcm9wb3J0aW9ucyBmb3Igb25seSB0aG9zZSBjaGlsZHJlbiB3aG8gYXJlIFNBTQojIyBhbmQgaW4gdGhlIHByb2dyYW1tZSBmb3IgZWFjaCBsb2NhdGlvbgpzYW1jb3ZfZ3JhbmRiYXNzYSA8LSBwcm9wLnRhYmxlKHNhbWNvdmxvY1syLCAsIDFdKSAqIDEwMAoKc2FtY292X2dyYW5kYmFzc2EKCnNhbWNvdl91cmJhbm1vbnRzZXJyYWRvIDwtIHByb3AudGFibGUoc2FtY292bG9jWzIsICwgMl0pICogMTAwCgpzYW1jb3ZfdXJiYW5tb250c2VycmFkbwpgYGAKCkluIEdyYW5kIEJhc3NhLCB0aGUgY2FzZS1maW5kaW5nIGVmZmVjdGl2ZW5lc3Mgb2YgdGhlIENNQU0gcHJvZ3JhbW1lIHdhcyBhdCAqKmByIHJvdW5kKHNhbWNvdl9ncmFuZGJhc3NhWzFdLCBkaWdpdHMgPSAyKWAlKiouIEluIFVyYmFuIE1vbnRzZXJyYWRvLCB0aGUgY2FzZS1maW5kaW5nIGVmZmVjdGl2ZW5lc3Mgb2YgdGhlIENNQU0gcHJvZ3JhbW1lIHdhcyBhdCAqKmByIHJvdW5kKHNhbWNvdl91cmJhbm1vbnRzZXJyYWRvWzFdLCBkaWdpdHMgPSAyKWAlKiouCgo8YnIvPgo8YnIvPg==