Data Preparation

In this pre-registered study, we collected data from 361 participants. After filtering these participants with an attention check measure, we obtained analyzable data from 350 participants.

Loading Data/Packages

Before running this chunk, please load “Study 2.csv” into the R environment.

# packages should be loaded in the following order to avoid function conflicts
options(scipen = 99) # turns off scientific notation
library(psych) # for describing data
library(effsize) # for mean difference effect sizes
library(sjstats) # for eta-squared effect sizes
library(correlation) # for cleaner correlation test output
library(rmcorr) # for repeated-measures correlation tests
library(cocor) # for comparing dependent correlation coefficients
library(tidyverse) # for data manipulation and plotting

Attention check

Participants in the continuous virtuosity condition were instructed to select zero (i.e., the middle option in the 9-point scale) as their response for the virtuosity measure. Additionally, participants in the binary goodness condition, selected “Monica” as their response for the “more good” measure. If a participant failed to select either of these responses, they would be excluded from the analyses.

S2_bin <- Study_2 %>% 
  filter(AttnBinQ == "Monica") %>% 
  select(-c(AttnContV, s4_V1Theft, s4_V1Cheat, s4_V1Drugs, s4_V1Sex,
            s4_V1Sexualizing, s4_V1Health, s4_V1Blame, s4_V1Revenge,
            s4_V1Workethic, s4_V1Criticism))

S2_cont <- Study_2 %>% 
  filter(AttnContV == "0\n") %>% 
  select(-c(AttnBinQ, s4_sbTheft, s4_sbCheat, s4_sbDrugs, s4_sbSex,
            s4_sbSexualization, s4_sbHealth, s4_sbBlame, s4_sbRevenge,
            s4_sbWorkethic, s4_sbCriticism))

Variable Creation

Here, we create the relevant variables necessary to begin analyses for both the binary goodness measure and the continuous virtuosity measure.

# Create a variable per scenario that indicates if each participant chose the hypothesized agent (i.e., 1), or not (i.e., 0)
S2_bin <- S2_bin %>%  
  mutate(theft_hyp = if_else(s4_sbTheft == "Kenna", 1, 0)) %>% 
  mutate(drugs_hyp = if_else(s4_sbDrugs == "Carl", 1, 0)) %>% 
  mutate(cheat_hyp = if_else(s4_sbCheat == "James", 1, 0)) %>% 
  mutate(sex_hyp = if_else(s4_sbSex == "Camila", 1, 0)) %>% 
  mutate(sexualize_hyp = if_else(s4_sbSexualization == "Robert", 1, 0)) %>% 
  mutate(revenge_hyp = if_else(s4_sbRevenge == "Clara", 1, 0)) %>% 
  mutate(workethic_hyp = if_else(s4_sbWorkethic == "Vivian", 1, 0)) %>% 
  mutate(blame_hyp = if_else(s4_sbBlame == "Eric", 1, 0)) %>% 
  mutate(criticism_hyp = if_else(s4_sbCriticism == "Shawn", 1, 0)) %>% 
  mutate(health_hyp = if_else(s4_sbHealth == "Summer", 1, 0))

# Create a variable that averages the binary choice values within participants where the hypothesized non-tempted agent has a value of 1 and the tempted agent has a value of 0
S2_bin$BinaryAverage <- rowMeans(S2_bin[, (c("theft_hyp", "drugs_hyp", "cheat_hyp", "sex_hyp", "sexualize_hyp","revenge_hyp","workethic_hyp", "blame_hyp", "criticism_hyp","health_hyp"))], na.rm = T)

# Create a variable per scenario that indicates if each participant chose the hypothesized agent or not
S2_cont <- S2_cont %>%
  mutate_at(vars(s4_V1Theft, s4_V1Drugs, s4_V1Cheat, s4_V1Sex, s4_V1Sexualizing,                                                                   s4_V1Revenge, s4_V1Workethic, s4_V1Blame, s4_V1Criticism, s4_V1Health), as.numeric)

S2_cont <- S2_cont %>%  
  mutate(theft_hyp = if_else(s4_V1Theft > 0, 1, 0)) %>%
  mutate(drugs_hyp = if_else(s4_V1Drugs > 0, 1, 0)) %>%
  mutate(cheat_hyp = if_else(s4_V1Cheat > 0, 1, 0)) %>%
  mutate(sex_hyp = if_else(s4_V1Sex > 0, 1, 0)) %>%
  mutate(sexualize_hyp = if_else(s4_V1Sexualizing > 0, 1, 0)) %>%
  mutate(revenge_hyp = if_else(s4_V1Revenge > 0, 1, 0)) %>%
  mutate(workethic_hyp = if_else(s4_V1Workethic > 0, 1, 0)) %>%
  mutate(blame_hyp = if_else(s4_V1Blame > 0, 1, 0)) %>%
  mutate(criticism_hyp = if_else(s4_V1Criticism > 0, 1, 0)) %>%
  mutate(health_hyp = if_else(s4_V1Health > 0, 1, 0))

# Create a variable per scenario that indicates if each participant chose the non-hypothesized agent
## this would rule out that any one vignette that does not have a predicted majority pattern is due to an opposite majority pattern
## for instance, it could be the case that a non-majority shows the predicted pattern but that the modal or second-modal pattern is judging both agents as equally virtuous (and not the tempted agent as more virtuous)
S2_cont <- S2_cont %>%  
  mutate(theft_opp = if_else(s4_V1Theft < 0, 1, 0)) %>%
  mutate(drugs_opp = if_else(s4_V1Drugs < 0, 1, 0)) %>%
  mutate(cheat_opp = if_else(s4_V1Cheat < 0, 1, 0)) %>%
  mutate(sex_opp = if_else(s4_V1Sex < 0, 1, 0)) %>%
  mutate(sexualize_opp = if_else(s4_V1Sexualizing < 0, 1, 0)) %>%
  mutate(revenge_opp = if_else(s4_V1Revenge < 0, 1, 0)) %>%
  mutate(workethic_opp = if_else(s4_V1Workethic < 0, 1, 0)) %>%
  mutate(blame_opp = if_else(s4_V1Blame < 0, 1, 0)) %>%
  mutate(criticism_opp = if_else(s4_V1Criticism < 0, 1, 0)) %>%
  mutate(health_opp = if_else(s4_V1Health < 0, 1, 0))


# Create a variable that averages the continuous values within participants where positive numbers indicate choosing of non-tempted agent
S2_cont$ContinuousAverage <- rowMeans(S2_cont[, (c("s4_V1Theft", "s4_V1Drugs", "s4_V1Cheat", "s4_V1Sex", "s4_V1Sexualizing",                                                    "s4_V1Revenge", "s4_V1Workethic", "s4_V1Blame", "s4_V1Criticism", "s4_V1Health"))],
                                      na.rm = T)

Group-Lvl Analyses

For all t-tests, we conduct both one-tailed and two-tailed tests. Our pre-registration specified directional hypotheses which therefore ought to be analyzed with one-tailed tests. However, in order for readers to know any estimate’s uncertainty in both directions, we also conduct two-tailed tests to get relevant CIs.

Binary Goodness

# t-test using person-level averages across binary measure
S2_bin_t <- t.test(S2_bin$BinaryAverage, mu = 0.5, alternative = "greater") # mu = 0.5 because of binary nature of DV
## 'greater' is for one-tailed p-value because of the non-tempted > tempted hypothesis (numbers > 0.5 mean non-tempted > tempted was chosen more often)
print(S2_bin_t)

    One Sample t-test

data:  S2_bin$BinaryAverage
t = 10.465, df = 176, p-value < 0.00000000000000022
alternative hypothesis: true mean is greater than 0.5
95 percent confidence interval:
 0.6869496       Inf
sample estimates:
mean of x 
0.7220339 
S2_bin_t_2side <- t.test(S2_bin$BinaryAverage, mu = 0.5, alternative = "two.sided") 
## 'two.sided' is to get uncertainty estimates in both directions
print(S2_bin_t_2side)

    One Sample t-test

data:  S2_bin$BinaryAverage
t = 10.465, df = 176, p-value < 0.00000000000000022
alternative hypothesis: true mean is not equal to 0.5
95 percent confidence interval:
 0.6801604 0.7639073
sample estimates:
mean of x 
0.7220339 
# returns cohen's d
effsize::cohen.d(S2_bin$BinaryAverage,
                 f = NA,
                 mu = 0.5,
                 data = data)

Cohen's d (single sample)

d estimate: 0.7865722 (medium)
Reference mu: 0.5
95 percent confidence interval:
    lower     upper 
0.4786338 1.0945106 

Continuous Virtuosity

# t-test using person-level averages across binary measure
S2_cont_t <- t.test(S2_cont$ContinuousAverage, mu = 0, alternative = "greater") # mu = 0 because of continuous nature of DV
## 'greater' is for one-tailed p-value because of the non-tempted > tempted hypothesis (pos numbers mean non-tempted > tempted)
print(S2_cont_t)

    One Sample t-test

data:  S2_cont$ContinuousAverage
t = 9.9387, df = 172, p-value < 0.00000000000000022
alternative hypothesis: true mean is greater than 0
95 percent confidence interval:
 0.7656622       Inf
sample estimates:
mean of x 
0.9184971 
S2_cont_t_2side <- t.test(S2_cont$ContinuousAverage, mu = 0, alternative = "two.sided") 
## 'two.sided' is to get uncertainty estimates in both directions
print(S2_cont_t_2side)

    One Sample t-test

data:  S2_cont$ContinuousAverage
t = 9.9387, df = 172, p-value < 0.00000000000000022
alternative hypothesis: true mean is not equal to 0
95 percent confidence interval:
 0.7360804 1.1009138
sample estimates:
mean of x 
0.9184971 
# returns cohen's d
effsize::cohen.d(S2_cont$ContinuousAverage,
                 f = NA,
                 mu = 0,
                 data = data)

Cohen's d (single sample)

d estimate: 0.7556224 (medium)
Reference mu: 0
95 percent confidence interval:
   lower    upper 
0.444958 1.066287 

Person-Lvl Analyses

# create variables for whether hypothesis fit for each participant
S2_bin <- S2_bin %>%
  mutate(fits_hypothesis = if_else(BinaryAverage > 0.50, 1, 0))

S2_cont <- S2_cont %>%
  mutate(fits_hypothesis = if_else(ContinuousAverage > 0, 1, 0))

Descriptive Pervasiveness

Binary Goodness

# How many participants fit hypothesis for binary measure
table(S2_bin$fits_hypothesis) # 0 = no, 1 = yes

  0   1 
 49 128 

Continuous Virtuosity

# How many participants fit hypothesis for continuous
table(S2_cont$fits_hypothesis) # 0 = no, 1 = yes

  0   1 
 43 130 

Frequentist Prevalence

# CREATE NECESSARY FREQUENTIST FUNCTION (code adapted from Donhauser et al.'s (2018) MATLAB code)

prevalence_test <- function(observed, alpha_ind=0.05, beta_ind=1, alpha_group=0.05, gamma_0=0.5) {
  
  # Inputs:
  # observed    = vector of p-values OR vector with two values, e.g., 'c(positive cases, total cases)'
  # alpha_ind   = alpha threshold for person-level tests, if 'observed' = vector of p-values (typically set to .05)
  # beta_ind    = sensitivity of person-level tests (probably set to 1.00)
  # alpha_group = see "outputs"
  # gamma_0     = null gamma value for empirical prevalence to be tested against (defaults to majority null)
  
  # Outputs:
  # p_null      = p-value for majority null or whatever null you specify in the gamma_0 argument (e.g., to specify a global null set "gamma_0 = 0") 
  # gamma_0     = highest gamma_0 value that can be rejected at threshold of 'alpha_group' given positive cases. Note this output is not the same as the input argument
  if(sum(observed > 1) == 0) {
    pvals <- observed
  } else {
    pvals <- c(rep(0, observed[1]), rep(1, observed[2]-observed[1]))
  }
  
  n <- length(pvals)
  k_obs <- sum(pvals < alpha_ind)
  kvals <- 0:n
  dgamma <- 0.001
  gammavals <- seq(0, 1, dgamma)
  
  p_k_gamma <- matrix(0, nrow=length(gammavals), ncol=length(kvals))
  p_kk_gamma <- matrix(0, nrow=length(gammavals), ncol=length(kvals))
  
  for(iGam in 1:length(gammavals)) {
    p_pos <- gammavals[iGam] * beta_ind + (1 - gammavals[iGam]) * alpha_ind
    p_neg <- gammavals[iGam] * (1 - beta_ind) + (1 - gammavals[iGam]) * (1 - alpha_ind)
    for(iK in 1:length(kvals)) {
      k <- kvals[iK]
      tmp <- choose(n, k) * p_pos^k * p_neg^(n - k)
      p_k_gamma[iGam, iK] <- tmp
      p_kk_gamma[iGam, iK] <- 1 - sum(p_k_gamma[iGam, 1:iK]) + tmp
    }
  }
  
  iK <- which(kvals == k_obs)
  p_null <- p_kk_gamma[which(gammavals == gamma_0), iK]
  
  index <- sum(p_kk_gamma[, iK] < alpha_group)
  if(index != 0) {
    gamma_0 <- gammavals[index]
  } else {
    gamma_0 <- 0
  }
  
  return(list(p_null=p_null, gamma_0=gamma_0, p_kk_gamma=p_kk_gamma, gammavals=gammavals, p_k_gamma=p_k_gamma))
}

Binary Goodness


k <- 128  # number of persons matching hypothesized / group-level pattern
n <- 128+49 # total N
binary_freqPrevalence <- prevalence_test(c(k, n)) # specify positive cases out of total cases for prev test function
binary_freqPrevalence$p_null # print p-value testing against majority null
[1] 0.00000005534935

Continuous Virtuosity


k <- 130  # number of persons matching hypothesized / group-level pattern
n <- 130+43 # total N
cont_freqPrevalence <- prevalence_test(c(k, n)) # specify positive cases out of total cases for prev test function
cont_freqPrevalence$p_null # print p-value testing against majority null
[1] 0.0000000007686286

Bayesian Prevalence

# CREATE NECESSARY BAYES FUNCTIONS (code from Ince et al., 2021)
library(nleqslv)

bayesprev_map <- function(k, n, a=0.05, b=1) {
  # Bayesian maximum a posteriori estimate of population prevalence gamma
  # under a uniform prior
  # 
  # Args:
  #  k: number of participants/tests significant out of 
  #  n: total number of participants/tests
  #  a: alpha value of within-participant test (default=0.05)
  #  b: sensitivity/beta of within-participant test (default=1)
  
  gm <- (k/n -a)/(b-a)
  if(gm <0) gm <- 0
  if(gm>1) gm <- 1
  return(gm)
} 

bayesprev_posterior <- function(x, k, n, a=0.05, b=1) {
  # Bayesian posterior of population prevalence gamma under a uniform prior
  #
  # Args:
  # x : values of gamma at which to evaluate the posterior density
  # k : number of participants significant out of 
  # n : total number of participants
  # a : alpha value of within-participant test (default=0.05)
  # b : sensitivity/beta of within-participant test (default=1)
  
  m1 <-  k + 1
  m2 <- n - k + 1
  theta <- a + (b-a)*x
  post <- (b -a)*dbeta(theta,m1, m2)
  post <- post/(pbeta(b, m1, m2) - pbeta(a, m1, m2))
  return(post)
}


bayesprev_bound <- function(p, k, n, a=0.05, b=1) {
  # Bayesian lower bound of population prevalence gamma under a uniform prior
  #
  # Args:
  #  p : density the lower bound should bound (e.g. 0.95)
  #  k : number of participants significant out of 
  #  n : total number of participants
  #  a : alpha value of within-participant test (default=0.05)
  #  b : sensitivity/beta of within-participant test (default=1)
  
  m1 <-  k + 1
  m2 <- n - k + 1
  th_c <- qbeta( p*pbeta(a, m1, m2) + (1-p)*pbeta(b, m1, m2), m1, m2 )
  g_c <- (th_c -a)/(b-a)
  return(g_c)
}


