cat("\014")     # clean terminal

rm(list = ls()) # clean workspace
try(dev.off(), silent = TRUE) # close all plots
library(afex)
library(emmeans)
library(ggplot2)
library(ggridges)
library(ggdist)
library(dplyr)
library(reshape2)
library(GGally)
library(forcats)
library(readxl)
library(tidyr)
exclude_bad_eeg <- TRUE
theme_set(
  theme_minimal()
)
a_posteriori <- function(afex_aov, sig_level = .05) {
  factors  <- as.list(rownames(afex_aov$anova_table))
  for (j in 1:length(factors)) {
    if (grepl(":", factors[[j]])) {
      factors[[j]] <- unlist(strsplit(factors[[j]], ":"))
    }
  }
  p_values <- afex_aov$anova_table$`Pr(>F)`
  for (i in 1:length(p_values)) {
    if (p_values[i] <= sig_level) {
      print(emmeans(afex_aov, factors[[i]], contr = "pairwise"))
      cat(rep("_", 100), '\n', sep = "")
    }
  }
}
eeg_check <- read_excel(file.path('..', 'bad channels words pemycrep 2022.xlsx'))
eeg_check <- eeg_check %>%
  mutate(badchan_num = ifelse(badchan == '0', 0, sapply(strsplit(badchan, " "), length)))
bad_eeg   <- eeg_check$name[eeg_check$commentary != 'ok']
data_dir  <- file.path('..', 'results')
# target_and_standard_name <- file.path(data_dir, 'average_voltage_275_to_425_auditory_oddball_standard_and_target.txt')
words_name <- file.path(data_dir, 'average_voltage_500_to_700_pemycrep_words.txt')
words_data <- read.table(words_name, header = TRUE, strip.white = TRUE, sep = "\t")
names(words_data)[names(words_data) == "value"] <- "uvolts"
names(words_data)[names(words_data) == "binlabel"] <- "stimulus"
words_data$num_id <- readr::parse_number(words_data$ERPset)
words_data$vulnerability[ grepl("nVul", words_data$ERPset)] <- "Invulnerable"
words_data$vulnerability[!grepl("nVul", words_data$ERPset)] <- "Vulnerable"
words_data$belief[ grepl("nCr", words_data$ERPset)]         <- "Unbeliever"
words_data$belief[!grepl("nCr", words_data$ERPset)]         <- "Believer"
words_data$sex[ grepl("F", words_data$ERPset)]              <- "Female"
words_data$sex[!grepl("F", words_data$ERPset)]              <- "Male"
words_data$area[words_data$chlabel %in% c('FCz', 'E086', 'Fz')]            <- 'Fronto-central Line'
words_data$area[words_data$chlabel %in% c('E090', 'E091', 'E095', 'E096')] <- 'Left frontal'
words_data$num_id          <- factor(words_data$num_id)
words_data$vulnerability   <- factor(words_data$vulnerability)
words_data$sex             <- factor(words_data$sex)
words_data$belief          <- factor(words_data$belief)
words_data$stimulus        <- factor(words_data$stimulus)
words_data$area <- factor(words_data$area)
words_data <- words_data %>% separate(stimulus, c("word_type","congruency", "word_order"), sep = "_")
words_data$word_type  <- factor(words_data$word_type)
words_data$congruency <- factor(words_data$congruency)
words_data$word_order <- factor(words_data$word_order)
if (exclude_bad_eeg) {
  words_data <- words_data[!(words_data$ERPset %in% bad_eeg), ]
  }
write.csv(words_data,  file.path(data_dir, 'words_late_data_clean.csv'),  row.names = FALSE)

1 Participants

options(width = 100)
mytable <- xtabs(~ sex + belief, data = words_data) / length(unique(words_data$chindex)) / length(unique(words_data$bini))
ftable(addmargins(mytable))
       belief Believer Unbeliever Sum
sex                                  
Female              22         25  47
Male                16         14  30
Sum                 38         39  77

2 ERP plots

2.1 Target and Standard:

2.2 Topographic layout:

Primer black, target red.

3 General description

Mean amplitude [500.0 700.0]

options(width = 100)
summary(words_data[c('uvolts', 'sex', 'vulnerability', 'belief', 'area', 'word_type', 'congruency', 'word_order', 'num_id')])
     uvolts             sex            vulnerability         belief                      area     
 Min.   :-31.7584   Female:1974   Invulnerable:2646   Believer  :1596   Fronto-central Line:1386  
 1st Qu.: -4.8759   Male  :1260   Vulnerable  : 588   Unbeliever:1638   Left frontal       :1848  
 Median : -1.8726                                                                                 
 Mean   : -2.3199                                                                                 
 3rd Qu.:  0.4122                                                                                 
 Max.   : 17.6155                                                                                 
                                                                                                  
     word_type          congruency    word_order       num_id    
 Magic    :1078   Congruent  :1617   Target:3234   1      :  42  
 Religious:1078   Incongruent:1617                 3      :  42  
 Secular  :1078                                    6      :  42  
                                                   15     :  42  
                                                   16     :  42  
                                                   20     :  42  
                                                   (Other):2982  

4 Fronto-central Line

4.1 Electrode FCz

options(width = 100)
electrode_data  <- words_data[words_data$chlabel == "FCz", ]
words_rep_anova <- aov_ez("num_id", "uvolts", electrode_data, within = c("word_type", "congruency"), between = c("belief"))
Contrasts set to contr.sum for the following variables: belief
words_afex_plot <-
  afex_plot(
    words_rep_anova,
    x     = "word_type",
    trace = "congruency",
    panel = "belief",
    error = "within",
    error_arg = list(width = .1),
    dodge = -.5,
    mapping = c("color"),
    point_arg = list(size = 4)
  )
suppressWarnings(print(words_afex_plot))

