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)
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"))
    }
  }
}
master_dir                 <- '~/Insync/Drive/00EEG/Proyectos/Huepe/fdcyt_2017/resting_huepe'
data_dir                   <- paste(master_dir, 'FAA_results',  sep = '/')
alpha_power_data_name      <- paste(data_dir, 'average_alpha_power_9_to_11_resting_3_times.txt', sep='/')
alpha_power_data           <- read.table(alpha_power_data_name, header = TRUE, strip.white = TRUE, sep = "\t")
names(alpha_power_data)[names(alpha_power_data) == 'chlabel'] <- 'Electrode'
names(alpha_power_data)[names(alpha_power_data) == 'ERPset']  <- 'Dataset'
names(alpha_power_data)[names(alpha_power_data) == 'binlabel']  <- 'Period'
alpha_power_data$Subject   <- as.numeric(gsub(".*?([0-9]+).*", "\\1", alpha_power_data$Dataset))
alpha_power_data$log10_uvolts <- log10(alpha_power_data$value)
alpha_power_data$Dataset   <- factor(alpha_power_data$Dataset)
alpha_power_data$Electrode <- factor(alpha_power_data$Electrode)
alpha_power_data$Subject   <- factor(alpha_power_data$Subject)
alpha_power_data$Period    <- factor(alpha_power_data$Period, levels = c("beginning", "middle", "end"))
alpha_power_data$hemisphere[alpha_power_data$Electrode %in% c('E093-Fp1',  'E092-AF3a',  'E094-AF7',  'E089-F1a',  'E100-F3a',  'E101-F5a',  'E103-F7',  'E088-FC1a')] <- 'Left'
alpha_power_data$hemisphere[alpha_power_data$Electrode %in% c('E080-Fp2',  'E079-AF4a',  'E072-AF8',  'E076-F2a',  'E068-F4a',  'E069-F6a',  'E071-F8',  'E075-FC2a')] <- 'Right'
alpha_power_data$hemisphere <- factor(alpha_power_data$hemisphere)
alpha_power_data$electrode_pair[alpha_power_data$Electrode %in% c('E093-Fp1' , 'E080-Fp2')]  <- 'Fp1-Fp2'
alpha_power_data$electrode_pair[alpha_power_data$Electrode %in% c('E092-AF3a', 'E079-AF4a')] <- 'AF3-AF4'
alpha_power_data$electrode_pair[alpha_power_data$Electrode %in% c('E094-AF7' , 'E072-AF8')]  <- 'AF7-AF8'
alpha_power_data$electrode_pair[alpha_power_data$Electrode %in% c('E089-F1a' , 'E076-F2a')]  <- 'F1-F2'
alpha_power_data$electrode_pair[alpha_power_data$Electrode %in% c('E100-F3a' , 'E068-F4a')]  <- 'F3-F4'
alpha_power_data$electrode_pair[alpha_power_data$Electrode %in% c('E101-F5a' , 'E069-F6a')]  <- 'F5-F6'
alpha_power_data$electrode_pair[alpha_power_data$Electrode %in% c('E103-F7'  , 'E071-F8')]   <- 'F7-F8'
alpha_power_data$electrode_pair[alpha_power_data$Electrode %in% c('E088-FC1a', 'E075-FC2a')] <- 'FC1-FC2'
alpha_power_data$electrode_pair <- factor(alpha_power_data$electrode_pair, levels = c('Fp1-Fp2', 'AF3-AF4', 'AF7-AF8', 'F1-F2', 'F3-F4','F5-F6', 'F7-F8', 'FC1-FC2'))
group_id   <- read.table("/home/alvaro/Insync/Drive/00EEG/Proyectos/Huepe/fdcyt_2017/Registro-Evaluaciones-FDCYT-DH-2017 - General ANONIMO.csv",
                         sep = ",", header = TRUE, col.names = c("full.id", "Subject", "Sex", "Group", "Stress"))
group_id$Sex           <- factor(group_id$Sex)
group_id$Group         <- factor(group_id$Group)
levels(group_id$Sex)   <- list(female  = "F", male  = "M")
levels(group_id$Group) <- list(invulnerable  = "CN", vulnerable  = "EX")
group_id               <- group_id[c('Subject', 'Group', 'Sex')]
alpha_power_data       <- merge(alpha_power_data, group_id, by = 'Subject')
write.csv(alpha_power_data,  paste(data_dir, '/alpha_power_data_clean_old(bad)_style.csv', sep = ''),  row.names = FALSE)
asymmetry_Fp2_Fp1 <- c()
asymmetry_AF4_AF3 <- c()
asymmetry_AF8_AF7 <- c()
asymmetry_F2_F1   <- c()
asymmetry_F4_F3   <- c()
asymmetry_F6_F5   <- c()
asymmetry_F8_F7   <- c()
asymmetry_FC2_FC1 <- c()
Subject           <- c()
Period            <- c()
subjectos <- levels(alpha_power_data$Subject)
periodos  <- levels(alpha_power_data$Period)
for (subj in subjectos) {
  for (part in periodos) {
    subject_data <- subset(alpha_power_data, Subject == subj & Period == part)
    Subject           <- c(Subject, as.character(subject_data$Subject[1]))
    Period            <- c(Period, as.character(subject_data$Period[1]))
    asymmetry_Fp2_Fp1 <- c(asymmetry_Fp2_Fp1, subject_data[which(subject_data$Electrode == 'E080-Fp2') , 10] - subject_data[which(subject_data$Electrode=='E093-Fp1') , 10])
    asymmetry_AF4_AF3 <- c(asymmetry_AF4_AF3, subject_data[which(subject_data$Electrode == 'E079-AF4a'), 10] - subject_data[which(subject_data$Electrode=='E092-AF3a'), 10])
    asymmetry_AF8_AF7 <- c(asymmetry_AF8_AF7, subject_data[which(subject_data$Electrode == 'E072-AF8') , 10] - subject_data[which(subject_data$Electrode=='E094-AF7') , 10])
    asymmetry_F2_F1   <- c(asymmetry_F2_F1  , subject_data[which(subject_data$Electrode == 'E076-F2a') , 10] - subject_data[which(subject_data$Electrode=='E089-F1a') , 10])
    asymmetry_F4_F3   <- c(asymmetry_F4_F3  , subject_data[which(subject_data$Electrode == 'E068-F4a') , 10] - subject_data[which(subject_data$Electrode=='E100-F3a') , 10])
    asymmetry_F6_F5   <- c(asymmetry_F6_F5  , subject_data[which(subject_data$Electrode == 'E069-F6a') , 10] - subject_data[which(subject_data$Electrode=='E101-F5a') , 10])
    asymmetry_F8_F7   <- c(asymmetry_F8_F7  , subject_data[which(subject_data$Electrode == 'E071-F8')  , 10] - subject_data[which(subject_data$Electrode=='E103-F7')  , 10])
    asymmetry_FC2_FC1 <- c(asymmetry_FC2_FC1, subject_data[which(subject_data$Electrode == 'E075-FC2a'), 10] - subject_data[which(subject_data$Electrode=='E088-FC1a'), 10])
  }
}
alpha_asymmetry_data <- data.frame(Subject, Period, asymmetry_Fp2_Fp1, asymmetry_AF4_AF3, asymmetry_AF8_AF7, asymmetry_F2_F1, asymmetry_F4_F3, asymmetry_F6_F5, asymmetry_F8_F7, asymmetry_FC2_FC1)
alpha_asymmetry_data$Subject <- factor(alpha_asymmetry_data$Subject)
alpha_asymmetry_data$Period <- factor(alpha_asymmetry_data$Period, levels = c("beginning", "middle", "end"))
alpha_asymmetry_data <- merge(alpha_asymmetry_data, group_id, by = 'Subject')
write.csv(alpha_asymmetry_data,  paste(data_dir, '/alpha_asymmetry_data_clean_old(bad)_style.csv', sep = ''),  row.names = FALSE)

1 Spectral decomposition

  • Infinity Reference or Reference Electrode Standardization Technique (REST).
  • 120 consecutive segments, 5 seconds each.
  • 3 Periods, 40 segments each.
  • PSD computed with Welch’s method.

1.1 Scalp Map, mean power [9.0 11.0] Hz

1.2 PSD topography, 1 to 55 Hz, grand average

1.3 PSD topography, 4 to 30 Hz, grand average

1.4 Frontal Electrodes, 4 to 30 Hz, grand average

  • 2 standard error bands Frontal electrodes

2 General Description

options(width = 100)
summary(alpha_asymmetry_data)
    Subject          Period   asymmetry_Fp2_Fp1   asymmetry_AF4_AF3   asymmetry_AF8_AF7  
 1      :  3   beginning:77   Min.   :-0.310444   Min.   :-0.287329   Min.   :-0.557232  
 10     :  3   middle   :77   1st Qu.:-0.035430   1st Qu.:-0.037404   1st Qu.:-0.069376  
 11     :  3   end      :77   Median : 0.008193   Median : 0.002536   Median : 0.003581  
 12     :  3                  Mean   : 0.023631   Mean   : 0.004174   Mean   : 0.004315  
 13     :  3                  3rd Qu.: 0.059022   3rd Qu.: 0.039573   3rd Qu.: 0.086802  
 14     :  3                  Max.   : 0.946861   Max.   : 0.420243   Max.   : 1.284300  
 (Other):213                                                                             
 asymmetry_F2_F1     asymmetry_F4_F3     asymmetry_F6_F5     asymmetry_F8_F7    asymmetry_FC2_FC1 
 Min.   :-0.148967   Min.   :-0.379484   Min.   :-0.354521   Min.   :-0.56596   Min.   :-0.46405  
 1st Qu.:-0.022153   1st Qu.:-0.064552   1st Qu.:-0.060480   1st Qu.:-0.10231   1st Qu.:-0.02340  
 Median : 0.007042   Median :-0.001131   Median : 0.002679   Median : 0.00198   Median : 0.01202  
 Mean   : 0.005953   Mean   :-0.005603   Mean   :-0.009089   Mean   :-0.01688   Mean   : 0.01307  
 3rd Qu.: 0.028496   3rd Qu.: 0.058105   3rd Qu.: 0.062659   3rd Qu.: 0.08143   3rd Qu.: 0.05438  
 Max.   : 0.170082   Max.   : 0.276392   Max.   : 0.291835   Max.   : 0.93128   Max.   : 0.35410  
                                                                                                  
          Group         Sex     
 invulnerable:117   female:129  
 vulnerable  :114   male  :102  
                                
                                
                                
                                
                                
asymmetry_pairs <- c('asymmetry_Fp2_Fp1', 'asymmetry_AF4_AF3', 'asymmetry_AF8_AF7', 'asymmetry_F2_F1', 'asymmetry_F4_F3', 'asymmetry_F6_F5', 'asymmetry_F8_F7', 'asymmetry_FC2_FC1')
asymmetry_pairs_pairs <- ggpairs(alpha_asymmetry_data,
                       columns = asymmetry_pairs,
                       aes(colour = Period, alpha = .25),
                       progress = FALSE,
                       lower = list(continuous = wrap("points")))
suppressWarnings(print(asymmetry_pairs_pairs))

3 Alpha Asymmetry, [9.0 11.0] Hz

3.1 Fp2-Fp1 pair

options(width = 100)
alpha_asymmetry_rep_anova = aov_ez("Subject", "asymmetry_Fp2_Fp1", alpha_asymmetry_data, between = c("Group", "Sex"), within = "Period")
Contrasts set to contr.sum for the following variables: Group, Sex
mytable <- xtabs(~ Group + Sex, data = alpha_asymmetry_rep_anova$data$long) / length(unique(alpha_asymmetry_data$Period))
ftable(addmargins(mytable))
             Sex female male Sum