bayesprev_hpdi <- function(p, k, n, a=0.05, b=1) {
  # Bayesian highest posterior density interval of population prevalence gamma
  # under a uniform prior
  #
  # Args:
  #  p : HPDI to return (e.g. 0.95 for 95%)
  #  k : number of participants significant out of 
  #  n : total number of participants
  #  a : alpha value of within-participant test (default=0.05)
  #  b : sensitivity/beta of within-participant test (default=1)
  
  m1 <- k+1
  m2 <- n-k+1
  
  if(m1 ==1) {
    endpts <- c(a, qbeta( (1 -p)*pbeta(a, m1, m2) + p*pbeta(b, m1, m2), m1, m2 ) ) 
    return((endpts -a)/(b-a))
  }
  
  if(m2 ==1) {
    endpts <- c( qbeta( p*pbeta(a, m1, m2) + (1- p)* pbeta(b, m1, m2), m1, m2 ) , b) 
    return( (endpts-a)/(b-a))
  }
  
  if(k<= n*a) {
    endpts <- c(a, qbeta( (1 -p)*pbeta(a, m1, m2) + p*pbeta(b, m1, m2), m1, m2 ) ) 
    return((endpts -a)/(b-a))
  }
  
  if(k>= n*b) {
    endpts <- c( qbeta( p*pbeta(a, m1, m2) + (1- p)* pbeta(b, m1, m2), m1, m2 ) , b) 
    return( (endpts-a)/(b-a))
  }
  
  
  g <- function(x, m1, m2, a, b, p ) {
    y <- numeric(2)
    y[1] <-  pbeta(x[2], m1, m2) - pbeta(x[1], m1, m2) - p*(pbeta(b, m1, m2) - pbeta(a, m1, m2))
    y[2] <- log(dbeta(x[2], m1, m2)) - log(dbeta(x[1], m1, m2))
    return(y)
  }
  
  x_init <- numeric(2)
  
  p1 <- (1-p)/2 
  p2 <- (1 +p)/2
  
  x_init[1] <- qbeta( (1 -p1)*pbeta(a, m1, m2) + p1* pbeta(b, m1, m2), m1, m2 )
  x_init[2] <- qbeta( (1 -p2)*pbeta(a, m1, m2) + p2* pbeta(b, m1, m2), m1, m2 )
  
  opt <- nleqslv(x_init, g, method ="Newton", control=list(maxit=1000), m1=m1, m2=m2, a=a, b=b, p=p)
  
  if (opt$termcd ==1)  print("convergence achieved") 
  if (opt$termcd != 1)  print("failed to converge") 
  
  temp <- opt$x
  if (temp[1] <a) {
    temp[1] <- a
    temp[2] <- qbeta( (1 -p)*pbeta(a, m1, m2) + p* pbeta(b, m1, m2), m1, m2 )
  }
  if (temp[2] > b) {
    temp[1] <- qbeta( p*pbeta(a, m1, m2) + (1-p)* pbeta(b, m1, m2), m1, m2 )
    temp[2] <- b
  }
  endpts <- (temp -a)/(b-a)
  return(endpts) 
}


bayesprev_posteriorprob <- function(x, k, n, a=0.05, b=1) {
  # Bayesian posterior probability in favour of the population prevalence gamma being greater than x
  #
  # Args:
  # x : values of gamma at which to evaluate the posterior probability
  # k : number of participants significant out of 
  # n : total number of participants
  # a : alpha value of within-participant test (default=0.05)
  # b : sensitivity/beta of within-participant test (default=1)
  
  theta <- a + (b-a)*x
  m1 <-  k + 1
  m2 <- n - k + 1
  p <- (pbeta(b,m1,m2)-pbeta(theta,m1,m2)) / (pbeta(b,m1,m2)-pbeta(a,m1,m2))
  return(p)
  
}

bayesprev_posteriorlogodds <- function(x, k, n, a=0.05, b=1) {
  # Bayesian posterior log-odds in favour of the population prevalence gamma being greater than x
  #
  # Args:
  # x : log-odds threshold
  # k : number of participants significant out of 
  # n : total number of participants
  # a : alpha value of within-participant test (default=0.05)
  # b : sensitivity/beta of within-participant test (default=1)
  
  theta <- a + (b-a)*x
  m1 <-  k + 1
  m2 <- n - k + 1
  p <- (pbeta(b,m1,m2)-pbeta(theta,m1,m2)) / (pbeta(b,m1,m2)-pbeta(a,m1,m2))
  lo<- log(p / (1 - p))
  return(lo)
  
}

Binary Goodness


k <- 128  # number of persons matching hypothesized / group-level pattern
n <- 128+49 # total N
x <- 0.50 # minority cut-off of population prevalence gamma for Bayesian posterior probability
x_0 <- 0.00 # global null of population prevalence gamma for Bayesian posterior probability
map = bayesprev_map(k, n) # get maximum a posteriori (MAP) estimate (i.e., the likeliest person-level prevalence population value)
int = bayesprev_hpdi(0.96, k, n) # get 96% HPDIs
[1] "convergence achieved"
i1 = int[1] # get lower 96% HPDI
i2 = int[2] # get upper 96% HPDI
print(c(i1, map ,i2)) # print lower 96 HPDI, map estimate, and upper 96 HPDI
[1] 0.6328624 0.7085935 0.7769709
bayesprev_posteriorprob(x, k, n) # Bayesian posterior probability in favor of population prevalence being greater than x
[1] 1
bayesprev_posteriorprob(x_0, k, n) # Bayesian posterior probability in favor of population prevalence being greater than x_0
[1] 1

Continuous Virtuosity


k <- 130  # number of persons matching hypothesized / group-level pattern
n <- 130+43 # total N
x <- 0.50 # minority cut-off of population prevalence gamma for Bayesian posterior probability
x_0 <- 0.00 # global null of population prevalence gamma for Bayesian posterior probability
map = bayesprev_map(k, n) # get maximum a posteriori (MAP) estimate (i.e., the likeliest person-level prevalence population value)
int = bayesprev_hpdi(0.96, k, n) # get 96% HPDIs
[1] "convergence achieved"
i1 = int[1] # get lower 96% HPDI
i2 = int[2] # get upper 96% HPDI
print(c(i1, map ,i2)) # print lower 96 HPDI, map estimate, and upper 96 HPDI
[1] 0.6637135 0.7383632 0.8045365
bayesprev_posteriorprob(x, k, n) # Bayesian posterior probability in favor of population prevalence being greater than x
[1] 1
bayesprev_posteriorprob(x_0, k, n) # Bayesian posterior probability in favor of population prevalence being greater than x_0
[1] 1

Primary Plots

# re-organize data to plot vignette-by-vignette variability

## binary
S2_vignettes_bin <- S2_bin %>% 
  select(c(ResponseId, 
           theft_hyp, drugs_hyp, cheat_hyp, sex_hyp, sexualize_hyp, blame_hyp, workethic_hyp, revenge_hyp,
           criticism_hyp, health_hyp)) %>% 
  group_by(ResponseId) %>%
  pivot_longer(cols = (c(theft_hyp, drugs_hyp, cheat_hyp, sex_hyp, sexualize_hyp, blame_hyp, workethic_hyp, revenge_hyp,
                         criticism_hyp, health_hyp)),
               names_to = "vignette_name",
               values_to = "fits_hypothesis")

S2_vignettes_bin <- S2_vignettes_bin %>% 
  mutate(fits_hyp = recode(fits_hypothesis, "1" = "Yes", "0" = "No"))
  
bin_labs <- c("Blame", "Cheating", "Criticism", "Drugs", "Health", "Revenge", "Sex", "Sexualization", "Theft", 
              "Work Ethic")
names(bin_labs) <- c("blame_hyp","cheat_hyp", "criticism_hyp", "drugs_hyp", "health_hyp", "revenge_hyp", "sex_hyp",
                      "sexualize_hyp", "theft_hyp", "workethic_hyp")

# continuous
S2_vignettes_cont <- S2_cont %>% 
  select(c(ResponseId, 
           theft_hyp, drugs_hyp, cheat_hyp, sex_hyp, sexualize_hyp, blame_hyp, workethic_hyp, revenge_hyp,
           criticism_hyp, health_hyp,
           theft_opp, drugs_opp, cheat_opp, sex_opp, sexualize_opp, blame_opp, workethic_opp, revenge_opp,
           criticism_opp, health_opp)) %>%
  mutate(theft = case_when(
    theft_hyp == 1 ~ "Yes",
    theft_opp == 1 ~ "No - Opposite",
    (theft_hyp == 0 & theft_opp == 0) ~ "No - Equal")) %>%
  mutate(drugs = case_when(
    drugs_hyp == 1 ~ "Yes",
    drugs_opp == 1 ~ "No - Opposite",
    (drugs_hyp == 0 & drugs_opp == 0) ~ "No - Equal")) %>%
  mutate(cheat = case_when(
    cheat_hyp == 1 ~ "Yes",
    cheat_opp == 1 ~ "No - Opposite",
    (cheat_hyp == 0 & cheat_opp == 0) ~ "No - Equal")) %>%
  mutate(sex = case_when(
    sex_hyp == 1 ~ "Yes",
    sex_opp == 1 ~ "No - Opposite",
    (sex_hyp == 0 & sex_opp == 0) ~ "No - Equal")) %>%
  mutate(sexualize = case_when(
    sexualize_hyp == 1 ~ "Yes",
    sexualize_opp == 1 ~ "No - Opposite",
    (sexualize_hyp == 0 & sexualize_opp == 0) ~ "No - Equal")) %>%
  mutate(blame = case_when(
    blame_hyp == 1 ~ "Yes",
    blame_opp == 1 ~ "No - Opposite",
    (blame_hyp == 0 & blame_opp == 0) ~ "No - Equal")) %>%
  mutate(workethic = case_when(
    workethic_hyp == 1 ~ "Yes",
    workethic_opp == 1 ~ "No - Opposite",
    (workethic_hyp == 0 & workethic_opp == 0) ~ "No - Equal")) %>%
  mutate(revenge = case_when(
    revenge_hyp == 1 ~ "Yes",
    revenge_opp == 1 ~ "No - Opposite",
    (revenge_hyp == 0 & revenge_opp == 0) ~ "No - Equal")) %>%
  mutate(criticism = case_when(
    criticism_hyp == 1 ~ "Yes",
    criticism_opp == 1 ~ "No - Opposite",
    (criticism_hyp == 0 & criticism_opp == 0) ~ "No - Equal")) %>%
  mutate(health = case_when(
    health_hyp == 1 ~ "Yes",
    health_opp == 1 ~ "No - Opposite",
    (health_hyp == 0 & health_opp == 0) ~ "No - Equal")) %>%
  group_by(ResponseId) %>%
  pivot_longer(cols = (c(theft, drugs, cheat, sex, sexualize, blame, workethic, revenge,
                         criticism, health)),
               names_to = "vignette_name",
               values_to = "fits_hyp")

cont_labs <- c("Blame", "Cheating", "Criticism", "Drugs", "Health", "Revenge", "Sex", "Sexualization", "Theft", 
              "Work Ethic")
names(cont_labs) <- c("blame","cheat", "criticism", "drugs", "health", "revenge", "sex",
                      "sexualize", "theft", "workethic")

Binary Goodness

print(S2_bin_vigplot <- ggplot(S2_vignettes_bin, 
                               aes(x = as.character(fits_hyp), 
                                  fill = as.character(fits_hyp))) +
  geom_bar() +
  scale_fill_manual(values = c("#8b1616", "#CEA335"), name = "Fits Hypothesis")+
  scale_y_continuous(limits = c(-0.1,200.1), breaks = c(0, 25, 50, 75, 100, 125, 150, 175, 200)) +
  ylab("Number of Participants\n") +
  theme_classic() +
  facet_wrap(~ vignette_name, ncol = 5, labeller = labeller(vignette_name = bin_labs)) +
  theme(axis.title.x = element_blank(), 
              axis.title.y = element_text(size = 18),
              axis.text.x = element_blank(), 
              axis.text.y = element_text(color = "black", size = 16),
              strip.text.x = element_text(color = "black", size = 16),
              legend.position = "right",
              legend.title = element_text(color = "black", size = 18),
              legend.text = element_text(color = "black", size = 16)))


ggsave("S2_bin_vigplot.png")
Saving 14.1 x 9.04 in image

Continuous Virtuosity

print(S2_cont_vigplot <- ggplot(S2_vignettes_cont, 
                               aes(x = as.character(fits_hyp), 
                                  fill = as.character(fits_hyp))) +
  geom_bar() +
  scale_fill_manual(values = c("grey30","#8b1616", "#CEA335"), name = "Fits Hypothesis")+
  scale_y_continuous(limits = c(-0.1,150.1), breaks = c(0, 25, 50, 75, 100, 125, 150)) +
  ylab("Number of Participants\n") +
  theme_classic() +
  facet_wrap(~ vignette_name, ncol = 5, labeller = labeller(vignette_name = cont_labs)) +
  theme(axis.title.x = element_blank(), 
              axis.title.y = element_text(size = 18),
              axis.text.x = element_blank(), 
              axis.text.y = element_text(color = "black", size = 16),
              strip.text.x = element_text(color = "black", size = 16),
              legend.position = "right",
              legend.title = element_text(color = "black", size = 18),
              legend.text = element_text(color = "black", size = 16)))


ggsave("S2_cont_vigplot.png")
Saving 14.1 x 9.04 in image

Robustness Plots

Here, we investigate the number of participants matching predicted effects by demographics in order to catalog the generality (or lack thereof) of these effects across levels of various the demographics that we collected.

# create yes/no variable for simple hypotheses
S2_bin <- S2_bin %>%
  mutate(fits_hyp = if_else(fits_hypothesis == 1, "Yes", "No"))

# create yes/no variable for simple hypotheses
S2_cont <- S2_cont %>%
  mutate(fits_hyp = if_else(fits_hypothesis == 1, "Yes", "No"))

Education

Binary Goodness

print(S2_bin_educ <- ggplot(S2_bin, aes(x = fits_hyp)) +
  geom_bar(fill = "grey30") +
  xlab("\nMatched Predicted Pattern") +
  ylab("Number of Participants\n") +
  theme_classic() +
  facet_wrap(~Education) +
  theme(axis.title.x = element_text(size = 18), 
              axis.title.y = element_text(size = 18),
              axis.text.x = element_text(color = "black", size = 16), 
              axis.text.y = element_text(color = "black", size = 16),
              strip.text.x = element_text(color = "black", size = 12),
              legend.position = "right",
              legend.title = element_text(color = "black", size = 18),
              legend.text = element_text(color = "black", size = 16)))

Continuous Virtuosity

print(S2_cont_educ <- ggplot(S2_cont, aes(x = fits_hyp)) +
  geom_bar(fill = "grey30") +
  xlab("\nMatched Predicted Pattern") +
  ylab("Number of Participants\n") +
  theme_classic() +
  facet_wrap(~Education) +
  theme(axis.title.x = element_text(size = 18), 
              axis.title.y = element_text(size = 18),
              axis.text.x = element_text(color = "black", size = 16), 
              axis.text.y = element_text(color = "black", size = 16),
              strip.text.x = element_text(color = "black", size = 12),
              legend.position = "right",
              legend.title = element_text(color = "black", size = 18),
              legend.text = element_text(color = "black", size = 16)))

Political Party

Binary Goodness

print(S2_bin_pol <- ggplot(S2_bin, aes(x = fits_hyp)) +
  geom_bar(fill = "grey30") +
  xlab("\nMatched Predicted Pattern") +
  ylab("Number of Participants\n") +
  theme_classic() +
  facet_wrap(~PoliticalParty) +
  theme(axis.title.x = element_text(size = 18), 
              axis.title.y = element_text(size = 18),
              axis.text.x = element_text(color = "black", size = 16), 
              axis.text.y = element_text(color = "black", size = 16),
              strip.text.x = element_text(color = "black", size = 12),
              legend.position = "right",
              legend.title = element_text(color = "black", size = 18),
              legend.text = element_text(color = "black", size = 16)))

Continuous Virtuosity

print(S2_cont_pol <- ggplot(S2_cont, aes(x = fits_hyp)) +
  geom_bar(fill = "grey30") +
  xlab("\nMatched Predicted Pattern") +
  ylab("Number of Participants\n") +
  theme_classic() +
  facet_wrap(~PoliticalParty) +
  theme(axis.title.x = element_text(size = 18), 
              axis.title.y = element_text(size = 18),
              axis.text.x = element_text(color = "black", size = 16), 
              axis.text.y = element_text(color = "black", size = 16),
              strip.text.x = element_text(color = "black", size = 12),
              legend.position = "right",
              legend.title = element_text(color = "black", size = 18),
              legend.text = element_text(color = "black", size = 16)))

Religiosity

Binary Goodness