nice(words_rep_anova)
Anova Table (Type 3 tests)

Response: uvolts
                       Effect           df   MSE      F   ges p.value
1                      belief        1, 75 79.18   0.23  .003    .636
2                   word_type 1.66, 124.87  4.83   2.26  .003    .118
3            belief:word_type 1.66, 124.87  4.83   2.40  .003    .104
4                  congruency        1, 75  1.78   1.86 <.001    .177
5           belief:congruency        1, 75  1.78 4.19 *  .001    .044
6        word_type:congruency 1.94, 145.80  3.17   0.58 <.001    .555
7 belief:word_type:congruency 1.94, 145.80  3.17   0.11 <.001    .888
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘+’ 0.1 ‘ ’ 1

Sphericity correction method: GG 
a_posteriori(words_rep_anova)
$emmeans
 belief     congruency  emmean    SE df lower.CL upper.CL
 Believer   Congruent    -2.01 0.599 75    -3.20   -0.812
 Unbeliever Congruent    -1.36 0.591 75    -2.54   -0.180
 Believer   Incongruent  -1.92 0.593 75    -3.10   -0.740
 Unbeliever Incongruent  -1.78 0.585 75    -2.95   -0.616

Results are averaged over the levels of: word_type 
Confidence level used: 0.95 

$contrasts
 contrast                                      estimate    SE df t.ratio p.value
 Believer Congruent - Unbeliever Congruent      -0.6475 0.842 75  -0.769  0.8681
 Believer Congruent - Believer Incongruent      -0.0848 0.177 75  -0.480  0.9632
 Believer Congruent - Unbeliever Incongruent    -0.2246 0.837 75  -0.268  0.9932
 Unbeliever Congruent - Believer Incongruent     0.5627 0.837 75   0.672  0.9073
 Unbeliever Congruent - Unbeliever Incongruent   0.4229 0.174 75   2.427  0.0807
 Believer Incongruent - Unbeliever Incongruent  -0.1398 0.833 75  -0.168  0.9983

Results are averaged over the levels of: word_type 
P value adjustment: tukey method for comparing a family of 4 estimates 

____________________________________________________________________________________________________

4.2 Electrode E086

options(width = 100)
electrode_data  <- words_data[words_data$chlabel == "E086", ]
words_rep_anova <- aov_ez("num_id", "uvolts", electrode_data, within = c("word_type", "congruency"), between = c("belief"))
Contrasts set to contr.sum for the following variables: belief
words_afex_plot <-
  afex_plot(
    words_rep_anova,
    x     = "word_type",
    trace = "congruency",
    panel = "belief",
    error = "within",
    error_arg = list(width = .1),
    dodge = -.5,
    mapping = c("color"),
    point_arg = list(size = 4)
  )
suppressWarnings(print(words_afex_plot))

nice(words_rep_anova)
Anova Table (Type 3 tests)

Response: uvolts
                       Effect           df   MSE      F   ges p.value
1                      belief        1, 75 85.22   0.50  .005    .480
2                   word_type 1.48, 111.07  8.48   2.16  .003    .133
3            belief:word_type 1.48, 111.07  8.48 3.01 +  .005    .069
4                  congruency        1, 75  1.92   2.03 <.001    .159
5           belief:congruency        1, 75  1.92 4.72 *  .001    .033
6        word_type:congruency 1.91, 143.22  3.89   0.65 <.001    .518
7 belief:word_type:congruency 1.91, 143.22  3.89   0.31 <.001    .724
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘+’ 0.1 ‘ ’ 1

Sphericity correction method: GG 
a_posteriori(words_rep_anova)
$emmeans
 belief     congruency  emmean    SE df lower.CL upper.CL
 Believer   Congruent    -2.43 0.618 75    -3.66   -1.201
 Unbeliever Congruent    -1.54 0.610 75    -2.75   -0.326
 Believer   Incongruent  -2.33 0.619 75    -3.57   -1.102
 Unbeliever Incongruent  -2.00 0.611 75    -3.22   -0.788

Results are averaged over the levels of: word_type 
Confidence level used: 0.95 

$contrasts
 contrast                                      estimate    SE df t.ratio p.value
 Believer Congruent - Unbeliever Congruent      -0.8910 0.868 75  -1.027  0.7343
 Believer Congruent - Believer Incongruent      -0.0969 0.184 75  -0.527  0.9522
 Believer Congruent - Unbeliever Incongruent    -0.4267 0.869 75  -0.491  0.9608
 Unbeliever Congruent - Believer Incongruent     0.7942 0.869 75   0.914  0.7974
 Unbeliever Congruent - Unbeliever Incongruent   0.4643 0.181 75   2.560  0.0590
 Believer Incongruent - Unbeliever Incongruent  -0.3299 0.870 75  -0.379  0.9813

Results are averaged over the levels of: word_type 
P value adjustment: tukey method for comparing a family of 4 estimates 

____________________________________________________________________________________________________

4.3 Electrode Fz

options(width = 100)
electrode_data  <- words_data[words_data$chlabel == "Fz", ]
words_rep_anova <- aov_ez("num_id", "uvolts", electrode_data, within = c("word_type", "congruency"), between = c("belief"))
Contrasts set to contr.sum for the following variables: belief
words_afex_plot <-
  afex_plot(
    words_rep_anova,
    x     = "word_type",
    trace = "congruency",
    panel = "belief",
    error = "within",
    error_arg = list(width = .1),
    dodge = -.5,
    mapping = c("color"),
    point_arg = list(size = 4)
  )
suppressWarnings(print(words_afex_plot))

nice(words_rep_anova)
Anova Table (Type 3 tests)

Response: uvolts
                       Effect           df   MSE      F   ges p.value
