As pre-registered, we sought to collect data to attain 280 analyzable responses in total (i.e., 140 participants who passed attention checks for each between-subjects condition).


After two waves of data collection, we were only able to recruit N = 256. Applying the pre-registered exclusion criterion led to N = 244 (n = 123 for the “simple effect” and n = 121 for the “complex effect”). However, we did not resample to reach our pre-registered Ns because these analyzable Ns still yielded more than 90% power for our focal inferential tests.


Data Cleaning

Before data were loaded into R (below), the following changes were made:

  1. Raw variable names were slightly adjusted to create more intuitive labels than what was originally specified in Qualtrics.

  2. Participants were removed if they did not finish the entire survey.

  3. All other identifying information was removed (e.g., IP addresses, longitude/latitude, etc.).


Loading Data/Packages

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


options(scipen = 99) # turns off scientific notation
# packages should be loaded in the following order to avoid function conflicts
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
library(rstatix) # for wilcoxon test effect sizes

Data Manipulation

Data Separation/Recombining

Data were separated into two distinct data sets (for each between-subjects condition). Then, a between-subjects variable was created within each dataset. Last, both datasets were recombined.


# creates dataset w/ people who read about simple psych experiment
simple_stat <- Stat_Cog_Researchers_OSF %>%
  filter(Simple_Attn_Ck != "NA")

# creates dataset w/ people who read about complex psych experiment
complex_stat <- Stat_Cog_Researchers_OSF %>%
  filter(Complex_Attn_Ck != "NA")

# create between-subjects condition variable
simple_stat$BSs_cond <- rep("Simple", nrow(simple_stat))
complex_stat$BSs_cond <- rep("Complex", nrow(complex_stat))

# recombine between-subjects data
stat_res_all <- rbind(simple_stat, complex_stat)

stat_res_all$BSs_cond <- as.factor(stat_res_all$BSs_cond)
stat_res_all$BSs_cond <- ordered(stat_res_all$BSs_cond, levels = c("Simple", "Complex"))

Cleaning Data

stat_res_clean <- stat_res_all %>%
  filter(Finished == 1) %>% # finished whole survey
  filter(Complex_Attn_Ck == 1 | Simple_Attn_Ck == 1) # passed attn/comp check

Get Demographics for Clean Data

# gender
stat_res_clean %>% 
  group_by(Gender) %>% 
  dplyr::summarize(gender = n()) # 0 = female; 1 = male; 2 = non-binary; 3 = other

# ethnicity
stat_res_clean %>% 
  group_by(Ethnic) %>% 
  dplyr::summarize(ethnicity = n()) # 0 = white; 2 = black; 2 = american indian / alaskan native; 3 = asian; 4 = native hawaiian / pacific islander; 5 = other

# age
mean(stat_res_clean$Age)
[1] 33.09426
sd(stat_res_clean$Age)
[1] 11.34074

Creating Analysis Variables

# Main DVs
# create intuitive var names that collapse across between-subj conditions

# e.g., Simple_Q_Prop_0_Response = Simple Design / Empirical Q Prop Estimate / Anchor started at 0

stat_res_clean$Emp_Prop_Est  <- rowSums(stat_res_clean[, c("Simple_Q_Prop_0_Response", 
                                                           "Simple_Q_Prop_50_Response",
                                                           "Simple_Q_Prop_100_Response",
                                                           "Complex_Q_Prop_0_Response",
                                                           "Complex_Q_Prop_50_Response",
                                                           "Complex_Q_Prop_100_Response")], na.rm = T)
stat_res_clean$Theory_Prop_Est  <- rowSums(stat_res_clean[, c("Simple_T_Prop_0_Response", 
                                                           "Simple_T_Prop_50_Response",
                                                           "Simple_T_Prop_100_Response",
                                                           "Complex_T_Prop_0_Response",
                                                           "Complex_T_Prop_50_Response",
                                                           "Complex_T_Prop_100_Response")], na.rm = T)

stat_res_clean$Emp_TF_Count  <- rowSums(stat_res_clean[, c("Simple_Q_TF_Response_1",
                                                       "Simple_Q_TF_Response_2",
                                                       "Simple_Q_TF_Response_3",
                                                       "Simple_Q_TF_Response_4",
                                                       "Simple_Q_TF_Response_5",
                                                       "Simple_Q_TF_Response_6",
                                                       "Complex_Q_TF_Response_1",
                                                       "Complex_Q_TF_Response_2",
                                                       "Complex_Q_TF_Response_3",
                                                       "Complex_Q_TF_Response_4",
                                                       "Complex_Q_TF_Response_5",
                                                       "Complex_Q_TF_Response_6")], na.rm = T)
stat_res_clean$Theory_TF_Count  <- rowSums(stat_res_clean[, c("Simple_T_TF_Response_1",
                                                       "Simple_T_TF_Response_2",
                                                       "Simple_T_TF_Response_3",
                                                       "Simple_T_TF_Response_4",
                                                       "Simple_T_TF_Response_5",
                                                       "Simple_T_TF_Response_6",
                                                       "Complex_T_TF_Response_1",
                                                       "Complex_T_TF_Response_2",
                                                       "Complex_T_TF_Response_3",
                                                       "Complex_T_TF_Response_4",
                                                       "Complex_T_TF_Response_5",
                                                       "Complex_T_TF_Response_6")], na.rm = T)


# Pre-registered Cut-off Scores
# i.e., whether prop estimates are at 51% or higher
stat_res_clean <- stat_res_clean %>%
  mutate(Emp_Prop_Cutoff = case_when(
    Emp_Prop_Est >= 51 ~ "Simple Majority or Greater",
    Emp_Prop_Est < 51 ~ "Less than Simple Majority")) %>%
  mutate(Theory_Prop_Cutoff = case_when(
    Theory_Prop_Est >= 51 ~ "Simple Majority or Greater",
    Theory_Prop_Est < 51 ~ "Less than Simple Majority"))

# select only relevant data
stat_res_clean <- stat_res_clean %>%
  select(ResponseId,
         BSs_cond,
         Emp_Prop_Est:Theory_Prop_Cutoff,
         Design_Inf,
         Academia:`Political Beliefs_3`)

Descriptive Stats

Proportion Estimates

Empirical Distribution

describeBy(stat_res_clean$Emp_Prop_Est, list(stat_res_clean$BSs_cond), mat = T)

Empirical Cut-Off

table(stat_res_clean$BSs_cond, stat_res_clean$Emp_Prop_Cutoff)
         
          Less than Simple Majority Simple Majority or Greater
  Simple                         33                         90
  Complex                        24                         97

Theoretical Distribution

describeBy(stat_res_clean$Theory_Prop_Est, list(stat_res_clean$BSs_cond), mat = T)

Theoretical Cut-Off

table(stat_res_clean$BSs_cond, stat_res_clean$Theory_Prop_Cutoff)
         
          Less than Simple Majority Simple Majority or Greater
  Simple                         24                         99
  Complex                        12                        109

T/F Counts

Empirical T/F Counts

table(stat_res_clean$BSs_cond, stat_res_clean$Emp_TF_Count) # number of times t/f was marked true by a participant (out of 6 t/f statements where all statements were technically false; see OSF Qualtrics file)
         
           0  1  2  3  4  5  6
  Simple  34 37 29  8  9  6  0
  Complex 28 22 42 17  8  3  1

Theoretical T/F Counts

table(stat_res_clean$BSs_cond, stat_res_clean$Theory_TF_Count) # number of times t/f was marked true by a participant (out of 6 t/f statements where all statements were technically false; see OSF Qualtrics file)
         
           0  1  2  3  4  5  6
  Simple  13 12 36 29 22  9  2
  Complex 11 14 32 36 16  9  3

Plotting Proportion Estimates

Empirical Estimates

print(emp_prop_plot <- ggplot(stat_res_clean, aes(Emp_Prop_Est)) +
  geom_histogram(binwidth = 1) +
  coord_cartesian(ylim = c(0,50), xlim = c(0,100)) +
        facet_wrap(~BSs_cond, nrow = 2) +
        geom_vline(xintercept = 50, linetype = "dashed", color = "black") +
        theme(legend.position = "right") +
        theme_classic() +
        xlab("Empirical Proportion Estimates") +
        ylab("Participant Count") + 
        theme(axis.title.x = element_text(size = 14), 
              axis.title.y = element_text(size = 14),
              axis.text.x = element_text(color = "black", size = 12), 
              axis.text.y = element_text(color = "black", size = 12),
              legend.position = "right",
              legend.title = element_text(color = "black", size = 14),
              legend.text = element_text(color = "black", size = 12)))