print(S2_bin_relig <- ggplot(S2_bin, aes(x = fits_hyp)) +
  geom_bar(fill = "grey30") +
  xlab("\nMatched Predicted Pattern") +
  ylab("Number of Participants\n") +
  theme_classic() +
  facet_wrap(~Religious) +
  theme(axis.title.x = element_text(size = 18), 
              axis.title.y = element_text(size = 18),
              axis.text.x = element_text(color = "black", size = 16), 
              axis.text.y = element_text(color = "black", size = 16),
              strip.text.x = element_text(color = "black", size = 12),
              legend.position = "right",
              legend.title = element_text(color = "black", size = 18),
              legend.text = element_text(color = "black", size = 16)))

Continuous Virtuosity

print(S2_cont_relig <- ggplot(S2_cont, aes(x = fits_hyp)) +
  geom_bar(fill = "grey30") +
  xlab("\nMatched Predicted Pattern") +
  ylab("Number of Participants\n") +
  theme_classic() +
  facet_wrap(~Religious) +
  theme(axis.title.x = element_text(size = 18), 
              axis.title.y = element_text(size = 18),
              axis.text.x = element_text(color = "black", size = 16), 
              axis.text.y = element_text(color = "black", size = 16),
              strip.text.x = element_text(color = "black", size = 12),
              legend.position = "right",
              legend.title = element_text(color = "black", size = 18),
              legend.text = element_text(color = "black", size = 16)))

Urban vs Rural

Binary Goodness

print(S2_bin_urb <- ggplot(S2_bin, aes(x = fits_hyp)) +
  geom_bar(fill = "grey30") +
  xlab("\nMatched Predicted Pattern") +
  ylab("Number of Participants\n") +
  theme_classic() +
  facet_wrap(~LivingArea) +
  theme(axis.title.x = element_text(size = 18), 
              axis.title.y = element_text(size = 18),
              axis.text.x = element_text(color = "black", size = 16), 
              axis.text.y = element_text(color = "black", size = 16),
              strip.text.x = element_text(color = "black", size = 12),
              legend.position = "right",
              legend.title = element_text(color = "black", size = 18),
              legend.text = element_text(color = "black", size = 16)))

Continuous Virtuosity

print(S2_cont_urban <- ggplot(S2_cont, aes(x = fits_hyp)) +
  geom_bar(fill = "grey30") +
  xlab("\nMatched Predicted Pattern") +
  ylab("Number of Participants\n") +
  theme_classic() +
  facet_wrap(~LivingArea) +
  theme(axis.title.x = element_text(size = 18), 
              axis.title.y = element_text(size = 18),
              axis.text.x = element_text(color = "black", size = 16), 
              axis.text.y = element_text(color = "black", size = 16),
              strip.text.x = element_text(color = "black", size = 12),
              legend.position = "right",
              legend.title = element_text(color = "black", size = 18),
              legend.text = element_text(color = "black", size = 16)))

Gender

Binary Goodness

print(S2_bin_gender <- ggplot(S2_bin, aes(x = fits_hyp)) +
  geom_bar(fill = "grey30") +
  xlab("\nMatched Predicted Pattern") +
  ylab("Number of Participants\n") +
  theme_classic() +
  facet_wrap(~Gender) +
  theme(axis.title.x = element_text(size = 18), 
              axis.title.y = element_text(size = 18),
              axis.text.x = element_text(color = "black", size = 16), 
              axis.text.y = element_text(color = "black", size = 16),
              strip.text.x = element_text(color = "black", size = 12),
              legend.position = "right",
              legend.title = element_text(color = "black", size = 18),
              legend.text = element_text(color = "black", size = 16)))

Continuous Virtuosity

print(S2_cont_gender <- ggplot(S2_cont, aes(x = fits_hyp)) +
  geom_bar(fill = "grey30") +
  xlab("\nMatched Predicted Pattern") +
  ylab("Number of Participants\n") +
  theme_classic() +
  facet_wrap(~Gender) +
  theme(axis.title.x = element_text(size = 18), 
              axis.title.y = element_text(size = 18),
              axis.text.x = element_text(color = "black", size = 16), 
              axis.text.y = element_text(color = "black", size = 16),
              strip.text.x = element_text(color = "black", size = 12),
              legend.position = "right",
              legend.title = element_text(color = "black", size = 18),
              legend.text = element_text(color = "black", size = 16)))

Race

# make race one variable
S2_bin <- S2_bin %>%
  mutate(Race = coalesce(RaceEthnicity_1, RaceEthnicity_2, RaceEthnicity_3, RaceEthnicity_4, 
                         RaceEthnicity_5, RaceEthnicity_6, RaceEthnicity_7, RaceEthnicity_8))

S2_cont <- S2_cont %>%
  mutate(Race = coalesce(RaceEthnicity_1, RaceEthnicity_2, RaceEthnicity_3, RaceEthnicity_4, 
                         RaceEthnicity_5, RaceEthnicity_6, RaceEthnicity_7, RaceEthnicity_8))

Binary Goodness

print(S2_bin_race <- ggplot(S2_bin, aes(x = fits_hyp)) +
  geom_bar(fill = "grey30") +
  xlab("\nMatched Predicted Pattern") +
  ylab("Number of Participants\n") +
  theme_classic() +
  facet_wrap(~Race) +
  theme(axis.title.x = element_text(size = 18), 
              axis.title.y = element_text(size = 18),
              axis.text.x = element_text(color = "black", size = 16), 
              axis.text.y = element_text(color = "black", size = 16),
              strip.text.x = element_text(color = "black", size = 12),
              legend.position = "right",
              legend.title = element_text(color = "black", size = 18),
              legend.text = element_text(color = "black", size = 16)))

Continuous Virtuosity

print(S2_cont_race <- ggplot(S2_cont, aes(x = fits_hyp)) +
  geom_bar(fill = "grey30") +
  xlab("\nMatched Predicted Pattern") +
  ylab("Number of Participants\n") +
  theme_classic() +
  facet_wrap(~Race) +
  theme(axis.title.x = element_text(size = 18), 
              axis.title.y = element_text(size = 18),
              axis.text.x = element_text(color = "black", size = 16), 
              axis.text.y = element_text(color = "black", size = 16),
              strip.text.x = element_text(color = "black", size = 12),
              legend.position = "right",
              legend.title = element_text(color = "black", size = 18),
              legend.text = element_text(color = "black", size = 16)))