1                      belief        1, 75 91.25   0.31  .003    .582
2                   word_type 1.54, 115.45  8.76 2.59 +  .004    .093
3            belief:word_type 1.54, 115.45  8.76   2.34  .004    .114
4                  congruency        1, 75  1.98   1.07 <.001    .303
5           belief:congruency        1, 75  1.98 4.61 *  .001    .035
6        word_type:congruency 1.90, 142.76  4.28   0.59 <.001    .550
7 belief:word_type:congruency 1.90, 142.76  4.28   0.53 <.001    .580
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘+’ 0.1 ‘ ’ 1

Sphericity correction method: GG 
a_posteriori(words_rep_anova)
$emmeans
 belief     congruency  emmean    SE df lower.CL upper.CL
 Believer   Congruent    -2.48 0.642 75    -3.76   -1.201
 Unbeliever Congruent    -1.71 0.633 75    -2.97   -0.445
 Believer   Incongruent  -2.33 0.637 75    -3.60   -1.064
 Unbeliever Incongruent  -2.12 0.629 75    -3.38   -0.870

Results are averaged over the levels of: word_type 
Confidence level used: 0.95 

$contrasts
 contrast                                      estimate    SE df t.ratio p.value
 Believer Congruent - Unbeliever Congruent       -0.772 0.902 75  -0.857  0.8270
 Believer Congruent - Believer Incongruent       -0.145 0.186 75  -0.781  0.8629
 Believer Congruent - Unbeliever Incongruent     -0.356 0.899 75  -0.396  0.9788
 Unbeliever Congruent - Believer Incongruent      0.627 0.898 75   0.698  0.8976
 Unbeliever Congruent - Unbeliever Incongruent    0.417 0.184 75   2.267  0.1152
 Believer Incongruent - Unbeliever Incongruent   -0.210 0.895 75  -0.235  0.9954

Results are averaged over the levels of: word_type 
P value adjustment: tukey method for comparing a family of 4 estimates 

____________________________________________________________________________________________________

5 Left frontal

5.1 Electrode E090

options(width = 100)
electrode_data  <- words_data[words_data$chlabel == "E090", ]
words_rep_anova <- aov_ez("num_id", "uvolts", electrode_data, within = c("word_type", "congruency"), between = c("belief"))
Contrasts set to contr.sum for the following variables: belief
words_afex_plot <-
  afex_plot(
    words_rep_anova,
    x     = "word_type",
    trace = "congruency",
    panel = "belief",
    error = "within",
    error_arg = list(width = .1),
    dodge = -.5,
    mapping = c("color"),
    point_arg = list(size = 4)
  )
suppressWarnings(print(words_afex_plot))

nice(words_rep_anova)
Anova Table (Type 3 tests)

Response: uvolts
                       Effect           df    MSE      F   ges p.value
1                      belief        1, 75 116.25   0.01 <.001    .943
2                   word_type 1.64, 122.89  10.25   0.52 <.001    .558
3            belief:word_type 1.64, 122.89  10.25 2.92 +  .004    .068
4                  congruency        1, 75   2.61   0.90 <.001    .347
5           belief:congruency        1, 75   2.61 2.91 + <.001    .092
6        word_type:congruency 1.82, 136.38   4.97   0.32 <.001    .705
7 belief:word_type:congruency 1.82, 136.38   4.97   0.31 <.001    .715
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘+’ 0.1 ‘ ’ 1

Sphericity correction method: GG 
a_posteriori(words_rep_anova)

5.2 Electrode E091

options(width = 100)
electrode_data  <- words_data[words_data$chlabel == "E091", ]
words_rep_anova <- aov_ez("num_id", "uvolts", electrode_data, within = c("word_type", "congruency"), between = c("belief"))
Contrasts set to contr.sum for the following variables: belief
words_afex_plot <-
  afex_plot(
    words_rep_anova,
    x     = "word_type",
    trace = "congruency",
    panel = "belief",
    error = "within",
    error_arg = list(width = .1),
    dodge = -.5,
    mapping = c("color"),
    point_arg = list(size = 4)
  )
suppressWarnings(print(words_afex_plot))

nice(words_rep_anova)
Anova Table (Type 3 tests)

Response: uvolts
                       Effect           df    MSE      F   ges p.value
1                      belief        1, 75 144.64   0.01 <.001    .920
2                   word_type 1.47, 110.40  18.42   0.61  .001    .496
3            belief:word_type 1.47, 110.40  18.42 3.40 +  .006    .051
4                  congruency        1, 75   3.51   1.12 <.001    .292
5           belief:congruency        1, 75   3.51   2.04 <.001    .157
6        word_type:congruency 1.63, 122.45   8.20   0.40 <.001    .629
7 belief:word_type:congruency 1.63, 122.45   8.20   0.15 <.001    .822
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘+’ 0.1 ‘ ’ 1

Sphericity correction method: GG 
a_posteriori(words_rep_anova)

5.3 Electrode E095

options(width = 100)
electrode_data  <- words_data[words_data$chlabel == "E095", ]
words_rep_anova <- aov_ez("num_id", "uvolts", electrode_data, within = c("word_type", "congruency"), between = c("belief"))
Contrasts set to contr.sum for the following variables: belief
words_afex_plot <-
  afex_plot(
    words_rep_anova,
    x     = "word_type",
    trace = "congruency",
    panel = "belief",
    error = "within",
    error_arg = list(width = .1),
    dodge = -.5,
    mapping = c("color"),
    point_arg = list(size = 4)
  )
suppressWarnings(print(words_afex_plot))

nice(words_rep_anova)
Anova Table (Type 3 tests)

Response: uvolts
                       Effect           df    MSE      F   ges p.value