Theoretical Estimates

print(theory_prop_plot <- ggplot(stat_res_clean, aes(Theory_Prop_Est)) +
  geom_histogram(binwidth = 1) +
  coord_cartesian(ylim = c(0,50), xlim = c(0,100)) +
        facet_wrap(~BSs_cond, nrow = 2) +
        geom_vline(xintercept = 50, linetype = "dashed", color = "black") +
        theme(legend.position = "right") +
        theme_classic() +
        xlab("Theoretical Proportion Estimates") +
        ylab("Participant Count") + 
        theme(axis.title.x = element_text(size = 14), 
              axis.title.y = element_text(size = 14),
              axis.text.x = element_text(color = "black", size = 12), 
              axis.text.y = element_text(color = "black", size = 12),
              legend.position = "right",
              legend.title = element_text(color = "black", size = 14),
              legend.text = element_text(color = "black", size = 12)))

Binomial Tests

Simple

Empirical Proportion

# using estimates from descriptive stats section
binom.test(x = 90, n = 123, p = 0.5, alternative = "greater", conf.level = 0.90)

    Exact binomial test

data:  90 and 123
number of successes = 90, number of trials = 123, p-value = 0.0000001372
alternative hypothesis: true probability of success is greater than 0.5
90 percent confidence interval:
 0.673807 1.000000
sample estimates:
probability of success 
             0.7317073 

Theoretical Proportion

# using estimates from descriptive stats section
binom.test(x = 99, n = 123, p = 0.5, alternative = "greater", conf.level = 0.90)

    Exact binomial test

data:  99 and 123
number of successes = 99, number of trials = 123, p-value = 0.000000000002583
alternative hypothesis: true probability of success is greater than 0.5
90 percent confidence interval:
 0.7513548 1.0000000
sample estimates:
probability of success 
              0.804878 

Complex

Empirical Proportion

# using estimates from descriptive stats section
binom.test(x = 97, n = 121, p = 0.5, alternative = "greater", conf.level = 0.90)

    Exact binomial test

data:  97 and 121
number of successes = 97, number of trials = 121, p-value = 0.000000000006721
alternative hypothesis: true probability of success is greater than 0.5
90 percent confidence interval:
 0.7473858 1.0000000
sample estimates:
probability of success 
             0.8016529 

Theoretical Proportion

# using estimates from descriptive stats section
binom.test(x = 109, n = 121, p = 0.5, alternative = "greater", conf.level = 0.90)

    Exact binomial test

data:  109 and 121
number of successes = 109, number of trials = 121, p-value < 0.00000000000000022
alternative hypothesis: true probability of success is greater than 0.5
90 percent confidence interval:
 0.8565791 1.0000000
sample estimates:
probability of success 
             0.9008264 

Additional Analyses

Design Inference

table(stat_res_clean$BSs_cond, stat_res_clean$Design_Inf)
         
           1  2  3
  Simple  23 38 62
  Complex 22 35 64
# "In your opinion, what kinds of experimental designs are necessary to make inferences about person-level psychological effects?
# 1 = between-subj; #2 = within-subj; #3 = either

Research Experience

Breakdown

stat_res_clean <- stat_res_clean %>%
  mutate(Research_Role = case_when(
    Research_Exp == 4 ~ "Undergrad",
    Research_Exp == 5 ~ "Post-bac/RA/Lab manager",
    Research_Exp == 6 ~ "Master's student",
    Research_Exp == 7 ~ "PhD student",
    Research_Exp == 8 ~ "Post-doc",
    Research_Exp == 9 ~ "Professor",
    TRUE ~ "Other"))

stat_res_clean$Research_Role <- as.factor(stat_res_clean$Research_Role)
stat_res_clean$Research_Role <- ordered(stat_res_clean$Research_Role, 
                                        levels = c("Other",
                                                   "Undergrad",
                                                   "Post-bac/RA/Lab manager",
                                                   "Master's student",
                                                   "PhD student",
                                                   "Post-doc",
                                                   "Professor"))

table(stat_res_clean$BSs_cond, stat_res_clean$Research_Role)
         
          Other Undergrad Post-bac/RA/Lab manager Master's student PhD student Post-doc Professor
  Simple      5         2                       7               10          53        6        40
  Complex     8         5                      10                8          43       11        36

Empirical Proportion Plot

print(emp_prop_plot_researchexp <- ggplot(stat_res_clean, aes(Emp_Prop_Est,
                                                              fill = Research_Role)) +
  geom_histogram(binwidth = 1) +
  coord_cartesian(ylim = c(0,50), xlim = c(0,100)) +
        facet_wrap(~BSs_cond, nrow = 2) +
        geom_vline(xintercept = 50, linetype = "dashed", color = "black") +
        theme(legend.position = "right") +
        scale_fill_grey() +
        theme_classic() +
        xlab("Empirical Proportion Estimates") +
        ylab("Participant Count") + 
        theme(axis.title.x = element_text(size = 14), 
              axis.title.y = element_text(size = 14),
              axis.text.x = element_text(color = "black", size = 12), 
              axis.text.y = element_text(color = "black", size = 12),
              legend.position = "right",
              legend.title = element_text(color = "black", size = 14),
              legend.text = element_text(color = "black", size = 12)))

Theoretical Proportion Plot

print(theory_prop_plot_researchexp <- ggplot(stat_res_clean, aes(Theory_Prop_Est,
                                                              fill = Research_Role)) +
  geom_histogram(binwidth = 1) +
  coord_cartesian(ylim = c(0,50), xlim = c(0,100)) +
        facet_wrap(~BSs_cond, nrow = 2) +
        geom_vline(xintercept = 50, linetype = "dashed", color = "black") +
        scale_fill_grey() +
        theme(legend.position = "right") +
        theme_classic() +
        xlab("Theoertical Proportion Estimates") +
        ylab("Participant Count") + 
        theme(axis.title.x = element_text(size = 14), 
              axis.title.y = element_text(size = 14),
              axis.text.x = element_text(color = "black", size = 12), 
              axis.text.y = element_text(color = "black", size = 12),
              legend.position = "right",
              legend.title = element_text(color = "black", size = 14),
              legend.text = element_text(color = "black", size = 12)))

Teaching Experience

Breakdown

stat_res_clean <- stat_res_clean %>%
  mutate(Teaching_Role = case_when(
    `Stats/Meth` == 0 ~ "None",
    `Stats/Meth` == 1 ~ "Research Methods",
    `Stats/Meth` == 2 ~ "Statistics",
    `Stats/Meth` == 3 ~ "Both Research Methods & Statistics"))

stat_res_clean$Teaching_Role <- as.factor(stat_res_clean$Teaching_Role)
stat_res_clean$Teaching_Role <- ordered(stat_res_clean$Teaching_Role, 
                                        levels = c("None",
                                                   "Research Methods",
                                                   "Statistics",
                                                   "Both Research Methods & Statistics"))

table(stat_res_clean$BSs_cond, stat_res_clean$Teaching_Role)
         
          None Research Methods Statistics Both Research Methods & Statistics
  Simple    53               27         11                                 32
  Complex   71               20         11                                 19

Empirical Proportion Plot

print(emp_prop_plot_teachingexp <- ggplot(stat_res_clean, aes(Emp_Prop_Est,
                                                              fill = Teaching_Role)) +
  geom_histogram(binwidth = 1) +
  coord_cartesian(ylim = c(0,50), xlim = c(0,100)) +
        facet_wrap(~BSs_cond, nrow = 2) +
        geom_vline(xintercept = 50, linetype = "dashed", color = "black") +
        scale_fill_grey() +
        theme(legend.position = "right") +
        theme_classic() +
        xlab("Empirical Proportion Estimates") +
        ylab("Participant Count") + 
        theme(axis.title.x = element_text(size = 14), 
              axis.title.y = element_text(size = 14),
              axis.text.x = element_text(color = "black", size = 12), 
              axis.text.y = element_text(color = "black", size = 12),
              legend.position = "right",
              legend.title = element_text(color = "black", size = 14),
              legend.text = element_text(color = "black", size = 12)))

