• Getting started
    • clean up
    • general custom functions
    • necessary packages
  • Download data
  • Import data
  • tie_maintenance.RDa
    • wave 1 –> wave 2 (maintained vs dropped)
    • wave 2 created
    • wave 2 –> wave 3
  • data_nested.Rda
    • wave 1 –> wave 2
    • wave 2 –> wave 3

The following scripts can be used to replicate the data-set of Franken, Bekhuis, and Tolsma. It may also be obtained by downloading: Download data_nested.RDa



Getting started

To copy the code, click the button in the upper right corner of the code-chunks.

clean up

rm(list = ls())
gc()


general custom functions

  • fpackage.check: Check if packages are installed (and install if not) in R
  • fsave: Function to save data with time stamp in correct directory
  • fload: Load R-objects under new names
  • fshowdf: Print objects (tibble / data.frame) nicely on screen in .Rmd.
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)
        }
    })
}

fsave <- function(x, file, location = "./data/processed/", ...) {
    if (!dir.exists(location))
        dir.create(location)
    datename <- substr(gsub("[:-]", "", Sys.time()), 1, 8)
    totalname <- paste(location, datename, file, sep = "")
    print(paste("SAVED: ", totalname, sep = ""))
    save(x, file = totalname)
}


fload <- function(fileName) {
    load(fileName)
    get(ls()[ls() != "fileName"])
}

fshowdf <- function(x, digits = 2, ...) {
    knitr::kable(x, digits = digits, "html", ...) %>%
        kableExtra::kable_styling(bootstrap_options = c("striped", "hover")) %>%
        kableExtra::scroll_box(width = "100%", height = "300px")
}


necessary packages

  • dplyr: package for data wrangling
  • lubridate: parse and manipulate dates
  • stringr: string manipulation
packages = c("dplyr", "lubridate", "stringr")
fpackage.check(packages)
rm(packages)


Download data

Anonymized data-sets of the ‘Sports and Friendships’ (Franken, Bekhuis, and Tolsma 2023) study are deposited in DANS EASY. For this study we use waves 3-5 (Cohort II):

Download the data-files, and put them in the ./data/ folder. But first, make a ./data/ folder:

ifelse(!dir.exists("data"), dir.create("data"), FALSE)


To see the code used to anonymize the raw data files, click the button below.



Import data

Load the downloaded data. First, we clean our environment (but we keep our functions; we need them later on).

# clean environment, but keep functions
rm(list = setdiff(ls(), lsf.str()))

# load public data

# Cohort II
data3 <- fload("./data/wave3_public.RDa")
data4 <- fload("./data/wave4_public.RDa")
data5 <- fload("./data/wave5_public.RDa")



tie_maintenance.RDa

In the following script, I construct a long data-frame (based on Cohort II, waves 1-2-3), with alters nested in egos, to investigate which alters are maintained in the personal networks of ego over the academic year. To each ego, relevant individual-level, contextual-level, and network-level attributes are assigned; to each alter, relevant alter and dyadic features are assigned. The data-set is saved.

wave 1 –> wave 2 (maintained vs dropped)

# subset respondents that filled out both surveys w1 and w2;
# by matching on `respnr`
data <- data3[which(data3$respnr %in% unique(data4$respnr)),]
row.names(data) <- 1:nrow(data)
nrow(data) #N=516

# make a dataframe of w1-alters, with potential duplicates...
# recall that all alter names were replaced with a unique anonymized alter-id
df_names <- data.frame(
  p1 = data$egonet1.SQ001.,
  p2 = data$egonet1.SQ002.,
  p3 = data$egonet1.SQ003.,
  p4 = data$egonet1.SQ004.,
  p5 = data$egonet1.SQ005.,
  p6 = data$egonet2.SQ001.,
  p7 = data$egonet2.SQ002.,
  p8 = data$egonet2.SQ003.,
  p9 = data$egonet2.SQ004.,
  p10= data$egonet2.SQ005.,
  p11= data$egonet3.SQ001.,
  p12= data$egonet3.SQ002.,
  p13= data$egonet3.SQ003.,
  p14= data$egonet3.SQ004.,
  p15= data$egonet3.SQ005.,
  p16= data$egonet4.SQ001.,
  p17= data$egonet4.SQ002.,
  p18= data$egonet4.SQ003.,
  p19= data$egonet4.SQ004.,
  p20= data$egonet4.SQ005.)

#"pre-allocate" empty list of length equals number of egos
alterL <- vector("list", nrow(df_names))

# loop over all egos
for ( i in 1:length(alterL)) {
    alterL[[i]] <- data.frame(
      ego_gender = NA, ego_age = NA, ego_educ = NA,
      alterid = 1:20, name1 = NA, name2 = NA, name3 = NA, name4 = NA,
      alter_gender = NA, alter_age = NA, alter_educ=NA,
      same_gender = NA, dif_age = NA, sim_educ = NA,
      cdn_embed.t1 = NA, study_embed.t1 = NA, bff_embed.t1 = NA, csn_embed.t1 = NA)
}

# fill the names based on the names data-frame and replace empty strings with <NA>
for ( i in 1:length(alterL)) {
  alterL[[i]]$name1 <- unlist(df_names[i, ], use.names=FALSE)
  alterL[[i]]$name1 <- ifelse(alterL[[i]]$name1=="", NA, alterL[[i]]$name1)
}

# a matching matrix allowed ego to match names that referred to the same person.
# in limesurvey, i could not let the number of columns condition
# on the number of alters named in the latest egonet, so i made 5 separate matrices,
# conditional on netsize.
# i calculate netsize for each net
{
  net1 <- cbind(data$egonet1.SQ001.,data$egonet1.SQ002., data$egonet1.SQ003.,data$egonet1.SQ004., data$egonet1.SQ005.)
  net1 <- ifelse(net1=="", NA, net1)
  ns1 <- vector()
  for (i in 1:nrow(net1)) {
    ns1[i] <- length(net1[i,][which(!is.na(net1[i,]))])
  }
  net2 <- cbind(data$egonet2.SQ001.,data$egonet2.SQ002., data$egonet2.SQ003.,data$egonet2.SQ004., data$egonet2.SQ005.)
  net2 <- ifelse(net2=="", NA, net2)
  ns2 <- vector()
  for (i in 1:nrow(net2)) {
    ns2[i] <- length(net2[i,][which(!is.na(net2[i,]))])
  }
  net3 <- cbind(data$egonet3.SQ001.,data$egonet3.SQ002., data$egonet3.SQ003.,data$egonet3.SQ004., data$egonet3.SQ005.)
  net3 <- ifelse(net3=="", NA, net3)
  ns3 <- vector()
  for (i in 1:nrow(net3)) {
    ns3[i] <- length(net3[i,][which(!is.na(net3[i,]))])
  }
  net4 <- cbind(data$egonet4.SQ001.,data$egonet4.SQ002., data$egonet4.SQ003.,data$egonet4.SQ004., data$egonet4.SQ005.)
  net4 <- ifelse(net4=="", NA, net4)
  ns4 <- vector()
  for (i in 1:nrow(net4)) {
    ns4[i] <- length(net4[i,][which(!is.na(net4[i,]))])
  }
}

# i construct the matching matrices, 1 - 5 (conditional on the ns of the latest net)
# put these in a list and list these again, for each respondent (so a list of lists...)
matchingList <- list()
for (i in 1:length(alterL)) { # for ego i
  matchingL <- list()
  # make 5 seperate matching matrices. naturally, only 1 is relevant... but i will select that later.
  matchingL[[1]] <- cbind(data$matching1N1.SQ001_SQ001.[i],data$matching1N1.SQ002_SQ001.[i],data$matching1N1.SQ003_SQ001.[i],data$matching1N1.SQ004_SQ001.[i],data$matching1N1.SQ005_SQ001.[i])
  matchingL[[2]]<- rbind(
    cbind(data$matching1N2.SQ001_SQ001.[i], data$matching1N2.SQ002_SQ001.[i], data$matching1N2.SQ003_SQ001.[i], data$matching1N2.SQ004_SQ001.[i], data$matching1N2.SQ005_SQ001.[i]),
    cbind(data$matching1N2.SQ001_SQ002.[i], data$matching1N2.SQ002_SQ002.[i], data$matching1N2.SQ003_SQ002.[i], data$matching1N2.SQ004_SQ002.[i], data$matching1N2.SQ005_SQ002.[i]))
  matchingL[[3]]<- rbind(
    cbind(data$matching1N3.SQ001_SQ001.[i], data$matching1N3.SQ002_SQ001.[i], data$matching1N3.SQ003_SQ001.[i], data$matching1N3.SQ004_SQ001.[i], data$matching1N3.SQ005_SQ001.[i]),
    cbind(data$matching1N3.SQ001_SQ002.[i], data$matching1N3.SQ002_SQ002.[i], data$matching1N3.SQ003_SQ002.[i], data$matching1N3.SQ004_SQ002.[i], data$matching1N3.SQ005_SQ002.[i]),
    cbind(data$matching1N3.SQ001_SQ003.[i], data$matching1N3.SQ002_SQ003.[i], data$matching1N3.SQ003_SQ003.[i], data$matching1N3.SQ004_SQ003.[i], data$matching1N3.SQ005_SQ003.[i]))
  matchingL[[4]]<- rbind(
    cbind(data$matching1N4.SQ001_SQ001.[i], data$matching1N4.SQ002_SQ001.[i], data$matching1N4.SQ003_SQ001.[i], data$matching1N4.SQ004_SQ001.[i], data$matching1N4.SQ005_SQ001.[i]),
    cbind(data$matching1N4.SQ001_SQ002.[i], data$matching1N4.SQ002_SQ002.[i], data$matching1N4.SQ003_SQ002.[i], data$matching1N4.SQ004_SQ002.[i], data$matching1N4.SQ005_SQ002.[i]),
    cbind(data$matching1N4.SQ001_SQ003.[i], data$matching1N4.SQ002_SQ003.[i], data$matching1N4.SQ003_SQ003.[i], data$matching1N4.SQ004_SQ003.[i], data$matching1N4.SQ005_SQ003.[i]),
    cbind(data$matching1N4.SQ001_SQ004.[i], data$matching1N4.SQ002_SQ004.[i], data$matching1N4.SQ003_SQ004.[i], data$matching1N4.SQ004_SQ004.[i], data$matching1N4.SQ005_SQ004.[i]))
  matchingL[[5]]<- rbind(
    cbind(data$matching1N5.SQ001_SQ001.[i], data$matching1N5.SQ002_SQ001.[i], data$matching1N5.SQ003_SQ001.[i], data$matching1N5.SQ004_SQ001.[i], data$matching1N5.SQ005_SQ001.[i]),
    cbind(data$matching1N5.SQ001_SQ002.[i], data$matching1N5.SQ002_SQ002.[i], data$matching1N5.SQ003_SQ002.[i], data$matching1N5.SQ004_SQ002.[i], data$matching1N5.SQ005_SQ002.[i]),
    cbind(data$matching1N5.SQ001_SQ003.[i], data$matching1N5.SQ002_SQ003.[i], data$matching1N5.SQ003_SQ003.[i], data$matching1N5.SQ004_SQ003.[i], data$matching1N5.SQ005_SQ003.[i]),
    cbind(data$matching1N5.SQ001_SQ004.[i], data$matching1N5.SQ002_SQ004.[i], data$matching1N5.SQ003_SQ004.[i], data$matching1N5.SQ004_SQ004.[i], data$matching1N5.SQ005_SQ004.[i]),
    cbind(data$matching1N5.SQ001_SQ005.[i], data$matching1N5.SQ002_SQ005.[i], data$matching1N5.SQ003_SQ005.[i], data$matching1N5.SQ004_SQ005.[i], data$matching1N5.SQ005_SQ005.[i]))
  matchingList[[i]] <- matchingL
} # so... matchingL[[1]][[5]] is matchingmatrix 5 (i.e., 5 alters named in egonet2) for ego 1

# the combination of the matching matrices and the netsizes for ego allows me to match the names myself.
for (i in 1:length(matchingList)) {     # for ego i
  mL <- matchingList[[i]]               # get the matching list
  ns <- ns2[[i]]                        # get the size of egonet2
  if(ns>0) {                            # if ns=0, no matching was done!
    mm <- as.matrix(mL[[ns]])           # retrieve the corresponding matrix
    matched <- which(mm==1, arr.ind=T)  # retrieve array indices
    net <- net2[i,]
    if(length(matched)>0) {             # if matching was performed!
      alterL[[i]]$name2[which(alterL[[i]]$alterid==matched[,2])] <- net[matched[,1]]
    }
  }
} #ignore warning

#repeat for the second matching matrices
# (i.e., matching egonet3 alters to prev. alters);
matchingList2 <- list()
for (i in 1:length(alterL)) { # for ego i
  matching2L <- list()
  matching2L[[1]] <- cbind(data$matching2N1.SQ001_SQ001.[i],data$matching2N1.SQ002_SQ001.[i],data$matching2N1.SQ003_SQ001.[i],data$matching2N1.SQ004_SQ001.[i],data$matching2N1.SQ005_SQ001.[i],data$matching2N1.SQ006_SQ001.[i],data$matching2N1.SQ007_SQ001.[i],data$matching2N1.SQ008_SQ001.[i],data$matching2N1.SQ009_SQ001.[i],data$matching2N1.SQ010_SQ001.[i])
  matching2L[[2]] <- rbind(
    cbind(data$matching2N2.SQ001_SQ001.[i],data$matching2N2.SQ002_SQ001.[i],data$matching2N2.SQ003_SQ001.[i],data$matching2N2.SQ004_SQ001.[i],data$matching2N2.SQ005_SQ001.[i],data$matching2N2.SQ006_SQ001.[i],data$matching2N2.SQ007_SQ001.[i],data$matching2N2.SQ008_SQ001.[i],data$matching2N2.SQ009_SQ001.[i],data$matching2N2.SQ010_SQ001.[i]),
    cbind(data$matching2N2.SQ001_SQ002.[i],data$matching2N2.SQ002_SQ002.[i],data$matching2N2.SQ003_SQ002.[i],data$matching2N2.SQ004_SQ002.[i],data$matching2N2.SQ005_SQ002.[i],data$matching2N2.SQ006_SQ002.[i],data$matching2N2.SQ007_SQ002.[i],data$matching2N2.SQ008_SQ002.[i],data$matching2N2.SQ009_SQ002.[i],data$matching2N2.SQ010_SQ002.[i]))
  matching2L[[3]] <- rbind(
    cbind(data$matching2N3.SQ001_SQ001.[i],data$matching2N3.SQ002_SQ001.[i],data$matching2N3.SQ003_SQ001.[i],data$matching2N3.SQ004_SQ001.[i],data$matching2N3.SQ005_SQ001.[i],data$matching2N3.SQ006_SQ001.[i],data$matching2N3.SQ007_SQ001.[i],data$matching2N3.SQ008_SQ001.[i],data$matching2N3.SQ009_SQ001.[i],data$matching2N3.SQ010_SQ001.[i]),
    cbind(data$matching2N3.SQ001_SQ002.[i],data$matching2N3.SQ002_SQ002.[i],data$matching2N3.SQ003_SQ002.[i],data$matching2N3.SQ004_SQ002.[i],data$matching2N3.SQ005_SQ002.[i],data$matching2N3.SQ006_SQ002.[i],data$matching2N3.SQ007_SQ002.[i],data$matching2N3.SQ008_SQ002.[i],data$matching2N3.SQ009_SQ002.[i],data$matching2N3.SQ010_SQ002.[i]),
    cbind(data$matching2N3.SQ001_SQ003.[i],data$matching2N3.SQ002_SQ003.[i],data$matching2N3.SQ003_SQ003.[i],data$matching2N3.SQ004_SQ003.[i],data$matching2N3.SQ005_SQ003.[i],data$matching2N3.SQ006_SQ003.[i],data$matching2N3.SQ007_SQ003.[i],data$matching2N3.SQ008_SQ003.[i],data$matching2N3.SQ009_SQ003.[i],data$matching2N3.SQ010_SQ003.[i]))
  matching2L[[4]] <- rbind(
    cbind(data$matching2N4.SQ001_SQ001.[i],data$matching2N4.SQ002_SQ001.[i],data$matching2N4.SQ003_SQ001.[i],data$matching2N4.SQ004_SQ001.[i],data$matching2N4.SQ005_SQ001.[i],data$matching2N4.SQ006_SQ001.[i],data$matching2N4.SQ007_SQ001.[i],data$matching2N4.SQ008_SQ001.[i],data$matching2N4.SQ009_SQ001.[i],data$matching2N4.SQ010_SQ001.[i]),
    cbind(data$matching2N4.SQ001_SQ002.[i],data$matching2N4.SQ002_SQ002.[i],data$matching2N4.SQ003_SQ002.[i],data$matching2N4.SQ004_SQ002.[i],data$matching2N4.SQ005_SQ002.[i],data$matching2N4.SQ006_SQ002.[i],data$matching2N4.SQ007_SQ002.[i],data$matching2N4.SQ008_SQ002.[i],data$matching2N4.SQ009_SQ002.[i],data$matching2N4.SQ010_SQ002.[i]),
    cbind(data$matching2N4.SQ001_SQ003.[i],data$matching2N4.SQ002_SQ003.[i],data$matching2N4.SQ003_SQ003.[i],data$matching2N4.SQ004_SQ003.[i],data$matching2N4.SQ005_SQ003.[i],data$matching2N4.SQ006_SQ003.[i],data$matching2N4.SQ007_SQ003.[i],data$matching2N4.SQ008_SQ003.[i],data$matching2N4.SQ009_SQ003.[i],data$matching2N4.SQ010_SQ003.[i]),
    cbind(data$matching2N4.SQ001_SQ004.[i],data$matching2N4.SQ002_SQ004.[i],data$matching2N4.SQ003_SQ004.[i],data$matching2N4.SQ004_SQ004.[i],data$matching2N4.SQ005_SQ004.[i],data$matching2N4.SQ006_SQ004.[i],data$matching2N4.SQ007_SQ004.[i],data$matching2N4.SQ008_SQ004.[i],data$matching2N4.SQ009_SQ004.[i],data$matching2N4.SQ010_SQ004.[i]))
  matching2L[[5]] <- rbind(
    cbind(data$matching2N5.SQ001_SQ001.[i],data$matching2N5.SQ002_SQ001.[i],data$matching2N5.SQ003_SQ001.[i],data$matching2N5.SQ004_SQ001.[i],data$matching2N5.SQ005_SQ001.[i],data$matching2N5.SQ006_SQ001.[i],data$matching2N5.SQ007_SQ001.[i],data$matching2N5.SQ008_SQ001.[i],data$matching2N5.SQ009_SQ001.[i],data$matching2N5.SQ010_SQ001.[i]),
    cbind(data$matching2N5.SQ001_SQ002.[i],data$matching2N5.SQ002_SQ002.[i],data$matching2N5.SQ003_SQ002.[i],data$matching2N5.SQ004_SQ002.[i],data$matching2N5.SQ005_SQ002.[i],data$matching2N5.SQ006_SQ002.[i],data$matching2N5.SQ007_SQ002.[i],data$matching2N5.SQ008_SQ002.[i],data$matching2N5.SQ009_SQ002.[i],data$matching2N5.SQ010_SQ002.[i]),
    cbind(data$matching2N5.SQ001_SQ003.[i],data$matching2N5.SQ002_SQ003.[i],data$matching2N5.SQ003_SQ003.[i],data$matching2N5.SQ004_SQ003.[i],data$matching2N5.SQ005_SQ003.[i],data$matching2N5.SQ006_SQ003.[i],data$matching2N5.SQ007_SQ003.[i],data$matching2N5.SQ008_SQ003.[i],data$matching2N5.SQ009_SQ003.[i],data$matching2N5.SQ010_SQ003.[i]),
    cbind(data$matching2N5.SQ001_SQ004.[i],data$matching2N5.SQ002_SQ004.[i],data$matching2N5.SQ003_SQ004.[i],data$matching2N5.SQ004_SQ004.[i],data$matching2N5.SQ005_SQ004.[i],data$matching2N5.SQ006_SQ004.[i],data$matching2N5.SQ007_SQ004.[i],data$matching2N5.SQ008_SQ004.[i],data$matching2N5.SQ009_SQ004.[i],data$matching2N5.SQ010_SQ004.[i]),
    cbind(data$matching2N5.SQ001_SQ005.[i],data$matching2N5.SQ002_SQ005.[i],data$matching2N5.SQ003_SQ005.[i],data$matching2N5.SQ004_SQ005.[i],data$matching2N5.SQ005_SQ005.[i],data$matching2N5.SQ006_SQ005.[i],data$matching2N5.SQ007_SQ005.[i],data$matching2N5.SQ008_SQ005.[i],data$matching2N5.SQ009_SQ005.[i],data$matching2N5.SQ010_SQ005.[i]))
  matchingList2[[i]] <- matching2L
}

for (i in 1:length(matchingList2)) {    # for ego i
  mL <- matchingList2[[i]]              # get the matching list 2
  ns <- ns3[[i]]                        # get the size of egonet3
  if(ns>0) {                            # if ns=0, no matching was done!
    mm <- as.matrix(mL[[ns]])           # and the corresponding matrix
    matched <- which(mm==1, arr.ind=T)  # retrieve array indices
    net <- net3[i,]
    
    if(length(matched)>0) {             # if matching was performed!
      alterL[[i]]$name3[matched[,2]] <- net[matched[,1]]
    }
  }
}

#and for matching matrix 3 (i.e., matching egonet4 with egonets 1-3)
matchingList3 <- list()
for (i in 1:length(alterL)) { # for ego i
  matching3L <- list()
  matching3L[[1]] <- cbind(data$matching3N1.SQ001_SQ001.[i],data$matching3N1.SQ002_SQ001.[i],data$matching3N1.SQ003_SQ001.[i],data$matching3N1.SQ004_SQ001.[i],data$matching3N1.SQ005_SQ001.[i],data$matching3N1.SQ006_SQ001.[i],data$matching3N1.SQ007_SQ001.[i],data$matching3N1.SQ008_SQ001.[i],data$matching3N1.SQ009_SQ001.[i],data$matching3N1.SQ010_SQ001.[i], data$matching3N1.SQ011_SQ001.[i], data$matching3N1.SQ012_SQ001.[i], data$matching3N1.SQ013_SQ001.[i], data$matching3N1.SQ014_SQ001.[i], data$matching3N1.SQ015_SQ001.[i])
  matching3L[[2]] <- rbind(
    cbind(data$matching3N2.SQ001_SQ001.[i],data$matching3N2.SQ002_SQ001.[i],data$matching3N2.SQ003_SQ001.[i],data$matching3N2.SQ004_SQ001.[i],data$matching3N2.SQ005_SQ001.[i],data$matching3N2.SQ006_SQ001.[i],data$matching3N2.SQ007_SQ001.[i],data$matching3N2.SQ008_SQ001.[i],data$matching3N2.SQ009_SQ001.[i],data$matching3N2.SQ010_SQ001.[i], data$matching3N2.SQ011_SQ001.[i], data$matching3N2.SQ012_SQ001.[i], data$matching3N2.SQ013_SQ001.[i], data$matching3N2.SQ014_SQ001.[i], data$matching3N2.SQ015_SQ001.[i]),
    cbind(data$matching3N2.SQ001_SQ002.[i],data$matching3N2.SQ002_SQ002.[i],data$matching3N2.SQ003_SQ002.[i],data$matching3N2.SQ004_SQ002.[i],data$matching3N2.SQ005_SQ002.[i],data$matching3N2.SQ006_SQ002.[i],data$matching3N2.SQ007_SQ002.[i],data$matching3N2.SQ008_SQ002.[i],data$matching3N2.SQ009_SQ002.[i],data$matching3N2.SQ010_SQ002.[i], data$matching3N2.SQ011_SQ002.[i], data$matching3N2.SQ012_SQ002.[i], data$matching3N2.SQ013_SQ002.[i], data$matching3N2.SQ014_SQ002.[i], data$matching3N2.SQ015_SQ002.[i]))
  matching3L[[3]] <- rbind(
    cbind(data$matching3N3.SQ001_SQ001.[i],data$matching3N3.SQ002_SQ001.[i],data$matching3N3.SQ003_SQ001.[i],data$matching3N3.SQ004_SQ001.[i],data$matching3N3.SQ005_SQ001.[i],data$matching3N3.SQ006_SQ001.[i],data$matching3N3.SQ007_SQ001.[i],data$matching3N3.SQ008_SQ001.[i],data$matching3N3.SQ009_SQ001.[i],data$matching3N3.SQ010_SQ001.[i], data$matching3N3.SQ011_SQ001.[i], data$matching3N3.SQ012_SQ001.[i], data$matching3N3.SQ013_SQ001.[i], data$matching3N3.SQ014_SQ001.[i], data$matching3N3.SQ015_SQ001.[i]),
    cbind(data$matching3N3.SQ001_SQ002.[i],data$matching3N3.SQ002_SQ002.[i],data$matching3N3.SQ003_SQ002.[i],data$matching3N3.SQ004_SQ002.[i],data$matching3N3.SQ005_SQ002.[i],data$matching3N3.SQ006_SQ002.[i],data$matching3N3.SQ007_SQ002.[i],data$matching3N3.SQ008_SQ002.[i],data$matching3N3.SQ009_SQ002.[i],data$matching3N3.SQ010_SQ002.[i], data$matching3N3.SQ011_SQ002.[i], data$matching3N3.SQ012_SQ002.[i], data$matching3N3.SQ013_SQ002.[i], data$matching3N3.SQ014_SQ002.[i], data$matching3N3.SQ015_SQ002.[i]),
    cbind(data$matching3N3.SQ001_SQ003.[i],data$matching3N3.SQ002_SQ003.[i],data$matching3N3.SQ003_SQ003.[i],data$matching3N3.SQ004_SQ003.[i],data$matching3N3.SQ005_SQ003.[i],data$matching3N3.SQ006_SQ003.[i],data$matching3N3.SQ007_SQ003.[i],data$matching3N3.SQ008_SQ003.[i],data$matching3N3.SQ009_SQ003.[i],data$matching3N3.SQ010_SQ003.[i], data$matching3N3.SQ011_SQ003.[i], data$matching3N3.SQ012_SQ003.[i], data$matching3N3.SQ013_SQ003.[i], data$matching3N3.SQ014_SQ003.[i], data$matching3N3.SQ015_SQ003.[i]))
  matching3L[[4]] <- rbind(
    cbind(data$matching3N4.SQ001_SQ001.[i],data$matching3N4.SQ002_SQ001.[i],data$matching3N4.SQ003_SQ001.[i],data$matching3N4.SQ004_SQ001.[i],data$matching3N4.SQ005_SQ001.[i],data$matching3N4.SQ006_SQ001.[i],data$matching3N4.SQ007_SQ001.[i],data$matching3N4.SQ008_SQ001.[i],data$matching3N4.SQ009_SQ001.[i],data$matching3N4.SQ010_SQ001.[i], data$matching3N4.SQ011_SQ001.[i], data$matching3N4.SQ012_SQ001.[i], data$matching3N4.SQ013_SQ001.[i], data$matching3N4.SQ014_SQ001.[i], data$matching3N4.SQ015_SQ001.[i]),
    cbind(data$matching3N4.SQ001_SQ002.[i],data$matching3N4.SQ002_SQ002.[i],data$matching3N4.SQ003_SQ002.[i],data$matching3N4.SQ004_SQ002.[i],data$matching3N4.SQ005_SQ002.[i],data$matching3N4.SQ006_SQ002.[i],data$matching3N4.SQ007_SQ002.[i],data$matching3N4.SQ008_SQ002.[i],data$matching3N4.SQ009_SQ002.[i],data$matching3N4.SQ010_SQ002.[i], data$matching3N4.SQ011_SQ002.[i], data$matching3N4.SQ012_SQ002.[i], data$matching3N4.SQ013_SQ002.[i], data$matching3N4.SQ014_SQ002.[i], data$matching3N4.SQ015_SQ002.[i]),
    cbind(data$matching3N4.SQ001_SQ003.[i],data$matching3N4.SQ002_SQ003.[i],data$matching3N4.SQ003_SQ003.[i],data$matching3N4.SQ004_SQ003.[i],data$matching3N4.SQ005_SQ003.[i],data$matching3N4.SQ006_SQ003.[i],data$matching3N4.SQ007_SQ003.[i],data$matching3N4.SQ008_SQ003.[i],data$matching3N4.SQ009_SQ003.[i],data$matching3N4.SQ010_SQ003.[i], data$matching3N4.SQ011_SQ003.[i], data$matching3N4.SQ012_SQ003.[i], data$matching3N4.SQ013_SQ003.[i], data$matching3N4.SQ014_SQ003.[i], data$matching3N4.SQ015_SQ003.[i]),
    cbind(data$matching3N4.SQ001_SQ003.[i],data$matching3N4.SQ002_SQ003.[i],data$matching3N4.SQ003_SQ003.[i],data$matching3N4.SQ004_SQ003.[i],data$matching3N4.SQ005_SQ003.[i],data$matching3N4.SQ006_SQ003.[i],data$matching3N4.SQ007_SQ003.[i],data$matching3N4.SQ008_SQ003.[i],data$matching3N4.SQ009_SQ003.[i],data$matching3N4.SQ010_SQ003.[i], data$matching3N4.SQ011_SQ003.[i], data$matching3N4.SQ012_SQ003.[i], data$matching3N4.SQ013_SQ003.[i], data$matching3N4.SQ014_SQ003.[i], data$matching3N4.SQ015_SQ003.[i]),
    cbind(data$matching3N4.SQ001_SQ004.[i],data$matching3N4.SQ002_SQ004.[i],data$matching3N4.SQ003_SQ004.[i],data$matching3N4.SQ004_SQ004.[i],data$matching3N4.SQ005_SQ004.[i],data$matching3N4.SQ006_SQ004.[i],data$matching3N4.SQ007_SQ004.[i],data$matching3N4.SQ008_SQ004.[i],data$matching3N4.SQ009_SQ004.[i],data$matching3N4.SQ010_SQ004.[i], data$matching3N4.SQ011_SQ004.[i], data$matching3N4.SQ012_SQ004.[i], data$matching3N4.SQ013_SQ004.[i], data$matching3N4.SQ014_SQ004.[i], data$matching3N4.SQ015_SQ004.[i]))
  matching3L[[5]] <- rbind(
    cbind(data$matching3N5.SQ001_SQ001.[i],data$matching3N5.SQ002_SQ001.[i],data$matching3N5.SQ003_SQ001.[i],data$matching3N5.SQ004_SQ001.[i],data$matching3N5.SQ005_SQ001.[i],data$matching3N5.SQ006_SQ001.[i],data$matching3N5.SQ007_SQ001.[i],data$matching3N5.SQ008_SQ001.[i],data$matching3N5.SQ009_SQ001.[i],data$matching3N5.SQ010_SQ001.[i], data$matching3N5.SQ011_SQ001.[i], data$matching3N5.SQ012_SQ001.[i], data$matching3N5.SQ013_SQ001.[i], data$matching3N5.SQ014_SQ001.[i], data$matching3N5.SQ015_SQ001.[i]),
    cbind(data$matching3N5.SQ001_SQ002.[i],data$matching3N5.SQ002_SQ002.[i],data$matching3N5.SQ003_SQ002.[i],data$matching3N5.SQ004_SQ002.[i],data$matching3N5.SQ005_SQ002.[i],data$matching3N5.SQ006_SQ002.[i],data$matching3N5.SQ007_SQ002.[i],data$matching3N5.SQ008_SQ002.[i],data$matching3N5.SQ009_SQ002.[i],data$matching3N5.SQ010_SQ002.[i], data$matching3N5.SQ011_SQ002.[i], data$matching3N5.SQ012_SQ002.[i], data$matching3N5.SQ013_SQ002.[i], data$matching3N5.SQ014_SQ002.[i], data$matching3N5.SQ015_SQ002.[i]),
    cbind(data$matching3N5.SQ001_SQ003.[i],data$matching3N5.SQ002_SQ003.[i],data$matching3N5.SQ003_SQ003.[i],data$matching3N5.SQ004_SQ003.[i],data$matching3N5.SQ005_SQ003.[i],data$matching3N5.SQ006_SQ003.[i],data$matching3N5.SQ007_SQ003.[i],data$matching3N5.SQ008_SQ003.[i],data$matching3N5.SQ009_SQ003.[i],data$matching3N5.SQ010_SQ003.[i], data$matching3N5.SQ011_SQ003.[i], data$matching3N5.SQ012_SQ003.[i], data$matching3N5.SQ013_SQ003.[i], data$matching3N5.SQ014_SQ003.[i], data$matching3N5.SQ015_SQ003.[i]),
    cbind(data$matching3N5.SQ001_SQ003.[i],data$matching3N5.SQ002_SQ003.[i],data$matching3N5.SQ003_SQ003.[i],data$matching3N5.SQ004_SQ003.[i],data$matching3N5.SQ005_SQ003.[i],data$matching3N5.SQ006_SQ003.[i],data$matching3N5.SQ007_SQ003.[i],data$matching3N5.SQ008_SQ003.[i],data$matching3N5.SQ009_SQ003.[i],data$matching3N5.SQ010_SQ003.[i], data$matching3N5.SQ011_SQ003.[i], data$matching3N5.SQ012_SQ003.[i], data$matching3N5.SQ013_SQ003.[i], data$matching3N5.SQ014_SQ003.[i], data$matching3N5.SQ015_SQ003.[i]),
    cbind(data$matching3N5.SQ001_SQ005.[i],data$matching3N5.SQ002_SQ005.[i],data$matching3N5.SQ003_SQ005.[i],data$matching3N5.SQ004_SQ005.[i],data$matching3N5.SQ005_SQ005.[i],data$matching3N5.SQ006_SQ005.[i],data$matching3N5.SQ007_SQ005.[i],data$matching3N5.SQ008_SQ005.[i],data$matching3N5.SQ009_SQ005.[i],data$matching3N5.SQ010_SQ005.[i], data$matching3N5.SQ011_SQ005.[i], data$matching3N5.SQ012_SQ005.[i], data$matching3N5.SQ013_SQ005.[i], data$matching3N5.SQ014_SQ005.[i], data$matching3N5.SQ015_SQ005.[i]))
  matchingList3[[i]] <- matching3L
}

for (i in 1:length(matchingList3)) {    # for ego i
  mL <- matchingList3[[i]]              # get the matching list 2
  ns <- ns4[[i]]                        # get the size of egonet4
  if(ns>0) {                            # if ns=0, no matching was done!
    mm <- as.matrix(mL[[ns]])           # and the corresponding matrix
    matched <- which(mm==1, arr.ind=T)  # retrieve array indices
    net <- net4[i,]
    if(length(matched)>0) {             # if matching was performed!
      alterL[[i]]$name4[matched[,2]] <- net[matched[,1]]
    }
  }
}

#i also calculate structural embeddedness (alter-level) per ego-net.

#first i fix some irregularities in the data
#1. a mistake was made in labeling the adjacency matrix variables for the friends network, so i first relabel them, so the same script below for constructing density scores can be used.
#(I started with N1 instead of N2 (N denotes the number of named alters; which should start at 2, because only at netsizes > 1, I asked for alter-ties) )
data <- data %>%
  rename (adj3N2a.SQ001. = adj3N1a.SQ001., adj3N3a.SQ001. = adj3N2a.SQ001.,adj3N3a.SQ002. = adj3N2a.SQ002.,adj3N3b.SQ001. = adj3N2b.SQ001.,adj3N4a.SQ001. = adj3N3a.SQ001.,adj3N4a.SQ002. = adj3N3a.SQ002.,adj3N4a.SQ003. = adj3N3a.SQ003.,adj3N4b.SQ001. = adj3N3b.SQ001.,adj3N4b.SQ002. = adj3N3b.SQ002.,   adj3N4c.SQ001. = adj3N3c.SQ001.,adj3N5a.SQ001. = adj3N4a.SQ001.,adj3N5a.SQ002. = adj3N4a.SQ002.,adj3N5a.SQ003. = adj3N4a.SQ003.,adj3N5a.SQ004. = adj3N4a.SQ004.,adj3N5b.SQ001. = adj3N4b.SQ001.,adj3N5b.SQ002. = adj3N4b.SQ002.,adj3N5b.SQ003. = adj3N4b.SQ003.,adj3N5c.SQ001. = adj3N4c.SQ001.,adj3N5c.SQ002. = adj3N4c.SQ002.,adj3N5d.SQ001. = adj3N4d.SQ001.)

#2. a labeling mistake: for the adjacency matrix for sports ties, with ns=3, the question about relation between alter 2 and 3 was coded wrongly. 
data$adj4N3b.SQ001. <- data$adj4N3b.SQ002.
##

for (i in 1:length(alterL)) { # for ego i

  #get number of names listed in the egonets
  nnames_cdn <- length(which(data[i,c("egonet1.SQ001.","egonet1.SQ002.","egonet1.SQ003.","egonet1.SQ004.","egonet1.SQ005.")]!=""))
  nnames_study <- length(which(data[i,c("egonet2.SQ001.","egonet2.SQ002.","egonet2.SQ003.","egonet2.SQ004.","egonet2.SQ005.")]!=""))
  nnames_bff <- length(which(data[i,c("egonet3.SQ001.","egonet3.SQ002.","egonet3.SQ003.","egonet3.SQ004.","egonet3.SQ005.")]!=""))
  nnames_csn <- length(which(data[i,c("egonet4.SQ001.","egonet4.SQ002.","egonet4.SQ003.","egonet4.SQ004.","egonet4.SQ005.")]!=""))
  
  #CDN
  
  #make list of adjacency matrices
  adjL <- list()
  {
  #2 alters
  adjL[[2]] <- matrix(NA,ncol=2,nrow=2)
  adjL[[2]][1,2] <- adjL[[2]][2,1] <- data$adj1N2a.SQ001.[i]

  #3 alters
  adjL[[3]] <- matrix(NA,ncol=3,nrow=3)
  adjL[[3]][1,2] <- adjL[[3]][2,1] <- data$adj1N3a.SQ001.[i]
  adjL[[3]][1,3] <- adjL[[3]][3,1] <- data$adj1N3a.SQ002.[i]
  adjL[[3]][2,3] <- adjL[[3]][3,2] <- data$adj1N3b.SQ001.[i]

  #4 alters
  adjL[[4]] <- matrix(NA,ncol=4,nrow=4)
  adjL[[4]][1,2] <- adjL[[4]][2,1] <- data$adj1N4a.SQ001.[i]
  adjL[[4]][1,3] <- adjL[[4]][3,1] <- data$adj1N4a.SQ002.[i]
  adjL[[4]][1,4] <- adjL[[4]][4,1] <- data$adj1N4a.SQ003.[i]
  adjL[[4]][2,3] <- adjL[[4]][3,2] <- data$adj1N4b.SQ001.[i]
  adjL[[4]][2,4] <- adjL[[4]][4,2] <- data$adj1N4b.SQ002.[i]
  adjL[[4]][3,4] <- adjL[[4]][4,3] <- data$adj1N4c.SQ001.[i]

  #5 alters
  adjL[[5]] <- matrix(NA,ncol=5,nrow=5)
  adjL[[5]][1,2] <- adjL[[5]][2,1] <- data$adj1N5a.SQ001.[i]
  adjL[[5]][1,3] <- adjL[[5]][3,1] <- data$adj1N5a.SQ002.[i]
  adjL[[5]][1,4] <- adjL[[5]][4,1] <- data$adj1N5a.SQ003.[i]
  adjL[[5]][1,5] <- adjL[[5]][5,1] <- data$adj1N5a.SQ004.[i]
  adjL[[5]][2,3] <- adjL[[5]][3,2] <- data$adj1N5b.SQ001.[i]
  adjL[[5]][2,4] <- adjL[[5]][4,2] <- data$adj1N5b.SQ002.[i]
  adjL[[5]][2,5] <- adjL[[5]][5,2] <- data$adj1N5b.SQ003.[i]
  adjL[[5]][3,4] <- adjL[[5]][4,3] <- data$adj1N5c.SQ001.[i]
  adjL[[5]][3,5] <- adjL[[5]][5,3] <- data$adj1N5c.SQ002.[i]
  adjL[[5]][4,5] <- adjL[[5]][5,4] <- data$adj1N5d.SQ001.[i]
  }

  if(nnames_cdn>1) { #we only know alter-alter relations for nnames>1
    #take the matrix corresponding the nnames
    mat <- adjL[[nnames_cdn]]
    
    #ties that are (very) close are 1
    mat[!is.na(mat)] <- ifelse(mat[!is.na(mat)]=="Erg hecht" | mat[!is.na(mat)]=="Hecht", 1,0)

    #calculate embeddedness for each alter/row:
    embed <- apply(mat, 1, function(row) {
    n_cols <- sum(!is.na(row))
    n_ones <- sum(row == "1", na.rm = TRUE)
    ratio <- n_ones / n_cols
    return(ratio)
    })
  
  #CDN: 1:nnames_CDN
  alterL[[i]]$cdn_embed.t1[1:nnames_cdn] <- embed 
  }
  
  #STUDY

  #make list of adjacency matrices
  adjL <- list()
  {
  #2 alters
  adjL[[2]] <- matrix(NA,ncol=2,nrow=2)
  adjL[[2]][1,2] <- adjL[[2]][2,1] <- data$adj2N2a.SQ001.[i]

  #3 alters
  adjL[[3]] <- matrix(NA,ncol=3,nrow=3)
  adjL[[3]][1,2] <- adjL[[3]][2,1] <- data$adj2N3a.SQ001.[i]
  adjL[[3]][1,3] <- adjL[[3]][3,1] <- data$adj2N3a.SQ002.[i]
  adjL[[3]][2,3] <- adjL[[3]][3,2] <- data$adj2N3b.SQ001.[i]

  #4 alters
  adjL[[4]] <- matrix(NA,ncol=4,nrow=4)
  adjL[[4]][1,2] <- adjL[[4]][2,1] <- data$adj2N4a.SQ001.[i]
  adjL[[4]][1,3] <- adjL[[4]][3,1] <- data$adj2N4a.SQ002.[i]
  adjL[[4]][1,4] <- adjL[[4]][4,1] <- data$adj2N4a.SQ003.[i]
  adjL[[4]][2,3] <- adjL[[4]][3,2] <- data$adj2N4b.SQ001.[i]
  adjL[[4]][2,4] <- adjL[[4]][4,2] <- data$adj2N4b.SQ002.[i]
  adjL[[4]][3,4] <- adjL[[4]][4,3] <- data$adj2N4c.SQ001.[i]

  #5 alters
  adjL[[5]] <- matrix(NA,ncol=5,nrow=5)
  adjL[[5]][1,2] <- adjL[[5]][2,1] <- data$adj2N5a.SQ001.[i]
  adjL[[5]][1,3] <- adjL[[5]][3,1] <- data$adj2N5a.SQ002.[i]
  adjL[[5]][1,4] <- adjL[[5]][4,1] <- data$adj2N5a.SQ003.[i]
  adjL[[5]][1,5] <- adjL[[5]][5,1] <- data$adj2N5a.SQ004.[i]
  adjL[[5]][2,3] <- adjL[[5]][3,2] <- data$adj2N5b.SQ001.[i]
  adjL[[5]][2,4] <- adjL[[5]][4,2] <- data$adj2N5b.SQ002.[i]
  adjL[[5]][2,5] <- adjL[[5]][5,2] <- data$adj2N5b.SQ003.[i]
  adjL[[5]][3,4] <- adjL[[5]][4,3] <- data$adj2N5c.SQ001.[i]
  adjL[[5]][3,5] <- adjL[[5]][5,3] <- data$adj2N5c.SQ002.[i]
  adjL[[5]][4,5] <- adjL[[5]][5,4] <- data$adj2N5d.SQ001.[i]
  }

  if(nnames_study>1) { #we only know alter-alter relations for nnames
    #take the matrix corresponding the nnames
    mat <- adjL[[nnames_study]]
    
    #ties that are (very) close are 1
    mat[!is.na(mat)] <- ifelse(mat[!is.na(mat)]=="Erg hecht" | mat[!is.na(mat)]=="Hecht", 1,0)

    #calculate embeddedness for each alter/row:
    embed <- apply(mat, 1, function(row) {
    n_cols <- sum(!is.na(row))
    n_ones <- sum(row == "1", na.rm = TRUE)
    ratio <- n_ones / n_cols
    return(ratio)
    })
    
    alterL[[i]]$study_embed.t1[6:(5+nnames_study)] <- embed 
  }
  
  # BEST FRIENDS
  #make list of adjacency matrices
  adjL <- list()
  {
  #2 alters
  adjL[[2]] <- matrix(NA,ncol=2,nrow=2)
  adjL[[2]][1,2] <- adjL[[2]][2,1] <- data$adj3N2a.SQ001.[i]

  #3 alters
  adjL[[3]] <- matrix(NA,ncol=3,nrow=3)
  adjL[[3]][1,2] <- adjL[[3]][2,1] <- data$adj3N3a.SQ001.[i]
  adjL[[3]][1,3] <- adjL[[3]][3,1] <- data$adj3N3a.SQ002.[i]
  adjL[[3]][2,3] <- adjL[[3]][3,2] <- data$adj3N3b.SQ001.[i]

  #4 alters
  adjL[[4]] <- matrix(NA,ncol=4,nrow=4)
  adjL[[4]][1,2] <- adjL[[4]][2,1] <- data$adj3N4a.SQ001.[i]
  adjL[[4]][1,3] <- adjL[[4]][3,1] <- data$adj3N4a.SQ002.[i]
  adjL[[4]][1,4] <- adjL[[4]][4,1] <- data$adj3N4a.SQ003.[i]
  adjL[[4]][2,3] <- adjL[[4]][3,2] <- data$adj3N4b.SQ001.[i]
  adjL[[4]][2,4] <- adjL[[4]][4,2] <- data$adj3N4b.SQ002.[i]
  adjL[[4]][3,4] <- adjL[[4]][4,3] <- data$adj3N4c.SQ001.[i]

  #5 alters
  adjL[[5]] <- matrix(NA,ncol=5,nrow=5)
  adjL[[5]][1,2] <- adjL[[5]][2,1] <- data$adj3N5a.SQ001.[i]
  adjL[[5]][1,3] <- adjL[[5]][3,1] <- data$adj3N5a.SQ002.[i]
  adjL[[5]][1,4] <- adjL[[5]][4,1] <- data$adj3N5a.SQ003.[i]
  adjL[[5]][1,5] <- adjL[[5]][5,1] <- data$adj3N5a.SQ004.[i]
  adjL[[5]][2,3] <- adjL[[5]][3,2] <- data$adj3N5b.SQ001.[i]
  adjL[[5]][2,4] <- adjL[[5]][4,2] <- data$adj3N5b.SQ002.[i]
  adjL[[5]][2,5] <- adjL[[5]][5,2] <- data$adj3N5b.SQ003.[i]
  adjL[[5]][3,4] <- adjL[[5]][4,3] <- data$adj3N5c.SQ001.[i]
  adjL[[5]][3,5] <- adjL[[5]][5,3] <- data$adj3N5c.SQ002.[i]
  adjL[[5]][4,5] <- adjL[[5]][5,4] <- data$adj3N5d.SQ001.[i]
  }

  if(nnames_bff>1) { #we only know alter-alter relations for nnames
    #take the matrix corresponding the nnames
    mat <- adjL[[nnames_bff]]
    
    #ties that are (very) close are 1
    mat[!is.na(mat)] <- ifelse(mat[!is.na(mat)]=="Erg hecht" | mat[!is.na(mat)]=="Hecht", 1,0)

    #calculate embeddedness for each alter/row:
    embed <- apply(mat, 1, function(row) {
    n_cols <- sum(!is.na(row))
    n_ones <- sum(row == "1", na.rm = TRUE)
    ratio <- n_ones / n_cols
    return(ratio)
    })
    
    alterL[[i]]$bff_embed.t1[11:(10+nnames_bff)] <- embed 
  }
  
  # SPORTS PARTNERS
  #make list of adjacency matrices
  adjL <- list()
  {
  #2 alters
  adjL[[2]] <- matrix(NA,ncol=2,nrow=2)
  adjL[[2]][1,2] <- adjL[[2]][2,1] <- data$adj4N2a.SQ001.[i]

  #3 alters
  adjL[[3]] <- matrix(NA,ncol=3,nrow=3)
  adjL[[3]][1,2] <- adjL[[3]][2,1] <- data$adj4N3a.SQ001.[i]
  adjL[[3]][1,3] <- adjL[[3]][3,1] <- data$adj4N3a.SQ002.[i]
  adjL[[3]][2,3] <- adjL[[3]][3,2] <- data$adj4N3b.SQ001.[i]

  #4 alters
  adjL[[4]] <- matrix(NA,ncol=4,nrow=4)
  adjL[[4]][1,2] <- adjL[[4]][2,1] <- data$adj4N4a.SQ001.[i]
  adjL[[4]][1,3] <- adjL[[4]][3,1] <- data$adj4N4a.SQ002.[i]
  adjL[[4]][1,4] <- adjL[[4]][4,1] <- data$adj4N4a.SQ003.[i]
  adjL[[4]][2,3] <- adjL[[4]][3,2] <- data$adj4N4b.SQ001.[i]
  adjL[[4]][2,4] <- adjL[[4]][4,2] <- data$adj4N4b.SQ002.[i]
  adjL[[4]][3,4] <- adjL[[4]][4,3] <- data$adj4N4c.SQ001.[i]

  #5 alters
  adjL[[5]] <- matrix(NA,ncol=5,nrow=5)
  adjL[[5]][1,2] <- adjL[[5]][2,1] <- data$adj4N5a.SQ001.[i]
  adjL[[5]][1,3] <- adjL[[5]][3,1] <- data$adj4N5a.SQ002.[i]
  adjL[[5]][1,4] <- adjL[[5]][4,1] <- data$adj4N5a.SQ003.[i]
  adjL[[5]][1,5] <- adjL[[5]][5,1] <- data$adj4N5a.SQ004.[i]
  adjL[[5]][2,3] <- adjL[[5]][3,2] <- data$adj4N5b.SQ001.[i]
  adjL[[5]][2,4] <- adjL[[5]][4,2] <- data$adj4N5b.SQ002.[i]
  adjL[[5]][2,5] <- adjL[[5]][5,2] <- data$adj4N5b.SQ003.[i]
  adjL[[5]][3,4] <- adjL[[5]][4,3] <- data$adj4N5c.SQ001.[i]
  adjL[[5]][3,5] <- adjL[[5]][5,3] <- data$adj4N5c.SQ002.[i]
  adjL[[5]][4,5] <- adjL[[5]][5,4] <- data$adj4N5d.SQ001.[i]
  }

  if(nnames_csn>1) { #we only know alter-alter relations for nnames
    #take the matrix corresponding the nnames
    mat <- adjL[[nnames_csn]]
    
    #ties that are (very) close are 1
    mat[!is.na(mat)] <- ifelse(mat[!is.na(mat)]=="Erg hecht" | mat[!is.na(mat)]=="Hecht", 1,0)

    #calculate embeddedness for each alter/row:
    embed <- apply(mat, 1, function(row) {
    n_cols <- sum(!is.na(row))
    n_ones <- sum(row == "1", na.rm = TRUE)
    ratio <- n_ones / n_cols
    return(ratio)
    })
    
    alterL[[i]]$csn_embed.t1[16:(15+nnames_csn)] <- embed 
  }
}

#alters could be named in multiple name generators. each element of alterL contains rows corresponding to alters that may be 'duplicates'.
#i match the structural embeddedness measures

for (i in 1:length(alterL)) { #for ego i 
  for (j in 1:nrow(alterL[[i]])) { #for alter j
        
    #if name2 is not empty, alter j was matched to the study network; and more precisely, to the study partner with name1: alterL[[i]]$name2[j]
    alterL[[i]]$study_embed.t1[j] <- ifelse(!is.na(alterL[[i]]$name2[j]), 
                                            alterL[[i]]$study_embed.t1[which(alterL[[i]]$name1==alterL[[i]]$name2[j] & !is.na(alterL[[i]]$study_embed.t1))],
                                            alterL[[i]]$study_embed.t1[j])
    
    #if name3 is not empty, alter j was matched to the friends network; and more precisely, to the friend with name1: alterL[[i]]$name3[j]
    alterL[[i]]$bff_embed.t1[j] <- ifelse(!is.na(alterL[[i]]$name3[j]), 
                                          alterL[[i]]$bff_embed.t1[which(alterL[[i]]$name1==alterL[[i]]$name3[j] & !is.na(alterL[[i]]$bff_embed.t1))],
                                          alterL[[i]]$bff_embed.t1[j])
    
    #if name4 is not empty, alter j was matched to the sports network; and more precisely, to the sports partner with name1: alterL[[i]]$name4[j]
    alterL[[i]]$csn_embed.t1[j] <- ifelse(!is.na(alterL[[i]]$name4[j]), 
                                          alterL[[i]]$csn_embed.t1[which(alterL[[i]]$name1==alterL[[i]]$name4[j] & !is.na(alterL[[i]]$csn_embed.t1))],     
                                          alterL[[i]]$csn_embed.t1[j] )
  }
}

# i use the name interpreter data to add (stable) alter characteristics (e.g., gender)
# in name-interpreter questions, only unique (i.e., non-matched) alters were listed... thus, alter ids without a gender assigned to them are non-uniques, and can later be filtered out.
df_gender <- data.frame(p1 = data$gender.SQ001.,p2 = data$gender.SQ002.,p3 = data$gender.SQ003.,p4 = data$gender.SQ004.,p5 = data$gender.SQ005.,p6 = data$gender.SQ006.,p7 = data$gender.SQ007.,p8 = data$gender.SQ008.,p9 = data$gender.SQ009.,p10= data$gender.SQ010.,p11= data$gender.SQ011.,p12= data$gender.SQ012.,p13= data$gender.SQ013.,p14= data$gender.SQ014.,p15= data$gender.SQ015.,p16= data$gender.SQ016.,p17= data$gender.SQ017.,p18= data$gender.SQ018.,p19= data$gender.SQ019.,p20= data$gender.SQ020.)

# same for age...
df_age <- data.frame(p1 = data$age.SQ001.,p2 = data$age.SQ002.,p3 = data$age.SQ003.,p4 = data$age.SQ004.,p5 = data$age.SQ005.,p6 = data$age.SQ006.,p7 = data$age.SQ007.,p8 = data$age.SQ008.,p9 = data$age.SQ009.,p10= data$age.SQ010.,p11= data$age.SQ011.,p12= data$age.SQ012.,p13= data$age.SQ013.,p14= data$age.SQ014.,p15= data$age.SQ015.,p16= data$age.SQ016.,p17= data$age.SQ017.,p18= data$age.SQ018.,p19= data$age.SQ019.,p20= data$age.SQ020.)

# kin
df_kin <- data.frame( p1 = data$kin.SQ001.,p2 = data$kin.SQ002.,p3 = data$kin.SQ003.,p4 = data$kin.SQ004.,p5 = data$kin.SQ005.,p6 = data$kin.SQ006.,p7 = data$kin.SQ007.,p8 = data$kin.SQ008.,p9 = data$kin.SQ009.,p10= data$kin.SQ010.,p11= data$kin.SQ011.,p12= data$kin.SQ012.,p13= data$kin.SQ013.,p14= data$kin.SQ014.,p15= data$kin.SQ015.,p16= data$kin.SQ016.,p17= data$kin.SQ017.,p18= data$kin.SQ018.,p19= data$kin.SQ019.,p20= data$kin.SQ020.)

#education
df_educ <- data.frame(p1 = data$educ.SQ001.,p2 = data$educ.SQ002.,p3 = data$educ.SQ003.,p4 = data$educ.SQ004.,p5 = data$educ.SQ005.,p6 = data$educ.SQ006.,p7 = data$educ.SQ007.,p8 = data$educ.SQ008., p9 = data$educ.SQ009.,p10= data$educ.SQ010., p11= data$educ.SQ011., p12= data$educ.SQ012., p13= data$educ.SQ013., p14= data$educ.SQ014., p15= data$educ.SQ015., p16= data$educ.SQ016., p17= data$educ.SQ017., p18= data$educ.SQ018., p19= data$educ.SQ019., p20= data$educ.SQ020.)

#also dynamic characteristics
#communication frequency
df_freq <- data.frame(p1 = data$freq.SQ001.,p2 = data$freq.SQ002.,p3 = data$freq.SQ003.,p4 = data$freq.SQ004.,p5 = data$freq.SQ005.,p6 = data$freq.SQ006.,p7 = data$freq.SQ007.,p8 = data$freq.SQ008., p9 = data$freq.SQ009.,p10= data$freq.SQ010., p11= data$freq.SQ011., p12= data$freq.SQ012., p13= data$freq.SQ013., p14= data$freq.SQ014., p15= data$freq.SQ015., p16= data$freq.SQ016., p17= data$freq.SQ017., p18= data$freq.SQ018., p19= data$freq.SQ019., p20= data$freq.SQ020.)

#closeness
df_close <- data.frame(p1 = data$close.SQ001.,p2 = data$close.SQ002.,p3 = data$close.SQ003.,p4 = data$close.SQ004.,p5 = data$close.SQ005.,p6 = data$close.SQ006.,p7 = data$close.SQ007.,p8 = data$close.SQ008., p9 = data$close.SQ009.,p10= data$close.SQ010., p11= data$close.SQ011., p12= data$close.SQ012., p13= data$close.SQ013., p14= data$close.SQ014., p15= data$close.SQ015., p16= data$close.SQ016., p17= data$close.SQ017., p18= data$close.SQ018., p19= data$close.SQ019., p20= data$close.SQ020.)

#and other dyadic featuers
# duration;
df_duration <- data.frame(p1 = data$duur.SQ001.,p2 = data$duur.SQ002.,p3 = data$duur.SQ003.,p4 = data$duur.SQ004.,p5 = data$duur.SQ005.,p6 = data$duur.SQ006.,p7 = data$duur.SQ007.,p8 = data$duur.SQ008., p9 = data$duur.SQ009.,p10= data$duur.SQ010., p11= data$duur.SQ011., p12= data$duur.SQ012., p13= data$duur.SQ013., p14= data$duur.SQ014., p15= data$duur.SQ015., p16= data$duur.SQ016., p17= data$duur.SQ017., p18= data$duur.SQ018., p19= data$duur.SQ019., p20= data$duur.SQ020.)

#geographical proximity
df_proximity <- data.frame(p1 = data$prox.SQ001.,p2 = data$prox.SQ002.,p3 = data$prox.SQ003.,p4 = data$prox.SQ004.,p5 = data$prox.SQ005.,p6 = data$prox.SQ006.,p7 = data$prox.SQ007.,p8 = data$prox.SQ008., p9 = data$prox.SQ009.,p10= data$prox.SQ010., p11= data$prox.SQ011., p12= data$prox.SQ012., p13= data$prox.SQ013., p14= data$prox.SQ014., p15= data$prox.SQ015., p16= data$prox.SQ016., p17= data$prox.SQ017., p18= data$prox.SQ018., p19= data$prox.SQ019., p20= data$prox.SQ020.)

for (i in 1:length(alterL)) {
  
  #gender
  alterL[[i]]$alter_gender <- 
    ifelse(unlist(df_gender[i,], use.names=F)=="Man", 0,  # male = ref.
           ifelse(unlist(df_gender[i,], use.names=F)=="Vrouw", 1,
                  ifelse(unlist(df_gender[i,], use.names=F)=="Anders", 2, "")))
  #kin  
  alterL[[i]]$kin <- 
    ifelse(unlist(df_kin[i,], use.names=F)=="Ja", 1,
           ifelse(unlist(df_kin[i,], use.names=F)=="Nee", 0, ""))
  #age  
  alterL[[i]]$alter_age <- 
    ifelse(unlist(df_age[i,], use.names=F)=="Jonger dan 18 jaar", 16, #???
           ifelse(unlist(df_age[i,], use.names=F)=="18 tot 21 jaar", 20,
                  ifelse(unlist(df_age[i,], use.names=F)=="22 tot 25 jaar", 23,
                         ifelse(unlist(df_age[i,], use.names=F)=="26 tot 30 jaar", 28,
                                ifelse(unlist(df_age[i,], use.names=F)=="31 tot 40 jaar", 35,
                                       ifelse(unlist(df_age[i,], use.names=F)=="Ouder dan 40 jaar", 45, #???
                                              ifelse(unlist(df_age[i,], use.names=F)=="Weet ik niet", NA, # i don't know = missing
                                                     unlist(df_age[i,], use.names=F))))))))
  #education
  alterL[[i]]$alter_educ <- ifelse(unlist(df_educ[i,],use.names=F)=="lagere school", 1,
                               ifelse(unlist(df_educ[i,],use.names=F)=="vmbo, mavo", 2,
                                      ifelse(unlist(df_educ[i,],use.names=F)=="mbo", 3,
                                         ifelse(unlist(df_educ[i,],use.names=F)=="havo", 4,
                                            ifelse(unlist(df_educ[i,],use.names=F)=="vwo / gymnasium", 5,
                                                 ifelse(unlist(df_educ[i,],use.names=F)=="hbo", 6,
                                                     ifelse(unlist(df_educ[i,],use.names=F)=="universiteit", 7, NA))))))) 
  #frequency
  alterL[[i]]$frequency.t1 <- ifelse(unlist(df_freq[i,],use.names=F)=="(Bijna) elke dag", 7,
                               ifelse(unlist(df_freq[i,],use.names=F)=="1-2 keer per week",6,
                                      ifelse(unlist(df_freq[i,],use.names=F)=="Aantal keer per maand",5, 
                                         ifelse(unlist(df_freq[i,],use.names=F)=="Ong. 1 keer per maand",4, 
                                            ifelse(unlist(df_freq[i,],use.names=F)=="Aantal keer per jaar",3,
                                                 ifelse(unlist(df_freq[i,],use.names=F)=="Ong. 1 keer per jaar",2,
                                                     ifelse(unlist(df_freq[i,],use.names=F)=="Nooit",1, NA )))))))
  #closeness
  alterL[[i]]$closeness.t1 <- ifelse(unlist(df_close[i,],use.names=F)=="Niet hecht", 1, 
                               ifelse(unlist(df_close[i,],use.names=F)=="Enigszins hecht", 2,
                                      ifelse(unlist(df_close[i,],use.names=F)=="Hecht", 3,
                                             ifelse(unlist(df_close[i,],use.names=F)=="Heel erg hecht", 4, NA ))))
  #proximity
  alterL[[i]]$proximity <- ifelse(unlist(df_proximity[i,], use.names=FALSE) == "In hetzelfde huis", "roommate",
                                  ifelse(unlist(df_proximity[i,], use.names = FALSE) == "In dezelfde buurt" |
                                    unlist(df_proximity[i,],use.names=F)=="In dezelfde straat" |
                                    unlist(df_proximity[i,],use.names=F)=="In dezelfde gemeente", "close",
                                    ifelse(unlist(df_proximity[i,], use.names = FALSE) == "In hetzelfde land" |
                                             unlist(df_proximity[i,], use.names = FALSE) == "In een ander land","far", NA)))

  
   #duration:  take midpoint on scale.
   alterL[[i]]$duration <- ifelse(unlist(df_duration[i,],use.names=F)=="Minder dan 1 jaar", 0, 
                               ifelse(unlist(df_duration[i,],use.names=F)=="1 tot 3 jaar", 2,
                                      ifelse(unlist(df_duration[i,],use.names=F)=="4 tot 8 jaar", 6,
                                             ifelse(unlist(df_duration[i,],use.names=F)=="9 tot 15 jaar", 12,
                                                    ifelse(unlist(df_duration[i,],use.names=F)=="Meer dan 15 jaar", 15,NA )))))
}

# before we can construct similarity indices, we must add ego-attributes
for (i in 1:length(alterL)) {
  #  gender
  alterL[[i]]$ego_gender <- ifelse(data$A1[i] == "Man", 0,ifelse(data$A1[i] == "Vrouw", 1,ifelse(data$A1[i] == "Overige", 2,NA)))
  
  # education 
  # these score should correspond to scores given to alter educ...
  alterL[[i]]$ego_educ <- ifelse(data$T1[i] == "aan de Hogeschool van Arnhem en Nijmegen (HAN)", "6", "7" )
 
  # age
  # calculated as the difference between submission date and birthdate
  # in years.
  birth_date <- as.Date(data$A2[i])
  #x_date <- as.Date(data$submitdate) #submission date was not deposited; so, take 1-jan 2023
  x_date <- as.Date("2023-01-01")
  alterL[[i]]$ego_age <- trunc((birth_date %--% x_date) / years(1))
}

# i filter out the unique, non-duplicate alters;
# by excluding alters with empty strings for gender attribute
for ( i in 1:length(alterL)) {
  alterL[[i]] <- alterL[[i]][which(alterL[[i]]$alter_gender!=""),]
  # and replace the alter id: 1 : no. unique alters
  alterL[[i]]$alterid <- 1:nrow(alterL[[i]])
}

#dyadic similarity measures
for (i in 1:length(alterL))  { # for ego i
  # get attributes of ego
  agei <- alterL[[i]]$ego_age[1]
  genderi <- alterL[[i]]$ego_gender[1]
  edi <- alterL[[i]]$ego_educ[1]
  
  for (j in 1:max(alterL[[i]]$alterid)) { # for alter j
    # calculate "same gender" (0/1)
    genderj <- as.numeric(alterL[[i]]$alter_gender[j]) # get alter j gender
    same <- ifelse(genderi==genderj, 1, 0)
    alterL[[i]]$same_gender[which(alterL[[i]]$alterid==j)] <- same
    
    #same education
    eduj <- alterL[[i]]$alter_educ[j]
    same <- ifelse(eduj==edi, 1, 0)
    alterL[[i]]$sim_educ[which(alterL[[i]]$alterid==j)] <- same
    
    # calculate similarity for age as the absolute difference between alter and ego value
    #get alter j attributes
    agej <- as.numeric(alterL[[i]]$alter_age[j])
    #difference score
    difage <- abs(agei - agej)
    
    # so higher values represent *less* similarity
    if( !is.na (agej) ) { # age similarity only calculable if z_j is known!
        alterL[[i]]$dif_age[which(alterL[[i]]$alterid==j)] <- difage
      } else { alterL[[i]]$dif_age[which(alterL[[i]]$alterid==j)] <- NA}
  }
}

#based on this, i make a long dataframe with alters nested in ego.
#first, add an ego_id
for (i in 1:length(alterL)) {
  alterL[[i]]$ego <- i
  alterL[[i]]$respnr <- data$respnr[i]
}

#combine using rbind
df <- do.call(rbind,alterL)

#other ego variables:
#transitions
# we need info of waves 1 and 2, so i merge them
d <- merge(data3, data4, by="respnr")
d <- data.frame(d[order(d$respnr, decreasing = FALSE), ]) # and sort by respnr

#1. residential transitions
df$housing.t1a <- NA #wave 1, pre-transition
df$housing.t1b <- NA #wave 1, post-transition
df$housing.t2 <- NA #wave 2
df$housing.transition <- NA #no. of changes 

#make sure descriptions of living situation matches over waves
d$A7 <- ifelse(d$A7 == "inwonend bij ouder(s)/verzorger(s)", "inwonend bij je ouder(s)/verzorger(s)", d$A7)
d$A4d <- ifelse(d$A4d == "inwonend bij ouder(s)/verzorger(s)", "inwonend bij je ouder(s)/verzorger(s)", d$A4d)

for (i in unique(df$ego)) {
  df$housing.t1a[which(df$ego == i)] <- d$A4.x[i] # w1, half year prior to transition
    
  # if respondent had moved at the time of w1, get current living situation
  df$housing.t1b[which(df$ego==i)] <- ifelse(d$A6[i] == "Nee", d$A7[i], df$housing.t1a[which(df$ego==i)])
  
  #if they moved, this indicates a transition
  transition <- ifelse(d$A6[i]=="Nee", 1, 0)
  
  # if respondent has moved since then (in w2), ...
  df$housing.t2[which(df$ego==i)] <- ifelse(d$A4.y[i] == "Ja" | d$A4b[i] == "Ja" | d$A4c[i] == "Ja", d$A4d[i], df$housing.t1b[which(df$ego==i)]) 
  
  transition <- ifelse(d$A4.y[i] == "Ja" | d$A4b[i] == "Ja" | d$A4c[i] == "Ja", transition + 1, transition)
  
  # no. of housing transition
  df$housing.transition[which(df$ego==i)] <- transition
}

#also make it binary (yes/no)
df$housing.transition_bin <- ifelse(df$housing.transition > 0, 1, 0)

#2. transition to university
df$occupation.t1 <- NA
df$occupation.t2 <- "higher" #everybody is in school...
df$study.year <- NA
df$occupation.transition <- NA 

for (i in unique(df$ego)) {
  df$occupation.t1[which(df$ego==i)] <- ifelse(data$E1[i]=="Ik zat op de middelbare school", "secondary",
                             ifelse(data$E1[i]=="Ik deed een MBO-, HBO- of WO-opleiding","higher",
                                    ifelse(data$E1[i]=="Ik werkte","work",
                                             ifelse(data$E1[i]=="Ik had een tussenjaar","gap",
                                                    ifelse(data$E1[i]=="Overige","other",NA)))))

  df$study.year[which(df$ego==i)] <- ifelse(data$T3[i]=="in het eerste jaar", 1,
                                            ifelse(data$T3[i]=="in het tweede jaar", 2,
                                                   ifelse(data$T3[i]=="in het derde jaar of hoger", 3, NA)))
  
  #transition = 1 for those who are first years and who came from secondary school/gap year
  transition <- ifelse( data$T3[i]=="in het eerste jaar" & (data$E1[i]=="Ik zat op de middelbare school" | data$E2[i]=="Ik had een tussenjaar"), 1, 0)
  
  # did ego drop out/start a new study?
  transition <- ifelse(data4$G07Q90[i]== "Nee", transition + 1, transition)
  df$occupation.transition[which(df$ego==i)] <- transition
}

#also make binary
df$occupation.transition_bin <- ifelse(df$occupation.transition > 0, 1, 0)

#romantic relationship 
df$romantic <- NA
for (i in unique(df$ego)) {
  df$romantic[which(df$ego==i)] <- ifelse(data$R3[i] == "Ja", 1,0)
}

#psychological/other variables (wave 2)
#loneliness  
l <- cbind(d$stellingen.SQ001., d$stellingen.SQ002.)
l <- ifelse(l=="Helemaal oneens", 1, ifelse(l=="Mee oneens", 2,
                   # do not know = neutral... this category was sparsely populated 
                   ifelse(l=="Neutraal" | l=="Ik weet het niet", 3, 
                          ifelse(l=="Mee eens", 4, ifelse(l=="Helemaal eens", 5, l)))))
# turn the first indicator, so that higher scores indicate "more" loneliness.
l[,1] <- 6-as.numeric(l[,1])

#extraversion
e <- cbind(d$stellingen.SQ003., d$stellingen.SQ006.)
e <- ifelse(e=="Helemaal oneens", 1,
            ifelse(e=="Mee oneens", 2,
                   ifelse(e=="Neutraal" | e=="Ik weet het niet", 3, 
                          ifelse(e=="Mee eens", 4,
                                 ifelse(e=="Helemaal eens", 5, e)))))
# turn the second indicator
e[,2] <- 6-as.numeric(e[,2])

# calculate averages.
df$loneliness <- NA
df$extraversion <- NA
for (i in unique(df$ego)) {
  l_scores <- as.numeric(l[i,])
  e_scores <- as.numeric(e[i,])
  df$loneliness[which(df$ego==i)] <- mean(l_scores)
  df$extraversion[which(df$ego==i)] <- mean(e_scores)
}

# financial restrictions (for social interaction)
df$fin_restr <- NA
# 0. never; 1. sometimes; 2. often; 3. always
for (i in unique(df$ego)) {
  df$fin_restr[which(df$ego==i)] <- d$G01Q111[i]
}
df$fin_restr <- ifelse(df$fin_restr=="Nooit",0,
                       ifelse(df$fin_restr=="Soms",1,
                              ifelse(df$fin_restr=="Vaak",2,
                                     ifelse(df$fin_restr=="Altijd",3, NA))))

# parental SES / educational level:
for (i in unique(df$ego)) {
  df$educ_father[which(df$ego == i)] <- data4$G08Q56.SQ001.[i]
  df$educ_mother[which(df$ego == i)] <- data4$G08Q56.SQ002.[i]
}

# add network variables
# 1. size (no. of unique alters)
df$netsize <- NA
# also per egonet
df$cdn.size <- df$study.size <- df$csn.size <- df$bff.size <- 0

for (i in unique(df$ego)) {
  #no. of unique alters is simply the number of rows per ego
  df$netsize[which(df$ego==i)] <- nrow(df[which(df$ego==i),])
  
  #size of each egonet is the number of alters named in the name generators
  #thus, including 'duplicates'
  df$cdn.size[which(df$ego==i)] <- length(which(!df_names[i,c(1:5)]==""))
  df$study.size[which(df$ego==i)] <- length(which(!df_names[i,c(6:10)]==""))
  df$bff.size[which(df$ego==i)] <- length(which(!df_names[i,c(11:15)]==""))
  df$csn.size[which(df$ego==i)] <- length(which(!df_names[i,c(16:20)]==""))
}

# 2. density.
# this can only be calculated per egonet, as only between-alter ties within egonet are asked.
df$cdn.density <- df$study.density <- df$csn.density <- df$bff.density <- NA

for (i in unique(df$ego)) {
  #a. CDN
  size <- df$cdn.size[which(df$ego==i)][1]
  #no. possible ties between alters
  pos <- ifelse(size==2, 1, ifelse(size==3, 3, ifelse(size==4, 6, ifelse(size==5, 10, 0))))
  #get no. of observed ties
  #only if ego named at least 2 alters in this name generator
  #because only then i can calculate density
  if(size>1) {
    #get alter-alter adjacency matrices of this particular egonet
    adjacency <- data[i,c(13:32)]
   
    #i want the correct ones, given the no. of listed alters in this name generator
    #i list the columns numbers of the variables corresponding to each matching matrix set,
    #and subset corresponding columns in `adjacency`
    adj <- adjacency[,list(0,1,c(2:4),c(5:10),c(11:20))[size][[1]]]
    #count number of ties that ego described as (very) close (vs. not close but no stranger; strangers)
    obs <- length(which(adj=="Hecht"|adj=="Erg hecht"))
    df$cdn.density[which(df$ego==i)] <- obs/pos  }
  
  #b. study
  size <- df$study.size[which(df$ego==i)][1]
  pos <- ifelse(size==2, 1, ifelse(size==3, 3, ifelse(size==4, 6, ifelse(size==5, 10, 0))))
  if(size>1) {
    adjacency <- data[i,c(53:72)]
    adj <- adjacency[,list(0,1,c(2:4),c(5:10),c(11:20))[size][[1]]]
  
    #count number of ties that ego described as (very) close (vs. not close but no stranger; strangers)
    obs <- length(which(adj=="Hecht"|adj=="Erg hecht"))
    df$study.density[which(df$ego==i)] <- obs/pos }
  
  #c. friends
  size <- df$bff.size[which(df$ego==i)][1]
  pos <- ifelse(size==2, 1, ifelse(size==3, 3, ifelse(size==4, 6, ifelse(size==5, 10, 0))))
  if(size>1) {
    adjacency <- data[i,c(169:188)]
    adj <- adjacency[,list(0,1,c(2:4),c(5:10),c(11:20))[size][[1]]]
    #count number of ties that ego described as (very) close (vs. not close but no stranger; strangers)
    obs <- length(which(adj=="Hecht"|adj=="Erg hecht"))
    df$bff.density[which(df$ego==i)] <- obs/pos }

  #d. sports partners
  size <- df$csn.size[which(df$ego==i)][1]
  pos <- ifelse(size==2, 1, ifelse(size==3, 3, ifelse(size==4, 6, ifelse(size==5, 10, 0))))
  if(size>1) {
    adjacency <- data[i,c(444:463)]

    adj <- adjacency[,list(0,1,c(2:4),c(5:10),c(11:20))[size][[1]]]
    #count number of ties that ego described as (very) close (vs. not close but no stranger; strangers)
    obs <- length(which(adj=="Hecht"|adj=="Erg hecht"))
    df$csn.density[which(df$ego==i)] <- obs/pos }
}

#set NAs to 0.
df$cdn.density[is.na(df$cdn.density)] <- 0
df$study.density[is.na(df$study.density)] <- 0
df$bff.density[is.na(df$bff.density)] <- 0
df$csn.density[is.na(df$csn.density)] <- 0

#binary attributes indicating whether alters appeared in each of the ego-nets at w1.
for (i in unique(df$ego)) {  
    for (j in 1:nrow(df[which(df$ego==i),])) { # for alters nested in ego

    # find out if alter_id denoting alter j appear in the 4 egonets
    alter <- unlist(df[which(df$ego==i & df$alterid==j),][5:8], use.names = FALSE) # get name(s) of alter j
    alter <- alter[!is.na(alter)] # exclude NAs
    
    cdn <- alter %in% net1[i,]
    study <- alter %in% net2[i,]
    bff <- alter %in% net3[i,]
    csn <- alter %in% net4[i,]
    
    # and if so, give alter j score 1 on indicators; 0 otherwise
    df$cdn1[which(df$ego==i & df$alterid==j)] <- ifelse("TRUE" %in% cdn, 1, 0)
    df$study1[which(df$ego==i & df$alterid==j)] <- ifelse("TRUE" %in% study, 1, 0)
    df$bff1[which(df$ego==i & df$alterid==j)] <- ifelse("TRUE" %in% bff, 1, 0)
    df$csn1[which(df$ego==i & df$alterid==j)] <- ifelse("TRUE" %in% csn, 1, 0)
  }
}

#calculate multiplexity as an alter/tie attribute (i.e., number of *additional* networks j appeared in)
df$multiplex <- rowSums(df[,c(51:54)]) - 1 #minus one to reach a meaningful intercept
#psych::describe(df$multiplex) #M=.51; SD=.76

#now, find out whether w1-alters were maintainted in w2.
df$survive <- NA

# In wave 2, another matching procedure was used; in rows, alters named in w2 are listed; columns denote (unique) alters of w1, so the same one as our data-frame.
# again, i made multiple matrices, conditional on the no. of unique alters of w1 (15, to be precise)
# if, in one of these matrices, column j was marked as corresponding to a named alter in w2, then alter j did, indeed, survive

# subset w1-w2 matching matrices; and respnr
w1w2 <- data4[,c(756:1155,length(data4))]

for (i in unique(df$ego)) {  # for ego 
  matchingL <- vector("list", 20) #pre-allocate empty list of length 20, to store matching matrices

  {
    matchingL[[1]] <- w1w2[i,1:20]
    matchingL[[2]] <- w1w2[i,21:40]
    matchingL[[3]] <- w1w2[i,41:60]
    matchingL[[4]] <- w1w2[i,61:80]
    matchingL[[5]] <- w1w2[i,81:100]
    matchingL[[6]] <- w1w2[i,101:120]
    matchingL[[7]] <- w1w2[i,121:140]
    matchingL[[8]] <- w1w2[i,141:160]
    matchingL[[9]] <- w1w2[i,161:180]
    matchingL[[10]] <- w1w2[i,181:200]
    matchingL[[11]] <- w1w2[i,201:220]
    matchingL[[12]] <- w1w2[i,221:240]
    matchingL[[13]] <- w1w2[i,241:260]
    matchingL[[14]] <- w1w2[i,261:280]
    matchingL[[15]] <- w1w2[i,281:300]
    matchingL[[16]] <- w1w2[i,301:320]
    matchingL[[17]] <- w1w2[i,321:340]
    matchingL[[18]] <- w1w2[i,341:360]
    matchingL[[19]] <- w1w2[i,361:380]
    matchingL[[20]] <- w1w2[i,381:400]
  }
  
  #find the 'right' matching matrix in this list, by taking the one that contains answers
  ind <- NULL
  for (j in seq_along(matchingL)) {
    #check along the sequence of elements j in the matching matrix list if they are non-empty and not NA
    check <- FALSE
    for (col in matchingL[[j]]) {
      if (!all(is.na(col)) && any(nchar(col) > 0)) {
        check <- TRUE
        break  
      }
      }
    if (check) {
      ind <- j
      break  
    }
  }
  if(length(ind)>0) {
    # get the  corresponding matrix
    mm <- matchingL[[ind]]
    
    # unlist the answers given
    ans <- unlist(mm, use.names = FALSE)
    
    # use 'stringr' to extract numbers in these answers,
    # they refer to the id of "survived" alters
    id <- unlist(stringr::str_extract_all(ans,"\\(?[0-9,.]+\\)?"))
    id <- id[!is.na(id)] # exclude NA
    
    # if alter id of ego i corresponds to this id, they did indeed survive:
    df$survive[which(df$ego==i)] <- ifelse(df$alterid[which(df$ego==i)] %in% id, 1, 0)
  }
}

# in which egonet did they (re)appear?
df$cdn2 <- NA
df$study2 <- NA
df$bff2 <- NA
df$csn2 <- NA

# i use the matching matrices of w2; where columns refer to unique w1 alters (those of our constructed dataframe) and rows referring to unique w2 alters
# so, if w1-alter/column j is matched to w2-alter/row i, then w1-alter did survive (but we already knew that); but more importantly, j was the i^th alter mentioned
# and this allows me to infer in what network j (re-)appeared
# since cdn = 1-5; study = 6-10; bff = 11-15; csn = 16-20.
# however, since the rows only include non-duplicate w2-alters;
# if alter j at t1 was named more than once at t2, i only know the first
# egonet in which j was named...
# thus, before i proceed, i use the matching matrices that allowed ego to match alters from different egonets to make alter ids for w2 alters; and figure out to which egonets they belonged

# i make a dataframe of w2-alters, with potential duplicates...
df_names <- data.frame(p1 = data4$egonet1.SQ001.,p2 = data4$egonet1.SQ002.,p3 = data4$egonet1.SQ003.,p4 = data4$egonet1.SQ004.,p5 = data4$egonet1.SQ005.,p6 = data4$egonet2.SQ001.,p7 = data4$egonet2.SQ002.,p8 = data4$egonet2.SQ003.,p9 = data4$egonet2.SQ004.,p10= data4$egonet2.SQ005.,p11= data4$egonet3.SQ001.,p12= data4$egonet3.SQ002.,p13= data4$egonet3.SQ003.,p14= data4$egonet3.SQ004.,p15= data4$egonet3.SQ005.,p16= data4$egonet4.SQ001., p17= data4$egonet4.SQ002., p18= data4$egonet4.SQ003.,p19= data4$egonet4.SQ004.,p20= data4$egonet4.SQ005.)

#males
df_gender <- data.frame(p1 = data4$males.SQ001.,p2 = data4$males.SQ002.,p3 = data4$males.SQ003.,p4 = data4$males.SQ004.,p5 = data4$males.SQ005.,p6 = data4$males.SQ006.,p7 = data4$males.SQ007.,p8 = data4$males.SQ008.,p9 = data4$males.SQ009.,p10= data4$males.SQ010.,p11= data4$males.SQ011.,p12= data4$males.SQ012.,p13= data4$males.SQ013.,p14= data4$males.SQ014.,p15= data4$males.SQ015.,p16= data4$males.SQ016.,p17= data4$males.SQ017.,p18= data4$males.SQ018.,p19= data4$males.SQ019.,p20= data4$males.SQ020.)

# list of dataframes per ego with rows reflecting alters
# and columns indicating the name(s) of the particular alters
alterL <- list()
# loop over all egos
for ( i in 1:nrow(df_names)) {alterL[[i]] <- data.frame(
    alterid = 1:20,name1 = NA,name2 = NA, name3 = NA,name4 = NA, gender=NA,
    cdn_embed.t2 = NA, study_embed.t2 = NA, bff_embed.t2 = NA, csn_embed.t2 = NA)}

# fill the names based on the names data-frame
for ( i in 1:length(alterL)) {
  alterL[[i]]$name1 <- unlist(df_names[i, ], use.names=F)
  alterL[[i]]$name1 <- ifelse(alterL[[i]]$name1=="", NA, alterL[[i]]$name1)
  
  alterL[[i]]$gender <- unlist(df_gender[i,], use.names=F)
  alterL[[i]]$gender <- ifelse(alterL[[i]]$gender=="Ja", 0, #male = ref
                               ifelse(alterL[[i]]$gender=="Nee", 1, NA))
  
  }

# calculate netsize for each net to get the correct matching matrix
{
  net1 <- cbind(data4$egonet1.SQ001.,data4$egonet1.SQ002., data4$egonet1.SQ003.,data4$egonet1.SQ004., data4$egonet1.SQ005.)
  net1 <- ifelse(net1=="", NA, net1)
  ns1 <- vector()
  for (i in 1:nrow(net1)) {
    ns1[i] <- length(net1[i,][which(!is.na(net1[i,]))])
  }
  net2 <- cbind(data4$egonet2.SQ001.,data4$egonet2.SQ002., data4$egonet2.SQ003.,data4$egonet2.SQ004., data4$egonet2.SQ005.)
  net2 <- ifelse(net2=="", NA, net2)
  ns2 <- vector()
  for (i in 1:nrow(net2)) {
    ns2[i] <- length(net2[i,][which(!is.na(net2[i,]))])
  }
  net3 <- cbind(data4$egonet3.SQ001.,data4$egonet3.SQ002., data4$egonet3.SQ003.,data4$egonet3.SQ004., data4$egonet3.SQ005.)
  net3 <- ifelse(net3=="", NA, net3)
  ns3 <- vector()
  for (i in 1:nrow(net3)) {
    ns3[i] <- length(net3[i,][which(!is.na(net3[i,]))])
  }
  net4 <- cbind(data4$egonet4.SQ001.,data4$egonet4.SQ002., data4$egonet4.SQ003.,data4$egonet4.SQ004., data4$egonet4.SQ005.)
  net4 <- ifelse(net4=="", NA, net4)
  ns4 <- vector()
  for (i in 1:nrow(net4)) {
    ns4[i] <- length(net4[i,][which(!is.na(net4[i,]))])
  }
}

# construct the matching matrices list for egonet1-2
matchingList <- list()
for (i in 1:length(alterL)) {
  matchingL <- list()
  matchingL[[1]] <- cbind(data4$matching1N1.SQ001_SQ001.[i],data4$matching1N1.SQ002_SQ001.[i],data4$matching1N1.SQ003_SQ001.[i],data4$matching1N1.SQ004_SQ001.[i],data4$matching1N1.SQ005_SQ001.[i])
  matchingL[[2]]<- rbind(
    cbind(data4$matching1N2.SQ001_SQ001.[i], data4$matching1N2.SQ002_SQ001.[i], data4$matching1N2.SQ003_SQ001.[i], data4$matching1N2.SQ004_SQ001.[i], data4$matching1N2.SQ005_SQ001.[i]),
    cbind(data4$matching1N2.SQ001_SQ002.[i], data4$matching1N2.SQ002_SQ002.[i], data4$matching1N2.SQ003_SQ002.[i], data4$matching1N2.SQ004_SQ002.[i], data4$matching1N2.SQ005_SQ002.[i]))
  matchingL[[3]]<- rbind(
    cbind(data4$matching1N3.SQ001_SQ001.[i], data4$matching1N3.SQ002_SQ001.[i], data4$matching1N3.SQ003_SQ001.[i], data4$matching1N3.SQ004_SQ001.[i], data4$matching1N3.SQ005_SQ001.[i]),
    cbind(data4$matching1N3.SQ001_SQ002.[i], data4$matching1N3.SQ002_SQ002.[i], data4$matching1N3.SQ003_SQ002.[i], data4$matching1N3.SQ004_SQ002.[i], data4$matching1N3.SQ005_SQ002.[i]),
    cbind(data4$matching1N3.SQ001_SQ003.[i], data4$matching1N3.SQ002_SQ003.[i], data4$matching1N3.SQ003_SQ003.[i], data4$matching1N3.SQ004_SQ003.[i], data4$matching1N3.SQ005_SQ003.[i]))
  matchingL[[4]]<- rbind(
    cbind(data4$matching1N4.SQ001_SQ001.[i], data4$matching1N4.SQ002_SQ001.[i], data4$matching1N4.SQ003_SQ001.[i], data4$matching1N4.SQ004_SQ001.[i], data4$matching1N4.SQ005_SQ001.[i]),
    cbind(data4$matching1N4.SQ001_SQ002.[i], data4$matching1N4.SQ002_SQ002.[i], data4$matching1N4.SQ003_SQ002.[i], data4$matching1N4.SQ004_SQ002.[i], data4$matching1N4.SQ005_SQ002.[i]),
    cbind(data4$matching1N4.SQ001_SQ003.[i], data4$matching1N4.SQ002_SQ003.[i], data4$matching1N4.SQ003_SQ003.[i], data4$matching1N4.SQ004_SQ003.[i], data4$matching1N4.SQ005_SQ003.[i]),
    cbind(data4$matching1N4.SQ001_SQ004.[i], data4$matching1N4.SQ002_SQ004.[i], data4$matching1N4.SQ003_SQ004.[i], data4$matching1N4.SQ004_SQ004.[i], data4$matching1N4.SQ005_SQ004.[i]))
  matchingL[[5]]<- rbind(
    cbind(data4$matching1N5.SQ001_SQ001.[i], data4$matching1N5.SQ002_SQ001.[i], data4$matching1N5.SQ003_SQ001.[i], data4$matching1N5.SQ004_SQ001.[i], data4$matching1N5.SQ005_SQ001.[i]),
    cbind(data4$matching1N5.SQ001_SQ002.[i], data4$matching1N5.SQ002_SQ002.[i], data4$matching1N5.SQ003_SQ002.[i], data4$matching1N5.SQ004_SQ002.[i], data4$matching1N5.SQ005_SQ002.[i]),
    cbind(data4$matching1N5.SQ001_SQ003.[i], data4$matching1N5.SQ002_SQ003.[i], data4$matching1N5.SQ003_SQ003.[i], data4$matching1N5.SQ004_SQ003.[i], data4$matching1N5.SQ005_SQ003.[i]),
    cbind(data4$matching1N5.SQ001_SQ004.[i], data4$matching1N5.SQ002_SQ004.[i], data4$matching1N5.SQ003_SQ004.[i], data4$matching1N5.SQ004_SQ004.[i], data4$matching1N5.SQ005_SQ004.[i]),
    cbind(data4$matching1N5.SQ001_SQ005.[i], data4$matching1N5.SQ002_SQ005.[i], data4$matching1N5.SQ003_SQ005.[i], data4$matching1N5.SQ004_SQ005.[i], data4$matching1N5.SQ005_SQ005.[i]))
  matchingList[[i]] <- matchingL
} # so... matchingL[[1]][[5]] is matchingmatrix 5 (i.e., 5 alters named in egonet2) for ego 1

# the combination of the matching matrices and the netsizes for ego allows me to match the names myself.
for (i in 1:length(matchingList)) {     # for ego i
  mL <- matchingList[[i]]               # get the matching list
  ns <- ns2[[i]]                        # get the size of egonet2
  if(ns>0) {                            # if ns=0, no matching was done!
    mm <- as.matrix(mL[[ns]])           # retrieve the corresponding matrix
    matched <- which(mm==1, arr.ind=T)  # retrieve array indices
    net <- net2[i,]
    if(length(matched)>0) {             # if matching was performed!
      alterL[[i]]$name2[which(alterL[[i]]$alterid==matched[,2])] <- net[matched[,1]]
    }
  }
}#ignore warning

# again, make a matching list for the second matching matrices
# (i.e., matching egonet3 alters to prev. alters);
matchingList2 <- list()
for (i in 1:length(alterL)) { # for ego i
  matching2L <- list()
  matching2L[[1]] <- cbind(data4$matching2N1.SQ001_SQ001.[i],data4$matching2N1.SQ002_SQ001.[i],data4$matching2N1.SQ003_SQ001.[i],data4$matching2N1.SQ004_SQ001.[i],data4$matching2N1.SQ005_SQ001.[i],data4$matching2N1.SQ006_SQ001.[i],data4$matching2N1.SQ007_SQ001.[i],data4$matching2N1.SQ008_SQ001.[i],data4$matching2N1.SQ009_SQ001.[i],data4$matching2N1.SQ010_SQ001.[i])
  matching2L[[2]] <- rbind(
    cbind(data4$matching2N2.SQ001_SQ001.[i],data4$matching2N2.SQ002_SQ001.[i],data4$matching2N2.SQ003_SQ001.[i],data4$matching2N2.SQ004_SQ001.[i],data4$matching2N2.SQ005_SQ001.[i],data4$matching2N2.SQ006_SQ001.[i],data4$matching2N2.SQ007_SQ001.[i],data4$matching2N2.SQ008_SQ001.[i],data4$matching2N2.SQ009_SQ001.[i],data4$matching2N2.SQ010_SQ001.[i]),
    cbind(data4$matching2N2.SQ001_SQ002.[i],data4$matching2N2.SQ002_SQ002.[i],data4$matching2N2.SQ003_SQ002.[i],data4$matching2N2.SQ004_SQ002.[i],data4$matching2N2.SQ005_SQ002.[i],data4$matching2N2.SQ006_SQ002.[i],data4$matching2N2.SQ007_SQ002.[i],data4$matching2N2.SQ008_SQ002.[i],data4$matching2N2.SQ009_SQ002.[i],data4$matching2N2.SQ010_SQ002.[i]))
  matching2L[[3]] <- rbind(
    cbind(data4$matching2N3.SQ001_SQ001.[i],data4$matching2N3.SQ002_SQ001.[i],data4$matching2N3.SQ003_SQ001.[i],data4$matching2N3.SQ004_SQ001.[i],data4$matching2N3.SQ005_SQ001.[i],data4$matching2N3.SQ006_SQ001.[i],data4$matching2N3.SQ007_SQ001.[i],data4$matching2N3.SQ008_SQ001.[i],data4$matching2N3.SQ009_SQ001.[i],data4$matching2N3.SQ010_SQ001.[i]),
    cbind(data4$matching2N3.SQ001_SQ002.[i],data4$matching2N3.SQ002_SQ002.[i],data4$matching2N3.SQ003_SQ002.[i],data4$matching2N3.SQ004_SQ002.[i],data4$matching2N3.SQ005_SQ002.[i],data4$matching2N3.SQ006_SQ002.[i],data4$matching2N3.SQ007_SQ002.[i],data4$matching2N3.SQ008_SQ002.[i],data4$matching2N3.SQ009_SQ002.[i],data4$matching2N3.SQ010_SQ002.[i]),
    cbind(data4$matching2N3.SQ001_SQ003.[i],data4$matching2N3.SQ002_SQ003.[i],data4$matching2N3.SQ003_SQ003.[i],data4$matching2N3.SQ004_SQ003.[i],data4$matching2N3.SQ005_SQ003.[i],data4$matching2N3.SQ006_SQ003.[i],data4$matching2N3.SQ007_SQ003.[i],data4$matching2N3.SQ008_SQ003.[i],data4$matching2N3.SQ009_SQ003.[i],data4$matching2N3.SQ010_SQ003.[i]))
  matching2L[[4]] <- rbind(
    cbind(data4$matching2N4.SQ001_SQ001.[i],data4$matching2N4.SQ002_SQ001.[i],data4$matching2N4.SQ003_SQ001.[i],data4$matching2N4.SQ004_SQ001.[i],data4$matching2N4.SQ005_SQ001.[i],data4$matching2N4.SQ006_SQ001.[i],data4$matching2N4.SQ007_SQ001.[i],data4$matching2N4.SQ008_SQ001.[i],data4$matching2N4.SQ009_SQ001.[i],data4$matching2N4.SQ010_SQ001.[i]),
    cbind(data4$matching2N4.SQ001_SQ002.[i],data4$matching2N4.SQ002_SQ002.[i],data4$matching2N4.SQ003_SQ002.[i],data4$matching2N4.SQ004_SQ002.[i],data4$matching2N4.SQ005_SQ002.[i],data4$matching2N4.SQ006_SQ002.[i],data4$matching2N4.SQ007_SQ002.[i],data4$matching2N4.SQ008_SQ002.[i],data4$matching2N4.SQ009_SQ002.[i],data4$matching2N4.SQ010_SQ002.[i]),
    cbind(data4$matching2N4.SQ001_SQ003.[i],data4$matching2N4.SQ002_SQ003.[i],data4$matching2N4.SQ003_SQ003.[i],data4$matching2N4.SQ004_SQ003.[i],data4$matching2N4.SQ005_SQ003.[i],data4$matching2N4.SQ006_SQ003.[i],data4$matching2N4.SQ007_SQ003.[i],data4$matching2N4.SQ008_SQ003.[i],data4$matching2N4.SQ009_SQ003.[i],data4$matching2N4.SQ010_SQ003.[i]),
    cbind(data4$matching2N4.SQ001_SQ004.[i],data4$matching2N4.SQ002_SQ004.[i],data4$matching2N4.SQ003_SQ004.[i],data4$matching2N4.SQ004_SQ004.[i],data4$matching2N4.SQ005_SQ004.[i],data4$matching2N4.SQ006_SQ004.[i],data4$matching2N4.SQ007_SQ004.[i],data4$matching2N4.SQ008_SQ004.[i],data4$matching2N4.SQ009_SQ004.[i],data4$matching2N4.SQ010_SQ004.[i]))
  matching2L[[5]] <- rbind(
    cbind(data4$matching2N5.SQ001_SQ001.[i],data4$matching2N5.SQ002_SQ001.[i],data4$matching2N5.SQ003_SQ001.[i],data4$matching2N5.SQ004_SQ001.[i],data4$matching2N5.SQ005_SQ001.[i],data4$matching2N5.SQ006_SQ001.[i],data4$matching2N5.SQ007_SQ001.[i],data4$matching2N5.SQ008_SQ001.[i],data4$matching2N5.SQ009_SQ001.[i],data4$matching2N5.SQ010_SQ001.[i]),
    cbind(data4$matching2N5.SQ001_SQ002.[i],data4$matching2N5.SQ002_SQ002.[i],data4$matching2N5.SQ003_SQ002.[i],data4$matching2N5.SQ004_SQ002.[i],data4$matching2N5.SQ005_SQ002.[i],data4$matching2N5.SQ006_SQ002.[i],data4$matching2N5.SQ007_SQ002.[i],data4$matching2N5.SQ008_SQ002.[i],data4$matching2N5.SQ009_SQ002.[i],data4$matching2N5.SQ010_SQ002.[i]),
    cbind(data4$matching2N5.SQ001_SQ003.[i],data4$matching2N5.SQ002_SQ003.[i],data4$matching2N5.SQ003_SQ003.[i],data4$matching2N5.SQ004_SQ003.[i],data4$matching2N5.SQ005_SQ003.[i],data4$matching2N5.SQ006_SQ003.[i],data4$matching2N5.SQ007_SQ003.[i],data4$matching2N5.SQ008_SQ003.[i],data4$matching2N5.SQ009_SQ003.[i],data4$matching2N5.SQ010_SQ003.[i]),
    cbind(data4$matching2N5.SQ001_SQ004.[i],data4$matching2N5.SQ002_SQ004.[i],data4$matching2N5.SQ003_SQ004.[i],data4$matching2N5.SQ004_SQ004.[i],data4$matching2N5.SQ005_SQ004.[i],data4$matching2N5.SQ006_SQ004.[i],data4$matching2N5.SQ007_SQ004.[i],data4$matching2N5.SQ008_SQ004.[i],data4$matching2N5.SQ009_SQ004.[i],data4$matching2N5.SQ010_SQ004.[i]),
    cbind(data4$matching2N5.SQ001_SQ005.[i],data4$matching2N5.SQ002_SQ005.[i],data4$matching2N5.SQ003_SQ005.[i],data4$matching2N5.SQ004_SQ005.[i],data4$matching2N5.SQ005_SQ005.[i],data4$matching2N5.SQ006_SQ005.[i],data4$matching2N5.SQ007_SQ005.[i],data4$matching2N5.SQ008_SQ005.[i],data4$matching2N5.SQ009_SQ005.[i],data4$matching2N5.SQ010_SQ005.[i]))
  matchingList2[[i]] <- matching2L
}

for (i in 1:length(matchingList2)) {    # for ego i
  mL <- matchingList2[[i]]              # get the matching list 2
  ns <- ns3[[i]]                        # get the size of egonet3
  if(ns>0) {                            # if ns=0, no matching was done!
    mm <- as.matrix(mL[[ns]])           # and the corresponding matrix
    matched <- which(mm==1, arr.ind=T)  # retrieve array indices
    net <- net3[i,]
    if(length(matched)>0) {             # if matching was performed!
      alterL[[i]]$name3[matched[,2]] <- net[matched[,1]]
    }
  }
}

# same for matching 3 (i.e., egonet4 with egonets 1-3)
matchingList3 <- list()
for (i in 1:length(alterL)) { # for ego i
  matching3L <- list()
  matching3L[[1]] <- cbind(data4$matching3N1.SQ001_SQ001.[i],data4$matching3N1.SQ002_SQ001.[i],data4$matching3N1.SQ003_SQ001.[i],data4$matching3N1.SQ004_SQ001.[i],data4$matching3N1.SQ005_SQ001.[i],data4$matching3N1.SQ006_SQ001.[i],data4$matching3N1.SQ007_SQ001.[i],data4$matching3N1.SQ008_SQ001.[i],data4$matching3N1.SQ009_SQ001.[i],data4$matching3N1.SQ010_SQ001.[i], data4$matching3N1.SQ011_SQ001.[i], data4$matching3N1.SQ012_SQ001.[i], data4$matching3N1.SQ013_SQ001.[i], data4$matching3N1.SQ014_SQ001.[i], data4$matching3N1.SQ015_SQ001.[i])
  matching3L[[2]] <- rbind(
    cbind(data4$matching3N2.SQ001_SQ001.[i],data4$matching3N2.SQ002_SQ001.[i],data4$matching3N2.SQ003_SQ001.[i],data4$matching3N2.SQ004_SQ001.[i],data4$matching3N2.SQ005_SQ001.[i],data4$matching3N2.SQ006_SQ001.[i],data4$matching3N2.SQ007_SQ001.[i],data4$matching3N2.SQ008_SQ001.[i],data4$matching3N2.SQ009_SQ001.[i],data4$matching3N2.SQ010_SQ001.[i], data4$matching3N2.SQ011_SQ001.[i], data4$matching3N2.SQ012_SQ001.[i], data4$matching3N2.SQ013_SQ001.[i], data4$matching3N2.SQ014_SQ001.[i], data4$matching3N2.SQ015_SQ001.[i]),
    cbind(data4$matching3N2.SQ001_SQ002.[i],data4$matching3N2.SQ002_SQ002.[i],data4$matching3N2.SQ003_SQ002.[i],data4$matching3N2.SQ004_SQ002.[i],data4$matching3N2.SQ005_SQ002.[i],data4$matching3N2.SQ006_SQ002.[i],data4$matching3N2.SQ007_SQ002.[i],data4$matching3N2.SQ008_SQ002.[i],data4$matching3N2.SQ009_SQ002.[i],data4$matching3N2.SQ010_SQ002.[i], data4$matching3N2.SQ011_SQ002.[i], data4$matching3N2.SQ012_SQ002.[i], data4$matching3N2.SQ013_SQ002.[i], data4$matching3N2.SQ014_SQ002.[i], data4$matching3N2.SQ015_SQ002.[i]))
  matching3L[[3]] <- rbind(
    cbind(data4$matching3N3.SQ001_SQ001.[i],data4$matching3N3.SQ002_SQ001.[i],data4$matching3N3.SQ003_SQ001.[i],data4$matching3N3.SQ004_SQ001.[i],data4$matching3N3.SQ005_SQ001.[i],data4$matching3N3.SQ006_SQ001.[i],data4$matching3N3.SQ007_SQ001.[i],data4$matching3N3.SQ008_SQ001.[i],data4$matching3N3.SQ009_SQ001.[i],data4$matching3N3.SQ010_SQ001.[i], data4$matching3N3.SQ011_SQ001.[i], data4$matching3N3.SQ012_SQ001.[i], data4$matching3N3.SQ013_SQ001.[i], data4$matching3N3.SQ014_SQ001.[i], data4$matching3N3.SQ015_SQ001.[i]),
    cbind(data4$matching3N3.SQ001_SQ002.[i],data4$matching3N3.SQ002_SQ002.[i],data4$matching3N3.SQ003_SQ002.[i],data4$matching3N3.SQ004_SQ002.[i],data4$matching3N3.SQ005_SQ002.[i],data4$matching3N3.SQ006_SQ002.[i],data4$matching3N3.SQ007_SQ002.[i],data4$matching3N3.SQ008_SQ002.[i],data4$matching3N3.SQ009_SQ002.[i],data4$matching3N3.SQ010_SQ002.[i], data4$matching3N3.SQ011_SQ002.[i], data4$matching3N3.SQ012_SQ002.[i], data4$matching3N3.SQ013_SQ002.[i], data4$matching3N3.SQ014_SQ002.[i], data4$matching3N3.SQ015_SQ002.[i]),
    cbind(data4$matching3N3.SQ001_SQ003.[i],data4$matching3N3.SQ002_SQ003.[i],data4$matching3N3.SQ003_SQ003.[i],data4$matching3N3.SQ004_SQ003.[i],data4$matching3N3.SQ005_SQ003.[i],data4$matching3N3.SQ006_SQ003.[i],data4$matching3N3.SQ007_SQ003.[i],data4$matching3N3.SQ008_SQ003.[i],data4$matching3N3.SQ009_SQ003.[i],data4$matching3N3.SQ010_SQ003.[i], data4$matching3N3.SQ011_SQ003.[i], data4$matching3N3.SQ012_SQ003.[i], data4$matching3N3.SQ013_SQ003.[i], data4$matching3N3.SQ014_SQ003.[i], data4$matching3N3.SQ015_SQ003.[i]))
  matching3L[[4]] <- rbind(
    cbind(data4$matching3N4.SQ001_SQ001.[i],data4$matching3N4.SQ002_SQ001.[i],data4$matching3N4.SQ003_SQ001.[i],data4$matching3N4.SQ004_SQ001.[i],data4$matching3N4.SQ005_SQ001.[i],data4$matching3N4.SQ006_SQ001.[i],data4$matching3N4.SQ007_SQ001.[i],data4$matching3N4.SQ008_SQ001.[i],data4$matching3N4.SQ009_SQ001.[i],data4$matching3N4.SQ010_SQ001.[i], data4$matching3N4.SQ011_SQ001.[i], data4$matching3N4.SQ012_SQ001.[i], data4$matching3N4.SQ013_SQ001.[i], data4$matching3N4.SQ014_SQ001.[i], data4$matching3N4.SQ015_SQ001.[i]),
    cbind(data4$matching3N4.SQ001_SQ002.[i],data4$matching3N4.SQ002_SQ002.[i],data4$matching3N4.SQ003_SQ002.[i],data4$matching3N4.SQ004_SQ002.[i],data4$matching3N4.SQ005_SQ002.[i],data4$matching3N4.SQ006_SQ002.[i],data4$matching3N4.SQ007_SQ002.[i],data4$matching3N4.SQ008_SQ002.[i],data4$matching3N4.SQ009_SQ002.[i],data4$matching3N4.SQ010_SQ002.[i], data4$matching3N4.SQ011_SQ002.[i], data4$matching3N4.SQ012_SQ002.[i], data4$matching3N4.SQ013_SQ002.[i], data4$matching3N4.SQ014_SQ002.[i], data4$matching3N4.SQ015_SQ002.[i]),
    cbind(data4$matching3N4.SQ001_SQ003.[i],data4$matching3N4.SQ002_SQ003.[i],data4$matching3N4.SQ003_SQ003.[i],data4$matching3N4.SQ004_SQ003.[i],data4$matching3N4.SQ005_SQ003.[i],data4$matching3N4.SQ006_SQ003.[i],data4$matching3N4.SQ007_SQ003.[i],data4$matching3N4.SQ008_SQ003.[i],data4$matching3N4.SQ009_SQ003.[i],data4$matching3N4.SQ010_SQ003.[i], data4$matching3N4.SQ011_SQ003.[i], data4$matching3N4.SQ012_SQ003.[i], data4$matching3N4.SQ013_SQ003.[i], data4$matching3N4.SQ014_SQ003.[i], data4$matching3N4.SQ015_SQ003.[i]),
    cbind(data4$matching3N4.SQ001_SQ003.[i],data4$matching3N4.SQ002_SQ003.[i],data4$matching3N4.SQ003_SQ003.[i],data4$matching3N4.SQ004_SQ003.[i],data4$matching3N4.SQ005_SQ003.[i],data4$matching3N4.SQ006_SQ003.[i],data4$matching3N4.SQ007_SQ003.[i],data4$matching3N4.SQ008_SQ003.[i],data4$matching3N4.SQ009_SQ003.[i],data4$matching3N4.SQ010_SQ003.[i], data4$matching3N4.SQ011_SQ003.[i], data4$matching3N4.SQ012_SQ003.[i], data4$matching3N4.SQ013_SQ003.[i], data4$matching3N4.SQ014_SQ003.[i], data4$matching3N4.SQ015_SQ003.[i]),
    cbind(data4$matching3N4.SQ001_SQ004.[i],data4$matching3N4.SQ002_SQ004.[i],data4$matching3N4.SQ003_SQ004.[i],data4$matching3N4.SQ004_SQ004.[i],data4$matching3N4.SQ005_SQ004.[i],data4$matching3N4.SQ006_SQ004.[i],data4$matching3N4.SQ007_SQ004.[i],data4$matching3N4.SQ008_SQ004.[i],data4$matching3N4.SQ009_SQ004.[i],data4$matching3N4.SQ010_SQ004.[i], data4$matching3N4.SQ011_SQ004.[i], data4$matching3N4.SQ012_SQ004.[i], data4$matching3N4.SQ013_SQ004.[i], data4$matching3N4.SQ014_SQ004.[i], data4$matching3N4.SQ015_SQ004.[i]))
  matching3L[[5]] <- rbind(
    cbind(data4$matching3N5.SQ001_SQ001.[i],data4$matching3N5.SQ002_SQ001.[i],data4$matching3N5.SQ003_SQ001.[i],data4$matching3N5.SQ004_SQ001.[i],data4$matching3N5.SQ005_SQ001.[i],data4$matching3N5.SQ006_SQ001.[i],data4$matching3N5.SQ007_SQ001.[i],data4$matching3N5.SQ008_SQ001.[i],data4$matching3N5.SQ009_SQ001.[i],data4$matching3N5.SQ010_SQ001.[i], data4$matching3N5.SQ011_SQ001.[i], data4$matching3N5.SQ012_SQ001.[i], data4$matching3N5.SQ013_SQ001.[i], data4$matching3N5.SQ014_SQ001.[i], data4$matching3N5.SQ015_SQ001.[i]),
    cbind(data4$matching3N5.SQ001_SQ002.[i],data4$matching3N5.SQ002_SQ002.[i],data4$matching3N5.SQ003_SQ002.[i],data4$matching3N5.SQ004_SQ002.[i],data4$matching3N5.SQ005_SQ002.[i],data4$matching3N5.SQ006_SQ002.[i],data4$matching3N5.SQ007_SQ002.[i],data4$matching3N5.SQ008_SQ002.[i],data4$matching3N5.SQ009_SQ002.[i],data4$matching3N5.SQ010_SQ002.[i], data4$matching3N5.SQ011_SQ002.[i], data4$matching3N5.SQ012_SQ002.[i], data4$matching3N5.SQ013_SQ002.[i], data4$matching3N5.SQ014_SQ002.[i], data4$matching3N5.SQ015_SQ002.[i]),
    cbind(data4$matching3N5.SQ001_SQ003.[i],data4$matching3N5.SQ002_SQ003.[i],data4$matching3N5.SQ003_SQ003.[i],data4$matching3N5.SQ004_SQ003.[i],data4$matching3N5.SQ005_SQ003.[i],data4$matching3N5.SQ006_SQ003.[i],data4$matching3N5.SQ007_SQ003.[i],data4$matching3N5.SQ008_SQ003.[i],data4$matching3N5.SQ009_SQ003.[i],data4$matching3N5.SQ010_SQ003.[i], data4$matching3N5.SQ011_SQ003.[i], data4$matching3N5.SQ012_SQ003.[i], data4$matching3N5.SQ013_SQ003.[i], data4$matching3N5.SQ014_SQ003.[i], data4$matching3N5.SQ015_SQ003.[i]),
    cbind(data4$matching3N5.SQ001_SQ003.[i],data4$matching3N5.SQ002_SQ003.[i],data4$matching3N5.SQ003_SQ003.[i],data4$matching3N5.SQ004_SQ003.[i],data4$matching3N5.SQ005_SQ003.[i],data4$matching3N5.SQ006_SQ003.[i],data4$matching3N5.SQ007_SQ003.[i],data4$matching3N5.SQ008_SQ003.[i],data4$matching3N5.SQ009_SQ003.[i],data4$matching3N5.SQ010_SQ003.[i], data4$matching3N5.SQ011_SQ003.[i], data4$matching3N5.SQ012_SQ003.[i], data4$matching3N5.SQ013_SQ003.[i], data4$matching3N5.SQ014_SQ003.[i], data4$matching3N5.SQ015_SQ003.[i]),
    cbind(data4$matching3N5.SQ001_SQ005.[i],data4$matching3N5.SQ002_SQ005.[i],data4$matching3N5.SQ003_SQ005.[i],data4$matching3N5.SQ004_SQ005.[i],data4$matching3N5.SQ005_SQ005.[i],data4$matching3N5.SQ006_SQ005.[i],data4$matching3N5.SQ007_SQ005.[i],data4$matching3N5.SQ008_SQ005.[i],data4$matching3N5.SQ009_SQ005.[i],data4$matching3N5.SQ010_SQ005.[i], data4$matching3N5.SQ011_SQ005.[i], data4$matching3N5.SQ012_SQ005.[i], data4$matching3N5.SQ013_SQ005.[i], data4$matching3N5.SQ014_SQ005.[i], data4$matching3N5.SQ015_SQ005.[i]))
  matchingList3[[i]] <- matching3L
}

for (i in 1:length(matchingList3)) {    # for ego i
  mL <- matchingList3[[i]]              # get the matching list 2
  ns <- ns4[[i]]                        # get the size of egonet4
  if(ns>0) {                            # if ns=0, no matching was done!
    mm <- as.matrix(mL[[ns]])           # and the corresponding matrix
    matched <- which(mm==1, arr.ind=T)  # retrieve array indices
    net <- net4[i,]
    if(length(matched)>0) {             # if matching was performed!
      alterL[[i]]$name4[matched[,2]] <- net[matched[,1]]
    }
  }
}

#let us here also attach structural embeddedness. because the 'network environment' for maintained alters may change in t2

#again, fix the irregularities in the data.
data4 <- data4 %>%
  rename (adj3N2a.SQ001. = adj3N1a.SQ001., adj3N3a.SQ001. = adj3N2a.SQ001.,adj3N3a.SQ002. = adj3N2a.SQ002.,adj3N3b.SQ001. = adj3N2b.SQ001.,adj3N4a.SQ001. = adj3N3a.SQ001.,adj3N4a.SQ002. = adj3N3a.SQ002.,adj3N4a.SQ003. = adj3N3a.SQ003.,adj3N4b.SQ001. = adj3N3b.SQ001.,adj3N4b.SQ002. = adj3N3b.SQ002.,   adj3N4c.SQ001. = adj3N3c.SQ001.,adj3N5a.SQ001. = adj3N4a.SQ001.,adj3N5a.SQ002. = adj3N4a.SQ002.,adj3N5a.SQ003. = adj3N4a.SQ003.,adj3N5a.SQ004. = adj3N4a.SQ004.,adj3N5b.SQ001. = adj3N4b.SQ001.,adj3N5b.SQ002. = adj3N4b.SQ002.,adj3N5b.SQ003. = adj3N4b.SQ003.,adj3N5c.SQ001. = adj3N4c.SQ001.,adj3N5c.SQ002. = adj3N4c.SQ002.,adj3N5d.SQ001. = adj3N4d.SQ001.)

data4$adj4N3b.SQ001. <- data4$adj4N3b.SQ002.

for (i in 1:length(alterL)) { # for ego i

  #get number of names listed in the egonets
  nnames_cdn <- length(which(data4[i,c("egonet1.SQ001.","egonet1.SQ002.","egonet1.SQ003.","egonet1.SQ004.","egonet1.SQ005.")]!=""))
  nnames_study <- length(which(data4[i,c("egonet2.SQ001.","egonet2.SQ002.","egonet2.SQ003.","egonet2.SQ004.","egonet2.SQ005.")]!=""))
  nnames_bff <- length(which(data4[i,c("egonet3.SQ001.","egonet3.SQ002.","egonet3.SQ003.","egonet3.SQ004.","egonet3.SQ005.")]!=""))
  nnames_csn <- length(which(data4[i,c("egonet4.SQ001.","egonet4.SQ002.","egonet4.SQ003.","egonet4.SQ004.","egonet4.SQ005.")]!=""))
  
  #CDN
  
  #make list of adjacency matrices
  adjL <- list()
  {
  #2 alters
  adjL[[2]] <- matrix(NA,ncol=2,nrow=2)
  adjL[[2]][1,2] <- adjL[[2]][2,1] <- data4$adj1N2a.SQ001.[i]

  #3 alters
  adjL[[3]] <- matrix(NA,ncol=3,nrow=3)
  adjL[[3]][1,2] <- adjL[[3]][2,1] <- data4$adj1N3a.SQ001.[i]
  adjL[[3]][1,3] <- adjL[[3]][3,1] <- data4$adj1N3a.SQ002.[i]
  adjL[[3]][2,3] <- adjL[[3]][3,2] <- data4$adj1N3b.SQ001.[i]

  #4 alters
  adjL[[4]] <- matrix(NA,ncol=4,nrow=4)
  adjL[[4]][1,2] <- adjL[[4]][2,1] <- data4$adj1N4a.SQ001.[i]
  adjL[[4]][1,3] <- adjL[[4]][3,1] <- data4$adj1N4a.SQ002.[i]
  adjL[[4]][1,4] <- adjL[[4]][4,1] <- data4$adj1N4a.SQ003.[i]
  adjL[[4]][2,3] <- adjL[[4]][3,2] <- data4$adj1N4b.SQ001.[i]
  adjL[[4]][2,4] <- adjL[[4]][4,2] <- data4$adj1N4b.SQ002.[i]
  adjL[[4]][3,4] <- adjL[[4]][4,3] <- data4$adj1N4c.SQ001.[i]

  #5 alters
  adjL[[5]] <- matrix(NA,ncol=5,nrow=5)
  adjL[[5]][1,2] <- adjL[[5]][2,1] <- data4$adj1N5a.SQ001.[i]
  adjL[[5]][1,3] <- adjL[[5]][3,1] <- data4$adj1N5a.SQ002.[i]
  adjL[[5]][1,4] <- adjL[[5]][4,1] <- data4$adj1N5a.SQ003.[i]
  adjL[[5]][1,5] <- adjL[[5]][5,1] <- data4$adj1N5a.SQ004.[i]
  adjL[[5]][2,3] <- adjL[[5]][3,2] <- data4$adj1N5b.SQ001.[i]
  adjL[[5]][2,4] <- adjL[[5]][4,2] <- data4$adj1N5b.SQ002.[i]
  adjL[[5]][2,5] <- adjL[[5]][5,2] <- data4$adj1N5b.SQ003.[i]
  adjL[[5]][3,4] <- adjL[[5]][4,3] <- data4$adj1N5c.SQ001.[i]
  adjL[[5]][3,5] <- adjL[[5]][5,3] <- data4$adj1N5c.SQ002.[i]
  adjL[[5]][4,5] <- adjL[[5]][5,4] <- data4$adj1N5d.SQ001.[i]
  }

  if(nnames_cdn>1) { #we only know alter-alter relations for nnames>1
    #take the matrix corresponding the nnames
    mat <- adjL[[nnames_cdn]]
    
    #ties that are (very) close are 1
    mat[!is.na(mat)] <- ifelse(mat[!is.na(mat)]=="Erg hecht" | mat[!is.na(mat)]=="Hecht", 1,0)

    #calculate embeddedness for each alter/row:
    embed <- apply(mat, 1, function(row) {
    n_cols <- sum(!is.na(row))
    n_ones <- sum(row == "1", na.rm = TRUE)
    ratio <- n_ones / n_cols
    return(ratio)
    })
  
  #CDN: 1:nnames_CDN
  alterL[[i]]$cdn_embed.t2[1:nnames_cdn] <- embed 
  }
  
  #STUDY

  #make list of adjacency matrices
  adjL <- list()
  {
  #2 alters
  adjL[[2]] <- matrix(NA,ncol=2,nrow=2)
  adjL[[2]][1,2] <- adjL[[2]][2,1] <- data4$adj2N2a.SQ001.[i]

  #3 alters
  adjL[[3]] <- matrix(NA,ncol=3,nrow=3)
  adjL[[3]][1,2] <- adjL[[3]][2,1] <- data4$adj2N3a.SQ001.[i]
  adjL[[3]][1,3] <- adjL[[3]][3,1] <- data4$adj2N3a.SQ002.[i]
  adjL[[3]][2,3] <- adjL[[3]][3,2] <- data4$adj2N3b.SQ001.[i]

  #4 alters
  adjL[[4]] <- matrix(NA,ncol=4,nrow=4)
  adjL[[4]][1,2] <- adjL[[4]][2,1] <- data4$adj2N4a.SQ001.[i]
  adjL[[4]][1,3] <- adjL[[4]][3,1] <- data4$adj2N4a.SQ002.[i]
  adjL[[4]][1,4] <- adjL[[4]][4,1] <- data4$adj2N4a.SQ003.[i]
  adjL[[4]][2,3] <- adjL[[4]][3,2] <- data4$adj2N4b.SQ001.[i]
  adjL[[4]][2,4] <- adjL[[4]][4,2] <- data4$adj2N4b.SQ002.[i]
  adjL[[4]][3,4] <- adjL[[4]][4,3] <- data4$adj2N4c.SQ001.[i]

  #5 alters
  adjL[[5]] <- matrix(NA,ncol=5,nrow=5)
  adjL[[5]][1,2] <- adjL[[5]][2,1] <- data4$adj2N5a.SQ001.[i]
  adjL[[5]][1,3] <- adjL[[5]][3,1] <- data4$adj2N5a.SQ002.[i]
  adjL[[5]][1,4] <- adjL[[5]][4,1] <- data4$adj2N5a.SQ003.[i]
  adjL[[5]][1,5] <- adjL[[5]][5,1] <- data4$adj2N5a.SQ004.[i]
  adjL[[5]][2,3] <- adjL[[5]][3,2] <- data4$adj2N5b.SQ001.[i]
  adjL[[5]][2,4] <- adjL[[5]][4,2] <- data4$adj2N5b.SQ002.[i]
  adjL[[5]][2,5] <- adjL[[5]][5,2] <- data4$adj2N5b.SQ003.[i]
  adjL[[5]][3,4] <- adjL[[5]][4,3] <- data4$adj2N5c.SQ001.[i]
  adjL[[5]][3,5] <- adjL[[5]][5,3] <- data4$adj2N5c.SQ002.[i]
  adjL[[5]][4,5] <- adjL[[5]][5,4] <- data4$adj2N5d.SQ001.[i]
  }

  if(nnames_study>1) { #we only know alter-alter relations for nnames
    #take the matrix corresponding the nnames
    mat <- adjL[[nnames_study]]
    
    #ties that are (very) close are 1
    mat[!is.na(mat)] <- ifelse(mat[!is.na(mat)]=="Erg hecht" | mat[!is.na(mat)]=="Hecht", 1,0)

    #calculate embeddedness for each alter/row:
    embed <- apply(mat, 1, function(row) {
    n_cols <- sum(!is.na(row))
    n_ones <- sum(row == "1", na.rm = TRUE)
    ratio <- n_ones / n_cols
    return(ratio)
    })
    
    alterL[[i]]$study_embed.t2[6:(5+nnames_study)] <- embed 
  }
  
  # BEST FRIENDS
  #make list of adjacency matrices
  adjL <- list()
  {
  #2 alters
  adjL[[2]] <- matrix(NA,ncol=2,nrow=2)
  adjL[[2]][1,2] <- adjL[[2]][2,1] <- data4$adj3N2a.SQ001.[i]

  #3 alters
  adjL[[3]] <- matrix(NA,ncol=3,nrow=3)
  adjL[[3]][1,2] <- adjL[[3]][2,1] <- data4$adj3N3a.SQ001.[i]
  adjL[[3]][1,3] <- adjL[[3]][3,1] <- data4$adj3N3a.SQ002.[i]
  adjL[[3]][2,3] <- adjL[[3]][3,2] <- data4$adj3N3b.SQ001.[i]

  #4 alters
  adjL[[4]] <- matrix(NA,ncol=4,nrow=4)
  adjL[[4]][1,2] <- adjL[[4]][2,1] <- data4$adj3N4a.SQ001.[i]
  adjL[[4]][1,3] <- adjL[[4]][3,1] <- data4$adj3N4a.SQ002.[i]
  adjL[[4]][1,4] <- adjL[[4]][4,1] <- data4$adj3N4a.SQ003.[i]
  adjL[[4]][2,3] <- adjL[[4]][3,2] <- data4$adj3N4b.SQ001.[i]
  adjL[[4]][2,4] <- adjL[[4]][4,2] <- data4$adj3N4b.SQ002.[i]
  adjL[[4]][3,4] <- adjL[[4]][4,3] <- data4$adj3N4c.SQ001.[i]

  #5 alters
  adjL[[5]] <- matrix(NA,ncol=5,nrow=5)
  adjL[[5]][1,2] <- adjL[[5]][2,1] <- data4$adj3N5a.SQ001.[i]
  adjL[[5]][1,3] <- adjL[[5]][3,1] <- data4$adj3N5a.SQ002.[i]
  adjL[[5]][1,4] <- adjL[[5]][4,1] <- data4$adj3N5a.SQ003.[i]
  adjL[[5]][1,5] <- adjL[[5]][5,1] <- data4$adj3N5a.SQ004.[i]
  adjL[[5]][2,3] <- adjL[[5]][3,2] <- data4$adj3N5b.SQ001.[i]
  adjL[[5]][2,4] <- adjL[[5]][4,2] <- data4$adj3N5b.SQ002.[i]
  adjL[[5]][2,5] <- adjL[[5]][5,2] <- data4$adj3N5b.SQ003.[i]
  adjL[[5]][3,4] <- adjL[[5]][4,3] <- data4$adj3N5c.SQ001.[i]
  adjL[[5]][3,5] <- adjL[[5]][5,3] <- data4$adj3N5c.SQ002.[i]
  adjL[[5]][4,5] <- adjL[[5]][5,4] <- data4$adj3N5d.SQ001.[i]
  }

  if(nnames_bff>1) { #we only know alter-alter relations for nnames
    #take the matrix corresponding the nnames
    mat <- adjL[[nnames_bff]]
    
    #ties that are (very) close are 1
    mat[!is.na(mat)] <- ifelse(mat[!is.na(mat)]=="Erg hecht" | mat[!is.na(mat)]=="Hecht", 1,0)

    #calculate embeddedness for each alter/row:
    embed <- apply(mat, 1, function(row) {
    n_cols <- sum(!is.na(row))
    n_ones <- sum(row == "1", na.rm = TRUE)
    ratio <- n_ones / n_cols
    return(ratio)
    })
    
    alterL[[i]]$bff_embed.t2[11:(10+nnames_bff)] <- embed 
  }
  
  # SPORTS PARTNERS
  #make list of adjacency matrices
  adjL <- list()
  {
  #2 alters
  adjL[[2]] <- matrix(NA,ncol=2,nrow=2)
  adjL[[2]][1,2] <- adjL[[2]][2,1] <- data4$adj4N2a.SQ001.[i]

  #3 alters
  adjL[[3]] <- matrix(NA,ncol=3,nrow=3)
  adjL[[3]][1,2] <- adjL[[3]][2,1] <- data4$adj4N3a.SQ001.[i]
  adjL[[3]][1,3] <- adjL[[3]][3,1] <- data4$adj4N3a.SQ002.[i]
  adjL[[3]][2,3] <- adjL[[3]][3,2] <- data4$adj4N3b.SQ001.[i]

  #4 alters
  adjL[[4]] <- matrix(NA,ncol=4,nrow=4)
  adjL[[4]][1,2] <- adjL[[4]][2,1] <- data4$adj4N4a.SQ001.[i]
  adjL[[4]][1,3] <- adjL[[4]][3,1] <- data4$adj4N4a.SQ002.[i]
  adjL[[4]][1,4] <- adjL[[4]][4,1] <- data4$adj4N4a.SQ003.[i]
  adjL[[4]][2,3] <- adjL[[4]][3,2] <- data4$adj4N4b.SQ001.[i]
  adjL[[4]][2,4] <- adjL[[4]][4,2] <- data4$adj4N4b.SQ002.[i]
  adjL[[4]][3,4] <- adjL[[4]][4,3] <- data4$adj4N4c.SQ001.[i]

  #5 alters
  adjL[[5]] <- matrix(NA,ncol=5,nrow=5)
  adjL[[5]][1,2] <- adjL[[5]][2,1] <- data4$adj4N5a.SQ001.[i]
  adjL[[5]][1,3] <- adjL[[5]][3,1] <- data4$adj4N5a.SQ002.[i]
  adjL[[5]][1,4] <- adjL[[5]][4,1] <- data4$adj4N5a.SQ003.[i]
  adjL[[5]][1,5] <- adjL[[5]][5,1] <- data4$adj4N5a.SQ004.[i]
  adjL[[5]][2,3] <- adjL[[5]][3,2] <- data4$adj4N5b.SQ001.[i]
  adjL[[5]][2,4] <- adjL[[5]][4,2] <- data4$adj4N5b.SQ002.[i]
  adjL[[5]][2,5] <- adjL[[5]][5,2] <- data4$adj4N5b.SQ003.[i]
  adjL[[5]][3,4] <- adjL[[5]][4,3] <- data4$adj4N5c.SQ001.[i]
  adjL[[5]][3,5] <- adjL[[5]][5,3] <- data4$adj4N5c.SQ002.[i]
  adjL[[5]][4,5] <- adjL[[5]][5,4] <- data4$adj4N5d.SQ001.[i]
  }

  if(nnames_csn>1) { #we only know alter-alter relations for nnames
    #take the matrix corresponding the nnames
    mat <- adjL[[nnames_csn]]
    
    #ties that are (very) close are 1
    mat[!is.na(mat)] <- ifelse(mat[!is.na(mat)]=="Erg hecht" | mat[!is.na(mat)]=="Hecht", 1,0)

    #calculate embeddedness for each alter/row:
    embed <- apply(mat, 1, function(row) {
    n_cols <- sum(!is.na(row))
    n_ones <- sum(row == "1", na.rm = TRUE)
    ratio <- n_ones / n_cols
    return(ratio)
    })
    
    alterL[[i]]$csn_embed.t2[16:(15+nnames_csn)] <- embed 
  }
}

#alters could be named in multiple name generators. each element of alterL contains rows corresponding to alters that may be 'duplicates'.
#i match the structural embeddedness measures

for (i in 1:length(alterL)) { #for ego i 
  for (j in 1:nrow(alterL[[i]])) { #for alter j
        
    #if name2 is not empty, alter j was matched to the study network; and more precisely, to the study partner with name1: alterL[[i]]$name2[j]
    alterL[[i]]$study_embed.t2[j] <- ifelse(!is.na(alterL[[i]]$name2[j]), 
                                            alterL[[i]]$study_embed.t2[which(alterL[[i]]$name1==alterL[[i]]$name2[j] & !is.na(alterL[[i]]$study_embed.t2))],
                                            alterL[[i]]$study_embed.t2[j])
    
    #if name3 is not empty, alter j was matched to the friends network; and more precisely, to the friend with name1: alterL[[i]]$name3[j]
    alterL[[i]]$bff_embed.t2[j] <- ifelse(!is.na(alterL[[i]]$name3[j]), 
                                          alterL[[i]]$bff_embed.t2[which(alterL[[i]]$name1==alterL[[i]]$name3[j] & !is.na(alterL[[i]]$bff_embed.t2))],
                                          alterL[[i]]$bff_embed.t2[j])
    
    #if name4 is not empty, alter j was matched to the sports network; and more precisely, to the sports partner with name1: alterL[[i]]$name4[j]
    alterL[[i]]$csn_embed.t2[j] <- ifelse(!is.na(alterL[[i]]$name4[j]), 
                                          alterL[[i]]$csn_embed.t2[which(alterL[[i]]$name1==alterL[[i]]$name4[j] & !is.na(alterL[[i]]$csn_embed.t2))],     
                                          alterL[[i]]$csn_embed.t2[j] )
  }
}

# make long df with alters in ego,
# and indicators for 4 egonets;
df2 <- data.frame(
  ego=rep(1:length(alterL),each=20),alter=rep(1:20),cdn=NA, study=NA,bff=NA,csn=NA,
  cdn_embed.t2=NA, study_embed.t2=NA, bff_embed.t2=NA, csn_embed.t2=NA)

for (i in unique(df2$ego)) {  
      for (j in 1:20) { # for alters nested in ego
                 
        # find out if names denoting alter j appear in the 4 egonets
        alter <- unlist(alterL[[i]][j,c(2:5)], use.names = FALSE)
        alter <- alter[!is.na(alter)] # exclude NAs
        
        cdn <- alter %in% net1[i,]
        study <- alter %in% net2[i,]
        bff <- alter %in% net3[i,]
        csn <- alter %in% net4[i,]
        
        # and if so, give alter j score 1 on indicators; 0 otherwise
        df2$cdn[which(df2$ego==i & df2$alter==j)] <- ifelse("TRUE" %in% cdn, 1, 0)
        df2$study[which(df2$ego==i & df2$alter==j)] <- ifelse("TRUE" %in% study, 1, 0)
        df2$bff[which(df2$ego==i & df2$alter==j)] <- ifelse("TRUE" %in% bff, 1, 0)
        df2$csn[which(df2$ego==i & df2$alter==j)] <- ifelse("TRUE" %in% csn, 1, 0)
        
        #and attach embeddedness t2 scores
        df2$cdn_embed.t2[which(df2$ego==i & df2$alter==j)] <- alterL[[i]]$cdn_embed.t2[j]
        df2$study_embed.t2[which(df2$ego==i & df2$alter==j)] <- alterL[[i]]$study_embed.t2[j]
        df2$bff_embed.t2[which(df2$ego==i & df2$alter==j)] <- alterL[[i]]$bff_embed.t2[j]
        df2$csn_embed.t2[which(df2$ego==i & df2$alter==j)] <- alterL[[i]]$csn_embed.t2[j]
      }
}

# now that i have, for each alter of ego (including duplicates) at t2,
# the nets to which they belong..
# i continue with the w1-w2 matching matrices

# we already subsetted the matching matrices (in `w1w2`)
for (i in unique(df$ego)) {  # for ego i
  
  matchingL <- vector("list", 20) #pre-allocate empty list of length 15, to store matching matrices
  {
    matchingL[[1]] <- w1w2[i,1:20]
    matchingL[[2]] <- w1w2[i,21:40]
    matchingL[[3]] <- w1w2[i,41:60]
    matchingL[[4]] <- w1w2[i,61:80]
    matchingL[[5]] <- w1w2[i,81:100]
    matchingL[[6]] <- w1w2[i,101:120]
    matchingL[[7]] <- w1w2[i,121:140]
    matchingL[[8]] <- w1w2[i,141:160]
    matchingL[[9]] <- w1w2[i,161:180]
    matchingL[[10]] <- w1w2[i,181:200]
    matchingL[[11]] <- w1w2[i,201:220]
    matchingL[[12]] <- w1w2[i,221:240]
    matchingL[[13]] <- w1w2[i,241:260]
    matchingL[[14]] <- w1w2[i,261:280]
    matchingL[[15]] <- w1w2[i,281:300]
    matchingL[[16]] <- w1w2[i,301:320]
    matchingL[[17]] <- w1w2[i,321:340]
    matchingL[[18]] <- w1w2[i,341:360]
    matchingL[[19]] <- w1w2[i,361:380]
    matchingL[[20]] <- w1w2[i,381:400]
  }
  
  #find the 'right' matching matrix in this list, by taking the one that contains answers
  ind <- NULL
  for (j in seq_along(matchingL)) {
    #check along the sequence of elements j in the matching matrix list if they are non-empty and not NA
    check <- FALSE
    for (col in matchingL[[j]]) {
      if (!all(is.na(col)) && any(nchar(col) > 0)) {
        check <- TRUE
        break  
      }
      }
    if (check) {
      ind <- j
      break  
    }
  }
  
  if(length(ind)>0) {
    # get the  corresponding matrix
    mm <- matchingL[[ind]]
    
    # extract alter ids
    ans <- stringr::str_extract_all(mm,"\\(?[0-9,.]+\\)?") 
    # here, the object refers to the w1-alter j;
    # and the element indicator in the list refers to the w2-alter 
    
    for (j in unique(df$alterid[which(df$ego==i)])) { # for w1-alter j,
      
      # to which row/w2-alter was alter j matched?
      match <- which(ans==j)
      # and in which networks did this w2-alter belong?
      nets <- df2[which(df2$ego==i & df2$alter==match[1]),] #add [1] to match, for the few cases where multiple w2-alters were matched to the same w1-alter (i.e., when ego did not correclty perform match w2 alters to each other.)
    
    if(length(match)>0) { # if j was matched to w2-alters...
      # assign to alter j the networks in which j reappeared
      df$cdn2[which(df$ego==i & df$alterid==j)] <- nets$cdn[1]
      df$study2[which(df$ego==i & df$alterid==j)] <- nets$study[1]
      df$bff2[which(df$ego==i & df$alterid==j)] <- nets$bff[1]
      df$csn2[which(df$ego==i & df$alterid==j)] <- nets$csn[1]
      
      #and attach their t2 embeddednes score
      df$cdn_embed.t2[which(df$ego==i & df$alterid==j)] <- nets$cdn_embed.t2[1]
      df$study_embed.t2[which(df$ego==i & df$alterid==j)] <- nets$study_embed.t2[1]
      df$bff_embed.t2[which(df$ego==i & df$alterid==j)] <- nets$bff_embed.t2[1]
      df$csn_embed.t2[which(df$ego==i & df$alterid==j)] <- nets$csn_embed.t2[1]
    }
  }
  }
}

# currently; a lot of NAs in the attributes indicating whether alter j was member of the respective networks.
# those are alters that were not renamed, and thus have no 'chance' to re-appear. so, 0s are alters that were once part of a specific network, but re-appeared not in that particular network.
# naturally, for analyses, NAs can be set to 0.

# as a second tie change indicator, i look at whether (un-listed) alters and ego were still in touch
df$frequency.t2 <- NA
df$closeness.t2 <- NA

# subset w2 name interpreters on contact freq. of w1 alters (sq021 - sq040!)
freq <- data4[,c(1176:1195)]
# also closeness
close <- data4[,c(1216:1235)]

# recode into numeric values;
freq <- ifelse(freq=="(Bijna) elke dag",7,
                       ifelse(freq=="1-2 keer per week",6,
                              ifelse(freq=="Aantal keer per maand",5, 
                                     ifelse(freq=="Ong. 1 keer per maand",4, 
                                            ifelse(freq=="Aantal keer per jaar",3,
                                                   ifelse(freq=="Ong. 1 keer per jaar",2,
                                                          ifelse(freq=="Nooit",1,
                                                                      NA   )))))))
close <- ifelse(close=="Heel erg hecht", 4, ifelse(close=="Hecht", 3, ifelse(close=="Enigszins hecht",2, ifelse(close=="Niet hecht", 1, NA))))

for (i in unique(df$ego)) {
  for (j in unique(df$alterid[which(df$ego==i)])) {
    df$frequency.t2[which(df$ego==i & df$alterid==j)] <- freq[i,][!is.na(freq[i,])][j]
    df$closeness.t2[which(df$ego==i & df$alterid==j)] <- close[i,][!is.na(close[i,])][j]
  }
}

# size of each egonet at t2
df$cdn.size2 <- NA
df$study.size2 <- NA
df$bff.size2 <- NA
df$csn.size2 <- NA

for (i in unique(df$ego)) {
  df$cdn.size2[which(df$ego==i)] <- rowSums(cbind(data4$egonet1.SQ001.[i],data4$egonet1.SQ002.[i],data4$egonet1.SQ003.[i],data4$egonet1.SQ004.[i],data4$egonet1.SQ005.[i])!="")
    df$study.size2[which(df$ego==i)] <- rowSums(cbind(data4$egonet2.SQ001.[i],data4$egonet2.SQ002.[i],data4$egonet2.SQ003.[i],data4$egonet2.SQ004.[i],data4$egonet2.SQ005.[i])!="")
    df$bff.size2[which(df$ego==i)] <- rowSums(cbind(data4$egonet3.SQ001.[i],data4$egonet3.SQ002.[i],data4$egonet3.SQ003.[i],data4$egonet3.SQ004.[i],data4$egonet3.SQ005.[i])!="")
    df$csn.size2[which(df$ego==i)] <- rowSums(cbind(data4$egonet4.SQ001.[i],data4$egonet4.SQ002.[i],data4$egonet4.SQ003.[i],data4$egonet4.SQ004.[i],data4$egonet4.SQ005.[i])!="") }

#and density at t2.
df$cdn.density2 <- df$study.density2 <- df$csn.density2 <- df$bff.density2 <- NA

for (i in unique(df$ego)) {
  #a. CDN
  size <- df$cdn.size2[which(df$ego==i)][1]
  #no. possible ties between alters
  pos <- ifelse(size==2, 1, ifelse(size==3, 3, ifelse(size==4, 6, ifelse(size==5, 10, 0))))
  #get no. of observed ties
  #only if ego named at least 2 alters in this name generator
  #because only then i can calculate density
  if(size>1) {
    #get alter-alter adjacency matrices of this particular egonet
    adjacency <- data4[i,c(8:27)]

    #i want the correct ones, given the no. of listed alters in this name generator
    #i list the columns numbers of the variables corresponding to each matching matrix set,
    #and subset corresponding columns in `adjacency`
    adj <- adjacency[,list(0,1,c(2:4),c(5:10),c(11:20))[size][[1]]]
   
    #count number of ties that ego described as (very) close (vs. not close but no stranger; strangers)
    obs <- length(which(adj=="Hecht"|adj=="Erg hecht"))
    df$cdn.density2[which(df$ego==i)] <- obs/pos  }
  
  #b. study
  size <- df$study.size2[which(df$ego==i)][1]
  pos <- ifelse(size==2, 1, ifelse(size==3, 3, ifelse(size==4, 6, ifelse(size==5, 10, 0))))
  if(size>1) {
    adjacency <- data4[i,c(33:52)]
    #reorder columns.... messy!
    adjacency <- adjacency[,c("adj2N2a.SQ001.", "adj2N3a.SQ001.", "adj2N3a.SQ002.", "adj2N3b.SQ001.", "adj2N4a.SQ001.", "adj2N4a.SQ002.",
                       "adj2N4a.SQ003.", "adj2N4b.SQ001.", "adj2N4b.SQ002.", "adj2N4c.SQ001.", "adj2N5a.SQ001.", "adj2N5a.SQ002.",
                       "adj2N5a.SQ003.", "adj2N5a.SQ004.", "adj2N5b.SQ001.", "adj2N5b.SQ002.", "adj2N5b.SQ003.", "adj2N5c.SQ001.",
                       "adj2N5c.SQ002.", "adj2N5d.SQ001.")]
    
    adj <- adjacency[,list(0,1,c(2:4),c(5:10),c(11:20))[size][[1]]]
  
    #count number of ties that ego described as (very) close (vs. not close but no stranger; strangers)
    obs <- length(which(adj=="Hecht"|adj=="Erg hecht"))
    df$study.density2[which(df$ego==i)] <- obs/pos }
  
  #c. friends
  size <- df$bff.size2[which(df$ego==i)][1]
  pos <- ifelse(size==2, 1, ifelse(size==3, 3, ifelse(size==4, 6, ifelse(size==5, 10, 0))))
  if(size>1) {
    adjacency <- data4[i,c(156:175)]
    adj <- adjacency[,list(0,1,c(2:4),c(5:10),c(11:20))[size][[1]]]
    
    #count number of ties that ego described as (very) close (vs. not close but no stranger; strangers)
    obs <- length(which(adj=="Hecht"|adj=="Erg hecht"))
    df$bff.density2[which(df$ego==i)] <- obs/pos }

  #d. sports partners
  size <- df$csn.size2[which(df$ego==i)][1]
  pos <- ifelse(size==2, 1, ifelse(size==3, 3, ifelse(size==4, 6, ifelse(size==5, 10, 0))))
  if(size>1) {
    adjacency <- data4[i,c(401:420)]
    adj <- adjacency[,list(0,1,c(2:4),c(5:10),c(11:20))[size][[1]]]
  
    #count number of ties that ego described as (very) close (vs. not close but no stranger; strangers)
    obs <- length(which(adj=="Hecht"|adj=="Erg hecht"))
    df$csn.density2[which(df$ego==i)] <- obs/pos }
}

#set NAs to 0.
df$cdn.density2[is.na(df$cdn.density2)] <- 0
df$study.density2[is.na(df$study.density2)] <- 0
df$bff.density2[is.na(df$bff.density2)] <- 0
df$csn.density2[is.na(df$csn.density2)] <- 0

#add Wave 2 status
df$statusW2 <- NA
df$statusW2 <- ifelse(df$survive==1, "Maintained", "Dropped")

## methodological controls

#include whether max number of names was reached at t2
df$cdn.max2 <- ifelse(df$cdn.size2==5,1,0)
df$study.max2 <- ifelse(df$study.size2==5,1,0)
df$bff.max2 <- ifelse(df$bff.size2==5,1,0)
df$csn.max2 <- ifelse(df$csn.size2==5,1,0)

#survey time 
df$survey2time <- NA

#time of day
df$beforenine2 <- NA
df$ninetofive2 <- NA
df$afterfive2 <- NA

#filled out on the weekend (sa/su)?
df$weekend2 <- NA

#time per name generator
df$cdn.time2 <- NA
df$study.time2 <- NA
df$bff.time2 <- NA
df$csn.time2 <- NA

#time till name generator
df$cdn.timetill2 <- NA
df$study.timetill2 <- NA
df$bff.timetill2 <- NA
df$csn.timetill2 <- NA

for (i in unique(df$ego)) {
  
  #survey time at wave 2
  #convert start and submitdate to POSIXct and calculate difference
  #in minutes; extract number.
  df$survey2time[which(df$ego==i)] <- stringr::str_extract_all(trunc(as.POSIXct(data4$submitdate[i]) - as.POSIXct(data4$startdate[i]), "mins"),"\\(?[0-9,.]+\\)?")[[1]]
  
  #time of day of survey.
  #table(substr(data.table::as.ITime(as.POSIXct(data4$startdate)),1,2)) #distribution
  df$beforenine2[which(df$ego==i)] <- ifelse ( data.table::as.ITime(as.POSIXct(data4$startdate[i])) < data.table::as.ITime("9:00:00"), 1, 0)
  df$ninetofive2[which(df$ego==i)] <- ifelse ( data.table::as.ITime(as.POSIXct(data4$startdate[i])) > data.table::as.ITime("9:00:00") &
                                                 data.table::as.ITime(as.POSIXct(data4$startdate[i])) < data.table::as.ITime("17:00:00"), 1, 0)
  df$afterfive2[which(df$ego==i)] <- ifelse ( data.table::as.ITime(as.POSIXct(data4$startdate[i])) > data.table::as.ITime("17:00:00"), 1, 0)
  
  #time per name generator question, in minutes
 
  df$cdn.time2[which(df$ego==i)] <- data4$groupTime718[i]/60
  df$study.time2[which(df$ego==i)] <- data4$groupTime722[i]/60
  df$bff.time2[which(df$ego==i)] <- data4$groupTime730[i]/60
  df$csn.time2[which(df$ego==i)] <- data4$groupTime737[i]/60
  
  #also get weekday/weekend
  #counting friday as weekend, after 5pm
  
  #table(wday(ymd_hms(as.POSIXct(data4$submitdate)),label = TRUE)) #distribution
  #extract weekday
  weekday <- wday(ymd_hms(as.POSIXct(data4$submitdate[i])),label = TRUE)
  #and time
  time <- hour(as.POSIXct(data4$submitdate[i]))
  df$weekend2[which(df$ego==i)] <- ifelse( (weekday %in% c("za", "zo")) | (weekday == "vr" & time >= 17), 1, 0)
  
  #time till name generator question, in minutes
  # wave 2: question groups 717 CDN718 720 STUDY722 723 724 725 748 793 726 749 729 740 BFF730 731 732 734 735 736 743 CSN737
  df$cdn.timetill2[which(df$ego==i)] <- sum(data4[,c("groupTime717")][i])/60
  df$study.timetill2[which(df$ego==i)] <- rowSums(data4[,c("groupTime717", "groupTime718", "groupTime720")][i,], na.rm = TRUE)/60
  df$bff.timetill2[which(df$ego==i)] <- rowSums(data4[,c("groupTime717", "groupTime718", "groupTime720", "groupTime722", "groupTime723", "groupTime724", "groupTime725", "groupTime748", "groupTime793", "groupTime726", "groupTime749","groupTime729", "groupTime740")][i,], na.rm = TRUE)/60
  df$csn.timetill2[which(df$ego==i)] <- rowSums(data4[,c("groupTime717", "groupTime718", "groupTime720", "groupTime722", "groupTime723", "groupTime724", "groupTime725", "groupTime748", "groupTime793", "groupTime726", "groupTime749","groupTime729", "groupTime740","groupTime730", "groupTime731", "groupTime732", "groupTime734", "groupTime735", "groupTime736", "groupTime743")][i,], na.rm = TRUE)/60
  
}

df_maintained <- df
#fix(df_maintained)
#str(df_maintained)
#last make gender numeric..
df_maintained$alter_gender <- as.numeric(df_maintained$alter_gender)


wave 2 created

#create a new alter List
alterL <- vector("list", nrow(data))

# loop over all egos
for ( i in 1:length(alterL)) {
    alterL[[i]] <- data.frame(
      ego_gender = NA, ego_age = NA, ego_educ = NA,
      alterid = 1:20, name1 = NA, name2 = NA, name3 = NA, name4 = NA,
      alter_gender = NA, alter_age = NA, alter_educ=NA,
      same_gender = NA, dif_age = NA, sim_educ = NA,
      cdn_embed.t2 = NA, study_embed.t2 = NA, bff_embed.t2 = NA, csn_embed.t2 = NA)
}

#fill in names based on names_df
for ( i in 1:length(alterL)) {
  alterL[[i]]$name1 <- unlist(df_names[i, ], use.names=FALSE)
}

# replace empty strings with <NA>
for (i in 1:length(alterL)) {
  alterL[[i]]$name1 <- ifelse(alterL[[i]]$name1=="", NA, alterL[[i]]$name1)
}

#matching
{
  net1 <- cbind(data4$egonet1.SQ001.,data4$egonet1.SQ002., data4$egonet1.SQ003.,data4$egonet1.SQ004., data4$egonet1.SQ005.)
  net1 <- ifelse(net1=="", NA, net1)
  ns1 <- vector()
  for (i in 1:nrow(net1)) {
    ns1[i] <- length(net1[i,][which(!is.na(net1[i,]))])
  }
  net2 <- cbind(data4$egonet2.SQ001.,data4$egonet2.SQ002., data4$egonet2.SQ003.,data4$egonet2.SQ004., data4$egonet2.SQ005.)
  net2 <- ifelse(net2=="", NA, net2)
  ns2 <- vector()
  for (i in 1:nrow(net2)) {
    ns2[i] <- length(net2[i,][which(!is.na(net2[i,]))])
  }
  net3 <- cbind(data4$egonet3.SQ001.,data4$egonet3.SQ002., data4$egonet3.SQ003.,data4$egonet3.SQ004., data4$egonet3.SQ005.)
  net3 <- ifelse(net3=="", NA, net3)
  ns3 <- vector()
  for (i in 1:nrow(net3)) {
    ns3[i] <- length(net3[i,][which(!is.na(net3[i,]))])
  }
  net4 <- cbind(data4$egonet4.SQ001.,data4$egonet4.SQ002., data4$egonet4.SQ003.,data4$egonet4.SQ004., data4$egonet4.SQ005.)
  net4 <- ifelse(net4=="", NA, net4)
  ns4 <- vector()
  for (i in 1:nrow(net4)) {
    ns4[i] <- length(net4[i,][which(!is.na(net4[i,]))])
  }
}

matchingList <- list()
for (i in 1:length(alterL)) { # for ego i
  matchingL <- list()
  # make 5 seperate matching matrices. naturally, only 1 is relevant... but i will select that later.
  matchingL[[1]] <- cbind(data4$matching1N1.SQ001_SQ001.[i],data4$matching1N1.SQ002_SQ001.[i],data4$matching1N1.SQ003_SQ001.[i],data4$matching1N1.SQ004_SQ001.[i],data4$matching1N1.SQ005_SQ001.[i])
  matchingL[[2]]<- rbind(
    cbind(data4$matching1N2.SQ001_SQ001.[i], data4$matching1N2.SQ002_SQ001.[i], data4$matching1N2.SQ003_SQ001.[i], data4$matching1N2.SQ004_SQ001.[i], data4$matching1N2.SQ005_SQ001.[i]),
    cbind(data4$matching1N2.SQ001_SQ002.[i], data4$matching1N2.SQ002_SQ002.[i], data4$matching1N2.SQ003_SQ002.[i], data4$matching1N2.SQ004_SQ002.[i], data4$matching1N2.SQ005_SQ002.[i]))
  matchingL[[3]]<- rbind(
    cbind(data4$matching1N3.SQ001_SQ001.[i], data4$matching1N3.SQ002_SQ001.[i], data4$matching1N3.SQ003_SQ001.[i], data4$matching1N3.SQ004_SQ001.[i], data4$matching1N3.SQ005_SQ001.[i]),
    cbind(data4$matching1N3.SQ001_SQ002.[i], data4$matching1N3.SQ002_SQ002.[i], data4$matching1N3.SQ003_SQ002.[i], data4$matching1N3.SQ004_SQ002.[i], data4$matching1N3.SQ005_SQ002.[i]),
    cbind(data4$matching1N3.SQ001_SQ003.[i], data4$matching1N3.SQ002_SQ003.[i], data4$matching1N3.SQ003_SQ003.[i], data4$matching1N3.SQ004_SQ003.[i], data4$matching1N3.SQ005_SQ003.[i]))
  matchingL[[4]]<- rbind(
    cbind(data4$matching1N4.SQ001_SQ001.[i], data4$matching1N4.SQ002_SQ001.[i], data4$matching1N4.SQ003_SQ001.[i], data4$matching1N4.SQ004_SQ001.[i], data4$matching1N4.SQ005_SQ001.[i]),
    cbind(data4$matching1N4.SQ001_SQ002.[i], data4$matching1N4.SQ002_SQ002.[i], data4$matching1N4.SQ003_SQ002.[i], data4$matching1N4.SQ004_SQ002.[i], data4$matching1N4.SQ005_SQ002.[i]),
    cbind(data4$matching1N4.SQ001_SQ003.[i], data4$matching1N4.SQ002_SQ003.[i], data4$matching1N4.SQ003_SQ003.[i], data4$matching1N4.SQ004_SQ003.[i], data4$matching1N4.SQ005_SQ003.[i]),
    cbind(data4$matching1N4.SQ001_SQ004.[i], data4$matching1N4.SQ002_SQ004.[i], data4$matching1N4.SQ003_SQ004.[i], data4$matching1N4.SQ004_SQ004.[i], data4$matching1N4.SQ005_SQ004.[i]))
  matchingL[[5]]<- rbind(
    cbind(data4$matching1N5.SQ001_SQ001.[i], data4$matching1N5.SQ002_SQ001.[i], data4$matching1N5.SQ003_SQ001.[i], data4$matching1N5.SQ004_SQ001.[i], data4$matching1N5.SQ005_SQ001.[i]),
    cbind(data4$matching1N5.SQ001_SQ002.[i], data4$matching1N5.SQ002_SQ002.[i], data4$matching1N5.SQ003_SQ002.[i], data4$matching1N5.SQ004_SQ002.[i], data4$matching1N5.SQ005_SQ002.[i]),
    cbind(data4$matching1N5.SQ001_SQ003.[i], data4$matching1N5.SQ002_SQ003.[i], data4$matching1N5.SQ003_SQ003.[i], data4$matching1N5.SQ004_SQ003.[i], data4$matching1N5.SQ005_SQ003.[i]),
    cbind(data4$matching1N5.SQ001_SQ004.[i], data4$matching1N5.SQ002_SQ004.[i], data4$matching1N5.SQ003_SQ004.[i], data4$matching1N5.SQ004_SQ004.[i], data4$matching1N5.SQ005_SQ004.[i]),
    cbind(data4$matching1N5.SQ001_SQ005.[i], data4$matching1N5.SQ002_SQ005.[i], data4$matching1N5.SQ003_SQ005.[i], data4$matching1N5.SQ004_SQ005.[i], data4$matching1N5.SQ005_SQ005.[i]))
  matchingList[[i]] <- matchingL
}

# the combination of the matching matrices and the netsizes for ego allows me to match the names myself.
for (i in 1:length(matchingList)) {     # for ego i
  mL <- matchingList[[i]]               # get the matching list
  ns <- ns2[[i]]                        # get the size of egonet2
  if(ns>0) {                            # if ns=0, no matching was done!
    mm <- as.matrix(mL[[ns]])           # retrieve the corresponding matrix
    matched <- which(mm==1, arr.ind=T)  # retrieve array indices
    net <- net2[i,]
    if(length(matched)>0) {             # if matching was performed!
      alterL[[i]]$name2[which(alterL[[i]]$alterid==matched[,2])] <- net[matched[,1]]
    }
  }
}

matchingList2 <- list()
for (i in 1:length(alterL)) { # for ego i
  matching2L <- list()
  matching2L[[1]] <- cbind(data4$matching2N1.SQ001_SQ001.[i],data4$matching2N1.SQ002_SQ001.[i],data4$matching2N1.SQ003_SQ001.[i],data4$matching2N1.SQ004_SQ001.[i],data4$matching2N1.SQ005_SQ001.[i],data4$matching2N1.SQ006_SQ001.[i],data4$matching2N1.SQ007_SQ001.[i],data4$matching2N1.SQ008_SQ001.[i],data4$matching2N1.SQ009_SQ001.[i],data4$matching2N1.SQ010_SQ001.[i])
  matching2L[[2]] <- rbind(
    cbind(data4$matching2N2.SQ001_SQ001.[i],data4$matching2N2.SQ002_SQ001.[i],data4$matching2N2.SQ003_SQ001.[i],data4$matching2N2.SQ004_SQ001.[i],data4$matching2N2.SQ005_SQ001.[i],data4$matching2N2.SQ006_SQ001.[i],data4$matching2N2.SQ007_SQ001.[i],data4$matching2N2.SQ008_SQ001.[i],data4$matching2N2.SQ009_SQ001.[i],data4$matching2N2.SQ010_SQ001.[i]),
    cbind(data4$matching2N2.SQ001_SQ002.[i],data4$matching2N2.SQ002_SQ002.[i],data4$matching2N2.SQ003_SQ002.[i],data4$matching2N2.SQ004_SQ002.[i],data4$matching2N2.SQ005_SQ002.[i],data4$matching2N2.SQ006_SQ002.[i],data4$matching2N2.SQ007_SQ002.[i],data4$matching2N2.SQ008_SQ002.[i],data4$matching2N2.SQ009_SQ002.[i],data4$matching2N2.SQ010_SQ002.[i]))
  matching2L[[3]] <- rbind(
    cbind(data4$matching2N3.SQ001_SQ001.[i],data4$matching2N3.SQ002_SQ001.[i],data4$matching2N3.SQ003_SQ001.[i],data4$matching2N3.SQ004_SQ001.[i],data4$matching2N3.SQ005_SQ001.[i],data4$matching2N3.SQ006_SQ001.[i],data4$matching2N3.SQ007_SQ001.[i],data4$matching2N3.SQ008_SQ001.[i],data4$matching2N3.SQ009_SQ001.[i],data4$matching2N3.SQ010_SQ001.[i]),
    cbind(data4$matching2N3.SQ001_SQ002.[i],data4$matching2N3.SQ002_SQ002.[i],data4$matching2N3.SQ003_SQ002.[i],data4$matching2N3.SQ004_SQ002.[i],data4$matching2N3.SQ005_SQ002.[i],data4$matching2N3.SQ006_SQ002.[i],data4$matching2N3.SQ007_SQ002.[i],data4$matching2N3.SQ008_SQ002.[i],data4$matching2N3.SQ009_SQ002.[i],data4$matching2N3.SQ010_SQ002.[i]),
    cbind(data4$matching2N3.SQ001_SQ003.[i],data4$matching2N3.SQ002_SQ003.[i],data4$matching2N3.SQ003_SQ003.[i],data4$matching2N3.SQ004_SQ003.[i],data4$matching2N3.SQ005_SQ003.[i],data4$matching2N3.SQ006_SQ003.[i],data4$matching2N3.SQ007_SQ003.[i],data4$matching2N3.SQ008_SQ003.[i],data4$matching2N3.SQ009_SQ003.[i],data4$matching2N3.SQ010_SQ003.[i]))
  matching2L[[4]] <- rbind(
    cbind(data4$matching2N4.SQ001_SQ001.[i],data4$matching2N4.SQ002_SQ001.[i],data4$matching2N4.SQ003_SQ001.[i],data4$matching2N4.SQ004_SQ001.[i],data4$matching2N4.SQ005_SQ001.[i],data4$matching2N4.SQ006_SQ001.[i],data4$matching2N4.SQ007_SQ001.[i],data4$matching2N4.SQ008_SQ001.[i],data4$matching2N4.SQ009_SQ001.[i],data4$matching2N4.SQ010_SQ001.[i]),
    cbind(data4$matching2N4.SQ001_SQ002.[i],data4$matching2N4.SQ002_SQ002.[i],data4$matching2N4.SQ003_SQ002.[i],data4$matching2N4.SQ004_SQ002.[i],data4$matching2N4.SQ005_SQ002.[i],data4$matching2N4.SQ006_SQ002.[i],data4$matching2N4.SQ007_SQ002.[i],data4$matching2N4.SQ008_SQ002.[i],data4$matching2N4.SQ009_SQ002.[i],data4$matching2N4.SQ010_SQ002.[i]),
    cbind(data4$matching2N4.SQ001_SQ003.[i],data4$matching2N4.SQ002_SQ003.[i],data4$matching2N4.SQ003_SQ003.[i],data4$matching2N4.SQ004_SQ003.[i],data4$matching2N4.SQ005_SQ003.[i],data4$matching2N4.SQ006_SQ003.[i],data4$matching2N4.SQ007_SQ003.[i],data4$matching2N4.SQ008_SQ003.[i],data4$matching2N4.SQ009_SQ003.[i],data4$matching2N4.SQ010_SQ003.[i]),
    cbind(data4$matching2N4.SQ001_SQ004.[i],data4$matching2N4.SQ002_SQ004.[i],data4$matching2N4.SQ003_SQ004.[i],data4$matching2N4.SQ004_SQ004.[i],data4$matching2N4.SQ005_SQ004.[i],data4$matching2N4.SQ006_SQ004.[i],data4$matching2N4.SQ007_SQ004.[i],data4$matching2N4.SQ008_SQ004.[i],data4$matching2N4.SQ009_SQ004.[i],data4$matching2N4.SQ010_SQ004.[i]))
  matching2L[[5]] <- rbind(
    cbind(data4$matching2N5.SQ001_SQ001.[i],data4$matching2N5.SQ002_SQ001.[i],data4$matching2N5.SQ003_SQ001.[i],data4$matching2N5.SQ004_SQ001.[i],data4$matching2N5.SQ005_SQ001.[i],data4$matching2N5.SQ006_SQ001.[i],data4$matching2N5.SQ007_SQ001.[i],data4$matching2N5.SQ008_SQ001.[i],data4$matching2N5.SQ009_SQ001.[i],data4$matching2N5.SQ010_SQ001.[i]),
    cbind(data4$matching2N5.SQ001_SQ002.[i],data4$matching2N5.SQ002_SQ002.[i],data4$matching2N5.SQ003_SQ002.[i],data4$matching2N5.SQ004_SQ002.[i],data4$matching2N5.SQ005_SQ002.[i],data4$matching2N5.SQ006_SQ002.[i],data4$matching2N5.SQ007_SQ002.[i],data4$matching2N5.SQ008_SQ002.[i],data4$matching2N5.SQ009_SQ002.[i],data4$matching2N5.SQ010_SQ002.[i]),
    cbind(data4$matching2N5.SQ001_SQ003.[i],data4$matching2N5.SQ002_SQ003.[i],data4$matching2N5.SQ003_SQ003.[i],data4$matching2N5.SQ004_SQ003.[i],data4$matching2N5.SQ005_SQ003.[i],data4$matching2N5.SQ006_SQ003.[i],data4$matching2N5.SQ007_SQ003.[i],data4$matching2N5.SQ008_SQ003.[i],data4$matching2N5.SQ009_SQ003.[i],data4$matching2N5.SQ010_SQ003.[i]),
    cbind(data4$matching2N5.SQ001_SQ004.[i],data4$matching2N5.SQ002_SQ004.[i],data4$matching2N5.SQ003_SQ004.[i],data4$matching2N5.SQ004_SQ004.[i],data4$matching2N5.SQ005_SQ004.[i],data4$matching2N5.SQ006_SQ004.[i],data4$matching2N5.SQ007_SQ004.[i],data4$matching2N5.SQ008_SQ004.[i],data4$matching2N5.SQ009_SQ004.[i],data4$matching2N5.SQ010_SQ004.[i]),
    cbind(data4$matching2N5.SQ001_SQ005.[i],data4$matching2N5.SQ002_SQ005.[i],data4$matching2N5.SQ003_SQ005.[i],data4$matching2N5.SQ004_SQ005.[i],data4$matching2N5.SQ005_SQ005.[i],data4$matching2N5.SQ006_SQ005.[i],data4$matching2N5.SQ007_SQ005.[i],data4$matching2N5.SQ008_SQ005.[i],data4$matching2N5.SQ009_SQ005.[i],data4$matching2N5.SQ010_SQ005.[i]))
  matchingList2[[i]] <- matching2L
}

for (i in 1:length(matchingList2)) {    # for ego i
  mL <- matchingList2[[i]]              # get the matching list 2
  ns <- ns3[[i]]                        # get the size of egonet3
  if(ns>0) {                            # if ns=0, no matching was done!
    mm <- as.matrix(mL[[ns]])           # and the corresponding matrix
    matched <- which(mm==1, arr.ind=T)  # retrieve array indices
    net <- net3[i,]
    
    if(length(matched)>0) {             # if matching was performed!
      alterL[[i]]$name3[matched[,2]] <- net[matched[,1]]
    }
  }
}

matchingList3 <- list()
for (i in 1:length(alterL)) { # for ego i
  matching3L <- list()
  matching3L[[1]] <- cbind(data4$matching3N1.SQ001_SQ001.[i],data4$matching3N1.SQ002_SQ001.[i],data4$matching3N1.SQ003_SQ001.[i],data4$matching3N1.SQ004_SQ001.[i],data4$matching3N1.SQ005_SQ001.[i],data4$matching3N1.SQ006_SQ001.[i],data4$matching3N1.SQ007_SQ001.[i],data4$matching3N1.SQ008_SQ001.[i],data4$matching3N1.SQ009_SQ001.[i],data4$matching3N1.SQ010_SQ001.[i], data4$matching3N1.SQ011_SQ001.[i], data4$matching3N1.SQ012_SQ001.[i], data4$matching3N1.SQ013_SQ001.[i], data4$matching3N1.SQ014_SQ001.[i], data4$matching3N1.SQ015_SQ001.[i])
  matching3L[[2]] <- rbind(
    cbind(data4$matching3N2.SQ001_SQ001.[i],data4$matching3N2.SQ002_SQ001.[i],data4$matching3N2.SQ003_SQ001.[i],data4$matching3N2.SQ004_SQ001.[i],data4$matching3N2.SQ005_SQ001.[i],data4$matching3N2.SQ006_SQ001.[i],data4$matching3N2.SQ007_SQ001.[i],data4$matching3N2.SQ008_SQ001.[i],data4$matching3N2.SQ009_SQ001.[i],data4$matching3N2.SQ010_SQ001.[i], data4$matching3N2.SQ011_SQ001.[i], data4$matching3N2.SQ012_SQ001.[i], data4$matching3N2.SQ013_SQ001.[i], data4$matching3N2.SQ014_SQ001.[i], data4$matching3N2.SQ015_SQ001.[i]),
    cbind(data4$matching3N2.SQ001_SQ002.[i],data4$matching3N2.SQ002_SQ002.[i],data4$matching3N2.SQ003_SQ002.[i],data4$matching3N2.SQ004_SQ002.[i],data4$matching3N2.SQ005_SQ002.[i],data4$matching3N2.SQ006_SQ002.[i],data4$matching3N2.SQ007_SQ002.[i],data4$matching3N2.SQ008_SQ002.[i],data4$matching3N2.SQ009_SQ002.[i],data4$matching3N2.SQ010_SQ002.[i], data4$matching3N2.SQ011_SQ002.[i], data4$matching3N2.SQ012_SQ002.[i], data4$matching3N2.SQ013_SQ002.[i], data4$matching3N2.SQ014_SQ002.[i], data4$matching3N2.SQ015_SQ002.[i]))
  matching3L[[3]] <- rbind(
    cbind(data4$matching3N3.SQ001_SQ001.[i],data4$matching3N3.SQ002_SQ001.[i],data4$matching3N3.SQ003_SQ001.[i],data4$matching3N3.SQ004_SQ001.[i],data4$matching3N3.SQ005_SQ001.[i],data4$matching3N3.SQ006_SQ001.[i],data4$matching3N3.SQ007_SQ001.[i],data4$matching3N3.SQ008_SQ001.[i],data4$matching3N3.SQ009_SQ001.[i],data4$matching3N3.SQ010_SQ001.[i], data4$matching3N3.SQ011_SQ001.[i], data4$matching3N3.SQ012_SQ001.[i], data4$matching3N3.SQ013_SQ001.[i], data4$matching3N3.SQ014_SQ001.[i], data4$matching3N3.SQ015_SQ001.[i]),
    cbind(data4$matching3N3.SQ001_SQ002.[i],data4$matching3N3.SQ002_SQ002.[i],data4$matching3N3.SQ003_SQ002.[i],data4$matching3N3.SQ004_SQ002.[i],data4$matching3N3.SQ005_SQ002.[i],data4$matching3N3.SQ006_SQ002.[i],data4$matching3N3.SQ007_SQ002.[i],data4$matching3N3.SQ008_SQ002.[i],data4$matching3N3.SQ009_SQ002.[i],data4$matching3N3.SQ010_SQ002.[i], data4$matching3N3.SQ011_SQ002.[i], data4$matching3N3.SQ012_SQ002.[i], data4$matching3N3.SQ013_SQ002.[i], data4$matching3N3.SQ014_SQ002.[i], data4$matching3N3.SQ015_SQ002.[i]),
    cbind(data4$matching3N3.SQ001_SQ003.[i],data4$matching3N3.SQ002_SQ003.[i],data4$matching3N3.SQ003_SQ003.[i],data4$matching3N3.SQ004_SQ003.[i],data4$matching3N3.SQ005_SQ003.[i],data4$matching3N3.SQ006_SQ003.[i],data4$matching3N3.SQ007_SQ003.[i],data4$matching3N3.SQ008_SQ003.[i],data4$matching3N3.SQ009_SQ003.[i],data4$matching3N3.SQ010_SQ003.[i], data4$matching3N3.SQ011_SQ003.[i], data4$matching3N3.SQ012_SQ003.[i], data4$matching3N3.SQ013_SQ003.[i], data4$matching3N3.SQ014_SQ003.[i], data4$matching3N3.SQ015_SQ003.[i]))
  matching3L[[4]] <- rbind(
    cbind(data4$matching3N4.SQ001_SQ001.[i],data4$matching3N4.SQ002_SQ001.[i],data4$matching3N4.SQ003_SQ001.[i],data4$matching3N4.SQ004_SQ001.[i],data4$matching3N4.SQ005_SQ001.[i],data4$matching3N4.SQ006_SQ001.[i],data4$matching3N4.SQ007_SQ001.[i],data4$matching3N4.SQ008_SQ001.[i],data4$matching3N4.SQ009_SQ001.[i],data4$matching3N4.SQ010_SQ001.[i], data4$matching3N4.SQ011_SQ001.[i], data4$matching3N4.SQ012_SQ001.[i], data4$matching3N4.SQ013_SQ001.[i], data4$matching3N4.SQ014_SQ001.[i], data4$matching3N4.SQ015_SQ001.[i]),
    cbind(data4$matching3N4.SQ001_SQ002.[i],data4$matching3N4.SQ002_SQ002.[i],data4$matching3N4.SQ003_SQ002.[i],data4$matching3N4.SQ004_SQ002.[i],data4$matching3N4.SQ005_SQ002.[i],data4$matching3N4.SQ006_SQ002.[i],data4$matching3N4.SQ007_SQ002.[i],data4$matching3N4.SQ008_SQ002.[i],data4$matching3N4.SQ009_SQ002.[i],data4$matching3N4.SQ010_SQ002.[i], data4$matching3N4.SQ011_SQ002.[i], data4$matching3N4.SQ012_SQ002.[i], data4$matching3N4.SQ013_SQ002.[i], data4$matching3N4.SQ014_SQ002.[i], data4$matching3N4.SQ015_SQ002.[i]),
    cbind(data4$matching3N4.SQ001_SQ003.[i],data4$matching3N4.SQ002_SQ003.[i],data4$matching3N4.SQ003_SQ003.[i],data4$matching3N4.SQ004_SQ003.[i],data4$matching3N4.SQ005_SQ003.[i],data4$matching3N4.SQ006_SQ003.[i],data4$matching3N4.SQ007_SQ003.[i],data4$matching3N4.SQ008_SQ003.[i],data4$matching3N4.SQ009_SQ003.[i],data4$matching3N4.SQ010_SQ003.[i], data4$matching3N4.SQ011_SQ003.[i], data4$matching3N4.SQ012_SQ003.[i], data4$matching3N4.SQ013_SQ003.[i], data4$matching3N4.SQ014_SQ003.[i], data4$matching3N4.SQ015_SQ003.[i]),
    cbind(data4$matching3N4.SQ001_SQ003.[i],data4$matching3N4.SQ002_SQ003.[i],data4$matching3N4.SQ003_SQ003.[i],data4$matching3N4.SQ004_SQ003.[i],data4$matching3N4.SQ005_SQ003.[i],data4$matching3N4.SQ006_SQ003.[i],data4$matching3N4.SQ007_SQ003.[i],data4$matching3N4.SQ008_SQ003.[i],data4$matching3N4.SQ009_SQ003.[i],data4$matching3N4.SQ010_SQ003.[i], data4$matching3N4.SQ011_SQ003.[i], data4$matching3N4.SQ012_SQ003.[i], data4$matching3N4.SQ013_SQ003.[i], data4$matching3N4.SQ014_SQ003.[i], data4$matching3N4.SQ015_SQ003.[i]),
    cbind(data4$matching3N4.SQ001_SQ004.[i],data4$matching3N4.SQ002_SQ004.[i],data4$matching3N4.SQ003_SQ004.[i],data4$matching3N4.SQ004_SQ004.[i],data4$matching3N4.SQ005_SQ004.[i],data4$matching3N4.SQ006_SQ004.[i],data4$matching3N4.SQ007_SQ004.[i],data4$matching3N4.SQ008_SQ004.[i],data4$matching3N4.SQ009_SQ004.[i],data4$matching3N4.SQ010_SQ004.[i], data4$matching3N4.SQ011_SQ004.[i], data4$matching3N4.SQ012_SQ004.[i], data4$matching3N4.SQ013_SQ004.[i], data4$matching3N4.SQ014_SQ004.[i], data4$matching3N4.SQ015_SQ004.[i]))
  matching3L[[5]] <- rbind(
    cbind(data4$matching3N5.SQ001_SQ001.[i],data4$matching3N5.SQ002_SQ001.[i],data4$matching3N5.SQ003_SQ001.[i],data4$matching3N5.SQ004_SQ001.[i],data4$matching3N5.SQ005_SQ001.[i],data4$matching3N5.SQ006_SQ001.[i],data4$matching3N5.SQ007_SQ001.[i],data4$matching3N5.SQ008_SQ001.[i],data4$matching3N5.SQ009_SQ001.[i],data4$matching3N5.SQ010_SQ001.[i], data4$matching3N5.SQ011_SQ001.[i], data4$matching3N5.SQ012_SQ001.[i], data4$matching3N5.SQ013_SQ001.[i], data4$matching3N5.SQ014_SQ001.[i], data4$matching3N5.SQ015_SQ001.[i]),
    cbind(data4$matching3N5.SQ001_SQ002.[i],data4$matching3N5.SQ002_SQ002.[i],data4$matching3N5.SQ003_SQ002.[i],data4$matching3N5.SQ004_SQ002.[i],data4$matching3N5.SQ005_SQ002.[i],data4$matching3N5.SQ006_SQ002.[i],data4$matching3N5.SQ007_SQ002.[i],data4$matching3N5.SQ008_SQ002.[i],data4$matching3N5.SQ009_SQ002.[i],data4$matching3N5.SQ010_SQ002.[i], data4$matching3N5.SQ011_SQ002.[i], data4$matching3N5.SQ012_SQ002.[i], data4$matching3N5.SQ013_SQ002.[i], data4$matching3N5.SQ014_SQ002.[i], data4$matching3N5.SQ015_SQ002.[i]),
    cbind(data4$matching3N5.SQ001_SQ003.[i],data4$matching3N5.SQ002_SQ003.[i],data4$matching3N5.SQ003_SQ003.[i],data4$matching3N5.SQ004_SQ003.[i],data4$matching3N5.SQ005_SQ003.[i],data4$matching3N5.SQ006_SQ003.[i],data4$matching3N5.SQ007_SQ003.[i],data4$matching3N5.SQ008_SQ003.[i],data4$matching3N5.SQ009_SQ003.[i],data4$matching3N5.SQ010_SQ003.[i], data4$matching3N5.SQ011_SQ003.[i], data4$matching3N5.SQ012_SQ003.[i], data4$matching3N5.SQ013_SQ003.[i], data4$matching3N5.SQ014_SQ003.[i], data4$matching3N5.SQ015_SQ003.[i]),
    cbind(data4$matching3N5.SQ001_SQ003.[i],data4$matching3N5.SQ002_SQ003.[i],data4$matching3N5.SQ003_SQ003.[i],data4$matching3N5.SQ004_SQ003.[i],data4$matching3N5.SQ005_SQ003.[i],data4$matching3N5.SQ006_SQ003.[i],data4$matching3N5.SQ007_SQ003.[i],data4$matching3N5.SQ008_SQ003.[i],data4$matching3N5.SQ009_SQ003.[i],data4$matching3N5.SQ010_SQ003.[i], data4$matching3N5.SQ011_SQ003.[i], data4$matching3N5.SQ012_SQ003.[i], data4$matching3N5.SQ013_SQ003.[i], data4$matching3N5.SQ014_SQ003.[i], data4$matching3N5.SQ015_SQ003.[i]),
    cbind(data4$matching3N5.SQ001_SQ005.[i],data4$matching3N5.SQ002_SQ005.[i],data4$matching3N5.SQ003_SQ005.[i],data4$matching3N5.SQ004_SQ005.[i],data4$matching3N5.SQ005_SQ005.[i],data4$matching3N5.SQ006_SQ005.[i],data4$matching3N5.SQ007_SQ005.[i],data4$matching3N5.SQ008_SQ005.[i],data4$matching3N5.SQ009_SQ005.[i],data4$matching3N5.SQ010_SQ005.[i], data4$matching3N5.SQ011_SQ005.[i], data4$matching3N5.SQ012_SQ005.[i], data4$matching3N5.SQ013_SQ005.[i], data4$matching3N5.SQ014_SQ005.[i], data4$matching3N5.SQ015_SQ005.[i]))
  matchingList3[[i]] <- matching3L
}

for (i in 1:length(matchingList3)) {    # for ego i
  mL <- matchingList3[[i]]              # get the matching list 2
  ns <- ns4[[i]]                        # get the size of egonet4
  if(ns>0) {                            # if ns=0, no matching was done!
    mm <- as.matrix(mL[[ns]])           # and the corresponding matrix
    matched <- which(mm==1, arr.ind=T)  # retrieve array indices
    net <- net4[i,]
    if(length(matched)>0) {             # if matching was performed!
      alterL[[i]]$name4[matched[,2]] <- net[matched[,1]]
    }
  }
}

#i also calculate structural embeddedness (alter-level) per ego-net.
for (i in 1:length(alterL)) { # for ego i

  #get number of names listed in the egonets
  nnames_cdn <- length(which(data4[i,c("egonet1.SQ001.","egonet1.SQ002.","egonet1.SQ003.","egonet1.SQ004.","egonet1.SQ005.")]!=""))
  nnames_study <- length(which(data4[i,c("egonet2.SQ001.","egonet2.SQ002.","egonet2.SQ003.","egonet2.SQ004.","egonet2.SQ005.")]!=""))
  nnames_bff <- length(which(data4[i,c("egonet3.SQ001.","egonet3.SQ002.","egonet3.SQ003.","egonet3.SQ004.","egonet3.SQ005.")]!=""))
  nnames_csn <- length(which(data4[i,c("egonet4.SQ001.","egonet4.SQ002.","egonet4.SQ003.","egonet4.SQ004.","egonet4.SQ005.")]!=""))
  
  #CDN
  
  #make list of adjacency matrices
  adjL <- list()
  {
  #2 alters
  adjL[[2]] <- matrix(NA,ncol=2,nrow=2)
  adjL[[2]][1,2] <- adjL[[2]][2,1] <- data4$adj1N2a.SQ001.[i]

  #3 alters
  adjL[[3]] <- matrix(NA,ncol=3,nrow=3)
  adjL[[3]][1,2] <- adjL[[3]][2,1] <- data4$adj1N3a.SQ001.[i]
  adjL[[3]][1,3] <- adjL[[3]][3,1] <- data4$adj1N3a.SQ002.[i]
  adjL[[3]][2,3] <- adjL[[3]][3,2] <- data4$adj1N3b.SQ001.[i]

  #4 alters
  adjL[[4]] <- matrix(NA,ncol=4,nrow=4)
  adjL[[4]][1,2] <- adjL[[4]][2,1] <- data4$adj1N4a.SQ001.[i]
  adjL[[4]][1,3] <- adjL[[4]][3,1] <- data4$adj1N4a.SQ002.[i]
  adjL[[4]][1,4] <- adjL[[4]][4,1] <- data4$adj1N4a.SQ003.[i]
  adjL[[4]][2,3] <- adjL[[4]][3,2] <- data4$adj1N4b.SQ001.[i]
  adjL[[4]][2,4] <- adjL[[4]][4,2] <- data4$adj1N4b.SQ002.[i]
  adjL[[4]][3,4] <- adjL[[4]][4,3] <- data4$adj1N4c.SQ001.[i]

  #5 alters
  adjL[[5]] <- matrix(NA,ncol=5,nrow=5)
  adjL[[5]][1,2] <- adjL[[5]][2,1] <- data4$adj1N5a.SQ001.[i]
  adjL[[5]][1,3] <- adjL[[5]][3,1] <- data4$adj1N5a.SQ002.[i]
  adjL[[5]][1,4] <- adjL[[5]][4,1] <- data4$adj1N5a.SQ003.[i]
  adjL[[5]][1,5] <- adjL[[5]][5,1] <- data4$adj1N5a.SQ004.[i]
  adjL[[5]][2,3] <- adjL[[5]][3,2] <- data4$adj1N5b.SQ001.[i]
  adjL[[5]][2,4] <- adjL[[5]][4,2] <- data4$adj1N5b.SQ002.[i]
  adjL[[5]][2,5] <- adjL[[5]][5,2] <- data4$adj1N5b.SQ003.[i]
  adjL[[5]][3,4] <- adjL[[5]][4,3] <- data4$adj1N5c.SQ001.[i]
  adjL[[5]][3,5] <- adjL[[5]][5,3] <- data4$adj1N5c.SQ002.[i]
  adjL[[5]][4,5] <- adjL[[5]][5,4] <- data4$adj1N5d.SQ001.[i]
  }

  if(nnames_cdn>1) { #we only know alter-alter relations for nnames>1
    #take the matrix corresponding the nnames
    mat <- adjL[[nnames_cdn]]
    
    #ties that are (very) close are 1
    mat[!is.na(mat)] <- ifelse(mat[!is.na(mat)]=="Erg hecht" | mat[!is.na(mat)]=="Hecht", 1,0)

    #calculate embeddedness for each alter/row:
    embed <- apply(mat, 1, function(row) {
    n_cols <- sum(!is.na(row))
    n_ones <- sum(row == "1", na.rm = TRUE)
    ratio <- n_ones / n_cols
    return(ratio)
    })
  
  #CDN: 1:nnames_CDN
  alterL[[i]]$cdn_embed.t2[1:nnames_cdn] <- embed 
  }
  
  #STUDY

  #make list of adjacency matrices
  adjL <- list()
  {
  #2 alters
  adjL[[2]] <- matrix(NA,ncol=2,nrow=2)
  adjL[[2]][1,2] <- adjL[[2]][2,1] <- data4$adj2N2a.SQ001.[i]

  #3 alters
  adjL[[3]] <- matrix(NA,ncol=3,nrow=3)
  adjL[[3]][1,2] <- adjL[[3]][2,1] <- data4$adj2N3a.SQ001.[i]
  adjL[[3]][1,3] <- adjL[[3]][3,1] <- data4$adj2N3a.SQ002.[i]
  adjL[[3]][2,3] <- adjL[[3]][3,2] <- data4$adj2N3b.SQ001.[i]

  #4 alters
  adjL[[4]] <- matrix(NA,ncol=4,nrow=4)
  adjL[[4]][1,2] <- adjL[[4]][2,1] <- data4$adj2N4a.SQ001.[i]
  adjL[[4]][1,3] <- adjL[[4]][3,1] <- data4$adj2N4a.SQ002.[i]
  adjL[[4]][1,4] <- adjL[[4]][4,1] <- data4$adj2N4a.SQ003.[i]
  adjL[[4]][2,3] <- adjL[[4]][3,2] <- data4$adj2N4b.SQ001.[i]
  adjL[[4]][2,4] <- adjL[[4]][4,2] <- data4$adj2N4b.SQ002.[i]
  adjL[[4]][3,4] <- adjL[[4]][4,3] <- data4$adj2N4c.SQ001.[i]

  #5 alters
  adjL[[5]] <- matrix(NA,ncol=5,nrow=5)
  adjL[[5]][1,2] <- adjL[[5]][2,1] <- data4$adj2N5a.SQ001.[i]
  adjL[[5]][1,3] <- adjL[[5]][3,1] <- data4$adj2N5a.SQ002.[i]
  adjL[[5]][1,4] <- adjL[[5]][4,1] <- data4$adj2N5a.SQ003.[i]
  adjL[[5]][1,5] <- adjL[[5]][5,1] <- data4$adj2N5a.SQ004.[i]
  adjL[[5]][2,3] <- adjL[[5]][3,2] <- data4$adj2N5b.SQ001.[i]
  adjL[[5]][2,4] <- adjL[[5]][4,2] <- data4$adj2N5b.SQ002.[i]
  adjL[[5]][2,5] <- adjL[[5]][5,2] <- data4$adj2N5b.SQ003.[i]
  adjL[[5]][3,4] <- adjL[[5]][4,3] <- data4$adj2N5c.SQ001.[i]
  adjL[[5]][3,5] <- adjL[[5]][5,3] <- data4$adj2N5c.SQ002.[i]
  adjL[[5]][4,5] <- adjL[[5]][5,4] <- data4$adj2N5d.SQ001.[i]
  }

  if(nnames_study>1) { #we only know alter-alter relations for nnames
    #take the matrix corresponding the nnames
    mat <- adjL[[nnames_study]]
    
    #ties that are (very) close are 1
    mat[!is.na(mat)] <- ifelse(mat[!is.na(mat)]=="Erg hecht" | mat[!is.na(mat)]=="Hecht", 1,0)

    #calculate embeddedness for each alter/row:
    embed <- apply(mat, 1, function(row) {
    n_cols <- sum(!is.na(row))
    n_ones <- sum(row == "1", na.rm = TRUE)
    ratio <- n_ones / n_cols
    return(ratio)
    })
    
    alterL[[i]]$study_embed.t2[6:(5+nnames_study)] <- embed 
  }
  
  # BEST FRIENDS
  #make list of adjacency matrices
  adjL <- list()
  {
  #2 alters
  adjL[[2]] <- matrix(NA,ncol=2,nrow=2)
  adjL[[2]][1,2] <- adjL[[2]][2,1] <- data4$adj3N2a.SQ001.[i]

  #3 alters
  adjL[[3]] <- matrix(NA,ncol=3,nrow=3)
  adjL[[3]][1,2] <- adjL[[3]][2,1] <- data4$adj3N3a.SQ001.[i]
  adjL[[3]][1,3] <- adjL[[3]][3,1] <- data4$adj3N3a.SQ002.[i]
  adjL[[3]][2,3] <- adjL[[3]][3,2] <- data4$adj3N3b.SQ001.[i]

  #4 alters
  adjL[[4]] <- matrix(NA,ncol=4,nrow=4)
  adjL[[4]][1,2] <- adjL[[4]][2,1] <- data4$adj3N4a.SQ001.[i]
  adjL[[4]][1,3] <- adjL[[4]][3,1] <- data4$adj3N4a.SQ002.[i]
  adjL[[4]][1,4] <- adjL[[4]][4,1] <- data4$adj3N4a.SQ003.[i]
  adjL[[4]][2,3] <- adjL[[4]][3,2] <- data4$adj3N4b.SQ001.[i]
  adjL[[4]][2,4] <- adjL[[4]][4,2] <- data4$adj3N4b.SQ002.[i]
  adjL[[4]][3,4] <- adjL[[4]][4,3] <- data4$adj3N4c.SQ001.[i]

  #5 alters
  adjL[[5]] <- matrix(NA,ncol=5,nrow=5)
  adjL[[5]][1,2] <- adjL[[5]][2,1] <- data4$adj3N5a.SQ001.[i]
  adjL[[5]][1,3] <- adjL[[5]][3,1] <- data4$adj3N5a.SQ002.[i]
  adjL[[5]][1,4] <- adjL[[5]][4,1] <- data4$adj3N5a.SQ003.[i]
  adjL[[5]][1,5] <- adjL[[5]][5,1] <- data4$adj3N5a.SQ004.[i]
  adjL[[5]][2,3] <- adjL[[5]][3,2] <- data4$adj3N5b.SQ001.[i]
  adjL[[5]][2,4] <- adjL[[5]][4,2] <- data4$adj3N5b.SQ002.[i]
  adjL[[5]][2,5] <- adjL[[5]][5,2] <- data4$adj3N5b.SQ003.[i]
  adjL[[5]][3,4] <- adjL[[5]][4,3] <- data4$adj3N5c.SQ001.[i]
  adjL[[5]][3,5] <- adjL[[5]][5,3] <- data4$adj3N5c.SQ002.[i]
  adjL[[5]][4,5] <- adjL[[5]][5,4] <- data4$adj3N5d.SQ001.[i]
  }

  if(nnames_bff>1) { #we only know alter-alter relations for nnames
    #take the matrix corresponding the nnames
    mat <- adjL[[nnames_bff]]
    
    #ties that are (very) close are 1
    mat[!is.na(mat)] <- ifelse(mat[!is.na(mat)]=="Erg hecht" | mat[!is.na(mat)]=="Hecht", 1,0)

    #calculate embeddedness for each alter/row:
    embed <- apply(mat, 1, function(row) {
    n_cols <- sum(!is.na(row))
    n_ones <- sum(row == "1", na.rm = TRUE)
    ratio <- n_ones / n_cols
    return(ratio)
    })
    
    alterL[[i]]$bff_embed.t2[11:(10+nnames_bff)] <- embed 
  }

  # SPORTS PARTNERS
  #make list of adjacency matrices
  adjL <- list()
  {
  #2 alters
  adjL[[2]] <- matrix(NA,ncol=2,nrow=2)
  adjL[[2]][1,2] <- adjL[[2]][2,1] <- data4$adj4N2a.SQ001.[i]

  #3 alters
  adjL[[3]] <- matrix(NA,ncol=3,nrow=3)
  adjL[[3]][1,2] <- adjL[[3]][2,1] <- data4$adj4N3a.SQ001.[i]
  adjL[[3]][1,3] <- adjL[[3]][3,1] <- data4$adj4N3a.SQ002.[i]
  adjL[[3]][2,3] <- adjL[[3]][3,2] <- data4$adj4N3b.SQ001.[i]

  #4 alters
  adjL[[4]] <- matrix(NA,ncol=4,nrow=4)
  adjL[[4]][1,2] <- adjL[[4]][2,1] <- data4$adj4N4a.SQ001.[i]
  adjL[[4]][1,3] <- adjL[[4]][3,1] <- data4$adj4N4a.SQ002.[i]
  adjL[[4]][1,4] <- adjL[[4]][4,1] <- data4$adj4N4a.SQ003.[i]
  adjL[[4]][2,3] <- adjL[[4]][3,2] <- data4$adj4N4b.SQ001.[i]
  adjL[[4]][2,4] <- adjL[[4]][4,2] <- data4$adj4N4b.SQ002.[i]
  adjL[[4]][3,4] <- adjL[[4]][4,3] <- data4$adj4N4c.SQ001.[i]

  #5 alters
  adjL[[5]] <- matrix(NA,ncol=5,nrow=5)
  adjL[[5]][1,2] <- adjL[[5]][2,1] <- data4$adj4N5a.SQ001.[i]
  adjL[[5]][1,3] <- adjL[[5]][3,1] <- data4$adj4N5a.SQ002.[i]
  adjL[[5]][1,4] <- adjL[[5]][4,1] <- data4$adj4N5a.SQ003.[i]
  adjL[[5]][1,5] <- adjL[[5]][5,1] <- data4$adj4N5a.SQ004.[i]
  adjL[[5]][2,3] <- adjL[[5]][3,2] <- data4$adj4N5b.SQ001.[i]
  adjL[[5]][2,4] <- adjL[[5]][4,2] <- data4$adj4N5b.SQ002.[i]
  adjL[[5]][2,5] <- adjL[[5]][5,2] <- data4$adj4N5b.SQ003.[i]
  adjL[[5]][3,4] <- adjL[[5]][4,3] <- data4$adj4N5c.SQ001.[i]
  adjL[[5]][3,5] <- adjL[[5]][5,3] <- data4$adj4N5c.SQ002.[i]
  adjL[[5]][4,5] <- adjL[[5]][5,4] <- data4$adj4N5d.SQ001.[i]
  }

  if(nnames_csn>1) { #we only know alter-alter relations for nnames>2
    #take the matrix corresponding the nnames
    mat <- adjL[[nnames_csn]]
    
    #ties that are (very) close are 1
    mat[!is.na(mat)] <- ifelse(mat[!is.na(mat)]=="Erg hecht" | mat[!is.na(mat)]=="Hecht", 1,0)

    #calculate embeddedness for each alter/row:
    embed <- apply(mat, 1, function(row) {
    n_cols <- sum(!is.na(row))
    n_ones <- sum(row == "1", na.rm = TRUE)
    ratio <- n_ones / n_cols
    return(ratio)
    })
    
    alterL[[i]]$csn_embed.t2[16:(15+nnames_csn)] <- embed 
  }
}

#alters could be named in multiple name generators. each element of alterL contains rows corresponding to alters that may be 'duplicates'.
#i match the structural embeddedness measures

for (i in 1:length(alterL)) { #for ego i 
  for (j in 1:nrow(alterL[[i]])) { #for alter j
 
    #if name2 is not empty, alter j was matched to the study network; and more precisely, to the study partner with name1: alterL[[i]]$name2[j]
    alterL[[i]]$study_embed.t2[j] <- ifelse(!is.na(alterL[[i]]$name2[j]), 
                                            alterL[[i]]$study_embed.t2[which(alterL[[i]]$name1==alterL[[i]]$name2[j] & !is.na(alterL[[i]]$study_embed.t2))], 
                                            alterL[[i]]$study_embed.t2[j])
    
    #if name3 is not empty, alter j was matched to the friends network; and more precisely, to the friend with name1: alterL[[i]]$name3[j]
    alterL[[i]]$bff_embed.t2[j] <- ifelse(!is.na(alterL[[i]]$name3[j]), 
                                          alterL[[i]]$bff_embed.t2[which(alterL[[i]]$name1 == alterL[[i]]$name3[j] & !is.na(alterL[[i]]$bff_embed.t2))], 
                                          alterL[[i]]$bff_embed.t2[j])
    
    #if name4 is not empty, alter j was matched to the sports network; and more precisely, to the sports partner with name1: alterL[[i]]$name4[j]
    alterL[[i]]$csn_embed.t2[j] <- ifelse(!is.na(alterL[[i]]$name4[j]), 
                                          alterL[[i]]$csn_embed.t2[which(alterL[[i]]$name1 == alterL[[i]]$name4[j] & !is.na(alterL[[i]]$csn_embed.t2))],
                                          alterL[[i]]$csn_embed.t2[j] )

  }
}

#while in wave 1, only the unique alters were listed in the gender-name interpreters
#in wave 2, only the NEW alters were listed (since it is a stable characteristic)
#so only the non-matched alters that did not appear in w1
#i asked respondents to 'check' males.

#gender
df_males <- data.frame(p1 = data4$males.SQ001.,p2 = data4$males.SQ002.,p3 = data4$males.SQ003.,p4 = data4$males.SQ004.,p5 = data4$males.SQ005.,p6 = data4$males.SQ006.,p7 = data4$males.SQ007.,p8 = data4$males.SQ008.,p9 = data4$males.SQ009.,p10= data4$males.SQ010.,p11= data4$males.SQ011.,p12= data4$males.SQ012.,p13= data4$males.SQ013.,p14= data4$males.SQ014.,p15= data4$males.SQ015.,p16= data4$males.SQ016.,p17= data4$males.SQ017.,p18= data4$males.SQ018.,p19= data4$males.SQ019.,p20= data4$males.SQ020.)

#kin 
df_kin <- data.frame(p1 = data4$kin.SQ001.,p2 = data4$kin.SQ002.,p3 = data4$kin.SQ003.,p4 = data4$kin.SQ004.,p5 = data4$kin.SQ005.,p6 = data4$kin.SQ006.,p7 = data4$kin.SQ007.,p8 = data4$kin.SQ008.,p9 = data4$kin.SQ009., p10= data4$kin.SQ010., p11= data4$kin.SQ011., p12= data4$kin.SQ012., p13= data4$kin.SQ013., p14= data4$kin.SQ014.,p15= data4$kin.SQ015., p16= data4$kin.SQ016., p17= data4$kin.SQ017., p18= data4$kin.SQ018., p19= data4$kin.SQ019., p20= data4$kin.SQ020.)

#age 
df_age <- data.frame(p1 = data4$age.SQ001.,p2 = data4$age.SQ002.,p3 = data4$age.SQ003.,p4 = data4$age.SQ004.,p5 = data4$age.SQ005.,p6 = data4$age.SQ006.,p7 = data4$age.SQ007.,p8 = data4$age.SQ008.,p9 = data4$age.SQ009., p10= data4$age.SQ010., p11= data4$age.SQ011., p12= data4$age.SQ012., p13= data4$age.SQ013., p14= data4$age.SQ014.,p15= data4$age.SQ015., p16= data4$age.SQ016., p17= data4$age.SQ017., p18= data4$age.SQ018., p19= data4$age.SQ019., p20= data4$age.SQ020.)

#educ 
df_educ <- data.frame(p1 = data4$educ.SQ001.,p2 = data4$educ.SQ002.,p3 = data4$educ.SQ003.,p4 = data4$educ.SQ004.,p5 = data4$educ.SQ005.,p6 = data4$educ.SQ006.,p7 = data4$educ.SQ007.,p8 = data4$educ.SQ008.,p9 = data4$educ.SQ009., p10= data4$educ.SQ010., p11= data4$educ.SQ011., p12= data4$educ.SQ012., p13= data4$educ.SQ013., p14= data4$educ.SQ014.,p15= data4$educ.SQ015., p16= data4$educ.SQ016., p17= data4$educ.SQ017., p18= data4$educ.SQ018., p19= data4$educ.SQ019., p20= data4$educ.SQ020.)

#duration 
df_duration <- data.frame(p1 = data4$duur.SQ001.,p2 = data4$duur.SQ002.,p3 = data4$duur.SQ003.,p4 = data4$duur.SQ004.,p5 = data4$duur.SQ005.,p6 = data4$duur.SQ006.,p7 = data4$duur.SQ007.,p8 = data4$duur.SQ008.,p9 = data4$duur.SQ009.,p10= data4$duur.SQ010.,p11= data4$duur.SQ011.,p12= data4$duur.SQ012.,p13= data4$duur.SQ013.,p14= data4$duur.SQ014.,p15= data4$duur.SQ015.,p16= data4$duur.SQ016.,p17= data4$duur.SQ017.,p18= data4$duur.SQ018.,p19= data4$duur.SQ019.,p20= data4$duur.SQ020.)

#proximity
df_proximity <- data.frame(p1 = data4$prox.SQ001.,p2 = data4$prox.SQ002.,p3 = data4$prox.SQ003.,p4 = data4$prox.SQ004.,p5 = data4$prox.SQ005.,p6 = data4$prox.SQ006.,p7 = data4$prox.SQ007.,p8 = data4$prox.SQ008., p9 = data4$prox.SQ009.,p10= data4$prox.SQ010., p11= data4$prox.SQ011., p12= data4$prox.SQ012., p13= data4$prox.SQ013., p14= data4$prox.SQ014., p15= data4$prox.SQ015., p16= data4$prox.SQ016., p17= data4$prox.SQ017., p18= data4$prox.SQ018., p19= data4$prox.SQ019., p20= data4$prox.SQ020.)

#and dynamic
#communication frequency
df_freq <- data.frame(p1 = data4$freq.SQ001.,p2 = data4$freq.SQ002.,p3 = data4$freq.SQ003.,p4 = data4$freq.SQ004.,p5 = data4$freq.SQ005.,p6 = data4$freq.SQ006.,p7 = data4$freq.SQ007.,p8 = data4$freq.SQ008., p9 = data4$freq.SQ009.,p10= data4$freq.SQ010., p11= data4$freq.SQ011., p12= data4$freq.SQ012., p13= data4$freq.SQ013., p14= data4$freq.SQ014., p15= data4$freq.SQ015., p16= data4$freq.SQ016., p17= data4$freq.SQ017., p18= data4$freq.SQ018., p19= data4$freq.SQ019., p20= data4$freq.SQ020.)

#closeness
df_close <- data.frame(p1 = data4$close.SQ001.,p2 = data4$close.SQ002.,p3 = data4$close.SQ003.,p4 = data4$close.SQ004.,p5 = data4$close.SQ005.,p6 = data4$close.SQ006.,p7 = data4$close.SQ007.,p8 = data4$close.SQ008., p9 = data4$close.SQ009.,p10= data4$close.SQ010., p11= data4$close.SQ011., p12= data4$close.SQ012., p13= data4$close.SQ013., p14= data4$close.SQ014., p15= data4$close.SQ015., p16= data4$close.SQ016., p17= data4$close.SQ017., p18= data4$close.SQ018., p19= data4$close.SQ019., p20= data4$close.SQ020.)

for (i in 1:length(alterL)) {
  
  alterL[[i]]$alter_gender <- ifelse(unlist(df_males[i,], use.names=F)=="Ja", 0, ifelse(unlist(df_males[i,], use.names=F)=="Nee", 1, NA))
  
  alterL[[i]]$alter_age <- 
    ifelse(unlist(df_age[i,], use.names=F)=="Jonger dan 18 jaar", 16, #???
           ifelse(unlist(df_age[i,], use.names=F)=="18 tot 21 jaar", 20,
                  ifelse(unlist(df_age[i,], use.names=F)=="22 tot 25 jaar", 23,
                         ifelse(unlist(df_age[i,], use.names=F)=="26 tot 30 jaar", 28,
                                ifelse(unlist(df_age[i,], use.names=F)=="31 tot 40 jaar", 35,
                                       ifelse(unlist(df_age[i,], use.names=F)=="Ouder dan 40 jaar", 45, #???
                                              ifelse(unlist(df_age[i,], use.names=F)=="Weet ik niet", NA, # i don't know = missing
                                                     unlist(df_age[i,], use.names=F))))))))
  alterL[[i]]$kin <- ifelse(unlist(df_kin[i,], use.names=F)=="Ja", 1, ifelse(unlist(df_kin[i,], use.names=F)=="Nee", 0, ""))
  
  alterL[[i]]$alter_educ <- ifelse(unlist(df_educ[i,],use.names=F)=="lagere school", 1,
                               ifelse(unlist(df_educ[i,],use.names=F)=="vmbo, mavo", 2,
                                      ifelse(unlist(df_educ[i,],use.names=F)=="mbo", 3,
                                         ifelse(unlist(df_educ[i,],use.names=F)=="havo", 4,
                                            ifelse(unlist(df_educ[i,],use.names=F)=="vwo / gymnasium", 5,
                                                 ifelse(unlist(df_educ[i,],use.names=F)=="hbo", 6,
                                                     ifelse(unlist(df_educ[i,],use.names=F)=="universiteit", 7, NA))))))) 
  
  alterL[[i]]$proximity <- ifelse(unlist(df_proximity[i,], use.names=FALSE) == "In hetzelfde huis", "roommate",
                                  ifelse(unlist(df_proximity[i,], use.names = FALSE) == "In dezelfde buurt" |
                                    unlist(df_proximity[i,],use.names=F)=="In dezelfde straat" |
                                    unlist(df_proximity[i,],use.names=F)=="In dezelfde gemeente", "close",
                                    ifelse(unlist(df_proximity[i,], use.names = FALSE) == "In hetzelfde land" |
                                             unlist(df_proximity[i,], use.names = FALSE) == "In een ander land","far", NA)))
  
  
  
  alterL[[i]]$duration <- ifelse(unlist(df_duration[i,],use.names=F)=="Minder dan 1 jaar", 0, 
                               ifelse(unlist(df_duration[i,],use.names=F)=="1 tot 3 jaar", 2,
                                      ifelse(unlist(df_duration[i,],use.names=F)=="4 tot 8 jaar", 6,
                                             ifelse(unlist(df_duration[i,],use.names=F)=="9 tot 15 jaar", 12,
                                                    ifelse(unlist(df_duration[i,],use.names=F)=="Meer dan 15 jaar", 15,NA )))))
  
  alterL[[i]]$frequency.t2 <- ifelse(unlist(df_freq[i,],use.names=F)=="(Bijna) elke dag", 7,
                               ifelse(unlist(df_freq[i,],use.names=F)=="1-2 keer per week",6,
                                      ifelse(unlist(df_freq[i,],use.names=F)=="Aantal keer per maand",5, 
                                         ifelse(unlist(df_freq[i,],use.names=F)=="Ong. 1 keer per maand",4, 
                                            ifelse(unlist(df_freq[i,],use.names=F)=="Aantal keer per jaar",3,
                                                 ifelse(unlist(df_freq[i,],use.names=F)=="Ong. 1 keer per jaar",2,
                                                     ifelse(unlist(df_freq[i,],use.names=F)=="Nooit",1, NA )))))))
  alterL[[i]]$closeness.t2 <- ifelse(unlist(df_close[i,],use.names=F)=="Niet hecht", 1, 
                               ifelse(unlist(df_close[i,],use.names=F)=="Enigszins hecht", 2,
                                      ifelse(unlist(df_close[i,],use.names=F)=="Hecht", 3,
                                             ifelse(unlist(df_close[i,],use.names=F)=="Heel erg hecht", 4, NA ))))
}

#match ego-covars (based on 'df'.) 
for (i in 1:length(alterL)) {
  alterL[[i]]$ego_gender <- df$ego_gender[which(df$ego==1)][1]
  alterL[[i]]$ego_age <- df$ego_age[which(df$ego==1)][1]
  alterL[[i]]$ego_educ <- df$ego_educ[which(df$ego==1)][1]
}

#sameness
for (i in 1:length(alterL))  { # for ego i
  # get attributes of ego
  agei <- alterL[[i]]$ego_age[1]
  genderi <- alterL[[i]]$ego_gender[1]
  edi <- alterL[[i]]$ego_educ[1]
  
  for (j in 1:max(alterL[[i]]$alterid)) { # for alter j
    # calculate "same gender" (0/1)
    genderj <- as.numeric(alterL[[i]]$alter_gender[j]) # get alter j gender
    same <- ifelse(genderi==genderj, 1, 0)
    alterL[[i]]$same_gender[which(alterL[[i]]$alterid==j)] <- same
    
    #same education
    eduj <- alterL[[i]]$alter_educ[j]
    same <- ifelse(eduj==edi, 1, 0)
    alterL[[i]]$sim_educ[which(alterL[[i]]$alterid==j)] <- same
    
    # calculate similarity for age as the absolute difference between alter and ego value
    #get alter j attributes
    agej <- as.numeric(alterL[[i]]$alter_age[j])
    #difference score
    difage <- abs(agei - agej)
    
    # so higher values represent *less* similarity
    if( !is.na (agej) ) { # age similarity only calculable if z_j is known!
        alterL[[i]]$dif_age[which(alterL[[i]]$alterid==j)] <- difage
      } else { alterL[[i]]$dif_age[which(alterL[[i]]$alterid==j)] <- NA}
  }
}
  
#in which egonets did altesr appear at t2?
for (i in 1:length(alterL))  { 
  for (j in 1:nrow(alterL[[i]])) {
    
    #get name(s) of j
    alter <- unlist(alterL[[i]][j,c(5:8)], use.names=FALSE)
    alter <- alter[!is.na(alter)] # exclude NAs
    
    #find out alter j appears in the 4 egonets
    cdn <- alter %in% net1[i,]
    study <- alter %in% net2[i,]
    bff <- alter %in% net3[i,]
    csn <- alter %in% net4[i,]
    
    # and if so, give alter j score 1 on indicators; 0 otherwise
    alterL[[i]]$cdn2[j] <- ifelse("TRUE" %in% cdn, 1, 0)
    alterL[[i]]$study2[j] <- ifelse("TRUE" %in% study, 1, 0)
    alterL[[i]]$bff2[j] <- ifelse("TRUE" %in% bff, 1, 0)
    alterL[[i]]$csn2[j] <- ifelse("TRUE" %in% csn, 1, 0)
  }
}

#calculate multiplexity as an alter/tie attribute (i.e., number of *additional* networks j appeared in)
for (i in 1:length(alterL))  {
  for (j in 1:nrow(alterL[[i]])) {
    alterL[[i]]$multiplex.t2[j] <- rowSums(alterL[[i]][j,c(24:27)]) - 1 #minus one to reach a meaningful intercept
  }
}

# i filter out the maintained alters
# by excluding alters with empty strings for gender attribute
for ( i in 1:length(alterL)) {
  alterL[[i]] <- alterL[[i]][which(!is.na(alterL[[i]]$alter_gender) & alterL[[i]]$alter_gender!=""),]
  
    if (nrow(alterL[[i]])>0){ #if no. of created alters > 0
      # replace the alter id: 1 : no. unique alters
      alterL[[i]]$alterid <- 1:nrow(alterL[[i]])
  }
}

#based on this, i make a long dataframe with alters nested in ego.
#first, add an ego_id
for (i in 1:length(alterL)) {
  if(nrow(alterL[[i]]>0)) {
    alterL[[i]]$ego <- i
    alterL[[i]]$respnr <- data$respnr[i]
    }
}

#combine using rbind
df <- do.call(rbind,alterL)

#add network variables; match based on df_maintained
df$cdn.size2 <- df$study.size2 <- df$bff.size2 <- df$csn.size2 <- NA
df$cdn.density2 <- df$study.density2 <- df$bff.density2 <- df$csn.density2 <- NA

for ( i in unique(df$ego)) { 
  df$cdn.size2[which(df$ego == i)] <- df_maintained$cdn.size2[which(df_maintained$ego == i)][1]
  df$study.size2[which(df$ego == i)] <- df_maintained$study.size2[which(df_maintained$ego == i)][1]
  df$bff.size2[which(df$ego == i)] <- df_maintained$bff.size2[which(df_maintained$ego == i)][1]
  df$csn.size2[which(df$ego == i)] <- df_maintained$csn.size2[which(df_maintained$ego == i)][1]
  
  df$cdn.density2[which(df$ego == i)] <- df_maintained$cdn.density2[which(df_maintained$ego == i)][1]
  df$study.density2[which(df$ego == i)] <- df_maintained$study.density2[which(df_maintained$ego == i)][1]
  df$bff.density2[which(df$ego == i)] <- df_maintained$bff.density2[which(df_maintained$ego == i)][1]
  df$csn.density2[which(df$ego == i)] <- df_maintained$csn.density2[which(df_maintained$ego == i)][1]
}

#methodological controls??

df$statusW2 <- "Created"
df_created <- df

#some empty name generator entries were saved, due to a bug.
#empties <- which(is.na(df$name1)) #done using the data with names instead of alter_ids
#save(empties,file="./data/empty_entries_indicators.Rda")
empties <- fload("./data_shared/empty_entries_indicators.Rda")

df_created <- df_created[-empties,]
# bind them together
df_alters <- dplyr::bind_rows(df_maintained, df_created)

# arrange, by ego, and status
df_alters <- df_alters %>%
    arrange(ego, factor(statusW2, levels = c("Maintained", "Created", "Dropped")))
row.names(df_alters) <- 1:nrow(df_alters)


wave 2 –> wave 3

Let’s see whether wave 2 alters were maintained into wave 3.

# first subset from `df_alters` w2-maintained or w2-created alters
test <- df_alters[which(df_alters$statusW2 == "Maintained" | df_alters$statusW2 == "Created"), ]

# make variable indicating whether alter was (re-)named in w3
test$surviveW3 <- NA

# some alters had no 'chance' to reappear, because ego did fill out the last survey
test$w3participation <- NA
for (i in unique(test$respnr)) {
    test$w3participation[which(test$respnr == i)] <- ifelse(i %in% data5$respnr, 1, 0)
}

# fix alter ids, 1:N
for (i in unique(test$respnr)) {
    test$alterid[which(test$respnr == i)] <- 1:length(test$alterid[which(test$respnr == i)])
}

# subset wave 5 matching matrix (matching wave 3 alters to wave 2 alters - either created or
# maintained ) also add respnr
w1w2 <- data5[, c(486:885, ncol(data5))]

for (i in unique(test$respnr)) {
    # for all egos (both those that participated in w3, and those that didnt)

    matchingL <- vector("list", 20)  #pre-allocate empty list of length 20, to store matching matrices
    {
        matchingL[[1]] <- w1w2[which(w1w2$respnr == i), 1:20]
        matchingL[[2]] <- w1w2[which(w1w2$respnr == i), 21:40]
        matchingL[[3]] <- w1w2[which(w1w2$respnr == i), 41:60]
        matchingL[[4]] <- w1w2[which(w1w2$respnr == i), 61:80]
        matchingL[[5]] <- w1w2[which(w1w2$respnr == i), 81:100]
        matchingL[[6]] <- w1w2[which(w1w2$respnr == i), 101:120]
        matchingL[[7]] <- w1w2[which(w1w2$respnr == i), 121:140]
        matchingL[[8]] <- w1w2[which(w1w2$respnr == i), 141:160]
        matchingL[[9]] <- w1w2[which(w1w2$respnr == i), 161:180]
        matchingL[[10]] <- w1w2[which(w1w2$respnr == i), 181:200]
        matchingL[[11]] <- w1w2[which(w1w2$respnr == i), 201:220]
        matchingL[[12]] <- w1w2[which(w1w2$respnr == i), 221:240]
        matchingL[[13]] <- w1w2[which(w1w2$respnr == i), 241:260]
        matchingL[[14]] <- w1w2[which(w1w2$respnr == i), 261:280]
        matchingL[[15]] <- w1w2[which(w1w2$respnr == i), 281:300]
        matchingL[[16]] <- w1w2[which(w1w2$respnr == i), 301:320]
        matchingL[[17]] <- w1w2[which(w1w2$respnr == i), 321:340]
        matchingL[[18]] <- w1w2[which(w1w2$respnr == i), 341:360]
        matchingL[[19]] <- w1w2[which(w1w2$respnr == i), 361:380]
        matchingL[[20]] <- w1w2[which(w1w2$respnr == i), 381:400]
    }
    # find the 'right' matching matrix in this list, by taking the one that contains answers
    ind <- NULL
    for (j in seq_along(matchingL)) {
        # check along the sequence of elements j in the matching matrix list if they are non-empty
        # and not NA
        check <- FALSE
        for (col in matchingL[[j]]) {
            if (!all(is.na(col)) && any(nchar(col) > 0)) {
                check <- TRUE
                break
            }
        }
        if (check) {
            ind <- j
            break
        }
    }
    if (length(ind) > 0) {
        # get the matrix
        mm <- matchingL[[ind]]
        # unlist the answers given
        ans <- unlist(mm, use.names = FALSE)
        # use `stringr` to extract numbers in these answers
        id <- unlist(stringr::str_extract_all(ans, "\\(?[0-9,.]+\\)?"))
        id <- id[!is.na(id)]  #remove NA

        for (k in 1:length(which(test$respnr == i))) {
            # for w2-alters of ego i, with ids 1:k, if alter was renamed, give score 1, if he/she
            # was not renamed give 0, alters who had no chance to reappear due to ego not filling
            # out the survey keep NA.
            test$surviveW3[which(test$respnr == i & test$alterid == k)] <- ifelse(test$alterid[which(test$respnr ==
                i & test$alterid == k)] %in% id, 1, 0)
        }
    }
}

# remaining NAs on `survivew3` among egos who did fill out w3, are due to ego not listing any
# alters.. any(test$w3participation==1 & is.na(test$surviveW3))
# test$respnr[which(test$w3participation==1 & is.na(test$surviveW3))] so, set to 0...
test$surviveW3[which(is.na(test$surviveW3) & test$w3participation == 1)] <- 0

# in which egonet did they (re)appear?
test$cdn3 <- NA
test$study3 <- NA
test$bff3 <- NA
test$csn3 <- NA

# i use the matching matrices of w3; where columns refer to unique w2 alters (maintained and
# created; those of our constructed dataframe) and rows referring to unique w3 alters so, if
# w2-alter/column j is matched to w3-alter/row i, then w2-alter did survive (but we already knew
# that); but more importantly, j was the i^th alter mentioned and this allows me to infer in what
# network j (re-)appeared since cdn = 1-5; study = 6-10; bff = 11-15; csn = 16-20.  however, since
# the rows only include non-duplicate w3-alters; if alter j at t2 was named more than once at t3, i
# only know the first egonet in which j was named...  thus, before i proceed, i use the matching
# matrices that allowed ego to match alters from different egonets to make alter ids for w3 alters;
# and figure out to which egonets they belonged

# first, subset data5, bc we only want names data of egos with w1/w2 alters who participated in w3
data5a <- data5[which(data5$respnr %in% unique(test$respnr[which(test$w3participation == 1)])), ]

# i make a dataframe of w3-alters, with potential duplicates...
df_names <- data.frame(p1 = data5a$egonet1.SQ001., p2 = data5a$egonet1.SQ002., p3 = data5a$egonet1.SQ003.,
    p4 = data5a$egonet1.SQ004., p5 = data5a$egonet1.SQ005., p6 = data5a$egonet2.SQ001., p7 = data5a$egonet2.SQ002.,
    p8 = data5a$egonet2.SQ003., p9 = data5a$egonet2.SQ004., p10 = data5a$egonet2.SQ005., p11 = data5a$egonet3.SQ001.,
    p12 = data5a$egonet3.SQ002., p13 = data5a$egonet3.SQ003., p14 = data5a$egonet3.SQ004., p15 = data5a$egonet3.SQ005.,
    p16 = data5a$egonet4.SQ001., p17 = data5a$egonet4.SQ002., p18 = data5a$egonet4.SQ003., p19 = data5a$egonet4.SQ004.,
    p20 = data5a$egonet4.SQ005.)

# list of dataframes per ego with rows reflecting alters and columns indicating the name(s) of the
# particular alters
alterL <- list()
# loop over all egos, that filled out w3
for (i in 1:nrow(data5a)) {
    alterL[[i]] <- data.frame(alterid = 1:20, name1 = NA, name2 = NA, name3 = NA, name4 = NA)
}

# fill the names based on the names data-frame
for (i in 1:length(alterL)) {
    alterL[[i]]$name1 <- unlist(df_names[i, ], use.names = FALSE)
    alterL[[i]]$name1 <- ifelse(alterL[[i]]$name1 == "", NA, alterL[[i]]$name1)
}

# calculate netsize for each net to get the correct matching matrix
{
    net1 <- cbind(data5a$egonet1.SQ001., data5a$egonet1.SQ002., data5a$egonet1.SQ003., data5a$egonet1.SQ004.,
        data5a$egonet1.SQ005.)
    net1 <- ifelse(net1 == "", NA, net1)
    ns1 <- vector()
    for (i in 1:nrow(net1)) {
        ns1[i] <- length(net1[i, ][which(!is.na(net1[i, ]))])
    }
    net2 <- cbind(data5a$egonet2.SQ001., data5a$egonet2.SQ002., data5a$egonet2.SQ003., data5a$egonet2.SQ004.,
        data5a$egonet2.SQ005.)
    net2 <- ifelse(net2 == "", NA, net2)
    ns2 <- vector()
    for (i in 1:nrow(net2)) {
        ns2[i] <- length(net2[i, ][which(!is.na(net2[i, ]))])
    }
    net3 <- cbind(data5a$egonet3.SQ001., data5a$egonet3.SQ002., data5a$egonet3.SQ003., data5a$egonet3.SQ004.,
        data5a$egonet3.SQ005.)
    net3 <- ifelse(net3 == "", NA, net3)
    ns3 <- vector()
    for (i in 1:nrow(net3)) {
        ns3[i] <- length(net3[i, ][which(!is.na(net3[i, ]))])
    }
    net4 <- cbind(data5a$egonet4.SQ001., data5a$egonet4.SQ002., data5a$egonet4.SQ003., data5a$egonet4.SQ004.,
        data5a$egonet4.SQ005.)
    net4 <- ifelse(net4 == "", NA, net4)
    ns4 <- vector()
    for (i in 1:nrow(net4)) {
        ns4[i] <- length(net4[i, ][which(!is.na(net4[i, ]))])
    }
}
# construct the matching matrices list for egonet1-2
matchingList <- list()
for (i in 1:length(alterL)) {
    matchingL <- list()
    matchingL[[1]] <- cbind(data5a$matching1N1.SQ001_SQ001.[i], data5a$matching1N1.SQ002_SQ001.[i], data5a$matching1N1.SQ003_SQ001.[i],
        data5a$matching1N1.SQ004_SQ001.[i], data5a$matching1N1.SQ005_SQ001.[i])
    matchingL[[2]] <- rbind(cbind(data5a$matching1N2.SQ001_SQ001.[i], data5a$matching1N2.SQ002_SQ001.[i],
        data5a$matching1N2.SQ003_SQ001.[i], data5a$matching1N2.SQ004_SQ001.[i], data5a$matching1N2.SQ005_SQ001.[i]),
        cbind(data5a$matching1N2.SQ001_SQ002.[i], data5a$matching1N2.SQ002_SQ002.[i], data5a$matching1N2.SQ003_SQ002.[i],
            data5a$matching1N2.SQ004_SQ002.[i], data5a$matching1N2.SQ005_SQ002.[i]))
    matchingL[[3]] <- rbind(cbind(data5a$matching1N3.SQ001_SQ001.[i], data5a$matching1N3.SQ002_SQ001.[i],
        data5a$matching1N3.SQ003_SQ001.[i], data5a$matching1N3.SQ004_SQ001.[i], data5a$matching1N3.SQ005_SQ001.[i]),
        cbind(data5a$matching1N3.SQ001_SQ002.[i], data5a$matching1N3.SQ002_SQ002.[i], data5a$matching1N3.SQ003_SQ002.[i],
            data5a$matching1N3.SQ004_SQ002.[i], data5a$matching1N3.SQ005_SQ002.[i]), cbind(data5a$matching1N3.SQ001_SQ003.[i],
            data5a$matching1N3.SQ002_SQ003.[i], data5a$matching1N3.SQ003_SQ003.[i], data5a$matching1N3.SQ004_SQ003.[i],
            data5a$matching1N3.SQ005_SQ003.[i]))
    matchingL[[4]] <- rbind(cbind(data5a$matching1N4.SQ001_SQ001.[i], data5a$matching1N4.SQ002_SQ001.[i],
        data5a$matching1N4.SQ003_SQ001.[i], data5a$matching1N4.SQ004_SQ001.[i], data5a$matching1N4.SQ005_SQ001.[i]),
        cbind(data5a$matching1N4.SQ001_SQ002.[i], data5a$matching1N4.SQ002_SQ002.[i], data5a$matching1N4.SQ003_SQ002.[i],
            data5a$matching1N4.SQ004_SQ002.[i], data5a$matching1N4.SQ005_SQ002.[i]), cbind(data5a$matching1N4.SQ001_SQ003.[i],
            data5a$matching1N4.SQ002_SQ003.[i], data5a$matching1N4.SQ003_SQ003.[i], data5a$matching1N4.SQ004_SQ003.[i],
            data5a$matching1N4.SQ005_SQ003.[i]), cbind(data5a$matching1N4.SQ001_SQ004.[i], data5a$matching1N4.SQ002_SQ004.[i],
            data5a$matching1N4.SQ003_SQ004.[i], data5a$matching1N4.SQ004_SQ004.[i], data5a$matching1N4.SQ005_SQ004.[i]))
    matchingL[[5]] <- rbind(cbind(data5a$matching1N5.SQ001_SQ001.[i], data5a$matching1N5.SQ002_SQ001.[i],
        data5a$matching1N5.SQ003_SQ001.[i], data5a$matching1N5.SQ004_SQ001.[i], data5a$matching1N5.SQ005_SQ001.[i]),
        cbind(data5a$matching1N5.SQ001_SQ002.[i], data5a$matching1N5.SQ002_SQ002.[i], data5a$matching1N5.SQ003_SQ002.[i],
            data5a$matching1N5.SQ004_SQ002.[i], data5a$matching1N5.SQ005_SQ002.[i]), cbind(data5a$matching1N5.SQ001_SQ003.[i],
            data5a$matching1N5.SQ002_SQ003.[i], data5a$matching1N5.SQ003_SQ003.[i], data5a$matching1N5.SQ004_SQ003.[i],
            data5a$matching1N5.SQ005_SQ003.[i]), cbind(data5a$matching1N5.SQ001_SQ004.[i], data5a$matching1N5.SQ002_SQ004.[i],
            data5a$matching1N5.SQ003_SQ004.[i], data5a$matching1N5.SQ004_SQ004.[i], data5a$matching1N5.SQ005_SQ004.[i]),
        cbind(data5a$matching1N5.SQ001_SQ005.[i], data5a$matching1N5.SQ002_SQ005.[i], data5a$matching1N5.SQ003_SQ005.[i],
            data5a$matching1N5.SQ004_SQ005.[i], data5a$matching1N5.SQ005_SQ005.[i]))
    matchingList[[i]] <- matchingL
}  # so... matchingL[[1]][[5]] is matchingmatrix 5 (i.e., 5 alters named in egonet2) for ego 1

# the combination of the matching matrices and the netsizes for ego allows me to match the names
# myself.  for ego i
for (i in 1:length(matchingList)) {
    mL <- matchingList[[i]]  # get the matching list
    ns <- ns2[[i]]  # get the size of egonet2
    if (ns > 0) {
        # if ns=0, no matching was done!
        mm <- as.matrix(mL[[ns]])  # retrieve the corresponding matrix
        matched <- which(mm == 1, arr.ind = T)  # retrieve array indices
        net <- net2[i, ]
        if (length(matched) > 0) {
            # if matching was performed!
            alterL[[i]]$name2[which(alterL[[i]]$alterid == matched[, 2])] <- net[matched[, 1]]
        }
    }
}  #ignore warning

# again, make a matching list for the second matching matrices (i.e., matching egonet3 alters to
# prev. alters);
matchingList2 <- list()
for (i in 1:length(alterL)) {
    # for ego i
    matching2L <- list()
    matching2L[[1]] <- cbind(data5a$matching2N1.SQ001_SQ001.[i], data5a$matching2N1.SQ002_SQ001.[i],
        data5a$matching2N1.SQ003_SQ001.[i], data5a$matching2N1.SQ004_SQ001.[i], data5a$matching2N1.SQ005_SQ001.[i],
        data5a$matching2N1.SQ006_SQ001.[i], data5a$matching2N1.SQ007_SQ001.[i], data5a$matching2N1.SQ008_SQ001.[i],
        data5a$matching2N1.SQ009_SQ001.[i], data5a$matching2N1.SQ010_SQ001.[i])
    matching2L[[2]] <- rbind(cbind(data5a$matching2N2.SQ001_SQ001.[i], data5a$matching2N2.SQ002_SQ001.[i],
        data5a$matching2N2.SQ003_SQ001.[i], data5a$matching2N2.SQ004_SQ001.[i], data5a$matching2N2.SQ005_SQ001.[i],
        data5a$matching2N2.SQ006_SQ001.[i], data5a$matching2N2.SQ007_SQ001.[i], data5a$matching2N2.SQ008_SQ001.[i],
        data5a$matching2N2.SQ009_SQ001.[i], data5a$matching2N2.SQ010_SQ001.[i]), cbind(data5a$matching2N2.SQ001_SQ002.[i],
        data5a$matching2N2.SQ002_SQ002.[i], data5a$matching2N2.SQ003_SQ002.[i], data5a$matching2N2.SQ004_SQ002.[i],
        data5a$matching2N2.SQ005_SQ002.[i], data5a$matching2N2.SQ006_SQ002.[i], data5a$matching2N2.SQ007_SQ002.[i],
        data5a$matching2N2.SQ008_SQ002.[i], data5a$matching2N2.SQ009_SQ002.[i], data5a$matching2N2.SQ010_SQ002.[i]))
    matching2L[[3]] <- rbind(cbind(data5a$matching2N3.SQ001_SQ001.[i], data5a$matching2N3.SQ002_SQ001.[i],
        data5a$matching2N3.SQ003_SQ001.[i], data5a$matching2N3.SQ004_SQ001.[i], data5a$matching2N3.SQ005_SQ001.[i],
        data5a$matching2N3.SQ006_SQ001.[i], data5a$matching2N3.SQ007_SQ001.[i], data5a$matching2N3.SQ008_SQ001.[i],
        data5a$matching2N3.SQ009_SQ001.[i], data5a$matching2N3.SQ010_SQ001.[i]), cbind(data5a$matching2N3.SQ001_SQ002.[i],
        data5a$matching2N3.SQ002_SQ002.[i], data5a$matching2N3.SQ003_SQ002.[i], data5a$matching2N3.SQ004_SQ002.[i],
        data5a$matching2N3.SQ005_SQ002.[i], data5a$matching2N3.SQ006_SQ002.[i], data5a$matching2N3.SQ007_SQ002.[i],
        data5a$matching2N3.SQ008_SQ002.[i], data5a$matching2N3.SQ009_SQ002.[i], data5a$matching2N3.SQ010_SQ002.[i]),
        cbind(data5a$matching2N3.SQ001_SQ003.[i], data5a$matching2N3.SQ002_SQ003.[i], data5a$matching2N3.SQ003_SQ003.[i],
            data5a$matching2N3.SQ004_SQ003.[i], data5a$matching2N3.SQ005_SQ003.[i], data5a$matching2N3.SQ006_SQ003.[i],
            data5a$matching2N3.SQ007_SQ003.[i], data5a$matching2N3.SQ008_SQ003.[i], data5a$matching2N3.SQ009_SQ003.[i],
            data5a$matching2N3.SQ010_SQ003.[i]))
    matching2L[[4]] <- rbind(cbind(data5a$matching2N4.SQ001_SQ001.[i], data5a$matching2N4.SQ002_SQ001.[i],
        data5a$matching2N4.SQ003_SQ001.[i], data5a$matching2N4.SQ004_SQ001.[i], data5a$matching2N4.SQ005_SQ001.[i],
        data5a$matching2N4.SQ006_SQ001.[i], data5a$matching2N4.SQ007_SQ001.[i], data5a$matching2N4.SQ008_SQ001.[i],
        data5a$matching2N4.SQ009_SQ001.[i], data5a$matching2N4.SQ010_SQ001.[i]), cbind(data5a$matching2N4.SQ001_SQ002.[i],
        data5a$matching2N4.SQ002_SQ002.[i], data5a$matching2N4.SQ003_SQ002.[i], data5a$matching2N4.SQ004_SQ002.[i],
        data5a$matching2N4.SQ005_SQ002.[i], data5a$matching2N4.SQ006_SQ002.[i], data5a$matching2N4.SQ007_SQ002.[i],
        data5a$matching2N4.SQ008_SQ002.[i], data5a$matching2N4.SQ009_SQ002.[i], data5a$matching2N4.SQ010_SQ002.[i]),
        cbind(data5a$matching2N4.SQ001_SQ003.[i], data5a$matching2N4.SQ002_SQ003.[i], data5a$matching2N4.SQ003_SQ003.[i],
            data5a$matching2N4.SQ004_SQ003.[i], data5a$matching2N4.SQ005_SQ003.[i], data5a$matching2N4.SQ006_SQ003.[i],
            data5a$matching2N4.SQ007_SQ003.[i], data5a$matching2N4.SQ008_SQ003.[i], data5a$matching2N4.SQ009_SQ003.[i],
            data5a$matching2N4.SQ010_SQ003.[i]), cbind(data5a$matching2N4.SQ001_SQ004.[i], data5a$matching2N4.SQ002_SQ004.[i],
            data5a$matching2N4.SQ003_SQ004.[i], data5a$matching2N4.SQ004_SQ004.[i], data5a$matching2N4.SQ005_SQ004.[i],
            data5a$matching2N4.SQ006_SQ004.[i], data5a$matching2N4.SQ007_SQ004.[i], data5a$matching2N4.SQ008_SQ004.[i],
            data5a$matching2N4.SQ009_SQ004.[i], data5a$matching2N4.SQ010_SQ004.[i]))
    matching2L[[5]] <- rbind(cbind(data5a$matching2N5.SQ001_SQ001.[i], data5a$matching2N5.SQ002_SQ001.[i],
        data5a$matching2N5.SQ003_SQ001.[i], data5a$matching2N5.SQ004_SQ001.[i], data5a$matching2N5.SQ005_SQ001.[i],
        data5a$matching2N5.SQ006_SQ001.[i], data5a$matching2N5.SQ007_SQ001.[i], data5a$matching2N5.SQ008_SQ001.[i],
        data5a$matching2N5.SQ009_SQ001.[i], data5a$matching2N5.SQ010_SQ001.[i]), cbind(data5a$matching2N5.SQ001_SQ002.[i],
        data5a$matching2N5.SQ002_SQ002.[i], data5a$matching2N5.SQ003_SQ002.[i], data5a$matching2N5.SQ004_SQ002.[i],
        data5a$matching2N5.SQ005_SQ002.[i], data5a$matching2N5.SQ006_SQ002.[i], data5a$matching2N5.SQ007_SQ002.[i],
        data5a$matching2N5.SQ008_SQ002.[i], data5a$matching2N5.SQ009_SQ002.[i], data5a$matching2N5.SQ010_SQ002.[i]),
        cbind(data5a$matching2N5.SQ001_SQ003.[i], data5a$matching2N5.SQ002_SQ003.[i], data5a$matching2N5.SQ003_SQ003.[i],
            data5a$matching2N5.SQ004_SQ003.[i], data5a$matching2N5.SQ005_SQ003.[i], data5a$matching2N5.SQ006_SQ003.[i],
            data5a$matching2N5.SQ007_SQ003.[i], data5a$matching2N5.SQ008_SQ003.[i], data5a$matching2N5.SQ009_SQ003.[i],
            data5a$matching2N5.SQ010_SQ003.[i]), cbind(data5a$matching2N5.SQ001_SQ004.[i], data5a$matching2N5.SQ002_SQ004.[i],
            data5a$matching2N5.SQ003_SQ004.[i], data5a$matching2N5.SQ004_SQ004.[i], data5a$matching2N5.SQ005_SQ004.[i],
            data5a$matching2N5.SQ006_SQ004.[i], data5a$matching2N5.SQ007_SQ004.[i], data5a$matching2N5.SQ008_SQ004.[i],
            data5a$matching2N5.SQ009_SQ004.[i], data5a$matching2N5.SQ010_SQ004.[i]), cbind(data5a$matching2N5.SQ001_SQ005.[i],
            data5a$matching2N5.SQ002_SQ005.[i], data5a$matching2N5.SQ003_SQ005.[i], data5a$matching2N5.SQ004_SQ005.[i],
            data5a$matching2N5.SQ005_SQ005.[i], data5a$matching2N5.SQ006_SQ005.[i], data5a$matching2N5.SQ007_SQ005.[i],
            data5a$matching2N5.SQ008_SQ005.[i], data5a$matching2N5.SQ009_SQ005.[i], data5a$matching2N5.SQ010_SQ005.[i]))
    matchingList2[[i]] <- matching2L
}

for (i in 1:length(matchingList2)) {
    # for ego i
    mL <- matchingList2[[i]]  # get the matching list 2
    ns <- ns3[[i]]  # get the size of egonet3
    if (ns > 0) {
        # if ns=0, no matching was done!
        mm <- as.matrix(mL[[ns]])  # and the corresponding matrix
        matched <- which(mm == 1, arr.ind = T)  # retrieve array indices
        net <- net3[i, ]
        if (length(matched) > 0) {
            # if matching was performed!
            alterL[[i]]$name3[matched[, 2]] <- net[matched[, 1]]
        }
    }
}

# same for matching 3 (i.e., egonet4 with egonets 1-3)
matchingList3 <- list()
for (i in 1:length(alterL)) {
    # for ego i
    matching3L <- list()
    matching3L[[1]] <- cbind(data5a$matching3N1.SQ001_SQ001.[i], data5a$matching3N1.SQ002_SQ001.[i],
        data5a$matching3N1.SQ003_SQ001.[i], data5a$matching3N1.SQ004_SQ001.[i], data5a$matching3N1.SQ005_SQ001.[i],
        data5a$matching3N1.SQ006_SQ001.[i], data5a$matching3N1.SQ007_SQ001.[i], data5a$matching3N1.SQ008_SQ001.[i],
        data5a$matching3N1.SQ009_SQ001.[i], data5a$matching3N1.SQ010_SQ001.[i], data5a$matching3N1.SQ011_SQ001.[i],
        data5a$matching3N1.SQ012_SQ001.[i], data5a$matching3N1.SQ013_SQ001.[i], data5a$matching3N1.SQ014_SQ001.[i],
        data5a$matching3N1.SQ015_SQ001.[i])
    matching3L[[2]] <- rbind(cbind(data5a$matching3N2.SQ001_SQ001.[i], data5a$matching3N2.SQ002_SQ001.[i],
        data5a$matching3N2.SQ003_SQ001.[i], data5a$matching3N2.SQ004_SQ001.[i], data5a$matching3N2.SQ005_SQ001.[i],
        data5a$matching3N2.SQ006_SQ001.[i], data5a$matching3N2.SQ007_SQ001.[i], data5a$matching3N2.SQ008_SQ001.[i],
        data5a$matching3N2.SQ009_SQ001.[i], data5a$matching3N2.SQ010_SQ001.[i], data5a$matching3N2.SQ011_SQ001.[i],
        data5a$matching3N2.SQ012_SQ001.[i], data5a$matching3N2.SQ013_SQ001.[i], data5a$matching3N2.SQ014_SQ001.[i],
        data5a$matching3N2.SQ015_SQ001.[i]), cbind(data5a$matching3N2.SQ001_SQ002.[i], data5a$matching3N2.SQ002_SQ002.[i],
        data5a$matching3N2.SQ003_SQ002.[i], data5a$matching3N2.SQ004_SQ002.[i], data5a$matching3N2.SQ005_SQ002.[i],
        data5a$matching3N2.SQ006_SQ002.[i], data5a$matching3N2.SQ007_SQ002.[i], data5a$matching3N2.SQ008_SQ002.[i],
        data5a$matching3N2.SQ009_SQ002.[i], data5a$matching3N2.SQ010_SQ002.[i], data5a$matching3N2.SQ011_SQ002.[i],
        data5a$matching3N2.SQ012_SQ002.[i], data5a$matching3N2.SQ013_SQ002.[i], data5a$matching3N2.SQ014_SQ002.[i],
        data5a$matching3N2.SQ015_SQ002.[i]))
    matching3L[[3]] <- rbind(cbind(data5a$matching3N3.SQ001_SQ001.[i], data5a$matching3N3.SQ002_SQ001.[i],
        data5a$matching3N3.SQ003_SQ001.[i], data5a$matching3N3.SQ004_SQ001.[i], data5a$matching3N3.SQ005_SQ001.[i],
        data5a$matching3N3.SQ006_SQ001.[i], data5a$matching3N3.SQ007_SQ001.[i], data5a$matching3N3.SQ008_SQ001.[i],
        data5a$matching3N3.SQ009_SQ001.[i], data5a$matching3N3.SQ010_SQ001.[i], data5a$matching3N3.SQ011_SQ001.[i],
        data5a$matching3N3.SQ012_SQ001.[i], data5a$matching3N3.SQ013_SQ001.[i], data5a$matching3N3.SQ014_SQ001.[i],
        data5a$matching3N3.SQ015_SQ001.[i]), cbind(data5a$matching3N3.SQ001_SQ002.[i], data5a$matching3N3.SQ002_SQ002.[i],
        data5a$matching3N3.SQ003_SQ002.[i], data5a$matching3N3.SQ004_SQ002.[i], data5a$matching3N3.SQ005_SQ002.[i],
        data5a$matching3N3.SQ006_SQ002.[i], data5a$matching3N3.SQ007_SQ002.[i], data5a$matching3N3.SQ008_SQ002.[i],
        data5a$matching3N3.SQ009_SQ002.[i], data5a$matching3N3.SQ010_SQ002.[i], data5a$matching3N3.SQ011_SQ002.[i],
        data5a$matching3N3.SQ012_SQ002.[i], data5a$matching3N3.SQ013_SQ002.[i], data5a$matching3N3.SQ014_SQ002.[i],
        data5a$matching3N3.SQ015_SQ002.[i]), cbind(data5a$matching3N3.SQ001_SQ003.[i], data5a$matching3N3.SQ002_SQ003.[i],
        data5a$matching3N3.SQ003_SQ003.[i], data5a$matching3N3.SQ004_SQ003.[i], data5a$matching3N3.SQ005_SQ003.[i],
        data5a$matching3N3.SQ006_SQ003.[i], data5a$matching3N3.SQ007_SQ003.[i], data5a$matching3N3.SQ008_SQ003.[i],
        data5a$matching3N3.SQ009_SQ003.[i], data5a$matching3N3.SQ010_SQ003.[i], data5a$matching3N3.SQ011_SQ003.[i],
        data5a$matching3N3.SQ012_SQ003.[i], data5a$matching3N3.SQ013_SQ003.[i], data5a$matching3N3.SQ014_SQ003.[i],
        data5a$matching3N3.SQ015_SQ003.[i]))
    matching3L[[4]] <- rbind(cbind(data5a$matching3N4.SQ001_SQ001.[i], data5a$matching3N4.SQ002_SQ001.[i],
        data5a$matching3N4.SQ003_SQ001.[i], data5a$matching3N4.SQ004_SQ001.[i], data5a$matching3N4.SQ005_SQ001.[i],
        data5a$matching3N4.SQ006_SQ001.[i], data5a$matching3N4.SQ007_SQ001.[i], data5a$matching3N4.SQ008_SQ001.[i],
        data5a$matching3N4.SQ009_SQ001.[i], data5a$matching3N4.SQ010_SQ001.[i], data5a$matching3N4.SQ011_SQ001.[i],
        data5a$matching3N4.SQ012_SQ001.[i], data5a$matching3N4.SQ013_SQ001.[i], data5a$matching3N4.SQ014_SQ001.[i],
        data5a$matching3N4.SQ015_SQ001.[i]), cbind(data5a$matching3N4.SQ001_SQ002.[i], data5a$matching3N4.SQ002_SQ002.[i],
        data5a$matching3N4.SQ003_SQ002.[i], data5a$matching3N4.SQ004_SQ002.[i], data5a$matching3N4.SQ005_SQ002.[i],
        data5a$matching3N4.SQ006_SQ002.[i], data5a$matching3N4.SQ007_SQ002.[i], data5a$matching3N4.SQ008_SQ002.[i],
        data5a$matching3N4.SQ009_SQ002.[i], data5a$matching3N4.SQ010_SQ002.[i], data5a$matching3N4.SQ011_SQ002.[i],
        data5a$matching3N4.SQ012_SQ002.[i], data5a$matching3N4.SQ013_SQ002.[i], data5a$matching3N4.SQ014_SQ002.[i],
        data5a$matching3N4.SQ015_SQ002.[i]), cbind(data5a$matching3N4.SQ001_SQ003.[i], data5a$matching3N4.SQ002_SQ003.[i],
        data5a$matching3N4.SQ003_SQ003.[i], data5a$matching3N4.SQ004_SQ003.[i], data5a$matching3N4.SQ005_SQ003.[i],
        data5a$matching3N4.SQ006_SQ003.[i], data5a$matching3N4.SQ007_SQ003.[i], data5a$matching3N4.SQ008_SQ003.[i],
        data5a$matching3N4.SQ009_SQ003.[i], data5a$matching3N4.SQ010_SQ003.[i], data5a$matching3N4.SQ011_SQ003.[i],
        data5a$matching3N4.SQ012_SQ003.[i], data5a$matching3N4.SQ013_SQ003.[i], data5a$matching3N4.SQ014_SQ003.[i],
        data5a$matching3N4.SQ015_SQ003.[i]), cbind(data5a$matching3N4.SQ001_SQ003.[i], data5a$matching3N4.SQ002_SQ003.[i],
        data5a$matching3N4.SQ003_SQ003.[i], data5a$matching3N4.SQ004_SQ003.[i], data5a$matching3N4.SQ005_SQ003.[i],
        data5a$matching3N4.SQ006_SQ003.[i], data5a$matching3N4.SQ007_SQ003.[i], data5a$matching3N4.SQ008_SQ003.[i],
        data5a$matching3N4.SQ009_SQ003.[i], data5a$matching3N4.SQ010_SQ003.[i], data5a$matching3N4.SQ011_SQ003.[i],
        data5a$matching3N4.SQ012_SQ003.[i], data5a$matching3N4.SQ013_SQ003.[i], data5a$matching3N4.SQ014_SQ003.[i],
        data5a$matching3N4.SQ015_SQ003.[i]), cbind(data5a$matching3N4.SQ001_SQ004.[i], data5a$matching3N4.SQ002_SQ004.[i],
        data5a$matching3N4.SQ003_SQ004.[i], data5a$matching3N4.SQ004_SQ004.[i], data5a$matching3N4.SQ005_SQ004.[i],
        data5a$matching3N4.SQ006_SQ004.[i], data5a$matching3N4.SQ007_SQ004.[i], data5a$matching3N4.SQ008_SQ004.[i],
        data5a$matching3N4.SQ009_SQ004.[i], data5a$matching3N4.SQ010_SQ004.[i], data5a$matching3N4.SQ011_SQ004.[i],
        data5a$matching3N4.SQ012_SQ004.[i], data5a$matching3N4.SQ013_SQ004.[i], data5a$matching3N4.SQ014_SQ004.[i],
        data5a$matching3N4.SQ015_SQ004.[i]))
    matching3L[[5]] <- rbind(cbind(data5a$matching3N5.SQ001_SQ001.[i], data5a$matching3N5.SQ002_SQ001.[i],
        data5a$matching3N5.SQ003_SQ001.[i], data5a$matching3N5.SQ004_SQ001.[i], data5a$matching3N5.SQ005_SQ001.[i],
        data5a$matching3N5.SQ006_SQ001.[i], data5a$matching3N5.SQ007_SQ001.[i], data5a$matching3N5.SQ008_SQ001.[i],
        data5a$matching3N5.SQ009_SQ001.[i], data5a$matching3N5.SQ010_SQ001.[i], data5a$matching3N5.SQ011_SQ001.[i],
        data5a$matching3N5.SQ012_SQ001.[i], data5a$matching3N5.SQ013_SQ001.[i], data5a$matching3N5.SQ014_SQ001.[i],
        data5a$matching3N5.SQ015_SQ001.[i]), cbind(data5a$matching3N5.SQ001_SQ002.[i], data5a$matching3N5.SQ002_SQ002.[i],
        data5a$matching3N5.SQ003_SQ002.[i], data5a$matching3N5.SQ004_SQ002.[i], data5a$matching3N5.SQ005_SQ002.[i],
        data5a$matching3N5.SQ006_SQ002.[i], data5a$matching3N5.SQ007_SQ002.[i], data5a$matching3N5.SQ008_SQ002.[i],
        data5a$matching3N5.SQ009_SQ002.[i], data5a$matching3N5.SQ010_SQ002.[i], data5a$matching3N5.SQ011_SQ002.[i],
        data5a$matching3N5.SQ012_SQ002.[i], data5a$matching3N5.SQ013_SQ002.[i], data5a$matching3N5.SQ014_SQ002.[i],
        data5a$matching3N5.SQ015_SQ002.[i]), cbind(data5a$matching3N5.SQ001_SQ003.[i], data5a$matching3N5.SQ002_SQ003.[i],
        data5a$matching3N5.SQ003_SQ003.[i], data5a$matching3N5.SQ004_SQ003.[i], data5a$matching3N5.SQ005_SQ003.[i],
        data5a$matching3N5.SQ006_SQ003.[i], data5a$matching3N5.SQ007_SQ003.[i], data5a$matching3N5.SQ008_SQ003.[i],
        data5a$matching3N5.SQ009_SQ003.[i], data5a$matching3N5.SQ010_SQ003.[i], data5a$matching3N5.SQ011_SQ003.[i],
        data5a$matching3N5.SQ012_SQ003.[i], data5a$matching3N5.SQ013_SQ003.[i], data5a$matching3N5.SQ014_SQ003.[i],
        data5a$matching3N5.SQ015_SQ003.[i]), cbind(data5a$matching3N5.SQ001_SQ003.[i], data5a$matching3N5.SQ002_SQ003.[i],
        data5a$matching3N5.SQ003_SQ003.[i], data5a$matching3N5.SQ004_SQ003.[i], data5a$matching3N5.SQ005_SQ003.[i],
        data5a$matching3N5.SQ006_SQ003.[i], data5a$matching3N5.SQ007_SQ003.[i], data5a$matching3N5.SQ008_SQ003.[i],
        data5a$matching3N5.SQ009_SQ003.[i], data5a$matching3N5.SQ010_SQ003.[i], data5a$matching3N5.SQ011_SQ003.[i],
        data5a$matching3N5.SQ012_SQ003.[i], data5a$matching3N5.SQ013_SQ003.[i], data5a$matching3N5.SQ014_SQ003.[i],
        data5a$matching3N5.SQ015_SQ003.[i]), cbind(data5a$matching3N5.SQ001_SQ005.[i], data5a$matching3N5.SQ002_SQ005.[i],
        data5a$matching3N5.SQ003_SQ005.[i], data5a$matching3N5.SQ004_SQ005.[i], data5a$matching3N5.SQ005_SQ005.[i],
        data5a$matching3N5.SQ006_SQ005.[i], data5a$matching3N5.SQ007_SQ005.[i], data5a$matching3N5.SQ008_SQ005.[i],
        data5a$matching3N5.SQ009_SQ005.[i], data5a$matching3N5.SQ010_SQ005.[i], data5a$matching3N5.SQ011_SQ005.[i],
        data5a$matching3N5.SQ012_SQ005.[i], data5a$matching3N5.SQ013_SQ005.[i], data5a$matching3N5.SQ014_SQ005.[i],
        data5a$matching3N5.SQ015_SQ005.[i]))
    matchingList3[[i]] <- matching3L
}

for (i in 1:length(matchingList3)) {
    # for ego i
    mL <- matchingList3[[i]]  # get the matching list 2
    ns <- ns4[[i]]  # get the size of egonet4
    if (ns > 0) {
        # if ns=0, no matching was done!
        mm <- as.matrix(mL[[ns]])  # and the corresponding matrix
        matched <- which(mm == 1, arr.ind = T)  # retrieve array indices
        net <- net4[i, ]
        if (length(matched) > 0) {
            # if matching was performed!
            alterL[[i]]$name4[matched[, 2]] <- net[matched[, 1]]
        }
    }
}

# make long df with w3 alters in ego, and indicators for 4 egonets;
df2 <- data.frame(ego = rep(1:length(alterL), each = 20), alter = rep(1:20), cdn = NA, study = NA, bff = NA,
    csn = NA)

for (i in unique(df2$ego)) {
    for (j in 1:20) {
        # for alters nested in ego find out if names denoting alter j appear in the 4 egonets
        alter <- unlist(alterL[[i]][j, -1], use.names = F)  # get names alter j
        alter <- alter[!is.na(alter)]  # exclude NAs
        cdn <- alter %in% net1[i, ]
        study <- alter %in% net2[i, ]
        bff <- alter %in% net3[i, ]
        csn <- alter %in% net4[i, ]
        # and if so, give alter j score 1 on indicators; 0 otherwise
        df2$cdn[which(df2$ego == i & df2$alter == j)] <- ifelse("TRUE" %in% cdn, 1, 0)
        df2$study[which(df2$ego == i & df2$alter == j)] <- ifelse("TRUE" %in% study, 1, 0)
        df2$bff[which(df2$ego == i & df2$alter == j)] <- ifelse("TRUE" %in% bff, 1, 0)
        df2$csn[which(df2$ego == i & df2$alter == j)] <- ifelse("TRUE" %in% csn, 1, 0)
    }
}

# now that i have, for each alter of ego (including duplicates) at t2, the nets to which they
# belong..  i continue with the w1-w2 matching matrices

# we already subsetted the matching matrices (in `w1w2`), but now we take only the rows
# corresponding to w3 egos who have w2 maintained/created alters
w1w2 <- w1w2[which(w1w2$respnr %in% unique(test$respnr[which(test$w3participation == 1)])), ]

for (i in 1:length(alterL)) {

    matchingL <- vector("list", 20)  #pre-allocate empty list of length 20, to store matching matrices
    {
        matchingL[[1]] <- w1w2[i, 1:20]
        matchingL[[2]] <- w1w2[i, 21:40]
        matchingL[[3]] <- w1w2[i, 41:60]
        matchingL[[4]] <- w1w2[i, 61:80]
        matchingL[[5]] <- w1w2[i, 81:100]
        matchingL[[6]] <- w1w2[i, 101:120]
        matchingL[[7]] <- w1w2[i, 121:140]
        matchingL[[8]] <- w1w2[i, 141:160]
        matchingL[[9]] <- w1w2[i, 161:180]
        matchingL[[10]] <- w1w2[i, 181:200]
        matchingL[[11]] <- w1w2[i, 201:220]
        matchingL[[12]] <- w1w2[i, 221:240]
        matchingL[[13]] <- w1w2[i, 241:260]
        matchingL[[14]] <- w1w2[i, 261:280]
        matchingL[[15]] <- w1w2[i, 281:300]
        matchingL[[16]] <- w1w2[i, 301:320]
        matchingL[[17]] <- w1w2[i, 321:340]
        matchingL[[18]] <- w1w2[i, 341:360]
        matchingL[[19]] <- w1w2[i, 361:380]
        matchingL[[20]] <- w1w2[i, 381:400]
    }

    # find the 'right' matching matrix in this list, by taking the one that contains answers
    ind <- NULL
    for (j in seq_along(matchingL)) {
        # check along the sequence of elements j in the matching matrix list if they are non-empty
        # and not NA
        check <- FALSE
        for (col in matchingL[[j]]) {
            if (!all(is.na(col)) && any(nchar(col) > 0)) {
                check <- TRUE
                break
            }
        }
        if (check) {
            ind <- j
            break
        }
    }
    if (length(ind) > 0) {
        # get the matrix
        mm <- matchingL[[ind]]

        # extract alter ids
        ans <- stringr::str_extract_all(mm, "\\(?[0-9,.]+\\)?")
        # here, the object refers to the w2-alter j; and the element indicator in the list refers
        # to the w3-alter

        for (j in unique(test$alterid[which(test$ego == unique(test$ego[which(test$w3participation ==
            1)])[i])])) {
            # for wave-2 alter j

            # to which row/w3-alter was alter j matched?
            match <- which(ans == j)

            # and in which networks did this w3-alter belong?
            nets <- df2[which(df2$ego == i & df2$alter == match[1]), ]

            if (length(match) > 0) {
                # if j was matched to w3-alters...

                # assign to alter j the networks in which the w3-alter appeared
                test$cdn3[which(test$ego == unique(test$ego[which(test$w3participation == 1)])[i] & test$alterid ==
                  j)] <- nets$cdn[1]
                test$study3[which(test$ego == unique(test$ego[which(test$w3participation == 1)])[i] &
                  test$alterid == j)] <- nets$study[1]
                test$bff3[which(test$ego == unique(test$ego[which(test$w3participation == 1)])[i] & test$alterid ==
                  j)] <- nets$bff[1]
                test$csn3[which(test$ego == unique(test$ego[which(test$w3participation == 1)])[i] & test$alterid ==
                  j)] <- nets$csn[1]
            }
        }
    }
}

# also add dynamic relational info on closeness and communication frequency in w3, this was only
# asked for alters from w2 (those maintained from w1 or w2-created)!
test$frequency.t3 <- NA
test$closeness.t3 <- NA

# subset w3 name interpreters on contact freq. of w1 alters (sq021 - sq040!)
# tail(names(data5a),234)
freq <- data5a[, c(1106:1125)]
close <- data5a[, c(1126:1145)]

# recode into numeric values;
freq <- ifelse(freq == "(Bijna) elke dag", 7, ifelse(freq == "1-2 keer per week", 6, ifelse(freq == "Aantal keer per maand",
    5, ifelse(freq == "Ong. 1 keer per maand", 4, ifelse(freq == "Aantal keer per jaar", 3, ifelse(freq ==
        "Ong. 1 keer per jaar", 2, ifelse(freq == "Nooit", 1, NA)))))))
close <- ifelse(close == "Heel erg hecht", 4, ifelse(close == "Hecht", 3, ifelse(close == "Enigszins hecht",
    2, ifelse(close == "Niet hecht", 1, NA))))

for (i in 1:length(alterL)) {
    # for ego i for wave-2 alter j
    for (j in unique(test$alterid[which(test$ego == unique(test$ego[which(test$w3participation == 1)])[i])])) {

        test$frequency.t3[which(test$ego == unique(test$ego[which(test$w3participation == 1)])[i] & test$alterid ==
            j)] <- freq[i, ][!is.na(freq[i, ])][j]

        test$closeness.t3[which(test$ego == unique(test$ego[which(test$w3participation == 1)])[i] & test$alterid ==
            j)] <- close[i, ][!is.na(close[i, ])][j]
    }
}

# last, add respnodent's reasons for not renaming a w2-alter. this was only asked for w2 alters who
# were not relisted
test$reason <- NA

# subset reasons given for not renaming a w2-alter tail(names(data5a),243)
reasons <- data5a[, c(1146:1165)]
# unique(reasons$vergeten.SQ001.)  if, according to ego, the relationship with alter changed ('Onze
# relatie is veranderd.'), we probed further
reasons2 <- data5a[, c(1186:1205)]

for (i in 1:length(alterL)) {
    # for ego i

    # if any w2-alter of i went unlisted (thus, scored 0 on `surviveW3`)...

    if (0 %in% test$surviveW3[which(test$ego == unique(test$ego[which(test$w3participation == 1)])[i])]) {

        # for *non-renamed* alter j
        for (j in unique(test$alterid[which(test$ego == unique(test$ego[which(test$w3participation ==
            1)])[i] & test$surviveW3 == 0)])) {

            # get respondent i's reason for not re-naming j,
            reasonij <- reasons[i, j]
            # if it was due to a change in relationship, probe further
            reasonij <- ifelse(reasonij == "Onze relatie is veranderd.", reasons2[i, j], reasonij)
            # and if the relationship changed in other ways than we offered as choices, just set to
            # 'other'
            reasonij <- ifelse(reasonij == "De relatie is op een andere manier veranderd.", "Andere reden.",
                reasonij)

            test$reason[which(test$ego == unique(test$ego[which(test$w3participation == 1)])[i] & test$alterid ==
                j)] <- reasonij
        }
    }
}

# recode... unique(test$reason)
test$reason <- ifelse(test$reason == "Andere reden.", "miscellaneous", ifelse(test$reason == "Er is geen gelegenheid geweest voor ons om contact te hebben.",
    "no occasion to get together", ifelse(test$reason == "Eén van ons is verhuisd.", "someone moved",
        ifelse(test$reason == "Eén van ons heeft een belangrijke verandering doorgemaakt  (zoals het stoppen met studeren, het aangaan/beëindigen van een relatie, het krijgen van een kind, enzovoort).",
            "other life event", ifelse(test$reason == "Eén van ons heeft gezondheidsproblemen.", "other life event",
                ifelse(test$reason == "We zijn uit elkaar gegroeid/de relatie is verwaterd.", "drifted apart",
                  ifelse(test$reason == "We hadden meningsverschillen of ruzie.", "disagreement / conflict",
                    ifelse(test$reason == "Ik ben simpelweg vergeten om deze persoon opnieuw te noemen.",
                      "forgotten", test$reason))))))))

data_alters23 <- test
# now 'bind back together'
test <- df_alters[which(df_alters$statusW2 == "Dropped"), ]
df_alters <- bind_rows(test, data_alters23)

# rearrange, by ego, and status
df_alters <- df_alters %>%
    arrange(ego, factor(statusW2, levels = c("Maintained", "Created", "Dropped")))
row.names(df_alters) <- 1:nrow(df_alters)

# new alter ids, 1:n_alter
for (i in unique(df_alters$ego)) {
    df_alters$alterid[which(df_alters$ego == i)] <- 1:length(df_alters$alterid[which(df_alters$ego ==
        i)])
}

# exclude 'names'
df_alters.nn <- df_alters[, -c(5:8)]

# save the resulting dataframe (exclude names)
fsave(df_alters.nn, "tie_maintenance.RDa")


data_nested.Rda

To account for the nesting structure of our data (i.e., ties are nested in dyads and networks, that are both nested in ego), we use a 3-level design. So transform the data accordingly. We do this separately for wave 1 –> wave 2, and wave 2 –> wave 3.

First, tidy up the data-frame (deleting stuff that we won’t need + re-ordering columns)

# in our analyses, we only include non-kin
df <- df_alters.nn[which(df_alters.nn$kin == 0), ]
nrow(df)  #n=4653

# set gender to binary
df$ego_female <- ifelse(df$ego_gender == 2, 1, df$ego_gender)
df$alter_female <- ifelse(df$alter_gender == 2, 1, df$alter_gender)

# drop columns we won't need
names(df)
delete <- c(1, 5, 15, 21:25, 27, 28, 30, 33, 38, 52, 72:88)
df <- df[, -delete]

# reorder
names(df)

order <- c("ego", "ego_female", "ego_age", "ego_educ", "study.year", "romantic", "extraversion", "fin_restr",
    "housing.transition_bin", "occupation.transition_bin", "educ_father", "educ_mother", "cdn.size",
    "cdn.size2", "study.size", "study.size2", "bff.size", "bff.size2", "csn.size", "csn.size2", "cdn.density",
    "cdn.density2", "study.density", "study.density2", "bff.density", "bff.density2", "csn.density",
    "csn.density2", "alterid", "alter_female", "alter_age", "alter_educ", "same_gender", "dif_age", "sim_educ",
    "proximity", "duration", "frequency.t1", "frequency.t2", "frequency.t3", "closeness.t1", "closeness.t2",
    "closeness.t3", "multiplex", "multiplex.t2", "cdn1", "cdn2", "cdn3", "study1", "study2", "study3",
    "bff1", "bff2", "bff3", "csn1", "csn2", "csn3", "cdn_embed.t1", "cdn_embed.t2", "study_embed.t1",
    "study_embed.t2", "bff_embed.t1", "bff_embed.t2", "csn_embed.t1", "csn_embed.t2", "statusW2", "w3participation",
    "reason")

df <- df[, order]

# multiplex t2
df$multiplex.t2 <- rowSums(df[, c("cdn2", "study2", "bff2", "csn2")]) - 1


wave 1 –> wave 2

# in analyzing waves 1 and 2, we look at w1 alters and see whether they are maintained or dropped
# so, drop w2-created alters
df1 <- df[-which(df$statusW2 == "Created"), ]
nrow(df1)  #n=3174

# make seperate datasets for each relational dimension (at t1)
df.cdn <- df1[which(df1$cdn1 == 1), ]
df.study <- df1[which(df1$study1 == 1), ]
df.bff <- df1[which(df1$bff1 == 1), ]
df.csn <- df1[which(df1$csn1 == 1), ]

# rbind the multiple datasets

# but first, a. make new Y (i.e., remain in *same* egonet); make new variables for features
# depending on the particular egonet (eg size, embeddedness)
df.cdn$Y <- ifelse(is.na(df.cdn$cdn2), 0, df.cdn$cdn2)
df.study$Y <- ifelse(is.na(df.study$study2), 0, df.study$study2)
df.bff$Y <- ifelse(is.na(df.bff$bff2), 0, df.bff$bff2)
df.csn$Y <- ifelse(is.na(df.csn$csn2), 0, df.csn$csn2)

df.cdn$tie <- "Confidant"
df.study$tie <- "Study"
df.bff$tie <- "Friend"
df.csn$tie <- "Sport"

df.cdn$density <- df.cdn$cdn.density
df.bff$density <- df.bff$bff.density
df.study$density <- df.study$study.density
df.csn$density <- df.csn$csn.density

df.cdn$size <- df.cdn$cdn.size
df.bff$size <- df.bff$bff.size
df.study$size <- df.study$study.size
df.csn$size <- df.csn$csn.size

df.cdn$embed <- df.cdn$cdn_embed.t1
df.bff$embed <- df.bff$bff_embed.t1
df.study$embed <- df.study$study_embed.t1
df.csn$embed <- df.csn$csn_embed.t1

# also include 'extended' embeddedness, or a the extent to which an alter appearing in the egonet
# of ego is also embedded in additional layers of ego's network. we calculate the sum of
# embeddedness scores in additional networks, where NA = 0.
df.cdn$embed.ext <- rowSums(cbind(ifelse(is.na(df.cdn$bff_embed.t1), 0, df.cdn$bff_embed.t1), ifelse(is.na(df.cdn$study_embed.t1),
    0, df.cdn$study_embed.t1), ifelse(is.na(df.cdn$csn_embed.t1), 0, df.cdn$csn_embed.t1)))
df.bff$embed.ext <- rowSums(cbind(ifelse(is.na(df.bff$cdn_embed.t1), 0, df.bff$cdn_embed.t1), ifelse(is.na(df.bff$study_embed.t1),
    0, df.bff$study_embed.t1), ifelse(is.na(df.bff$csn_embed.t1), 0, df.bff$csn_embed.t1)))
df.study$embed.ext <- rowSums(cbind(ifelse(is.na(df.study$cdn_embed.t1), 0, df.study$cdn_embed.t1), ifelse(is.na(df.study$bff_embed.t1),
    0, df.study$bff_embed.t1), ifelse(is.na(df.study$csn_embed.t1), 0, df.study$csn_embed.t1)))
df.csn$embed.ext <- rowSums(cbind(ifelse(is.na(df.csn$cdn_embed.t1), 0, df.csn$cdn_embed.t1), ifelse(is.na(df.csn$bff_embed.t1),
    0, df.csn$bff_embed.t1), ifelse(is.na(df.csn$study_embed.t1), 0, df.csn$study_embed.t1)))

data <- rbind(df.cdn, df.bff, df.study, df.csn)

# add combination of tie and ego, to make a 'network' variable (i.e., networks are nested in ego,
# and thus unique to ego)
data$network <- paste0(data$tie, data$ego)

# reorder by ego and alter
data <- data[order(data$ego, data$alterid), ]
row.names(data) <- 1:nrow(data)

# set NAs on str. embededness to 0 (for those that were named as the only alter)
data$embed[is.na(data$embed)] <- 0

# keep only columns of interest
names(data)
data <- data[, c(1:12, 29:38, 41, 44, 46, 49, 52, 55, 66, 69:75)]

# make unique alter id
data$alterid <- paste0(data$ego, "X", data$alterid)

# listwise deletion
colSums(is.na(data))  #missings per variable

# table(data$proximity, useNA='always') prop.table(table(data$proximity, useNA='always'))
data$proximity <- ifelse(is.na(data$proximity), "far", data$proximity)  #some don't knows on alter proximity, set to 'far'

data <- data[which(complete.cases(data)), ]

data12 <- data


wave 2 –> wave 3

# in analyzing waves 2 and 3, we look at w2-alters (maintained / created) so, drop w2-dropped and
# only of egos who participated in w3
df2 <- df[-which(df$statusW2 == "Dropped"), ]
df2 <- df2[df2$w3participation == 1, ]

# make seperate datasets for each relational dimension (at t2)
df.cdn <- df2[which(df2$cdn2 == 1), ]
df.study <- df2[which(df2$study2 == 1), ]
df.bff <- df2[which(df2$bff2 == 1), ]
df.csn <- df2[which(df2$csn2 == 1), ]

# rbind the multiple datasets

# but first, a. make new Y (i.e., remain in *same* egonet); make new variables for features
# depending on the particular egonet (eg size, embeddedness)

df.cdn$Y <- ifelse(is.na(df.cdn$cdn3), 0, df.cdn$cdn3)
df.study$Y <- ifelse(is.na(df.study$study3), 0, df.study$study3)
df.bff$Y <- ifelse(is.na(df.bff$bff3), 0, df.bff$bff3)
df.csn$Y <- ifelse(is.na(df.csn$csn3), 0, df.csn$csn3)

df.cdn$tie <- "Confidant"
df.study$tie <- "Study"
df.bff$tie <- "Friend"
df.csn$tie <- "Sport"

df.cdn$density <- df.cdn$cdn.density2
df.bff$density <- df.bff$bff.density2
df.study$density <- df.study$study.density2
df.csn$density <- df.csn$csn.density2

df.cdn$size <- df.cdn$cdn.size2
df.bff$size <- df.bff$bff.size2
df.study$size <- df.study$study.size2
df.csn$size <- df.csn$csn.size2

df.cdn$embed <- df.cdn$cdn_embed.t2
df.bff$embed <- df.bff$bff_embed.t2
df.study$embed <- df.study$study_embed.t2
df.csn$embed <- df.csn$csn_embed.t2

# also include 'extended' embeddedness, or a the extent to which an alter appearing in the egonet
# of ego is also embedded in additional layers of ego's network. we calculate the sum of
# embeddedness scores in additional networks, where NA = 0.
df.cdn$embed.ext <- rowSums(cbind(ifelse(is.na(df.cdn$bff_embed.t2), 0, df.cdn$bff_embed.t2), ifelse(is.na(df.cdn$study_embed.t2),
    0, df.cdn$study_embed.t2), ifelse(is.na(df.cdn$csn_embed.t2), 0, df.cdn$csn_embed.t2)))
df.bff$embed.ext <- rowSums(cbind(ifelse(is.na(df.bff$cdn_embed.t2), 0, df.bff$cdn_embed.t2), ifelse(is.na(df.bff$study_embed.t2),
    0, df.bff$study_embed.t2), ifelse(is.na(df.bff$csn_embed.t2), 0, df.bff$csn_embed.t2)))
df.study$embed.ext <- rowSums(cbind(ifelse(is.na(df.study$cdn_embed.t2), 0, df.study$cdn_embed.t2), ifelse(is.na(df.study$bff_embed.t2),
    0, df.study$bff_embed.t2), ifelse(is.na(df.study$csn_embed.t2), 0, df.study$csn_embed.t2)))
df.csn$embed.ext <- rowSums(cbind(ifelse(is.na(df.csn$cdn_embed.t2), 0, df.csn$cdn_embed.t2), ifelse(is.na(df.csn$bff_embed.t2),
    0, df.csn$bff_embed.t2), ifelse(is.na(df.csn$study_embed.t2), 0, df.csn$study_embed.t2)))

data <- rbind(df.cdn, df.bff, df.study, df.csn)

# add combination of tie and ego, to make a 'network' variable (i.e., networks are nested in ego,
# and thus unique to ego)
data$network <- paste0(data$tie, data$ego)

# reorder by ego and alter
data <- data[order(data$ego, data$alterid), ]
row.names(data) <- 1:nrow(data)

# set NAs on str. embededness to 0 (for those that were named as the only alter)
data$embed[is.na(data$embed)] <- 0

# keep only columns of interest
names(data)

data <- data[, c(1:12, 29:37, 39, 42, 45, 47, 50, 53, 56, 66, 68:75)]
# here include also `statusW2` (created vs maintained) + `reason` for not renaming alter

data$multiplex <- data$multiplex.t2
names(data)
data <- data[, -24]

# make unique alter id
data$alterid <- paste0(data$ego, "X", data$alterid)

# listwise deletion
colSums(is.na(data))  #missings per variable
data$proximity <- ifelse(is.na(data$proximity), "far", data$proximity)

i = unique(data$ego)[1]

# ego covariates among 'created' alters are still empty, so match based on ego id note that
# transitions were not measured between w2w3, so they are NAs
for (i in unique(data$ego)) {

    data$educ_father[data$ego == i & data$statusW2 == "Created"] <- df$educ_father[df$ego == i & (df$statusW2 ==
        "Maintained" | df$statusW2 == "Dropped")][1]
    data$educ_mother[data$ego == i & data$statusW2 == "Created"] <- df$educ_mother[df$ego == i & (df$statusW2 ==
        "Maintained" | df$statusW2 == "Dropped")][1]
    data$study.year[data$ego == i & data$statusW2 == "Created"] <- df$study.year[df$ego == i & (df$statusW2 ==
        "Maintained" | df$statusW2 == "Dropped")][1]
    data$extraversion[data$ego == i & data$statusW2 == "Created"] <- df$extraversion[df$ego == i & (df$statusW2 ==
        "Maintained" | df$statusW2 == "Dropped")][1]
    data$fin_restr[data$ego == i & data$statusW2 == "Created"] <- df$fin_restr[df$ego == i & (df$statusW2 ==
        "Maintained" | df$statusW2 == "Dropped")][1]
    data$romantic[data$ego == i & data$statusW2 == "Created"] <- df$romantic[df$ego == i & (df$statusW2 ==
        "Maintained" | df$statusW2 == "Dropped")][1]
    data$housing.transition_bin[data$ego == i & data$statusW2 == "Created"] <- df$housing.transition_bin[df$ego ==
        i & (df$statusW2 == "Maintained" | df$statusW2 == "Dropped")][1]
    data$occupation.transition_bin[data$ego == i & data$statusW2 == "Created"] <- df$occupation.transition_bin[df$ego ==
        i & (df$statusW2 == "Maintained" | df$statusW2 == "Dropped")][1]
}

# missings on 'reason' are no missings, but refer to alters that were renamed
data$reason[is.na(data$reason)] <- "-"
data <- data[which(complete.cases(data)), ]

# transitions are not measured, set to 0
data$housing.transition <- 0
data$occupation.transition <- 0

data23 <- data

length(unique(data$ego))  #N_ego = 281
length(unique(data$alterid))  #N_alter = 1859


Make some last alterations, list the data-frames for waves 1-2 and 2-3. Also row-bind the data, and add a column indicating when the tie appeared and when it (did not) reappear.

# make colnames similar
colnames(data12)[colnames(data12) == "frequency.t1"] <- "frequency.t"
colnames(data12)[colnames(data12) == "closeness.t1"] <- "closeness.t"

colnames(data23)[colnames(data23) == "frequency.t2"] <- "frequency.t"
colnames(data23)[colnames(data23) == "closeness.t2"] <- "closeness.t"

colnames(data12)[25:28] <- sub("1$", "", colnames(data12)[25:28])
colnames(data23)[24:27] <- sub("2$", "", colnames(data23)[24:27])

data12$housing.transition <- data12$housing.transition_bin
data12$occupation.transition <- data12$occupation.transition_bin

# 2 list data-frames
dataList <- list(data12, data23)
fsave(dataList, "data_nested_List.Rda")

# 3 row-bind
data12$period <- "w1 -> w2"
# data23$period <- ifelse(data23$statusW2 == 'Created', 'w2 -> w3', 'w1 - w2 -> w3')
data23$period <- "w2 -> w3"

data <- bind_rows(data12, data23)

length(unique(data$ego))
length(unique(data$alterid))
nrow(data)

names(data)
data <- data[, -c(9, 10, 29)]

fsave(data, "data_nested.Rda")



References

Franken, Rob, Hidde Bekhuis, and Jochem Tolsma. The Unstable Social Networks of Students: Where Does Dissimilarity Drive Tie Dissolution? Sociological Forum.
———. 2023. “The Sports and Friendships Study 2021-2023 (Data File).” DANS Data Station Social Sciences and Humanities. https://doi.org/10.17026/SS/GODKDR.
LS0tDQp0aXRsZTogIkRhdGEgcHJlcGFyYXRpb24iDQpiaWJsaW9ncmFwaHk6IHJlZmVyZW5jZXMuYmliDQpsaW5rLWNpdGF0aW9uczogdHJ1ZQ0KZGF0ZTogIkxhc3QgY29tcGlsZWQgb24gYHIgZm9ybWF0KFN5cy50aW1lKCksICclQiwgJVknKWAiDQpvdXRwdXQ6IA0KICBodG1sX2RvY3VtZW50Og0KICAgIGNzczogdHdlYWtzLmNzcw0KICAgIHRvYzogIHRydWUNCiAgICB0b2NfZmxvYXQ6IHRydWUNCiAgICBudW1iZXJfc2VjdGlvbnM6IGZhbHNlDQogICAgdG9jX2RlcHRoOiAyDQogICAgY29kZV9mb2xkaW5nOiBzaG93DQogICAgY29kZV9kb3dubG9hZDogeWVzDQotLS0NCg0KDQpgYGB7ciwgZ2xvYmFsc2V0dGluZ3MsIGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0UsIHJlc3VsdHM9J2hpZGUnLCBtZXNzYWdlPUZBTFNFfQ0KbGlicmFyeShrbml0cikNCmxpYnJhcnkodGlkeXZlcnNlKQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFKQ0Kb3B0c19jaHVuayRzZXQodGlkeS5vcHRzPWxpc3Qod2lkdGguY3V0b2ZmPTEwMCksdGlkeT1UUlVFLCB3YXJuaW5nID0gRkFMU0UsIG1lc3NhZ2UgPSBGQUxTRSxjb21tZW50ID0gIiM+IiwgY2FjaGU9VFJVRSwgY2xhc3Muc291cmNlPWMoInRlc3QiKSwgY2xhc3Mub3V0cHV0PWMoInRlc3QzIikpDQpvcHRpb25zKHdpZHRoID0gMTAwKQ0KcmdsOjpzZXR1cEtuaXRyKCkNCg0KY29sb3JpemUgPC0gZnVuY3Rpb24oeCwgY29sb3IpIHtzcHJpbnRmKCI8c3BhbiBzdHlsZT0nY29sb3I6ICVzOyc+JXM8L3NwYW4+IiwgY29sb3IsIHgpIH0NCmBgYA0KDQoNCmBgYHtyIGtsaXBweSwgZWNobz1GQUxTRSwgaW5jbHVkZT1UUlVFfQ0Ka2xpcHB5OjprbGlwcHkocG9zaXRpb24gPSBjKCd0b3AnLCAncmlnaHQnKSkNCiNrbGlwcHk6OmtsaXBweShjb2xvciA9ICdkYXJrcmVkJykNCiNrbGlwcHk6OmtsaXBweSh0b29sdGlwX21lc3NhZ2UgPSAnQ2xpY2sgdG8gY29weScsIHRvb2x0aXBfc3VjY2VzcyA9ICdEb25lJykNCmBgYA0KDQoNCi0tLSAgDQoNClRoZSBmb2xsb3dpbmcgc2NyaXB0cyBjYW4gYmUgdXNlZCB0byByZXBsaWNhdGUgdGhlIGRhdGEtc2V0IG9mIEBGcmFua2VuMjAyMi4gSXQgbWF5IGFsc28gYmUgb2J0YWluZWQgYnkgZG93bmxvYWRpbmc6IGByIHhmdW46OmVtYmVkX2ZpbGUoIi4vZGF0YV9zaGFyZWQvZGF0YV9uZXN0ZWQuUkRhIilgDQoNCg0KDQotLS0tDQoNCjxicj4NCg0KIyBHZXR0aW5nIHN0YXJ0ZWQNCg0KVG8gY29weSB0aGUgY29kZSwgY2xpY2sgdGhlIGJ1dHRvbiBpbiB0aGUgdXBwZXIgcmlnaHQgY29ybmVyIG9mIHRoZSBjb2RlLWNodW5rcy4NCg0KIyMgY2xlYW4gdXANCg0KYGBge3IsIHJlc3VsdHM9J2hpZGUnfQ0Kcm0obGlzdD1scygpKQ0KZ2MoKQ0KYGBgDQoNCjxicj4NCg0KIyMgZ2VuZXJhbCBjdXN0b20gZnVuY3Rpb25zDQoNCi0gYGZwYWNrYWdlLmNoZWNrYDogQ2hlY2sgaWYgcGFja2FnZXMgYXJlIGluc3RhbGxlZCAoYW5kIGluc3RhbGwgaWYgbm90KSBpbiBSDQotIGBmc2F2ZWA6IEZ1bmN0aW9uIHRvIHNhdmUgZGF0YSB3aXRoIHRpbWUgc3RhbXAgaW4gY29ycmVjdCBkaXJlY3RvcnkNCi0gYGZsb2FkYDogTG9hZCBSLW9iamVjdHMgdW5kZXIgbmV3IG5hbWVzDQotIGBmc2hvd2RmYDogUHJpbnQgb2JqZWN0cyAoYHRpYmJsZWAgLyBgZGF0YS5mcmFtZWApIG5pY2VseSBvbiBzY3JlZW4gaW4gYC5SbWRgLg0KDQpgYGB7ciwgZXZhbD1GQUxTRX0NCmZwYWNrYWdlLmNoZWNrIDwtIGZ1bmN0aW9uKHBhY2thZ2VzKSB7DQogICAgbGFwcGx5KHBhY2thZ2VzLCBGVU4gPSBmdW5jdGlvbih4KSB7DQogICAgICAgIGlmICghcmVxdWlyZSh4LCBjaGFyYWN0ZXIub25seSA9IFRSVUUpKSB7DQogICAgICAgICAgICBpbnN0YWxsLnBhY2thZ2VzKHgsIGRlcGVuZGVuY2llcyA9IFRSVUUpDQogICAgICAgICAgICBsaWJyYXJ5KHgsIGNoYXJhY3Rlci5vbmx5ID0gVFJVRSkNCiAgICAgICAgfQ0KICAgIH0pDQp9DQoNCmZzYXZlIDwtIGZ1bmN0aW9uKHgsIGZpbGUsIGxvY2F0aW9uID0gIi4vZGF0YS9wcm9jZXNzZWQvIiwgLi4uKSB7DQogICAgaWYgKCFkaXIuZXhpc3RzKGxvY2F0aW9uKSkNCiAgICAgICAgZGlyLmNyZWF0ZShsb2NhdGlvbikNCiAgICBkYXRlbmFtZSA8LSBzdWJzdHIoZ3N1YigiWzotXSIsICIiLCBTeXMudGltZSgpKSwgMSwgOCkNCiAgICB0b3RhbG5hbWUgPC0gcGFzdGUobG9jYXRpb24sIGRhdGVuYW1lLCBmaWxlLCBzZXAgPSAiIikNCiAgICBwcmludChwYXN0ZSgiU0FWRUQ6ICIsIHRvdGFsbmFtZSwgc2VwID0gIiIpKQ0KICAgIHNhdmUoeCwgZmlsZSA9IHRvdGFsbmFtZSkNCn0NCg0KDQpmbG9hZCAgPC0gZnVuY3Rpb24oZmlsZU5hbWUpew0KICBsb2FkKGZpbGVOYW1lKQ0KICBnZXQobHMoKVtscygpICE9ICJmaWxlTmFtZSJdKQ0KfQ0KDQpmc2hvd2RmIDwtIGZ1bmN0aW9uKHgsIGRpZ2l0cyA9IDIsIC4uLikgew0KICAgIGtuaXRyOjprYWJsZSh4LCBkaWdpdHMgPSBkaWdpdHMsICJodG1sIiwgLi4uKSAlPiUNCiAgICAgICAga2FibGVFeHRyYTo6a2FibGVfc3R5bGluZyhib290c3RyYXBfb3B0aW9ucyA9IGMoInN0cmlwZWQiLCAiaG92ZXIiKSkgJT4lDQogICAgICAgIGthYmxlRXh0cmE6OnNjcm9sbF9ib3god2lkdGggPSAiMTAwJSIsIGhlaWdodCA9ICIzMDBweCIpDQp9DQpgYGANCg0KPGJyPg0KDQojIyBuZWNlc3NhcnkgcGFja2FnZXMNCg0KLSBgZHBseXJgOiBwYWNrYWdlIGZvciBkYXRhIHdyYW5nbGluZw0KLSBgbHVicmlkYXRlYDogcGFyc2UgYW5kIG1hbmlwdWxhdGUgZGF0ZXMNCi0gYHN0cmluZ3JgOiBzdHJpbmcgbWFuaXB1bGF0aW9uDQoNCmBgYHtyLCBldmFsPUZBTFNFfQ0KcGFja2FnZXMgPSBjKCJkcGx5ciIsICJsdWJyaWRhdGUiLCAic3RyaW5nciIpDQpmcGFja2FnZS5jaGVjayhwYWNrYWdlcykNCnJtKHBhY2thZ2VzKQ0KYGBgDQoNCjxicj4NCg0KDQo8c2NyaXB0Pg0KZnVuY3Rpb24gbXlGdW5jdGlvbigpIHsNCg0KICAgICAgICAgICAgdmFyIGJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJteUJ1dHRvbiIpOw0KICAgICAgICAgICAgLy90byBtYWtlIGl0IGZhbmNpZXINCiAgICAgICAgICAgIGlmIChidG4udmFsdWUgPT0gIkNsaWNrIHRvIGhpZGUgY29kZSIpIHsNCiAgICAgICAgICAgICAgICBidG4udmFsdWUgPSAiU2hvdyBjb2RlIjsNCiAgICAgICAgICAgICAgICBidG4uaW5uZXJIVE1MID0gIlNob3cgY29kZSI7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBlbHNlIHsNCiAgICAgICAgICAgICAgICBidG4udmFsdWUgPSAiQ2xpY2sgdG8gaGlkZSBjb2RlIjsNCiAgICAgICAgICAgICAgICBidG4uaW5uZXJIVE1MID0gIkhpZGUgY29kZSI7DQogICAgICAgICAgICB9DQogICAgICAgICAgICAvL3RoaXMgaXMgd2hhdCB5b3UncmUgbG9va2luZyBmb3INCiAgICAgICAgICAgIHZhciB4ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIm15RElWIik7DQogICAgICAgICAgICBpZiAoeC5zdHlsZS5kaXNwbGF5ID09PSAibm9uZSIpIHsNCiAgICAgICAgICAgICAgICB4LnN0eWxlLmRpc3BsYXkgPSAiYmxvY2siOw0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICB4LnN0eWxlLmRpc3BsYXkgPSAibm9uZSI7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgICANCjwvc2NyaXB0Pg0KDQoNCiMgRG93bmxvYWQgZGF0YQ0KDQpBbm9ueW1pemVkIGRhdGEtc2V0cyBvZiB0aGUgJ1Nwb3J0cyBhbmQgRnJpZW5kc2hpcHMnIFtAZGF0YTIwMjJdIHN0dWR5IGFyZSBkZXBvc2l0ZWQgaW4gREFOUyBFQVNZLiBGb3IgdGhpcyBzdHVkeSB3ZSB1c2Ugd2F2ZXMgMy01IChDb2hvcnQgSUkpOg0KDQotIGByIHhmdW46OmVtYmVkX2ZpbGUoIi4vZGF0YS93YXZlM19wdWJsaWMuUkRhIilgDQotIGByIHhmdW46OmVtYmVkX2ZpbGUoIi4vZGF0YS93YXZlNF9wdWJsaWMuUkRhIilgDQotIGByIHhmdW46OmVtYmVkX2ZpbGUoIi4vZGF0YS93YXZlNV9wdWJsaWMuUkRhIilgDQoNCkRvd25sb2FkIHRoZSBkYXRhLWZpbGVzLCBhbmQgcHV0IHRoZW0gaW4gdGhlIGAuL2RhdGEvYCBmb2xkZXIuIEJ1dCBmaXJzdCwgbWFrZSBhIGAuL2RhdGEvYCBmb2xkZXI6IA0KDQpgYGB7ciwgZXZhbD1GfQ0KaWZlbHNlKCFkaXIuZXhpc3RzKCJkYXRhIiksIGRpci5jcmVhdGUoImRhdGEiKSwgRkFMU0UpDQpgYGAgDQoNCjxicj4NCg0KVG8gc2VlIHRoZSBjb2RlIHVzZWQgdG8gYW5vbnltaXplIHRoZSByYXcgZGF0YSBmaWxlcywgY2xpY2sgdGhlIGJ1dHRvbiBiZWxvdy4NCg0KPGJ1dHRvbiBjbGFzcz1idXR0b24xIG9uY2xpY2s9Im15RnVuY3Rpb24oKSIgaWQ9Im15QnV0dG9uIiB2YWx1ZT0iQ2xpY2sgVG8gT3BlbiBJbnN0cnVjdGlvbnMiPlNob3cgY29kZTogZnJvbSByYXcgdG8gcHVibGljIGRhdGE8L2J1dHRvbj4NCg0KPGRpdiBzdHlsZT0iZGlzcGxheTpub25lOyIgaWQ9Im15RElWIj4NCjxicj4NCg0KDQojIyMgbG9hZCBpbiByYXcgZGF0YQ0KDQpgYGB7ciBldmFsPUZBTFNFfQ0KZGF0YTEgPC0gcmVhZC5jc3YoIi4vcmF3ZGF0YS9yZXN1bHRzLXN1cnZleTkzODI0My5jc3YiKSAjd2F2ZTENCmRhdGEyIDwtIHJlYWQuY3N2KCIuL3Jhd2RhdGEvcmVzdWx0cy1zdXJ2ZXk4NjgyNzUuY3N2IikgI3dhdmUyDQpkYXRhMyA8LSByZWFkLmNzdigiLi9yYXdkYXRhL3Jlc3VsdHMtc3VydmV5NDkzMTQ0LmNzdiIpICN3YXZlMw0KZGF0YTRhIDwtIHJlYWQuY3N2KCIuL3Jhd2RhdGEvcmVzdWx0cy1zdXJ2ZXk5NTIzNTRhLmNzdiIpICN3YXZlNDsgdGhlIGRhdGEgd2FzIGV4cG9ydGVkIGluIHRoZSBjb2xsZWN0aW9uIHBlcmlvZCBvZiB0aGlzIHdhdmUsIHRvIHJlc3RvcmUgYSBidWcgaW4gbGltZXN1cnZleS4NCmRhdGE0YiA8LSByZWFkLmNzdigiLi9yYXdkYXRhL3Jlc3VsdHMtc3VydmV5OTUyMzU0Yi5jc3YiKQ0KZGF0YTUgPC0gcmVhZC5jc3YoIi4vcmF3ZGF0YS9yZXN1bHRzLXN1cnZleTM1NjU1Ny5jc3YiKSAjd2F2ZSA1DQpgYGANCg0KPGJyPg0KDQojIyMgbWFrZSBwdWJsaWMgZGF0YS1zZXRzIHRvIGRlcG9zaXQgey50YWJzZXQgLnRhYnNldC1mYWRlfSANCg0KVGhlIGZvbGxvd2luZyBzY3JpcHRzIHdlcmUgdXNlZCB0byBkZWxldGUgc2Vuc2l0aXZlIGluZm9ybWF0aW9uIGZyb20gdGhlIHJlc3BlY3RpdmUgc3VydmV5IHJvdW5kcyAoZS5nLiwgaW5mb3JtYXRpb24gdGhhdCBjb3VsZCBpZGVudGlmeSB0aGUgcmVzcG9uZGVudCwgbmFtZXMgb2YgYWx0ZXJzLCBldGMuKSBhbmQgdG8gbWFrZSBwdWJsaWMgZGF0YS1zZXRzIGZvciBlYWNoIHdhdmUuDQoNCiMjIyMgQ29ob3J0IEk6IHdhdmUgMQ0KYGBge3IsIGV2YWw9Rn0NCiNjb3B5IGRhdGFmcmFtZQ0KZGYgPC0gZGF0YTENCg0KIyBmaXJzdCwgZGVsZXRlIGZha2UgcmVzcG9uc2VzDQpmYWtlaWQgPC0gYygzMzcsIDU3NSwgNTc2KSAjaWQgb2YgZmFrZSByZXNwb25zZXMNCg0KI3JlbW92ZSByb3dzIHdoZXJlIGNvbHVtbiBpZCBpcyBlcXVhbCB0byBmYWtlaWQNCmRmIDwtIHN1YnNldChkZiwgIShpZCAlaW4lIGZha2VpZCkpDQpucm93KGRmKSAjTj0xNzANCg0KI21ha2UgbmV3IGlkIHZhcmlhYmxlDQpkZiRyZXNwbnIgPC0gMTpucm93KGRmKQ0KDQojYWRkIDEwMDAwLCBzeWduaWZ5aW5nIHRoZSBjb2hvcnQNCmRmJHJlc3BuciA8LSBkZiRyZXNwbnIgKyAxMDAwMA0KDQojcmVtb3ZlIGZpcnN0IDEwIGNvbHVtbnMgKGUuZywuIHRva2VuLCBzdWJtaXRkYXRlLCByZWZ1cmwsIGV0Yy4pDQojaSBkb250IG5lZWQgdGhlc2UNCmhlYWQoY29sbmFtZXMoZGYpLDI1KQ0KZGYgPC0gZGZbLC1jKDE6MTApXQ0KI25vdywgY29sdW1uIDEgaXMgdGhlIGZpcnN0IHF1ZXN0aW9uIG9mIHRoZSBzdXJ2ZXkNCg0KI2kgY3JlYXRlIGEgdmVjdG9yIGNvbnRhaW5pbmcgY29sdW1uIG51bWJlcnMgb2YgdmFyaWFibGVzIHRoYXQgbmVlZCB0byBiZSBleGNsdWRlZA0KI2kuZS4sIChzdHJpbmcpIHZhcmlhYmxlcyB0aGF0IGNhbiBpZGVudGlmeSBhIHJlc3BvbmRlbnQNCnN0dWR5IDwtIDYgIyBzdHVkeSBwcm9ncmFtDQpvY2N1cGF0aW9uIDwtIDM3DQpyZXNpZGVuY3kgPC0gYygxNTMsMTU0LDE1NywxNTgpICNyZXNpZGVuY2UgKG11bmljaXBhbGl0eSBuYW1lOyA0ZGlnaXQgcG9zdGFsIGNvZGUpDQpleGNsdWRlX2NvbG51bWJlciA8LSBjKHN0dWR5LG9jY3VwYXRpb24scmVzaWRlbmN5KQ0KI2V4Y2x1ZGUgdmFyaWFibGVzIGNvcnJlc3BvbmRpbmcgdG8gdGhlc2UgY29sdW1uIG51bWJlcnMNCmRmIDwtIGRmWywtZXhjbHVkZV9jb2xudW1iZXJdDQoNCiNpIGFsc28gbmVlZCB0byBkZWFsIHdpdGggdGhlIG5hbWUtZ2VuZXJhdG9yIGRhdGE7DQojaSByZXBsYWNlIGFsbCBsaXN0ZWQgbmFtZXMgd2l0aCBhIHVuaXF1ZSwgYW5vbnltb3VzIGFsdGVyLWlkLA0KDQojZmlyc3QsIGdldCBhbGwgY29sdW1uIG51bWJlcnMgY29ycmVzcG9uZGluZyB0byBuYW1lcw0KbmV0MSA8LSBjKDEwOjE0KQ0KbmV0MiA8LSBjKDUwOjU0KQ0KbmV0MyA8LSBjKDE2NjoxNzApDQpuZXQ0IDwtIGMoNDQwOjQ0NCkNCm5hbWVzX2NvbG51bWJlciA8LSBjKG5ldDEsbmV0MixuZXQzLG5ldDQpDQoNCmZvciAoIGkgaW4gMTpsZW5ndGgodW5pcXVlKG5hbWVzX2NvbG51bWJlcikpKSB7ICMgZm9yIChwb3RlbnRpYWxseSBsaXN0ZWQpIGFsdGVycyAxOjIwDQogICMgZ2V0IHRoZSBpbmRleCwgY29ycmVzcG9uZGluZyB0byB0aGUgY29sdW1uIG51bWJlciB3aGVyZSBwYXJ0aWN1bGFyIGFsdGVyIHdhcyBsaXN0ZWQNCiAgaW5kIDwtIG5hbWVzX2NvbG51bWJlcltpXQ0KICAjIGlmIHRoZSBjb3JyZXNwb25kaW5nIGVudHJ5IGluIHRoZSBuYW1lLWxpc3QgaXMgTk9UIGVtcHR5DQogIGRmWyxpbmRdIDwtIGlmZWxzZSghZGZbLGluZF0gPT0gIiIsIA0KICAgICAgICAgICAgICAgICAgICAgICAjIHJlcGxhY2UgaXQgYnkgInAiIChmb3IgcGVyc29uKSwgZm9sbG93ZWQgYnkgdGhlIGluY3JlbWVudCBpLA0KICAgICAgICAgICAgICAgICAgICAgcGFzdGUwKCJwIiwgaSksIGRmWyxpbmRdKQ0KfQ0KDQojbGFzdCwgd2UgZGVsZXRlIGNvbHVtbnMgdGhhdCBhcmUgaXJyZWxldmFudA0KZGY8LWRmWywtYygxOjQpXQ0KDQojYW5kIHRoZSBsYXN0IGNvbHVtbnMgKGV4Y2x1ZGluZyB0aGUgdmVyeSBsYXN0LCB3aGljaCBkZW5vdGVzIGByZXNwbnJgKQ0KI2J1dCBmaXJzdCwgd2Ugc3Vic2V0IHRoZSByZXNwbnItZW1haWwgY29tYmluYXRpb24sIHNvIHRoYXQgd2UgY2FuIG1lcmdlIHdpdGggd2F2ZTINCm1lcmdlIDwtIGRmWyxjKCJyZXNwbnIiLCAiZW1haWwiKV0NCmV4Y2wgPC0gYyg4Njk6bGVuZ3RoKGRmKSkNCmV4Y2wgPC0gZXhjbFstbGVuZ3RoKGV4Y2wpXQ0KZGYgPC0gZGZbLCAtZXhjbF0NCg0KI2ZpeChkZikjY2hlY2sgaWYgZXZlcnl0aGluZyB3ZW50IGFscmlnaHQNCnJvdy5uYW1lcyhkZikgPC0gMTpucm93KGRmKQ0KDQojc2F2ZSB0aGUgZGF0YWZyYW1lIHRvIHRoZSBwcm9jZXNzZWQgZGF0YS1mb2xkZXINCmZzYXZlKGRmLCAid2F2ZTFfcHVibGljLlJEYSIpDQpgYGAgDQoNCiMjIyMgQ29ob3J0IEk6IHdhdmUgMg0KDQpgYGB7ciwgZXZhbD1GfQ0KI2NvcHkgZGF0YWZyYW1lDQpkZiA8LSBkYXRhMg0KDQojIGZpcnN0LCBkZWxldGUgZmFrZSByZXNwb25zZQ0KZmFrZWlkIDwtIGMoNjEpICNpZCBvZiBmYWtlIHJlc3BvbnNlDQoNCiNyZW1vdmUgcm93cyB3aGVyZSBjb2x1bW4gaWQgaXMgZXF1YWwgdG8gZmFrZWlkDQpkZiA8LSBzdWJzZXQoZGYsICEoaWQgJWluJSBmYWtlaWQpKQ0KbnJvdyhkZikgI049OTMNCg0KI2F0dGFjaCByZXNwbnINCmRmIDwtIG1lcmdlKGRmLG1lcmdlLGJ5PSJlbWFpbCIpDQoNCiNyZW9yZGVyIGJ5IHJlc3ByDQpkZiA8LSBkZltvcmRlcihkZiRyZXNwbnIpLF0NCnJvd25hbWVzKGRmKSA8LSAxOm5yb3coZGYpDQoNCiNkZWxldGUgZmlyc3QgY29sdW1ucw0KZGYgPC0gZGZbLC1jKDE6MTIpXQ0KDQojaSBjcmVhdGUgYSB2ZWN0b3IgY29udGFpbmluZyBjb2x1bW4gbnVtYmVycyBvZiB2YXJpYWJsZXMgdGhhdCBuZWVkIHRvIGJlIGV4Y2x1ZGVkDQojaS5lLiwgKHN0cmluZykgdmFyaWFibGVzIHRoYXQgY2FuIGlkZW50aWZ5IGEgcmVzcG9uZGVudA0KI2luIHdhdmUgMiwgb25seSByZXNpZGVuY3kgdmFyaWFibGVzDQpleGNsdWRlX2NvbG51bWJlciA8LSBjKDEzMCwxMzEpDQojZXhjbHVkZSB2YXJpYWJsZXMgY29ycmVzcG9uZGluZyB0byB0aGVzZSBjb2x1bW4gbnVtYmVycw0KZGYgPC0gZGZbLC1leGNsdWRlX2NvbG51bWJlcl0NCg0KI2FnYWluLCByZXBsYWNlIG5hbWVkIHBlcnNvbnMgd2l0aCB1bmlxdWUgYWx0ZXJfaWQgcF9pDQpuZXQxIDwtIGMoMTo1KQ0KbmV0MiA8LSBjKDI2OjMwKQ0KbmV0MyA8LSBjKDE0MjoxNDYpDQpuZXQ0IDwtIGMoMzM2OjM0MCkNCm5hbWVzX2NvbG51bWJlciA8LSBjKG5ldDEsbmV0MixuZXQzLG5ldDQpDQoNCmZvciAoIGkgaW4gMTpsZW5ndGgodW5pcXVlKG5hbWVzX2NvbG51bWJlcikpKSB7ICMgZm9yIChwb3RlbnRpYWxseSBsaXN0ZWQpIGFsdGVycyAxOjIwDQogICMgZ2V0IHRoZSBpbmRleCwgY29ycmVzcG9uZGluZyB0byB0aGUgY29sdW1uIG51bWJlciB3aGVyZSBwYXJ0aWN1bGFyIGFsdGVyIHdhcyBsaXN0ZWQNCiAgaW5kIDwtIG5hbWVzX2NvbG51bWJlcltpXQ0KICAjIGlmIHRoZSBjb3JyZXNwb25kaW5nIGVudHJ5IGluIHRoZSBuYW1lLWxpc3QgaXMgTk9UIGVtcHR5DQogIGRmWyxpbmRdIDwtIGlmZWxzZSghZGZbLGluZF0gPT0gIiIsIA0KICAgICAgICAgICAgICAgICAgICAgICAjIHJlcGxhY2UgaXQgYnkgInAiIChmb3IgcGVyc29uKSwgZm9sbG93ZWQgYnkgdGhlIGluY3JlbWVudCBpLA0KICAgICAgICAgICAgICAgICAgICAgcGFzdGUwKCJwIiwgaSksIGRmWyxpbmRdKQ0KfQ0KDQojbGFzdCwgcmVtb3ZlIGFsbCBpcnJlbGV2YW50IHZhcmlhYmxlcywNCiNmcm9tICJpbnRlcnZpZXd0aW1lIiBvbi4NCiNleGNsdWRpbmcgdGhlIGxhc3QgY29sdW1uLCBhcyB0aGlzIGlzIHJlc3Bucg0KI3doaWNoKCBjb2xuYW1lcyhkZik9PSJpbnRlcnZpZXd0aW1lIiApDQpleGNsIDwtIGMoIHdoaWNoKCBjb2xuYW1lcyhkZik9PSJpbnRlcnZpZXd0aW1lIiApOmxlbmd0aChkZikpDQpleGNsIDwtIGV4Y2xbLWxlbmd0aChleGNsKV0NCmRmIDwtIGRmWywgLWV4Y2xdDQoNCmZzYXZlKGRmLCAid2F2ZTJfcHVibGljLlJEYSIpDQpgYGAgDQogDQojIyMjIENvaG9ydCBJSTogd2F2ZSAxDQoNCg0KYGBge3IsIGV2YWw9Rn0NCiNjb3B5IGRhdGFmcmFtZQ0KZGYgPC0gZGF0YTMNCg0KIyBmaXJzdCwgZGVsZXRlIGZha2UgcmVzcG9uczsNCmZha2VpZCA8LSB3aGljaChkZiR0b2tlbiAgJWluJSAidGVzdCIpDQoNCiNyZW1vdmUgcm93cyB3aGVyZSBjb2x1bW4gaWQgaXMgZXF1YWwgdG8gZmFrZWlkDQpkZiA8LSBzdWJzZXQoZGYsICEoaWQgJWluJSBmYWtlaWQpKQ0KbnJvdyhkZikgI049MTEzNQ0KDQojbWFrZSBuZXcgaWQgdmFyaWFibGUNCiNhZGQgMjAwMDAsIHNvIHdlIGhhdmUgYSBzaWduaWZpZXIgZm9yIHRoZSAybmQgY29ob3J0DQpkZiRyZXNwbnIgPC0gMjAwMDAgKyAxOm5yb3coZGYpDQoNCiNyZW1vdmUgZmlyc3QgY29sdW1ucyAoZS5nLC4gdG9rZW4sIHJlZnVybCwgZXRjLikNCiNpIGRvbnQgbmVlZCB0aGVzZQ0KI2J1dCBkbyBrZWVwIHN1Ym1pdCBhbmQgc3RhcnRkYXRlDQpoZWFkKGNvbG5hbWVzKGRmKSwyNSkNCmRmIDwtIGRmWywtYygxLDM6Niw4OjEwKV0NCg0KI25vdywgY29sdW1uIDMgaXMgdGhlIGZpcnN0IHF1ZXN0aW9uIG9mIHRoZSBzdXJ2ZXkNCg0KI2kgY3JlYXRlIGEgdmVjdG9yIGNvbnRhaW5pbmcgY29sdW1uIG51bWJlcnMgb2YgdmFyaWFibGVzIHRoYXQgbmVlZCB0byBiZSBleGNsdWRlZA0KI2kuZS4sIChzdHJpbmcpIHZhcmlhYmxlcyB0aGF0IGNhbiBpZGVudGlmeSBhIHJlc3BvbmRlbnQNCnN0dWR5IDwtIDYgIyBzdHVkeSBwcm9ncmFtDQpvY2N1cGF0aW9uIDwtIDM3ICNvdGhlciBjYXRlZ29yeSANCnJlc2lkZW5jeSA8LSBjKDE1MywxNTQsMTU3LDE1OCkgI3Jlc2lkZW5jZSAobXVuaWNpcGFsaXR5IG5hbWU7IDRkaWdpdCBwb3N0YWwgY29kZSkNCmV4Y2x1ZGVfY29sbnVtYmVyIDwtIGMoc3R1ZHksb2NjdXBhdGlvbixyZXNpZGVuY3kpDQoNCiNleGNsdWRlIHZhcmlhYmxlcyBjb3JyZXNwb25kaW5nIHRvIHRoZXNlIGNvbHVtbiBudW1iZXJzDQpkZiA8LSBkZlssLWV4Y2x1ZGVfY29sbnVtYmVyXQ0KI2kgYWxzbyBuZWVkIHRvIGRlYWwgd2l0aCB0aGUgbmFtZS1nZW5lcmF0b3IgZGF0YTsNCiNpIHJlcGxhY2UgYWxsIGxpc3RlZCBuYW1lcyB3aXRoIGEgdW5pcXVlLCBhbm9ueW1vdXMgYWx0ZXItaWQsDQoNCiNmaXJzdCwgZ2V0IGFsbCBjb2x1bW4gbnVtYmVycyBjb3JyZXNwb25kaW5nIHRvIG5hbWVzDQpuZXQxIDwtIGMoMTA6MTQpDQpuZXQyIDwtIGMoNTA6NTQpDQpuZXQzIDwtIGMoMTY2OjE3MCkNCm5ldDQgPC0gYyg0NDE6NDQ1KQ0KbmFtZXNfY29sbnVtYmVyIDwtIGMobmV0MSxuZXQyLG5ldDMsbmV0NCkNCg0KZm9yICggaSBpbiAxOmxlbmd0aCh1bmlxdWUobmFtZXNfY29sbnVtYmVyKSkpIHsgIyBmb3IgKHBvdGVudGlhbGx5IGxpc3RlZCkgYWx0ZXJzIDE6MjANCiAgIyBnZXQgdGhlIGluZGV4LCBjb3JyZXNwb25kaW5nIHRvIHRoZSBjb2x1bW4gbnVtYmVyIHdoZXJlIHBhcnRpY3VsYXIgYWx0ZXIgd2FzIGxpc3RlZA0KICBpbmQgPC0gbmFtZXNfY29sbnVtYmVyW2ldDQogICMgaWYgdGhlIGNvcnJlc3BvbmRpbmcgZW50cnkgaW4gdGhlIG5hbWUtbGlzdCBpcyBOT1QgZW1wdHkNCiAgZGZbLGluZF0gPC0gaWZlbHNlKCFkZlssaW5kXSA9PSAiIiwgDQogICAgICAgICAgICAgICAgICAgICAgICMgcmVwbGFjZSBpdCBieSAicCIgKGZvciBwZXJzb24pLCBmb2xsb3dlZCBieSB0aGUgaW5jcmVtZW50IGksDQogICAgICAgICAgICAgICAgICAgICBwYXN0ZTAoInAiLCBpKSwgZGZbLGluZF0pDQp9DQoNCiNsYXN0LCB3ZSBkZWxldGUgY29sdW1ucyB0aGF0IGFyZSBpcnJlbGV2YW50DQpkZjwtZGZbLC1jKDMsNCldDQoNCiN3ZSBhbHNvIGRlbGV0ZSBhIGxvdCBvZiBjb2x1bW5zIChleGNsdWRpbmcgdGhlIHZlcnkgbGFzdCwgd2hpY2ggZGVub3RlcyBgcmVzcG5yYDsgYW5kIHZhcmlhYmxlcyBpbmRpY2F0aW5nIGdyb3VwIHRpbWVzKQ0KDQojYnV0IGZpcnN0LCB3ZSBzdWJzZXQgdGhlIHJlc3Buci1lbWFpbCBjb21iaW5hdGlvbiwgc28gdGhhdCB3ZSBjYW4gbWVyZ2Ugd2l0aCB3YXZlMg0KbWVyZ2UgPC0gZGZbLGMoInJlc3BuciIsICJlbWFpbCIpXQ0KDQpmaXgobWVyZ2UpDQoNCiNmc2F2ZShtZXJnZSwgZmlsZSA9ICJzbGV1dGVsYmVzdGFuZF9yZXNwbnJfZW1haWwuUkRhIikNCg0KZXhjbCA8LSBjKDk5NTpsZW5ndGgoZGYpKQ0KZXhjbCA8LSBleGNsWy1sZW5ndGgoZXhjbCldICNtaW51cyBsYXN0IGNvbHVtbnMgKHJlc3BucikNCg0KI2Fsc28ga2VlcCBncm91cCB0aW1lcw0KZXhjbCA8LSBleGNsWyAhIGV4Y2wgJWluJSB3aGljaChncmVwbCgiZ3JvdXBUaW1lIiwgbmFtZXMoZGYpKSldDQoNCmRmIDwtIGRmWywgLWV4Y2xdDQoNCiNmaXgoZGYpI2NoZWNrIGlmIGV2ZXJ5dGhpbmcgd2VudCBhbHJpZ2h0DQoNCiNzYXZlIHRoZSBkYXRhZnJhbWUgdG8gdGhlIHByb2Nlc3NlZCBkYXRhLWZvbGRlcg0KZnNhdmUoZGYsICJ3YXZlM19wdWJsaWMuUkRhIikNCmBgYA0KDQojIyMjIENvaG9ydCBJSTogd2F2ZSAyDQoNCldoaWxlIGNvbmR1Y3RpbmcgdGhpcyBzdXJ2ZXkgcm91bmQsIEkgZW5jb3VudGVyZWQgYW4gaXNzdWUgd2l0aCBhIG1hdGNoaW5nIG1hdHJpeCBub3QgbG9hZGluZyAoYG1hdGNoaW5nMU4xLlNRMDAxX1NRMDAxYCBkaWQgbm90IGxvYWQ7IHNlZSB0aGUgPGEgaHJlZj0iaHR0cHM6Ly9uZXRjaGFuZ2UubmV0bGlmeS5hcHAvY29kZWJvb2sucGRmIiB0YXJnZXQ9Il9ibGFuayI+Y29kZWJvb2s8L2E+IGZvciBtb3JlIGluZm8pLiBBcyBhIHJlc3VsdCwgdGhlIHN1cnZleSB3YXMgc2h1dCBkb3duIHRlbXBvcmFyaWx5IHRvIGZpeCB0aGUgYnVnLCBhbmQgdGhlbiByZWFjdGl2YXRlZCwgdGh1cyByZXN1bHRpbmcgaW4gdHdvIGRpc3RpbmN0IGRhdGEtZmlsZXMuIA0KDQpCZWZvcmUgbWFraW5nIHRoZSBwdWJsaWMgZGF0YS1zZXQgZm9yIHRoaXMgd2F2ZSwgSSAoYSkgZGVsZXRlIHBhcnRpY2lwYW50cyB0aGF0IGhhZCB0byBiZSBwcmVzZW50ZWQgYG1hdGNoaW5nMU4xLlNRMDAxX1NRMDAxYCAoaS5lLiwgdGhvc2Ugd2hvIG5hbWVkIGF0IGxlYXN0IG9uZSBDRE4gYW5kIDEgc3R1ZHkgcGFydG5lciksIGFuZCAoYikgbWVyZ2UgdGhlIGRhdGEtZmlsZXMuDQoNCg0KYGBge3IgZXZhbD1GQUxTRX0NCiMgcGFydGljaXBhbnRzIHRoYXQgbmFtZWQgb25lIG9yIG1vcmUgQ0ROIGFsdGVycywgQU5EIDEgc3R1ZHkgcGFydG5lciwgd2VyZSBub3QgcHJlc2VudGVkIHdpdGggYSBtYXRjaGluZyBtYXRyaXguIA0KbGVuZ3RoKHdoaWNoKGRhdGE0YSRlZ29uZXQxLlNRMDAxLiE9IiIgJiBkYXRhNGEkZWdvbmV0Mi5TUTAwMS4hPSIiICYgZGF0YTRhJGVnb25ldDIuU1EwMDIuPT0iIikpICMgODggcGFydGljcGFudHMuIA0KDQojaSBkZWxldGUgdGhvc2UuLi4NCmRhdGE0YS4gPC0gZGF0YTRhWy13aGljaChkYXRhNGEkZWdvbmV0MS5TUTAwMS4hPSIiICYgZGF0YTRhJGVnb25ldDIuU1EwMDEuIT0iIiAmIGRhdGE0YSRlZ29uZXQyLlNRMDAyLj09IiIpLF0NCmRhdGE0YS4kbWF0Y2hpbmcxTjEuU1EwMDFfU1EwMDEuIDwtIE5BDQoNCiNpbiBvcmRlciB0byBtZXJnZSB0aGUgZmlsZXMsIG1ha2Ugc3VyZSB0aGUgaGF2ZSB0aGUgc2FtZSBjb2x1bW5zDQpkYXRhNGEuLiA8LSBkYXRhNGEuWyx3aGljaChuYW1lcyhkYXRhNGEuKSAlaW4lIG5hbWVzKGRhdGE0YikpXQ0KDQojcm93YmluZCB0aGUgc2VwYXJhdGUgZGF0YS1maWxlcw0KZGF0YTQgPC0gcmJpbmQoZGF0YTRhLi4sIGRhdGE0YikNCm5yb3coZGF0YTQpICNuPTUyMA0KYGBgDQoNCmBgYHtyLCBldmFsPUZ9DQojY29weSBkYXRhZnJhbWUNCmRmIDwtIGRhdGE0DQoNCiMgZmlyc3QsIGRlbGV0ZSBmYWtlL3Rlc3QgcmVzcG9uc2UNCmZha2VpZCA8LSBjKDMsNCkgI2lkIG9mIGZha2UgcmVzcG9uc2UNCg0KI3JlbW92ZSByb3dzIHdoZXJlIGNvbHVtbiBpZCBpcyBlcXVhbCB0byBmYWtlaWQNCmRmIDwtIHN1YnNldChkZiwgIShpZCAlaW4lIGZha2VpZCkpDQpucm93KGRmKSAjTj01MTgNCg0KI2F0dGFjaCByZXNwbnINCmRmIDwtIG1lcmdlKGRmLG1lcmdlLGJ5PSJlbWFpbCIpDQoNCiNyZW9yZGVyIGJ5IHJlc3ByDQpkZiA8LSBkZltvcmRlcihkZiRyZXNwbnIpLF0NCnJvd25hbWVzKGRmKSA8LSAxOm5yb3coZGYpDQoNCiNkZWxldGUgZmlyc3QgY29sdW1ucw0KI2J1dCBrZWVwIHN0YXJ0L3N1Ym1pdCBkYXRlDQojaGVhZChuYW1lcyhkZiksMTIpDQoNCmRmIDwtIGRmWywtYygxLDIsNDo3LDk6MTIpXQ0KDQojaSBjcmVhdGUgYSB2ZWN0b3IgY29udGFpbmluZyBjb2x1bW4gbnVtYmVycyBvZiB2YXJpYWJsZXMgdGhhdCBuZWVkIHRvIGJlIGV4Y2x1ZGVkDQojaS5lLiwgKHN0cmluZykgdmFyaWFibGVzIHRoYXQgY2FuIGlkZW50aWZ5IGEgcmVzcG9uZGVudA0KI3N0dWR5OiAxMjkNCiNyZXNpZGVuY3kgdmFyaWFibGVzOiAxMzgsIDEzOQ0KDQpleGNsdWRlX2NvbG51bWJlciA8LSBjKDEyOSwgMTM4LDEzOSkNCiNleGNsdWRlIHZhcmlhYmxlcyBjb3JyZXNwb25kaW5nIHRvIHRoZXNlIGNvbHVtbiBudW1iZXJzDQpkZiA8LSBkZlssLWV4Y2x1ZGVfY29sbnVtYmVyXQ0KDQojYWdhaW4sIHJlcGxhY2UgbmFtZWQgcGVyc29ucyB3aXRoIHVuaXF1ZSBhbHRlcl9pZCBwX2kNCm5ldDEgPC0gYygzOjcpDQpuZXQyIDwtIGMoMjg6MzIpDQpuZXQzIDwtIGMoMTUxOjE1NSkNCm5ldDQgPC0gYygzOTY6NDAwKQ0KbmFtZXNfY29sbnVtYmVyIDwtIGMobmV0MSxuZXQyLG5ldDMsbmV0NCkNCg0KZm9yICggaSBpbiAxOmxlbmd0aCh1bmlxdWUobmFtZXNfY29sbnVtYmVyKSkpIHsgIyBmb3IgKHBvdGVudGlhbGx5IGxpc3RlZCkgYWx0ZXJzIDE6MjANCiAgIyBnZXQgdGhlIGluZGV4LCBjb3JyZXNwb25kaW5nIHRvIHRoZSBjb2x1bW4gbnVtYmVyIHdoZXJlIHBhcnRpY3VsYXIgYWx0ZXIgd2FzIGxpc3RlZA0KICBpbmQgPC0gbmFtZXNfY29sbnVtYmVyW2ldDQogICMgaWYgdGhlIGNvcnJlc3BvbmRpbmcgZW50cnkgaW4gdGhlIG5hbWUtbGlzdCBpcyBOT1QgZW1wdHkNCiAgZGZbLGluZF0gPC0gaWZlbHNlKCFkZlssaW5kXSA9PSAiIiwgDQogICAgICAgICAgICAgICAgICAgICAgICMgcmVwbGFjZSBpdCBieSAicCIgKGZvciBwZXJzb24pLCBmb2xsb3dlZCBieSB0aGUgaW5jcmVtZW50IGksDQogICAgICAgICAgICAgICAgICAgICBwYXN0ZTAoInAiLCBpKSwgZGZbLGluZF0pDQp9DQoNCiNsYXN0LCByZW1vdmUgYWxsIGlycmVsZXZhbnQgdmFyaWFibGVzLA0KI2V4Y2x1ZGluZyB0aGUgbGFzdCBjb2x1bW4sIGFzIHRoaXMgaXMgcmVzcG5yDQpleGNsIDwtIDEzNTY6bGVuZ3RoKGRmKQ0KZXhjbCA8LSBleGNsWy1sZW5ndGgoZXhjbCldICNtaW51cyBsYXN0IGNvbHVtbnMgKHJlc3BucikNCg0KI2FuZCB0aW1lIHJlY29yZHMgZm9yIHF1ZXN0aW9uIGdyb3Vwcw0KZXhjbCA8LSBleGNsWyAhIGV4Y2wgJWluJSB3aGljaChncmVwbCgiZ3JvdXBUaW1lIiwgbmFtZXMoZGYpKSldDQoNCmRmIDwtIGRmWywgLWV4Y2xdDQoNCmZzYXZlKGRmLCAid2F2ZTRfcHVibGljLlJEYSIpDQpgYGAgDQogDQojIyMjIENvaG9ydCBJSTogd2F2ZSAzDQpgYGB7ciwgZXZhbD1GfQ0KI2NvcHkgZGF0YWZyYW1lDQpkZiA8LSBkYXRhNQ0KDQojYXR0YWNoIHJlc3Bucg0KZGYgPC0gbWVyZ2UoZGYsbWVyZ2UsYnk9ImVtYWlsIikNCg0KI3Jlb3JkZXIgYnkgcmVzcHINCmRmIDwtIGRmW29yZGVyKGRmJHJlc3BuciksXQ0Kcm93bmFtZXMoZGYpIDwtIDE6bnJvdyhkZikNCg0KI2RlbGV0ZSBmaXJzdCBjb2x1bW5zDQojYnV0IGtlZXAgc3RhcnQvc3VibWl0IGRhdGUNCiNoZWFkKG5hbWVzKGRmKSwxMikNCmRmIDwtIGRmWywtYygxLDIsNDo3LDk6MTIpXQ0KDQojYWdhaW4sIHJlcGxhY2UgbmFtZWQgcGVyc29ucyB3aXRoIHVuaXF1ZSBhbHRlcl9pZCBwX2kNCm5ldDEgPC0gYygzOjcpDQpuZXQyIDwtIGMoODoxMikNCm5ldDMgPC0gYyg5ODoxMDIpDQpuZXQ0IDwtIGMoMjUzOjI1NykNCm5hbWVzX2NvbG51bWJlciA8LSBjKG5ldDEsbmV0MixuZXQzLG5ldDQpDQoNCmZvciAoIGkgaW4gMTpsZW5ndGgodW5pcXVlKG5hbWVzX2NvbG51bWJlcikpKSB7ICMgZm9yIChwb3RlbnRpYWxseSBsaXN0ZWQpIGFsdGVycyAxOjIwDQogICMgZ2V0IHRoZSBpbmRleCwgY29ycmVzcG9uZGluZyB0byB0aGUgY29sdW1uIG51bWJlciB3aGVyZSBwYXJ0aWN1bGFyIGFsdGVyIHdhcyBsaXN0ZWQNCiAgaW5kIDwtIG5hbWVzX2NvbG51bWJlcltpXQ0KICAjIGlmIHRoZSBjb3JyZXNwb25kaW5nIGVudHJ5IGluIHRoZSBuYW1lLWxpc3QgaXMgTk9UIGVtcHR5DQogIGRmWyxpbmRdIDwtIGlmZWxzZSghZGZbLGluZF0gPT0gIiIsIA0KICAgICAgICAgICAgICAgICAgICAgICAjIHJlcGxhY2UgaXQgYnkgInAiIChmb3IgcGVyc29uKSwgZm9sbG93ZWQgYnkgdGhlIGluY3JlbWVudCBpLA0KICAgICAgICAgICAgICAgICAgICAgcGFzdGUwKCJwIiwgaSksIGRmWyxpbmRdKQ0KfQ0KDQojYWxzbywgYW5vbnltaXplIHRoZSAnb3RoZXInIHJlYXNvbnMgZ2l2ZW4gZm9yIG5vdCByZW5hbWluZyBhbiBhbHRlci4NCm9wZW4gPC0gYygxMTY2OjExODUsMTIwNjoxMjI1KQ0KZGZbLG9wZW5dW2RmWyxvcGVuXT09IiJdIDwtIE5BDQpkZlssb3Blbl1bIWlzLm5hKGRmWyxvcGVuXSldIDwtIDEgI2p1c3QgcHV0ICIxIiBpbnN0ZWFkLi4uDQoNCiNsYXN0LCByZW1vdmUgYWxsIGlycmVsZXZhbnQgdmFyaWFibGVzLA0KI2V4Y2x1ZGluZyB0aGUgbGFzdCBjb2x1bW4sIGFzIHRoaXMgaXMgcmVzcG5yDQoNCiN0YWlsKG5hbWVzKGRmKSwzMDgpDQoNCg0KZXhjbCA8LSAxMjI2Omxlbmd0aChkZikNCmV4Y2wgPC0gZXhjbFstbGVuZ3RoKGV4Y2wpXSAjbWludXMgbGFzdCBjb2x1bW5zIChyZXNwbnIpDQoNCiNhbmQgdGltZSByZWNvcmRzIGZvciBxdWVzdGlvbiBncm91cHMNCmV4Y2wgPC0gZXhjbFsgISBleGNsICVpbiUgd2hpY2goZ3JlcGwoImdyb3VwVGltZSIsIG5hbWVzKGRmKSkpXQ0KDQpkZiA8LSBkZlssIC1leGNsXQ0KI2ZpeChkZikNCg0KZnNhdmUoZGYsICJ3YXZlNV9wdWJsaWMuUkRhIikNCmBgYA0KDQoNCiMjIyB7LX0NCg0KDQo8L2Rpdj4NCg0KLS0tLQ0KDQo8YnI+DQoNCiMgSW1wb3J0IGRhdGENCg0KTG9hZCB0aGUgZG93bmxvYWRlZCBkYXRhLiBGaXJzdCwgd2UgY2xlYW4gb3VyIGVudmlyb25tZW50IChidXQgd2Uga2VlcCBvdXIgZnVuY3Rpb25zOyB3ZSBuZWVkIHRoZW0gbGF0ZXIgb24pLg0KDQpgYGB7cixldmFsPUZ9DQojY2xlYW4gZW52aXJvbm1lbnQsIGJ1dCBrZWVwIGZ1bmN0aW9ucw0Kcm0obGlzdCA9IHNldGRpZmYobHMoKSwgbHNmLnN0cigpKSkNCg0KI2xvYWQgcHVibGljIGRhdGENCg0KI0NvaG9ydCBJSQ0KZGF0YTMgPC0gZmxvYWQoIi4vZGF0YS93YXZlM19wdWJsaWMuUkRhIikNCmRhdGE0IDwtIGZsb2FkKCIuL2RhdGEvd2F2ZTRfcHVibGljLlJEYSIpDQpkYXRhNSA8LSBmbG9hZCgiLi9kYXRhL3dhdmU1X3B1YmxpYy5SRGEiKQ0KYGBgDQoNCg0KPGJyPg0KDQotLS0tDQoNCg0KIyB0aWVfbWFpbnRlbmFuY2UuUkRhIA0KDQpJbiB0aGUgZm9sbG93aW5nIHNjcmlwdCwgSSBjb25zdHJ1Y3QgYSBsb25nIGRhdGEtZnJhbWUgKGJhc2VkIG9uIENvaG9ydCBJSSwgd2F2ZXMgMS0yLTMpLCB3aXRoIGFsdGVycyBuZXN0ZWQgaW4gZWdvcywgdG8gaW52ZXN0aWdhdGUgd2hpY2ggYWx0ZXJzIGFyZSBtYWludGFpbmVkIGluIHRoZSBwZXJzb25hbCBuZXR3b3JrcyBvZiBlZ28gb3ZlciB0aGUgYWNhZGVtaWMgeWVhci4gVG8gZWFjaCBlZ28sIHJlbGV2YW50IGluZGl2aWR1YWwtbGV2ZWwsIGNvbnRleHR1YWwtbGV2ZWwsIGFuZCBuZXR3b3JrLWxldmVsIGF0dHJpYnV0ZXMgYXJlIGFzc2lnbmVkOyB0byBlYWNoIGFsdGVyLCByZWxldmFudCBhbHRlciBhbmQgZHlhZGljIGZlYXR1cmVzIGFyZSBhc3NpZ25lZC4gVGhlIGRhdGEtc2V0IGlzIHNhdmVkLg0KDQojIyB3YXZlIDEgLS0+IHdhdmUgMiAobWFpbnRhaW5lZCB2cyBkcm9wcGVkKQ0KDQpgYGB7ciwgZXZhbD1GQUxTRX0NCiMgc3Vic2V0IHJlc3BvbmRlbnRzIHRoYXQgZmlsbGVkIG91dCBib3RoIHN1cnZleXMgdzEgYW5kIHcyOw0KIyBieSBtYXRjaGluZyBvbiBgcmVzcG5yYA0KZGF0YSA8LSBkYXRhM1t3aGljaChkYXRhMyRyZXNwbnIgJWluJSB1bmlxdWUoZGF0YTQkcmVzcG5yKSksXQ0Kcm93Lm5hbWVzKGRhdGEpIDwtIDE6bnJvdyhkYXRhKQ0KbnJvdyhkYXRhKSAjTj01MTYNCg0KIyBtYWtlIGEgZGF0YWZyYW1lIG9mIHcxLWFsdGVycywgd2l0aCBwb3RlbnRpYWwgZHVwbGljYXRlcy4uLg0KIyByZWNhbGwgdGhhdCBhbGwgYWx0ZXIgbmFtZXMgd2VyZSByZXBsYWNlZCB3aXRoIGEgdW5pcXVlIGFub255bWl6ZWQgYWx0ZXItaWQNCmRmX25hbWVzIDwtIGRhdGEuZnJhbWUoDQogIHAxID0gZGF0YSRlZ29uZXQxLlNRMDAxLiwNCiAgcDIgPSBkYXRhJGVnb25ldDEuU1EwMDIuLA0KICBwMyA9IGRhdGEkZWdvbmV0MS5TUTAwMy4sDQogIHA0ID0gZGF0YSRlZ29uZXQxLlNRMDA0LiwNCiAgcDUgPSBkYXRhJGVnb25ldDEuU1EwMDUuLA0KICBwNiA9IGRhdGEkZWdvbmV0Mi5TUTAwMS4sDQogIHA3ID0gZGF0YSRlZ29uZXQyLlNRMDAyLiwNCiAgcDggPSBkYXRhJGVnb25ldDIuU1EwMDMuLA0KICBwOSA9IGRhdGEkZWdvbmV0Mi5TUTAwNC4sDQogIHAxMD0gZGF0YSRlZ29uZXQyLlNRMDA1LiwNCiAgcDExPSBkYXRhJGVnb25ldDMuU1EwMDEuLA0KICBwMTI9IGRhdGEkZWdvbmV0My5TUTAwMi4sDQogIHAxMz0gZGF0YSRlZ29uZXQzLlNRMDAzLiwNCiAgcDE0PSBkYXRhJGVnb25ldDMuU1EwMDQuLA0KICBwMTU9IGRhdGEkZWdvbmV0My5TUTAwNS4sDQogIHAxNj0gZGF0YSRlZ29uZXQ0LlNRMDAxLiwNCiAgcDE3PSBkYXRhJGVnb25ldDQuU1EwMDIuLA0KICBwMTg9IGRhdGEkZWdvbmV0NC5TUTAwMy4sDQogIHAxOT0gZGF0YSRlZ29uZXQ0LlNRMDA0LiwNCiAgcDIwPSBkYXRhJGVnb25ldDQuU1EwMDUuKQ0KDQojInByZS1hbGxvY2F0ZSIgZW1wdHkgbGlzdCBvZiBsZW5ndGggZXF1YWxzIG51bWJlciBvZiBlZ29zDQphbHRlckwgPC0gdmVjdG9yKCJsaXN0IiwgbnJvdyhkZl9uYW1lcykpDQoNCiMgbG9vcCBvdmVyIGFsbCBlZ29zDQpmb3IgKCBpIGluIDE6bGVuZ3RoKGFsdGVyTCkpIHsNCiAgICBhbHRlckxbW2ldXSA8LSBkYXRhLmZyYW1lKA0KICAgICAgZWdvX2dlbmRlciA9IE5BLCBlZ29fYWdlID0gTkEsIGVnb19lZHVjID0gTkEsDQogICAgICBhbHRlcmlkID0gMToyMCwgbmFtZTEgPSBOQSwgbmFtZTIgPSBOQSwgbmFtZTMgPSBOQSwgbmFtZTQgPSBOQSwNCiAgICAgIGFsdGVyX2dlbmRlciA9IE5BLCBhbHRlcl9hZ2UgPSBOQSwgYWx0ZXJfZWR1Yz1OQSwNCiAgICAgIHNhbWVfZ2VuZGVyID0gTkEsIGRpZl9hZ2UgPSBOQSwgc2ltX2VkdWMgPSBOQSwNCiAgICAgIGNkbl9lbWJlZC50MSA9IE5BLCBzdHVkeV9lbWJlZC50MSA9IE5BLCBiZmZfZW1iZWQudDEgPSBOQSwgY3NuX2VtYmVkLnQxID0gTkEpDQp9DQoNCiMgZmlsbCB0aGUgbmFtZXMgYmFzZWQgb24gdGhlIG5hbWVzIGRhdGEtZnJhbWUgYW5kIHJlcGxhY2UgZW1wdHkgc3RyaW5ncyB3aXRoIDxOQT4NCmZvciAoIGkgaW4gMTpsZW5ndGgoYWx0ZXJMKSkgew0KICBhbHRlckxbW2ldXSRuYW1lMSA8LSB1bmxpc3QoZGZfbmFtZXNbaSwgXSwgdXNlLm5hbWVzPUZBTFNFKQ0KICBhbHRlckxbW2ldXSRuYW1lMSA8LSBpZmVsc2UoYWx0ZXJMW1tpXV0kbmFtZTE9PSIiLCBOQSwgYWx0ZXJMW1tpXV0kbmFtZTEpDQp9DQoNCiMgYSBtYXRjaGluZyBtYXRyaXggYWxsb3dlZCBlZ28gdG8gbWF0Y2ggbmFtZXMgdGhhdCByZWZlcnJlZCB0byB0aGUgc2FtZSBwZXJzb24uDQojIGluIGxpbWVzdXJ2ZXksIGkgY291bGQgbm90IGxldCB0aGUgbnVtYmVyIG9mIGNvbHVtbnMgY29uZGl0aW9uDQojIG9uIHRoZSBudW1iZXIgb2YgYWx0ZXJzIG5hbWVkIGluIHRoZSBsYXRlc3QgZWdvbmV0LCBzbyBpIG1hZGUgNSBzZXBhcmF0ZSBtYXRyaWNlcywNCiMgY29uZGl0aW9uYWwgb24gbmV0c2l6ZS4NCiMgaSBjYWxjdWxhdGUgbmV0c2l6ZSBmb3IgZWFjaCBuZXQNCnsNCiAgbmV0MSA8LSBjYmluZChkYXRhJGVnb25ldDEuU1EwMDEuLGRhdGEkZWdvbmV0MS5TUTAwMi4sIGRhdGEkZWdvbmV0MS5TUTAwMy4sZGF0YSRlZ29uZXQxLlNRMDA0LiwgZGF0YSRlZ29uZXQxLlNRMDA1LikNCiAgbmV0MSA8LSBpZmVsc2UobmV0MT09IiIsIE5BLCBuZXQxKQ0KICBuczEgPC0gdmVjdG9yKCkNCiAgZm9yIChpIGluIDE6bnJvdyhuZXQxKSkgew0KICAgIG5zMVtpXSA8LSBsZW5ndGgobmV0MVtpLF1bd2hpY2goIWlzLm5hKG5ldDFbaSxdKSldKQ0KICB9DQogIG5ldDIgPC0gY2JpbmQoZGF0YSRlZ29uZXQyLlNRMDAxLixkYXRhJGVnb25ldDIuU1EwMDIuLCBkYXRhJGVnb25ldDIuU1EwMDMuLGRhdGEkZWdvbmV0Mi5TUTAwNC4sIGRhdGEkZWdvbmV0Mi5TUTAwNS4pDQogIG5ldDIgPC0gaWZlbHNlKG5ldDI9PSIiLCBOQSwgbmV0MikNCiAgbnMyIDwtIHZlY3RvcigpDQogIGZvciAoaSBpbiAxOm5yb3cobmV0MikpIHsNCiAgICBuczJbaV0gPC0gbGVuZ3RoKG5ldDJbaSxdW3doaWNoKCFpcy5uYShuZXQyW2ksXSkpXSkNCiAgfQ0KICBuZXQzIDwtIGNiaW5kKGRhdGEkZWdvbmV0My5TUTAwMS4sZGF0YSRlZ29uZXQzLlNRMDAyLiwgZGF0YSRlZ29uZXQzLlNRMDAzLixkYXRhJGVnb25ldDMuU1EwMDQuLCBkYXRhJGVnb25ldDMuU1EwMDUuKQ0KICBuZXQzIDwtIGlmZWxzZShuZXQzPT0iIiwgTkEsIG5ldDMpDQogIG5zMyA8LSB2ZWN0b3IoKQ0KICBmb3IgKGkgaW4gMTpucm93KG5ldDMpKSB7DQogICAgbnMzW2ldIDwtIGxlbmd0aChuZXQzW2ksXVt3aGljaCghaXMubmEobmV0M1tpLF0pKV0pDQogIH0NCiAgbmV0NCA8LSBjYmluZChkYXRhJGVnb25ldDQuU1EwMDEuLGRhdGEkZWdvbmV0NC5TUTAwMi4sIGRhdGEkZWdvbmV0NC5TUTAwMy4sZGF0YSRlZ29uZXQ0LlNRMDA0LiwgZGF0YSRlZ29uZXQ0LlNRMDA1LikNCiAgbmV0NCA8LSBpZmVsc2UobmV0ND09IiIsIE5BLCBuZXQ0KQ0KICBuczQgPC0gdmVjdG9yKCkNCiAgZm9yIChpIGluIDE6bnJvdyhuZXQ0KSkgew0KICAgIG5zNFtpXSA8LSBsZW5ndGgobmV0NFtpLF1bd2hpY2goIWlzLm5hKG5ldDRbaSxdKSldKQ0KICB9DQp9DQoNCiMgaSBjb25zdHJ1Y3QgdGhlIG1hdGNoaW5nIG1hdHJpY2VzLCAxIC0gNSAoY29uZGl0aW9uYWwgb24gdGhlIG5zIG9mIHRoZSBsYXRlc3QgbmV0KQ0KIyBwdXQgdGhlc2UgaW4gYSBsaXN0IGFuZCBsaXN0IHRoZXNlIGFnYWluLCBmb3IgZWFjaCByZXNwb25kZW50IChzbyBhIGxpc3Qgb2YgbGlzdHMuLi4pDQptYXRjaGluZ0xpc3QgPC0gbGlzdCgpDQpmb3IgKGkgaW4gMTpsZW5ndGgoYWx0ZXJMKSkgeyAjIGZvciBlZ28gaQ0KICBtYXRjaGluZ0wgPC0gbGlzdCgpDQogICMgbWFrZSA1IHNlcGVyYXRlIG1hdGNoaW5nIG1hdHJpY2VzLiBuYXR1cmFsbHksIG9ubHkgMSBpcyByZWxldmFudC4uLiBidXQgaSB3aWxsIHNlbGVjdCB0aGF0IGxhdGVyLg0KICBtYXRjaGluZ0xbWzFdXSA8LSBjYmluZChkYXRhJG1hdGNoaW5nMU4xLlNRMDAxX1NRMDAxLltpXSxkYXRhJG1hdGNoaW5nMU4xLlNRMDAyX1NRMDAxLltpXSxkYXRhJG1hdGNoaW5nMU4xLlNRMDAzX1NRMDAxLltpXSxkYXRhJG1hdGNoaW5nMU4xLlNRMDA0X1NRMDAxLltpXSxkYXRhJG1hdGNoaW5nMU4xLlNRMDA1X1NRMDAxLltpXSkNCiAgbWF0Y2hpbmdMW1syXV08LSByYmluZCgNCiAgICBjYmluZChkYXRhJG1hdGNoaW5nMU4yLlNRMDAxX1NRMDAxLltpXSwgZGF0YSRtYXRjaGluZzFOMi5TUTAwMl9TUTAwMS5baV0sIGRhdGEkbWF0Y2hpbmcxTjIuU1EwMDNfU1EwMDEuW2ldLCBkYXRhJG1hdGNoaW5nMU4yLlNRMDA0X1NRMDAxLltpXSwgZGF0YSRtYXRjaGluZzFOMi5TUTAwNV9TUTAwMS5baV0pLA0KICAgIGNiaW5kKGRhdGEkbWF0Y2hpbmcxTjIuU1EwMDFfU1EwMDIuW2ldLCBkYXRhJG1hdGNoaW5nMU4yLlNRMDAyX1NRMDAyLltpXSwgZGF0YSRtYXRjaGluZzFOMi5TUTAwM19TUTAwMi5baV0sIGRhdGEkbWF0Y2hpbmcxTjIuU1EwMDRfU1EwMDIuW2ldLCBkYXRhJG1hdGNoaW5nMU4yLlNRMDA1X1NRMDAyLltpXSkpDQogIG1hdGNoaW5nTFtbM11dPC0gcmJpbmQoDQogICAgY2JpbmQoZGF0YSRtYXRjaGluZzFOMy5TUTAwMV9TUTAwMS5baV0sIGRhdGEkbWF0Y2hpbmcxTjMuU1EwMDJfU1EwMDEuW2ldLCBkYXRhJG1hdGNoaW5nMU4zLlNRMDAzX1NRMDAxLltpXSwgZGF0YSRtYXRjaGluZzFOMy5TUTAwNF9TUTAwMS5baV0sIGRhdGEkbWF0Y2hpbmcxTjMuU1EwMDVfU1EwMDEuW2ldKSwNCiAgICBjYmluZChkYXRhJG1hdGNoaW5nMU4zLlNRMDAxX1NRMDAyLltpXSwgZGF0YSRtYXRjaGluZzFOMy5TUTAwMl9TUTAwMi5baV0sIGRhdGEkbWF0Y2hpbmcxTjMuU1EwMDNfU1EwMDIuW2ldLCBkYXRhJG1hdGNoaW5nMU4zLlNRMDA0X1NRMDAyLltpXSwgZGF0YSRtYXRjaGluZzFOMy5TUTAwNV9TUTAwMi5baV0pLA0KICAgIGNiaW5kKGRhdGEkbWF0Y2hpbmcxTjMuU1EwMDFfU1EwMDMuW2ldLCBkYXRhJG1hdGNoaW5nMU4zLlNRMDAyX1NRMDAzLltpXSwgZGF0YSRtYXRjaGluZzFOMy5TUTAwM19TUTAwMy5baV0sIGRhdGEkbWF0Y2hpbmcxTjMuU1EwMDRfU1EwMDMuW2ldLCBkYXRhJG1hdGNoaW5nMU4zLlNRMDA1X1NRMDAzLltpXSkpDQogIG1hdGNoaW5nTFtbNF1dPC0gcmJpbmQoDQogICAgY2JpbmQoZGF0YSRtYXRjaGluZzFONC5TUTAwMV9TUTAwMS5baV0sIGRhdGEkbWF0Y2hpbmcxTjQuU1EwMDJfU1EwMDEuW2ldLCBkYXRhJG1hdGNoaW5nMU40LlNRMDAzX1NRMDAxLltpXSwgZGF0YSRtYXRjaGluZzFONC5TUTAwNF9TUTAwMS5baV0sIGRhdGEkbWF0Y2hpbmcxTjQuU1EwMDVfU1EwMDEuW2ldKSwNCiAgICBjYmluZChkYXRhJG1hdGNoaW5nMU40LlNRMDAxX1NRMDAyLltpXSwgZGF0YSRtYXRjaGluZzFONC5TUTAwMl9TUTAwMi5baV0sIGRhdGEkbWF0Y2hpbmcxTjQuU1EwMDNfU1EwMDIuW2ldLCBkYXRhJG1hdGNoaW5nMU40LlNRMDA0X1NRMDAyLltpXSwgZGF0YSRtYXRjaGluZzFONC5TUTAwNV9TUTAwMi5baV0pLA0KICAgIGNiaW5kKGRhdGEkbWF0Y2hpbmcxTjQuU1EwMDFfU1EwMDMuW2ldLCBkYXRhJG1hdGNoaW5nMU40LlNRMDAyX1NRMDAzLltpXSwgZGF0YSRtYXRjaGluZzFONC5TUTAwM19TUTAwMy5baV0sIGRhdGEkbWF0Y2hpbmcxTjQuU1EwMDRfU1EwMDMuW2ldLCBkYXRhJG1hdGNoaW5nMU40LlNRMDA1X1NRMDAzLltpXSksDQogICAgY2JpbmQoZGF0YSRtYXRjaGluZzFONC5TUTAwMV9TUTAwNC5baV0sIGRhdGEkbWF0Y2hpbmcxTjQuU1EwMDJfU1EwMDQuW2ldLCBkYXRhJG1hdGNoaW5nMU40LlNRMDAzX1NRMDA0LltpXSwgZGF0YSRtYXRjaGluZzFONC5TUTAwNF9TUTAwNC5baV0sIGRhdGEkbWF0Y2hpbmcxTjQuU1EwMDVfU1EwMDQuW2ldKSkNCiAgbWF0Y2hpbmdMW1s1XV08LSByYmluZCgNCiAgICBjYmluZChkYXRhJG1hdGNoaW5nMU41LlNRMDAxX1NRMDAxLltpXSwgZGF0YSRtYXRjaGluZzFONS5TUTAwMl9TUTAwMS5baV0sIGRhdGEkbWF0Y2hpbmcxTjUuU1EwMDNfU1EwMDEuW2ldLCBkYXRhJG1hdGNoaW5nMU41LlNRMDA0X1NRMDAxLltpXSwgZGF0YSRtYXRjaGluZzFONS5TUTAwNV9TUTAwMS5baV0pLA0KICAgIGNiaW5kKGRhdGEkbWF0Y2hpbmcxTjUuU1EwMDFfU1EwMDIuW2ldLCBkYXRhJG1hdGNoaW5nMU41LlNRMDAyX1NRMDAyLltpXSwgZGF0YSRtYXRjaGluZzFONS5TUTAwM19TUTAwMi5baV0sIGRhdGEkbWF0Y2hpbmcxTjUuU1EwMDRfU1EwMDIuW2ldLCBkYXRhJG1hdGNoaW5nMU41LlNRMDA1X1NRMDAyLltpXSksDQogICAgY2JpbmQoZGF0YSRtYXRjaGluZzFONS5TUTAwMV9TUTAwMy5baV0sIGRhdGEkbWF0Y2hpbmcxTjUuU1EwMDJfU1EwMDMuW2ldLCBkYXRhJG1hdGNoaW5nMU41LlNRMDAzX1NRMDAzLltpXSwgZGF0YSRtYXRjaGluZzFONS5TUTAwNF9TUTAwMy5baV0sIGRhdGEkbWF0Y2hpbmcxTjUuU1EwMDVfU1EwMDMuW2ldKSwNCiAgICBjYmluZChkYXRhJG1hdGNoaW5nMU41LlNRMDAxX1NRMDA0LltpXSwgZGF0YSRtYXRjaGluZzFONS5TUTAwMl9TUTAwNC5baV0sIGRhdGEkbWF0Y2hpbmcxTjUuU1EwMDNfU1EwMDQuW2ldLCBkYXRhJG1hdGNoaW5nMU41LlNRMDA0X1NRMDA0LltpXSwgZGF0YSRtYXRjaGluZzFONS5TUTAwNV9TUTAwNC5baV0pLA0KICAgIGNiaW5kKGRhdGEkbWF0Y2hpbmcxTjUuU1EwMDFfU1EwMDUuW2ldLCBkYXRhJG1hdGNoaW5nMU41LlNRMDAyX1NRMDA1LltpXSwgZGF0YSRtYXRjaGluZzFONS5TUTAwM19TUTAwNS5baV0sIGRhdGEkbWF0Y2hpbmcxTjUuU1EwMDRfU1EwMDUuW2ldLCBkYXRhJG1hdGNoaW5nMU41LlNRMDA1X1NRMDA1LltpXSkpDQogIG1hdGNoaW5nTGlzdFtbaV1dIDwtIG1hdGNoaW5nTA0KfSAjIHNvLi4uIG1hdGNoaW5nTFtbMV1dW1s1XV0gaXMgbWF0Y2hpbmdtYXRyaXggNSAoaS5lLiwgNSBhbHRlcnMgbmFtZWQgaW4gZWdvbmV0MikgZm9yIGVnbyAxDQoNCiMgdGhlIGNvbWJpbmF0aW9uIG9mIHRoZSBtYXRjaGluZyBtYXRyaWNlcyBhbmQgdGhlIG5ldHNpemVzIGZvciBlZ28gYWxsb3dzIG1lIHRvIG1hdGNoIHRoZSBuYW1lcyBteXNlbGYuDQpmb3IgKGkgaW4gMTpsZW5ndGgobWF0Y2hpbmdMaXN0KSkgeyAgICAgIyBmb3IgZWdvIGkNCiAgbUwgPC0gbWF0Y2hpbmdMaXN0W1tpXV0gICAgICAgICAgICAgICAjIGdldCB0aGUgbWF0Y2hpbmcgbGlzdA0KICBucyA8LSBuczJbW2ldXSAgICAgICAgICAgICAgICAgICAgICAgICMgZ2V0IHRoZSBzaXplIG9mIGVnb25ldDINCiAgaWYobnM+MCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGlmIG5zPTAsIG5vIG1hdGNoaW5nIHdhcyBkb25lIQ0KICAgIG1tIDwtIGFzLm1hdHJpeChtTFtbbnNdXSkgICAgICAgICAgICMgcmV0cmlldmUgdGhlIGNvcnJlc3BvbmRpbmcgbWF0cml4DQogICAgbWF0Y2hlZCA8LSB3aGljaChtbT09MSwgYXJyLmluZD1UKSAgIyByZXRyaWV2ZSBhcnJheSBpbmRpY2VzDQogICAgbmV0IDwtIG5ldDJbaSxdDQogICAgaWYobGVuZ3RoKG1hdGNoZWQpPjApIHsgICAgICAgICAgICAgIyBpZiBtYXRjaGluZyB3YXMgcGVyZm9ybWVkIQ0KICAgICAgYWx0ZXJMW1tpXV0kbmFtZTJbd2hpY2goYWx0ZXJMW1tpXV0kYWx0ZXJpZD09bWF0Y2hlZFssMl0pXSA8LSBuZXRbbWF0Y2hlZFssMV1dDQogICAgfQ0KICB9DQp9ICNpZ25vcmUgd2FybmluZw0KDQojcmVwZWF0IGZvciB0aGUgc2Vjb25kIG1hdGNoaW5nIG1hdHJpY2VzDQojIChpLmUuLCBtYXRjaGluZyBlZ29uZXQzIGFsdGVycyB0byBwcmV2LiBhbHRlcnMpOw0KbWF0Y2hpbmdMaXN0MiA8LSBsaXN0KCkNCmZvciAoaSBpbiAxOmxlbmd0aChhbHRlckwpKSB7ICMgZm9yIGVnbyBpDQogIG1hdGNoaW5nMkwgPC0gbGlzdCgpDQogIG1hdGNoaW5nMkxbWzFdXSA8LSBjYmluZChkYXRhJG1hdGNoaW5nMk4xLlNRMDAxX1NRMDAxLltpXSxkYXRhJG1hdGNoaW5nMk4xLlNRMDAyX1NRMDAxLltpXSxkYXRhJG1hdGNoaW5nMk4xLlNRMDAzX1NRMDAxLltpXSxkYXRhJG1hdGNoaW5nMk4xLlNRMDA0X1NRMDAxLltpXSxkYXRhJG1hdGNoaW5nMk4xLlNRMDA1X1NRMDAxLltpXSxkYXRhJG1hdGNoaW5nMk4xLlNRMDA2X1NRMDAxLltpXSxkYXRhJG1hdGNoaW5nMk4xLlNRMDA3X1NRMDAxLltpXSxkYXRhJG1hdGNoaW5nMk4xLlNRMDA4X1NRMDAxLltpXSxkYXRhJG1hdGNoaW5nMk4xLlNRMDA5X1NRMDAxLltpXSxkYXRhJG1hdGNoaW5nMk4xLlNRMDEwX1NRMDAxLltpXSkNCiAgbWF0Y2hpbmcyTFtbMl1dIDwtIHJiaW5kKA0KICAgIGNiaW5kKGRhdGEkbWF0Y2hpbmcyTjIuU1EwMDFfU1EwMDEuW2ldLGRhdGEkbWF0Y2hpbmcyTjIuU1EwMDJfU1EwMDEuW2ldLGRhdGEkbWF0Y2hpbmcyTjIuU1EwMDNfU1EwMDEuW2ldLGRhdGEkbWF0Y2hpbmcyTjIuU1EwMDRfU1EwMDEuW2ldLGRhdGEkbWF0Y2hpbmcyTjIuU1EwMDVfU1EwMDEuW2ldLGRhdGEkbWF0Y2hpbmcyTjIuU1EwMDZfU1EwMDEuW2ldLGRhdGEkbWF0Y2hpbmcyTjIuU1EwMDdfU1EwMDEuW2ldLGRhdGEkbWF0Y2hpbmcyTjIuU1EwMDhfU1EwMDEuW2ldLGRhdGEkbWF0Y2hpbmcyTjIuU1EwMDlfU1EwMDEuW2ldLGRhdGEkbWF0Y2hpbmcyTjIuU1EwMTBfU1EwMDEuW2ldKSwNCiAgICBjYmluZChkYXRhJG1hdGNoaW5nMk4yLlNRMDAxX1NRMDAyLltpXSxkYXRhJG1hdGNoaW5nMk4yLlNRMDAyX1NRMDAyLltpXSxkYXRhJG1hdGNoaW5nMk4yLlNRMDAzX1NRMDAyLltpXSxkYXRhJG1hdGNoaW5nMk4yLlNRMDA0X1NRMDAyLltpXSxkYXRhJG1hdGNoaW5nMk4yLlNRMDA1X1NRMDAyLltpXSxkYXRhJG1hdGNoaW5nMk4yLlNRMDA2X1NRMDAyLltpXSxkYXRhJG1hdGNoaW5nMk4yLlNRMDA3X1NRMDAyLltpXSxkYXRhJG1hdGNoaW5nMk4yLlNRMDA4X1NRMDAyLltpXSxkYXRhJG1hdGNoaW5nMk4yLlNRMDA5X1NRMDAyLltpXSxkYXRhJG1hdGNoaW5nMk4yLlNRMDEwX1NRMDAyLltpXSkpDQogIG1hdGNoaW5nMkxbWzNdXSA8LSByYmluZCgNCiAgICBjYmluZChkYXRhJG1hdGNoaW5nMk4zLlNRMDAxX1NRMDAxLltpXSxkYXRhJG1hdGNoaW5nMk4zLlNRMDAyX1NRMDAxLltpXSxkYXRhJG1hdGNoaW5nMk4zLlNRMDAzX1NRMDAxLltpXSxkYXRhJG1hdGNoaW5nMk4zLlNRMDA0X1NRMDAxLltpXSxkYXRhJG1hdGNoaW5nMk4zLlNRMDA1X1NRMDAxLltpXSxkYXRhJG1hdGNoaW5nMk4zLlNRMDA2X1NRMDAxLltpXSxkYXRhJG1hdGNoaW5nMk4zLlNRMDA3X1NRMDAxLltpXSxkYXRhJG1hdGNoaW5nMk4zLlNRMDA4X1NRMDAxLltpXSxkYXRhJG1hdGNoaW5nMk4zLlNRMDA5X1NRMDAxLltpXSxkYXRhJG1hdGNoaW5nMk4zLlNRMDEwX1NRMDAxLltpXSksDQogICAgY2JpbmQoZGF0YSRtYXRjaGluZzJOMy5TUTAwMV9TUTAwMi5baV0sZGF0YSRtYXRjaGluZzJOMy5TUTAwMl9TUTAwMi5baV0sZGF0YSRtYXRjaGluZzJOMy5TUTAwM19TUTAwMi5baV0sZGF0YSRtYXRjaGluZzJOMy5TUTAwNF9TUTAwMi5baV0sZGF0YSRtYXRjaGluZzJOMy5TUTAwNV9TUTAwMi5baV0sZGF0YSRtYXRjaGluZzJOMy5TUTAwNl9TUTAwMi5baV0sZGF0YSRtYXRjaGluZzJOMy5TUTAwN19TUTAwMi5baV0sZGF0YSRtYXRjaGluZzJOMy5TUTAwOF9TUTAwMi5baV0sZGF0YSRtYXRjaGluZzJOMy5TUTAwOV9TUTAwMi5baV0sZGF0YSRtYXRjaGluZzJOMy5TUTAxMF9TUTAwMi5baV0pLA0KICAgIGNiaW5kKGRhdGEkbWF0Y2hpbmcyTjMuU1EwMDFfU1EwMDMuW2ldLGRhdGEkbWF0Y2hpbmcyTjMuU1EwMDJfU1EwMDMuW2ldLGRhdGEkbWF0Y2hpbmcyTjMuU1EwMDNfU1EwMDMuW2ldLGRhdGEkbWF0Y2hpbmcyTjMuU1EwMDRfU1EwMDMuW2ldLGRhdGEkbWF0Y2hpbmcyTjMuU1EwMDVfU1EwMDMuW2ldLGRhdGEkbWF0Y2hpbmcyTjMuU1EwMDZfU1EwMDMuW2ldLGRhdGEkbWF0Y2hpbmcyTjMuU1EwMDdfU1EwMDMuW2ldLGRhdGEkbWF0Y2hpbmcyTjMuU1EwMDhfU1EwMDMuW2ldLGRhdGEkbWF0Y2hpbmcyTjMuU1EwMDlfU1EwMDMuW2ldLGRhdGEkbWF0Y2hpbmcyTjMuU1EwMTBfU1EwMDMuW2ldKSkNCiAgbWF0Y2hpbmcyTFtbNF1dIDwtIHJiaW5kKA0KICAgIGNiaW5kKGRhdGEkbWF0Y2hpbmcyTjQuU1EwMDFfU1EwMDEuW2ldLGRhdGEkbWF0Y2hpbmcyTjQuU1EwMDJfU1EwMDEuW2ldLGRhdGEkbWF0Y2hpbmcyTjQuU1EwMDNfU1EwMDEuW2ldLGRhdGEkbWF0Y2hpbmcyTjQuU1EwMDRfU1EwMDEuW2ldLGRhdGEkbWF0Y2hpbmcyTjQuU1EwMDVfU1EwMDEuW2ldLGRhdGEkbWF0Y2hpbmcyTjQuU1EwMDZfU1EwMDEuW2ldLGRhdGEkbWF0Y2hpbmcyTjQuU1EwMDdfU1EwMDEuW2ldLGRhdGEkbWF0Y2hpbmcyTjQuU1EwMDhfU1EwMDEuW2ldLGRhdGEkbWF0Y2hpbmcyTjQuU1EwMDlfU1EwMDEuW2ldLGRhdGEkbWF0Y2hpbmcyTjQuU1EwMTBfU1EwMDEuW2ldKSwNCiAgICBjYmluZChkYXRhJG1hdGNoaW5nMk40LlNRMDAxX1NRMDAyLltpXSxkYXRhJG1hdGNoaW5nMk40LlNRMDAyX1NRMDAyLltpXSxkYXRhJG1hdGNoaW5nMk40LlNRMDAzX1NRMDAyLltpXSxkYXRhJG1hdGNoaW5nMk40LlNRMDA0X1NRMDAyLltpXSxkYXRhJG1hdGNoaW5nMk40LlNRMDA1X1NRMDAyLltpXSxkYXRhJG1hdGNoaW5nMk40LlNRMDA2X1NRMDAyLltpXSxkYXRhJG1hdGNoaW5nMk40LlNRMDA3X1NRMDAyLltpXSxkYXRhJG1hdGNoaW5nMk40LlNRMDA4X1NRMDAyLltpXSxkYXRhJG1hdGNoaW5nMk40LlNRMDA5X1NRMDAyLltpXSxkYXRhJG1hdGNoaW5nMk40LlNRMDEwX1NRMDAyLltpXSksDQogICAgY2JpbmQoZGF0YSRtYXRjaGluZzJONC5TUTAwMV9TUTAwMy5baV0sZGF0YSRtYXRjaGluZzJONC5TUTAwMl9TUTAwMy5baV0sZGF0YSRtYXRjaGluZzJONC5TUTAwM19TUTAwMy5baV0sZGF0YSRtYXRjaGluZzJONC5TUTAwNF9TUTAwMy5baV0sZGF0YSRtYXRjaGluZzJONC5TUTAwNV9TUTAwMy5baV0sZGF0YSRtYXRjaGluZzJONC5TUTAwNl9TUTAwMy5baV0sZGF0YSRtYXRjaGluZzJONC5TUTAwN19TUTAwMy5baV0sZGF0YSRtYXRjaGluZzJONC5TUTAwOF9TUTAwMy5baV0sZGF0YSRtYXRjaGluZzJONC5TUTAwOV9TUTAwMy5baV0sZGF0YSRtYXRjaGluZzJONC5TUTAxMF9TUTAwMy5baV0pLA0KICAgIGNiaW5kKGRhdGEkbWF0Y2hpbmcyTjQuU1EwMDFfU1EwMDQuW2ldLGRhdGEkbWF0Y2hpbmcyTjQuU1EwMDJfU1EwMDQuW2ldLGRhdGEkbWF0Y2hpbmcyTjQuU1EwMDNfU1EwMDQuW2ldLGRhdGEkbWF0Y2hpbmcyTjQuU1EwMDRfU1EwMDQuW2ldLGRhdGEkbWF0Y2hpbmcyTjQuU1EwMDVfU1EwMDQuW2ldLGRhdGEkbWF0Y2hpbmcyTjQuU1EwMDZfU1EwMDQuW2ldLGRhdGEkbWF0Y2hpbmcyTjQuU1EwMDdfU1EwMDQuW2ldLGRhdGEkbWF0Y2hpbmcyTjQuU1EwMDhfU1EwMDQuW2ldLGRhdGEkbWF0Y2hpbmcyTjQuU1EwMDlfU1EwMDQuW2ldLGRhdGEkbWF0Y2hpbmcyTjQuU1EwMTBfU1EwMDQuW2ldKSkNCiAgbWF0Y2hpbmcyTFtbNV1dIDwtIHJiaW5kKA0KICAgIGNiaW5kKGRhdGEkbWF0Y2hpbmcyTjUuU1EwMDFfU1EwMDEuW2ldLGRhdGEkbWF0Y2hpbmcyTjUuU1EwMDJfU1EwMDEuW2ldLGRhdGEkbWF0Y2hpbmcyTjUuU1EwMDNfU1EwMDEuW2ldLGRhdGEkbWF0Y2hpbmcyTjUuU1EwMDRfU1EwMDEuW2ldLGRhdGEkbWF0Y2hpbmcyTjUuU1EwMDVfU1EwMDEuW2ldLGRhdGEkbWF0Y2hpbmcyTjUuU1EwMDZfU1EwMDEuW2ldLGRhdGEkbWF0Y2hpbmcyTjUuU1EwMDdfU1EwMDEuW2ldLGRhdGEkbWF0Y2hpbmcyTjUuU1EwMDhfU1EwMDEuW2ldLGRhdGEkbWF0Y2hpbmcyTjUuU1EwMDlfU1EwMDEuW2ldLGRhdGEkbWF0Y2hpbmcyTjUuU1EwMTBfU1EwMDEuW2ldKSwNCiAgICBjYmluZChkYXRhJG1hdGNoaW5nMk41LlNRMDAxX1NRMDAyLltpXSxkYXRhJG1hdGNoaW5nMk41LlNRMDAyX1NRMDAyLltpXSxkYXRhJG1hdGNoaW5nMk41LlNRMDAzX1NRMDAyLltpXSxkYXRhJG1hdGNoaW5nMk41LlNRMDA0X1NRMDAyLltpXSxkYXRhJG1hdGNoaW5nMk41LlNRMDA1X1NRMDAyLltpXSxkYXRhJG1hdGNoaW5nMk41LlNRMDA2X1NRMDAyLltpXSxkYXRhJG1hdGNoaW5nMk41LlNRMDA3X1NRMDAyLltpXSxkYXRhJG1hdGNoaW5nMk41LlNRMDA4X1NRMDAyLltpXSxkYXRhJG1hdGNoaW5nMk41LlNRMDA5X1NRMDAyLltpXSxkYXRhJG1hdGNoaW5nMk41LlNRMDEwX1NRMDAyLltpXSksDQogICAgY2JpbmQoZGF0YSRtYXRjaGluZzJONS5TUTAwMV9TUTAwMy5baV0sZGF0YSRtYXRjaGluZzJONS5TUTAwMl9TUTAwMy5baV0sZGF0YSRtYXRjaGluZzJONS5TUTAwM19TUTAwMy5baV0sZGF0YSRtYXRjaGluZzJONS5TUTAwNF9TUTAwMy5baV0sZGF0YSRtYXRjaGluZzJONS5TUTAwNV9TUTAwMy5baV0sZGF0YSRtYXRjaGluZzJONS5TUTAwNl9TUTAwMy5baV0sZGF0YSRtYXRjaGluZzJONS5TUTAwN19TUTAwMy5baV0sZGF0YSRtYXRjaGluZzJONS5TUTAwOF9TUTAwMy5baV0sZGF0YSRtYXRjaGluZzJONS5TUTAwOV9TUTAwMy5baV0sZGF0YSRtYXRjaGluZzJONS5TUTAxMF9TUTAwMy5baV0pLA0KICAgIGNiaW5kKGRhdGEkbWF0Y2hpbmcyTjUuU1EwMDFfU1EwMDQuW2ldLGRhdGEkbWF0Y2hpbmcyTjUuU1EwMDJfU1EwMDQuW2ldLGRhdGEkbWF0Y2hpbmcyTjUuU1EwMDNfU1EwMDQuW2ldLGRhdGEkbWF0Y2hpbmcyTjUuU1EwMDRfU1EwMDQuW2ldLGRhdGEkbWF0Y2hpbmcyTjUuU1EwMDVfU1EwMDQuW2ldLGRhdGEkbWF0Y2hpbmcyTjUuU1EwMDZfU1EwMDQuW2ldLGRhdGEkbWF0Y2hpbmcyTjUuU1EwMDdfU1EwMDQuW2ldLGRhdGEkbWF0Y2hpbmcyTjUuU1EwMDhfU1EwMDQuW2ldLGRhdGEkbWF0Y2hpbmcyTjUuU1EwMDlfU1EwMDQuW2ldLGRhdGEkbWF0Y2hpbmcyTjUuU1EwMTBfU1EwMDQuW2ldKSwNCiAgICBjYmluZChkYXRhJG1hdGNoaW5nMk41LlNRMDAxX1NRMDA1LltpXSxkYXRhJG1hdGNoaW5nMk41LlNRMDAyX1NRMDA1LltpXSxkYXRhJG1hdGNoaW5nMk41LlNRMDAzX1NRMDA1LltpXSxkYXRhJG1hdGNoaW5nMk41LlNRMDA0X1NRMDA1LltpXSxkYXRhJG1hdGNoaW5nMk41LlNRMDA1X1NRMDA1LltpXSxkYXRhJG1hdGNoaW5nMk41LlNRMDA2X1NRMDA1LltpXSxkYXRhJG1hdGNoaW5nMk41LlNRMDA3X1NRMDA1LltpXSxkYXRhJG1hdGNoaW5nMk41LlNRMDA4X1NRMDA1LltpXSxkYXRhJG1hdGNoaW5nMk41LlNRMDA5X1NRMDA1LltpXSxkYXRhJG1hdGNoaW5nMk41LlNRMDEwX1NRMDA1LltpXSkpDQogIG1hdGNoaW5nTGlzdDJbW2ldXSA8LSBtYXRjaGluZzJMDQp9DQoNCmZvciAoaSBpbiAxOmxlbmd0aChtYXRjaGluZ0xpc3QyKSkgeyAgICAjIGZvciBlZ28gaQ0KICBtTCA8LSBtYXRjaGluZ0xpc3QyW1tpXV0gICAgICAgICAgICAgICMgZ2V0IHRoZSBtYXRjaGluZyBsaXN0IDINCiAgbnMgPC0gbnMzW1tpXV0gICAgICAgICAgICAgICAgICAgICAgICAjIGdldCB0aGUgc2l6ZSBvZiBlZ29uZXQzDQogIGlmKG5zPjApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBpZiBucz0wLCBubyBtYXRjaGluZyB3YXMgZG9uZSENCiAgICBtbSA8LSBhcy5tYXRyaXgobUxbW25zXV0pICAgICAgICAgICAjIGFuZCB0aGUgY29ycmVzcG9uZGluZyBtYXRyaXgNCiAgICBtYXRjaGVkIDwtIHdoaWNoKG1tPT0xLCBhcnIuaW5kPVQpICAjIHJldHJpZXZlIGFycmF5IGluZGljZXMNCiAgICBuZXQgPC0gbmV0M1tpLF0NCiAgICANCiAgICBpZihsZW5ndGgobWF0Y2hlZCk+MCkgeyAgICAgICAgICAgICAjIGlmIG1hdGNoaW5nIHdhcyBwZXJmb3JtZWQhDQogICAgICBhbHRlckxbW2ldXSRuYW1lM1ttYXRjaGVkWywyXV0gPC0gbmV0W21hdGNoZWRbLDFdXQ0KICAgIH0NCiAgfQ0KfQ0KDQojYW5kIGZvciBtYXRjaGluZyBtYXRyaXggMyAoaS5lLiwgbWF0Y2hpbmcgZWdvbmV0NCB3aXRoIGVnb25ldHMgMS0zKQ0KbWF0Y2hpbmdMaXN0MyA8LSBsaXN0KCkNCmZvciAoaSBpbiAxOmxlbmd0aChhbHRlckwpKSB7ICMgZm9yIGVnbyBpDQogIG1hdGNoaW5nM0wgPC0gbGlzdCgpDQogIG1hdGNoaW5nM0xbWzFdXSA8LSBjYmluZChkYXRhJG1hdGNoaW5nM04xLlNRMDAxX1NRMDAxLltpXSxkYXRhJG1hdGNoaW5nM04xLlNRMDAyX1NRMDAxLltpXSxkYXRhJG1hdGNoaW5nM04xLlNRMDAzX1NRMDAxLltpXSxkYXRhJG1hdGNoaW5nM04xLlNRMDA0X1NRMDAxLltpXSxkYXRhJG1hdGNoaW5nM04xLlNRMDA1X1NRMDAxLltpXSxkYXRhJG1hdGNoaW5nM04xLlNRMDA2X1NRMDAxLltpXSxkYXRhJG1hdGNoaW5nM04xLlNRMDA3X1NRMDAxLltpXSxkYXRhJG1hdGNoaW5nM04xLlNRMDA4X1NRMDAxLltpXSxkYXRhJG1hdGNoaW5nM04xLlNRMDA5X1NRMDAxLltpXSxkYXRhJG1hdGNoaW5nM04xLlNRMDEwX1NRMDAxLltpXSwgZGF0YSRtYXRjaGluZzNOMS5TUTAxMV9TUTAwMS5baV0sIGRhdGEkbWF0Y2hpbmczTjEuU1EwMTJfU1EwMDEuW2ldLCBkYXRhJG1hdGNoaW5nM04xLlNRMDEzX1NRMDAxLltpXSwgZGF0YSRtYXRjaGluZzNOMS5TUTAxNF9TUTAwMS5baV0sIGRhdGEkbWF0Y2hpbmczTjEuU1EwMTVfU1EwMDEuW2ldKQ0KICBtYXRjaGluZzNMW1syXV0gPC0gcmJpbmQoDQogICAgY2JpbmQoZGF0YSRtYXRjaGluZzNOMi5TUTAwMV9TUTAwMS5baV0sZGF0YSRtYXRjaGluZzNOMi5TUTAwMl9TUTAwMS5baV0sZGF0YSRtYXRjaGluZzNOMi5TUTAwM19TUTAwMS5baV0sZGF0YSRtYXRjaGluZzNOMi5TUTAwNF9TUTAwMS5baV0sZGF0YSRtYXRjaGluZzNOMi5TUTAwNV9TUTAwMS5baV0sZGF0YSRtYXRjaGluZzNOMi5TUTAwNl9TUTAwMS5baV0sZGF0YSRtYXRjaGluZzNOMi5TUTAwN19TUTAwMS5baV0sZGF0YSRtYXRjaGluZzNOMi5TUTAwOF9TUTAwMS5baV0sZGF0YSRtYXRjaGluZzNOMi5TUTAwOV9TUTAwMS5baV0sZGF0YSRtYXRjaGluZzNOMi5TUTAxMF9TUTAwMS5baV0sIGRhdGEkbWF0Y2hpbmczTjIuU1EwMTFfU1EwMDEuW2ldLCBkYXRhJG1hdGNoaW5nM04yLlNRMDEyX1NRMDAxLltpXSwgZGF0YSRtYXRjaGluZzNOMi5TUTAxM19TUTAwMS5baV0sIGRhdGEkbWF0Y2hpbmczTjIuU1EwMTRfU1EwMDEuW2ldLCBkYXRhJG1hdGNoaW5nM04yLlNRMDE1X1NRMDAxLltpXSksDQogICAgY2JpbmQoZGF0YSRtYXRjaGluZzNOMi5TUTAwMV9TUTAwMi5baV0sZGF0YSRtYXRjaGluZzNOMi5TUTAwMl9TUTAwMi5baV0sZGF0YSRtYXRjaGluZzNOMi5TUTAwM19TUTAwMi5baV0sZGF0YSRtYXRjaGluZzNOMi5TUTAwNF9TUTAwMi5baV0sZGF0YSRtYXRjaGluZzNOMi5TUTAwNV9TUTAwMi5baV0sZGF0YSRtYXRjaGluZzNOMi5TUTAwNl9TUTAwMi5baV0sZGF0YSRtYXRjaGluZzNOMi5TUTAwN19TUTAwMi5baV0sZGF0YSRtYXRjaGluZzNOMi5TUTAwOF9TUTAwMi5baV0sZGF0YSRtYXRjaGluZzNOMi5TUTAwOV9TUTAwMi5baV0sZGF0YSRtYXRjaGluZzNOMi5TUTAxMF9TUTAwMi5baV0sIGRhdGEkbWF0Y2hpbmczTjIuU1EwMTFfU1EwMDIuW2ldLCBkYXRhJG1hdGNoaW5nM04yLlNRMDEyX1NRMDAyLltpXSwgZGF0YSRtYXRjaGluZzNOMi5TUTAxM19TUTAwMi5baV0sIGRhdGEkbWF0Y2hpbmczTjIuU1EwMTRfU1EwMDIuW2ldLCBkYXRhJG1hdGNoaW5nM04yLlNRMDE1X1NRMDAyLltpXSkpDQogIG1hdGNoaW5nM0xbWzNdXSA8LSByYmluZCgNCiAgICBjYmluZChkYXRhJG1hdGNoaW5nM04zLlNRMDAxX1NRMDAxLltpXSxkYXRhJG1hdGNoaW5nM04zLlNRMDAyX1NRMDAxLltpXSxkYXRhJG1hdGNoaW5nM04zLlNRMDAzX1NRMDAxLltpXSxkYXRhJG1hdGNoaW5nM04zLlNRMDA0X1NRMDAxLltpXSxkYXRhJG1hdGNoaW5nM04zLlNRMDA1X1NRMDAxLltpXSxkYXRhJG1hdGNoaW5nM04zLlNRMDA2X1NRMDAxLltpXSxkYXRhJG1hdGNoaW5nM04zLlNRMDA3X1NRMDAxLltpXSxkYXRhJG1hdGNoaW5nM04zLlNRMDA4X1NRMDAxLltpXSxkYXRhJG1hdGNoaW5nM04zLlNRMDA5X1NRMDAxLltpXSxkYXRhJG1hdGNoaW5nM04zLlNRMDEwX1NRMDAxLltpXSwgZGF0YSRtYXRjaGluZzNOMy5TUTAxMV9TUTAwMS5baV0sIGRhdGEkbWF0Y2hpbmczTjMuU1EwMTJfU1EwMDEuW2ldLCBkYXRhJG1hdGNoaW5nM04zLlNRMDEzX1NRMDAxLltpXSwgZGF0YSRtYXRjaGluZzNOMy5TUTAxNF9TUTAwMS5baV0sIGRhdGEkbWF0Y2hpbmczTjMuU1EwMTVfU1EwMDEuW2ldKSwNCiAgICBjYmluZChkYXRhJG1hdGNoaW5nM04zLlNRMDAxX1NRMDAyLltpXSxkYXRhJG1hdGNoaW5nM04zLlNRMDAyX1NRMDAyLltpXSxkYXRhJG1hdGNoaW5nM04zLlNRMDAzX1NRMDAyLltpXSxkYXRhJG1hdGNoaW5nM04zLlNRMDA0X1NRMDAyLltpXSxkYXRhJG1hdGNoaW5nM04zLlNRMDA1X1NRMDAyLltpXSxkYXRhJG1hdGNoaW5nM04zLlNRMDA2X1NRMDAyLltpXSxkYXRhJG1hdGNoaW5nM04zLlNRMDA3X1NRMDAyLltpXSxkYXRhJG1hdGNoaW5nM04zLlNRMDA4X1NRMDAyLltpXSxkYXRhJG1hdGNoaW5nM04zLlNRMDA5X1NRMDAyLltpXSxkYXRhJG1hdGNoaW5nM04zLlNRMDEwX1NRMDAyLltpXSwgZGF0YSRtYXRjaGluZzNOMy5TUTAxMV9TUTAwMi5baV0sIGRhdGEkbWF0Y2hpbmczTjMuU1EwMTJfU1EwMDIuW2ldLCBkYXRhJG1hdGNoaW5nM04zLlNRMDEzX1NRMDAyLltpXSwgZGF0YSRtYXRjaGluZzNOMy5TUTAxNF9TUTAwMi5baV0sIGRhdGEkbWF0Y2hpbmczTjMuU1EwMTVfU1EwMDIuW2ldKSwNCiAgICBjYmluZChkYXRhJG1hdGNoaW5nM04zLlNRMDAxX1NRMDAzLltpXSxkYXRhJG1hdGNoaW5nM04zLlNRMDAyX1NRMDAzLltpXSxkYXRhJG1hdGNoaW5nM04zLlNRMDAzX1NRMDAzLltpXSxkYXRhJG1hdGNoaW5nM04zLlNRMDA0X1NRMDAzLltpXSxkYXRhJG1hdGNoaW5nM04zLlNRMDA1X1NRMDAzLltpXSxkYXRhJG1hdGNoaW5nM04zLlNRMDA2X1NRMDAzLltpXSxkYXRhJG1hdGNoaW5nM04zLlNRMDA3X1NRMDAzLltpXSxkYXRhJG1hdGNoaW5nM04zLlNRMDA4X1NRMDAzLltpXSxkYXRhJG1hdGNoaW5nM04zLlNRMDA5X1NRMDAzLltpXSxkYXRhJG1hdGNoaW5nM04zLlNRMDEwX1NRMDAzLltpXSwgZGF0YSRtYXRjaGluZzNOMy5TUTAxMV9TUTAwMy5baV0sIGRhdGEkbWF0Y2hpbmczTjMuU1EwMTJfU1EwMDMuW2ldLCBkYXRhJG1hdGNoaW5nM04zLlNRMDEzX1NRMDAzLltpXSwgZGF0YSRtYXRjaGluZzNOMy5TUTAxNF9TUTAwMy5baV0sIGRhdGEkbWF0Y2hpbmczTjMuU1EwMTVfU1EwMDMuW2ldKSkNCiAgbWF0Y2hpbmczTFtbNF1dIDwtIHJiaW5kKA0KICAgIGNiaW5kKGRhdGEkbWF0Y2hpbmczTjQuU1EwMDFfU1EwMDEuW2ldLGRhdGEkbWF0Y2hpbmczTjQuU1EwMDJfU1EwMDEuW2ldLGRhdGEkbWF0Y2hpbmczTjQuU1EwMDNfU1EwMDEuW2ldLGRhdGEkbWF0Y2hpbmczTjQuU1EwMDRfU1EwMDEuW2ldLGRhdGEkbWF0Y2hpbmczTjQuU1EwMDVfU1EwMDEuW2ldLGRhdGEkbWF0Y2hpbmczTjQuU1EwMDZfU1EwMDEuW2ldLGRhdGEkbWF0Y2hpbmczTjQuU1EwMDdfU1EwMDEuW2ldLGRhdGEkbWF0Y2hpbmczTjQuU1EwMDhfU1EwMDEuW2ldLGRhdGEkbWF0Y2hpbmczTjQuU1EwMDlfU1EwMDEuW2ldLGRhdGEkbWF0Y2hpbmczTjQuU1EwMTBfU1EwMDEuW2ldLCBkYXRhJG1hdGNoaW5nM040LlNRMDExX1NRMDAxLltpXSwgZGF0YSRtYXRjaGluZzNONC5TUTAxMl9TUTAwMS5baV0sIGRhdGEkbWF0Y2hpbmczTjQuU1EwMTNfU1EwMDEuW2ldLCBkYXRhJG1hdGNoaW5nM040LlNRMDE0X1NRMDAxLltpXSwgZGF0YSRtYXRjaGluZzNONC5TUTAxNV9TUTAwMS5baV0pLA0KICAgIGNiaW5kKGRhdGEkbWF0Y2hpbmczTjQuU1EwMDFfU1EwMDIuW2ldLGRhdGEkbWF0Y2hpbmczTjQuU1EwMDJfU1EwMDIuW2ldLGRhdGEkbWF0Y2hpbmczTjQuU1EwMDNfU1EwMDIuW2ldLGRhdGEkbWF0Y2hpbmczTjQuU1EwMDRfU1EwMDIuW2ldLGRhdGEkbWF0Y2hpbmczTjQuU1EwMDVfU1EwMDIuW2ldLGRhdGEkbWF0Y2hpbmczTjQuU1EwMDZfU1EwMDIuW2ldLGRhdGEkbWF0Y2hpbmczTjQuU1EwMDdfU1EwMDIuW2ldLGRhdGEkbWF0Y2hpbmczTjQuU1EwMDhfU1EwMDIuW2ldLGRhdGEkbWF0Y2hpbmczTjQuU1EwMDlfU1EwMDIuW2ldLGRhdGEkbWF0Y2hpbmczTjQuU1EwMTBfU1EwMDIuW2ldLCBkYXRhJG1hdGNoaW5nM040LlNRMDExX1NRMDAyLltpXSwgZGF0YSRtYXRjaGluZzNONC5TUTAxMl9TUTAwMi5baV0sIGRhdGEkbWF0Y2hpbmczTjQuU1EwMTNfU1EwMDIuW2ldLCBkYXRhJG1hdGNoaW5nM040LlNRMDE0X1NRMDAyLltpXSwgZGF0YSRtYXRjaGluZzNONC5TUTAxNV9TUTAwMi5baV0pLA0KICAgIGNiaW5kKGRhdGEkbWF0Y2hpbmczTjQuU1EwMDFfU1EwMDMuW2ldLGRhdGEkbWF0Y2hpbmczTjQuU1EwMDJfU1EwMDMuW2ldLGRhdGEkbWF0Y2hpbmczTjQuU1EwMDNfU1EwMDMuW2ldLGRhdGEkbWF0Y2hpbmczTjQuU1EwMDRfU1EwMDMuW2ldLGRhdGEkbWF0Y2hpbmczTjQuU1EwMDVfU1EwMDMuW2ldLGRhdGEkbWF0Y2hpbmczTjQuU1EwMDZfU1EwMDMuW2ldLGRhdGEkbWF0Y2hpbmczTjQuU1EwMDdfU1EwMDMuW2ldLGRhdGEkbWF0Y2hpbmczTjQuU1EwMDhfU1EwMDMuW2ldLGRhdGEkbWF0Y2hpbmczTjQuU1EwMDlfU1EwMDMuW2ldLGRhdGEkbWF0Y2hpbmczTjQuU1EwMTBfU1EwMDMuW2ldLCBkYXRhJG1hdGNoaW5nM040LlNRMDExX1NRMDAzLltpXSwgZGF0YSRtYXRjaGluZzNONC5TUTAxMl9TUTAwMy5baV0sIGRhdGEkbWF0Y2hpbmczTjQuU1EwMTNfU1EwMDMuW2ldLCBkYXRhJG1hdGNoaW5nM040LlNRMDE0X1NRMDAzLltpXSwgZGF0YSRtYXRjaGluZzNONC5TUTAxNV9TUTAwMy5baV0pLA0KICAgIGNiaW5kKGRhdGEkbWF0Y2hpbmczTjQuU1EwMDFfU1EwMDMuW2ldLGRhdGEkbWF0Y2hpbmczTjQuU1EwMDJfU1EwMDMuW2ldLGRhdGEkbWF0Y2hpbmczTjQuU1EwMDNfU1EwMDMuW2ldLGRhdGEkbWF0Y2hpbmczTjQuU1EwMDRfU1EwMDMuW2ldLGRhdGEkbWF0Y2hpbmczTjQuU1EwMDVfU1EwMDMuW2ldLGRhdGEkbWF0Y2hpbmczTjQuU1EwMDZfU1EwMDMuW2ldLGRhdGEkbWF0Y2hpbmczTjQuU1EwMDdfU1EwMDMuW2ldLGRhdGEkbWF0Y2hpbmczTjQuU1EwMDhfU1EwMDMuW2ldLGRhdGEkbWF0Y2hpbmczTjQuU1EwMDlfU1EwMDMuW2ldLGRhdGEkbWF0Y2hpbmczTjQuU1EwMTBfU1EwMDMuW2ldLCBkYXRhJG1hdGNoaW5nM040LlNRMDExX1NRMDAzLltpXSwgZGF0YSRtYXRjaGluZzNONC5TUTAxMl9TUTAwMy5baV0sIGRhdGEkbWF0Y2hpbmczTjQuU1EwMTNfU1EwMDMuW2ldLCBkYXRhJG1hdGNoaW5nM040LlNRMDE0X1NRMDAzLltpXSwgZGF0YSRtYXRjaGluZzNONC5TUTAxNV9TUTAwMy5baV0pLA0KICAgIGNiaW5kKGRhdGEkbWF0Y2hpbmczTjQuU1EwMDFfU1EwMDQuW2ldLGRhdGEkbWF0Y2hpbmczTjQuU1EwMDJfU1EwMDQuW2ldLGRhdGEkbWF0Y2hpbmczTjQuU1EwMDNfU1EwMDQuW2ldLGRhdGEkbWF0Y2hpbmczTjQuU1EwMDRfU1EwMDQuW2ldLGRhdGEkbWF0Y2hpbmczTjQuU1EwMDVfU1EwMDQuW2ldLGRhdGEkbWF0Y2hpbmczTjQuU1EwMDZfU1EwMDQuW2ldLGRhdGEkbWF0Y2hpbmczTjQuU1EwMDdfU1EwMDQuW2ldLGRhdGEkbWF0Y2hpbmczTjQuU1EwMDhfU1EwMDQuW2ldLGRhdGEkbWF0Y2hpbmczTjQuU1EwMDlfU1EwMDQuW2ldLGRhdGEkbWF0Y2hpbmczTjQuU1EwMTBfU1EwMDQuW2ldLCBkYXRhJG1hdGNoaW5nM040LlNRMDExX1NRMDA0LltpXSwgZGF0YSRtYXRjaGluZzNONC5TUTAxMl9TUTAwNC5baV0sIGRhdGEkbWF0Y2hpbmczTjQuU1EwMTNfU1EwMDQuW2ldLCBkYXRhJG1hdGNoaW5nM040LlNRMDE0X1NRMDA0LltpXSwgZGF0YSRtYXRjaGluZzNONC5TUTAxNV9TUTAwNC5baV0pKQ0KICBtYXRjaGluZzNMW1s1XV0gPC0gcmJpbmQoDQogICAgY2JpbmQoZGF0YSRtYXRjaGluZzNONS5TUTAwMV9TUTAwMS5baV0sZGF0YSRtYXRjaGluZzNONS5TUTAwMl9TUTAwMS5baV0sZGF0YSRtYXRjaGluZzNONS5TUTAwM19TUTAwMS5baV0sZGF0YSRtYXRjaGluZzNONS5TUTAwNF9TUTAwMS5baV0sZGF0YSRtYXRjaGluZzNONS5TUTAwNV9TUTAwMS5baV0sZGF0YSRtYXRjaGluZzNONS5TUTAwNl9TUTAwMS5baV0sZGF0YSRtYXRjaGluZzNONS5TUTAwN19TUTAwMS5baV0sZGF0YSRtYXRjaGluZzNONS5TUTAwOF9TUTAwMS5baV0sZGF0YSRtYXRjaGluZzNONS5TUTAwOV9TUTAwMS5baV0sZGF0YSRtYXRjaGluZzNONS5TUTAxMF9TUTAwMS5baV0sIGRhdGEkbWF0Y2hpbmczTjUuU1EwMTFfU1EwMDEuW2ldLCBkYXRhJG1hdGNoaW5nM041LlNRMDEyX1NRMDAxLltpXSwgZGF0YSRtYXRjaGluZzNONS5TUTAxM19TUTAwMS5baV0sIGRhdGEkbWF0Y2hpbmczTjUuU1EwMTRfU1EwMDEuW2ldLCBkYXRhJG1hdGNoaW5nM041LlNRMDE1X1NRMDAxLltpXSksDQogICAgY2JpbmQoZGF0YSRtYXRjaGluZzNONS5TUTAwMV9TUTAwMi5baV0sZGF0YSRtYXRjaGluZzNONS5TUTAwMl9TUTAwMi5baV0sZGF0YSRtYXRjaGluZzNONS5TUTAwM19TUTAwMi5baV0sZGF0YSRtYXRjaGluZzNONS5TUTAwNF9TUTAwMi5baV0sZGF0YSRtYXRjaGluZzNONS5TUTAwNV9TUTAwMi5baV0sZGF0YSRtYXRjaGluZzNONS5TUTAwNl9TUTAwMi5baV0sZGF0YSRtYXRjaGluZzNONS5TUTAwN19TUTAwMi5baV0sZGF0YSRtYXRjaGluZzNONS5TUTAwOF9TUTAwMi5baV0sZGF0YSRtYXRjaGluZzNONS5TUTAwOV9TUTAwMi5baV0sZGF0YSRtYXRjaGluZzNONS5TUTAxMF9TUTAwMi5baV0sIGRhdGEkbWF0Y2hpbmczTjUuU1EwMTFfU1EwMDIuW2ldLCBkYXRhJG1hdGNoaW5nM041LlNRMDEyX1NRMDAyLltpXSwgZGF0YSRtYXRjaGluZzNONS5TUTAxM19TUTAwMi5baV0sIGRhdGEkbWF0Y2hpbmczTjUuU1EwMTRfU1EwMDIuW2ldLCBkYXRhJG1hdGNoaW5nM041LlNRMDE1X1NRMDAyLltpXSksDQogICAgY2JpbmQoZGF0YSRtYXRjaGluZzNONS5TUTAwMV9TUTAwMy5baV0sZGF0YSRtYXRjaGluZzNONS5TUTAwMl9TUTAwMy5baV0sZGF0YSRtYXRjaGluZzNONS5TUTAwM19TUTAwMy5baV0sZGF0YSRtYXRjaGluZzNONS5TUTAwNF9TUTAwMy5baV0sZGF0YSRtYXRjaGluZzNONS5TUTAwNV9TUTAwMy5baV0sZGF0YSRtYXRjaGluZzNONS5TUTAwNl9TUTAwMy5baV0sZGF0YSRtYXRjaGluZzNONS5TUTAwN19TUTAwMy5baV0sZGF0YSRtYXRjaGluZzNONS5TUTAwOF9TUTAwMy5baV0sZGF0YSRtYXRjaGluZzNONS5TUTAwOV9TUTAwMy5baV0sZGF0YSRtYXRjaGluZzNONS5TUTAxMF9TUTAwMy5baV0sIGRhdGEkbWF0Y2hpbmczTjUuU1EwMTFfU1EwMDMuW2ldLCBkYXRhJG1hdGNoaW5nM041LlNRMDEyX1NRMDAzLltpXSwgZGF0YSRtYXRjaGluZzNONS5TUTAxM19TUTAwMy5baV0sIGRhdGEkbWF0Y2hpbmczTjUuU1EwMTRfU1EwMDMuW2ldLCBkYXRhJG1hdGNoaW5nM041LlNRMDE1X1NRMDAzLltpXSksDQogICAgY2JpbmQoZGF0YSRtYXRjaGluZzNONS5TUTAwMV9TUTAwMy5baV0sZGF0YSRtYXRjaGluZzNONS5TUTAwMl9TUTAwMy5baV0sZGF0YSRtYXRjaGluZzNONS5TUTAwM19TUTAwMy5baV0sZGF0YSRtYXRjaGluZzNONS5TUTAwNF9TUTAwMy5baV0sZGF0YSRtYXRjaGluZzNONS5TUTAwNV9TUTAwMy5baV0sZGF0YSRtYXRjaGluZzNONS5TUTAwNl9TUTAwMy5baV0sZGF0YSRtYXRjaGluZzNONS5TUTAwN19TUTAwMy5baV0sZGF0YSRtYXRjaGluZzNONS5TUTAwOF9TUTAwMy5baV0sZGF0YSRtYXRjaGluZzNONS5TUTAwOV9TUTAwMy5baV0sZGF0YSRtYXRjaGluZzNONS5TUTAxMF9TUTAwMy5baV0sIGRhdGEkbWF0Y2hpbmczTjUuU1EwMTFfU1EwMDMuW2ldLCBkYXRhJG1hdGNoaW5nM041LlNRMDEyX1NRMDAzLltpXSwgZGF0YSRtYXRjaGluZzNONS5TUTAxM19TUTAwMy5baV0sIGRhdGEkbWF0Y2hpbmczTjUuU1EwMTRfU1EwMDMuW2ldLCBkYXRhJG1hdGNoaW5nM041LlNRMDE1X1NRMDAzLltpXSksDQogICAgY2JpbmQoZGF0YSRtYXRjaGluZzNONS5TUTAwMV9TUTAwNS5baV0sZGF0YSRtYXRjaGluZzNONS5TUTAwMl9TUTAwNS5baV0sZGF0YSRtYXRjaGluZzNONS5TUTAwM19TUTAwNS5baV0sZGF0YSRtYXRjaGluZzNONS5TUTAwNF9TUTAwNS5baV0sZGF0YSRtYXRjaGluZzNONS5TUTAwNV9TUTAwNS5baV0sZGF0YSRtYXRjaGluZzNONS5TUTAwNl9TUTAwNS5baV0sZGF0YSRtYXRjaGluZzNONS5TUTAwN19TUTAwNS5baV0sZGF0YSRtYXRjaGluZzNONS5TUTAwOF9TUTAwNS5baV0sZGF0YSRtYXRjaGluZzNONS5TUTAwOV9TUTAwNS5baV0sZGF0YSRtYXRjaGluZzNONS5TUTAxMF9TUTAwNS5baV0sIGRhdGEkbWF0Y2hpbmczTjUuU1EwMTFfU1EwMDUuW2ldLCBkYXRhJG1hdGNoaW5nM041LlNRMDEyX1NRMDA1LltpXSwgZGF0YSRtYXRjaGluZzNONS5TUTAxM19TUTAwNS5baV0sIGRhdGEkbWF0Y2hpbmczTjUuU1EwMTRfU1EwMDUuW2ldLCBkYXRhJG1hdGNoaW5nM041LlNRMDE1X1NRMDA1LltpXSkpDQogIG1hdGNoaW5nTGlzdDNbW2ldXSA8LSBtYXRjaGluZzNMDQp9DQoNCmZvciAoaSBpbiAxOmxlbmd0aChtYXRjaGluZ0xpc3QzKSkgeyAgICAjIGZvciBlZ28gaQ0KICBtTCA8LSBtYXRjaGluZ0xpc3QzW1tpXV0gICAgICAgICAgICAgICMgZ2V0IHRoZSBtYXRjaGluZyBsaXN0IDINCiAgbnMgPC0gbnM0W1tpXV0gICAgICAgICAgICAgICAgICAgICAgICAjIGdldCB0aGUgc2l6ZSBvZiBlZ29uZXQ0DQogIGlmKG5zPjApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBpZiBucz0wLCBubyBtYXRjaGluZyB3YXMgZG9uZSENCiAgICBtbSA8LSBhcy5tYXRyaXgobUxbW25zXV0pICAgICAgICAgICAjIGFuZCB0aGUgY29ycmVzcG9uZGluZyBtYXRyaXgNCiAgICBtYXRjaGVkIDwtIHdoaWNoKG1tPT0xLCBhcnIuaW5kPVQpICAjIHJldHJpZXZlIGFycmF5IGluZGljZXMNCiAgICBuZXQgPC0gbmV0NFtpLF0NCiAgICBpZihsZW5ndGgobWF0Y2hlZCk+MCkgeyAgICAgICAgICAgICAjIGlmIG1hdGNoaW5nIHdhcyBwZXJmb3JtZWQhDQogICAgICBhbHRlckxbW2ldXSRuYW1lNFttYXRjaGVkWywyXV0gPC0gbmV0W21hdGNoZWRbLDFdXQ0KICAgIH0NCiAgfQ0KfQ0KDQojaSBhbHNvIGNhbGN1bGF0ZSBzdHJ1Y3R1cmFsIGVtYmVkZGVkbmVzcyAoYWx0ZXItbGV2ZWwpIHBlciBlZ28tbmV0Lg0KDQojZmlyc3QgaSBmaXggc29tZSBpcnJlZ3VsYXJpdGllcyBpbiB0aGUgZGF0YQ0KIzEuIGEgbWlzdGFrZSB3YXMgbWFkZSBpbiBsYWJlbGluZyB0aGUgYWRqYWNlbmN5IG1hdHJpeCB2YXJpYWJsZXMgZm9yIHRoZSBmcmllbmRzIG5ldHdvcmssIHNvIGkgZmlyc3QgcmVsYWJlbCB0aGVtLCBzbyB0aGUgc2FtZSBzY3JpcHQgYmVsb3cgZm9yIGNvbnN0cnVjdGluZyBkZW5zaXR5IHNjb3JlcyBjYW4gYmUgdXNlZC4NCiMoSSBzdGFydGVkIHdpdGggTjEgaW5zdGVhZCBvZiBOMiAoTiBkZW5vdGVzIHRoZSBudW1iZXIgb2YgbmFtZWQgYWx0ZXJzOyB3aGljaCBzaG91bGQgc3RhcnQgYXQgMiwgYmVjYXVzZSBvbmx5IGF0IG5ldHNpemVzID4gMSwgSSBhc2tlZCBmb3IgYWx0ZXItdGllcykgKQ0KZGF0YSA8LSBkYXRhICU+JQ0KICByZW5hbWUgKGFkajNOMmEuU1EwMDEuID0gYWRqM04xYS5TUTAwMS4sIGFkajNOM2EuU1EwMDEuID0gYWRqM04yYS5TUTAwMS4sYWRqM04zYS5TUTAwMi4gPSBhZGozTjJhLlNRMDAyLixhZGozTjNiLlNRMDAxLiA9IGFkajNOMmIuU1EwMDEuLGFkajNONGEuU1EwMDEuID0gYWRqM04zYS5TUTAwMS4sYWRqM040YS5TUTAwMi4gPSBhZGozTjNhLlNRMDAyLixhZGozTjRhLlNRMDAzLiA9IGFkajNOM2EuU1EwMDMuLGFkajNONGIuU1EwMDEuID0gYWRqM04zYi5TUTAwMS4sYWRqM040Yi5TUTAwMi4gPSBhZGozTjNiLlNRMDAyLiwgICBhZGozTjRjLlNRMDAxLiA9IGFkajNOM2MuU1EwMDEuLGFkajNONWEuU1EwMDEuID0gYWRqM040YS5TUTAwMS4sYWRqM041YS5TUTAwMi4gPSBhZGozTjRhLlNRMDAyLixhZGozTjVhLlNRMDAzLiA9IGFkajNONGEuU1EwMDMuLGFkajNONWEuU1EwMDQuID0gYWRqM040YS5TUTAwNC4sYWRqM041Yi5TUTAwMS4gPSBhZGozTjRiLlNRMDAxLixhZGozTjViLlNRMDAyLiA9IGFkajNONGIuU1EwMDIuLGFkajNONWIuU1EwMDMuID0gYWRqM040Yi5TUTAwMy4sYWRqM041Yy5TUTAwMS4gPSBhZGozTjRjLlNRMDAxLixhZGozTjVjLlNRMDAyLiA9IGFkajNONGMuU1EwMDIuLGFkajNONWQuU1EwMDEuID0gYWRqM040ZC5TUTAwMS4pDQoNCiMyLiBhIGxhYmVsaW5nIG1pc3Rha2U6IGZvciB0aGUgYWRqYWNlbmN5IG1hdHJpeCBmb3Igc3BvcnRzIHRpZXMsIHdpdGggbnM9MywgdGhlIHF1ZXN0aW9uIGFib3V0IHJlbGF0aW9uIGJldHdlZW4gYWx0ZXIgMiBhbmQgMyB3YXMgY29kZWQgd3JvbmdseS4gDQpkYXRhJGFkajROM2IuU1EwMDEuIDwtIGRhdGEkYWRqNE4zYi5TUTAwMi4NCiMjDQoNCmZvciAoaSBpbiAxOmxlbmd0aChhbHRlckwpKSB7ICMgZm9yIGVnbyBpDQoNCiAgI2dldCBudW1iZXIgb2YgbmFtZXMgbGlzdGVkIGluIHRoZSBlZ29uZXRzDQogIG5uYW1lc19jZG4gPC0gbGVuZ3RoKHdoaWNoKGRhdGFbaSxjKCJlZ29uZXQxLlNRMDAxLiIsImVnb25ldDEuU1EwMDIuIiwiZWdvbmV0MS5TUTAwMy4iLCJlZ29uZXQxLlNRMDA0LiIsImVnb25ldDEuU1EwMDUuIildIT0iIikpDQogIG5uYW1lc19zdHVkeSA8LSBsZW5ndGgod2hpY2goZGF0YVtpLGMoImVnb25ldDIuU1EwMDEuIiwiZWdvbmV0Mi5TUTAwMi4iLCJlZ29uZXQyLlNRMDAzLiIsImVnb25ldDIuU1EwMDQuIiwiZWdvbmV0Mi5TUTAwNS4iKV0hPSIiKSkNCiAgbm5hbWVzX2JmZiA8LSBsZW5ndGgod2hpY2goZGF0YVtpLGMoImVnb25ldDMuU1EwMDEuIiwiZWdvbmV0My5TUTAwMi4iLCJlZ29uZXQzLlNRMDAzLiIsImVnb25ldDMuU1EwMDQuIiwiZWdvbmV0My5TUTAwNS4iKV0hPSIiKSkNCiAgbm5hbWVzX2NzbiA8LSBsZW5ndGgod2hpY2goZGF0YVtpLGMoImVnb25ldDQuU1EwMDEuIiwiZWdvbmV0NC5TUTAwMi4iLCJlZ29uZXQ0LlNRMDAzLiIsImVnb25ldDQuU1EwMDQuIiwiZWdvbmV0NC5TUTAwNS4iKV0hPSIiKSkNCiAgDQogICNDRE4NCiAgDQogICNtYWtlIGxpc3Qgb2YgYWRqYWNlbmN5IG1hdHJpY2VzDQogIGFkakwgPC0gbGlzdCgpDQogIHsNCiAgIzIgYWx0ZXJzDQogIGFkakxbWzJdXSA8LSBtYXRyaXgoTkEsbmNvbD0yLG5yb3c9MikNCiAgYWRqTFtbMl1dWzEsMl0gPC0gYWRqTFtbMl1dWzIsMV0gPC0gZGF0YSRhZGoxTjJhLlNRMDAxLltpXQ0KDQogICMzIGFsdGVycw0KICBhZGpMW1szXV0gPC0gbWF0cml4KE5BLG5jb2w9Myxucm93PTMpDQogIGFkakxbWzNdXVsxLDJdIDwtIGFkakxbWzNdXVsyLDFdIDwtIGRhdGEkYWRqMU4zYS5TUTAwMS5baV0NCiAgYWRqTFtbM11dWzEsM10gPC0gYWRqTFtbM11dWzMsMV0gPC0gZGF0YSRhZGoxTjNhLlNRMDAyLltpXQ0KICBhZGpMW1szXV1bMiwzXSA8LSBhZGpMW1szXV1bMywyXSA8LSBkYXRhJGFkajFOM2IuU1EwMDEuW2ldDQoNCiAgIzQgYWx0ZXJzDQogIGFkakxbWzRdXSA8LSBtYXRyaXgoTkEsbmNvbD00LG5yb3c9NCkNCiAgYWRqTFtbNF1dWzEsMl0gPC0gYWRqTFtbNF1dWzIsMV0gPC0gZGF0YSRhZGoxTjRhLlNRMDAxLltpXQ0KICBhZGpMW1s0XV1bMSwzXSA8LSBhZGpMW1s0XV1bMywxXSA8LSBkYXRhJGFkajFONGEuU1EwMDIuW2ldDQogIGFkakxbWzRdXVsxLDRdIDwtIGFkakxbWzRdXVs0LDFdIDwtIGRhdGEkYWRqMU40YS5TUTAwMy5baV0NCiAgYWRqTFtbNF1dWzIsM10gPC0gYWRqTFtbNF1dWzMsMl0gPC0gZGF0YSRhZGoxTjRiLlNRMDAxLltpXQ0KICBhZGpMW1s0XV1bMiw0XSA8LSBhZGpMW1s0XV1bNCwyXSA8LSBkYXRhJGFkajFONGIuU1EwMDIuW2ldDQogIGFkakxbWzRdXVszLDRdIDwtIGFkakxbWzRdXVs0LDNdIDwtIGRhdGEkYWRqMU40Yy5TUTAwMS5baV0NCg0KICAjNSBhbHRlcnMNCiAgYWRqTFtbNV1dIDwtIG1hdHJpeChOQSxuY29sPTUsbnJvdz01KQ0KICBhZGpMW1s1XV1bMSwyXSA8LSBhZGpMW1s1XV1bMiwxXSA8LSBkYXRhJGFkajFONWEuU1EwMDEuW2ldDQogIGFkakxbWzVdXVsxLDNdIDwtIGFkakxbWzVdXVszLDFdIDwtIGRhdGEkYWRqMU41YS5TUTAwMi5baV0NCiAgYWRqTFtbNV1dWzEsNF0gPC0gYWRqTFtbNV1dWzQsMV0gPC0gZGF0YSRhZGoxTjVhLlNRMDAzLltpXQ0KICBhZGpMW1s1XV1bMSw1XSA8LSBhZGpMW1s1XV1bNSwxXSA8LSBkYXRhJGFkajFONWEuU1EwMDQuW2ldDQogIGFkakxbWzVdXVsyLDNdIDwtIGFkakxbWzVdXVszLDJdIDwtIGRhdGEkYWRqMU41Yi5TUTAwMS5baV0NCiAgYWRqTFtbNV1dWzIsNF0gPC0gYWRqTFtbNV1dWzQsMl0gPC0gZGF0YSRhZGoxTjViLlNRMDAyLltpXQ0KICBhZGpMW1s1XV1bMiw1XSA8LSBhZGpMW1s1XV1bNSwyXSA8LSBkYXRhJGFkajFONWIuU1EwMDMuW2ldDQogIGFkakxbWzVdXVszLDRdIDwtIGFkakxbWzVdXVs0LDNdIDwtIGRhdGEkYWRqMU41Yy5TUTAwMS5baV0NCiAgYWRqTFtbNV1dWzMsNV0gPC0gYWRqTFtbNV1dWzUsM10gPC0gZGF0YSRhZGoxTjVjLlNRMDAyLltpXQ0KICBhZGpMW1s1XV1bNCw1XSA8LSBhZGpMW1s1XV1bNSw0XSA8LSBkYXRhJGFkajFONWQuU1EwMDEuW2ldDQogIH0NCg0KICBpZihubmFtZXNfY2RuPjEpIHsgI3dlIG9ubHkga25vdyBhbHRlci1hbHRlciByZWxhdGlvbnMgZm9yIG5uYW1lcz4xDQogICAgI3Rha2UgdGhlIG1hdHJpeCBjb3JyZXNwb25kaW5nIHRoZSBubmFtZXMNCiAgICBtYXQgPC0gYWRqTFtbbm5hbWVzX2Nkbl1dDQogICAgDQogICAgI3RpZXMgdGhhdCBhcmUgKHZlcnkpIGNsb3NlIGFyZSAxDQogICAgbWF0WyFpcy5uYShtYXQpXSA8LSBpZmVsc2UobWF0WyFpcy5uYShtYXQpXT09IkVyZyBoZWNodCIgfCBtYXRbIWlzLm5hKG1hdCldPT0iSGVjaHQiLCAxLDApDQoNCiAgICAjY2FsY3VsYXRlIGVtYmVkZGVkbmVzcyBmb3IgZWFjaCBhbHRlci9yb3c6DQogICAgZW1iZWQgPC0gYXBwbHkobWF0LCAxLCBmdW5jdGlvbihyb3cpIHsNCiAgICBuX2NvbHMgPC0gc3VtKCFpcy5uYShyb3cpKQ0KICAgIG5fb25lcyA8LSBzdW0ocm93ID09ICIxIiwgbmEucm0gPSBUUlVFKQ0KICAgIHJhdGlvIDwtIG5fb25lcyAvIG5fY29scw0KICAgIHJldHVybihyYXRpbykNCiAgICB9KQ0KICANCiAgI0NETjogMTpubmFtZXNfQ0RODQogIGFsdGVyTFtbaV1dJGNkbl9lbWJlZC50MVsxOm5uYW1lc19jZG5dIDwtIGVtYmVkIA0KICB9DQogIA0KICAjU1RVRFkNCg0KICAjbWFrZSBsaXN0IG9mIGFkamFjZW5jeSBtYXRyaWNlcw0KICBhZGpMIDwtIGxpc3QoKQ0KICB7DQogICMyIGFsdGVycw0KICBhZGpMW1syXV0gPC0gbWF0cml4KE5BLG5jb2w9Mixucm93PTIpDQogIGFkakxbWzJdXVsxLDJdIDwtIGFkakxbWzJdXVsyLDFdIDwtIGRhdGEkYWRqMk4yYS5TUTAwMS5baV0NCg0KICAjMyBhbHRlcnMNCiAgYWRqTFtbM11dIDwtIG1hdHJpeChOQSxuY29sPTMsbnJvdz0zKQ0KICBhZGpMW1szXV1bMSwyXSA8LSBhZGpMW1szXV1bMiwxXSA8LSBkYXRhJGFkajJOM2EuU1EwMDEuW2ldDQogIGFkakxbWzNdXVsxLDNdIDwtIGFkakxbWzNdXVszLDFdIDwtIGRhdGEkYWRqMk4zYS5TUTAwMi5baV0NCiAgYWRqTFtbM11dWzIsM10gPC0gYWRqTFtbM11dWzMsMl0gPC0gZGF0YSRhZGoyTjNiLlNRMDAxLltpXQ0KDQogICM0IGFsdGVycw0KICBhZGpMW1s0XV0gPC0gbWF0cml4KE5BLG5jb2w9NCxucm93PTQpDQogIGFkakxbWzRdXVsxLDJdIDwtIGFkakxbWzRdXVsyLDFdIDwtIGRhdGEkYWRqMk40YS5TUTAwMS5baV0NCiAgYWRqTFtbNF1dWzEsM10gPC0gYWRqTFtbNF1dWzMsMV0gPC0gZGF0YSRhZGoyTjRhLlNRMDAyLltpXQ0KICBhZGpMW1s0XV1bMSw0XSA8LSBhZGpMW1s0XV1bNCwxXSA8LSBkYXRhJGFkajJONGEuU1EwMDMuW2ldDQogIGFkakxbWzRdXVsyLDNdIDwtIGFkakxbWzRdXVszLDJdIDwtIGRhdGEkYWRqMk40Yi5TUTAwMS5baV0NCiAgYWRqTFtbNF1dWzIsNF0gPC0gYWRqTFtbNF1dWzQsMl0gPC0gZGF0YSRhZGoyTjRiLlNRMDAyLltpXQ0KICBhZGpMW1s0XV1bMyw0XSA8LSBhZGpMW1s0XV1bNCwzXSA8LSBkYXRhJGFkajJONGMuU1EwMDEuW2ldDQoNCiAgIzUgYWx0ZXJzDQogIGFkakxbWzVdXSA8LSBtYXRyaXgoTkEsbmNvbD01LG5yb3c9NSkNCiAgYWRqTFtbNV1dWzEsMl0gPC0gYWRqTFtbNV1dWzIsMV0gPC0gZGF0YSRhZGoyTjVhLlNRMDAxLltpXQ0KICBhZGpMW1s1XV1bMSwzXSA8LSBhZGpMW1s1XV1bMywxXSA8LSBkYXRhJGFkajJONWEuU1EwMDIuW2ldDQogIGFkakxbWzVdXVsxLDRdIDwtIGFkakxbWzVdXVs0LDFdIDwtIGRhdGEkYWRqMk41YS5TUTAwMy5baV0NCiAgYWRqTFtbNV1dWzEsNV0gPC0gYWRqTFtbNV1dWzUsMV0gPC0gZGF0YSRhZGoyTjVhLlNRMDA0LltpXQ0KICBhZGpMW1s1XV1bMiwzXSA8LSBhZGpMW1s1XV1bMywyXSA8LSBkYXRhJGFkajJONWIuU1EwMDEuW2ldDQogIGFkakxbWzVdXVsyLDRdIDwtIGFkakxbWzVdXVs0LDJdIDwtIGRhdGEkYWRqMk41Yi5TUTAwMi5baV0NCiAgYWRqTFtbNV1dWzIsNV0gPC0gYWRqTFtbNV1dWzUsMl0gPC0gZGF0YSRhZGoyTjViLlNRMDAzLltpXQ0KICBhZGpMW1s1XV1bMyw0XSA8LSBhZGpMW1s1XV1bNCwzXSA8LSBkYXRhJGFkajJONWMuU1EwMDEuW2ldDQogIGFkakxbWzVdXVszLDVdIDwtIGFkakxbWzVdXVs1LDNdIDwtIGRhdGEkYWRqMk41Yy5TUTAwMi5baV0NCiAgYWRqTFtbNV1dWzQsNV0gPC0gYWRqTFtbNV1dWzUsNF0gPC0gZGF0YSRhZGoyTjVkLlNRMDAxLltpXQ0KICB9DQoNCiAgaWYobm5hbWVzX3N0dWR5PjEpIHsgI3dlIG9ubHkga25vdyBhbHRlci1hbHRlciByZWxhdGlvbnMgZm9yIG5uYW1lcw0KICAgICN0YWtlIHRoZSBtYXRyaXggY29ycmVzcG9uZGluZyB0aGUgbm5hbWVzDQogICAgbWF0IDwtIGFkakxbW25uYW1lc19zdHVkeV1dDQogICAgDQogICAgI3RpZXMgdGhhdCBhcmUgKHZlcnkpIGNsb3NlIGFyZSAxDQogICAgbWF0WyFpcy5uYShtYXQpXSA8LSBpZmVsc2UobWF0WyFpcy5uYShtYXQpXT09IkVyZyBoZWNodCIgfCBtYXRbIWlzLm5hKG1hdCldPT0iSGVjaHQiLCAxLDApDQoNCiAgICAjY2FsY3VsYXRlIGVtYmVkZGVkbmVzcyBmb3IgZWFjaCBhbHRlci9yb3c6DQogICAgZW1iZWQgPC0gYXBwbHkobWF0LCAxLCBmdW5jdGlvbihyb3cpIHsNCiAgICBuX2NvbHMgPC0gc3VtKCFpcy5uYShyb3cpKQ0KICAgIG5fb25lcyA8LSBzdW0ocm93ID09ICIxIiwgbmEucm0gPSBUUlVFKQ0KICAgIHJhdGlvIDwtIG5fb25lcyAvIG5fY29scw0KICAgIHJldHVybihyYXRpbykNCiAgICB9KQ0KICAgIA0KICAgIGFsdGVyTFtbaV1dJHN0dWR5X2VtYmVkLnQxWzY6KDUrbm5hbWVzX3N0dWR5KV0gPC0gZW1iZWQgDQogIH0NCiAgDQogICMgQkVTVCBGUklFTkRTDQogICNtYWtlIGxpc3Qgb2YgYWRqYWNlbmN5IG1hdHJpY2VzDQogIGFkakwgPC0gbGlzdCgpDQogIHsNCiAgIzIgYWx0ZXJzDQogIGFkakxbWzJdXSA8LSBtYXRyaXgoTkEsbmNvbD0yLG5yb3c9MikNCiAgYWRqTFtbMl1dWzEsMl0gPC0gYWRqTFtbMl1dWzIsMV0gPC0gZGF0YSRhZGozTjJhLlNRMDAxLltpXQ0KDQogICMzIGFsdGVycw0KICBhZGpMW1szXV0gPC0gbWF0cml4KE5BLG5jb2w9Myxucm93PTMpDQogIGFkakxbWzNdXVsxLDJdIDwtIGFkakxbWzNdXVsyLDFdIDwtIGRhdGEkYWRqM04zYS5TUTAwMS5baV0NCiAgYWRqTFtbM11dWzEsM10gPC0gYWRqTFtbM11dWzMsMV0gPC0gZGF0YSRhZGozTjNhLlNRMDAyLltpXQ0KICBhZGpMW1szXV1bMiwzXSA8LSBhZGpMW1szXV1bMywyXSA8LSBkYXRhJGFkajNOM2IuU1EwMDEuW2ldDQoNCiAgIzQgYWx0ZXJzDQogIGFkakxbWzRdXSA8LSBtYXRyaXgoTkEsbmNvbD00LG5yb3c9NCkNCiAgYWRqTFtbNF1dWzEsMl0gPC0gYWRqTFtbNF1dWzIsMV0gPC0gZGF0YSRhZGozTjRhLlNRMDAxLltpXQ0KICBhZGpMW1s0XV1bMSwzXSA8LSBhZGpMW1s0XV1bMywxXSA8LSBkYXRhJGFkajNONGEuU1EwMDIuW2ldDQogIGFkakxbWzRdXVsxLDRdIDwtIGFkakxbWzRdXVs0LDFdIDwtIGRhdGEkYWRqM040YS5TUTAwMy5baV0NCiAgYWRqTFtbNF1dWzIsM10gPC0gYWRqTFtbNF1dWzMsMl0gPC0gZGF0YSRhZGozTjRiLlNRMDAxLltpXQ0KICBhZGpMW1s0XV1bMiw0XSA8LSBhZGpMW1s0XV1bNCwyXSA8LSBkYXRhJGFkajNONGIuU1EwMDIuW2ldDQogIGFkakxbWzRdXVszLDRdIDwtIGFkakxbWzRdXVs0LDNdIDwtIGRhdGEkYWRqM040Yy5TUTAwMS5baV0NCg0KICAjNSBhbHRlcnMNCiAgYWRqTFtbNV1dIDwtIG1hdHJpeChOQSxuY29sPTUsbnJvdz01KQ0KICBhZGpMW1s1XV1bMSwyXSA8LSBhZGpMW1s1XV1bMiwxXSA8LSBkYXRhJGFkajNONWEuU1EwMDEuW2ldDQogIGFkakxbWzVdXVsxLDNdIDwtIGFkakxbWzVdXVszLDFdIDwtIGRhdGEkYWRqM041YS5TUTAwMi5baV0NCiAgYWRqTFtbNV1dWzEsNF0gPC0gYWRqTFtbNV1dWzQsMV0gPC0gZGF0YSRhZGozTjVhLlNRMDAzLltpXQ0KICBhZGpMW1s1XV1bMSw1XSA8LSBhZGpMW1s1XV1bNSwxXSA8LSBkYXRhJGFkajNONWEuU1EwMDQuW2ldDQogIGFkakxbWzVdXVsyLDNdIDwtIGFkakxbWzVdXVszLDJdIDwtIGRhdGEkYWRqM041Yi5TUTAwMS5baV0NCiAgYWRqTFtbNV1dWzIsNF0gPC0gYWRqTFtbNV1dWzQsMl0gPC0gZGF0YSRhZGozTjViLlNRMDAyLltpXQ0KICBhZGpMW1s1XV1bMiw1XSA8LSBhZGpMW1s1XV1bNSwyXSA8LSBkYXRhJGFkajNONWIuU1EwMDMuW2ldDQogIGFkakxbWzVdXVszLDRdIDwtIGFkakxbWzVdXVs0LDNdIDwtIGRhdGEkYWRqM041Yy5TUTAwMS5baV0NCiAgYWRqTFtbNV1dWzMsNV0gPC0gYWRqTFtbNV1dWzUsM10gPC0gZGF0YSRhZGozTjVjLlNRMDAyLltpXQ0KICBhZGpMW1s1XV1bNCw1XSA8LSBhZGpMW1s1XV1bNSw0XSA8LSBkYXRhJGFkajNONWQuU1EwMDEuW2ldDQogIH0NCg0KICBpZihubmFtZXNfYmZmPjEpIHsgI3dlIG9ubHkga25vdyBhbHRlci1hbHRlciByZWxhdGlvbnMgZm9yIG5uYW1lcw0KICAgICN0YWtlIHRoZSBtYXRyaXggY29ycmVzcG9uZGluZyB0aGUgbm5hbWVzDQogICAgbWF0IDwtIGFkakxbW25uYW1lc19iZmZdXQ0KICAgIA0KICAgICN0aWVzIHRoYXQgYXJlICh2ZXJ5KSBjbG9zZSBhcmUgMQ0KICAgIG1hdFshaXMubmEobWF0KV0gPC0gaWZlbHNlKG1hdFshaXMubmEobWF0KV09PSJFcmcgaGVjaHQiIHwgbWF0WyFpcy5uYShtYXQpXT09IkhlY2h0IiwgMSwwKQ0KDQogICAgI2NhbGN1bGF0ZSBlbWJlZGRlZG5lc3MgZm9yIGVhY2ggYWx0ZXIvcm93Og0KICAgIGVtYmVkIDwtIGFwcGx5KG1hdCwgMSwgZnVuY3Rpb24ocm93KSB7DQogICAgbl9jb2xzIDwtIHN1bSghaXMubmEocm93KSkNCiAgICBuX29uZXMgPC0gc3VtKHJvdyA9PSAiMSIsIG5hLnJtID0gVFJVRSkNCiAgICByYXRpbyA8LSBuX29uZXMgLyBuX2NvbHMNCiAgICByZXR1cm4ocmF0aW8pDQogICAgfSkNCiAgICANCiAgICBhbHRlckxbW2ldXSRiZmZfZW1iZWQudDFbMTE6KDEwK25uYW1lc19iZmYpXSA8LSBlbWJlZCANCiAgfQ0KICANCiAgIyBTUE9SVFMgUEFSVE5FUlMNCiAgI21ha2UgbGlzdCBvZiBhZGphY2VuY3kgbWF0cmljZXMNCiAgYWRqTCA8LSBsaXN0KCkNCiAgew0KICAjMiBhbHRlcnMNCiAgYWRqTFtbMl1dIDwtIG1hdHJpeChOQSxuY29sPTIsbnJvdz0yKQ0KICBhZGpMW1syXV1bMSwyXSA8LSBhZGpMW1syXV1bMiwxXSA8LSBkYXRhJGFkajROMmEuU1EwMDEuW2ldDQoNCiAgIzMgYWx0ZXJzDQogIGFkakxbWzNdXSA8LSBtYXRyaXgoTkEsbmNvbD0zLG5yb3c9MykNCiAgYWRqTFtbM11dWzEsMl0gPC0gYWRqTFtbM11dWzIsMV0gPC0gZGF0YSRhZGo0TjNhLlNRMDAxLltpXQ0KICBhZGpMW1szXV1bMSwzXSA8LSBhZGpMW1szXV1bMywxXSA8LSBkYXRhJGFkajROM2EuU1EwMDIuW2ldDQogIGFkakxbWzNdXVsyLDNdIDwtIGFkakxbWzNdXVszLDJdIDwtIGRhdGEkYWRqNE4zYi5TUTAwMS5baV0NCg0KICAjNCBhbHRlcnMNCiAgYWRqTFtbNF1dIDwtIG1hdHJpeChOQSxuY29sPTQsbnJvdz00KQ0KICBhZGpMW1s0XV1bMSwyXSA8LSBhZGpMW1s0XV1bMiwxXSA8LSBkYXRhJGFkajRONGEuU1EwMDEuW2ldDQogIGFkakxbWzRdXVsxLDNdIDwtIGFkakxbWzRdXVszLDFdIDwtIGRhdGEkYWRqNE40YS5TUTAwMi5baV0NCiAgYWRqTFtbNF1dWzEsNF0gPC0gYWRqTFtbNF1dWzQsMV0gPC0gZGF0YSRhZGo0TjRhLlNRMDAzLltpXQ0KICBhZGpMW1s0XV1bMiwzXSA8LSBhZGpMW1s0XV1bMywyXSA8LSBkYXRhJGFkajRONGIuU1EwMDEuW2ldDQogIGFkakxbWzRdXVsyLDRdIDwtIGFkakxbWzRdXVs0LDJdIDwtIGRhdGEkYWRqNE40Yi5TUTAwMi5baV0NCiAgYWRqTFtbNF1dWzMsNF0gPC0gYWRqTFtbNF1dWzQsM10gPC0gZGF0YSRhZGo0TjRjLlNRMDAxLltpXQ0KDQogICM1IGFsdGVycw0KICBhZGpMW1s1XV0gPC0gbWF0cml4KE5BLG5jb2w9NSxucm93PTUpDQogIGFkakxbWzVdXVsxLDJdIDwtIGFkakxbWzVdXVsyLDFdIDwtIGRhdGEkYWRqNE41YS5TUTAwMS5baV0NCiAgYWRqTFtbNV1dWzEsM10gPC0gYWRqTFtbNV1dWzMsMV0gPC0gZGF0YSRhZGo0TjVhLlNRMDAyLltpXQ0KICBhZGpMW1s1XV1bMSw0XSA8LSBhZGpMW1s1XV1bNCwxXSA8LSBkYXRhJGFkajRONWEuU1EwMDMuW2ldDQogIGFkakxbWzVdXVsxLDVdIDwtIGFkakxbWzVdXVs1LDFdIDwtIGRhdGEkYWRqNE41YS5TUTAwNC5baV0NCiAgYWRqTFtbNV1dWzIsM10gPC0gYWRqTFtbNV1dWzMsMl0gPC0gZGF0YSRhZGo0TjViLlNRMDAxLltpXQ0KICBhZGpMW1s1XV1bMiw0XSA8LSBhZGpMW1s1XV1bNCwyXSA8LSBkYXRhJGFkajRONWIuU1EwMDIuW2ldDQogIGFkakxbWzVdXVsyLDVdIDwtIGFkakxbWzVdXVs1LDJdIDwtIGRhdGEkYWRqNE41Yi5TUTAwMy5baV0NCiAgYWRqTFtbNV1dWzMsNF0gPC0gYWRqTFtbNV1dWzQsM10gPC0gZGF0YSRhZGo0TjVjLlNRMDAxLltpXQ0KICBhZGpMW1s1XV1bMyw1XSA8LSBhZGpMW1s1XV1bNSwzXSA8LSBkYXRhJGFkajRONWMuU1EwMDIuW2ldDQogIGFkakxbWzVdXVs0LDVdIDwtIGFkakxbWzVdXVs1LDRdIDwtIGRhdGEkYWRqNE41ZC5TUTAwMS5baV0NCiAgfQ0KDQogIGlmKG5uYW1lc19jc24+MSkgeyAjd2Ugb25seSBrbm93IGFsdGVyLWFsdGVyIHJlbGF0aW9ucyBmb3Igbm5hbWVzDQogICAgI3Rha2UgdGhlIG1hdHJpeCBjb3JyZXNwb25kaW5nIHRoZSBubmFtZXMNCiAgICBtYXQgPC0gYWRqTFtbbm5hbWVzX2Nzbl1dDQogICAgDQogICAgI3RpZXMgdGhhdCBhcmUgKHZlcnkpIGNsb3NlIGFyZSAxDQogICAgbWF0WyFpcy5uYShtYXQpXSA8LSBpZmVsc2UobWF0WyFpcy5uYShtYXQpXT09IkVyZyBoZWNodCIgfCBtYXRbIWlzLm5hKG1hdCldPT0iSGVjaHQiLCAxLDApDQoNCiAgICAjY2FsY3VsYXRlIGVtYmVkZGVkbmVzcyBmb3IgZWFjaCBhbHRlci9yb3c6DQogICAgZW1iZWQgPC0gYXBwbHkobWF0LCAxLCBmdW5jdGlvbihyb3cpIHsNCiAgICBuX2NvbHMgPC0gc3VtKCFpcy5uYShyb3cpKQ0KICAgIG5fb25lcyA8LSBzdW0ocm93ID09ICIxIiwgbmEucm0gPSBUUlVFKQ0KICAgIHJhdGlvIDwtIG5fb25lcyAvIG5fY29scw0KICAgIHJldHVybihyYXRpbykNCiAgICB9KQ0KICAgIA0KICAgIGFsdGVyTFtbaV1dJGNzbl9lbWJlZC50MVsxNjooMTUrbm5hbWVzX2NzbildIDwtIGVtYmVkIA0KICB9DQp9DQoNCiNhbHRlcnMgY291bGQgYmUgbmFtZWQgaW4gbXVsdGlwbGUgbmFtZSBnZW5lcmF0b3JzLiBlYWNoIGVsZW1lbnQgb2YgYWx0ZXJMIGNvbnRhaW5zIHJvd3MgY29ycmVzcG9uZGluZyB0byBhbHRlcnMgdGhhdCBtYXkgYmUgJ2R1cGxpY2F0ZXMnLg0KI2kgbWF0Y2ggdGhlIHN0cnVjdHVyYWwgZW1iZWRkZWRuZXNzIG1lYXN1cmVzDQoNCmZvciAoaSBpbiAxOmxlbmd0aChhbHRlckwpKSB7ICNmb3IgZWdvIGkgDQogIGZvciAoaiBpbiAxOm5yb3coYWx0ZXJMW1tpXV0pKSB7ICNmb3IgYWx0ZXIgag0KICAgICAgICANCiAgICAjaWYgbmFtZTIgaXMgbm90IGVtcHR5LCBhbHRlciBqIHdhcyBtYXRjaGVkIHRvIHRoZSBzdHVkeSBuZXR3b3JrOyBhbmQgbW9yZSBwcmVjaXNlbHksIHRvIHRoZSBzdHVkeSBwYXJ0bmVyIHdpdGggbmFtZTE6IGFsdGVyTFtbaV1dJG5hbWUyW2pdDQogICAgYWx0ZXJMW1tpXV0kc3R1ZHlfZW1iZWQudDFbal0gPC0gaWZlbHNlKCFpcy5uYShhbHRlckxbW2ldXSRuYW1lMltqXSksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHRlckxbW2ldXSRzdHVkeV9lbWJlZC50MVt3aGljaChhbHRlckxbW2ldXSRuYW1lMT09YWx0ZXJMW1tpXV0kbmFtZTJbal0gJiAhaXMubmEoYWx0ZXJMW1tpXV0kc3R1ZHlfZW1iZWQudDEpKV0sDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsdGVyTFtbaV1dJHN0dWR5X2VtYmVkLnQxW2pdKQ0KICAgIA0KICAgICNpZiBuYW1lMyBpcyBub3QgZW1wdHksIGFsdGVyIGogd2FzIG1hdGNoZWQgdG8gdGhlIGZyaWVuZHMgbmV0d29yazsgYW5kIG1vcmUgcHJlY2lzZWx5LCB0byB0aGUgZnJpZW5kIHdpdGggbmFtZTE6IGFsdGVyTFtbaV1dJG5hbWUzW2pdDQogICAgYWx0ZXJMW1tpXV0kYmZmX2VtYmVkLnQxW2pdIDwtIGlmZWxzZSghaXMubmEoYWx0ZXJMW1tpXV0kbmFtZTNbal0pLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsdGVyTFtbaV1dJGJmZl9lbWJlZC50MVt3aGljaChhbHRlckxbW2ldXSRuYW1lMT09YWx0ZXJMW1tpXV0kbmFtZTNbal0gJiAhaXMubmEoYWx0ZXJMW1tpXV0kYmZmX2VtYmVkLnQxKSldLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWx0ZXJMW1tpXV0kYmZmX2VtYmVkLnQxW2pdKQ0KICAgIA0KICAgICNpZiBuYW1lNCBpcyBub3QgZW1wdHksIGFsdGVyIGogd2FzIG1hdGNoZWQgdG8gdGhlIHNwb3J0cyBuZXR3b3JrOyBhbmQgbW9yZSBwcmVjaXNlbHksIHRvIHRoZSBzcG9ydHMgcGFydG5lciB3aXRoIG5hbWUxOiBhbHRlckxbW2ldXSRuYW1lNFtqXQ0KICAgIGFsdGVyTFtbaV1dJGNzbl9lbWJlZC50MVtqXSA8LSBpZmVsc2UoIWlzLm5hKGFsdGVyTFtbaV1dJG5hbWU0W2pdKSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHRlckxbW2ldXSRjc25fZW1iZWQudDFbd2hpY2goYWx0ZXJMW1tpXV0kbmFtZTE9PWFsdGVyTFtbaV1dJG5hbWU0W2pdICYgIWlzLm5hKGFsdGVyTFtbaV1dJGNzbl9lbWJlZC50MSkpXSwgICAgIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWx0ZXJMW1tpXV0kY3NuX2VtYmVkLnQxW2pdICkNCiAgfQ0KfQ0KDQojIGkgdXNlIHRoZSBuYW1lIGludGVycHJldGVyIGRhdGEgdG8gYWRkIChzdGFibGUpIGFsdGVyIGNoYXJhY3RlcmlzdGljcyAoZS5nLiwgZ2VuZGVyKQ0KIyBpbiBuYW1lLWludGVycHJldGVyIHF1ZXN0aW9ucywgb25seSB1bmlxdWUgKGkuZS4sIG5vbi1tYXRjaGVkKSBhbHRlcnMgd2VyZSBsaXN0ZWQuLi4gdGh1cywgYWx0ZXIgaWRzIHdpdGhvdXQgYSBnZW5kZXIgYXNzaWduZWQgdG8gdGhlbSBhcmUgbm9uLXVuaXF1ZXMsIGFuZCBjYW4gbGF0ZXIgYmUgZmlsdGVyZWQgb3V0Lg0KZGZfZ2VuZGVyIDwtIGRhdGEuZnJhbWUocDEgPSBkYXRhJGdlbmRlci5TUTAwMS4scDIgPSBkYXRhJGdlbmRlci5TUTAwMi4scDMgPSBkYXRhJGdlbmRlci5TUTAwMy4scDQgPSBkYXRhJGdlbmRlci5TUTAwNC4scDUgPSBkYXRhJGdlbmRlci5TUTAwNS4scDYgPSBkYXRhJGdlbmRlci5TUTAwNi4scDcgPSBkYXRhJGdlbmRlci5TUTAwNy4scDggPSBkYXRhJGdlbmRlci5TUTAwOC4scDkgPSBkYXRhJGdlbmRlci5TUTAwOS4scDEwPSBkYXRhJGdlbmRlci5TUTAxMC4scDExPSBkYXRhJGdlbmRlci5TUTAxMS4scDEyPSBkYXRhJGdlbmRlci5TUTAxMi4scDEzPSBkYXRhJGdlbmRlci5TUTAxMy4scDE0PSBkYXRhJGdlbmRlci5TUTAxNC4scDE1PSBkYXRhJGdlbmRlci5TUTAxNS4scDE2PSBkYXRhJGdlbmRlci5TUTAxNi4scDE3PSBkYXRhJGdlbmRlci5TUTAxNy4scDE4PSBkYXRhJGdlbmRlci5TUTAxOC4scDE5PSBkYXRhJGdlbmRlci5TUTAxOS4scDIwPSBkYXRhJGdlbmRlci5TUTAyMC4pDQoNCiMgc2FtZSBmb3IgYWdlLi4uDQpkZl9hZ2UgPC0gZGF0YS5mcmFtZShwMSA9IGRhdGEkYWdlLlNRMDAxLixwMiA9IGRhdGEkYWdlLlNRMDAyLixwMyA9IGRhdGEkYWdlLlNRMDAzLixwNCA9IGRhdGEkYWdlLlNRMDA0LixwNSA9IGRhdGEkYWdlLlNRMDA1LixwNiA9IGRhdGEkYWdlLlNRMDA2LixwNyA9IGRhdGEkYWdlLlNRMDA3LixwOCA9IGRhdGEkYWdlLlNRMDA4LixwOSA9IGRhdGEkYWdlLlNRMDA5LixwMTA9IGRhdGEkYWdlLlNRMDEwLixwMTE9IGRhdGEkYWdlLlNRMDExLixwMTI9IGRhdGEkYWdlLlNRMDEyLixwMTM9IGRhdGEkYWdlLlNRMDEzLixwMTQ9IGRhdGEkYWdlLlNRMDE0LixwMTU9IGRhdGEkYWdlLlNRMDE1LixwMTY9IGRhdGEkYWdlLlNRMDE2LixwMTc9IGRhdGEkYWdlLlNRMDE3LixwMTg9IGRhdGEkYWdlLlNRMDE4LixwMTk9IGRhdGEkYWdlLlNRMDE5LixwMjA9IGRhdGEkYWdlLlNRMDIwLikNCg0KIyBraW4NCmRmX2tpbiA8LSBkYXRhLmZyYW1lKCBwMSA9IGRhdGEka2luLlNRMDAxLixwMiA9IGRhdGEka2luLlNRMDAyLixwMyA9IGRhdGEka2luLlNRMDAzLixwNCA9IGRhdGEka2luLlNRMDA0LixwNSA9IGRhdGEka2luLlNRMDA1LixwNiA9IGRhdGEka2luLlNRMDA2LixwNyA9IGRhdGEka2luLlNRMDA3LixwOCA9IGRhdGEka2luLlNRMDA4LixwOSA9IGRhdGEka2luLlNRMDA5LixwMTA9IGRhdGEka2luLlNRMDEwLixwMTE9IGRhdGEka2luLlNRMDExLixwMTI9IGRhdGEka2luLlNRMDEyLixwMTM9IGRhdGEka2luLlNRMDEzLixwMTQ9IGRhdGEka2luLlNRMDE0LixwMTU9IGRhdGEka2luLlNRMDE1LixwMTY9IGRhdGEka2luLlNRMDE2LixwMTc9IGRhdGEka2luLlNRMDE3LixwMTg9IGRhdGEka2luLlNRMDE4LixwMTk9IGRhdGEka2luLlNRMDE5LixwMjA9IGRhdGEka2luLlNRMDIwLikNCg0KI2VkdWNhdGlvbg0KZGZfZWR1YyA8LSBkYXRhLmZyYW1lKHAxID0gZGF0YSRlZHVjLlNRMDAxLixwMiA9IGRhdGEkZWR1Yy5TUTAwMi4scDMgPSBkYXRhJGVkdWMuU1EwMDMuLHA0ID0gZGF0YSRlZHVjLlNRMDA0LixwNSA9IGRhdGEkZWR1Yy5TUTAwNS4scDYgPSBkYXRhJGVkdWMuU1EwMDYuLHA3ID0gZGF0YSRlZHVjLlNRMDA3LixwOCA9IGRhdGEkZWR1Yy5TUTAwOC4sIHA5ID0gZGF0YSRlZHVjLlNRMDA5LixwMTA9IGRhdGEkZWR1Yy5TUTAxMC4sIHAxMT0gZGF0YSRlZHVjLlNRMDExLiwgcDEyPSBkYXRhJGVkdWMuU1EwMTIuLCBwMTM9IGRhdGEkZWR1Yy5TUTAxMy4sIHAxND0gZGF0YSRlZHVjLlNRMDE0LiwgcDE1PSBkYXRhJGVkdWMuU1EwMTUuLCBwMTY9IGRhdGEkZWR1Yy5TUTAxNi4sIHAxNz0gZGF0YSRlZHVjLlNRMDE3LiwgcDE4PSBkYXRhJGVkdWMuU1EwMTguLCBwMTk9IGRhdGEkZWR1Yy5TUTAxOS4sIHAyMD0gZGF0YSRlZHVjLlNRMDIwLikNCg0KI2Fsc28gZHluYW1pYyBjaGFyYWN0ZXJpc3RpY3MNCiNjb21tdW5pY2F0aW9uIGZyZXF1ZW5jeQ0KZGZfZnJlcSA8LSBkYXRhLmZyYW1lKHAxID0gZGF0YSRmcmVxLlNRMDAxLixwMiA9IGRhdGEkZnJlcS5TUTAwMi4scDMgPSBkYXRhJGZyZXEuU1EwMDMuLHA0ID0gZGF0YSRmcmVxLlNRMDA0LixwNSA9IGRhdGEkZnJlcS5TUTAwNS4scDYgPSBkYXRhJGZyZXEuU1EwMDYuLHA3ID0gZGF0YSRmcmVxLlNRMDA3LixwOCA9IGRhdGEkZnJlcS5TUTAwOC4sIHA5ID0gZGF0YSRmcmVxLlNRMDA5LixwMTA9IGRhdGEkZnJlcS5TUTAxMC4sIHAxMT0gZGF0YSRmcmVxLlNRMDExLiwgcDEyPSBkYXRhJGZyZXEuU1EwMTIuLCBwMTM9IGRhdGEkZnJlcS5TUTAxMy4sIHAxND0gZGF0YSRmcmVxLlNRMDE0LiwgcDE1PSBkYXRhJGZyZXEuU1EwMTUuLCBwMTY9IGRhdGEkZnJlcS5TUTAxNi4sIHAxNz0gZGF0YSRmcmVxLlNRMDE3LiwgcDE4PSBkYXRhJGZyZXEuU1EwMTguLCBwMTk9IGRhdGEkZnJlcS5TUTAxOS4sIHAyMD0gZGF0YSRmcmVxLlNRMDIwLikNCg0KI2Nsb3NlbmVzcw0KZGZfY2xvc2UgPC0gZGF0YS5mcmFtZShwMSA9IGRhdGEkY2xvc2UuU1EwMDEuLHAyID0gZGF0YSRjbG9zZS5TUTAwMi4scDMgPSBkYXRhJGNsb3NlLlNRMDAzLixwNCA9IGRhdGEkY2xvc2UuU1EwMDQuLHA1ID0gZGF0YSRjbG9zZS5TUTAwNS4scDYgPSBkYXRhJGNsb3NlLlNRMDA2LixwNyA9IGRhdGEkY2xvc2UuU1EwMDcuLHA4ID0gZGF0YSRjbG9zZS5TUTAwOC4sIHA5ID0gZGF0YSRjbG9zZS5TUTAwOS4scDEwPSBkYXRhJGNsb3NlLlNRMDEwLiwgcDExPSBkYXRhJGNsb3NlLlNRMDExLiwgcDEyPSBkYXRhJGNsb3NlLlNRMDEyLiwgcDEzPSBkYXRhJGNsb3NlLlNRMDEzLiwgcDE0PSBkYXRhJGNsb3NlLlNRMDE0LiwgcDE1PSBkYXRhJGNsb3NlLlNRMDE1LiwgcDE2PSBkYXRhJGNsb3NlLlNRMDE2LiwgcDE3PSBkYXRhJGNsb3NlLlNRMDE3LiwgcDE4PSBkYXRhJGNsb3NlLlNRMDE4LiwgcDE5PSBkYXRhJGNsb3NlLlNRMDE5LiwgcDIwPSBkYXRhJGNsb3NlLlNRMDIwLikNCg0KI2FuZCBvdGhlciBkeWFkaWMgZmVhdHVlcnMNCiMgZHVyYXRpb247DQpkZl9kdXJhdGlvbiA8LSBkYXRhLmZyYW1lKHAxID0gZGF0YSRkdXVyLlNRMDAxLixwMiA9IGRhdGEkZHV1ci5TUTAwMi4scDMgPSBkYXRhJGR1dXIuU1EwMDMuLHA0ID0gZGF0YSRkdXVyLlNRMDA0LixwNSA9IGRhdGEkZHV1ci5TUTAwNS4scDYgPSBkYXRhJGR1dXIuU1EwMDYuLHA3ID0gZGF0YSRkdXVyLlNRMDA3LixwOCA9IGRhdGEkZHV1ci5TUTAwOC4sIHA5ID0gZGF0YSRkdXVyLlNRMDA5LixwMTA9IGRhdGEkZHV1ci5TUTAxMC4sIHAxMT0gZGF0YSRkdXVyLlNRMDExLiwgcDEyPSBkYXRhJGR1dXIuU1EwMTIuLCBwMTM9IGRhdGEkZHV1ci5TUTAxMy4sIHAxND0gZGF0YSRkdXVyLlNRMDE0LiwgcDE1PSBkYXRhJGR1dXIuU1EwMTUuLCBwMTY9IGRhdGEkZHV1ci5TUTAxNi4sIHAxNz0gZGF0YSRkdXVyLlNRMDE3LiwgcDE4PSBkYXRhJGR1dXIuU1EwMTguLCBwMTk9IGRhdGEkZHV1ci5TUTAxOS4sIHAyMD0gZGF0YSRkdXVyLlNRMDIwLikNCg0KI2dlb2dyYXBoaWNhbCBwcm94aW1pdHkNCmRmX3Byb3hpbWl0eSA8LSBkYXRhLmZyYW1lKHAxID0gZGF0YSRwcm94LlNRMDAxLixwMiA9IGRhdGEkcHJveC5TUTAwMi4scDMgPSBkYXRhJHByb3guU1EwMDMuLHA0ID0gZGF0YSRwcm94LlNRMDA0LixwNSA9IGRhdGEkcHJveC5TUTAwNS4scDYgPSBkYXRhJHByb3guU1EwMDYuLHA3ID0gZGF0YSRwcm94LlNRMDA3LixwOCA9IGRhdGEkcHJveC5TUTAwOC4sIHA5ID0gZGF0YSRwcm94LlNRMDA5LixwMTA9IGRhdGEkcHJveC5TUTAxMC4sIHAxMT0gZGF0YSRwcm94LlNRMDExLiwgcDEyPSBkYXRhJHByb3guU1EwMTIuLCBwMTM9IGRhdGEkcHJveC5TUTAxMy4sIHAxND0gZGF0YSRwcm94LlNRMDE0LiwgcDE1PSBkYXRhJHByb3guU1EwMTUuLCBwMTY9IGRhdGEkcHJveC5TUTAxNi4sIHAxNz0gZGF0YSRwcm94LlNRMDE3LiwgcDE4PSBkYXRhJHByb3guU1EwMTguLCBwMTk9IGRhdGEkcHJveC5TUTAxOS4sIHAyMD0gZGF0YSRwcm94LlNRMDIwLikNCg0KZm9yIChpIGluIDE6bGVuZ3RoKGFsdGVyTCkpIHsNCiAgDQogICNnZW5kZXINCiAgYWx0ZXJMW1tpXV0kYWx0ZXJfZ2VuZGVyIDwtIA0KICAgIGlmZWxzZSh1bmxpc3QoZGZfZ2VuZGVyW2ksXSwgdXNlLm5hbWVzPUYpPT0iTWFuIiwgMCwgICMgbWFsZSA9IHJlZi4NCiAgICAgICAgICAgaWZlbHNlKHVubGlzdChkZl9nZW5kZXJbaSxdLCB1c2UubmFtZXM9Rik9PSJWcm91dyIsIDEsDQogICAgICAgICAgICAgICAgICBpZmVsc2UodW5saXN0KGRmX2dlbmRlcltpLF0sIHVzZS5uYW1lcz1GKT09IkFuZGVycyIsIDIsICIiKSkpDQogICNraW4gIA0KICBhbHRlckxbW2ldXSRraW4gPC0gDQogICAgaWZlbHNlKHVubGlzdChkZl9raW5baSxdLCB1c2UubmFtZXM9Rik9PSJKYSIsIDEsDQogICAgICAgICAgIGlmZWxzZSh1bmxpc3QoZGZfa2luW2ksXSwgdXNlLm5hbWVzPUYpPT0iTmVlIiwgMCwgIiIpKQ0KICAjYWdlICANCiAgYWx0ZXJMW1tpXV0kYWx0ZXJfYWdlIDwtIA0KICAgIGlmZWxzZSh1bmxpc3QoZGZfYWdlW2ksXSwgdXNlLm5hbWVzPUYpPT0iSm9uZ2VyIGRhbiAxOCBqYWFyIiwgMTYsICM/Pz8NCiAgICAgICAgICAgaWZlbHNlKHVubGlzdChkZl9hZ2VbaSxdLCB1c2UubmFtZXM9Rik9PSIxOCB0b3QgMjEgamFhciIsIDIwLA0KICAgICAgICAgICAgICAgICAgaWZlbHNlKHVubGlzdChkZl9hZ2VbaSxdLCB1c2UubmFtZXM9Rik9PSIyMiB0b3QgMjUgamFhciIsIDIzLA0KICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZSh1bmxpc3QoZGZfYWdlW2ksXSwgdXNlLm5hbWVzPUYpPT0iMjYgdG90IDMwIGphYXIiLCAyOCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHVubGlzdChkZl9hZ2VbaSxdLCB1c2UubmFtZXM9Rik9PSIzMSB0b3QgNDAgamFhciIsIDM1LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHVubGlzdChkZl9hZ2VbaSxdLCB1c2UubmFtZXM9Rik9PSJPdWRlciBkYW4gNDAgamFhciIsIDQ1LCAjPz8/DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHVubGlzdChkZl9hZ2VbaSxdLCB1c2UubmFtZXM9Rik9PSJXZWV0IGlrIG5pZXQiLCBOQSwgIyBpIGRvbid0IGtub3cgPSBtaXNzaW5nDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVubGlzdChkZl9hZ2VbaSxdLCB1c2UubmFtZXM9RikpKSkpKSkpDQogICNlZHVjYXRpb24NCiAgYWx0ZXJMW1tpXV0kYWx0ZXJfZWR1YyA8LSBpZmVsc2UodW5saXN0KGRmX2VkdWNbaSxdLHVzZS5uYW1lcz1GKT09ImxhZ2VyZSBzY2hvb2wiLCAxLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZSh1bmxpc3QoZGZfZWR1Y1tpLF0sdXNlLm5hbWVzPUYpPT0idm1ibywgbWF2byIsIDIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZSh1bmxpc3QoZGZfZWR1Y1tpLF0sdXNlLm5hbWVzPUYpPT0ibWJvIiwgMywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHVubGlzdChkZl9lZHVjW2ksXSx1c2UubmFtZXM9Rik9PSJoYXZvIiwgNCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHVubGlzdChkZl9lZHVjW2ksXSx1c2UubmFtZXM9Rik9PSJ2d28gLyBneW1uYXNpdW0iLCA1LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZSh1bmxpc3QoZGZfZWR1Y1tpLF0sdXNlLm5hbWVzPUYpPT0iaGJvIiwgNiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHVubGlzdChkZl9lZHVjW2ksXSx1c2UubmFtZXM9Rik9PSJ1bml2ZXJzaXRlaXQiLCA3LCBOQSkpKSkpKSkgDQogICNmcmVxdWVuY3kNCiAgYWx0ZXJMW1tpXV0kZnJlcXVlbmN5LnQxIDwtIGlmZWxzZSh1bmxpc3QoZGZfZnJlcVtpLF0sdXNlLm5hbWVzPUYpPT0iKEJpam5hKSBlbGtlIGRhZyIsIDcsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHVubGlzdChkZl9mcmVxW2ksXSx1c2UubmFtZXM9Rik9PSIxLTIga2VlciBwZXIgd2VlayIsNiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHVubGlzdChkZl9mcmVxW2ksXSx1c2UubmFtZXM9Rik9PSJBYW50YWwga2VlciBwZXIgbWFhbmQiLDUsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UodW5saXN0KGRmX2ZyZXFbaSxdLHVzZS5uYW1lcz1GKT09Ik9uZy4gMSBrZWVyIHBlciBtYWFuZCIsNCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZSh1bmxpc3QoZGZfZnJlcVtpLF0sdXNlLm5hbWVzPUYpPT0iQWFudGFsIGtlZXIgcGVyIGphYXIiLDMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHVubGlzdChkZl9mcmVxW2ksXSx1c2UubmFtZXM9Rik9PSJPbmcuIDEga2VlciBwZXIgamFhciIsMiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHVubGlzdChkZl9mcmVxW2ksXSx1c2UubmFtZXM9Rik9PSJOb29pdCIsMSwgTkEgKSkpKSkpKQ0KICAjY2xvc2VuZXNzDQogIGFsdGVyTFtbaV1dJGNsb3NlbmVzcy50MSA8LSBpZmVsc2UodW5saXN0KGRmX2Nsb3NlW2ksXSx1c2UubmFtZXM9Rik9PSJOaWV0IGhlY2h0IiwgMSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHVubGlzdChkZl9jbG9zZVtpLF0sdXNlLm5hbWVzPUYpPT0iRW5pZ3N6aW5zIGhlY2h0IiwgMiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHVubGlzdChkZl9jbG9zZVtpLF0sdXNlLm5hbWVzPUYpPT0iSGVjaHQiLCAzLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHVubGlzdChkZl9jbG9zZVtpLF0sdXNlLm5hbWVzPUYpPT0iSGVlbCBlcmcgaGVjaHQiLCA0LCBOQSApKSkpDQogICNwcm94aW1pdHkNCiAgYWx0ZXJMW1tpXV0kcHJveGltaXR5IDwtIGlmZWxzZSh1bmxpc3QoZGZfcHJveGltaXR5W2ksXSwgdXNlLm5hbWVzPUZBTFNFKSA9PSAiSW4gaGV0emVsZmRlIGh1aXMiLCAicm9vbW1hdGUiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZSh1bmxpc3QoZGZfcHJveGltaXR5W2ksXSwgdXNlLm5hbWVzID0gRkFMU0UpID09ICJJbiBkZXplbGZkZSBidXVydCIgfA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5saXN0KGRmX3Byb3hpbWl0eVtpLF0sdXNlLm5hbWVzPUYpPT0iSW4gZGV6ZWxmZGUgc3RyYWF0IiB8DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmxpc3QoZGZfcHJveGltaXR5W2ksXSx1c2UubmFtZXM9Rik9PSJJbiBkZXplbGZkZSBnZW1lZW50ZSIsICJjbG9zZSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UodW5saXN0KGRmX3Byb3hpbWl0eVtpLF0sIHVzZS5uYW1lcyA9IEZBTFNFKSA9PSAiSW4gaGV0emVsZmRlIGxhbmQiIHwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVubGlzdChkZl9wcm94aW1pdHlbaSxdLCB1c2UubmFtZXMgPSBGQUxTRSkgPT0gIkluIGVlbiBhbmRlciBsYW5kIiwiZmFyIiwgTkEpKSkNCg0KICANCiAgICNkdXJhdGlvbjogIHRha2UgbWlkcG9pbnQgb24gc2NhbGUuDQogICBhbHRlckxbW2ldXSRkdXJhdGlvbiA8LSBpZmVsc2UodW5saXN0KGRmX2R1cmF0aW9uW2ksXSx1c2UubmFtZXM9Rik9PSJNaW5kZXIgZGFuIDEgamFhciIsIDAsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZSh1bmxpc3QoZGZfZHVyYXRpb25baSxdLHVzZS5uYW1lcz1GKT09IjEgdG90IDMgamFhciIsIDIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZSh1bmxpc3QoZGZfZHVyYXRpb25baSxdLHVzZS5uYW1lcz1GKT09IjQgdG90IDggamFhciIsIDYsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UodW5saXN0KGRmX2R1cmF0aW9uW2ksXSx1c2UubmFtZXM9Rik9PSI5IHRvdCAxNSBqYWFyIiwgMTIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHVubGlzdChkZl9kdXJhdGlvbltpLF0sdXNlLm5hbWVzPUYpPT0iTWVlciBkYW4gMTUgamFhciIsIDE1LE5BICkpKSkpDQp9DQoNCiMgYmVmb3JlIHdlIGNhbiBjb25zdHJ1Y3Qgc2ltaWxhcml0eSBpbmRpY2VzLCB3ZSBtdXN0IGFkZCBlZ28tYXR0cmlidXRlcw0KZm9yIChpIGluIDE6bGVuZ3RoKGFsdGVyTCkpIHsNCiAgIyAgZ2VuZGVyDQogIGFsdGVyTFtbaV1dJGVnb19nZW5kZXIgPC0gaWZlbHNlKGRhdGEkQTFbaV0gPT0gIk1hbiIsIDAsaWZlbHNlKGRhdGEkQTFbaV0gPT0gIlZyb3V3IiwgMSxpZmVsc2UoZGF0YSRBMVtpXSA9PSAiT3ZlcmlnZSIsIDIsTkEpKSkNCiAgDQogICMgZWR1Y2F0aW9uIA0KICAjIHRoZXNlIHNjb3JlIHNob3VsZCBjb3JyZXNwb25kIHRvIHNjb3JlcyBnaXZlbiB0byBhbHRlciBlZHVjLi4uDQogIGFsdGVyTFtbaV1dJGVnb19lZHVjIDwtIGlmZWxzZShkYXRhJFQxW2ldID09ICJhYW4gZGUgSG9nZXNjaG9vbCB2YW4gQXJuaGVtIGVuIE5pam1lZ2VuIChIQU4pIiwgIjYiLCAiNyIgKQ0KIA0KICAjIGFnZQ0KICAjIGNhbGN1bGF0ZWQgYXMgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBzdWJtaXNzaW9uIGRhdGUgYW5kIGJpcnRoZGF0ZQ0KICAjIGluIHllYXJzLg0KICBiaXJ0aF9kYXRlIDwtIGFzLkRhdGUoZGF0YSRBMltpXSkNCiAgI3hfZGF0ZSA8LSBhcy5EYXRlKGRhdGEkc3VibWl0ZGF0ZSkgI3N1Ym1pc3Npb24gZGF0ZSB3YXMgbm90IGRlcG9zaXRlZDsgc28sIHRha2UgMS1qYW4gMjAyMw0KICB4X2RhdGUgPC0gYXMuRGF0ZSgiMjAyMy0wMS0wMSIpDQogIGFsdGVyTFtbaV1dJGVnb19hZ2UgPC0gdHJ1bmMoKGJpcnRoX2RhdGUgJS0tJSB4X2RhdGUpIC8geWVhcnMoMSkpDQp9DQoNCiMgaSBmaWx0ZXIgb3V0IHRoZSB1bmlxdWUsIG5vbi1kdXBsaWNhdGUgYWx0ZXJzOw0KIyBieSBleGNsdWRpbmcgYWx0ZXJzIHdpdGggZW1wdHkgc3RyaW5ncyBmb3IgZ2VuZGVyIGF0dHJpYnV0ZQ0KZm9yICggaSBpbiAxOmxlbmd0aChhbHRlckwpKSB7DQogIGFsdGVyTFtbaV1dIDwtIGFsdGVyTFtbaV1dW3doaWNoKGFsdGVyTFtbaV1dJGFsdGVyX2dlbmRlciE9IiIpLF0NCiAgIyBhbmQgcmVwbGFjZSB0aGUgYWx0ZXIgaWQ6IDEgOiBuby4gdW5pcXVlIGFsdGVycw0KICBhbHRlckxbW2ldXSRhbHRlcmlkIDwtIDE6bnJvdyhhbHRlckxbW2ldXSkNCn0NCg0KI2R5YWRpYyBzaW1pbGFyaXR5IG1lYXN1cmVzDQpmb3IgKGkgaW4gMTpsZW5ndGgoYWx0ZXJMKSkgIHsgIyBmb3IgZWdvIGkNCiAgIyBnZXQgYXR0cmlidXRlcyBvZiBlZ28NCiAgYWdlaSA8LSBhbHRlckxbW2ldXSRlZ29fYWdlWzFdDQogIGdlbmRlcmkgPC0gYWx0ZXJMW1tpXV0kZWdvX2dlbmRlclsxXQ0KICBlZGkgPC0gYWx0ZXJMW1tpXV0kZWdvX2VkdWNbMV0NCiAgDQogIGZvciAoaiBpbiAxOm1heChhbHRlckxbW2ldXSRhbHRlcmlkKSkgeyAjIGZvciBhbHRlciBqDQogICAgIyBjYWxjdWxhdGUgInNhbWUgZ2VuZGVyIiAoMC8xKQ0KICAgIGdlbmRlcmogPC0gYXMubnVtZXJpYyhhbHRlckxbW2ldXSRhbHRlcl9nZW5kZXJbal0pICMgZ2V0IGFsdGVyIGogZ2VuZGVyDQogICAgc2FtZSA8LSBpZmVsc2UoZ2VuZGVyaT09Z2VuZGVyaiwgMSwgMCkNCiAgICBhbHRlckxbW2ldXSRzYW1lX2dlbmRlclt3aGljaChhbHRlckxbW2ldXSRhbHRlcmlkPT1qKV0gPC0gc2FtZQ0KICAgIA0KICAgICNzYW1lIGVkdWNhdGlvbg0KICAgIGVkdWogPC0gYWx0ZXJMW1tpXV0kYWx0ZXJfZWR1Y1tqXQ0KICAgIHNhbWUgPC0gaWZlbHNlKGVkdWo9PWVkaSwgMSwgMCkNCiAgICBhbHRlckxbW2ldXSRzaW1fZWR1Y1t3aGljaChhbHRlckxbW2ldXSRhbHRlcmlkPT1qKV0gPC0gc2FtZQ0KICAgIA0KICAgICMgY2FsY3VsYXRlIHNpbWlsYXJpdHkgZm9yIGFnZSBhcyB0aGUgYWJzb2x1dGUgZGlmZmVyZW5jZSBiZXR3ZWVuIGFsdGVyIGFuZCBlZ28gdmFsdWUNCiAgICAjZ2V0IGFsdGVyIGogYXR0cmlidXRlcw0KICAgIGFnZWogPC0gYXMubnVtZXJpYyhhbHRlckxbW2ldXSRhbHRlcl9hZ2Vbal0pDQogICAgI2RpZmZlcmVuY2Ugc2NvcmUNCiAgICBkaWZhZ2UgPC0gYWJzKGFnZWkgLSBhZ2VqKQ0KICAgIA0KICAgICMgc28gaGlnaGVyIHZhbHVlcyByZXByZXNlbnQgKmxlc3MqIHNpbWlsYXJpdHkNCiAgICBpZiggIWlzLm5hIChhZ2VqKSApIHsgIyBhZ2Ugc2ltaWxhcml0eSBvbmx5IGNhbGN1bGFibGUgaWYgel9qIGlzIGtub3duIQ0KICAgICAgICBhbHRlckxbW2ldXSRkaWZfYWdlW3doaWNoKGFsdGVyTFtbaV1dJGFsdGVyaWQ9PWopXSA8LSBkaWZhZ2UNCiAgICAgIH0gZWxzZSB7IGFsdGVyTFtbaV1dJGRpZl9hZ2Vbd2hpY2goYWx0ZXJMW1tpXV0kYWx0ZXJpZD09aildIDwtIE5BfQ0KICB9DQp9DQoNCiNiYXNlZCBvbiB0aGlzLCBpIG1ha2UgYSBsb25nIGRhdGFmcmFtZSB3aXRoIGFsdGVycyBuZXN0ZWQgaW4gZWdvLg0KI2ZpcnN0LCBhZGQgYW4gZWdvX2lkDQpmb3IgKGkgaW4gMTpsZW5ndGgoYWx0ZXJMKSkgew0KICBhbHRlckxbW2ldXSRlZ28gPC0gaQ0KICBhbHRlckxbW2ldXSRyZXNwbnIgPC0gZGF0YSRyZXNwbnJbaV0NCn0NCg0KI2NvbWJpbmUgdXNpbmcgcmJpbmQNCmRmIDwtIGRvLmNhbGwocmJpbmQsYWx0ZXJMKQ0KDQojb3RoZXIgZWdvIHZhcmlhYmxlczoNCiN0cmFuc2l0aW9ucw0KIyB3ZSBuZWVkIGluZm8gb2Ygd2F2ZXMgMSBhbmQgMiwgc28gaSBtZXJnZSB0aGVtDQpkIDwtIG1lcmdlKGRhdGEzLCBkYXRhNCwgYnk9InJlc3BuciIpDQpkIDwtIGRhdGEuZnJhbWUoZFtvcmRlcihkJHJlc3BuciwgZGVjcmVhc2luZyA9IEZBTFNFKSwgXSkgIyBhbmQgc29ydCBieSByZXNwbnINCg0KIzEuIHJlc2lkZW50aWFsIHRyYW5zaXRpb25zDQpkZiRob3VzaW5nLnQxYSA8LSBOQSAjd2F2ZSAxLCBwcmUtdHJhbnNpdGlvbg0KZGYkaG91c2luZy50MWIgPC0gTkEgI3dhdmUgMSwgcG9zdC10cmFuc2l0aW9uDQpkZiRob3VzaW5nLnQyIDwtIE5BICN3YXZlIDINCmRmJGhvdXNpbmcudHJhbnNpdGlvbiA8LSBOQSAjbm8uIG9mIGNoYW5nZXMgDQoNCiNtYWtlIHN1cmUgZGVzY3JpcHRpb25zIG9mIGxpdmluZyBzaXR1YXRpb24gbWF0Y2hlcyBvdmVyIHdhdmVzDQpkJEE3IDwtIGlmZWxzZShkJEE3ID09ICJpbndvbmVuZCBiaWogb3VkZXIocykvdmVyem9yZ2VyKHMpIiwgImlud29uZW5kIGJpaiBqZSBvdWRlcihzKS92ZXJ6b3JnZXIocykiLCBkJEE3KQ0KZCRBNGQgPC0gaWZlbHNlKGQkQTRkID09ICJpbndvbmVuZCBiaWogb3VkZXIocykvdmVyem9yZ2VyKHMpIiwgImlud29uZW5kIGJpaiBqZSBvdWRlcihzKS92ZXJ6b3JnZXIocykiLCBkJEE0ZCkNCg0KZm9yIChpIGluIHVuaXF1ZShkZiRlZ28pKSB7DQogIGRmJGhvdXNpbmcudDFhW3doaWNoKGRmJGVnbyA9PSBpKV0gPC0gZCRBNC54W2ldICMgdzEsIGhhbGYgeWVhciBwcmlvciB0byB0cmFuc2l0aW9uDQogICAgDQogICMgaWYgcmVzcG9uZGVudCBoYWQgbW92ZWQgYXQgdGhlIHRpbWUgb2YgdzEsIGdldCBjdXJyZW50IGxpdmluZyBzaXR1YXRpb24NCiAgZGYkaG91c2luZy50MWJbd2hpY2goZGYkZWdvPT1pKV0gPC0gaWZlbHNlKGQkQTZbaV0gPT0gIk5lZSIsIGQkQTdbaV0sIGRmJGhvdXNpbmcudDFhW3doaWNoKGRmJGVnbz09aSldKQ0KICANCiAgI2lmIHRoZXkgbW92ZWQsIHRoaXMgaW5kaWNhdGVzIGEgdHJhbnNpdGlvbg0KICB0cmFuc2l0aW9uIDwtIGlmZWxzZShkJEE2W2ldPT0iTmVlIiwgMSwgMCkNCiAgDQogICMgaWYgcmVzcG9uZGVudCBoYXMgbW92ZWQgc2luY2UgdGhlbiAoaW4gdzIpLCAuLi4NCiAgZGYkaG91c2luZy50Mlt3aGljaChkZiRlZ289PWkpXSA8LSBpZmVsc2UoZCRBNC55W2ldID09ICJKYSIgfCBkJEE0YltpXSA9PSAiSmEiIHwgZCRBNGNbaV0gPT0gIkphIiwgZCRBNGRbaV0sIGRmJGhvdXNpbmcudDFiW3doaWNoKGRmJGVnbz09aSldKSANCiAgDQogIHRyYW5zaXRpb24gPC0gaWZlbHNlKGQkQTQueVtpXSA9PSAiSmEiIHwgZCRBNGJbaV0gPT0gIkphIiB8IGQkQTRjW2ldID09ICJKYSIsIHRyYW5zaXRpb24gKyAxLCB0cmFuc2l0aW9uKQ0KICANCiAgIyBuby4gb2YgaG91c2luZyB0cmFuc2l0aW9uDQogIGRmJGhvdXNpbmcudHJhbnNpdGlvblt3aGljaChkZiRlZ289PWkpXSA8LSB0cmFuc2l0aW9uDQp9DQoNCiNhbHNvIG1ha2UgaXQgYmluYXJ5ICh5ZXMvbm8pDQpkZiRob3VzaW5nLnRyYW5zaXRpb25fYmluIDwtIGlmZWxzZShkZiRob3VzaW5nLnRyYW5zaXRpb24gPiAwLCAxLCAwKQ0KDQojMi4gdHJhbnNpdGlvbiB0byB1bml2ZXJzaXR5DQpkZiRvY2N1cGF0aW9uLnQxIDwtIE5BDQpkZiRvY2N1cGF0aW9uLnQyIDwtICJoaWdoZXIiICNldmVyeWJvZHkgaXMgaW4gc2Nob29sLi4uDQpkZiRzdHVkeS55ZWFyIDwtIE5BDQpkZiRvY2N1cGF0aW9uLnRyYW5zaXRpb24gPC0gTkEgDQoNCmZvciAoaSBpbiB1bmlxdWUoZGYkZWdvKSkgew0KICBkZiRvY2N1cGF0aW9uLnQxW3doaWNoKGRmJGVnbz09aSldIDwtIGlmZWxzZShkYXRhJEUxW2ldPT0iSWsgemF0IG9wIGRlIG1pZGRlbGJhcmUgc2Nob29sIiwgInNlY29uZGFyeSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShkYXRhJEUxW2ldPT0iSWsgZGVlZCBlZW4gTUJPLSwgSEJPLSBvZiBXTy1vcGxlaWRpbmciLCJoaWdoZXIiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGRhdGEkRTFbaV09PSJJayB3ZXJrdGUiLCJ3b3JrIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShkYXRhJEUxW2ldPT0iSWsgaGFkIGVlbiB0dXNzZW5qYWFyIiwiZ2FwIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZGF0YSRFMVtpXT09Ik92ZXJpZ2UiLCJvdGhlciIsTkEpKSkpKQ0KDQogIGRmJHN0dWR5LnllYXJbd2hpY2goZGYkZWdvPT1pKV0gPC0gaWZlbHNlKGRhdGEkVDNbaV09PSJpbiBoZXQgZWVyc3RlIGphYXIiLCAxLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZGF0YSRUM1tpXT09ImluIGhldCB0d2VlZGUgamFhciIsIDIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZGF0YSRUM1tpXT09ImluIGhldCBkZXJkZSBqYWFyIG9mIGhvZ2VyIiwgMywgTkEpKSkNCiAgDQogICN0cmFuc2l0aW9uID0gMSBmb3IgdGhvc2Ugd2hvIGFyZSBmaXJzdCB5ZWFycyBhbmQgd2hvIGNhbWUgZnJvbSBzZWNvbmRhcnkgc2Nob29sL2dhcCB5ZWFyDQogIHRyYW5zaXRpb24gPC0gaWZlbHNlKCBkYXRhJFQzW2ldPT0iaW4gaGV0IGVlcnN0ZSBqYWFyIiAmIChkYXRhJEUxW2ldPT0iSWsgemF0IG9wIGRlIG1pZGRlbGJhcmUgc2Nob29sIiB8IGRhdGEkRTJbaV09PSJJayBoYWQgZWVuIHR1c3NlbmphYXIiKSwgMSwgMCkNCiAgDQogICMgZGlkIGVnbyBkcm9wIG91dC9zdGFydCBhIG5ldyBzdHVkeT8NCiAgdHJhbnNpdGlvbiA8LSBpZmVsc2UoZGF0YTQkRzA3UTkwW2ldPT0gIk5lZSIsIHRyYW5zaXRpb24gKyAxLCB0cmFuc2l0aW9uKQ0KICBkZiRvY2N1cGF0aW9uLnRyYW5zaXRpb25bd2hpY2goZGYkZWdvPT1pKV0gPC0gdHJhbnNpdGlvbg0KfQ0KDQojYWxzbyBtYWtlIGJpbmFyeQ0KZGYkb2NjdXBhdGlvbi50cmFuc2l0aW9uX2JpbiA8LSBpZmVsc2UoZGYkb2NjdXBhdGlvbi50cmFuc2l0aW9uID4gMCwgMSwgMCkNCg0KI3JvbWFudGljIHJlbGF0aW9uc2hpcCANCmRmJHJvbWFudGljIDwtIE5BDQpmb3IgKGkgaW4gdW5pcXVlKGRmJGVnbykpIHsNCiAgZGYkcm9tYW50aWNbd2hpY2goZGYkZWdvPT1pKV0gPC0gaWZlbHNlKGRhdGEkUjNbaV0gPT0gIkphIiwgMSwwKQ0KfQ0KDQojcHN5Y2hvbG9naWNhbC9vdGhlciB2YXJpYWJsZXMgKHdhdmUgMikNCiNsb25lbGluZXNzICANCmwgPC0gY2JpbmQoZCRzdGVsbGluZ2VuLlNRMDAxLiwgZCRzdGVsbGluZ2VuLlNRMDAyLikNCmwgPC0gaWZlbHNlKGw9PSJIZWxlbWFhbCBvbmVlbnMiLCAxLCBpZmVsc2UobD09Ik1lZSBvbmVlbnMiLCAyLA0KICAgICAgICAgICAgICAgICAgICMgZG8gbm90IGtub3cgPSBuZXV0cmFsLi4uIHRoaXMgY2F0ZWdvcnkgd2FzIHNwYXJzZWx5IHBvcHVsYXRlZCANCiAgICAgICAgICAgICAgICAgICBpZmVsc2UobD09Ik5ldXRyYWFsIiB8IGw9PSJJayB3ZWV0IGhldCBuaWV0IiwgMywgDQogICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShsPT0iTWVlIGVlbnMiLCA0LCBpZmVsc2UobD09IkhlbGVtYWFsIGVlbnMiLCA1LCBsKSkpKSkNCiMgdHVybiB0aGUgZmlyc3QgaW5kaWNhdG9yLCBzbyB0aGF0IGhpZ2hlciBzY29yZXMgaW5kaWNhdGUgIm1vcmUiIGxvbmVsaW5lc3MuDQpsWywxXSA8LSA2LWFzLm51bWVyaWMobFssMV0pDQoNCiNleHRyYXZlcnNpb24NCmUgPC0gY2JpbmQoZCRzdGVsbGluZ2VuLlNRMDAzLiwgZCRzdGVsbGluZ2VuLlNRMDA2LikNCmUgPC0gaWZlbHNlKGU9PSJIZWxlbWFhbCBvbmVlbnMiLCAxLA0KICAgICAgICAgICAgaWZlbHNlKGU9PSJNZWUgb25lZW5zIiwgMiwNCiAgICAgICAgICAgICAgICAgICBpZmVsc2UoZT09Ik5ldXRyYWFsIiB8IGU9PSJJayB3ZWV0IGhldCBuaWV0IiwgMywgDQogICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShlPT0iTWVlIGVlbnMiLCA0LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGU9PSJIZWxlbWFhbCBlZW5zIiwgNSwgZSkpKSkpDQojIHR1cm4gdGhlIHNlY29uZCBpbmRpY2F0b3INCmVbLDJdIDwtIDYtYXMubnVtZXJpYyhlWywyXSkNCg0KIyBjYWxjdWxhdGUgYXZlcmFnZXMuDQpkZiRsb25lbGluZXNzIDwtIE5BDQpkZiRleHRyYXZlcnNpb24gPC0gTkENCmZvciAoaSBpbiB1bmlxdWUoZGYkZWdvKSkgew0KICBsX3Njb3JlcyA8LSBhcy5udW1lcmljKGxbaSxdKQ0KICBlX3Njb3JlcyA8LSBhcy5udW1lcmljKGVbaSxdKQ0KICBkZiRsb25lbGluZXNzW3doaWNoKGRmJGVnbz09aSldIDwtIG1lYW4obF9zY29yZXMpDQogIGRmJGV4dHJhdmVyc2lvblt3aGljaChkZiRlZ289PWkpXSA8LSBtZWFuKGVfc2NvcmVzKQ0KfQ0KDQojIGZpbmFuY2lhbCByZXN0cmljdGlvbnMgKGZvciBzb2NpYWwgaW50ZXJhY3Rpb24pDQpkZiRmaW5fcmVzdHIgPC0gTkENCiMgMC4gbmV2ZXI7IDEuIHNvbWV0aW1lczsgMi4gb2Z0ZW47IDMuIGFsd2F5cw0KZm9yIChpIGluIHVuaXF1ZShkZiRlZ28pKSB7DQogIGRmJGZpbl9yZXN0clt3aGljaChkZiRlZ289PWkpXSA8LSBkJEcwMVExMTFbaV0NCn0NCmRmJGZpbl9yZXN0ciA8LSBpZmVsc2UoZGYkZmluX3Jlc3RyPT0iTm9vaXQiLDAsDQogICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShkZiRmaW5fcmVzdHI9PSJTb21zIiwxLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGRmJGZpbl9yZXN0cj09IlZhYWsiLDIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGRmJGZpbl9yZXN0cj09IkFsdGlqZCIsMywgTkEpKSkpDQoNCiMgcGFyZW50YWwgU0VTIC8gZWR1Y2F0aW9uYWwgbGV2ZWw6DQpmb3IgKGkgaW4gdW5pcXVlKGRmJGVnbykpIHsNCiAgZGYkZWR1Y19mYXRoZXJbd2hpY2goZGYkZWdvID09IGkpXSA8LSBkYXRhNCRHMDhRNTYuU1EwMDEuW2ldDQogIGRmJGVkdWNfbW90aGVyW3doaWNoKGRmJGVnbyA9PSBpKV0gPC0gZGF0YTQkRzA4UTU2LlNRMDAyLltpXQ0KfQ0KDQojIGFkZCBuZXR3b3JrIHZhcmlhYmxlcw0KIyAxLiBzaXplIChuby4gb2YgdW5pcXVlIGFsdGVycykNCmRmJG5ldHNpemUgPC0gTkENCiMgYWxzbyBwZXIgZWdvbmV0DQpkZiRjZG4uc2l6ZSA8LSBkZiRzdHVkeS5zaXplIDwtIGRmJGNzbi5zaXplIDwtIGRmJGJmZi5zaXplIDwtIDANCg0KZm9yIChpIGluIHVuaXF1ZShkZiRlZ28pKSB7DQogICNuby4gb2YgdW5pcXVlIGFsdGVycyBpcyBzaW1wbHkgdGhlIG51bWJlciBvZiByb3dzIHBlciBlZ28NCiAgZGYkbmV0c2l6ZVt3aGljaChkZiRlZ289PWkpXSA8LSBucm93KGRmW3doaWNoKGRmJGVnbz09aSksXSkNCiAgDQogICNzaXplIG9mIGVhY2ggZWdvbmV0IGlzIHRoZSBudW1iZXIgb2YgYWx0ZXJzIG5hbWVkIGluIHRoZSBuYW1lIGdlbmVyYXRvcnMNCiAgI3RodXMsIGluY2x1ZGluZyAnZHVwbGljYXRlcycNCiAgZGYkY2RuLnNpemVbd2hpY2goZGYkZWdvPT1pKV0gPC0gbGVuZ3RoKHdoaWNoKCFkZl9uYW1lc1tpLGMoMTo1KV09PSIiKSkNCiAgZGYkc3R1ZHkuc2l6ZVt3aGljaChkZiRlZ289PWkpXSA8LSBsZW5ndGgod2hpY2goIWRmX25hbWVzW2ksYyg2OjEwKV09PSIiKSkNCiAgZGYkYmZmLnNpemVbd2hpY2goZGYkZWdvPT1pKV0gPC0gbGVuZ3RoKHdoaWNoKCFkZl9uYW1lc1tpLGMoMTE6MTUpXT09IiIpKQ0KICBkZiRjc24uc2l6ZVt3aGljaChkZiRlZ289PWkpXSA8LSBsZW5ndGgod2hpY2goIWRmX25hbWVzW2ksYygxNjoyMCldPT0iIikpDQp9DQoNCiMgMi4gZGVuc2l0eS4NCiMgdGhpcyBjYW4gb25seSBiZSBjYWxjdWxhdGVkIHBlciBlZ29uZXQsIGFzIG9ubHkgYmV0d2Vlbi1hbHRlciB0aWVzIHdpdGhpbiBlZ29uZXQgYXJlIGFza2VkLg0KZGYkY2RuLmRlbnNpdHkgPC0gZGYkc3R1ZHkuZGVuc2l0eSA8LSBkZiRjc24uZGVuc2l0eSA8LSBkZiRiZmYuZGVuc2l0eSA8LSBOQQ0KDQpmb3IgKGkgaW4gdW5pcXVlKGRmJGVnbykpIHsNCiAgI2EuIENETg0KICBzaXplIDwtIGRmJGNkbi5zaXplW3doaWNoKGRmJGVnbz09aSldWzFdDQogICNuby4gcG9zc2libGUgdGllcyBiZXR3ZWVuIGFsdGVycw0KICBwb3MgPC0gaWZlbHNlKHNpemU9PTIsIDEsIGlmZWxzZShzaXplPT0zLCAzLCBpZmVsc2Uoc2l6ZT09NCwgNiwgaWZlbHNlKHNpemU9PTUsIDEwLCAwKSkpKQ0KICAjZ2V0IG5vLiBvZiBvYnNlcnZlZCB0aWVzDQogICNvbmx5IGlmIGVnbyBuYW1lZCBhdCBsZWFzdCAyIGFsdGVycyBpbiB0aGlzIG5hbWUgZ2VuZXJhdG9yDQogICNiZWNhdXNlIG9ubHkgdGhlbiBpIGNhbiBjYWxjdWxhdGUgZGVuc2l0eQ0KICBpZihzaXplPjEpIHsNCiAgICAjZ2V0IGFsdGVyLWFsdGVyIGFkamFjZW5jeSBtYXRyaWNlcyBvZiB0aGlzIHBhcnRpY3VsYXIgZWdvbmV0DQogICAgYWRqYWNlbmN5IDwtIGRhdGFbaSxjKDEzOjMyKV0NCiAgIA0KICAgICNpIHdhbnQgdGhlIGNvcnJlY3Qgb25lcywgZ2l2ZW4gdGhlIG5vLiBvZiBsaXN0ZWQgYWx0ZXJzIGluIHRoaXMgbmFtZSBnZW5lcmF0b3INCiAgICAjaSBsaXN0IHRoZSBjb2x1bW5zIG51bWJlcnMgb2YgdGhlIHZhcmlhYmxlcyBjb3JyZXNwb25kaW5nIHRvIGVhY2ggbWF0Y2hpbmcgbWF0cml4IHNldCwNCiAgICAjYW5kIHN1YnNldCBjb3JyZXNwb25kaW5nIGNvbHVtbnMgaW4gYGFkamFjZW5jeWANCiAgICBhZGogPC0gYWRqYWNlbmN5WyxsaXN0KDAsMSxjKDI6NCksYyg1OjEwKSxjKDExOjIwKSlbc2l6ZV1bWzFdXV0NCiAgICAjY291bnQgbnVtYmVyIG9mIHRpZXMgdGhhdCBlZ28gZGVzY3JpYmVkIGFzICh2ZXJ5KSBjbG9zZSAodnMuIG5vdCBjbG9zZSBidXQgbm8gc3RyYW5nZXI7IHN0cmFuZ2VycykNCiAgICBvYnMgPC0gbGVuZ3RoKHdoaWNoKGFkaj09IkhlY2h0InxhZGo9PSJFcmcgaGVjaHQiKSkNCiAgICBkZiRjZG4uZGVuc2l0eVt3aGljaChkZiRlZ289PWkpXSA8LSBvYnMvcG9zICB9DQogIA0KICAjYi4gc3R1ZHkNCiAgc2l6ZSA8LSBkZiRzdHVkeS5zaXplW3doaWNoKGRmJGVnbz09aSldWzFdDQogIHBvcyA8LSBpZmVsc2Uoc2l6ZT09MiwgMSwgaWZlbHNlKHNpemU9PTMsIDMsIGlmZWxzZShzaXplPT00LCA2LCBpZmVsc2Uoc2l6ZT09NSwgMTAsIDApKSkpDQogIGlmKHNpemU+MSkgew0KICAgIGFkamFjZW5jeSA8LSBkYXRhW2ksYyg1Mzo3MildDQogICAgYWRqIDwtIGFkamFjZW5jeVssbGlzdCgwLDEsYygyOjQpLGMoNToxMCksYygxMToyMCkpW3NpemVdW1sxXV1dDQogIA0KICAgICNjb3VudCBudW1iZXIgb2YgdGllcyB0aGF0IGVnbyBkZXNjcmliZWQgYXMgKHZlcnkpIGNsb3NlICh2cy4gbm90IGNsb3NlIGJ1dCBubyBzdHJhbmdlcjsgc3RyYW5nZXJzKQ0KICAgIG9icyA8LSBsZW5ndGgod2hpY2goYWRqPT0iSGVjaHQifGFkaj09IkVyZyBoZWNodCIpKQ0KICAgIGRmJHN0dWR5LmRlbnNpdHlbd2hpY2goZGYkZWdvPT1pKV0gPC0gb2JzL3BvcyB9DQogIA0KICAjYy4gZnJpZW5kcw0KICBzaXplIDwtIGRmJGJmZi5zaXplW3doaWNoKGRmJGVnbz09aSldWzFdDQogIHBvcyA8LSBpZmVsc2Uoc2l6ZT09MiwgMSwgaWZlbHNlKHNpemU9PTMsIDMsIGlmZWxzZShzaXplPT00LCA2LCBpZmVsc2Uoc2l6ZT09NSwgMTAsIDApKSkpDQogIGlmKHNpemU+MSkgew0KICAgIGFkamFjZW5jeSA8LSBkYXRhW2ksYygxNjk6MTg4KV0NCiAgICBhZGogPC0gYWRqYWNlbmN5WyxsaXN0KDAsMSxjKDI6NCksYyg1OjEwKSxjKDExOjIwKSlbc2l6ZV1bWzFdXV0NCiAgICAjY291bnQgbnVtYmVyIG9mIHRpZXMgdGhhdCBlZ28gZGVzY3JpYmVkIGFzICh2ZXJ5KSBjbG9zZSAodnMuIG5vdCBjbG9zZSBidXQgbm8gc3RyYW5nZXI7IHN0cmFuZ2VycykNCiAgICBvYnMgPC0gbGVuZ3RoKHdoaWNoKGFkaj09IkhlY2h0InxhZGo9PSJFcmcgaGVjaHQiKSkNCiAgICBkZiRiZmYuZGVuc2l0eVt3aGljaChkZiRlZ289PWkpXSA8LSBvYnMvcG9zIH0NCg0KICAjZC4gc3BvcnRzIHBhcnRuZXJzDQogIHNpemUgPC0gZGYkY3NuLnNpemVbd2hpY2goZGYkZWdvPT1pKV1bMV0NCiAgcG9zIDwtIGlmZWxzZShzaXplPT0yLCAxLCBpZmVsc2Uoc2l6ZT09MywgMywgaWZlbHNlKHNpemU9PTQsIDYsIGlmZWxzZShzaXplPT01LCAxMCwgMCkpKSkNCiAgaWYoc2l6ZT4xKSB7DQogICAgYWRqYWNlbmN5IDwtIGRhdGFbaSxjKDQ0NDo0NjMpXQ0KDQogICAgYWRqIDwtIGFkamFjZW5jeVssbGlzdCgwLDEsYygyOjQpLGMoNToxMCksYygxMToyMCkpW3NpemVdW1sxXV1dDQogICAgI2NvdW50IG51bWJlciBvZiB0aWVzIHRoYXQgZWdvIGRlc2NyaWJlZCBhcyAodmVyeSkgY2xvc2UgKHZzLiBub3QgY2xvc2UgYnV0IG5vIHN0cmFuZ2VyOyBzdHJhbmdlcnMpDQogICAgb2JzIDwtIGxlbmd0aCh3aGljaChhZGo9PSJIZWNodCJ8YWRqPT0iRXJnIGhlY2h0IikpDQogICAgZGYkY3NuLmRlbnNpdHlbd2hpY2goZGYkZWdvPT1pKV0gPC0gb2JzL3BvcyB9DQp9DQoNCiNzZXQgTkFzIHRvIDAuDQpkZiRjZG4uZGVuc2l0eVtpcy5uYShkZiRjZG4uZGVuc2l0eSldIDwtIDANCmRmJHN0dWR5LmRlbnNpdHlbaXMubmEoZGYkc3R1ZHkuZGVuc2l0eSldIDwtIDANCmRmJGJmZi5kZW5zaXR5W2lzLm5hKGRmJGJmZi5kZW5zaXR5KV0gPC0gMA0KZGYkY3NuLmRlbnNpdHlbaXMubmEoZGYkY3NuLmRlbnNpdHkpXSA8LSAwDQoNCiNiaW5hcnkgYXR0cmlidXRlcyBpbmRpY2F0aW5nIHdoZXRoZXIgYWx0ZXJzIGFwcGVhcmVkIGluIGVhY2ggb2YgdGhlIGVnby1uZXRzIGF0IHcxLg0KZm9yIChpIGluIHVuaXF1ZShkZiRlZ28pKSB7ICANCiAgICBmb3IgKGogaW4gMTpucm93KGRmW3doaWNoKGRmJGVnbz09aSksXSkpIHsgIyBmb3IgYWx0ZXJzIG5lc3RlZCBpbiBlZ28NCg0KICAgICMgZmluZCBvdXQgaWYgYWx0ZXJfaWQgZGVub3RpbmcgYWx0ZXIgaiBhcHBlYXIgaW4gdGhlIDQgZWdvbmV0cw0KICAgIGFsdGVyIDwtIHVubGlzdChkZlt3aGljaChkZiRlZ289PWkgJiBkZiRhbHRlcmlkPT1qKSxdWzU6OF0sIHVzZS5uYW1lcyA9IEZBTFNFKSAjIGdldCBuYW1lKHMpIG9mIGFsdGVyIGoNCiAgICBhbHRlciA8LSBhbHRlclshaXMubmEoYWx0ZXIpXSAjIGV4Y2x1ZGUgTkFzDQogICAgDQogICAgY2RuIDwtIGFsdGVyICVpbiUgbmV0MVtpLF0NCiAgICBzdHVkeSA8LSBhbHRlciAlaW4lIG5ldDJbaSxdDQogICAgYmZmIDwtIGFsdGVyICVpbiUgbmV0M1tpLF0NCiAgICBjc24gPC0gYWx0ZXIgJWluJSBuZXQ0W2ksXQ0KICAgIA0KICAgICMgYW5kIGlmIHNvLCBnaXZlIGFsdGVyIGogc2NvcmUgMSBvbiBpbmRpY2F0b3JzOyAwIG90aGVyd2lzZQ0KICAgIGRmJGNkbjFbd2hpY2goZGYkZWdvPT1pICYgZGYkYWx0ZXJpZD09aildIDwtIGlmZWxzZSgiVFJVRSIgJWluJSBjZG4sIDEsIDApDQogICAgZGYkc3R1ZHkxW3doaWNoKGRmJGVnbz09aSAmIGRmJGFsdGVyaWQ9PWopXSA8LSBpZmVsc2UoIlRSVUUiICVpbiUgc3R1ZHksIDEsIDApDQogICAgZGYkYmZmMVt3aGljaChkZiRlZ289PWkgJiBkZiRhbHRlcmlkPT1qKV0gPC0gaWZlbHNlKCJUUlVFIiAlaW4lIGJmZiwgMSwgMCkNCiAgICBkZiRjc24xW3doaWNoKGRmJGVnbz09aSAmIGRmJGFsdGVyaWQ9PWopXSA8LSBpZmVsc2UoIlRSVUUiICVpbiUgY3NuLCAxLCAwKQ0KICB9DQp9DQoNCiNjYWxjdWxhdGUgbXVsdGlwbGV4aXR5IGFzIGFuIGFsdGVyL3RpZSBhdHRyaWJ1dGUgKGkuZS4sIG51bWJlciBvZiAqYWRkaXRpb25hbCogbmV0d29ya3MgaiBhcHBlYXJlZCBpbikNCmRmJG11bHRpcGxleCA8LSByb3dTdW1zKGRmWyxjKDUxOjU0KV0pIC0gMSAjbWludXMgb25lIHRvIHJlYWNoIGEgbWVhbmluZ2Z1bCBpbnRlcmNlcHQNCiNwc3ljaDo6ZGVzY3JpYmUoZGYkbXVsdGlwbGV4KSAjTT0uNTE7IFNEPS43Ng0KDQojbm93LCBmaW5kIG91dCB3aGV0aGVyIHcxLWFsdGVycyB3ZXJlIG1haW50YWludGVkIGluIHcyLg0KZGYkc3Vydml2ZSA8LSBOQQ0KDQojIEluIHdhdmUgMiwgYW5vdGhlciBtYXRjaGluZyBwcm9jZWR1cmUgd2FzIHVzZWQ7IGluIHJvd3MsIGFsdGVycyBuYW1lZCBpbiB3MiBhcmUgbGlzdGVkOyBjb2x1bW5zIGRlbm90ZSAodW5pcXVlKSBhbHRlcnMgb2YgdzEsIHNvIHRoZSBzYW1lIG9uZSBhcyBvdXIgZGF0YS1mcmFtZS4NCiMgYWdhaW4sIGkgbWFkZSBtdWx0aXBsZSBtYXRyaWNlcywgY29uZGl0aW9uYWwgb24gdGhlIG5vLiBvZiB1bmlxdWUgYWx0ZXJzIG9mIHcxICgxNSwgdG8gYmUgcHJlY2lzZSkNCiMgaWYsIGluIG9uZSBvZiB0aGVzZSBtYXRyaWNlcywgY29sdW1uIGogd2FzIG1hcmtlZCBhcyBjb3JyZXNwb25kaW5nIHRvIGEgbmFtZWQgYWx0ZXIgaW4gdzIsIHRoZW4gYWx0ZXIgaiBkaWQsIGluZGVlZCwgc3Vydml2ZQ0KDQojIHN1YnNldCB3MS13MiBtYXRjaGluZyBtYXRyaWNlczsgYW5kIHJlc3Bucg0KdzF3MiA8LSBkYXRhNFssYyg3NTY6MTE1NSxsZW5ndGgoZGF0YTQpKV0NCg0KZm9yIChpIGluIHVuaXF1ZShkZiRlZ28pKSB7ICAjIGZvciBlZ28gDQogIG1hdGNoaW5nTCA8LSB2ZWN0b3IoImxpc3QiLCAyMCkgI3ByZS1hbGxvY2F0ZSBlbXB0eSBsaXN0IG9mIGxlbmd0aCAyMCwgdG8gc3RvcmUgbWF0Y2hpbmcgbWF0cmljZXMNCg0KICB7DQogICAgbWF0Y2hpbmdMW1sxXV0gPC0gdzF3MltpLDE6MjBdDQogICAgbWF0Y2hpbmdMW1syXV0gPC0gdzF3MltpLDIxOjQwXQ0KICAgIG1hdGNoaW5nTFtbM11dIDwtIHcxdzJbaSw0MTo2MF0NCiAgICBtYXRjaGluZ0xbWzRdXSA8LSB3MXcyW2ksNjE6ODBdDQogICAgbWF0Y2hpbmdMW1s1XV0gPC0gdzF3MltpLDgxOjEwMF0NCiAgICBtYXRjaGluZ0xbWzZdXSA8LSB3MXcyW2ksMTAxOjEyMF0NCiAgICBtYXRjaGluZ0xbWzddXSA8LSB3MXcyW2ksMTIxOjE0MF0NCiAgICBtYXRjaGluZ0xbWzhdXSA8LSB3MXcyW2ksMTQxOjE2MF0NCiAgICBtYXRjaGluZ0xbWzldXSA8LSB3MXcyW2ksMTYxOjE4MF0NCiAgICBtYXRjaGluZ0xbWzEwXV0gPC0gdzF3MltpLDE4MToyMDBdDQogICAgbWF0Y2hpbmdMW1sxMV1dIDwtIHcxdzJbaSwyMDE6MjIwXQ0KICAgIG1hdGNoaW5nTFtbMTJdXSA8LSB3MXcyW2ksMjIxOjI0MF0NCiAgICBtYXRjaGluZ0xbWzEzXV0gPC0gdzF3MltpLDI0MToyNjBdDQogICAgbWF0Y2hpbmdMW1sxNF1dIDwtIHcxdzJbaSwyNjE6MjgwXQ0KICAgIG1hdGNoaW5nTFtbMTVdXSA8LSB3MXcyW2ksMjgxOjMwMF0NCiAgICBtYXRjaGluZ0xbWzE2XV0gPC0gdzF3MltpLDMwMTozMjBdDQogICAgbWF0Y2hpbmdMW1sxN11dIDwtIHcxdzJbaSwzMjE6MzQwXQ0KICAgIG1hdGNoaW5nTFtbMThdXSA8LSB3MXcyW2ksMzQxOjM2MF0NCiAgICBtYXRjaGluZ0xbWzE5XV0gPC0gdzF3MltpLDM2MTozODBdDQogICAgbWF0Y2hpbmdMW1syMF1dIDwtIHcxdzJbaSwzODE6NDAwXQ0KICB9DQogIA0KICAjZmluZCB0aGUgJ3JpZ2h0JyBtYXRjaGluZyBtYXRyaXggaW4gdGhpcyBsaXN0LCBieSB0YWtpbmcgdGhlIG9uZSB0aGF0IGNvbnRhaW5zIGFuc3dlcnMNCiAgaW5kIDwtIE5VTEwNCiAgZm9yIChqIGluIHNlcV9hbG9uZyhtYXRjaGluZ0wpKSB7DQogICAgI2NoZWNrIGFsb25nIHRoZSBzZXF1ZW5jZSBvZiBlbGVtZW50cyBqIGluIHRoZSBtYXRjaGluZyBtYXRyaXggbGlzdCBpZiB0aGV5IGFyZSBub24tZW1wdHkgYW5kIG5vdCBOQQ0KICAgIGNoZWNrIDwtIEZBTFNFDQogICAgZm9yIChjb2wgaW4gbWF0Y2hpbmdMW1tqXV0pIHsNCiAgICAgIGlmICghYWxsKGlzLm5hKGNvbCkpICYmIGFueShuY2hhcihjb2wpID4gMCkpIHsNCiAgICAgICAgY2hlY2sgPC0gVFJVRQ0KICAgICAgICBicmVhayAgDQogICAgICB9DQogICAgICB9DQogICAgaWYgKGNoZWNrKSB7DQogICAgICBpbmQgPC0gag0KICAgICAgYnJlYWsgIA0KICAgIH0NCiAgfQ0KICBpZihsZW5ndGgoaW5kKT4wKSB7DQogICAgIyBnZXQgdGhlICBjb3JyZXNwb25kaW5nIG1hdHJpeA0KICAgIG1tIDwtIG1hdGNoaW5nTFtbaW5kXV0NCiAgICANCiAgICAjIHVubGlzdCB0aGUgYW5zd2VycyBnaXZlbg0KICAgIGFucyA8LSB1bmxpc3QobW0sIHVzZS5uYW1lcyA9IEZBTFNFKQ0KICAgIA0KICAgICMgdXNlICdzdHJpbmdyJyB0byBleHRyYWN0IG51bWJlcnMgaW4gdGhlc2UgYW5zd2VycywNCiAgICAjIHRoZXkgcmVmZXIgdG8gdGhlIGlkIG9mICJzdXJ2aXZlZCIgYWx0ZXJzDQogICAgaWQgPC0gdW5saXN0KHN0cmluZ3I6OnN0cl9leHRyYWN0X2FsbChhbnMsIlxcKD9bMC05LC5dK1xcKT8iKSkNCiAgICBpZCA8LSBpZFshaXMubmEoaWQpXSAjIGV4Y2x1ZGUgTkENCiAgICANCiAgICAjIGlmIGFsdGVyIGlkIG9mIGVnbyBpIGNvcnJlc3BvbmRzIHRvIHRoaXMgaWQsIHRoZXkgZGlkIGluZGVlZCBzdXJ2aXZlOg0KICAgIGRmJHN1cnZpdmVbd2hpY2goZGYkZWdvPT1pKV0gPC0gaWZlbHNlKGRmJGFsdGVyaWRbd2hpY2goZGYkZWdvPT1pKV0gJWluJSBpZCwgMSwgMCkNCiAgfQ0KfQ0KDQojIGluIHdoaWNoIGVnb25ldCBkaWQgdGhleSAocmUpYXBwZWFyPw0KZGYkY2RuMiA8LSBOQQ0KZGYkc3R1ZHkyIDwtIE5BDQpkZiRiZmYyIDwtIE5BDQpkZiRjc24yIDwtIE5BDQoNCiMgaSB1c2UgdGhlIG1hdGNoaW5nIG1hdHJpY2VzIG9mIHcyOyB3aGVyZSBjb2x1bW5zIHJlZmVyIHRvIHVuaXF1ZSB3MSBhbHRlcnMgKHRob3NlIG9mIG91ciBjb25zdHJ1Y3RlZCBkYXRhZnJhbWUpIGFuZCByb3dzIHJlZmVycmluZyB0byB1bmlxdWUgdzIgYWx0ZXJzDQojIHNvLCBpZiB3MS1hbHRlci9jb2x1bW4gaiBpcyBtYXRjaGVkIHRvIHcyLWFsdGVyL3JvdyBpLCB0aGVuIHcxLWFsdGVyIGRpZCBzdXJ2aXZlIChidXQgd2UgYWxyZWFkeSBrbmV3IHRoYXQpOyBidXQgbW9yZSBpbXBvcnRhbnRseSwgaiB3YXMgdGhlIGledGggYWx0ZXIgbWVudGlvbmVkDQojIGFuZCB0aGlzIGFsbG93cyBtZSB0byBpbmZlciBpbiB3aGF0IG5ldHdvcmsgaiAocmUtKWFwcGVhcmVkDQojIHNpbmNlIGNkbiA9IDEtNTsgc3R1ZHkgPSA2LTEwOyBiZmYgPSAxMS0xNTsgY3NuID0gMTYtMjAuDQojIGhvd2V2ZXIsIHNpbmNlIHRoZSByb3dzIG9ubHkgaW5jbHVkZSBub24tZHVwbGljYXRlIHcyLWFsdGVyczsNCiMgaWYgYWx0ZXIgaiBhdCB0MSB3YXMgbmFtZWQgbW9yZSB0aGFuIG9uY2UgYXQgdDIsIGkgb25seSBrbm93IHRoZSBmaXJzdA0KIyBlZ29uZXQgaW4gd2hpY2ggaiB3YXMgbmFtZWQuLi4NCiMgdGh1cywgYmVmb3JlIGkgcHJvY2VlZCwgaSB1c2UgdGhlIG1hdGNoaW5nIG1hdHJpY2VzIHRoYXQgYWxsb3dlZCBlZ28gdG8gbWF0Y2ggYWx0ZXJzIGZyb20gZGlmZmVyZW50IGVnb25ldHMgdG8gbWFrZSBhbHRlciBpZHMgZm9yIHcyIGFsdGVyczsgYW5kIGZpZ3VyZSBvdXQgdG8gd2hpY2ggZWdvbmV0cyB0aGV5IGJlbG9uZ2VkDQoNCiMgaSBtYWtlIGEgZGF0YWZyYW1lIG9mIHcyLWFsdGVycywgd2l0aCBwb3RlbnRpYWwgZHVwbGljYXRlcy4uLg0KZGZfbmFtZXMgPC0gZGF0YS5mcmFtZShwMSA9IGRhdGE0JGVnb25ldDEuU1EwMDEuLHAyID0gZGF0YTQkZWdvbmV0MS5TUTAwMi4scDMgPSBkYXRhNCRlZ29uZXQxLlNRMDAzLixwNCA9IGRhdGE0JGVnb25ldDEuU1EwMDQuLHA1ID0gZGF0YTQkZWdvbmV0MS5TUTAwNS4scDYgPSBkYXRhNCRlZ29uZXQyLlNRMDAxLixwNyA9IGRhdGE0JGVnb25ldDIuU1EwMDIuLHA4ID0gZGF0YTQkZWdvbmV0Mi5TUTAwMy4scDkgPSBkYXRhNCRlZ29uZXQyLlNRMDA0LixwMTA9IGRhdGE0JGVnb25ldDIuU1EwMDUuLHAxMT0gZGF0YTQkZWdvbmV0My5TUTAwMS4scDEyPSBkYXRhNCRlZ29uZXQzLlNRMDAyLixwMTM9IGRhdGE0JGVnb25ldDMuU1EwMDMuLHAxND0gZGF0YTQkZWdvbmV0My5TUTAwNC4scDE1PSBkYXRhNCRlZ29uZXQzLlNRMDA1LixwMTY9IGRhdGE0JGVnb25ldDQuU1EwMDEuLCBwMTc9IGRhdGE0JGVnb25ldDQuU1EwMDIuLCBwMTg9IGRhdGE0JGVnb25ldDQuU1EwMDMuLHAxOT0gZGF0YTQkZWdvbmV0NC5TUTAwNC4scDIwPSBkYXRhNCRlZ29uZXQ0LlNRMDA1LikNCg0KI21hbGVzDQpkZl9nZW5kZXIgPC0gZGF0YS5mcmFtZShwMSA9IGRhdGE0JG1hbGVzLlNRMDAxLixwMiA9IGRhdGE0JG1hbGVzLlNRMDAyLixwMyA9IGRhdGE0JG1hbGVzLlNRMDAzLixwNCA9IGRhdGE0JG1hbGVzLlNRMDA0LixwNSA9IGRhdGE0JG1hbGVzLlNRMDA1LixwNiA9IGRhdGE0JG1hbGVzLlNRMDA2LixwNyA9IGRhdGE0JG1hbGVzLlNRMDA3LixwOCA9IGRhdGE0JG1hbGVzLlNRMDA4LixwOSA9IGRhdGE0JG1hbGVzLlNRMDA5LixwMTA9IGRhdGE0JG1hbGVzLlNRMDEwLixwMTE9IGRhdGE0JG1hbGVzLlNRMDExLixwMTI9IGRhdGE0JG1hbGVzLlNRMDEyLixwMTM9IGRhdGE0JG1hbGVzLlNRMDEzLixwMTQ9IGRhdGE0JG1hbGVzLlNRMDE0LixwMTU9IGRhdGE0JG1hbGVzLlNRMDE1LixwMTY9IGRhdGE0JG1hbGVzLlNRMDE2LixwMTc9IGRhdGE0JG1hbGVzLlNRMDE3LixwMTg9IGRhdGE0JG1hbGVzLlNRMDE4LixwMTk9IGRhdGE0JG1hbGVzLlNRMDE5LixwMjA9IGRhdGE0JG1hbGVzLlNRMDIwLikNCg0KIyBsaXN0IG9mIGRhdGFmcmFtZXMgcGVyIGVnbyB3aXRoIHJvd3MgcmVmbGVjdGluZyBhbHRlcnMNCiMgYW5kIGNvbHVtbnMgaW5kaWNhdGluZyB0aGUgbmFtZShzKSBvZiB0aGUgcGFydGljdWxhciBhbHRlcnMNCmFsdGVyTCA8LSBsaXN0KCkNCiMgbG9vcCBvdmVyIGFsbCBlZ29zDQpmb3IgKCBpIGluIDE6bnJvdyhkZl9uYW1lcykpIHthbHRlckxbW2ldXSA8LSBkYXRhLmZyYW1lKA0KICAgIGFsdGVyaWQgPSAxOjIwLG5hbWUxID0gTkEsbmFtZTIgPSBOQSwgbmFtZTMgPSBOQSxuYW1lNCA9IE5BLCBnZW5kZXI9TkEsDQogICAgY2RuX2VtYmVkLnQyID0gTkEsIHN0dWR5X2VtYmVkLnQyID0gTkEsIGJmZl9lbWJlZC50MiA9IE5BLCBjc25fZW1iZWQudDIgPSBOQSl9DQoNCiMgZmlsbCB0aGUgbmFtZXMgYmFzZWQgb24gdGhlIG5hbWVzIGRhdGEtZnJhbWUNCmZvciAoIGkgaW4gMTpsZW5ndGgoYWx0ZXJMKSkgew0KICBhbHRlckxbW2ldXSRuYW1lMSA8LSB1bmxpc3QoZGZfbmFtZXNbaSwgXSwgdXNlLm5hbWVzPUYpDQogIGFsdGVyTFtbaV1dJG5hbWUxIDwtIGlmZWxzZShhbHRlckxbW2ldXSRuYW1lMT09IiIsIE5BLCBhbHRlckxbW2ldXSRuYW1lMSkNCiAgDQogIGFsdGVyTFtbaV1dJGdlbmRlciA8LSB1bmxpc3QoZGZfZ2VuZGVyW2ksXSwgdXNlLm5hbWVzPUYpDQogIGFsdGVyTFtbaV1dJGdlbmRlciA8LSBpZmVsc2UoYWx0ZXJMW1tpXV0kZ2VuZGVyPT0iSmEiLCAwLCAjbWFsZSA9IHJlZg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShhbHRlckxbW2ldXSRnZW5kZXI9PSJOZWUiLCAxLCBOQSkpDQogIA0KICB9DQoNCiMgY2FsY3VsYXRlIG5ldHNpemUgZm9yIGVhY2ggbmV0IHRvIGdldCB0aGUgY29ycmVjdCBtYXRjaGluZyBtYXRyaXgNCnsNCiAgbmV0MSA8LSBjYmluZChkYXRhNCRlZ29uZXQxLlNRMDAxLixkYXRhNCRlZ29uZXQxLlNRMDAyLiwgZGF0YTQkZWdvbmV0MS5TUTAwMy4sZGF0YTQkZWdvbmV0MS5TUTAwNC4sIGRhdGE0JGVnb25ldDEuU1EwMDUuKQ0KICBuZXQxIDwtIGlmZWxzZShuZXQxPT0iIiwgTkEsIG5ldDEpDQogIG5zMSA8LSB2ZWN0b3IoKQ0KICBmb3IgKGkgaW4gMTpucm93KG5ldDEpKSB7DQogICAgbnMxW2ldIDwtIGxlbmd0aChuZXQxW2ksXVt3aGljaCghaXMubmEobmV0MVtpLF0pKV0pDQogIH0NCiAgbmV0MiA8LSBjYmluZChkYXRhNCRlZ29uZXQyLlNRMDAxLixkYXRhNCRlZ29uZXQyLlNRMDAyLiwgZGF0YTQkZWdvbmV0Mi5TUTAwMy4sZGF0YTQkZWdvbmV0Mi5TUTAwNC4sIGRhdGE0JGVnb25ldDIuU1EwMDUuKQ0KICBuZXQyIDwtIGlmZWxzZShuZXQyPT0iIiwgTkEsIG5ldDIpDQogIG5zMiA8LSB2ZWN0b3IoKQ0KICBmb3IgKGkgaW4gMTpucm93KG5ldDIpKSB7DQogICAgbnMyW2ldIDwtIGxlbmd0aChuZXQyW2ksXVt3aGljaCghaXMubmEobmV0MltpLF0pKV0pDQogIH0NCiAgbmV0MyA8LSBjYmluZChkYXRhNCRlZ29uZXQzLlNRMDAxLixkYXRhNCRlZ29uZXQzLlNRMDAyLiwgZGF0YTQkZWdvbmV0My5TUTAwMy4sZGF0YTQkZWdvbmV0My5TUTAwNC4sIGRhdGE0JGVnb25ldDMuU1EwMDUuKQ0KICBuZXQzIDwtIGlmZWxzZShuZXQzPT0iIiwgTkEsIG5ldDMpDQogIG5zMyA8LSB2ZWN0b3IoKQ0KICBmb3IgKGkgaW4gMTpucm93KG5ldDMpKSB7DQogICAgbnMzW2ldIDwtIGxlbmd0aChuZXQzW2ksXVt3aGljaCghaXMubmEobmV0M1tpLF0pKV0pDQogIH0NCiAgbmV0NCA8LSBjYmluZChkYXRhNCRlZ29uZXQ0LlNRMDAxLixkYXRhNCRlZ29uZXQ0LlNRMDAyLiwgZGF0YTQkZWdvbmV0NC5TUTAwMy4sZGF0YTQkZWdvbmV0NC5TUTAwNC4sIGRhdGE0JGVnb25ldDQuU1EwMDUuKQ0KICBuZXQ0IDwtIGlmZWxzZShuZXQ0PT0iIiwgTkEsIG5ldDQpDQogIG5zNCA8LSB2ZWN0b3IoKQ0KICBmb3IgKGkgaW4gMTpucm93KG5ldDQpKSB7DQogICAgbnM0W2ldIDwtIGxlbmd0aChuZXQ0W2ksXVt3aGljaCghaXMubmEobmV0NFtpLF0pKV0pDQogIH0NCn0NCg0KIyBjb25zdHJ1Y3QgdGhlIG1hdGNoaW5nIG1hdHJpY2VzIGxpc3QgZm9yIGVnb25ldDEtMg0KbWF0Y2hpbmdMaXN0IDwtIGxpc3QoKQ0KZm9yIChpIGluIDE6bGVuZ3RoKGFsdGVyTCkpIHsNCiAgbWF0Y2hpbmdMIDwtIGxpc3QoKQ0KICBtYXRjaGluZ0xbWzFdXSA8LSBjYmluZChkYXRhNCRtYXRjaGluZzFOMS5TUTAwMV9TUTAwMS5baV0sZGF0YTQkbWF0Y2hpbmcxTjEuU1EwMDJfU1EwMDEuW2ldLGRhdGE0JG1hdGNoaW5nMU4xLlNRMDAzX1NRMDAxLltpXSxkYXRhNCRtYXRjaGluZzFOMS5TUTAwNF9TUTAwMS5baV0sZGF0YTQkbWF0Y2hpbmcxTjEuU1EwMDVfU1EwMDEuW2ldKQ0KICBtYXRjaGluZ0xbWzJdXTwtIHJiaW5kKA0KICAgIGNiaW5kKGRhdGE0JG1hdGNoaW5nMU4yLlNRMDAxX1NRMDAxLltpXSwgZGF0YTQkbWF0Y2hpbmcxTjIuU1EwMDJfU1EwMDEuW2ldLCBkYXRhNCRtYXRjaGluZzFOMi5TUTAwM19TUTAwMS5baV0sIGRhdGE0JG1hdGNoaW5nMU4yLlNRMDA0X1NRMDAxLltpXSwgZGF0YTQkbWF0Y2hpbmcxTjIuU1EwMDVfU1EwMDEuW2ldKSwNCiAgICBjYmluZChkYXRhNCRtYXRjaGluZzFOMi5TUTAwMV9TUTAwMi5baV0sIGRhdGE0JG1hdGNoaW5nMU4yLlNRMDAyX1NRMDAyLltpXSwgZGF0YTQkbWF0Y2hpbmcxTjIuU1EwMDNfU1EwMDIuW2ldLCBkYXRhNCRtYXRjaGluZzFOMi5TUTAwNF9TUTAwMi5baV0sIGRhdGE0JG1hdGNoaW5nMU4yLlNRMDA1X1NRMDAyLltpXSkpDQogIG1hdGNoaW5nTFtbM11dPC0gcmJpbmQoDQogICAgY2JpbmQoZGF0YTQkbWF0Y2hpbmcxTjMuU1EwMDFfU1EwMDEuW2ldLCBkYXRhNCRtYXRjaGluZzFOMy5TUTAwMl9TUTAwMS5baV0sIGRhdGE0JG1hdGNoaW5nMU4zLlNRMDAzX1NRMDAxLltpXSwgZGF0YTQkbWF0Y2hpbmcxTjMuU1EwMDRfU1EwMDEuW2ldLCBkYXRhNCRtYXRjaGluZzFOMy5TUTAwNV9TUTAwMS5baV0pLA0KICAgIGNiaW5kKGRhdGE0JG1hdGNoaW5nMU4zLlNRMDAxX1NRMDAyLltpXSwgZGF0YTQkbWF0Y2hpbmcxTjMuU1EwMDJfU1EwMDIuW2ldLCBkYXRhNCRtYXRjaGluZzFOMy5TUTAwM19TUTAwMi5baV0sIGRhdGE0JG1hdGNoaW5nMU4zLlNRMDA0X1NRMDAyLltpXSwgZGF0YTQkbWF0Y2hpbmcxTjMuU1EwMDVfU1EwMDIuW2ldKSwNCiAgICBjYmluZChkYXRhNCRtYXRjaGluZzFOMy5TUTAwMV9TUTAwMy5baV0sIGRhdGE0JG1hdGNoaW5nMU4zLlNRMDAyX1NRMDAzLltpXSwgZGF0YTQkbWF0Y2hpbmcxTjMuU1EwMDNfU1EwMDMuW2ldLCBkYXRhNCRtYXRjaGluZzFOMy5TUTAwNF9TUTAwMy5baV0sIGRhdGE0JG1hdGNoaW5nMU4zLlNRMDA1X1NRMDAzLltpXSkpDQogIG1hdGNoaW5nTFtbNF1dPC0gcmJpbmQoDQogICAgY2JpbmQoZGF0YTQkbWF0Y2hpbmcxTjQuU1EwMDFfU1EwMDEuW2ldLCBkYXRhNCRtYXRjaGluZzFONC5TUTAwMl9TUTAwMS5baV0sIGRhdGE0JG1hdGNoaW5nMU40LlNRMDAzX1NRMDAxLltpXSwgZGF0YTQkbWF0Y2hpbmcxTjQuU1EwMDRfU1EwMDEuW2ldLCBkYXRhNCRtYXRjaGluZzFONC5TUTAwNV9TUTAwMS5baV0pLA0KICAgIGNiaW5kKGRhdGE0JG1hdGNoaW5nMU40LlNRMDAxX1NRMDAyLltpXSwgZGF0YTQkbWF0Y2hpbmcxTjQuU1EwMDJfU1EwMDIuW2ldLCBkYXRhNCRtYXRjaGluZzFONC5TUTAwM19TUTAwMi5baV0sIGRhdGE0JG1hdGNoaW5nMU40LlNRMDA0X1NRMDAyLltpXSwgZGF0YTQkbWF0Y2hpbmcxTjQuU1EwMDVfU1EwMDIuW2ldKSwNCiAgICBjYmluZChkYXRhNCRtYXRjaGluZzFONC5TUTAwMV9TUTAwMy5baV0sIGRhdGE0JG1hdGNoaW5nMU40LlNRMDAyX1NRMDAzLltpXSwgZGF0YTQkbWF0Y2hpbmcxTjQuU1EwMDNfU1EwMDMuW2ldLCBkYXRhNCRtYXRjaGluZzFONC5TUTAwNF9TUTAwMy5baV0sIGRhdGE0JG1hdGNoaW5nMU40LlNRMDA1X1NRMDAzLltpXSksDQogICAgY2JpbmQoZGF0YTQkbWF0Y2hpbmcxTjQuU1EwMDFfU1EwMDQuW2ldLCBkYXRhNCRtYXRjaGluZzFONC5TUTAwMl9TUTAwNC5baV0sIGRhdGE0JG1hdGNoaW5nMU40LlNRMDAzX1NRMDA0LltpXSwgZGF0YTQkbWF0Y2hpbmcxTjQuU1EwMDRfU1EwMDQuW2ldLCBkYXRhNCRtYXRjaGluZzFONC5TUTAwNV9TUTAwNC5baV0pKQ0KICBtYXRjaGluZ0xbWzVdXTwtIHJiaW5kKA0KICAgIGNiaW5kKGRhdGE0JG1hdGNoaW5nMU41LlNRMDAxX1NRMDAxLltpXSwgZGF0YTQkbWF0Y2hpbmcxTjUuU1EwMDJfU1EwMDEuW2ldLCBkYXRhNCRtYXRjaGluZzFONS5TUTAwM19TUTAwMS5baV0sIGRhdGE0JG1hdGNoaW5nMU41LlNRMDA0X1NRMDAxLltpXSwgZGF0YTQkbWF0Y2hpbmcxTjUuU1EwMDVfU1EwMDEuW2ldKSwNCiAgICBjYmluZChkYXRhNCRtYXRjaGluZzFONS5TUTAwMV9TUTAwMi5baV0sIGRhdGE0JG1hdGNoaW5nMU41LlNRMDAyX1NRMDAyLltpXSwgZGF0YTQkbWF0Y2hpbmcxTjUuU1EwMDNfU1EwMDIuW2ldLCBkYXRhNCRtYXRjaGluZzFONS5TUTAwNF9TUTAwMi5baV0sIGRhdGE0JG1hdGNoaW5nMU41LlNRMDA1X1NRMDAyLltpXSksDQogICAgY2JpbmQoZGF0YTQkbWF0Y2hpbmcxTjUuU1EwMDFfU1EwMDMuW2ldLCBkYXRhNCRtYXRjaGluZzFONS5TUTAwMl9TUTAwMy5baV0sIGRhdGE0JG1hdGNoaW5nMU41LlNRMDAzX1NRMDAzLltpXSwgZGF0YTQkbWF0Y2hpbmcxTjUuU1EwMDRfU1EwMDMuW2ldLCBkYXRhNCRtYXRjaGluZzFONS5TUTAwNV9TUTAwMy5baV0pLA0KICAgIGNiaW5kKGRhdGE0JG1hdGNoaW5nMU41LlNRMDAxX1NRMDA0LltpXSwgZGF0YTQkbWF0Y2hpbmcxTjUuU1EwMDJfU1EwMDQuW2ldLCBkYXRhNCRtYXRjaGluZzFONS5TUTAwM19TUTAwNC5baV0sIGRhdGE0JG1hdGNoaW5nMU41LlNRMDA0X1NRMDA0LltpXSwgZGF0YTQkbWF0Y2hpbmcxTjUuU1EwMDVfU1EwMDQuW2ldKSwNCiAgICBjYmluZChkYXRhNCRtYXRjaGluZzFONS5TUTAwMV9TUTAwNS5baV0sIGRhdGE0JG1hdGNoaW5nMU41LlNRMDAyX1NRMDA1LltpXSwgZGF0YTQkbWF0Y2hpbmcxTjUuU1EwMDNfU1EwMDUuW2ldLCBkYXRhNCRtYXRjaGluZzFONS5TUTAwNF9TUTAwNS5baV0sIGRhdGE0JG1hdGNoaW5nMU41LlNRMDA1X1NRMDA1LltpXSkpDQogIG1hdGNoaW5nTGlzdFtbaV1dIDwtIG1hdGNoaW5nTA0KfSAjIHNvLi4uIG1hdGNoaW5nTFtbMV1dW1s1XV0gaXMgbWF0Y2hpbmdtYXRyaXggNSAoaS5lLiwgNSBhbHRlcnMgbmFtZWQgaW4gZWdvbmV0MikgZm9yIGVnbyAxDQoNCiMgdGhlIGNvbWJpbmF0aW9uIG9mIHRoZSBtYXRjaGluZyBtYXRyaWNlcyBhbmQgdGhlIG5ldHNpemVzIGZvciBlZ28gYWxsb3dzIG1lIHRvIG1hdGNoIHRoZSBuYW1lcyBteXNlbGYuDQpmb3IgKGkgaW4gMTpsZW5ndGgobWF0Y2hpbmdMaXN0KSkgeyAgICAgIyBmb3IgZWdvIGkNCiAgbUwgPC0gbWF0Y2hpbmdMaXN0W1tpXV0gICAgICAgICAgICAgICAjIGdldCB0aGUgbWF0Y2hpbmcgbGlzdA0KICBucyA8LSBuczJbW2ldXSAgICAgICAgICAgICAgICAgICAgICAgICMgZ2V0IHRoZSBzaXplIG9mIGVnb25ldDINCiAgaWYobnM+MCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGlmIG5zPTAsIG5vIG1hdGNoaW5nIHdhcyBkb25lIQ0KICAgIG1tIDwtIGFzLm1hdHJpeChtTFtbbnNdXSkgICAgICAgICAgICMgcmV0cmlldmUgdGhlIGNvcnJlc3BvbmRpbmcgbWF0cml4DQogICAgbWF0Y2hlZCA8LSB3aGljaChtbT09MSwgYXJyLmluZD1UKSAgIyByZXRyaWV2ZSBhcnJheSBpbmRpY2VzDQogICAgbmV0IDwtIG5ldDJbaSxdDQogICAgaWYobGVuZ3RoKG1hdGNoZWQpPjApIHsgICAgICAgICAgICAgIyBpZiBtYXRjaGluZyB3YXMgcGVyZm9ybWVkIQ0KICAgICAgYWx0ZXJMW1tpXV0kbmFtZTJbd2hpY2goYWx0ZXJMW1tpXV0kYWx0ZXJpZD09bWF0Y2hlZFssMl0pXSA8LSBuZXRbbWF0Y2hlZFssMV1dDQogICAgfQ0KICB9DQp9I2lnbm9yZSB3YXJuaW5nDQoNCiMgYWdhaW4sIG1ha2UgYSBtYXRjaGluZyBsaXN0IGZvciB0aGUgc2Vjb25kIG1hdGNoaW5nIG1hdHJpY2VzDQojIChpLmUuLCBtYXRjaGluZyBlZ29uZXQzIGFsdGVycyB0byBwcmV2LiBhbHRlcnMpOw0KbWF0Y2hpbmdMaXN0MiA8LSBsaXN0KCkNCmZvciAoaSBpbiAxOmxlbmd0aChhbHRlckwpKSB7ICMgZm9yIGVnbyBpDQogIG1hdGNoaW5nMkwgPC0gbGlzdCgpDQogIG1hdGNoaW5nMkxbWzFdXSA8LSBjYmluZChkYXRhNCRtYXRjaGluZzJOMS5TUTAwMV9TUTAwMS5baV0sZGF0YTQkbWF0Y2hpbmcyTjEuU1EwMDJfU1EwMDEuW2ldLGRhdGE0JG1hdGNoaW5nMk4xLlNRMDAzX1NRMDAxLltpXSxkYXRhNCRtYXRjaGluZzJOMS5TUTAwNF9TUTAwMS5baV0sZGF0YTQkbWF0Y2hpbmcyTjEuU1EwMDVfU1EwMDEuW2ldLGRhdGE0JG1hdGNoaW5nMk4xLlNRMDA2X1NRMDAxLltpXSxkYXRhNCRtYXRjaGluZzJOMS5TUTAwN19TUTAwMS5baV0sZGF0YTQkbWF0Y2hpbmcyTjEuU1EwMDhfU1EwMDEuW2ldLGRhdGE0JG1hdGNoaW5nMk4xLlNRMDA5X1NRMDAxLltpXSxkYXRhNCRtYXRjaGluZzJOMS5TUTAxMF9TUTAwMS5baV0pDQogIG1hdGNoaW5nMkxbWzJdXSA8LSByYmluZCgNCiAgICBjYmluZChkYXRhNCRtYXRjaGluZzJOMi5TUTAwMV9TUTAwMS5baV0sZGF0YTQkbWF0Y2hpbmcyTjIuU1EwMDJfU1EwMDEuW2ldLGRhdGE0JG1hdGNoaW5nMk4yLlNRMDAzX1NRMDAxLltpXSxkYXRhNCRtYXRjaGluZzJOMi5TUTAwNF9TUTAwMS5baV0sZGF0YTQkbWF0Y2hpbmcyTjIuU1EwMDVfU1EwMDEuW2ldLGRhdGE0JG1hdGNoaW5nMk4yLlNRMDA2X1NRMDAxLltpXSxkYXRhNCRtYXRjaGluZzJOMi5TUTAwN19TUTAwMS5baV0sZGF0YTQkbWF0Y2hpbmcyTjIuU1EwMDhfU1EwMDEuW2ldLGRhdGE0JG1hdGNoaW5nMk4yLlNRMDA5X1NRMDAxLltpXSxkYXRhNCRtYXRjaGluZzJOMi5TUTAxMF9TUTAwMS5baV0pLA0KICAgIGNiaW5kKGRhdGE0JG1hdGNoaW5nMk4yLlNRMDAxX1NRMDAyLltpXSxkYXRhNCRtYXRjaGluZzJOMi5TUTAwMl9TUTAwMi5baV0sZGF0YTQkbWF0Y2hpbmcyTjIuU1EwMDNfU1EwMDIuW2ldLGRhdGE0JG1hdGNoaW5nMk4yLlNRMDA0X1NRMDAyLltpXSxkYXRhNCRtYXRjaGluZzJOMi5TUTAwNV9TUTAwMi5baV0sZGF0YTQkbWF0Y2hpbmcyTjIuU1EwMDZfU1EwMDIuW2ldLGRhdGE0JG1hdGNoaW5nMk4yLlNRMDA3X1NRMDAyLltpXSxkYXRhNCRtYXRjaGluZzJOMi5TUTAwOF9TUTAwMi5baV0sZGF0YTQkbWF0Y2hpbmcyTjIuU1EwMDlfU1EwMDIuW2ldLGRhdGE0JG1hdGNoaW5nMk4yLlNRMDEwX1NRMDAyLltpXSkpDQogIG1hdGNoaW5nMkxbWzNdXSA8LSByYmluZCgNCiAgICBjYmluZChkYXRhNCRtYXRjaGluZzJOMy5TUTAwMV9TUTAwMS5baV0sZGF0YTQkbWF0Y2hpbmcyTjMuU1EwMDJfU1EwMDEuW2ldLGRhdGE0JG1hdGNoaW5nMk4zLlNRMDAzX1NRMDAxLltpXSxkYXRhNCRtYXRjaGluZzJOMy5TUTAwNF9TUTAwMS5baV0sZGF0YTQkbWF0Y2hpbmcyTjMuU1EwMDVfU1EwMDEuW2ldLGRhdGE0JG1hdGNoaW5nMk4zLlNRMDA2X1NRMDAxLltpXSxkYXRhNCRtYXRjaGluZzJOMy5TUTAwN19TUTAwMS5baV0sZGF0YTQkbWF0Y2hpbmcyTjMuU1EwMDhfU1EwMDEuW2ldLGRhdGE0JG1hdGNoaW5nMk4zLlNRMDA5X1NRMDAxLltpXSxkYXRhNCRtYXRjaGluZzJOMy5TUTAxMF9TUTAwMS5baV0pLA0KICAgIGNiaW5kKGRhdGE0JG1hdGNoaW5nMk4zLlNRMDAxX1NRMDAyLltpXSxkYXRhNCRtYXRjaGluZzJOMy5TUTAwMl9TUTAwMi5baV0sZGF0YTQkbWF0Y2hpbmcyTjMuU1EwMDNfU1EwMDIuW2ldLGRhdGE0JG1hdGNoaW5nMk4zLlNRMDA0X1NRMDAyLltpXSxkYXRhNCRtYXRjaGluZzJOMy5TUTAwNV9TUTAwMi5baV0sZGF0YTQkbWF0Y2hpbmcyTjMuU1EwMDZfU1EwMDIuW2ldLGRhdGE0JG1hdGNoaW5nMk4zLlNRMDA3X1NRMDAyLltpXSxkYXRhNCRtYXRjaGluZzJOMy5TUTAwOF9TUTAwMi5baV0sZGF0YTQkbWF0Y2hpbmcyTjMuU1EwMDlfU1EwMDIuW2ldLGRhdGE0JG1hdGNoaW5nMk4zLlNRMDEwX1NRMDAyLltpXSksDQogICAgY2JpbmQoZGF0YTQkbWF0Y2hpbmcyTjMuU1EwMDFfU1EwMDMuW2ldLGRhdGE0JG1hdGNoaW5nMk4zLlNRMDAyX1NRMDAzLltpXSxkYXRhNCRtYXRjaGluZzJOMy5TUTAwM19TUTAwMy5baV0sZGF0YTQkbWF0Y2hpbmcyTjMuU1EwMDRfU1EwMDMuW2ldLGRhdGE0JG1hdGNoaW5nMk4zLlNRMDA1X1NRMDAzLltpXSxkYXRhNCRtYXRjaGluZzJOMy5TUTAwNl9TUTAwMy5baV0sZGF0YTQkbWF0Y2hpbmcyTjMuU1EwMDdfU1EwMDMuW2ldLGRhdGE0JG1hdGNoaW5nMk4zLlNRMDA4X1NRMDAzLltpXSxkYXRhNCRtYXRjaGluZzJOMy5TUTAwOV9TUTAwMy5baV0sZGF0YTQkbWF0Y2hpbmcyTjMuU1EwMTBfU1EwMDMuW2ldKSkNCiAgbWF0Y2hpbmcyTFtbNF1dIDwtIHJiaW5kKA0KICAgIGNiaW5kKGRhdGE0JG1hdGNoaW5nMk40LlNRMDAxX1NRMDAxLltpXSxkYXRhNCRtYXRjaGluZzJONC5TUTAwMl9TUTAwMS5baV0sZGF0YTQkbWF0Y2hpbmcyTjQuU1EwMDNfU1EwMDEuW2ldLGRhdGE0JG1hdGNoaW5nMk40LlNRMDA0X1NRMDAxLltpXSxkYXRhNCRtYXRjaGluZzJONC5TUTAwNV9TUTAwMS5baV0sZGF0YTQkbWF0Y2hpbmcyTjQuU1EwMDZfU1EwMDEuW2ldLGRhdGE0JG1hdGNoaW5nMk40LlNRMDA3X1NRMDAxLltpXSxkYXRhNCRtYXRjaGluZzJONC5TUTAwOF9TUTAwMS5baV0sZGF0YTQkbWF0Y2hpbmcyTjQuU1EwMDlfU1EwMDEuW2ldLGRhdGE0JG1hdGNoaW5nMk40LlNRMDEwX1NRMDAxLltpXSksDQogICAgY2JpbmQoZGF0YTQkbWF0Y2hpbmcyTjQuU1EwMDFfU1EwMDIuW2ldLGRhdGE0JG1hdGNoaW5nMk40LlNRMDAyX1NRMDAyLltpXSxkYXRhNCRtYXRjaGluZzJONC5TUTAwM19TUTAwMi5baV0sZGF0YTQkbWF0Y2hpbmcyTjQuU1EwMDRfU1EwMDIuW2ldLGRhdGE0JG1hdGNoaW5nMk40LlNRMDA1X1NRMDAyLltpXSxkYXRhNCRtYXRjaGluZzJONC5TUTAwNl9TUTAwMi5baV0sZGF0YTQkbWF0Y2hpbmcyTjQuU1EwMDdfU1EwMDIuW2ldLGRhdGE0JG1hdGNoaW5nMk40LlNRMDA4X1NRMDAyLltpXSxkYXRhNCRtYXRjaGluZzJONC5TUTAwOV9TUTAwMi5baV0sZGF0YTQkbWF0Y2hpbmcyTjQuU1EwMTBfU1EwMDIuW2ldKSwNCiAgICBjYmluZChkYXRhNCRtYXRjaGluZzJONC5TUTAwMV9TUTAwMy5baV0sZGF0YTQkbWF0Y2hpbmcyTjQuU1EwMDJfU1EwMDMuW2ldLGRhdGE0JG1hdGNoaW5nMk40LlNRMDAzX1NRMDAzLltpXSxkYXRhNCRtYXRjaGluZzJONC5TUTAwNF9TUTAwMy5baV0sZGF0YTQkbWF0Y2hpbmcyTjQuU1EwMDVfU1EwMDMuW2ldLGRhdGE0JG1hdGNoaW5nMk40LlNRMDA2X1NRMDAzLltpXSxkYXRhNCRtYXRjaGluZzJONC5TUTAwN19TUTAwMy5baV0sZGF0YTQkbWF0Y2hpbmcyTjQuU1EwMDhfU1EwMDMuW2ldLGRhdGE0JG1hdGNoaW5nMk40LlNRMDA5X1NRMDAzLltpXSxkYXRhNCRtYXRjaGluZzJONC5TUTAxMF9TUTAwMy5baV0pLA0KICAgIGNiaW5kKGRhdGE0JG1hdGNoaW5nMk40LlNRMDAxX1NRMDA0LltpXSxkYXRhNCRtYXRjaGluZzJONC5TUTAwMl9TUTAwNC5baV0sZGF0YTQkbWF0Y2hpbmcyTjQuU1EwMDNfU1EwMDQuW2ldLGRhdGE0JG1hdGNoaW5nMk40LlNRMDA0X1NRMDA0LltpXSxkYXRhNCRtYXRjaGluZzJONC5TUTAwNV9TUTAwNC5baV0sZGF0YTQkbWF0Y2hpbmcyTjQuU1EwMDZfU1EwMDQuW2ldLGRhdGE0JG1hdGNoaW5nMk40LlNRMDA3X1NRMDA0LltpXSxkYXRhNCRtYXRjaGluZzJONC5TUTAwOF9TUTAwNC5baV0sZGF0YTQkbWF0Y2hpbmcyTjQuU1EwMDlfU1EwMDQuW2ldLGRhdGE0JG1hdGNoaW5nMk40LlNRMDEwX1NRMDA0LltpXSkpDQogIG1hdGNoaW5nMkxbWzVdXSA8LSByYmluZCgNCiAgICBjYmluZChkYXRhNCRtYXRjaGluZzJONS5TUTAwMV9TUTAwMS5baV0sZGF0YTQkbWF0Y2hpbmcyTjUuU1EwMDJfU1EwMDEuW2ldLGRhdGE0JG1hdGNoaW5nMk41LlNRMDAzX1NRMDAxLltpXSxkYXRhNCRtYXRjaGluZzJONS5TUTAwNF9TUTAwMS5baV0sZGF0YTQkbWF0Y2hpbmcyTjUuU1EwMDVfU1EwMDEuW2ldLGRhdGE0JG1hdGNoaW5nMk41LlNRMDA2X1NRMDAxLltpXSxkYXRhNCRtYXRjaGluZzJONS5TUTAwN19TUTAwMS5baV0sZGF0YTQkbWF0Y2hpbmcyTjUuU1EwMDhfU1EwMDEuW2ldLGRhdGE0JG1hdGNoaW5nMk41LlNRMDA5X1NRMDAxLltpXSxkYXRhNCRtYXRjaGluZzJONS5TUTAxMF9TUTAwMS5baV0pLA0KICAgIGNiaW5kKGRhdGE0JG1hdGNoaW5nMk41LlNRMDAxX1NRMDAyLltpXSxkYXRhNCRtYXRjaGluZzJONS5TUTAwMl9TUTAwMi5baV0sZGF0YTQkbWF0Y2hpbmcyTjUuU1EwMDNfU1EwMDIuW2ldLGRhdGE0JG1hdGNoaW5nMk41LlNRMDA0X1NRMDAyLltpXSxkYXRhNCRtYXRjaGluZzJONS5TUTAwNV9TUTAwMi5baV0sZGF0YTQkbWF0Y2hpbmcyTjUuU1EwMDZfU1EwMDIuW2ldLGRhdGE0JG1hdGNoaW5nMk41LlNRMDA3X1NRMDAyLltpXSxkYXRhNCRtYXRjaGluZzJONS5TUTAwOF9TUTAwMi5baV0sZGF0YTQkbWF0Y2hpbmcyTjUuU1EwMDlfU1EwMDIuW2ldLGRhdGE0JG1hdGNoaW5nMk41LlNRMDEwX1NRMDAyLltpXSksDQogICAgY2JpbmQoZGF0YTQkbWF0Y2hpbmcyTjUuU1EwMDFfU1EwMDMuW2ldLGRhdGE0JG1hdGNoaW5nMk41LlNRMDAyX1NRMDAzLltpXSxkYXRhNCRtYXRjaGluZzJONS5TUTAwM19TUTAwMy5baV0sZGF0YTQkbWF0Y2hpbmcyTjUuU1EwMDRfU1EwMDMuW2ldLGRhdGE0JG1hdGNoaW5nMk41LlNRMDA1X1NRMDAzLltpXSxkYXRhNCRtYXRjaGluZzJONS5TUTAwNl9TUTAwMy5baV0sZGF0YTQkbWF0Y2hpbmcyTjUuU1EwMDdfU1EwMDMuW2ldLGRhdGE0JG1hdGNoaW5nMk41LlNRMDA4X1NRMDAzLltpXSxkYXRhNCRtYXRjaGluZzJONS5TUTAwOV9TUTAwMy5baV0sZGF0YTQkbWF0Y2hpbmcyTjUuU1EwMTBfU1EwMDMuW2ldKSwNCiAgICBjYmluZChkYXRhNCRtYXRjaGluZzJONS5TUTAwMV9TUTAwNC5baV0sZGF0YTQkbWF0Y2hpbmcyTjUuU1EwMDJfU1EwMDQuW2ldLGRhdGE0JG1hdGNoaW5nMk41LlNRMDAzX1NRMDA0LltpXSxkYXRhNCRtYXRjaGluZzJONS5TUTAwNF9TUTAwNC5baV0sZGF0YTQkbWF0Y2hpbmcyTjUuU1EwMDVfU1EwMDQuW2ldLGRhdGE0JG1hdGNoaW5nMk41LlNRMDA2X1NRMDA0LltpXSxkYXRhNCRtYXRjaGluZzJONS5TUTAwN19TUTAwNC5baV0sZGF0YTQkbWF0Y2hpbmcyTjUuU1EwMDhfU1EwMDQuW2ldLGRhdGE0JG1hdGNoaW5nMk41LlNRMDA5X1NRMDA0LltpXSxkYXRhNCRtYXRjaGluZzJONS5TUTAxMF9TUTAwNC5baV0pLA0KICAgIGNiaW5kKGRhdGE0JG1hdGNoaW5nMk41LlNRMDAxX1NRMDA1LltpXSxkYXRhNCRtYXRjaGluZzJONS5TUTAwMl9TUTAwNS5baV0sZGF0YTQkbWF0Y2hpbmcyTjUuU1EwMDNfU1EwMDUuW2ldLGRhdGE0JG1hdGNoaW5nMk41LlNRMDA0X1NRMDA1LltpXSxkYXRhNCRtYXRjaGluZzJONS5TUTAwNV9TUTAwNS5baV0sZGF0YTQkbWF0Y2hpbmcyTjUuU1EwMDZfU1EwMDUuW2ldLGRhdGE0JG1hdGNoaW5nMk41LlNRMDA3X1NRMDA1LltpXSxkYXRhNCRtYXRjaGluZzJONS5TUTAwOF9TUTAwNS5baV0sZGF0YTQkbWF0Y2hpbmcyTjUuU1EwMDlfU1EwMDUuW2ldLGRhdGE0JG1hdGNoaW5nMk41LlNRMDEwX1NRMDA1LltpXSkpDQogIG1hdGNoaW5nTGlzdDJbW2ldXSA8LSBtYXRjaGluZzJMDQp9DQoNCmZvciAoaSBpbiAxOmxlbmd0aChtYXRjaGluZ0xpc3QyKSkgeyAgICAjIGZvciBlZ28gaQ0KICBtTCA8LSBtYXRjaGluZ0xpc3QyW1tpXV0gICAgICAgICAgICAgICMgZ2V0IHRoZSBtYXRjaGluZyBsaXN0IDINCiAgbnMgPC0gbnMzW1tpXV0gICAgICAgICAgICAgICAgICAgICAgICAjIGdldCB0aGUgc2l6ZSBvZiBlZ29uZXQzDQogIGlmKG5zPjApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBpZiBucz0wLCBubyBtYXRjaGluZyB3YXMgZG9uZSENCiAgICBtbSA8LSBhcy5tYXRyaXgobUxbW25zXV0pICAgICAgICAgICAjIGFuZCB0aGUgY29ycmVzcG9uZGluZyBtYXRyaXgNCiAgICBtYXRjaGVkIDwtIHdoaWNoKG1tPT0xLCBhcnIuaW5kPVQpICAjIHJldHJpZXZlIGFycmF5IGluZGljZXMNCiAgICBuZXQgPC0gbmV0M1tpLF0NCiAgICBpZihsZW5ndGgobWF0Y2hlZCk+MCkgeyAgICAgICAgICAgICAjIGlmIG1hdGNoaW5nIHdhcyBwZXJmb3JtZWQhDQogICAgICBhbHRlckxbW2ldXSRuYW1lM1ttYXRjaGVkWywyXV0gPC0gbmV0W21hdGNoZWRbLDFdXQ0KICAgIH0NCiAgfQ0KfQ0KDQojIHNhbWUgZm9yIG1hdGNoaW5nIDMgKGkuZS4sIGVnb25ldDQgd2l0aCBlZ29uZXRzIDEtMykNCm1hdGNoaW5nTGlzdDMgPC0gbGlzdCgpDQpmb3IgKGkgaW4gMTpsZW5ndGgoYWx0ZXJMKSkgeyAjIGZvciBlZ28gaQ0KICBtYXRjaGluZzNMIDwtIGxpc3QoKQ0KICBtYXRjaGluZzNMW1sxXV0gPC0gY2JpbmQoZGF0YTQkbWF0Y2hpbmczTjEuU1EwMDFfU1EwMDEuW2ldLGRhdGE0JG1hdGNoaW5nM04xLlNRMDAyX1NRMDAxLltpXSxkYXRhNCRtYXRjaGluZzNOMS5TUTAwM19TUTAwMS5baV0sZGF0YTQkbWF0Y2hpbmczTjEuU1EwMDRfU1EwMDEuW2ldLGRhdGE0JG1hdGNoaW5nM04xLlNRMDA1X1NRMDAxLltpXSxkYXRhNCRtYXRjaGluZzNOMS5TUTAwNl9TUTAwMS5baV0sZGF0YTQkbWF0Y2hpbmczTjEuU1EwMDdfU1EwMDEuW2ldLGRhdGE0JG1hdGNoaW5nM04xLlNRMDA4X1NRMDAxLltpXSxkYXRhNCRtYXRjaGluZzNOMS5TUTAwOV9TUTAwMS5baV0sZGF0YTQkbWF0Y2hpbmczTjEuU1EwMTBfU1EwMDEuW2ldLCBkYXRhNCRtYXRjaGluZzNOMS5TUTAxMV9TUTAwMS5baV0sIGRhdGE0JG1hdGNoaW5nM04xLlNRMDEyX1NRMDAxLltpXSwgZGF0YTQkbWF0Y2hpbmczTjEuU1EwMTNfU1EwMDEuW2ldLCBkYXRhNCRtYXRjaGluZzNOMS5TUTAxNF9TUTAwMS5baV0sIGRhdGE0JG1hdGNoaW5nM04xLlNRMDE1X1NRMDAxLltpXSkNCiAgbWF0Y2hpbmczTFtbMl1dIDwtIHJiaW5kKA0KICAgIGNiaW5kKGRhdGE0JG1hdGNoaW5nM04yLlNRMDAxX1NRMDAxLltpXSxkYXRhNCRtYXRjaGluZzNOMi5TUTAwMl9TUTAwMS5baV0sZGF0YTQkbWF0Y2hpbmczTjIuU1EwMDNfU1EwMDEuW2ldLGRhdGE0JG1hdGNoaW5nM04yLlNRMDA0X1NRMDAxLltpXSxkYXRhNCRtYXRjaGluZzNOMi5TUTAwNV9TUTAwMS5baV0sZGF0YTQkbWF0Y2hpbmczTjIuU1EwMDZfU1EwMDEuW2ldLGRhdGE0JG1hdGNoaW5nM04yLlNRMDA3X1NRMDAxLltpXSxkYXRhNCRtYXRjaGluZzNOMi5TUTAwOF9TUTAwMS5baV0sZGF0YTQkbWF0Y2hpbmczTjIuU1EwMDlfU1EwMDEuW2ldLGRhdGE0JG1hdGNoaW5nM04yLlNRMDEwX1NRMDAxLltpXSwgZGF0YTQkbWF0Y2hpbmczTjIuU1EwMTFfU1EwMDEuW2ldLCBkYXRhNCRtYXRjaGluZzNOMi5TUTAxMl9TUTAwMS5baV0sIGRhdGE0JG1hdGNoaW5nM04yLlNRMDEzX1NRMDAxLltpXSwgZGF0YTQkbWF0Y2hpbmczTjIuU1EwMTRfU1EwMDEuW2ldLCBkYXRhNCRtYXRjaGluZzNOMi5TUTAxNV9TUTAwMS5baV0pLA0KICAgIGNiaW5kKGRhdGE0JG1hdGNoaW5nM04yLlNRMDAxX1NRMDAyLltpXSxkYXRhNCRtYXRjaGluZzNOMi5TUTAwMl9TUTAwMi5baV0sZGF0YTQkbWF0Y2hpbmczTjIuU1EwMDNfU1EwMDIuW2ldLGRhdGE0JG1hdGNoaW5nM04yLlNRMDA0X1NRMDAyLltpXSxkYXRhNCRtYXRjaGluZzNOMi5TUTAwNV9TUTAwMi5baV0sZGF0YTQkbWF0Y2hpbmczTjIuU1EwMDZfU1EwMDIuW2ldLGRhdGE0JG1hdGNoaW5nM04yLlNRMDA3X1NRMDAyLltpXSxkYXRhNCRtYXRjaGluZzNOMi5TUTAwOF9TUTAwMi5baV0sZGF0YTQkbWF0Y2hpbmczTjIuU1EwMDlfU1EwMDIuW2ldLGRhdGE0JG1hdGNoaW5nM04yLlNRMDEwX1NRMDAyLltpXSwgZGF0YTQkbWF0Y2hpbmczTjIuU1EwMTFfU1EwMDIuW2ldLCBkYXRhNCRtYXRjaGluZzNOMi5TUTAxMl9TUTAwMi5baV0sIGRhdGE0JG1hdGNoaW5nM04yLlNRMDEzX1NRMDAyLltpXSwgZGF0YTQkbWF0Y2hpbmczTjIuU1EwMTRfU1EwMDIuW2ldLCBkYXRhNCRtYXRjaGluZzNOMi5TUTAxNV9TUTAwMi5baV0pKQ0KICBtYXRjaGluZzNMW1szXV0gPC0gcmJpbmQoDQogICAgY2JpbmQoZGF0YTQkbWF0Y2hpbmczTjMuU1EwMDFfU1EwMDEuW2ldLGRhdGE0JG1hdGNoaW5nM04zLlNRMDAyX1NRMDAxLltpXSxkYXRhNCRtYXRjaGluZzNOMy5TUTAwM19TUTAwMS5baV0sZGF0YTQkbWF0Y2hpbmczTjMuU1EwMDRfU1EwMDEuW2ldLGRhdGE0JG1hdGNoaW5nM04zLlNRMDA1X1NRMDAxLltpXSxkYXRhNCRtYXRjaGluZzNOMy5TUTAwNl9TUTAwMS5baV0sZGF0YTQkbWF0Y2hpbmczTjMuU1EwMDdfU1EwMDEuW2ldLGRhdGE0JG1hdGNoaW5nM04zLlNRMDA4X1NRMDAxLltpXSxkYXRhNCRtYXRjaGluZzNOMy5TUTAwOV9TUTAwMS5baV0sZGF0YTQkbWF0Y2hpbmczTjMuU1EwMTBfU1EwMDEuW2ldLCBkYXRhNCRtYXRjaGluZzNOMy5TUTAxMV9TUTAwMS5baV0sIGRhdGE0JG1hdGNoaW5nM04zLlNRMDEyX1NRMDAxLltpXSwgZGF0YTQkbWF0Y2hpbmczTjMuU1EwMTNfU1EwMDEuW2ldLCBkYXRhNCRtYXRjaGluZzNOMy5TUTAxNF9TUTAwMS5baV0sIGRhdGE0JG1hdGNoaW5nM04zLlNRMDE1X1NRMDAxLltpXSksDQogICAgY2JpbmQoZGF0YTQkbWF0Y2hpbmczTjMuU1EwMDFfU1EwMDIuW2ldLGRhdGE0JG1hdGNoaW5nM04zLlNRMDAyX1NRMDAyLltpXSxkYXRhNCRtYXRjaGluZzNOMy5TUTAwM19TUTAwMi5baV0sZGF0YTQkbWF0Y2hpbmczTjMuU1EwMDRfU1EwMDIuW2ldLGRhdGE0JG1hdGNoaW5nM04zLlNRMDA1X1NRMDAyLltpXSxkYXRhNCRtYXRjaGluZzNOMy5TUTAwNl9TUTAwMi5baV0sZGF0YTQkbWF0Y2hpbmczTjMuU1EwMDdfU1EwMDIuW2ldLGRhdGE0JG1hdGNoaW5nM04zLlNRMDA4X1NRMDAyLltpXSxkYXRhNCRtYXRjaGluZzNOMy5TUTAwOV9TUTAwMi5baV0sZGF0YTQkbWF0Y2hpbmczTjMuU1EwMTBfU1EwMDIuW2ldLCBkYXRhNCRtYXRjaGluZzNOMy5TUTAxMV9TUTAwMi5baV0sIGRhdGE0JG1hdGNoaW5nM04zLlNRMDEyX1NRMDAyLltpXSwgZGF0YTQkbWF0Y2hpbmczTjMuU1EwMTNfU1EwMDIuW2ldLCBkYXRhNCRtYXRjaGluZzNOMy5TUTAxNF9TUTAwMi5baV0sIGRhdGE0JG1hdGNoaW5nM04zLlNRMDE1X1NRMDAyLltpXSksDQogICAgY2JpbmQoZGF0YTQkbWF0Y2hpbmczTjMuU1EwMDFfU1EwMDMuW2ldLGRhdGE0JG1hdGNoaW5nM04zLlNRMDAyX1NRMDAzLltpXSxkYXRhNCRtYXRjaGluZzNOMy5TUTAwM19TUTAwMy5baV0sZGF0YTQkbWF0Y2hpbmczTjMuU1EwMDRfU1EwMDMuW2ldLGRhdGE0JG1hdGNoaW5nM04zLlNRMDA1X1NRMDAzLltpXSxkYXRhNCRtYXRjaGluZzNOMy5TUTAwNl9TUTAwMy5baV0sZGF0YTQkbWF0Y2hpbmczTjMuU1EwMDdfU1EwMDMuW2ldLGRhdGE0JG1hdGNoaW5nM04zLlNRMDA4X1NRMDAzLltpXSxkYXRhNCRtYXRjaGluZzNOMy5TUTAwOV9TUTAwMy5baV0sZGF0YTQkbWF0Y2hpbmczTjMuU1EwMTBfU1EwMDMuW2ldLCBkYXRhNCRtYXRjaGluZzNOMy5TUTAxMV9TUTAwMy5baV0sIGRhdGE0JG1hdGNoaW5nM04zLlNRMDEyX1NRMDAzLltpXSwgZGF0YTQkbWF0Y2hpbmczTjMuU1EwMTNfU1EwMDMuW2ldLCBkYXRhNCRtYXRjaGluZzNOMy5TUTAxNF9TUTAwMy5baV0sIGRhdGE0JG1hdGNoaW5nM04zLlNRMDE1X1NRMDAzLltpXSkpDQogIG1hdGNoaW5nM0xbWzRdXSA8LSByYmluZCgNCiAgICBjYmluZChkYXRhNCRtYXRjaGluZzNONC5TUTAwMV9TUTAwMS5baV0sZGF0YTQkbWF0Y2hpbmczTjQuU1EwMDJfU1EwMDEuW2ldLGRhdGE0JG1hdGNoaW5nM040LlNRMDAzX1NRMDAxLltpXSxkYXRhNCRtYXRjaGluZzNONC5TUTAwNF9TUTAwMS5baV0sZGF0YTQkbWF0Y2hpbmczTjQuU1EwMDVfU1EwMDEuW2ldLGRhdGE0JG1hdGNoaW5nM040LlNRMDA2X1NRMDAxLltpXSxkYXRhNCRtYXRjaGluZzNONC5TUTAwN19TUTAwMS5baV0sZGF0YTQkbWF0Y2hpbmczTjQuU1EwMDhfU1EwMDEuW2ldLGRhdGE0JG1hdGNoaW5nM040LlNRMDA5X1NRMDAxLltpXSxkYXRhNCRtYXRjaGluZzNONC5TUTAxMF9TUTAwMS5baV0sIGRhdGE0JG1hdGNoaW5nM040LlNRMDExX1NRMDAxLltpXSwgZGF0YTQkbWF0Y2hpbmczTjQuU1EwMTJfU1EwMDEuW2ldLCBkYXRhNCRtYXRjaGluZzNONC5TUTAxM19TUTAwMS5baV0sIGRhdGE0JG1hdGNoaW5nM040LlNRMDE0X1NRMDAxLltpXSwgZGF0YTQkbWF0Y2hpbmczTjQuU1EwMTVfU1EwMDEuW2ldKSwNCiAgICBjYmluZChkYXRhNCRtYXRjaGluZzNONC5TUTAwMV9TUTAwMi5baV0sZGF0YTQkbWF0Y2hpbmczTjQuU1EwMDJfU1EwMDIuW2ldLGRhdGE0JG1hdGNoaW5nM040LlNRMDAzX1NRMDAyLltpXSxkYXRhNCRtYXRjaGluZzNONC5TUTAwNF9TUTAwMi5baV0sZGF0YTQkbWF0Y2hpbmczTjQuU1EwMDVfU1EwMDIuW2ldLGRhdGE0JG1hdGNoaW5nM040LlNRMDA2X1NRMDAyLltpXSxkYXRhNCRtYXRjaGluZzNONC5TUTAwN19TUTAwMi5baV0sZGF0YTQkbWF0Y2hpbmczTjQuU1EwMDhfU1EwMDIuW2ldLGRhdGE0JG1hdGNoaW5nM040LlNRMDA5X1NRMDAyLltpXSxkYXRhNCRtYXRjaGluZzNONC5TUTAxMF9TUTAwMi5baV0sIGRhdGE0JG1hdGNoaW5nM040LlNRMDExX1NRMDAyLltpXSwgZGF0YTQkbWF0Y2hpbmczTjQuU1EwMTJfU1EwMDIuW2ldLCBkYXRhNCRtYXRjaGluZzNONC5TUTAxM19TUTAwMi5baV0sIGRhdGE0JG1hdGNoaW5nM040LlNRMDE0X1NRMDAyLltpXSwgZGF0YTQkbWF0Y2hpbmczTjQuU1EwMTVfU1EwMDIuW2ldKSwNCiAgICBjYmluZChkYXRhNCRtYXRjaGluZzNONC5TUTAwMV9TUTAwMy5baV0sZGF0YTQkbWF0Y2hpbmczTjQuU1EwMDJfU1EwMDMuW2ldLGRhdGE0JG1hdGNoaW5nM040LlNRMDAzX1NRMDAzLltpXSxkYXRhNCRtYXRjaGluZzNONC5TUTAwNF9TUTAwMy5baV0sZGF0YTQkbWF0Y2hpbmczTjQuU1EwMDVfU1EwMDMuW2ldLGRhdGE0JG1hdGNoaW5nM040LlNRMDA2X1NRMDAzLltpXSxkYXRhNCRtYXRjaGluZzNONC5TUTAwN19TUTAwMy5baV0sZGF0YTQkbWF0Y2hpbmczTjQuU1EwMDhfU1EwMDMuW2ldLGRhdGE0JG1hdGNoaW5nM040LlNRMDA5X1NRMDAzLltpXSxkYXRhNCRtYXRjaGluZzNONC5TUTAxMF9TUTAwMy5baV0sIGRhdGE0JG1hdGNoaW5nM040LlNRMDExX1NRMDAzLltpXSwgZGF0YTQkbWF0Y2hpbmczTjQuU1EwMTJfU1EwMDMuW2ldLCBkYXRhNCRtYXRjaGluZzNONC5TUTAxM19TUTAwMy5baV0sIGRhdGE0JG1hdGNoaW5nM040LlNRMDE0X1NRMDAzLltpXSwgZGF0YTQkbWF0Y2hpbmczTjQuU1EwMTVfU1EwMDMuW2ldKSwNCiAgICBjYmluZChkYXRhNCRtYXRjaGluZzNONC5TUTAwMV9TUTAwMy5baV0sZGF0YTQkbWF0Y2hpbmczTjQuU1EwMDJfU1EwMDMuW2ldLGRhdGE0JG1hdGNoaW5nM040LlNRMDAzX1NRMDAzLltpXSxkYXRhNCRtYXRjaGluZzNONC5TUTAwNF9TUTAwMy5baV0sZGF0YTQkbWF0Y2hpbmczTjQuU1EwMDVfU1EwMDMuW2ldLGRhdGE0JG1hdGNoaW5nM040LlNRMDA2X1NRMDAzLltpXSxkYXRhNCRtYXRjaGluZzNONC5TUTAwN19TUTAwMy5baV0sZGF0YTQkbWF0Y2hpbmczTjQuU1EwMDhfU1EwMDMuW2ldLGRhdGE0JG1hdGNoaW5nM040LlNRMDA5X1NRMDAzLltpXSxkYXRhNCRtYXRjaGluZzNONC5TUTAxMF9TUTAwMy5baV0sIGRhdGE0JG1hdGNoaW5nM040LlNRMDExX1NRMDAzLltpXSwgZGF0YTQkbWF0Y2hpbmczTjQuU1EwMTJfU1EwMDMuW2ldLCBkYXRhNCRtYXRjaGluZzNONC5TUTAxM19TUTAwMy5baV0sIGRhdGE0JG1hdGNoaW5nM040LlNRMDE0X1NRMDAzLltpXSwgZGF0YTQkbWF0Y2hpbmczTjQuU1EwMTVfU1EwMDMuW2ldKSwNCiAgICBjYmluZChkYXRhNCRtYXRjaGluZzNONC5TUTAwMV9TUTAwNC5baV0sZGF0YTQkbWF0Y2hpbmczTjQuU1EwMDJfU1EwMDQuW2ldLGRhdGE0JG1hdGNoaW5nM040LlNRMDAzX1NRMDA0LltpXSxkYXRhNCRtYXRjaGluZzNONC5TUTAwNF9TUTAwNC5baV0sZGF0YTQkbWF0Y2hpbmczTjQuU1EwMDVfU1EwMDQuW2ldLGRhdGE0JG1hdGNoaW5nM040LlNRMDA2X1NRMDA0LltpXSxkYXRhNCRtYXRjaGluZzNONC5TUTAwN19TUTAwNC5baV0sZGF0YTQkbWF0Y2hpbmczTjQuU1EwMDhfU1EwMDQuW2ldLGRhdGE0JG1hdGNoaW5nM040LlNRMDA5X1NRMDA0LltpXSxkYXRhNCRtYXRjaGluZzNONC5TUTAxMF9TUTAwNC5baV0sIGRhdGE0JG1hdGNoaW5nM040LlNRMDExX1NRMDA0LltpXSwgZGF0YTQkbWF0Y2hpbmczTjQuU1EwMTJfU1EwMDQuW2ldLCBkYXRhNCRtYXRjaGluZzNONC5TUTAxM19TUTAwNC5baV0sIGRhdGE0JG1hdGNoaW5nM040LlNRMDE0X1NRMDA0LltpXSwgZGF0YTQkbWF0Y2hpbmczTjQuU1EwMTVfU1EwMDQuW2ldKSkNCiAgbWF0Y2hpbmczTFtbNV1dIDwtIHJiaW5kKA0KICAgIGNiaW5kKGRhdGE0JG1hdGNoaW5nM041LlNRMDAxX1NRMDAxLltpXSxkYXRhNCRtYXRjaGluZzNONS5TUTAwMl9TUTAwMS5baV0sZGF0YTQkbWF0Y2hpbmczTjUuU1EwMDNfU1EwMDEuW2ldLGRhdGE0JG1hdGNoaW5nM041LlNRMDA0X1NRMDAxLltpXSxkYXRhNCRtYXRjaGluZzNONS5TUTAwNV9TUTAwMS5baV0sZGF0YTQkbWF0Y2hpbmczTjUuU1EwMDZfU1EwMDEuW2ldLGRhdGE0JG1hdGNoaW5nM041LlNRMDA3X1NRMDAxLltpXSxkYXRhNCRtYXRjaGluZzNONS5TUTAwOF9TUTAwMS5baV0sZGF0YTQkbWF0Y2hpbmczTjUuU1EwMDlfU1EwMDEuW2ldLGRhdGE0JG1hdGNoaW5nM041LlNRMDEwX1NRMDAxLltpXSwgZGF0YTQkbWF0Y2hpbmczTjUuU1EwMTFfU1EwMDEuW2ldLCBkYXRhNCRtYXRjaGluZzNONS5TUTAxMl9TUTAwMS5baV0sIGRhdGE0JG1hdGNoaW5nM041LlNRMDEzX1NRMDAxLltpXSwgZGF0YTQkbWF0Y2hpbmczTjUuU1EwMTRfU1EwMDEuW2ldLCBkYXRhNCRtYXRjaGluZzNONS5TUTAxNV9TUTAwMS5baV0pLA0KICAgIGNiaW5kKGRhdGE0JG1hdGNoaW5nM041LlNRMDAxX1NRMDAyLltpXSxkYXRhNCRtYXRjaGluZzNONS5TUTAwMl9TUTAwMi5baV0sZGF0YTQkbWF0Y2hpbmczTjUuU1EwMDNfU1EwMDIuW2ldLGRhdGE0JG1hdGNoaW5nM041LlNRMDA0X1NRMDAyLltpXSxkYXRhNCRtYXRjaGluZzNONS5TUTAwNV9TUTAwMi5baV0sZGF0YTQkbWF0Y2hpbmczTjUuU1EwMDZfU1EwMDIuW2ldLGRhdGE0JG1hdGNoaW5nM041LlNRMDA3X1NRMDAyLltpXSxkYXRhNCRtYXRjaGluZzNONS5TUTAwOF9TUTAwMi5baV0sZGF0YTQkbWF0Y2hpbmczTjUuU1EwMDlfU1EwMDIuW2ldLGRhdGE0JG1hdGNoaW5nM041LlNRMDEwX1NRMDAyLltpXSwgZGF0YTQkbWF0Y2hpbmczTjUuU1EwMTFfU1EwMDIuW2ldLCBkYXRhNCRtYXRjaGluZzNONS5TUTAxMl9TUTAwMi5baV0sIGRhdGE0JG1hdGNoaW5nM041LlNRMDEzX1NRMDAyLltpXSwgZGF0YTQkbWF0Y2hpbmczTjUuU1EwMTRfU1EwMDIuW2ldLCBkYXRhNCRtYXRjaGluZzNONS5TUTAxNV9TUTAwMi5baV0pLA0KICAgIGNiaW5kKGRhdGE0JG1hdGNoaW5nM041LlNRMDAxX1NRMDAzLltpXSxkYXRhNCRtYXRjaGluZzNONS5TUTAwMl9TUTAwMy5baV0sZGF0YTQkbWF0Y2hpbmczTjUuU1EwMDNfU1EwMDMuW2ldLGRhdGE0JG1hdGNoaW5nM041LlNRMDA0X1NRMDAzLltpXSxkYXRhNCRtYXRjaGluZzNONS5TUTAwNV9TUTAwMy5baV0sZGF0YTQkbWF0Y2hpbmczTjUuU1EwMDZfU1EwMDMuW2ldLGRhdGE0JG1hdGNoaW5nM041LlNRMDA3X1NRMDAzLltpXSxkYXRhNCRtYXRjaGluZzNONS5TUTAwOF9TUTAwMy5baV0sZGF0YTQkbWF0Y2hpbmczTjUuU1EwMDlfU1EwMDMuW2ldLGRhdGE0JG1hdGNoaW5nM041LlNRMDEwX1NRMDAzLltpXSwgZGF0YTQkbWF0Y2hpbmczTjUuU1EwMTFfU1EwMDMuW2ldLCBkYXRhNCRtYXRjaGluZzNONS5TUTAxMl9TUTAwMy5baV0sIGRhdGE0JG1hdGNoaW5nM041LlNRMDEzX1NRMDAzLltpXSwgZGF0YTQkbWF0Y2hpbmczTjUuU1EwMTRfU1EwMDMuW2ldLCBkYXRhNCRtYXRjaGluZzNONS5TUTAxNV9TUTAwMy5baV0pLA0KICAgIGNiaW5kKGRhdGE0JG1hdGNoaW5nM041LlNRMDAxX1NRMDAzLltpXSxkYXRhNCRtYXRjaGluZzNONS5TUTAwMl9TUTAwMy5baV0sZGF0YTQkbWF0Y2hpbmczTjUuU1EwMDNfU1EwMDMuW2ldLGRhdGE0JG1hdGNoaW5nM041LlNRMDA0X1NRMDAzLltpXSxkYXRhNCRtYXRjaGluZzNONS5TUTAwNV9TUTAwMy5baV0sZGF0YTQkbWF0Y2hpbmczTjUuU1EwMDZfU1EwMDMuW2ldLGRhdGE0JG1hdGNoaW5nM041LlNRMDA3X1NRMDAzLltpXSxkYXRhNCRtYXRjaGluZzNONS5TUTAwOF9TUTAwMy5baV0sZGF0YTQkbWF0Y2hpbmczTjUuU1EwMDlfU1EwMDMuW2ldLGRhdGE0JG1hdGNoaW5nM041LlNRMDEwX1NRMDAzLltpXSwgZGF0YTQkbWF0Y2hpbmczTjUuU1EwMTFfU1EwMDMuW2ldLCBkYXRhNCRtYXRjaGluZzNONS5TUTAxMl9TUTAwMy5baV0sIGRhdGE0JG1hdGNoaW5nM041LlNRMDEzX1NRMDAzLltpXSwgZGF0YTQkbWF0Y2hpbmczTjUuU1EwMTRfU1EwMDMuW2ldLCBkYXRhNCRtYXRjaGluZzNONS5TUTAxNV9TUTAwMy5baV0pLA0KICAgIGNiaW5kKGRhdGE0JG1hdGNoaW5nM041LlNRMDAxX1NRMDA1LltpXSxkYXRhNCRtYXRjaGluZzNONS5TUTAwMl9TUTAwNS5baV0sZGF0YTQkbWF0Y2hpbmczTjUuU1EwMDNfU1EwMDUuW2ldLGRhdGE0JG1hdGNoaW5nM041LlNRMDA0X1NRMDA1LltpXSxkYXRhNCRtYXRjaGluZzNONS5TUTAwNV9TUTAwNS5baV0sZGF0YTQkbWF0Y2hpbmczTjUuU1EwMDZfU1EwMDUuW2ldLGRhdGE0JG1hdGNoaW5nM041LlNRMDA3X1NRMDA1LltpXSxkYXRhNCRtYXRjaGluZzNONS5TUTAwOF9TUTAwNS5baV0sZGF0YTQkbWF0Y2hpbmczTjUuU1EwMDlfU1EwMDUuW2ldLGRhdGE0JG1hdGNoaW5nM041LlNRMDEwX1NRMDA1LltpXSwgZGF0YTQkbWF0Y2hpbmczTjUuU1EwMTFfU1EwMDUuW2ldLCBkYXRhNCRtYXRjaGluZzNONS5TUTAxMl9TUTAwNS5baV0sIGRhdGE0JG1hdGNoaW5nM041LlNRMDEzX1NRMDA1LltpXSwgZGF0YTQkbWF0Y2hpbmczTjUuU1EwMTRfU1EwMDUuW2ldLCBkYXRhNCRtYXRjaGluZzNONS5TUTAxNV9TUTAwNS5baV0pKQ0KICBtYXRjaGluZ0xpc3QzW1tpXV0gPC0gbWF0Y2hpbmczTA0KfQ0KDQpmb3IgKGkgaW4gMTpsZW5ndGgobWF0Y2hpbmdMaXN0MykpIHsgICAgIyBmb3IgZWdvIGkNCiAgbUwgPC0gbWF0Y2hpbmdMaXN0M1tbaV1dICAgICAgICAgICAgICAjIGdldCB0aGUgbWF0Y2hpbmcgbGlzdCAyDQogIG5zIDwtIG5zNFtbaV1dICAgICAgICAgICAgICAgICAgICAgICAgIyBnZXQgdGhlIHNpemUgb2YgZWdvbmV0NA0KICBpZihucz4wKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgaWYgbnM9MCwgbm8gbWF0Y2hpbmcgd2FzIGRvbmUhDQogICAgbW0gPC0gYXMubWF0cml4KG1MW1tuc11dKSAgICAgICAgICAgIyBhbmQgdGhlIGNvcnJlc3BvbmRpbmcgbWF0cml4DQogICAgbWF0Y2hlZCA8LSB3aGljaChtbT09MSwgYXJyLmluZD1UKSAgIyByZXRyaWV2ZSBhcnJheSBpbmRpY2VzDQogICAgbmV0IDwtIG5ldDRbaSxdDQogICAgaWYobGVuZ3RoKG1hdGNoZWQpPjApIHsgICAgICAgICAgICAgIyBpZiBtYXRjaGluZyB3YXMgcGVyZm9ybWVkIQ0KICAgICAgYWx0ZXJMW1tpXV0kbmFtZTRbbWF0Y2hlZFssMl1dIDwtIG5ldFttYXRjaGVkWywxXV0NCiAgICB9DQogIH0NCn0NCg0KI2xldCB1cyBoZXJlIGFsc28gYXR0YWNoIHN0cnVjdHVyYWwgZW1iZWRkZWRuZXNzLiBiZWNhdXNlIHRoZSAnbmV0d29yayBlbnZpcm9ubWVudCcgZm9yIG1haW50YWluZWQgYWx0ZXJzIG1heSBjaGFuZ2UgaW4gdDINCg0KI2FnYWluLCBmaXggdGhlIGlycmVndWxhcml0aWVzIGluIHRoZSBkYXRhLg0KZGF0YTQgPC0gZGF0YTQgJT4lDQogIHJlbmFtZSAoYWRqM04yYS5TUTAwMS4gPSBhZGozTjFhLlNRMDAxLiwgYWRqM04zYS5TUTAwMS4gPSBhZGozTjJhLlNRMDAxLixhZGozTjNhLlNRMDAyLiA9IGFkajNOMmEuU1EwMDIuLGFkajNOM2IuU1EwMDEuID0gYWRqM04yYi5TUTAwMS4sYWRqM040YS5TUTAwMS4gPSBhZGozTjNhLlNRMDAxLixhZGozTjRhLlNRMDAyLiA9IGFkajNOM2EuU1EwMDIuLGFkajNONGEuU1EwMDMuID0gYWRqM04zYS5TUTAwMy4sYWRqM040Yi5TUTAwMS4gPSBhZGozTjNiLlNRMDAxLixhZGozTjRiLlNRMDAyLiA9IGFkajNOM2IuU1EwMDIuLCAgIGFkajNONGMuU1EwMDEuID0gYWRqM04zYy5TUTAwMS4sYWRqM041YS5TUTAwMS4gPSBhZGozTjRhLlNRMDAxLixhZGozTjVhLlNRMDAyLiA9IGFkajNONGEuU1EwMDIuLGFkajNONWEuU1EwMDMuID0gYWRqM040YS5TUTAwMy4sYWRqM041YS5TUTAwNC4gPSBhZGozTjRhLlNRMDA0LixhZGozTjViLlNRMDAxLiA9IGFkajNONGIuU1EwMDEuLGFkajNONWIuU1EwMDIuID0gYWRqM040Yi5TUTAwMi4sYWRqM041Yi5TUTAwMy4gPSBhZGozTjRiLlNRMDAzLixhZGozTjVjLlNRMDAxLiA9IGFkajNONGMuU1EwMDEuLGFkajNONWMuU1EwMDIuID0gYWRqM040Yy5TUTAwMi4sYWRqM041ZC5TUTAwMS4gPSBhZGozTjRkLlNRMDAxLikNCg0KZGF0YTQkYWRqNE4zYi5TUTAwMS4gPC0gZGF0YTQkYWRqNE4zYi5TUTAwMi4NCg0KZm9yIChpIGluIDE6bGVuZ3RoKGFsdGVyTCkpIHsgIyBmb3IgZWdvIGkNCg0KICAjZ2V0IG51bWJlciBvZiBuYW1lcyBsaXN0ZWQgaW4gdGhlIGVnb25ldHMNCiAgbm5hbWVzX2NkbiA8LSBsZW5ndGgod2hpY2goZGF0YTRbaSxjKCJlZ29uZXQxLlNRMDAxLiIsImVnb25ldDEuU1EwMDIuIiwiZWdvbmV0MS5TUTAwMy4iLCJlZ29uZXQxLlNRMDA0LiIsImVnb25ldDEuU1EwMDUuIildIT0iIikpDQogIG5uYW1lc19zdHVkeSA8LSBsZW5ndGgod2hpY2goZGF0YTRbaSxjKCJlZ29uZXQyLlNRMDAxLiIsImVnb25ldDIuU1EwMDIuIiwiZWdvbmV0Mi5TUTAwMy4iLCJlZ29uZXQyLlNRMDA0LiIsImVnb25ldDIuU1EwMDUuIildIT0iIikpDQogIG5uYW1lc19iZmYgPC0gbGVuZ3RoKHdoaWNoKGRhdGE0W2ksYygiZWdvbmV0My5TUTAwMS4iLCJlZ29uZXQzLlNRMDAyLiIsImVnb25ldDMuU1EwMDMuIiwiZWdvbmV0My5TUTAwNC4iLCJlZ29uZXQzLlNRMDA1LiIpXSE9IiIpKQ0KICBubmFtZXNfY3NuIDwtIGxlbmd0aCh3aGljaChkYXRhNFtpLGMoImVnb25ldDQuU1EwMDEuIiwiZWdvbmV0NC5TUTAwMi4iLCJlZ29uZXQ0LlNRMDAzLiIsImVnb25ldDQuU1EwMDQuIiwiZWdvbmV0NC5TUTAwNS4iKV0hPSIiKSkNCiAgDQogICNDRE4NCiAgDQogICNtYWtlIGxpc3Qgb2YgYWRqYWNlbmN5IG1hdHJpY2VzDQogIGFkakwgPC0gbGlzdCgpDQogIHsNCiAgIzIgYWx0ZXJzDQogIGFkakxbWzJdXSA8LSBtYXRyaXgoTkEsbmNvbD0yLG5yb3c9MikNCiAgYWRqTFtbMl1dWzEsMl0gPC0gYWRqTFtbMl1dWzIsMV0gPC0gZGF0YTQkYWRqMU4yYS5TUTAwMS5baV0NCg0KICAjMyBhbHRlcnMNCiAgYWRqTFtbM11dIDwtIG1hdHJpeChOQSxuY29sPTMsbnJvdz0zKQ0KICBhZGpMW1szXV1bMSwyXSA8LSBhZGpMW1szXV1bMiwxXSA8LSBkYXRhNCRhZGoxTjNhLlNRMDAxLltpXQ0KICBhZGpMW1szXV1bMSwzXSA8LSBhZGpMW1szXV1bMywxXSA8LSBkYXRhNCRhZGoxTjNhLlNRMDAyLltpXQ0KICBhZGpMW1szXV1bMiwzXSA8LSBhZGpMW1szXV1bMywyXSA8LSBkYXRhNCRhZGoxTjNiLlNRMDAxLltpXQ0KDQogICM0IGFsdGVycw0KICBhZGpMW1s0XV0gPC0gbWF0cml4KE5BLG5jb2w9NCxucm93PTQpDQogIGFkakxbWzRdXVsxLDJdIDwtIGFkakxbWzRdXVsyLDFdIDwtIGRhdGE0JGFkajFONGEuU1EwMDEuW2ldDQogIGFkakxbWzRdXVsxLDNdIDwtIGFkakxbWzRdXVszLDFdIDwtIGRhdGE0JGFkajFONGEuU1EwMDIuW2ldDQogIGFkakxbWzRdXVsxLDRdIDwtIGFkakxbWzRdXVs0LDFdIDwtIGRhdGE0JGFkajFONGEuU1EwMDMuW2ldDQogIGFkakxbWzRdXVsyLDNdIDwtIGFkakxbWzRdXVszLDJdIDwtIGRhdGE0JGFkajFONGIuU1EwMDEuW2ldDQogIGFkakxbWzRdXVsyLDRdIDwtIGFkakxbWzRdXVs0LDJdIDwtIGRhdGE0JGFkajFONGIuU1EwMDIuW2ldDQogIGFkakxbWzRdXVszLDRdIDwtIGFkakxbWzRdXVs0LDNdIDwtIGRhdGE0JGFkajFONGMuU1EwMDEuW2ldDQoNCiAgIzUgYWx0ZXJzDQogIGFkakxbWzVdXSA8LSBtYXRyaXgoTkEsbmNvbD01LG5yb3c9NSkNCiAgYWRqTFtbNV1dWzEsMl0gPC0gYWRqTFtbNV1dWzIsMV0gPC0gZGF0YTQkYWRqMU41YS5TUTAwMS5baV0NCiAgYWRqTFtbNV1dWzEsM10gPC0gYWRqTFtbNV1dWzMsMV0gPC0gZGF0YTQkYWRqMU41YS5TUTAwMi5baV0NCiAgYWRqTFtbNV1dWzEsNF0gPC0gYWRqTFtbNV1dWzQsMV0gPC0gZGF0YTQkYWRqMU41YS5TUTAwMy5baV0NCiAgYWRqTFtbNV1dWzEsNV0gPC0gYWRqTFtbNV1dWzUsMV0gPC0gZGF0YTQkYWRqMU41YS5TUTAwNC5baV0NCiAgYWRqTFtbNV1dWzIsM10gPC0gYWRqTFtbNV1dWzMsMl0gPC0gZGF0YTQkYWRqMU41Yi5TUTAwMS5baV0NCiAgYWRqTFtbNV1dWzIsNF0gPC0gYWRqTFtbNV1dWzQsMl0gPC0gZGF0YTQkYWRqMU41Yi5TUTAwMi5baV0NCiAgYWRqTFtbNV1dWzIsNV0gPC0gYWRqTFtbNV1dWzUsMl0gPC0gZGF0YTQkYWRqMU41Yi5TUTAwMy5baV0NCiAgYWRqTFtbNV1dWzMsNF0gPC0gYWRqTFtbNV1dWzQsM10gPC0gZGF0YTQkYWRqMU41Yy5TUTAwMS5baV0NCiAgYWRqTFtbNV1dWzMsNV0gPC0gYWRqTFtbNV1dWzUsM10gPC0gZGF0YTQkYWRqMU41Yy5TUTAwMi5baV0NCiAgYWRqTFtbNV1dWzQsNV0gPC0gYWRqTFtbNV1dWzUsNF0gPC0gZGF0YTQkYWRqMU41ZC5TUTAwMS5baV0NCiAgfQ0KDQogIGlmKG5uYW1lc19jZG4+MSkgeyAjd2Ugb25seSBrbm93IGFsdGVyLWFsdGVyIHJlbGF0aW9ucyBmb3Igbm5hbWVzPjENCiAgICAjdGFrZSB0aGUgbWF0cml4IGNvcnJlc3BvbmRpbmcgdGhlIG5uYW1lcw0KICAgIG1hdCA8LSBhZGpMW1tubmFtZXNfY2RuXV0NCiAgICANCiAgICAjdGllcyB0aGF0IGFyZSAodmVyeSkgY2xvc2UgYXJlIDENCiAgICBtYXRbIWlzLm5hKG1hdCldIDwtIGlmZWxzZShtYXRbIWlzLm5hKG1hdCldPT0iRXJnIGhlY2h0IiB8IG1hdFshaXMubmEobWF0KV09PSJIZWNodCIsIDEsMCkNCg0KICAgICNjYWxjdWxhdGUgZW1iZWRkZWRuZXNzIGZvciBlYWNoIGFsdGVyL3JvdzoNCiAgICBlbWJlZCA8LSBhcHBseShtYXQsIDEsIGZ1bmN0aW9uKHJvdykgew0KICAgIG5fY29scyA8LSBzdW0oIWlzLm5hKHJvdykpDQogICAgbl9vbmVzIDwtIHN1bShyb3cgPT0gIjEiLCBuYS5ybSA9IFRSVUUpDQogICAgcmF0aW8gPC0gbl9vbmVzIC8gbl9jb2xzDQogICAgcmV0dXJuKHJhdGlvKQ0KICAgIH0pDQogIA0KICAjQ0ROOiAxOm5uYW1lc19DRE4NCiAgYWx0ZXJMW1tpXV0kY2RuX2VtYmVkLnQyWzE6bm5hbWVzX2Nkbl0gPC0gZW1iZWQgDQogIH0NCiAgDQogICNTVFVEWQ0KDQogICNtYWtlIGxpc3Qgb2YgYWRqYWNlbmN5IG1hdHJpY2VzDQogIGFkakwgPC0gbGlzdCgpDQogIHsNCiAgIzIgYWx0ZXJzDQogIGFkakxbWzJdXSA8LSBtYXRyaXgoTkEsbmNvbD0yLG5yb3c9MikNCiAgYWRqTFtbMl1dWzEsMl0gPC0gYWRqTFtbMl1dWzIsMV0gPC0gZGF0YTQkYWRqMk4yYS5TUTAwMS5baV0NCg0KICAjMyBhbHRlcnMNCiAgYWRqTFtbM11dIDwtIG1hdHJpeChOQSxuY29sPTMsbnJvdz0zKQ0KICBhZGpMW1szXV1bMSwyXSA8LSBhZGpMW1szXV1bMiwxXSA8LSBkYXRhNCRhZGoyTjNhLlNRMDAxLltpXQ0KICBhZGpMW1szXV1bMSwzXSA8LSBhZGpMW1szXV1bMywxXSA8LSBkYXRhNCRhZGoyTjNhLlNRMDAyLltpXQ0KICBhZGpMW1szXV1bMiwzXSA8LSBhZGpMW1szXV1bMywyXSA8LSBkYXRhNCRhZGoyTjNiLlNRMDAxLltpXQ0KDQogICM0IGFsdGVycw0KICBhZGpMW1s0XV0gPC0gbWF0cml4KE5BLG5jb2w9NCxucm93PTQpDQogIGFkakxbWzRdXVsxLDJdIDwtIGFkakxbWzRdXVsyLDFdIDwtIGRhdGE0JGFkajJONGEuU1EwMDEuW2ldDQogIGFkakxbWzRdXVsxLDNdIDwtIGFkakxbWzRdXVszLDFdIDwtIGRhdGE0JGFkajJONGEuU1EwMDIuW2ldDQogIGFkakxbWzRdXVsxLDRdIDwtIGFkakxbWzRdXVs0LDFdIDwtIGRhdGE0JGFkajJONGEuU1EwMDMuW2ldDQogIGFkakxbWzRdXVsyLDNdIDwtIGFkakxbWzRdXVszLDJdIDwtIGRhdGE0JGFkajJONGIuU1EwMDEuW2ldDQogIGFkakxbWzRdXVsyLDRdIDwtIGFkakxbWzRdXVs0LDJdIDwtIGRhdGE0JGFkajJONGIuU1EwMDIuW2ldDQogIGFkakxbWzRdXVszLDRdIDwtIGFkakxbWzRdXVs0LDNdIDwtIGRhdGE0JGFkajJONGMuU1EwMDEuW2ldDQoNCiAgIzUgYWx0ZXJzDQogIGFkakxbWzVdXSA8LSBtYXRyaXgoTkEsbmNvbD01LG5yb3c9NSkNCiAgYWRqTFtbNV1dWzEsMl0gPC0gYWRqTFtbNV1dWzIsMV0gPC0gZGF0YTQkYWRqMk41YS5TUTAwMS5baV0NCiAgYWRqTFtbNV1dWzEsM10gPC0gYWRqTFtbNV1dWzMsMV0gPC0gZGF0YTQkYWRqMk41YS5TUTAwMi5baV0NCiAgYWRqTFtbNV1dWzEsNF0gPC0gYWRqTFtbNV1dWzQsMV0gPC0gZGF0YTQkYWRqMk41YS5TUTAwMy5baV0NCiAgYWRqTFtbNV1dWzEsNV0gPC0gYWRqTFtbNV1dWzUsMV0gPC0gZGF0YTQkYWRqMk41YS5TUTAwNC5baV0NCiAgYWRqTFtbNV1dWzIsM10gPC0gYWRqTFtbNV1dWzMsMl0gPC0gZGF0YTQkYWRqMk41Yi5TUTAwMS5baV0NCiAgYWRqTFtbNV1dWzIsNF0gPC0gYWRqTFtbNV1dWzQsMl0gPC0gZGF0YTQkYWRqMk41Yi5TUTAwMi5baV0NCiAgYWRqTFtbNV1dWzIsNV0gPC0gYWRqTFtbNV1dWzUsMl0gPC0gZGF0YTQkYWRqMk41Yi5TUTAwMy5baV0NCiAgYWRqTFtbNV1dWzMsNF0gPC0gYWRqTFtbNV1dWzQsM10gPC0gZGF0YTQkYWRqMk41Yy5TUTAwMS5baV0NCiAgYWRqTFtbNV1dWzMsNV0gPC0gYWRqTFtbNV1dWzUsM10gPC0gZGF0YTQkYWRqMk41Yy5TUTAwMi5baV0NCiAgYWRqTFtbNV1dWzQsNV0gPC0gYWRqTFtbNV1dWzUsNF0gPC0gZGF0YTQkYWRqMk41ZC5TUTAwMS5baV0NCiAgfQ0KDQogIGlmKG5uYW1lc19zdHVkeT4xKSB7ICN3ZSBvbmx5IGtub3cgYWx0ZXItYWx0ZXIgcmVsYXRpb25zIGZvciBubmFtZXMNCiAgICAjdGFrZSB0aGUgbWF0cml4IGNvcnJlc3BvbmRpbmcgdGhlIG5uYW1lcw0KICAgIG1hdCA8LSBhZGpMW1tubmFtZXNfc3R1ZHldXQ0KICAgIA0KICAgICN0aWVzIHRoYXQgYXJlICh2ZXJ5KSBjbG9zZSBhcmUgMQ0KICAgIG1hdFshaXMubmEobWF0KV0gPC0gaWZlbHNlKG1hdFshaXMubmEobWF0KV09PSJFcmcgaGVjaHQiIHwgbWF0WyFpcy5uYShtYXQpXT09IkhlY2h0IiwgMSwwKQ0KDQogICAgI2NhbGN1bGF0ZSBlbWJlZGRlZG5lc3MgZm9yIGVhY2ggYWx0ZXIvcm93Og0KICAgIGVtYmVkIDwtIGFwcGx5KG1hdCwgMSwgZnVuY3Rpb24ocm93KSB7DQogICAgbl9jb2xzIDwtIHN1bSghaXMubmEocm93KSkNCiAgICBuX29uZXMgPC0gc3VtKHJvdyA9PSAiMSIsIG5hLnJtID0gVFJVRSkNCiAgICByYXRpbyA8LSBuX29uZXMgLyBuX2NvbHMNCiAgICByZXR1cm4ocmF0aW8pDQogICAgfSkNCiAgICANCiAgICBhbHRlckxbW2ldXSRzdHVkeV9lbWJlZC50Mls2Oig1K25uYW1lc19zdHVkeSldIDwtIGVtYmVkIA0KICB9DQogIA0KICAjIEJFU1QgRlJJRU5EUw0KICAjbWFrZSBsaXN0IG9mIGFkamFjZW5jeSBtYXRyaWNlcw0KICBhZGpMIDwtIGxpc3QoKQ0KICB7DQogICMyIGFsdGVycw0KICBhZGpMW1syXV0gPC0gbWF0cml4KE5BLG5jb2w9Mixucm93PTIpDQogIGFkakxbWzJdXVsxLDJdIDwtIGFkakxbWzJdXVsyLDFdIDwtIGRhdGE0JGFkajNOMmEuU1EwMDEuW2ldDQoNCiAgIzMgYWx0ZXJzDQogIGFkakxbWzNdXSA8LSBtYXRyaXgoTkEsbmNvbD0zLG5yb3c9MykNCiAgYWRqTFtbM11dWzEsMl0gPC0gYWRqTFtbM11dWzIsMV0gPC0gZGF0YTQkYWRqM04zYS5TUTAwMS5baV0NCiAgYWRqTFtbM11dWzEsM10gPC0gYWRqTFtbM11dWzMsMV0gPC0gZGF0YTQkYWRqM04zYS5TUTAwMi5baV0NCiAgYWRqTFtbM11dWzIsM10gPC0gYWRqTFtbM11dWzMsMl0gPC0gZGF0YTQkYWRqM04zYi5TUTAwMS5baV0NCg0KICAjNCBhbHRlcnMNCiAgYWRqTFtbNF1dIDwtIG1hdHJpeChOQSxuY29sPTQsbnJvdz00KQ0KICBhZGpMW1s0XV1bMSwyXSA8LSBhZGpMW1s0XV1bMiwxXSA8LSBkYXRhNCRhZGozTjRhLlNRMDAxLltpXQ0KICBhZGpMW1s0XV1bMSwzXSA8LSBhZGpMW1s0XV1bMywxXSA8LSBkYXRhNCRhZGozTjRhLlNRMDAyLltpXQ0KICBhZGpMW1s0XV1bMSw0XSA8LSBhZGpMW1s0XV1bNCwxXSA8LSBkYXRhNCRhZGozTjRhLlNRMDAzLltpXQ0KICBhZGpMW1s0XV1bMiwzXSA8LSBhZGpMW1s0XV1bMywyXSA8LSBkYXRhNCRhZGozTjRiLlNRMDAxLltpXQ0KICBhZGpMW1s0XV1bMiw0XSA8LSBhZGpMW1s0XV1bNCwyXSA8LSBkYXRhNCRhZGozTjRiLlNRMDAyLltpXQ0KICBhZGpMW1s0XV1bMyw0XSA8LSBhZGpMW1s0XV1bNCwzXSA8LSBkYXRhNCRhZGozTjRjLlNRMDAxLltpXQ0KDQogICM1IGFsdGVycw0KICBhZGpMW1s1XV0gPC0gbWF0cml4KE5BLG5jb2w9NSxucm93PTUpDQogIGFkakxbWzVdXVsxLDJdIDwtIGFkakxbWzVdXVsyLDFdIDwtIGRhdGE0JGFkajNONWEuU1EwMDEuW2ldDQogIGFkakxbWzVdXVsxLDNdIDwtIGFkakxbWzVdXVszLDFdIDwtIGRhdGE0JGFkajNONWEuU1EwMDIuW2ldDQogIGFkakxbWzVdXVsxLDRdIDwtIGFkakxbWzVdXVs0LDFdIDwtIGRhdGE0JGFkajNONWEuU1EwMDMuW2ldDQogIGFkakxbWzVdXVsxLDVdIDwtIGFkakxbWzVdXVs1LDFdIDwtIGRhdGE0JGFkajNONWEuU1EwMDQuW2ldDQogIGFkakxbWzVdXVsyLDNdIDwtIGFkakxbWzVdXVszLDJdIDwtIGRhdGE0JGFkajNONWIuU1EwMDEuW2ldDQogIGFkakxbWzVdXVsyLDRdIDwtIGFkakxbWzVdXVs0LDJdIDwtIGRhdGE0JGFkajNONWIuU1EwMDIuW2ldDQogIGFkakxbWzVdXVsyLDVdIDwtIGFkakxbWzVdXVs1LDJdIDwtIGRhdGE0JGFkajNONWIuU1EwMDMuW2ldDQogIGFkakxbWzVdXVszLDRdIDwtIGFkakxbWzVdXVs0LDNdIDwtIGRhdGE0JGFkajNONWMuU1EwMDEuW2ldDQogIGFkakxbWzVdXVszLDVdIDwtIGFkakxbWzVdXVs1LDNdIDwtIGRhdGE0JGFkajNONWMuU1EwMDIuW2ldDQogIGFkakxbWzVdXVs0LDVdIDwtIGFkakxbWzVdXVs1LDRdIDwtIGRhdGE0JGFkajNONWQuU1EwMDEuW2ldDQogIH0NCg0KICBpZihubmFtZXNfYmZmPjEpIHsgI3dlIG9ubHkga25vdyBhbHRlci1hbHRlciByZWxhdGlvbnMgZm9yIG5uYW1lcw0KICAgICN0YWtlIHRoZSBtYXRyaXggY29ycmVzcG9uZGluZyB0aGUgbm5hbWVzDQogICAgbWF0IDwtIGFkakxbW25uYW1lc19iZmZdXQ0KICAgIA0KICAgICN0aWVzIHRoYXQgYXJlICh2ZXJ5KSBjbG9zZSBhcmUgMQ0KICAgIG1hdFshaXMubmEobWF0KV0gPC0gaWZlbHNlKG1hdFshaXMubmEobWF0KV09PSJFcmcgaGVjaHQiIHwgbWF0WyFpcy5uYShtYXQpXT09IkhlY2h0IiwgMSwwKQ0KDQogICAgI2NhbGN1bGF0ZSBlbWJlZGRlZG5lc3MgZm9yIGVhY2ggYWx0ZXIvcm93Og0KICAgIGVtYmVkIDwtIGFwcGx5KG1hdCwgMSwgZnVuY3Rpb24ocm93KSB7DQogICAgbl9jb2xzIDwtIHN1bSghaXMubmEocm93KSkNCiAgICBuX29uZXMgPC0gc3VtKHJvdyA9PSAiMSIsIG5hLnJtID0gVFJVRSkNCiAgICByYXRpbyA8LSBuX29uZXMgLyBuX2NvbHMNCiAgICByZXR1cm4ocmF0aW8pDQogICAgfSkNCiAgICANCiAgICBhbHRlckxbW2ldXSRiZmZfZW1iZWQudDJbMTE6KDEwK25uYW1lc19iZmYpXSA8LSBlbWJlZCANCiAgfQ0KICANCiAgIyBTUE9SVFMgUEFSVE5FUlMNCiAgI21ha2UgbGlzdCBvZiBhZGphY2VuY3kgbWF0cmljZXMNCiAgYWRqTCA8LSBsaXN0KCkNCiAgew0KICAjMiBhbHRlcnMNCiAgYWRqTFtbMl1dIDwtIG1hdHJpeChOQSxuY29sPTIsbnJvdz0yKQ0KICBhZGpMW1syXV1bMSwyXSA8LSBhZGpMW1syXV1bMiwxXSA8LSBkYXRhNCRhZGo0TjJhLlNRMDAxLltpXQ0KDQogICMzIGFsdGVycw0KICBhZGpMW1szXV0gPC0gbWF0cml4KE5BLG5jb2w9Myxucm93PTMpDQogIGFkakxbWzNdXVsxLDJdIDwtIGFkakxbWzNdXVsyLDFdIDwtIGRhdGE0JGFkajROM2EuU1EwMDEuW2ldDQogIGFkakxbWzNdXVsxLDNdIDwtIGFkakxbWzNdXVszLDFdIDwtIGRhdGE0JGFkajROM2EuU1EwMDIuW2ldDQogIGFkakxbWzNdXVsyLDNdIDwtIGFkakxbWzNdXVszLDJdIDwtIGRhdGE0JGFkajROM2IuU1EwMDEuW2ldDQoNCiAgIzQgYWx0ZXJzDQogIGFkakxbWzRdXSA8LSBtYXRyaXgoTkEsbmNvbD00LG5yb3c9NCkNCiAgYWRqTFtbNF1dWzEsMl0gPC0gYWRqTFtbNF1dWzIsMV0gPC0gZGF0YTQkYWRqNE40YS5TUTAwMS5baV0NCiAgYWRqTFtbNF1dWzEsM10gPC0gYWRqTFtbNF1dWzMsMV0gPC0gZGF0YTQkYWRqNE40YS5TUTAwMi5baV0NCiAgYWRqTFtbNF1dWzEsNF0gPC0gYWRqTFtbNF1dWzQsMV0gPC0gZGF0YTQkYWRqNE40YS5TUTAwMy5baV0NCiAgYWRqTFtbNF1dWzIsM10gPC0gYWRqTFtbNF1dWzMsMl0gPC0gZGF0YTQkYWRqNE40Yi5TUTAwMS5baV0NCiAgYWRqTFtbNF1dWzIsNF0gPC0gYWRqTFtbNF1dWzQsMl0gPC0gZGF0YTQkYWRqNE40Yi5TUTAwMi5baV0NCiAgYWRqTFtbNF1dWzMsNF0gPC0gYWRqTFtbNF1dWzQsM10gPC0gZGF0YTQkYWRqNE40Yy5TUTAwMS5baV0NCg0KICAjNSBhbHRlcnMNCiAgYWRqTFtbNV1dIDwtIG1hdHJpeChOQSxuY29sPTUsbnJvdz01KQ0KICBhZGpMW1s1XV1bMSwyXSA8LSBhZGpMW1s1XV1bMiwxXSA8LSBkYXRhNCRhZGo0TjVhLlNRMDAxLltpXQ0KICBhZGpMW1s1XV1bMSwzXSA8LSBhZGpMW1s1XV1bMywxXSA8LSBkYXRhNCRhZGo0TjVhLlNRMDAyLltpXQ0KICBhZGpMW1s1XV1bMSw0XSA8LSBhZGpMW1s1XV1bNCwxXSA8LSBkYXRhNCRhZGo0TjVhLlNRMDAzLltpXQ0KICBhZGpMW1s1XV1bMSw1XSA8LSBhZGpMW1s1XV1bNSwxXSA8LSBkYXRhNCRhZGo0TjVhLlNRMDA0LltpXQ0KICBhZGpMW1s1XV1bMiwzXSA8LSBhZGpMW1s1XV1bMywyXSA8LSBkYXRhNCRhZGo0TjViLlNRMDAxLltpXQ0KICBhZGpMW1s1XV1bMiw0XSA8LSBhZGpMW1s1XV1bNCwyXSA8LSBkYXRhNCRhZGo0TjViLlNRMDAyLltpXQ0KICBhZGpMW1s1XV1bMiw1XSA8LSBhZGpMW1s1XV1bNSwyXSA8LSBkYXRhNCRhZGo0TjViLlNRMDAzLltpXQ0KICBhZGpMW1s1XV1bMyw0XSA8LSBhZGpMW1s1XV1bNCwzXSA8LSBkYXRhNCRhZGo0TjVjLlNRMDAxLltpXQ0KICBhZGpMW1s1XV1bMyw1XSA8LSBhZGpMW1s1XV1bNSwzXSA8LSBkYXRhNCRhZGo0TjVjLlNRMDAyLltpXQ0KICBhZGpMW1s1XV1bNCw1XSA8LSBhZGpMW1s1XV1bNSw0XSA8LSBkYXRhNCRhZGo0TjVkLlNRMDAxLltpXQ0KICB9DQoNCiAgaWYobm5hbWVzX2Nzbj4xKSB7ICN3ZSBvbmx5IGtub3cgYWx0ZXItYWx0ZXIgcmVsYXRpb25zIGZvciBubmFtZXMNCiAgICAjdGFrZSB0aGUgbWF0cml4IGNvcnJlc3BvbmRpbmcgdGhlIG5uYW1lcw0KICAgIG1hdCA8LSBhZGpMW1tubmFtZXNfY3NuXV0NCiAgICANCiAgICAjdGllcyB0aGF0IGFyZSAodmVyeSkgY2xvc2UgYXJlIDENCiAgICBtYXRbIWlzLm5hKG1hdCldIDwtIGlmZWxzZShtYXRbIWlzLm5hKG1hdCldPT0iRXJnIGhlY2h0IiB8IG1hdFshaXMubmEobWF0KV09PSJIZWNodCIsIDEsMCkNCg0KICAgICNjYWxjdWxhdGUgZW1iZWRkZWRuZXNzIGZvciBlYWNoIGFsdGVyL3JvdzoNCiAgICBlbWJlZCA8LSBhcHBseShtYXQsIDEsIGZ1bmN0aW9uKHJvdykgew0KICAgIG5fY29scyA8LSBzdW0oIWlzLm5hKHJvdykpDQogICAgbl9vbmVzIDwtIHN1bShyb3cgPT0gIjEiLCBuYS5ybSA9IFRSVUUpDQogICAgcmF0aW8gPC0gbl9vbmVzIC8gbl9jb2xzDQogICAgcmV0dXJuKHJhdGlvKQ0KICAgIH0pDQogICAgDQogICAgYWx0ZXJMW1tpXV0kY3NuX2VtYmVkLnQyWzE2OigxNStubmFtZXNfY3NuKV0gPC0gZW1iZWQgDQogIH0NCn0NCg0KI2FsdGVycyBjb3VsZCBiZSBuYW1lZCBpbiBtdWx0aXBsZSBuYW1lIGdlbmVyYXRvcnMuIGVhY2ggZWxlbWVudCBvZiBhbHRlckwgY29udGFpbnMgcm93cyBjb3JyZXNwb25kaW5nIHRvIGFsdGVycyB0aGF0IG1heSBiZSAnZHVwbGljYXRlcycuDQojaSBtYXRjaCB0aGUgc3RydWN0dXJhbCBlbWJlZGRlZG5lc3MgbWVhc3VyZXMNCg0KZm9yIChpIGluIDE6bGVuZ3RoKGFsdGVyTCkpIHsgI2ZvciBlZ28gaSANCiAgZm9yIChqIGluIDE6bnJvdyhhbHRlckxbW2ldXSkpIHsgI2ZvciBhbHRlciBqDQogICAgICAgIA0KICAgICNpZiBuYW1lMiBpcyBub3QgZW1wdHksIGFsdGVyIGogd2FzIG1hdGNoZWQgdG8gdGhlIHN0dWR5IG5ldHdvcms7IGFuZCBtb3JlIHByZWNpc2VseSwgdG8gdGhlIHN0dWR5IHBhcnRuZXIgd2l0aCBuYW1lMTogYWx0ZXJMW1tpXV0kbmFtZTJbal0NCiAgICBhbHRlckxbW2ldXSRzdHVkeV9lbWJlZC50MltqXSA8LSBpZmVsc2UoIWlzLm5hKGFsdGVyTFtbaV1dJG5hbWUyW2pdKSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsdGVyTFtbaV1dJHN0dWR5X2VtYmVkLnQyW3doaWNoKGFsdGVyTFtbaV1dJG5hbWUxPT1hbHRlckxbW2ldXSRuYW1lMltqXSAmICFpcy5uYShhbHRlckxbW2ldXSRzdHVkeV9lbWJlZC50MikpXSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWx0ZXJMW1tpXV0kc3R1ZHlfZW1iZWQudDJbal0pDQogICAgDQogICAgI2lmIG5hbWUzIGlzIG5vdCBlbXB0eSwgYWx0ZXIgaiB3YXMgbWF0Y2hlZCB0byB0aGUgZnJpZW5kcyBuZXR3b3JrOyBhbmQgbW9yZSBwcmVjaXNlbHksIHRvIHRoZSBmcmllbmQgd2l0aCBuYW1lMTogYWx0ZXJMW1tpXV0kbmFtZTNbal0NCiAgICBhbHRlckxbW2ldXSRiZmZfZW1iZWQudDJbal0gPC0gaWZlbHNlKCFpcy5uYShhbHRlckxbW2ldXSRuYW1lM1tqXSksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWx0ZXJMW1tpXV0kYmZmX2VtYmVkLnQyW3doaWNoKGFsdGVyTFtbaV1dJG5hbWUxPT1hbHRlckxbW2ldXSRuYW1lM1tqXSAmICFpcy5uYShhbHRlckxbW2ldXSRiZmZfZW1iZWQudDIpKV0sDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHRlckxbW2ldXSRiZmZfZW1iZWQudDJbal0pDQogICAgDQogICAgI2lmIG5hbWU0IGlzIG5vdCBlbXB0eSwgYWx0ZXIgaiB3YXMgbWF0Y2hlZCB0byB0aGUgc3BvcnRzIG5ldHdvcms7IGFuZCBtb3JlIHByZWNpc2VseSwgdG8gdGhlIHNwb3J0cyBwYXJ0bmVyIHdpdGggbmFtZTE6IGFsdGVyTFtbaV1dJG5hbWU0W2pdDQogICAgYWx0ZXJMW1tpXV0kY3NuX2VtYmVkLnQyW2pdIDwtIGlmZWxzZSghaXMubmEoYWx0ZXJMW1tpXV0kbmFtZTRbal0pLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsdGVyTFtbaV1dJGNzbl9lbWJlZC50Mlt3aGljaChhbHRlckxbW2ldXSRuYW1lMT09YWx0ZXJMW1tpXV0kbmFtZTRbal0gJiAhaXMubmEoYWx0ZXJMW1tpXV0kY3NuX2VtYmVkLnQyKSldLCAgICAgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHRlckxbW2ldXSRjc25fZW1iZWQudDJbal0gKQ0KICB9DQp9DQoNCiMgbWFrZSBsb25nIGRmIHdpdGggYWx0ZXJzIGluIGVnbywNCiMgYW5kIGluZGljYXRvcnMgZm9yIDQgZWdvbmV0czsNCmRmMiA8LSBkYXRhLmZyYW1lKA0KICBlZ289cmVwKDE6bGVuZ3RoKGFsdGVyTCksZWFjaD0yMCksYWx0ZXI9cmVwKDE6MjApLGNkbj1OQSwgc3R1ZHk9TkEsYmZmPU5BLGNzbj1OQSwNCiAgY2RuX2VtYmVkLnQyPU5BLCBzdHVkeV9lbWJlZC50Mj1OQSwgYmZmX2VtYmVkLnQyPU5BLCBjc25fZW1iZWQudDI9TkEpDQoNCmZvciAoaSBpbiB1bmlxdWUoZGYyJGVnbykpIHsgIA0KICAgICAgZm9yIChqIGluIDE6MjApIHsgIyBmb3IgYWx0ZXJzIG5lc3RlZCBpbiBlZ28NCiAgICAgICAgICAgICAgICAgDQogICAgICAgICMgZmluZCBvdXQgaWYgbmFtZXMgZGVub3RpbmcgYWx0ZXIgaiBhcHBlYXIgaW4gdGhlIDQgZWdvbmV0cw0KICAgICAgICBhbHRlciA8LSB1bmxpc3QoYWx0ZXJMW1tpXV1baixjKDI6NSldLCB1c2UubmFtZXMgPSBGQUxTRSkNCiAgICAgICAgYWx0ZXIgPC0gYWx0ZXJbIWlzLm5hKGFsdGVyKV0gIyBleGNsdWRlIE5Bcw0KICAgICAgICANCiAgICAgICAgY2RuIDwtIGFsdGVyICVpbiUgbmV0MVtpLF0NCiAgICAgICAgc3R1ZHkgPC0gYWx0ZXIgJWluJSBuZXQyW2ksXQ0KICAgICAgICBiZmYgPC0gYWx0ZXIgJWluJSBuZXQzW2ksXQ0KICAgICAgICBjc24gPC0gYWx0ZXIgJWluJSBuZXQ0W2ksXQ0KICAgICAgICANCiAgICAgICAgIyBhbmQgaWYgc28sIGdpdmUgYWx0ZXIgaiBzY29yZSAxIG9uIGluZGljYXRvcnM7IDAgb3RoZXJ3aXNlDQogICAgICAgIGRmMiRjZG5bd2hpY2goZGYyJGVnbz09aSAmIGRmMiRhbHRlcj09aildIDwtIGlmZWxzZSgiVFJVRSIgJWluJSBjZG4sIDEsIDApDQogICAgICAgIGRmMiRzdHVkeVt3aGljaChkZjIkZWdvPT1pICYgZGYyJGFsdGVyPT1qKV0gPC0gaWZlbHNlKCJUUlVFIiAlaW4lIHN0dWR5LCAxLCAwKQ0KICAgICAgICBkZjIkYmZmW3doaWNoKGRmMiRlZ289PWkgJiBkZjIkYWx0ZXI9PWopXSA8LSBpZmVsc2UoIlRSVUUiICVpbiUgYmZmLCAxLCAwKQ0KICAgICAgICBkZjIkY3NuW3doaWNoKGRmMiRlZ289PWkgJiBkZjIkYWx0ZXI9PWopXSA8LSBpZmVsc2UoIlRSVUUiICVpbiUgY3NuLCAxLCAwKQ0KICAgICAgICANCiAgICAgICAgI2FuZCBhdHRhY2ggZW1iZWRkZWRuZXNzIHQyIHNjb3Jlcw0KICAgICAgICBkZjIkY2RuX2VtYmVkLnQyW3doaWNoKGRmMiRlZ289PWkgJiBkZjIkYWx0ZXI9PWopXSA8LSBhbHRlckxbW2ldXSRjZG5fZW1iZWQudDJbal0NCiAgICAgICAgZGYyJHN0dWR5X2VtYmVkLnQyW3doaWNoKGRmMiRlZ289PWkgJiBkZjIkYWx0ZXI9PWopXSA8LSBhbHRlckxbW2ldXSRzdHVkeV9lbWJlZC50MltqXQ0KICAgICAgICBkZjIkYmZmX2VtYmVkLnQyW3doaWNoKGRmMiRlZ289PWkgJiBkZjIkYWx0ZXI9PWopXSA8LSBhbHRlckxbW2ldXSRiZmZfZW1iZWQudDJbal0NCiAgICAgICAgZGYyJGNzbl9lbWJlZC50Mlt3aGljaChkZjIkZWdvPT1pICYgZGYyJGFsdGVyPT1qKV0gPC0gYWx0ZXJMW1tpXV0kY3NuX2VtYmVkLnQyW2pdDQogICAgICB9DQp9DQoNCiMgbm93IHRoYXQgaSBoYXZlLCBmb3IgZWFjaCBhbHRlciBvZiBlZ28gKGluY2x1ZGluZyBkdXBsaWNhdGVzKSBhdCB0MiwNCiMgdGhlIG5ldHMgdG8gd2hpY2ggdGhleSBiZWxvbmcuLg0KIyBpIGNvbnRpbnVlIHdpdGggdGhlIHcxLXcyIG1hdGNoaW5nIG1hdHJpY2VzDQoNCiMgd2UgYWxyZWFkeSBzdWJzZXR0ZWQgdGhlIG1hdGNoaW5nIG1hdHJpY2VzIChpbiBgdzF3MmApDQpmb3IgKGkgaW4gdW5pcXVlKGRmJGVnbykpIHsgICMgZm9yIGVnbyBpDQogIA0KICBtYXRjaGluZ0wgPC0gdmVjdG9yKCJsaXN0IiwgMjApICNwcmUtYWxsb2NhdGUgZW1wdHkgbGlzdCBvZiBsZW5ndGggMTUsIHRvIHN0b3JlIG1hdGNoaW5nIG1hdHJpY2VzDQogIHsNCiAgICBtYXRjaGluZ0xbWzFdXSA8LSB3MXcyW2ksMToyMF0NCiAgICBtYXRjaGluZ0xbWzJdXSA8LSB3MXcyW2ksMjE6NDBdDQogICAgbWF0Y2hpbmdMW1szXV0gPC0gdzF3MltpLDQxOjYwXQ0KICAgIG1hdGNoaW5nTFtbNF1dIDwtIHcxdzJbaSw2MTo4MF0NCiAgICBtYXRjaGluZ0xbWzVdXSA8LSB3MXcyW2ksODE6MTAwXQ0KICAgIG1hdGNoaW5nTFtbNl1dIDwtIHcxdzJbaSwxMDE6MTIwXQ0KICAgIG1hdGNoaW5nTFtbN11dIDwtIHcxdzJbaSwxMjE6MTQwXQ0KICAgIG1hdGNoaW5nTFtbOF1dIDwtIHcxdzJbaSwxNDE6MTYwXQ0KICAgIG1hdGNoaW5nTFtbOV1dIDwtIHcxdzJbaSwxNjE6MTgwXQ0KICAgIG1hdGNoaW5nTFtbMTBdXSA8LSB3MXcyW2ksMTgxOjIwMF0NCiAgICBtYXRjaGluZ0xbWzExXV0gPC0gdzF3MltpLDIwMToyMjBdDQogICAgbWF0Y2hpbmdMW1sxMl1dIDwtIHcxdzJbaSwyMjE6MjQwXQ0KICAgIG1hdGNoaW5nTFtbMTNdXSA8LSB3MXcyW2ksMjQxOjI2MF0NCiAgICBtYXRjaGluZ0xbWzE0XV0gPC0gdzF3MltpLDI2MToyODBdDQogICAgbWF0Y2hpbmdMW1sxNV1dIDwtIHcxdzJbaSwyODE6MzAwXQ0KICAgIG1hdGNoaW5nTFtbMTZdXSA8LSB3MXcyW2ksMzAxOjMyMF0NCiAgICBtYXRjaGluZ0xbWzE3XV0gPC0gdzF3MltpLDMyMTozNDBdDQogICAgbWF0Y2hpbmdMW1sxOF1dIDwtIHcxdzJbaSwzNDE6MzYwXQ0KICAgIG1hdGNoaW5nTFtbMTldXSA8LSB3MXcyW2ksMzYxOjM4MF0NCiAgICBtYXRjaGluZ0xbWzIwXV0gPC0gdzF3MltpLDM4MTo0MDBdDQogIH0NCiAgDQogICNmaW5kIHRoZSAncmlnaHQnIG1hdGNoaW5nIG1hdHJpeCBpbiB0aGlzIGxpc3QsIGJ5IHRha2luZyB0aGUgb25lIHRoYXQgY29udGFpbnMgYW5zd2Vycw0KICBpbmQgPC0gTlVMTA0KICBmb3IgKGogaW4gc2VxX2Fsb25nKG1hdGNoaW5nTCkpIHsNCiAgICAjY2hlY2sgYWxvbmcgdGhlIHNlcXVlbmNlIG9mIGVsZW1lbnRzIGogaW4gdGhlIG1hdGNoaW5nIG1hdHJpeCBsaXN0IGlmIHRoZXkgYXJlIG5vbi1lbXB0eSBhbmQgbm90IE5BDQogICAgY2hlY2sgPC0gRkFMU0UNCiAgICBmb3IgKGNvbCBpbiBtYXRjaGluZ0xbW2pdXSkgew0KICAgICAgaWYgKCFhbGwoaXMubmEoY29sKSkgJiYgYW55KG5jaGFyKGNvbCkgPiAwKSkgew0KICAgICAgICBjaGVjayA8LSBUUlVFDQogICAgICAgIGJyZWFrICANCiAgICAgIH0NCiAgICAgIH0NCiAgICBpZiAoY2hlY2spIHsNCiAgICAgIGluZCA8LSBqDQogICAgICBicmVhayAgDQogICAgfQ0KICB9DQogIA0KICBpZihsZW5ndGgoaW5kKT4wKSB7DQogICAgIyBnZXQgdGhlICBjb3JyZXNwb25kaW5nIG1hdHJpeA0KICAgIG1tIDwtIG1hdGNoaW5nTFtbaW5kXV0NCiAgICANCiAgICAjIGV4dHJhY3QgYWx0ZXIgaWRzDQogICAgYW5zIDwtIHN0cmluZ3I6OnN0cl9leHRyYWN0X2FsbChtbSwiXFwoP1swLTksLl0rXFwpPyIpIA0KICAgICMgaGVyZSwgdGhlIG9iamVjdCByZWZlcnMgdG8gdGhlIHcxLWFsdGVyIGo7DQogICAgIyBhbmQgdGhlIGVsZW1lbnQgaW5kaWNhdG9yIGluIHRoZSBsaXN0IHJlZmVycyB0byB0aGUgdzItYWx0ZXIgDQogICAgDQogICAgZm9yIChqIGluIHVuaXF1ZShkZiRhbHRlcmlkW3doaWNoKGRmJGVnbz09aSldKSkgeyAjIGZvciB3MS1hbHRlciBqLA0KICAgICAgDQogICAgICAjIHRvIHdoaWNoIHJvdy93Mi1hbHRlciB3YXMgYWx0ZXIgaiBtYXRjaGVkPw0KICAgICAgbWF0Y2ggPC0gd2hpY2goYW5zPT1qKQ0KICAgICAgIyBhbmQgaW4gd2hpY2ggbmV0d29ya3MgZGlkIHRoaXMgdzItYWx0ZXIgYmVsb25nPw0KICAgICAgbmV0cyA8LSBkZjJbd2hpY2goZGYyJGVnbz09aSAmIGRmMiRhbHRlcj09bWF0Y2hbMV0pLF0gI2FkZCBbMV0gdG8gbWF0Y2gsIGZvciB0aGUgZmV3IGNhc2VzIHdoZXJlIG11bHRpcGxlIHcyLWFsdGVycyB3ZXJlIG1hdGNoZWQgdG8gdGhlIHNhbWUgdzEtYWx0ZXIgKGkuZS4sIHdoZW4gZWdvIGRpZCBub3QgY29ycmVjbHR5IHBlcmZvcm0gbWF0Y2ggdzIgYWx0ZXJzIHRvIGVhY2ggb3RoZXIuKQ0KICAgIA0KICAgIGlmKGxlbmd0aChtYXRjaCk+MCkgeyAjIGlmIGogd2FzIG1hdGNoZWQgdG8gdzItYWx0ZXJzLi4uDQogICAgICAjIGFzc2lnbiB0byBhbHRlciBqIHRoZSBuZXR3b3JrcyBpbiB3aGljaCBqIHJlYXBwZWFyZWQNCiAgICAgIGRmJGNkbjJbd2hpY2goZGYkZWdvPT1pICYgZGYkYWx0ZXJpZD09aildIDwtIG5ldHMkY2RuWzFdDQogICAgICBkZiRzdHVkeTJbd2hpY2goZGYkZWdvPT1pICYgZGYkYWx0ZXJpZD09aildIDwtIG5ldHMkc3R1ZHlbMV0NCiAgICAgIGRmJGJmZjJbd2hpY2goZGYkZWdvPT1pICYgZGYkYWx0ZXJpZD09aildIDwtIG5ldHMkYmZmWzFdDQogICAgICBkZiRjc24yW3doaWNoKGRmJGVnbz09aSAmIGRmJGFsdGVyaWQ9PWopXSA8LSBuZXRzJGNzblsxXQ0KICAgICAgDQogICAgICAjYW5kIGF0dGFjaCB0aGVpciB0MiBlbWJlZGRlZG5lcyBzY29yZQ0KICAgICAgZGYkY2RuX2VtYmVkLnQyW3doaWNoKGRmJGVnbz09aSAmIGRmJGFsdGVyaWQ9PWopXSA8LSBuZXRzJGNkbl9lbWJlZC50MlsxXQ0KICAgICAgZGYkc3R1ZHlfZW1iZWQudDJbd2hpY2goZGYkZWdvPT1pICYgZGYkYWx0ZXJpZD09aildIDwtIG5ldHMkc3R1ZHlfZW1iZWQudDJbMV0NCiAgICAgIGRmJGJmZl9lbWJlZC50Mlt3aGljaChkZiRlZ289PWkgJiBkZiRhbHRlcmlkPT1qKV0gPC0gbmV0cyRiZmZfZW1iZWQudDJbMV0NCiAgICAgIGRmJGNzbl9lbWJlZC50Mlt3aGljaChkZiRlZ289PWkgJiBkZiRhbHRlcmlkPT1qKV0gPC0gbmV0cyRjc25fZW1iZWQudDJbMV0NCiAgICB9DQogIH0NCiAgfQ0KfQ0KDQojIGN1cnJlbnRseTsgYSBsb3Qgb2YgTkFzIGluIHRoZSBhdHRyaWJ1dGVzIGluZGljYXRpbmcgd2hldGhlciBhbHRlciBqIHdhcyBtZW1iZXIgb2YgdGhlIHJlc3BlY3RpdmUgbmV0d29ya3MuDQojIHRob3NlIGFyZSBhbHRlcnMgdGhhdCB3ZXJlIG5vdCByZW5hbWVkLCBhbmQgdGh1cyBoYXZlIG5vICdjaGFuY2UnIHRvIHJlLWFwcGVhci4gc28sIDBzIGFyZSBhbHRlcnMgdGhhdCB3ZXJlIG9uY2UgcGFydCBvZiBhIHNwZWNpZmljIG5ldHdvcmssIGJ1dCByZS1hcHBlYXJlZCBub3QgaW4gdGhhdCBwYXJ0aWN1bGFyIG5ldHdvcmsuDQojIG5hdHVyYWxseSwgZm9yIGFuYWx5c2VzLCBOQXMgY2FuIGJlIHNldCB0byAwLg0KDQojIGFzIGEgc2Vjb25kIHRpZSBjaGFuZ2UgaW5kaWNhdG9yLCBpIGxvb2sgYXQgd2hldGhlciAodW4tbGlzdGVkKSBhbHRlcnMgYW5kIGVnbyB3ZXJlIHN0aWxsIGluIHRvdWNoDQpkZiRmcmVxdWVuY3kudDIgPC0gTkENCmRmJGNsb3NlbmVzcy50MiA8LSBOQQ0KDQojIHN1YnNldCB3MiBuYW1lIGludGVycHJldGVycyBvbiBjb250YWN0IGZyZXEuIG9mIHcxIGFsdGVycyAoc3EwMjEgLSBzcTA0MCEpDQpmcmVxIDwtIGRhdGE0WyxjKDExNzY6MTE5NSldDQojIGFsc28gY2xvc2VuZXNzDQpjbG9zZSA8LSBkYXRhNFssYygxMjE2OjEyMzUpXQ0KDQojIHJlY29kZSBpbnRvIG51bWVyaWMgdmFsdWVzOw0KZnJlcSA8LSBpZmVsc2UoZnJlcT09IihCaWpuYSkgZWxrZSBkYWciLDcsDQogICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShmcmVxPT0iMS0yIGtlZXIgcGVyIHdlZWsiLDYsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZnJlcT09IkFhbnRhbCBrZWVyIHBlciBtYWFuZCIsNSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGZyZXE9PSJPbmcuIDEga2VlciBwZXIgbWFhbmQiLDQsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZnJlcT09IkFhbnRhbCBrZWVyIHBlciBqYWFyIiwzLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGZyZXE9PSJPbmcuIDEga2VlciBwZXIgamFhciIsMiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZnJlcT09Ik5vb2l0IiwxLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5BICAgKSkpKSkpKQ0KY2xvc2UgPC0gaWZlbHNlKGNsb3NlPT0iSGVlbCBlcmcgaGVjaHQiLCA0LCBpZmVsc2UoY2xvc2U9PSJIZWNodCIsIDMsIGlmZWxzZShjbG9zZT09IkVuaWdzemlucyBoZWNodCIsMiwgaWZlbHNlKGNsb3NlPT0iTmlldCBoZWNodCIsIDEsIE5BKSkpKQ0KDQpmb3IgKGkgaW4gdW5pcXVlKGRmJGVnbykpIHsNCiAgZm9yIChqIGluIHVuaXF1ZShkZiRhbHRlcmlkW3doaWNoKGRmJGVnbz09aSldKSkgew0KICAgIGRmJGZyZXF1ZW5jeS50Mlt3aGljaChkZiRlZ289PWkgJiBkZiRhbHRlcmlkPT1qKV0gPC0gZnJlcVtpLF1bIWlzLm5hKGZyZXFbaSxdKV1bal0NCiAgICBkZiRjbG9zZW5lc3MudDJbd2hpY2goZGYkZWdvPT1pICYgZGYkYWx0ZXJpZD09aildIDwtIGNsb3NlW2ksXVshaXMubmEoY2xvc2VbaSxdKV1bal0NCiAgfQ0KfQ0KDQojIHNpemUgb2YgZWFjaCBlZ29uZXQgYXQgdDINCmRmJGNkbi5zaXplMiA8LSBOQQ0KZGYkc3R1ZHkuc2l6ZTIgPC0gTkENCmRmJGJmZi5zaXplMiA8LSBOQQ0KZGYkY3NuLnNpemUyIDwtIE5BDQoNCmZvciAoaSBpbiB1bmlxdWUoZGYkZWdvKSkgew0KICBkZiRjZG4uc2l6ZTJbd2hpY2goZGYkZWdvPT1pKV0gPC0gcm93U3VtcyhjYmluZChkYXRhNCRlZ29uZXQxLlNRMDAxLltpXSxkYXRhNCRlZ29uZXQxLlNRMDAyLltpXSxkYXRhNCRlZ29uZXQxLlNRMDAzLltpXSxkYXRhNCRlZ29uZXQxLlNRMDA0LltpXSxkYXRhNCRlZ29uZXQxLlNRMDA1LltpXSkhPSIiKQ0KICAgIGRmJHN0dWR5LnNpemUyW3doaWNoKGRmJGVnbz09aSldIDwtIHJvd1N1bXMoY2JpbmQoZGF0YTQkZWdvbmV0Mi5TUTAwMS5baV0sZGF0YTQkZWdvbmV0Mi5TUTAwMi5baV0sZGF0YTQkZWdvbmV0Mi5TUTAwMy5baV0sZGF0YTQkZWdvbmV0Mi5TUTAwNC5baV0sZGF0YTQkZWdvbmV0Mi5TUTAwNS5baV0pIT0iIikNCiAgICBkZiRiZmYuc2l6ZTJbd2hpY2goZGYkZWdvPT1pKV0gPC0gcm93U3VtcyhjYmluZChkYXRhNCRlZ29uZXQzLlNRMDAxLltpXSxkYXRhNCRlZ29uZXQzLlNRMDAyLltpXSxkYXRhNCRlZ29uZXQzLlNRMDAzLltpXSxkYXRhNCRlZ29uZXQzLlNRMDA0LltpXSxkYXRhNCRlZ29uZXQzLlNRMDA1LltpXSkhPSIiKQ0KICAgIGRmJGNzbi5zaXplMlt3aGljaChkZiRlZ289PWkpXSA8LSByb3dTdW1zKGNiaW5kKGRhdGE0JGVnb25ldDQuU1EwMDEuW2ldLGRhdGE0JGVnb25ldDQuU1EwMDIuW2ldLGRhdGE0JGVnb25ldDQuU1EwMDMuW2ldLGRhdGE0JGVnb25ldDQuU1EwMDQuW2ldLGRhdGE0JGVnb25ldDQuU1EwMDUuW2ldKSE9IiIpIH0NCg0KI2FuZCBkZW5zaXR5IGF0IHQyLg0KZGYkY2RuLmRlbnNpdHkyIDwtIGRmJHN0dWR5LmRlbnNpdHkyIDwtIGRmJGNzbi5kZW5zaXR5MiA8LSBkZiRiZmYuZGVuc2l0eTIgPC0gTkENCg0KZm9yIChpIGluIHVuaXF1ZShkZiRlZ28pKSB7DQogICNhLiBDRE4NCiAgc2l6ZSA8LSBkZiRjZG4uc2l6ZTJbd2hpY2goZGYkZWdvPT1pKV1bMV0NCiAgI25vLiBwb3NzaWJsZSB0aWVzIGJldHdlZW4gYWx0ZXJzDQogIHBvcyA8LSBpZmVsc2Uoc2l6ZT09MiwgMSwgaWZlbHNlKHNpemU9PTMsIDMsIGlmZWxzZShzaXplPT00LCA2LCBpZmVsc2Uoc2l6ZT09NSwgMTAsIDApKSkpDQogICNnZXQgbm8uIG9mIG9ic2VydmVkIHRpZXMNCiAgI29ubHkgaWYgZWdvIG5hbWVkIGF0IGxlYXN0IDIgYWx0ZXJzIGluIHRoaXMgbmFtZSBnZW5lcmF0b3INCiAgI2JlY2F1c2Ugb25seSB0aGVuIGkgY2FuIGNhbGN1bGF0ZSBkZW5zaXR5DQogIGlmKHNpemU+MSkgew0KICAgICNnZXQgYWx0ZXItYWx0ZXIgYWRqYWNlbmN5IG1hdHJpY2VzIG9mIHRoaXMgcGFydGljdWxhciBlZ29uZXQNCiAgICBhZGphY2VuY3kgPC0gZGF0YTRbaSxjKDg6MjcpXQ0KDQogICAgI2kgd2FudCB0aGUgY29ycmVjdCBvbmVzLCBnaXZlbiB0aGUgbm8uIG9mIGxpc3RlZCBhbHRlcnMgaW4gdGhpcyBuYW1lIGdlbmVyYXRvcg0KICAgICNpIGxpc3QgdGhlIGNvbHVtbnMgbnVtYmVycyBvZiB0aGUgdmFyaWFibGVzIGNvcnJlc3BvbmRpbmcgdG8gZWFjaCBtYXRjaGluZyBtYXRyaXggc2V0LA0KICAgICNhbmQgc3Vic2V0IGNvcnJlc3BvbmRpbmcgY29sdW1ucyBpbiBgYWRqYWNlbmN5YA0KICAgIGFkaiA8LSBhZGphY2VuY3lbLGxpc3QoMCwxLGMoMjo0KSxjKDU6MTApLGMoMTE6MjApKVtzaXplXVtbMV1dXQ0KICAgDQogICAgI2NvdW50IG51bWJlciBvZiB0aWVzIHRoYXQgZWdvIGRlc2NyaWJlZCBhcyAodmVyeSkgY2xvc2UgKHZzLiBub3QgY2xvc2UgYnV0IG5vIHN0cmFuZ2VyOyBzdHJhbmdlcnMpDQogICAgb2JzIDwtIGxlbmd0aCh3aGljaChhZGo9PSJIZWNodCJ8YWRqPT0iRXJnIGhlY2h0IikpDQogICAgZGYkY2RuLmRlbnNpdHkyW3doaWNoKGRmJGVnbz09aSldIDwtIG9icy9wb3MgIH0NCiAgDQogICNiLiBzdHVkeQ0KICBzaXplIDwtIGRmJHN0dWR5LnNpemUyW3doaWNoKGRmJGVnbz09aSldWzFdDQogIHBvcyA8LSBpZmVsc2Uoc2l6ZT09MiwgMSwgaWZlbHNlKHNpemU9PTMsIDMsIGlmZWxzZShzaXplPT00LCA2LCBpZmVsc2Uoc2l6ZT09NSwgMTAsIDApKSkpDQogIGlmKHNpemU+MSkgew0KICAgIGFkamFjZW5jeSA8LSBkYXRhNFtpLGMoMzM6NTIpXQ0KICAgICNyZW9yZGVyIGNvbHVtbnMuLi4uIG1lc3N5IQ0KICAgIGFkamFjZW5jeSA8LSBhZGphY2VuY3lbLGMoImFkajJOMmEuU1EwMDEuIiwgImFkajJOM2EuU1EwMDEuIiwgImFkajJOM2EuU1EwMDIuIiwgImFkajJOM2IuU1EwMDEuIiwgImFkajJONGEuU1EwMDEuIiwgImFkajJONGEuU1EwMDIuIiwNCiAgICAgICAgICAgICAgICAgICAgICAgImFkajJONGEuU1EwMDMuIiwgImFkajJONGIuU1EwMDEuIiwgImFkajJONGIuU1EwMDIuIiwgImFkajJONGMuU1EwMDEuIiwgImFkajJONWEuU1EwMDEuIiwgImFkajJONWEuU1EwMDIuIiwNCiAgICAgICAgICAgICAgICAgICAgICAgImFkajJONWEuU1EwMDMuIiwgImFkajJONWEuU1EwMDQuIiwgImFkajJONWIuU1EwMDEuIiwgImFkajJONWIuU1EwMDIuIiwgImFkajJONWIuU1EwMDMuIiwgImFkajJONWMuU1EwMDEuIiwNCiAgICAgICAgICAgICAgICAgICAgICAgImFkajJONWMuU1EwMDIuIiwgImFkajJONWQuU1EwMDEuIildDQogICAgDQogICAgYWRqIDwtIGFkamFjZW5jeVssbGlzdCgwLDEsYygyOjQpLGMoNToxMCksYygxMToyMCkpW3NpemVdW1sxXV1dDQogIA0KICAgICNjb3VudCBudW1iZXIgb2YgdGllcyB0aGF0IGVnbyBkZXNjcmliZWQgYXMgKHZlcnkpIGNsb3NlICh2cy4gbm90IGNsb3NlIGJ1dCBubyBzdHJhbmdlcjsgc3RyYW5nZXJzKQ0KICAgIG9icyA8LSBsZW5ndGgod2hpY2goYWRqPT0iSGVjaHQifGFkaj09IkVyZyBoZWNodCIpKQ0KICAgIGRmJHN0dWR5LmRlbnNpdHkyW3doaWNoKGRmJGVnbz09aSldIDwtIG9icy9wb3MgfQ0KICANCiAgI2MuIGZyaWVuZHMNCiAgc2l6ZSA8LSBkZiRiZmYuc2l6ZTJbd2hpY2goZGYkZWdvPT1pKV1bMV0NCiAgcG9zIDwtIGlmZWxzZShzaXplPT0yLCAxLCBpZmVsc2Uoc2l6ZT09MywgMywgaWZlbHNlKHNpemU9PTQsIDYsIGlmZWxzZShzaXplPT01LCAxMCwgMCkpKSkNCiAgaWYoc2l6ZT4xKSB7DQogICAgYWRqYWNlbmN5IDwtIGRhdGE0W2ksYygxNTY6MTc1KV0NCiAgICBhZGogPC0gYWRqYWNlbmN5WyxsaXN0KDAsMSxjKDI6NCksYyg1OjEwKSxjKDExOjIwKSlbc2l6ZV1bWzFdXV0NCiAgICANCiAgICAjY291bnQgbnVtYmVyIG9mIHRpZXMgdGhhdCBlZ28gZGVzY3JpYmVkIGFzICh2ZXJ5KSBjbG9zZSAodnMuIG5vdCBjbG9zZSBidXQgbm8gc3RyYW5nZXI7IHN0cmFuZ2VycykNCiAgICBvYnMgPC0gbGVuZ3RoKHdoaWNoKGFkaj09IkhlY2h0InxhZGo9PSJFcmcgaGVjaHQiKSkNCiAgICBkZiRiZmYuZGVuc2l0eTJbd2hpY2goZGYkZWdvPT1pKV0gPC0gb2JzL3BvcyB9DQoNCiAgI2QuIHNwb3J0cyBwYXJ0bmVycw0KICBzaXplIDwtIGRmJGNzbi5zaXplMlt3aGljaChkZiRlZ289PWkpXVsxXQ0KICBwb3MgPC0gaWZlbHNlKHNpemU9PTIsIDEsIGlmZWxzZShzaXplPT0zLCAzLCBpZmVsc2Uoc2l6ZT09NCwgNiwgaWZlbHNlKHNpemU9PTUsIDEwLCAwKSkpKQ0KICBpZihzaXplPjEpIHsNCiAgICBhZGphY2VuY3kgPC0gZGF0YTRbaSxjKDQwMTo0MjApXQ0KICAgIGFkaiA8LSBhZGphY2VuY3lbLGxpc3QoMCwxLGMoMjo0KSxjKDU6MTApLGMoMTE6MjApKVtzaXplXVtbMV1dXQ0KICANCiAgICAjY291bnQgbnVtYmVyIG9mIHRpZXMgdGhhdCBlZ28gZGVzY3JpYmVkIGFzICh2ZXJ5KSBjbG9zZSAodnMuIG5vdCBjbG9zZSBidXQgbm8gc3RyYW5nZXI7IHN0cmFuZ2VycykNCiAgICBvYnMgPC0gbGVuZ3RoKHdoaWNoKGFkaj09IkhlY2h0InxhZGo9PSJFcmcgaGVjaHQiKSkNCiAgICBkZiRjc24uZGVuc2l0eTJbd2hpY2goZGYkZWdvPT1pKV0gPC0gb2JzL3BvcyB9DQp9DQoNCiNzZXQgTkFzIHRvIDAuDQpkZiRjZG4uZGVuc2l0eTJbaXMubmEoZGYkY2RuLmRlbnNpdHkyKV0gPC0gMA0KZGYkc3R1ZHkuZGVuc2l0eTJbaXMubmEoZGYkc3R1ZHkuZGVuc2l0eTIpXSA8LSAwDQpkZiRiZmYuZGVuc2l0eTJbaXMubmEoZGYkYmZmLmRlbnNpdHkyKV0gPC0gMA0KZGYkY3NuLmRlbnNpdHkyW2lzLm5hKGRmJGNzbi5kZW5zaXR5MildIDwtIDANCg0KI2FkZCBXYXZlIDIgc3RhdHVzDQpkZiRzdGF0dXNXMiA8LSBOQQ0KZGYkc3RhdHVzVzIgPC0gaWZlbHNlKGRmJHN1cnZpdmU9PTEsICJNYWludGFpbmVkIiwgIkRyb3BwZWQiKQ0KDQojIyBtZXRob2RvbG9naWNhbCBjb250cm9scw0KDQojaW5jbHVkZSB3aGV0aGVyIG1heCBudW1iZXIgb2YgbmFtZXMgd2FzIHJlYWNoZWQgYXQgdDINCmRmJGNkbi5tYXgyIDwtIGlmZWxzZShkZiRjZG4uc2l6ZTI9PTUsMSwwKQ0KZGYkc3R1ZHkubWF4MiA8LSBpZmVsc2UoZGYkc3R1ZHkuc2l6ZTI9PTUsMSwwKQ0KZGYkYmZmLm1heDIgPC0gaWZlbHNlKGRmJGJmZi5zaXplMj09NSwxLDApDQpkZiRjc24ubWF4MiA8LSBpZmVsc2UoZGYkY3NuLnNpemUyPT01LDEsMCkNCg0KI3N1cnZleSB0aW1lIA0KZGYkc3VydmV5MnRpbWUgPC0gTkENCg0KI3RpbWUgb2YgZGF5DQpkZiRiZWZvcmVuaW5lMiA8LSBOQQ0KZGYkbmluZXRvZml2ZTIgPC0gTkENCmRmJGFmdGVyZml2ZTIgPC0gTkENCg0KI2ZpbGxlZCBvdXQgb24gdGhlIHdlZWtlbmQgKHNhL3N1KT8NCmRmJHdlZWtlbmQyIDwtIE5BDQoNCiN0aW1lIHBlciBuYW1lIGdlbmVyYXRvcg0KZGYkY2RuLnRpbWUyIDwtIE5BDQpkZiRzdHVkeS50aW1lMiA8LSBOQQ0KZGYkYmZmLnRpbWUyIDwtIE5BDQpkZiRjc24udGltZTIgPC0gTkENCg0KI3RpbWUgdGlsbCBuYW1lIGdlbmVyYXRvcg0KZGYkY2RuLnRpbWV0aWxsMiA8LSBOQQ0KZGYkc3R1ZHkudGltZXRpbGwyIDwtIE5BDQpkZiRiZmYudGltZXRpbGwyIDwtIE5BDQpkZiRjc24udGltZXRpbGwyIDwtIE5BDQoNCmZvciAoaSBpbiB1bmlxdWUoZGYkZWdvKSkgew0KICANCiAgI3N1cnZleSB0aW1lIGF0IHdhdmUgMg0KICAjY29udmVydCBzdGFydCBhbmQgc3VibWl0ZGF0ZSB0byBQT1NJWGN0IGFuZCBjYWxjdWxhdGUgZGlmZmVyZW5jZQ0KICAjaW4gbWludXRlczsgZXh0cmFjdCBudW1iZXIuDQogIGRmJHN1cnZleTJ0aW1lW3doaWNoKGRmJGVnbz09aSldIDwtIHN0cmluZ3I6OnN0cl9leHRyYWN0X2FsbCh0cnVuYyhhcy5QT1NJWGN0KGRhdGE0JHN1Ym1pdGRhdGVbaV0pIC0gYXMuUE9TSVhjdChkYXRhNCRzdGFydGRhdGVbaV0pLCAibWlucyIpLCJcXCg/WzAtOSwuXStcXCk/IilbWzFdXQ0KICANCiAgI3RpbWUgb2YgZGF5IG9mIHN1cnZleS4NCiAgI3RhYmxlKHN1YnN0cihkYXRhLnRhYmxlOjphcy5JVGltZShhcy5QT1NJWGN0KGRhdGE0JHN0YXJ0ZGF0ZSkpLDEsMikpICNkaXN0cmlidXRpb24NCiAgZGYkYmVmb3JlbmluZTJbd2hpY2goZGYkZWdvPT1pKV0gPC0gaWZlbHNlICggZGF0YS50YWJsZTo6YXMuSVRpbWUoYXMuUE9TSVhjdChkYXRhNCRzdGFydGRhdGVbaV0pKSA8IGRhdGEudGFibGU6OmFzLklUaW1lKCI5OjAwOjAwIiksIDEsIDApDQogIGRmJG5pbmV0b2ZpdmUyW3doaWNoKGRmJGVnbz09aSldIDwtIGlmZWxzZSAoIGRhdGEudGFibGU6OmFzLklUaW1lKGFzLlBPU0lYY3QoZGF0YTQkc3RhcnRkYXRlW2ldKSkgPiBkYXRhLnRhYmxlOjphcy5JVGltZSgiOTowMDowMCIpICYNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLnRhYmxlOjphcy5JVGltZShhcy5QT1NJWGN0KGRhdGE0JHN0YXJ0ZGF0ZVtpXSkpIDwgZGF0YS50YWJsZTo6YXMuSVRpbWUoIjE3OjAwOjAwIiksIDEsIDApDQogIGRmJGFmdGVyZml2ZTJbd2hpY2goZGYkZWdvPT1pKV0gPC0gaWZlbHNlICggZGF0YS50YWJsZTo6YXMuSVRpbWUoYXMuUE9TSVhjdChkYXRhNCRzdGFydGRhdGVbaV0pKSA+IGRhdGEudGFibGU6OmFzLklUaW1lKCIxNzowMDowMCIpLCAxLCAwKQ0KICANCiAgI3RpbWUgcGVyIG5hbWUgZ2VuZXJhdG9yIHF1ZXN0aW9uLCBpbiBtaW51dGVzDQogDQogIGRmJGNkbi50aW1lMlt3aGljaChkZiRlZ289PWkpXSA8LSBkYXRhNCRncm91cFRpbWU3MThbaV0vNjANCiAgZGYkc3R1ZHkudGltZTJbd2hpY2goZGYkZWdvPT1pKV0gPC0gZGF0YTQkZ3JvdXBUaW1lNzIyW2ldLzYwDQogIGRmJGJmZi50aW1lMlt3aGljaChkZiRlZ289PWkpXSA8LSBkYXRhNCRncm91cFRpbWU3MzBbaV0vNjANCiAgZGYkY3NuLnRpbWUyW3doaWNoKGRmJGVnbz09aSldIDwtIGRhdGE0JGdyb3VwVGltZTczN1tpXS82MA0KICANCiAgI2Fsc28gZ2V0IHdlZWtkYXkvd2Vla2VuZA0KICAjY291bnRpbmcgZnJpZGF5IGFzIHdlZWtlbmQsIGFmdGVyIDVwbQ0KICANCiAgI3RhYmxlKHdkYXkoeW1kX2htcyhhcy5QT1NJWGN0KGRhdGE0JHN1Ym1pdGRhdGUpKSxsYWJlbCA9IFRSVUUpKSAjZGlzdHJpYnV0aW9uDQogICNleHRyYWN0IHdlZWtkYXkNCiAgd2Vla2RheSA8LSB3ZGF5KHltZF9obXMoYXMuUE9TSVhjdChkYXRhNCRzdWJtaXRkYXRlW2ldKSksbGFiZWwgPSBUUlVFKQ0KICAjYW5kIHRpbWUNCiAgdGltZSA8LSBob3VyKGFzLlBPU0lYY3QoZGF0YTQkc3VibWl0ZGF0ZVtpXSkpDQogIGRmJHdlZWtlbmQyW3doaWNoKGRmJGVnbz09aSldIDwtIGlmZWxzZSggKHdlZWtkYXkgJWluJSBjKCJ6YSIsICJ6byIpKSB8ICh3ZWVrZGF5ID09ICJ2ciIgJiB0aW1lID49IDE3KSwgMSwgMCkNCiAgDQogICN0aW1lIHRpbGwgbmFtZSBnZW5lcmF0b3IgcXVlc3Rpb24sIGluIG1pbnV0ZXMNCiAgIyB3YXZlIDI6IHF1ZXN0aW9uIGdyb3VwcyA3MTcgQ0RONzE4IDcyMCBTVFVEWTcyMiA3MjMgNzI0IDcyNSA3NDggNzkzIDcyNiA3NDkgNzI5IDc0MCBCRkY3MzAgNzMxIDczMiA3MzQgNzM1IDczNiA3NDMgQ1NONzM3DQogIGRmJGNkbi50aW1ldGlsbDJbd2hpY2goZGYkZWdvPT1pKV0gPC0gc3VtKGRhdGE0WyxjKCJncm91cFRpbWU3MTciKV1baV0pLzYwDQogIGRmJHN0dWR5LnRpbWV0aWxsMlt3aGljaChkZiRlZ289PWkpXSA8LSByb3dTdW1zKGRhdGE0WyxjKCJncm91cFRpbWU3MTciLCAiZ3JvdXBUaW1lNzE4IiwgImdyb3VwVGltZTcyMCIpXVtpLF0sIG5hLnJtID0gVFJVRSkvNjANCiAgZGYkYmZmLnRpbWV0aWxsMlt3aGljaChkZiRlZ289PWkpXSA8LSByb3dTdW1zKGRhdGE0WyxjKCJncm91cFRpbWU3MTciLCAiZ3JvdXBUaW1lNzE4IiwgImdyb3VwVGltZTcyMCIsICJncm91cFRpbWU3MjIiLCAiZ3JvdXBUaW1lNzIzIiwgImdyb3VwVGltZTcyNCIsICJncm91cFRpbWU3MjUiLCAiZ3JvdXBUaW1lNzQ4IiwgImdyb3VwVGltZTc5MyIsICJncm91cFRpbWU3MjYiLCAiZ3JvdXBUaW1lNzQ5IiwiZ3JvdXBUaW1lNzI5IiwgImdyb3VwVGltZTc0MCIpXVtpLF0sIG5hLnJtID0gVFJVRSkvNjANCiAgZGYkY3NuLnRpbWV0aWxsMlt3aGljaChkZiRlZ289PWkpXSA8LSByb3dTdW1zKGRhdGE0WyxjKCJncm91cFRpbWU3MTciLCAiZ3JvdXBUaW1lNzE4IiwgImdyb3VwVGltZTcyMCIsICJncm91cFRpbWU3MjIiLCAiZ3JvdXBUaW1lNzIzIiwgImdyb3VwVGltZTcyNCIsICJncm91cFRpbWU3MjUiLCAiZ3JvdXBUaW1lNzQ4IiwgImdyb3VwVGltZTc5MyIsICJncm91cFRpbWU3MjYiLCAiZ3JvdXBUaW1lNzQ5IiwiZ3JvdXBUaW1lNzI5IiwgImdyb3VwVGltZTc0MCIsImdyb3VwVGltZTczMCIsICJncm91cFRpbWU3MzEiLCAiZ3JvdXBUaW1lNzMyIiwgImdyb3VwVGltZTczNCIsICJncm91cFRpbWU3MzUiLCAiZ3JvdXBUaW1lNzM2IiwgImdyb3VwVGltZTc0MyIpXVtpLF0sIG5hLnJtID0gVFJVRSkvNjANCiAgDQp9DQoNCmRmX21haW50YWluZWQgPC0gZGYNCiNmaXgoZGZfbWFpbnRhaW5lZCkNCiNzdHIoZGZfbWFpbnRhaW5lZCkNCiNsYXN0IG1ha2UgZ2VuZGVyIG51bWVyaWMuLg0KZGZfbWFpbnRhaW5lZCRhbHRlcl9nZW5kZXIgPC0gYXMubnVtZXJpYyhkZl9tYWludGFpbmVkJGFsdGVyX2dlbmRlcikNCmBgYA0KDQo8YnI+DQoNCiMjIHdhdmUgMiBjcmVhdGVkDQoNCmBgYHtyLCBldmFsID0gRkFMU0V9DQojY3JlYXRlIGEgbmV3IGFsdGVyIExpc3QNCmFsdGVyTCA8LSB2ZWN0b3IoImxpc3QiLCBucm93KGRhdGEpKQ0KDQojIGxvb3Agb3ZlciBhbGwgZWdvcw0KZm9yICggaSBpbiAxOmxlbmd0aChhbHRlckwpKSB7DQogICAgYWx0ZXJMW1tpXV0gPC0gZGF0YS5mcmFtZSgNCiAgICAgIGVnb19nZW5kZXIgPSBOQSwgZWdvX2FnZSA9IE5BLCBlZ29fZWR1YyA9IE5BLA0KICAgICAgYWx0ZXJpZCA9IDE6MjAsIG5hbWUxID0gTkEsIG5hbWUyID0gTkEsIG5hbWUzID0gTkEsIG5hbWU0ID0gTkEsDQogICAgICBhbHRlcl9nZW5kZXIgPSBOQSwgYWx0ZXJfYWdlID0gTkEsIGFsdGVyX2VkdWM9TkEsDQogICAgICBzYW1lX2dlbmRlciA9IE5BLCBkaWZfYWdlID0gTkEsIHNpbV9lZHVjID0gTkEsDQogICAgICBjZG5fZW1iZWQudDIgPSBOQSwgc3R1ZHlfZW1iZWQudDIgPSBOQSwgYmZmX2VtYmVkLnQyID0gTkEsIGNzbl9lbWJlZC50MiA9IE5BKQ0KfQ0KDQojZmlsbCBpbiBuYW1lcyBiYXNlZCBvbiBuYW1lc19kZg0KZm9yICggaSBpbiAxOmxlbmd0aChhbHRlckwpKSB7DQogIGFsdGVyTFtbaV1dJG5hbWUxIDwtIHVubGlzdChkZl9uYW1lc1tpLCBdLCB1c2UubmFtZXM9RkFMU0UpDQp9DQoNCiMgcmVwbGFjZSBlbXB0eSBzdHJpbmdzIHdpdGggPE5BPg0KZm9yIChpIGluIDE6bGVuZ3RoKGFsdGVyTCkpIHsNCiAgYWx0ZXJMW1tpXV0kbmFtZTEgPC0gaWZlbHNlKGFsdGVyTFtbaV1dJG5hbWUxPT0iIiwgTkEsIGFsdGVyTFtbaV1dJG5hbWUxKQ0KfQ0KDQojbWF0Y2hpbmcNCnsNCiAgbmV0MSA8LSBjYmluZChkYXRhNCRlZ29uZXQxLlNRMDAxLixkYXRhNCRlZ29uZXQxLlNRMDAyLiwgZGF0YTQkZWdvbmV0MS5TUTAwMy4sZGF0YTQkZWdvbmV0MS5TUTAwNC4sIGRhdGE0JGVnb25ldDEuU1EwMDUuKQ0KICBuZXQxIDwtIGlmZWxzZShuZXQxPT0iIiwgTkEsIG5ldDEpDQogIG5zMSA8LSB2ZWN0b3IoKQ0KICBmb3IgKGkgaW4gMTpucm93KG5ldDEpKSB7DQogICAgbnMxW2ldIDwtIGxlbmd0aChuZXQxW2ksXVt3aGljaCghaXMubmEobmV0MVtpLF0pKV0pDQogIH0NCiAgbmV0MiA8LSBjYmluZChkYXRhNCRlZ29uZXQyLlNRMDAxLixkYXRhNCRlZ29uZXQyLlNRMDAyLiwgZGF0YTQkZWdvbmV0Mi5TUTAwMy4sZGF0YTQkZWdvbmV0Mi5TUTAwNC4sIGRhdGE0JGVnb25ldDIuU1EwMDUuKQ0KICBuZXQyIDwtIGlmZWxzZShuZXQyPT0iIiwgTkEsIG5ldDIpDQogIG5zMiA8LSB2ZWN0b3IoKQ0KICBmb3IgKGkgaW4gMTpucm93KG5ldDIpKSB7DQogICAgbnMyW2ldIDwtIGxlbmd0aChuZXQyW2ksXVt3aGljaCghaXMubmEobmV0MltpLF0pKV0pDQogIH0NCiAgbmV0MyA8LSBjYmluZChkYXRhNCRlZ29uZXQzLlNRMDAxLixkYXRhNCRlZ29uZXQzLlNRMDAyLiwgZGF0YTQkZWdvbmV0My5TUTAwMy4sZGF0YTQkZWdvbmV0My5TUTAwNC4sIGRhdGE0JGVnb25ldDMuU1EwMDUuKQ0KICBuZXQzIDwtIGlmZWxzZShuZXQzPT0iIiwgTkEsIG5ldDMpDQogIG5zMyA8LSB2ZWN0b3IoKQ0KICBmb3IgKGkgaW4gMTpucm93KG5ldDMpKSB7DQogICAgbnMzW2ldIDwtIGxlbmd0aChuZXQzW2ksXVt3aGljaCghaXMubmEobmV0M1tpLF0pKV0pDQogIH0NCiAgbmV0NCA8LSBjYmluZChkYXRhNCRlZ29uZXQ0LlNRMDAxLixkYXRhNCRlZ29uZXQ0LlNRMDAyLiwgZGF0YTQkZWdvbmV0NC5TUTAwMy4sZGF0YTQkZWdvbmV0NC5TUTAwNC4sIGRhdGE0JGVnb25ldDQuU1EwMDUuKQ0KICBuZXQ0IDwtIGlmZWxzZShuZXQ0PT0iIiwgTkEsIG5ldDQpDQogIG5zNCA8LSB2ZWN0b3IoKQ0KICBmb3IgKGkgaW4gMTpucm93KG5ldDQpKSB7DQogICAgbnM0W2ldIDwtIGxlbmd0aChuZXQ0W2ksXVt3aGljaCghaXMubmEobmV0NFtpLF0pKV0pDQogIH0NCn0NCg0KbWF0Y2hpbmdMaXN0IDwtIGxpc3QoKQ0KZm9yIChpIGluIDE6bGVuZ3RoKGFsdGVyTCkpIHsgIyBmb3IgZWdvIGkNCiAgbWF0Y2hpbmdMIDwtIGxpc3QoKQ0KICAjIG1ha2UgNSBzZXBlcmF0ZSBtYXRjaGluZyBtYXRyaWNlcy4gbmF0dXJhbGx5LCBvbmx5IDEgaXMgcmVsZXZhbnQuLi4gYnV0IGkgd2lsbCBzZWxlY3QgdGhhdCBsYXRlci4NCiAgbWF0Y2hpbmdMW1sxXV0gPC0gY2JpbmQoZGF0YTQkbWF0Y2hpbmcxTjEuU1EwMDFfU1EwMDEuW2ldLGRhdGE0JG1hdGNoaW5nMU4xLlNRMDAyX1NRMDAxLltpXSxkYXRhNCRtYXRjaGluZzFOMS5TUTAwM19TUTAwMS5baV0sZGF0YTQkbWF0Y2hpbmcxTjEuU1EwMDRfU1EwMDEuW2ldLGRhdGE0JG1hdGNoaW5nMU4xLlNRMDA1X1NRMDAxLltpXSkNCiAgbWF0Y2hpbmdMW1syXV08LSByYmluZCgNCiAgICBjYmluZChkYXRhNCRtYXRjaGluZzFOMi5TUTAwMV9TUTAwMS5baV0sIGRhdGE0JG1hdGNoaW5nMU4yLlNRMDAyX1NRMDAxLltpXSwgZGF0YTQkbWF0Y2hpbmcxTjIuU1EwMDNfU1EwMDEuW2ldLCBkYXRhNCRtYXRjaGluZzFOMi5TUTAwNF9TUTAwMS5baV0sIGRhdGE0JG1hdGNoaW5nMU4yLlNRMDA1X1NRMDAxLltpXSksDQogICAgY2JpbmQoZGF0YTQkbWF0Y2hpbmcxTjIuU1EwMDFfU1EwMDIuW2ldLCBkYXRhNCRtYXRjaGluZzFOMi5TUTAwMl9TUTAwMi5baV0sIGRhdGE0JG1hdGNoaW5nMU4yLlNRMDAzX1NRMDAyLltpXSwgZGF0YTQkbWF0Y2hpbmcxTjIuU1EwMDRfU1EwMDIuW2ldLCBkYXRhNCRtYXRjaGluZzFOMi5TUTAwNV9TUTAwMi5baV0pKQ0KICBtYXRjaGluZ0xbWzNdXTwtIHJiaW5kKA0KICAgIGNiaW5kKGRhdGE0JG1hdGNoaW5nMU4zLlNRMDAxX1NRMDAxLltpXSwgZGF0YTQkbWF0Y2hpbmcxTjMuU1EwMDJfU1EwMDEuW2ldLCBkYXRhNCRtYXRjaGluZzFOMy5TUTAwM19TUTAwMS5baV0sIGRhdGE0JG1hdGNoaW5nMU4zLlNRMDA0X1NRMDAxLltpXSwgZGF0YTQkbWF0Y2hpbmcxTjMuU1EwMDVfU1EwMDEuW2ldKSwNCiAgICBjYmluZChkYXRhNCRtYXRjaGluZzFOMy5TUTAwMV9TUTAwMi5baV0sIGRhdGE0JG1hdGNoaW5nMU4zLlNRMDAyX1NRMDAyLltpXSwgZGF0YTQkbWF0Y2hpbmcxTjMuU1EwMDNfU1EwMDIuW2ldLCBkYXRhNCRtYXRjaGluZzFOMy5TUTAwNF9TUTAwMi5baV0sIGRhdGE0JG1hdGNoaW5nMU4zLlNRMDA1X1NRMDAyLltpXSksDQogICAgY2JpbmQoZGF0YTQkbWF0Y2hpbmcxTjMuU1EwMDFfU1EwMDMuW2ldLCBkYXRhNCRtYXRjaGluZzFOMy5TUTAwMl9TUTAwMy5baV0sIGRhdGE0JG1hdGNoaW5nMU4zLlNRMDAzX1NRMDAzLltpXSwgZGF0YTQkbWF0Y2hpbmcxTjMuU1EwMDRfU1EwMDMuW2ldLCBkYXRhNCRtYXRjaGluZzFOMy5TUTAwNV9TUTAwMy5baV0pKQ0KICBtYXRjaGluZ0xbWzRdXTwtIHJiaW5kKA0KICAgIGNiaW5kKGRhdGE0JG1hdGNoaW5nMU40LlNRMDAxX1NRMDAxLltpXSwgZGF0YTQkbWF0Y2hpbmcxTjQuU1EwMDJfU1EwMDEuW2ldLCBkYXRhNCRtYXRjaGluZzFONC5TUTAwM19TUTAwMS5baV0sIGRhdGE0JG1hdGNoaW5nMU40LlNRMDA0X1NRMDAxLltpXSwgZGF0YTQkbWF0Y2hpbmcxTjQuU1EwMDVfU1EwMDEuW2ldKSwNCiAgICBjYmluZChkYXRhNCRtYXRjaGluZzFONC5TUTAwMV9TUTAwMi5baV0sIGRhdGE0JG1hdGNoaW5nMU40LlNRMDAyX1NRMDAyLltpXSwgZGF0YTQkbWF0Y2hpbmcxTjQuU1EwMDNfU1EwMDIuW2ldLCBkYXRhNCRtYXRjaGluZzFONC5TUTAwNF9TUTAwMi5baV0sIGRhdGE0JG1hdGNoaW5nMU40LlNRMDA1X1NRMDAyLltpXSksDQogICAgY2JpbmQoZGF0YTQkbWF0Y2hpbmcxTjQuU1EwMDFfU1EwMDMuW2ldLCBkYXRhNCRtYXRjaGluZzFONC5TUTAwMl9TUTAwMy5baV0sIGRhdGE0JG1hdGNoaW5nMU40LlNRMDAzX1NRMDAzLltpXSwgZGF0YTQkbWF0Y2hpbmcxTjQuU1EwMDRfU1EwMDMuW2ldLCBkYXRhNCRtYXRjaGluZzFONC5TUTAwNV9TUTAwMy5baV0pLA0KICAgIGNiaW5kKGRhdGE0JG1hdGNoaW5nMU40LlNRMDAxX1NRMDA0LltpXSwgZGF0YTQkbWF0Y2hpbmcxTjQuU1EwMDJfU1EwMDQuW2ldLCBkYXRhNCRtYXRjaGluZzFONC5TUTAwM19TUTAwNC5baV0sIGRhdGE0JG1hdGNoaW5nMU40LlNRMDA0X1NRMDA0LltpXSwgZGF0YTQkbWF0Y2hpbmcxTjQuU1EwMDVfU1EwMDQuW2ldKSkNCiAgbWF0Y2hpbmdMW1s1XV08LSByYmluZCgNCiAgICBjYmluZChkYXRhNCRtYXRjaGluZzFONS5TUTAwMV9TUTAwMS5baV0sIGRhdGE0JG1hdGNoaW5nMU41LlNRMDAyX1NRMDAxLltpXSwgZGF0YTQkbWF0Y2hpbmcxTjUuU1EwMDNfU1EwMDEuW2ldLCBkYXRhNCRtYXRjaGluZzFONS5TUTAwNF9TUTAwMS5baV0sIGRhdGE0JG1hdGNoaW5nMU41LlNRMDA1X1NRMDAxLltpXSksDQogICAgY2JpbmQoZGF0YTQkbWF0Y2hpbmcxTjUuU1EwMDFfU1EwMDIuW2ldLCBkYXRhNCRtYXRjaGluZzFONS5TUTAwMl9TUTAwMi5baV0sIGRhdGE0JG1hdGNoaW5nMU41LlNRMDAzX1NRMDAyLltpXSwgZGF0YTQkbWF0Y2hpbmcxTjUuU1EwMDRfU1EwMDIuW2ldLCBkYXRhNCRtYXRjaGluZzFONS5TUTAwNV9TUTAwMi5baV0pLA0KICAgIGNiaW5kKGRhdGE0JG1hdGNoaW5nMU41LlNRMDAxX1NRMDAzLltpXSwgZGF0YTQkbWF0Y2hpbmcxTjUuU1EwMDJfU1EwMDMuW2ldLCBkYXRhNCRtYXRjaGluZzFONS5TUTAwM19TUTAwMy5baV0sIGRhdGE0JG1hdGNoaW5nMU41LlNRMDA0X1NRMDAzLltpXSwgZGF0YTQkbWF0Y2hpbmcxTjUuU1EwMDVfU1EwMDMuW2ldKSwNCiAgICBjYmluZChkYXRhNCRtYXRjaGluZzFONS5TUTAwMV9TUTAwNC5baV0sIGRhdGE0JG1hdGNoaW5nMU41LlNRMDAyX1NRMDA0LltpXSwgZGF0YTQkbWF0Y2hpbmcxTjUuU1EwMDNfU1EwMDQuW2ldLCBkYXRhNCRtYXRjaGluZzFONS5TUTAwNF9TUTAwNC5baV0sIGRhdGE0JG1hdGNoaW5nMU41LlNRMDA1X1NRMDA0LltpXSksDQogICAgY2JpbmQoZGF0YTQkbWF0Y2hpbmcxTjUuU1EwMDFfU1EwMDUuW2ldLCBkYXRhNCRtYXRjaGluZzFONS5TUTAwMl9TUTAwNS5baV0sIGRhdGE0JG1hdGNoaW5nMU41LlNRMDAzX1NRMDA1LltpXSwgZGF0YTQkbWF0Y2hpbmcxTjUuU1EwMDRfU1EwMDUuW2ldLCBkYXRhNCRtYXRjaGluZzFONS5TUTAwNV9TUTAwNS5baV0pKQ0KICBtYXRjaGluZ0xpc3RbW2ldXSA8LSBtYXRjaGluZ0wNCn0NCg0KIyB0aGUgY29tYmluYXRpb24gb2YgdGhlIG1hdGNoaW5nIG1hdHJpY2VzIGFuZCB0aGUgbmV0c2l6ZXMgZm9yIGVnbyBhbGxvd3MgbWUgdG8gbWF0Y2ggdGhlIG5hbWVzIG15c2VsZi4NCmZvciAoaSBpbiAxOmxlbmd0aChtYXRjaGluZ0xpc3QpKSB7ICAgICAjIGZvciBlZ28gaQ0KICBtTCA8LSBtYXRjaGluZ0xpc3RbW2ldXSAgICAgICAgICAgICAgICMgZ2V0IHRoZSBtYXRjaGluZyBsaXN0DQogIG5zIDwtIG5zMltbaV1dICAgICAgICAgICAgICAgICAgICAgICAgIyBnZXQgdGhlIHNpemUgb2YgZWdvbmV0Mg0KICBpZihucz4wKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgaWYgbnM9MCwgbm8gbWF0Y2hpbmcgd2FzIGRvbmUhDQogICAgbW0gPC0gYXMubWF0cml4KG1MW1tuc11dKSAgICAgICAgICAgIyByZXRyaWV2ZSB0aGUgY29ycmVzcG9uZGluZyBtYXRyaXgNCiAgICBtYXRjaGVkIDwtIHdoaWNoKG1tPT0xLCBhcnIuaW5kPVQpICAjIHJldHJpZXZlIGFycmF5IGluZGljZXMNCiAgICBuZXQgPC0gbmV0MltpLF0NCiAgICBpZihsZW5ndGgobWF0Y2hlZCk+MCkgeyAgICAgICAgICAgICAjIGlmIG1hdGNoaW5nIHdhcyBwZXJmb3JtZWQhDQogICAgICBhbHRlckxbW2ldXSRuYW1lMlt3aGljaChhbHRlckxbW2ldXSRhbHRlcmlkPT1tYXRjaGVkWywyXSldIDwtIG5ldFttYXRjaGVkWywxXV0NCiAgICB9DQogIH0NCn0NCg0KbWF0Y2hpbmdMaXN0MiA8LSBsaXN0KCkNCmZvciAoaSBpbiAxOmxlbmd0aChhbHRlckwpKSB7ICMgZm9yIGVnbyBpDQogIG1hdGNoaW5nMkwgPC0gbGlzdCgpDQogIG1hdGNoaW5nMkxbWzFdXSA8LSBjYmluZChkYXRhNCRtYXRjaGluZzJOMS5TUTAwMV9TUTAwMS5baV0sZGF0YTQkbWF0Y2hpbmcyTjEuU1EwMDJfU1EwMDEuW2ldLGRhdGE0JG1hdGNoaW5nMk4xLlNRMDAzX1NRMDAxLltpXSxkYXRhNCRtYXRjaGluZzJOMS5TUTAwNF9TUTAwMS5baV0sZGF0YTQkbWF0Y2hpbmcyTjEuU1EwMDVfU1EwMDEuW2ldLGRhdGE0JG1hdGNoaW5nMk4xLlNRMDA2X1NRMDAxLltpXSxkYXRhNCRtYXRjaGluZzJOMS5TUTAwN19TUTAwMS5baV0sZGF0YTQkbWF0Y2hpbmcyTjEuU1EwMDhfU1EwMDEuW2ldLGRhdGE0JG1hdGNoaW5nMk4xLlNRMDA5X1NRMDAxLltpXSxkYXRhNCRtYXRjaGluZzJOMS5TUTAxMF9TUTAwMS5baV0pDQogIG1hdGNoaW5nMkxbWzJdXSA8LSByYmluZCgNCiAgICBjYmluZChkYXRhNCRtYXRjaGluZzJOMi5TUTAwMV9TUTAwMS5baV0sZGF0YTQkbWF0Y2hpbmcyTjIuU1EwMDJfU1EwMDEuW2ldLGRhdGE0JG1hdGNoaW5nMk4yLlNRMDAzX1NRMDAxLltpXSxkYXRhNCRtYXRjaGluZzJOMi5TUTAwNF9TUTAwMS5baV0sZGF0YTQkbWF0Y2hpbmcyTjIuU1EwMDVfU1EwMDEuW2ldLGRhdGE0JG1hdGNoaW5nMk4yLlNRMDA2X1NRMDAxLltpXSxkYXRhNCRtYXRjaGluZzJOMi5TUTAwN19TUTAwMS5baV0sZGF0YTQkbWF0Y2hpbmcyTjIuU1EwMDhfU1EwMDEuW2ldLGRhdGE0JG1hdGNoaW5nMk4yLlNRMDA5X1NRMDAxLltpXSxkYXRhNCRtYXRjaGluZzJOMi5TUTAxMF9TUTAwMS5baV0pLA0KICAgIGNiaW5kKGRhdGE0JG1hdGNoaW5nMk4yLlNRMDAxX1NRMDAyLltpXSxkYXRhNCRtYXRjaGluZzJOMi5TUTAwMl9TUTAwMi5baV0sZGF0YTQkbWF0Y2hpbmcyTjIuU1EwMDNfU1EwMDIuW2ldLGRhdGE0JG1hdGNoaW5nMk4yLlNRMDA0X1NRMDAyLltpXSxkYXRhNCRtYXRjaGluZzJOMi5TUTAwNV9TUTAwMi5baV0sZGF0YTQkbWF0Y2hpbmcyTjIuU1EwMDZfU1EwMDIuW2ldLGRhdGE0JG1hdGNoaW5nMk4yLlNRMDA3X1NRMDAyLltpXSxkYXRhNCRtYXRjaGluZzJOMi5TUTAwOF9TUTAwMi5baV0sZGF0YTQkbWF0Y2hpbmcyTjIuU1EwMDlfU1EwMDIuW2ldLGRhdGE0JG1hdGNoaW5nMk4yLlNRMDEwX1NRMDAyLltpXSkpDQogIG1hdGNoaW5nMkxbWzNdXSA8LSByYmluZCgNCiAgICBjYmluZChkYXRhNCRtYXRjaGluZzJOMy5TUTAwMV9TUTAwMS5baV0sZGF0YTQkbWF0Y2hpbmcyTjMuU1EwMDJfU1EwMDEuW2ldLGRhdGE0JG1hdGNoaW5nMk4zLlNRMDAzX1NRMDAxLltpXSxkYXRhNCRtYXRjaGluZzJOMy5TUTAwNF9TUTAwMS5baV0sZGF0YTQkbWF0Y2hpbmcyTjMuU1EwMDVfU1EwMDEuW2ldLGRhdGE0JG1hdGNoaW5nMk4zLlNRMDA2X1NRMDAxLltpXSxkYXRhNCRtYXRjaGluZzJOMy5TUTAwN19TUTAwMS5baV0sZGF0YTQkbWF0Y2hpbmcyTjMuU1EwMDhfU1EwMDEuW2ldLGRhdGE0JG1hdGNoaW5nMk4zLlNRMDA5X1NRMDAxLltpXSxkYXRhNCRtYXRjaGluZzJOMy5TUTAxMF9TUTAwMS5baV0pLA0KICAgIGNiaW5kKGRhdGE0JG1hdGNoaW5nMk4zLlNRMDAxX1NRMDAyLltpXSxkYXRhNCRtYXRjaGluZzJOMy5TUTAwMl9TUTAwMi5baV0sZGF0YTQkbWF0Y2hpbmcyTjMuU1EwMDNfU1EwMDIuW2ldLGRhdGE0JG1hdGNoaW5nMk4zLlNRMDA0X1NRMDAyLltpXSxkYXRhNCRtYXRjaGluZzJOMy5TUTAwNV9TUTAwMi5baV0sZGF0YTQkbWF0Y2hpbmcyTjMuU1EwMDZfU1EwMDIuW2ldLGRhdGE0JG1hdGNoaW5nMk4zLlNRMDA3X1NRMDAyLltpXSxkYXRhNCRtYXRjaGluZzJOMy5TUTAwOF9TUTAwMi5baV0sZGF0YTQkbWF0Y2hpbmcyTjMuU1EwMDlfU1EwMDIuW2ldLGRhdGE0JG1hdGNoaW5nMk4zLlNRMDEwX1NRMDAyLltpXSksDQogICAgY2JpbmQoZGF0YTQkbWF0Y2hpbmcyTjMuU1EwMDFfU1EwMDMuW2ldLGRhdGE0JG1hdGNoaW5nMk4zLlNRMDAyX1NRMDAzLltpXSxkYXRhNCRtYXRjaGluZzJOMy5TUTAwM19TUTAwMy5baV0sZGF0YTQkbWF0Y2hpbmcyTjMuU1EwMDRfU1EwMDMuW2ldLGRhdGE0JG1hdGNoaW5nMk4zLlNRMDA1X1NRMDAzLltpXSxkYXRhNCRtYXRjaGluZzJOMy5TUTAwNl9TUTAwMy5baV0sZGF0YTQkbWF0Y2hpbmcyTjMuU1EwMDdfU1EwMDMuW2ldLGRhdGE0JG1hdGNoaW5nMk4zLlNRMDA4X1NRMDAzLltpXSxkYXRhNCRtYXRjaGluZzJOMy5TUTAwOV9TUTAwMy5baV0sZGF0YTQkbWF0Y2hpbmcyTjMuU1EwMTBfU1EwMDMuW2ldKSkNCiAgbWF0Y2hpbmcyTFtbNF1dIDwtIHJiaW5kKA0KICAgIGNiaW5kKGRhdGE0JG1hdGNoaW5nMk40LlNRMDAxX1NRMDAxLltpXSxkYXRhNCRtYXRjaGluZzJONC5TUTAwMl9TUTAwMS5baV0sZGF0YTQkbWF0Y2hpbmcyTjQuU1EwMDNfU1EwMDEuW2ldLGRhdGE0JG1hdGNoaW5nMk40LlNRMDA0X1NRMDAxLltpXSxkYXRhNCRtYXRjaGluZzJONC5TUTAwNV9TUTAwMS5baV0sZGF0YTQkbWF0Y2hpbmcyTjQuU1EwMDZfU1EwMDEuW2ldLGRhdGE0JG1hdGNoaW5nMk40LlNRMDA3X1NRMDAxLltpXSxkYXRhNCRtYXRjaGluZzJONC5TUTAwOF9TUTAwMS5baV0sZGF0YTQkbWF0Y2hpbmcyTjQuU1EwMDlfU1EwMDEuW2ldLGRhdGE0JG1hdGNoaW5nMk40LlNRMDEwX1NRMDAxLltpXSksDQogICAgY2JpbmQoZGF0YTQkbWF0Y2hpbmcyTjQuU1EwMDFfU1EwMDIuW2ldLGRhdGE0JG1hdGNoaW5nMk40LlNRMDAyX1NRMDAyLltpXSxkYXRhNCRtYXRjaGluZzJONC5TUTAwM19TUTAwMi5baV0sZGF0YTQkbWF0Y2hpbmcyTjQuU1EwMDRfU1EwMDIuW2ldLGRhdGE0JG1hdGNoaW5nMk40LlNRMDA1X1NRMDAyLltpXSxkYXRhNCRtYXRjaGluZzJONC5TUTAwNl9TUTAwMi5baV0sZGF0YTQkbWF0Y2hpbmcyTjQuU1EwMDdfU1EwMDIuW2ldLGRhdGE0JG1hdGNoaW5nMk40LlNRMDA4X1NRMDAyLltpXSxkYXRhNCRtYXRjaGluZzJONC5TUTAwOV9TUTAwMi5baV0sZGF0YTQkbWF0Y2hpbmcyTjQuU1EwMTBfU1EwMDIuW2ldKSwNCiAgICBjYmluZChkYXRhNCRtYXRjaGluZzJONC5TUTAwMV9TUTAwMy5baV0sZGF0YTQkbWF0Y2hpbmcyTjQuU1EwMDJfU1EwMDMuW2ldLGRhdGE0JG1hdGNoaW5nMk40LlNRMDAzX1NRMDAzLltpXSxkYXRhNCRtYXRjaGluZzJONC5TUTAwNF9TUTAwMy5baV0sZGF0YTQkbWF0Y2hpbmcyTjQuU1EwMDVfU1EwMDMuW2ldLGRhdGE0JG1hdGNoaW5nMk40LlNRMDA2X1NRMDAzLltpXSxkYXRhNCRtYXRjaGluZzJONC5TUTAwN19TUTAwMy5baV0sZGF0YTQkbWF0Y2hpbmcyTjQuU1EwMDhfU1EwMDMuW2ldLGRhdGE0JG1hdGNoaW5nMk40LlNRMDA5X1NRMDAzLltpXSxkYXRhNCRtYXRjaGluZzJONC5TUTAxMF9TUTAwMy5baV0pLA0KICAgIGNiaW5kKGRhdGE0JG1hdGNoaW5nMk40LlNRMDAxX1NRMDA0LltpXSxkYXRhNCRtYXRjaGluZzJONC5TUTAwMl9TUTAwNC5baV0sZGF0YTQkbWF0Y2hpbmcyTjQuU1EwMDNfU1EwMDQuW2ldLGRhdGE0JG1hdGNoaW5nMk40LlNRMDA0X1NRMDA0LltpXSxkYXRhNCRtYXRjaGluZzJONC5TUTAwNV9TUTAwNC5baV0sZGF0YTQkbWF0Y2hpbmcyTjQuU1EwMDZfU1EwMDQuW2ldLGRhdGE0JG1hdGNoaW5nMk40LlNRMDA3X1NRMDA0LltpXSxkYXRhNCRtYXRjaGluZzJONC5TUTAwOF9TUTAwNC5baV0sZGF0YTQkbWF0Y2hpbmcyTjQuU1EwMDlfU1EwMDQuW2ldLGRhdGE0JG1hdGNoaW5nMk40LlNRMDEwX1NRMDA0LltpXSkpDQogIG1hdGNoaW5nMkxbWzVdXSA8LSByYmluZCgNCiAgICBjYmluZChkYXRhNCRtYXRjaGluZzJONS5TUTAwMV9TUTAwMS5baV0sZGF0YTQkbWF0Y2hpbmcyTjUuU1EwMDJfU1EwMDEuW2ldLGRhdGE0JG1hdGNoaW5nMk41LlNRMDAzX1NRMDAxLltpXSxkYXRhNCRtYXRjaGluZzJONS5TUTAwNF9TUTAwMS5baV0sZGF0YTQkbWF0Y2hpbmcyTjUuU1EwMDVfU1EwMDEuW2ldLGRhdGE0JG1hdGNoaW5nMk41LlNRMDA2X1NRMDAxLltpXSxkYXRhNCRtYXRjaGluZzJONS5TUTAwN19TUTAwMS5baV0sZGF0YTQkbWF0Y2hpbmcyTjUuU1EwMDhfU1EwMDEuW2ldLGRhdGE0JG1hdGNoaW5nMk41LlNRMDA5X1NRMDAxLltpXSxkYXRhNCRtYXRjaGluZzJONS5TUTAxMF9TUTAwMS5baV0pLA0KICAgIGNiaW5kKGRhdGE0JG1hdGNoaW5nMk41LlNRMDAxX1NRMDAyLltpXSxkYXRhNCRtYXRjaGluZzJONS5TUTAwMl9TUTAwMi5baV0sZGF0YTQkbWF0Y2hpbmcyTjUuU1EwMDNfU1EwMDIuW2ldLGRhdGE0JG1hdGNoaW5nMk41LlNRMDA0X1NRMDAyLltpXSxkYXRhNCRtYXRjaGluZzJONS5TUTAwNV9TUTAwMi5baV0sZGF0YTQkbWF0Y2hpbmcyTjUuU1EwMDZfU1EwMDIuW2ldLGRhdGE0JG1hdGNoaW5nMk41LlNRMDA3X1NRMDAyLltpXSxkYXRhNCRtYXRjaGluZzJONS5TUTAwOF9TUTAwMi5baV0sZGF0YTQkbWF0Y2hpbmcyTjUuU1EwMDlfU1EwMDIuW2ldLGRhdGE0JG1hdGNoaW5nMk41LlNRMDEwX1NRMDAyLltpXSksDQogICAgY2JpbmQoZGF0YTQkbWF0Y2hpbmcyTjUuU1EwMDFfU1EwMDMuW2ldLGRhdGE0JG1hdGNoaW5nMk41LlNRMDAyX1NRMDAzLltpXSxkYXRhNCRtYXRjaGluZzJONS5TUTAwM19TUTAwMy5baV0sZGF0YTQkbWF0Y2hpbmcyTjUuU1EwMDRfU1EwMDMuW2ldLGRhdGE0JG1hdGNoaW5nMk41LlNRMDA1X1NRMDAzLltpXSxkYXRhNCRtYXRjaGluZzJONS5TUTAwNl9TUTAwMy5baV0sZGF0YTQkbWF0Y2hpbmcyTjUuU1EwMDdfU1EwMDMuW2ldLGRhdGE0JG1hdGNoaW5nMk41LlNRMDA4X1NRMDAzLltpXSxkYXRhNCRtYXRjaGluZzJONS5TUTAwOV9TUTAwMy5baV0sZGF0YTQkbWF0Y2hpbmcyTjUuU1EwMTBfU1EwMDMuW2ldKSwNCiAgICBjYmluZChkYXRhNCRtYXRjaGluZzJONS5TUTAwMV9TUTAwNC5baV0sZGF0YTQkbWF0Y2hpbmcyTjUuU1EwMDJfU1EwMDQuW2ldLGRhdGE0JG1hdGNoaW5nMk41LlNRMDAzX1NRMDA0LltpXSxkYXRhNCRtYXRjaGluZzJONS5TUTAwNF9TUTAwNC5baV0sZGF0YTQkbWF0Y2hpbmcyTjUuU1EwMDVfU1EwMDQuW2ldLGRhdGE0JG1hdGNoaW5nMk41LlNRMDA2X1NRMDA0LltpXSxkYXRhNCRtYXRjaGluZzJONS5TUTAwN19TUTAwNC5baV0sZGF0YTQkbWF0Y2hpbmcyTjUuU1EwMDhfU1EwMDQuW2ldLGRhdGE0JG1hdGNoaW5nMk41LlNRMDA5X1NRMDA0LltpXSxkYXRhNCRtYXRjaGluZzJONS5TUTAxMF9TUTAwNC5baV0pLA0KICAgIGNiaW5kKGRhdGE0JG1hdGNoaW5nMk41LlNRMDAxX1NRMDA1LltpXSxkYXRhNCRtYXRjaGluZzJONS5TUTAwMl9TUTAwNS5baV0sZGF0YTQkbWF0Y2hpbmcyTjUuU1EwMDNfU1EwMDUuW2ldLGRhdGE0JG1hdGNoaW5nMk41LlNRMDA0X1NRMDA1LltpXSxkYXRhNCRtYXRjaGluZzJONS5TUTAwNV9TUTAwNS5baV0sZGF0YTQkbWF0Y2hpbmcyTjUuU1EwMDZfU1EwMDUuW2ldLGRhdGE0JG1hdGNoaW5nMk41LlNRMDA3X1NRMDA1LltpXSxkYXRhNCRtYXRjaGluZzJONS5TUTAwOF9TUTAwNS5baV0sZGF0YTQkbWF0Y2hpbmcyTjUuU1EwMDlfU1EwMDUuW2ldLGRhdGE0JG1hdGNoaW5nMk41LlNRMDEwX1NRMDA1LltpXSkpDQogIG1hdGNoaW5nTGlzdDJbW2ldXSA8LSBtYXRjaGluZzJMDQp9DQoNCmZvciAoaSBpbiAxOmxlbmd0aChtYXRjaGluZ0xpc3QyKSkgeyAgICAjIGZvciBlZ28gaQ0KICBtTCA8LSBtYXRjaGluZ0xpc3QyW1tpXV0gICAgICAgICAgICAgICMgZ2V0IHRoZSBtYXRjaGluZyBsaXN0IDINCiAgbnMgPC0gbnMzW1tpXV0gICAgICAgICAgICAgICAgICAgICAgICAjIGdldCB0aGUgc2l6ZSBvZiBlZ29uZXQzDQogIGlmKG5zPjApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBpZiBucz0wLCBubyBtYXRjaGluZyB3YXMgZG9uZSENCiAgICBtbSA8LSBhcy5tYXRyaXgobUxbW25zXV0pICAgICAgICAgICAjIGFuZCB0aGUgY29ycmVzcG9uZGluZyBtYXRyaXgNCiAgICBtYXRjaGVkIDwtIHdoaWNoKG1tPT0xLCBhcnIuaW5kPVQpICAjIHJldHJpZXZlIGFycmF5IGluZGljZXMNCiAgICBuZXQgPC0gbmV0M1tpLF0NCiAgICANCiAgICBpZihsZW5ndGgobWF0Y2hlZCk+MCkgeyAgICAgICAgICAgICAjIGlmIG1hdGNoaW5nIHdhcyBwZXJmb3JtZWQhDQogICAgICBhbHRlckxbW2ldXSRuYW1lM1ttYXRjaGVkWywyXV0gPC0gbmV0W21hdGNoZWRbLDFdXQ0KICAgIH0NCiAgfQ0KfQ0KDQptYXRjaGluZ0xpc3QzIDwtIGxpc3QoKQ0KZm9yIChpIGluIDE6bGVuZ3RoKGFsdGVyTCkpIHsgIyBmb3IgZWdvIGkNCiAgbWF0Y2hpbmczTCA8LSBsaXN0KCkNCiAgbWF0Y2hpbmczTFtbMV1dIDwtIGNiaW5kKGRhdGE0JG1hdGNoaW5nM04xLlNRMDAxX1NRMDAxLltpXSxkYXRhNCRtYXRjaGluZzNOMS5TUTAwMl9TUTAwMS5baV0sZGF0YTQkbWF0Y2hpbmczTjEuU1EwMDNfU1EwMDEuW2ldLGRhdGE0JG1hdGNoaW5nM04xLlNRMDA0X1NRMDAxLltpXSxkYXRhNCRtYXRjaGluZzNOMS5TUTAwNV9TUTAwMS5baV0sZGF0YTQkbWF0Y2hpbmczTjEuU1EwMDZfU1EwMDEuW2ldLGRhdGE0JG1hdGNoaW5nM04xLlNRMDA3X1NRMDAxLltpXSxkYXRhNCRtYXRjaGluZzNOMS5TUTAwOF9TUTAwMS5baV0sZGF0YTQkbWF0Y2hpbmczTjEuU1EwMDlfU1EwMDEuW2ldLGRhdGE0JG1hdGNoaW5nM04xLlNRMDEwX1NRMDAxLltpXSwgZGF0YTQkbWF0Y2hpbmczTjEuU1EwMTFfU1EwMDEuW2ldLCBkYXRhNCRtYXRjaGluZzNOMS5TUTAxMl9TUTAwMS5baV0sIGRhdGE0JG1hdGNoaW5nM04xLlNRMDEzX1NRMDAxLltpXSwgZGF0YTQkbWF0Y2hpbmczTjEuU1EwMTRfU1EwMDEuW2ldLCBkYXRhNCRtYXRjaGluZzNOMS5TUTAxNV9TUTAwMS5baV0pDQogIG1hdGNoaW5nM0xbWzJdXSA8LSByYmluZCgNCiAgICBjYmluZChkYXRhNCRtYXRjaGluZzNOMi5TUTAwMV9TUTAwMS5baV0sZGF0YTQkbWF0Y2hpbmczTjIuU1EwMDJfU1EwMDEuW2ldLGRhdGE0JG1hdGNoaW5nM04yLlNRMDAzX1NRMDAxLltpXSxkYXRhNCRtYXRjaGluZzNOMi5TUTAwNF9TUTAwMS5baV0sZGF0YTQkbWF0Y2hpbmczTjIuU1EwMDVfU1EwMDEuW2ldLGRhdGE0JG1hdGNoaW5nM04yLlNRMDA2X1NRMDAxLltpXSxkYXRhNCRtYXRjaGluZzNOMi5TUTAwN19TUTAwMS5baV0sZGF0YTQkbWF0Y2hpbmczTjIuU1EwMDhfU1EwMDEuW2ldLGRhdGE0JG1hdGNoaW5nM04yLlNRMDA5X1NRMDAxLltpXSxkYXRhNCRtYXRjaGluZzNOMi5TUTAxMF9TUTAwMS5baV0sIGRhdGE0JG1hdGNoaW5nM04yLlNRMDExX1NRMDAxLltpXSwgZGF0YTQkbWF0Y2hpbmczTjIuU1EwMTJfU1EwMDEuW2ldLCBkYXRhNCRtYXRjaGluZzNOMi5TUTAxM19TUTAwMS5baV0sIGRhdGE0JG1hdGNoaW5nM04yLlNRMDE0X1NRMDAxLltpXSwgZGF0YTQkbWF0Y2hpbmczTjIuU1EwMTVfU1EwMDEuW2ldKSwNCiAgICBjYmluZChkYXRhNCRtYXRjaGluZzNOMi5TUTAwMV9TUTAwMi5baV0sZGF0YTQkbWF0Y2hpbmczTjIuU1EwMDJfU1EwMDIuW2ldLGRhdGE0JG1hdGNoaW5nM04yLlNRMDAzX1NRMDAyLltpXSxkYXRhNCRtYXRjaGluZzNOMi5TUTAwNF9TUTAwMi5baV0sZGF0YTQkbWF0Y2hpbmczTjIuU1EwMDVfU1EwMDIuW2ldLGRhdGE0JG1hdGNoaW5nM04yLlNRMDA2X1NRMDAyLltpXSxkYXRhNCRtYXRjaGluZzNOMi5TUTAwN19TUTAwMi5baV0sZGF0YTQkbWF0Y2hpbmczTjIuU1EwMDhfU1EwMDIuW2ldLGRhdGE0JG1hdGNoaW5nM04yLlNRMDA5X1NRMDAyLltpXSxkYXRhNCRtYXRjaGluZzNOMi5TUTAxMF9TUTAwMi5baV0sIGRhdGE0JG1hdGNoaW5nM04yLlNRMDExX1NRMDAyLltpXSwgZGF0YTQkbWF0Y2hpbmczTjIuU1EwMTJfU1EwMDIuW2ldLCBkYXRhNCRtYXRjaGluZzNOMi5TUTAxM19TUTAwMi5baV0sIGRhdGE0JG1hdGNoaW5nM04yLlNRMDE0X1NRMDAyLltpXSwgZGF0YTQkbWF0Y2hpbmczTjIuU1EwMTVfU1EwMDIuW2ldKSkNCiAgbWF0Y2hpbmczTFtbM11dIDwtIHJiaW5kKA0KICAgIGNiaW5kKGRhdGE0JG1hdGNoaW5nM04zLlNRMDAxX1NRMDAxLltpXSxkYXRhNCRtYXRjaGluZzNOMy5TUTAwMl9TUTAwMS5baV0sZGF0YTQkbWF0Y2hpbmczTjMuU1EwMDNfU1EwMDEuW2ldLGRhdGE0JG1hdGNoaW5nM04zLlNRMDA0X1NRMDAxLltpXSxkYXRhNCRtYXRjaGluZzNOMy5TUTAwNV9TUTAwMS5baV0sZGF0YTQkbWF0Y2hpbmczTjMuU1EwMDZfU1EwMDEuW2ldLGRhdGE0JG1hdGNoaW5nM04zLlNRMDA3X1NRMDAxLltpXSxkYXRhNCRtYXRjaGluZzNOMy5TUTAwOF9TUTAwMS5baV0sZGF0YTQkbWF0Y2hpbmczTjMuU1EwMDlfU1EwMDEuW2ldLGRhdGE0JG1hdGNoaW5nM04zLlNRMDEwX1NRMDAxLltpXSwgZGF0YTQkbWF0Y2hpbmczTjMuU1EwMTFfU1EwMDEuW2ldLCBkYXRhNCRtYXRjaGluZzNOMy5TUTAxMl9TUTAwMS5baV0sIGRhdGE0JG1hdGNoaW5nM04zLlNRMDEzX1NRMDAxLltpXSwgZGF0YTQkbWF0Y2hpbmczTjMuU1EwMTRfU1EwMDEuW2ldLCBkYXRhNCRtYXRjaGluZzNOMy5TUTAxNV9TUTAwMS5baV0pLA0KICAgIGNiaW5kKGRhdGE0JG1hdGNoaW5nM04zLlNRMDAxX1NRMDAyLltpXSxkYXRhNCRtYXRjaGluZzNOMy5TUTAwMl9TUTAwMi5baV0sZGF0YTQkbWF0Y2hpbmczTjMuU1EwMDNfU1EwMDIuW2ldLGRhdGE0JG1hdGNoaW5nM04zLlNRMDA0X1NRMDAyLltpXSxkYXRhNCRtYXRjaGluZzNOMy5TUTAwNV9TUTAwMi5baV0sZGF0YTQkbWF0Y2hpbmczTjMuU1EwMDZfU1EwMDIuW2ldLGRhdGE0JG1hdGNoaW5nM04zLlNRMDA3X1NRMDAyLltpXSxkYXRhNCRtYXRjaGluZzNOMy5TUTAwOF9TUTAwMi5baV0sZGF0YTQkbWF0Y2hpbmczTjMuU1EwMDlfU1EwMDIuW2ldLGRhdGE0JG1hdGNoaW5nM04zLlNRMDEwX1NRMDAyLltpXSwgZGF0YTQkbWF0Y2hpbmczTjMuU1EwMTFfU1EwMDIuW2ldLCBkYXRhNCRtYXRjaGluZzNOMy5TUTAxMl9TUTAwMi5baV0sIGRhdGE0JG1hdGNoaW5nM04zLlNRMDEzX1NRMDAyLltpXSwgZGF0YTQkbWF0Y2hpbmczTjMuU1EwMTRfU1EwMDIuW2ldLCBkYXRhNCRtYXRjaGluZzNOMy5TUTAxNV9TUTAwMi5baV0pLA0KICAgIGNiaW5kKGRhdGE0JG1hdGNoaW5nM04zLlNRMDAxX1NRMDAzLltpXSxkYXRhNCRtYXRjaGluZzNOMy5TUTAwMl9TUTAwMy5baV0sZGF0YTQkbWF0Y2hpbmczTjMuU1EwMDNfU1EwMDMuW2ldLGRhdGE0JG1hdGNoaW5nM04zLlNRMDA0X1NRMDAzLltpXSxkYXRhNCRtYXRjaGluZzNOMy5TUTAwNV9TUTAwMy5baV0sZGF0YTQkbWF0Y2hpbmczTjMuU1EwMDZfU1EwMDMuW2ldLGRhdGE0JG1hdGNoaW5nM04zLlNRMDA3X1NRMDAzLltpXSxkYXRhNCRtYXRjaGluZzNOMy5TUTAwOF9TUTAwMy5baV0sZGF0YTQkbWF0Y2hpbmczTjMuU1EwMDlfU1EwMDMuW2ldLGRhdGE0JG1hdGNoaW5nM04zLlNRMDEwX1NRMDAzLltpXSwgZGF0YTQkbWF0Y2hpbmczTjMuU1EwMTFfU1EwMDMuW2ldLCBkYXRhNCRtYXRjaGluZzNOMy5TUTAxMl9TUTAwMy5baV0sIGRhdGE0JG1hdGNoaW5nM04zLlNRMDEzX1NRMDAzLltpXSwgZGF0YTQkbWF0Y2hpbmczTjMuU1EwMTRfU1EwMDMuW2ldLCBkYXRhNCRtYXRjaGluZzNOMy5TUTAxNV9TUTAwMy5baV0pKQ0KICBtYXRjaGluZzNMW1s0XV0gPC0gcmJpbmQoDQogICAgY2JpbmQoZGF0YTQkbWF0Y2hpbmczTjQuU1EwMDFfU1EwMDEuW2ldLGRhdGE0JG1hdGNoaW5nM040LlNRMDAyX1NRMDAxLltpXSxkYXRhNCRtYXRjaGluZzNONC5TUTAwM19TUTAwMS5baV0sZGF0YTQkbWF0Y2hpbmczTjQuU1EwMDRfU1EwMDEuW2ldLGRhdGE0JG1hdGNoaW5nM040LlNRMDA1X1NRMDAxLltpXSxkYXRhNCRtYXRjaGluZzNONC5TUTAwNl9TUTAwMS5baV0sZGF0YTQkbWF0Y2hpbmczTjQuU1EwMDdfU1EwMDEuW2ldLGRhdGE0JG1hdGNoaW5nM040LlNRMDA4X1NRMDAxLltpXSxkYXRhNCRtYXRjaGluZzNONC5TUTAwOV9TUTAwMS5baV0sZGF0YTQkbWF0Y2hpbmczTjQuU1EwMTBfU1EwMDEuW2ldLCBkYXRhNCRtYXRjaGluZzNONC5TUTAxMV9TUTAwMS5baV0sIGRhdGE0JG1hdGNoaW5nM040LlNRMDEyX1NRMDAxLltpXSwgZGF0YTQkbWF0Y2hpbmczTjQuU1EwMTNfU1EwMDEuW2ldLCBkYXRhNCRtYXRjaGluZzNONC5TUTAxNF9TUTAwMS5baV0sIGRhdGE0JG1hdGNoaW5nM040LlNRMDE1X1NRMDAxLltpXSksDQogICAgY2JpbmQoZGF0YTQkbWF0Y2hpbmczTjQuU1EwMDFfU1EwMDIuW2ldLGRhdGE0JG1hdGNoaW5nM040LlNRMDAyX1NRMDAyLltpXSxkYXRhNCRtYXRjaGluZzNONC5TUTAwM19TUTAwMi5baV0sZGF0YTQkbWF0Y2hpbmczTjQuU1EwMDRfU1EwMDIuW2ldLGRhdGE0JG1hdGNoaW5nM040LlNRMDA1X1NRMDAyLltpXSxkYXRhNCRtYXRjaGluZzNONC5TUTAwNl9TUTAwMi5baV0sZGF0YTQkbWF0Y2hpbmczTjQuU1EwMDdfU1EwMDIuW2ldLGRhdGE0JG1hdGNoaW5nM040LlNRMDA4X1NRMDAyLltpXSxkYXRhNCRtYXRjaGluZzNONC5TUTAwOV9TUTAwMi5baV0sZGF0YTQkbWF0Y2hpbmczTjQuU1EwMTBfU1EwMDIuW2ldLCBkYXRhNCRtYXRjaGluZzNONC5TUTAxMV9TUTAwMi5baV0sIGRhdGE0JG1hdGNoaW5nM040LlNRMDEyX1NRMDAyLltpXSwgZGF0YTQkbWF0Y2hpbmczTjQuU1EwMTNfU1EwMDIuW2ldLCBkYXRhNCRtYXRjaGluZzNONC5TUTAxNF9TUTAwMi5baV0sIGRhdGE0JG1hdGNoaW5nM040LlNRMDE1X1NRMDAyLltpXSksDQogICAgY2JpbmQoZGF0YTQkbWF0Y2hpbmczTjQuU1EwMDFfU1EwMDMuW2ldLGRhdGE0JG1hdGNoaW5nM040LlNRMDAyX1NRMDAzLltpXSxkYXRhNCRtYXRjaGluZzNONC5TUTAwM19TUTAwMy5baV0sZGF0YTQkbWF0Y2hpbmczTjQuU1EwMDRfU1EwMDMuW2ldLGRhdGE0JG1hdGNoaW5nM040LlNRMDA1X1NRMDAzLltpXSxkYXRhNCRtYXRjaGluZzNONC5TUTAwNl9TUTAwMy5baV0sZGF0YTQkbWF0Y2hpbmczTjQuU1EwMDdfU1EwMDMuW2ldLGRhdGE0JG1hdGNoaW5nM040LlNRMDA4X1NRMDAzLltpXSxkYXRhNCRtYXRjaGluZzNONC5TUTAwOV9TUTAwMy5baV0sZGF0YTQkbWF0Y2hpbmczTjQuU1EwMTBfU1EwMDMuW2ldLCBkYXRhNCRtYXRjaGluZzNONC5TUTAxMV9TUTAwMy5baV0sIGRhdGE0JG1hdGNoaW5nM040LlNRMDEyX1NRMDAzLltpXSwgZGF0YTQkbWF0Y2hpbmczTjQuU1EwMTNfU1EwMDMuW2ldLCBkYXRhNCRtYXRjaGluZzNONC5TUTAxNF9TUTAwMy5baV0sIGRhdGE0JG1hdGNoaW5nM040LlNRMDE1X1NRMDAzLltpXSksDQogICAgY2JpbmQoZGF0YTQkbWF0Y2hpbmczTjQuU1EwMDFfU1EwMDMuW2ldLGRhdGE0JG1hdGNoaW5nM040LlNRMDAyX1NRMDAzLltpXSxkYXRhNCRtYXRjaGluZzNONC5TUTAwM19TUTAwMy5baV0sZGF0YTQkbWF0Y2hpbmczTjQuU1EwMDRfU1EwMDMuW2ldLGRhdGE0JG1hdGNoaW5nM040LlNRMDA1X1NRMDAzLltpXSxkYXRhNCRtYXRjaGluZzNONC5TUTAwNl9TUTAwMy5baV0sZGF0YTQkbWF0Y2hpbmczTjQuU1EwMDdfU1EwMDMuW2ldLGRhdGE0JG1hdGNoaW5nM040LlNRMDA4X1NRMDAzLltpXSxkYXRhNCRtYXRjaGluZzNONC5TUTAwOV9TUTAwMy5baV0sZGF0YTQkbWF0Y2hpbmczTjQuU1EwMTBfU1EwMDMuW2ldLCBkYXRhNCRtYXRjaGluZzNONC5TUTAxMV9TUTAwMy5baV0sIGRhdGE0JG1hdGNoaW5nM040LlNRMDEyX1NRMDAzLltpXSwgZGF0YTQkbWF0Y2hpbmczTjQuU1EwMTNfU1EwMDMuW2ldLCBkYXRhNCRtYXRjaGluZzNONC5TUTAxNF9TUTAwMy5baV0sIGRhdGE0JG1hdGNoaW5nM040LlNRMDE1X1NRMDAzLltpXSksDQogICAgY2JpbmQoZGF0YTQkbWF0Y2hpbmczTjQuU1EwMDFfU1EwMDQuW2ldLGRhdGE0JG1hdGNoaW5nM040LlNRMDAyX1NRMDA0LltpXSxkYXRhNCRtYXRjaGluZzNONC5TUTAwM19TUTAwNC5baV0sZGF0YTQkbWF0Y2hpbmczTjQuU1EwMDRfU1EwMDQuW2ldLGRhdGE0JG1hdGNoaW5nM040LlNRMDA1X1NRMDA0LltpXSxkYXRhNCRtYXRjaGluZzNONC5TUTAwNl9TUTAwNC5baV0sZGF0YTQkbWF0Y2hpbmczTjQuU1EwMDdfU1EwMDQuW2ldLGRhdGE0JG1hdGNoaW5nM040LlNRMDA4X1NRMDA0LltpXSxkYXRhNCRtYXRjaGluZzNONC5TUTAwOV9TUTAwNC5baV0sZGF0YTQkbWF0Y2hpbmczTjQuU1EwMTBfU1EwMDQuW2ldLCBkYXRhNCRtYXRjaGluZzNONC5TUTAxMV9TUTAwNC5baV0sIGRhdGE0JG1hdGNoaW5nM040LlNRMDEyX1NRMDA0LltpXSwgZGF0YTQkbWF0Y2hpbmczTjQuU1EwMTNfU1EwMDQuW2ldLCBkYXRhNCRtYXRjaGluZzNONC5TUTAxNF9TUTAwNC5baV0sIGRhdGE0JG1hdGNoaW5nM040LlNRMDE1X1NRMDA0LltpXSkpDQogIG1hdGNoaW5nM0xbWzVdXSA8LSByYmluZCgNCiAgICBjYmluZChkYXRhNCRtYXRjaGluZzNONS5TUTAwMV9TUTAwMS5baV0sZGF0YTQkbWF0Y2hpbmczTjUuU1EwMDJfU1EwMDEuW2ldLGRhdGE0JG1hdGNoaW5nM041LlNRMDAzX1NRMDAxLltpXSxkYXRhNCRtYXRjaGluZzNONS5TUTAwNF9TUTAwMS5baV0sZGF0YTQkbWF0Y2hpbmczTjUuU1EwMDVfU1EwMDEuW2ldLGRhdGE0JG1hdGNoaW5nM041LlNRMDA2X1NRMDAxLltpXSxkYXRhNCRtYXRjaGluZzNONS5TUTAwN19TUTAwMS5baV0sZGF0YTQkbWF0Y2hpbmczTjUuU1EwMDhfU1EwMDEuW2ldLGRhdGE0JG1hdGNoaW5nM041LlNRMDA5X1NRMDAxLltpXSxkYXRhNCRtYXRjaGluZzNONS5TUTAxMF9TUTAwMS5baV0sIGRhdGE0JG1hdGNoaW5nM041LlNRMDExX1NRMDAxLltpXSwgZGF0YTQkbWF0Y2hpbmczTjUuU1EwMTJfU1EwMDEuW2ldLCBkYXRhNCRtYXRjaGluZzNONS5TUTAxM19TUTAwMS5baV0sIGRhdGE0JG1hdGNoaW5nM041LlNRMDE0X1NRMDAxLltpXSwgZGF0YTQkbWF0Y2hpbmczTjUuU1EwMTVfU1EwMDEuW2ldKSwNCiAgICBjYmluZChkYXRhNCRtYXRjaGluZzNONS5TUTAwMV9TUTAwMi5baV0sZGF0YTQkbWF0Y2hpbmczTjUuU1EwMDJfU1EwMDIuW2ldLGRhdGE0JG1hdGNoaW5nM041LlNRMDAzX1NRMDAyLltpXSxkYXRhNCRtYXRjaGluZzNONS5TUTAwNF9TUTAwMi5baV0sZGF0YTQkbWF0Y2hpbmczTjUuU1EwMDVfU1EwMDIuW2ldLGRhdGE0JG1hdGNoaW5nM041LlNRMDA2X1NRMDAyLltpXSxkYXRhNCRtYXRjaGluZzNONS5TUTAwN19TUTAwMi5baV0sZGF0YTQkbWF0Y2hpbmczTjUuU1EwMDhfU1EwMDIuW2ldLGRhdGE0JG1hdGNoaW5nM041LlNRMDA5X1NRMDAyLltpXSxkYXRhNCRtYXRjaGluZzNONS5TUTAxMF9TUTAwMi5baV0sIGRhdGE0JG1hdGNoaW5nM041LlNRMDExX1NRMDAyLltpXSwgZGF0YTQkbWF0Y2hpbmczTjUuU1EwMTJfU1EwMDIuW2ldLCBkYXRhNCRtYXRjaGluZzNONS5TUTAxM19TUTAwMi5baV0sIGRhdGE0JG1hdGNoaW5nM041LlNRMDE0X1NRMDAyLltpXSwgZGF0YTQkbWF0Y2hpbmczTjUuU1EwMTVfU1EwMDIuW2ldKSwNCiAgICBjYmluZChkYXRhNCRtYXRjaGluZzNONS5TUTAwMV9TUTAwMy5baV0sZGF0YTQkbWF0Y2hpbmczTjUuU1EwMDJfU1EwMDMuW2ldLGRhdGE0JG1hdGNoaW5nM041LlNRMDAzX1NRMDAzLltpXSxkYXRhNCRtYXRjaGluZzNONS5TUTAwNF9TUTAwMy5baV0sZGF0YTQkbWF0Y2hpbmczTjUuU1EwMDVfU1EwMDMuW2ldLGRhdGE0JG1hdGNoaW5nM041LlNRMDA2X1NRMDAzLltpXSxkYXRhNCRtYXRjaGluZzNONS5TUTAwN19TUTAwMy5baV0sZGF0YTQkbWF0Y2hpbmczTjUuU1EwMDhfU1EwMDMuW2ldLGRhdGE0JG1hdGNoaW5nM041LlNRMDA5X1NRMDAzLltpXSxkYXRhNCRtYXRjaGluZzNONS5TUTAxMF9TUTAwMy5baV0sIGRhdGE0JG1hdGNoaW5nM041LlNRMDExX1NRMDAzLltpXSwgZGF0YTQkbWF0Y2hpbmczTjUuU1EwMTJfU1EwMDMuW2ldLCBkYXRhNCRtYXRjaGluZzNONS5TUTAxM19TUTAwMy5baV0sIGRhdGE0JG1hdGNoaW5nM041LlNRMDE0X1NRMDAzLltpXSwgZGF0YTQkbWF0Y2hpbmczTjUuU1EwMTVfU1EwMDMuW2ldKSwNCiAgICBjYmluZChkYXRhNCRtYXRjaGluZzNONS5TUTAwMV9TUTAwMy5baV0sZGF0YTQkbWF0Y2hpbmczTjUuU1EwMDJfU1EwMDMuW2ldLGRhdGE0JG1hdGNoaW5nM041LlNRMDAzX1NRMDAzLltpXSxkYXRhNCRtYXRjaGluZzNONS5TUTAwNF9TUTAwMy5baV0sZGF0YTQkbWF0Y2hpbmczTjUuU1EwMDVfU1EwMDMuW2ldLGRhdGE0JG1hdGNoaW5nM041LlNRMDA2X1NRMDAzLltpXSxkYXRhNCRtYXRjaGluZzNONS5TUTAwN19TUTAwMy5baV0sZGF0YTQkbWF0Y2hpbmczTjUuU1EwMDhfU1EwMDMuW2ldLGRhdGE0JG1hdGNoaW5nM041LlNRMDA5X1NRMDAzLltpXSxkYXRhNCRtYXRjaGluZzNONS5TUTAxMF9TUTAwMy5baV0sIGRhdGE0JG1hdGNoaW5nM041LlNRMDExX1NRMDAzLltpXSwgZGF0YTQkbWF0Y2hpbmczTjUuU1EwMTJfU1EwMDMuW2ldLCBkYXRhNCRtYXRjaGluZzNONS5TUTAxM19TUTAwMy5baV0sIGRhdGE0JG1hdGNoaW5nM041LlNRMDE0X1NRMDAzLltpXSwgZGF0YTQkbWF0Y2hpbmczTjUuU1EwMTVfU1EwMDMuW2ldKSwNCiAgICBjYmluZChkYXRhNCRtYXRjaGluZzNONS5TUTAwMV9TUTAwNS5baV0sZGF0YTQkbWF0Y2hpbmczTjUuU1EwMDJfU1EwMDUuW2ldLGRhdGE0JG1hdGNoaW5nM041LlNRMDAzX1NRMDA1LltpXSxkYXRhNCRtYXRjaGluZzNONS5TUTAwNF9TUTAwNS5baV0sZGF0YTQkbWF0Y2hpbmczTjUuU1EwMDVfU1EwMDUuW2ldLGRhdGE0JG1hdGNoaW5nM041LlNRMDA2X1NRMDA1LltpXSxkYXRhNCRtYXRjaGluZzNONS5TUTAwN19TUTAwNS5baV0sZGF0YTQkbWF0Y2hpbmczTjUuU1EwMDhfU1EwMDUuW2ldLGRhdGE0JG1hdGNoaW5nM041LlNRMDA5X1NRMDA1LltpXSxkYXRhNCRtYXRjaGluZzNONS5TUTAxMF9TUTAwNS5baV0sIGRhdGE0JG1hdGNoaW5nM041LlNRMDExX1NRMDA1LltpXSwgZGF0YTQkbWF0Y2hpbmczTjUuU1EwMTJfU1EwMDUuW2ldLCBkYXRhNCRtYXRjaGluZzNONS5TUTAxM19TUTAwNS5baV0sIGRhdGE0JG1hdGNoaW5nM041LlNRMDE0X1NRMDA1LltpXSwgZGF0YTQkbWF0Y2hpbmczTjUuU1EwMTVfU1EwMDUuW2ldKSkNCiAgbWF0Y2hpbmdMaXN0M1tbaV1dIDwtIG1hdGNoaW5nM0wNCn0NCg0KZm9yIChpIGluIDE6bGVuZ3RoKG1hdGNoaW5nTGlzdDMpKSB7ICAgICMgZm9yIGVnbyBpDQogIG1MIDwtIG1hdGNoaW5nTGlzdDNbW2ldXSAgICAgICAgICAgICAgIyBnZXQgdGhlIG1hdGNoaW5nIGxpc3QgMg0KICBucyA8LSBuczRbW2ldXSAgICAgICAgICAgICAgICAgICAgICAgICMgZ2V0IHRoZSBzaXplIG9mIGVnb25ldDQNCiAgaWYobnM+MCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGlmIG5zPTAsIG5vIG1hdGNoaW5nIHdhcyBkb25lIQ0KICAgIG1tIDwtIGFzLm1hdHJpeChtTFtbbnNdXSkgICAgICAgICAgICMgYW5kIHRoZSBjb3JyZXNwb25kaW5nIG1hdHJpeA0KICAgIG1hdGNoZWQgPC0gd2hpY2gobW09PTEsIGFyci5pbmQ9VCkgICMgcmV0cmlldmUgYXJyYXkgaW5kaWNlcw0KICAgIG5ldCA8LSBuZXQ0W2ksXQ0KICAgIGlmKGxlbmd0aChtYXRjaGVkKT4wKSB7ICAgICAgICAgICAgICMgaWYgbWF0Y2hpbmcgd2FzIHBlcmZvcm1lZCENCiAgICAgIGFsdGVyTFtbaV1dJG5hbWU0W21hdGNoZWRbLDJdXSA8LSBuZXRbbWF0Y2hlZFssMV1dDQogICAgfQ0KICB9DQp9DQoNCiNpIGFsc28gY2FsY3VsYXRlIHN0cnVjdHVyYWwgZW1iZWRkZWRuZXNzIChhbHRlci1sZXZlbCkgcGVyIGVnby1uZXQuDQpmb3IgKGkgaW4gMTpsZW5ndGgoYWx0ZXJMKSkgeyAjIGZvciBlZ28gaQ0KDQogICNnZXQgbnVtYmVyIG9mIG5hbWVzIGxpc3RlZCBpbiB0aGUgZWdvbmV0cw0KICBubmFtZXNfY2RuIDwtIGxlbmd0aCh3aGljaChkYXRhNFtpLGMoImVnb25ldDEuU1EwMDEuIiwiZWdvbmV0MS5TUTAwMi4iLCJlZ29uZXQxLlNRMDAzLiIsImVnb25ldDEuU1EwMDQuIiwiZWdvbmV0MS5TUTAwNS4iKV0hPSIiKSkNCiAgbm5hbWVzX3N0dWR5IDwtIGxlbmd0aCh3aGljaChkYXRhNFtpLGMoImVnb25ldDIuU1EwMDEuIiwiZWdvbmV0Mi5TUTAwMi4iLCJlZ29uZXQyLlNRMDAzLiIsImVnb25ldDIuU1EwMDQuIiwiZWdvbmV0Mi5TUTAwNS4iKV0hPSIiKSkNCiAgbm5hbWVzX2JmZiA8LSBsZW5ndGgod2hpY2goZGF0YTRbaSxjKCJlZ29uZXQzLlNRMDAxLiIsImVnb25ldDMuU1EwMDIuIiwiZWdvbmV0My5TUTAwMy4iLCJlZ29uZXQzLlNRMDA0LiIsImVnb25ldDMuU1EwMDUuIildIT0iIikpDQogIG5uYW1lc19jc24gPC0gbGVuZ3RoKHdoaWNoKGRhdGE0W2ksYygiZWdvbmV0NC5TUTAwMS4iLCJlZ29uZXQ0LlNRMDAyLiIsImVnb25ldDQuU1EwMDMuIiwiZWdvbmV0NC5TUTAwNC4iLCJlZ29uZXQ0LlNRMDA1LiIpXSE9IiIpKQ0KICANCiAgI0NETg0KICANCiAgI21ha2UgbGlzdCBvZiBhZGphY2VuY3kgbWF0cmljZXMNCiAgYWRqTCA8LSBsaXN0KCkNCiAgew0KICAjMiBhbHRlcnMNCiAgYWRqTFtbMl1dIDwtIG1hdHJpeChOQSxuY29sPTIsbnJvdz0yKQ0KICBhZGpMW1syXV1bMSwyXSA8LSBhZGpMW1syXV1bMiwxXSA8LSBkYXRhNCRhZGoxTjJhLlNRMDAxLltpXQ0KDQogICMzIGFsdGVycw0KICBhZGpMW1szXV0gPC0gbWF0cml4KE5BLG5jb2w9Myxucm93PTMpDQogIGFkakxbWzNdXVsxLDJdIDwtIGFkakxbWzNdXVsyLDFdIDwtIGRhdGE0JGFkajFOM2EuU1EwMDEuW2ldDQogIGFkakxbWzNdXVsxLDNdIDwtIGFkakxbWzNdXVszLDFdIDwtIGRhdGE0JGFkajFOM2EuU1EwMDIuW2ldDQogIGFkakxbWzNdXVsyLDNdIDwtIGFkakxbWzNdXVszLDJdIDwtIGRhdGE0JGFkajFOM2IuU1EwMDEuW2ldDQoNCiAgIzQgYWx0ZXJzDQogIGFkakxbWzRdXSA8LSBtYXRyaXgoTkEsbmNvbD00LG5yb3c9NCkNCiAgYWRqTFtbNF1dWzEsMl0gPC0gYWRqTFtbNF1dWzIsMV0gPC0gZGF0YTQkYWRqMU40YS5TUTAwMS5baV0NCiAgYWRqTFtbNF1dWzEsM10gPC0gYWRqTFtbNF1dWzMsMV0gPC0gZGF0YTQkYWRqMU40YS5TUTAwMi5baV0NCiAgYWRqTFtbNF1dWzEsNF0gPC0gYWRqTFtbNF1dWzQsMV0gPC0gZGF0YTQkYWRqMU40YS5TUTAwMy5baV0NCiAgYWRqTFtbNF1dWzIsM10gPC0gYWRqTFtbNF1dWzMsMl0gPC0gZGF0YTQkYWRqMU40Yi5TUTAwMS5baV0NCiAgYWRqTFtbNF1dWzIsNF0gPC0gYWRqTFtbNF1dWzQsMl0gPC0gZGF0YTQkYWRqMU40Yi5TUTAwMi5baV0NCiAgYWRqTFtbNF1dWzMsNF0gPC0gYWRqTFtbNF1dWzQsM10gPC0gZGF0YTQkYWRqMU40Yy5TUTAwMS5baV0NCg0KICAjNSBhbHRlcnMNCiAgYWRqTFtbNV1dIDwtIG1hdHJpeChOQSxuY29sPTUsbnJvdz01KQ0KICBhZGpMW1s1XV1bMSwyXSA8LSBhZGpMW1s1XV1bMiwxXSA8LSBkYXRhNCRhZGoxTjVhLlNRMDAxLltpXQ0KICBhZGpMW1s1XV1bMSwzXSA8LSBhZGpMW1s1XV1bMywxXSA8LSBkYXRhNCRhZGoxTjVhLlNRMDAyLltpXQ0KICBhZGpMW1s1XV1bMSw0XSA8LSBhZGpMW1s1XV1bNCwxXSA8LSBkYXRhNCRhZGoxTjVhLlNRMDAzLltpXQ0KICBhZGpMW1s1XV1bMSw1XSA8LSBhZGpMW1s1XV1bNSwxXSA8LSBkYXRhNCRhZGoxTjVhLlNRMDA0LltpXQ0KICBhZGpMW1s1XV1bMiwzXSA8LSBhZGpMW1s1XV1bMywyXSA8LSBkYXRhNCRhZGoxTjViLlNRMDAxLltpXQ0KICBhZGpMW1s1XV1bMiw0XSA8LSBhZGpMW1s1XV1bNCwyXSA8LSBkYXRhNCRhZGoxTjViLlNRMDAyLltpXQ0KICBhZGpMW1s1XV1bMiw1XSA8LSBhZGpMW1s1XV1bNSwyXSA8LSBkYXRhNCRhZGoxTjViLlNRMDAzLltpXQ0KICBhZGpMW1s1XV1bMyw0XSA8LSBhZGpMW1s1XV1bNCwzXSA8LSBkYXRhNCRhZGoxTjVjLlNRMDAxLltpXQ0KICBhZGpMW1s1XV1bMyw1XSA8LSBhZGpMW1s1XV1bNSwzXSA8LSBkYXRhNCRhZGoxTjVjLlNRMDAyLltpXQ0KICBhZGpMW1s1XV1bNCw1XSA8LSBhZGpMW1s1XV1bNSw0XSA8LSBkYXRhNCRhZGoxTjVkLlNRMDAxLltpXQ0KICB9DQoNCiAgaWYobm5hbWVzX2Nkbj4xKSB7ICN3ZSBvbmx5IGtub3cgYWx0ZXItYWx0ZXIgcmVsYXRpb25zIGZvciBubmFtZXM+MQ0KICAgICN0YWtlIHRoZSBtYXRyaXggY29ycmVzcG9uZGluZyB0aGUgbm5hbWVzDQogICAgbWF0IDwtIGFkakxbW25uYW1lc19jZG5dXQ0KICAgIA0KICAgICN0aWVzIHRoYXQgYXJlICh2ZXJ5KSBjbG9zZSBhcmUgMQ0KICAgIG1hdFshaXMubmEobWF0KV0gPC0gaWZlbHNlKG1hdFshaXMubmEobWF0KV09PSJFcmcgaGVjaHQiIHwgbWF0WyFpcy5uYShtYXQpXT09IkhlY2h0IiwgMSwwKQ0KDQogICAgI2NhbGN1bGF0ZSBlbWJlZGRlZG5lc3MgZm9yIGVhY2ggYWx0ZXIvcm93Og0KICAgIGVtYmVkIDwtIGFwcGx5KG1hdCwgMSwgZnVuY3Rpb24ocm93KSB7DQogICAgbl9jb2xzIDwtIHN1bSghaXMubmEocm93KSkNCiAgICBuX29uZXMgPC0gc3VtKHJvdyA9PSAiMSIsIG5hLnJtID0gVFJVRSkNCiAgICByYXRpbyA8LSBuX29uZXMgLyBuX2NvbHMNCiAgICByZXR1cm4ocmF0aW8pDQogICAgfSkNCiAgDQogICNDRE46IDE6bm5hbWVzX0NETg0KICBhbHRlckxbW2ldXSRjZG5fZW1iZWQudDJbMTpubmFtZXNfY2RuXSA8LSBlbWJlZCANCiAgfQ0KICANCiAgI1NUVURZDQoNCiAgI21ha2UgbGlzdCBvZiBhZGphY2VuY3kgbWF0cmljZXMNCiAgYWRqTCA8LSBsaXN0KCkNCiAgew0KICAjMiBhbHRlcnMNCiAgYWRqTFtbMl1dIDwtIG1hdHJpeChOQSxuY29sPTIsbnJvdz0yKQ0KICBhZGpMW1syXV1bMSwyXSA8LSBhZGpMW1syXV1bMiwxXSA8LSBkYXRhNCRhZGoyTjJhLlNRMDAxLltpXQ0KDQogICMzIGFsdGVycw0KICBhZGpMW1szXV0gPC0gbWF0cml4KE5BLG5jb2w9Myxucm93PTMpDQogIGFkakxbWzNdXVsxLDJdIDwtIGFkakxbWzNdXVsyLDFdIDwtIGRhdGE0JGFkajJOM2EuU1EwMDEuW2ldDQogIGFkakxbWzNdXVsxLDNdIDwtIGFkakxbWzNdXVszLDFdIDwtIGRhdGE0JGFkajJOM2EuU1EwMDIuW2ldDQogIGFkakxbWzNdXVsyLDNdIDwtIGFkakxbWzNdXVszLDJdIDwtIGRhdGE0JGFkajJOM2IuU1EwMDEuW2ldDQoNCiAgIzQgYWx0ZXJzDQogIGFkakxbWzRdXSA8LSBtYXRyaXgoTkEsbmNvbD00LG5yb3c9NCkNCiAgYWRqTFtbNF1dWzEsMl0gPC0gYWRqTFtbNF1dWzIsMV0gPC0gZGF0YTQkYWRqMk40YS5TUTAwMS5baV0NCiAgYWRqTFtbNF1dWzEsM10gPC0gYWRqTFtbNF1dWzMsMV0gPC0gZGF0YTQkYWRqMk40YS5TUTAwMi5baV0NCiAgYWRqTFtbNF1dWzEsNF0gPC0gYWRqTFtbNF1dWzQsMV0gPC0gZGF0YTQkYWRqMk40YS5TUTAwMy5baV0NCiAgYWRqTFtbNF1dWzIsM10gPC0gYWRqTFtbNF1dWzMsMl0gPC0gZGF0YTQkYWRqMk40Yi5TUTAwMS5baV0NCiAgYWRqTFtbNF1dWzIsNF0gPC0gYWRqTFtbNF1dWzQsMl0gPC0gZGF0YTQkYWRqMk40Yi5TUTAwMi5baV0NCiAgYWRqTFtbNF1dWzMsNF0gPC0gYWRqTFtbNF1dWzQsM10gPC0gZGF0YTQkYWRqMk40Yy5TUTAwMS5baV0NCg0KICAjNSBhbHRlcnMNCiAgYWRqTFtbNV1dIDwtIG1hdHJpeChOQSxuY29sPTUsbnJvdz01KQ0KICBhZGpMW1s1XV1bMSwyXSA8LSBhZGpMW1s1XV1bMiwxXSA8LSBkYXRhNCRhZGoyTjVhLlNRMDAxLltpXQ0KICBhZGpMW1s1XV1bMSwzXSA8LSBhZGpMW1s1XV1bMywxXSA8LSBkYXRhNCRhZGoyTjVhLlNRMDAyLltpXQ0KICBhZGpMW1s1XV1bMSw0XSA8LSBhZGpMW1s1XV1bNCwxXSA8LSBkYXRhNCRhZGoyTjVhLlNRMDAzLltpXQ0KICBhZGpMW1s1XV1bMSw1XSA8LSBhZGpMW1s1XV1bNSwxXSA8LSBkYXRhNCRhZGoyTjVhLlNRMDA0LltpXQ0KICBhZGpMW1s1XV1bMiwzXSA8LSBhZGpMW1s1XV1bMywyXSA8LSBkYXRhNCRhZGoyTjViLlNRMDAxLltpXQ0KICBhZGpMW1s1XV1bMiw0XSA8LSBhZGpMW1s1XV1bNCwyXSA8LSBkYXRhNCRhZGoyTjViLlNRMDAyLltpXQ0KICBhZGpMW1s1XV1bMiw1XSA8LSBhZGpMW1s1XV1bNSwyXSA8LSBkYXRhNCRhZGoyTjViLlNRMDAzLltpXQ0KICBhZGpMW1s1XV1bMyw0XSA8LSBhZGpMW1s1XV1bNCwzXSA8LSBkYXRhNCRhZGoyTjVjLlNRMDAxLltpXQ0KICBhZGpMW1s1XV1bMyw1XSA8LSBhZGpMW1s1XV1bNSwzXSA8LSBkYXRhNCRhZGoyTjVjLlNRMDAyLltpXQ0KICBhZGpMW1s1XV1bNCw1XSA8LSBhZGpMW1s1XV1bNSw0XSA8LSBkYXRhNCRhZGoyTjVkLlNRMDAxLltpXQ0KICB9DQoNCiAgaWYobm5hbWVzX3N0dWR5PjEpIHsgI3dlIG9ubHkga25vdyBhbHRlci1hbHRlciByZWxhdGlvbnMgZm9yIG5uYW1lcw0KICAgICN0YWtlIHRoZSBtYXRyaXggY29ycmVzcG9uZGluZyB0aGUgbm5hbWVzDQogICAgbWF0IDwtIGFkakxbW25uYW1lc19zdHVkeV1dDQogICAgDQogICAgI3RpZXMgdGhhdCBhcmUgKHZlcnkpIGNsb3NlIGFyZSAxDQogICAgbWF0WyFpcy5uYShtYXQpXSA8LSBpZmVsc2UobWF0WyFpcy5uYShtYXQpXT09IkVyZyBoZWNodCIgfCBtYXRbIWlzLm5hKG1hdCldPT0iSGVjaHQiLCAxLDApDQoNCiAgICAjY2FsY3VsYXRlIGVtYmVkZGVkbmVzcyBmb3IgZWFjaCBhbHRlci9yb3c6DQogICAgZW1iZWQgPC0gYXBwbHkobWF0LCAxLCBmdW5jdGlvbihyb3cpIHsNCiAgICBuX2NvbHMgPC0gc3VtKCFpcy5uYShyb3cpKQ0KICAgIG5fb25lcyA8LSBzdW0ocm93ID09ICIxIiwgbmEucm0gPSBUUlVFKQ0KICAgIHJhdGlvIDwtIG5fb25lcyAvIG5fY29scw0KICAgIHJldHVybihyYXRpbykNCiAgICB9KQ0KICAgIA0KICAgIGFsdGVyTFtbaV1dJHN0dWR5X2VtYmVkLnQyWzY6KDUrbm5hbWVzX3N0dWR5KV0gPC0gZW1iZWQgDQogIH0NCiAgDQogICMgQkVTVCBGUklFTkRTDQogICNtYWtlIGxpc3Qgb2YgYWRqYWNlbmN5IG1hdHJpY2VzDQogIGFkakwgPC0gbGlzdCgpDQogIHsNCiAgIzIgYWx0ZXJzDQogIGFkakxbWzJdXSA8LSBtYXRyaXgoTkEsbmNvbD0yLG5yb3c9MikNCiAgYWRqTFtbMl1dWzEsMl0gPC0gYWRqTFtbMl1dWzIsMV0gPC0gZGF0YTQkYWRqM04yYS5TUTAwMS5baV0NCg0KICAjMyBhbHRlcnMNCiAgYWRqTFtbM11dIDwtIG1hdHJpeChOQSxuY29sPTMsbnJvdz0zKQ0KICBhZGpMW1szXV1bMSwyXSA8LSBhZGpMW1szXV1bMiwxXSA8LSBkYXRhNCRhZGozTjNhLlNRMDAxLltpXQ0KICBhZGpMW1szXV1bMSwzXSA8LSBhZGpMW1szXV1bMywxXSA8LSBkYXRhNCRhZGozTjNhLlNRMDAyLltpXQ0KICBhZGpMW1szXV1bMiwzXSA8LSBhZGpMW1szXV1bMywyXSA8LSBkYXRhNCRhZGozTjNiLlNRMDAxLltpXQ0KDQogICM0IGFsdGVycw0KICBhZGpMW1s0XV0gPC0gbWF0cml4KE5BLG5jb2w9NCxucm93PTQpDQogIGFkakxbWzRdXVsxLDJdIDwtIGFkakxbWzRdXVsyLDFdIDwtIGRhdGE0JGFkajNONGEuU1EwMDEuW2ldDQogIGFkakxbWzRdXVsxLDNdIDwtIGFkakxbWzRdXVszLDFdIDwtIGRhdGE0JGFkajNONGEuU1EwMDIuW2ldDQogIGFkakxbWzRdXVsxLDRdIDwtIGFkakxbWzRdXVs0LDFdIDwtIGRhdGE0JGFkajNONGEuU1EwMDMuW2ldDQogIGFkakxbWzRdXVsyLDNdIDwtIGFkakxbWzRdXVszLDJdIDwtIGRhdGE0JGFkajNONGIuU1EwMDEuW2ldDQogIGFkakxbWzRdXVsyLDRdIDwtIGFkakxbWzRdXVs0LDJdIDwtIGRhdGE0JGFkajNONGIuU1EwMDIuW2ldDQogIGFkakxbWzRdXVszLDRdIDwtIGFkakxbWzRdXVs0LDNdIDwtIGRhdGE0JGFkajNONGMuU1EwMDEuW2ldDQoNCiAgIzUgYWx0ZXJzDQogIGFkakxbWzVdXSA8LSBtYXRyaXgoTkEsbmNvbD01LG5yb3c9NSkNCiAgYWRqTFtbNV1dWzEsMl0gPC0gYWRqTFtbNV1dWzIsMV0gPC0gZGF0YTQkYWRqM041YS5TUTAwMS5baV0NCiAgYWRqTFtbNV1dWzEsM10gPC0gYWRqTFtbNV1dWzMsMV0gPC0gZGF0YTQkYWRqM041YS5TUTAwMi5baV0NCiAgYWRqTFtbNV1dWzEsNF0gPC0gYWRqTFtbNV1dWzQsMV0gPC0gZGF0YTQkYWRqM041YS5TUTAwMy5baV0NCiAgYWRqTFtbNV1dWzEsNV0gPC0gYWRqTFtbNV1dWzUsMV0gPC0gZGF0YTQkYWRqM041YS5TUTAwNC5baV0NCiAgYWRqTFtbNV1dWzIsM10gPC0gYWRqTFtbNV1dWzMsMl0gPC0gZGF0YTQkYWRqM041Yi5TUTAwMS5baV0NCiAgYWRqTFtbNV1dWzIsNF0gPC0gYWRqTFtbNV1dWzQsMl0gPC0gZGF0YTQkYWRqM041Yi5TUTAwMi5baV0NCiAgYWRqTFtbNV1dWzIsNV0gPC0gYWRqTFtbNV1dWzUsMl0gPC0gZGF0YTQkYWRqM041Yi5TUTAwMy5baV0NCiAgYWRqTFtbNV1dWzMsNF0gPC0gYWRqTFtbNV1dWzQsM10gPC0gZGF0YTQkYWRqM041Yy5TUTAwMS5baV0NCiAgYWRqTFtbNV1dWzMsNV0gPC0gYWRqTFtbNV1dWzUsM10gPC0gZGF0YTQkYWRqM041Yy5TUTAwMi5baV0NCiAgYWRqTFtbNV1dWzQsNV0gPC0gYWRqTFtbNV1dWzUsNF0gPC0gZGF0YTQkYWRqM041ZC5TUTAwMS5baV0NCiAgfQ0KDQogIGlmKG5uYW1lc19iZmY+MSkgeyAjd2Ugb25seSBrbm93IGFsdGVyLWFsdGVyIHJlbGF0aW9ucyBmb3Igbm5hbWVzDQogICAgI3Rha2UgdGhlIG1hdHJpeCBjb3JyZXNwb25kaW5nIHRoZSBubmFtZXMNCiAgICBtYXQgPC0gYWRqTFtbbm5hbWVzX2JmZl1dDQogICAgDQogICAgI3RpZXMgdGhhdCBhcmUgKHZlcnkpIGNsb3NlIGFyZSAxDQogICAgbWF0WyFpcy5uYShtYXQpXSA8LSBpZmVsc2UobWF0WyFpcy5uYShtYXQpXT09IkVyZyBoZWNodCIgfCBtYXRbIWlzLm5hKG1hdCldPT0iSGVjaHQiLCAxLDApDQoNCiAgICAjY2FsY3VsYXRlIGVtYmVkZGVkbmVzcyBmb3IgZWFjaCBhbHRlci9yb3c6DQogICAgZW1iZWQgPC0gYXBwbHkobWF0LCAxLCBmdW5jdGlvbihyb3cpIHsNCiAgICBuX2NvbHMgPC0gc3VtKCFpcy5uYShyb3cpKQ0KICAgIG5fb25lcyA8LSBzdW0ocm93ID09ICIxIiwgbmEucm0gPSBUUlVFKQ0KICAgIHJhdGlvIDwtIG5fb25lcyAvIG5fY29scw0KICAgIHJldHVybihyYXRpbykNCiAgICB9KQ0KICAgIA0KICAgIGFsdGVyTFtbaV1dJGJmZl9lbWJlZC50MlsxMTooMTArbm5hbWVzX2JmZildIDwtIGVtYmVkIA0KICB9DQoNCiAgIyBTUE9SVFMgUEFSVE5FUlMNCiAgI21ha2UgbGlzdCBvZiBhZGphY2VuY3kgbWF0cmljZXMNCiAgYWRqTCA8LSBsaXN0KCkNCiAgew0KICAjMiBhbHRlcnMNCiAgYWRqTFtbMl1dIDwtIG1hdHJpeChOQSxuY29sPTIsbnJvdz0yKQ0KICBhZGpMW1syXV1bMSwyXSA8LSBhZGpMW1syXV1bMiwxXSA8LSBkYXRhNCRhZGo0TjJhLlNRMDAxLltpXQ0KDQogICMzIGFsdGVycw0KICBhZGpMW1szXV0gPC0gbWF0cml4KE5BLG5jb2w9Myxucm93PTMpDQogIGFkakxbWzNdXVsxLDJdIDwtIGFkakxbWzNdXVsyLDFdIDwtIGRhdGE0JGFkajROM2EuU1EwMDEuW2ldDQogIGFkakxbWzNdXVsxLDNdIDwtIGFkakxbWzNdXVszLDFdIDwtIGRhdGE0JGFkajROM2EuU1EwMDIuW2ldDQogIGFkakxbWzNdXVsyLDNdIDwtIGFkakxbWzNdXVszLDJdIDwtIGRhdGE0JGFkajROM2IuU1EwMDEuW2ldDQoNCiAgIzQgYWx0ZXJzDQogIGFkakxbWzRdXSA8LSBtYXRyaXgoTkEsbmNvbD00LG5yb3c9NCkNCiAgYWRqTFtbNF1dWzEsMl0gPC0gYWRqTFtbNF1dWzIsMV0gPC0gZGF0YTQkYWRqNE40YS5TUTAwMS5baV0NCiAgYWRqTFtbNF1dWzEsM10gPC0gYWRqTFtbNF1dWzMsMV0gPC0gZGF0YTQkYWRqNE40YS5TUTAwMi5baV0NCiAgYWRqTFtbNF1dWzEsNF0gPC0gYWRqTFtbNF1dWzQsMV0gPC0gZGF0YTQkYWRqNE40YS5TUTAwMy5baV0NCiAgYWRqTFtbNF1dWzIsM10gPC0gYWRqTFtbNF1dWzMsMl0gPC0gZGF0YTQkYWRqNE40Yi5TUTAwMS5baV0NCiAgYWRqTFtbNF1dWzIsNF0gPC0gYWRqTFtbNF1dWzQsMl0gPC0gZGF0YTQkYWRqNE40Yi5TUTAwMi5baV0NCiAgYWRqTFtbNF1dWzMsNF0gPC0gYWRqTFtbNF1dWzQsM10gPC0gZGF0YTQkYWRqNE40Yy5TUTAwMS5baV0NCg0KICAjNSBhbHRlcnMNCiAgYWRqTFtbNV1dIDwtIG1hdHJpeChOQSxuY29sPTUsbnJvdz01KQ0KICBhZGpMW1s1XV1bMSwyXSA8LSBhZGpMW1s1XV1bMiwxXSA8LSBkYXRhNCRhZGo0TjVhLlNRMDAxLltpXQ0KICBhZGpMW1s1XV1bMSwzXSA8LSBhZGpMW1s1XV1bMywxXSA8LSBkYXRhNCRhZGo0TjVhLlNRMDAyLltpXQ0KICBhZGpMW1s1XV1bMSw0XSA8LSBhZGpMW1s1XV1bNCwxXSA8LSBkYXRhNCRhZGo0TjVhLlNRMDAzLltpXQ0KICBhZGpMW1s1XV1bMSw1XSA8LSBhZGpMW1s1XV1bNSwxXSA8LSBkYXRhNCRhZGo0TjVhLlNRMDA0LltpXQ0KICBhZGpMW1s1XV1bMiwzXSA8LSBhZGpMW1s1XV1bMywyXSA8LSBkYXRhNCRhZGo0TjViLlNRMDAxLltpXQ0KICBhZGpMW1s1XV1bMiw0XSA8LSBhZGpMW1s1XV1bNCwyXSA8LSBkYXRhNCRhZGo0TjViLlNRMDAyLltpXQ0KICBhZGpMW1s1XV1bMiw1XSA8LSBhZGpMW1s1XV1bNSwyXSA8LSBkYXRhNCRhZGo0TjViLlNRMDAzLltpXQ0KICBhZGpMW1s1XV1bMyw0XSA8LSBhZGpMW1s1XV1bNCwzXSA8LSBkYXRhNCRhZGo0TjVjLlNRMDAxLltpXQ0KICBhZGpMW1s1XV1bMyw1XSA8LSBhZGpMW1s1XV1bNSwzXSA8LSBkYXRhNCRhZGo0TjVjLlNRMDAyLltpXQ0KICBhZGpMW1s1XV1bNCw1XSA8LSBhZGpMW1s1XV1bNSw0XSA8LSBkYXRhNCRhZGo0TjVkLlNRMDAxLltpXQ0KICB9DQoNCiAgaWYobm5hbWVzX2Nzbj4xKSB7ICN3ZSBvbmx5IGtub3cgYWx0ZXItYWx0ZXIgcmVsYXRpb25zIGZvciBubmFtZXM+Mg0KICAgICN0YWtlIHRoZSBtYXRyaXggY29ycmVzcG9uZGluZyB0aGUgbm5hbWVzDQogICAgbWF0IDwtIGFkakxbW25uYW1lc19jc25dXQ0KICAgIA0KICAgICN0aWVzIHRoYXQgYXJlICh2ZXJ5KSBjbG9zZSBhcmUgMQ0KICAgIG1hdFshaXMubmEobWF0KV0gPC0gaWZlbHNlKG1hdFshaXMubmEobWF0KV09PSJFcmcgaGVjaHQiIHwgbWF0WyFpcy5uYShtYXQpXT09IkhlY2h0IiwgMSwwKQ0KDQogICAgI2NhbGN1bGF0ZSBlbWJlZGRlZG5lc3MgZm9yIGVhY2ggYWx0ZXIvcm93Og0KICAgIGVtYmVkIDwtIGFwcGx5KG1hdCwgMSwgZnVuY3Rpb24ocm93KSB7DQogICAgbl9jb2xzIDwtIHN1bSghaXMubmEocm93KSkNCiAgICBuX29uZXMgPC0gc3VtKHJvdyA9PSAiMSIsIG5hLnJtID0gVFJVRSkNCiAgICByYXRpbyA8LSBuX29uZXMgLyBuX2NvbHMNCiAgICByZXR1cm4ocmF0aW8pDQogICAgfSkNCiAgICANCiAgICBhbHRlckxbW2ldXSRjc25fZW1iZWQudDJbMTY6KDE1K25uYW1lc19jc24pXSA8LSBlbWJlZCANCiAgfQ0KfQ0KDQojYWx0ZXJzIGNvdWxkIGJlIG5hbWVkIGluIG11bHRpcGxlIG5hbWUgZ2VuZXJhdG9ycy4gZWFjaCBlbGVtZW50IG9mIGFsdGVyTCBjb250YWlucyByb3dzIGNvcnJlc3BvbmRpbmcgdG8gYWx0ZXJzIHRoYXQgbWF5IGJlICdkdXBsaWNhdGVzJy4NCiNpIG1hdGNoIHRoZSBzdHJ1Y3R1cmFsIGVtYmVkZGVkbmVzcyBtZWFzdXJlcw0KDQpmb3IgKGkgaW4gMTpsZW5ndGgoYWx0ZXJMKSkgeyAjZm9yIGVnbyBpIA0KICBmb3IgKGogaW4gMTpucm93KGFsdGVyTFtbaV1dKSkgeyAjZm9yIGFsdGVyIGoNCiANCiAgICAjaWYgbmFtZTIgaXMgbm90IGVtcHR5LCBhbHRlciBqIHdhcyBtYXRjaGVkIHRvIHRoZSBzdHVkeSBuZXR3b3JrOyBhbmQgbW9yZSBwcmVjaXNlbHksIHRvIHRoZSBzdHVkeSBwYXJ0bmVyIHdpdGggbmFtZTE6IGFsdGVyTFtbaV1dJG5hbWUyW2pdDQogICAgYWx0ZXJMW1tpXV0kc3R1ZHlfZW1iZWQudDJbal0gPC0gaWZlbHNlKCFpcy5uYShhbHRlckxbW2ldXSRuYW1lMltqXSksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHRlckxbW2ldXSRzdHVkeV9lbWJlZC50Mlt3aGljaChhbHRlckxbW2ldXSRuYW1lMT09YWx0ZXJMW1tpXV0kbmFtZTJbal0gJiAhaXMubmEoYWx0ZXJMW1tpXV0kc3R1ZHlfZW1iZWQudDIpKV0sIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHRlckxbW2ldXSRzdHVkeV9lbWJlZC50MltqXSkNCiAgICANCiAgICAjaWYgbmFtZTMgaXMgbm90IGVtcHR5LCBhbHRlciBqIHdhcyBtYXRjaGVkIHRvIHRoZSBmcmllbmRzIG5ldHdvcms7IGFuZCBtb3JlIHByZWNpc2VseSwgdG8gdGhlIGZyaWVuZCB3aXRoIG5hbWUxOiBhbHRlckxbW2ldXSRuYW1lM1tqXQ0KICAgIGFsdGVyTFtbaV1dJGJmZl9lbWJlZC50MltqXSA8LSBpZmVsc2UoIWlzLm5hKGFsdGVyTFtbaV1dJG5hbWUzW2pdKSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHRlckxbW2ldXSRiZmZfZW1iZWQudDJbd2hpY2goYWx0ZXJMW1tpXV0kbmFtZTEgPT0gYWx0ZXJMW1tpXV0kbmFtZTNbal0gJiAhaXMubmEoYWx0ZXJMW1tpXV0kYmZmX2VtYmVkLnQyKSldLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsdGVyTFtbaV1dJGJmZl9lbWJlZC50MltqXSkNCiAgICANCiAgICAjaWYgbmFtZTQgaXMgbm90IGVtcHR5LCBhbHRlciBqIHdhcyBtYXRjaGVkIHRvIHRoZSBzcG9ydHMgbmV0d29yazsgYW5kIG1vcmUgcHJlY2lzZWx5LCB0byB0aGUgc3BvcnRzIHBhcnRuZXIgd2l0aCBuYW1lMTogYWx0ZXJMW1tpXV0kbmFtZTRbal0NCiAgICBhbHRlckxbW2ldXSRjc25fZW1iZWQudDJbal0gPC0gaWZlbHNlKCFpcy5uYShhbHRlckxbW2ldXSRuYW1lNFtqXSksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWx0ZXJMW1tpXV0kY3NuX2VtYmVkLnQyW3doaWNoKGFsdGVyTFtbaV1dJG5hbWUxID09IGFsdGVyTFtbaV1dJG5hbWU0W2pdICYgIWlzLm5hKGFsdGVyTFtbaV1dJGNzbl9lbWJlZC50MikpXSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsdGVyTFtbaV1dJGNzbl9lbWJlZC50MltqXSApDQoNCiAgfQ0KfQ0KDQojd2hpbGUgaW4gd2F2ZSAxLCBvbmx5IHRoZSB1bmlxdWUgYWx0ZXJzIHdlcmUgbGlzdGVkIGluIHRoZSBnZW5kZXItbmFtZSBpbnRlcnByZXRlcnMNCiNpbiB3YXZlIDIsIG9ubHkgdGhlIE5FVyBhbHRlcnMgd2VyZSBsaXN0ZWQgKHNpbmNlIGl0IGlzIGEgc3RhYmxlIGNoYXJhY3RlcmlzdGljKQ0KI3NvIG9ubHkgdGhlIG5vbi1tYXRjaGVkIGFsdGVycyB0aGF0IGRpZCBub3QgYXBwZWFyIGluIHcxDQojaSBhc2tlZCByZXNwb25kZW50cyB0byAnY2hlY2snIG1hbGVzLg0KDQojZ2VuZGVyDQpkZl9tYWxlcyA8LSBkYXRhLmZyYW1lKHAxID0gZGF0YTQkbWFsZXMuU1EwMDEuLHAyID0gZGF0YTQkbWFsZXMuU1EwMDIuLHAzID0gZGF0YTQkbWFsZXMuU1EwMDMuLHA0ID0gZGF0YTQkbWFsZXMuU1EwMDQuLHA1ID0gZGF0YTQkbWFsZXMuU1EwMDUuLHA2ID0gZGF0YTQkbWFsZXMuU1EwMDYuLHA3ID0gZGF0YTQkbWFsZXMuU1EwMDcuLHA4ID0gZGF0YTQkbWFsZXMuU1EwMDguLHA5ID0gZGF0YTQkbWFsZXMuU1EwMDkuLHAxMD0gZGF0YTQkbWFsZXMuU1EwMTAuLHAxMT0gZGF0YTQkbWFsZXMuU1EwMTEuLHAxMj0gZGF0YTQkbWFsZXMuU1EwMTIuLHAxMz0gZGF0YTQkbWFsZXMuU1EwMTMuLHAxND0gZGF0YTQkbWFsZXMuU1EwMTQuLHAxNT0gZGF0YTQkbWFsZXMuU1EwMTUuLHAxNj0gZGF0YTQkbWFsZXMuU1EwMTYuLHAxNz0gZGF0YTQkbWFsZXMuU1EwMTcuLHAxOD0gZGF0YTQkbWFsZXMuU1EwMTguLHAxOT0gZGF0YTQkbWFsZXMuU1EwMTkuLHAyMD0gZGF0YTQkbWFsZXMuU1EwMjAuKQ0KDQoja2luIA0KZGZfa2luIDwtIGRhdGEuZnJhbWUocDEgPSBkYXRhNCRraW4uU1EwMDEuLHAyID0gZGF0YTQka2luLlNRMDAyLixwMyA9IGRhdGE0JGtpbi5TUTAwMy4scDQgPSBkYXRhNCRraW4uU1EwMDQuLHA1ID0gZGF0YTQka2luLlNRMDA1LixwNiA9IGRhdGE0JGtpbi5TUTAwNi4scDcgPSBkYXRhNCRraW4uU1EwMDcuLHA4ID0gZGF0YTQka2luLlNRMDA4LixwOSA9IGRhdGE0JGtpbi5TUTAwOS4sIHAxMD0gZGF0YTQka2luLlNRMDEwLiwgcDExPSBkYXRhNCRraW4uU1EwMTEuLCBwMTI9IGRhdGE0JGtpbi5TUTAxMi4sIHAxMz0gZGF0YTQka2luLlNRMDEzLiwgcDE0PSBkYXRhNCRraW4uU1EwMTQuLHAxNT0gZGF0YTQka2luLlNRMDE1LiwgcDE2PSBkYXRhNCRraW4uU1EwMTYuLCBwMTc9IGRhdGE0JGtpbi5TUTAxNy4sIHAxOD0gZGF0YTQka2luLlNRMDE4LiwgcDE5PSBkYXRhNCRraW4uU1EwMTkuLCBwMjA9IGRhdGE0JGtpbi5TUTAyMC4pDQoNCiNhZ2UgDQpkZl9hZ2UgPC0gZGF0YS5mcmFtZShwMSA9IGRhdGE0JGFnZS5TUTAwMS4scDIgPSBkYXRhNCRhZ2UuU1EwMDIuLHAzID0gZGF0YTQkYWdlLlNRMDAzLixwNCA9IGRhdGE0JGFnZS5TUTAwNC4scDUgPSBkYXRhNCRhZ2UuU1EwMDUuLHA2ID0gZGF0YTQkYWdlLlNRMDA2LixwNyA9IGRhdGE0JGFnZS5TUTAwNy4scDggPSBkYXRhNCRhZ2UuU1EwMDguLHA5ID0gZGF0YTQkYWdlLlNRMDA5LiwgcDEwPSBkYXRhNCRhZ2UuU1EwMTAuLCBwMTE9IGRhdGE0JGFnZS5TUTAxMS4sIHAxMj0gZGF0YTQkYWdlLlNRMDEyLiwgcDEzPSBkYXRhNCRhZ2UuU1EwMTMuLCBwMTQ9IGRhdGE0JGFnZS5TUTAxNC4scDE1PSBkYXRhNCRhZ2UuU1EwMTUuLCBwMTY9IGRhdGE0JGFnZS5TUTAxNi4sIHAxNz0gZGF0YTQkYWdlLlNRMDE3LiwgcDE4PSBkYXRhNCRhZ2UuU1EwMTguLCBwMTk9IGRhdGE0JGFnZS5TUTAxOS4sIHAyMD0gZGF0YTQkYWdlLlNRMDIwLikNCg0KI2VkdWMgDQpkZl9lZHVjIDwtIGRhdGEuZnJhbWUocDEgPSBkYXRhNCRlZHVjLlNRMDAxLixwMiA9IGRhdGE0JGVkdWMuU1EwMDIuLHAzID0gZGF0YTQkZWR1Yy5TUTAwMy4scDQgPSBkYXRhNCRlZHVjLlNRMDA0LixwNSA9IGRhdGE0JGVkdWMuU1EwMDUuLHA2ID0gZGF0YTQkZWR1Yy5TUTAwNi4scDcgPSBkYXRhNCRlZHVjLlNRMDA3LixwOCA9IGRhdGE0JGVkdWMuU1EwMDguLHA5ID0gZGF0YTQkZWR1Yy5TUTAwOS4sIHAxMD0gZGF0YTQkZWR1Yy5TUTAxMC4sIHAxMT0gZGF0YTQkZWR1Yy5TUTAxMS4sIHAxMj0gZGF0YTQkZWR1Yy5TUTAxMi4sIHAxMz0gZGF0YTQkZWR1Yy5TUTAxMy4sIHAxND0gZGF0YTQkZWR1Yy5TUTAxNC4scDE1PSBkYXRhNCRlZHVjLlNRMDE1LiwgcDE2PSBkYXRhNCRlZHVjLlNRMDE2LiwgcDE3PSBkYXRhNCRlZHVjLlNRMDE3LiwgcDE4PSBkYXRhNCRlZHVjLlNRMDE4LiwgcDE5PSBkYXRhNCRlZHVjLlNRMDE5LiwgcDIwPSBkYXRhNCRlZHVjLlNRMDIwLikNCg0KI2R1cmF0aW9uIA0KZGZfZHVyYXRpb24gPC0gZGF0YS5mcmFtZShwMSA9IGRhdGE0JGR1dXIuU1EwMDEuLHAyID0gZGF0YTQkZHV1ci5TUTAwMi4scDMgPSBkYXRhNCRkdXVyLlNRMDAzLixwNCA9IGRhdGE0JGR1dXIuU1EwMDQuLHA1ID0gZGF0YTQkZHV1ci5TUTAwNS4scDYgPSBkYXRhNCRkdXVyLlNRMDA2LixwNyA9IGRhdGE0JGR1dXIuU1EwMDcuLHA4ID0gZGF0YTQkZHV1ci5TUTAwOC4scDkgPSBkYXRhNCRkdXVyLlNRMDA5LixwMTA9IGRhdGE0JGR1dXIuU1EwMTAuLHAxMT0gZGF0YTQkZHV1ci5TUTAxMS4scDEyPSBkYXRhNCRkdXVyLlNRMDEyLixwMTM9IGRhdGE0JGR1dXIuU1EwMTMuLHAxND0gZGF0YTQkZHV1ci5TUTAxNC4scDE1PSBkYXRhNCRkdXVyLlNRMDE1LixwMTY9IGRhdGE0JGR1dXIuU1EwMTYuLHAxNz0gZGF0YTQkZHV1ci5TUTAxNy4scDE4PSBkYXRhNCRkdXVyLlNRMDE4LixwMTk9IGRhdGE0JGR1dXIuU1EwMTkuLHAyMD0gZGF0YTQkZHV1ci5TUTAyMC4pDQoNCiNwcm94aW1pdHkNCmRmX3Byb3hpbWl0eSA8LSBkYXRhLmZyYW1lKHAxID0gZGF0YTQkcHJveC5TUTAwMS4scDIgPSBkYXRhNCRwcm94LlNRMDAyLixwMyA9IGRhdGE0JHByb3guU1EwMDMuLHA0ID0gZGF0YTQkcHJveC5TUTAwNC4scDUgPSBkYXRhNCRwcm94LlNRMDA1LixwNiA9IGRhdGE0JHByb3guU1EwMDYuLHA3ID0gZGF0YTQkcHJveC5TUTAwNy4scDggPSBkYXRhNCRwcm94LlNRMDA4LiwgcDkgPSBkYXRhNCRwcm94LlNRMDA5LixwMTA9IGRhdGE0JHByb3guU1EwMTAuLCBwMTE9IGRhdGE0JHByb3guU1EwMTEuLCBwMTI9IGRhdGE0JHByb3guU1EwMTIuLCBwMTM9IGRhdGE0JHByb3guU1EwMTMuLCBwMTQ9IGRhdGE0JHByb3guU1EwMTQuLCBwMTU9IGRhdGE0JHByb3guU1EwMTUuLCBwMTY9IGRhdGE0JHByb3guU1EwMTYuLCBwMTc9IGRhdGE0JHByb3guU1EwMTcuLCBwMTg9IGRhdGE0JHByb3guU1EwMTguLCBwMTk9IGRhdGE0JHByb3guU1EwMTkuLCBwMjA9IGRhdGE0JHByb3guU1EwMjAuKQ0KDQojYW5kIGR5bmFtaWMNCiNjb21tdW5pY2F0aW9uIGZyZXF1ZW5jeQ0KZGZfZnJlcSA8LSBkYXRhLmZyYW1lKHAxID0gZGF0YTQkZnJlcS5TUTAwMS4scDIgPSBkYXRhNCRmcmVxLlNRMDAyLixwMyA9IGRhdGE0JGZyZXEuU1EwMDMuLHA0ID0gZGF0YTQkZnJlcS5TUTAwNC4scDUgPSBkYXRhNCRmcmVxLlNRMDA1LixwNiA9IGRhdGE0JGZyZXEuU1EwMDYuLHA3ID0gZGF0YTQkZnJlcS5TUTAwNy4scDggPSBkYXRhNCRmcmVxLlNRMDA4LiwgcDkgPSBkYXRhNCRmcmVxLlNRMDA5LixwMTA9IGRhdGE0JGZyZXEuU1EwMTAuLCBwMTE9IGRhdGE0JGZyZXEuU1EwMTEuLCBwMTI9IGRhdGE0JGZyZXEuU1EwMTIuLCBwMTM9IGRhdGE0JGZyZXEuU1EwMTMuLCBwMTQ9IGRhdGE0JGZyZXEuU1EwMTQuLCBwMTU9IGRhdGE0JGZyZXEuU1EwMTUuLCBwMTY9IGRhdGE0JGZyZXEuU1EwMTYuLCBwMTc9IGRhdGE0JGZyZXEuU1EwMTcuLCBwMTg9IGRhdGE0JGZyZXEuU1EwMTguLCBwMTk9IGRhdGE0JGZyZXEuU1EwMTkuLCBwMjA9IGRhdGE0JGZyZXEuU1EwMjAuKQ0KDQojY2xvc2VuZXNzDQpkZl9jbG9zZSA8LSBkYXRhLmZyYW1lKHAxID0gZGF0YTQkY2xvc2UuU1EwMDEuLHAyID0gZGF0YTQkY2xvc2UuU1EwMDIuLHAzID0gZGF0YTQkY2xvc2UuU1EwMDMuLHA0ID0gZGF0YTQkY2xvc2UuU1EwMDQuLHA1ID0gZGF0YTQkY2xvc2UuU1EwMDUuLHA2ID0gZGF0YTQkY2xvc2UuU1EwMDYuLHA3ID0gZGF0YTQkY2xvc2UuU1EwMDcuLHA4ID0gZGF0YTQkY2xvc2UuU1EwMDguLCBwOSA9IGRhdGE0JGNsb3NlLlNRMDA5LixwMTA9IGRhdGE0JGNsb3NlLlNRMDEwLiwgcDExPSBkYXRhNCRjbG9zZS5TUTAxMS4sIHAxMj0gZGF0YTQkY2xvc2UuU1EwMTIuLCBwMTM9IGRhdGE0JGNsb3NlLlNRMDEzLiwgcDE0PSBkYXRhNCRjbG9zZS5TUTAxNC4sIHAxNT0gZGF0YTQkY2xvc2UuU1EwMTUuLCBwMTY9IGRhdGE0JGNsb3NlLlNRMDE2LiwgcDE3PSBkYXRhNCRjbG9zZS5TUTAxNy4sIHAxOD0gZGF0YTQkY2xvc2UuU1EwMTguLCBwMTk9IGRhdGE0JGNsb3NlLlNRMDE5LiwgcDIwPSBkYXRhNCRjbG9zZS5TUTAyMC4pDQoNCmZvciAoaSBpbiAxOmxlbmd0aChhbHRlckwpKSB7DQogIA0KICBhbHRlckxbW2ldXSRhbHRlcl9nZW5kZXIgPC0gaWZlbHNlKHVubGlzdChkZl9tYWxlc1tpLF0sIHVzZS5uYW1lcz1GKT09IkphIiwgMCwgaWZlbHNlKHVubGlzdChkZl9tYWxlc1tpLF0sIHVzZS5uYW1lcz1GKT09Ik5lZSIsIDEsIE5BKSkNCiAgDQogIGFsdGVyTFtbaV1dJGFsdGVyX2FnZSA8LSANCiAgICBpZmVsc2UodW5saXN0KGRmX2FnZVtpLF0sIHVzZS5uYW1lcz1GKT09IkpvbmdlciBkYW4gMTggamFhciIsIDE2LCAjPz8/DQogICAgICAgICAgIGlmZWxzZSh1bmxpc3QoZGZfYWdlW2ksXSwgdXNlLm5hbWVzPUYpPT0iMTggdG90IDIxIGphYXIiLCAyMCwNCiAgICAgICAgICAgICAgICAgIGlmZWxzZSh1bmxpc3QoZGZfYWdlW2ksXSwgdXNlLm5hbWVzPUYpPT0iMjIgdG90IDI1IGphYXIiLCAyMywNCiAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UodW5saXN0KGRmX2FnZVtpLF0sIHVzZS5uYW1lcz1GKT09IjI2IHRvdCAzMCBqYWFyIiwgMjgsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZSh1bmxpc3QoZGZfYWdlW2ksXSwgdXNlLm5hbWVzPUYpPT0iMzEgdG90IDQwIGphYXIiLCAzNSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZSh1bmxpc3QoZGZfYWdlW2ksXSwgdXNlLm5hbWVzPUYpPT0iT3VkZXIgZGFuIDQwIGphYXIiLCA0NSwgIz8/Pw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZSh1bmxpc3QoZGZfYWdlW2ksXSwgdXNlLm5hbWVzPUYpPT0iV2VldCBpayBuaWV0IiwgTkEsICMgaSBkb24ndCBrbm93ID0gbWlzc2luZw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmxpc3QoZGZfYWdlW2ksXSwgdXNlLm5hbWVzPUYpKSkpKSkpKQ0KICBhbHRlckxbW2ldXSRraW4gPC0gaWZlbHNlKHVubGlzdChkZl9raW5baSxdLCB1c2UubmFtZXM9Rik9PSJKYSIsIDEsIGlmZWxzZSh1bmxpc3QoZGZfa2luW2ksXSwgdXNlLm5hbWVzPUYpPT0iTmVlIiwgMCwgIiIpKQ0KICANCiAgYWx0ZXJMW1tpXV0kYWx0ZXJfZWR1YyA8LSBpZmVsc2UodW5saXN0KGRmX2VkdWNbaSxdLHVzZS5uYW1lcz1GKT09ImxhZ2VyZSBzY2hvb2wiLCAxLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZSh1bmxpc3QoZGZfZWR1Y1tpLF0sdXNlLm5hbWVzPUYpPT0idm1ibywgbWF2byIsIDIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZSh1bmxpc3QoZGZfZWR1Y1tpLF0sdXNlLm5hbWVzPUYpPT0ibWJvIiwgMywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHVubGlzdChkZl9lZHVjW2ksXSx1c2UubmFtZXM9Rik9PSJoYXZvIiwgNCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHVubGlzdChkZl9lZHVjW2ksXSx1c2UubmFtZXM9Rik9PSJ2d28gLyBneW1uYXNpdW0iLCA1LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZSh1bmxpc3QoZGZfZWR1Y1tpLF0sdXNlLm5hbWVzPUYpPT0iaGJvIiwgNiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHVubGlzdChkZl9lZHVjW2ksXSx1c2UubmFtZXM9Rik9PSJ1bml2ZXJzaXRlaXQiLCA3LCBOQSkpKSkpKSkgDQogIA0KICBhbHRlckxbW2ldXSRwcm94aW1pdHkgPC0gaWZlbHNlKHVubGlzdChkZl9wcm94aW1pdHlbaSxdLCB1c2UubmFtZXM9RkFMU0UpID09ICJJbiBoZXR6ZWxmZGUgaHVpcyIsICJyb29tbWF0ZSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHVubGlzdChkZl9wcm94aW1pdHlbaSxdLCB1c2UubmFtZXMgPSBGQUxTRSkgPT0gIkluIGRlemVsZmRlIGJ1dXJ0IiB8DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmxpc3QoZGZfcHJveGltaXR5W2ksXSx1c2UubmFtZXM9Rik9PSJJbiBkZXplbGZkZSBzdHJhYXQiIHwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVubGlzdChkZl9wcm94aW1pdHlbaSxdLHVzZS5uYW1lcz1GKT09IkluIGRlemVsZmRlIGdlbWVlbnRlIiwgImNsb3NlIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZSh1bmxpc3QoZGZfcHJveGltaXR5W2ksXSwgdXNlLm5hbWVzID0gRkFMU0UpID09ICJJbiBoZXR6ZWxmZGUgbGFuZCIgfA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5saXN0KGRmX3Byb3hpbWl0eVtpLF0sIHVzZS5uYW1lcyA9IEZBTFNFKSA9PSAiSW4gZWVuIGFuZGVyIGxhbmQiLCJmYXIiLCBOQSkpKQ0KICANCiAgDQogIA0KICBhbHRlckxbW2ldXSRkdXJhdGlvbiA8LSBpZmVsc2UodW5saXN0KGRmX2R1cmF0aW9uW2ksXSx1c2UubmFtZXM9Rik9PSJNaW5kZXIgZGFuIDEgamFhciIsIDAsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZSh1bmxpc3QoZGZfZHVyYXRpb25baSxdLHVzZS5uYW1lcz1GKT09IjEgdG90IDMgamFhciIsIDIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZSh1bmxpc3QoZGZfZHVyYXRpb25baSxdLHVzZS5uYW1lcz1GKT09IjQgdG90IDggamFhciIsIDYsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UodW5saXN0KGRmX2R1cmF0aW9uW2ksXSx1c2UubmFtZXM9Rik9PSI5IHRvdCAxNSBqYWFyIiwgMTIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHVubGlzdChkZl9kdXJhdGlvbltpLF0sdXNlLm5hbWVzPUYpPT0iTWVlciBkYW4gMTUgamFhciIsIDE1LE5BICkpKSkpDQogIA0KICBhbHRlckxbW2ldXSRmcmVxdWVuY3kudDIgPC0gaWZlbHNlKHVubGlzdChkZl9mcmVxW2ksXSx1c2UubmFtZXM9Rik9PSIoQmlqbmEpIGVsa2UgZGFnIiwgNywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UodW5saXN0KGRmX2ZyZXFbaSxdLHVzZS5uYW1lcz1GKT09IjEtMiBrZWVyIHBlciB3ZWVrIiw2LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UodW5saXN0KGRmX2ZyZXFbaSxdLHVzZS5uYW1lcz1GKT09IkFhbnRhbCBrZWVyIHBlciBtYWFuZCIsNSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZSh1bmxpc3QoZGZfZnJlcVtpLF0sdXNlLm5hbWVzPUYpPT0iT25nLiAxIGtlZXIgcGVyIG1hYW5kIiw0LCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHVubGlzdChkZl9mcmVxW2ksXSx1c2UubmFtZXM9Rik9PSJBYW50YWwga2VlciBwZXIgamFhciIsMywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UodW5saXN0KGRmX2ZyZXFbaSxdLHVzZS5uYW1lcz1GKT09Ik9uZy4gMSBrZWVyIHBlciBqYWFyIiwyLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UodW5saXN0KGRmX2ZyZXFbaSxdLHVzZS5uYW1lcz1GKT09Ik5vb2l0IiwxLCBOQSApKSkpKSkpDQogIGFsdGVyTFtbaV1dJGNsb3NlbmVzcy50MiA8LSBpZmVsc2UodW5saXN0KGRmX2Nsb3NlW2ksXSx1c2UubmFtZXM9Rik9PSJOaWV0IGhlY2h0IiwgMSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHVubGlzdChkZl9jbG9zZVtpLF0sdXNlLm5hbWVzPUYpPT0iRW5pZ3N6aW5zIGhlY2h0IiwgMiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHVubGlzdChkZl9jbG9zZVtpLF0sdXNlLm5hbWVzPUYpPT0iSGVjaHQiLCAzLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHVubGlzdChkZl9jbG9zZVtpLF0sdXNlLm5hbWVzPUYpPT0iSGVlbCBlcmcgaGVjaHQiLCA0LCBOQSApKSkpDQp9DQoNCiNtYXRjaCBlZ28tY292YXJzIChiYXNlZCBvbiAnZGYnLikgDQpmb3IgKGkgaW4gMTpsZW5ndGgoYWx0ZXJMKSkgew0KICBhbHRlckxbW2ldXSRlZ29fZ2VuZGVyIDwtIGRmJGVnb19nZW5kZXJbd2hpY2goZGYkZWdvPT0xKV1bMV0NCiAgYWx0ZXJMW1tpXV0kZWdvX2FnZSA8LSBkZiRlZ29fYWdlW3doaWNoKGRmJGVnbz09MSldWzFdDQogIGFsdGVyTFtbaV1dJGVnb19lZHVjIDwtIGRmJGVnb19lZHVjW3doaWNoKGRmJGVnbz09MSldWzFdDQp9DQoNCiNzYW1lbmVzcw0KZm9yIChpIGluIDE6bGVuZ3RoKGFsdGVyTCkpICB7ICMgZm9yIGVnbyBpDQogICMgZ2V0IGF0dHJpYnV0ZXMgb2YgZWdvDQogIGFnZWkgPC0gYWx0ZXJMW1tpXV0kZWdvX2FnZVsxXQ0KICBnZW5kZXJpIDwtIGFsdGVyTFtbaV1dJGVnb19nZW5kZXJbMV0NCiAgZWRpIDwtIGFsdGVyTFtbaV1dJGVnb19lZHVjWzFdDQogIA0KICBmb3IgKGogaW4gMTptYXgoYWx0ZXJMW1tpXV0kYWx0ZXJpZCkpIHsgIyBmb3IgYWx0ZXIgag0KICAgICMgY2FsY3VsYXRlICJzYW1lIGdlbmRlciIgKDAvMSkNCiAgICBnZW5kZXJqIDwtIGFzLm51bWVyaWMoYWx0ZXJMW1tpXV0kYWx0ZXJfZ2VuZGVyW2pdKSAjIGdldCBhbHRlciBqIGdlbmRlcg0KICAgIHNhbWUgPC0gaWZlbHNlKGdlbmRlcmk9PWdlbmRlcmosIDEsIDApDQogICAgYWx0ZXJMW1tpXV0kc2FtZV9nZW5kZXJbd2hpY2goYWx0ZXJMW1tpXV0kYWx0ZXJpZD09aildIDwtIHNhbWUNCiAgICANCiAgICAjc2FtZSBlZHVjYXRpb24NCiAgICBlZHVqIDwtIGFsdGVyTFtbaV1dJGFsdGVyX2VkdWNbal0NCiAgICBzYW1lIDwtIGlmZWxzZShlZHVqPT1lZGksIDEsIDApDQogICAgYWx0ZXJMW1tpXV0kc2ltX2VkdWNbd2hpY2goYWx0ZXJMW1tpXV0kYWx0ZXJpZD09aildIDwtIHNhbWUNCiAgICANCiAgICAjIGNhbGN1bGF0ZSBzaW1pbGFyaXR5IGZvciBhZ2UgYXMgdGhlIGFic29sdXRlIGRpZmZlcmVuY2UgYmV0d2VlbiBhbHRlciBhbmQgZWdvIHZhbHVlDQogICAgI2dldCBhbHRlciBqIGF0dHJpYnV0ZXMNCiAgICBhZ2VqIDwtIGFzLm51bWVyaWMoYWx0ZXJMW1tpXV0kYWx0ZXJfYWdlW2pdKQ0KICAgICNkaWZmZXJlbmNlIHNjb3JlDQogICAgZGlmYWdlIDwtIGFicyhhZ2VpIC0gYWdlaikNCiAgICANCiAgICAjIHNvIGhpZ2hlciB2YWx1ZXMgcmVwcmVzZW50ICpsZXNzKiBzaW1pbGFyaXR5DQogICAgaWYoICFpcy5uYSAoYWdlaikgKSB7ICMgYWdlIHNpbWlsYXJpdHkgb25seSBjYWxjdWxhYmxlIGlmIHpfaiBpcyBrbm93biENCiAgICAgICAgYWx0ZXJMW1tpXV0kZGlmX2FnZVt3aGljaChhbHRlckxbW2ldXSRhbHRlcmlkPT1qKV0gPC0gZGlmYWdlDQogICAgICB9IGVsc2UgeyBhbHRlckxbW2ldXSRkaWZfYWdlW3doaWNoKGFsdGVyTFtbaV1dJGFsdGVyaWQ9PWopXSA8LSBOQX0NCiAgfQ0KfQ0KICANCiNpbiB3aGljaCBlZ29uZXRzIGRpZCBhbHRlc3IgYXBwZWFyIGF0IHQyPw0KZm9yIChpIGluIDE6bGVuZ3RoKGFsdGVyTCkpICB7IA0KICBmb3IgKGogaW4gMTpucm93KGFsdGVyTFtbaV1dKSkgew0KICAgIA0KICAgICNnZXQgbmFtZShzKSBvZiBqDQogICAgYWx0ZXIgPC0gdW5saXN0KGFsdGVyTFtbaV1dW2osYyg1OjgpXSwgdXNlLm5hbWVzPUZBTFNFKQ0KICAgIGFsdGVyIDwtIGFsdGVyWyFpcy5uYShhbHRlcildICMgZXhjbHVkZSBOQXMNCiAgICANCiAgICAjZmluZCBvdXQgYWx0ZXIgaiBhcHBlYXJzIGluIHRoZSA0IGVnb25ldHMNCiAgICBjZG4gPC0gYWx0ZXIgJWluJSBuZXQxW2ksXQ0KICAgIHN0dWR5IDwtIGFsdGVyICVpbiUgbmV0MltpLF0NCiAgICBiZmYgPC0gYWx0ZXIgJWluJSBuZXQzW2ksXQ0KICAgIGNzbiA8LSBhbHRlciAlaW4lIG5ldDRbaSxdDQogICAgDQogICAgIyBhbmQgaWYgc28sIGdpdmUgYWx0ZXIgaiBzY29yZSAxIG9uIGluZGljYXRvcnM7IDAgb3RoZXJ3aXNlDQogICAgYWx0ZXJMW1tpXV0kY2RuMltqXSA8LSBpZmVsc2UoIlRSVUUiICVpbiUgY2RuLCAxLCAwKQ0KICAgIGFsdGVyTFtbaV1dJHN0dWR5MltqXSA8LSBpZmVsc2UoIlRSVUUiICVpbiUgc3R1ZHksIDEsIDApDQogICAgYWx0ZXJMW1tpXV0kYmZmMltqXSA8LSBpZmVsc2UoIlRSVUUiICVpbiUgYmZmLCAxLCAwKQ0KICAgIGFsdGVyTFtbaV1dJGNzbjJbal0gPC0gaWZlbHNlKCJUUlVFIiAlaW4lIGNzbiwgMSwgMCkNCiAgfQ0KfQ0KDQojY2FsY3VsYXRlIG11bHRpcGxleGl0eSBhcyBhbiBhbHRlci90aWUgYXR0cmlidXRlIChpLmUuLCBudW1iZXIgb2YgKmFkZGl0aW9uYWwqIG5ldHdvcmtzIGogYXBwZWFyZWQgaW4pDQpmb3IgKGkgaW4gMTpsZW5ndGgoYWx0ZXJMKSkgIHsNCiAgZm9yIChqIGluIDE6bnJvdyhhbHRlckxbW2ldXSkpIHsNCiAgICBhbHRlckxbW2ldXSRtdWx0aXBsZXgudDJbal0gPC0gcm93U3VtcyhhbHRlckxbW2ldXVtqLGMoMjQ6MjcpXSkgLSAxICNtaW51cyBvbmUgdG8gcmVhY2ggYSBtZWFuaW5nZnVsIGludGVyY2VwdA0KICB9DQp9DQoNCiMgaSBmaWx0ZXIgb3V0IHRoZSBtYWludGFpbmVkIGFsdGVycw0KIyBieSBleGNsdWRpbmcgYWx0ZXJzIHdpdGggZW1wdHkgc3RyaW5ncyBmb3IgZ2VuZGVyIGF0dHJpYnV0ZQ0KZm9yICggaSBpbiAxOmxlbmd0aChhbHRlckwpKSB7DQogIGFsdGVyTFtbaV1dIDwtIGFsdGVyTFtbaV1dW3doaWNoKCFpcy5uYShhbHRlckxbW2ldXSRhbHRlcl9nZW5kZXIpICYgYWx0ZXJMW1tpXV0kYWx0ZXJfZ2VuZGVyIT0iIiksXQ0KICANCiAgICBpZiAobnJvdyhhbHRlckxbW2ldXSk+MCl7ICNpZiBuby4gb2YgY3JlYXRlZCBhbHRlcnMgPiAwDQogICAgICAjIHJlcGxhY2UgdGhlIGFsdGVyIGlkOiAxIDogbm8uIHVuaXF1ZSBhbHRlcnMNCiAgICAgIGFsdGVyTFtbaV1dJGFsdGVyaWQgPC0gMTpucm93KGFsdGVyTFtbaV1dKQ0KICB9DQp9DQoNCiNiYXNlZCBvbiB0aGlzLCBpIG1ha2UgYSBsb25nIGRhdGFmcmFtZSB3aXRoIGFsdGVycyBuZXN0ZWQgaW4gZWdvLg0KI2ZpcnN0LCBhZGQgYW4gZWdvX2lkDQpmb3IgKGkgaW4gMTpsZW5ndGgoYWx0ZXJMKSkgew0KICBpZihucm93KGFsdGVyTFtbaV1dPjApKSB7DQogICAgYWx0ZXJMW1tpXV0kZWdvIDwtIGkNCiAgICBhbHRlckxbW2ldXSRyZXNwbnIgPC0gZGF0YSRyZXNwbnJbaV0NCiAgICB9DQp9DQoNCiNjb21iaW5lIHVzaW5nIHJiaW5kDQpkZiA8LSBkby5jYWxsKHJiaW5kLGFsdGVyTCkNCg0KI2FkZCBuZXR3b3JrIHZhcmlhYmxlczsgbWF0Y2ggYmFzZWQgb24gZGZfbWFpbnRhaW5lZA0KZGYkY2RuLnNpemUyIDwtIGRmJHN0dWR5LnNpemUyIDwtIGRmJGJmZi5zaXplMiA8LSBkZiRjc24uc2l6ZTIgPC0gTkENCmRmJGNkbi5kZW5zaXR5MiA8LSBkZiRzdHVkeS5kZW5zaXR5MiA8LSBkZiRiZmYuZGVuc2l0eTIgPC0gZGYkY3NuLmRlbnNpdHkyIDwtIE5BDQoNCmZvciAoIGkgaW4gdW5pcXVlKGRmJGVnbykpIHsgDQogIGRmJGNkbi5zaXplMlt3aGljaChkZiRlZ28gPT0gaSldIDwtIGRmX21haW50YWluZWQkY2RuLnNpemUyW3doaWNoKGRmX21haW50YWluZWQkZWdvID09IGkpXVsxXQ0KICBkZiRzdHVkeS5zaXplMlt3aGljaChkZiRlZ28gPT0gaSldIDwtIGRmX21haW50YWluZWQkc3R1ZHkuc2l6ZTJbd2hpY2goZGZfbWFpbnRhaW5lZCRlZ28gPT0gaSldWzFdDQogIGRmJGJmZi5zaXplMlt3aGljaChkZiRlZ28gPT0gaSldIDwtIGRmX21haW50YWluZWQkYmZmLnNpemUyW3doaWNoKGRmX21haW50YWluZWQkZWdvID09IGkpXVsxXQ0KICBkZiRjc24uc2l6ZTJbd2hpY2goZGYkZWdvID09IGkpXSA8LSBkZl9tYWludGFpbmVkJGNzbi5zaXplMlt3aGljaChkZl9tYWludGFpbmVkJGVnbyA9PSBpKV1bMV0NCiAgDQogIGRmJGNkbi5kZW5zaXR5Mlt3aGljaChkZiRlZ28gPT0gaSldIDwtIGRmX21haW50YWluZWQkY2RuLmRlbnNpdHkyW3doaWNoKGRmX21haW50YWluZWQkZWdvID09IGkpXVsxXQ0KICBkZiRzdHVkeS5kZW5zaXR5Mlt3aGljaChkZiRlZ28gPT0gaSldIDwtIGRmX21haW50YWluZWQkc3R1ZHkuZGVuc2l0eTJbd2hpY2goZGZfbWFpbnRhaW5lZCRlZ28gPT0gaSldWzFdDQogIGRmJGJmZi5kZW5zaXR5Mlt3aGljaChkZiRlZ28gPT0gaSldIDwtIGRmX21haW50YWluZWQkYmZmLmRlbnNpdHkyW3doaWNoKGRmX21haW50YWluZWQkZWdvID09IGkpXVsxXQ0KICBkZiRjc24uZGVuc2l0eTJbd2hpY2goZGYkZWdvID09IGkpXSA8LSBkZl9tYWludGFpbmVkJGNzbi5kZW5zaXR5Mlt3aGljaChkZl9tYWludGFpbmVkJGVnbyA9PSBpKV1bMV0NCn0NCg0KI21ldGhvZG9sb2dpY2FsIGNvbnRyb2xzPz8NCg0KZGYkc3RhdHVzVzIgPC0gIkNyZWF0ZWQiDQpkZl9jcmVhdGVkIDwtIGRmDQoNCiNzb21lIGVtcHR5IG5hbWUgZ2VuZXJhdG9yIGVudHJpZXMgd2VyZSBzYXZlZCwgZHVlIHRvIGEgYnVnLg0KI2VtcHRpZXMgPC0gd2hpY2goaXMubmEoZGYkbmFtZTEpKSAjZG9uZSB1c2luZyB0aGUgZGF0YSB3aXRoIG5hbWVzIGluc3RlYWQgb2YgYWx0ZXJfaWRzDQojc2F2ZShlbXB0aWVzLGZpbGU9Ii4vZGF0YS9lbXB0eV9lbnRyaWVzX2luZGljYXRvcnMuUmRhIikNCmVtcHRpZXMgPC0gZmxvYWQoIi4vZGF0YV9zaGFyZWQvZW1wdHlfZW50cmllc19pbmRpY2F0b3JzLlJkYSIpDQoNCmRmX2NyZWF0ZWQgPC0gZGZfY3JlYXRlZFstZW1wdGllcyxdDQpgYGANCg0KDQpgYGB7ciwgZXZhbD1GQUxTRX0NCiNiaW5kIHRoZW0gdG9nZXRoZXINCmRmX2FsdGVycyA8LSBkcGx5cjo6YmluZF9yb3dzKGRmX21haW50YWluZWQsZGZfY3JlYXRlZCkNCg0KI2FycmFuZ2UsIGJ5IGVnbywgYW5kIHN0YXR1cw0KZGZfYWx0ZXJzIDwtIGRmX2FsdGVycyAlPiUgYXJyYW5nZShlZ28sIGZhY3RvcihzdGF0dXNXMiwgbGV2ZWxzPWMoIk1haW50YWluZWQiLCAiQ3JlYXRlZCIsICJEcm9wcGVkIikpKQ0Kcm93Lm5hbWVzKGRmX2FsdGVycykgPC0gMTpucm93KGRmX2FsdGVycykNCmBgYA0KDQoNCjxicj4NCg0KIyMgd2F2ZSAyIC0tPiB3YXZlIDMNCg0KTGV0J3Mgc2VlIHdoZXRoZXIgd2F2ZSAyIGFsdGVycyB3ZXJlIG1haW50YWluZWQgaW50byB3YXZlIDMuIA0KDQpgYGB7ciwgZXZhbCA9IEZBTFNFfQ0KI2ZpcnN0IHN1YnNldCBmcm9tIGBkZl9hbHRlcnNgIHcyLW1haW50YWluZWQgb3IgdzItY3JlYXRlZCBhbHRlcnMNCnRlc3QgPC0gZGZfYWx0ZXJzW3doaWNoKGRmX2FsdGVycyRzdGF0dXNXMj09Ik1haW50YWluZWQiIHwgZGZfYWx0ZXJzJHN0YXR1c1cyPT0iQ3JlYXRlZCIpLF0NCg0KI21ha2UgdmFyaWFibGUgaW5kaWNhdGluZyB3aGV0aGVyIGFsdGVyIHdhcyAocmUtKW5hbWVkIGluIHczDQp0ZXN0JHN1cnZpdmVXMyA8LSBOQQ0KDQojc29tZSBhbHRlcnMgaGFkIG5vICdjaGFuY2UnIHRvIHJlYXBwZWFyLCBiZWNhdXNlIGVnbyBkaWQgZmlsbCBvdXQgdGhlIGxhc3Qgc3VydmV5DQp0ZXN0JHczcGFydGljaXBhdGlvbiA8LSBOQQ0KZm9yIChpIGluIHVuaXF1ZSh0ZXN0JHJlc3BucikpIHsNCiAgdGVzdCR3M3BhcnRpY2lwYXRpb25bd2hpY2godGVzdCRyZXNwbnI9PWkpXSA8LSBpZmVsc2UoaSAlaW4lIGRhdGE1JHJlc3BuciwxLDApDQp9DQoNCiNmaXggYWx0ZXIgaWRzLCAxOk4NCmZvciAoaSBpbiB1bmlxdWUodGVzdCRyZXNwbnIpKSB7DQogIHRlc3QkYWx0ZXJpZFt3aGljaCh0ZXN0JHJlc3Bucj09aSldIDwtIDE6bGVuZ3RoKHRlc3QkYWx0ZXJpZFt3aGljaCh0ZXN0JHJlc3Bucj09aSldKQ0KfQ0KDQojc3Vic2V0IHdhdmUgNSBtYXRjaGluZyBtYXRyaXggKG1hdGNoaW5nIHdhdmUgMyBhbHRlcnMgdG8gd2F2ZSAyIGFsdGVycyAtIGVpdGhlciBjcmVhdGVkIG9yIG1haW50YWluZWQgKQ0KI2Fsc28gYWRkIHJlc3Bucg0KdzF3MiA8LSBkYXRhNVssYyg0ODY6ODg1LCBuY29sKGRhdGE1KSldDQoNCmZvciAoIGkgaW4gdW5pcXVlKHRlc3QkcmVzcG5yKSkgeyAjIGZvciBhbGwgZWdvcyAoYm90aCB0aG9zZSB0aGF0IHBhcnRpY2lwYXRlZCBpbiB3MywgYW5kIHRob3NlIHRoYXQgZGlkbnQpDQogIA0KICAgIG1hdGNoaW5nTCA8LSB2ZWN0b3IoImxpc3QiLCAyMCkgI3ByZS1hbGxvY2F0ZSBlbXB0eSBsaXN0IG9mIGxlbmd0aCAyMCwgdG8gc3RvcmUgbWF0Y2hpbmcgbWF0cmljZXMNCiAgew0KICAgIG1hdGNoaW5nTFtbMV1dIDwtIHcxdzJbd2hpY2godzF3MiRyZXNwbnI9PWkpLCAxOjIwXQ0KICAgIG1hdGNoaW5nTFtbMl1dIDwtIHcxdzJbd2hpY2godzF3MiRyZXNwbnI9PWkpLDIxOjQwXQ0KICAgIG1hdGNoaW5nTFtbM11dIDwtIHcxdzJbd2hpY2godzF3MiRyZXNwbnI9PWkpLDQxOjYwXQ0KICAgIG1hdGNoaW5nTFtbNF1dIDwtIHcxdzJbd2hpY2godzF3MiRyZXNwbnI9PWkpLDYxOjgwXQ0KICAgIG1hdGNoaW5nTFtbNV1dIDwtIHcxdzJbd2hpY2godzF3MiRyZXNwbnI9PWkpLDgxOjEwMF0NCiAgICBtYXRjaGluZ0xbWzZdXSA8LSB3MXcyW3doaWNoKHcxdzIkcmVzcG5yPT1pKSwxMDE6MTIwXQ0KICAgIG1hdGNoaW5nTFtbN11dIDwtIHcxdzJbd2hpY2godzF3MiRyZXNwbnI9PWkpLDEyMToxNDBdDQogICAgbWF0Y2hpbmdMW1s4XV0gPC0gdzF3Mlt3aGljaCh3MXcyJHJlc3Bucj09aSksMTQxOjE2MF0NCiAgICBtYXRjaGluZ0xbWzldXSA8LSB3MXcyW3doaWNoKHcxdzIkcmVzcG5yPT1pKSwxNjE6MTgwXQ0KICAgIG1hdGNoaW5nTFtbMTBdXSA8LSB3MXcyW3doaWNoKHcxdzIkcmVzcG5yPT1pKSwxODE6MjAwXQ0KICAgIG1hdGNoaW5nTFtbMTFdXSA8LSB3MXcyW3doaWNoKHcxdzIkcmVzcG5yPT1pKSwyMDE6MjIwXQ0KICAgIG1hdGNoaW5nTFtbMTJdXSA8LSB3MXcyW3doaWNoKHcxdzIkcmVzcG5yPT1pKSwyMjE6MjQwXQ0KICAgIG1hdGNoaW5nTFtbMTNdXSA8LSB3MXcyW3doaWNoKHcxdzIkcmVzcG5yPT1pKSwyNDE6MjYwXQ0KICAgIG1hdGNoaW5nTFtbMTRdXSA8LSB3MXcyW3doaWNoKHcxdzIkcmVzcG5yPT1pKSwyNjE6MjgwXQ0KICAgIG1hdGNoaW5nTFtbMTVdXSA8LSB3MXcyW3doaWNoKHcxdzIkcmVzcG5yPT1pKSwyODE6MzAwXQ0KICAgIG1hdGNoaW5nTFtbMTZdXSA8LSB3MXcyW3doaWNoKHcxdzIkcmVzcG5yPT1pKSwzMDE6MzIwXQ0KICAgIG1hdGNoaW5nTFtbMTddXSA8LSB3MXcyW3doaWNoKHcxdzIkcmVzcG5yPT1pKSwzMjE6MzQwXQ0KICAgIG1hdGNoaW5nTFtbMThdXSA8LSB3MXcyW3doaWNoKHcxdzIkcmVzcG5yPT1pKSwzNDE6MzYwXQ0KICAgIG1hdGNoaW5nTFtbMTldXSA8LSB3MXcyW3doaWNoKHcxdzIkcmVzcG5yPT1pKSwzNjE6MzgwXQ0KICAgIG1hdGNoaW5nTFtbMjBdXSA8LSB3MXcyW3doaWNoKHcxdzIkcmVzcG5yPT1pKSwzODE6NDAwXQ0KICAgfQ0KICAgI2ZpbmQgdGhlICdyaWdodCcgbWF0Y2hpbmcgbWF0cml4IGluIHRoaXMgbGlzdCwgYnkgdGFraW5nIHRoZSBvbmUgdGhhdCBjb250YWlucyBhbnN3ZXJzDQogIGluZCA8LSBOVUxMDQogIGZvciAoaiBpbiBzZXFfYWxvbmcobWF0Y2hpbmdMKSkgew0KICAgICNjaGVjayBhbG9uZyB0aGUgc2VxdWVuY2Ugb2YgZWxlbWVudHMgaiBpbiB0aGUgbWF0Y2hpbmcgbWF0cml4IGxpc3QgaWYgdGhleSBhcmUgbm9uLWVtcHR5IGFuZCBub3QgTkENCiAgICBjaGVjayA8LSBGQUxTRQ0KICAgIGZvciAoY29sIGluIG1hdGNoaW5nTFtbal1dKSB7DQogICAgICBpZiAoIWFsbChpcy5uYShjb2wpKSAmJiBhbnkobmNoYXIoY29sKSA+IDApKSB7DQogICAgICAgIGNoZWNrIDwtIFRSVUUNCiAgICAgICAgYnJlYWsgIA0KICAgICAgfQ0KICAgICAgfQ0KICAgIGlmIChjaGVjaykgew0KICAgICAgaW5kIDwtIGoNCiAgICAgIGJyZWFrICANCiAgICB9DQogIH0NCiAgaWYobGVuZ3RoKGluZCk+MCkgew0KICAgICMgZ2V0IHRoZSAgbWF0cml4DQogICAgbW0gPC0gbWF0Y2hpbmdMW1tpbmRdXQ0KICAgICN1bmxpc3QgdGhlIGFuc3dlcnMgZ2l2ZW4NCiAgICBhbnMgPC0gdW5saXN0KG1tLCB1c2UubmFtZXM9RkFMU0UpDQogICAgI3VzZSBgc3RyaW5ncmAgdG8gZXh0cmFjdCBudW1iZXJzIGluIHRoZXNlIGFuc3dlcnMNCiAgICBpZCA8LSB1bmxpc3Qoc3RyaW5ncjo6c3RyX2V4dHJhY3RfYWxsKGFucywgIlxcKD9bMC05LC5dK1xcKT8iKSkNCiAgICBpZCA8LSBpZFshaXMubmEoaWQpXSAjcmVtb3ZlIE5BDQogICAgDQogICAgZm9yIChrIGluIDE6bGVuZ3RoKHdoaWNoKHRlc3QkcmVzcG5yPT1pKSkpIHsNCiAgICAgICNmb3IgdzItYWx0ZXJzIG9mIGVnbyBpLCB3aXRoIGlkcyAxOmssDQogICAgICAjaWYgYWx0ZXIgd2FzIHJlbmFtZWQsIGdpdmUgc2NvcmUgMSwNCiAgICAgICNpZiBoZS9zaGUgd2FzIG5vdCByZW5hbWVkIGdpdmUgMCwNCiAgICAgICNhbHRlcnMgd2hvIGhhZCBubyBjaGFuY2UgdG8gcmVhcHBlYXIgZHVlIHRvIGVnbyBub3QgZmlsbGluZyBvdXQgdGhlIHN1cnZleSBrZWVwIE5BLg0KICAgICAgdGVzdCRzdXJ2aXZlVzNbd2hpY2godGVzdCRyZXNwbnIgPT0gaSAmIHRlc3QkYWx0ZXJpZCA9PSBrKV0gPC0gaWZlbHNlKHRlc3QkYWx0ZXJpZFsgd2hpY2godGVzdCRyZXNwbnIgPT0gaSAmIHRlc3QkYWx0ZXJpZCA9PSBrKV0gJWluJSBpZCwgMSwwKX0NCiAgfQ0KfQ0KDQojIHJlbWFpbmluZyBOQXMgb24gYHN1cnZpdmV3M2AgYW1vbmcgZWdvcyB3aG8gZGlkIGZpbGwgb3V0IHczLCBhcmUgZHVlIHRvIGVnbyBub3QgbGlzdGluZyBhbnkgYWx0ZXJzLi4NCiNhbnkodGVzdCR3M3BhcnRpY2lwYXRpb249PTEgJiBpcy5uYSh0ZXN0JHN1cnZpdmVXMykpDQojdGVzdCRyZXNwbnJbd2hpY2godGVzdCR3M3BhcnRpY2lwYXRpb249PTEgJiBpcy5uYSh0ZXN0JHN1cnZpdmVXMykpXQ0KI3NvLCBzZXQgdG8gMC4uLg0KdGVzdCRzdXJ2aXZlVzNbd2hpY2goaXMubmEodGVzdCRzdXJ2aXZlVzMpICYgdGVzdCR3M3BhcnRpY2lwYXRpb24gPT0gMSldIDwtIDANCg0KIyBpbiB3aGljaCBlZ29uZXQgZGlkIHRoZXkgKHJlKWFwcGVhcj8NCnRlc3QkY2RuMyA8LSBOQQ0KdGVzdCRzdHVkeTMgPC0gTkENCnRlc3QkYmZmMyA8LSBOQQ0KdGVzdCRjc24zIDwtIE5BDQoNCiMgaSB1c2UgdGhlIG1hdGNoaW5nIG1hdHJpY2VzIG9mIHczOyB3aGVyZSBjb2x1bW5zIHJlZmVyIHRvIHVuaXF1ZSB3MiBhbHRlcnMgKG1haW50YWluZWQgYW5kIGNyZWF0ZWQ7IHRob3NlIG9mIG91ciBjb25zdHJ1Y3RlZCBkYXRhZnJhbWUpIGFuZCByb3dzIHJlZmVycmluZyB0byB1bmlxdWUgdzMgYWx0ZXJzDQojIHNvLCBpZiB3Mi1hbHRlci9jb2x1bW4gaiBpcyBtYXRjaGVkIHRvIHczLWFsdGVyL3JvdyBpLCB0aGVuIHcyLWFsdGVyIGRpZCBzdXJ2aXZlIChidXQgd2UgYWxyZWFkeSBrbmV3IHRoYXQpOyBidXQgbW9yZSBpbXBvcnRhbnRseSwgaiB3YXMgdGhlIGledGggYWx0ZXIgbWVudGlvbmVkDQojIGFuZCB0aGlzIGFsbG93cyBtZSB0byBpbmZlciBpbiB3aGF0IG5ldHdvcmsgaiAocmUtKWFwcGVhcmVkDQojIHNpbmNlIGNkbiA9IDEtNTsgc3R1ZHkgPSA2LTEwOyBiZmYgPSAxMS0xNTsgY3NuID0gMTYtMjAuDQojIGhvd2V2ZXIsIHNpbmNlIHRoZSByb3dzIG9ubHkgaW5jbHVkZSBub24tZHVwbGljYXRlIHczLWFsdGVyczsNCiMgaWYgYWx0ZXIgaiBhdCB0MiB3YXMgbmFtZWQgbW9yZSB0aGFuIG9uY2UgYXQgdDMsIGkgb25seSBrbm93IHRoZSBmaXJzdA0KIyBlZ29uZXQgaW4gd2hpY2ggaiB3YXMgbmFtZWQuLi4NCiMgdGh1cywgYmVmb3JlIGkgcHJvY2VlZCwgaSB1c2UgdGhlIG1hdGNoaW5nIG1hdHJpY2VzIHRoYXQgYWxsb3dlZCBlZ28gdG8gbWF0Y2ggYWx0ZXJzIGZyb20gZGlmZmVyZW50IGVnb25ldHMgdG8gbWFrZSBhbHRlciBpZHMgZm9yIHczIGFsdGVyczsgYW5kIGZpZ3VyZSBvdXQgdG8gd2hpY2ggZWdvbmV0cyB0aGV5IGJlbG9uZ2VkDQoNCiNmaXJzdCwgc3Vic2V0IGRhdGE1LCBiYyB3ZSBvbmx5IHdhbnQgbmFtZXMgZGF0YSBvZiBlZ29zIHdpdGggdzEvdzIgYWx0ZXJzIHdobyBwYXJ0aWNpcGF0ZWQgaW4gdzMNCmRhdGE1YSA8LSBkYXRhNVt3aGljaChkYXRhNSRyZXNwbnIgJWluJSB1bmlxdWUodGVzdCRyZXNwbnJbd2hpY2godGVzdCR3M3BhcnRpY2lwYXRpb249PTEpXSkpLF0NCg0KIyBpIG1ha2UgYSBkYXRhZnJhbWUgb2YgdzMtYWx0ZXJzLCB3aXRoIHBvdGVudGlhbCBkdXBsaWNhdGVzLi4uDQpkZl9uYW1lcyA8LSBkYXRhLmZyYW1lKHAxID0gZGF0YTVhJGVnb25ldDEuU1EwMDEuLHAyID0gZGF0YTVhJGVnb25ldDEuU1EwMDIuLHAzID0gZGF0YTVhJGVnb25ldDEuU1EwMDMuLHA0ID0gZGF0YTVhJGVnb25ldDEuU1EwMDQuLHA1ID0gZGF0YTVhJGVnb25ldDEuU1EwMDUuLHA2ID0gZGF0YTVhJGVnb25ldDIuU1EwMDEuLHA3ID0gZGF0YTVhJGVnb25ldDIuU1EwMDIuLHA4ID0gZGF0YTVhJGVnb25ldDIuU1EwMDMuLHA5ID0gZGF0YTVhJGVnb25ldDIuU1EwMDQuLHAxMD0gZGF0YTVhJGVnb25ldDIuU1EwMDUuLHAxMT0gZGF0YTVhJGVnb25ldDMuU1EwMDEuLHAxMj0gZGF0YTVhJGVnb25ldDMuU1EwMDIuLHAxMz0gZGF0YTVhJGVnb25ldDMuU1EwMDMuLHAxND0gZGF0YTVhJGVnb25ldDMuU1EwMDQuLHAxNT0gZGF0YTVhJGVnb25ldDMuU1EwMDUuLHAxNj0gZGF0YTVhJGVnb25ldDQuU1EwMDEuLCBwMTc9IGRhdGE1YSRlZ29uZXQ0LlNRMDAyLiwgcDE4PSBkYXRhNWEkZWdvbmV0NC5TUTAwMy4scDE5PSBkYXRhNWEkZWdvbmV0NC5TUTAwNC4scDIwPSBkYXRhNWEkZWdvbmV0NC5TUTAwNS4pDQoNCiMgbGlzdCBvZiBkYXRhZnJhbWVzIHBlciBlZ28gd2l0aCByb3dzIHJlZmxlY3RpbmcgYWx0ZXJzDQojIGFuZCBjb2x1bW5zIGluZGljYXRpbmcgdGhlIG5hbWUocykgb2YgdGhlIHBhcnRpY3VsYXIgYWx0ZXJzDQphbHRlckwgPC0gbGlzdCgpDQojIGxvb3Agb3ZlciBhbGwgZWdvcywgdGhhdCBmaWxsZWQgb3V0IHczDQpmb3IgKCBpIGluIDE6bnJvdyhkYXRhNWEpKSB7DQogIGFsdGVyTFtbaV1dIDwtIGRhdGEuZnJhbWUoDQogICAgYWx0ZXJpZCA9IDE6MjAsbmFtZTEgPSBOQSxuYW1lMiA9IE5BLCBuYW1lMyA9IE5BLG5hbWU0ID0gTkEpfQ0KDQojIGZpbGwgdGhlIG5hbWVzIGJhc2VkIG9uIHRoZSBuYW1lcyBkYXRhLWZyYW1lDQpmb3IgKCBpIGluIDE6bGVuZ3RoKGFsdGVyTCkpIHsNCiAgYWx0ZXJMW1tpXV0kbmFtZTEgPC0gdW5saXN0KGRmX25hbWVzW2ksIF0sIHVzZS5uYW1lcz1GQUxTRSkNCiAgYWx0ZXJMW1tpXV0kbmFtZTEgPC0gaWZlbHNlKGFsdGVyTFtbaV1dJG5hbWUxPT0iIiwgTkEsIGFsdGVyTFtbaV1dJG5hbWUxKQ0KICB9DQoNCiMgY2FsY3VsYXRlIG5ldHNpemUgZm9yIGVhY2ggbmV0IHRvIGdldCB0aGUgY29ycmVjdCBtYXRjaGluZyBtYXRyaXgNCnsNCiAgbmV0MSA8LSBjYmluZChkYXRhNWEkZWdvbmV0MS5TUTAwMS4sZGF0YTVhJGVnb25ldDEuU1EwMDIuLCBkYXRhNWEkZWdvbmV0MS5TUTAwMy4sZGF0YTVhJGVnb25ldDEuU1EwMDQuLCBkYXRhNWEkZWdvbmV0MS5TUTAwNS4pDQogIG5ldDEgPC0gaWZlbHNlKG5ldDE9PSIiLCBOQSwgbmV0MSkNCiAgbnMxIDwtIHZlY3RvcigpDQogIGZvciAoaSBpbiAxOm5yb3cobmV0MSkpIHsNCiAgICBuczFbaV0gPC0gbGVuZ3RoKG5ldDFbaSxdW3doaWNoKCFpcy5uYShuZXQxW2ksXSkpXSkNCiAgfQ0KICBuZXQyIDwtIGNiaW5kKGRhdGE1YSRlZ29uZXQyLlNRMDAxLixkYXRhNWEkZWdvbmV0Mi5TUTAwMi4sIGRhdGE1YSRlZ29uZXQyLlNRMDAzLixkYXRhNWEkZWdvbmV0Mi5TUTAwNC4sIGRhdGE1YSRlZ29uZXQyLlNRMDA1LikNCiAgbmV0MiA8LSBpZmVsc2UobmV0Mj09IiIsIE5BLCBuZXQyKQ0KICBuczIgPC0gdmVjdG9yKCkNCiAgZm9yIChpIGluIDE6bnJvdyhuZXQyKSkgew0KICAgIG5zMltpXSA8LSBsZW5ndGgobmV0MltpLF1bd2hpY2goIWlzLm5hKG5ldDJbaSxdKSldKQ0KICB9DQogIG5ldDMgPC0gY2JpbmQoZGF0YTVhJGVnb25ldDMuU1EwMDEuLGRhdGE1YSRlZ29uZXQzLlNRMDAyLiwgZGF0YTVhJGVnb25ldDMuU1EwMDMuLGRhdGE1YSRlZ29uZXQzLlNRMDA0LiwgZGF0YTVhJGVnb25ldDMuU1EwMDUuKQ0KICBuZXQzIDwtIGlmZWxzZShuZXQzPT0iIiwgTkEsIG5ldDMpDQogIG5zMyA8LSB2ZWN0b3IoKQ0KICBmb3IgKGkgaW4gMTpucm93KG5ldDMpKSB7DQogICAgbnMzW2ldIDwtIGxlbmd0aChuZXQzW2ksXVt3aGljaCghaXMubmEobmV0M1tpLF0pKV0pDQogIH0NCiAgbmV0NCA8LSBjYmluZChkYXRhNWEkZWdvbmV0NC5TUTAwMS4sZGF0YTVhJGVnb25ldDQuU1EwMDIuLCBkYXRhNWEkZWdvbmV0NC5TUTAwMy4sZGF0YTVhJGVnb25ldDQuU1EwMDQuLCBkYXRhNWEkZWdvbmV0NC5TUTAwNS4pDQogIG5ldDQgPC0gaWZlbHNlKG5ldDQ9PSIiLCBOQSwgbmV0NCkNCiAgbnM0IDwtIHZlY3RvcigpDQogIGZvciAoaSBpbiAxOm5yb3cobmV0NCkpIHsNCiAgICBuczRbaV0gPC0gbGVuZ3RoKG5ldDRbaSxdW3doaWNoKCFpcy5uYShuZXQ0W2ksXSkpXSkNCiAgfQ0KfQ0KIyBjb25zdHJ1Y3QgdGhlIG1hdGNoaW5nIG1hdHJpY2VzIGxpc3QgZm9yIGVnb25ldDEtMg0KbWF0Y2hpbmdMaXN0IDwtIGxpc3QoKQ0KZm9yIChpIGluIDE6bGVuZ3RoKGFsdGVyTCkpIHsNCiAgbWF0Y2hpbmdMIDwtIGxpc3QoKQ0KICBtYXRjaGluZ0xbWzFdXSA8LSBjYmluZChkYXRhNWEkbWF0Y2hpbmcxTjEuU1EwMDFfU1EwMDEuW2ldLGRhdGE1YSRtYXRjaGluZzFOMS5TUTAwMl9TUTAwMS5baV0sZGF0YTVhJG1hdGNoaW5nMU4xLlNRMDAzX1NRMDAxLltpXSxkYXRhNWEkbWF0Y2hpbmcxTjEuU1EwMDRfU1EwMDEuW2ldLGRhdGE1YSRtYXRjaGluZzFOMS5TUTAwNV9TUTAwMS5baV0pDQogIG1hdGNoaW5nTFtbMl1dPC0gcmJpbmQoDQogICAgY2JpbmQoZGF0YTVhJG1hdGNoaW5nMU4yLlNRMDAxX1NRMDAxLltpXSwgZGF0YTVhJG1hdGNoaW5nMU4yLlNRMDAyX1NRMDAxLltpXSwgZGF0YTVhJG1hdGNoaW5nMU4yLlNRMDAzX1NRMDAxLltpXSwgZGF0YTVhJG1hdGNoaW5nMU4yLlNRMDA0X1NRMDAxLltpXSwgZGF0YTVhJG1hdGNoaW5nMU4yLlNRMDA1X1NRMDAxLltpXSksDQogICAgY2JpbmQoZGF0YTVhJG1hdGNoaW5nMU4yLlNRMDAxX1NRMDAyLltpXSwgZGF0YTVhJG1hdGNoaW5nMU4yLlNRMDAyX1NRMDAyLltpXSwgZGF0YTVhJG1hdGNoaW5nMU4yLlNRMDAzX1NRMDAyLltpXSwgZGF0YTVhJG1hdGNoaW5nMU4yLlNRMDA0X1NRMDAyLltpXSwgZGF0YTVhJG1hdGNoaW5nMU4yLlNRMDA1X1NRMDAyLltpXSkpDQogIG1hdGNoaW5nTFtbM11dPC0gcmJpbmQoDQogICAgY2JpbmQoZGF0YTVhJG1hdGNoaW5nMU4zLlNRMDAxX1NRMDAxLltpXSwgZGF0YTVhJG1hdGNoaW5nMU4zLlNRMDAyX1NRMDAxLltpXSwgZGF0YTVhJG1hdGNoaW5nMU4zLlNRMDAzX1NRMDAxLltpXSwgZGF0YTVhJG1hdGNoaW5nMU4zLlNRMDA0X1NRMDAxLltpXSwgZGF0YTVhJG1hdGNoaW5nMU4zLlNRMDA1X1NRMDAxLltpXSksDQogICAgY2JpbmQoZGF0YTVhJG1hdGNoaW5nMU4zLlNRMDAxX1NRMDAyLltpXSwgZGF0YTVhJG1hdGNoaW5nMU4zLlNRMDAyX1NRMDAyLltpXSwgZGF0YTVhJG1hdGNoaW5nMU4zLlNRMDAzX1NRMDAyLltpXSwgZGF0YTVhJG1hdGNoaW5nMU4zLlNRMDA0X1NRMDAyLltpXSwgZGF0YTVhJG1hdGNoaW5nMU4zLlNRMDA1X1NRMDAyLltpXSksDQogICAgY2JpbmQoZGF0YTVhJG1hdGNoaW5nMU4zLlNRMDAxX1NRMDAzLltpXSwgZGF0YTVhJG1hdGNoaW5nMU4zLlNRMDAyX1NRMDAzLltpXSwgZGF0YTVhJG1hdGNoaW5nMU4zLlNRMDAzX1NRMDAzLltpXSwgZGF0YTVhJG1hdGNoaW5nMU4zLlNRMDA0X1NRMDAzLltpXSwgZGF0YTVhJG1hdGNoaW5nMU4zLlNRMDA1X1NRMDAzLltpXSkpDQogIG1hdGNoaW5nTFtbNF1dPC0gcmJpbmQoDQogICAgY2JpbmQoZGF0YTVhJG1hdGNoaW5nMU40LlNRMDAxX1NRMDAxLltpXSwgZGF0YTVhJG1hdGNoaW5nMU40LlNRMDAyX1NRMDAxLltpXSwgZGF0YTVhJG1hdGNoaW5nMU40LlNRMDAzX1NRMDAxLltpXSwgZGF0YTVhJG1hdGNoaW5nMU40LlNRMDA0X1NRMDAxLltpXSwgZGF0YTVhJG1hdGNoaW5nMU40LlNRMDA1X1NRMDAxLltpXSksDQogICAgY2JpbmQoZGF0YTVhJG1hdGNoaW5nMU40LlNRMDAxX1NRMDAyLltpXSwgZGF0YTVhJG1hdGNoaW5nMU40LlNRMDAyX1NRMDAyLltpXSwgZGF0YTVhJG1hdGNoaW5nMU40LlNRMDAzX1NRMDAyLltpXSwgZGF0YTVhJG1hdGNoaW5nMU40LlNRMDA0X1NRMDAyLltpXSwgZGF0YTVhJG1hdGNoaW5nMU40LlNRMDA1X1NRMDAyLltpXSksDQogICAgY2JpbmQoZGF0YTVhJG1hdGNoaW5nMU40LlNRMDAxX1NRMDAzLltpXSwgZGF0YTVhJG1hdGNoaW5nMU40LlNRMDAyX1NRMDAzLltpXSwgZGF0YTVhJG1hdGNoaW5nMU40LlNRMDAzX1NRMDAzLltpXSwgZGF0YTVhJG1hdGNoaW5nMU40LlNRMDA0X1NRMDAzLltpXSwgZGF0YTVhJG1hdGNoaW5nMU40LlNRMDA1X1NRMDAzLltpXSksDQogICAgY2JpbmQoZGF0YTVhJG1hdGNoaW5nMU40LlNRMDAxX1NRMDA0LltpXSwgZGF0YTVhJG1hdGNoaW5nMU40LlNRMDAyX1NRMDA0LltpXSwgZGF0YTVhJG1hdGNoaW5nMU40LlNRMDAzX1NRMDA0LltpXSwgZGF0YTVhJG1hdGNoaW5nMU40LlNRMDA0X1NRMDA0LltpXSwgZGF0YTVhJG1hdGNoaW5nMU40LlNRMDA1X1NRMDA0LltpXSkpDQogIG1hdGNoaW5nTFtbNV1dPC0gcmJpbmQoDQogICAgY2JpbmQoZGF0YTVhJG1hdGNoaW5nMU41LlNRMDAxX1NRMDAxLltpXSwgZGF0YTVhJG1hdGNoaW5nMU41LlNRMDAyX1NRMDAxLltpXSwgZGF0YTVhJG1hdGNoaW5nMU41LlNRMDAzX1NRMDAxLltpXSwgZGF0YTVhJG1hdGNoaW5nMU41LlNRMDA0X1NRMDAxLltpXSwgZGF0YTVhJG1hdGNoaW5nMU41LlNRMDA1X1NRMDAxLltpXSksDQogICAgY2JpbmQoZGF0YTVhJG1hdGNoaW5nMU41LlNRMDAxX1NRMDAyLltpXSwgZGF0YTVhJG1hdGNoaW5nMU41LlNRMDAyX1NRMDAyLltpXSwgZGF0YTVhJG1hdGNoaW5nMU41LlNRMDAzX1NRMDAyLltpXSwgZGF0YTVhJG1hdGNoaW5nMU41LlNRMDA0X1NRMDAyLltpXSwgZGF0YTVhJG1hdGNoaW5nMU41LlNRMDA1X1NRMDAyLltpXSksDQogICAgY2JpbmQoZGF0YTVhJG1hdGNoaW5nMU41LlNRMDAxX1NRMDAzLltpXSwgZGF0YTVhJG1hdGNoaW5nMU41LlNRMDAyX1NRMDAzLltpXSwgZGF0YTVhJG1hdGNoaW5nMU41LlNRMDAzX1NRMDAzLltpXSwgZGF0YTVhJG1hdGNoaW5nMU41LlNRMDA0X1NRMDAzLltpXSwgZGF0YTVhJG1hdGNoaW5nMU41LlNRMDA1X1NRMDAzLltpXSksDQogICAgY2JpbmQoZGF0YTVhJG1hdGNoaW5nMU41LlNRMDAxX1NRMDA0LltpXSwgZGF0YTVhJG1hdGNoaW5nMU41LlNRMDAyX1NRMDA0LltpXSwgZGF0YTVhJG1hdGNoaW5nMU41LlNRMDAzX1NRMDA0LltpXSwgZGF0YTVhJG1hdGNoaW5nMU41LlNRMDA0X1NRMDA0LltpXSwgZGF0YTVhJG1hdGNoaW5nMU41LlNRMDA1X1NRMDA0LltpXSksDQogICAgY2JpbmQoZGF0YTVhJG1hdGNoaW5nMU41LlNRMDAxX1NRMDA1LltpXSwgZGF0YTVhJG1hdGNoaW5nMU41LlNRMDAyX1NRMDA1LltpXSwgZGF0YTVhJG1hdGNoaW5nMU41LlNRMDAzX1NRMDA1LltpXSwgZGF0YTVhJG1hdGNoaW5nMU41LlNRMDA0X1NRMDA1LltpXSwgZGF0YTVhJG1hdGNoaW5nMU41LlNRMDA1X1NRMDA1LltpXSkpDQogIG1hdGNoaW5nTGlzdFtbaV1dIDwtIG1hdGNoaW5nTA0KfSAjIHNvLi4uIG1hdGNoaW5nTFtbMV1dW1s1XV0gaXMgbWF0Y2hpbmdtYXRyaXggNSAoaS5lLiwgNSBhbHRlcnMgbmFtZWQgaW4gZWdvbmV0MikgZm9yIGVnbyAxDQoNCiMgdGhlIGNvbWJpbmF0aW9uIG9mIHRoZSBtYXRjaGluZyBtYXRyaWNlcyBhbmQgdGhlIG5ldHNpemVzIGZvciBlZ28gYWxsb3dzIG1lIHRvIG1hdGNoIHRoZSBuYW1lcyBteXNlbGYuDQpmb3IgKGkgaW4gMTpsZW5ndGgobWF0Y2hpbmdMaXN0KSkgeyAgICAgIyBmb3IgZWdvIGkNCiAgbUwgPC0gbWF0Y2hpbmdMaXN0W1tpXV0gICAgICAgICAgICAgICAjIGdldCB0aGUgbWF0Y2hpbmcgbGlzdA0KICBucyA8LSBuczJbW2ldXSAgICAgICAgICAgICAgICAgICAgICAgICMgZ2V0IHRoZSBzaXplIG9mIGVnb25ldDINCiAgaWYobnM+MCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGlmIG5zPTAsIG5vIG1hdGNoaW5nIHdhcyBkb25lIQ0KICAgIG1tIDwtIGFzLm1hdHJpeChtTFtbbnNdXSkgICAgICAgICAgICMgcmV0cmlldmUgdGhlIGNvcnJlc3BvbmRpbmcgbWF0cml4DQogICAgbWF0Y2hlZCA8LSB3aGljaChtbT09MSwgYXJyLmluZD1UKSAgIyByZXRyaWV2ZSBhcnJheSBpbmRpY2VzDQogICAgbmV0IDwtIG5ldDJbaSxdDQogICAgaWYobGVuZ3RoKG1hdGNoZWQpPjApIHsgICAgICAgICAgICAgIyBpZiBtYXRjaGluZyB3YXMgcGVyZm9ybWVkIQ0KICAgICAgYWx0ZXJMW1tpXV0kbmFtZTJbd2hpY2goYWx0ZXJMW1tpXV0kYWx0ZXJpZD09bWF0Y2hlZFssMl0pXSA8LSBuZXRbbWF0Y2hlZFssMV1dDQogICAgfQ0KICB9DQp9I2lnbm9yZSB3YXJuaW5nDQoNCiMgYWdhaW4sIG1ha2UgYSBtYXRjaGluZyBsaXN0IGZvciB0aGUgc2Vjb25kIG1hdGNoaW5nIG1hdHJpY2VzDQojIChpLmUuLCBtYXRjaGluZyBlZ29uZXQzIGFsdGVycyB0byBwcmV2LiBhbHRlcnMpOw0KbWF0Y2hpbmdMaXN0MiA8LSBsaXN0KCkNCmZvciAoaSBpbiAxOmxlbmd0aChhbHRlckwpKSB7ICMgZm9yIGVnbyBpDQogIG1hdGNoaW5nMkwgPC0gbGlzdCgpDQogIG1hdGNoaW5nMkxbWzFdXSA8LSBjYmluZChkYXRhNWEkbWF0Y2hpbmcyTjEuU1EwMDFfU1EwMDEuW2ldLGRhdGE1YSRtYXRjaGluZzJOMS5TUTAwMl9TUTAwMS5baV0sZGF0YTVhJG1hdGNoaW5nMk4xLlNRMDAzX1NRMDAxLltpXSxkYXRhNWEkbWF0Y2hpbmcyTjEuU1EwMDRfU1EwMDEuW2ldLGRhdGE1YSRtYXRjaGluZzJOMS5TUTAwNV9TUTAwMS5baV0sZGF0YTVhJG1hdGNoaW5nMk4xLlNRMDA2X1NRMDAxLltpXSxkYXRhNWEkbWF0Y2hpbmcyTjEuU1EwMDdfU1EwMDEuW2ldLGRhdGE1YSRtYXRjaGluZzJOMS5TUTAwOF9TUTAwMS5baV0sZGF0YTVhJG1hdGNoaW5nMk4xLlNRMDA5X1NRMDAxLltpXSxkYXRhNWEkbWF0Y2hpbmcyTjEuU1EwMTBfU1EwMDEuW2ldKQ0KICBtYXRjaGluZzJMW1syXV0gPC0gcmJpbmQoDQogICAgY2JpbmQoZGF0YTVhJG1hdGNoaW5nMk4yLlNRMDAxX1NRMDAxLltpXSxkYXRhNWEkbWF0Y2hpbmcyTjIuU1EwMDJfU1EwMDEuW2ldLGRhdGE1YSRtYXRjaGluZzJOMi5TUTAwM19TUTAwMS5baV0sZGF0YTVhJG1hdGNoaW5nMk4yLlNRMDA0X1NRMDAxLltpXSxkYXRhNWEkbWF0Y2hpbmcyTjIuU1EwMDVfU1EwMDEuW2ldLGRhdGE1YSRtYXRjaGluZzJOMi5TUTAwNl9TUTAwMS5baV0sZGF0YTVhJG1hdGNoaW5nMk4yLlNRMDA3X1NRMDAxLltpXSxkYXRhNWEkbWF0Y2hpbmcyTjIuU1EwMDhfU1EwMDEuW2ldLGRhdGE1YSRtYXRjaGluZzJOMi5TUTAwOV9TUTAwMS5baV0sZGF0YTVhJG1hdGNoaW5nMk4yLlNRMDEwX1NRMDAxLltpXSksDQogICAgY2JpbmQoZGF0YTVhJG1hdGNoaW5nMk4yLlNRMDAxX1NRMDAyLltpXSxkYXRhNWEkbWF0Y2hpbmcyTjIuU1EwMDJfU1EwMDIuW2ldLGRhdGE1YSRtYXRjaGluZzJOMi5TUTAwM19TUTAwMi5baV0sZGF0YTVhJG1hdGNoaW5nMk4yLlNRMDA0X1NRMDAyLltpXSxkYXRhNWEkbWF0Y2hpbmcyTjIuU1EwMDVfU1EwMDIuW2ldLGRhdGE1YSRtYXRjaGluZzJOMi5TUTAwNl9TUTAwMi5baV0sZGF0YTVhJG1hdGNoaW5nMk4yLlNRMDA3X1NRMDAyLltpXSxkYXRhNWEkbWF0Y2hpbmcyTjIuU1EwMDhfU1EwMDIuW2ldLGRhdGE1YSRtYXRjaGluZzJOMi5TUTAwOV9TUTAwMi5baV0sZGF0YTVhJG1hdGNoaW5nMk4yLlNRMDEwX1NRMDAyLltpXSkpDQogIG1hdGNoaW5nMkxbWzNdXSA8LSByYmluZCgNCiAgICBjYmluZChkYXRhNWEkbWF0Y2hpbmcyTjMuU1EwMDFfU1EwMDEuW2ldLGRhdGE1YSRtYXRjaGluZzJOMy5TUTAwMl9TUTAwMS5baV0sZGF0YTVhJG1hdGNoaW5nMk4zLlNRMDAzX1NRMDAxLltpXSxkYXRhNWEkbWF0Y2hpbmcyTjMuU1EwMDRfU1EwMDEuW2ldLGRhdGE1YSRtYXRjaGluZzJOMy5TUTAwNV9TUTAwMS5baV0sZGF0YTVhJG1hdGNoaW5nMk4zLlNRMDA2X1NRMDAxLltpXSxkYXRhNWEkbWF0Y2hpbmcyTjMuU1EwMDdfU1EwMDEuW2ldLGRhdGE1YSRtYXRjaGluZzJOMy5TUTAwOF9TUTAwMS5baV0sZGF0YTVhJG1hdGNoaW5nMk4zLlNRMDA5X1NRMDAxLltpXSxkYXRhNWEkbWF0Y2hpbmcyTjMuU1EwMTBfU1EwMDEuW2ldKSwNCiAgICBjYmluZChkYXRhNWEkbWF0Y2hpbmcyTjMuU1EwMDFfU1EwMDIuW2ldLGRhdGE1YSRtYXRjaGluZzJOMy5TUTAwMl9TUTAwMi5baV0sZGF0YTVhJG1hdGNoaW5nMk4zLlNRMDAzX1NRMDAyLltpXSxkYXRhNWEkbWF0Y2hpbmcyTjMuU1EwMDRfU1EwMDIuW2ldLGRhdGE1YSRtYXRjaGluZzJOMy5TUTAwNV9TUTAwMi5baV0sZGF0YTVhJG1hdGNoaW5nMk4zLlNRMDA2X1NRMDAyLltpXSxkYXRhNWEkbWF0Y2hpbmcyTjMuU1EwMDdfU1EwMDIuW2ldLGRhdGE1YSRtYXRjaGluZzJOMy5TUTAwOF9TUTAwMi5baV0sZGF0YTVhJG1hdGNoaW5nMk4zLlNRMDA5X1NRMDAyLltpXSxkYXRhNWEkbWF0Y2hpbmcyTjMuU1EwMTBfU1EwMDIuW2ldKSwNCiAgICBjYmluZChkYXRhNWEkbWF0Y2hpbmcyTjMuU1EwMDFfU1EwMDMuW2ldLGRhdGE1YSRtYXRjaGluZzJOMy5TUTAwMl9TUTAwMy5baV0sZGF0YTVhJG1hdGNoaW5nMk4zLlNRMDAzX1NRMDAzLltpXSxkYXRhNWEkbWF0Y2hpbmcyTjMuU1EwMDRfU1EwMDMuW2ldLGRhdGE1YSRtYXRjaGluZzJOMy5TUTAwNV9TUTAwMy5baV0sZGF0YTVhJG1hdGNoaW5nMk4zLlNRMDA2X1NRMDAzLltpXSxkYXRhNWEkbWF0Y2hpbmcyTjMuU1EwMDdfU1EwMDMuW2ldLGRhdGE1YSRtYXRjaGluZzJOMy5TUTAwOF9TUTAwMy5baV0sZGF0YTVhJG1hdGNoaW5nMk4zLlNRMDA5X1NRMDAzLltpXSxkYXRhNWEkbWF0Y2hpbmcyTjMuU1EwMTBfU1EwMDMuW2ldKSkNCiAgbWF0Y2hpbmcyTFtbNF1dIDwtIHJiaW5kKA0KICAgIGNiaW5kKGRhdGE1YSRtYXRjaGluZzJONC5TUTAwMV9TUTAwMS5baV0sZGF0YTVhJG1hdGNoaW5nMk40LlNRMDAyX1NRMDAxLltpXSxkYXRhNWEkbWF0Y2hpbmcyTjQuU1EwMDNfU1EwMDEuW2ldLGRhdGE1YSRtYXRjaGluZzJONC5TUTAwNF9TUTAwMS5baV0sZGF0YTVhJG1hdGNoaW5nMk40LlNRMDA1X1NRMDAxLltpXSxkYXRhNWEkbWF0Y2hpbmcyTjQuU1EwMDZfU1EwMDEuW2ldLGRhdGE1YSRtYXRjaGluZzJONC5TUTAwN19TUTAwMS5baV0sZGF0YTVhJG1hdGNoaW5nMk40LlNRMDA4X1NRMDAxLltpXSxkYXRhNWEkbWF0Y2hpbmcyTjQuU1EwMDlfU1EwMDEuW2ldLGRhdGE1YSRtYXRjaGluZzJONC5TUTAxMF9TUTAwMS5baV0pLA0KICAgIGNiaW5kKGRhdGE1YSRtYXRjaGluZzJONC5TUTAwMV9TUTAwMi5baV0sZGF0YTVhJG1hdGNoaW5nMk40LlNRMDAyX1NRMDAyLltpXSxkYXRhNWEkbWF0Y2hpbmcyTjQuU1EwMDNfU1EwMDIuW2ldLGRhdGE1YSRtYXRjaGluZzJONC5TUTAwNF9TUTAwMi5baV0sZGF0YTVhJG1hdGNoaW5nMk40LlNRMDA1X1NRMDAyLltpXSxkYXRhNWEkbWF0Y2hpbmcyTjQuU1EwMDZfU1EwMDIuW2ldLGRhdGE1YSRtYXRjaGluZzJONC5TUTAwN19TUTAwMi5baV0sZGF0YTVhJG1hdGNoaW5nMk40LlNRMDA4X1NRMDAyLltpXSxkYXRhNWEkbWF0Y2hpbmcyTjQuU1EwMDlfU1EwMDIuW2ldLGRhdGE1YSRtYXRjaGluZzJONC5TUTAxMF9TUTAwMi5baV0pLA0KICAgIGNiaW5kKGRhdGE1YSRtYXRjaGluZzJONC5TUTAwMV9TUTAwMy5baV0sZGF0YTVhJG1hdGNoaW5nMk40LlNRMDAyX1NRMDAzLltpXSxkYXRhNWEkbWF0Y2hpbmcyTjQuU1EwMDNfU1EwMDMuW2ldLGRhdGE1YSRtYXRjaGluZzJONC5TUTAwNF9TUTAwMy5baV0sZGF0YTVhJG1hdGNoaW5nMk40LlNRMDA1X1NRMDAzLltpXSxkYXRhNWEkbWF0Y2hpbmcyTjQuU1EwMDZfU1EwMDMuW2ldLGRhdGE1YSRtYXRjaGluZzJONC5TUTAwN19TUTAwMy5baV0sZGF0YTVhJG1hdGNoaW5nMk40LlNRMDA4X1NRMDAzLltpXSxkYXRhNWEkbWF0Y2hpbmcyTjQuU1EwMDlfU1EwMDMuW2ldLGRhdGE1YSRtYXRjaGluZzJONC5TUTAxMF9TUTAwMy5baV0pLA0KICAgIGNiaW5kKGRhdGE1YSRtYXRjaGluZzJONC5TUTAwMV9TUTAwNC5baV0sZGF0YTVhJG1hdGNoaW5nMk40LlNRMDAyX1NRMDA0LltpXSxkYXRhNWEkbWF0Y2hpbmcyTjQuU1EwMDNfU1EwMDQuW2ldLGRhdGE1YSRtYXRjaGluZzJONC5TUTAwNF9TUTAwNC5baV0sZGF0YTVhJG1hdGNoaW5nMk40LlNRMDA1X1NRMDA0LltpXSxkYXRhNWEkbWF0Y2hpbmcyTjQuU1EwMDZfU1EwMDQuW2ldLGRhdGE1YSRtYXRjaGluZzJONC5TUTAwN19TUTAwNC5baV0sZGF0YTVhJG1hdGNoaW5nMk40LlNRMDA4X1NRMDA0LltpXSxkYXRhNWEkbWF0Y2hpbmcyTjQuU1EwMDlfU1EwMDQuW2ldLGRhdGE1YSRtYXRjaGluZzJONC5TUTAxMF9TUTAwNC5baV0pKQ0KICBtYXRjaGluZzJMW1s1XV0gPC0gcmJpbmQoDQogICAgY2JpbmQoZGF0YTVhJG1hdGNoaW5nMk41LlNRMDAxX1NRMDAxLltpXSxkYXRhNWEkbWF0Y2hpbmcyTjUuU1EwMDJfU1EwMDEuW2ldLGRhdGE1YSRtYXRjaGluZzJONS5TUTAwM19TUTAwMS5baV0sZGF0YTVhJG1hdGNoaW5nMk41LlNRMDA0X1NRMDAxLltpXSxkYXRhNWEkbWF0Y2hpbmcyTjUuU1EwMDVfU1EwMDEuW2ldLGRhdGE1YSRtYXRjaGluZzJONS5TUTAwNl9TUTAwMS5baV0sZGF0YTVhJG1hdGNoaW5nMk41LlNRMDA3X1NRMDAxLltpXSxkYXRhNWEkbWF0Y2hpbmcyTjUuU1EwMDhfU1EwMDEuW2ldLGRhdGE1YSRtYXRjaGluZzJONS5TUTAwOV9TUTAwMS5baV0sZGF0YTVhJG1hdGNoaW5nMk41LlNRMDEwX1NRMDAxLltpXSksDQogICAgY2JpbmQoZGF0YTVhJG1hdGNoaW5nMk41LlNRMDAxX1NRMDAyLltpXSxkYXRhNWEkbWF0Y2hpbmcyTjUuU1EwMDJfU1EwMDIuW2ldLGRhdGE1YSRtYXRjaGluZzJONS5TUTAwM19TUTAwMi5baV0sZGF0YTVhJG1hdGNoaW5nMk41LlNRMDA0X1NRMDAyLltpXSxkYXRhNWEkbWF0Y2hpbmcyTjUuU1EwMDVfU1EwMDIuW2ldLGRhdGE1YSRtYXRjaGluZzJONS5TUTAwNl9TUTAwMi5baV0sZGF0YTVhJG1hdGNoaW5nMk41LlNRMDA3X1NRMDAyLltpXSxkYXRhNWEkbWF0Y2hpbmcyTjUuU1EwMDhfU1EwMDIuW2ldLGRhdGE1YSRtYXRjaGluZzJONS5TUTAwOV9TUTAwMi5baV0sZGF0YTVhJG1hdGNoaW5nMk41LlNRMDEwX1NRMDAyLltpXSksDQogICAgY2JpbmQoZGF0YTVhJG1hdGNoaW5nMk41LlNRMDAxX1NRMDAzLltpXSxkYXRhNWEkbWF0Y2hpbmcyTjUuU1EwMDJfU1EwMDMuW2ldLGRhdGE1YSRtYXRjaGluZzJONS5TUTAwM19TUTAwMy5baV0sZGF0YTVhJG1hdGNoaW5nMk41LlNRMDA0X1NRMDAzLltpXSxkYXRhNWEkbWF0Y2hpbmcyTjUuU1EwMDVfU1EwMDMuW2ldLGRhdGE1YSRtYXRjaGluZzJONS5TUTAwNl9TUTAwMy5baV0sZGF0YTVhJG1hdGNoaW5nMk41LlNRMDA3X1NRMDAzLltpXSxkYXRhNWEkbWF0Y2hpbmcyTjUuU1EwMDhfU1EwMDMuW2ldLGRhdGE1YSRtYXRjaGluZzJONS5TUTAwOV9TUTAwMy5baV0sZGF0YTVhJG1hdGNoaW5nMk41LlNRMDEwX1NRMDAzLltpXSksDQogICAgY2JpbmQoZGF0YTVhJG1hdGNoaW5nMk41LlNRMDAxX1NRMDA0LltpXSxkYXRhNWEkbWF0Y2hpbmcyTjUuU1EwMDJfU1EwMDQuW2ldLGRhdGE1YSRtYXRjaGluZzJONS5TUTAwM19TUTAwNC5baV0sZGF0YTVhJG1hdGNoaW5nMk41LlNRMDA0X1NRMDA0LltpXSxkYXRhNWEkbWF0Y2hpbmcyTjUuU1EwMDVfU1EwMDQuW2ldLGRhdGE1YSRtYXRjaGluZzJONS5TUTAwNl9TUTAwNC5baV0sZGF0YTVhJG1hdGNoaW5nMk41LlNRMDA3X1NRMDA0LltpXSxkYXRhNWEkbWF0Y2hpbmcyTjUuU1EwMDhfU1EwMDQuW2ldLGRhdGE1YSRtYXRjaGluZzJONS5TUTAwOV9TUTAwNC5baV0sZGF0YTVhJG1hdGNoaW5nMk41LlNRMDEwX1NRMDA0LltpXSksDQogICAgY2JpbmQoZGF0YTVhJG1hdGNoaW5nMk41LlNRMDAxX1NRMDA1LltpXSxkYXRhNWEkbWF0Y2hpbmcyTjUuU1EwMDJfU1EwMDUuW2ldLGRhdGE1YSRtYXRjaGluZzJONS5TUTAwM19TUTAwNS5baV0sZGF0YTVhJG1hdGNoaW5nMk41LlNRMDA0X1NRMDA1LltpXSxkYXRhNWEkbWF0Y2hpbmcyTjUuU1EwMDVfU1EwMDUuW2ldLGRhdGE1YSRtYXRjaGluZzJONS5TUTAwNl9TUTAwNS5baV0sZGF0YTVhJG1hdGNoaW5nMk41LlNRMDA3X1NRMDA1LltpXSxkYXRhNWEkbWF0Y2hpbmcyTjUuU1EwMDhfU1EwMDUuW2ldLGRhdGE1YSRtYXRjaGluZzJONS5TUTAwOV9TUTAwNS5baV0sZGF0YTVhJG1hdGNoaW5nMk41LlNRMDEwX1NRMDA1LltpXSkpDQogIG1hdGNoaW5nTGlzdDJbW2ldXSA8LSBtYXRjaGluZzJMDQp9DQoNCmZvciAoaSBpbiAxOmxlbmd0aChtYXRjaGluZ0xpc3QyKSkgeyAgICAjIGZvciBlZ28gaQ0KICBtTCA8LSBtYXRjaGluZ0xpc3QyW1tpXV0gICAgICAgICAgICAgICMgZ2V0IHRoZSBtYXRjaGluZyBsaXN0IDINCiAgbnMgPC0gbnMzW1tpXV0gICAgICAgICAgICAgICAgICAgICAgICAjIGdldCB0aGUgc2l6ZSBvZiBlZ29uZXQzDQogIGlmKG5zPjApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBpZiBucz0wLCBubyBtYXRjaGluZyB3YXMgZG9uZSENCiAgICBtbSA8LSBhcy5tYXRyaXgobUxbW25zXV0pICAgICAgICAgICAjIGFuZCB0aGUgY29ycmVzcG9uZGluZyBtYXRyaXgNCiAgICBtYXRjaGVkIDwtIHdoaWNoKG1tPT0xLCBhcnIuaW5kPVQpICAjIHJldHJpZXZlIGFycmF5IGluZGljZXMNCiAgICBuZXQgPC0gbmV0M1tpLF0NCiAgICBpZihsZW5ndGgobWF0Y2hlZCk+MCkgeyAgICAgICAgICAgICAjIGlmIG1hdGNoaW5nIHdhcyBwZXJmb3JtZWQhDQogICAgICBhbHRlckxbW2ldXSRuYW1lM1ttYXRjaGVkWywyXV0gPC0gbmV0W21hdGNoZWRbLDFdXQ0KICAgIH0NCiAgfQ0KfQ0KDQojIHNhbWUgZm9yIG1hdGNoaW5nIDMgKGkuZS4sIGVnb25ldDQgd2l0aCBlZ29uZXRzIDEtMykNCm1hdGNoaW5nTGlzdDMgPC0gbGlzdCgpDQpmb3IgKGkgaW4gMTpsZW5ndGgoYWx0ZXJMKSkgeyAjIGZvciBlZ28gaQ0KICBtYXRjaGluZzNMIDwtIGxpc3QoKQ0KICBtYXRjaGluZzNMW1sxXV0gPC0gY2JpbmQoZGF0YTVhJG1hdGNoaW5nM04xLlNRMDAxX1NRMDAxLltpXSxkYXRhNWEkbWF0Y2hpbmczTjEuU1EwMDJfU1EwMDEuW2ldLGRhdGE1YSRtYXRjaGluZzNOMS5TUTAwM19TUTAwMS5baV0sZGF0YTVhJG1hdGNoaW5nM04xLlNRMDA0X1NRMDAxLltpXSxkYXRhNWEkbWF0Y2hpbmczTjEuU1EwMDVfU1EwMDEuW2ldLGRhdGE1YSRtYXRjaGluZzNOMS5TUTAwNl9TUTAwMS5baV0sZGF0YTVhJG1hdGNoaW5nM04xLlNRMDA3X1NRMDAxLltpXSxkYXRhNWEkbWF0Y2hpbmczTjEuU1EwMDhfU1EwMDEuW2ldLGRhdGE1YSRtYXRjaGluZzNOMS5TUTAwOV9TUTAwMS5baV0sZGF0YTVhJG1hdGNoaW5nM04xLlNRMDEwX1NRMDAxLltpXSwgZGF0YTVhJG1hdGNoaW5nM04xLlNRMDExX1NRMDAxLltpXSwgZGF0YTVhJG1hdGNoaW5nM04xLlNRMDEyX1NRMDAxLltpXSwgZGF0YTVhJG1hdGNoaW5nM04xLlNRMDEzX1NRMDAxLltpXSwgZGF0YTVhJG1hdGNoaW5nM04xLlNRMDE0X1NRMDAxLltpXSwgZGF0YTVhJG1hdGNoaW5nM04xLlNRMDE1X1NRMDAxLltpXSkNCiAgbWF0Y2hpbmczTFtbMl1dIDwtIHJiaW5kKA0KICAgIGNiaW5kKGRhdGE1YSRtYXRjaGluZzNOMi5TUTAwMV9TUTAwMS5baV0sZGF0YTVhJG1hdGNoaW5nM04yLlNRMDAyX1NRMDAxLltpXSxkYXRhNWEkbWF0Y2hpbmczTjIuU1EwMDNfU1EwMDEuW2ldLGRhdGE1YSRtYXRjaGluZzNOMi5TUTAwNF9TUTAwMS5baV0sZGF0YTVhJG1hdGNoaW5nM04yLlNRMDA1X1NRMDAxLltpXSxkYXRhNWEkbWF0Y2hpbmczTjIuU1EwMDZfU1EwMDEuW2ldLGRhdGE1YSRtYXRjaGluZzNOMi5TUTAwN19TUTAwMS5baV0sZGF0YTVhJG1hdGNoaW5nM04yLlNRMDA4X1NRMDAxLltpXSxkYXRhNWEkbWF0Y2hpbmczTjIuU1EwMDlfU1EwMDEuW2ldLGRhdGE1YSRtYXRjaGluZzNOMi5TUTAxMF9TUTAwMS5baV0sIGRhdGE1YSRtYXRjaGluZzNOMi5TUTAxMV9TUTAwMS5baV0sIGRhdGE1YSRtYXRjaGluZzNOMi5TUTAxMl9TUTAwMS5baV0sIGRhdGE1YSRtYXRjaGluZzNOMi5TUTAxM19TUTAwMS5baV0sIGRhdGE1YSRtYXRjaGluZzNOMi5TUTAxNF9TUTAwMS5baV0sIGRhdGE1YSRtYXRjaGluZzNOMi5TUTAxNV9TUTAwMS5baV0pLA0KICAgIGNiaW5kKGRhdGE1YSRtYXRjaGluZzNOMi5TUTAwMV9TUTAwMi5baV0sZGF0YTVhJG1hdGNoaW5nM04yLlNRMDAyX1NRMDAyLltpXSxkYXRhNWEkbWF0Y2hpbmczTjIuU1EwMDNfU1EwMDIuW2ldLGRhdGE1YSRtYXRjaGluZzNOMi5TUTAwNF9TUTAwMi5baV0sZGF0YTVhJG1hdGNoaW5nM04yLlNRMDA1X1NRMDAyLltpXSxkYXRhNWEkbWF0Y2hpbmczTjIuU1EwMDZfU1EwMDIuW2ldLGRhdGE1YSRtYXRjaGluZzNOMi5TUTAwN19TUTAwMi5baV0sZGF0YTVhJG1hdGNoaW5nM04yLlNRMDA4X1NRMDAyLltpXSxkYXRhNWEkbWF0Y2hpbmczTjIuU1EwMDlfU1EwMDIuW2ldLGRhdGE1YSRtYXRjaGluZzNOMi5TUTAxMF9TUTAwMi5baV0sIGRhdGE1YSRtYXRjaGluZzNOMi5TUTAxMV9TUTAwMi5baV0sIGRhdGE1YSRtYXRjaGluZzNOMi5TUTAxMl9TUTAwMi5baV0sIGRhdGE1YSRtYXRjaGluZzNOMi5TUTAxM19TUTAwMi5baV0sIGRhdGE1YSRtYXRjaGluZzNOMi5TUTAxNF9TUTAwMi5baV0sIGRhdGE1YSRtYXRjaGluZzNOMi5TUTAxNV9TUTAwMi5baV0pKQ0KICBtYXRjaGluZzNMW1szXV0gPC0gcmJpbmQoDQogICAgY2JpbmQoZGF0YTVhJG1hdGNoaW5nM04zLlNRMDAxX1NRMDAxLltpXSxkYXRhNWEkbWF0Y2hpbmczTjMuU1EwMDJfU1EwMDEuW2ldLGRhdGE1YSRtYXRjaGluZzNOMy5TUTAwM19TUTAwMS5baV0sZGF0YTVhJG1hdGNoaW5nM04zLlNRMDA0X1NRMDAxLltpXSxkYXRhNWEkbWF0Y2hpbmczTjMuU1EwMDVfU1EwMDEuW2ldLGRhdGE1YSRtYXRjaGluZzNOMy5TUTAwNl9TUTAwMS5baV0sZGF0YTVhJG1hdGNoaW5nM04zLlNRMDA3X1NRMDAxLltpXSxkYXRhNWEkbWF0Y2hpbmczTjMuU1EwMDhfU1EwMDEuW2ldLGRhdGE1YSRtYXRjaGluZzNOMy5TUTAwOV9TUTAwMS5baV0sZGF0YTVhJG1hdGNoaW5nM04zLlNRMDEwX1NRMDAxLltpXSwgZGF0YTVhJG1hdGNoaW5nM04zLlNRMDExX1NRMDAxLltpXSwgZGF0YTVhJG1hdGNoaW5nM04zLlNRMDEyX1NRMDAxLltpXSwgZGF0YTVhJG1hdGNoaW5nM04zLlNRMDEzX1NRMDAxLltpXSwgZGF0YTVhJG1hdGNoaW5nM04zLlNRMDE0X1NRMDAxLltpXSwgZGF0YTVhJG1hdGNoaW5nM04zLlNRMDE1X1NRMDAxLltpXSksDQogICAgY2JpbmQoZGF0YTVhJG1hdGNoaW5nM04zLlNRMDAxX1NRMDAyLltpXSxkYXRhNWEkbWF0Y2hpbmczTjMuU1EwMDJfU1EwMDIuW2ldLGRhdGE1YSRtYXRjaGluZzNOMy5TUTAwM19TUTAwMi5baV0sZGF0YTVhJG1hdGNoaW5nM04zLlNRMDA0X1NRMDAyLltpXSxkYXRhNWEkbWF0Y2hpbmczTjMuU1EwMDVfU1EwMDIuW2ldLGRhdGE1YSRtYXRjaGluZzNOMy5TUTAwNl9TUTAwMi5baV0sZGF0YTVhJG1hdGNoaW5nM04zLlNRMDA3X1NRMDAyLltpXSxkYXRhNWEkbWF0Y2hpbmczTjMuU1EwMDhfU1EwMDIuW2ldLGRhdGE1YSRtYXRjaGluZzNOMy5TUTAwOV9TUTAwMi5baV0sZGF0YTVhJG1hdGNoaW5nM04zLlNRMDEwX1NRMDAyLltpXSwgZGF0YTVhJG1hdGNoaW5nM04zLlNRMDExX1NRMDAyLltpXSwgZGF0YTVhJG1hdGNoaW5nM04zLlNRMDEyX1NRMDAyLltpXSwgZGF0YTVhJG1hdGNoaW5nM04zLlNRMDEzX1NRMDAyLltpXSwgZGF0YTVhJG1hdGNoaW5nM04zLlNRMDE0X1NRMDAyLltpXSwgZGF0YTVhJG1hdGNoaW5nM04zLlNRMDE1X1NRMDAyLltpXSksDQogICAgY2JpbmQoZGF0YTVhJG1hdGNoaW5nM04zLlNRMDAxX1NRMDAzLltpXSxkYXRhNWEkbWF0Y2hpbmczTjMuU1EwMDJfU1EwMDMuW2ldLGRhdGE1YSRtYXRjaGluZzNOMy5TUTAwM19TUTAwMy5baV0sZGF0YTVhJG1hdGNoaW5nM04zLlNRMDA0X1NRMDAzLltpXSxkYXRhNWEkbWF0Y2hpbmczTjMuU1EwMDVfU1EwMDMuW2ldLGRhdGE1YSRtYXRjaGluZzNOMy5TUTAwNl9TUTAwMy5baV0sZGF0YTVhJG1hdGNoaW5nM04zLlNRMDA3X1NRMDAzLltpXSxkYXRhNWEkbWF0Y2hpbmczTjMuU1EwMDhfU1EwMDMuW2ldLGRhdGE1YSRtYXRjaGluZzNOMy5TUTAwOV9TUTAwMy5baV0sZGF0YTVhJG1hdGNoaW5nM04zLlNRMDEwX1NRMDAzLltpXSwgZGF0YTVhJG1hdGNoaW5nM04zLlNRMDExX1NRMDAzLltpXSwgZGF0YTVhJG1hdGNoaW5nM04zLlNRMDEyX1NRMDAzLltpXSwgZGF0YTVhJG1hdGNoaW5nM04zLlNRMDEzX1NRMDAzLltpXSwgZGF0YTVhJG1hdGNoaW5nM04zLlNRMDE0X1NRMDAzLltpXSwgZGF0YTVhJG1hdGNoaW5nM04zLlNRMDE1X1NRMDAzLltpXSkpDQogIG1hdGNoaW5nM0xbWzRdXSA8LSByYmluZCgNCiAgICBjYmluZChkYXRhNWEkbWF0Y2hpbmczTjQuU1EwMDFfU1EwMDEuW2ldLGRhdGE1YSRtYXRjaGluZzNONC5TUTAwMl9TUTAwMS5baV0sZGF0YTVhJG1hdGNoaW5nM040LlNRMDAzX1NRMDAxLltpXSxkYXRhNWEkbWF0Y2hpbmczTjQuU1EwMDRfU1EwMDEuW2ldLGRhdGE1YSRtYXRjaGluZzNONC5TUTAwNV9TUTAwMS5baV0sZGF0YTVhJG1hdGNoaW5nM040LlNRMDA2X1NRMDAxLltpXSxkYXRhNWEkbWF0Y2hpbmczTjQuU1EwMDdfU1EwMDEuW2ldLGRhdGE1YSRtYXRjaGluZzNONC5TUTAwOF9TUTAwMS5baV0sZGF0YTVhJG1hdGNoaW5nM040LlNRMDA5X1NRMDAxLltpXSxkYXRhNWEkbWF0Y2hpbmczTjQuU1EwMTBfU1EwMDEuW2ldLCBkYXRhNWEkbWF0Y2hpbmczTjQuU1EwMTFfU1EwMDEuW2ldLCBkYXRhNWEkbWF0Y2hpbmczTjQuU1EwMTJfU1EwMDEuW2ldLCBkYXRhNWEkbWF0Y2hpbmczTjQuU1EwMTNfU1EwMDEuW2ldLCBkYXRhNWEkbWF0Y2hpbmczTjQuU1EwMTRfU1EwMDEuW2ldLCBkYXRhNWEkbWF0Y2hpbmczTjQuU1EwMTVfU1EwMDEuW2ldKSwNCiAgICBjYmluZChkYXRhNWEkbWF0Y2hpbmczTjQuU1EwMDFfU1EwMDIuW2ldLGRhdGE1YSRtYXRjaGluZzNONC5TUTAwMl9TUTAwMi5baV0sZGF0YTVhJG1hdGNoaW5nM040LlNRMDAzX1NRMDAyLltpXSxkYXRhNWEkbWF0Y2hpbmczTjQuU1EwMDRfU1EwMDIuW2ldLGRhdGE1YSRtYXRjaGluZzNONC5TUTAwNV9TUTAwMi5baV0sZGF0YTVhJG1hdGNoaW5nM040LlNRMDA2X1NRMDAyLltpXSxkYXRhNWEkbWF0Y2hpbmczTjQuU1EwMDdfU1EwMDIuW2ldLGRhdGE1YSRtYXRjaGluZzNONC5TUTAwOF9TUTAwMi5baV0sZGF0YTVhJG1hdGNoaW5nM040LlNRMDA5X1NRMDAyLltpXSxkYXRhNWEkbWF0Y2hpbmczTjQuU1EwMTBfU1EwMDIuW2ldLCBkYXRhNWEkbWF0Y2hpbmczTjQuU1EwMTFfU1EwMDIuW2ldLCBkYXRhNWEkbWF0Y2hpbmczTjQuU1EwMTJfU1EwMDIuW2ldLCBkYXRhNWEkbWF0Y2hpbmczTjQuU1EwMTNfU1EwMDIuW2ldLCBkYXRhNWEkbWF0Y2hpbmczTjQuU1EwMTRfU1EwMDIuW2ldLCBkYXRhNWEkbWF0Y2hpbmczTjQuU1EwMTVfU1EwMDIuW2ldKSwNCiAgICBjYmluZChkYXRhNWEkbWF0Y2hpbmczTjQuU1EwMDFfU1EwMDMuW2ldLGRhdGE1YSRtYXRjaGluZzNONC5TUTAwMl9TUTAwMy5baV0sZGF0YTVhJG1hdGNoaW5nM040LlNRMDAzX1NRMDAzLltpXSxkYXRhNWEkbWF0Y2hpbmczTjQuU1EwMDRfU1EwMDMuW2ldLGRhdGE1YSRtYXRjaGluZzNONC5TUTAwNV9TUTAwMy5baV0sZGF0YTVhJG1hdGNoaW5nM040LlNRMDA2X1NRMDAzLltpXSxkYXRhNWEkbWF0Y2hpbmczTjQuU1EwMDdfU1EwMDMuW2ldLGRhdGE1YSRtYXRjaGluZzNONC5TUTAwOF9TUTAwMy5baV0sZGF0YTVhJG1hdGNoaW5nM040LlNRMDA5X1NRMDAzLltpXSxkYXRhNWEkbWF0Y2hpbmczTjQuU1EwMTBfU1EwMDMuW2ldLCBkYXRhNWEkbWF0Y2hpbmczTjQuU1EwMTFfU1EwMDMuW2ldLCBkYXRhNWEkbWF0Y2hpbmczTjQuU1EwMTJfU1EwMDMuW2ldLCBkYXRhNWEkbWF0Y2hpbmczTjQuU1EwMTNfU1EwMDMuW2ldLCBkYXRhNWEkbWF0Y2hpbmczTjQuU1EwMTRfU1EwMDMuW2ldLCBkYXRhNWEkbWF0Y2hpbmczTjQuU1EwMTVfU1EwMDMuW2ldKSwNCiAgICBjYmluZChkYXRhNWEkbWF0Y2hpbmczTjQuU1EwMDFfU1EwMDMuW2ldLGRhdGE1YSRtYXRjaGluZzNONC5TUTAwMl9TUTAwMy5baV0sZGF0YTVhJG1hdGNoaW5nM040LlNRMDAzX1NRMDAzLltpXSxkYXRhNWEkbWF0Y2hpbmczTjQuU1EwMDRfU1EwMDMuW2ldLGRhdGE1YSRtYXRjaGluZzNONC5TUTAwNV9TUTAwMy5baV0sZGF0YTVhJG1hdGNoaW5nM040LlNRMDA2X1NRMDAzLltpXSxkYXRhNWEkbWF0Y2hpbmczTjQuU1EwMDdfU1EwMDMuW2ldLGRhdGE1YSRtYXRjaGluZzNONC5TUTAwOF9TUTAwMy5baV0sZGF0YTVhJG1hdGNoaW5nM040LlNRMDA5X1NRMDAzLltpXSxkYXRhNWEkbWF0Y2hpbmczTjQuU1EwMTBfU1EwMDMuW2ldLCBkYXRhNWEkbWF0Y2hpbmczTjQuU1EwMTFfU1EwMDMuW2ldLCBkYXRhNWEkbWF0Y2hpbmczTjQuU1EwMTJfU1EwMDMuW2ldLCBkYXRhNWEkbWF0Y2hpbmczTjQuU1EwMTNfU1EwMDMuW2ldLCBkYXRhNWEkbWF0Y2hpbmczTjQuU1EwMTRfU1EwMDMuW2ldLCBkYXRhNWEkbWF0Y2hpbmczTjQuU1EwMTVfU1EwMDMuW2ldKSwNCiAgICBjYmluZChkYXRhNWEkbWF0Y2hpbmczTjQuU1EwMDFfU1EwMDQuW2ldLGRhdGE1YSRtYXRjaGluZzNONC5TUTAwMl9TUTAwNC5baV0sZGF0YTVhJG1hdGNoaW5nM040LlNRMDAzX1NRMDA0LltpXSxkYXRhNWEkbWF0Y2hpbmczTjQuU1EwMDRfU1EwMDQuW2ldLGRhdGE1YSRtYXRjaGluZzNONC5TUTAwNV9TUTAwNC5baV0sZGF0YTVhJG1hdGNoaW5nM040LlNRMDA2X1NRMDA0LltpXSxkYXRhNWEkbWF0Y2hpbmczTjQuU1EwMDdfU1EwMDQuW2ldLGRhdGE1YSRtYXRjaGluZzNONC5TUTAwOF9TUTAwNC5baV0sZGF0YTVhJG1hdGNoaW5nM040LlNRMDA5X1NRMDA0LltpXSxkYXRhNWEkbWF0Y2hpbmczTjQuU1EwMTBfU1EwMDQuW2ldLCBkYXRhNWEkbWF0Y2hpbmczTjQuU1EwMTFfU1EwMDQuW2ldLCBkYXRhNWEkbWF0Y2hpbmczTjQuU1EwMTJfU1EwMDQuW2ldLCBkYXRhNWEkbWF0Y2hpbmczTjQuU1EwMTNfU1EwMDQuW2ldLCBkYXRhNWEkbWF0Y2hpbmczTjQuU1EwMTRfU1EwMDQuW2ldLCBkYXRhNWEkbWF0Y2hpbmczTjQuU1EwMTVfU1EwMDQuW2ldKSkNCiAgbWF0Y2hpbmczTFtbNV1dIDwtIHJiaW5kKA0KICAgIGNiaW5kKGRhdGE1YSRtYXRjaGluZzNONS5TUTAwMV9TUTAwMS5baV0sZGF0YTVhJG1hdGNoaW5nM041LlNRMDAyX1NRMDAxLltpXSxkYXRhNWEkbWF0Y2hpbmczTjUuU1EwMDNfU1EwMDEuW2ldLGRhdGE1YSRtYXRjaGluZzNONS5TUTAwNF9TUTAwMS5baV0sZGF0YTVhJG1hdGNoaW5nM041LlNRMDA1X1NRMDAxLltpXSxkYXRhNWEkbWF0Y2hpbmczTjUuU1EwMDZfU1EwMDEuW2ldLGRhdGE1YSRtYXRjaGluZzNONS5TUTAwN19TUTAwMS5baV0sZGF0YTVhJG1hdGNoaW5nM041LlNRMDA4X1NRMDAxLltpXSxkYXRhNWEkbWF0Y2hpbmczTjUuU1EwMDlfU1EwMDEuW2ldLGRhdGE1YSRtYXRjaGluZzNONS5TUTAxMF9TUTAwMS5baV0sIGRhdGE1YSRtYXRjaGluZzNONS5TUTAxMV9TUTAwMS5baV0sIGRhdGE1YSRtYXRjaGluZzNONS5TUTAxMl9TUTAwMS5baV0sIGRhdGE1YSRtYXRjaGluZzNONS5TUTAxM19TUTAwMS5baV0sIGRhdGE1YSRtYXRjaGluZzNONS5TUTAxNF9TUTAwMS5baV0sIGRhdGE1YSRtYXRjaGluZzNONS5TUTAxNV9TUTAwMS5baV0pLA0KICAgIGNiaW5kKGRhdGE1YSRtYXRjaGluZzNONS5TUTAwMV9TUTAwMi5baV0sZGF0YTVhJG1hdGNoaW5nM041LlNRMDAyX1NRMDAyLltpXSxkYXRhNWEkbWF0Y2hpbmczTjUuU1EwMDNfU1EwMDIuW2ldLGRhdGE1YSRtYXRjaGluZzNONS5TUTAwNF9TUTAwMi5baV0sZGF0YTVhJG1hdGNoaW5nM041LlNRMDA1X1NRMDAyLltpXSxkYXRhNWEkbWF0Y2hpbmczTjUuU1EwMDZfU1EwMDIuW2ldLGRhdGE1YSRtYXRjaGluZzNONS5TUTAwN19TUTAwMi5baV0sZGF0YTVhJG1hdGNoaW5nM041LlNRMDA4X1NRMDAyLltpXSxkYXRhNWEkbWF0Y2hpbmczTjUuU1EwMDlfU1EwMDIuW2ldLGRhdGE1YSRtYXRjaGluZzNONS5TUTAxMF9TUTAwMi5baV0sIGRhdGE1YSRtYXRjaGluZzNONS5TUTAxMV9TUTAwMi5baV0sIGRhdGE1YSRtYXRjaGluZzNONS5TUTAxMl9TUTAwMi5baV0sIGRhdGE1YSRtYXRjaGluZzNONS5TUTAxM19TUTAwMi5baV0sIGRhdGE1YSRtYXRjaGluZzNONS5TUTAxNF9TUTAwMi5baV0sIGRhdGE1YSRtYXRjaGluZzNONS5TUTAxNV9TUTAwMi5baV0pLA0KICAgIGNiaW5kKGRhdGE1YSRtYXRjaGluZzNONS5TUTAwMV9TUTAwMy5baV0sZGF0YTVhJG1hdGNoaW5nM041LlNRMDAyX1NRMDAzLltpXSxkYXRhNWEkbWF0Y2hpbmczTjUuU1EwMDNfU1EwMDMuW2ldLGRhdGE1YSRtYXRjaGluZzNONS5TUTAwNF9TUTAwMy5baV0sZGF0YTVhJG1hdGNoaW5nM041LlNRMDA1X1NRMDAzLltpXSxkYXRhNWEkbWF0Y2hpbmczTjUuU1EwMDZfU1EwMDMuW2ldLGRhdGE1YSRtYXRjaGluZzNONS5TUTAwN19TUTAwMy5baV0sZGF0YTVhJG1hdGNoaW5nM041LlNRMDA4X1NRMDAzLltpXSxkYXRhNWEkbWF0Y2hpbmczTjUuU1EwMDlfU1EwMDMuW2ldLGRhdGE1YSRtYXRjaGluZzNONS5TUTAxMF9TUTAwMy5baV0sIGRhdGE1YSRtYXRjaGluZzNONS5TUTAxMV9TUTAwMy5baV0sIGRhdGE1YSRtYXRjaGluZzNONS5TUTAxMl9TUTAwMy5baV0sIGRhdGE1YSRtYXRjaGluZzNONS5TUTAxM19TUTAwMy5baV0sIGRhdGE1YSRtYXRjaGluZzNONS5TUTAxNF9TUTAwMy5baV0sIGRhdGE1YSRtYXRjaGluZzNONS5TUTAxNV9TUTAwMy5baV0pLA0KICAgIGNiaW5kKGRhdGE1YSRtYXRjaGluZzNONS5TUTAwMV9TUTAwMy5baV0sZGF0YTVhJG1hdGNoaW5nM041LlNRMDAyX1NRMDAzLltpXSxkYXRhNWEkbWF0Y2hpbmczTjUuU1EwMDNfU1EwMDMuW2ldLGRhdGE1YSRtYXRjaGluZzNONS5TUTAwNF9TUTAwMy5baV0sZGF0YTVhJG1hdGNoaW5nM041LlNRMDA1X1NRMDAzLltpXSxkYXRhNWEkbWF0Y2hpbmczTjUuU1EwMDZfU1EwMDMuW2ldLGRhdGE1YSRtYXRjaGluZzNONS5TUTAwN19TUTAwMy5baV0sZGF0YTVhJG1hdGNoaW5nM041LlNRMDA4X1NRMDAzLltpXSxkYXRhNWEkbWF0Y2hpbmczTjUuU1EwMDlfU1EwMDMuW2ldLGRhdGE1YSRtYXRjaGluZzNONS5TUTAxMF9TUTAwMy5baV0sIGRhdGE1YSRtYXRjaGluZzNONS5TUTAxMV9TUTAwMy5baV0sIGRhdGE1YSRtYXRjaGluZzNONS5TUTAxMl9TUTAwMy5baV0sIGRhdGE1YSRtYXRjaGluZzNONS5TUTAxM19TUTAwMy5baV0sIGRhdGE1YSRtYXRjaGluZzNONS5TUTAxNF9TUTAwMy5baV0sIGRhdGE1YSRtYXRjaGluZzNONS5TUTAxNV9TUTAwMy5baV0pLA0KICAgIGNiaW5kKGRhdGE1YSRtYXRjaGluZzNONS5TUTAwMV9TUTAwNS5baV0sZGF0YTVhJG1hdGNoaW5nM041LlNRMDAyX1NRMDA1LltpXSxkYXRhNWEkbWF0Y2hpbmczTjUuU1EwMDNfU1EwMDUuW2ldLGRhdGE1YSRtYXRjaGluZzNONS5TUTAwNF9TUTAwNS5baV0sZGF0YTVhJG1hdGNoaW5nM041LlNRMDA1X1NRMDA1LltpXSxkYXRhNWEkbWF0Y2hpbmczTjUuU1EwMDZfU1EwMDUuW2ldLGRhdGE1YSRtYXRjaGluZzNONS5TUTAwN19TUTAwNS5baV0sZGF0YTVhJG1hdGNoaW5nM041LlNRMDA4X1NRMDA1LltpXSxkYXRhNWEkbWF0Y2hpbmczTjUuU1EwMDlfU1EwMDUuW2ldLGRhdGE1YSRtYXRjaGluZzNONS5TUTAxMF9TUTAwNS5baV0sIGRhdGE1YSRtYXRjaGluZzNONS5TUTAxMV9TUTAwNS5baV0sIGRhdGE1YSRtYXRjaGluZzNONS5TUTAxMl9TUTAwNS5baV0sIGRhdGE1YSRtYXRjaGluZzNONS5TUTAxM19TUTAwNS5baV0sIGRhdGE1YSRtYXRjaGluZzNONS5TUTAxNF9TUTAwNS5baV0sIGRhdGE1YSRtYXRjaGluZzNONS5TUTAxNV9TUTAwNS5baV0pKQ0KICBtYXRjaGluZ0xpc3QzW1tpXV0gPC0gbWF0Y2hpbmczTA0KfQ0KDQpmb3IgKGkgaW4gMTpsZW5ndGgobWF0Y2hpbmdMaXN0MykpIHsgICAgIyBmb3IgZWdvIGkNCiAgbUwgPC0gbWF0Y2hpbmdMaXN0M1tbaV1dICAgICAgICAgICAgICAjIGdldCB0aGUgbWF0Y2hpbmcgbGlzdCAyDQogIG5zIDwtIG5zNFtbaV1dICAgICAgICAgICAgICAgICAgICAgICAgIyBnZXQgdGhlIHNpemUgb2YgZWdvbmV0NA0KICBpZihucz4wKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgaWYgbnM9MCwgbm8gbWF0Y2hpbmcgd2FzIGRvbmUhDQogICAgbW0gPC0gYXMubWF0cml4KG1MW1tuc11dKSAgICAgICAgICAgIyBhbmQgdGhlIGNvcnJlc3BvbmRpbmcgbWF0cml4DQogICAgbWF0Y2hlZCA8LSB3aGljaChtbT09MSwgYXJyLmluZD1UKSAgIyByZXRyaWV2ZSBhcnJheSBpbmRpY2VzDQogICAgbmV0IDwtIG5ldDRbaSxdDQogICAgaWYobGVuZ3RoKG1hdGNoZWQpPjApIHsgICAgICAgICAgICAgIyBpZiBtYXRjaGluZyB3YXMgcGVyZm9ybWVkIQ0KICAgICAgYWx0ZXJMW1tpXV0kbmFtZTRbbWF0Y2hlZFssMl1dIDwtIG5ldFttYXRjaGVkWywxXV0NCiAgICB9DQogIH0NCn0NCg0KIyBtYWtlIGxvbmcgZGYgd2l0aCB3MyBhbHRlcnMgaW4gZWdvLA0KIyBhbmQgaW5kaWNhdG9ycyBmb3IgNCBlZ29uZXRzOw0KZGYyIDwtIGRhdGEuZnJhbWUoZWdvPXJlcCgxOmxlbmd0aChhbHRlckwpLGVhY2g9MjApLGFsdGVyPXJlcCgxOjIwKSxjZG49TkEsIHN0dWR5PU5BLGJmZj1OQSxjc249TkEpDQoNCmZvciAoaSBpbiB1bmlxdWUoZGYyJGVnbykpIHsgIA0KICAgIGZvciAoaiBpbiAxOjIwKSB7ICMgZm9yIGFsdGVycyBuZXN0ZWQgaW4gZWdvDQogICAgIyBmaW5kIG91dCBpZiBuYW1lcyBkZW5vdGluZyBhbHRlciBqIGFwcGVhciBpbiB0aGUgNCBlZ29uZXRzDQogICAgYWx0ZXIgPC0gdW5saXN0KGFsdGVyTFtbaV1dW2osLTFdLCB1c2UubmFtZXMgPSBGKSAjIGdldCBuYW1lcyBhbHRlciBqDQogICAgYWx0ZXIgPC0gYWx0ZXJbIWlzLm5hKGFsdGVyKV0gIyBleGNsdWRlIE5Bcw0KICAgIGNkbiA8LSBhbHRlciAlaW4lIG5ldDFbaSxdDQogICAgc3R1ZHkgPC0gYWx0ZXIgJWluJSBuZXQyW2ksXQ0KICAgIGJmZiA8LSBhbHRlciAlaW4lIG5ldDNbaSxdDQogICAgY3NuIDwtIGFsdGVyICVpbiUgbmV0NFtpLF0NCiAgICAjIGFuZCBpZiBzbywgZ2l2ZSBhbHRlciBqIHNjb3JlIDEgb24gaW5kaWNhdG9yczsgMCBvdGhlcndpc2UNCiAgICBkZjIkY2RuW3doaWNoKGRmMiRlZ289PWkgJiBkZjIkYWx0ZXI9PWopXSA8LSBpZmVsc2UoIlRSVUUiICVpbiUgY2RuLCAxLCAwKQ0KICAgIGRmMiRzdHVkeVt3aGljaChkZjIkZWdvPT1pICYgZGYyJGFsdGVyPT1qKV0gPC0gaWZlbHNlKCJUUlVFIiAlaW4lIHN0dWR5LCAxLCAwKQ0KICAgIGRmMiRiZmZbd2hpY2goZGYyJGVnbz09aSAmIGRmMiRhbHRlcj09aildIDwtIGlmZWxzZSgiVFJVRSIgJWluJSBiZmYsIDEsIDApDQogICAgZGYyJGNzblt3aGljaChkZjIkZWdvPT1pICYgZGYyJGFsdGVyPT1qKV0gPC0gaWZlbHNlKCJUUlVFIiAlaW4lIGNzbiwgMSwgMCkNCiAgfQ0KfQ0KDQojIG5vdyB0aGF0IGkgaGF2ZSwgZm9yIGVhY2ggYWx0ZXIgb2YgZWdvIChpbmNsdWRpbmcgZHVwbGljYXRlcykgYXQgdDIsDQojIHRoZSBuZXRzIHRvIHdoaWNoIHRoZXkgYmVsb25nLi4NCiMgaSBjb250aW51ZSB3aXRoIHRoZSB3MS13MiBtYXRjaGluZyBtYXRyaWNlcw0KDQojIHdlIGFscmVhZHkgc3Vic2V0dGVkIHRoZSBtYXRjaGluZyBtYXRyaWNlcyAoaW4gYHcxdzJgKSwgYnV0IG5vdyB3ZSB0YWtlIG9ubHkgdGhlIHJvd3MgY29ycmVzcG9uZGluZyB0byB3MyBlZ29zIHdobyBoYXZlIHcyIG1haW50YWluZWQvY3JlYXRlZCBhbHRlcnMNCncxdzIgPC0gdzF3Mlt3aGljaCh3MXcyJHJlc3BuciAlaW4lIHVuaXF1ZSh0ZXN0JHJlc3Buclt3aGljaCh0ZXN0JHczcGFydGljaXBhdGlvbj09MSldKSksXQ0KDQpmb3IgKCBpIGluIDE6bGVuZ3RoKGFsdGVyTCkpIHsNCg0KICBtYXRjaGluZ0wgPC0gdmVjdG9yKCJsaXN0IiwgMjApICNwcmUtYWxsb2NhdGUgZW1wdHkgbGlzdCBvZiBsZW5ndGggMjAsIHRvIHN0b3JlIG1hdGNoaW5nIG1hdHJpY2VzDQogIHsNCiAgICBtYXRjaGluZ0xbWzFdXSA8LSB3MXcyW2ksIDE6MjBdDQogICAgbWF0Y2hpbmdMW1syXV0gPC0gdzF3MltpLCAyMTo0MF0NCiAgICBtYXRjaGluZ0xbWzNdXSA8LSB3MXcyW2ksNDE6NjBdDQogICAgbWF0Y2hpbmdMW1s0XV0gPC0gdzF3MltpICw2MTo4MF0NCiAgICBtYXRjaGluZ0xbWzVdXSA8LSB3MXcyW2kgLDgxOjEwMF0NCiAgICBtYXRjaGluZ0xbWzZdXSA8LSB3MXcyW2kgLDEwMToxMjBdDQogICAgbWF0Y2hpbmdMW1s3XV0gPC0gdzF3MltpICwxMjE6MTQwXQ0KICAgIG1hdGNoaW5nTFtbOF1dIDwtIHcxdzJbaSAsMTQxOjE2MF0NCiAgICBtYXRjaGluZ0xbWzldXSA8LSB3MXcyW2kgLDE2MToxODBdDQogICAgbWF0Y2hpbmdMW1sxMF1dIDwtIHcxdzJbaSAsMTgxOjIwMF0NCiAgICBtYXRjaGluZ0xbWzExXV0gPC0gdzF3MltpICwyMDE6MjIwXQ0KICAgIG1hdGNoaW5nTFtbMTJdXSA8LSB3MXcyW2kgLDIyMToyNDBdDQogICAgbWF0Y2hpbmdMW1sxM11dIDwtIHcxdzJbaSAsMjQxOjI2MF0NCiAgICBtYXRjaGluZ0xbWzE0XV0gPC0gdzF3MltpICwyNjE6MjgwXQ0KICAgIG1hdGNoaW5nTFtbMTVdXSA8LSB3MXcyW2kgLDI4MTozMDBdDQogICAgbWF0Y2hpbmdMW1sxNl1dIDwtIHcxdzJbaSAsMzAxOjMyMF0NCiAgICBtYXRjaGluZ0xbWzE3XV0gPC0gdzF3MltpICwzMjE6MzQwXQ0KICAgIG1hdGNoaW5nTFtbMThdXSA8LSB3MXcyW2kgLDM0MTozNjBdDQogICAgbWF0Y2hpbmdMW1sxOV1dIDwtIHcxdzJbaSAsMzYxOjM4MF0NCiAgICBtYXRjaGluZ0xbWzIwXV0gPC0gdzF3MltpICwzODE6NDAwXQ0KICB9DQogIA0KICAjZmluZCB0aGUgJ3JpZ2h0JyBtYXRjaGluZyBtYXRyaXggaW4gdGhpcyBsaXN0LCBieSB0YWtpbmcgdGhlIG9uZSB0aGF0IGNvbnRhaW5zIGFuc3dlcnMNCiAgaW5kIDwtIE5VTEwNCiAgZm9yIChqIGluIHNlcV9hbG9uZyhtYXRjaGluZ0wpKSB7DQogICAgI2NoZWNrIGFsb25nIHRoZSBzZXF1ZW5jZSBvZiBlbGVtZW50cyBqIGluIHRoZSBtYXRjaGluZyBtYXRyaXggbGlzdCBpZiB0aGV5IGFyZSBub24tZW1wdHkgYW5kIG5vdCBOQQ0KICAgIGNoZWNrIDwtIEZBTFNFDQogICAgZm9yIChjb2wgaW4gbWF0Y2hpbmdMW1tqXV0pIHsNCiAgICAgIGlmICghYWxsKGlzLm5hKGNvbCkpICYmIGFueShuY2hhcihjb2wpID4gMCkpIHsNCiAgICAgICAgY2hlY2sgPC0gVFJVRQ0KICAgICAgICBicmVhayAgDQogICAgICB9DQogICAgICB9DQogICAgaWYgKGNoZWNrKSB7DQogICAgICBpbmQgPC0gag0KICAgICAgYnJlYWsgIA0KICAgIH0NCiAgfQ0KICBpZihsZW5ndGgoaW5kKT4wKSB7DQogICAgIyBnZXQgdGhlICBtYXRyaXgNCiAgICBtbSA8LSBtYXRjaGluZ0xbW2luZF1dDQogICAgDQogICAgIyBleHRyYWN0IGFsdGVyIGlkcw0KICAgIGFucyA8LSBzdHJpbmdyOjpzdHJfZXh0cmFjdF9hbGwobW0sIlxcKD9bMC05LC5dK1xcKT8iKSANCiAgICAjIGhlcmUsIHRoZSBvYmplY3QgcmVmZXJzIHRvIHRoZSB3Mi1hbHRlciBqOw0KICAgICMgYW5kIHRoZSBlbGVtZW50IGluZGljYXRvciBpbiB0aGUgbGlzdCByZWZlcnMgdG8gdGhlIHczLWFsdGVyIA0KICAgICANCiAgICBmb3IgKGogaW4gdW5pcXVlKCB0ZXN0JGFsdGVyaWRbd2hpY2godGVzdCRlZ28gPT0gdW5pcXVlKHRlc3QkZWdvW3doaWNoKHRlc3QkdzNwYXJ0aWNpcGF0aW9uID09IDEpXSlbaV0pXSApKSB7ICMgZm9yIHdhdmUtMiBhbHRlciBqDQogICAgICANCiAgICAgICN0byB3aGljaCByb3cvdzMtYWx0ZXIgd2FzIGFsdGVyIGogbWF0Y2hlZD8NCiAgICAgIG1hdGNoIDwtIHdoaWNoKGFucyA9PSBqKQ0KDQogICAgICAjIGFuZCBpbiB3aGljaCBuZXR3b3JrcyBkaWQgdGhpcyB3My1hbHRlciBiZWxvbmc/DQogICAgICBuZXRzIDwtIGRmMlt3aGljaChkZjIkZWdvID09IGkgJiBkZjIkYWx0ZXIgPT0gbWF0Y2hbMV0pLF0NCiAgICAgIA0KICAgICAgaWYobGVuZ3RoKG1hdGNoKT4wKSB7ICMgaWYgaiB3YXMgbWF0Y2hlZCB0byB3My1hbHRlcnMuLi4NCiAgICAgICAgDQogICAgICAgICMgYXNzaWduIHRvIGFsdGVyIGogdGhlIG5ldHdvcmtzIGluIHdoaWNoIHRoZSB3My1hbHRlciBhcHBlYXJlZA0KICAgICAgICB0ZXN0JGNkbjNbIHdoaWNoKHRlc3QkZWdvID09IHVuaXF1ZSh0ZXN0JGVnb1t3aGljaCh0ZXN0JHczcGFydGljaXBhdGlvbiA9PSAxKV0pW2ldICYgdGVzdCRhbHRlcmlkID09IGopXSA8LSBuZXRzJGNkblsxXQ0KICAgICAgICB0ZXN0JHN0dWR5M1sgd2hpY2godGVzdCRlZ28gPT0gdW5pcXVlKHRlc3QkZWdvW3doaWNoKHRlc3QkdzNwYXJ0aWNpcGF0aW9uID09IDEpXSlbaV0gJiB0ZXN0JGFsdGVyaWQgPT0gaildIDwtIG5ldHMkc3R1ZHlbMV0NCiAgICAgICAgdGVzdCRiZmYzWyB3aGljaCh0ZXN0JGVnbyA9PSB1bmlxdWUodGVzdCRlZ29bd2hpY2godGVzdCR3M3BhcnRpY2lwYXRpb24gPT0gMSldKVtpXSAmIHRlc3QkYWx0ZXJpZCA9PSBqKV0gPC0gbmV0cyRiZmZbMV0NCiAgICAgICAgdGVzdCRjc24zWyB3aGljaCh0ZXN0JGVnbyA9PSB1bmlxdWUodGVzdCRlZ29bd2hpY2godGVzdCR3M3BhcnRpY2lwYXRpb24gPT0gMSldKVtpXSAmIHRlc3QkYWx0ZXJpZCA9PSBqKV0gPC0gbmV0cyRjc25bMV0NCiAgICAgIH0NCiAgICB9DQogIH0NCn0NCg0KI2Fsc28gYWRkIGR5bmFtaWMgcmVsYXRpb25hbCBpbmZvIG9uIGNsb3NlbmVzcyBhbmQgY29tbXVuaWNhdGlvbiBmcmVxdWVuY3kNCiNpbiB3MywgdGhpcyB3YXMgb25seSBhc2tlZCBmb3IgYWx0ZXJzIGZyb20gdzIgKHRob3NlIG1haW50YWluZWQgZnJvbSB3MSBvciB3Mi1jcmVhdGVkKSENCnRlc3QkZnJlcXVlbmN5LnQzIDwtIE5BDQp0ZXN0JGNsb3NlbmVzcy50MyA8LSBOQQ0KDQojIHN1YnNldCB3MyBuYW1lIGludGVycHJldGVycyBvbiBjb250YWN0IGZyZXEuIG9mIHcxIGFsdGVycyAoc3EwMjEgLSBzcTA0MCEpDQojdGFpbChuYW1lcyhkYXRhNWEpLDIzNCkNCmZyZXEgPC0gZGF0YTVhWyxjKDExMDY6MTEyNSldDQpjbG9zZSA8LSBkYXRhNWFbLGMoMTEyNjoxMTQ1KV0NCg0KIyByZWNvZGUgaW50byBudW1lcmljIHZhbHVlczsNCmZyZXEgPC0gaWZlbHNlKGZyZXE9PSIoQmlqbmEpIGVsa2UgZGFnIiw3LA0KICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZnJlcT09IjEtMiBrZWVyIHBlciB3ZWVrIiw2LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGZyZXE9PSJBYW50YWwga2VlciBwZXIgbWFhbmQiLDUsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShmcmVxPT0iT25nLiAxIGtlZXIgcGVyIG1hYW5kIiw0LCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGZyZXE9PSJBYW50YWwga2VlciBwZXIgamFhciIsMywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShmcmVxPT0iT25nLiAxIGtlZXIgcGVyIGphYXIiLDIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGZyZXE9PSJOb29pdCIsMSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOQSAgICkpKSkpKSkNCmNsb3NlIDwtIGlmZWxzZShjbG9zZT09IkhlZWwgZXJnIGhlY2h0IiwgNCwgaWZlbHNlKGNsb3NlPT0iSGVjaHQiLCAzLCBpZmVsc2UoY2xvc2U9PSJFbmlnc3ppbnMgaGVjaHQiLDIsIGlmZWxzZShjbG9zZT09Ik5pZXQgaGVjaHQiLCAxLCBOQSkpKSkNCg0KZm9yICggaSBpbiAxOmxlbmd0aChhbHRlckwpKSB7ICNmb3IgZWdvIGkNCiAgIGZvciAoaiBpbiB1bmlxdWUoIHRlc3QkYWx0ZXJpZFt3aGljaCh0ZXN0JGVnbyA9PSB1bmlxdWUodGVzdCRlZ29bd2hpY2godGVzdCR3M3BhcnRpY2lwYXRpb24gPT0gMSldKVtpXSldICkgKSB7ICMgZm9yIHdhdmUtMiBhbHRlciBqIA0KICAgICANCiAgICAgdGVzdCRmcmVxdWVuY3kudDNbIHdoaWNoKHRlc3QkZWdvID09IHVuaXF1ZSh0ZXN0JGVnb1t3aGljaCh0ZXN0JHczcGFydGljaXBhdGlvbiA9PSAxKV0pW2ldICYgdGVzdCRhbHRlcmlkID09IGopXSA8LQ0KICAgICAgIGZyZXFbaSxdWyFpcy5uYShmcmVxW2ksXSldW2pdDQogICAgIA0KICAgICB0ZXN0JGNsb3NlbmVzcy50M1sgd2hpY2godGVzdCRlZ28gPT0gdW5pcXVlKHRlc3QkZWdvW3doaWNoKHRlc3QkdzNwYXJ0aWNpcGF0aW9uID09IDEpXSlbaV0gJiB0ZXN0JGFsdGVyaWQgPT0gaildIDwtDQogICAgICAgY2xvc2VbaSxdWyFpcy5uYShjbG9zZVtpLF0pXVtqXQ0KICAgfQ0KfQ0KDQojbGFzdCwgYWRkIHJlc3Bub2RlbnQncyByZWFzb25zIGZvciBub3QgcmVuYW1pbmcgYSB3Mi1hbHRlci4NCiN0aGlzIHdhcyBvbmx5IGFza2VkIGZvciB3MiBhbHRlcnMgd2hvIHdlcmUgbm90IHJlbGlzdGVkDQp0ZXN0JHJlYXNvbiA8LSBOQQ0KDQojc3Vic2V0IHJlYXNvbnMgZ2l2ZW4gZm9yIG5vdCByZW5hbWluZyBhIHcyLWFsdGVyDQojdGFpbChuYW1lcyhkYXRhNWEpLDI0MykNCnJlYXNvbnMgPC0gZGF0YTVhWyxjKDExNDY6MTE2NSldDQojdW5pcXVlKHJlYXNvbnMkdmVyZ2V0ZW4uU1EwMDEuKQ0KIyBpZiwgYWNjb3JkaW5nIHRvIGVnbywgdGhlIHJlbGF0aW9uc2hpcCB3aXRoIGFsdGVyIGNoYW5nZWQgKCJPbnplIHJlbGF0aWUgaXMgdmVyYW5kZXJkLiIpLCB3ZSBwcm9iZWQgZnVydGhlcg0KcmVhc29uczIgPC0gZGF0YTVhWyxjKDExODY6MTIwNSldDQoNCmZvciAoIGkgaW4gMTpsZW5ndGgoYWx0ZXJMKSkgeyAjZm9yIGVnbyBpDQoNCg0KICAjaWYgYW55IHcyLWFsdGVyIG9mIGkgd2VudCB1bmxpc3RlZCAodGh1cywgc2NvcmVkIDAgb24gYHN1cnZpdmVXM2ApLi4uDQogIA0KICBpZiAoIDAgJWluJSB0ZXN0JHN1cnZpdmVXM1t3aGljaCh0ZXN0JGVnbyA9PSB1bmlxdWUodGVzdCRlZ29bd2hpY2godGVzdCR3M3BhcnRpY2lwYXRpb24gPT0gMSldKVtpXSldICkgew0KICAgIA0KICAgICMgZm9yICpub24tcmVuYW1lZCogYWx0ZXIgag0KICAgICBmb3IgKGogaW4gdW5pcXVlKCB0ZXN0JGFsdGVyaWRbd2hpY2godGVzdCRlZ28gPT0gdW5pcXVlKHRlc3QkZWdvW3doaWNoKHRlc3QkdzNwYXJ0aWNpcGF0aW9uID09IDEpXSlbaV0gJg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdCRzdXJ2aXZlVzMgPT0gMCldKSkgew0KICAgICAgIA0KICAgICAgICNnZXQgcmVzcG9uZGVudCBpJ3MgcmVhc29uIGZvciBub3QgcmUtbmFtaW5nIGosDQogICAgICAgcmVhc29uaWogPC0gcmVhc29uc1tpLGpdDQogICAgICAgI2lmIGl0IHdhcyBkdWUgdG8gYSBjaGFuZ2UgaW4gcmVsYXRpb25zaGlwLCBwcm9iZSBmdXJ0aGVyDQogICAgICAgcmVhc29uaWogPC0gaWZlbHNlKHJlYXNvbmlqID09ICJPbnplIHJlbGF0aWUgaXMgdmVyYW5kZXJkLiIsIHJlYXNvbnMyW2ksal0sIHJlYXNvbmlqKQ0KICAgICAgICNhbmQgaWYgdGhlIHJlbGF0aW9uc2hpcCBjaGFuZ2VkIGluIG90aGVyIHdheXMgdGhhbiB3ZSBvZmZlcmVkIGFzIGNob2ljZXMsIGp1c3Qgc2V0IHRvICJvdGhlciINCiAgICAgICByZWFzb25paiA8LSBpZmVsc2UocmVhc29uaWogPT0gIkRlIHJlbGF0aWUgaXMgb3AgZWVuIGFuZGVyZSBtYW5pZXIgdmVyYW5kZXJkLiIsICJBbmRlcmUgcmVkZW4uIiwgcmVhc29uaWopDQogICAgICAgDQogICAgICAgdGVzdCRyZWFzb25bd2hpY2godGVzdCRlZ28gPT0gdW5pcXVlKHRlc3QkZWdvW3doaWNoKHRlc3QkdzNwYXJ0aWNpcGF0aW9uID09IDEpXSlbaV0gJiB0ZXN0JGFsdGVyaWQgPT0gaildIDwtDQogICAgICAgICByZWFzb25pag0KICAgICB9DQogIH0NCn0NCg0KI3JlY29kZS4uLg0KI3VuaXF1ZSh0ZXN0JHJlYXNvbikNCnRlc3QkcmVhc29uIDwtIGlmZWxzZSh0ZXN0JHJlYXNvbiA9PSAiQW5kZXJlIHJlZGVuLiIsICJtaXNjZWxsYW5lb3VzIiwNCiAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHRlc3QkcmVhc29uID09ICJFciBpcyBnZWVuIGdlbGVnZW5oZWlkIGdld2Vlc3Qgdm9vciBvbnMgb20gY29udGFjdCB0ZSBoZWJiZW4uIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJubyBvY2Nhc2lvbiB0byBnZXQgdG9nZXRoZXIiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHRlc3QkcmVhc29uID09ICJFw6luIHZhbiBvbnMgaXMgdmVyaHVpc2QuIiwgInNvbWVvbmUgbW92ZWQiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UodGVzdCRyZWFzb24gPT0gIkXDqW4gdmFuIG9ucyBoZWVmdCBlZW4gYmVsYW5ncmlqa2UgdmVyYW5kZXJpbmcgZG9vcmdlbWFha3QgICh6b2FscyBoZXQgc3RvcHBlbiBtZXQgc3R1ZGVyZW4sIGhldCBhYW5nYWFuL2Jlw6tpbmRpZ2VuIHZhbiBlZW4gcmVsYXRpZSwgaGV0IGtyaWpnZW4gdmFuIGVlbiBraW5kLCBlbnpvdm9vcnQpLiIsICJvdGhlciBsaWZlIGV2ZW50IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZSh0ZXN0JHJlYXNvbiA9PSAiRcOpbiB2YW4gb25zIGhlZWZ0IGdlem9uZGhlaWRzcHJvYmxlbWVuLiIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvdGhlciBsaWZlIGV2ZW50IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UodGVzdCRyZWFzb24gPT0gIldlIHppam4gdWl0IGVsa2FhciBnZWdyb2VpZC9kZSByZWxhdGllIGlzIHZlcndhdGVyZC4iLCAiZHJpZnRlZCBhcGFydCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZSh0ZXN0JHJlYXNvbiA9PSJXZSBoYWRkZW4gbWVuaW5nc3ZlcnNjaGlsbGVuIG9mIHJ1emllLiIsICJkaXNhZ3JlZW1lbnQgLyBjb25mbGljdCIsICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZSh0ZXN0JHJlYXNvbiA9PSAiSWsgYmVuIHNpbXBlbHdlZyB2ZXJnZXRlbiBvbSBkZXplIHBlcnNvb24gb3BuaWV1dyB0ZSBub2VtZW4uIiwgImZvcmdvdHRlbiIsIHRlc3QkcmVhc29uKSkpKSkpKSkNCiAgICANCmRhdGFfYWx0ZXJzMjMgPC0gdGVzdA0KDQpgYGANCg0KDQpgYGB7ciwgZXZhbD1GQUxTRX0NCiNub3cgJ2JpbmQgYmFjayB0b2dldGhlcicNCnRlc3QgPC0gZGZfYWx0ZXJzW3doaWNoKGRmX2FsdGVycyRzdGF0dXNXMj09IkRyb3BwZWQiKSxdDQpkZl9hbHRlcnMgPC0gYmluZF9yb3dzKHRlc3QsIGRhdGFfYWx0ZXJzMjMpDQoNCiNyZWFycmFuZ2UsIGJ5IGVnbywgYW5kIHN0YXR1cw0KZGZfYWx0ZXJzIDwtIGRmX2FsdGVycyAlPiUgYXJyYW5nZShlZ28sIGZhY3RvcihzdGF0dXNXMiwgbGV2ZWxzPWMoIk1haW50YWluZWQiLCAiQ3JlYXRlZCIsICJEcm9wcGVkIikpKQ0Kcm93Lm5hbWVzKGRmX2FsdGVycykgPC0gMTpucm93KGRmX2FsdGVycykNCg0KI25ldyBhbHRlciBpZHMsIDE6bl9hbHRlcg0KZm9yIChpIGluIHVuaXF1ZShkZl9hbHRlcnMkZWdvKSkgew0KICBkZl9hbHRlcnMkYWx0ZXJpZFt3aGljaChkZl9hbHRlcnMkZWdvID09IGkpXSA8LSAxOmxlbmd0aChkZl9hbHRlcnMkYWx0ZXJpZFt3aGljaChkZl9hbHRlcnMkZWdvID09IGkpXSkNCn0NCg0KI2V4Y2x1ZGUgJ25hbWVzJw0KZGZfYWx0ZXJzLm5uIDwtIGRmX2FsdGVyc1ssLWMoNTo4KV0NCg0KI3NhdmUgdGhlIHJlc3VsdGluZyBkYXRhZnJhbWUgKGV4Y2x1ZGUgbmFtZXMpDQpmc2F2ZShkZl9hbHRlcnMubm4sICJ0aWVfbWFpbnRlbmFuY2UuUkRhIikNCmBgYA0KDQo8YnI+DQoNCg0KIyBkYXRhX25lc3RlZC5SZGENCg0KVG8gYWNjb3VudCBmb3IgdGhlICBuZXN0aW5nIHN0cnVjdHVyZSBvZiBvdXIgZGF0YSAoaS5lLiwgdGllcyBhcmUgbmVzdGVkIGluIGR5YWRzIGFuZCBuZXR3b3JrcywgdGhhdCBhcmUgYm90aCBuZXN0ZWQgaW4gZWdvKSwgd2UgdXNlIGEgMy1sZXZlbCBkZXNpZ24uIFNvIHRyYW5zZm9ybSB0aGUgZGF0YSBhY2NvcmRpbmdseS4gV2UgZG8gdGhpcyBzZXBhcmF0ZWx5IGZvciB3YXZlIDEgLS0+IHdhdmUgMiwgYW5kIHdhdmUgMiAtLT4gd2F2ZSAzLiANCg0KRmlyc3QsIHRpZHkgdXAgdGhlIGRhdGEtZnJhbWUgKGRlbGV0aW5nIHN0dWZmIHRoYXQgd2Ugd29uJ3QgbmVlZCArIHJlLW9yZGVyaW5nIGNvbHVtbnMpDQoNCmBgYHtyLCBldmFsPUZBTFNFfQ0KI2luIG91ciBhbmFseXNlcywgd2Ugb25seSBpbmNsdWRlIG5vbi1raW4NCmRmIDwtIGRmX2FsdGVycy5ublt3aGljaChkZl9hbHRlcnMubm4ka2luID09IDApLF0NCm5yb3coZGYpICNuPTQ2NTMNCg0KI3NldCBnZW5kZXIgdG8gYmluYXJ5DQpkZiRlZ29fZmVtYWxlIDwtIGlmZWxzZShkZiRlZ29fZ2VuZGVyPT0yLDEsZGYkZWdvX2dlbmRlcikNCmRmJGFsdGVyX2ZlbWFsZSA8LSBpZmVsc2UoZGYkYWx0ZXJfZ2VuZGVyPT0yLDEsZGYkYWx0ZXJfZ2VuZGVyKQ0KDQojZHJvcCBjb2x1bW5zIHdlIHdvbid0IG5lZWQNCm5hbWVzKGRmKQ0KZGVsZXRlIDwtIGMoMSw1LDE1LDIxOjI1LDI3LDI4LDMwLDMzLDM4LDUyLDcyOjg4KQ0KZGYgPC0gZGZbLC1kZWxldGVdDQoNCiNyZW9yZGVyDQpuYW1lcyhkZikNCg0Kb3JkZXIgPC0gYygiZWdvIiwgImVnb19mZW1hbGUiLCAiZWdvX2FnZSIsICJlZ29fZWR1YyIsICJzdHVkeS55ZWFyIiwgInJvbWFudGljIiwgImV4dHJhdmVyc2lvbiIsICJmaW5fcmVzdHIiLA0KICAgICAgICAgICAiaG91c2luZy50cmFuc2l0aW9uX2JpbiIsICJvY2N1cGF0aW9uLnRyYW5zaXRpb25fYmluIiwgImVkdWNfZmF0aGVyIiwgImVkdWNfbW90aGVyIiwNCiAgICAgICAgICAgImNkbi5zaXplIiwgImNkbi5zaXplMiIsICJzdHVkeS5zaXplIiwgInN0dWR5LnNpemUyIiwgImJmZi5zaXplIiwgImJmZi5zaXplMiIsICJjc24uc2l6ZSIsICJjc24uc2l6ZTIiLA0KICAgICAgICAgICAiY2RuLmRlbnNpdHkiLCAiY2RuLmRlbnNpdHkyIiwgInN0dWR5LmRlbnNpdHkiLCAic3R1ZHkuZGVuc2l0eTIiLCAiYmZmLmRlbnNpdHkiLCAiYmZmLmRlbnNpdHkyIiwgImNzbi5kZW5zaXR5IiwgImNzbi5kZW5zaXR5MiIsDQogICAgICAgICAgICJhbHRlcmlkIiwgImFsdGVyX2ZlbWFsZSIsICJhbHRlcl9hZ2UiLCAiYWx0ZXJfZWR1YyIsDQogICAgICAgICAgICJzYW1lX2dlbmRlciIsICJkaWZfYWdlIiwgInNpbV9lZHVjIiwNCiAgICAgICAgICAgInByb3hpbWl0eSIsICJkdXJhdGlvbiIsDQogICAgICAgICAgICJmcmVxdWVuY3kudDEiLCAiZnJlcXVlbmN5LnQyIiwgImZyZXF1ZW5jeS50MyIsICJjbG9zZW5lc3MudDEiLCAiY2xvc2VuZXNzLnQyIiwgImNsb3NlbmVzcy50MyIsICJtdWx0aXBsZXgiLCAibXVsdGlwbGV4LnQyIiwNCiAgICAgICAgICAgImNkbjEiLCJjZG4yIiwiY2RuMyIsInN0dWR5MSIsICJzdHVkeTIiLCJzdHVkeTMiLCJiZmYxIiwiYmZmMiIsImJmZjMiLCJjc24xIiwiY3NuMiIsImNzbjMiLA0KICAgICAgICAgICAiY2RuX2VtYmVkLnQxIiwgImNkbl9lbWJlZC50MiIsICJzdHVkeV9lbWJlZC50MSIsICJzdHVkeV9lbWJlZC50MiIsICJiZmZfZW1iZWQudDEiLCAiYmZmX2VtYmVkLnQyIiwgImNzbl9lbWJlZC50MSIsICJjc25fZW1iZWQudDIiLA0KICAgICAgICAgICAic3RhdHVzVzIiLCAidzNwYXJ0aWNpcGF0aW9uIiwgICJyZWFzb24iKQ0KDQpkZiA8LSBkZlssb3JkZXJdDQoNCiNtdWx0aXBsZXggdDINCmRmJG11bHRpcGxleC50MiA8LSByb3dTdW1zKGRmWyxjKCJjZG4yIiwic3R1ZHkyIiwiYmZmMiIsImNzbjIiKV0pIC0gMQ0KYGBgDQoNCjxicj4NCg0KIyMgd2F2ZSAxIC0tPiB3YXZlIDINCg0KYGBge3IsIGV2YWwgPSBGQUxTRX0NCiNpbiBhbmFseXppbmcgd2F2ZXMgMSBhbmQgMiwgd2UgbG9vayBhdCB3MSBhbHRlcnMgYW5kIHNlZSB3aGV0aGVyIHRoZXkgYXJlIG1haW50YWluZWQgb3IgZHJvcHBlZA0KI3NvLCBkcm9wIHcyLWNyZWF0ZWQgYWx0ZXJzDQpkZjEgPC0gZGZbLXdoaWNoKGRmJHN0YXR1c1cyID09ICJDcmVhdGVkIiksXQ0KbnJvdyhkZjEpICNuPTMxNzQNCg0KI21ha2Ugc2VwZXJhdGUgZGF0YXNldHMgZm9yIGVhY2ggcmVsYXRpb25hbCBkaW1lbnNpb24gKGF0IHQxKQ0KZGYuY2RuIDwtIGRmMVt3aGljaChkZjEkY2RuMT09MSksXQ0KZGYuc3R1ZHkgPC0gZGYxW3doaWNoKGRmMSRzdHVkeTE9PTEpLF0NCmRmLmJmZiA8LSBkZjFbd2hpY2goZGYxJGJmZjE9PTEpLF0NCmRmLmNzbiA8LSBkZjFbd2hpY2goZGYxJGNzbjE9PTEpLF0NCg0KIyByYmluZCB0aGUgbXVsdGlwbGUgZGF0YXNldHMNCg0KI2J1dCBmaXJzdCwgYS4gbWFrZSBuZXcgWSAoaS5lLiwgcmVtYWluIGluICpzYW1lKiBlZ29uZXQpOyBtYWtlIG5ldyB2YXJpYWJsZXMgZm9yIGZlYXR1cmVzIGRlcGVuZGluZyBvbiB0aGUgcGFydGljdWxhciBlZ29uZXQgKGVnIHNpemUsIGVtYmVkZGVkbmVzcykNCmRmLmNkbiRZIDwtIGlmZWxzZShpcy5uYShkZi5jZG4kY2RuMiksMCxkZi5jZG4kY2RuMikNCmRmLnN0dWR5JFkgPC0gaWZlbHNlKGlzLm5hKGRmLnN0dWR5JHN0dWR5MiksMCxkZi5zdHVkeSRzdHVkeTIpDQpkZi5iZmYkWSA8LSBpZmVsc2UoaXMubmEoZGYuYmZmJGJmZjIpLDAsZGYuYmZmJGJmZjIpDQpkZi5jc24kWSA8LSBpZmVsc2UoaXMubmEoZGYuY3NuJGNzbjIpLDAsZGYuY3NuJGNzbjIpDQoNCmRmLmNkbiR0aWUgPC0gIkNvbmZpZGFudCINCmRmLnN0dWR5JHRpZSA8LSAiU3R1ZHkiDQpkZi5iZmYkdGllIDwtICJGcmllbmQiDQpkZi5jc24kdGllIDwtICJTcG9ydCINCg0KZGYuY2RuJGRlbnNpdHkgPC0gZGYuY2RuJGNkbi5kZW5zaXR5DQpkZi5iZmYkZGVuc2l0eSA8LSBkZi5iZmYkYmZmLmRlbnNpdHkNCmRmLnN0dWR5JGRlbnNpdHkgPC0gZGYuc3R1ZHkkc3R1ZHkuZGVuc2l0eQ0KZGYuY3NuJGRlbnNpdHkgPC0gZGYuY3NuJGNzbi5kZW5zaXR5DQoNCmRmLmNkbiRzaXplIDwtIGRmLmNkbiRjZG4uc2l6ZQ0KZGYuYmZmJHNpemUgPC0gZGYuYmZmJGJmZi5zaXplDQpkZi5zdHVkeSRzaXplIDwtIGRmLnN0dWR5JHN0dWR5LnNpemUNCmRmLmNzbiRzaXplIDwtIGRmLmNzbiRjc24uc2l6ZQ0KDQpkZi5jZG4kZW1iZWQgPC0gZGYuY2RuJGNkbl9lbWJlZC50MQ0KZGYuYmZmJGVtYmVkIDwtIGRmLmJmZiRiZmZfZW1iZWQudDENCmRmLnN0dWR5JGVtYmVkIDwtIGRmLnN0dWR5JHN0dWR5X2VtYmVkLnQxDQpkZi5jc24kZW1iZWQgPC0gZGYuY3NuJGNzbl9lbWJlZC50MQ0KDQojYWxzbyBpbmNsdWRlICJleHRlbmRlZCIgZW1iZWRkZWRuZXNzLCBvciBhIHRoZSBleHRlbnQgdG8gd2hpY2ggYW4gYWx0ZXIgYXBwZWFyaW5nIGluIHRoZSBlZ29uZXQgb2YgZWdvIGlzIGFsc28gZW1iZWRkZWQgaW4gYWRkaXRpb25hbCBsYXllcnMgb2YgZWdvJ3MgbmV0d29yay4NCiN3ZSBjYWxjdWxhdGUgdGhlIHN1bSBvZiBlbWJlZGRlZG5lc3Mgc2NvcmVzIGluIGFkZGl0aW9uYWwgbmV0d29ya3MsIHdoZXJlIE5BID0gMC4NCmRmLmNkbiRlbWJlZC5leHQgPC0gcm93U3VtcyhjYmluZChpZmVsc2UoaXMubmEoZGYuY2RuJGJmZl9lbWJlZC50MSksMCxkZi5jZG4kYmZmX2VtYmVkLnQxKSwgaWZlbHNlKGlzLm5hKGRmLmNkbiRzdHVkeV9lbWJlZC50MSksMCxkZi5jZG4kc3R1ZHlfZW1iZWQudDEpLCBpZmVsc2UoaXMubmEoZGYuY2RuJGNzbl9lbWJlZC50MSksMCxkZi5jZG4kY3NuX2VtYmVkLnQxKSkpDQpkZi5iZmYkZW1iZWQuZXh0IDwtIHJvd1N1bXMoY2JpbmQoaWZlbHNlKGlzLm5hKGRmLmJmZiRjZG5fZW1iZWQudDEpLDAsZGYuYmZmJGNkbl9lbWJlZC50MSksIGlmZWxzZShpcy5uYShkZi5iZmYkc3R1ZHlfZW1iZWQudDEpLDAsZGYuYmZmJHN0dWR5X2VtYmVkLnQxKSwgaWZlbHNlKGlzLm5hKGRmLmJmZiRjc25fZW1iZWQudDEpLDAsZGYuYmZmJGNzbl9lbWJlZC50MSkpKQ0KZGYuc3R1ZHkkZW1iZWQuZXh0IDwtIHJvd1N1bXMoY2JpbmQoaWZlbHNlKGlzLm5hKGRmLnN0dWR5JGNkbl9lbWJlZC50MSksMCxkZi5zdHVkeSRjZG5fZW1iZWQudDEpLCBpZmVsc2UoaXMubmEoZGYuc3R1ZHkkYmZmX2VtYmVkLnQxKSwwLGRmLnN0dWR5JGJmZl9lbWJlZC50MSksIGlmZWxzZShpcy5uYShkZi5zdHVkeSRjc25fZW1iZWQudDEpLDAsZGYuc3R1ZHkkY3NuX2VtYmVkLnQxKSkpDQpkZi5jc24kZW1iZWQuZXh0IDwtIHJvd1N1bXMoY2JpbmQoaWZlbHNlKGlzLm5hKGRmLmNzbiRjZG5fZW1iZWQudDEpLDAsZGYuY3NuJGNkbl9lbWJlZC50MSksIGlmZWxzZShpcy5uYShkZi5jc24kYmZmX2VtYmVkLnQxKSwwLGRmLmNzbiRiZmZfZW1iZWQudDEpLCBpZmVsc2UoaXMubmEoZGYuY3NuJHN0dWR5X2VtYmVkLnQxKSwwLGRmLmNzbiRzdHVkeV9lbWJlZC50MSkpKQ0KDQpkYXRhIDwtIHJiaW5kKGRmLmNkbixkZi5iZmYsZGYuc3R1ZHksIGRmLmNzbikNCg0KI2FkZCBjb21iaW5hdGlvbiBvZiB0aWUgYW5kIGVnbywgdG8gbWFrZSBhICduZXR3b3JrJyB2YXJpYWJsZSAoaS5lLiwgbmV0d29ya3MgYXJlIG5lc3RlZCBpbiBlZ28sIGFuZCB0aHVzIHVuaXF1ZSB0byBlZ28pDQpkYXRhJG5ldHdvcmsgPC0gcGFzdGUwKGRhdGEkdGllLCBkYXRhJGVnbykNCg0KI3Jlb3JkZXIgYnkgZWdvIGFuZCBhbHRlcg0KZGF0YSA8LSBkYXRhW29yZGVyKGRhdGEkZWdvLCBkYXRhJGFsdGVyaWQpLF0NCnJvdy5uYW1lcyhkYXRhKSA8LSAxOm5yb3coZGF0YSkNCg0KI3NldCBOQXMgb24gc3RyLiBlbWJlZGVkbmVzcyB0byAwIChmb3IgdGhvc2UgdGhhdCB3ZXJlIG5hbWVkIGFzIHRoZSBvbmx5IGFsdGVyKQ0KZGF0YSRlbWJlZFtpcy5uYShkYXRhJGVtYmVkKV0gPC0gMA0KDQoja2VlcCBvbmx5IGNvbHVtbnMgb2YgaW50ZXJlc3QNCm5hbWVzKGRhdGEpDQpkYXRhIDwtIGRhdGFbLGMoMToxMiwyOTozOCwgNDEsIDQ0LCA0Niw0OSw1Miw1NSw2Niw2OTo3NSApXQ0KDQojbWFrZSB1bmlxdWUgYWx0ZXIgaWQNCmRhdGEkYWx0ZXJpZCA8LSBwYXN0ZTAoZGF0YSRlZ28sICJYIiwgZGF0YSRhbHRlcmlkKQ0KDQojbGlzdHdpc2UgZGVsZXRpb24NCmNvbFN1bXMoaXMubmEoZGF0YSkpICNtaXNzaW5ncyBwZXIgdmFyaWFibGUNCg0KI3RhYmxlKGRhdGEkcHJveGltaXR5LCB1c2VOQT0iYWx3YXlzIikNCiNwcm9wLnRhYmxlKHRhYmxlKGRhdGEkcHJveGltaXR5LCB1c2VOQT0iYWx3YXlzIikpDQpkYXRhJHByb3hpbWl0eSA8LSBpZmVsc2UoaXMubmEoZGF0YSRwcm94aW1pdHkpLCAiZmFyIiwgZGF0YSRwcm94aW1pdHkpICNzb21lIGRvbid0IGtub3dzIG9uIGFsdGVyIHByb3hpbWl0eSwgc2V0IHRvICJmYXIiDQoNCmRhdGEgPC0gZGF0YVt3aGljaChjb21wbGV0ZS5jYXNlcyhkYXRhKSksXQ0KDQpkYXRhMTIgPC0gZGF0YQ0KYGBgDQoNCmBgYHtyIHRlc3QsIGV2YWw9RkFMU0UsIGVjaG89RkFMU0V9DQojY2hlY2sgaWYgZXZlcnl0aGluZyB3ZW50IGFsbHJpZ2h0DQpsZW5ndGgodW5pcXVlKGRhdGEkZWdvKSkgI05fZWdvID0gNTEzDQpsZW5ndGgodW5pcXVlKHBhc3RlMChkYXRhJGVnbywgIngiLGRhdGEkYWx0ZXJpZCkpKSAjTl9hbHRlciA9IDMxMDQNCm5yb3coZGF0YSkgI05fdGllID0gNDkzOQ0KDQojbXVsdGlwbGV4aXR5LCBhdCB0aGUgYWx0ZXItbGV2ZWwsIHRpbWVzIG5fYWx0ZXIgc2hvdWxkIGJlIG5fdGllLg0KI3N1YnNldCBmcm9tIGBkZmAgKGFsdGVyLWxldmVsKSBvbmx5IGFsdGVycyBmcm9tIG91ciB0aWUtbGV2ZWwgZGF0YQ0KdGVzdGRmIDwtIGRmDQojbWFrZSBhbiBlZ29YYWx0ZXIgaWQNCnRlc3RkZiRhbHRlcmlkIDwtIHBhc3RlMCh0ZXN0ZGYkZWdvLCAiWCIsIHRlc3RkZiRhbHRlcmlkICkNCnRlc3RkZiA8LSB0ZXN0ZGZbd2hpY2godGVzdGRmJGFsdGVyaWQgJWluJSBkYXRhJGFsdGVyaWQpLF0NCihtZWFuKHRlc3RkZiRtdWx0aXBsZXgpKzEpICogbnJvdyh0ZXN0ZGYpID09IG5yb3coZGF0YSkgDQojT0tBWSENCmBgYA0KPGJyPg0KDQojIyB3YXZlIDIgLS0+IHdhdmUgMw0KDQpgYGB7ciwgZXZhbCA9IEZBTFNFfQ0KI2luIGFuYWx5emluZyB3YXZlcyAyIGFuZCAzLCB3ZSBsb29rIGF0IHcyLWFsdGVycyAobWFpbnRhaW5lZCAvIGNyZWF0ZWQpDQojc28sIGRyb3AgdzItZHJvcHBlZA0KI2FuZCBvbmx5IG9mIGVnb3Mgd2hvIHBhcnRpY2lwYXRlZCBpbiB3Mw0KZGYyIDwtIGRmWy13aGljaChkZiRzdGF0dXNXMiA9PSAiRHJvcHBlZCIpLF0NCmRmMiA8LSBkZjJbZGYyJHczcGFydGljaXBhdGlvbiA9PSAxLF0NCg0KI21ha2Ugc2VwZXJhdGUgZGF0YXNldHMgZm9yIGVhY2ggcmVsYXRpb25hbCBkaW1lbnNpb24gKGF0IHQyKQ0KZGYuY2RuIDwtIGRmMlt3aGljaChkZjIkY2RuMj09MSksXQ0KZGYuc3R1ZHkgPC0gZGYyW3doaWNoKGRmMiRzdHVkeTI9PTEpLF0NCmRmLmJmZiA8LSBkZjJbd2hpY2goZGYyJGJmZjI9PTEpLF0NCmRmLmNzbiA8LSBkZjJbd2hpY2goZGYyJGNzbjI9PTEpLF0NCg0KIyByYmluZCB0aGUgbXVsdGlwbGUgZGF0YXNldHMNCg0KI2J1dCBmaXJzdCwgYS4gbWFrZSBuZXcgWSAoaS5lLiwgcmVtYWluIGluICpzYW1lKiBlZ29uZXQpOyBtYWtlIG5ldyB2YXJpYWJsZXMgZm9yIGZlYXR1cmVzIGRlcGVuZGluZyBvbiB0aGUgcGFydGljdWxhciBlZ29uZXQgKGVnIHNpemUsIGVtYmVkZGVkbmVzcykNCg0KZGYuY2RuJFkgPC0gaWZlbHNlKGlzLm5hKGRmLmNkbiRjZG4zKSwwLGRmLmNkbiRjZG4zKQ0KZGYuc3R1ZHkkWSA8LSBpZmVsc2UoaXMubmEoZGYuc3R1ZHkkc3R1ZHkzKSwwLGRmLnN0dWR5JHN0dWR5MykNCmRmLmJmZiRZIDwtIGlmZWxzZShpcy5uYShkZi5iZmYkYmZmMyksMCxkZi5iZmYkYmZmMykNCmRmLmNzbiRZIDwtIGlmZWxzZShpcy5uYShkZi5jc24kY3NuMyksMCxkZi5jc24kY3NuMykNCg0KZGYuY2RuJHRpZSA8LSAiQ29uZmlkYW50Ig0KZGYuc3R1ZHkkdGllIDwtICJTdHVkeSINCmRmLmJmZiR0aWUgPC0gIkZyaWVuZCINCmRmLmNzbiR0aWUgPC0gIlNwb3J0Ig0KDQpkZi5jZG4kZGVuc2l0eSA8LSBkZi5jZG4kY2RuLmRlbnNpdHkyDQpkZi5iZmYkZGVuc2l0eSA8LSBkZi5iZmYkYmZmLmRlbnNpdHkyDQpkZi5zdHVkeSRkZW5zaXR5IDwtIGRmLnN0dWR5JHN0dWR5LmRlbnNpdHkyDQpkZi5jc24kZGVuc2l0eSA8LSBkZi5jc24kY3NuLmRlbnNpdHkyDQoNCmRmLmNkbiRzaXplIDwtIGRmLmNkbiRjZG4uc2l6ZTINCmRmLmJmZiRzaXplIDwtIGRmLmJmZiRiZmYuc2l6ZTINCmRmLnN0dWR5JHNpemUgPC0gZGYuc3R1ZHkkc3R1ZHkuc2l6ZTINCmRmLmNzbiRzaXplIDwtIGRmLmNzbiRjc24uc2l6ZTINCg0KZGYuY2RuJGVtYmVkIDwtIGRmLmNkbiRjZG5fZW1iZWQudDINCmRmLmJmZiRlbWJlZCA8LSBkZi5iZmYkYmZmX2VtYmVkLnQyDQpkZi5zdHVkeSRlbWJlZCA8LSBkZi5zdHVkeSRzdHVkeV9lbWJlZC50Mg0KZGYuY3NuJGVtYmVkIDwtIGRmLmNzbiRjc25fZW1iZWQudDINCg0KI2Fsc28gaW5jbHVkZSAiZXh0ZW5kZWQiIGVtYmVkZGVkbmVzcywgb3IgYSB0aGUgZXh0ZW50IHRvIHdoaWNoIGFuIGFsdGVyIGFwcGVhcmluZyBpbiB0aGUgZWdvbmV0IG9mIGVnbyBpcyBhbHNvIGVtYmVkZGVkIGluIGFkZGl0aW9uYWwgbGF5ZXJzIG9mIGVnbydzIG5ldHdvcmsuDQojd2UgY2FsY3VsYXRlIHRoZSBzdW0gb2YgZW1iZWRkZWRuZXNzIHNjb3JlcyBpbiBhZGRpdGlvbmFsIG5ldHdvcmtzLCB3aGVyZSBOQSA9IDAuDQpkZi5jZG4kZW1iZWQuZXh0IDwtIHJvd1N1bXMoY2JpbmQoaWZlbHNlKGlzLm5hKGRmLmNkbiRiZmZfZW1iZWQudDIpLDAsZGYuY2RuJGJmZl9lbWJlZC50MiksIGlmZWxzZShpcy5uYShkZi5jZG4kc3R1ZHlfZW1iZWQudDIpLDAsZGYuY2RuJHN0dWR5X2VtYmVkLnQyKSwgaWZlbHNlKGlzLm5hKGRmLmNkbiRjc25fZW1iZWQudDIpLDAsZGYuY2RuJGNzbl9lbWJlZC50MikpKQ0KZGYuYmZmJGVtYmVkLmV4dCA8LSByb3dTdW1zKGNiaW5kKGlmZWxzZShpcy5uYShkZi5iZmYkY2RuX2VtYmVkLnQyKSwwLGRmLmJmZiRjZG5fZW1iZWQudDIpLCBpZmVsc2UoaXMubmEoZGYuYmZmJHN0dWR5X2VtYmVkLnQyKSwwLGRmLmJmZiRzdHVkeV9lbWJlZC50MiksIGlmZWxzZShpcy5uYShkZi5iZmYkY3NuX2VtYmVkLnQyKSwwLGRmLmJmZiRjc25fZW1iZWQudDIpKSkNCmRmLnN0dWR5JGVtYmVkLmV4dCA8LSByb3dTdW1zKGNiaW5kKGlmZWxzZShpcy5uYShkZi5zdHVkeSRjZG5fZW1iZWQudDIpLDAsZGYuc3R1ZHkkY2RuX2VtYmVkLnQyKSwgaWZlbHNlKGlzLm5hKGRmLnN0dWR5JGJmZl9lbWJlZC50MiksMCxkZi5zdHVkeSRiZmZfZW1iZWQudDIpLCBpZmVsc2UoaXMubmEoZGYuc3R1ZHkkY3NuX2VtYmVkLnQyKSwwLGRmLnN0dWR5JGNzbl9lbWJlZC50MikpKQ0KZGYuY3NuJGVtYmVkLmV4dCA8LSByb3dTdW1zKGNiaW5kKGlmZWxzZShpcy5uYShkZi5jc24kY2RuX2VtYmVkLnQyKSwwLGRmLmNzbiRjZG5fZW1iZWQudDIpLCBpZmVsc2UoaXMubmEoZGYuY3NuJGJmZl9lbWJlZC50MiksMCxkZi5jc24kYmZmX2VtYmVkLnQyKSwgaWZlbHNlKGlzLm5hKGRmLmNzbiRzdHVkeV9lbWJlZC50MiksMCxkZi5jc24kc3R1ZHlfZW1iZWQudDIpKSkNCg0KZGF0YSA8LSByYmluZChkZi5jZG4sZGYuYmZmLGRmLnN0dWR5LCBkZi5jc24pDQoNCiNhZGQgY29tYmluYXRpb24gb2YgdGllIGFuZCBlZ28sIHRvIG1ha2UgYSAnbmV0d29yaycgdmFyaWFibGUgKGkuZS4sIG5ldHdvcmtzIGFyZSBuZXN0ZWQgaW4gZWdvLCBhbmQgdGh1cyB1bmlxdWUgdG8gZWdvKQ0KZGF0YSRuZXR3b3JrIDwtIHBhc3RlMChkYXRhJHRpZSwgZGF0YSRlZ28pDQoNCiNyZW9yZGVyIGJ5IGVnbyBhbmQgYWx0ZXINCmRhdGEgPC0gZGF0YVtvcmRlcihkYXRhJGVnbywgZGF0YSRhbHRlcmlkKSxdDQpyb3cubmFtZXMoZGF0YSkgPC0gMTpucm93KGRhdGEpDQoNCiNzZXQgTkFzIG9uIHN0ci4gZW1iZWRlZG5lc3MgdG8gMCAoZm9yIHRob3NlIHRoYXQgd2VyZSBuYW1lZCBhcyB0aGUgb25seSBhbHRlcikNCmRhdGEkZW1iZWRbaXMubmEoZGF0YSRlbWJlZCldIDwtIDANCg0KI2tlZXAgb25seSBjb2x1bW5zIG9mIGludGVyZXN0DQpuYW1lcyhkYXRhKQ0KDQpkYXRhIDwtIGRhdGFbLGMoMToxMiwgMjk6MzcsIDM5LCA0MiwgNDUsIDQ3LDUwLDUzLDU2LDY2LCA2ODo3NSApXQ0KI2hlcmUgaW5jbHVkZSBhbHNvIGBzdGF0dXNXMmAgKGNyZWF0ZWQgdnMgbWFpbnRhaW5lZCkgKyBgcmVhc29uYCBmb3Igbm90IHJlbmFtaW5nIGFsdGVyDQoNCmRhdGEkbXVsdGlwbGV4IDwtIGRhdGEkbXVsdGlwbGV4LnQyDQpuYW1lcyhkYXRhKQ0KZGF0YSA8LSBkYXRhWywtMjRdDQoNCiNtYWtlIHVuaXF1ZSBhbHRlciBpZA0KZGF0YSRhbHRlcmlkIDwtIHBhc3RlMChkYXRhJGVnbywgIlgiLCBkYXRhJGFsdGVyaWQpDQoNCiNsaXN0d2lzZSBkZWxldGlvbg0KY29sU3Vtcyhpcy5uYShkYXRhKSkgI21pc3NpbmdzIHBlciB2YXJpYWJsZQ0KZGF0YSRwcm94aW1pdHkgPC0gaWZlbHNlKGlzLm5hKGRhdGEkcHJveGltaXR5KSwgImZhciIsIGRhdGEkcHJveGltaXR5KQ0KDQppPXVuaXF1ZShkYXRhJGVnbylbMV0NCg0KI2VnbyBjb3ZhcmlhdGVzIGFtb25nICdjcmVhdGVkJyBhbHRlcnMgYXJlIHN0aWxsIGVtcHR5LCBzbyBtYXRjaCBiYXNlZCBvbiBlZ28gaWQNCiNub3RlIHRoYXQgdHJhbnNpdGlvbnMgd2VyZSBub3QgbWVhc3VyZWQgYmV0d2VlbiB3MnczLCBzbyB0aGV5IGFyZSBOQXMNCmZvciAoaSBpbiB1bmlxdWUoZGF0YSRlZ28pKSB7DQogIA0KICBkYXRhJGVkdWNfZmF0aGVyW2RhdGEkZWdvID09IGkgJiBkYXRhJHN0YXR1c1cyID09ICJDcmVhdGVkIl0gPC0gZGYkZWR1Y19mYXRoZXJbZGYkZWdvID09IGkgJiAoZGYkc3RhdHVzVzIgPT0gIk1haW50YWluZWQiIHwgZGYkc3RhdHVzVzIgPT0gIkRyb3BwZWQiKV1bMV0NCiAgZGF0YSRlZHVjX21vdGhlcltkYXRhJGVnbyA9PSBpICYgZGF0YSRzdGF0dXNXMiA9PSAiQ3JlYXRlZCJdIDwtIGRmJGVkdWNfbW90aGVyW2RmJGVnbyA9PSBpICYgKGRmJHN0YXR1c1cyID09ICJNYWludGFpbmVkIiB8IGRmJHN0YXR1c1cyID09ICJEcm9wcGVkIildWzFdDQogIGRhdGEkc3R1ZHkueWVhcltkYXRhJGVnbyA9PSBpICYgZGF0YSRzdGF0dXNXMiA9PSAiQ3JlYXRlZCJdIDwtIGRmJHN0dWR5LnllYXJbZGYkZWdvID09IGkgJiAoZGYkc3RhdHVzVzIgPT0gIk1haW50YWluZWQiIHwgZGYkc3RhdHVzVzIgPT0gIkRyb3BwZWQiKV1bMV0NCiAgZGF0YSRleHRyYXZlcnNpb25bZGF0YSRlZ28gPT0gaSAmIGRhdGEkc3RhdHVzVzIgPT0gIkNyZWF0ZWQiXSA8LSBkZiRleHRyYXZlcnNpb25bZGYkZWdvID09IGkgJiAoZGYkc3RhdHVzVzIgPT0gIk1haW50YWluZWQiIHwgZGYkc3RhdHVzVzIgPT0gIkRyb3BwZWQiKV1bMV0NCiAgZGF0YSRmaW5fcmVzdHJbZGF0YSRlZ28gPT0gaSAmIGRhdGEkc3RhdHVzVzIgPT0gIkNyZWF0ZWQiXSA8LSBkZiRmaW5fcmVzdHJbZGYkZWdvID09IGkgJiAoZGYkc3RhdHVzVzIgPT0gIk1haW50YWluZWQiIHwgZGYkc3RhdHVzVzIgPT0gIkRyb3BwZWQiKV1bMV0NCiAgZGF0YSRyb21hbnRpY1tkYXRhJGVnbyA9PSBpICYgZGF0YSRzdGF0dXNXMiA9PSAiQ3JlYXRlZCJdIDwtIGRmJHJvbWFudGljW2RmJGVnbyA9PSBpICYgKGRmJHN0YXR1c1cyID09ICJNYWludGFpbmVkIiB8IGRmJHN0YXR1c1cyID09ICJEcm9wcGVkIildWzFdDQogIGRhdGEkaG91c2luZy50cmFuc2l0aW9uX2JpbltkYXRhJGVnbyA9PSBpICYgZGF0YSRzdGF0dXNXMiA9PSAiQ3JlYXRlZCJdIDwtIGRmJGhvdXNpbmcudHJhbnNpdGlvbl9iaW5bZGYkZWdvID09IGkgJiAoZGYkc3RhdHVzVzIgPT0gIk1haW50YWluZWQiIHwgZGYkc3RhdHVzVzIgPT0gIkRyb3BwZWQiKV1bMV0NCiAgZGF0YSRvY2N1cGF0aW9uLnRyYW5zaXRpb25fYmluW2RhdGEkZWdvID09IGkgJiBkYXRhJHN0YXR1c1cyID09ICJDcmVhdGVkIl0gPC0gZGYkb2NjdXBhdGlvbi50cmFuc2l0aW9uX2JpbltkZiRlZ28gPT0gaSAmIChkZiRzdGF0dXNXMiA9PSAiTWFpbnRhaW5lZCIgfCBkZiRzdGF0dXNXMiA9PSAiRHJvcHBlZCIpXVsxXQ0KfQ0KDQojbWlzc2luZ3Mgb24gJ3JlYXNvbicgYXJlIG5vIG1pc3NpbmdzLCBidXQgcmVmZXIgdG8gYWx0ZXJzIHRoYXQgd2VyZSByZW5hbWVkDQpkYXRhJHJlYXNvbltpcy5uYShkYXRhJHJlYXNvbildIDwtICItIg0KZGF0YSA8LSBkYXRhW3doaWNoKGNvbXBsZXRlLmNhc2VzKGRhdGEpKSxdDQoNCiN0cmFuc2l0aW9ucyBhcmUgbm90IG1lYXN1cmVkLCBzZXQgdG8gMA0KZGF0YSRob3VzaW5nLnRyYW5zaXRpb24gPC0gMA0KZGF0YSRvY2N1cGF0aW9uLnRyYW5zaXRpb24gPC0gMA0KDQpkYXRhMjMgPC0gZGF0YQ0KDQpsZW5ndGgodW5pcXVlKGRhdGEkZWdvKSkgI05fZWdvID0gMjgxDQpsZW5ndGgodW5pcXVlKGRhdGEkYWx0ZXJpZCkpICNOX2FsdGVyID0gMTg1OQ0KYGBgDQoNCjxicj4NCg0KTWFrZSBzb21lIGxhc3QgYWx0ZXJhdGlvbnMsIGxpc3QgdGhlIGRhdGEtZnJhbWVzIGZvciB3YXZlcyAxLTIgYW5kIDItMy4NCkFsc28gcm93LWJpbmQgdGhlIGRhdGEsIGFuZCBhZGQgYSBjb2x1bW4gaW5kaWNhdGluZyB3aGVuIHRoZSB0aWUgYXBwZWFyZWQgYW5kIHdoZW4gaXQgKGRpZCBub3QpIHJlYXBwZWFyLg0KDQpgYGB7cixldmFsPUZBTFNFfQ0KIyBtYWtlIGNvbG5hbWVzIHNpbWlsYXINCmNvbG5hbWVzKGRhdGExMilbY29sbmFtZXMoZGF0YTEyKSA9PSAiZnJlcXVlbmN5LnQxIl0gPC0gImZyZXF1ZW5jeS50Ig0KY29sbmFtZXMoZGF0YTEyKVtjb2xuYW1lcyhkYXRhMTIpID09ICJjbG9zZW5lc3MudDEiXSA8LSAiY2xvc2VuZXNzLnQiDQoNCmNvbG5hbWVzKGRhdGEyMylbY29sbmFtZXMoZGF0YTIzKSA9PSAiZnJlcXVlbmN5LnQyIl0gPC0gImZyZXF1ZW5jeS50Ig0KY29sbmFtZXMoZGF0YTIzKVtjb2xuYW1lcyhkYXRhMjMpID09ICJjbG9zZW5lc3MudDIiXSA8LSAiY2xvc2VuZXNzLnQiDQoNCmNvbG5hbWVzKGRhdGExMilbMjU6MjhdIDwtIHN1YigiMSQiLCAiIiwgY29sbmFtZXMoZGF0YTEyKVsyNToyOF0pDQpjb2xuYW1lcyhkYXRhMjMpWzI0OjI3XSA8LSBzdWIoIjIkIiwgIiIsIGNvbG5hbWVzKGRhdGEyMylbMjQ6MjddKQ0KDQpkYXRhMTIkaG91c2luZy50cmFuc2l0aW9uIDwtIGRhdGExMiRob3VzaW5nLnRyYW5zaXRpb25fYmluDQpkYXRhMTIkb2NjdXBhdGlvbi50cmFuc2l0aW9uIDwtIGRhdGExMiRvY2N1cGF0aW9uLnRyYW5zaXRpb25fYmluDQoNCiMyIGxpc3QgZGF0YS1mcmFtZXMNCmRhdGFMaXN0IDwtIGxpc3QoZGF0YTEyLCBkYXRhMjMpDQpmc2F2ZShkYXRhTGlzdCwgImRhdGFfbmVzdGVkX0xpc3QuUmRhIikNCg0KIzMgcm93LWJpbmQNCmRhdGExMiRwZXJpb2QgPC0gIncxIC0+IHcyIg0KI2RhdGEyMyRwZXJpb2QgPC0gaWZlbHNlKGRhdGEyMyRzdGF0dXNXMiA9PSAiQ3JlYXRlZCIsICJ3MiAtPiB3MyIsICJ3MSAtIHcyIC0+IHczIikNCmRhdGEyMyRwZXJpb2QgPC0gIncyIC0+IHczIg0KDQpkYXRhIDwtIGJpbmRfcm93cyhkYXRhMTIsZGF0YTIzKQ0KDQpsZW5ndGgodW5pcXVlKGRhdGEkZWdvKSkNCmxlbmd0aCh1bmlxdWUoZGF0YSRhbHRlcmlkKSkNCm5yb3coZGF0YSkNCg0KbmFtZXMoZGF0YSkNCmRhdGEgPC0gZGF0YVssLWMoOSwxMCwyOSldDQoNCmZzYXZlKGRhdGEsICJkYXRhX25lc3RlZC5SZGEiKQ0KDQpgYGANCg0KPGJyPg0KDQojIHsudW5saXN0ZWQgLnVubnVtYmVyZWR9DQoNCi0tLS0NCg0KDQojIyBSZWZlcmVuY2VzDQoNCg0K


Copyright © 2025 Rob Franken