1                      belief        1, 75 153.54   0.19  .002    .665
2                   word_type 1.67, 125.61  14.13   0.42 <.001    .619
3            belief:word_type 1.67, 125.61  14.13 2.99 +  .005    .063
4                  congruency        1, 75   4.74   0.53 <.001    .470
5           belief:congruency        1, 75   4.74   1.63 <.001    .206
6        word_type:congruency 1.60, 119.68   9.54   0.18 <.001    .784
7 belief:word_type:congruency 1.60, 119.68   9.54   1.47  .002    .234
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘+’ 0.1 ‘ ’ 1

Sphericity correction method: GG 
a_posteriori(words_rep_anova)

5.4 Electrode E096

options(width = 100)
electrode_data  <- words_data[words_data$chlabel == "E096", ]
words_rep_anova <- aov_ez("num_id", "uvolts", electrode_data, within = c("word_type", "congruency"), between = c("belief"))
Contrasts set to contr.sum for the following variables: belief
words_afex_plot <-
  afex_plot(
    words_rep_anova,
    x     = "word_type",
    trace = "congruency",
    panel = "belief",
    error = "within",
    error_arg = list(width = .1),
    dodge = -.5,
    mapping = c("color"),
    point_arg = list(size = 4)
  )
suppressWarnings(print(words_afex_plot))

nice(words_rep_anova)
Anova Table (Type 3 tests)

Response: uvolts
                       Effect           df    MSE      F   ges p.value
1                      belief        1, 75 147.07   0.01 <.001    .926
2                   word_type 1.67, 124.99  13.40   0.23 <.001    .756
3            belief:word_type 1.67, 124.99  13.40 2.48 +  .004    .098
4                  congruency        1, 75   4.36   1.00 <.001    .320
5           belief:congruency        1, 75   4.36 2.87 + <.001    .094
6        word_type:congruency 1.70, 127.20   9.17   0.09 <.001    .884
7 belief:word_type:congruency 1.70, 127.20   9.17   0.74 <.001    .459
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘+’ 0.1 ‘ ’ 1