Theoretical Proportion Plot

print(theory_prop_plot_teachingexp <- ggplot(stat_res_clean, aes(Theory_Prop_Est,
                                                              fill = Teaching_Role)) +
  geom_histogram(binwidth = 1) +
  coord_cartesian(ylim = c(0,50), xlim = c(0,100)) +
        facet_wrap(~BSs_cond, nrow = 2) +
        geom_vline(xintercept = 50, linetype = "dashed", color = "black") +
        scale_fill_grey() +
        theme(legend.position = "right") +
        theme_classic() +
        xlab("Theoretical Proportion Estimates") +
        ylab("Participant Count") + 
        theme(axis.title.x = element_text(size = 14), 
              axis.title.y = element_text(size = 14),
              axis.text.x = element_text(color = "black", size = 12), 
              axis.text.y = element_text(color = "black", size = 12),
              legend.position = "right",
              legend.title = element_text(color = "black", size = 14),
              legend.text = element_text(color = "black", size = 12)))

Academic Experience (Generally)

Breakdown

table(stat_res_clean$BSs_cond, stat_res_clean$Academia)
         
            0   1
  Simple    5 118
  Complex   8 113

Empirical Proportion Scatterplot

print(emp_prop_ac_scatter <- ggplot(data = stat_res_clean, aes(x = Academia_Length, 
                                                               y = Emp_Prop_Est)) +
        geom_jitter(alpha = 0.5) +
        geom_smooth(method = 'lm') +
        facet_wrap(BSs_cond~., nrow = 2) +
        scale_x_continuous(limits = c(-1,55), breaks = c(0,10,20,30,40,50)) +
        scale_y_continuous(limits = c(-1,101), breaks = c(0,20,40,60,80,100)) +
        geom_hline(yintercept = 50, linetype = "dashed", color = "black") +
        theme_classic() +
        xlab("Academic Experience (in years)") +
        ylab("Empirical Proportion Estimate") +
          theme(axis.title.x = element_text(size = 14), 
              axis.title.y = element_text(size = 14),
              axis.text.x = element_text(color = "black", size = 12), 
              axis.text.y = element_text(color = "black", size = 12),
              legend.position = "right",
              legend.title = element_text(color = "black", size = 14),
              legend.text = element_text(color = "black", size = 12)))

Theoretical Proportion Scatterplot

print(theory_prop_ac_scatter <- ggplot(data = stat_res_clean, aes(x = Academia_Length, 
                                                               y = Theory_Prop_Est)) +
        geom_jitter(alpha = 0.5) +
        geom_smooth(method = 'lm') +
        facet_wrap(BSs_cond~., nrow = 2) +
        scale_x_continuous(limits = c(-1,55), breaks = c(0,10,20,30,40,50)) +
        scale_y_continuous(limits = c(-1,101), breaks = c(0,20,40,60,80,100)) +
        geom_hline(yintercept = 50, linetype = "dashed", color = "black") +
        theme_classic() +
        xlab("Academic Experience (in years)") +
        ylab("Theoretical Proportion Estimate") +
          theme(axis.title.x = element_text(size = 14), 
              axis.title.y = element_text(size = 14),
              axis.text.x = element_text(color = "black", size = 12), 
              axis.text.y = element_text(color = "black", size = 12),
              legend.position = "right",
              legend.title = element_text(color = "black", size = 14),
              legend.text = element_text(color = "black", size = 12)))