Group                           
invulnerable         19   20  39
vulnerable           24   14  38
Sum                  43   34  77
alpha_asymmetry_rain <- ggplot(alpha_asymmetry_rep_anova$data$long, aes(y = asymmetry_Fp2_Fp1, x = Group, color = Sex, fill = Sex)) +
  # ggtitle("alpha_asymmetry") +
  ylab("power") +
  stat_halfeye(
    trim   = FALSE, 
    adjust = 1, 
    .width = 0, 
    justification = -.15, 
    alpha  = .5,
    point_colour = NA) + 
  # theme(legend.position='none')
  # geom_boxplot(width = .15, alpha = .2, outlier.shape = NA) +
  geom_point(size = 2, alpha = .4, position = position_jitter(width = .05, height = 0)) 
suppressWarnings(print(alpha_asymmetry_rain))

alpha_asymmetry_afex_plot <-
  afex_plot(
    alpha_asymmetry_rep_anova,
    x = "Period",
    trace = "Sex",
    panel = "Group",
    error = "between",
    error_arg = list(width = .1),
    dodge = -.5,
    mapping = c("color"),
    point_arg = list(size = 4)
  )
Warning: Panel(s) show a mixed within-between-design.
Error bars do not allow comparisons across all means.
Suppress error bars with: error = "none"
suppressWarnings(print(alpha_asymmetry_afex_plot))

nice(alpha_asymmetry_rep_anova)
Anova Table (Type 3 tests)

Response: asymmetry_Fp2_Fp1
            Effect           df  MSE    F   ges p.value
1            Group        1, 73 0.04 0.12  .001    .731
2              Sex        1, 73 0.04 0.60  .006    .443
3        Group:Sex        1, 73 0.04 2.06  .021    .156
4           Period 1.98, 144.52 0.01 0.27 <.001    .765
5     Group:Period 1.98, 144.52 0.01 1.52  .005    .222
6       Sex:Period 1.98, 144.52 0.01 1.93  .006    .149
7 Group:Sex:Period 1.98, 144.52 0.01 0.11 <.001    .891
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘+’ 0.1 ‘ ’ 1

Sphericity correction method: GG 
a_posteriori(alpha_asymmetry_rep_anova)

3.2 AF4-AF3 pair

options(width = 100)
alpha_asymmetry_rep_anova = aov_ez("Subject", "asymmetry_AF4_AF3", alpha_asymmetry_data, between = c("Group", "Sex"), within = "Period")
Contrasts set to contr.sum for the following variables: Group, Sex
mytable <- xtabs(~ Group + Sex, data = alpha_asymmetry_rep_anova$data$long) / length(unique(alpha_asymmetry_data$Period))
ftable(addmargins(mytable))
             Sex female male Sum
Group                           
invulnerable         19   20  39
vulnerable           24   14  38
Sum                  43   34  77
alpha_asymmetry_rain <- ggplot(alpha_asymmetry_rep_anova$data$long, aes(y = asymmetry_AF4_AF3, x = Group, color = Sex, fill = Sex)) +
  # ggtitle("alpha_asymmetry") +
  ylab("power") +
  stat_halfeye(
    trim   = FALSE, 
    adjust = 1, 
    .width = 0, 
    justification = -.15, 
    alpha  = .5,
    point_colour = NA) + 
  # theme(legend.position='none')
  # geom_boxplot(width = .15, alpha = .2, outlier.shape = NA) +
  geom_point(size = 2, alpha = .4, position = position_jitter(width = .05, height = 0)) 
suppressWarnings(print(alpha_asymmetry_rain))

alpha_asymmetry_afex_plot <-
  afex_plot(
    alpha_asymmetry_rep_anova,
    x = "Period",
    trace = "Sex",
    panel = "Group",
    error = "between",
    error_arg = list(width = .1),
    dodge = -.5,
    mapping = c("color"),
    point_arg = list(size = 4)
  )
Warning: Panel(s) show a mixed within-between-design.
Error bars do not allow comparisons across all means.
Suppress error bars with: error = "none"
suppressWarnings(print(alpha_asymmetry_afex_plot))

nice(alpha_asymmetry_rep_anova)
Anova Table (Type 3 tests)

Response: asymmetry_AF4_AF3
            Effect           df  MSE      F   ges p.value
1            Group        1, 73 0.03 2.88 +  .035    .094
2              Sex        1, 73 0.03   1.54  .019    .218
3        Group:Sex        1, 73 0.03   1.23  .015    .271
4           Period 1.91, 139.76 0.00   0.54 <.001    .578
5     Group:Period 1.91, 139.76 0.00   1.06  .001    .348
6       Sex:Period 1.91, 139.76 0.00   0.77 <.001    .458
7 Group:Sex:Period 1.91, 139.76 0.00   0.10 <.001    .893
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘+’ 0.1 ‘ ’ 1

Sphericity correction method: GG 
a_posteriori(alpha_asymmetry_rep_anova)

3.3 AF8-AF7 pair

options(width = 100)
alpha_asymmetry_rep_anova = aov_ez("Subject", "asymmetry_AF8_AF7", alpha_asymmetry_data, between = c("Group", "Sex"), within = "Period")
Contrasts set to contr.sum for the following variables: Group, Sex
mytable <- xtabs(~ Group + Sex, data = alpha_asymmetry_rep_anova$data$long) / length(unique(alpha_asymmetry_data$Period))
ftable(addmargins(mytable))
             Sex female male Sum
Group                           
invulnerable         19   20  39
vulnerable           24   14  38
Sum                  43   34  77
alpha_asymmetry_rain <- ggplot(alpha_asymmetry_rep_anova$data$long, aes(y = asymmetry_AF8_AF7, x = Group, color = Sex, fill = Sex)) +
  # ggtitle("alpha_asymmetry") +
  ylab("power") +
  stat_halfeye(
    trim   = FALSE, 
    adjust = 1, 
    .width = 0, 
    justification = -.15, 
    alpha  = .5,
    point_colour = NA) + 
  # theme(legend.position='none')
  # geom_boxplot(width = .15, alpha = .2, outlier.shape = NA) +
  geom_point(size = 2, alpha = .4, position = position_jitter(width = .05, height = 0)) 
suppressWarnings(print(alpha_asymmetry_rain))

alpha_asymmetry_afex_plot <-
  afex_plot(
    alpha_asymmetry_rep_anova,
    x = "Period",
    trace = "Sex",
    panel = "Group",
    error = "between",
    error_arg = list(width = .1),
    dodge = -.5,
    mapping = c("color"),
    point_arg = list(size = 4)
  )
Warning: Panel(s) show a mixed within-between-design.
Error bars do not allow comparisons across all means.
Suppress error bars with: error = "none"
suppressWarnings(print(alpha_asymmetry_afex_plot))

nice(alpha_asymmetry_rep_anova)
Anova Table (Type 3 tests)

Response: asymmetry_AF8_AF7
            Effect           df  MSE      F   ges p.value
1            Group        1, 73 0.12   2.08  .026    .154
2              Sex        1, 73 0.12 2.80 +  .034    .099
3        Group:Sex        1, 73 0.12   0.02 <.001    .878
4           Period 1.52, 111.05 0.01   1.35  .001    .260
5     Group:Period 1.52, 111.05 0.01   1.57  .002    .216
6       Sex:Period 1.52, 111.05 0.01   1.38  .001    .254
7 Group:Sex:Period 1.52, 111.05 0.01   0.17 <.001    .786
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘+’ 0.1 ‘ ’ 1

Sphericity correction method: GG 
a_posteriori(alpha_asymmetry_rep_anova)

3.4 F2-F1 pair

options(width = 100)
alpha_asymmetry_rep_anova = aov_ez("Subject", "asymmetry_F2_F1", alpha_asymmetry_data, between = c("Group", "Sex"), within = "Period")
Contrasts set to contr.sum for the following variables: Group, Sex
mytable <- xtabs(~ Group + Sex, data = alpha_asymmetry_rep_anova$data$long) / length(unique(alpha_asymmetry_data$Period))
ftable(addmargins(mytable))
             Sex female male Sum
Group                           
invulnerable         19   20  39
vulnerable           24   14  38
Sum                  43   34  77
alpha_asymmetry_rain <- ggplot(alpha_asymmetry_rep_anova$data$long, aes(y = asymmetry_F2_F1, x = Group, color = Sex, fill = Sex)) +
  # ggtitle("alpha_asymmetry") +
  ylab("power") +
  stat_halfeye(
    trim   = FALSE, 
    adjust = 1, 
    .width = 0, 
    justification = -.15, 
    alpha  = .5,
    point_colour = NA) + 
  # theme(legend.position='none')
  # geom_boxplot(width = .15, alpha = .2, outlier.shape = NA) +
  geom_point(size = 2, alpha = .4, position = position_jitter(width = .05, height = 0)) 
suppressWarnings(print(alpha_asymmetry_rain))

alpha_asymmetry_afex_plot <-
  afex_plot(
    alpha_asymmetry_rep_anova,
    x = "Period",
    trace = "Sex",
    panel = "Group",
    error = "between",
    error_arg = list(width = .1),
    dodge = -.5,
    mapping = c("color"),
    point_arg = list(size = 4)
  )
Warning: Panel(s) show a mixed within-between-design.
Error bars do not allow comparisons across all means.
Suppress error bars with: error = "none"
suppressWarnings(print(alpha_asymmetry_afex_plot))

nice(alpha_asymmetry_rep_anova)
Anova Table (Type 3 tests)

Response: asymmetry_F2_F1
            Effect           df  MSE    F   ges p.value
1            Group        1, 73 0.01 2.44  .030    .122
2              Sex        1, 73 0.01 0.85  .011    .360
3        Group:Sex        1, 73 0.01 0.73  .009    .396
4           Period 1.70, 123.80 0.00 1.83  .002    .171
5     Group:Period 1.70, 123.80 0.00 0.29 <.001    .714
6       Sex:Period 1.70, 123.80 0.00 0.26 <.001    .738
7 Group:Sex:Period 1.70, 123.80 0.00 1.98  .002    .149
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘+’ 0.1 ‘ ’ 1

Sphericity correction method: GG 
a_posteriori(alpha_asymmetry_rep_anova)

3.5 F4-F3 pair

options(width = 100)
alpha_asymmetry_rep_anova = aov_ez("Subject", "asymmetry_F4_F3", alpha_asymmetry_data, between = c("Group", "Sex"), within = "Period")
Contrasts set to contr.sum for the following variables: Group, Sex
mytable <- xtabs(~ Group + Sex, data = alpha_asymmetry_rep_anova$data$long) / length(unique(alpha_asymmetry_data$Period))
ftable(addmargins(mytable))
             Sex female male Sum
Group                           
invulnerable         19   20  39
vulnerable           24   14  38
Sum                  43   34  77
alpha_asymmetry_rain <- ggplot(alpha_asymmetry_rep_anova$data$long, aes(y = asymmetry_F4_F3, x = Group, color = Sex, fill = Sex)) +
  # ggtitle("alpha_asymmetry") +
  ylab("power") +
  stat_halfeye(
    trim   = FALSE, 
    adjust = 1, 
    .width = 0, 
    justification = -.15, 
    alpha  = .5,
    point_colour = NA) + 
  # theme(legend.position='none')
  # geom_boxplot(width = .15, alpha = .2, outlier.shape = NA) +
  geom_point(size = 2, alpha = .4, position = position_jitter(width = .05, height = 0)) 