Sphericity correction method: GG 
a_posteriori(words_rep_anova)
LS0tCnRpdGxlOiAiV29yZHMgTGF0ZSBDb21wb25lbnQsIFBlTXlDcmVQIgphdXRob3I6ICJBbHZhcm8gUml2ZXJhLVJlaSIKZGF0ZTogImByIGZvcm1hdChTeXMudGltZSgpLCAnJWQgJUIsICVZJylgIgpvdXRwdXQ6CiAgaHRtbF9ub3RlYm9vazoKICAgIGNvZGVfZm9sZGluZzogaGlkZQogICAgaGlnaGxpZ2h0OiB0YW5nbwogICAgbnVtYmVyX3NlY3Rpb25zOiB5ZXMKICAgIHRoZW1lOiBjZXJ1bGVhbgogICAgdG9jOiB5ZXMKICAgIHRvY19mbG9hdDoKICAgICAgY29sbGFwc2VkOiBubwogICAgICBzbW9vdGhfc2Nyb2xsOiBubwogIHBkZl9kb2N1bWVudDoKICAgIHRvYzogeWVzCnN1YnRpdGxlOiBSZWZlcmVuY2UgYXQgSW5maW5pdHksIFJFU1QgKFJlZmVyZW5jZSBFbGVjdHJvZGUgU3RhbmRhcmRpemF0aW9uIFRlY2huaXF1ZSkuCi0tLQoKYGBge3IgQ2xlYW4gYW5kIExvYWQgTGlicmFyaWVzfQpjYXQoIlwwMTQiKSAgICAgIyBjbGVhbiB0ZXJtaW5hbApybShsaXN0ID0gbHMoKSkgIyBjbGVhbiB3b3Jrc3BhY2UKdHJ5KGRldi5vZmYoKSwgc2lsZW50ID0gVFJVRSkgIyBjbG9zZSBhbGwgcGxvdHMKbGlicmFyeShhZmV4KQpsaWJyYXJ5KGVtbWVhbnMpCmxpYnJhcnkoZ2dwbG90MikKbGlicmFyeShnZ3JpZGdlcykKbGlicmFyeShnZ2Rpc3QpCmxpYnJhcnkoZHBseXIpCmxpYnJhcnkocmVzaGFwZTIpCmxpYnJhcnkoR0dhbGx5KQpsaWJyYXJ5KGZvcmNhdHMpCmxpYnJhcnkocmVhZHhsKQpsaWJyYXJ5KHRpZHlyKQpgYGAKCmBgYHtyIFNldCBEZWZhdWx0c30KZXhjbHVkZV9iYWRfZWVnIDwtIFRSVUUKdGhlbWVfc2V0KAogIHRoZW1lX21pbmltYWwoKQopCmFfcG9zdGVyaW9yaSA8LSBmdW5jdGlvbihhZmV4X2Fvdiwgc2lnX2xldmVsID0gLjA1KSB7CiAgZmFjdG9ycyAgPC0gYXMubGlzdChyb3duYW1lcyhhZmV4X2FvdiRhbm92YV90YWJsZSkpCiAgZm9yIChqIGluIDE6bGVuZ3RoKGZhY3RvcnMpKSB7CiAgICBpZiAoZ3JlcGwoIjoiLCBmYWN0b3JzW1tqXV0pKSB7CiAgICAgIGZhY3RvcnNbW2pdXSA8LSB1bmxpc3Qoc3Ryc3BsaXQoZmFjdG9yc1tbal1dLCAiOiIpKQogICAgfQogIH0KICBwX3ZhbHVlcyA8LSBhZmV4X2FvdiRhbm92YV90YWJsZSRgUHIoPkYpYAogIGZvciAoaSBpbiAxOmxlbmd0aChwX3ZhbHVlcykpIHsKICAgIGlmIChwX3ZhbHVlc1tpXSA8PSBzaWdfbGV2ZWwpIHsKICAgICAgcHJpbnQoZW1tZWFucyhhZmV4X2FvdiwgZmFjdG9yc1tbaV1dLCBjb250ciA9ICJwYWlyd2lzZSIpKQogICAgICBjYXQocmVwKCJfIiwgMTAwKSwgJ1xuJywgc2VwID0gIiIpCiAgICB9CiAgfQp9CmBgYAoKYGBge3IgTG9hZCBvZGRiYWxsIGRhdGF9CmVlZ19jaGVjayA8LSByZWFkX2V4Y2VsKGZpbGUucGF0aCgnLi4nLCAnYmFkIGNoYW5uZWxzIHdvcmRzIHBlbXljcmVwIDIwMjIueGxzeCcpKQplZWdfY2hlY2sgPC0gZWVnX2NoZWNrICU+JQogIG11dGF0ZShiYWRjaGFuX251bSA9IGlmZWxzZShiYWRjaGFuID09ICcwJywgMCwgc2FwcGx5KHN0cnNwbGl0KGJhZGNoYW4sICIgIiksIGxlbmd0aCkpKQpiYWRfZWVnICAgPC0gZWVnX2NoZWNrJG5hbWVbZWVnX2NoZWNrJGNvbW1lbnRhcnkgIT0gJ29rJ10KZGF0YV9kaXIgIDwtIGZpbGUucGF0aCgnLi4nLCAncmVzdWx0cycpCiMgdGFyZ2V0X2FuZF9zdGFuZGFyZF9uYW1lIDwtIGZpbGUucGF0aChkYXRhX2RpciwgJ2F2ZXJhZ2Vfdm9sdGFnZV8yNzVfdG9fNDI1X2F1ZGl0b3J5X29kZGJhbGxfc3RhbmRhcmRfYW5kX3RhcmdldC50eHQnKQp3b3Jkc19uYW1lIDwtIGZpbGUucGF0aChkYXRhX2RpciwgJ2F2ZXJhZ2Vfdm9sdGFnZV81MDBfdG9fNzAwX3BlbXljcmVwX3dvcmRzLnR4dCcpCndvcmRzX2RhdGEgPC0gcmVhZC50YWJsZSh3b3Jkc19uYW1lLCBoZWFkZXIgPSBUUlVFLCBzdHJpcC53aGl0ZSA9IFRSVUUsIHNlcCA9ICJcdCIpCm5hbWVzKHdvcmRzX2RhdGEpW25hbWVzKHdvcmRzX2RhdGEpID09ICJ2YWx1ZSJdIDwtICJ1dm9sdHMiCm5hbWVzKHdvcmRzX2RhdGEpW25hbWVzKHdvcmRzX2RhdGEpID09ICJiaW5sYWJlbCJdIDwtICJzdGltdWx1cyIKd29yZHNfZGF0YSRudW1faWQgPC0gcmVhZHI6OnBhcnNlX251bWJlcih3b3Jkc19kYXRhJEVSUHNldCkKd29yZHNfZGF0YSR2dWxuZXJhYmlsaXR5WyBncmVwbCgiblZ1bCIsIHdvcmRzX2RhdGEkRVJQc2V0KV0gPC0gIkludnVsbmVyYWJsZSIKd29yZHNfZGF0YSR2dWxuZXJhYmlsaXR5WyFncmVwbCgiblZ1bCIsIHdvcmRzX2RhdGEkRVJQc2V0KV0gPC0gIlZ1bG5lcmFibGUiCndvcmRzX2RhdGEkYmVsaWVmWyBncmVwbCgibkNyIiwgd29yZHNfZGF0YSRFUlBzZXQpXSAgICAgICAgIDwtICJVbmJlbGlldmVyIgp3b3Jkc19kYXRhJGJlbGllZlshZ3JlcGwoIm5DciIsIHdvcmRzX2RhdGEkRVJQc2V0KV0gICAgICAgICA8LSAiQmVsaWV2ZXIiCndvcmRzX2RhdGEkc2V4WyBncmVwbCgiRiIsIHdvcmRzX2RhdGEkRVJQc2V0KV0gICAgICAgICAgICAgIDwtICJGZW1hbGUiCndvcmRzX2RhdGEkc2V4WyFncmVwbCgiRiIsIHdvcmRzX2RhdGEkRVJQc2V0KV0gICAgICAgICAgICAgIDwtICJNYWxlIgp3b3Jkc19kYXRhJGFyZWFbd29yZHNfZGF0YSRjaGxhYmVsICVpbiUgYygnRkN6JywgJ0UwODYnLCAnRnonKV0gICAgICAgICAgICA8LSAnRnJvbnRvLWNlbnRyYWwgTGluZScKd29yZHNfZGF0YSRhcmVhW3dvcmRzX2RhdGEkY2hsYWJlbCAlaW4lIGMoJ0UwOTAnLCAnRTA5MScsICdFMDk1JywgJ0UwOTYnKV0gPC0gJ0xlZnQgZnJvbnRhbCcKd29yZHNfZGF0YSRudW1faWQgICAgICAgICAgPC0gZmFjdG9yKHdvcmRzX2RhdGEkbnVtX2lkKQp3b3Jkc19kYXRhJHZ1bG5lcmFiaWxpdHkgICA8LSBmYWN0b3Iod29yZHNfZGF0YSR2dWxuZXJhYmlsaXR5KQp3b3Jkc19kYXRhJHNleCAgICAgICAgICAgICA8LSBmYWN0b3Iod29yZHNfZGF0YSRzZXgpCndvcmRzX2RhdGEkYmVsaWVmICAgICAgICAgIDwtIGZhY3Rvcih3b3Jkc19kYXRhJGJlbGllZikKd29yZHNfZGF0YSRzdGltdWx1cyAgICAgICAgPC0gZmFjdG9yKHdvcmRzX2RhdGEkc3RpbXVsdXMpCndvcmRzX2RhdGEkYXJlYSA8LSBmYWN0b3Iod29yZHNfZGF0YSRhcmVhKQp3b3Jkc19kYXRhIDwtIHdvcmRzX2RhdGEgJT4lIHNlcGFyYXRlKHN0aW11bHVzLCBjKCJ3b3JkX3R5cGUiLCJjb25ncnVlbmN5IiwgIndvcmRfb3JkZXIiKSwgc2VwID0gIl8iKQp3b3Jkc19kYXRhJHdvcmRfdHlwZSAgPC0gZmFjdG9yKHdvcmRzX2RhdGEkd29yZF90eXBlKQp3b3Jkc19kYXRhJGNvbmdydWVuY3kgPC0gZmFjdG9yKHdvcmRzX2RhdGEkY29uZ3J1ZW5jeSkKd29yZHNfZGF0YSR3b3JkX29yZGVyIDwtIGZhY3Rvcih3b3Jkc19kYXRhJHdvcmRfb3JkZXIpCmlmIChleGNsdWRlX2JhZF9lZWcpIHsKICB3b3Jkc19kYXRhIDwtIHdvcmRzX2RhdGFbISh3b3Jkc19kYXRhJEVSUHNldCAlaW4lIGJhZF9lZWcpLCBdCiAgfQp3cml0ZS5jc3Yod29yZHNfZGF0YSwgIGZpbGUucGF0aChkYXRhX2RpciwgJ3dvcmRzX2xhdGVfZGF0YV9jbGVhbi5jc3YnKSwgIHJvdy5uYW1lcyA9IEZBTFNFKQpgYGAKCiMgUGFydGljaXBhbnRzCmBgYHtyIHBhcnRpY2lwYW50cywgZmlnLndpZHRoID0gMTJ9Cm9wdGlvbnMod2lkdGggPSAxMDApCm15dGFibGUgPC0geHRhYnMofiBzZXggKyBiZWxpZWYsIGRhdGEgPSB3b3Jkc19kYXRhKSAvIGxlbmd0aCh1bmlxdWUod29yZHNfZGF0YSRjaGluZGV4KSkgLyBsZW5ndGgodW5pcXVlKHdvcmRzX2RhdGEkYmluaSkpCmZ0YWJsZShhZGRtYXJnaW5zKG15dGFibGUpKQpgYGAKCiMgRVJQIHBsb3RzCiMjIFRhcmdldCBhbmQgU3RhbmRhcmQ6CiFbXShwZW15Y3JlcF93b3Jkc190YXJnZXRzLnBuZykKCiMjIFRvcG9ncmFwaGljIGxheW91dDoKUHJpbWVyIGJsYWNrLCB0YXJnZXQgcmVkLgohW10ocGVteWNyZXBfd29yZHNfdG9wb2dyYXBoeS5wbmcpCgojIEdlbmVyYWwgZGVzY3JpcHRpb24KTWVhbiBhbXBsaXR1ZGUgYHIgd29yZHNfZGF0YSR3b3JrbGF0WzFdYApgYGB7ciBnZW5lcmFsLCBmaWcud2lkdGggPSAxMn0Kb3B0aW9ucyh3aWR0aCA9IDEwMCkKc3VtbWFyeSh3b3Jkc19kYXRhW2MoJ3V2b2x0cycsICdzZXgnLCAndnVsbmVyYWJpbGl0eScsICdiZWxpZWYnLCAnYXJlYScsICd3b3JkX3R5cGUnLCAnY29uZ3J1ZW5jeScsICd3b3JkX29yZGVyJywgJ251bV9pZCcpXSkKYGBgCgojIEZyb250by1jZW50cmFsIExpbmUKCiMjIEVsZWN0cm9kZSBGQ3oKYGBge3IgRkN6LCBmaWcud2lkdGggPSAxMn0Kb3B0aW9ucyh3aWR0aCA9IDEwMCkKZWxlY3Ryb2RlX2RhdGEgIDwtIHdvcmRzX2RhdGFbd29yZHNfZGF0YSRjaGxhYmVsID09ICJGQ3oiLCBdCndvcmRzX3JlcF9hbm92YSA8LSBhb3ZfZXooIm51bV9pZCIsICJ1dm9sdHMiLCBlbGVjdHJvZGVfZGF0YSwgd2l0aGluID0gYygid29yZF90eXBlIiwgImNvbmdydWVuY3kiKSwgYmV0d2VlbiA9IGMoImJlbGllZiIpKQp3b3Jkc19hZmV4X3Bsb3QgPC0KICBhZmV4X3Bsb3QoCiAgICB3b3Jkc19yZXBfYW5vdmEsCiAgICB4ICAgICA9ICJ3b3JkX3R5cGUiLAogICAgdHJhY2UgPSAiY29uZ3J1ZW5jeSIsCiAgICBwYW5lbCA9ICJiZWxpZWYiLAogICAgZXJyb3IgPSAid2l0aGluIiwKICAgIGVycm9yX2FyZyA9IGxpc3Qod2lkdGggPSAuMSksCiAgICBkb2RnZSA9IC0uNSwKICAgIG1hcHBpbmcgPSBjKCJjb2xvciIpLAogICAgcG9pbnRfYXJnID0gbGlzdChzaXplID0gNCkKICApCnN1cHByZXNzV2FybmluZ3MocHJpbnQod29yZHNfYWZleF9wbG90KSkKbmljZSh3b3Jkc19yZXBfYW5vdmEpCmFfcG9zdGVyaW9yaSh3b3Jkc19yZXBfYW5vdmEpCmBgYAoKIyMgRWxlY3Ryb2RlIEUwODYKYGBge3IgRTA4NiwgZmlnLndpZHRoID0gMTJ9Cm9wdGlvbnMod2lkdGggPSAxMDApCmVsZWN0cm9kZV9kYXRhICA8LSB3b3Jkc19kYXRhW3dvcmRzX2RhdGEkY2hsYWJlbCA9PSAiRTA4NiIsIF0Kd29yZHNfcmVwX2Fub3ZhIDwtIGFvdl9leigibnVtX2lkIiwgInV2b2x0cyIsIGVsZWN0cm9kZV9kYXRhLCB3aXRoaW4gPSBjKCJ3b3JkX3R5cGUiLCAiY29uZ3J1ZW5jeSIpLCBiZXR3ZWVuID0gYygiYmVsaWVmIikpCndvcmRzX2FmZXhfcGxvdCA8LQogIGFmZXhfcGxvdCgKICAgIHdvcmRzX3JlcF9hbm92YSwKICAgIHggICAgID0gIndvcmRfdHlwZSIsCiAgICB0cmFjZSA9ICJjb25ncnVlbmN5IiwKICAgIHBhbmVsID0gImJlbGllZiIsCiAgICBlcnJvciA9ICJ3aXRoaW4iLAogICAgZXJyb3JfYXJnID0gbGlzdCh3aWR0aCA9IC4xKSwKICAgIGRvZGdlID0gLS41LAogICAgbWFwcGluZyA9IGMoImNvbG9yIiksCiAgICBwb2ludF9hcmcgPSBsaXN0KHNpemUgPSA0KQogICkKc3VwcHJlc3NXYXJuaW5ncyhwcmludCh3b3Jkc19hZmV4X3Bsb3QpKQpuaWNlKHdvcmRzX3JlcF9hbm92YSkKYV9wb3N0ZXJpb3JpKHdvcmRzX3JlcF9hbm92YSkKYGBgCgojIyBFbGVjdHJvZGUgRnoKYGBge3IgRnosIGZpZy53aWR0aCA9IDEyfQpvcHRpb25zKHdpZHRoID0gMTAwKQplbGVjdHJvZGVfZGF0YSAgPC0gd29yZHNfZGF0YVt3b3Jkc19kYXRhJGNobGFiZWwgPT0gIkZ6IiwgXQp3b3Jkc19yZXBfYW5vdmEgPC0gYW92X2V6KCJudW1faWQiLCAidXZvbHRzIiwgZWxlY3Ryb2RlX2RhdGEsIHdpdGhpbiA9IGMoIndvcmRfdHlwZSIsICJjb25ncnVlbmN5IiksIGJldHdlZW4gPSBjKCJiZWxpZWYiKSkKd29yZHNfYWZleF9wbG90IDwtCiAgYWZleF9wbG90KAogICAgd29yZHNfcmVwX2Fub3ZhLAogICAgeCAgICAgPSAid29yZF90eXBlIiwKICAgIHRyYWNlID0gImNvbmdydWVuY3kiLAogICAgcGFuZWwgPSAiYmVsaWVmIiwKICAgIGVycm9yID0gIndpdGhpbiIsCiAgICBlcnJvcl9hcmcgPSBsaXN0KHdpZHRoID0gLjEpLAogICAgZG9kZ2UgPSAtLjUsCiAgICBtYXBwaW5nID0gYygiY29sb3IiKSwKICAgIHBvaW50X2FyZyA9IGxpc3Qoc2l6ZSA9IDQpCiAgKQpzdXBwcmVzc1dhcm5pbmdzKHByaW50KHdvcmRzX2FmZXhfcGxvdCkpCm5pY2Uod29yZHNfcmVwX2Fub3ZhKQphX3Bvc3Rlcmlvcmkod29yZHNfcmVwX2Fub3ZhKQpgYGAKCiMgTGVmdCBmcm9udGFsCgojIyBFbGVjdHJvZGUgRTA5MApgYGB7ciBFMDkwLCBmaWcud2lkdGggPSAxMn0Kb3B0aW9ucyh3aWR0aCA9IDEwMCkKZWxlY3Ryb2RlX2RhdGEgIDwtIHdvcmRzX2RhdGFbd29yZHNfZGF0YSRjaGxhYmVsID09ICJFMDkwIiwgXQp3b3Jkc19yZXBfYW5vdmEgPC0gYW92X2V6KCJudW1faWQiLCAidXZvbHRzIiwgZWxlY3Ryb2RlX2RhdGEsIHdpdGhpbiA9IGMoIndvcmRfdHlwZSIsICJjb25ncnVlbmN5IiksIGJldHdlZW4gPSBjKCJiZWxpZWYiKSkKd29yZHNfYWZleF9wbG90IDwtCiAgYWZleF9wbG90KAogICAgd29yZHNfcmVwX2Fub3ZhLAogICAgeCAgICAgPSAid29yZF90eXBlIiwKICAgIHRyYWNlID0gImNvbmdydWVuY3kiLAogICAgcGFuZWwgPSAiYmVsaWVmIiwKICAgIGVycm9yID0gIndpdGhpbiIsCiAgICBlcnJvcl9hcmcgPSBsaXN0KHdpZHRoID0gLjEpLAogICAgZG9kZ2UgPSAtLjUsCiAgICBtYXBwaW5nID0gYygiY29sb3IiKSwKICAgIHBvaW50X2FyZyA9IGxpc3Qoc2l6ZSA9IDQpCiAgKQpzdXBwcmVzc1dhcm5pbmdzKHByaW50KHdvcmRzX2FmZXhfcGxvdCkpCm5pY2Uod29yZHNfcmVwX2Fub3ZhKQphX3Bvc3Rlcmlvcmkod29yZHNfcmVwX2Fub3ZhKQpgYGAKCiMjIEVsZWN0cm9kZSBFMDkxCmBgYHtyIEUwOTEsIGZpZy53aWR0aCA9IDEyfQpvcHRpb25zKHdpZHRoID0gMTAwKQplbGVjdHJvZGVfZGF0YSAgPC0gd29yZHNfZGF0YVt3b3Jkc19kYXRhJGNobGFiZWwgPT0gIkUwOTEiLCBdCndvcmRzX3JlcF9hbm92YSA8LSBhb3ZfZXooIm51bV9pZCIsICJ1dm9sdHMiLCBlbGVjdHJvZGVfZGF0YSwgd2l0aGluID0gYygid29yZF90eXBlIiwgImNvbmdydWVuY3kiKSwgYmV0d2VlbiA9IGMoImJlbGllZiIpKQp3b3Jkc19hZmV4X3Bsb3QgPC0KICBhZmV4X3Bsb3QoCiAgICB3b3Jkc19yZXBfYW5vdmEsCiAgICB4ICAgICA9ICJ3b3JkX3R5cGUiLAogICAgdHJhY2UgPSAiY29uZ3J1ZW5jeSIsCiAgICBwYW5lbCA9ICJiZWxpZWYiLAogICAgZXJyb3IgPSAid2l0aGluIiwKICAgIGVycm9yX2FyZyA9IGxpc3Qod2lkdGggPSAuMSksCiAgICBkb2RnZSA9IC0uNSwKICAgIG1hcHBpbmcgPSBjKCJjb2xvciIpLAogICAgcG9pbnRfYXJnID0gbGlzdChzaXplID0gNCkKICApCnN1cHByZXNzV2FybmluZ3MocHJpbnQod29yZHNfYWZleF9wbG90KSkKbmljZSh3b3Jkc19yZXBfYW5vdmEpCmFfcG9zdGVyaW9yaSh3b3Jkc19yZXBfYW5vdmEpCmBgYAoKIyMgRWxlY3Ryb2RlIEUwOTUKYGBge3IgRTA5NSwgZmlnLndpZHRoID0gMTJ9Cm9wdGlvbnMod2lkdGggPSAxMDApCmVsZWN0cm9kZV9kYXRhICA8LSB3b3Jkc19kYXRhW3dvcmRzX2RhdGEkY2hsYWJlbCA9PSAiRTA5NSIsIF0Kd29yZHNfcmVwX2Fub3ZhIDwtIGFvdl9leigibnVtX2lkIiwgInV2b2x0cyIsIGVsZWN0cm9kZV9kYXRhLCB3aXRoaW4gPSBjKCJ3b3JkX3R5cGUiLCAiY29uZ3J1ZW5jeSIpLCBiZXR3ZWVuID0gYygiYmVsaWVmIikpCndvcmRzX2FmZXhfcGxvdCA8LQogIGFmZXhfcGxvdCgKICAgIHdvcmRzX3JlcF9hbm92YSwKICAgIHggICAgID0gIndvcmRfdHlwZSIsCiAgICB0cmFjZSA9ICJjb25ncnVlbmN5IiwKICAgIHBhbmVsID0gImJlbGllZiIsCiAgICBlcnJvciA9ICJ3aXRoaW4iLAogICAgZXJyb3JfYXJnID0gbGlzdCh3aWR0aCA9IC4xKSwKICAgIGRvZGdlID0gLS41LAogICAgbWFwcGluZyA9IGMoImNvbG9yIiksCiAgICBwb2ludF9hcmcgPSBsaXN0KHNpemUgPSA0KQogICkKc3VwcHJlc3NXYXJuaW5ncyhwcmludCh3b3Jkc19hZmV4X3Bsb3QpKQpuaWNlKHdvcmRzX3JlcF9hbm92YSkKYV9wb3N0ZXJpb3JpKHdvcmRzX3JlcF9hbm92YSkKYGBgCgojIyBFbGVjdHJvZGUgRTA5NgpgYGB7ciBFMDk2LCBmaWcud2lkdGggPSAxMn0Kb3B0aW9ucyh3aWR0aCA9IDEwMCkKZWxlY3Ryb2RlX2RhdGEgIDwtIHdvcmRzX2RhdGFbd29yZHNfZGF0YSRjaGxhYmVsID09ICJFMDk2IiwgXQp3b3Jkc19yZXBfYW5vdmEgPC0gYW92X2V6KCJudW1faWQiLCAidXZvbHRzIiwgZWxlY3Ryb2RlX2RhdGEsIHdpdGhpbiA9IGMoIndvcmRfdHlwZSIsICJjb25ncnVlbmN5IiksIGJldHdlZW4gPSBjKCJiZWxpZWYiKSkKd29yZHNfYWZleF9wbG90IDwtCiAgYWZleF9wbG90KAogICAgd29yZHNfcmVwX2Fub3ZhLAogICAgeCAgICAgPSAid29yZF90eXBlIiwKICAgIHRyYWNlID0gImNvbmdydWVuY3kiLAogICAgcGFuZWwgPSAiYmVsaWVmIiwKICAgIGVycm9yID0gIndpdGhpbiIsCiAgICBlcnJvcl9hcmcgPSBsaXN0KHdpZHRoID0gLjEpLAogICAgZG9kZ2UgPSAtLjUsCiAgICBtYXBwaW5nID0gYygiY29sb3IiKSwKICAgIHBvaW50X2FyZyA9IGxpc3Qoc2l6ZSA9IDQpCiAgKQpzdXBwcmVzc1dhcm5pbmdzKHByaW50KHdvcmRzX2FmZXhfcGxvdCkpCm5pY2Uod29yZHNfcmVwX2Fub3ZhKQphX3Bvc3Rlcmlvcmkod29yZHNfcmVwX2Fub3ZhKQpgYGAK