Last compiled on May, 2025
This is the code with which we make our independent variables.
Initatiating R
environment
Start out with a custom function to load a set of required packages.
And load the necessary data.
# packages and read data
rm(list = ls())
# (c) Jochem Tolsma
fpackage.check <- function(packages) {
lapply(packages, FUN = function(x) {
if (!require(x, character.only = TRUE)) {
install.packages(x, dependencies = TRUE)
library(x, character.only = TRUE)
}
})
}
packages = c("haven", "coda", "matrixStats", "parallel", "MASS", "doParallel", "dplyr", "cowplot", "tidyverse",
"naniar", "dotwhisker", "gt", "reshape2", "VGAM", "expss")
fpackage.check(packages)
rm(packages)
load(file = "data/dutch_netsize_analyses_deps.rda")
# 1-(1262/1325)
#--------------------------------------------------------------------------------
Eyeballing the
variables
Some initial eyeballing of the data. What are value labels, for
instance, that we can use later?
# eyeballing corona == 1 missing
val_lab(df$V4)
table(df$V4)
# moeder == 6 missing
val_lab(df$V5a)
v <- data.frame(table(df$V5a_anders))
m <- data.frame(table(df$V5b_anders))
# table(df$migr) hier kunnen we w/nw van maken, voor nu is me dat te veel werk
# vader == 4 missing
val_lab(df$V5b)
table(df$V5b)
# elect auto -== 1 missing
val_lab(df$V6)
table(df$V6)
# scooter == no missing
val_lab(df$V7)
table(df$V7)
# vegan == 3 missing
val_lab(df$V8)
table(df$V8)
# geslacht == no missing
val_lab(df$geslacht)
table(df$geslacht)
# opleiding == no missing, 8 'wil niet zeggen'
val_lab(df$opleiding)
table(df$opleiding)
# leeftijd == no missing
table(df$leeftijd)
class(df$leeftijd)
# zipcode == no missing
table(df$postcode)
class(df$postcode)
# new vars io
val_lab(df$werk) # werk
val_lab(df$woonsituatie) # wonen
val_lab(df$huishoudomvang) # huishouden
val_lab(df$inkomen) # income
val_lab(df$politiek) # politics
table(df$politiek) # politics
Education
Next, we make the education variable, not the value labels below and
how I create the variable.
#--------------------------------------------------------------------------------
# opleiding
# geen onderwijs / basisonderwijs / cursus inburgering / cursus Nederlandse taal 1 LBO / VBO / VMBO
# (kader- of beroepsgerichte leerweg) / MBO 1 (assistentenopleidi 2 MAVO / HAVO of VWO (eerste drie
# jaar) / ULO / MULO / VMBO (TL of GL) / VSO 3 MBO 2, 3, 4 (basisberoeps-, vak-, middenkader- of
# specialistenopleiding) of MBO 4 HAVO of VWO (overgegaan naar de 4e klas) / HBS / MMS / HBO
# propedeuse of WO Prop 5 HBO (behalve HBO-master) / WO-kandidaats -of WO-bachelor 6 WO-doctoraal
# of WO-master of HBO-master / postdoctoraal onderwijs 7 weet niet/wil niet zeggen 8 we recreate to
# 3 cats
table(df$opleiding)
df$opl[df$opleiding == 1] <- 1 # prim/sec
df$opl[df$opleiding == 2] <- 1 # prim/sec
df$opl[df$opleiding == 3] <- 1 # prim/sec
df$opl[df$opleiding == 4] <- 2 # lower tert
df$opl[df$opleiding == 5] <- 3 # higher tert/higher prep
df$opl[df$opleiding == 6] <- 3 # higher tert
df$opl[df$opleiding == 7] <- 3 # higher tert
table(df$opl)
df$opl <- as.factor(df$opl)
df <- within(df, opl <- relevel(opl, ref = 3))
Self-reported
gender
Next up, self reported gender, no missings.
#--------------------------------------------------------------------------------
# nothing wrong with geslacht
table(df$geslacht)
df$woman[df$geslacht == 2] <- 1
df$woman[df$geslacht == 1] <- 0
#--------------------------------------------------------------------------------
Migration
background
Migration background is a bit more challenging as there are some open
answers of countries that we do want to include in this variable.
# migration background
table(df$V5a_anders)
table(df$V5b_anders)
table(df$V5a)
table(df$V5b)
# df <- df[!df$V5a == 3, ] # drop the missings
# df <- df[!df$V5b == 3, ]
# so if not a 1 (Dutch?) always get a migrant background
df$migr <- ifelse(df$V5a == 2 & df$V5a != 3 |
df$V5b == 2 & df$V5b != 3, 1, # either mother father abroad == 1
ifelse(df$V5a == 3 & df$V5b == 3, 3, 0)) # both missing == 3, otherwise 0
table(df$migr)
nrow(df[is.na(df$migr),])
df$vader[df$V5a == 1] <- 1
df$vader[df$V5a_anders=="Amerika"]<-2
df$vader[df$V5a_anders=="Aruba"]<-3
df$vader[df$V5a_anders=="Belgie"]<-2
df$vader[df$V5a_anders=="België"]<-2
df$vader[df$V5a_anders=="Brazilië"]<-3
df$vader[df$V5a_anders=="Cameroun"]<-3
df$vader[df$V5a_anders=="China"]<-3
df$vader[df$V5a_anders=="Curaçao"]<-3
df$vader[df$V5a_anders=="duitsland"]<-2
df$vader[df$V5a_anders=="Duitsland"]<-2
df$vader[df$V5a_anders=="Engeland"]<-2
df$vader[df$V5a_anders=="EU"]<-2
df$vader[df$V5a_anders=="Filipijnen"]<-3
df$vader[df$V5a_anders=="frankrijk"]<-2
df$vader[df$V5a_anders=="Frankrijk"]<-2
df$vader[df$V5a_anders=="indie"]<-2
df$vader[df$V5a_anders=="indonesie"]<-2
df$vader[df$V5a_anders=="Indonesie"]<-2
df$vader[df$V5a_anders=="Indonesië"]<-2
df$vader[df$V5a_anders=="Iran"]<-3
df$vader[df$V5a_anders=="Italie"]<-2
df$vader[df$V5a_anders=="Italië"]<-2
df$vader[df$V5a_anders=="Lettland"]<-2
df$vader[df$V5a_anders=="Marokko"]<-3
df$vader[df$V5a_anders=="Nederlands Indie"]<-2
df$vader[df$V5a_anders=="Nederlands Indië"]<-2
df$vader[df$V5a_anders=="Nieuw-Zeeland"]<-2
df$vader[df$V5a_anders=="Nigeria"]<-3
df$vader[df$V5a_anders=="Oeganda"]<-3
df$vader[df$V5a_anders=="Oostenrijk"]<-3
df$vader[df$V5a_anders=="Polen"]<-3
df$vader[df$V5a_anders=="Polen en Nederland"]<-2
df$vader[df$V5a_anders=="Spanje"]<-2
df$vader[df$V5a_anders=="Sri Lanka"]<-3
df$vader[df$V5a_anders=="suriname"]<-3
df$vader[df$V5a_anders=="Suriname"]<-3
df$vader[df$V5a_anders=="Syrië"]<-3
df$vader[df$V5a_anders=="Turkije"]<-3
df$vader[df$V5a_anders=="Venezuela"]<-3
df$vader[df$V5a_anders=="Verenigd Koninkrijk"]<-2
df$vader[df$V5a_anders=="Yugoslavia"]<-2
df$vader[df$V5a_anders=="Zuid Afrika"]<-3
table(df$vader)
nrow(df[is.na(df$vader), ])
So now we coded the fathers, and we move on with the mothers.
# df$vader <- ifelse(df$V5a == 3 & df$V5a_anders == '', NA, df$vader)
df$moeder[df$V5b == 1] <- 1
table(df$V5b_anders)
df$moeder[df$V5b_anders == "algerije"] <- 3
df$moeder[df$V5b_anders == "Aruba"] <- 3
df$moeder[df$V5b_anders == "Australie"] <- 2
df$moeder[df$V5b_anders == "Belgie"] <- 2
df$moeder[df$V5b_anders == "China"] <- 3
df$moeder[df$V5b_anders == "Curaçao"] <- 3
df$moeder[df$V5b_anders == "duitsland"] <- 2
df$moeder[df$V5b_anders == "Duitsland"] <- 3
df$moeder[df$V5b_anders == "Engelabd"] <- 2
df$moeder[df$V5b_anders == "Engeland"] <- 2
df$moeder[df$V5b_anders == "EU"] <- 2
df$moeder[df$V5b_anders == "Filipijnen"] <- 3
df$moeder[df$V5b_anders == "frankrijk"] <- 2
df$moeder[df$V5b_anders == "Frankrijk"] <- 2
df$moeder[df$V5b_anders == "GB"] <- 2
df$moeder[df$V5b_anders == "indonesie"] <- 2
df$moeder[df$V5b_anders == "Indonesie"] <- 2
df$moeder[df$V5b_anders == "Indonesië"] <- 2
df$moeder[df$V5b_anders == "Irak"] <- 3
df$moeder[df$V5b_anders == "Italie"] <- 2
df$moeder[df$V5b_anders == "Kongo"] <- 3
df$moeder[df$V5b_anders == "Marokko"] <- 3
df$moeder[df$V5b_anders == "Nederlands indie"] <- 2
df$moeder[df$V5b_anders == "Nederlands Indie"] <- 2
df$moeder[df$V5b_anders == "Nederlands Indië"] <- 2
df$moeder[df$V5b_anders == "Nigeria"] <- 3
df$moeder[df$V5b_anders == "Oostenrijk"] <- 2
df$moeder[df$V5b_anders == "Phnom Penh"] <- 3
df$moeder[df$V5b_anders == "Polen"] <- 2
df$moeder[df$V5b_anders == "Rusland"] <- 2
df$moeder[df$V5b_anders == "singapore"] <- 3
df$moeder[df$V5b_anders == "Spanje"] <- 2
df$moeder[df$V5b_anders == "suriname"] <- 3
df$moeder[df$V5b_anders == "Suriname"] <- 3
df$moeder[df$V5b_anders == "Syrië"] <- 3
df$moeder[df$V5b_anders == "Turkije"] <- 3
df$moeder[df$V5b_anders == "Venezuela"] <- 3
df$moeder[df$V5b_anders == "zie 5A"] <- 1
df$moeder[df$V5b_anders == "Zwitserland"] <- 2
# df$moeder <- ifelse(df$V5b == 3 & df$V5b_anders == '', NA, df$moeder)
Now that we created mother and father birth country, we implement a
heuristic for migration background: majority, westerns, non-western
migration background.
table(df$moeder)
nrow(df[is.na(df$moeder), ])
df$migr3[df$moeder == 1 & df$vader == 1] <- 1
df$migr3[df$moeder == 2 & df$vader == 2] <- 2
df$migr3[df$moeder == 3 & df$vader == 3] <- 3
df$migr3[df$moeder == 3 & df$vader == 2] <- 3
df$migr3[df$moeder == 3 & df$vader == 1] <- 3
df$migr3[df$moeder == 2 & df$vader == 1] <- 2
df$migr3[df$moeder == 2 & df$vader == 3] <- 2
df$migr3[df$moeder == 1 & df$vader == 2] <- 2
df$migr3[df$moeder == 1 & df$vader == 3] <- 3
df$migr3[is.na(df$moeder) & df$vader == 1] <- 1
df$migr3[is.na(df$moeder) & df$vader == 2] <- 2
df$migr3[is.na(df$moeder) & df$vader == 3] <- 3
df$migr3[is.na(df$vader) & df$moeder == 1] <- 1
df$migr3[is.na(df$vader) & df$moeder == 2] <- 2
df$migr3[is.na(df$vader) & df$moeder == 3] <- 3
table(df$migr3)
table(df$migr)
# 1 Maj 2 west 3 nonwest
Age
We create age and age squared as variables.
#--------------------------------------------------------------------------------
# age
df$leeftijd10 <- df$leeftijd/10
table(df$leeftijd10)
df$leeftijd10sq <- df$leeftijd10^2
df$agecat <- NA
df$agecat[df$leeftijd < 31] <- "18-30"
df$agecat[df$leeftijd > 30 & df$leeftijd < 46] <- "31-45"
df$agecat[df$leeftijd > 45 & df$leeftijd < 66] <- "46-65"
df$agecat[df$leeftijd > 65] <- ">65"
table(df$agecat)
# table(df$leeftijd)
nrow(df[df$leeftijd < 31, ])
nrow(df[df$leeftijd > 30 & df$leeftijd < 46, ])
nrow(df[df$leeftijd > 45 & df$leeftijd < 66, ])
nrow(df[df$leeftijd > 65, ])
Work situation
We create the current working situation of a respondent. (These are
new variable obtained from I&O research, hence the hassle with the
identifier before.)
#--------------------------------------------------------------------------------
# NEW IO VARS
#--------------------------------------------------------------------------------
# working val_lab(df$werk)
df$werk <- as.character(df$werk)
df$work <- 1
df$work[df$werk == "anders"] <- 0
df$work[df$werk == "werkloos / werkzoekend / bijstand"] <- 0
df$work[df$werk == "studerend /schoolgaand"] <- 0
df$work[df$werk == "arbeidsongeschikt"] <- 0
df$work[df$werk == "gepensioneerd of VUT"] <- 0
df$work[df$werk == "huisvrouw / huisman"] <- 0
table(df$work)
table(df$werk)
Living situation
Whether respondents live alone or not.
#--------------------------------------------------------------------------------
# livingalone livingalone
df$woonsituatie <- as.character(df$woonsituatie)
df$livingalone <- 1
df$livingalone[df$woonsituatie == "ik ben gehuwd/woon samen zonder thuiswonende kinderen"] <- 0
df$livingalone[df$woonsituatie == "ik woon bij mijn ouder(s)/verzorger(s)"] <- 0
df$livingalone[df$woonsituatie == "ik ben gehuwd/woon samen met thuiswonende kinderen"] <- 0
df$livingalone[df$woonsituatie == "ik woon alleen (zonder partner) met kinderen"] <- 0
df$livingalone[df$woonsituatie == "anders"] <- 0
df$livingalone[is.na(df$woonsituatie)] <- 2
df$livingalone[df$woonsituatie == "weet niet/wil niet zeggen"] <- 2 # --> should drop this one!
table(df$livingalone)
table(df$woonsituatie)
Household size
Respondent household size.
#--------------------------------------------------------------------------------
# householdsize
df$hhsize <- as.character(df$huishoudomvang)
table(df$hhsize)
df$hhsize[df$hhsize == "1 (alleen ikzelf)"] <- 1
df$hhsize <- as.numeric(df$hhsize)
table(df$hhsize)
df$hhsize[df$livingalone == 1] <- 1 # this overrides with prior answer
table(df$hhsize)
table(df$huishoudomvang)
Income
Respondent income.
#--------------------------------------------------------------------------------
# income
table(df$inkomen)
df$inkomen <- as.character(df$inkomen)
nrow(df[is.na(df$inkomen), ]) # --> 37 missings
df$income[df$inkomen == "minimum (Minder dan € 14.100)"] <- 1
df$income[df$inkomen == "beneden modaal (€ 14.100 tot € 29.500)"] <- 1
df$income[df$inkomen == "bijna modaal (€ 29.500 tot € 36.500)"] <- 1
df$income[df$inkomen == "modaal (€ 36.500 tot € 43.500)"] <- 1
df$income[df$inkomen == "tussen 1 en 2 keer modaal (€ 43.500 tot € 73.000)"] <- 2
df$income[df$inkomen == "twee keer modaal (€ 73.000 tot € 87.100)"] <- 2
df$income[df$inkomen == "meer dan 2 keer modaal (€ 87.100 of meer)"] <- 2
df$income[df$inkomen == "weet ik niet / wil ik niet zeggen"] <- 3
df$income[is.na(df$inkomen)] <- 3
table(df$income)
# 1 up to modal 2 modal and up 3 NA/doesn't know/doesn't want to say
Zipcode info
We create a number of variables that relate to folks’ zipcodes.
#--------------------------------------------------------------------------------
# zip info
zip <- read.csv("data/postcode4.csv") # --> https://www.cbs.nl/nl-nl/dossier/nederland-regionaal/geografische-data/gegevens-per-postcode
zip <- zip[-2, ]
zipnames <- zip[1, ]
names(zip) <- zipnames
zipnames <- zip[-1, ]
zip <- zip %>%
replace_with_na_all(condition = ~.x == -99997)
df$postcode <- as.numeric(df$postcode)
zip$PC4 <- as.numeric(zip$PC4)
df <- left_join(df, zip[, c("PC4", "OAD", "UITKMINAOW", "P_KOOPWON", "WOZWONING", "P_NL_ACHTG", "INWONER")],
by = c(postcode = "PC4"))
df$neighdens <- as.numeric(df$OAD)/1000
df$pbenrec <- (as.numeric(df$UITKMINAOW)/as.numeric(df$INWONER)) * 100
df$pbuyhouse <- as.numeric(df$P_KOOPWON)
df$worthhouse <- as.numeric(df$WOZWONING)/100
df$pdutch <- as.numeric(df$P_NL_ACHTG)
nrow(df[is.na(df$neighdens), ])
summary(df$pbenrec)
summary(df$neighdens)
summary(df$pbuyhouse)
summary(df$worthhouse)
summary(df$pdutch)
Unused variables
There are a number of remaining variables to the data that we do not
use in this particular paper.
#--------------------------------------------------------------------------------
# politics
table(df$politiek)
df$politiek <- as.character(df$politiek)
# right
df$politics <- 3
df$politics[df$politiek == "VVD"] <- 1
df$politics[df$politiek == "PVV"] <- 1
df$politics[df$politiek == "CDA"] <- 1
df$politics[df$politiek == "Forum voor Democratie"] <- 1
df$politics[df$politiek == "ChristenUnie"] <- 1
df$politics[df$politiek == "SGP"] <- 1
df$politics[df$politiek == "BoerBurgerBeweging"] <- 1
df$politics[df$politiek == "JA21"] <- 1
df$politics[df$politiek == "50PLUS"] <- 1
# left
df$politics[df$politiek == "D66"] <- 2
df$politics[df$politiek == "SP"] <- 2
df$politics[df$politiek == "PvdA"] <- 2
df$politics[df$politiek == "GroenLinks"] <- 2
df$politics[df$politiek == "Partij voor de Dieren"] <- 2
df$politics[df$politiek == "Volt"] <- 2
df$politics[df$politiek == "DENK"] <- 2
df$politics[df$politiek == "BIJ1"] <- 2
table(df$politics)
# 1 right 2 left 3 no voting, blanco, no voting rights, doesn't wanna say, etc.
#--------------------------------------------------------------------------------
# unused vars drop missings and create corona var
table(df$V4)
df$coronaiv <- df$V4
table(df$coronaiv)
# create electric vehicle var
table(df$V6)
df$elecaut <- df$V6
table(df$elecaut)
# create scooter var
table(df$V7)
df$scooteriv <- df$V7
table(df$scooteriv)
# create vagan var
table(df$V8)
df$veganiv <- df$V8
# progressive construction: elec vehicle or vegan == progressive
df$progr <- ifelse(df$veganiv == 1 | df$elecaut == 1, 1, 0)
table(df$progr)
Sample selections
Finally, we apply some sample selection based on the missigness in
the data. Not much, as you can see below.
#--------------------------------------------------------------------------------
# missingness and sample selection nrow(df[is.na(df$leeftijd10),]) # no missing
nrow(df[is.na(df$agecat), ]) # no missing
nrow(df[is.na(df$geslacht), ]) # no missing
nrow(df[is.na(df$opl), ]) # no missing
nrow(df[is.na(df$V5a), ]) # six missing
nrow(df[is.na(df$V5b), ]) # four missing
nrow(df[df$migr == 3, ]) # four missing on effective variable
table(df$migr)
nrow(df[is.na(df$migr3), ]) # four missing
# nrow(df[is.na(df$pbenrec), ]) nrow(df[is.na(df$neighdens), ]) # four missing
# nrow(df[is.na(df$pbuyhouse), ])
nrow(df[is.na(df$worthhouse), ]) # eight missing
# nrow(df[is.na(df$pdutch), ])
nrow(df[is.na(df$werk), ]) # no missing
nrow(df[is.na(df$work), ]) # no missing
nrow(df[is.na(df$hhsize), ]) # 1 missing
nrow(df[is.na(df$income), ]) # no missing
nrow(df[df$income == 3, ]) # though 184 won't say/know
nrow(df[is.na(df$inkomen), ]) # oif which 37 system missing
# nrow(df[is.na(df$politics),]) # no missing nrow(df[df$politics == 3,]) # though 223 won't
# say/know nrow(df[is.na(df$politiek),]) # oif which 135 system missing
# df <- df[!is.na(df$pbenrec), ] df <- df[!is.na(df$neighdens), ] df <- df[!is.na(df$pbuyhouse), ]
df <- df[!is.na(df$worthhouse), ]
df <- df[!is.na(df$migr3), ]
df <- df[!is.na(df$hhsize), ]
# df <- df[!is.na(df$pdutch), ]
# df <- df[!df$coronaiv == 3,] df <- df[!df$elecauto == 3,] df <- df[!df$veganiv == 3,] df <-
# df[!df$scooteriv == 3,] summary(df$hhsize)
#--------------------------------------------------------------------------------
Data storage
Finally, we save the data that we use for the analyses.
# save data
save(df, file = "data/dutch_netsize_analyses.rda")
#--------------------------------------------------------------------------------
LS0tCnRpdGxlOiAiSW5kZXBlbmRlbnQgdmFyaWFibGVzIgojYmlibGlvZ3JhcGh5OiByZWZlcmVuY2VzLmJpYgphdXRob3I6ICJCYXMgSG9mc3RyYSIKLS0tCgpgYGB7ciwgZ2xvYmFsc2V0dGluZ3MsIGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0UsIHJlc3VsdHM9J2hpZGUnfQpsaWJyYXJ5KGtuaXRyKQoKa25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFKQpvcHRzX2NodW5rJHNldCh0aWR5Lm9wdHM9bGlzdCh3aWR0aC5jdXRvZmY9MTAwKSx0aWR5PVRSVUUsIHdhcm5pbmcgPSBGQUxTRSwgbWVzc2FnZSA9IEZBTFNFLGNvbW1lbnQgPSAiIz4iLCBjYWNoZT1UUlVFLCBjbGFzcy5zb3VyY2U9YygidGVzdCIpLCBjbGFzcy5vdXRwdXQ9YygidGVzdDIiKSkKb3B0aW9ucyh3aWR0aCA9IDEwMCkKcmdsOjpzZXR1cEtuaXRyKCkKCgoKY29sb3JpemUgPC0gZnVuY3Rpb24oeCwgY29sb3IpIHtzcHJpbnRmKCI8c3BhbiBzdHlsZT0nY29sb3I6ICVzOyc+JXM8L3NwYW4+IiwgY29sb3IsIHgpIH0KCmBgYAoKYGBge3Iga2xpcHB5LCBlY2hvPUZBTFNFLCBpbmNsdWRlPVRSVUV9CmtsaXBweTo6a2xpcHB5KHBvc2l0aW9uID0gYygndG9wJywgJ3JpZ2h0JykpCiNrbGlwcHk6OmtsaXBweShjb2xvciA9ICdkYXJrcmVkJykKI2tsaXBweTo6a2xpcHB5KHRvb2x0aXBfbWVzc2FnZSA9ICdDbGljayB0byBjb3B5JywgdG9vbHRpcF9zdWNjZXNzID0gJ0RvbmUnKQpgYGAKCkxhc3QgY29tcGlsZWQgb24gYHIgZm9ybWF0KFN5cy50aW1lKCksICclQiwgJVknKWAKCjxicj4KCi0tLS0KClRoaXMgaXMgdGhlIGNvZGUgd2l0aCB3aGljaCB3ZSBtYWtlIG91ciBpbmRlcGVuZGVudCB2YXJpYWJsZXMuCgo8YnI+CgotLS0tCgojIEluaXRhdGlhdGluZyBSIGVudmlyb25tZW50CgpTdGFydCBvdXQgd2l0aCBhIGN1c3RvbSBmdW5jdGlvbiB0byBsb2FkIGEgc2V0IG9mIHJlcXVpcmVkIHBhY2thZ2VzLiBBbmQgbG9hZCB0aGUgbmVjZXNzYXJ5IGRhdGEuCiAgCmBgYHtyIHBhY2ssIGV2YWw9RkFMU0V9CiMgcGFja2FnZXMgYW5kIHJlYWQgZGF0YQpybShsaXN0ID0gbHMoKSkKCiMgKGMpIEpvY2hlbSBUb2xzbWEKZnBhY2thZ2UuY2hlY2sgPC0gZnVuY3Rpb24ocGFja2FnZXMpIHsKICBsYXBwbHkocGFja2FnZXMsIEZVTiA9IGZ1bmN0aW9uKHgpIHsKICAgIGlmICghcmVxdWlyZSh4LCBjaGFyYWN0ZXIub25seSA9IFRSVUUpKSB7CiAgICAgIGluc3RhbGwucGFja2FnZXMoeCwgZGVwZW5kZW5jaWVzID0gVFJVRSkKICAgICAgbGlicmFyeSh4LCBjaGFyYWN0ZXIub25seSA9IFRSVUUpCiAgICB9CiAgfSkKfQpwYWNrYWdlcyA9IGMoImhhdmVuIiwgImNvZGEiLCAibWF0cml4U3RhdHMiLCAicGFyYWxsZWwiLCAiTUFTUyIsICJkb1BhcmFsbGVsIiwgImRwbHlyIiwgImNvd3Bsb3QiLCAKICAgICAgICAgICAgICJ0aWR5dmVyc2UiLCAibmFuaWFyIiwgImRvdHdoaXNrZXIiICwiZ3QiLCAicmVzaGFwZTIiLCAiVkdBTSIsICJleHBzcyIpCmZwYWNrYWdlLmNoZWNrKHBhY2thZ2VzKQpybShwYWNrYWdlcykKCmxvYWQoZmlsZSA9ICJkYXRhL2R1dGNoX25ldHNpemVfYW5hbHlzZXNfZGVwcy5yZGEiKQojMS0oMTI2Mi8xMzI1KQoKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmBgYAoKPGJyPgoKLS0tLQogIAojIEV5ZWJhbGxpbmcgdGhlIHZhcmlhYmxlcyAgCiAgClNvbWUgaW5pdGlhbCBleWViYWxsaW5nIG9mIHRoZSBkYXRhLiBXaGF0IGFyZSB2YWx1ZSBsYWJlbHMsIGZvciBpbnN0YW5jZSwgdGhhdCB3ZSBjYW4gdXNlIGxhdGVyPwogIApgYGB7ciBleWUsIGV2YWw9RkFMU0V9CgojIGV5ZWJhbGxpbmcKIyBjb3JvbmEgPT0gMSBtaXNzaW5nCnZhbF9sYWIoZGYkVjQpCnRhYmxlKGRmJFY0KQoKIyBtb2VkZXIgPT0gNiBtaXNzaW5nCnZhbF9sYWIoZGYkVjVhKQp2IDwtIGRhdGEuZnJhbWUodGFibGUoZGYkVjVhX2FuZGVycykpCm0gPC0gZGF0YS5mcmFtZSh0YWJsZShkZiRWNWJfYW5kZXJzKSkKI3RhYmxlKGRmJG1pZ3IpCiMgaGllciBrdW5uZW4gd2Ugdy9udyB2YW4gbWFrZW4sIHZvb3IgbnUgaXMgbWUgZGF0IHRlIHZlZWwgd2VyawoKIyB2YWRlciA9PSA0IG1pc3NpbmcKdmFsX2xhYihkZiRWNWIpCnRhYmxlKGRmJFY1YikKCiMgZWxlY3QgYXV0byAtPT0gMSBtaXNzaW5nCnZhbF9sYWIoZGYkVjYpCnRhYmxlKGRmJFY2KQoKIyBzY29vdGVyID09IG5vIG1pc3NpbmcKdmFsX2xhYihkZiRWNykKdGFibGUoZGYkVjcpCgojIHZlZ2FuID09IDMgbWlzc2luZwp2YWxfbGFiKGRmJFY4KQp0YWJsZShkZiRWOCkKCiMgZ2VzbGFjaHQgPT0gbm8gbWlzc2luZwp2YWxfbGFiKGRmJGdlc2xhY2h0KQp0YWJsZShkZiRnZXNsYWNodCkKCiMgb3BsZWlkaW5nID09IG5vIG1pc3NpbmcsIDggIndpbCBuaWV0IHplZ2dlbiIKdmFsX2xhYihkZiRvcGxlaWRpbmcpCnRhYmxlKGRmJG9wbGVpZGluZykKCiMgbGVlZnRpamQgPT0gbm8gbWlzc2luZwp0YWJsZShkZiRsZWVmdGlqZCkKY2xhc3MoZGYkbGVlZnRpamQpCgojIHppcGNvZGUgPT0gbm8gbWlzc2luZwp0YWJsZShkZiRwb3N0Y29kZSkKY2xhc3MoZGYkcG9zdGNvZGUpCgojIG5ldyB2YXJzIGlvCnZhbF9sYWIoZGYkd2VyaykgIyB3ZXJrCgp2YWxfbGFiKGRmJHdvb25zaXR1YXRpZSkgIyB3b25lbgoKdmFsX2xhYihkZiRodWlzaG91ZG9tdmFuZykgIyBodWlzaG91ZGVuCgp2YWxfbGFiKGRmJGlua29tZW4pICMgaW5jb21lCgp2YWxfbGFiKGRmJHBvbGl0aWVrKSAjIHBvbGl0aWNzCgp0YWJsZShkZiRwb2xpdGllaykgIyBwb2xpdGljcwoKYGBgCgo8YnI+CgotLS0tCiAgCiMgRWR1Y2F0aW9uCiAgCk5leHQsIHdlIG1ha2UgdGhlIGVkdWNhdGlvbiB2YXJpYWJsZSwgbm90IHRoZSB2YWx1ZSBsYWJlbHMgYmVsb3cgYW5kIGhvdyBJIGNyZWF0ZSB0aGUgdmFyaWFibGUuCiAgCmBgYHtyIGVkdWMsIGV2YWw9RkFMU0V9CiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIG9wbGVpZGluZwoKIyBnZWVuIG9uZGVyd2lqcyAvIGJhc2lzb25kZXJ3aWpzIC8gY3Vyc3VzIGluYnVyZ2VyaW5nIC8gY3Vyc3VzIE5lZGVybGFuZHNlIHRhYWwgCiMgMSAKIyBMQk8gLyBWQk8gLyBWTUJPIChrYWRlci0gb2YgYmVyb2Vwc2dlcmljaHRlIGxlZXJ3ZWcpIC8gTUJPIDEgKGFzc2lzdGVudGVub3BsZWlkaSAKIyAyIAojIE1BVk8gLyBIQVZPIG9mIFZXTyAoZWVyc3RlIGRyaWUgamFhcikgLyBVTE8gLyBNVUxPIC8gVk1CTyAoVEwgb2YgR0wpIC8gVlNPIAojIDMgCiMgTUJPIDIsIDMsIDQgKGJhc2lzYmVyb2Vwcy0sIHZhay0sIG1pZGRlbmthZGVyLSBvZiBzcGVjaWFsaXN0ZW5vcGxlaWRpbmcpIG9mIE1CTyAKIyA0IAojIEhBVk8gb2YgVldPIChvdmVyZ2VnYWFuIG5hYXIgZGUgNGUga2xhcykgLyBIQlMgLyBNTVMgLyBIQk8gcHJvcGVkZXVzZSBvZiBXTyBQcm9wIAojIDUgCiMgSEJPIChiZWhhbHZlIEhCTy1tYXN0ZXIpIC8gV08ta2FuZGlkYWF0cyAtb2YgV08tYmFjaGVsb3IgCiMgNiAKIyBXTy1kb2N0b3JhYWwgb2YgV08tbWFzdGVyIG9mIEhCTy1tYXN0ZXIgLyBwb3N0ZG9jdG9yYWFsIG9uZGVyd2lqcyAKIyA3IAojIHdlZXQgbmlldC93aWwgbmlldCB6ZWdnZW4gCiMgOCAKIyB3ZSByZWNyZWF0ZSB0byAzIGNhdHMKdGFibGUoZGYkb3BsZWlkaW5nKQpkZiRvcGxbZGYkb3BsZWlkaW5nID09IDFdIDwtIDEgIyBwcmltL3NlYwpkZiRvcGxbZGYkb3BsZWlkaW5nID09IDJdIDwtIDEgIyBwcmltL3NlYwpkZiRvcGxbZGYkb3BsZWlkaW5nID09IDNdIDwtIDEgIyBwcmltL3NlYwpkZiRvcGxbZGYkb3BsZWlkaW5nID09IDRdIDwtIDIgIyBsb3dlciB0ZXJ0CmRmJG9wbFtkZiRvcGxlaWRpbmcgPT0gNV0gPC0gMyAjIGhpZ2hlciB0ZXJ0L2hpZ2hlciBwcmVwCmRmJG9wbFtkZiRvcGxlaWRpbmcgPT0gNl0gPC0gMyAjIGhpZ2hlciB0ZXJ0CmRmJG9wbFtkZiRvcGxlaWRpbmcgPT0gN10gPC0gMyAjIGhpZ2hlciB0ZXJ0CnRhYmxlKGRmJG9wbCkKZGYkb3BsIDwtIGFzLmZhY3RvcihkZiRvcGwpCmRmIDwtIHdpdGhpbihkZiwgb3BsIDwtIHJlbGV2ZWwob3BsLCByZWYgPSAzKSkKCmBgYAoKPGJyPgoKLS0tLQogIAojIFNlbGYtcmVwb3J0ZWQgZ2VuZGVyCiAgCk5leHQgdXAsIHNlbGYgcmVwb3J0ZWQgZ2VuZGVyLCBubyBtaXNzaW5ncy4KICAKYGBge3IgZ2VuZGVyLCBldmFsPUZBTFNFfQoKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgbm90aGluZyB3cm9uZyB3aXRoIGdlc2xhY2h0CnRhYmxlKGRmJGdlc2xhY2h0KQpkZiR3b21hbltkZiRnZXNsYWNodCA9PSAyXSA8LSAxCmRmJHdvbWFuW2RmJGdlc2xhY2h0ID09IDFdIDwtIDAKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmBgYAoKPGJyPgoKLS0tLQogIAojIE1pZ3JhdGlvbiBiYWNrZ3JvdW5kCiAgCk1pZ3JhdGlvbiBiYWNrZ3JvdW5kIGlzIGEgYml0IG1vcmUgY2hhbGxlbmdpbmcgYXMgdGhlcmUgYXJlIHNvbWUgb3BlbiBhbnN3ZXJzIG9mIGNvdW50cmllcyB0aGF0IHdlIGRvIHdhbnQgdG8gaW5jbHVkZSBpbiB0aGlzIHZhcmlhYmxlLgogIApgYGB7ciBtaWdyMSwgZXZhbD1GQUxTRX0KCgojIG1pZ3JhdGlvbiBiYWNrZ3JvdW5kCnRhYmxlKGRmJFY1YV9hbmRlcnMpCnRhYmxlKGRmJFY1Yl9hbmRlcnMpCgp0YWJsZShkZiRWNWEpCnRhYmxlKGRmJFY1YikKIyBkZiA8LSBkZlshZGYkVjVhID09IDMsIF0gIyBkcm9wIHRoZSBtaXNzaW5ncwojIGRmIDwtIGRmWyFkZiRWNWIgPT0gMywgXQoKIyBzbyBpZiBub3QgYSAxIChEdXRjaD8pIGFsd2F5cyBnZXQgYSBtaWdyYW50IGJhY2tncm91bmQKZGYkbWlnciA8LSBpZmVsc2UoZGYkVjVhID09IDIgJiBkZiRWNWEgIT0gMyB8IAogICAgICAgICAgICAgICAgICAgIGRmJFY1YiA9PSAyICYgZGYkVjViICE9IDMsIDEsICMgZWl0aGVyIG1vdGhlciBmYXRoZXIgYWJyb2FkID09IDEKICAgICAgICAgICAgICAgICAgaWZlbHNlKGRmJFY1YSA9PSAzICYgZGYkVjViID09IDMsIDMsIDApKSAjIGJvdGggbWlzc2luZyA9PSAzLCBvdGhlcndpc2UgMAp0YWJsZShkZiRtaWdyKQoKbnJvdyhkZltpcy5uYShkZiRtaWdyKSxdKQoKZGYkdmFkZXJbZGYkVjVhID09IDFdIDwtIDEKCmRmJHZhZGVyW2RmJFY1YV9hbmRlcnM9PSJBbWVyaWthIl08LTIKZGYkdmFkZXJbZGYkVjVhX2FuZGVycz09IkFydWJhIl08LTMKZGYkdmFkZXJbZGYkVjVhX2FuZGVycz09IkJlbGdpZSJdPC0yCmRmJHZhZGVyW2RmJFY1YV9hbmRlcnM9PSJCZWxnacOrIl08LTIKZGYkdmFkZXJbZGYkVjVhX2FuZGVycz09IkJyYXppbGnDqyJdPC0zCmRmJHZhZGVyW2RmJFY1YV9hbmRlcnM9PSJDYW1lcm91biJdPC0zCmRmJHZhZGVyW2RmJFY1YV9hbmRlcnM9PSJDaGluYSJdPC0zCmRmJHZhZGVyW2RmJFY1YV9hbmRlcnM9PSJDdXJhw6dhbyJdPC0zCmRmJHZhZGVyW2RmJFY1YV9hbmRlcnM9PSJkdWl0c2xhbmQiXTwtMgpkZiR2YWRlcltkZiRWNWFfYW5kZXJzPT0iRHVpdHNsYW5kIl08LTIKZGYkdmFkZXJbZGYkVjVhX2FuZGVycz09IkVuZ2VsYW5kIl08LTIKZGYkdmFkZXJbZGYkVjVhX2FuZGVycz09IkVVIl08LTIKZGYkdmFkZXJbZGYkVjVhX2FuZGVycz09IkZpbGlwaWpuZW4iXTwtMwpkZiR2YWRlcltkZiRWNWFfYW5kZXJzPT0iZnJhbmtyaWprIl08LTIKZGYkdmFkZXJbZGYkVjVhX2FuZGVycz09IkZyYW5rcmlqayJdPC0yCmRmJHZhZGVyW2RmJFY1YV9hbmRlcnM9PSJpbmRpZSJdPC0yCmRmJHZhZGVyW2RmJFY1YV9hbmRlcnM9PSJpbmRvbmVzaWUiXTwtMgpkZiR2YWRlcltkZiRWNWFfYW5kZXJzPT0iSW5kb25lc2llIl08LTIKZGYkdmFkZXJbZGYkVjVhX2FuZGVycz09IkluZG9uZXNpw6siXTwtMgpkZiR2YWRlcltkZiRWNWFfYW5kZXJzPT0iSXJhbiJdPC0zCmRmJHZhZGVyW2RmJFY1YV9hbmRlcnM9PSJJdGFsaWUiXTwtMgpkZiR2YWRlcltkZiRWNWFfYW5kZXJzPT0iSXRhbGnDqyJdPC0yCmRmJHZhZGVyW2RmJFY1YV9hbmRlcnM9PSJMZXR0bGFuZCJdPC0yCmRmJHZhZGVyW2RmJFY1YV9hbmRlcnM9PSJNYXJva2tvIl08LTMKZGYkdmFkZXJbZGYkVjVhX2FuZGVycz09Ik5lZGVybGFuZHMgSW5kaWUiXTwtMgpkZiR2YWRlcltkZiRWNWFfYW5kZXJzPT0iTmVkZXJsYW5kcyBJbmRpw6siXTwtMgpkZiR2YWRlcltkZiRWNWFfYW5kZXJzPT0iTmlldXctWmVlbGFuZCJdPC0yCmRmJHZhZGVyW2RmJFY1YV9hbmRlcnM9PSJOaWdlcmlhIl08LTMKZGYkdmFkZXJbZGYkVjVhX2FuZGVycz09Ik9lZ2FuZGEiXTwtMwpkZiR2YWRlcltkZiRWNWFfYW5kZXJzPT0iT29zdGVucmlqayJdPC0zCmRmJHZhZGVyW2RmJFY1YV9hbmRlcnM9PSJQb2xlbiJdPC0zCmRmJHZhZGVyW2RmJFY1YV9hbmRlcnM9PSJQb2xlbiBlbiBOZWRlcmxhbmQiXTwtMgpkZiR2YWRlcltkZiRWNWFfYW5kZXJzPT0iU3BhbmplIl08LTIKZGYkdmFkZXJbZGYkVjVhX2FuZGVycz09IlNyaSBMYW5rYSJdPC0zCmRmJHZhZGVyW2RmJFY1YV9hbmRlcnM9PSJzdXJpbmFtZSJdPC0zCmRmJHZhZGVyW2RmJFY1YV9hbmRlcnM9PSJTdXJpbmFtZSJdPC0zCmRmJHZhZGVyW2RmJFY1YV9hbmRlcnM9PSJTeXJpw6siXTwtMwpkZiR2YWRlcltkZiRWNWFfYW5kZXJzPT0iVHVya2lqZSJdPC0zCmRmJHZhZGVyW2RmJFY1YV9hbmRlcnM9PSJWZW5lenVlbGEiXTwtMwpkZiR2YWRlcltkZiRWNWFfYW5kZXJzPT0iVmVyZW5pZ2QgS29uaW5rcmlqayJdPC0yCmRmJHZhZGVyW2RmJFY1YV9hbmRlcnM9PSJZdWdvc2xhdmlhIl08LTIKZGYkdmFkZXJbZGYkVjVhX2FuZGVycz09Ilp1aWQgQWZyaWthIl08LTMKCnRhYmxlKGRmJHZhZGVyKQpucm93KGRmW2lzLm5hKGRmJHZhZGVyKSwgXSkKYGBgCgpTbyBub3cgd2UgY29kZWQgdGhlIGZhdGhlcnMsIGFuZCB3ZSBtb3ZlIG9uIHdpdGggdGhlIG1vdGhlcnMuCgpgYGB7ciBtaWdyMiwgZXZhbD1GQUxTRX0KI2RmJHZhZGVyIDwtIGlmZWxzZShkZiRWNWEgPT0gMyAmIGRmJFY1YV9hbmRlcnMgPT0gIiIsIE5BLCBkZiR2YWRlcikKCmRmJG1vZWRlcltkZiRWNWIgPT0gMV0gPC0gMSAKdGFibGUoZGYkVjViX2FuZGVycykKCgpkZiRtb2VkZXJbZGYkVjViX2FuZGVycyA9PSAiYWxnZXJpamUiXSA8LSAzCmRmJG1vZWRlcltkZiRWNWJfYW5kZXJzID09ICJBcnViYSJdIDwtIDMKZGYkbW9lZGVyW2RmJFY1Yl9hbmRlcnMgPT0gIkF1c3RyYWxpZSJdIDwtIDIKZGYkbW9lZGVyW2RmJFY1Yl9hbmRlcnMgPT0gIkJlbGdpZSJdIDwtIDIKZGYkbW9lZGVyW2RmJFY1Yl9hbmRlcnMgPT0gIkNoaW5hIl0gPC0gMwoKZGYkbW9lZGVyW2RmJFY1Yl9hbmRlcnMgPT0gIkN1cmHDp2FvIl0gPC0gMwpkZiRtb2VkZXJbZGYkVjViX2FuZGVycyA9PSAiZHVpdHNsYW5kIl0gPC0gMgpkZiRtb2VkZXJbZGYkVjViX2FuZGVycyA9PSAiRHVpdHNsYW5kIl0gPC0gMwpkZiRtb2VkZXJbZGYkVjViX2FuZGVycyA9PSAiRW5nZWxhYmQiXSA8LSAyCmRmJG1vZWRlcltkZiRWNWJfYW5kZXJzID09ICJFbmdlbGFuZCJdIDwtIDIKZGYkbW9lZGVyW2RmJFY1Yl9hbmRlcnMgPT0gIkVVIl0gPC0gMgpkZiRtb2VkZXJbZGYkVjViX2FuZGVycyA9PSAiRmlsaXBpam5lbiJdIDwtIDMKZGYkbW9lZGVyW2RmJFY1Yl9hbmRlcnMgPT0gImZyYW5rcmlqayJdIDwtIDIKZGYkbW9lZGVyW2RmJFY1Yl9hbmRlcnMgPT0gIkZyYW5rcmlqayJdIDwtIDIKZGYkbW9lZGVyW2RmJFY1Yl9hbmRlcnMgPT0gIkdCIl0gPC0gMgpkZiRtb2VkZXJbZGYkVjViX2FuZGVycyA9PSAiaW5kb25lc2llIl0gPC0gMgpkZiRtb2VkZXJbZGYkVjViX2FuZGVycyA9PSAiSW5kb25lc2llIl0gPC0gMgpkZiRtb2VkZXJbZGYkVjViX2FuZGVycyA9PSAiSW5kb25lc2nDqyJdIDwtIDIKZGYkbW9lZGVyW2RmJFY1Yl9hbmRlcnMgPT0gIklyYWsiXSA8LSAzCmRmJG1vZWRlcltkZiRWNWJfYW5kZXJzID09ICJJdGFsaWUiXSA8LSAyCmRmJG1vZWRlcltkZiRWNWJfYW5kZXJzID09ICJLb25nbyJdIDwtIDMKZGYkbW9lZGVyW2RmJFY1Yl9hbmRlcnMgPT0gIk1hcm9ra28iXSA8LSAzCmRmJG1vZWRlcltkZiRWNWJfYW5kZXJzID09ICJOZWRlcmxhbmRzIGluZGllIl0gPC0gMgpkZiRtb2VkZXJbZGYkVjViX2FuZGVycyA9PSAiTmVkZXJsYW5kcyBJbmRpZSJdIDwtIDIKZGYkbW9lZGVyW2RmJFY1Yl9hbmRlcnMgPT0gIk5lZGVybGFuZHMgSW5kacOrIl0gPC0gMgpkZiRtb2VkZXJbZGYkVjViX2FuZGVycyA9PSAiTmlnZXJpYSJdIDwtIDMKZGYkbW9lZGVyW2RmJFY1Yl9hbmRlcnMgPT0gIk9vc3RlbnJpamsiXSA8LSAyCmRmJG1vZWRlcltkZiRWNWJfYW5kZXJzID09ICJQaG5vbSBQZW5oIl0gPC0gMwpkZiRtb2VkZXJbZGYkVjViX2FuZGVycyA9PSAiUG9sZW4iXSA8LSAyCmRmJG1vZWRlcltkZiRWNWJfYW5kZXJzID09ICJSdXNsYW5kIl0gPC0gMgpkZiRtb2VkZXJbZGYkVjViX2FuZGVycyA9PSAic2luZ2Fwb3JlIl0gPC0gMwpkZiRtb2VkZXJbZGYkVjViX2FuZGVycyA9PSAiU3BhbmplIl0gPC0gMgpkZiRtb2VkZXJbZGYkVjViX2FuZGVycyA9PSAic3VyaW5hbWUiXSA8LSAzCmRmJG1vZWRlcltkZiRWNWJfYW5kZXJzID09ICJTdXJpbmFtZSJdIDwtIDMKZGYkbW9lZGVyW2RmJFY1Yl9hbmRlcnMgPT0gIlN5cmnDqyJdIDwtIDMKZGYkbW9lZGVyW2RmJFY1Yl9hbmRlcnMgPT0gIlR1cmtpamUiXSA8LSAzCmRmJG1vZWRlcltkZiRWNWJfYW5kZXJzID09ICJWZW5lenVlbGEiXSA8LSAzCmRmJG1vZWRlcltkZiRWNWJfYW5kZXJzID09ICJ6aWUgNUEiXSA8LSAxCmRmJG1vZWRlcltkZiRWNWJfYW5kZXJzID09ICJad2l0c2VybGFuZCJdIDwtIDIKCiNkZiRtb2VkZXIgPC0gaWZlbHNlKGRmJFY1YiA9PSAzICYgZGYkVjViX2FuZGVycyA9PSAiIiwgTkEsIGRmJG1vZWRlcikKCmBgYAoKTm93IHRoYXQgd2UgY3JlYXRlZCBtb3RoZXIgYW5kIGZhdGhlciBiaXJ0aCBjb3VudHJ5LCB3ZSBpbXBsZW1lbnQgYSBoZXVyaXN0aWMgZm9yIG1pZ3JhdGlvbiBiYWNrZ3JvdW5kOiBtYWpvcml0eSwgd2VzdGVybnMsIG5vbi13ZXN0ZXJuIG1pZ3JhdGlvbiBiYWNrZ3JvdW5kLgoKYGBge3IgbWlncjMsIGV2YWw9RkFMU0V9Cgp0YWJsZShkZiRtb2VkZXIpCm5yb3coZGZbaXMubmEoZGYkbW9lZGVyKSxdKQoKZGYkbWlncjNbZGYkbW9lZGVyID09IDEgJiBkZiR2YWRlciA9PSAxXSA8LSAxCmRmJG1pZ3IzW2RmJG1vZWRlciA9PSAyICYgZGYkdmFkZXIgPT0gMl0gPC0gMgpkZiRtaWdyM1tkZiRtb2VkZXIgPT0gMyAmIGRmJHZhZGVyID09IDNdIDwtIDMKCmRmJG1pZ3IzW2RmJG1vZWRlciA9PSAzICYgZGYkdmFkZXIgPT0gMl0gPC0gMwpkZiRtaWdyM1tkZiRtb2VkZXIgPT0gMyAmIGRmJHZhZGVyID09IDFdIDwtIDMKCmRmJG1pZ3IzW2RmJG1vZWRlciA9PSAyICYgZGYkdmFkZXIgPT0gMV0gPC0gMgpkZiRtaWdyM1tkZiRtb2VkZXIgPT0gMiAmIGRmJHZhZGVyID09IDNdIDwtIDIKCmRmJG1pZ3IzW2RmJG1vZWRlciA9PSAxICYgZGYkdmFkZXIgPT0gMl0gPC0gMgpkZiRtaWdyM1tkZiRtb2VkZXIgPT0gMSAmIGRmJHZhZGVyID09IDNdIDwtIDMKCmRmJG1pZ3IzW2lzLm5hKGRmJG1vZWRlcikgJiBkZiR2YWRlciA9PSAxXSA8LSAxCmRmJG1pZ3IzW2lzLm5hKGRmJG1vZWRlcikgJiBkZiR2YWRlciA9PSAyXSA8LSAyCmRmJG1pZ3IzW2lzLm5hKGRmJG1vZWRlcikgJiBkZiR2YWRlciA9PSAzXSA8LSAzCgpkZiRtaWdyM1tpcy5uYShkZiR2YWRlcikgJiBkZiRtb2VkZXIgPT0gMV0gPC0gMQpkZiRtaWdyM1tpcy5uYShkZiR2YWRlcikgJiBkZiRtb2VkZXIgPT0gMl0gPC0gMgpkZiRtaWdyM1tpcy5uYShkZiR2YWRlcikgJiBkZiRtb2VkZXIgPT0gM10gPC0gMwoKdGFibGUoZGYkbWlncjMpCnRhYmxlKGRmJG1pZ3IpCgojIDEgTWFqCiMgMiB3ZXN0CiMgMyBub253ZXN0CmBgYAoKCjxicj4KCi0tLS0KICAKIyBBZ2UKICAKV2UgY3JlYXRlIGFnZSBhbmQgYWdlIHNxdWFyZWQgYXMgdmFyaWFibGVzLgogIApgYGB7ciBhZ2UsIGV2YWw9RkFMU0V9CiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIGFnZQpkZiRsZWVmdGlqZDEwIDwtIGRmJGxlZWZ0aWpkLzEwCnRhYmxlKGRmJGxlZWZ0aWpkMTApCmRmJGxlZWZ0aWpkMTBzcSA8LSBkZiRsZWVmdGlqZDEwXjIKCmRmJGFnZWNhdCA8LSBOQQpkZiRhZ2VjYXRbZGYkbGVlZnRpamQgPCAzMV0gPC0gIjE4LTMwIgpkZiRhZ2VjYXRbZGYkbGVlZnRpamQgPiAzMCAmIGRmJGxlZWZ0aWpkIDwgNDZdIDwtICIzMS00NSIKZGYkYWdlY2F0W2RmJGxlZWZ0aWpkID4gNDUgJiBkZiRsZWVmdGlqZCA8IDY2XSA8LSAiNDYtNjUiCmRmJGFnZWNhdFtkZiRsZWVmdGlqZCA+IDY1XSA8LSAiPjY1IgoKdGFibGUoZGYkYWdlY2F0KQojIHRhYmxlKGRmJGxlZWZ0aWpkKQpucm93KGRmW2RmJGxlZWZ0aWpkIDwgMzEsXSkKbnJvdyhkZltkZiRsZWVmdGlqZCA+IDMwICYgZGYkbGVlZnRpamQgPCA0NixdKQpucm93KGRmW2RmJGxlZWZ0aWpkID4gNDUgJiBkZiRsZWVmdGlqZCA8IDY2LF0pCm5yb3coZGZbZGYkbGVlZnRpamQgPiA2NSxdKQoKYGBgCgo8YnI+CgotLS0tCiAgCgogIAojIFdvcmsgc2l0dWF0aW9uCiAgCldlIGNyZWF0ZSB0aGUgY3VycmVudCB3b3JraW5nIHNpdHVhdGlvbiBvZiBhIHJlc3BvbmRlbnQuIChUaGVzZSBhcmUgbmV3IHZhcmlhYmxlIG9idGFpbmVkIGZyb20gSSZPIHJlc2VhcmNoLCBoZW5jZSB0aGUgaGFzc2xlIHdpdGggdGhlIGlkZW50aWZpZXIgYmVmb3JlLikKICAKYGBge3Igd29yLCBldmFsPUZBTFNFfQojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBORVcgSU8gVkFSUwojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMgd29ya2luZyB2YWxfbGFiKGRmJHdlcmspCmRmJHdlcmsgPC0gYXMuY2hhcmFjdGVyKGRmJHdlcmspCmRmJHdvcmsgPC0gMQpkZiR3b3JrW2RmJHdlcmsgPT0gImFuZGVycyJdIDwtIDAKZGYkd29ya1tkZiR3ZXJrID09ICJ3ZXJrbG9vcyAvIHdlcmt6b2VrZW5kIC8gYmlqc3RhbmQiXSA8LSAwCmRmJHdvcmtbZGYkd2VyayA9PSAic3R1ZGVyZW5kIC9zY2hvb2xnYWFuZCJdIDwtIDAKZGYkd29ya1tkZiR3ZXJrID09ICJhcmJlaWRzb25nZXNjaGlrdCJdIDwtIDAKZGYkd29ya1tkZiR3ZXJrID09ICJnZXBlbnNpb25lZXJkIG9mIFZVVCJdIDwtIDAKZGYkd29ya1tkZiR3ZXJrID09ICJodWlzdnJvdXcgLyBodWlzbWFuIl0gPC0gMAoKdGFibGUoZGYkd29yaykKCnRhYmxlKGRmJHdlcmspCgpgYGAKCjxicj4KCi0tLS0KICAKIyBMaXZpbmcgc2l0dWF0aW9uCiAgCldoZXRoZXIgcmVzcG9uZGVudHMgbGl2ZSBhbG9uZSBvciBub3QuCiAgCmBgYHtyIGxpdiwgZXZhbD1GQUxTRX0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgbGl2aW5nYWxvbmUKIyBsaXZpbmdhbG9uZQpkZiR3b29uc2l0dWF0aWUgPC0gYXMuY2hhcmFjdGVyKGRmJHdvb25zaXR1YXRpZSkKCmRmJGxpdmluZ2Fsb25lIDwtIDEKZGYkbGl2aW5nYWxvbmVbZGYkd29vbnNpdHVhdGllID09ICJpayBiZW4gZ2VodXdkL3dvb24gc2FtZW4gem9uZGVyIHRodWlzd29uZW5kZSBraW5kZXJlbiJdIDwtIDAKZGYkbGl2aW5nYWxvbmVbZGYkd29vbnNpdHVhdGllID09ICJpayB3b29uIGJpaiBtaWpuIG91ZGVyKHMpL3ZlcnpvcmdlcihzKSJdIDwtIDAKZGYkbGl2aW5nYWxvbmVbZGYkd29vbnNpdHVhdGllID09ICJpayBiZW4gZ2VodXdkL3dvb24gc2FtZW4gbWV0IHRodWlzd29uZW5kZSBraW5kZXJlbiJdIDwtIDAKZGYkbGl2aW5nYWxvbmVbZGYkd29vbnNpdHVhdGllID09ICJpayB3b29uIGFsbGVlbiAoem9uZGVyIHBhcnRuZXIpIG1ldCBraW5kZXJlbiJdIDwtIDAKZGYkbGl2aW5nYWxvbmVbZGYkd29vbnNpdHVhdGllID09ICJhbmRlcnMiXSA8LSAwCgoKZGYkbGl2aW5nYWxvbmVbaXMubmEoZGYkd29vbnNpdHVhdGllKV0gPC0gMgpkZiRsaXZpbmdhbG9uZVtkZiR3b29uc2l0dWF0aWUgPT0gIndlZXQgbmlldC93aWwgbmlldCB6ZWdnZW4iXSA8LSAyICAjIC0tPiBzaG91bGQgZHJvcCB0aGlzIG9uZSEKCnRhYmxlKGRmJGxpdmluZ2Fsb25lKQp0YWJsZShkZiR3b29uc2l0dWF0aWUpCgoKYGBgCgo8YnI+CgotLS0tCiAgCiMgSG91c2Vob2xkIHNpemUKClJlc3BvbmRlbnQgaG91c2Vob2xkIHNpemUuCiAgCmBgYHtyIGhocywgZXZhbD1GQUxTRX0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgaG91c2Vob2xkc2l6ZQoKZGYkaGhzaXplIDwtIGFzLmNoYXJhY3RlcihkZiRodWlzaG91ZG9tdmFuZykKdGFibGUoZGYkaGhzaXplKQpkZiRoaHNpemVbZGYkaGhzaXplID09ICIxIChhbGxlZW4gaWt6ZWxmKSJdIDwtIDEKZGYkaGhzaXplIDwtIGFzLm51bWVyaWMoZGYkaGhzaXplKQp0YWJsZShkZiRoaHNpemUpCmRmJGhoc2l6ZVtkZiRsaXZpbmdhbG9uZSA9PSAxXSA8LSAxICAjIHRoaXMgb3ZlcnJpZGVzIHdpdGggcHJpb3IgYW5zd2VyCnRhYmxlKGRmJGhoc2l6ZSkKdGFibGUoZGYkaHVpc2hvdWRvbXZhbmcpCmBgYAoKPGJyPgoKLS0tLQogIAojIEluY29tZQogIApSZXNwb25kZW50IGluY29tZS4KICAKYGBge3IgaW5jLCBldmFsPUZBTFNFfQojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBpbmNvbWUKCgp0YWJsZShkZiRpbmtvbWVuKQpkZiRpbmtvbWVuIDwtIGFzLmNoYXJhY3RlcihkZiRpbmtvbWVuKQpucm93KGRmW2lzLm5hKGRmJGlua29tZW4pLCBdKSAgIyAtLT4gMzcgbWlzc2luZ3MKCmRmJGluY29tZVtkZiRpbmtvbWVuID09ICJtaW5pbXVtIChNaW5kZXIgZGFuIOKCrCAxNC4xMDApIl0gPC0gMQpkZiRpbmNvbWVbZGYkaW5rb21lbiA9PSAiYmVuZWRlbiBtb2RhYWwgKOKCrCAxNC4xMDAgdG90IOKCrCAyOS41MDApIl0gPC0gMQpkZiRpbmNvbWVbZGYkaW5rb21lbiA9PSAiYmlqbmEgbW9kYWFsICjigqwgMjkuNTAwIHRvdCDigqwgMzYuNTAwKSJdIDwtIDEKZGYkaW5jb21lW2RmJGlua29tZW4gPT0gIm1vZGFhbCAo4oKsIDM2LjUwMCB0b3Qg4oKsIDQzLjUwMCkiXSA8LSAxCmRmJGluY29tZVtkZiRpbmtvbWVuID09ICJ0dXNzZW4gMSBlbiAyIGtlZXIgbW9kYWFsICjigqwgNDMuNTAwIHRvdCDigqwgNzMuMDAwKSJdIDwtIDIKZGYkaW5jb21lW2RmJGlua29tZW4gPT0gInR3ZWUga2VlciBtb2RhYWwgKOKCrCA3My4wMDAgdG90IOKCrCA4Ny4xMDApIl0gPC0gMgpkZiRpbmNvbWVbZGYkaW5rb21lbiA9PSAibWVlciBkYW4gMiBrZWVyIG1vZGFhbCAo4oKsIDg3LjEwMCBvZiBtZWVyKSJdIDwtIDIKZGYkaW5jb21lW2RmJGlua29tZW4gPT0gIndlZXQgaWsgbmlldCAvIHdpbCBpayBuaWV0IHplZ2dlbiJdIDwtIDMKZGYkaW5jb21lW2lzLm5hKGRmJGlua29tZW4pXSA8LSAzCgp0YWJsZShkZiRpbmNvbWUpCiMgMSB1cCB0byBtb2RhbCAyIG1vZGFsIGFuZCB1cCAzIE5BL2RvZXNuJ3Qga25vdy9kb2Vzbid0IHdhbnQgdG8gc2F5CmBgYAoKPGJyPgoKLS0tLQoKIyBaaXBjb2RlIGluZm8KICAKV2UgY3JlYXRlIGEgbnVtYmVyIG9mIHZhcmlhYmxlcyB0aGF0IHJlbGF0ZSB0byBmb2xrcycgemlwY29kZXMuCiAgCmBgYHtyIHppcCwgZXZhbD1GQUxTRX0KCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIHppcCBpbmZvCnppcCA8LSByZWFkLmNzdigiZGF0YS9wb3N0Y29kZTQuY3N2IikgIyAtLT4gaHR0cHM6Ly93d3cuY2JzLm5sL25sLW5sL2Rvc3NpZXIvbmVkZXJsYW5kLXJlZ2lvbmFhbC9nZW9ncmFmaXNjaGUtZGF0YS9nZWdldmVucy1wZXItcG9zdGNvZGUKemlwIDwtIHppcFstMixdCnppcG5hbWVzIDwtIHppcFsxLF0KbmFtZXMoemlwKSA8LSB6aXBuYW1lcwp6aXBuYW1lcyA8LSB6aXBbLTEsXQoKemlwIDwtIHppcCAlPiUgcmVwbGFjZV93aXRoX25hX2FsbChjb25kaXRpb24gPSB+LnggPT0gLTk5OTk3KQpkZiRwb3N0Y29kZSA8LSBhcy5udW1lcmljKGRmJHBvc3Rjb2RlKQp6aXAkUEM0IDwtIGFzLm51bWVyaWMoemlwJFBDNCkKZGYgPC0gbGVmdF9qb2luKGRmLCB6aXBbLCBjKCJQQzQiLCAiT0FEIiwgIlVJVEtNSU5BT1ciLCAiUF9LT09QV09OIiwgIldPWldPTklORyIsICJQX05MX0FDSFRHIiwgIklOV09ORVIiKV0sIGJ5ID0gYygicG9zdGNvZGUiID0gIlBDNCIpKQoKZGYkbmVpZ2hkZW5zIDwtIGFzLm51bWVyaWMoZGYkT0FEKS8xMDAwCmRmJHBiZW5yZWMgPC0gKGFzLm51bWVyaWMoZGYkVUlUS01JTkFPVykvYXMubnVtZXJpYyhkZiRJTldPTkVSKSkqMTAwCmRmJHBidXlob3VzZSA8LSBhcy5udW1lcmljKGRmJFBfS09PUFdPTikKZGYkd29ydGhob3VzZSA8LSBhcy5udW1lcmljKGRmJFdPWldPTklORykvMTAwCmRmJHBkdXRjaCA8LSBhcy5udW1lcmljKGRmJFBfTkxfQUNIVEcpCgpucm93KGRmW2lzLm5hKGRmJG5laWdoZGVucyksIF0pCgpzdW1tYXJ5KGRmJHBiZW5yZWMpCnN1bW1hcnkoZGYkbmVpZ2hkZW5zKQpzdW1tYXJ5KGRmJHBidXlob3VzZSkKc3VtbWFyeShkZiR3b3J0aGhvdXNlKQpzdW1tYXJ5KGRmJHBkdXRjaCkKCmBgYAoKPGJyPgoKLS0tLQoKIyBVbnVzZWQgdmFyaWFibGVzCiAgClRoZXJlIGFyZSBhIG51bWJlciBvZiByZW1haW5pbmcgdmFyaWFibGVzIHRvIHRoZSBkYXRhIHRoYXQgd2UgZG8gbm90IHVzZSBpbiB0aGlzIHBhcnRpY3VsYXIgcGFwZXIuCiAgCmBgYHtyIHVzZSwgZXZhbD1GQUxTRX0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgcG9saXRpY3MKdGFibGUoZGYkcG9saXRpZWspCgpkZiRwb2xpdGllayA8LSBhcy5jaGFyYWN0ZXIoZGYkcG9saXRpZWspCgojIHJpZ2h0CmRmJHBvbGl0aWNzIDwtIDMKZGYkcG9saXRpY3NbZGYkcG9saXRpZWsgPT0gIlZWRCJdIDwtIDEKZGYkcG9saXRpY3NbZGYkcG9saXRpZWsgPT0gIlBWViJdIDwtIDEKZGYkcG9saXRpY3NbZGYkcG9saXRpZWsgPT0gIkNEQSJdIDwtIDEKZGYkcG9saXRpY3NbZGYkcG9saXRpZWsgPT0gIkZvcnVtIHZvb3IgRGVtb2NyYXRpZSJdIDwtIDEKZGYkcG9saXRpY3NbZGYkcG9saXRpZWsgPT0gIkNocmlzdGVuVW5pZSJdIDwtIDEKZGYkcG9saXRpY3NbZGYkcG9saXRpZWsgPT0gIlNHUCJdIDwtIDEKZGYkcG9saXRpY3NbZGYkcG9saXRpZWsgPT0gIkJvZXJCdXJnZXJCZXdlZ2luZyJdIDwtIDEKZGYkcG9saXRpY3NbZGYkcG9saXRpZWsgPT0gIkpBMjEiXSA8LSAxCmRmJHBvbGl0aWNzW2RmJHBvbGl0aWVrID09ICI1MFBMVVMiXSA8LSAxCgoKIyBsZWZ0CmRmJHBvbGl0aWNzW2RmJHBvbGl0aWVrID09ICJENjYiXSA8LSAyCmRmJHBvbGl0aWNzW2RmJHBvbGl0aWVrID09ICJTUCJdIDwtIDIKZGYkcG9saXRpY3NbZGYkcG9saXRpZWsgPT0gIlB2ZEEiXSA8LSAyCmRmJHBvbGl0aWNzW2RmJHBvbGl0aWVrID09ICJHcm9lbkxpbmtzIl0gPC0gMgpkZiRwb2xpdGljc1tkZiRwb2xpdGllayA9PSAiUGFydGlqIHZvb3IgZGUgRGllcmVuIl0gPC0gMgpkZiRwb2xpdGljc1tkZiRwb2xpdGllayA9PSAiVm9sdCJdIDwtIDIKZGYkcG9saXRpY3NbZGYkcG9saXRpZWsgPT0gIkRFTksiXSA8LSAyCmRmJHBvbGl0aWNzW2RmJHBvbGl0aWVrID09ICJCSUoxIl0gPC0gMgoKdGFibGUoZGYkcG9saXRpY3MpCiMgMSByaWdodAojIDIgbGVmdAojIDMgbm8gdm90aW5nLCBibGFuY28sIG5vIHZvdGluZyByaWdodHMsIGRvZXNuJ3Qgd2FubmEgc2F5LCBldGMuCgojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyB1bnVzZWQgdmFycwojIGRyb3AgbWlzc2luZ3MgYW5kIGNyZWF0ZSBjb3JvbmEgdmFyCnRhYmxlKGRmJFY0KQpkZiRjb3JvbmFpdiA8LSBkZiRWNAp0YWJsZShkZiRjb3JvbmFpdikKCiMgY3JlYXRlIGVsZWN0cmljIHZlaGljbGUgdmFyCnRhYmxlKGRmJFY2KQpkZiRlbGVjYXV0IDwtIGRmJFY2CnRhYmxlKGRmJGVsZWNhdXQpCgojIGNyZWF0ZSBzY29vdGVyIHZhcgp0YWJsZShkZiRWNykKZGYkc2Nvb3Rlcml2IDwtIGRmJFY3CnRhYmxlKGRmJHNjb290ZXJpdikKCiMgY3JlYXRlIHZhZ2FuIHZhcgp0YWJsZShkZiRWOCkKZGYkdmVnYW5pdiA8LSBkZiRWOAoKIyBwcm9ncmVzc2l2ZSBjb25zdHJ1Y3Rpb246IGVsZWMgdmVoaWNsZSBvciB2ZWdhbiA9PSBwcm9ncmVzc2l2ZQpkZiRwcm9nciA8LSBpZmVsc2UoZGYkdmVnYW5pdiA9PSAxIHwgZGYkZWxlY2F1dCA9PSAxLDEsMCkKdGFibGUoZGYkcHJvZ3IpCgpgYGAKCgo8YnI+CgotLS0tCiAgCiMgU2FtcGxlIHNlbGVjdGlvbnMKICAKRmluYWxseSwgd2UgYXBwbHkgc29tZSBzYW1wbGUgc2VsZWN0aW9uIGJhc2VkIG9uIHRoZSBtaXNzaWduZXNzIGluIHRoZSBkYXRhLiBOb3QgbXVjaCwgYXMgeW91IGNhbiBzZWUgYmVsb3cuCiAgCmBgYHtyIHNhbSwgZXZhbD1GQUxTRX0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgbWlzc2luZ25lc3MgYW5kIHNhbXBsZSBzZWxlY3Rpb24KI25yb3coZGZbaXMubmEoZGYkbGVlZnRpamQxMCksXSkgIyBubyBtaXNzaW5nCm5yb3coZGZbaXMubmEoZGYkYWdlY2F0KSxdKSAjIG5vIG1pc3NpbmcKbnJvdyhkZltpcy5uYShkZiRnZXNsYWNodCksXSkgIyBubyBtaXNzaW5nCm5yb3coZGZbaXMubmEoZGYkb3BsKSxdKSAjIG5vIG1pc3NpbmcKbnJvdyhkZltpcy5uYShkZiRWNWEpLF0pICMgc2l4IG1pc3NpbmcKbnJvdyhkZltpcy5uYShkZiRWNWIpLF0pICMgZm91ciBtaXNzaW5nCm5yb3coZGZbZGYkbWlnciA9PSAzLF0pICMgZm91ciBtaXNzaW5nIG9uIGVmZmVjdGl2ZSB2YXJpYWJsZQp0YWJsZShkZiRtaWdyKQpucm93KGRmW2lzLm5hKGRmJG1pZ3IzKSxdKSAjIGZvdXIgbWlzc2luZwoKI25yb3coZGZbaXMubmEoZGYkcGJlbnJlYyksIF0pCiNucm93KGRmW2lzLm5hKGRmJG5laWdoZGVucyksIF0pICMgZm91ciBtaXNzaW5nCiNucm93KGRmW2lzLm5hKGRmJHBidXlob3VzZSksIF0pCm5yb3coZGZbaXMubmEoZGYkd29ydGhob3VzZSksIF0pICMgZWlnaHQgbWlzc2luZwojbnJvdyhkZltpcy5uYShkZiRwZHV0Y2gpLCBdKQoKbnJvdyhkZltpcy5uYShkZiR3ZXJrKSxdKSAjIG5vIG1pc3NpbmcKbnJvdyhkZltpcy5uYShkZiR3b3JrKSxdKSAjIG5vIG1pc3NpbmcKbnJvdyhkZltpcy5uYShkZiRoaHNpemUpLF0pICMgMSBtaXNzaW5nCgpucm93KGRmW2lzLm5hKGRmJGluY29tZSksXSkgIyBubyBtaXNzaW5nCgpucm93KGRmW2RmJGluY29tZSA9PSAzLF0pICMgdGhvdWdoIDE4NCB3b24ndCBzYXkva25vdwpucm93KGRmW2lzLm5hKGRmJGlua29tZW4pLF0pICMgb2lmIHdoaWNoIDM3IHN5c3RlbSBtaXNzaW5nCiMgCiMgbnJvdyhkZltpcy5uYShkZiRwb2xpdGljcyksXSkgIyBubyBtaXNzaW5nCiMgbnJvdyhkZltkZiRwb2xpdGljcyA9PSAzLF0pICMgdGhvdWdoIDIyMyB3b24ndCBzYXkva25vdwojIG5yb3coZGZbaXMubmEoZGYkcG9saXRpZWspLF0pICMgb2lmIHdoaWNoIDEzNSBzeXN0ZW0gbWlzc2luZwojIAoKIyBkZiA8LSBkZlshaXMubmEoZGYkcGJlbnJlYyksIF0KIyBkZiA8LSBkZlshaXMubmEoZGYkbmVpZ2hkZW5zKSwgXQojIGRmIDwtIGRmWyFpcy5uYShkZiRwYnV5aG91c2UpLCBdCmRmIDwtIGRmWyFpcy5uYShkZiR3b3J0aGhvdXNlKSwgXQpkZiA8LSBkZlshaXMubmEoZGYkbWlncjMpLCBdCmRmIDwtIGRmWyFpcy5uYShkZiRoaHNpemUpLCBdCiMgZGYgPC0gZGZbIWlzLm5hKGRmJHBkdXRjaCksIF0KCiNkZiA8LSBkZlshZGYkY29yb25haXYgPT0gMyxdCiNkZiA8LSBkZlshZGYkZWxlY2F1dG8gPT0gMyxdCiNkZiA8LSBkZlshZGYkdmVnYW5pdiA9PSAzLF0KI2RmIDwtIGRmWyFkZiRzY29vdGVyaXYgPT0gMyxdCiNzdW1tYXJ5KGRmJGhoc2l6ZSkKCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKYGBgCgoKPGJyPgoKLS0tLQogIAojIERhdGEgc3RvcmFnZQogIApGaW5hbGx5LCB3ZSBzYXZlIHRoZSBkYXRhIHRoYXQgd2UgdXNlIGZvciB0aGUgYW5hbHlzZXMuCiAgCmBgYHtyIGRhdGEsIGV2YWw9RkFMU0V9CiMgc2F2ZSBkYXRhCnNhdmUoZGYsIGZpbGUgPSAiZGF0YS9kdXRjaF9uZXRzaXplX2FuYWx5c2VzLnJkYSIpCgojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KYGBg