suppressWarnings(print(alpha_asymmetry_rain))

alpha_asymmetry_afex_plot <-
  afex_plot(
    alpha_asymmetry_rep_anova,
    x = "Period",
    trace = "Sex",
    panel = "Group",
    error = "between",
    error_arg = list(width = .1),
    dodge = -.5,
    mapping = c("color"),
    point_arg = list(size = 4)
  )
Warning: Panel(s) show a mixed within-between-design.
Error bars do not allow comparisons across all means.
Suppress error bars with: error = "none"
suppressWarnings(print(alpha_asymmetry_afex_plot))

nice(alpha_asymmetry_rep_anova)
Anova Table (Type 3 tests)

Response: asymmetry_F4_F3
            Effect           df  MSE    F   ges p.value
1            Group        1, 73 0.03 2.48  .031    .119
2              Sex        1, 73 0.03 1.07  .014    .303
3        Group:Sex        1, 73 0.03 0.22  .003    .642
4           Period 1.96, 142.80 0.00 0.97 <.001    .381
5     Group:Period 1.96, 142.80 0.00 0.62 <.001    .535
6       Sex:Period 1.96, 142.80 0.00 0.42 <.001    .656
7 Group:Sex:Period 1.96, 142.80 0.00 2.21  .002    .114
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘+’ 0.1 ‘ ’ 1

Sphericity correction method: GG 
a_posteriori(alpha_asymmetry_rep_anova)

3.6 F6-F5 pair

options(width = 100)
alpha_asymmetry_rep_anova = aov_ez("Subject", "asymmetry_F6_F5", alpha_asymmetry_data, between = c("Group", "Sex"), within = "Period")
Contrasts set to contr.sum for the following variables: Group, Sex
mytable <- xtabs(~ Group + Sex, data = alpha_asymmetry_rep_anova$data$long) / length(unique(alpha_asymmetry_data$Period))
ftable(addmargins(mytable))
             Sex female male Sum
Group                           
invulnerable         19   20  39
vulnerable           24   14  38
Sum                  43   34  77
alpha_asymmetry_rain <- ggplot(alpha_asymmetry_rep_anova$data$long, aes(y = asymmetry_F6_F5, x = Group, color = Sex, fill = Sex)) +
  # ggtitle("alpha_asymmetry") +
  ylab("power") +
  stat_halfeye(
    trim   = FALSE, 
    adjust = 1, 
    .width = 0, 
    justification = -.15, 
    alpha  = .5,
    point_colour = NA) + 
  # theme(legend.position='none')
  # geom_boxplot(width = .15, alpha = .2, outlier.shape = NA) +
  geom_point(size = 2, alpha = .4, position = position_jitter(width = .05, height = 0)) 
suppressWarnings(print(alpha_asymmetry_rain))

alpha_asymmetry_afex_plot <-
  afex_plot(
    alpha_asymmetry_rep_anova,
    x = "Period",
    trace = "Sex",
    panel = "Group",
    error = "between",
    error_arg = list(width = .1),
    dodge = -.5,
    mapping = c("color"),
    point_arg = list(size = 4)
  )
Warning: Panel(s) show a mixed within-between-design.
Error bars do not allow comparisons across all means.
Suppress error bars with: error = "none"
suppressWarnings(print(alpha_asymmetry_afex_plot))

nice(alpha_asymmetry_rep_anova)
Anova Table (Type 3 tests)

Response: asymmetry_F6_F5
            Effect           df  MSE      F   ges p.value
1            Group        1, 73 0.04   1.54  .019    .219
2              Sex        1, 73 0.04 6.03 *  .071    .016
3        Group:Sex        1, 73 0.04   0.10  .001    .756
4           Period 1.88, 137.60 0.00   2.19  .002    .119
5     Group:Period 1.88, 137.60 0.00   0.00 <.001    .995
6       Sex:Period 1.88, 137.60 0.00   0.06 <.001    .933
7 Group:Sex:Period 1.88, 137.60 0.00   1.98  .002    .144
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘+’ 0.1 ‘ ’ 1

Sphericity correction method: GG 
a_posteriori(alpha_asymmetry_rep_anova)
NOTE: Results may be misleading due to involvement in interactions
$emmeans
 Sex     emmean     SE df lower.CL upper.CL
 female -0.0392 0.0181 73  -0.0753 -0.00309
 male    0.0281 0.0205 73  -0.0129  0.06902

Results are averaged over the levels of: Group, Period 
Confidence level used: 0.95 

$contrasts
 contrast      estimate     SE df t.ratio p.value
 female - male  -0.0672 0.0274 73  -2.456  0.0164

Results are averaged over the levels of: Group, Period 

3.7 F8-F7 pair

options(width = 100)
alpha_asymmetry_rep_anova = aov_ez("Subject", "asymmetry_F8_F7", alpha_asymmetry_data, between = c("Group", "Sex"), within = "Period")
Contrasts set to contr.sum for the following variables: Group, Sex
mytable <- xtabs(~ Group + Sex, data = alpha_asymmetry_rep_anova$data$long) / length(unique(alpha_asymmetry_data$Period))
ftable(addmargins(mytable))
             Sex female male Sum
Group                           
invulnerable         19   20  39
vulnerable           24   14  38
Sum                  43   34  77
alpha_asymmetry_rain <- ggplot(alpha_asymmetry_rep_anova$data$long, aes(y = asymmetry_F8_F7, x = Group, color = Sex, fill = Sex)) +
  # ggtitle("alpha_asymmetry") +
  ylab("power") +
  stat_halfeye(
    trim   = FALSE, 
    adjust = 1, 
    .width = 0, 
    justification = -.15, 
    alpha  = .5,
    point_colour = NA) + 
  # theme(legend.position='none')
  # geom_boxplot(width = .15, alpha = .2, outlier.shape = NA) +
  geom_point(size = 2, alpha = .4, position = position_jitter(width = .05, height = 0)) 
suppressWarnings(print(alpha_asymmetry_rain))

alpha_asymmetry_afex_plot <-
  afex_plot(
    alpha_asymmetry_rep_anova,
    x = "Period",
    trace = "Sex",
    panel = "Group",
    error = "between",
    error_arg = list(width = .1),
    dodge = -.5,
    mapping = c("color"),
    point_arg = list(size = 4)
  )
Warning: Panel(s) show a mixed within-between-design.
Error bars do not allow comparisons across all means.
Suppress error bars with: error = "none"
suppressWarnings(print(alpha_asymmetry_afex_plot))

nice(alpha_asymmetry_rep_anova)
Anova Table (Type 3 tests)

Response: asymmetry_F8_F7
            Effect           df  MSE       F   ges p.value
1            Group        1, 73 0.09    0.17  .002    .684
2              Sex        1, 73 0.09 7.89 **  .091    .006
3        Group:Sex        1, 73 0.09    1.55  .019    .217
4           Period 1.84, 134.49 0.00    1.51  .002    .225
5     Group:Period 1.84, 134.49 0.00    1.04  .001    .352
6       Sex:Period 1.84, 134.49 0.00    0.92 <.001    .395
7 Group:Sex:Period 1.84, 134.49 0.00    0.89 <.001    .406
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘+’ 0.1 ‘ ’ 1

Sphericity correction method: GG 
a_posteriori(alpha_asymmetry_rep_anova)
NOTE: Results may be misleading due to involvement in interactions
$emmeans
 Sex     emmean     SE df lower.CL upper.CL
 female -0.0620 0.0260 73  -0.1138  -0.0102
 male    0.0484 0.0295 73  -0.0104   0.1072

Results are averaged over the levels of: Group, Period 
Confidence level used: 0.95 

$contrasts
 contrast      estimate     SE df t.ratio p.value
 female - male    -0.11 0.0393 73  -2.808  0.0064

Results are averaged over the levels of: Group, Period 

3.8 FC2-FC1 pair

options(width = 100)
alpha_asymmetry_rep_anova = aov_ez("Subject", "asymmetry_FC2_FC1", alpha_asymmetry_data, between = c("Group", "Sex"), within = "Period")
Contrasts set to contr.sum for the following variables: Group, Sex
mytable <- xtabs(~ Group + Sex, data = alpha_asymmetry_rep_anova$data$long) / length(unique(alpha_asymmetry_data$Period))
ftable(addmargins(mytable))
             Sex female male Sum
Group                           
invulnerable         19   20  39
vulnerable           24   14  38
Sum                  43   34  77
alpha_asymmetry_rain <- ggplot(alpha_asymmetry_rep_anova$data$long, aes(y = asymmetry_FC2_FC1, x = Group, color = Sex, fill = Sex)) +
  # ggtitle("alpha_asymmetry") +
  ylab("power") +
  stat_halfeye(
    trim   = FALSE, 
    adjust = 1, 
    .width = 0, 
    justification = -.15, 
    alpha  = .5,
    point_colour = NA) + 
  # theme(legend.position='none')
  # geom_boxplot(width = .15, alpha = .2, outlier.shape = NA) +
  geom_point(size = 2, alpha = .4, position = position_jitter(width = .05, height = 0)) 
suppressWarnings(print(alpha_asymmetry_rain))

alpha_asymmetry_afex_plot <-
  afex_plot(
    alpha_asymmetry_rep_anova,
    x = "Period",
    trace = "Sex",
    panel = "Group",
    error = "between",
    error_arg = list(width = .1),
    dodge = -.5,
    mapping = c("color"),
    point_arg = list(size = 4)
  )
Warning: Panel(s) show a mixed within-between-design.
Error bars do not allow comparisons across all means.
Suppress error bars with: error = "none"
suppressWarnings(print(alpha_asymmetry_afex_plot))

nice(alpha_asymmetry_rep_anova)
Anova Table (Type 3 tests)

Response: asymmetry_FC2_FC1
            Effect           df  MSE    F   ges p.value
1            Group        1, 73 0.02 0.00 <.001    .947
2              Sex        1, 73 0.02 0.63  .008    .430
3        Group:Sex        1, 73 0.02 0.13  .002    .721
4           Period 1.87, 136.61 0.00 0.07 <.001    .926
5     Group:Period 1.87, 136.61 0.00 1.31 <.001    .272
6       Sex:Period 1.87, 136.61 0.00 0.91 <.001    .398
7 Group:Sex:Period 1.87, 136.61 0.00 0.16 <.001    .837
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘+’ 0.1 ‘ ’ 1