LS0tDQp0aXRsZTogIlBlcnNvbi1MZXZlbCBTdGF0aXN0aWNhbCBDb2duaXRpb24gLSBSZXNlYXJjaGVycyINCmF1dGhvcjogIlJ5YW4gTS4gTWNNYW51cyINCmRhdGU6ICdgciBmb3JtYXQoU3lzLnRpbWUoKSwgIiVCICVkLCAlWSIpYCcNCm91dHB1dDogDQogIGh0bWxfbm90ZWJvb2s6DQogICAgY29kZV9mb2xkaW5nOiBoaWRlDQogICAgaGlnaGxpZ2h0OiB0YW5nbw0KICAgIHRoZW1lOiBkYXJrbHkNCiAgICB0b2M6IHllcw0KICAgIHRvY19kZXB0aDogNQ0KICAgIHRvY19mbG9hdDogeWVzDQotLS0NCg0KPGJyPg0KDQpBcyBwcmUtcmVnaXN0ZXJlZCwgd2Ugc291Z2h0IHRvIGNvbGxlY3QgZGF0YSB0byBhdHRhaW4gMjgwIGFuYWx5emFibGUgcmVzcG9uc2VzIGluIHRvdGFsIChpLmUuLCAxNDAgcGFydGljaXBhbnRzIHdobyBwYXNzZWQgYXR0ZW50aW9uIGNoZWNrcyBmb3IgZWFjaCBiZXR3ZWVuLXN1YmplY3RzIGNvbmRpdGlvbikuIA0KDQo8YnI+DQoNCkFmdGVyIHR3byB3YXZlcyBvZiBkYXRhIGNvbGxlY3Rpb24sIHdlIHdlcmUgb25seSBhYmxlIHRvIHJlY3J1aXQgTiA9IDI1Ni4gQXBwbHlpbmcgdGhlIHByZS1yZWdpc3RlcmVkIGV4Y2x1c2lvbiBjcml0ZXJpb24gbGVkIHRvIE4gPSAyNDQgKG4gPSAxMjMgZm9yIHRoZSAic2ltcGxlIGVmZmVjdCIgYW5kIG4gPSAxMjEgZm9yIHRoZSAiY29tcGxleCBlZmZlY3QiKS4gSG93ZXZlciwgd2UgZGlkIG5vdCByZXNhbXBsZSB0byByZWFjaCBvdXIgcHJlLXJlZ2lzdGVyZWQgTnMgYmVjYXVzZSB0aGVzZSBhbmFseXphYmxlIE5zIHN0aWxsIHlpZWxkZWQgbW9yZSB0aGFuIDkwJSBwb3dlciBmb3Igb3VyIGZvY2FsIGluZmVyZW50aWFsIHRlc3RzLg0KDQo8YnI+DQoNCiMgRGF0YSBDbGVhbmluZw0KDQpCZWZvcmUgZGF0YSB3ZXJlIGxvYWRlZCBpbnRvIFIgKGJlbG93KSwgdGhlIGZvbGxvd2luZyBjaGFuZ2VzIHdlcmUgbWFkZToNCg0KKDEpIFJhdyB2YXJpYWJsZSBuYW1lcyB3ZXJlIHNsaWdodGx5IGFkanVzdGVkIHRvIGNyZWF0ZSBtb3JlIGludHVpdGl2ZSBsYWJlbHMgdGhhbiB3aGF0IHdhcyBvcmlnaW5hbGx5IHNwZWNpZmllZCBpbiBRdWFsdHJpY3MuDQoNCigyKSBQYXJ0aWNpcGFudHMgd2VyZSByZW1vdmVkIGlmIHRoZXkgZGlkIG5vdCBmaW5pc2ggdGhlIGVudGlyZSBzdXJ2ZXkuDQoNCigzKSBBbGwgb3RoZXIgaWRlbnRpZnlpbmcgaW5mb3JtYXRpb24gd2FzIHJlbW92ZWQgKGUuZy4sIElQIGFkZHJlc3NlcywgbG9uZ2l0dWRlL2xhdGl0dWRlLCBldGMuKS4NCg0KDQo8YnI+DQoNCiMjIExvYWRpbmcgRGF0YS9QYWNrYWdlcw0KDQpCZWZvcmUgcnVubmluZyB0aGlzIGNodW5rLCBwbGVhc2UgbG9hZCAiU3RhdF9Db2dfUmVzZWFyY2hlcnMuY3N2IiBpbnRvIHRoZSBSIGVudmlyb25tZW50Lg0KDQo8YnI+DQpgYGB7cn0NCm9wdGlvbnMoc2NpcGVuID0gOTkpICMgdHVybnMgb2ZmIHNjaWVudGlmaWMgbm90YXRpb24NCiMgcGFja2FnZXMgc2hvdWxkIGJlIGxvYWRlZCBpbiB0aGUgZm9sbG93aW5nIG9yZGVyIHRvIGF2b2lkIGZ1bmN0aW9uIGNvbmZsaWN0cw0KbGlicmFyeShwc3ljaCkgIyBmb3IgZGVzY3JpYmluZyBkYXRhDQpsaWJyYXJ5KGVmZnNpemUpICMgZm9yIG1lYW4gZGlmZmVyZW5jZSBlZmZlY3Qgc2l6ZXMNCmxpYnJhcnkoc2pzdGF0cykgIyBmb3IgZXRhLXNxdWFyZWQgZWZmZWN0IHNpemVzDQpsaWJyYXJ5KGNvcnJlbGF0aW9uKSAjIGZvciBjbGVhbmVyIGNvcnJlbGF0aW9uIHRlc3Qgb3V0cHV0DQpsaWJyYXJ5KHJtY29ycikgIyBmb3IgcmVwZWF0ZWQtbWVhc3VyZXMgY29ycmVsYXRpb24gdGVzdHMNCmxpYnJhcnkoY29jb3IpICMgZm9yIGNvbXBhcmluZyBkZXBlbmRlbnQgY29ycmVsYXRpb24gY29lZmZpY2llbnRzDQpsaWJyYXJ5KHRpZHl2ZXJzZSkgIyBmb3IgZGF0YSBtYW5pcHVsYXRpb24gYW5kIHBsb3R0aW5nDQpsaWJyYXJ5KHJzdGF0aXgpICMgZm9yIHdpbGNveG9uIHRlc3QgZWZmZWN0IHNpemVzDQpgYGANCg0KIyBEYXRhIE1hbmlwdWxhdGlvbg0KDQojIyBEYXRhIFNlcGFyYXRpb24vUmVjb21iaW5pbmcNCg0KRGF0YSB3ZXJlIHNlcGFyYXRlZCBpbnRvIHR3byBkaXN0aW5jdCBkYXRhIHNldHMgKGZvciBlYWNoIGJldHdlZW4tc3ViamVjdHMgY29uZGl0aW9uKS4gVGhlbiwgYSBiZXR3ZWVuLXN1YmplY3RzIHZhcmlhYmxlIHdhcyBjcmVhdGVkIHdpdGhpbiBlYWNoIGRhdGFzZXQuIExhc3QsIGJvdGggZGF0YXNldHMgd2VyZSByZWNvbWJpbmVkLg0KDQo8YnI+DQpgYGB7cn0NCiMgY3JlYXRlcyBkYXRhc2V0IHcvIHBlb3BsZSB3aG8gcmVhZCBhYm91dCBzaW1wbGUgcHN5Y2ggZXhwZXJpbWVudA0Kc2ltcGxlX3N0YXQgPC0gU3RhdF9Db2dfUmVzZWFyY2hlcnNfT1NGICU+JQ0KICBmaWx0ZXIoU2ltcGxlX0F0dG5fQ2sgIT0gIk5BIikNCg0KIyBjcmVhdGVzIGRhdGFzZXQgdy8gcGVvcGxlIHdobyByZWFkIGFib3V0IGNvbXBsZXggcHN5Y2ggZXhwZXJpbWVudA0KY29tcGxleF9zdGF0IDwtIFN0YXRfQ29nX1Jlc2VhcmNoZXJzX09TRiAlPiUNCiAgZmlsdGVyKENvbXBsZXhfQXR0bl9DayAhPSAiTkEiKQ0KDQojIGNyZWF0ZSBiZXR3ZWVuLXN1YmplY3RzIGNvbmRpdGlvbiB2YXJpYWJsZQ0Kc2ltcGxlX3N0YXQkQlNzX2NvbmQgPC0gcmVwKCJTaW1wbGUiLCBucm93KHNpbXBsZV9zdGF0KSkNCmNvbXBsZXhfc3RhdCRCU3NfY29uZCA8LSByZXAoIkNvbXBsZXgiLCBucm93KGNvbXBsZXhfc3RhdCkpDQoNCiMgcmVjb21iaW5lIGJldHdlZW4tc3ViamVjdHMgZGF0YQ0Kc3RhdF9yZXNfYWxsIDwtIHJiaW5kKHNpbXBsZV9zdGF0LCBjb21wbGV4X3N0YXQpDQoNCnN0YXRfcmVzX2FsbCRCU3NfY29uZCA8LSBhcy5mYWN0b3Ioc3RhdF9yZXNfYWxsJEJTc19jb25kKQ0Kc3RhdF9yZXNfYWxsJEJTc19jb25kIDwtIG9yZGVyZWQoc3RhdF9yZXNfYWxsJEJTc19jb25kLCBsZXZlbHMgPSBjKCJTaW1wbGUiLCAiQ29tcGxleCIpKQ0KYGBgDQoNCiMjIENsZWFuaW5nIERhdGENCmBgYHtyfQ0Kc3RhdF9yZXNfY2xlYW4gPC0gc3RhdF9yZXNfYWxsICU+JQ0KICBmaWx0ZXIoRmluaXNoZWQgPT0gMSkgJT4lICMgZmluaXNoZWQgd2hvbGUgc3VydmV5DQogIGZpbHRlcihDb21wbGV4X0F0dG5fQ2sgPT0gMSB8IFNpbXBsZV9BdHRuX0NrID09IDEpICMgcGFzc2VkIGF0dG4vY29tcCBjaGVjaw0KYGBgDQoNCiMjIEdldCBEZW1vZ3JhcGhpY3MgZm9yIENsZWFuIERhdGENCmBgYHtyfQ0KIyBnZW5kZXINCnN0YXRfcmVzX2NsZWFuICU+JSANCiAgZ3JvdXBfYnkoR2VuZGVyKSAlPiUgDQogIGRwbHlyOjpzdW1tYXJpemUoZ2VuZGVyID0gbigpKSAjIDAgPSBmZW1hbGU7IDEgPSBtYWxlOyAyID0gbm9uLWJpbmFyeTsgMyA9IG90aGVyDQoNCiMgZXRobmljaXR5DQpzdGF0X3Jlc19jbGVhbiAlPiUgDQogIGdyb3VwX2J5KEV0aG5pYykgJT4lIA0KICBkcGx5cjo6c3VtbWFyaXplKGV0aG5pY2l0eSA9IG4oKSkgIyAwID0gd2hpdGU7IDIgPSBibGFjazsgMiA9IGFtZXJpY2FuIGluZGlhbiAvIGFsYXNrYW4gbmF0aXZlOyAzID0gYXNpYW47IDQgPSBuYXRpdmUgaGF3YWlpYW4gLyBwYWNpZmljIGlzbGFuZGVyOyA1ID0gb3RoZXINCg0KIyBhZ2UNCm1lYW4oc3RhdF9yZXNfY2xlYW4kQWdlKQ0Kc2Qoc3RhdF9yZXNfY2xlYW4kQWdlKQ0KYGBgDQoNCiMjIENyZWF0aW5nIEFuYWx5c2lzIFZhcmlhYmxlcw0KYGBge3J9DQojIE1haW4gRFZzDQojIGNyZWF0ZSBpbnR1aXRpdmUgdmFyIG5hbWVzIHRoYXQgY29sbGFwc2UgYWNyb3NzIGJldHdlZW4tc3ViaiBjb25kaXRpb25zDQoNCiMgZS5nLiwgU2ltcGxlX1FfUHJvcF8wX1Jlc3BvbnNlID0gU2ltcGxlIERlc2lnbiAvIEVtcGlyaWNhbCBRIFByb3AgRXN0aW1hdGUgLyBBbmNob3Igc3RhcnRlZCBhdCAwDQoNCnN0YXRfcmVzX2NsZWFuJEVtcF9Qcm9wX0VzdCAgPC0gcm93U3VtcyhzdGF0X3Jlc19jbGVhblssIGMoIlNpbXBsZV9RX1Byb3BfMF9SZXNwb25zZSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU2ltcGxlX1FfUHJvcF81MF9SZXNwb25zZSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTaW1wbGVfUV9Qcm9wXzEwMF9SZXNwb25zZSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDb21wbGV4X1FfUHJvcF8wX1Jlc3BvbnNlIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNvbXBsZXhfUV9Qcm9wXzUwX1Jlc3BvbnNlIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNvbXBsZXhfUV9Qcm9wXzEwMF9SZXNwb25zZSIpXSwgbmEucm0gPSBUKQ0Kc3RhdF9yZXNfY2xlYW4kVGhlb3J5X1Byb3BfRXN0ICA8LSByb3dTdW1zKHN0YXRfcmVzX2NsZWFuWywgYygiU2ltcGxlX1RfUHJvcF8wX1Jlc3BvbnNlIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTaW1wbGVfVF9Qcm9wXzUwX1Jlc3BvbnNlIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNpbXBsZV9UX1Byb3BfMTAwX1Jlc3BvbnNlIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNvbXBsZXhfVF9Qcm9wXzBfUmVzcG9uc2UiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ29tcGxleF9UX1Byb3BfNTBfUmVzcG9uc2UiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ29tcGxleF9UX1Byb3BfMTAwX1Jlc3BvbnNlIildLCBuYS5ybSA9IFQpDQoNCnN0YXRfcmVzX2NsZWFuJEVtcF9URl9Db3VudCAgPC0gcm93U3VtcyhzdGF0X3Jlc19jbGVhblssIGMoIlNpbXBsZV9RX1RGX1Jlc3BvbnNlXzEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTaW1wbGVfUV9URl9SZXNwb25zZV8yIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU2ltcGxlX1FfVEZfUmVzcG9uc2VfMyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNpbXBsZV9RX1RGX1Jlc3BvbnNlXzQiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTaW1wbGVfUV9URl9SZXNwb25zZV81IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU2ltcGxlX1FfVEZfUmVzcG9uc2VfNiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNvbXBsZXhfUV9URl9SZXNwb25zZV8xIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ29tcGxleF9RX1RGX1Jlc3BvbnNlXzIiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDb21wbGV4X1FfVEZfUmVzcG9uc2VfMyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNvbXBsZXhfUV9URl9SZXNwb25zZV80IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ29tcGxleF9RX1RGX1Jlc3BvbnNlXzUiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDb21wbGV4X1FfVEZfUmVzcG9uc2VfNiIpXSwgbmEucm0gPSBUKQ0Kc3RhdF9yZXNfY2xlYW4kVGhlb3J5X1RGX0NvdW50ICA8LSByb3dTdW1zKHN0YXRfcmVzX2NsZWFuWywgYygiU2ltcGxlX1RfVEZfUmVzcG9uc2VfMSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNpbXBsZV9UX1RGX1Jlc3BvbnNlXzIiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTaW1wbGVfVF9URl9SZXNwb25zZV8zIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU2ltcGxlX1RfVEZfUmVzcG9uc2VfNCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNpbXBsZV9UX1RGX1Jlc3BvbnNlXzUiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTaW1wbGVfVF9URl9SZXNwb25zZV82IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ29tcGxleF9UX1RGX1Jlc3BvbnNlXzEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDb21wbGV4X1RfVEZfUmVzcG9uc2VfMiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNvbXBsZXhfVF9URl9SZXNwb25zZV8zIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ29tcGxleF9UX1RGX1Jlc3BvbnNlXzQiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDb21wbGV4X1RfVEZfUmVzcG9uc2VfNSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNvbXBsZXhfVF9URl9SZXNwb25zZV82IildLCBuYS5ybSA9IFQpDQoNCg0KIyBQcmUtcmVnaXN0ZXJlZCBDdXQtb2ZmIFNjb3Jlcw0KIyBpLmUuLCB3aGV0aGVyIHByb3AgZXN0aW1hdGVzIGFyZSBhdCA1MSUgb3IgaGlnaGVyDQpzdGF0X3Jlc19jbGVhbiA8LSBzdGF0X3Jlc19jbGVhbiAlPiUNCiAgbXV0YXRlKEVtcF9Qcm9wX0N1dG9mZiA9IGNhc2Vfd2hlbigNCiAgICBFbXBfUHJvcF9Fc3QgPj0gNTEgfiAiU2ltcGxlIE1ham9yaXR5IG9yIEdyZWF0ZXIiLA0KICAgIEVtcF9Qcm9wX0VzdCA8IDUxIH4gIkxlc3MgdGhhbiBTaW1wbGUgTWFqb3JpdHkiKSkgJT4lDQogIG11dGF0ZShUaGVvcnlfUHJvcF9DdXRvZmYgPSBjYXNlX3doZW4oDQogICAgVGhlb3J5X1Byb3BfRXN0ID49IDUxIH4gIlNpbXBsZSBNYWpvcml0eSBvciBHcmVhdGVyIiwNCiAgICBUaGVvcnlfUHJvcF9Fc3QgPCA1MSB+ICJMZXNzIHRoYW4gU2ltcGxlIE1ham9yaXR5IikpDQoNCiMgc2VsZWN0IG9ubHkgcmVsZXZhbnQgZGF0YQ0Kc3RhdF9yZXNfY2xlYW4gPC0gc3RhdF9yZXNfY2xlYW4gJT4lDQogIHNlbGVjdChSZXNwb25zZUlkLA0KICAgICAgICAgQlNzX2NvbmQsDQogICAgICAgICBFbXBfUHJvcF9Fc3Q6VGhlb3J5X1Byb3BfQ3V0b2ZmLA0KICAgICAgICAgRGVzaWduX0luZiwNCiAgICAgICAgIEFjYWRlbWlhOmBQb2xpdGljYWwgQmVsaWVmc18zYCkNCmBgYA0KDQoNCiMgRGVzY3JpcHRpdmUgU3RhdHMgey50YWJzZXR9DQoNCiMjIFByb3BvcnRpb24gRXN0aW1hdGVzIHsudGFic2V0fQ0KDQojIyMgRW1waXJpY2FsIERpc3RyaWJ1dGlvbg0KYGBge3J9DQpkZXNjcmliZUJ5KHN0YXRfcmVzX2NsZWFuJEVtcF9Qcm9wX0VzdCwgbGlzdChzdGF0X3Jlc19jbGVhbiRCU3NfY29uZCksIG1hdCA9IFQpDQpgYGANCiMjIyBFbXBpcmljYWwgQ3V0LU9mZg0KYGBge3J9DQp0YWJsZShzdGF0X3Jlc19jbGVhbiRCU3NfY29uZCwgc3RhdF9yZXNfY2xlYW4kRW1wX1Byb3BfQ3V0b2ZmKQ0KYGBgDQoNCiMjIyBUaGVvcmV0aWNhbCBEaXN0cmlidXRpb24NCmBgYHtyfQ0KZGVzY3JpYmVCeShzdGF0X3Jlc19jbGVhbiRUaGVvcnlfUHJvcF9Fc3QsIGxpc3Qoc3RhdF9yZXNfY2xlYW4kQlNzX2NvbmQpLCBtYXQgPSBUKQ0KYGBgDQojIyMgVGhlb3JldGljYWwgQ3V0LU9mZg0KYGBge3J9DQp0YWJsZShzdGF0X3Jlc19jbGVhbiRCU3NfY29uZCwgc3RhdF9yZXNfY2xlYW4kVGhlb3J5X1Byb3BfQ3V0b2ZmKQ0KYGBgDQoNCiMjIFQvRiBDb3VudHMgey50YWJzZXR9DQoNCiMjIyBFbXBpcmljYWwgVC9GIENvdW50cw0KYGBge3J9DQp0YWJsZShzdGF0X3Jlc19jbGVhbiRCU3NfY29uZCwgc3RhdF9yZXNfY2xlYW4kRW1wX1RGX0NvdW50KSAjIG51bWJlciBvZiB0aW1lcyB0L2Ygd2FzIG1hcmtlZCB0cnVlIGJ5IGEgcGFydGljaXBhbnQgKG91dCBvZiA2IHQvZiBzdGF0ZW1lbnRzIHdoZXJlIGFsbCBzdGF0ZW1lbnRzIHdlcmUgdGVjaG5pY2FsbHkgZmFsc2U7IHNlZSBPU0YgUXVhbHRyaWNzIGZpbGUpDQpgYGANCiMjIyBUaGVvcmV0aWNhbCBUL0YgQ291bnRzDQpgYGB7cn0NCnRhYmxlKHN0YXRfcmVzX2NsZWFuJEJTc19jb25kLCBzdGF0X3Jlc19jbGVhbiRUaGVvcnlfVEZfQ291bnQpICMgbnVtYmVyIG9mIHRpbWVzIHQvZiB3YXMgbWFya2VkIHRydWUgYnkgYSBwYXJ0aWNpcGFudCAob3V0IG9mIDYgdC9mIHN0YXRlbWVudHMgd2hlcmUgYWxsIHN0YXRlbWVudHMgd2VyZSB0ZWNobmljYWxseSBmYWxzZTsgc2VlIE9TRiBRdWFsdHJpY3MgZmlsZSkNCmBgYA0KDQoNCiMgUGxvdHRpbmcgUHJvcG9ydGlvbiBFc3RpbWF0ZXMgey50YWJzZXR9DQoNCiMjIEVtcGlyaWNhbCBFc3RpbWF0ZXMNCmBgYHtyLCBmaWcud2lkdGggPSAxNCwgZmlnLmhlaWdodCA9IDksIG91dC53aWR0aCA9ICI3NSUiLCBvdXQuaGVpZ2h0ID0gIjc1JSJ9DQpwcmludChlbXBfcHJvcF9wbG90IDwtIGdncGxvdChzdGF0X3Jlc19jbGVhbiwgYWVzKEVtcF9Qcm9wX0VzdCkpICsNCiAgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGggPSAxKSArDQogIGNvb3JkX2NhcnRlc2lhbih5bGltID0gYygwLDUwKSwgeGxpbSA9IGMoMCwxMDApKSArDQogICAgICAgIGZhY2V0X3dyYXAofkJTc19jb25kLCBucm93ID0gMikgKw0KICAgICAgICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSA1MCwgbGluZXR5cGUgPSAiZGFzaGVkIiwgY29sb3IgPSAiYmxhY2siKSArDQogICAgICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJyaWdodCIpICsNCiAgICAgICAgdGhlbWVfY2xhc3NpYygpICsNCiAgICAgICAgeGxhYigiRW1waXJpY2FsIFByb3BvcnRpb24gRXN0aW1hdGVzIikgKw0KICAgICAgICB5bGFiKCJQYXJ0aWNpcGFudCBDb3VudCIpICsgDQogICAgICAgIHRoZW1lKGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLCANCiAgICAgICAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksDQogICAgICAgICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDEyKSwgDQogICAgICAgICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDEyKSwNCiAgICAgICAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gInJpZ2h0IiwNCiAgICAgICAgICAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDE0KSwNCiAgICAgICAgICAgICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTIpKSkNCg0KYGBgDQojIyBUaGVvcmV0aWNhbCBFc3RpbWF0ZXMNCmBgYHtyLCBmaWcud2lkdGggPSAxNCwgZmlnLmhlaWdodCA9IDksIG91dC53aWR0aCA9ICI3NSUiLCBvdXQuaGVpZ2h0ID0gIjc1JSJ9DQpwcmludCh0aGVvcnlfcHJvcF9wbG90IDwtIGdncGxvdChzdGF0X3Jlc19jbGVhbiwgYWVzKFRoZW9yeV9Qcm9wX0VzdCkpICsNCiAgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGggPSAxKSArDQogIGNvb3JkX2NhcnRlc2lhbih5bGltID0gYygwLDUwKSwgeGxpbSA9IGMoMCwxMDApKSArDQogICAgICAgIGZhY2V0X3dyYXAofkJTc19jb25kLCBucm93ID0gMikgKw0KICAgICAgICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSA1MCwgbGluZXR5cGUgPSAiZGFzaGVkIiwgY29sb3IgPSAiYmxhY2siKSArDQogICAgICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJyaWdodCIpICsNCiAgICAgICAgdGhlbWVfY2xhc3NpYygpICsNCiAgICAgICAgeGxhYigiVGhlb3JldGljYWwgUHJvcG9ydGlvbiBFc3RpbWF0ZXMiKSArDQogICAgICAgIHlsYWIoIlBhcnRpY2lwYW50IENvdW50IikgKyANCiAgICAgICAgdGhlbWUoYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksIA0KICAgICAgICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwNCiAgICAgICAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTIpLCANCiAgICAgICAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTIpLA0KICAgICAgICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAicmlnaHQiLA0KICAgICAgICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTQpLA0KICAgICAgICAgICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIHNpemUgPSAxMikpKQ0KDQpgYGANCg0KIyBCaW5vbWlhbCBUZXN0cyB7LnRhYnNldH0NCg0KIyMgU2ltcGxlIHsudGFic2V0fQ0KDQojIyMgRW1waXJpY2FsIFByb3BvcnRpb24NCmBgYHtyfQ0KIyB1c2luZyBlc3RpbWF0ZXMgZnJvbSBkZXNjcmlwdGl2ZSBzdGF0cyBzZWN0aW9uDQpiaW5vbS50ZXN0KHggPSA5MCwgbiA9IDEyMywgcCA9IDAuNSwgYWx0ZXJuYXRpdmUgPSAiZ3JlYXRlciIsIGNvbmYubGV2ZWwgPSAwLjkwKQ0KYGBgDQojIyMgVGhlb3JldGljYWwgUHJvcG9ydGlvbg0KYGBge3J9DQojIHVzaW5nIGVzdGltYXRlcyBmcm9tIGRlc2NyaXB0aXZlIHN0YXRzIHNlY3Rpb24NCmJpbm9tLnRlc3QoeCA9IDk5LCBuID0gMTIzLCBwID0gMC41LCBhbHRlcm5hdGl2ZSA9ICJncmVhdGVyIiwgY29uZi5sZXZlbCA9IDAuOTApDQpgYGANCg0KIyMgQ29tcGxleCB7LnRhYnNldH0NCg0KIyMjIEVtcGlyaWNhbCBQcm9wb3J0aW9uDQpgYGB7cn0NCiMgdXNpbmcgZXN0aW1hdGVzIGZyb20gZGVzY3JpcHRpdmUgc3RhdHMgc2VjdGlvbg0KYmlub20udGVzdCh4ID0gOTcsIG4gPSAxMjEsIHAgPSAwLjUsIGFsdGVybmF0aXZlID0gImdyZWF0ZXIiLCBjb25mLmxldmVsID0gMC45MCkNCmBgYA0KIyMjIFRoZW9yZXRpY2FsIFByb3BvcnRpb24NCmBgYHtyfQ0KIyB1c2luZyBlc3RpbWF0ZXMgZnJvbSBkZXNjcmlwdGl2ZSBzdGF0cyBzZWN0aW9uDQpiaW5vbS50ZXN0KHggPSAxMDksIG4gPSAxMjEsIHAgPSAwLjUsIGFsdGVybmF0aXZlID0gImdyZWF0ZXIiLCBjb25mLmxldmVsID0gMC45MCkNCmBgYA0KDQojIEFkZGl0aW9uYWwgQW5hbHlzZXMNCg0KIyMgRGVzaWduIEluZmVyZW5jZQ0KYGBge3J9DQp0YWJsZShzdGF0X3Jlc19jbGVhbiRCU3NfY29uZCwgc3RhdF9yZXNfY2xlYW4kRGVzaWduX0luZikNCiMgIkluIHlvdXIgb3Bpbmlvbiwgd2hhdCBraW5kcyBvZiBleHBlcmltZW50YWwgZGVzaWducyBhcmUgbmVjZXNzYXJ5IHRvIG1ha2UgaW5mZXJlbmNlcyBhYm91dCBwZXJzb24tbGV2ZWwgcHN5Y2hvbG9naWNhbCBlZmZlY3RzPw0KIyAxID0gYmV0d2Vlbi1zdWJqOyAjMiA9IHdpdGhpbi1zdWJqOyAjMyA9IGVpdGhlcg0KYGBgDQoNCiMjIFJlc2VhcmNoIEV4cGVyaWVuY2Ugey50YWJzZXR9DQoNCiMjIyBCcmVha2Rvd24NCmBgYHtyfQ0Kc3RhdF9yZXNfY2xlYW4gPC0gc3RhdF9yZXNfY2xlYW4gJT4lDQogIG11dGF0ZShSZXNlYXJjaF9Sb2xlID0gY2FzZV93aGVuKA0KICAgIFJlc2VhcmNoX0V4cCA9PSA0IH4gIlVuZGVyZ3JhZCIsDQogICAgUmVzZWFyY2hfRXhwID09IDUgfiAiUG9zdC1iYWMvUkEvTGFiIG1hbmFnZXIiLA0KICAgIFJlc2VhcmNoX0V4cCA9PSA2IH4gIk1hc3RlcidzIHN0dWRlbnQiLA0KICAgIFJlc2VhcmNoX0V4cCA9PSA3IH4gIlBoRCBzdHVkZW50IiwNCiAgICBSZXNlYXJjaF9FeHAgPT0gOCB+ICJQb3N0LWRvYyIsDQogICAgUmVzZWFyY2hfRXhwID09IDkgfiAiUHJvZmVzc29yIiwNCiAgICBUUlVFIH4gIk90aGVyIikpDQoNCnN0YXRfcmVzX2NsZWFuJFJlc2VhcmNoX1JvbGUgPC0gYXMuZmFjdG9yKHN0YXRfcmVzX2NsZWFuJFJlc2VhcmNoX1JvbGUpDQpzdGF0X3Jlc19jbGVhbiRSZXNlYXJjaF9Sb2xlIDwtIG9yZGVyZWQoc3RhdF9yZXNfY2xlYW4kUmVzZWFyY2hfUm9sZSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygiT3RoZXIiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVuZGVyZ3JhZCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUG9zdC1iYWMvUkEvTGFiIG1hbmFnZXIiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1hc3RlcidzIHN0dWRlbnQiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlBoRCBzdHVkZW50IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQb3N0LWRvYyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUHJvZmVzc29yIikpDQoNCnRhYmxlKHN0YXRfcmVzX2NsZWFuJEJTc19jb25kLCBzdGF0X3Jlc19jbGVhbiRSZXNlYXJjaF9Sb2xlKQ0KYGBgDQoNCiMjIyBFbXBpcmljYWwgUHJvcG9ydGlvbiBQbG90DQpgYGB7ciwgZmlnLndpZHRoID0gMTQsIGZpZy5oZWlnaHQgPSA5LCBvdXQud2lkdGggPSAiNzUlIiwgb3V0LmhlaWdodCA9ICI3NSUifQ0KcHJpbnQoZW1wX3Byb3BfcGxvdF9yZXNlYXJjaGV4cCA8LSBnZ3Bsb3Qoc3RhdF9yZXNfY2xlYW4sIGFlcyhFbXBfUHJvcF9Fc3QsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGwgPSBSZXNlYXJjaF9Sb2xlKSkgKw0KICBnZW9tX2hpc3RvZ3JhbShiaW53aWR0aCA9IDEpICsNCiAgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKDAsNTApLCB4bGltID0gYygwLDEwMCkpICsNCiAgICAgICAgZmFjZXRfd3JhcCh+QlNzX2NvbmQsIG5yb3cgPSAyKSArDQogICAgICAgIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDUwLCBsaW5ldHlwZSA9ICJkYXNoZWQiLCBjb2xvciA9ICJibGFjayIpICsNCiAgICAgICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gInJpZ2h0IikgKw0KICAgICAgICBzY2FsZV9maWxsX2dyZXkoKSArDQogICAgICAgIHRoZW1lX2NsYXNzaWMoKSArDQogICAgICAgIHhsYWIoIkVtcGlyaWNhbCBQcm9wb3J0aW9uIEVzdGltYXRlcyIpICsNCiAgICAgICAgeWxhYigiUGFydGljaXBhbnQgQ291bnQiKSArIA0KICAgICAgICB0aGVtZShheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwgDQogICAgICAgICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLA0KICAgICAgICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIHNpemUgPSAxMiksIA0KICAgICAgICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIHNpemUgPSAxMiksDQogICAgICAgICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJyaWdodCIsDQogICAgICAgICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIHNpemUgPSAxNCksDQogICAgICAgICAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDEyKSkpDQpgYGANCiMjIyBUaGVvcmV0aWNhbCBQcm9wb3J0aW9uIFBsb3QNCmBgYHtyLCBmaWcud2lkdGggPSAxNCwgZmlnLmhlaWdodCA9IDksIG91dC53aWR0aCA9ICI3NSUiLCBvdXQuaGVpZ2h0ID0gIjc1JSJ9DQpwcmludCh0aGVvcnlfcHJvcF9wbG90X3Jlc2VhcmNoZXhwIDwtIGdncGxvdChzdGF0X3Jlc19jbGVhbiwgYWVzKFRoZW9yeV9Qcm9wX0VzdCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbCA9IFJlc2VhcmNoX1JvbGUpKSArDQogIGdlb21faGlzdG9ncmFtKGJpbndpZHRoID0gMSkgKw0KICBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoMCw1MCksIHhsaW0gPSBjKDAsMTAwKSkgKw0KICAgICAgICBmYWNldF93cmFwKH5CU3NfY29uZCwgbnJvdyA9IDIpICsNCiAgICAgICAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gNTAsIGxpbmV0eXBlID0gImRhc2hlZCIsIGNvbG9yID0gImJsYWNrIikgKw0KICAgICAgICBzY2FsZV9maWxsX2dyZXkoKSArDQogICAgICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJyaWdodCIpICsNCiAgICAgICAgdGhlbWVfY2xhc3NpYygpICsNCiAgICAgICAgeGxhYigiVGhlb2VydGljYWwgUHJvcG9ydGlvbiBFc3RpbWF0ZXMiKSArDQogICAgICAgIHlsYWIoIlBhcnRpY2lwYW50IENvdW50IikgKyANCiAgICAgICAgdGhlbWUoYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksIA0KICAgICAgICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwNCiAgICAgICAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTIpLCANCiAgICAgICAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTIpLA0KICAgICAgICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAicmlnaHQiLA0KICAgICAgICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTQpLA0KICAgICAgICAgICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIHNpemUgPSAxMikpKQ0KYGBgDQoNCiMjIFRlYWNoaW5nIEV4cGVyaWVuY2Ugey50YWJzZXR9DQoNCiMjIyBCcmVha2Rvd24NCmBgYHtyfQ0Kc3RhdF9yZXNfY2xlYW4gPC0gc3RhdF9yZXNfY2xlYW4gJT4lDQogIG11dGF0ZShUZWFjaGluZ19Sb2xlID0gY2FzZV93aGVuKA0KICAgIGBTdGF0cy9NZXRoYCA9PSAwIH4gIk5vbmUiLA0KICAgIGBTdGF0cy9NZXRoYCA9PSAxIH4gIlJlc2VhcmNoIE1ldGhvZHMiLA0KICAgIGBTdGF0cy9NZXRoYCA9PSAyIH4gIlN0YXRpc3RpY3MiLA0KICAgIGBTdGF0cy9NZXRoYCA9PSAzIH4gIkJvdGggUmVzZWFyY2ggTWV0aG9kcyAmIFN0YXRpc3RpY3MiKSkNCg0Kc3RhdF9yZXNfY2xlYW4kVGVhY2hpbmdfUm9sZSA8LSBhcy5mYWN0b3Ioc3RhdF9yZXNfY2xlYW4kVGVhY2hpbmdfUm9sZSkNCnN0YXRfcmVzX2NsZWFuJFRlYWNoaW5nX1JvbGUgPC0gb3JkZXJlZChzdGF0X3Jlc19jbGVhbiRUZWFjaGluZ19Sb2xlLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCJOb25lIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSZXNlYXJjaCBNZXRob2RzIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTdGF0aXN0aWNzIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCb3RoIFJlc2VhcmNoIE1ldGhvZHMgJiBTdGF0aXN0aWNzIikpDQoNCnRhYmxlKHN0YXRfcmVzX2NsZWFuJEJTc19jb25kLCBzdGF0X3Jlc19jbGVhbiRUZWFjaGluZ19Sb2xlKQ0KYGBgDQojIyMgRW1waXJpY2FsIFByb3BvcnRpb24gUGxvdA0KYGBge3IsIGZpZy53aWR0aCA9IDE0LCBmaWcuaGVpZ2h0ID0gOSwgb3V0LndpZHRoID0gIjc1JSIsIG91dC5oZWlnaHQgPSAiNzUlIn0NCnByaW50KGVtcF9wcm9wX3Bsb3RfdGVhY2hpbmdleHAgPC0gZ2dwbG90KHN0YXRfcmVzX2NsZWFuLCBhZXMoRW1wX1Byb3BfRXN0LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsID0gVGVhY2hpbmdfUm9sZSkpICsNCiAgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGggPSAxKSArDQogIGNvb3JkX2NhcnRlc2lhbih5bGltID0gYygwLDUwKSwgeGxpbSA9IGMoMCwxMDApKSArDQogICAgICAgIGZhY2V0X3dyYXAofkJTc19jb25kLCBucm93ID0gMikgKw0KICAgICAgICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSA1MCwgbGluZXR5cGUgPSAiZGFzaGVkIiwgY29sb3IgPSAiYmxhY2siKSArDQogICAgICAgIHNjYWxlX2ZpbGxfZ3JleSgpICsNCiAgICAgICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gInJpZ2h0IikgKw0KICAgICAgICB0aGVtZV9jbGFzc2ljKCkgKw0KICAgICAgICB4bGFiKCJFbXBpcmljYWwgUHJvcG9ydGlvbiBFc3RpbWF0ZXMiKSArDQogICAgICAgIHlsYWIoIlBhcnRpY2lwYW50IENvdW50IikgKyANCiAgICAgICAgdGhlbWUoYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksIA0KICAgICAgICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwNCiAgICAgICAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTIpLCANCiAgICAgICAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTIpLA0KICAgICAgICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAicmlnaHQiLA0KICAgICAgICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTQpLA0KICAgICAgICAgICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIHNpemUgPSAxMikpKQ0KYGBgDQojIyMgVGhlb3JldGljYWwgUHJvcG9ydGlvbiBQbG90DQpgYGB7ciwgZmlnLndpZHRoID0gMTQsIGZpZy5oZWlnaHQgPSA5LCBvdXQud2lkdGggPSAiNzUlIiwgb3V0LmhlaWdodCA9ICI3NSUifQ0KcHJpbnQodGhlb3J5X3Byb3BfcGxvdF90ZWFjaGluZ2V4cCA8LSBnZ3Bsb3Qoc3RhdF9yZXNfY2xlYW4sIGFlcyhUaGVvcnlfUHJvcF9Fc3QsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGwgPSBUZWFjaGluZ19Sb2xlKSkgKw0KICBnZW9tX2hpc3RvZ3JhbShiaW53aWR0aCA9IDEpICsNCiAgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKDAsNTApLCB4bGltID0gYygwLDEwMCkpICsNCiAgICAgICAgZmFjZXRfd3JhcCh+QlNzX2NvbmQsIG5yb3cgPSAyKSArDQogICAgICAgIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDUwLCBsaW5ldHlwZSA9ICJkYXNoZWQiLCBjb2xvciA9ICJibGFjayIpICsNCiAgICAgICAgc2NhbGVfZmlsbF9ncmV5KCkgKw0KICAgICAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAicmlnaHQiKSArDQogICAgICAgIHRoZW1lX2NsYXNzaWMoKSArDQogICAgICAgIHhsYWIoIlRoZW9yZXRpY2FsIFByb3BvcnRpb24gRXN0aW1hdGVzIikgKw0KICAgICAgICB5bGFiKCJQYXJ0aWNpcGFudCBDb3VudCIpICsgDQogICAgICAgIHRoZW1lKGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLCANCiAgICAgICAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksDQogICAgICAgICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDEyKSwgDQogICAgICAgICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDEyKSwNCiAgICAgICAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gInJpZ2h0IiwNCiAgICAgICAgICAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDE0KSwNCiAgICAgICAgICAgICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTIpKSkNCmBgYA0KDQojIyBBY2FkZW1pYyBFeHBlcmllbmNlIChHZW5lcmFsbHkpIHsudGFic2V0fQ0KDQojIyMgQnJlYWtkb3duDQpgYGB7cn0NCnRhYmxlKHN0YXRfcmVzX2NsZWFuJEJTc19jb25kLCBzdGF0X3Jlc19jbGVhbiRBY2FkZW1pYSkNCmBgYA0KDQojIyMgRW1waXJpY2FsIFByb3BvcnRpb24gU2NhdHRlcnBsb3QNCmBgYHtyLCBmaWcud2lkdGggPSAxNCwgZmlnLmhlaWdodCA9IDksIG91dC53aWR0aCA9ICI3NSUiLCBvdXQuaGVpZ2h0ID0gIjc1JSJ9DQpwcmludChlbXBfcHJvcF9hY19zY2F0dGVyIDwtIGdncGxvdChkYXRhID0gc3RhdF9yZXNfY2xlYW4sIGFlcyh4ID0gQWNhZGVtaWFfTGVuZ3RoLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSBFbXBfUHJvcF9Fc3QpKSArDQogICAgICAgIGdlb21faml0dGVyKGFscGhhID0gMC41KSArDQogICAgICAgIGdlb21fc21vb3RoKG1ldGhvZCA9ICdsbScpICsNCiAgICAgICAgZmFjZXRfd3JhcChCU3NfY29uZH4uLCBucm93ID0gMikgKw0KICAgICAgICBzY2FsZV94X2NvbnRpbnVvdXMobGltaXRzID0gYygtMSw1NSksIGJyZWFrcyA9IGMoMCwxMCwyMCwzMCw0MCw1MCkpICsNCiAgICAgICAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoLTEsMTAxKSwgYnJlYWtzID0gYygwLDIwLDQwLDYwLDgwLDEwMCkpICsNCiAgICAgICAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gNTAsIGxpbmV0eXBlID0gImRhc2hlZCIsIGNvbG9yID0gImJsYWNrIikgKw0KICAgICAgICB0aGVtZV9jbGFzc2ljKCkgKw0KICAgICAgICB4bGFiKCJBY2FkZW1pYyBFeHBlcmllbmNlIChpbiB5ZWFycykiKSArDQogICAgICAgIHlsYWIoIkVtcGlyaWNhbCBQcm9wb3J0aW9uIEVzdGltYXRlIikgKw0KICAgICAgICAgIHRoZW1lKGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLCANCiAgICAgICAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksDQogICAgICAgICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDEyKSwgDQogICAgICAgICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDEyKSwNCiAgICAgICAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gInJpZ2h0IiwNCiAgICAgICAgICAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDE0KSwNCiAgICAgICAgICAgICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTIpKSkNCmBgYA0KIyMjIFRoZW9yZXRpY2FsIFByb3BvcnRpb24gU2NhdHRlcnBsb3QNCmBgYHtyLCBmaWcud2lkdGggPSAxNCwgZmlnLmhlaWdodCA9IDksIG91dC53aWR0aCA9ICI3NSUiLCBvdXQuaGVpZ2h0ID0gIjc1JSJ9DQpwcmludCh0aGVvcnlfcHJvcF9hY19zY2F0dGVyIDwtIGdncGxvdChkYXRhID0gc3RhdF9yZXNfY2xlYW4sIGFlcyh4ID0gQWNhZGVtaWFfTGVuZ3RoLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSBUaGVvcnlfUHJvcF9Fc3QpKSArDQogICAgICAgIGdlb21faml0dGVyKGFscGhhID0gMC41KSArDQogICAgICAgIGdlb21fc21vb3RoKG1ldGhvZCA9ICdsbScpICsNCiAgICAgICAgZmFjZXRfd3JhcChCU3NfY29uZH4uLCBucm93ID0gMikgKw0KICAgICAgICBzY2FsZV94X2NvbnRpbnVvdXMobGltaXRzID0gYygtMSw1NSksIGJyZWFrcyA9IGMoMCwxMCwyMCwzMCw0MCw1MCkpICsNCiAgICAgICAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoLTEsMTAxKSwgYnJlYWtzID0gYygwLDIwLDQwLDYwLDgwLDEwMCkpICsNCiAgICAgICAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gNTAsIGxpbmV0eXBlID0gImRhc2hlZCIsIGNvbG9yID0gImJsYWNrIikgKw0KICAgICAgICB0aGVtZV9jbGFzc2ljKCkgKw0KICAgICAgICB4bGFiKCJBY2FkZW1pYyBFeHBlcmllbmNlIChpbiB5ZWFycykiKSArDQogICAgICAgIHlsYWIoIlRoZW9yZXRpY2FsIFByb3BvcnRpb24gRXN0aW1hdGUiKSArDQogICAgICAgICAgdGhlbWUoYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksIA0KICAgICAgICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwNCiAgICAgICAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTIpLCANCiAgICAgICAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTIpLA0KICAgICAgICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAicmlnaHQiLA0KICAgICAgICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTQpLA0KICAgICAgICAgICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIHNpemUgPSAxMikpKQ0KYGBgDQoNCg==