LS0tDQp0aXRsZTogIlN0dWR5IDI6IEV4dGVuc2lvbiB3LyBQYXJ0aWNpcGFudC1HZW5lcmF0ZWQgU3RpbXVsaSAmIEJTL1NCIE1lYXN1cmVzIg0KYXV0aG9yOiAiSGVsZW4gUGFkaWxsYSBGb25nICYgUnlhbiBNLiBNY01hbnVzIg0KZGF0ZTogJ2ByIGZvcm1hdChTeXMudGltZSgpLCAiJUIgJWQsICVZIilgJw0Kb3V0cHV0OiANCiAgaHRtbF9ub3RlYm9vazoNCiAgICBjb2RlX2ZvbGRpbmc6IGhpZGUNCiAgICBoaWdobGlnaHQ6IHRhbmdvDQogICAgdGhlbWU6IGRhcmtseQ0KICAgIHRvYzogeWVzDQogICAgdG9jX2RlcHRoOiA1DQogICAgdG9jX2Zsb2F0OiB5ZXMNCi0tLQ0KDQojIERhdGEgUHJlcGFyYXRpb24gey50YWJzZXR9DQoNCkluIHRoaXMgcHJlLXJlZ2lzdGVyZWQgc3R1ZHksIHdlIGNvbGxlY3RlZCBkYXRhIGZyb20gMzYxIHBhcnRpY2lwYW50cy4gQWZ0ZXIgZmlsdGVyaW5nIHRoZXNlIHBhcnRpY2lwYW50cyB3aXRoIGFuIGF0dGVudGlvbiBjaGVjayBtZWFzdXJlLCB3ZSBvYnRhaW5lZCBhbmFseXphYmxlIGRhdGEgZnJvbSAzNTAgcGFydGljaXBhbnRzLg0KDQojIyBMb2FkaW5nIERhdGEvUGFja2FnZXMNCg0KQmVmb3JlIHJ1bm5pbmcgdGhpcyBjaHVuaywgcGxlYXNlIGxvYWQgIlN0dWR5IDIuY3N2IiBpbnRvIHRoZSBSIGVudmlyb25tZW50Lg0KDQpgYGB7cn0NCiMgcGFja2FnZXMgc2hvdWxkIGJlIGxvYWRlZCBpbiB0aGUgZm9sbG93aW5nIG9yZGVyIHRvIGF2b2lkIGZ1bmN0aW9uIGNvbmZsaWN0cw0Kb3B0aW9ucyhzY2lwZW4gPSA5OSkgIyB0dXJucyBvZmYgc2NpZW50aWZpYyBub3RhdGlvbg0KbGlicmFyeShwc3ljaCkgIyBmb3IgZGVzY3JpYmluZyBkYXRhDQpsaWJyYXJ5KGVmZnNpemUpICMgZm9yIG1lYW4gZGlmZmVyZW5jZSBlZmZlY3Qgc2l6ZXMNCmxpYnJhcnkoc2pzdGF0cykgIyBmb3IgZXRhLXNxdWFyZWQgZWZmZWN0IHNpemVzDQpsaWJyYXJ5KGNvcnJlbGF0aW9uKSAjIGZvciBjbGVhbmVyIGNvcnJlbGF0aW9uIHRlc3Qgb3V0cHV0DQpsaWJyYXJ5KHJtY29ycikgIyBmb3IgcmVwZWF0ZWQtbWVhc3VyZXMgY29ycmVsYXRpb24gdGVzdHMNCmxpYnJhcnkoY29jb3IpICMgZm9yIGNvbXBhcmluZyBkZXBlbmRlbnQgY29ycmVsYXRpb24gY29lZmZpY2llbnRzDQpsaWJyYXJ5KHRpZHl2ZXJzZSkgIyBmb3IgZGF0YSBtYW5pcHVsYXRpb24gYW5kIHBsb3R0aW5nDQpgYGANCg0KIyMgQXR0ZW50aW9uIGNoZWNrDQoNClBhcnRpY2lwYW50cyBpbiB0aGUgY29udGludW91cyB2aXJ0dW9zaXR5IGNvbmRpdGlvbiB3ZXJlIGluc3RydWN0ZWQgdG8gc2VsZWN0IHplcm8gKGkuZS4sIHRoZSBtaWRkbGUgb3B0aW9uIGluIHRoZSA5LXBvaW50IHNjYWxlKSBhcyB0aGVpciByZXNwb25zZSBmb3IgdGhlIHZpcnR1b3NpdHkgbWVhc3VyZS4gQWRkaXRpb25hbGx5LCBwYXJ0aWNpcGFudHMgaW4gdGhlIGJpbmFyeSBnb29kbmVzcyBjb25kaXRpb24sIHNlbGVjdGVkICJNb25pY2EiIGFzIHRoZWlyIHJlc3BvbnNlIGZvciB0aGUgIm1vcmUgZ29vZCIgbWVhc3VyZS4gSWYgYSBwYXJ0aWNpcGFudCBmYWlsZWQgdG8gc2VsZWN0IGVpdGhlciBvZiB0aGVzZSByZXNwb25zZXMsIHRoZXkgd291bGQgYmUgZXhjbHVkZWQgZnJvbSB0aGUgYW5hbHlzZXMuDQoNCmBgYHtyfQ0KUzJfYmluIDwtIFN0dWR5XzIgJT4lIA0KICBmaWx0ZXIoQXR0bkJpblEgPT0gIk1vbmljYSIpICU+JSANCiAgc2VsZWN0KC1jKEF0dG5Db250ViwgczRfVjFUaGVmdCwgczRfVjFDaGVhdCwgczRfVjFEcnVncywgczRfVjFTZXgsDQogICAgICAgICAgICBzNF9WMVNleHVhbGl6aW5nLCBzNF9WMUhlYWx0aCwgczRfVjFCbGFtZSwgczRfVjFSZXZlbmdlLA0KICAgICAgICAgICAgczRfVjFXb3JrZXRoaWMsIHM0X1YxQ3JpdGljaXNtKSkNCg0KUzJfY29udCA8LSBTdHVkeV8yICU+JSANCiAgZmlsdGVyKEF0dG5Db250ViA9PSAiMFxuIikgJT4lIA0KICBzZWxlY3QoLWMoQXR0bkJpblEsIHM0X3NiVGhlZnQsIHM0X3NiQ2hlYXQsIHM0X3NiRHJ1Z3MsIHM0X3NiU2V4LA0KICAgICAgICAgICAgczRfc2JTZXh1YWxpemF0aW9uLCBzNF9zYkhlYWx0aCwgczRfc2JCbGFtZSwgczRfc2JSZXZlbmdlLA0KICAgICAgICAgICAgczRfc2JXb3JrZXRoaWMsIHM0X3NiQ3JpdGljaXNtKSkNCg0KYGBgDQoNCg0KIyMgVmFyaWFibGUgQ3JlYXRpb24NCg0KSGVyZSwgd2UgY3JlYXRlIHRoZSByZWxldmFudCB2YXJpYWJsZXMgbmVjZXNzYXJ5IHRvIGJlZ2luIGFuYWx5c2VzIGZvciBib3RoIHRoZSBiaW5hcnkgZ29vZG5lc3MgbWVhc3VyZSBhbmQgdGhlIGNvbnRpbnVvdXMgdmlydHVvc2l0eSBtZWFzdXJlLiANCg0KYGBge3J9DQojIENyZWF0ZSBhIHZhcmlhYmxlIHBlciBzY2VuYXJpbyB0aGF0IGluZGljYXRlcyBpZiBlYWNoIHBhcnRpY2lwYW50IGNob3NlIHRoZSBoeXBvdGhlc2l6ZWQgYWdlbnQgKGkuZS4sIDEpLCBvciBub3QgKGkuZS4sIDApDQpTMl9iaW4gPC0gUzJfYmluICU+JSAgDQogIG11dGF0ZSh0aGVmdF9oeXAgPSBpZl9lbHNlKHM0X3NiVGhlZnQgPT0gIktlbm5hIiwgMSwgMCkpICU+JSANCiAgbXV0YXRlKGRydWdzX2h5cCA9IGlmX2Vsc2UoczRfc2JEcnVncyA9PSAiQ2FybCIsIDEsIDApKSAlPiUgDQogIG11dGF0ZShjaGVhdF9oeXAgPSBpZl9lbHNlKHM0X3NiQ2hlYXQgPT0gIkphbWVzIiwgMSwgMCkpICU+JSANCiAgbXV0YXRlKHNleF9oeXAgPSBpZl9lbHNlKHM0X3NiU2V4ID09ICJDYW1pbGEiLCAxLCAwKSkgJT4lIA0KICBtdXRhdGUoc2V4dWFsaXplX2h5cCA9IGlmX2Vsc2UoczRfc2JTZXh1YWxpemF0aW9uID09ICJSb2JlcnQiLCAxLCAwKSkgJT4lIA0KICBtdXRhdGUocmV2ZW5nZV9oeXAgPSBpZl9lbHNlKHM0X3NiUmV2ZW5nZSA9PSAiQ2xhcmEiLCAxLCAwKSkgJT4lIA0KICBtdXRhdGUod29ya2V0aGljX2h5cCA9IGlmX2Vsc2UoczRfc2JXb3JrZXRoaWMgPT0gIlZpdmlhbiIsIDEsIDApKSAlPiUgDQogIG11dGF0ZShibGFtZV9oeXAgPSBpZl9lbHNlKHM0X3NiQmxhbWUgPT0gIkVyaWMiLCAxLCAwKSkgJT4lIA0KICBtdXRhdGUoY3JpdGljaXNtX2h5cCA9IGlmX2Vsc2UoczRfc2JDcml0aWNpc20gPT0gIlNoYXduIiwgMSwgMCkpICU+JSANCiAgbXV0YXRlKGhlYWx0aF9oeXAgPSBpZl9lbHNlKHM0X3NiSGVhbHRoID09ICJTdW1tZXIiLCAxLCAwKSkNCg0KIyBDcmVhdGUgYSB2YXJpYWJsZSB0aGF0IGF2ZXJhZ2VzIHRoZSBiaW5hcnkgY2hvaWNlIHZhbHVlcyB3aXRoaW4gcGFydGljaXBhbnRzIHdoZXJlIHRoZSBoeXBvdGhlc2l6ZWQgbm9uLXRlbXB0ZWQgYWdlbnQgaGFzIGEgdmFsdWUgb2YgMSBhbmQgdGhlIHRlbXB0ZWQgYWdlbnQgaGFzIGEgdmFsdWUgb2YgMA0KUzJfYmluJEJpbmFyeUF2ZXJhZ2UgPC0gcm93TWVhbnMoUzJfYmluWywgKGMoInRoZWZ0X2h5cCIsICJkcnVnc19oeXAiLCAiY2hlYXRfaHlwIiwgInNleF9oeXAiLCAic2V4dWFsaXplX2h5cCIsInJldmVuZ2VfaHlwIiwid29ya2V0aGljX2h5cCIsICJibGFtZV9oeXAiLCAiY3JpdGljaXNtX2h5cCIsImhlYWx0aF9oeXAiKSldLCBuYS5ybSA9IFQpDQoNCiMgQ3JlYXRlIGEgdmFyaWFibGUgcGVyIHNjZW5hcmlvIHRoYXQgaW5kaWNhdGVzIGlmIGVhY2ggcGFydGljaXBhbnQgY2hvc2UgdGhlIGh5cG90aGVzaXplZCBhZ2VudCBvciBub3QNClMyX2NvbnQgPC0gUzJfY29udCAlPiUNCiAgbXV0YXRlX2F0KHZhcnMoczRfVjFUaGVmdCwgczRfVjFEcnVncywgczRfVjFDaGVhdCwgczRfVjFTZXgsIHM0X1YxU2V4dWFsaXppbmcsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHM0X1YxUmV2ZW5nZSwgczRfVjFXb3JrZXRoaWMsIHM0X1YxQmxhbWUsIHM0X1YxQ3JpdGljaXNtLCBzNF9WMUhlYWx0aCksIGFzLm51bWVyaWMpDQoNClMyX2NvbnQgPC0gUzJfY29udCAlPiUgIA0KICBtdXRhdGUodGhlZnRfaHlwID0gaWZfZWxzZShzNF9WMVRoZWZ0ID4gMCwgMSwgMCkpICU+JQ0KICBtdXRhdGUoZHJ1Z3NfaHlwID0gaWZfZWxzZShzNF9WMURydWdzID4gMCwgMSwgMCkpICU+JQ0KICBtdXRhdGUoY2hlYXRfaHlwID0gaWZfZWxzZShzNF9WMUNoZWF0ID4gMCwgMSwgMCkpICU+JQ0KICBtdXRhdGUoc2V4X2h5cCA9IGlmX2Vsc2UoczRfVjFTZXggPiAwLCAxLCAwKSkgJT4lDQogIG11dGF0ZShzZXh1YWxpemVfaHlwID0gaWZfZWxzZShzNF9WMVNleHVhbGl6aW5nID4gMCwgMSwgMCkpICU+JQ0KICBtdXRhdGUocmV2ZW5nZV9oeXAgPSBpZl9lbHNlKHM0X1YxUmV2ZW5nZSA+IDAsIDEsIDApKSAlPiUNCiAgbXV0YXRlKHdvcmtldGhpY19oeXAgPSBpZl9lbHNlKHM0X1YxV29ya2V0aGljID4gMCwgMSwgMCkpICU+JQ0KICBtdXRhdGUoYmxhbWVfaHlwID0gaWZfZWxzZShzNF9WMUJsYW1lID4gMCwgMSwgMCkpICU+JQ0KICBtdXRhdGUoY3JpdGljaXNtX2h5cCA9IGlmX2Vsc2UoczRfVjFDcml0aWNpc20gPiAwLCAxLCAwKSkgJT4lDQogIG11dGF0ZShoZWFsdGhfaHlwID0gaWZfZWxzZShzNF9WMUhlYWx0aCA+IDAsIDEsIDApKQ0KDQojIENyZWF0ZSBhIHZhcmlhYmxlIHBlciBzY2VuYXJpbyB0aGF0IGluZGljYXRlcyBpZiBlYWNoIHBhcnRpY2lwYW50IGNob3NlIHRoZSBub24taHlwb3RoZXNpemVkIGFnZW50DQojIyB0aGlzIHdvdWxkIHJ1bGUgb3V0IHRoYXQgYW55IG9uZSB2aWduZXR0ZSB0aGF0IGRvZXMgbm90IGhhdmUgYSBwcmVkaWN0ZWQgbWFqb3JpdHkgcGF0dGVybiBpcyBkdWUgdG8gYW4gb3Bwb3NpdGUgbWFqb3JpdHkgcGF0dGVybg0KIyMgZm9yIGluc3RhbmNlLCBpdCBjb3VsZCBiZSB0aGUgY2FzZSB0aGF0IGEgbm9uLW1ham9yaXR5IHNob3dzIHRoZSBwcmVkaWN0ZWQgcGF0dGVybiBidXQgdGhhdCB0aGUgbW9kYWwgb3Igc2Vjb25kLW1vZGFsIHBhdHRlcm4gaXMganVkZ2luZyBib3RoIGFnZW50cyBhcyBlcXVhbGx5IHZpcnR1b3VzIChhbmQgbm90IHRoZSB0ZW1wdGVkIGFnZW50IGFzIG1vcmUgdmlydHVvdXMpDQpTMl9jb250IDwtIFMyX2NvbnQgJT4lICANCiAgbXV0YXRlKHRoZWZ0X29wcCA9IGlmX2Vsc2UoczRfVjFUaGVmdCA8IDAsIDEsIDApKSAlPiUNCiAgbXV0YXRlKGRydWdzX29wcCA9IGlmX2Vsc2UoczRfVjFEcnVncyA8IDAsIDEsIDApKSAlPiUNCiAgbXV0YXRlKGNoZWF0X29wcCA9IGlmX2Vsc2UoczRfVjFDaGVhdCA8IDAsIDEsIDApKSAlPiUNCiAgbXV0YXRlKHNleF9vcHAgPSBpZl9lbHNlKHM0X1YxU2V4IDwgMCwgMSwgMCkpICU+JQ0KICBtdXRhdGUoc2V4dWFsaXplX29wcCA9IGlmX2Vsc2UoczRfVjFTZXh1YWxpemluZyA8IDAsIDEsIDApKSAlPiUNCiAgbXV0YXRlKHJldmVuZ2Vfb3BwID0gaWZfZWxzZShzNF9WMVJldmVuZ2UgPCAwLCAxLCAwKSkgJT4lDQogIG11dGF0ZSh3b3JrZXRoaWNfb3BwID0gaWZfZWxzZShzNF9WMVdvcmtldGhpYyA8IDAsIDEsIDApKSAlPiUNCiAgbXV0YXRlKGJsYW1lX29wcCA9IGlmX2Vsc2UoczRfVjFCbGFtZSA8IDAsIDEsIDApKSAlPiUNCiAgbXV0YXRlKGNyaXRpY2lzbV9vcHAgPSBpZl9lbHNlKHM0X1YxQ3JpdGljaXNtIDwgMCwgMSwgMCkpICU+JQ0KICBtdXRhdGUoaGVhbHRoX29wcCA9IGlmX2Vsc2UoczRfVjFIZWFsdGggPCAwLCAxLCAwKSkNCg0KDQojIENyZWF0ZSBhIHZhcmlhYmxlIHRoYXQgYXZlcmFnZXMgdGhlIGNvbnRpbnVvdXMgdmFsdWVzIHdpdGhpbiBwYXJ0aWNpcGFudHMgd2hlcmUgcG9zaXRpdmUgbnVtYmVycyBpbmRpY2F0ZSBjaG9vc2luZyBvZiBub24tdGVtcHRlZCBhZ2VudA0KUzJfY29udCRDb250aW51b3VzQXZlcmFnZSA8LSByb3dNZWFucyhTMl9jb250WywgKGMoInM0X1YxVGhlZnQiLCAiczRfVjFEcnVncyIsICJzNF9WMUNoZWF0IiwgInM0X1YxU2V4IiwgInM0X1YxU2V4dWFsaXppbmciLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiczRfVjFSZXZlbmdlIiwgInM0X1YxV29ya2V0aGljIiwgInM0X1YxQmxhbWUiLCAiczRfVjFDcml0aWNpc20iLCAiczRfVjFIZWFsdGgiKSldLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYS5ybSA9IFQpDQpgYGANCg0KDQojIEdyb3VwLUx2bCBBbmFseXNlcyB7LnRhYnNldH0NCg0KRm9yIGFsbCB0LXRlc3RzLCB3ZSBjb25kdWN0IGJvdGggb25lLXRhaWxlZCBhbmQgdHdvLXRhaWxlZCB0ZXN0cy4gT3VyIHByZS1yZWdpc3RyYXRpb24gc3BlY2lmaWVkIGRpcmVjdGlvbmFsIGh5cG90aGVzZXMgd2hpY2ggdGhlcmVmb3JlIG91Z2h0IHRvIGJlIGFuYWx5emVkIHdpdGggb25lLXRhaWxlZCB0ZXN0cy4gSG93ZXZlciwgaW4gb3JkZXIgZm9yIHJlYWRlcnMgdG8ga25vdyBhbnkgZXN0aW1hdGUncyB1bmNlcnRhaW50eSBpbiBib3RoIGRpcmVjdGlvbnMsIHdlIGFsc28gY29uZHVjdCB0d28tdGFpbGVkIHRlc3RzIHRvIGdldCByZWxldmFudCBDSXMuDQoNCiMjIEJpbmFyeSBHb29kbmVzcyB7LnRhYnNldH0NCmBgYHtyfQ0KIyB0LXRlc3QgdXNpbmcgcGVyc29uLWxldmVsIGF2ZXJhZ2VzIGFjcm9zcyBiaW5hcnkgbWVhc3VyZQ0KUzJfYmluX3QgPC0gdC50ZXN0KFMyX2JpbiRCaW5hcnlBdmVyYWdlLCBtdSA9IDAuNSwgYWx0ZXJuYXRpdmUgPSAiZ3JlYXRlciIpICMgbXUgPSAwLjUgYmVjYXVzZSBvZiBiaW5hcnkgbmF0dXJlIG9mIERWDQojIyAnZ3JlYXRlcicgaXMgZm9yIG9uZS10YWlsZWQgcC12YWx1ZSBiZWNhdXNlIG9mIHRoZSBub24tdGVtcHRlZCA+IHRlbXB0ZWQgaHlwb3RoZXNpcyAobnVtYmVycyA+IDAuNSBtZWFuIG5vbi10ZW1wdGVkID4gdGVtcHRlZCB3YXMgY2hvc2VuIG1vcmUgb2Z0ZW4pDQpwcmludChTMl9iaW5fdCkNCg0KUzJfYmluX3RfMnNpZGUgPC0gdC50ZXN0KFMyX2JpbiRCaW5hcnlBdmVyYWdlLCBtdSA9IDAuNSwgYWx0ZXJuYXRpdmUgPSAidHdvLnNpZGVkIikgDQojIyAndHdvLnNpZGVkJyBpcyB0byBnZXQgdW5jZXJ0YWludHkgZXN0aW1hdGVzIGluIGJvdGggZGlyZWN0aW9ucw0KcHJpbnQoUzJfYmluX3RfMnNpZGUpDQoNCiMgcmV0dXJucyBjb2hlbidzIGQNCmVmZnNpemU6OmNvaGVuLmQoUzJfYmluJEJpbmFyeUF2ZXJhZ2UsDQogICAgICAgICAgICAgICAgIGYgPSBOQSwNCiAgICAgICAgICAgICAgICAgbXUgPSAwLjUsDQogICAgICAgICAgICAgICAgIGRhdGEgPSBkYXRhKQ0KYGBgDQojIyBDb250aW51b3VzIFZpcnR1b3NpdHkgey50YWJzZXR9DQpgYGB7cn0NCiMgdC10ZXN0IHVzaW5nIHBlcnNvbi1sZXZlbCBhdmVyYWdlcyBhY3Jvc3MgYmluYXJ5IG1lYXN1cmUNClMyX2NvbnRfdCA8LSB0LnRlc3QoUzJfY29udCRDb250aW51b3VzQXZlcmFnZSwgbXUgPSAwLCBhbHRlcm5hdGl2ZSA9ICJncmVhdGVyIikgIyBtdSA9IDAgYmVjYXVzZSBvZiBjb250aW51b3VzIG5hdHVyZSBvZiBEVg0KIyMgJ2dyZWF0ZXInIGlzIGZvciBvbmUtdGFpbGVkIHAtdmFsdWUgYmVjYXVzZSBvZiB0aGUgbm9uLXRlbXB0ZWQgPiB0ZW1wdGVkIGh5cG90aGVzaXMgKHBvcyBudW1iZXJzIG1lYW4gbm9uLXRlbXB0ZWQgPiB0ZW1wdGVkKQ0KcHJpbnQoUzJfY29udF90KQ0KDQpTMl9jb250X3RfMnNpZGUgPC0gdC50ZXN0KFMyX2NvbnQkQ29udGludW91c0F2ZXJhZ2UsIG11ID0gMCwgYWx0ZXJuYXRpdmUgPSAidHdvLnNpZGVkIikgDQojIyAndHdvLnNpZGVkJyBpcyB0byBnZXQgdW5jZXJ0YWludHkgZXN0aW1hdGVzIGluIGJvdGggZGlyZWN0aW9ucw0KcHJpbnQoUzJfY29udF90XzJzaWRlKQ0KDQojIHJldHVybnMgY29oZW4ncyBkDQplZmZzaXplOjpjb2hlbi5kKFMyX2NvbnQkQ29udGludW91c0F2ZXJhZ2UsDQogICAgICAgICAgICAgICAgIGYgPSBOQSwNCiAgICAgICAgICAgICAgICAgbXUgPSAwLA0KICAgICAgICAgICAgICAgICBkYXRhID0gZGF0YSkNCmBgYA0KDQojIFBlcnNvbi1MdmwgQW5hbHlzZXMgey50YWJzZXR9DQpgYGB7cn0NCiMgY3JlYXRlIHZhcmlhYmxlcyBmb3Igd2hldGhlciBoeXBvdGhlc2lzIGZpdCBmb3IgZWFjaCBwYXJ0aWNpcGFudA0KUzJfYmluIDwtIFMyX2JpbiAlPiUNCiAgbXV0YXRlKGZpdHNfaHlwb3RoZXNpcyA9IGlmX2Vsc2UoQmluYXJ5QXZlcmFnZSA+IDAuNTAsIDEsIDApKQ0KDQpTMl9jb250IDwtIFMyX2NvbnQgJT4lDQogIG11dGF0ZShmaXRzX2h5cG90aGVzaXMgPSBpZl9lbHNlKENvbnRpbnVvdXNBdmVyYWdlID4gMCwgMSwgMCkpDQoNCmBgYA0KDQojIyBEZXNjcmlwdGl2ZSBQZXJ2YXNpdmVuZXNzIHsudGFic2V0fQ0KDQojIyMgQmluYXJ5IEdvb2RuZXNzDQpgYGB7cn0NCiMgSG93IG1hbnkgcGFydGljaXBhbnRzIGZpdCBoeXBvdGhlc2lzIGZvciBiaW5hcnkgbWVhc3VyZQ0KdGFibGUoUzJfYmluJGZpdHNfaHlwb3RoZXNpcykgIyAwID0gbm8sIDEgPSB5ZXMNCmBgYA0KIyMjIENvbnRpbnVvdXMgVmlydHVvc2l0eQ0KYGBge3J9DQojIEhvdyBtYW55IHBhcnRpY2lwYW50cyBmaXQgaHlwb3RoZXNpcyBmb3IgY29udGludW91cw0KdGFibGUoUzJfY29udCRmaXRzX2h5cG90aGVzaXMpICMgMCA9IG5vLCAxID0geWVzDQpgYGANCg0KIyMgRnJlcXVlbnRpc3QgUHJldmFsZW5jZSB7LnRhYnNldH0NCmBgYHtyfQ0KIyBDUkVBVEUgTkVDRVNTQVJZIEZSRVFVRU5USVNUIEZVTkNUSU9OIChjb2RlIGFkYXB0ZWQgZnJvbSBEb25oYXVzZXIgZXQgYWwuJ3MgKDIwMTgpIE1BVExBQiBjb2RlKQ0KDQpwcmV2YWxlbmNlX3Rlc3QgPC0gZnVuY3Rpb24ob2JzZXJ2ZWQsIGFscGhhX2luZD0wLjA1LCBiZXRhX2luZD0xLCBhbHBoYV9ncm91cD0wLjA1LCBnYW1tYV8wPTAuNSkgew0KICANCiAgIyBJbnB1dHM6DQogICMgb2JzZXJ2ZWQgICAgPSB2ZWN0b3Igb2YgcC12YWx1ZXMgT1IgdmVjdG9yIHdpdGggdHdvIHZhbHVlcywgZS5nLiwgJ2MocG9zaXRpdmUgY2FzZXMsIHRvdGFsIGNhc2VzKScNCiAgIyBhbHBoYV9pbmQgICA9IGFscGhhIHRocmVzaG9sZCBmb3IgcGVyc29uLWxldmVsIHRlc3RzLCBpZiAnb2JzZXJ2ZWQnID0gdmVjdG9yIG9mIHAtdmFsdWVzICh0eXBpY2FsbHkgc2V0IHRvIC4wNSkNCiAgIyBiZXRhX2luZCAgICA9IHNlbnNpdGl2aXR5IG9mIHBlcnNvbi1sZXZlbCB0ZXN0cyAocHJvYmFibHkgc2V0IHRvIDEuMDApDQogICMgYWxwaGFfZ3JvdXAgPSBzZWUgIm91dHB1dHMiDQogICMgZ2FtbWFfMCAgICAgPSBudWxsIGdhbW1hIHZhbHVlIGZvciBlbXBpcmljYWwgcHJldmFsZW5jZSB0byBiZSB0ZXN0ZWQgYWdhaW5zdCAoZGVmYXVsdHMgdG8gbWFqb3JpdHkgbnVsbCkNCiAgDQogICMgT3V0cHV0czoNCiAgIyBwX251bGwgICAgICA9IHAtdmFsdWUgZm9yIG1ham9yaXR5IG51bGwgb3Igd2hhdGV2ZXIgbnVsbCB5b3Ugc3BlY2lmeSBpbiB0aGUgZ2FtbWFfMCBhcmd1bWVudCAoZS5nLiwgdG8gc3BlY2lmeSBhIGdsb2JhbCBudWxsIHNldCAiZ2FtbWFfMCA9IDAiKSANCiAgIyBnYW1tYV8wICAgICA9IGhpZ2hlc3QgZ2FtbWFfMCB2YWx1ZSB0aGF0IGNhbiBiZSByZWplY3RlZCBhdCB0aHJlc2hvbGQgb2YgJ2FscGhhX2dyb3VwJyBnaXZlbiBwb3NpdGl2ZSBjYXNlcy4gTm90ZSB0aGlzIG91dHB1dCBpcyBub3QgdGhlIHNhbWUgYXMgdGhlIGlucHV0IGFyZ3VtZW50DQogIGlmKHN1bShvYnNlcnZlZCA+IDEpID09IDApIHsNCiAgICBwdmFscyA8LSBvYnNlcnZlZA0KICB9IGVsc2Ugew0KICAgIHB2YWxzIDwtIGMocmVwKDAsIG9ic2VydmVkWzFdKSwgcmVwKDEsIG9ic2VydmVkWzJdLW9ic2VydmVkWzFdKSkNCiAgfQ0KICANCiAgbiA8LSBsZW5ndGgocHZhbHMpDQogIGtfb2JzIDwtIHN1bShwdmFscyA8IGFscGhhX2luZCkNCiAga3ZhbHMgPC0gMDpuDQogIGRnYW1tYSA8LSAwLjAwMQ0KICBnYW1tYXZhbHMgPC0gc2VxKDAsIDEsIGRnYW1tYSkNCiAgDQogIHBfa19nYW1tYSA8LSBtYXRyaXgoMCwgbnJvdz1sZW5ndGgoZ2FtbWF2YWxzKSwgbmNvbD1sZW5ndGgoa3ZhbHMpKQ0KICBwX2trX2dhbW1hIDwtIG1hdHJpeCgwLCBucm93PWxlbmd0aChnYW1tYXZhbHMpLCBuY29sPWxlbmd0aChrdmFscykpDQogIA0KICBmb3IoaUdhbSBpbiAxOmxlbmd0aChnYW1tYXZhbHMpKSB7DQogICAgcF9wb3MgPC0gZ2FtbWF2YWxzW2lHYW1dICogYmV0YV9pbmQgKyAoMSAtIGdhbW1hdmFsc1tpR2FtXSkgKiBhbHBoYV9pbmQNCiAgICBwX25lZyA8LSBnYW1tYXZhbHNbaUdhbV0gKiAoMSAtIGJldGFfaW5kKSArICgxIC0gZ2FtbWF2YWxzW2lHYW1dKSAqICgxIC0gYWxwaGFfaW5kKQ0KICAgIGZvcihpSyBpbiAxOmxlbmd0aChrdmFscykpIHsNCiAgICAgIGsgPC0ga3ZhbHNbaUtdDQogICAgICB0bXAgPC0gY2hvb3NlKG4sIGspICogcF9wb3NeayAqIHBfbmVnXihuIC0gaykNCiAgICAgIHBfa19nYW1tYVtpR2FtLCBpS10gPC0gdG1wDQogICAgICBwX2trX2dhbW1hW2lHYW0sIGlLXSA8LSAxIC0gc3VtKHBfa19nYW1tYVtpR2FtLCAxOmlLXSkgKyB0bXANCiAgICB9DQogIH0NCiAgDQogIGlLIDwtIHdoaWNoKGt2YWxzID09IGtfb2JzKQ0KICBwX251bGwgPC0gcF9ra19nYW1tYVt3aGljaChnYW1tYXZhbHMgPT0gZ2FtbWFfMCksIGlLXQ0KICANCiAgaW5kZXggPC0gc3VtKHBfa2tfZ2FtbWFbLCBpS10gPCBhbHBoYV9ncm91cCkNCiAgaWYoaW5kZXggIT0gMCkgew0KICAgIGdhbW1hXzAgPC0gZ2FtbWF2YWxzW2luZGV4XQ0KICB9IGVsc2Ugew0KICAgIGdhbW1hXzAgPC0gMA0KICB9DQogIA0KICByZXR1cm4obGlzdChwX251bGw9cF9udWxsLCBnYW1tYV8wPWdhbW1hXzAsIHBfa2tfZ2FtbWE9cF9ra19nYW1tYSwgZ2FtbWF2YWxzPWdhbW1hdmFscywgcF9rX2dhbW1hPXBfa19nYW1tYSkpDQp9DQoNCmBgYA0KDQojIyMgQmluYXJ5IEdvb2RuZXNzDQpgYGB7cn0NCg0KayA8LSAxMjggICMgbnVtYmVyIG9mIHBlcnNvbnMgbWF0Y2hpbmcgaHlwb3RoZXNpemVkIC8gZ3JvdXAtbGV2ZWwgcGF0dGVybg0KbiA8LSAxMjgrNDkgIyB0b3RhbCBODQpiaW5hcnlfZnJlcVByZXZhbGVuY2UgPC0gcHJldmFsZW5jZV90ZXN0KGMoaywgbikpICMgc3BlY2lmeSBwb3NpdGl2ZSBjYXNlcyBvdXQgb2YgdG90YWwgY2FzZXMgZm9yIHByZXYgdGVzdCBmdW5jdGlvbg0KYmluYXJ5X2ZyZXFQcmV2YWxlbmNlJHBfbnVsbCAjIHByaW50IHAtdmFsdWUgdGVzdGluZyBhZ2FpbnN0IG1ham9yaXR5IG51bGwNCmBgYA0KIyMjIENvbnRpbnVvdXMgVmlydHVvc2l0eQ0KYGBge3J9DQoNCmsgPC0gMTMwICAjIG51bWJlciBvZiBwZXJzb25zIG1hdGNoaW5nIGh5cG90aGVzaXplZCAvIGdyb3VwLWxldmVsIHBhdHRlcm4NCm4gPC0gMTMwKzQzICMgdG90YWwgTg0KY29udF9mcmVxUHJldmFsZW5jZSA8LSBwcmV2YWxlbmNlX3Rlc3QoYyhrLCBuKSkgIyBzcGVjaWZ5IHBvc2l0aXZlIGNhc2VzIG91dCBvZiB0b3RhbCBjYXNlcyBmb3IgcHJldiB0ZXN0IGZ1bmN0aW9uDQpjb250X2ZyZXFQcmV2YWxlbmNlJHBfbnVsbCAjIHByaW50IHAtdmFsdWUgdGVzdGluZyBhZ2FpbnN0IG1ham9yaXR5IG51bGwNCmBgYA0KDQojIyBCYXllc2lhbiBQcmV2YWxlbmNlIHsudGFic2V0fQ0KYGBge3J9DQojIENSRUFURSBORUNFU1NBUlkgQkFZRVMgRlVOQ1RJT05TIChjb2RlIGZyb20gSW5jZSBldCBhbC4sIDIwMjEpDQpsaWJyYXJ5KG5sZXFzbHYpDQoNCmJheWVzcHJldl9tYXAgPC0gZnVuY3Rpb24oaywgbiwgYT0wLjA1LCBiPTEpIHsNCiAgIyBCYXllc2lhbiBtYXhpbXVtIGEgcG9zdGVyaW9yaSBlc3RpbWF0ZSBvZiBwb3B1bGF0aW9uIHByZXZhbGVuY2UgZ2FtbWENCiAgIyB1bmRlciBhIHVuaWZvcm0gcHJpb3INCiAgIyANCiAgIyBBcmdzOg0KICAjICBrOiBudW1iZXIgb2YgcGFydGljaXBhbnRzL3Rlc3RzIHNpZ25pZmljYW50IG91dCBvZiANCiAgIyAgbjogdG90YWwgbnVtYmVyIG9mIHBhcnRpY2lwYW50cy90ZXN0cw0KICAjICBhOiBhbHBoYSB2YWx1ZSBvZiB3aXRoaW4tcGFydGljaXBhbnQgdGVzdCAoZGVmYXVsdD0wLjA1KQ0KICAjICBiOiBzZW5zaXRpdml0eS9iZXRhIG9mIHdpdGhpbi1wYXJ0aWNpcGFudCB0ZXN0IChkZWZhdWx0PTEpDQogIA0KICBnbSA8LSAoay9uIC1hKS8oYi1hKQ0KICBpZihnbSA8MCkgZ20gPC0gMA0KICBpZihnbT4xKSBnbSA8LSAxDQogIHJldHVybihnbSkNCn0gDQoNCmJheWVzcHJldl9wb3N0ZXJpb3IgPC0gZnVuY3Rpb24oeCwgaywgbiwgYT0wLjA1LCBiPTEpIHsNCiAgIyBCYXllc2lhbiBwb3N0ZXJpb3Igb2YgcG9wdWxhdGlvbiBwcmV2YWxlbmNlIGdhbW1hIHVuZGVyIGEgdW5pZm9ybSBwcmlvcg0KICAjDQogICMgQXJnczoNCiAgIyB4IDogdmFsdWVzIG9mIGdhbW1hIGF0IHdoaWNoIHRvIGV2YWx1YXRlIHRoZSBwb3N0ZXJpb3IgZGVuc2l0eQ0KICAjIGsgOiBudW1iZXIgb2YgcGFydGljaXBhbnRzIHNpZ25pZmljYW50IG91dCBvZiANCiAgIyBuIDogdG90YWwgbnVtYmVyIG9mIHBhcnRpY2lwYW50cw0KICAjIGEgOiBhbHBoYSB2YWx1ZSBvZiB3aXRoaW4tcGFydGljaXBhbnQgdGVzdCAoZGVmYXVsdD0wLjA1KQ0KICAjIGIgOiBzZW5zaXRpdml0eS9iZXRhIG9mIHdpdGhpbi1wYXJ0aWNpcGFudCB0ZXN0IChkZWZhdWx0PTEpDQogIA0KICBtMSA8LSAgayArIDENCiAgbTIgPC0gbiAtIGsgKyAxDQogIHRoZXRhIDwtIGEgKyAoYi1hKSp4DQogIHBvc3QgPC0gKGIgLWEpKmRiZXRhKHRoZXRhLG0xLCBtMikNCiAgcG9zdCA8LSBwb3N0LyhwYmV0YShiLCBtMSwgbTIpIC0gcGJldGEoYSwgbTEsIG0yKSkNCiAgcmV0dXJuKHBvc3QpDQp9DQoNCg0KYmF5ZXNwcmV2X2JvdW5kIDwtIGZ1bmN0aW9uKHAsIGssIG4sIGE9MC4wNSwgYj0xKSB7DQogICMgQmF5ZXNpYW4gbG93ZXIgYm91bmQgb2YgcG9wdWxhdGlvbiBwcmV2YWxlbmNlIGdhbW1hIHVuZGVyIGEgdW5pZm9ybSBwcmlvcg0KICAjDQogICMgQXJnczoNCiAgIyAgcCA6IGRlbnNpdHkgdGhlIGxvd2VyIGJvdW5kIHNob3VsZCBib3VuZCAoZS5nLiAwLjk1KQ0KICAjICBrIDogbnVtYmVyIG9mIHBhcnRpY2lwYW50cyBzaWduaWZpY2FudCBvdXQgb2YgDQogICMgIG4gOiB0b3RhbCBudW1iZXIgb2YgcGFydGljaXBhbnRzDQogICMgIGEgOiBhbHBoYSB2YWx1ZSBvZiB3aXRoaW4tcGFydGljaXBhbnQgdGVzdCAoZGVmYXVsdD0wLjA1KQ0KICAjICBiIDogc2Vuc2l0aXZpdHkvYmV0YSBvZiB3aXRoaW4tcGFydGljaXBhbnQgdGVzdCAoZGVmYXVsdD0xKQ0KICANCiAgbTEgPC0gIGsgKyAxDQogIG0yIDwtIG4gLSBrICsgMQ0KICB0aF9jIDwtIHFiZXRhKCBwKnBiZXRhKGEsIG0xLCBtMikgKyAoMS1wKSpwYmV0YShiLCBtMSwgbTIpLCBtMSwgbTIgKQ0KICBnX2MgPC0gKHRoX2MgLWEpLyhiLWEpDQogIHJldHVybihnX2MpDQp9DQoNCg0KYmF5ZXNwcmV2X2hwZGkgPC0gZnVuY3Rpb24ocCwgaywgbiwgYT0wLjA1LCBiPTEpIHsNCiAgIyBCYXllc2lhbiBoaWdoZXN0IHBvc3RlcmlvciBkZW5zaXR5IGludGVydmFsIG9mIHBvcHVsYXRpb24gcHJldmFsZW5jZSBnYW1tYQ0KICAjIHVuZGVyIGEgdW5pZm9ybSBwcmlvcg0KICAjDQogICMgQXJnczoNCiAgIyAgcCA6IEhQREkgdG8gcmV0dXJuIChlLmcuIDAuOTUgZm9yIDk1JSkNCiAgIyAgayA6IG51bWJlciBvZiBwYXJ0aWNpcGFudHMgc2lnbmlmaWNhbnQgb3V0IG9mIA0KICAjICBuIDogdG90YWwgbnVtYmVyIG9mIHBhcnRpY2lwYW50cw0KICAjICBhIDogYWxwaGEgdmFsdWUgb2Ygd2l0aGluLXBhcnRpY2lwYW50IHRlc3QgKGRlZmF1bHQ9MC4wNSkNCiAgIyAgYiA6IHNlbnNpdGl2aXR5L2JldGEgb2Ygd2l0aGluLXBhcnRpY2lwYW50IHRlc3QgKGRlZmF1bHQ9MSkNCiAgDQogIG0xIDwtIGsrMQ0KICBtMiA8LSBuLWsrMQ0KICANCiAgaWYobTEgPT0xKSB7DQogICAgZW5kcHRzIDwtIGMoYSwgcWJldGEoICgxIC1wKSpwYmV0YShhLCBtMSwgbTIpICsgcCpwYmV0YShiLCBtMSwgbTIpLCBtMSwgbTIgKSApIA0KICAgIHJldHVybigoZW5kcHRzIC1hKS8oYi1hKSkNCiAgfQ0KICANCiAgaWYobTIgPT0xKSB7DQogICAgZW5kcHRzIDwtIGMoIHFiZXRhKCBwKnBiZXRhKGEsIG0xLCBtMikgKyAoMS0gcCkqIHBiZXRhKGIsIG0xLCBtMiksIG0xLCBtMiApICwgYikgDQogICAgcmV0dXJuKCAoZW5kcHRzLWEpLyhiLWEpKQ0KICB9DQogIA0KICBpZihrPD0gbiphKSB7DQogICAgZW5kcHRzIDwtIGMoYSwgcWJldGEoICgxIC1wKSpwYmV0YShhLCBtMSwgbTIpICsgcCpwYmV0YShiLCBtMSwgbTIpLCBtMSwgbTIgKSApIA0KICAgIHJldHVybigoZW5kcHRzIC1hKS8oYi1hKSkNCiAgfQ0KICANCiAgaWYoaz49IG4qYikgew0KICAgIGVuZHB0cyA8LSBjKCBxYmV0YSggcCpwYmV0YShhLCBtMSwgbTIpICsgKDEtIHApKiBwYmV0YShiLCBtMSwgbTIpLCBtMSwgbTIgKSAsIGIpIA0KICAgIHJldHVybiggKGVuZHB0cy1hKS8oYi1hKSkNCiAgfQ0KICANCiAgDQogIGcgPC0gZnVuY3Rpb24oeCwgbTEsIG0yLCBhLCBiLCBwICkgew0KICAgIHkgPC0gbnVtZXJpYygyKQ0KICAgIHlbMV0gPC0gIHBiZXRhKHhbMl0sIG0xLCBtMikgLSBwYmV0YSh4WzFdLCBtMSwgbTIpIC0gcCoocGJldGEoYiwgbTEsIG0yKSAtIHBiZXRhKGEsIG0xLCBtMikpDQogICAgeVsyXSA8LSBsb2coZGJldGEoeFsyXSwgbTEsIG0yKSkgLSBsb2coZGJldGEoeFsxXSwgbTEsIG0yKSkNCiAgICByZXR1cm4oeSkNCiAgfQ0KICANCiAgeF9pbml0IDwtIG51bWVyaWMoMikNCiAgDQogIHAxIDwtICgxLXApLzIgDQogIHAyIDwtICgxICtwKS8yDQogIA0KICB4X2luaXRbMV0gPC0gcWJldGEoICgxIC1wMSkqcGJldGEoYSwgbTEsIG0yKSArIHAxKiBwYmV0YShiLCBtMSwgbTIpLCBtMSwgbTIgKQ0KICB4X2luaXRbMl0gPC0gcWJldGEoICgxIC1wMikqcGJldGEoYSwgbTEsIG0yKSArIHAyKiBwYmV0YShiLCBtMSwgbTIpLCBtMSwgbTIgKQ0KICANCiAgb3B0IDwtIG5sZXFzbHYoeF9pbml0LCBnLCBtZXRob2QgPSJOZXd0b24iLCBjb250cm9sPWxpc3QobWF4aXQ9MTAwMCksIG0xPW0xLCBtMj1tMiwgYT1hLCBiPWIsIHA9cCkNCiAgDQogIGlmIChvcHQkdGVybWNkID09MSkgIHByaW50KCJjb252ZXJnZW5jZSBhY2hpZXZlZCIpIA0KICBpZiAob3B0JHRlcm1jZCAhPSAxKSAgcHJpbnQoImZhaWxlZCB0byBjb252ZXJnZSIpIA0KICANCiAgdGVtcCA8LSBvcHQkeA0KICBpZiAodGVtcFsxXSA8YSkgew0KICAgIHRlbXBbMV0gPC0gYQ0KICAgIHRlbXBbMl0gPC0gcWJldGEoICgxIC1wKSpwYmV0YShhLCBtMSwgbTIpICsgcCogcGJldGEoYiwgbTEsIG0yKSwgbTEsIG0yICkNCiAgfQ0KICBpZiAodGVtcFsyXSA+IGIpIHsNCiAgICB0ZW1wWzFdIDwtIHFiZXRhKCBwKnBiZXRhKGEsIG0xLCBtMikgKyAoMS1wKSogcGJldGEoYiwgbTEsIG0yKSwgbTEsIG0yICkNCiAgICB0ZW1wWzJdIDwtIGINCiAgfQ0KICBlbmRwdHMgPC0gKHRlbXAgLWEpLyhiLWEpDQogIHJldHVybihlbmRwdHMpIA0KfQ0KDQoNCmJheWVzcHJldl9wb3N0ZXJpb3Jwcm9iIDwtIGZ1bmN0aW9uKHgsIGssIG4sIGE9MC4wNSwgYj0xKSB7DQogICMgQmF5ZXNpYW4gcG9zdGVyaW9yIHByb2JhYmlsaXR5IGluIGZhdm91ciBvZiB0aGUgcG9wdWxhdGlvbiBwcmV2YWxlbmNlIGdhbW1hIGJlaW5nIGdyZWF0ZXIgdGhhbiB4DQogICMNCiAgIyBBcmdzOg0KICAjIHggOiB2YWx1ZXMgb2YgZ2FtbWEgYXQgd2hpY2ggdG8gZXZhbHVhdGUgdGhlIHBvc3RlcmlvciBwcm9iYWJpbGl0eQ0KICAjIGsgOiBudW1iZXIgb2YgcGFydGljaXBhbnRzIHNpZ25pZmljYW50IG91dCBvZiANCiAgIyBuIDogdG90YWwgbnVtYmVyIG9mIHBhcnRpY2lwYW50cw0KICAjIGEgOiBhbHBoYSB2YWx1ZSBvZiB3aXRoaW4tcGFydGljaXBhbnQgdGVzdCAoZGVmYXVsdD0wLjA1KQ0KICAjIGIgOiBzZW5zaXRpdml0eS9iZXRhIG9mIHdpdGhpbi1wYXJ0aWNpcGFudCB0ZXN0IChkZWZhdWx0PTEpDQogIA0KICB0aGV0YSA8LSBhICsgKGItYSkqeA0KICBtMSA8LSAgayArIDENCiAgbTIgPC0gbiAtIGsgKyAxDQogIHAgPC0gKHBiZXRhKGIsbTEsbTIpLXBiZXRhKHRoZXRhLG0xLG0yKSkgLyAocGJldGEoYixtMSxtMiktcGJldGEoYSxtMSxtMikpDQogIHJldHVybihwKQ0KICANCn0NCg0KYmF5ZXNwcmV2X3Bvc3RlcmlvcmxvZ29kZHMgPC0gZnVuY3Rpb24oeCwgaywgbiwgYT0wLjA1LCBiPTEpIHsNCiAgIyBCYXllc2lhbiBwb3N0ZXJpb3IgbG9nLW9kZHMgaW4gZmF2b3VyIG9mIHRoZSBwb3B1bGF0aW9uIHByZXZhbGVuY2UgZ2FtbWEgYmVpbmcgZ3JlYXRlciB0aGFuIHgNCiAgIw0KICAjIEFyZ3M6DQogICMgeCA6IGxvZy1vZGRzIHRocmVzaG9sZA0KICAjIGsgOiBudW1iZXIgb2YgcGFydGljaXBhbnRzIHNpZ25pZmljYW50IG91dCBvZiANCiAgIyBuIDogdG90YWwgbnVtYmVyIG9mIHBhcnRpY2lwYW50cw0KICAjIGEgOiBhbHBoYSB2YWx1ZSBvZiB3aXRoaW4tcGFydGljaXBhbnQgdGVzdCAoZGVmYXVsdD0wLjA1KQ0KICAjIGIgOiBzZW5zaXRpdml0eS9iZXRhIG9mIHdpdGhpbi1wYXJ0aWNpcGFudCB0ZXN0IChkZWZhdWx0PTEpDQogIA0KICB0aGV0YSA8LSBhICsgKGItYSkqeA0KICBtMSA8LSAgayArIDENCiAgbTIgPC0gbiAtIGsgKyAxDQogIHAgPC0gKHBiZXRhKGIsbTEsbTIpLXBiZXRhKHRoZXRhLG0xLG0yKSkgLyAocGJldGEoYixtMSxtMiktcGJldGEoYSxtMSxtMikpDQogIGxvPC0gbG9nKHAgLyAoMSAtIHApKQ0KICByZXR1cm4obG8pDQogIA0KfQ0KYGBgDQoNCiMjIyBCaW5hcnkgR29vZG5lc3MNCmBgYHtyfQ0KDQprIDwtIDEyOCAgIyBudW1iZXIgb2YgcGVyc29ucyBtYXRjaGluZyBoeXBvdGhlc2l6ZWQgLyBncm91cC1sZXZlbCBwYXR0ZXJuDQpuIDwtIDEyOCs0OSAjIHRvdGFsIE4NCnggPC0gMC41MCAjIG1pbm9yaXR5IGN1dC1vZmYgb2YgcG9wdWxhdGlvbiBwcmV2YWxlbmNlIGdhbW1hIGZvciBCYXllc2lhbiBwb3N0ZXJpb3IgcHJvYmFiaWxpdHkNCnhfMCA8LSAwLjAwICMgZ2xvYmFsIG51bGwgb2YgcG9wdWxhdGlvbiBwcmV2YWxlbmNlIGdhbW1hIGZvciBCYXllc2lhbiBwb3N0ZXJpb3IgcHJvYmFiaWxpdHkNCm1hcCA9IGJheWVzcHJldl9tYXAoaywgbikgIyBnZXQgbWF4aW11bSBhIHBvc3RlcmlvcmkgKE1BUCkgZXN0aW1hdGUgKGkuZS4sIHRoZSBsaWtlbGllc3QgcGVyc29uLWxldmVsIHByZXZhbGVuY2UgcG9wdWxhdGlvbiB2YWx1ZSkNCmludCA9IGJheWVzcHJldl9ocGRpKDAuOTYsIGssIG4pICMgZ2V0IDk2JSBIUERJcw0KaTEgPSBpbnRbMV0gIyBnZXQgbG93ZXIgOTYlIEhQREkNCmkyID0gaW50WzJdICMgZ2V0IHVwcGVyIDk2JSBIUERJDQpwcmludChjKGkxLCBtYXAgLGkyKSkgIyBwcmludCBsb3dlciA5NiBIUERJLCBtYXAgZXN0aW1hdGUsIGFuZCB1cHBlciA5NiBIUERJDQpiYXllc3ByZXZfcG9zdGVyaW9ycHJvYih4LCBrLCBuKSAjIEJheWVzaWFuIHBvc3RlcmlvciBwcm9iYWJpbGl0eSBpbiBmYXZvciBvZiBwb3B1bGF0aW9uIHByZXZhbGVuY2UgYmVpbmcgZ3JlYXRlciB0aGFuIHgNCmJheWVzcHJldl9wb3N0ZXJpb3Jwcm9iKHhfMCwgaywgbikgIyBCYXllc2lhbiBwb3N0ZXJpb3IgcHJvYmFiaWxpdHkgaW4gZmF2b3Igb2YgcG9wdWxhdGlvbiBwcmV2YWxlbmNlIGJlaW5nIGdyZWF0ZXIgdGhhbiB4XzANCmBgYA0KIyMjIENvbnRpbnVvdXMgVmlydHVvc2l0eQ0KYGBge3J9DQoNCmsgPC0gMTMwICAjIG51bWJlciBvZiBwZXJzb25zIG1hdGNoaW5nIGh5cG90aGVzaXplZCAvIGdyb3VwLWxldmVsIHBhdHRlcm4NCm4gPC0gMTMwKzQzICMgdG90YWwgTg0KeCA8LSAwLjUwICMgbWlub3JpdHkgY3V0LW9mZiBvZiBwb3B1bGF0aW9uIHByZXZhbGVuY2UgZ2FtbWEgZm9yIEJheWVzaWFuIHBvc3RlcmlvciBwcm9iYWJpbGl0eQ0KeF8wIDwtIDAuMDAgIyBnbG9iYWwgbnVsbCBvZiBwb3B1bGF0aW9uIHByZXZhbGVuY2UgZ2FtbWEgZm9yIEJheWVzaWFuIHBvc3RlcmlvciBwcm9iYWJpbGl0eQ0KbWFwID0gYmF5ZXNwcmV2X21hcChrLCBuKSAjIGdldCBtYXhpbXVtIGEgcG9zdGVyaW9yaSAoTUFQKSBlc3RpbWF0ZSAoaS5lLiwgdGhlIGxpa2VsaWVzdCBwZXJzb24tbGV2ZWwgcHJldmFsZW5jZSBwb3B1bGF0aW9uIHZhbHVlKQ0KaW50ID0gYmF5ZXNwcmV2X2hwZGkoMC45NiwgaywgbikgIyBnZXQgOTYlIEhQRElzDQppMSA9IGludFsxXSAjIGdldCBsb3dlciA5NiUgSFBESQ0KaTIgPSBpbnRbMl0gIyBnZXQgdXBwZXIgOTYlIEhQREkNCnByaW50KGMoaTEsIG1hcCAsaTIpKSAjIHByaW50IGxvd2VyIDk2IEhQREksIG1hcCBlc3RpbWF0ZSwgYW5kIHVwcGVyIDk2IEhQREkNCmJheWVzcHJldl9wb3N0ZXJpb3Jwcm9iKHgsIGssIG4pICMgQmF5ZXNpYW4gcG9zdGVyaW9yIHByb2JhYmlsaXR5IGluIGZhdm9yIG9mIHBvcHVsYXRpb24gcHJldmFsZW5jZSBiZWluZyBncmVhdGVyIHRoYW4geA0KYmF5ZXNwcmV2X3Bvc3RlcmlvcnByb2IoeF8wLCBrLCBuKSAjIEJheWVzaWFuIHBvc3RlcmlvciBwcm9iYWJpbGl0eSBpbiBmYXZvciBvZiBwb3B1bGF0aW9uIHByZXZhbGVuY2UgYmVpbmcgZ3JlYXRlciB0aGFuIHhfMA0KYGBgDQoNCiMgUHJpbWFyeSBQbG90cyB7LnRhYnNldH0NCmBgYHtyfQ0KIyByZS1vcmdhbml6ZSBkYXRhIHRvIHBsb3QgdmlnbmV0dGUtYnktdmlnbmV0dGUgdmFyaWFiaWxpdHkNCg0KIyMgYmluYXJ5DQpTMl92aWduZXR0ZXNfYmluIDwtIFMyX2JpbiAlPiUgDQogIHNlbGVjdChjKFJlc3BvbnNlSWQsIA0KICAgICAgICAgICB0aGVmdF9oeXAsIGRydWdzX2h5cCwgY2hlYXRfaHlwLCBzZXhfaHlwLCBzZXh1YWxpemVfaHlwLCBibGFtZV9oeXAsIHdvcmtldGhpY19oeXAsIHJldmVuZ2VfaHlwLA0KICAgICAgICAgICBjcml0aWNpc21faHlwLCBoZWFsdGhfaHlwKSkgJT4lIA0KICBncm91cF9ieShSZXNwb25zZUlkKSAlPiUNCiAgcGl2b3RfbG9uZ2VyKGNvbHMgPSAoYyh0aGVmdF9oeXAsIGRydWdzX2h5cCwgY2hlYXRfaHlwLCBzZXhfaHlwLCBzZXh1YWxpemVfaHlwLCBibGFtZV9oeXAsIHdvcmtldGhpY19oeXAsIHJldmVuZ2VfaHlwLA0KICAgICAgICAgICAgICAgICAgICAgICAgIGNyaXRpY2lzbV9oeXAsIGhlYWx0aF9oeXApKSwNCiAgICAgICAgICAgICAgIG5hbWVzX3RvID0gInZpZ25ldHRlX25hbWUiLA0KICAgICAgICAgICAgICAgdmFsdWVzX3RvID0gImZpdHNfaHlwb3RoZXNpcyIpDQoNClMyX3ZpZ25ldHRlc19iaW4gPC0gUzJfdmlnbmV0dGVzX2JpbiAlPiUgDQogIG11dGF0ZShmaXRzX2h5cCA9IHJlY29kZShmaXRzX2h5cG90aGVzaXMsICIxIiA9ICJZZXMiLCAiMCIgPSAiTm8iKSkNCiAgDQpiaW5fbGFicyA8LSBjKCJCbGFtZSIsICJDaGVhdGluZyIsICJDcml0aWNpc20iLCAiRHJ1Z3MiLCAiSGVhbHRoIiwgIlJldmVuZ2UiLCAiU2V4IiwgIlNleHVhbGl6YXRpb24iLCAiVGhlZnQiLCANCiAgICAgICAgICAgICAgIldvcmsgRXRoaWMiKQ0KbmFtZXMoYmluX2xhYnMpIDwtIGMoImJsYW1lX2h5cCIsImNoZWF0X2h5cCIsICJjcml0aWNpc21faHlwIiwgImRydWdzX2h5cCIsICJoZWFsdGhfaHlwIiwgInJldmVuZ2VfaHlwIiwgInNleF9oeXAiLA0KICAgICAgICAgICAgICAgICAgICAgICJzZXh1YWxpemVfaHlwIiwgInRoZWZ0X2h5cCIsICJ3b3JrZXRoaWNfaHlwIikNCg0KIyBjb250aW51b3VzDQpTMl92aWduZXR0ZXNfY29udCA8LSBTMl9jb250ICU+JSANCiAgc2VsZWN0KGMoUmVzcG9uc2VJZCwgDQogICAgICAgICAgIHRoZWZ0X2h5cCwgZHJ1Z3NfaHlwLCBjaGVhdF9oeXAsIHNleF9oeXAsIHNleHVhbGl6ZV9oeXAsIGJsYW1lX2h5cCwgd29ya2V0aGljX2h5cCwgcmV2ZW5nZV9oeXAsDQogICAgICAgICAgIGNyaXRpY2lzbV9oeXAsIGhlYWx0aF9oeXAsDQogICAgICAgICAgIHRoZWZ0X29wcCwgZHJ1Z3Nfb3BwLCBjaGVhdF9vcHAsIHNleF9vcHAsIHNleHVhbGl6ZV9vcHAsIGJsYW1lX29wcCwgd29ya2V0aGljX29wcCwgcmV2ZW5nZV9vcHAsDQogICAgICAgICAgIGNyaXRpY2lzbV9vcHAsIGhlYWx0aF9vcHApKSAlPiUNCiAgbXV0YXRlKHRoZWZ0ID0gY2FzZV93aGVuKA0KICAgIHRoZWZ0X2h5cCA9PSAxIH4gIlllcyIsDQogICAgdGhlZnRfb3BwID09IDEgfiAiTm8gLSBPcHBvc2l0ZSIsDQogICAgKHRoZWZ0X2h5cCA9PSAwICYgdGhlZnRfb3BwID09IDApIH4gIk5vIC0gRXF1YWwiKSkgJT4lDQogIG11dGF0ZShkcnVncyA9IGNhc2Vfd2hlbigNCiAgICBkcnVnc19oeXAgPT0gMSB+ICJZZXMiLA0KICAgIGRydWdzX29wcCA9PSAxIH4gIk5vIC0gT3Bwb3NpdGUiLA0KICAgIChkcnVnc19oeXAgPT0gMCAmIGRydWdzX29wcCA9PSAwKSB+ICJObyAtIEVxdWFsIikpICU+JQ0KICBtdXRhdGUoY2hlYXQgPSBjYXNlX3doZW4oDQogICAgY2hlYXRfaHlwID09IDEgfiAiWWVzIiwNCiAgICBjaGVhdF9vcHAgPT0gMSB+ICJObyAtIE9wcG9zaXRlIiwNCiAgICAoY2hlYXRfaHlwID09IDAgJiBjaGVhdF9vcHAgPT0gMCkgfiAiTm8gLSBFcXVhbCIpKSAlPiUNCiAgbXV0YXRlKHNleCA9IGNhc2Vfd2hlbigNCiAgICBzZXhfaHlwID09IDEgfiAiWWVzIiwNCiAgICBzZXhfb3BwID09IDEgfiAiTm8gLSBPcHBvc2l0ZSIsDQogICAgKHNleF9oeXAgPT0gMCAmIHNleF9vcHAgPT0gMCkgfiAiTm8gLSBFcXVhbCIpKSAlPiUNCiAgbXV0YXRlKHNleHVhbGl6ZSA9IGNhc2Vfd2hlbigNCiAgICBzZXh1YWxpemVfaHlwID09IDEgfiAiWWVzIiwNCiAgICBzZXh1YWxpemVfb3BwID09IDEgfiAiTm8gLSBPcHBvc2l0ZSIsDQogICAgKHNleHVhbGl6ZV9oeXAgPT0gMCAmIHNleHVhbGl6ZV9vcHAgPT0gMCkgfiAiTm8gLSBFcXVhbCIpKSAlPiUNCiAgbXV0YXRlKGJsYW1lID0gY2FzZV93aGVuKA0KICAgIGJsYW1lX2h5cCA9PSAxIH4gIlllcyIsDQogICAgYmxhbWVfb3BwID09IDEgfiAiTm8gLSBPcHBvc2l0ZSIsDQogICAgKGJsYW1lX2h5cCA9PSAwICYgYmxhbWVfb3BwID09IDApIH4gIk5vIC0gRXF1YWwiKSkgJT4lDQogIG11dGF0ZSh3b3JrZXRoaWMgPSBjYXNlX3doZW4oDQogICAgd29ya2V0aGljX2h5cCA9PSAxIH4gIlllcyIsDQogICAgd29ya2V0aGljX29wcCA9PSAxIH4gIk5vIC0gT3Bwb3NpdGUiLA0KICAgICh3b3JrZXRoaWNfaHlwID09IDAgJiB3b3JrZXRoaWNfb3BwID09IDApIH4gIk5vIC0gRXF1YWwiKSkgJT4lDQogIG11dGF0ZShyZXZlbmdlID0gY2FzZV93aGVuKA0KICAgIHJldmVuZ2VfaHlwID09IDEgfiAiWWVzIiwNCiAgICByZXZlbmdlX29wcCA9PSAxIH4gIk5vIC0gT3Bwb3NpdGUiLA0KICAgIChyZXZlbmdlX2h5cCA9PSAwICYgcmV2ZW5nZV9vcHAgPT0gMCkgfiAiTm8gLSBFcXVhbCIpKSAlPiUNCiAgbXV0YXRlKGNyaXRpY2lzbSA9IGNhc2Vfd2hlbigNCiAgICBjcml0aWNpc21faHlwID09IDEgfiAiWWVzIiwNCiAgICBjcml0aWNpc21fb3BwID09IDEgfiAiTm8gLSBPcHBvc2l0ZSIsDQogICAgKGNyaXRpY2lzbV9oeXAgPT0gMCAmIGNyaXRpY2lzbV9vcHAgPT0gMCkgfiAiTm8gLSBFcXVhbCIpKSAlPiUNCiAgbXV0YXRlKGhlYWx0aCA9IGNhc2Vfd2hlbigNCiAgICBoZWFsdGhfaHlwID09IDEgfiAiWWVzIiwNCiAgICBoZWFsdGhfb3BwID09IDEgfiAiTm8gLSBPcHBvc2l0ZSIsDQogICAgKGhlYWx0aF9oeXAgPT0gMCAmIGhlYWx0aF9vcHAgPT0gMCkgfiAiTm8gLSBFcXVhbCIpKSAlPiUNCiAgZ3JvdXBfYnkoUmVzcG9uc2VJZCkgJT4lDQogIHBpdm90X2xvbmdlcihjb2xzID0gKGModGhlZnQsIGRydWdzLCBjaGVhdCwgc2V4LCBzZXh1YWxpemUsIGJsYW1lLCB3b3JrZXRoaWMsIHJldmVuZ2UsDQogICAgICAgICAgICAgICAgICAgICAgICAgY3JpdGljaXNtLCBoZWFsdGgpKSwNCiAgICAgICAgICAgICAgIG5hbWVzX3RvID0gInZpZ25ldHRlX25hbWUiLA0KICAgICAgICAgICAgICAgdmFsdWVzX3RvID0gImZpdHNfaHlwIikNCg0KY29udF9sYWJzIDwtIGMoIkJsYW1lIiwgIkNoZWF0aW5nIiwgIkNyaXRpY2lzbSIsICJEcnVncyIsICJIZWFsdGgiLCAiUmV2ZW5nZSIsICJTZXgiLCAiU2V4dWFsaXphdGlvbiIsICJUaGVmdCIsIA0KICAgICAgICAgICAgICAiV29yayBFdGhpYyIpDQpuYW1lcyhjb250X2xhYnMpIDwtIGMoImJsYW1lIiwiY2hlYXQiLCAiY3JpdGljaXNtIiwgImRydWdzIiwgImhlYWx0aCIsICJyZXZlbmdlIiwgInNleCIsDQogICAgICAgICAgICAgICAgICAgICAgInNleHVhbGl6ZSIsICJ0aGVmdCIsICJ3b3JrZXRoaWMiKQ0KYGBgDQojIyBCaW5hcnkgR29vZG5lc3Mgey50YWJzZXR9DQpgYGB7ciwgZmlnLndpZHRoID0gMTQsIGZpZy5oZWlnaHQgPSA5LCBvdXQud2lkdGggPSAiNzUlIiwgb3V0LmhlaWdodCA9ICI3NSUifQ0KcHJpbnQoUzJfYmluX3ZpZ3Bsb3QgPC0gZ2dwbG90KFMyX3ZpZ25ldHRlc19iaW4sIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFlcyh4ID0gYXMuY2hhcmFjdGVyKGZpdHNfaHlwKSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbCA9IGFzLmNoYXJhY3RlcihmaXRzX2h5cCkpKSArDQogIGdlb21fYmFyKCkgKw0KICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCIjOGIxNjE2IiwgIiNDRUEzMzUiKSwgbmFtZSA9ICJGaXRzIEh5cG90aGVzaXMiKSsNCiAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoLTAuMSwyMDAuMSksIGJyZWFrcyA9IGMoMCwgMjUsIDUwLCA3NSwgMTAwLCAxMjUsIDE1MCwgMTc1LCAyMDApKSArDQogIHlsYWIoIk51bWJlciBvZiBQYXJ0aWNpcGFudHNcbiIpICsNCiAgdGhlbWVfY2xhc3NpYygpICsNCiAgZmFjZXRfd3JhcCh+IHZpZ25ldHRlX25hbWUsIG5jb2wgPSA1LCBsYWJlbGxlciA9IGxhYmVsbGVyKHZpZ25ldHRlX25hbWUgPSBiaW5fbGFicykpICsNCiAgdGhlbWUoYXhpcy50aXRsZS54ID0gZWxlbWVudF9ibGFuaygpLCANCiAgICAgICAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxOCksDQogICAgICAgICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF9ibGFuaygpLCANCiAgICAgICAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTYpLA0KICAgICAgICAgICAgICBzdHJpcC50ZXh0LnggPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTYpLA0KICAgICAgICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAicmlnaHQiLA0KICAgICAgICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTgpLA0KICAgICAgICAgICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIHNpemUgPSAxNikpKQ0KDQpnZ3NhdmUoIlMyX2Jpbl92aWdwbG90LnBuZyIpDQpgYGANCiMjIENvbnRpbnVvdXMgVmlydHVvc2l0eSB7LnRhYnNldH0NCg0KDQpgYGB7ciwgZmlnLndpZHRoID0gMTQsIGZpZy5oZWlnaHQgPSA5LCBvdXQud2lkdGggPSAiNzUlIiwgb3V0LmhlaWdodCA9ICI3NSUifQ0KcHJpbnQoUzJfY29udF92aWdwbG90IDwtIGdncGxvdChTMl92aWduZXR0ZXNfY29udCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWVzKHggPSBhcy5jaGFyYWN0ZXIoZml0c19oeXApLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsID0gYXMuY2hhcmFjdGVyKGZpdHNfaHlwKSkpICsNCiAgZ2VvbV9iYXIoKSArDQogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoImdyZXkzMCIsIiM4YjE2MTYiLCAiI0NFQTMzNSIpLCBuYW1lID0gIkZpdHMgSHlwb3RoZXNpcyIpKw0KICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYygtMC4xLDE1MC4xKSwgYnJlYWtzID0gYygwLCAyNSwgNTAsIDc1LCAxMDAsIDEyNSwgMTUwKSkgKw0KICB5bGFiKCJOdW1iZXIgb2YgUGFydGljaXBhbnRzXG4iKSArDQogIHRoZW1lX2NsYXNzaWMoKSArDQogIGZhY2V0X3dyYXAofiB2aWduZXR0ZV9uYW1lLCBuY29sID0gNSwgbGFiZWxsZXIgPSBsYWJlbGxlcih2aWduZXR0ZV9uYW1lID0gY29udF9sYWJzKSkgKw0KICB0aGVtZShheGlzLnRpdGxlLnggPSBlbGVtZW50X2JsYW5rKCksIA0KICAgICAgICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE4KSwNCiAgICAgICAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X2JsYW5rKCksIA0KICAgICAgICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIHNpemUgPSAxNiksDQogICAgICAgICAgICAgIHN0cmlwLnRleHQueCA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIHNpemUgPSAxNiksDQogICAgICAgICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJyaWdodCIsDQogICAgICAgICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIHNpemUgPSAxOCksDQogICAgICAgICAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDE2KSkpDQoNCmdnc2F2ZSgiUzJfY29udF92aWdwbG90LnBuZyIpDQpgYGANCg0KIyBSb2J1c3RuZXNzIFBsb3RzIHsudGFic2V0fQ0KSGVyZSwgd2UgaW52ZXN0aWdhdGUgdGhlIG51bWJlciBvZiBwYXJ0aWNpcGFudHMgbWF0Y2hpbmcgcHJlZGljdGVkIGVmZmVjdHMgYnkgZGVtb2dyYXBoaWNzIGluIG9yZGVyIHRvIGNhdGFsb2cgdGhlIGdlbmVyYWxpdHkgKG9yIGxhY2sgdGhlcmVvZikgb2YgdGhlc2UgZWZmZWN0cyBhY3Jvc3MgbGV2ZWxzIG9mIHZhcmlvdXMgdGhlIGRlbW9ncmFwaGljcyB0aGF0IHdlIGNvbGxlY3RlZC4NCmBgYHtyfQ0KIyBjcmVhdGUgeWVzL25vIHZhcmlhYmxlIGZvciBzaW1wbGUgaHlwb3RoZXNlcw0KUzJfYmluIDwtIFMyX2JpbiAlPiUNCiAgbXV0YXRlKGZpdHNfaHlwID0gaWZfZWxzZShmaXRzX2h5cG90aGVzaXMgPT0gMSwgIlllcyIsICJObyIpKQ0KDQojIGNyZWF0ZSB5ZXMvbm8gdmFyaWFibGUgZm9yIHNpbXBsZSBoeXBvdGhlc2VzDQpTMl9jb250IDwtIFMyX2NvbnQgJT4lDQogIG11dGF0ZShmaXRzX2h5cCA9IGlmX2Vsc2UoZml0c19oeXBvdGhlc2lzID09IDEsICJZZXMiLCAiTm8iKSkNCmBgYA0KDQojIyBFZHVjYXRpb24gey50YWJzZXR9DQoNCiMjIyBCaW5hcnkgR29vZG5lc3MNCmBgYHtyLCBmaWcud2lkdGggPSAxNCwgZmlnLmhlaWdodCA9IDksIG91dC53aWR0aCA9ICI3NSUiLCBvdXQuaGVpZ2h0ID0gIjc1JSJ9DQpwcmludChTMl9iaW5fZWR1YyA8LSBnZ3Bsb3QoUzJfYmluLCBhZXMoeCA9IGZpdHNfaHlwKSkgKw0KICBnZW9tX2JhcihmaWxsID0gImdyZXkzMCIpICsNCiAgeGxhYigiXG5NYXRjaGVkIFByZWRpY3RlZCBQYXR0ZXJuIikgKw0KICB5bGFiKCJOdW1iZXIgb2YgUGFydGljaXBhbnRzXG4iKSArDQogIHRoZW1lX2NsYXNzaWMoKSArDQogIGZhY2V0X3dyYXAofkVkdWNhdGlvbikgKw0KICB0aGVtZShheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE4KSwgDQogICAgICAgICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTgpLA0KICAgICAgICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIHNpemUgPSAxNiksIA0KICAgICAgICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIHNpemUgPSAxNiksDQogICAgICAgICAgICAgIHN0cmlwLnRleHQueCA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIHNpemUgPSAxMiksDQogICAgICAgICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJyaWdodCIsDQogICAgICAgICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIHNpemUgPSAxOCksDQogICAgICAgICAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDE2KSkpDQpgYGANCiMjIyBDb250aW51b3VzIFZpcnR1b3NpdHkNCmBgYHtyLCBmaWcud2lkdGggPSAxNCwgZmlnLmhlaWdodCA9IDksIG91dC53aWR0aCA9ICI3NSUiLCBvdXQuaGVpZ2h0ID0gIjc1JSJ9DQpwcmludChTMl9jb250X2VkdWMgPC0gZ2dwbG90KFMyX2NvbnQsIGFlcyh4ID0gZml0c19oeXApKSArDQogIGdlb21fYmFyKGZpbGwgPSAiZ3JleTMwIikgKw0KICB4bGFiKCJcbk1hdGNoZWQgUHJlZGljdGVkIFBhdHRlcm4iKSArDQogIHlsYWIoIk51bWJlciBvZiBQYXJ0aWNpcGFudHNcbiIpICsNCiAgdGhlbWVfY2xhc3NpYygpICsNCiAgZmFjZXRfd3JhcCh+RWR1Y2F0aW9uKSArDQogIHRoZW1lKGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTgpLCANCiAgICAgICAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxOCksDQogICAgICAgICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDE2KSwgDQogICAgICAgICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDE2KSwNCiAgICAgICAgICAgICAgc3RyaXAudGV4dC54ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDEyKSwNCiAgICAgICAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gInJpZ2h0IiwNCiAgICAgICAgICAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDE4KSwNCiAgICAgICAgICAgICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTYpKSkNCmBgYA0KDQojIyBQb2xpdGljYWwgUGFydHkgey50YWJzZXR9DQoNCiMjIyBCaW5hcnkgR29vZG5lc3MNCmBgYHtyLCBmaWcud2lkdGggPSAxNCwgZmlnLmhlaWdodCA9IDksIG91dC53aWR0aCA9ICI3NSUiLCBvdXQuaGVpZ2h0ID0gIjc1JSJ9DQpwcmludChTMl9iaW5fcG9sIDwtIGdncGxvdChTMl9iaW4sIGFlcyh4ID0gZml0c19oeXApKSArDQogIGdlb21fYmFyKGZpbGwgPSAiZ3JleTMwIikgKw0KICB4bGFiKCJcbk1hdGNoZWQgUHJlZGljdGVkIFBhdHRlcm4iKSArDQogIHlsYWIoIk51bWJlciBvZiBQYXJ0aWNpcGFudHNcbiIpICsNCiAgdGhlbWVfY2xhc3NpYygpICsNCiAgZmFjZXRfd3JhcCh+UG9saXRpY2FsUGFydHkpICsNCiAgdGhlbWUoYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxOCksIA0KICAgICAgICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE4KSwNCiAgICAgICAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTYpLCANCiAgICAgICAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTYpLA0KICAgICAgICAgICAgICBzdHJpcC50ZXh0LnggPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTIpLA0KICAgICAgICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAicmlnaHQiLA0KICAgICAgICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTgpLA0KICAgICAgICAgICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIHNpemUgPSAxNikpKQ0KYGBgDQojIyMgQ29udGludW91cyBWaXJ0dW9zaXR5DQpgYGB7ciwgZmlnLndpZHRoID0gMTQsIGZpZy5oZWlnaHQgPSA5LCBvdXQud2lkdGggPSAiNzUlIiwgb3V0LmhlaWdodCA9ICI3NSUifQ0KcHJpbnQoUzJfY29udF9wb2wgPC0gZ2dwbG90KFMyX2NvbnQsIGFlcyh4ID0gZml0c19oeXApKSArDQogIGdlb21fYmFyKGZpbGwgPSAiZ3JleTMwIikgKw0KICB4bGFiKCJcbk1hdGNoZWQgUHJlZGljdGVkIFBhdHRlcm4iKSArDQogIHlsYWIoIk51bWJlciBvZiBQYXJ0aWNpcGFudHNcbiIpICsNCiAgdGhlbWVfY2xhc3NpYygpICsNCiAgZmFjZXRfd3JhcCh+UG9saXRpY2FsUGFydHkpICsNCiAgdGhlbWUoYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxOCksIA0KICAgICAgICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE4KSwNCiAgICAgICAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTYpLCANCiAgICAgICAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTYpLA0KICAgICAgICAgICAgICBzdHJpcC50ZXh0LnggPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTIpLA0KICAgICAgICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAicmlnaHQiLA0KICAgICAgICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTgpLA0KICAgICAgICAgICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIHNpemUgPSAxNikpKQ0KYGBgDQoNCiMjIFJlbGlnaW9zaXR5IHsudGFic2V0fQ0KDQojIyMgQmluYXJ5IEdvb2RuZXNzDQpgYGB7ciwgZmlnLndpZHRoID0gMTQsIGZpZy5oZWlnaHQgPSA5LCBvdXQud2lkdGggPSAiNzUlIiwgb3V0LmhlaWdodCA9ICI3NSUifQ0KcHJpbnQoUzJfYmluX3JlbGlnIDwtIGdncGxvdChTMl9iaW4sIGFlcyh4ID0gZml0c19oeXApKSArDQogIGdlb21fYmFyKGZpbGwgPSAiZ3JleTMwIikgKw0KICB4bGFiKCJcbk1hdGNoZWQgUHJlZGljdGVkIFBhdHRlcm4iKSArDQogIHlsYWIoIk51bWJlciBvZiBQYXJ0aWNpcGFudHNcbiIpICsNCiAgdGhlbWVfY2xhc3NpYygpICsNCiAgZmFjZXRfd3JhcCh+UmVsaWdpb3VzKSArDQogIHRoZW1lKGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTgpLCANCiAgICAgICAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxOCksDQogICAgICAgICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDE2KSwgDQogICAgICAgICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDE2KSwNCiAgICAgICAgICAgICAgc3RyaXAudGV4dC54ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDEyKSwNCiAgICAgICAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gInJpZ2h0IiwNCiAgICAgICAgICAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDE4KSwNCiAgICAgICAgICAgICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTYpKSkNCmBgYA0KIyMjIENvbnRpbnVvdXMgVmlydHVvc2l0eQ0KYGBge3IsIGZpZy53aWR0aCA9IDE0LCBmaWcuaGVpZ2h0ID0gOSwgb3V0LndpZHRoID0gIjc1JSIsIG91dC5oZWlnaHQgPSAiNzUlIn0NCnByaW50KFMyX2NvbnRfcmVsaWcgPC0gZ2dwbG90KFMyX2NvbnQsIGFlcyh4ID0gZml0c19oeXApKSArDQogIGdlb21fYmFyKGZpbGwgPSAiZ3JleTMwIikgKw0KICB4bGFiKCJcbk1hdGNoZWQgUHJlZGljdGVkIFBhdHRlcm4iKSArDQogIHlsYWIoIk51bWJlciBvZiBQYXJ0aWNpcGFudHNcbiIpICsNCiAgdGhlbWVfY2xhc3NpYygpICsNCiAgZmFjZXRfd3JhcCh+UmVsaWdpb3VzKSArDQogIHRoZW1lKGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTgpLCANCiAgICAgICAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxOCksDQogICAgICAgICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDE2KSwgDQogICAgICAgICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDE2KSwNCiAgICAgICAgICAgICAgc3RyaXAudGV4dC54ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDEyKSwNCiAgICAgICAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gInJpZ2h0IiwNCiAgICAgICAgICAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDE4KSwNCiAgICAgICAgICAgICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTYpKSkNCmBgYA0KDQojIyBVcmJhbiB2cyBSdXJhbCB7LnRhYnNldH0NCg0KIyMjIEJpbmFyeSBHb29kbmVzcw0KYGBge3IsIGZpZy53aWR0aCA9IDE0LCBmaWcuaGVpZ2h0ID0gOSwgb3V0LndpZHRoID0gIjc1JSIsIG91dC5oZWlnaHQgPSAiNzUlIn0NCnByaW50KFMyX2Jpbl91cmIgPC0gZ2dwbG90KFMyX2JpbiwgYWVzKHggPSBmaXRzX2h5cCkpICsNCiAgZ2VvbV9iYXIoZmlsbCA9ICJncmV5MzAiKSArDQogIHhsYWIoIlxuTWF0Y2hlZCBQcmVkaWN0ZWQgUGF0dGVybiIpICsNCiAgeWxhYigiTnVtYmVyIG9mIFBhcnRpY2lwYW50c1xuIikgKw0KICB0aGVtZV9jbGFzc2ljKCkgKw0KICBmYWNldF93cmFwKH5MaXZpbmdBcmVhKSArDQogIHRoZW1lKGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTgpLCANCiAgICAgICAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxOCksDQogICAgICAgICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDE2KSwgDQogICAgICAgICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDE2KSwNCiAgICAgICAgICAgICAgc3RyaXAudGV4dC54ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDEyKSwNCiAgICAgICAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gInJpZ2h0IiwNCiAgICAgICAgICAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDE4KSwNCiAgICAgICAgICAgICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTYpKSkNCmBgYA0KIyMjIENvbnRpbnVvdXMgVmlydHVvc2l0eQ0KYGBge3IsIGZpZy53aWR0aCA9IDE0LCBmaWcuaGVpZ2h0ID0gOSwgb3V0LndpZHRoID0gIjc1JSIsIG91dC5oZWlnaHQgPSAiNzUlIn0NCnByaW50KFMyX2NvbnRfdXJiYW4gPC0gZ2dwbG90KFMyX2NvbnQsIGFlcyh4ID0gZml0c19oeXApKSArDQogIGdlb21fYmFyKGZpbGwgPSAiZ3JleTMwIikgKw0KICB4bGFiKCJcbk1hdGNoZWQgUHJlZGljdGVkIFBhdHRlcm4iKSArDQogIHlsYWIoIk51bWJlciBvZiBQYXJ0aWNpcGFudHNcbiIpICsNCiAgdGhlbWVfY2xhc3NpYygpICsNCiAgZmFjZXRfd3JhcCh+TGl2aW5nQXJlYSkgKw0KICB0aGVtZShheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE4KSwgDQogICAgICAgICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTgpLA0KICAgICAgICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIHNpemUgPSAxNiksIA0KICAgICAgICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIHNpemUgPSAxNiksDQogICAgICAgICAgICAgIHN0cmlwLnRleHQueCA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIHNpemUgPSAxMiksDQogICAgICAgICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJyaWdodCIsDQogICAgICAgICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIHNpemUgPSAxOCksDQogICAgICAgICAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDE2KSkpDQpgYGANCg0KIyMgR2VuZGVyIHsudGFic2V0fQ0KDQojIyMgQmluYXJ5IEdvb2RuZXNzDQpgYGB7ciwgZmlnLndpZHRoID0gMTQsIGZpZy5oZWlnaHQgPSA5LCBvdXQud2lkdGggPSAiNzUlIiwgb3V0LmhlaWdodCA9ICI3NSUifQ0KcHJpbnQoUzJfYmluX2dlbmRlciA8LSBnZ3Bsb3QoUzJfYmluLCBhZXMoeCA9IGZpdHNfaHlwKSkgKw0KICBnZW9tX2JhcihmaWxsID0gImdyZXkzMCIpICsNCiAgeGxhYigiXG5NYXRjaGVkIFByZWRpY3RlZCBQYXR0ZXJuIikgKw0KICB5bGFiKCJOdW1iZXIgb2YgUGFydGljaXBhbnRzXG4iKSArDQogIHRoZW1lX2NsYXNzaWMoKSArDQogIGZhY2V0X3dyYXAofkdlbmRlcikgKw0KICB0aGVtZShheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE4KSwgDQogICAgICAgICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTgpLA0KICAgICAgICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIHNpemUgPSAxNiksIA0KICAgICAgICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIHNpemUgPSAxNiksDQogICAgICAgICAgICAgIHN0cmlwLnRleHQueCA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIHNpemUgPSAxMiksDQogICAgICAgICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJyaWdodCIsDQogICAgICAgICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIHNpemUgPSAxOCksDQogICAgICAgICAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDE2KSkpDQpgYGANCiMjIyBDb250aW51b3VzIFZpcnR1b3NpdHkNCmBgYHtyLCBmaWcud2lkdGggPSAxNCwgZmlnLmhlaWdodCA9IDksIG91dC53aWR0aCA9ICI3NSUiLCBvdXQuaGVpZ2h0ID0gIjc1JSJ9DQpwcmludChTMl9jb250X2dlbmRlciA8LSBnZ3Bsb3QoUzJfY29udCwgYWVzKHggPSBmaXRzX2h5cCkpICsNCiAgZ2VvbV9iYXIoZmlsbCA9ICJncmV5MzAiKSArDQogIHhsYWIoIlxuTWF0Y2hlZCBQcmVkaWN0ZWQgUGF0dGVybiIpICsNCiAgeWxhYigiTnVtYmVyIG9mIFBhcnRpY2lwYW50c1xuIikgKw0KICB0aGVtZV9jbGFzc2ljKCkgKw0KICBmYWNldF93cmFwKH5HZW5kZXIpICsNCiAgdGhlbWUoYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxOCksIA0KICAgICAgICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE4KSwNCiAgICAgICAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTYpLCANCiAgICAgICAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTYpLA0KICAgICAgICAgICAgICBzdHJpcC50ZXh0LnggPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTIpLA0KICAgICAgICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAicmlnaHQiLA0KICAgICAgICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTgpLA0KICAgICAgICAgICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIHNpemUgPSAxNikpKQ0KYGBgDQoNCiMjIFJhY2Ugey50YWJzZXR9DQpgYGB7cn0NCiMgbWFrZSByYWNlIG9uZSB2YXJpYWJsZQ0KUzJfYmluIDwtIFMyX2JpbiAlPiUNCiAgbXV0YXRlKFJhY2UgPSBjb2FsZXNjZShSYWNlRXRobmljaXR5XzEsIFJhY2VFdGhuaWNpdHlfMiwgUmFjZUV0aG5pY2l0eV8zLCBSYWNlRXRobmljaXR5XzQsIA0KICAgICAgICAgICAgICAgICAgICAgICAgIFJhY2VFdGhuaWNpdHlfNSwgUmFjZUV0aG5pY2l0eV82LCBSYWNlRXRobmljaXR5XzcsIFJhY2VFdGhuaWNpdHlfOCkpDQoNClMyX2NvbnQgPC0gUzJfY29udCAlPiUNCiAgbXV0YXRlKFJhY2UgPSBjb2FsZXNjZShSYWNlRXRobmljaXR5XzEsIFJhY2VFdGhuaWNpdHlfMiwgUmFjZUV0aG5pY2l0eV8zLCBSYWNlRXRobmljaXR5XzQsIA0KICAgICAgICAgICAgICAgICAgICAgICAgIFJhY2VFdGhuaWNpdHlfNSwgUmFjZUV0aG5pY2l0eV82LCBSYWNlRXRobmljaXR5XzcsIFJhY2VFdGhuaWNpdHlfOCkpDQpgYGANCg0KIyMjIEJpbmFyeSBHb29kbmVzcw0KYGBge3IsIGZpZy53aWR0aCA9IDE0LCBmaWcuaGVpZ2h0ID0gOSwgb3V0LndpZHRoID0gIjc1JSIsIG91dC5oZWlnaHQgPSAiNzUlIn0NCnByaW50KFMyX2Jpbl9yYWNlIDwtIGdncGxvdChTMl9iaW4sIGFlcyh4ID0gZml0c19oeXApKSArDQogIGdlb21fYmFyKGZpbGwgPSAiZ3JleTMwIikgKw0KICB4bGFiKCJcbk1hdGNoZWQgUHJlZGljdGVkIFBhdHRlcm4iKSArDQogIHlsYWIoIk51bWJlciBvZiBQYXJ0aWNpcGFudHNcbiIpICsNCiAgdGhlbWVfY2xhc3NpYygpICsNCiAgZmFjZXRfd3JhcCh+UmFjZSkgKw0KICB0aGVtZShheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE4KSwgDQogICAgICAgICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTgpLA0KICAgICAgICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIHNpemUgPSAxNiksIA0KICAgICAgICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIHNpemUgPSAxNiksDQogICAgICAgICAgICAgIHN0cmlwLnRleHQueCA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIHNpemUgPSAxMiksDQogICAgICAgICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJyaWdodCIsDQogICAgICAgICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIHNpemUgPSAxOCksDQogICAgICAgICAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDE2KSkpDQpgYGANCiMjIyBDb250aW51b3VzIFZpcnR1b3NpdHkNCmBgYHtyLCBmaWcud2lkdGggPSAxNCwgZmlnLmhlaWdodCA9IDksIG91dC53aWR0aCA9ICI3NSUiLCBvdXQuaGVpZ2h0ID0gIjc1JSJ9DQpwcmludChTMl9jb250X3JhY2UgPC0gZ2dwbG90KFMyX2NvbnQsIGFlcyh4ID0gZml0c19oeXApKSArDQogIGdlb21fYmFyKGZpbGwgPSAiZ3JleTMwIikgKw0KICB4bGFiKCJcbk1hdGNoZWQgUHJlZGljdGVkIFBhdHRlcm4iKSArDQogIHlsYWIoIk51bWJlciBvZiBQYXJ0aWNpcGFudHNcbiIpICsNCiAgdGhlbWVfY2xhc3NpYygpICsNCiAgZmFjZXRfd3JhcCh+UmFjZSkgKw0KICB0aGVtZShheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE4KSwgDQogICAgICAgICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTgpLA0KICAgICAgICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIHNpemUgPSAxNiksIA0KICAgICAgICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIHNpemUgPSAxNiksDQogICAgICAgICAgICAgIHN0cmlwLnRleHQueCA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIHNpemUgPSAxMiksDQogICAgICAgICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJyaWdodCIsDQogICAgICAgICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIHNpemUgPSAxOCksDQogICAgICAgICAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDE2KSkpDQpgYGANCg0K