Sphericity correction method: GG 
a_posteriori(alpha_asymmetry_rep_anova)
LS0tCnRpdGxlOiAiQWxwaGEgcG93ZXIgZXN0aW1hdGVkIGJ5IGF2ZXJhZ2luZyBiZXR3ZWVuIDIgZnJlcXVlbmNpZXMgKHRoZSBzaGl0dHkgd2F5KSIKYXV0aG9yOiAiQWx2YXJvIFJpdmVyYS1SZWkiCmRhdGU6ICJgciBmb3JtYXQoU3lzLnRpbWUoKSwgJyVkICVCLCAlWScpYCIKb3V0cHV0OgogIGh0bWxfbm90ZWJvb2s6CiAgICBjb2RlX2ZvbGRpbmc6IGhpZGUKICAgIGhpZ2hsaWdodDogdGFuZ28KICAgIG51bWJlcl9zZWN0aW9uczogeWVzCiAgICB0aGVtZTogY2VydWxlYW4KICAgIHRvYzogeWVzCiAgICB0b2NfZmxvYXQ6CiAgICAgIGNvbGxhcHNlZDogbm8KICAgICAgc21vb3RoX3Njcm9sbDogbm8KICBwZGZfZG9jdW1lbnQ6CiAgICB0b2M6IHllcwpzdWJ0aXRsZTogQW5haWUgZW5hIGVuZW1pZWdlbnNnc2hqcy4uLgotLS0KCmBgYHtyIENsZWFuIGFuZCBMb2FkIExpYnJhcmllc30KY2F0KCJcMDE0IikgICAgICMgY2xlYW4gdGVybWluYWwKcm0obGlzdCA9IGxzKCkpICMgY2xlYW4gd29ya3NwYWNlCnRyeShkZXYub2ZmKCksIHNpbGVudCA9IFRSVUUpICMgY2xvc2UgYWxsIHBsb3RzCmxpYnJhcnkoYWZleCkKbGlicmFyeShlbW1lYW5zKQpsaWJyYXJ5KGdncGxvdDIpCmxpYnJhcnkoZ2dyaWRnZXMpCmxpYnJhcnkoZ2dkaXN0KQpsaWJyYXJ5KGRwbHlyKQpsaWJyYXJ5KHJlc2hhcGUyKQpsaWJyYXJ5KEdHYWxseSkKbGlicmFyeShmb3JjYXRzKQpgYGAKCmBgYHtyIFNldCBEZWZhdWx0c30KdGhlbWVfc2V0KAogIHRoZW1lX21pbmltYWwoKQopCmFfcG9zdGVyaW9yaSA8LSBmdW5jdGlvbihhZmV4X2Fvdiwgc2lnX2xldmVsID0gLjA1KSB7CiAgZmFjdG9ycyAgPC0gYXMubGlzdChyb3duYW1lcyhhZmV4X2FvdiRhbm92YV90YWJsZSkpCiAgZm9yIChqIGluIDE6bGVuZ3RoKGZhY3RvcnMpKSB7CiAgICBpZiAoZ3JlcGwoIjoiLCBmYWN0b3JzW1tqXV0pKSB7CiAgICAgIGZhY3RvcnNbW2pdXSA8LSB1bmxpc3Qoc3Ryc3BsaXQoZmFjdG9yc1tbal1dLCAiOiIpKQogICAgfQogIH0KICBwX3ZhbHVlcyA8LSBhZmV4X2FvdiRhbm92YV90YWJsZSRgUHIoPkYpYAogIGZvciAoaSBpbiAxOmxlbmd0aChwX3ZhbHVlcykpIHsKICAgIGlmIChwX3ZhbHVlc1tpXSA8PSBzaWdfbGV2ZWwpIHsKICAgICAgcHJpbnQoZW1tZWFucyhhZmV4X2FvdiwgZmFjdG9yc1tbaV1dLCBjb250ciA9ICJwYWlyd2lzZSIpKQogICAgfQogIH0KfQpgYGAKCmBgYHtyIExvYWQgRGF0YX0KbWFzdGVyX2RpciAgICAgICAgICAgICAgICAgPC0gJ34vSW5zeW5jL0RyaXZlLzAwRUVHL1Byb3llY3Rvcy9IdWVwZS9mZGN5dF8yMDE3L3Jlc3RpbmdfaHVlcGUnCmRhdGFfZGlyICAgICAgICAgICAgICAgICAgIDwtIHBhc3RlKG1hc3Rlcl9kaXIsICdGQUFfcmVzdWx0cycsICBzZXAgPSAnLycpCmFscGhhX3Bvd2VyX2RhdGFfbmFtZSAgICAgIDwtIHBhc3RlKGRhdGFfZGlyLCAnYXZlcmFnZV9hbHBoYV9wb3dlcl85X3RvXzExX3Jlc3RpbmdfM190aW1lcy50eHQnLCBzZXA9Jy8nKQphbHBoYV9wb3dlcl9kYXRhICAgICAgICAgICA8LSByZWFkLnRhYmxlKGFscGhhX3Bvd2VyX2RhdGFfbmFtZSwgaGVhZGVyID0gVFJVRSwgc3RyaXAud2hpdGUgPSBUUlVFLCBzZXAgPSAiXHQiKQpuYW1lcyhhbHBoYV9wb3dlcl9kYXRhKVtuYW1lcyhhbHBoYV9wb3dlcl9kYXRhKSA9PSAnY2hsYWJlbCddIDwtICdFbGVjdHJvZGUnCm5hbWVzKGFscGhhX3Bvd2VyX2RhdGEpW25hbWVzKGFscGhhX3Bvd2VyX2RhdGEpID09ICdFUlBzZXQnXSAgPC0gJ0RhdGFzZXQnCm5hbWVzKGFscGhhX3Bvd2VyX2RhdGEpW25hbWVzKGFscGhhX3Bvd2VyX2RhdGEpID09ICdiaW5sYWJlbCddICA8LSAnUGVyaW9kJwphbHBoYV9wb3dlcl9kYXRhJFN1YmplY3QgICA8LSBhcy5udW1lcmljKGdzdWIoIi4qPyhbMC05XSspLioiLCAiXFwxIiwgYWxwaGFfcG93ZXJfZGF0YSREYXRhc2V0KSkKYWxwaGFfcG93ZXJfZGF0YSRsb2cxMF91dm9sdHMgPC0gbG9nMTAoYWxwaGFfcG93ZXJfZGF0YSR2YWx1ZSkKYWxwaGFfcG93ZXJfZGF0YSREYXRhc2V0ICAgPC0gZmFjdG9yKGFscGhhX3Bvd2VyX2RhdGEkRGF0YXNldCkKYWxwaGFfcG93ZXJfZGF0YSRFbGVjdHJvZGUgPC0gZmFjdG9yKGFscGhhX3Bvd2VyX2RhdGEkRWxlY3Ryb2RlKQphbHBoYV9wb3dlcl9kYXRhJFN1YmplY3QgICA8LSBmYWN0b3IoYWxwaGFfcG93ZXJfZGF0YSRTdWJqZWN0KQphbHBoYV9wb3dlcl9kYXRhJFBlcmlvZCAgICA8LSBmYWN0b3IoYWxwaGFfcG93ZXJfZGF0YSRQZXJpb2QsIGxldmVscyA9IGMoImJlZ2lubmluZyIsICJtaWRkbGUiLCAiZW5kIikpCmFscGhhX3Bvd2VyX2RhdGEkaGVtaXNwaGVyZVthbHBoYV9wb3dlcl9kYXRhJEVsZWN0cm9kZSAlaW4lIGMoJ0UwOTMtRnAxJywgICdFMDkyLUFGM2EnLCAgJ0UwOTQtQUY3JywgICdFMDg5LUYxYScsICAnRTEwMC1GM2EnLCAgJ0UxMDEtRjVhJywgICdFMTAzLUY3JywgICdFMDg4LUZDMWEnKV0gPC0gJ0xlZnQnCmFscGhhX3Bvd2VyX2RhdGEkaGVtaXNwaGVyZVthbHBoYV9wb3dlcl9kYXRhJEVsZWN0cm9kZSAlaW4lIGMoJ0UwODAtRnAyJywgICdFMDc5LUFGNGEnLCAgJ0UwNzItQUY4JywgICdFMDc2LUYyYScsICAnRTA2OC1GNGEnLCAgJ0UwNjktRjZhJywgICdFMDcxLUY4JywgICdFMDc1LUZDMmEnKV0gPC0gJ1JpZ2h0JwphbHBoYV9wb3dlcl9kYXRhJGhlbWlzcGhlcmUgPC0gZmFjdG9yKGFscGhhX3Bvd2VyX2RhdGEkaGVtaXNwaGVyZSkKYWxwaGFfcG93ZXJfZGF0YSRlbGVjdHJvZGVfcGFpclthbHBoYV9wb3dlcl9kYXRhJEVsZWN0cm9kZSAlaW4lIGMoJ0UwOTMtRnAxJyAsICdFMDgwLUZwMicpXSAgPC0gJ0ZwMS1GcDInCmFscGhhX3Bvd2VyX2RhdGEkZWxlY3Ryb2RlX3BhaXJbYWxwaGFfcG93ZXJfZGF0YSRFbGVjdHJvZGUgJWluJSBjKCdFMDkyLUFGM2EnLCAnRTA3OS1BRjRhJyldIDwtICdBRjMtQUY0JwphbHBoYV9wb3dlcl9kYXRhJGVsZWN0cm9kZV9wYWlyW2FscGhhX3Bvd2VyX2RhdGEkRWxlY3Ryb2RlICVpbiUgYygnRTA5NC1BRjcnICwgJ0UwNzItQUY4JyldICA8LSAnQUY3LUFGOCcKYWxwaGFfcG93ZXJfZGF0YSRlbGVjdHJvZGVfcGFpclthbHBoYV9wb3dlcl9kYXRhJEVsZWN0cm9kZSAlaW4lIGMoJ0UwODktRjFhJyAsICdFMDc2LUYyYScpXSAgPC0gJ0YxLUYyJwphbHBoYV9wb3dlcl9kYXRhJGVsZWN0cm9kZV9wYWlyW2FscGhhX3Bvd2VyX2RhdGEkRWxlY3Ryb2RlICVpbiUgYygnRTEwMC1GM2EnICwgJ0UwNjgtRjRhJyldICA8LSAnRjMtRjQnCmFscGhhX3Bvd2VyX2RhdGEkZWxlY3Ryb2RlX3BhaXJbYWxwaGFfcG93ZXJfZGF0YSRFbGVjdHJvZGUgJWluJSBjKCdFMTAxLUY1YScgLCAnRTA2OS1GNmEnKV0gIDwtICdGNS1GNicKYWxwaGFfcG93ZXJfZGF0YSRlbGVjdHJvZGVfcGFpclthbHBoYV9wb3dlcl9kYXRhJEVsZWN0cm9kZSAlaW4lIGMoJ0UxMDMtRjcnICAsICdFMDcxLUY4JyldICAgPC0gJ0Y3LUY4JwphbHBoYV9wb3dlcl9kYXRhJGVsZWN0cm9kZV9wYWlyW2FscGhhX3Bvd2VyX2RhdGEkRWxlY3Ryb2RlICVpbiUgYygnRTA4OC1GQzFhJywgJ0UwNzUtRkMyYScpXSA8LSAnRkMxLUZDMicKYWxwaGFfcG93ZXJfZGF0YSRlbGVjdHJvZGVfcGFpciA8LSBmYWN0b3IoYWxwaGFfcG93ZXJfZGF0YSRlbGVjdHJvZGVfcGFpciwgbGV2ZWxzID0gYygnRnAxLUZwMicsICdBRjMtQUY0JywgJ0FGNy1BRjgnLCAnRjEtRjInLCAnRjMtRjQnLCdGNS1GNicsICdGNy1GOCcsICdGQzEtRkMyJykpCmdyb3VwX2lkICAgPC0gcmVhZC50YWJsZSgiL2hvbWUvYWx2YXJvL0luc3luYy9Ecml2ZS8wMEVFRy9Qcm95ZWN0b3MvSHVlcGUvZmRjeXRfMjAxNy9SZWdpc3Ryby1FdmFsdWFjaW9uZXMtRkRDWVQtREgtMjAxNyAtIEdlbmVyYWwgQU5PTklNTy5jc3YiLAogICAgICAgICAgICAgICAgICAgICAgICAgc2VwID0gIiwiLCBoZWFkZXIgPSBUUlVFLCBjb2wubmFtZXMgPSBjKCJmdWxsLmlkIiwgIlN1YmplY3QiLCAiU2V4IiwgIkdyb3VwIiwgIlN0cmVzcyIpKQpncm91cF9pZCRTZXggICAgICAgICAgIDwtIGZhY3Rvcihncm91cF9pZCRTZXgpCmdyb3VwX2lkJEdyb3VwICAgICAgICAgPC0gZmFjdG9yKGdyb3VwX2lkJEdyb3VwKQpsZXZlbHMoZ3JvdXBfaWQkU2V4KSAgIDwtIGxpc3QoZmVtYWxlICA9ICJGIiwgbWFsZSAgPSAiTSIpCmxldmVscyhncm91cF9pZCRHcm91cCkgPC0gbGlzdChpbnZ1bG5lcmFibGUgID0gIkNOIiwgdnVsbmVyYWJsZSAgPSAiRVgiKQpncm91cF9pZCAgICAgICAgICAgICAgIDwtIGdyb3VwX2lkW2MoJ1N1YmplY3QnLCAnR3JvdXAnLCAnU2V4JyldCmFscGhhX3Bvd2VyX2RhdGEgICAgICAgPC0gbWVyZ2UoYWxwaGFfcG93ZXJfZGF0YSwgZ3JvdXBfaWQsIGJ5ID0gJ1N1YmplY3QnKQp3cml0ZS5jc3YoYWxwaGFfcG93ZXJfZGF0YSwgIHBhc3RlKGRhdGFfZGlyLCAnL2FscGhhX3Bvd2VyX2RhdGFfY2xlYW5fb2xkKGJhZClfc3R5bGUuY3N2Jywgc2VwID0gJycpLCAgcm93Lm5hbWVzID0gRkFMU0UpCmFzeW1tZXRyeV9GcDJfRnAxIDwtIGMoKQphc3ltbWV0cnlfQUY0X0FGMyA8LSBjKCkKYXN5bW1ldHJ5X0FGOF9BRjcgPC0gYygpCmFzeW1tZXRyeV9GMl9GMSAgIDwtIGMoKQphc3ltbWV0cnlfRjRfRjMgICA8LSBjKCkKYXN5bW1ldHJ5X0Y2X0Y1ICAgPC0gYygpCmFzeW1tZXRyeV9GOF9GNyAgIDwtIGMoKQphc3ltbWV0cnlfRkMyX0ZDMSA8LSBjKCkKU3ViamVjdCAgICAgICAgICAgPC0gYygpClBlcmlvZCAgICAgICAgICAgIDwtIGMoKQpzdWJqZWN0b3MgPC0gbGV2ZWxzKGFscGhhX3Bvd2VyX2RhdGEkU3ViamVjdCkKcGVyaW9kb3MgIDwtIGxldmVscyhhbHBoYV9wb3dlcl9kYXRhJFBlcmlvZCkKZm9yIChzdWJqIGluIHN1YmplY3RvcykgewogIGZvciAocGFydCBpbiBwZXJpb2RvcykgewogICAgc3ViamVjdF9kYXRhIDwtIHN1YnNldChhbHBoYV9wb3dlcl9kYXRhLCBTdWJqZWN0ID09IHN1YmogJiBQZXJpb2QgPT0gcGFydCkKICAgIFN1YmplY3QgICAgICAgICAgIDwtIGMoU3ViamVjdCwgYXMuY2hhcmFjdGVyKHN1YmplY3RfZGF0YSRTdWJqZWN0WzFdKSkKICAgIFBlcmlvZCAgICAgICAgICAgIDwtIGMoUGVyaW9kLCBhcy5jaGFyYWN0ZXIoc3ViamVjdF9kYXRhJFBlcmlvZFsxXSkpCiAgICBhc3ltbWV0cnlfRnAyX0ZwMSA8LSBjKGFzeW1tZXRyeV9GcDJfRnAxLCBzdWJqZWN0X2RhdGFbd2hpY2goc3ViamVjdF9kYXRhJEVsZWN0cm9kZSA9PSAnRTA4MC1GcDInKSAsIDEwXSAtIHN1YmplY3RfZGF0YVt3aGljaChzdWJqZWN0X2RhdGEkRWxlY3Ryb2RlPT0nRTA5My1GcDEnKSAsIDEwXSkKICAgIGFzeW1tZXRyeV9BRjRfQUYzIDwtIGMoYXN5bW1ldHJ5X0FGNF9BRjMsIHN1YmplY3RfZGF0YVt3aGljaChzdWJqZWN0X2RhdGEkRWxlY3Ryb2RlID09ICdFMDc5LUFGNGEnKSwgMTBdIC0gc3ViamVjdF9kYXRhW3doaWNoKHN1YmplY3RfZGF0YSRFbGVjdHJvZGU9PSdFMDkyLUFGM2EnKSwgMTBdKQogICAgYXN5bW1ldHJ5X0FGOF9BRjcgPC0gYyhhc3ltbWV0cnlfQUY4X0FGNywgc3ViamVjdF9kYXRhW3doaWNoKHN1YmplY3RfZGF0YSRFbGVjdHJvZGUgPT0gJ0UwNzItQUY4JykgLCAxMF0gLSBzdWJqZWN0X2RhdGFbd2hpY2goc3ViamVjdF9kYXRhJEVsZWN0cm9kZT09J0UwOTQtQUY3JykgLCAxMF0pCiAgICBhc3ltbWV0cnlfRjJfRjEgICA8LSBjKGFzeW1tZXRyeV9GMl9GMSAgLCBzdWJqZWN0X2RhdGFbd2hpY2goc3ViamVjdF9kYXRhJEVsZWN0cm9kZSA9PSAnRTA3Ni1GMmEnKSAsIDEwXSAtIHN1YmplY3RfZGF0YVt3aGljaChzdWJqZWN0X2RhdGEkRWxlY3Ryb2RlPT0nRTA4OS1GMWEnKSAsIDEwXSkKICAgIGFzeW1tZXRyeV9GNF9GMyAgIDwtIGMoYXN5bW1ldHJ5X0Y0X0YzICAsIHN1YmplY3RfZGF0YVt3aGljaChzdWJqZWN0X2RhdGEkRWxlY3Ryb2RlID09ICdFMDY4LUY0YScpICwgMTBdIC0gc3ViamVjdF9kYXRhW3doaWNoKHN1YmplY3RfZGF0YSRFbGVjdHJvZGU9PSdFMTAwLUYzYScpICwgMTBdKQogICAgYXN5bW1ldHJ5X0Y2X0Y1ICAgPC0gYyhhc3ltbWV0cnlfRjZfRjUgICwgc3ViamVjdF9kYXRhW3doaWNoKHN1YmplY3RfZGF0YSRFbGVjdHJvZGUgPT0gJ0UwNjktRjZhJykgLCAxMF0gLSBzdWJqZWN0X2RhdGFbd2hpY2goc3ViamVjdF9kYXRhJEVsZWN0cm9kZT09J0UxMDEtRjVhJykgLCAxMF0pCiAgICBhc3ltbWV0cnlfRjhfRjcgICA8LSBjKGFzeW1tZXRyeV9GOF9GNyAgLCBzdWJqZWN0X2RhdGFbd2hpY2goc3ViamVjdF9kYXRhJEVsZWN0cm9kZSA9PSAnRTA3MS1GOCcpICAsIDEwXSAtIHN1YmplY3RfZGF0YVt3aGljaChzdWJqZWN0X2RhdGEkRWxlY3Ryb2RlPT0nRTEwMy1GNycpICAsIDEwXSkKICAgIGFzeW1tZXRyeV9GQzJfRkMxIDwtIGMoYXN5bW1ldHJ5X0ZDMl9GQzEsIHN1YmplY3RfZGF0YVt3aGljaChzdWJqZWN0X2RhdGEkRWxlY3Ryb2RlID09ICdFMDc1LUZDMmEnKSwgMTBdIC0gc3ViamVjdF9kYXRhW3doaWNoKHN1YmplY3RfZGF0YSRFbGVjdHJvZGU9PSdFMDg4LUZDMWEnKSwgMTBdKQogIH0KfQphbHBoYV9hc3ltbWV0cnlfZGF0YSA8LSBkYXRhLmZyYW1lKFN1YmplY3QsIFBlcmlvZCwgYXN5bW1ldHJ5X0ZwMl9GcDEsIGFzeW1tZXRyeV9BRjRfQUYzLCBhc3ltbWV0cnlfQUY4X0FGNywgYXN5bW1ldHJ5X0YyX0YxLCBhc3ltbWV0cnlfRjRfRjMsIGFzeW1tZXRyeV9GNl9GNSwgYXN5bW1ldHJ5X0Y4X0Y3LCBhc3ltbWV0cnlfRkMyX0ZDMSkKYWxwaGFfYXN5bW1ldHJ5X2RhdGEkU3ViamVjdCA8LSBmYWN0b3IoYWxwaGFfYXN5bW1ldHJ5X2RhdGEkU3ViamVjdCkKYWxwaGFfYXN5bW1ldHJ5X2RhdGEkUGVyaW9kIDwtIGZhY3RvcihhbHBoYV9hc3ltbWV0cnlfZGF0YSRQZXJpb2QsIGxldmVscyA9IGMoImJlZ2lubmluZyIsICJtaWRkbGUiLCAiZW5kIikpCmFscGhhX2FzeW1tZXRyeV9kYXRhIDwtIG1lcmdlKGFscGhhX2FzeW1tZXRyeV9kYXRhLCBncm91cF9pZCwgYnkgPSAnU3ViamVjdCcpCndyaXRlLmNzdihhbHBoYV9hc3ltbWV0cnlfZGF0YSwgIHBhc3RlKGRhdGFfZGlyLCAnL2FscGhhX2FzeW1tZXRyeV9kYXRhX2NsZWFuX29sZChiYWQpX3N0eWxlLmNzdicsIHNlcCA9ICcnKSwgIHJvdy5uYW1lcyA9IEZBTFNFKQpgYGAKIyBTcGVjdHJhbCBkZWNvbXBvc2l0aW9uCi0gSW5maW5pdHkgUmVmZXJlbmNlIG9yIFJlZmVyZW5jZSBFbGVjdHJvZGUgU3RhbmRhcmRpemF0aW9uIFRlY2huaXF1ZSAoUkVTVCkuXAotIDEyMCBjb25zZWN1dGl2ZSBzZWdtZW50cywgNSBzZWNvbmRzIGVhY2guXAotICoqMyBQZXJpb2RzLCA0MCBzZWdtZW50cyBlYWNoKiouXAotIFBTRCBjb21wdXRlZCB3aXRoIFdlbGNoJ3MgbWV0aG9kLgoKIyMgU2NhbHAgTWFwLCBtZWFuIHBvd2VyIGByIGFscGhhX3Bvd2VyX2RhdGEkd29ya2xhdFsxXWAgSHoKIVtdKFJFU1RfUFNEX3NjYWxwXzNfdGltZXMucG5nKQoKIyMgUFNEIHRvcG9ncmFwaHksIDEgdG8gNTUgSHosIGdyYW5kIGF2ZXJhZ2UKIVtdKFJFU1RfUFNEX3RvcG9ncmFwaHkucG5nKQoKIyMgUFNEIHRvcG9ncmFwaHksIDQgdG8gMzAgSHosIGdyYW5kIGF2ZXJhZ2UKIVtdKFJFU1RfUFNEX3RvcG9ncmFwaHlfNF90b18zMF9Iei5wbmcpCgojIyBGcm9udGFsIEVsZWN0cm9kZXMsIDQgdG8gMzAgSHosIGdyYW5kIGF2ZXJhZ2UKLSAyIHN0YW5kYXJkIGVycm9yIGJhbmRzCiFbRnJvbnRhbCBlbGVjdHJvZGVzXShSRVNUX1BTRF80X3RvXzMwX0h6XzNfdGltZXMucG5nKQoKIyBHZW5lcmFsIERlc2NyaXB0aW9uCmBgYHtyIGdlbmVyYWwsIGZpZy53aWR0aCA9IDEyfQpvcHRpb25zKHdpZHRoID0gMTAwKQpzdW1tYXJ5KGFscGhhX2FzeW1tZXRyeV9kYXRhKQphc3ltbWV0cnlfcGFpcnMgPC0gYygnYXN5bW1ldHJ5X0ZwMl9GcDEnLCAnYXN5bW1ldHJ5X0FGNF9BRjMnLCAnYXN5bW1ldHJ5X0FGOF9BRjcnLCAnYXN5bW1ldHJ5X0YyX0YxJywgJ2FzeW1tZXRyeV9GNF9GMycsICdhc3ltbWV0cnlfRjZfRjUnLCAnYXN5bW1ldHJ5X0Y4X0Y3JywgJ2FzeW1tZXRyeV9GQzJfRkMxJykKYXN5bW1ldHJ5X3BhaXJzX3BhaXJzIDwtIGdncGFpcnMoYWxwaGFfYXN5bW1ldHJ5X2RhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgY29sdW1ucyA9IGFzeW1tZXRyeV9wYWlycywKICAgICAgICAgICAgICAgICAgICAgICBhZXMoY29sb3VyID0gUGVyaW9kLCBhbHBoYSA9IC4yNSksCiAgICAgICAgICAgICAgICAgICAgICAgcHJvZ3Jlc3MgPSBGQUxTRSwKICAgICAgICAgICAgICAgICAgICAgICBsb3dlciA9IGxpc3QoY29udGludW91cyA9IHdyYXAoInBvaW50cyIpKSkKc3VwcHJlc3NXYXJuaW5ncyhwcmludChhc3ltbWV0cnlfcGFpcnNfcGFpcnMpKQpgYGAKCiMgQWxwaGEgQXN5bW1ldHJ5LCBgciBhbHBoYV9wb3dlcl9kYXRhJHdvcmtsYXRbMV1gIEh6CiMjIEZwMi1GcDEgcGFpcgoKYGBge3IgYXN5bW1ldHJ5X0ZwMl9GcDEsIGZpZy53aWR0aCA9IDEyfQpvcHRpb25zKHdpZHRoID0gMTAwKQphbHBoYV9hc3ltbWV0cnlfcmVwX2Fub3ZhID0gYW92X2V6KCJTdWJqZWN0IiwgImFzeW1tZXRyeV9GcDJfRnAxIiwgYWxwaGFfYXN5bW1ldHJ5X2RhdGEsIGJldHdlZW4gPSBjKCJHcm91cCIsICJTZXgiKSwgd2l0aGluID0gIlBlcmlvZCIpCm15dGFibGUgPC0geHRhYnMofiBHcm91cCArIFNleCwgZGF0YSA9IGFscGhhX2FzeW1tZXRyeV9yZXBfYW5vdmEkZGF0YSRsb25nKSAvIGxlbmd0aCh1bmlxdWUoYWxwaGFfYXN5bW1ldHJ5X2RhdGEkUGVyaW9kKSkKZnRhYmxlKGFkZG1hcmdpbnMobXl0YWJsZSkpCmFscGhhX2FzeW1tZXRyeV9yYWluIDwtIGdncGxvdChhbHBoYV9hc3ltbWV0cnlfcmVwX2Fub3ZhJGRhdGEkbG9uZywgYWVzKHkgPSBhc3ltbWV0cnlfRnAyX0ZwMSwgeCA9IEdyb3VwLCBjb2xvciA9IFNleCwgZmlsbCA9IFNleCkpICsKICAjIGdndGl0bGUoImFscGhhX2FzeW1tZXRyeSIpICsKICB5bGFiKCJwb3dlciIpICsKICBzdGF0X2hhbGZleWUoCiAgICB0cmltICAgPSBGQUxTRSwgCiAgICBhZGp1c3QgPSAxLCAKICAgIC53aWR0aCA9IDAsIAogICAganVzdGlmaWNhdGlvbiA9IC0uMTUsIAogICAgYWxwaGEgID0gLjUsCiAgICBwb2ludF9jb2xvdXIgPSBOQSkgKyAKICAjIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0nbm9uZScpCiAgIyBnZW9tX2JveHBsb3Qod2lkdGggPSAuMTUsIGFscGhhID0gLjIsIG91dGxpZXIuc2hhcGUgPSBOQSkgKwogIGdlb21fcG9pbnQoc2l6ZSA9IDIsIGFscGhhID0gLjQsIHBvc2l0aW9uID0gcG9zaXRpb25faml0dGVyKHdpZHRoID0gLjA1LCBoZWlnaHQgPSAwKSkgCnN1cHByZXNzV2FybmluZ3MocHJpbnQoYWxwaGFfYXN5bW1ldHJ5X3JhaW4pKQphbHBoYV9hc3ltbWV0cnlfYWZleF9wbG90IDwtCiAgYWZleF9wbG90KAogICAgYWxwaGFfYXN5bW1ldHJ5X3JlcF9hbm92YSwKICAgIHggPSAiUGVyaW9kIiwKICAgIHRyYWNlID0gIlNleCIsCiAgICBwYW5lbCA9ICJHcm91cCIsCiAgICBlcnJvciA9ICJiZXR3ZWVuIiwKICAgIGVycm9yX2FyZyA9IGxpc3Qod2lkdGggPSAuMSksCiAgICBkb2RnZSA9IC0uNSwKICAgIG1hcHBpbmcgPSBjKCJjb2xvciIpLAogICAgcG9pbnRfYXJnID0gbGlzdChzaXplID0gNCkKICApCnN1cHByZXNzV2FybmluZ3MocHJpbnQoYWxwaGFfYXN5bW1ldHJ5X2FmZXhfcGxvdCkpCm5pY2UoYWxwaGFfYXN5bW1ldHJ5X3JlcF9hbm92YSkKYV9wb3N0ZXJpb3JpKGFscGhhX2FzeW1tZXRyeV9yZXBfYW5vdmEpCmBgYAoKIyMgQUY0LUFGMyBwYWlyCgpgYGB7ciBhc3ltbWV0cnlfQUY0X0FGMywgZmlnLndpZHRoID0gMTJ9Cm9wdGlvbnMod2lkdGggPSAxMDApCmFscGhhX2FzeW1tZXRyeV9yZXBfYW5vdmEgPSBhb3ZfZXooIlN1YmplY3QiLCAiYXN5bW1ldHJ5X0FGNF9BRjMiLCBhbHBoYV9hc3ltbWV0cnlfZGF0YSwgYmV0d2VlbiA9IGMoIkdyb3VwIiwgIlNleCIpLCB3aXRoaW4gPSAiUGVyaW9kIikKbXl0YWJsZSA8LSB4dGFicyh+IEdyb3VwICsgU2V4LCBkYXRhID0gYWxwaGFfYXN5bW1ldHJ5X3JlcF9hbm92YSRkYXRhJGxvbmcpIC8gbGVuZ3RoKHVuaXF1ZShhbHBoYV9hc3ltbWV0cnlfZGF0YSRQZXJpb2QpKQpmdGFibGUoYWRkbWFyZ2lucyhteXRhYmxlKSkKYWxwaGFfYXN5bW1ldHJ5X3JhaW4gPC0gZ2dwbG90KGFscGhhX2FzeW1tZXRyeV9yZXBfYW5vdmEkZGF0YSRsb25nLCBhZXMoeSA9IGFzeW1tZXRyeV9BRjRfQUYzLCB4ID0gR3JvdXAsIGNvbG9yID0gU2V4LCBmaWxsID0gU2V4KSkgKwogICMgZ2d0aXRsZSgiYWxwaGFfYXN5bW1ldHJ5IikgKwogIHlsYWIoInBvd2VyIikgKwogIHN0YXRfaGFsZmV5ZSgKICAgIHRyaW0gICA9IEZBTFNFLCAKICAgIGFkanVzdCA9IDEsIAogICAgLndpZHRoID0gMCwgCiAgICBqdXN0aWZpY2F0aW9uID0gLS4xNSwgCiAgICBhbHBoYSAgPSAuNSwKICAgIHBvaW50X2NvbG91ciA9IE5BKSArIAogICMgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSdub25lJykKICAjIGdlb21fYm94cGxvdCh3aWR0aCA9IC4xNSwgYWxwaGEgPSAuMiwgb3V0bGllci5zaGFwZSA9IE5BKSArCiAgZ2VvbV9wb2ludChzaXplID0gMiwgYWxwaGEgPSAuNCwgcG9zaXRpb24gPSBwb3NpdGlvbl9qaXR0ZXIod2lkdGggPSAuMDUsIGhlaWdodCA9IDApKSAKc3VwcHJlc3NXYXJuaW5ncyhwcmludChhbHBoYV9hc3ltbWV0cnlfcmFpbikpCmFscGhhX2FzeW1tZXRyeV9hZmV4X3Bsb3QgPC0KICBhZmV4X3Bsb3QoCiAgICBhbHBoYV9hc3ltbWV0cnlfcmVwX2Fub3ZhLAogICAgeCA9ICJQZXJpb2QiLAogICAgdHJhY2UgPSAiU2V4IiwKICAgIHBhbmVsID0gIkdyb3VwIiwKICAgIGVycm9yID0gImJldHdlZW4iLAogICAgZXJyb3JfYXJnID0gbGlzdCh3aWR0aCA9IC4xKSwKICAgIGRvZGdlID0gLS41LAogICAgbWFwcGluZyA9IGMoImNvbG9yIiksCiAgICBwb2ludF9hcmcgPSBsaXN0KHNpemUgPSA0KQogICkKc3VwcHJlc3NXYXJuaW5ncyhwcmludChhbHBoYV9hc3ltbWV0cnlfYWZleF9wbG90KSkKbmljZShhbHBoYV9hc3ltbWV0cnlfcmVwX2Fub3ZhKQphX3Bvc3RlcmlvcmkoYWxwaGFfYXN5bW1ldHJ5X3JlcF9hbm92YSkKYGBgCgojIyBBRjgtQUY3IHBhaXIKCmBgYHtyIGFzeW1tZXRyeV9BRjhfQUY3LCBmaWcud2lkdGggPSAxMn0Kb3B0aW9ucyh3aWR0aCA9IDEwMCkKYWxwaGFfYXN5bW1ldHJ5X3JlcF9hbm92YSA9IGFvdl9leigiU3ViamVjdCIsICJhc3ltbWV0cnlfQUY4X0FGNyIsIGFscGhhX2FzeW1tZXRyeV9kYXRhLCBiZXR3ZWVuID0gYygiR3JvdXAiLCAiU2V4IiksIHdpdGhpbiA9ICJQZXJpb2QiKQpteXRhYmxlIDwtIHh0YWJzKH4gR3JvdXAgKyBTZXgsIGRhdGEgPSBhbHBoYV9hc3ltbWV0cnlfcmVwX2Fub3ZhJGRhdGEkbG9uZykgLyBsZW5ndGgodW5pcXVlKGFscGhhX2FzeW1tZXRyeV9kYXRhJFBlcmlvZCkpCmZ0YWJsZShhZGRtYXJnaW5zKG15dGFibGUpKQphbHBoYV9hc3ltbWV0cnlfcmFpbiA8LSBnZ3Bsb3QoYWxwaGFfYXN5bW1ldHJ5X3JlcF9hbm92YSRkYXRhJGxvbmcsIGFlcyh5ID0gYXN5bW1ldHJ5X0FGOF9BRjcsIHggPSBHcm91cCwgY29sb3IgPSBTZXgsIGZpbGwgPSBTZXgpKSArCiAgIyBnZ3RpdGxlKCJhbHBoYV9hc3ltbWV0cnkiKSArCiAgeWxhYigicG93ZXIiKSArCiAgc3RhdF9oYWxmZXllKAogICAgdHJpbSAgID0gRkFMU0UsIAogICAgYWRqdXN0ID0gMSwgCiAgICAud2lkdGggPSAwLCAKICAgIGp1c3RpZmljYXRpb24gPSAtLjE1LCAKICAgIGFscGhhICA9IC41LAogICAgcG9pbnRfY29sb3VyID0gTkEpICsgCiAgIyB0aGVtZShsZWdlbmQucG9zaXRpb249J25vbmUnKQogICMgZ2VvbV9ib3hwbG90KHdpZHRoID0gLjE1LCBhbHBoYSA9IC4yLCBvdXRsaWVyLnNoYXBlID0gTkEpICsKICBnZW9tX3BvaW50KHNpemUgPSAyLCBhbHBoYSA9IC40LCBwb3NpdGlvbiA9IHBvc2l0aW9uX2ppdHRlcih3aWR0aCA9IC4wNSwgaGVpZ2h0ID0gMCkpIApzdXBwcmVzc1dhcm5pbmdzKHByaW50KGFscGhhX2FzeW1tZXRyeV9yYWluKSkKYWxwaGFfYXN5bW1ldHJ5X2FmZXhfcGxvdCA8LQogIGFmZXhfcGxvdCgKICAgIGFscGhhX2FzeW1tZXRyeV9yZXBfYW5vdmEsCiAgICB4ID0gIlBlcmlvZCIsCiAgICB0cmFjZSA9ICJTZXgiLAogICAgcGFuZWwgPSAiR3JvdXAiLAogICAgZXJyb3IgPSAiYmV0d2VlbiIsCiAgICBlcnJvcl9hcmcgPSBsaXN0KHdpZHRoID0gLjEpLAogICAgZG9kZ2UgPSAtLjUsCiAgICBtYXBwaW5nID0gYygiY29sb3IiKSwKICAgIHBvaW50X2FyZyA9IGxpc3Qoc2l6ZSA9IDQpCiAgKQpzdXBwcmVzc1dhcm5pbmdzKHByaW50KGFscGhhX2FzeW1tZXRyeV9hZmV4X3Bsb3QpKQpuaWNlKGFscGhhX2FzeW1tZXRyeV9yZXBfYW5vdmEpCmFfcG9zdGVyaW9yaShhbHBoYV9hc3ltbWV0cnlfcmVwX2Fub3ZhKQpgYGAKIyMgRjItRjEgcGFpcgoKYGBge3IgYXN5bW1ldHJ5X0YyX0YxLCBmaWcud2lkdGggPSAxMn0Kb3B0aW9ucyh3aWR0aCA9IDEwMCkKYWxwaGFfYXN5bW1ldHJ5X3JlcF9hbm92YSA9IGFvdl9leigiU3ViamVjdCIsICJhc3ltbWV0cnlfRjJfRjEiLCBhbHBoYV9hc3ltbWV0cnlfZGF0YSwgYmV0d2VlbiA9IGMoIkdyb3VwIiwgIlNleCIpLCB3aXRoaW4gPSAiUGVyaW9kIikKbXl0YWJsZSA8LSB4dGFicyh+IEdyb3VwICsgU2V4LCBkYXRhID0gYWxwaGFfYXN5bW1ldHJ5X3JlcF9hbm92YSRkYXRhJGxvbmcpIC8gbGVuZ3RoKHVuaXF1ZShhbHBoYV9hc3ltbWV0cnlfZGF0YSRQZXJpb2QpKQpmdGFibGUoYWRkbWFyZ2lucyhteXRhYmxlKSkKYWxwaGFfYXN5bW1ldHJ5X3JhaW4gPC0gZ2dwbG90KGFscGhhX2FzeW1tZXRyeV9yZXBfYW5vdmEkZGF0YSRsb25nLCBhZXMoeSA9IGFzeW1tZXRyeV9GMl9GMSwgeCA9IEdyb3VwLCBjb2xvciA9IFNleCwgZmlsbCA9IFNleCkpICsKICAjIGdndGl0bGUoImFscGhhX2FzeW1tZXRyeSIpICsKICB5bGFiKCJwb3dlciIpICsKICBzdGF0X2hhbGZleWUoCiAgICB0cmltICAgPSBGQUxTRSwgCiAgICBhZGp1c3QgPSAxLCAKICAgIC53aWR0aCA9IDAsIAogICAganVzdGlmaWNhdGlvbiA9IC0uMTUsIAogICAgYWxwaGEgID0gLjUsCiAgICBwb2ludF9jb2xvdXIgPSBOQSkgKyAKICAjIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0nbm9uZScpCiAgIyBnZW9tX2JveHBsb3Qod2lkdGggPSAuMTUsIGFscGhhID0gLjIsIG91dGxpZXIuc2hhcGUgPSBOQSkgKwogIGdlb21fcG9pbnQoc2l6ZSA9IDIsIGFscGhhID0gLjQsIHBvc2l0aW9uID0gcG9zaXRpb25faml0dGVyKHdpZHRoID0gLjA1LCBoZWlnaHQgPSAwKSkgCnN1cHByZXNzV2FybmluZ3MocHJpbnQoYWxwaGFfYXN5bW1ldHJ5X3JhaW4pKQphbHBoYV9hc3ltbWV0cnlfYWZleF9wbG90IDwtCiAgYWZleF9wbG90KAogICAgYWxwaGFfYXN5bW1ldHJ5X3JlcF9hbm92YSwKICAgIHggPSAiUGVyaW9kIiwKICAgIHRyYWNlID0gIlNleCIsCiAgICBwYW5lbCA9ICJHcm91cCIsCiAgICBlcnJvciA9ICJiZXR3ZWVuIiwKICAgIGVycm9yX2FyZyA9IGxpc3Qod2lkdGggPSAuMSksCiAgICBkb2RnZSA9IC0uNSwKICAgIG1hcHBpbmcgPSBjKCJjb2xvciIpLAogICAgcG9pbnRfYXJnID0gbGlzdChzaXplID0gNCkKICApCnN1cHByZXNzV2FybmluZ3MocHJpbnQoYWxwaGFfYXN5bW1ldHJ5X2FmZXhfcGxvdCkpCm5pY2UoYWxwaGFfYXN5bW1ldHJ5X3JlcF9hbm92YSkKYV9wb3N0ZXJpb3JpKGFscGhhX2FzeW1tZXRyeV9yZXBfYW5vdmEpCmBgYAoKIyMgRjQtRjMgcGFpcgoKYGBge3IgYXN5bW1ldHJ5X0Y0X0YzLCBmaWcud2lkdGggPSAxMn0Kb3B0aW9ucyh3aWR0aCA9IDEwMCkKYWxwaGFfYXN5bW1ldHJ5X3JlcF9hbm92YSA9IGFvdl9leigiU3ViamVjdCIsICJhc3ltbWV0cnlfRjRfRjMiLCBhbHBoYV9hc3ltbWV0cnlfZGF0YSwgYmV0d2VlbiA9IGMoIkdyb3VwIiwgIlNleCIpLCB3aXRoaW4gPSAiUGVyaW9kIikKbXl0YWJsZSA8LSB4dGFicyh+IEdyb3VwICsgU2V4LCBkYXRhID0gYWxwaGFfYXN5bW1ldHJ5X3JlcF9hbm92YSRkYXRhJGxvbmcpIC8gbGVuZ3RoKHVuaXF1ZShhbHBoYV9hc3ltbWV0cnlfZGF0YSRQZXJpb2QpKQpmdGFibGUoYWRkbWFyZ2lucyhteXRhYmxlKSkKYWxwaGFfYXN5bW1ldHJ5X3JhaW4gPC0gZ2dwbG90KGFscGhhX2FzeW1tZXRyeV9yZXBfYW5vdmEkZGF0YSRsb25nLCBhZXMoeSA9IGFzeW1tZXRyeV9GNF9GMywgeCA9IEdyb3VwLCBjb2xvciA9IFNleCwgZmlsbCA9IFNleCkpICsKICAjIGdndGl0bGUoImFscGhhX2FzeW1tZXRyeSIpICsKICB5bGFiKCJwb3dlciIpICsKICBzdGF0X2hhbGZleWUoCiAgICB0cmltICAgPSBGQUxTRSwgCiAgICBhZGp1c3QgPSAxLCAKICAgIC53aWR0aCA9IDAsIAogICAganVzdGlmaWNhdGlvbiA9IC0uMTUsIAogICAgYWxwaGEgID0gLjUsCiAgICBwb2ludF9jb2xvdXIgPSBOQSkgKyAKICAjIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0nbm9uZScpCiAgIyBnZW9tX2JveHBsb3Qod2lkdGggPSAuMTUsIGFscGhhID0gLjIsIG91dGxpZXIuc2hhcGUgPSBOQSkgKwogIGdlb21fcG9pbnQoc2l6ZSA9IDIsIGFscGhhID0gLjQsIHBvc2l0aW9uID0gcG9zaXRpb25faml0dGVyKHdpZHRoID0gLjA1LCBoZWlnaHQgPSAwKSkgCnN1cHByZXNzV2FybmluZ3MocHJpbnQoYWxwaGFfYXN5bW1ldHJ5X3JhaW4pKQphbHBoYV9hc3ltbWV0cnlfYWZleF9wbG90IDwtCiAgYWZleF9wbG90KAogICAgYWxwaGFfYXN5bW1ldHJ5X3JlcF9hbm92YSwKICAgIHggPSAiUGVyaW9kIiwKICAgIHRyYWNlID0gIlNleCIsCiAgICBwYW5lbCA9ICJHcm91cCIsCiAgICBlcnJvciA9ICJiZXR3ZWVuIiwKICAgIGVycm9yX2FyZyA9IGxpc3Qod2lkdGggPSAuMSksCiAgICBkb2RnZSA9IC0uNSwKICAgIG1hcHBpbmcgPSBjKCJjb2xvciIpLAogICAgcG9pbnRfYXJnID0gbGlzdChzaXplID0gNCkKICApCnN1cHByZXNzV2FybmluZ3MocHJpbnQoYWxwaGFfYXN5bW1ldHJ5X2FmZXhfcGxvdCkpCm5pY2UoYWxwaGFfYXN5bW1ldHJ5X3JlcF9hbm92YSkKYV9wb3N0ZXJpb3JpKGFscGhhX2FzeW1tZXRyeV9yZXBfYW5vdmEpCmBgYAoKIyMgRjYtRjUgcGFpcgoKYGBge3IgYXN5bW1ldHJ5X0Y2X0Y1LCBmaWcud2lkdGggPSAxMn0Kb3B0aW9ucyh3aWR0aCA9IDEwMCkKYWxwaGFfYXN5bW1ldHJ5X3JlcF9hbm92YSA9IGFvdl9leigiU3ViamVjdCIsICJhc3ltbWV0cnlfRjZfRjUiLCBhbHBoYV9hc3ltbWV0cnlfZGF0YSwgYmV0d2VlbiA9IGMoIkdyb3VwIiwgIlNleCIpLCB3aXRoaW4gPSAiUGVyaW9kIikKbXl0YWJsZSA8LSB4dGFicyh+IEdyb3VwICsgU2V4LCBkYXRhID0gYWxwaGFfYXN5bW1ldHJ5X3JlcF9hbm92YSRkYXRhJGxvbmcpIC8gbGVuZ3RoKHVuaXF1ZShhbHBoYV9hc3ltbWV0cnlfZGF0YSRQZXJpb2QpKQpmdGFibGUoYWRkbWFyZ2lucyhteXRhYmxlKSkKYWxwaGFfYXN5bW1ldHJ5X3JhaW4gPC0gZ2dwbG90KGFscGhhX2FzeW1tZXRyeV9yZXBfYW5vdmEkZGF0YSRsb25nLCBhZXMoeSA9IGFzeW1tZXRyeV9GNl9GNSwgeCA9IEdyb3VwLCBjb2xvciA9IFNleCwgZmlsbCA9IFNleCkpICsKICAjIGdndGl0bGUoImFscGhhX2FzeW1tZXRyeSIpICsKICB5bGFiKCJwb3dlciIpICsKICBzdGF0X2hhbGZleWUoCiAgICB0cmltICAgPSBGQUxTRSwgCiAgICBhZGp1c3QgPSAxLCAKICAgIC53aWR0aCA9IDAsIAogICAganVzdGlmaWNhdGlvbiA9IC0uMTUsIAogICAgYWxwaGEgID0gLjUsCiAgICBwb2ludF9jb2xvdXIgPSBOQSkgKyAKICAjIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0nbm9uZScpCiAgIyBnZW9tX2JveHBsb3Qod2lkdGggPSAuMTUsIGFscGhhID0gLjIsIG91dGxpZXIuc2hhcGUgPSBOQSkgKwogIGdlb21fcG9pbnQoc2l6ZSA9IDIsIGFscGhhID0gLjQsIHBvc2l0aW9uID0gcG9zaXRpb25faml0dGVyKHdpZHRoID0gLjA1LCBoZWlnaHQgPSAwKSkgCnN1cHByZXNzV2FybmluZ3MocHJpbnQoYWxwaGFfYXN5bW1ldHJ5X3JhaW4pKQphbHBoYV9hc3ltbWV0cnlfYWZleF9wbG90IDwtCiAgYWZleF9wbG90KAogICAgYWxwaGFfYXN5bW1ldHJ5X3JlcF9hbm92YSwKICAgIHggPSAiUGVyaW9kIiwKICAgIHRyYWNlID0gIlNleCIsCiAgICBwYW5lbCA9ICJHcm91cCIsCiAgICBlcnJvciA9ICJiZXR3ZWVuIiwKICAgIGVycm9yX2FyZyA9IGxpc3Qod2lkdGggPSAuMSksCiAgICBkb2RnZSA9IC0uNSwKICAgIG1hcHBpbmcgPSBjKCJjb2xvciIpLAogICAgcG9pbnRfYXJnID0gbGlzdChzaXplID0gNCkKICApCnN1cHByZXNzV2FybmluZ3MocHJpbnQoYWxwaGFfYXN5bW1ldHJ5X2FmZXhfcGxvdCkpCm5pY2UoYWxwaGFfYXN5bW1ldHJ5X3JlcF9hbm92YSkKYV9wb3N0ZXJpb3JpKGFscGhhX2FzeW1tZXRyeV9yZXBfYW5vdmEpCmBgYAoKIyMgRjgtRjcgcGFpcgoKYGBge3IgYWFzeW1tZXRyeV9GOF9GNywgZmlnLndpZHRoID0gMTJ9Cm9wdGlvbnMod2lkdGggPSAxMDApCmFscGhhX2FzeW1tZXRyeV9yZXBfYW5vdmEgPSBhb3ZfZXooIlN1YmplY3QiLCAiYXN5bW1ldHJ5X0Y4X0Y3IiwgYWxwaGFfYXN5bW1ldHJ5X2RhdGEsIGJldHdlZW4gPSBjKCJHcm91cCIsICJTZXgiKSwgd2l0aGluID0gIlBlcmlvZCIpCm15dGFibGUgPC0geHRhYnMofiBHcm91cCArIFNleCwgZGF0YSA9IGFscGhhX2FzeW1tZXRyeV9yZXBfYW5vdmEkZGF0YSRsb25nKSAvIGxlbmd0aCh1bmlxdWUoYWxwaGFfYXN5bW1ldHJ5X2RhdGEkUGVyaW9kKSkKZnRhYmxlKGFkZG1hcmdpbnMobXl0YWJsZSkpCmFscGhhX2FzeW1tZXRyeV9yYWluIDwtIGdncGxvdChhbHBoYV9hc3ltbWV0cnlfcmVwX2Fub3ZhJGRhdGEkbG9uZywgYWVzKHkgPSBhc3ltbWV0cnlfRjhfRjcsIHggPSBHcm91cCwgY29sb3IgPSBTZXgsIGZpbGwgPSBTZXgpKSArCiAgIyBnZ3RpdGxlKCJhbHBoYV9hc3ltbWV0cnkiKSArCiAgeWxhYigicG93ZXIiKSArCiAgc3RhdF9oYWxmZXllKAogICAgdHJpbSAgID0gRkFMU0UsIAogICAgYWRqdXN0ID0gMSwgCiAgICAud2lkdGggPSAwLCAKICAgIGp1c3RpZmljYXRpb24gPSAtLjE1LCAKICAgIGFscGhhICA9IC41LAogICAgcG9pbnRfY29sb3VyID0gTkEpICsgCiAgIyB0aGVtZShsZWdlbmQucG9zaXRpb249J25vbmUnKQogICMgZ2VvbV9ib3hwbG90KHdpZHRoID0gLjE1LCBhbHBoYSA9IC4yLCBvdXRsaWVyLnNoYXBlID0gTkEpICsKICBnZW9tX3BvaW50KHNpemUgPSAyLCBhbHBoYSA9IC40LCBwb3NpdGlvbiA9IHBvc2l0aW9uX2ppdHRlcih3aWR0aCA9IC4wNSwgaGVpZ2h0ID0gMCkpIApzdXBwcmVzc1dhcm5pbmdzKHByaW50KGFscGhhX2FzeW1tZXRyeV9yYWluKSkKYWxwaGFfYXN5bW1ldHJ5X2FmZXhfcGxvdCA8LQogIGFmZXhfcGxvdCgKICAgIGFscGhhX2FzeW1tZXRyeV9yZXBfYW5vdmEsCiAgICB4ID0gIlBlcmlvZCIsCiAgICB0cmFjZSA9ICJTZXgiLAogICAgcGFuZWwgPSAiR3JvdXAiLAogICAgZXJyb3IgPSAiYmV0d2VlbiIsCiAgICBlcnJvcl9hcmcgPSBsaXN0KHdpZHRoID0gLjEpLAogICAgZG9kZ2UgPSAtLjUsCiAgICBtYXBwaW5nID0gYygiY29sb3IiKSwKICAgIHBvaW50X2FyZyA9IGxpc3Qoc2l6ZSA9IDQpCiAgKQpzdXBwcmVzc1dhcm5pbmdzKHByaW50KGFscGhhX2FzeW1tZXRyeV9hZmV4X3Bsb3QpKQpuaWNlKGFscGhhX2FzeW1tZXRyeV9yZXBfYW5vdmEpCmFfcG9zdGVyaW9yaShhbHBoYV9hc3ltbWV0cnlfcmVwX2Fub3ZhKQpgYGAKCiMjIEZDMi1GQzEgcGFpcgoKYGBge3IgYXN5bW1ldHJ5X0ZDMl9GQzEsIGZpZy53aWR0aCA9IDEyfQpvcHRpb25zKHdpZHRoID0gMTAwKQphbHBoYV9hc3ltbWV0cnlfcmVwX2Fub3ZhID0gYW92X2V6KCJTdWJqZWN0IiwgImFzeW1tZXRyeV9GQzJfRkMxIiwgYWxwaGFfYXN5bW1ldHJ5X2RhdGEsIGJldHdlZW4gPSBjKCJHcm91cCIsICJTZXgiKSwgd2l0aGluID0gIlBlcmlvZCIpCm15dGFibGUgPC0geHRhYnMofiBHcm91cCArIFNleCwgZGF0YSA9IGFscGhhX2FzeW1tZXRyeV9yZXBfYW5vdmEkZGF0YSRsb25nKSAvIGxlbmd0aCh1bmlxdWUoYWxwaGFfYXN5bW1ldHJ5X2RhdGEkUGVyaW9kKSkKZnRhYmxlKGFkZG1hcmdpbnMobXl0YWJsZSkpCmFscGhhX2FzeW1tZXRyeV9yYWluIDwtIGdncGxvdChhbHBoYV9hc3ltbWV0cnlfcmVwX2Fub3ZhJGRhdGEkbG9uZywgYWVzKHkgPSBhc3ltbWV0cnlfRkMyX0ZDMSwgeCA9IEdyb3VwLCBjb2xvciA9IFNleCwgZmlsbCA9IFNleCkpICsKICAjIGdndGl0bGUoImFscGhhX2FzeW1tZXRyeSIpICsKICB5bGFiKCJwb3dlciIpICsKICBzdGF0X2hhbGZleWUoCiAgICB0cmltICAgPSBGQUxTRSwgCiAgICBhZGp1c3QgPSAxLCAKICAgIC53aWR0aCA9IDAsIAogICAganVzdGlmaWNhdGlvbiA9IC0uMTUsIAogICAgYWxwaGEgID0gLjUsCiAgICBwb2ludF9jb2xvdXIgPSBOQSkgKyAKICAjIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0nbm9uZScpCiAgIyBnZW9tX2JveHBsb3Qod2lkdGggPSAuMTUsIGFscGhhID0gLjIsIG91dGxpZXIuc2hhcGUgPSBOQSkgKwogIGdlb21fcG9pbnQoc2l6ZSA9IDIsIGFscGhhID0gLjQsIHBvc2l0aW9uID0gcG9zaXRpb25faml0dGVyKHdpZHRoID0gLjA1LCBoZWlnaHQgPSAwKSkgCnN1cHByZXNzV2FybmluZ3MocHJpbnQoYWxwaGFfYXN5bW1ldHJ5X3JhaW4pKQphbHBoYV9hc3ltbWV0cnlfYWZleF9wbG90IDwtCiAgYWZleF9wbG90KAogICAgYWxwaGFfYXN5bW1ldHJ5X3JlcF9hbm92YSwKICAgIHggPSAiUGVyaW9kIiwKICAgIHRyYWNlID0gIlNleCIsCiAgICBwYW5lbCA9ICJHcm91cCIsCiAgICBlcnJvciA9ICJiZXR3ZWVuIiwKICAgIGVycm9yX2FyZyA9IGxpc3Qod2lkdGggPSAuMSksCiAgICBkb2RnZSA9IC0uNSwKICAgIG1hcHBpbmcgPSBjKCJjb2xvciIpLAogICAgcG9pbnRfYXJnID0gbGlzdChzaXplID0gNCkKICApCnN1cHByZXNzV2FybmluZ3MocHJpbnQoYWxwaGFfYXN5bW1ldHJ5X2FmZXhfcGxvdCkpCm5pY2UoYWxwaGFfYXN5bW1ldHJ5X3JlcF9hbm92YSkKYV9wb3N0ZXJpb3JpKGFscGhhX2FzeW1tZXRyeV9yZXBfYW5vdmEpCmBgYAo=