# Load data
resp_locked_data <- read.csv(file = "./data/response_locked_data_for_plots.csv", header = TRUE)
# Create relevant variables
resp_locked_data <- resp_locked_data %>%
dplyr::mutate(
stimulation = factor(ifelse(
participant_id == "C_01_T1" | participant_id == "C_02_T1" | participant_id == "C_03_T2" |
participant_id == "C_04_T2" | participant_id == "C_05_T1" | participant_id == "C_06_T2" |
participant_id == "C_07_T1" | participant_id == "C_08_T1" | participant_id == "C_09_T2" |
participant_id == "C_10_T2" | participant_id == "C_11_T2" | participant_id == "C_12_T2" |
participant_id == "C_13_T1" | participant_id == "C_15_T2" | participant_id == "C_16_T1" |
participant_id == "C_17_T2" | participant_id == "C_18_T2" | participant_id == "C_19_T1" |
participant_id == "C_20_T1" | participant_id == "C_21_T2" | participant_id == "C_22_T2" |
participant_id == "C_23_T1" | participant_id == "C_24_T1" | participant_id == "C_25_T1" |
participant_id == "C_26_T1" | participant_id == "C_27_T2" | participant_id == "C_28_T2" |
participant_id == "C_29_T1" | participant_id == "C_30_T2" | participant_id == "P_01_T1" |
participant_id == "P_02_T2" | participant_id == "P_03_T2" | participant_id == "P_04_T1" |
participant_id == "P_05_T1" | participant_id == "P_06_T1" | participant_id == "P_07_T2" |
participant_id == "P_08_T2" | participant_id == "P_09_T2" | participant_id == "P_10_T1" |
participant_id == "P_11_T2" | participant_id == "P_12_T2" | participant_id == "P_13_T1" |
participant_id == "P_15_T1" | participant_id == "P_16_T1" | participant_id == "P_17_T2" |
participant_id == "P_18_T1" | participant_id == "P_19_T1" | participant_id == "P_20_T2" |
participant_id == "P_21_T2" | participant_id == "P_22_T1" | participant_id == "P_23_T1" |
participant_id == "P_24_T2" | participant_id == "P_25_T1" | participant_id == "P_26_T2" |
participant_id == "P_27_T1" | participant_id == "P_28_T2" | participant_id == "P_29_T2" |
participant_id == "P_30_T1", "sham", "verum")),
condition = factor(ifelse(condition == 1, "correct", "incorrect"),
levels = c("incorrect", "correct")),
group = factor(ifelse(substr(participant_id, 1, 1) == "C", "HC", "OCD")),
session = factor(ifelse(substr(participant_id, 6, 7) == "T1", "T1", "T2")),
participant_id = factor(substr(participant_id, 1, 4)), # to get correct no. of factor levels
condition = factor(condition, levels = c("incorrect", "correct")),
)
# Exclude P_02 and C_02
resp_locked_data <- resp_locked_data[resp_locked_data$participant_id != "P_02" &
resp_locked_data$participant_id != "C_02", ]
resp_locked_data$participant_id <- droplevels(resp_locked_data$participant_id)
# Calculate running within-participant CIs for ERN/CRN
running_CIs_MFN <- resp_locked_data %>%
split(.$time) %>%
map(~ summarySEwithinO(data = .,
measurevar = "FCz",
withinvars = c("condition", "stimulation"),
betweenvars = "group",
idvar = "participant_id"))
CIs_MFN <- purrr::map_df(running_CIs_MFN, magrittr::extract) %>%
dplyr::mutate(
time = rep(unique(resp_locked_data$time), each = 8)
) # Note. 8 refers to no. of conditions (group x stimulation x resp_type = 2 x 2 x 2 = 8)
# Calculate running within-participant CIs for Pe
running_CIs_Pe <- resp_locked_data %>%
split(.$time) %>%
map(~ summarySEwithinO(data = .,
measurevar = "Pz",
withinvars = c("condition", "stimulation"),
betweenvars = "group",
idvar = "participant_id"))
CIs_Pe <- purrr::map_df(running_CIs_Pe, magrittr::extract) %>%
dplyr::mutate(
time = rep(unique(resp_locked_data$time), each = 8)
)
# Convert to long format for electrodes for ERN/CRN
data_topo_MFN <- resp_locked_data %>%
# Remove channels of no interest
dplyr::select(-IO1, -M1, -F9, -F10) %>%
# Change from wide to long format for electrodes
tidyr::gather(., electrode, amplitude, Fp1:O2, factor_key = TRUE) %>%
# Select time windows
dplyr::filter(time >= 0 & time <= 100) %>%
# Add electrode information
electrode_locations(., electrode = "electrode", drop = FALSE, montage = NULL)
# Convert to long format for electrodes for Pe
data_topo_Pe <- resp_locked_data %>%
# Remove channels of no interest
dplyr::select(-IO1, -M1, -F9, -F10) %>%
# Change from wide to long format for electrodes
tidyr::gather(., electrode, amplitude, Fp1:O2, factor_key = TRUE) %>%
# Select time windows
dplyr::filter(time >= 200 & time <= 400) %>%
# Add electrode information
electrode_locations(., electrode = "electrode", drop = FALSE, montage = NULL)
#### Create plots of predicted means ####
# Load LMM output
LMM_ERN <- readRDS(file = "./saved_objects_for_plots/LMM_ERN.rds")
LMM_CRN <- readRDS(file = "./saved_objects_for_plots/LMM_CRN.rds")
LMM_Pe <- readRDS(file = "./saved_objects_for_plots/LMM_Pe.rds")
# ERN
plot_LMM_ERN <- plot_model(LMM_ERN, type = "pred", terms = c("group", "stimulation"),
ci.lvl = .95, title = "", dodge = 0.4, line.size = .5) +
labs(x = "", y = "Predicted ERN Amplitude (µV)") +
my_figure_theme +
aes(color = group) +
scale_color_manual(name = "tDCS", labels = c("sham", "cathodal"), values = colors_ERN) +
coord_cartesian(ylim = c(-9, 3), xlim = c(0.5, 2.5)) +
scale_y_continuous(breaks = seq(-9, 3, 2), expand = c(0, 0)) +
scale_x_continuous(labels = c("HC", "OCD"), breaks = c(1, 2), expand = c(0, 0)) +
theme(axis.ticks.x = element_blank(), legend.position = "none")
# CRN
plot_LMM_CRN <- plot_model(LMM_CRN, type = "pred", terms = c("group", "stimulation"),
ci.lvl = .95, title = "", dodge = 0.4, line.size = .5) +
labs(x = "", y = "Predicted CRN Amplitude (µV)") +
my_figure_theme +
aes(color = group) +
scale_color_manual(name = "tDCS", labels = c("sham", "cathodal"), values = colors_CRN) +
coord_cartesian(ylim = c(1, 9), xlim = c(0.5, 2.5)) +
scale_y_continuous(breaks = seq(1, 9, 2), expand = c(0, 0)) +
scale_x_continuous(labels = c("HC", "OCD"), breaks = c(1, 2), expand = c(0, 0)) +
theme(axis.ticks.x = element_blank(), legend.position = "none")
# Pe
plot_LMM_Pe <- plot_model(LMM_Pe,type = "pred", terms = c("group", "stimulation"),
ci.lvl = .95, title = "", dodge = 0.4, line.size = .5) +
labs(x = "", y = "Predicted Pe Amplitude (µV)") +
my_figure_theme +
aes(color = group) +
scale_color_manual(name = "tDCS", labels = c("sham", "cathodal"), values = colors_Pe) +
coord_cartesian(ylim = c(5.8, 14), xlim = c(0.5, 2.5)) +
scale_y_continuous(breaks = seq(6, 14, 2), expand = c(0, 0)) +
scale_x_continuous(labels = c("HC", "OCD"), breaks = c(1, 2), expand = c(0, 0)) +
theme(axis.ticks.x = element_blank(), legend.position = "none")
#### Create boxplots with probability density plots ####
# Load data
load(file = "./data/Single_Trial_Data.rda")
# Exclude missing responses, RT outliers, and trials with ERP artifacts
single_trial_data_clean <- single_trial_data %>%
dplyr::filter(
response_type != "miss" &
rt_invalid == FALSE &
!is.na(MFN_0_100_FCz)
) # (53093 of 53760 trials left)
# Aggregate data
data_aggregated <- single_trial_data_clean %>%
dplyr::group_by(participant_id, group, response_type, stimulation, session) %>%
dplyr::summarize(
MFN = mean(MFN_0_100_FCz, na.rm = TRUE),
Pe = mean(Pe_200_400_Pz, na.rm = TRUE)
) %>%
dplyr::ungroup()
# ERN
plot_box_density_ERN <- ggplot() +
geom_flat_violin(data = data_aggregated[data_aggregated$response_type == "incorrect", ],
aes(x = group, y = MFN, fill = stimulation),
position = position_nudge(x = .2, y = 0),
adjust = 1.5, trim = FALSE, alpha = .5, colour = NA) +
geom_boxplot(data = data_aggregated[data_aggregated$response_type == "incorrect", ],
aes(x = group, y = MFN, fill = stimulation),
position = position_dodge(width = 0.3),
outlier.shape = NA, width = .2, alpha = .8, colour = "black") +
scale_fill_manual(values = colors_ERN, name = "tDCS:") +
labs(x = "", y = "ERN Amplitude (µV)") +
coord_cartesian(ylim = c(-35, 25), xlim = c(1.15, 2.25)) +
scale_y_continuous(breaks = seq(-35, 25, 10), expand = c(0, 0)) +
my_figure_theme +
theme(legend.position = "none", axis.ticks.x = element_blank())
# CRN
plot_box_density_CRN <- ggplot() +
geom_flat_violin(data = data_aggregated[data_aggregated$response_type == "correct", ],
aes(x = group, y = MFN, fill = stimulation),
position = position_nudge(x = .2, y = 0),
adjust = 1.5, trim = FALSE, alpha = .5, colour = NA) +
geom_boxplot(data = data_aggregated[data_aggregated$response_type == "correct", ],
aes(x = group, y = MFN, fill = stimulation),
position = position_dodge(width = 0.3),
outlier.shape = NA, width = .2, colour = "black") +
scale_fill_manual(values = colors_CRN, name = "tDCS:") +
labs(x = "", y = "CRN Amplitude (µV)") +
coord_cartesian(ylim = c(-15, 25), xlim = c(1.15, 2.25)) +
scale_y_continuous(breaks = seq(-15, 25, 10), expand = c(0, 0)) +
my_figure_theme +
theme(legend.position = "none", axis.ticks.x = element_blank(),
axis.title.y = element_text(vjust = -1))
# Pe
plot_box_density_Pe <- ggplot() +
geom_flat_violin(data = data_aggregated[data_aggregated$response_type == "incorrect", ],
aes(x = group, y = Pe, fill = stimulation),
position = position_nudge(x = .2, y = 0),
adjust = 1.5, trim = FALSE, alpha = .5, colour = NA) +
geom_boxplot(data = data_aggregated[data_aggregated$response_type == "incorrect", ],
aes(x = group, y = Pe, fill = stimulation),
position = position_dodge(width = 0.3),
outlier.shape = NA, width = .2, colour = "black") +
scale_fill_manual(values = colors_Pe, name = "tDCS:") +
labs(x = "", y = "Pe Amplitude (µV)") +
coord_cartesian(ylim = c(-10, 30), xlim = c(1.15, 2.25)) +
scale_y_continuous(breaks = seq(-10, 30, 10), expand = c(0, 0)) +
my_figure_theme +
theme(legend.position = "none", axis.ticks.x = element_blank(),
axis.title.y = element_text(vjust = -.5))
#### Create waveform plots ####
# Define facet labels
group.labs <- c("Healthy Control Participants ", "Patients With OCD")
names(group.labs) <- c("HC", "OCD")
# Define electrode labels
label_FCz <- data.frame(time = -320, FCz = 11.5, lab = "Text", group = factor("HC", levels = c("HC", "OCD")))
label_Pz <- data.frame(time = -320, Pz = 11.6, lab = "Text", group = factor("HC", levels = c("HC", "OCD")))
# ERN/CRN
plot_waveform_MFN <- ggplot(resp_locked_data, aes(time, FCz)) +
stat_summary(fun = mean, geom = "line", size = 0.5, linetype = "solid", aes(colour = condition:stimulation)) +
geom_ribbon(data = CIs_MFN, aes(ymin = FCz - ci, ymax = FCz + ci, fill = condition:stimulation), alpha = 0.2) +
guides(fill = "none") +
geom_segment(aes(x = 0, xend = 0, y = -10, yend = 12), linetype = "dotted", colour = "grey50") + # Add vline
geom_segment(aes(x = -400, xend = 800, y = 0, yend = 0), linetype = "dotted", colour = "grey50") + # Add hline
geom_text(data = label_FCz, label = "FCz") + #
annotate("rect", xmin = 0, xmax = 100, ymin = -10, ymax = 12, alpha = .2, fill = "grey50") + # Add shaded time area
coord_cartesian(ylim = c(-10, 12), xlim = c(-400, 800)) +
scale_y_continuous(breaks = seq(-10, 12, 2), expand = c(0, 0)) +
scale_x_continuous(breaks = seq(-400, 800, 200), expand = c(0, 0)) +
scale_colour_manual(values = c(colors_ERN, colors_CRN),
labels = c("Error: Sham", "Error: Cathodal", "Correct: Sham", "Correct: Cathodal"),
guide = guide_legend(override.aes = list(size = 1.3))) + # Thickness legend lines
scale_fill_manual(values = c(colors_ERN, colors_CRN)) +
labs(x = "Time (ms)", y = expression(paste("Amplitude (", mu, "V)"))) +
facet_rep_grid(cols = vars(group), labeller = labeller(group = group.labs), repeat.tick.labels = TRUE) +
my_figure_theme +
theme(strip.text.x = element_text(margin = margin(0, 0, 4, 0, "cm"), size = 12, face = "bold"),
axis.title.y = element_text(vjust = -1.5), panel.spacing = unit(0.75, "cm"),
legend.title = element_blank(), legend.text = element_text(size = 11))
# Pe
plot_waveform_Pe <- ggplot(resp_locked_data[resp_locked_data$condition == "incorrect", ], aes(time, Pz)) +
stat_summary(fun = mean, geom = "line", size = 0.5, linetype = "solid", aes(colour = condition:stimulation)) +
geom_ribbon(data = CIs_Pe[CIs_Pe$condition == "incorrect", ],
aes(ymin = Pz - ci, ymax = Pz + ci, fill = condition:stimulation), alpha = 0.2) +
guides(fill = "none") +
geom_segment(aes(x = 0, xend = 0, y = -2, yend = 12), linetype = "dotted", colour = "grey50") +
geom_segment(aes(x = -400, xend = 800, y = 0, yend = 0), linetype = "dotted", colour = "grey50") +
geom_text(data = label_Pz, label = "Pz") +
annotate("rect", xmin = 200, xmax = 400, ymin = -2, ymax = 12, alpha = .2, fill = "grey50") +
coord_cartesian(ylim = c(-2, 12), xlim = c(-400, 800)) +
scale_y_continuous(breaks = seq(-2, 12, 2), expand = c(0, 0)) +
scale_x_continuous(breaks = seq(-400, 800, 200), expand = c(0, 0)) +
scale_colour_manual(values = colors_Pe,
labels = c("Error: Sham", "Error: Cathodal"),
guide = guide_legend(override.aes = list(size = 1.3))) +
scale_fill_manual(values = colors_Pe) +
labs(x = "Time (ms)", y = expression(paste("Amplitude (", mu, "V)"))) +
facet_rep_grid(cols = vars(group), labeller = labeller(group = group.labs), repeat.tick.labels = TRUE) +
my_figure_theme +
theme(strip.text.x = element_text(margin = margin(0, 0, 3.5, 0, "cm"), size = 11, face = "bold"),
axis.title.y = element_text(vjust = -1.5), panel.spacing = unit(0.75, "cm"),
legend.title = element_blank(), legend.text = element_text(size = 11))
# Get legend and remove individual legends from plot to create common legend
legend_MFN <- get_legend(plot_waveform_MFN)
legend_Pe <- get_legend(plot_waveform_Pe)
plot_waveform_MFN <- plot_waveform_MFN + theme(legend.position = "none")
plot_waveform_Pe <- plot_waveform_Pe + theme(legend.position = "none")
#### Create topography plots ####
# Define facet labels
stimulation.labs_incorr <- c("Error: Sham", "Error: Cathodal")
names(stimulation.labs_incorr) <- c("sham", "verum")
stimulation.labs_corr <- c("Correct: Sham", "Correct: Cathodal")
names(stimulation.labs_corr) <- c("sham", "verum")
# ERN HC
plot_topo_HC_ERN <- ggplot(data_topo_MFN[data_topo_MFN$group == "HC" & data_topo_MFN$condition == "incorrect", ],
aes(x = x, y = y, fill = amplitude, label = electrode)) +
geom_topo(grid_res = 300, interp_limit = "head", chan_markers = "point", chan_size = 0.1, head_size = 0.2) +
scale_fill_distiller(palette = "RdBu", limits = c(-5.1, 6.5), breaks = c(-5, 0, 5)) + #
theme_void() +
coord_equal() +
labs(fill = expression(paste(mu, "V"))) +
theme(legend.position = "bottom", legend.text = element_text(size = 7, color = "grey30"),
legend.title = element_text(size = 7, color = "grey30"), legend.key.height = unit(0.25, 'cm'),
legend.key.width = unit(0.25, 'cm'), strip.text.x = element_text(size = 7)) +
facet_grid(cols = vars(stimulation), labeller = labeller(stimulation = stimulation.labs_incorr))
# ERN OCD
plot_topo_OCD_ERN <- ggplot(data_topo_MFN[data_topo_MFN$group == "OCD" & data_topo_MFN$condition == "incorrect", ],
aes(x = x, y = y, fill = amplitude, label = electrode)) +
geom_topo(grid_res = 300, interp_limit = "head", chan_markers = "point", chan_size = 0.1, head_size = 0.2) +
scale_fill_distiller(palette = "RdBu", limits = c(-5.1, 6.5), breaks = c(-5, 0, 5)) + #
theme_void() +
coord_equal() +
labs(fill = expression(paste(mu, "V"))) +
theme(legend.position = "bottom", legend.text = element_text(size = 7, color = "grey30"),
legend.title = element_text(size = 7, color = "grey30"), legend.key.height = unit(0.25, 'cm'),
legend.key.width = unit(0.25, 'cm'), strip.text.x = element_text(size = 7)) +
facet_grid(cols = vars(stimulation), labeller = labeller(stimulation = stimulation.labs_incorr))
# CRN HC
plot_topo_HC_CRN <- ggplot(data_topo_MFN[data_topo_MFN$group == "HC" & data_topo_MFN$condition == "correct", ],
aes(x = x, y = y, fill = amplitude, label = electrode)) +
geom_topo(grid_res = 300, interp_limit = "head", chan_markers = "point", chan_size = 0.1, head_size = 0.2) +
scale_fill_distiller(palette = "RdBu", limits = c(0.5, 11.7), breaks = c(2, 6, 10)) + #
theme_void() +
coord_equal() +
labs(fill = expression(paste(mu, "V"))) +
theme(legend.position = "bottom", legend.text = element_text(size = 7, color = "grey30"),
legend.title = element_text(size = 7, color = "grey30"), legend.key.height = unit(0.25, 'cm'),
legend.key.width = unit(0.25, 'cm'), strip.text.x = element_text(size = 7)) +
facet_grid(cols = vars(stimulation), labeller = labeller(stimulation = stimulation.labs_corr))
# CRN OCD
plot_topo_OCD_CRN <- ggplot(data_topo_MFN[data_topo_MFN$group == "OCD" & data_topo_MFN$condition == "correct", ],
aes(x = x, y = y, fill = amplitude, label = electrode)) +
geom_topo(grid_res = 300, interp_limit = "head", chan_markers = "point", chan_size = 0.1, head_size = 0.2) +
scale_fill_distiller(palette = "RdBu", limits = c(0.5, 11.7), breaks = c(2, 6, 10)) + #
theme_void() +
coord_equal() +
labs(fill = expression(paste(mu, "V"))) +
theme(legend.position = "bottom", legend.text = element_text(size = 7, color = "grey30"),
legend.title = element_text(size = 7, color = "grey30"), legend.key.height = unit(0.25, 'cm'),
legend.key.width = unit(0.25, 'cm'), strip.text.x = element_text(size = 7)) +
facet_grid(cols = vars(stimulation), labeller = labeller(stimulation = stimulation.labs_corr))
# Pe HC
plot_topo_HC_Pe <- ggplot(data_topo_Pe[data_topo_Pe$group == "HC" & data_topo_Pe$condition == "incorrect", ],
aes(x = x, y = y, fill = amplitude, label = electrode)) +
geom_topo(grid_res = 300, interp_limit = "head", chan_markers = "point", chan_size = 0.1, head_size = 0.2) +
scale_fill_distiller(palette = "RdBu", limits = c(2, 10.4)) +
theme_void() +
coord_equal() +
labs(fill = expression(paste(mu, "V"))) +
theme(legend.position = "bottom", legend.text = element_text(size = 7, color = "grey30"),
legend.title = element_text(size = 7, color = "grey30"), legend.key.height = unit(0.25, 'cm'),
legend.key.width = unit(0.25, 'cm'), strip.text.x = element_text(size = 6.5)) +
facet_grid(cols = vars(stimulation), labeller = labeller(stimulation = stimulation.labs_incorr))
# Pe OCD
plot_topo_OCD_Pe <- ggplot(data_topo_Pe[data_topo_Pe$group == "OCD" & data_topo_Pe$condition == "incorrect", ],
aes(x = x, y = y, fill = amplitude, label = electrode)) +
geom_topo(grid_res = 300, interp_limit = "head", chan_markers = "point", chan_size = 0.1, head_size = 0.2) +
scale_fill_distiller(palette = "RdBu", limits = c(2, 10.4)) +
theme_void() +
coord_equal() +
labs(fill = expression(paste(mu, "V"))) +
theme(legend.position = "bottom", legend.text = element_text(size = 7, color = "grey30"),
legend.title = element_text(size = 7, color = "grey30"), legend.key.height = unit(0.25, 'cm'),
legend.key.width = unit(0.25, 'cm'), strip.text.x = element_text(size = 6.5)) +
facet_grid(cols = vars(stimulation), labeller = labeller(stimulation = stimulation.labs_incorr))
ERN & CRN
This figure corresponds to Figure 1 in the manuscript.
# Overlay waveforms and topopgraphy plots
aligned_plots1_MFN <- align_plots(plot_waveform_MFN, plot_topo_HC_ERN, axis = "tr")
aligned_plots2_MFN <- align_plots(plot_waveform_MFN, plot_topo_HC_CRN, axis = "tr")
aligned_plots3_MFN <- align_plots(plot_waveform_MFN, plot_topo_OCD_ERN, axis = "tr")
aligned_plots4_MFN <- align_plots(plot_waveform_MFN, plot_topo_OCD_CRN, axis = "tr")
# Arrange plots
figure_ERN_CRN <- ggdraw() +
draw_plot(aligned_plots1_MFN[[1]], x = 0, y = .42, width = .99, height = .56) +
draw_plot(aligned_plots1_MFN[[2]], x = .073, y = .795, width = .2, height = .15) +
draw_plot(aligned_plots2_MFN[[2]], x = .293, y = .795, width = .2, height = .15) +
draw_plot(aligned_plots3_MFN[[2]], x = .563, y = .795, width = .2, height = .15) +
draw_plot(aligned_plots4_MFN[[2]], x = .783, y = .795, width = .2, height = .15) +
draw_plot(legend_MFN, x = .318, y = .4, width = .4, height = .01) +
draw_plot(plot_box_density_ERN, x = .01, y = .04, width = .3, height = .29) +
draw_plot(plot_LMM_ERN, x = .6, y = .04, width = .2, height = .32) +
draw_plot(plot_box_density_CRN, x = .3, y = .04, width = .3, height = .29) +
draw_plot(plot_LMM_CRN, x = .8, y = .04, width = .2, height = .32) +
draw_plot(legend_MFN, x = .318, y = .035, width = .4, height = .01) +
draw_plot_label(c("A", "B", "C"), c(0, 0, .59), c(1, .36, .36), size = 15)
figure_ERN_CRN
# Save plot
ggsave(plot = figure_ERN_CRN, "./figures/figure_ERN_CRN.tiff", width = 20, height = 24,
units = "cm", dpi = 600, compression = "lzw")
Pe
This figure corresponds to Figure S1 in the supplemental material.
# Overlay waveforms and tpopgraphy plots
aligned_plots1_Pe <- align_plots(plot_waveform_Pe, plot_topo_HC_Pe, axis = "tr")
aligned_plots2_Pe <- align_plots(plot_waveform_Pe, plot_topo_OCD_Pe, axis = "tr")
# Arrange plots
figure_Pe <- ggdraw() +
draw_plot(aligned_plots1_Pe[[1]], x = 0, y = .05, width = .765, height = .92) +
draw_plot(aligned_plots1_Pe[[2]], x = .07, y = .664, width = .3, height = .22) +
draw_plot(aligned_plots2_Pe[[2]], x = .447, y = .664, width = .3, height = .22) +
draw_plot(plot_box_density_Pe, x = .77, y = .48, width = .25, height = .47) +
draw_plot(plot_LMM_Pe, x = .774, y = .05, width = .25, height = .48) +
draw_plot(legend_Pe, x = .3, y = .01, width = .2, height = .01) +
draw_plot_label(c("A", "B", "C"), c(0, .75, .75), c(1, 1, .58), size = 15)
figure_Pe
# Save plot
ggsave(plot = figure_Pe, "./figures/figure_Pe.tiff", width = 20, height = 12,
units = "cm", dpi = 600, compression = "lzw")
Session Info
sessionInfo()
R version 3.6.1 (2019-07-05)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows 10 x64 (build 19044)
Matrix products: default
locale:
[1] LC_COLLATE=German_Germany.1252 LC_CTYPE=German_Germany.1252
[3] LC_MONETARY=German_Germany.1252 LC_NUMERIC=C
[5] LC_TIME=German_Germany.1252
attached base packages:
[1] stats graphics grDevices datasets utils methods base
other attached packages:
[1] lmerTest_3.1-3 lme4_1.1-25 Matrix_1.2-17 plyr_1.8.6 lemon_0.4.5
[6] sjPlot_2.8.6 tidyr_1.1.2 eegUtils_0.5.0 purrr_0.3.4 cowplot_1.1.0
[11] ggplot2_3.3.2 dplyr_1.0.6
loaded via a namespace (and not attached):
[1] nlme_3.1-140 matrixStats_0.57.0 RColorBrewer_1.1-2
[4] insight_0.14.0 httr_1.4.2 numDeriv_2016.8-1.1
[7] backports_1.2.0 tools_3.6.1 utf8_1.1.4
[10] R6_2.5.0 sjlabelled_1.1.7 lazyeval_0.2.2
[13] mgcv_1.8-28 colorspace_1.4-1 withr_2.3.0
[16] tidyselect_1.1.0 gridExtra_2.3 emmeans_1.5.2-1
[19] compiler_3.6.1 performance_0.7.1.1 edfReader_1.2.1
[22] plotly_4.9.2.1 bayestestR_0.9.0 scales_1.1.1
[25] mvtnorm_1.1-1 stringr_1.4.0 digest_0.6.27
[28] minqa_1.2.4 rmarkdown_2.5 R.utils_2.10.1
[31] ini_0.3.1 pkgconfig_2.0.3 htmltools_0.5.0
[34] parallelly_1.22.0 fastmap_1.0.1 htmlwidgets_1.5.2
[37] rlang_0.4.11 shiny_1.5.0 farver_2.0.3
[40] generics_0.1.0 jsonlite_1.7.1 R.oo_1.24.0
[43] magrittr_2.0.1 R.matlab_3.6.2 parameters_0.13.0
[46] Rcpp_1.0.5 munsell_0.5.0 fansi_0.4.1
[49] abind_1.4-5 viridis_0.5.1 lifecycle_1.0.0
[52] R.methodsS3_1.8.1 stringi_1.5.3 yaml_2.2.1
[55] MASS_7.3-53 grid_3.6.1 parallel_3.6.1
[58] listenv_0.8.0 promises_1.1.1 sjmisc_2.8.5
[61] shinydashboard_0.7.1 crayon_1.3.4 miniUI_0.1.1.1
[64] lattice_0.20-38 ggeffects_0.16.0 splines_3.6.1
[67] sjstats_0.18.0 knitr_1.30 pillar_1.6.0
[70] boot_1.3-22 estimability_1.3 effectsize_0.4.0
[73] future.apply_1.6.0 codetools_0.2-16 glue_1.4.2
[76] evaluate_0.14 modelr_0.1.8 data.table_1.13.4
[79] renv_0.12.0 nloptr_1.2.2.2 vctrs_0.3.8
[82] httpuv_1.5.4 gtable_0.3.0 future_1.21.0
[85] xfun_0.19 mime_0.9 broom_0.7.2
[88] xtable_1.8-4 pracma_2.2.9 later_1.1.0.1
[91] viridisLite_0.3.0 signal_0.7-6 tibble_3.0.4
[94] statmod_1.4.35 globals_0.14.0 ellipsis_0.3.2
LS0tDQp0aXRsZTogIlBsb3RzIg0Kb3V0cHV0OiANCiAgaHRtbF9kb2N1bWVudA0KLS0tDQoNCjwhLS0gU2V0IGdlbmVyYWwgc2V0dGluZ3MgLS0+DQoNCmBgYHtyIHNldHVwLCBpbmNsdWRlID0gRkFMU0V9DQoNCiMgU2V0IGdlbmVyYWwgc2V0dGluZ3MgZm9yIG1hcmtkb3duIGZpbGUNCmtuaXRyOjpvcHRzX2NodW5rJHNldCgNCiAgbWVzc2FnZSA9IEZBTFNFLA0KICB3YXJuaW5nID0gRkFMU0UsDQogIGNvbW1lbnQgPSAiIiwNCiAgcmVzdWx0cyA9ICJob2xkIg0KKQ0KDQoNCiMgQ2xlYXIgZW52aXJvbm1lbnQNCnJtKGxpc3QgPSBscygpKQ0KDQoNCiMgRW5hYmxlL2Rpc2FibGUgY2FjaGluZyBvZiB0aW1lLWNvbnN1bWluZyBjb2RlIGNodW5rcw0Ka25pdHJfY2FjaGVfZW5hYmxlZCA9IFRSVUUNCg0KDQojIExvYWQgcGFja2FnZXMNCmxpYnJhcnkoZHBseXIpICAgICAgIyBmb3IgZGF0YSBtYW5pcHVsYXRpb24NCmxpYnJhcnkoZ2dwbG90MikgICAgIyBmb3IgcGxvdHRpbmcNCmxpYnJhcnkoY293cGxvdCkgICAgIyBmb3IgYXJyYW5naW5nIHBsb3RzDQpsaWJyYXJ5KHB1cnJyKSAgICAgICMgZm9yIGNhbGN1bGF0aW5nIHdpdGhpbi1wYXJ0aWNpcGFudCBDSXMNCmxpYnJhcnkoZWVnVXRpbHMpICAgIyBmb3IgcGxvdHRpbmcgdG9wb2dyYXBoaWVzDQpsaWJyYXJ5KHRpZHlyKSAgICAgICMgZm9yIGdhdGhlciBmdW5jdGlvbg0KbGlicmFyeShzalBsb3QpICAgICAjIGZvciBwbG90X21vZGVsIGZ1bmN0aW9uDQpsaWJyYXJ5KGxlbW9uKSAgICAgICMgZm9yIGZ1bmN0aW9uIGZhY2V0X3JlcF9ncmlkLCB0byByZXBlYXQgeSBheGlzIGluIGZhY2V0cw0KDQoNCiMgTG9hZCBmdW5jdGlvbnMNCnNvdXJjZSgiLi9mdW5jdGlvbnMvc3VtbWFyeVNFd2l0aGluTy5SIikgICMgRnVuY3Rpb24gcHJvdmlkZWQgYnkgUi1jb29rYm9vazogaHR0cDovL3d3dy5jb29rYm9vay1yLmNvbS9HcmFwaHMvUGxvdHRpbmdfbWVhbnNfYW5kX2Vycm9yX2JhcnNfKGdncGxvdDIpLw0Kc291cmNlKCIuL2Z1bmN0aW9ucy9SX3JhaW5jbG91ZHMuUiIpICAgICAgIyBGdW5jdGlvbiB0byBjcmVhdGUgcmFpbmNsb3VkIHBsb3RzIA0KDQoNCiMgRGVmaW5lIGZ1bmN0aW9uIHRvIGNyZWF0ZSBjb21tb24gbGVnZW5kIChmcm9tIGh0dHA6Ly93d3cuc3RoZGEuY29tL2VuZ2xpc2gvd2lraS93aWtpLnBocD9pZF9jb250ZW50cz03OTMwI2FkZC1hLWNvbW1vbi1sZWdlbmQtZm9yLW11bHRpcGxlLWdncGxvdDItZ3JhcGhzKQ0KZ2V0X2xlZ2VuZCA8LSBmdW5jdGlvbihteWdncGxvdCkgew0KICB0bXAgICAgICA8LSBnZ3Bsb3RfZ3RhYmxlKGdncGxvdF9idWlsZChteWdncGxvdCkpDQogIGxlZyAgICAgIDwtIHdoaWNoKHNhcHBseSh0bXAkZ3JvYnMsIGZ1bmN0aW9uKHgpIHgkbmFtZSkgPT0gImd1aWRlLWJveCIpDQogIGxlZ2VuZCAgIDwtIHRtcCRncm9ic1tbbGVnXV0NCiAgcmV0dXJuKGxlZ2VuZCkNCn0NCg0KDQojIFNldCBmaWd1cmUgdGhlbWUNCm15X2ZpZ3VyZV90aGVtZSA8LSB0aGVtZV9jbGFzc2ljKGJhc2Vfc2l6ZSA9IDExKSArIA0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIiwNCiAgICAgICAgc3RyaXAuYmFja2dyb3VuZCA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpDQoNCg0KIyBTZXQgZmlndXJlIGNvbG9ycw0KY29sb3JzX0VSTiA8LSBjKCJyb3lhbGJsdWUxIiwgIm5hdnkiKQ0KY29sb3JzX0NSTiA8LSBjKCJ0YW4xIiwgInNpZW5uYTMiKQ0KY29sb3JzX1BlICA8LSBjKCJkYXJrb2xpdmVncmVlbjMiLCAic2VhZ3JlZW4iKQ0KYGBgDQoNCjwhLS0gTG9hZCBhbmQgY2xlYW4gZGF0YSAtLT4NCg0KYGBge3IgbG9hZC1hbmQtY2xlYW4tZGF0YX0NCg0KIyBMb2FkIGRhdGENCnJlc3BfbG9ja2VkX2RhdGEgPC0gcmVhZC5jc3YoZmlsZSA9ICIuL2RhdGEvcmVzcG9uc2VfbG9ja2VkX2RhdGFfZm9yX3Bsb3RzLmNzdiIsIGhlYWRlciA9IFRSVUUpDQoNCg0KIyBDcmVhdGUgcmVsZXZhbnQgdmFyaWFibGVzDQpyZXNwX2xvY2tlZF9kYXRhIDwtIHJlc3BfbG9ja2VkX2RhdGEgJT4lDQogIGRwbHlyOjptdXRhdGUoDQogICAgc3RpbXVsYXRpb24gPSBmYWN0b3IoaWZlbHNlKA0KICAgICAgcGFydGljaXBhbnRfaWQgPT0gIkNfMDFfVDEiIHwgcGFydGljaXBhbnRfaWQgPT0gIkNfMDJfVDEiIHwgcGFydGljaXBhbnRfaWQgPT0gIkNfMDNfVDIiIHwNCiAgICAgIHBhcnRpY2lwYW50X2lkID09ICJDXzA0X1QyIiB8IHBhcnRpY2lwYW50X2lkID09ICJDXzA1X1QxIiB8IHBhcnRpY2lwYW50X2lkID09ICJDXzA2X1QyIiB8DQogICAgICBwYXJ0aWNpcGFudF9pZCA9PSAiQ18wN19UMSIgfCBwYXJ0aWNpcGFudF9pZCA9PSAiQ18wOF9UMSIgfCBwYXJ0aWNpcGFudF9pZCA9PSAiQ18wOV9UMiIgfA0KICAgICAgcGFydGljaXBhbnRfaWQgPT0gIkNfMTBfVDIiIHwgcGFydGljaXBhbnRfaWQgPT0gIkNfMTFfVDIiIHwgcGFydGljaXBhbnRfaWQgPT0gIkNfMTJfVDIiIHwNCiAgICAgIHBhcnRpY2lwYW50X2lkID09ICJDXzEzX1QxIiB8IHBhcnRpY2lwYW50X2lkID09ICJDXzE1X1QyIiB8IHBhcnRpY2lwYW50X2lkID09ICJDXzE2X1QxIiB8DQogICAgICBwYXJ0aWNpcGFudF9pZCA9PSAiQ18xN19UMiIgfCBwYXJ0aWNpcGFudF9pZCA9PSAiQ18xOF9UMiIgfCBwYXJ0aWNpcGFudF9pZCA9PSAiQ18xOV9UMSIgfA0KICAgICAgcGFydGljaXBhbnRfaWQgPT0gIkNfMjBfVDEiIHwgcGFydGljaXBhbnRfaWQgPT0gIkNfMjFfVDIiIHwgcGFydGljaXBhbnRfaWQgPT0gIkNfMjJfVDIiIHwNCiAgICAgIHBhcnRpY2lwYW50X2lkID09ICJDXzIzX1QxIiB8IHBhcnRpY2lwYW50X2lkID09ICJDXzI0X1QxIiB8IHBhcnRpY2lwYW50X2lkID09ICJDXzI1X1QxIiB8DQogICAgICBwYXJ0aWNpcGFudF9pZCA9PSAiQ18yNl9UMSIgfCBwYXJ0aWNpcGFudF9pZCA9PSAiQ18yN19UMiIgfCBwYXJ0aWNpcGFudF9pZCA9PSAiQ18yOF9UMiIgfA0KICAgICAgcGFydGljaXBhbnRfaWQgPT0gIkNfMjlfVDEiIHwgcGFydGljaXBhbnRfaWQgPT0gIkNfMzBfVDIiIHwgcGFydGljaXBhbnRfaWQgPT0gIlBfMDFfVDEiIHwNCiAgICAgIHBhcnRpY2lwYW50X2lkID09ICJQXzAyX1QyIiB8IHBhcnRpY2lwYW50X2lkID09ICJQXzAzX1QyIiB8IHBhcnRpY2lwYW50X2lkID09ICJQXzA0X1QxIiB8DQogICAgICBwYXJ0aWNpcGFudF9pZCA9PSAiUF8wNV9UMSIgfCBwYXJ0aWNpcGFudF9pZCA9PSAiUF8wNl9UMSIgfCBwYXJ0aWNpcGFudF9pZCA9PSAiUF8wN19UMiIgfA0KICAgICAgcGFydGljaXBhbnRfaWQgPT0gIlBfMDhfVDIiIHwgcGFydGljaXBhbnRfaWQgPT0gIlBfMDlfVDIiIHwgcGFydGljaXBhbnRfaWQgPT0gIlBfMTBfVDEiIHwNCiAgICAgIHBhcnRpY2lwYW50X2lkID09ICJQXzExX1QyIiB8IHBhcnRpY2lwYW50X2lkID09ICJQXzEyX1QyIiB8IHBhcnRpY2lwYW50X2lkID09ICJQXzEzX1QxIiB8DQogICAgICBwYXJ0aWNpcGFudF9pZCA9PSAiUF8xNV9UMSIgfCBwYXJ0aWNpcGFudF9pZCA9PSAiUF8xNl9UMSIgfCBwYXJ0aWNpcGFudF9pZCA9PSAiUF8xN19UMiIgfA0KICAgICAgcGFydGljaXBhbnRfaWQgPT0gIlBfMThfVDEiIHwgcGFydGljaXBhbnRfaWQgPT0gIlBfMTlfVDEiIHwgcGFydGljaXBhbnRfaWQgPT0gIlBfMjBfVDIiIHwNCiAgICAgIHBhcnRpY2lwYW50X2lkID09ICJQXzIxX1QyIiB8IHBhcnRpY2lwYW50X2lkID09ICJQXzIyX1QxIiB8IHBhcnRpY2lwYW50X2lkID09ICJQXzIzX1QxIiB8DQogICAgICBwYXJ0aWNpcGFudF9pZCA9PSAiUF8yNF9UMiIgfCBwYXJ0aWNpcGFudF9pZCA9PSAiUF8yNV9UMSIgfCBwYXJ0aWNpcGFudF9pZCA9PSAiUF8yNl9UMiIgfA0KICAgICAgcGFydGljaXBhbnRfaWQgPT0gIlBfMjdfVDEiIHwgcGFydGljaXBhbnRfaWQgPT0gIlBfMjhfVDIiIHwgcGFydGljaXBhbnRfaWQgPT0gIlBfMjlfVDIiIHwNCiAgICAgIHBhcnRpY2lwYW50X2lkID09ICJQXzMwX1QxIiwgInNoYW0iLCAidmVydW0iKSksDQogICAgY29uZGl0aW9uID0gZmFjdG9yKGlmZWxzZShjb25kaXRpb24gPT0gMSwgImNvcnJlY3QiLCAiaW5jb3JyZWN0IiksIA0KICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCJpbmNvcnJlY3QiLCAiY29ycmVjdCIpKSwNCiAgICBncm91cCAgICAgICAgICA9IGZhY3RvcihpZmVsc2Uoc3Vic3RyKHBhcnRpY2lwYW50X2lkLCAxLCAxKSA9PSAiQyIsICJIQyIsICJPQ0QiKSksDQogICAgc2Vzc2lvbiAgICAgICAgPSBmYWN0b3IoaWZlbHNlKHN1YnN0cihwYXJ0aWNpcGFudF9pZCwgNiwgNykgPT0gIlQxIiwgIlQxIiwgIlQyIikpLA0KICAgIHBhcnRpY2lwYW50X2lkID0gZmFjdG9yKHN1YnN0cihwYXJ0aWNpcGFudF9pZCwgMSwgNCkpLCAjIHRvIGdldCBjb3JyZWN0IG5vLiBvZiBmYWN0b3IgbGV2ZWxzDQogICAgY29uZGl0aW9uICAgICAgPSBmYWN0b3IoY29uZGl0aW9uLCBsZXZlbHMgPSBjKCJpbmNvcnJlY3QiLCAiY29ycmVjdCIpKSwNCiAgKQ0KDQoNCiMgRXhjbHVkZSBQXzAyIGFuZCBDXzAyDQpyZXNwX2xvY2tlZF9kYXRhIDwtIHJlc3BfbG9ja2VkX2RhdGFbcmVzcF9sb2NrZWRfZGF0YSRwYXJ0aWNpcGFudF9pZCAhPSAiUF8wMiIgJg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BfbG9ja2VkX2RhdGEkcGFydGljaXBhbnRfaWQgIT0gIkNfMDIiLCBdDQpyZXNwX2xvY2tlZF9kYXRhJHBhcnRpY2lwYW50X2lkIDwtIGRyb3BsZXZlbHMocmVzcF9sb2NrZWRfZGF0YSRwYXJ0aWNpcGFudF9pZCkNCg0KDQojIENhbGN1bGF0ZSBydW5uaW5nIHdpdGhpbi1wYXJ0aWNpcGFudCBDSXMgZm9yIEVSTi9DUk4NCnJ1bm5pbmdfQ0lzX01GTiA8LSByZXNwX2xvY2tlZF9kYXRhICU+JQ0KICBzcGxpdCguJHRpbWUpICU+JQ0KICBtYXAofiBzdW1tYXJ5U0V3aXRoaW5PKGRhdGEgICAgICAgID0gLiwNCiAgICAgICAgICAgICAgICAgICAgICAgICBtZWFzdXJldmFyICA9ICJGQ3oiLA0KICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGhpbnZhcnMgID0gYygiY29uZGl0aW9uIiwgInN0aW11bGF0aW9uIiksDQogICAgICAgICAgICAgICAgICAgICAgICAgYmV0d2VlbnZhcnMgPSAiZ3JvdXAiLA0KICAgICAgICAgICAgICAgICAgICAgICAgIGlkdmFyICAgICAgID0gInBhcnRpY2lwYW50X2lkIikpDQoNCkNJc19NRk4gPC0gcHVycnI6Om1hcF9kZihydW5uaW5nX0NJc19NRk4sIG1hZ3JpdHRyOjpleHRyYWN0KSAlPiUNCiAgZHBseXI6Om11dGF0ZSgNCiAgICB0aW1lID0gcmVwKHVuaXF1ZShyZXNwX2xvY2tlZF9kYXRhJHRpbWUpLCBlYWNoID0gOCkNCiAgKSAjIE5vdGUuIDggcmVmZXJzIHRvICBuby4gb2YgY29uZGl0aW9ucyAoZ3JvdXAgeCBzdGltdWxhdGlvbiB4IHJlc3BfdHlwZSA9IDIgeCAyIHggMiA9IDgpDQoNCg0KIyBDYWxjdWxhdGUgcnVubmluZyB3aXRoaW4tcGFydGljaXBhbnQgQ0lzIGZvciBQZQ0KcnVubmluZ19DSXNfUGUgPC0gcmVzcF9sb2NrZWRfZGF0YSAlPiUNCiAgc3BsaXQoLiR0aW1lKSAlPiUNCiAgbWFwKH4gc3VtbWFyeVNFd2l0aGluTyhkYXRhICAgICAgICA9IC4sDQogICAgICAgICAgICAgICAgICAgICAgICAgbWVhc3VyZXZhciAgPSAiUHoiLA0KICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGhpbnZhcnMgID0gYygiY29uZGl0aW9uIiwgInN0aW11bGF0aW9uIiksDQogICAgICAgICAgICAgICAgICAgICAgICAgYmV0d2VlbnZhcnMgPSAiZ3JvdXAiLA0KICAgICAgICAgICAgICAgICAgICAgICAgIGlkdmFyICAgICAgID0gInBhcnRpY2lwYW50X2lkIikpDQoNCkNJc19QZSA8LSBwdXJycjo6bWFwX2RmKHJ1bm5pbmdfQ0lzX1BlLCBtYWdyaXR0cjo6ZXh0cmFjdCkgJT4lDQogIGRwbHlyOjptdXRhdGUoDQogICAgdGltZSA9IHJlcCh1bmlxdWUocmVzcF9sb2NrZWRfZGF0YSR0aW1lKSwgZWFjaCA9IDgpDQogICkNCg0KDQojIENvbnZlcnQgdG8gbG9uZyBmb3JtYXQgZm9yIGVsZWN0cm9kZXMgZm9yIEVSTi9DUk4NCmRhdGFfdG9wb19NRk4gPC0gcmVzcF9sb2NrZWRfZGF0YSAlPiUNCiAgIyBSZW1vdmUgY2hhbm5lbHMgb2Ygbm8gaW50ZXJlc3QNCiAgZHBseXI6OnNlbGVjdCgtSU8xLCAtTTEsIC1GOSwgLUYxMCkgJT4lDQogICMgQ2hhbmdlIGZyb20gd2lkZSB0byBsb25nIGZvcm1hdCBmb3IgZWxlY3Ryb2Rlcw0KICB0aWR5cjo6Z2F0aGVyKC4sIGVsZWN0cm9kZSwgYW1wbGl0dWRlLCBGcDE6TzIsIGZhY3Rvcl9rZXkgPSBUUlVFKSAgJT4lDQogICMgU2VsZWN0IHRpbWUgd2luZG93cw0KICBkcGx5cjo6ZmlsdGVyKHRpbWUgPj0gMCAmIHRpbWUgPD0gMTAwKSAlPiUNCiAgIyBBZGQgZWxlY3Ryb2RlIGluZm9ybWF0aW9uDQogIGVsZWN0cm9kZV9sb2NhdGlvbnMoLiwgZWxlY3Ryb2RlID0gImVsZWN0cm9kZSIsIGRyb3AgPSBGQUxTRSwgbW9udGFnZSA9IE5VTEwpDQoNCg0KIyBDb252ZXJ0IHRvIGxvbmcgZm9ybWF0IGZvciBlbGVjdHJvZGVzIGZvciBQZQ0KZGF0YV90b3BvX1BlIDwtIHJlc3BfbG9ja2VkX2RhdGEgJT4lDQogICMgUmVtb3ZlIGNoYW5uZWxzIG9mIG5vIGludGVyZXN0DQogIGRwbHlyOjpzZWxlY3QoLUlPMSwgLU0xLCAtRjksIC1GMTApICU+JQ0KICAjIENoYW5nZSBmcm9tIHdpZGUgdG8gbG9uZyBmb3JtYXQgZm9yIGVsZWN0cm9kZXMNCiAgdGlkeXI6OmdhdGhlciguLCBlbGVjdHJvZGUsIGFtcGxpdHVkZSwgRnAxOk8yLCBmYWN0b3Jfa2V5ID0gVFJVRSkgICU+JQ0KICAjIFNlbGVjdCB0aW1lIHdpbmRvd3MNCiAgZHBseXI6OmZpbHRlcih0aW1lID49IDIwMCAmIHRpbWUgPD0gNDAwKSAlPiUNCiAgIyBBZGQgZWxlY3Ryb2RlIGluZm9ybWF0aW9uDQogIGVsZWN0cm9kZV9sb2NhdGlvbnMoLiwgZWxlY3Ryb2RlID0gImVsZWN0cm9kZSIsIGRyb3AgPSBGQUxTRSwgbW9udGFnZSA9IE5VTEwpDQpgYGANCg0KPCEtLSBDcmVhdGUgcGxvdHMgLS0+DQoNCmBgYHtyIGNyZWF0ZS1wbG90c30NCg0KIyMjIyBDcmVhdGUgcGxvdHMgb2YgcHJlZGljdGVkIG1lYW5zICMjIyMNCg0KIyBMb2FkIExNTSBvdXRwdXQNCkxNTV9FUk4gPC0gcmVhZFJEUyhmaWxlID0gIi4vc2F2ZWRfb2JqZWN0c19mb3JfcGxvdHMvTE1NX0VSTi5yZHMiKQ0KTE1NX0NSTiA8LSByZWFkUkRTKGZpbGUgPSAiLi9zYXZlZF9vYmplY3RzX2Zvcl9wbG90cy9MTU1fQ1JOLnJkcyIpDQpMTU1fUGUgIDwtIHJlYWRSRFMoZmlsZSA9ICIuL3NhdmVkX29iamVjdHNfZm9yX3Bsb3RzL0xNTV9QZS5yZHMiKQ0KDQoNCiMgRVJODQpwbG90X0xNTV9FUk4gPC0gcGxvdF9tb2RlbChMTU1fRVJOLCB0eXBlID0gInByZWQiLCB0ZXJtcyAgPSBjKCJncm91cCIsICJzdGltdWxhdGlvbiIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgY2kubHZsID0gLjk1LCB0aXRsZSA9ICIiLCBkb2RnZSA9IDAuNCwgbGluZS5zaXplID0gLjUpICsNCiAgbGFicyh4ICA9ICIiLCB5ID0gIlByZWRpY3RlZCBFUk4gQW1wbGl0dWRlICjCtVYpIikgKw0KICBteV9maWd1cmVfdGhlbWUgKw0KICBhZXMoY29sb3IgPSBncm91cCkgKw0KICBzY2FsZV9jb2xvcl9tYW51YWwobmFtZSA9ICJ0RENTIiwgbGFiZWxzID0gYygic2hhbSIsICJjYXRob2RhbCIpLCB2YWx1ZXMgPSBjb2xvcnNfRVJOKSArDQogIGNvb3JkX2NhcnRlc2lhbih5bGltID0gYygtOSwgMyksIHhsaW0gPSBjKDAuNSwgMi41KSkgKw0KICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKC05LCAzLCAyKSwgZXhwYW5kID0gYygwLCAwKSkgKw0KICBzY2FsZV94X2NvbnRpbnVvdXMobGFiZWxzID0gYygiSEMiLCAiT0NEIiksIGJyZWFrcyA9IGMoMSwgMiksIGV4cGFuZCA9IGMoMCwgMCkpICsNCiAgdGhlbWUoYXhpcy50aWNrcy54ID0gZWxlbWVudF9ibGFuaygpLCBsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpDQoNCg0KIyBDUk4NCnBsb3RfTE1NX0NSTiA8LSBwbG90X21vZGVsKExNTV9DUk4sIHR5cGUgPSAicHJlZCIsIHRlcm1zICA9IGMoImdyb3VwIiwgInN0aW11bGF0aW9uIiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBjaS5sdmwgPSAuOTUsIHRpdGxlID0gIiIsIGRvZGdlID0gMC40LCBsaW5lLnNpemUgPSAuNSkgKw0KICBsYWJzKHggID0gIiIsIHkgPSAiUHJlZGljdGVkIENSTiBBbXBsaXR1ZGUgKMK1VikiKSArDQogIG15X2ZpZ3VyZV90aGVtZSArDQogIGFlcyhjb2xvciA9IGdyb3VwKSArDQogIHNjYWxlX2NvbG9yX21hbnVhbChuYW1lID0gInREQ1MiLCBsYWJlbHMgPSBjKCJzaGFtIiwgImNhdGhvZGFsIiksIHZhbHVlcyA9IGNvbG9yc19DUk4pICsNCiAgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKDEsIDkpLCB4bGltID0gYygwLjUsIDIuNSkpICsNCiAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgxLCA5LCAyKSwgZXhwYW5kID0gYygwLCAwKSkgICsNCiAgc2NhbGVfeF9jb250aW51b3VzKGxhYmVscyA9IGMoIkhDIiwgIk9DRCIpLCBicmVha3MgPSBjKDEsIDIpLCBleHBhbmQgPSBjKDAsIDApKSArDQogIHRoZW1lKGF4aXMudGlja3MueCA9IGVsZW1lbnRfYmxhbmsoKSwgbGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKQ0KDQoNCiMgUGUNCnBsb3RfTE1NX1BlIDwtIHBsb3RfbW9kZWwoTE1NX1BlLHR5cGUgPSAicHJlZCIsIHRlcm1zICA9IGMoImdyb3VwIiwgInN0aW11bGF0aW9uIiksDQogICAgICAgICAgICAgICAgICAgICAgICAgIGNpLmx2bCA9IC45NSwgdGl0bGUgPSAiIiwgZG9kZ2UgPSAwLjQsIGxpbmUuc2l6ZSA9IC41KSArDQogIGxhYnMoeCAgPSAiIiwgeSA9ICJQcmVkaWN0ZWQgUGUgQW1wbGl0dWRlICjCtVYpIikgKw0KICBteV9maWd1cmVfdGhlbWUgKw0KICBhZXMoY29sb3IgPSBncm91cCkgKw0KICBzY2FsZV9jb2xvcl9tYW51YWwobmFtZSA9ICJ0RENTIiwgbGFiZWxzID0gYygic2hhbSIsICJjYXRob2RhbCIpLCB2YWx1ZXMgPSBjb2xvcnNfUGUpICsNCiAgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKDUuOCwgMTQpLCB4bGltID0gYygwLjUsIDIuNSkpICsNCiAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IHNlcSg2LCAxNCwgMiksIGV4cGFuZCA9IGMoMCwgMCkpICsNCiAgc2NhbGVfeF9jb250aW51b3VzKGxhYmVscyA9IGMoIkhDIiwgIk9DRCIpLCBicmVha3MgPSBjKDEsIDIpLCBleHBhbmQgPSBjKDAsIDApKSArDQogIHRoZW1lKGF4aXMudGlja3MueCA9IGVsZW1lbnRfYmxhbmsoKSwgbGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKQ0KDQoNCiMjIyMgQ3JlYXRlIGJveHBsb3RzIHdpdGggcHJvYmFiaWxpdHkgZGVuc2l0eSBwbG90cyAjIyMjDQoNCiMgTG9hZCBkYXRhDQpsb2FkKGZpbGUgPSAiLi9kYXRhL1NpbmdsZV9UcmlhbF9EYXRhLnJkYSIpDQoNCg0KIyBFeGNsdWRlIG1pc3NpbmcgcmVzcG9uc2VzLCBSVCBvdXRsaWVycywgYW5kIHRyaWFscyB3aXRoIEVSUCBhcnRpZmFjdHMNCnNpbmdsZV90cmlhbF9kYXRhX2NsZWFuIDwtIHNpbmdsZV90cmlhbF9kYXRhICU+JQ0KICBkcGx5cjo6ZmlsdGVyKA0KICAgICAgcmVzcG9uc2VfdHlwZSAhPSAibWlzcyIgJg0KICAgICAgcnRfaW52YWxpZCAgICA9PSBGQUxTRSAmDQogICAgICAhaXMubmEoTUZOXzBfMTAwX0ZDeikNCiAgKSAjICg1MzA5MyBvZiA1Mzc2MCB0cmlhbHMgbGVmdCkNCg0KDQojIEFnZ3JlZ2F0ZSBkYXRhDQpkYXRhX2FnZ3JlZ2F0ZWQgPC0gc2luZ2xlX3RyaWFsX2RhdGFfY2xlYW4gJT4lDQogIGRwbHlyOjpncm91cF9ieShwYXJ0aWNpcGFudF9pZCwgZ3JvdXAsIHJlc3BvbnNlX3R5cGUsIHN0aW11bGF0aW9uLCBzZXNzaW9uKSAlPiUNCiAgZHBseXI6OnN1bW1hcml6ZSgNCiAgICBNRk4gPSBtZWFuKE1GTl8wXzEwMF9GQ3osIG5hLnJtID0gVFJVRSksDQogICAgUGUgID0gbWVhbihQZV8yMDBfNDAwX1B6LCBuYS5ybSA9IFRSVUUpDQogICApICAlPiUNCiAgZHBseXI6OnVuZ3JvdXAoKQ0KDQoNCiMgRVJODQpwbG90X2JveF9kZW5zaXR5X0VSTiA8LSBnZ3Bsb3QoKSArDQogIGdlb21fZmxhdF92aW9saW4oZGF0YSA9IGRhdGFfYWdncmVnYXRlZFtkYXRhX2FnZ3JlZ2F0ZWQkcmVzcG9uc2VfdHlwZSA9PSAiaW5jb3JyZWN0IiwgXSwNCiAgICAgICAgICAgICAgICAgICBhZXMoeCA9IGdyb3VwLCB5ID0gTUZOLCBmaWxsID0gc3RpbXVsYXRpb24pLCANCiAgICAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX251ZGdlKHggPSAuMiwgeSA9IDApLA0KICAgICAgICAgICAgICAgICAgIGFkanVzdCA9IDEuNSwgdHJpbSA9IEZBTFNFLCBhbHBoYSA9IC41LCBjb2xvdXIgPSBOQSkgKw0KICBnZW9tX2JveHBsb3QoZGF0YSA9IGRhdGFfYWdncmVnYXRlZFtkYXRhX2FnZ3JlZ2F0ZWQkcmVzcG9uc2VfdHlwZSA9PSAiaW5jb3JyZWN0IiwgXSwNCiAgICAgICAgICAgICAgIGFlcyh4ID0gZ3JvdXAsIHkgPSBNRk4sIGZpbGwgPSBzdGltdWxhdGlvbiksIA0KICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuMyksDQogICAgICAgICAgICAgICBvdXRsaWVyLnNoYXBlID0gTkEsIHdpZHRoID0gLjIsIGFscGhhID0gLjgsIGNvbG91ciA9ICJibGFjayIpICsNCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gY29sb3JzX0VSTiwgbmFtZSA9ICJ0RENTOiIpICsNCiAgbGFicyh4ID0gIiIsIHkgPSAiRVJOIEFtcGxpdHVkZSAowrVWKSIpICsNCiAgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKC0zNSwgMjUpLCB4bGltID0gYygxLjE1LCAyLjI1KSkgKw0KICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKC0zNSwgMjUsIDEwKSwgZXhwYW5kID0gYygwLCAwKSkgKw0KICBteV9maWd1cmVfdGhlbWUgICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLCBheGlzLnRpY2tzLnggPSBlbGVtZW50X2JsYW5rKCkpDQoNCg0KIyBDUk4NCnBsb3RfYm94X2RlbnNpdHlfQ1JOIDwtIGdncGxvdCgpICsNCiAgZ2VvbV9mbGF0X3Zpb2xpbihkYXRhID0gZGF0YV9hZ2dyZWdhdGVkW2RhdGFfYWdncmVnYXRlZCRyZXNwb25zZV90eXBlID09ICJjb3JyZWN0IiwgXSwNCiAgICAgICAgICAgICAgICAgICBhZXMoeCA9IGdyb3VwLCB5ID0gTUZOLCBmaWxsID0gc3RpbXVsYXRpb24pLCANCiAgICAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX251ZGdlKHggPSAuMiwgeSA9IDApLA0KICAgICAgICAgICAgICAgICAgIGFkanVzdCA9IDEuNSwgdHJpbSA9IEZBTFNFLCBhbHBoYSA9IC41LCBjb2xvdXIgPSBOQSkgKw0KICBnZW9tX2JveHBsb3QoZGF0YSA9IGRhdGFfYWdncmVnYXRlZFtkYXRhX2FnZ3JlZ2F0ZWQkcmVzcG9uc2VfdHlwZSA9PSAiY29ycmVjdCIsIF0sDQogICAgICAgICAgICAgICBhZXMoeCA9IGdyb3VwLCB5ID0gTUZOLCBmaWxsID0gc3RpbXVsYXRpb24pLCANCiAgICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjMpLA0KICAgICAgICAgICAgICAgb3V0bGllci5zaGFwZSA9IE5BLCB3aWR0aCA9IC4yLCBjb2xvdXIgPSAiYmxhY2siKSArDQogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGNvbG9yc19DUk4sIG5hbWUgPSAidERDUzoiKSArDQogIGxhYnMoeCA9ICIiLCB5ID0gIkNSTiBBbXBsaXR1ZGUgKMK1VikiKSArDQogIGNvb3JkX2NhcnRlc2lhbih5bGltID0gYygtMTUsIDI1KSwgeGxpbSA9IGMoMS4xNSwgMi4yNSkpICsNCiAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgtMTUsIDI1LCAxMCksIGV4cGFuZCA9IGMoMCwgMCkpICsNCiAgbXlfZmlndXJlX3RoZW1lICArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwgYXhpcy50aWNrcy54ID0gZWxlbWVudF9ibGFuaygpLCANCiAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHZqdXN0ID0gLTEpKQ0KDQoNCiMgUGUNCnBsb3RfYm94X2RlbnNpdHlfUGUgPC0gZ2dwbG90KCkgKw0KICBnZW9tX2ZsYXRfdmlvbGluKGRhdGEgPSBkYXRhX2FnZ3JlZ2F0ZWRbZGF0YV9hZ2dyZWdhdGVkJHJlc3BvbnNlX3R5cGUgPT0gImluY29ycmVjdCIsIF0sDQogICAgICAgICAgICAgICAgICAgYWVzKHggPSBncm91cCwgeSA9IFBlLCBmaWxsID0gc3RpbXVsYXRpb24pLCANCiAgICAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX251ZGdlKHggPSAuMiwgeSA9IDApLA0KICAgICAgICAgICAgICAgICAgIGFkanVzdCA9IDEuNSwgdHJpbSA9IEZBTFNFLCBhbHBoYSA9IC41LCBjb2xvdXIgPSBOQSkgKw0KICBnZW9tX2JveHBsb3QoZGF0YSA9IGRhdGFfYWdncmVnYXRlZFtkYXRhX2FnZ3JlZ2F0ZWQkcmVzcG9uc2VfdHlwZSA9PSAiaW5jb3JyZWN0IiwgXSwNCiAgICAgICAgICAgICAgIGFlcyh4ID0gZ3JvdXAsIHkgPSBQZSwgZmlsbCA9IHN0aW11bGF0aW9uKSwgDQogICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC4zKSwNCiAgICAgICAgICAgICAgIG91dGxpZXIuc2hhcGUgPSBOQSwgd2lkdGggPSAuMiwgY29sb3VyID0gImJsYWNrIikgKw0KICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjb2xvcnNfUGUsIG5hbWUgPSAidERDUzoiKSArDQogIGxhYnMoeCA9ICIiLCB5ID0gIlBlIEFtcGxpdHVkZSAowrVWKSIpICsNCiAgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKC0xMCwgMzApLCB4bGltID0gYygxLjE1LCAyLjI1KSkgKw0KICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKC0xMCwgMzAsIDEwKSwgZXhwYW5kID0gYygwLCAwKSkgKw0KICBteV9maWd1cmVfdGhlbWUgICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLCBheGlzLnRpY2tzLnggPSBlbGVtZW50X2JsYW5rKCksIA0KICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQodmp1c3QgPSAtLjUpKQ0KDQoNCiMjIyMgQ3JlYXRlIHdhdmVmb3JtIHBsb3RzICMjIyMNCg0KIyBEZWZpbmUgZmFjZXQgbGFiZWxzDQpncm91cC5sYWJzIDwtIGMoIkhlYWx0aHkgQ29udHJvbCBQYXJ0aWNpcGFudHMgIiwgIlBhdGllbnRzIFdpdGggT0NEIikNCm5hbWVzKGdyb3VwLmxhYnMpIDwtIGMoIkhDIiwgIk9DRCIpDQoNCg0KIyBEZWZpbmUgZWxlY3Ryb2RlIGxhYmVscw0KbGFiZWxfRkN6IDwtIGRhdGEuZnJhbWUodGltZSA9IC0zMjAsIEZDeiA9IDExLjUsIGxhYiA9ICJUZXh0IiwgZ3JvdXAgPSBmYWN0b3IoIkhDIiwgbGV2ZWxzID0gYygiSEMiLCAiT0NEIikpKQ0KbGFiZWxfUHogIDwtIGRhdGEuZnJhbWUodGltZSA9IC0zMjAsIFB6ICA9IDExLjYsIGxhYiA9ICJUZXh0IiwgZ3JvdXAgPSBmYWN0b3IoIkhDIiwgbGV2ZWxzID0gYygiSEMiLCAiT0NEIikpKQ0KDQoNCiMgRVJOL0NSTg0KcGxvdF93YXZlZm9ybV9NRk4gPC0gZ2dwbG90KHJlc3BfbG9ja2VkX2RhdGEsIGFlcyh0aW1lLCBGQ3opKSArDQogIHN0YXRfc3VtbWFyeShmdW4gPSBtZWFuLCBnZW9tID0gImxpbmUiLCBzaXplID0gMC41LCBsaW5ldHlwZSA9ICJzb2xpZCIsIGFlcyhjb2xvdXIgPSBjb25kaXRpb246c3RpbXVsYXRpb24pKSArDQogIGdlb21fcmliYm9uKGRhdGEgPSBDSXNfTUZOLCBhZXMoeW1pbiA9IEZDeiAtIGNpLCB5bWF4ID0gRkN6ICsgY2ksIGZpbGwgPSBjb25kaXRpb246c3RpbXVsYXRpb24pLCBhbHBoYSA9IDAuMikgKw0KICBndWlkZXMoZmlsbCA9ICJub25lIikgKw0KICBnZW9tX3NlZ21lbnQoYWVzKHggPSAwLCB4ZW5kID0gMCwgeSA9IC0xMCwgeWVuZCA9IDEyKSwgbGluZXR5cGUgPSAiZG90dGVkIiwgY29sb3VyID0gImdyZXk1MCIpICsgIyBBZGQgdmxpbmUNCiAgZ2VvbV9zZWdtZW50KGFlcyh4ID0gLTQwMCwgeGVuZCA9IDgwMCwgeSA9IDAsIHllbmQgPSAwKSwgbGluZXR5cGUgPSAiZG90dGVkIiwgY29sb3VyID0gImdyZXk1MCIpICsgIyBBZGQgaGxpbmUNCiAgZ2VvbV90ZXh0KGRhdGEgPSBsYWJlbF9GQ3osIGxhYmVsID0gIkZDeiIpICsgIyANCiAgYW5ub3RhdGUoInJlY3QiLCB4bWluID0gMCwgeG1heCA9IDEwMCwgeW1pbiA9IC0xMCwgeW1heCA9IDEyLCBhbHBoYSA9IC4yLCBmaWxsID0gImdyZXk1MCIpICsgIyBBZGQgc2hhZGVkIHRpbWUgYXJlYQ0KICBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoLTEwLCAxMiksIHhsaW0gPSBjKC00MDAsIDgwMCkpICsNCiAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgtMTAsIDEyLCAyKSwgZXhwYW5kID0gYygwLCAwKSkgKw0KICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKC00MDAsIDgwMCwgMjAwKSwgZXhwYW5kID0gYygwLCAwKSkgKw0KICBzY2FsZV9jb2xvdXJfbWFudWFsKHZhbHVlcyA9IGMoY29sb3JzX0VSTiwgY29sb3JzX0NSTiksIA0KICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIkVycm9yOiBTaGFtIiwgIkVycm9yOiBDYXRob2RhbCIsICJDb3JyZWN0OiBTaGFtIiwgIkNvcnJlY3Q6IENhdGhvZGFsIiksDQogICAgICAgICAgICAgICAgICAgICAgZ3VpZGUgPSBndWlkZV9sZWdlbmQob3ZlcnJpZGUuYWVzID0gbGlzdChzaXplID0gMS4zKSkpICsgIyBUaGlja25lc3MgbGVnZW5kIGxpbmVzDQogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoY29sb3JzX0VSTiwgY29sb3JzX0NSTikpICsNCiAgbGFicyh4ID0gIlRpbWUgKG1zKSIsIHkgPSBleHByZXNzaW9uKHBhc3RlKCJBbXBsaXR1ZGUgKCIsIG11LCAiVikiKSkpICsNCiAgZmFjZXRfcmVwX2dyaWQoY29scyA9IHZhcnMoZ3JvdXApLCBsYWJlbGxlciA9IGxhYmVsbGVyKGdyb3VwID0gZ3JvdXAubGFicyksIHJlcGVhdC50aWNrLmxhYmVscyA9IFRSVUUpICsNCiAgbXlfZmlndXJlX3RoZW1lICsNCiAgdGhlbWUoc3RyaXAudGV4dC54ID0gZWxlbWVudF90ZXh0KG1hcmdpbiA9IG1hcmdpbigwLCAwLCA0LCAwLCAiY20iKSwgc2l6ZSA9IDEyLCBmYWNlID0gImJvbGQiKSwNCiAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHZqdXN0ID0gLTEuNSksIHBhbmVsLnNwYWNpbmcgPSB1bml0KDAuNzUsICJjbSIpLA0KICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X2JsYW5rKCksIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMSkpDQoNCg0KIyBQZQ0KcGxvdF93YXZlZm9ybV9QZSA8LSBnZ3Bsb3QocmVzcF9sb2NrZWRfZGF0YVtyZXNwX2xvY2tlZF9kYXRhJGNvbmRpdGlvbiA9PSAiaW5jb3JyZWN0IiwgXSwgYWVzKHRpbWUsIFB6KSkgKw0KICBzdGF0X3N1bW1hcnkoZnVuID0gbWVhbiwgZ2VvbSA9ICJsaW5lIiwgc2l6ZSA9IDAuNSwgbGluZXR5cGUgPSAic29saWQiLCBhZXMoY29sb3VyID0gY29uZGl0aW9uOnN0aW11bGF0aW9uKSkgKw0KICBnZW9tX3JpYmJvbihkYXRhID0gQ0lzX1BlW0NJc19QZSRjb25kaXRpb24gPT0gImluY29ycmVjdCIsIF0sIA0KICAgICAgICAgICAgICBhZXMoeW1pbiA9IFB6IC0gY2ksIHltYXggPSBQeiArIGNpLCBmaWxsID0gY29uZGl0aW9uOnN0aW11bGF0aW9uKSwgYWxwaGEgPSAwLjIpICsNCiAgZ3VpZGVzKGZpbGwgPSAibm9uZSIpICsNCiAgZ2VvbV9zZWdtZW50KGFlcyh4ID0gMCwgeGVuZCA9IDAsIHkgPSAtMiwgeWVuZCA9IDEyKSwgbGluZXR5cGUgPSAiZG90dGVkIiwgY29sb3VyID0gImdyZXk1MCIpICsNCiAgZ2VvbV9zZWdtZW50KGFlcyh4ID0gLTQwMCwgeGVuZCA9IDgwMCwgeSA9IDAsIHllbmQgPSAwKSwgbGluZXR5cGUgPSAiZG90dGVkIiwgY29sb3VyID0gImdyZXk1MCIpICsNCiAgZ2VvbV90ZXh0KGRhdGEgPSBsYWJlbF9QeiwgbGFiZWwgPSAiUHoiKSArDQogIGFubm90YXRlKCJyZWN0IiwgeG1pbiA9IDIwMCwgeG1heCA9IDQwMCwgeW1pbiA9IC0yLCB5bWF4ID0gMTIsIGFscGhhID0gLjIsIGZpbGwgPSAiZ3JleTUwIikgKw0KICBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoLTIsIDEyKSwgeGxpbSA9IGMoLTQwMCwgODAwKSkgKw0KICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKC0yLCAxMiwgMiksIGV4cGFuZCA9IGMoMCwgMCkpICsNCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgtNDAwLCA4MDAsIDIwMCksIGV4cGFuZCA9IGMoMCwgMCkpICsNCiAgc2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXMgPSBjb2xvcnNfUGUsIA0KICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIkVycm9yOiBTaGFtIiwgIkVycm9yOiBDYXRob2RhbCIpLA0KICAgICAgICAgICAgICAgICAgICAgIGd1aWRlID0gZ3VpZGVfbGVnZW5kKG92ZXJyaWRlLmFlcyA9IGxpc3Qoc2l6ZSA9IDEuMykpKSArDQogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGNvbG9yc19QZSkgKw0KICBsYWJzKHggPSAiVGltZSAobXMpIiwgeSA9IGV4cHJlc3Npb24ocGFzdGUoIkFtcGxpdHVkZSAoIiwgbXUsICJWKSIpKSkgKw0KICBmYWNldF9yZXBfZ3JpZChjb2xzID0gdmFycyhncm91cCksIGxhYmVsbGVyID0gbGFiZWxsZXIoZ3JvdXAgPSBncm91cC5sYWJzKSwgcmVwZWF0LnRpY2subGFiZWxzID0gVFJVRSkgKw0KICBteV9maWd1cmVfdGhlbWUgKw0KICB0aGVtZShzdHJpcC50ZXh0LnggPSBlbGVtZW50X3RleHQobWFyZ2luID0gbWFyZ2luKDAsIDAsIDMuNSwgMCwgImNtIiksIHNpemUgPSAxMSwgZmFjZSA9ICJib2xkIiksIA0KICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQodmp1c3QgPSAtMS41KSwgcGFuZWwuc3BhY2luZyA9IHVuaXQoMC43NSwgImNtIiksDQogICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfYmxhbmsoKSwgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDExKSkNCg0KDQojIEdldCBsZWdlbmQgYW5kIHJlbW92ZSBpbmRpdmlkdWFsIGxlZ2VuZHMgZnJvbSBwbG90IHRvIGNyZWF0ZSBjb21tb24gbGVnZW5kDQpsZWdlbmRfTUZOICAgICAgICA8LSBnZXRfbGVnZW5kKHBsb3Rfd2F2ZWZvcm1fTUZOKQ0KbGVnZW5kX1BlICAgICAgICAgPC0gZ2V0X2xlZ2VuZChwbG90X3dhdmVmb3JtX1BlKQ0KcGxvdF93YXZlZm9ybV9NRk4gPC0gcGxvdF93YXZlZm9ybV9NRk4gKyB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpDQpwbG90X3dhdmVmb3JtX1BlICA8LSBwbG90X3dhdmVmb3JtX1BlICArIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikNCg0KDQojIyMjIENyZWF0ZSB0b3BvZ3JhcGh5IHBsb3RzICMjIyMNCg0KIyBEZWZpbmUgZmFjZXQgbGFiZWxzDQpzdGltdWxhdGlvbi5sYWJzX2luY29yciA8LSBjKCJFcnJvcjogU2hhbSIsICJFcnJvcjogQ2F0aG9kYWwiKQ0KbmFtZXMoc3RpbXVsYXRpb24ubGFic19pbmNvcnIpIDwtIGMoInNoYW0iLCAidmVydW0iKQ0KDQpzdGltdWxhdGlvbi5sYWJzX2NvcnIgPC0gYygiQ29ycmVjdDogU2hhbSIsICJDb3JyZWN0OiBDYXRob2RhbCIpDQpuYW1lcyhzdGltdWxhdGlvbi5sYWJzX2NvcnIpIDwtIGMoInNoYW0iLCAidmVydW0iKQ0KDQoNCiMgRVJOIEhDDQpwbG90X3RvcG9fSENfRVJOIDwtIGdncGxvdChkYXRhX3RvcG9fTUZOW2RhdGFfdG9wb19NRk4kZ3JvdXAgPT0gIkhDIiAmIGRhdGFfdG9wb19NRk4kY29uZGl0aW9uID09ICJpbmNvcnJlY3QiLCBdLA0KICBhZXMoeCA9IHgsIHkgPSB5LCBmaWxsID0gYW1wbGl0dWRlLCBsYWJlbCA9IGVsZWN0cm9kZSkpICsNCiAgZ2VvbV90b3BvKGdyaWRfcmVzID0gMzAwLCBpbnRlcnBfbGltaXQgPSAiaGVhZCIsIGNoYW5fbWFya2VycyA9ICJwb2ludCIsIGNoYW5fc2l6ZSA9IDAuMSwgaGVhZF9zaXplID0gMC4yKSArDQogIHNjYWxlX2ZpbGxfZGlzdGlsbGVyKHBhbGV0dGUgPSAiUmRCdSIsIGxpbWl0cyA9IGMoLTUuMSwgNi41KSwgYnJlYWtzID0gYygtNSwgMCwgNSkpICsgIw0KICB0aGVtZV92b2lkKCkgKw0KICBjb29yZF9lcXVhbCgpICsNCiAgbGFicyhmaWxsID0gZXhwcmVzc2lvbihwYXN0ZShtdSwgIlYiKSkpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIsIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSA3LCBjb2xvciA9ICJncmV5MzAiKSwNCiAgICAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSA3LCBjb2xvciA9ICJncmV5MzAiKSwgbGVnZW5kLmtleS5oZWlnaHQgPSB1bml0KDAuMjUsICdjbScpLA0KICAgICAgICBsZWdlbmQua2V5LndpZHRoID0gdW5pdCgwLjI1LCAnY20nKSwgc3RyaXAudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSA3KSkgKw0KICBmYWNldF9ncmlkKGNvbHMgPSB2YXJzKHN0aW11bGF0aW9uKSwgbGFiZWxsZXIgPSBsYWJlbGxlcihzdGltdWxhdGlvbiA9IHN0aW11bGF0aW9uLmxhYnNfaW5jb3JyKSkNCg0KDQojIEVSTiBPQ0QNCnBsb3RfdG9wb19PQ0RfRVJOIDwtIGdncGxvdChkYXRhX3RvcG9fTUZOW2RhdGFfdG9wb19NRk4kZ3JvdXAgPT0gIk9DRCIgJiBkYXRhX3RvcG9fTUZOJGNvbmRpdGlvbiA9PSAiaW5jb3JyZWN0IiwgXSwNCiAgYWVzKHggPSB4LCB5ID0geSwgZmlsbCA9IGFtcGxpdHVkZSwgbGFiZWwgPSBlbGVjdHJvZGUpKSArDQogIGdlb21fdG9wbyhncmlkX3JlcyA9IDMwMCwgaW50ZXJwX2xpbWl0ID0gImhlYWQiLCBjaGFuX21hcmtlcnMgPSAicG9pbnQiLCBjaGFuX3NpemUgPSAwLjEsIGhlYWRfc2l6ZSA9IDAuMikgKw0KICBzY2FsZV9maWxsX2Rpc3RpbGxlcihwYWxldHRlID0gIlJkQnUiLCBsaW1pdHMgPSBjKC01LjEsIDYuNSksIGJyZWFrcyA9IGMoLTUsIDAsIDUpKSArICMNCiAgdGhlbWVfdm9pZCgpICsNCiAgY29vcmRfZXF1YWwoKSArDQogIGxhYnMoZmlsbCA9IGV4cHJlc3Npb24ocGFzdGUobXUsICJWIikpKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iLCBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gNywgY29sb3IgPSAiZ3JleTMwIiksDQogICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gNywgY29sb3IgPSAiZ3JleTMwIiksIGxlZ2VuZC5rZXkuaGVpZ2h0ID0gdW5pdCgwLjI1LCAnY20nKSwNCiAgICAgICAgbGVnZW5kLmtleS53aWR0aCA9IHVuaXQoMC4yNSwgJ2NtJyksIHN0cmlwLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gNykpICsNCiAgZmFjZXRfZ3JpZChjb2xzID0gdmFycyhzdGltdWxhdGlvbiksIGxhYmVsbGVyID0gbGFiZWxsZXIoc3RpbXVsYXRpb24gPSBzdGltdWxhdGlvbi5sYWJzX2luY29ycikpDQoNCg0KIyBDUk4gSEMNCnBsb3RfdG9wb19IQ19DUk4gPC0gZ2dwbG90KGRhdGFfdG9wb19NRk5bZGF0YV90b3BvX01GTiRncm91cCA9PSAiSEMiICYgZGF0YV90b3BvX01GTiRjb25kaXRpb24gPT0gImNvcnJlY3QiLCBdLA0KICBhZXMoeCA9IHgsIHkgPSB5LCBmaWxsID0gYW1wbGl0dWRlLCBsYWJlbCA9IGVsZWN0cm9kZSkpICsNCiAgZ2VvbV90b3BvKGdyaWRfcmVzID0gMzAwLCBpbnRlcnBfbGltaXQgPSAiaGVhZCIsIGNoYW5fbWFya2VycyA9ICJwb2ludCIsIGNoYW5fc2l6ZSA9IDAuMSwgaGVhZF9zaXplID0gMC4yKSArDQogIHNjYWxlX2ZpbGxfZGlzdGlsbGVyKHBhbGV0dGUgPSAiUmRCdSIsIGxpbWl0cyA9IGMoMC41LCAxMS43KSwgYnJlYWtzID0gYygyLCA2LCAxMCkpICsgIw0KICB0aGVtZV92b2lkKCkgKw0KICBjb29yZF9lcXVhbCgpICsNCiAgbGFicyhmaWxsID0gZXhwcmVzc2lvbihwYXN0ZShtdSwgIlYiKSkpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIsIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSA3LCBjb2xvciA9ICJncmV5MzAiKSwNCiAgICAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSA3LCBjb2xvciA9ICJncmV5MzAiKSwgbGVnZW5kLmtleS5oZWlnaHQgPSB1bml0KDAuMjUsICdjbScpLA0KICAgICAgICBsZWdlbmQua2V5LndpZHRoID0gdW5pdCgwLjI1LCAnY20nKSwgc3RyaXAudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSA3KSkgKw0KICBmYWNldF9ncmlkKGNvbHMgPSB2YXJzKHN0aW11bGF0aW9uKSwgbGFiZWxsZXIgPSBsYWJlbGxlcihzdGltdWxhdGlvbiA9IHN0aW11bGF0aW9uLmxhYnNfY29ycikpDQoNCg0KIyBDUk4gT0NEDQpwbG90X3RvcG9fT0NEX0NSTiA8LSBnZ3Bsb3QoZGF0YV90b3BvX01GTltkYXRhX3RvcG9fTUZOJGdyb3VwID09ICJPQ0QiICYgZGF0YV90b3BvX01GTiRjb25kaXRpb24gPT0gImNvcnJlY3QiLCBdLA0KICBhZXMoeCA9IHgsIHkgPSB5LCBmaWxsID0gYW1wbGl0dWRlLCBsYWJlbCA9IGVsZWN0cm9kZSkpICsNCiAgZ2VvbV90b3BvKGdyaWRfcmVzID0gMzAwLCBpbnRlcnBfbGltaXQgPSAiaGVhZCIsIGNoYW5fbWFya2VycyA9ICJwb2ludCIsIGNoYW5fc2l6ZSA9IDAuMSwgaGVhZF9zaXplID0gMC4yKSArDQogIHNjYWxlX2ZpbGxfZGlzdGlsbGVyKHBhbGV0dGUgPSAiUmRCdSIsIGxpbWl0cyA9IGMoMC41LCAxMS43KSwgYnJlYWtzID0gYygyLCA2LCAxMCkpICsgIw0KICB0aGVtZV92b2lkKCkgKw0KICBjb29yZF9lcXVhbCgpICsNCiAgbGFicyhmaWxsID0gZXhwcmVzc2lvbihwYXN0ZShtdSwgIlYiKSkpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIsIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSA3LCBjb2xvciA9ICJncmV5MzAiKSwNCiAgICAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSA3LCBjb2xvciA9ICJncmV5MzAiKSwgbGVnZW5kLmtleS5oZWlnaHQgPSB1bml0KDAuMjUsICdjbScpLA0KICAgICAgICBsZWdlbmQua2V5LndpZHRoID0gdW5pdCgwLjI1LCAnY20nKSwgc3RyaXAudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSA3KSkgKw0KICBmYWNldF9ncmlkKGNvbHMgPSB2YXJzKHN0aW11bGF0aW9uKSwgbGFiZWxsZXIgPSBsYWJlbGxlcihzdGltdWxhdGlvbiA9IHN0aW11bGF0aW9uLmxhYnNfY29ycikpDQoNCg0KIyBQZSBIQw0KcGxvdF90b3BvX0hDX1BlIDwtIGdncGxvdChkYXRhX3RvcG9fUGVbZGF0YV90b3BvX1BlJGdyb3VwID09ICJIQyIgJiBkYXRhX3RvcG9fUGUkY29uZGl0aW9uID09ICJpbmNvcnJlY3QiLCBdLA0KICBhZXMoeCA9IHgsIHkgPSB5LCBmaWxsID0gYW1wbGl0dWRlLCBsYWJlbCA9IGVsZWN0cm9kZSkpICsNCiAgZ2VvbV90b3BvKGdyaWRfcmVzID0gMzAwLCBpbnRlcnBfbGltaXQgPSAiaGVhZCIsIGNoYW5fbWFya2VycyA9ICJwb2ludCIsIGNoYW5fc2l6ZSA9IDAuMSwgaGVhZF9zaXplID0gMC4yKSArDQogIHNjYWxlX2ZpbGxfZGlzdGlsbGVyKHBhbGV0dGUgPSAiUmRCdSIsIGxpbWl0cyA9IGMoMiwgMTAuNCkpICsgDQogIHRoZW1lX3ZvaWQoKSArDQogIGNvb3JkX2VxdWFsKCkgKw0KICBsYWJzKGZpbGwgPSBleHByZXNzaW9uKHBhc3RlKG11LCAiViIpKSkgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIiwgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDcsIGNvbG9yID0gImdyZXkzMCIpLA0KICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDcsIGNvbG9yID0gImdyZXkzMCIpLCBsZWdlbmQua2V5LmhlaWdodCA9IHVuaXQoMC4yNSwgJ2NtJyksDQogICAgICAgIGxlZ2VuZC5rZXkud2lkdGggPSB1bml0KDAuMjUsICdjbScpLCBzdHJpcC50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDYuNSkpICsNCiAgZmFjZXRfZ3JpZChjb2xzID0gdmFycyhzdGltdWxhdGlvbiksIGxhYmVsbGVyID0gbGFiZWxsZXIoc3RpbXVsYXRpb24gPSBzdGltdWxhdGlvbi5sYWJzX2luY29ycikpDQoNCg0KIyBQZSBPQ0QNCnBsb3RfdG9wb19PQ0RfUGUgPC0gZ2dwbG90KGRhdGFfdG9wb19QZVtkYXRhX3RvcG9fUGUkZ3JvdXAgPT0gIk9DRCIgJiBkYXRhX3RvcG9fUGUkY29uZGl0aW9uID09ICJpbmNvcnJlY3QiLCBdLA0KICBhZXMoeCA9IHgsIHkgPSB5LCBmaWxsID0gYW1wbGl0dWRlLCBsYWJlbCA9IGVsZWN0cm9kZSkpICsNCiAgZ2VvbV90b3BvKGdyaWRfcmVzID0gMzAwLCBpbnRlcnBfbGltaXQgPSAiaGVhZCIsIGNoYW5fbWFya2VycyA9ICJwb2ludCIsIGNoYW5fc2l6ZSA9IDAuMSwgaGVhZF9zaXplID0gMC4yKSArDQogIHNjYWxlX2ZpbGxfZGlzdGlsbGVyKHBhbGV0dGUgPSAiUmRCdSIsIGxpbWl0cyA9IGMoMiwgMTAuNCkpICsgDQogIHRoZW1lX3ZvaWQoKSArDQogIGNvb3JkX2VxdWFsKCkgKw0KICBsYWJzKGZpbGwgPSBleHByZXNzaW9uKHBhc3RlKG11LCAiViIpKSkgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIiwgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDcsIGNvbG9yID0gImdyZXkzMCIpLA0KICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDcsIGNvbG9yID0gImdyZXkzMCIpLCBsZWdlbmQua2V5LmhlaWdodCA9IHVuaXQoMC4yNSwgJ2NtJyksDQogICAgICAgIGxlZ2VuZC5rZXkud2lkdGggPSB1bml0KDAuMjUsICdjbScpLCBzdHJpcC50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDYuNSkpICsNCiAgZmFjZXRfZ3JpZChjb2xzID0gdmFycyhzdGltdWxhdGlvbiksIGxhYmVsbGVyID0gbGFiZWxsZXIoc3RpbXVsYXRpb24gPSBzdGltdWxhdGlvbi5sYWJzX2luY29ycikpDQpgYGANCg0KIyMgRVJOICYgQ1JODQoqKioNCg0KVGhpcyBmaWd1cmUgY29ycmVzcG9uZHMgdG8gRmlndXJlIDEgaW4gdGhlIG1hbnVzY3JpcHQuDQoNCmBgYHtyIGFycmFuZ2UtcGxvdHMtRVJOLUNSTiwgZmlnLndpZHRoID0gOCwgZmlnLmhlaWdodCA9IDEwLCBjYWNoZSA9IGtuaXRyX2NhY2hlX2VuYWJsZWQsIGRwaSA9IDYwMCwgZmlnLmNhcCA9ICJOb3RlLiAoQSkgUmVzcG9uc2UtbG9ja2VkIGdyYW5kIGF2ZXJhZ2Ugd2F2ZWZvcm1zIHdpdGggOTUlIGNvbmZpZGVuY2UgaW50ZXJ2YWxzIChDSXMpIGZvciBjb3JyZWN0IGFuZCBpbmNvcnJlY3QgcmVzcG9uc2VzIGF0IGVsZWN0cm9kZSBzaXRlIEZDeiBpbiB0aGUgc2hhbSBhbmQgY2F0aG9kYWwgdERDUyBjb25kaXRpb24gZm9yIHBhdGllbnRzIHdpdGggT0NEIGFuZCBIQyBwYXJ0aWNpcGFudHMsIGFsb25nIHdpdGggdG9wb2dyYXBoaWVzIG9mIEVSTiBhbmQgQ1JOICgw4oCTMTAwIG1zKS4gR3JheS1zaGFkZWQgYXJlYXMgaW4gdGhlIHdhdmVmb3JtIHBsb3RzIGluZGljYXRlIHRoZSB0aW1lIHdpbmRvdyB1c2VkIGZvciBFUk4gYW5kIENSTiBxdWFudGlmaWNhdGlvbi4gKEIpIEVSTiBhbmQgQ1JOIG1lYW4gYW1wbGl0dWRlIHZhbHVlcyBwZXIgZ3JvdXAgYW5kIHREQ1MgY29uZGl0aW9uIGFyZSBwcmVzZW50ZWQgYXMgYm94cGxvdHMgYW5kIHByb2JhYmlsaXR5IGRlbnNpdHkgcGxvdHMgYmFzZWQgb24gcmF3IGRhdGEuIChDKSBQcmVkaWN0ZWQgRVJOIGFuZCBDUk4gbWVhbiBhbXBsaXR1ZGUgdmFsdWVzIGJ5IGdyb3VwIGFuZCB0RENTIGNvbmRpdGlvbiwgY2FsY3VsYXRlZCBhcyBwYXJ0aWFsIGVmZmVjdHMgZnJvbSBsaW5lYXIgbWl4ZWQgbW9kZWxzLiBFcnJvciBiYXJzIHJlcHJlc2VudCA5NSUgQ0lzLiJ9DQoNCiMgT3ZlcmxheSB3YXZlZm9ybXMgYW5kIHRvcG9wZ3JhcGh5IHBsb3RzDQphbGlnbmVkX3Bsb3RzMV9NRk4gPC0gYWxpZ25fcGxvdHMocGxvdF93YXZlZm9ybV9NRk4sIHBsb3RfdG9wb19IQ19FUk4sICBheGlzID0gInRyIikNCmFsaWduZWRfcGxvdHMyX01GTiA8LSBhbGlnbl9wbG90cyhwbG90X3dhdmVmb3JtX01GTiwgcGxvdF90b3BvX0hDX0NSTiwgIGF4aXMgPSAidHIiKQ0KYWxpZ25lZF9wbG90czNfTUZOIDwtIGFsaWduX3Bsb3RzKHBsb3Rfd2F2ZWZvcm1fTUZOLCBwbG90X3RvcG9fT0NEX0VSTiwgYXhpcyA9ICJ0ciIpDQphbGlnbmVkX3Bsb3RzNF9NRk4gPC0gYWxpZ25fcGxvdHMocGxvdF93YXZlZm9ybV9NRk4sIHBsb3RfdG9wb19PQ0RfQ1JOLCBheGlzID0gInRyIikNCg0KDQojIEFycmFuZ2UgcGxvdHMNCmZpZ3VyZV9FUk5fQ1JOIDwtIGdnZHJhdygpICsNCiAgZHJhd19wbG90KGFsaWduZWRfcGxvdHMxX01GTltbMV1dLCAgeCA9ICAwLCAgIHkgPSAuNDIsICB3aWR0aCA9IC45OSwgaGVpZ2h0ID0gLjU2KSArDQogIGRyYXdfcGxvdChhbGlnbmVkX3Bsb3RzMV9NRk5bWzJdXSwgIHggPSAuMDczLCB5ID0gLjc5NSwgd2lkdGggPSAuMiwgIGhlaWdodCA9IC4xNSkgKw0KICBkcmF3X3Bsb3QoYWxpZ25lZF9wbG90czJfTUZOW1syXV0sICB4ID0gLjI5MywgeSA9IC43OTUsIHdpZHRoID0gLjIsICBoZWlnaHQgPSAuMTUpICsNCiAgZHJhd19wbG90KGFsaWduZWRfcGxvdHMzX01GTltbMl1dLCAgeCA9IC41NjMsIHkgPSAuNzk1LCB3aWR0aCA9IC4yLCAgaGVpZ2h0ID0gLjE1KSArDQogIGRyYXdfcGxvdChhbGlnbmVkX3Bsb3RzNF9NRk5bWzJdXSwgIHggPSAuNzgzLCB5ID0gLjc5NSwgd2lkdGggPSAuMiwgIGhlaWdodCA9IC4xNSkgKw0KICBkcmF3X3Bsb3QobGVnZW5kX01GTiwgICAgICAgICAgICAgICB4ID0gLjMxOCwgeSA9IC40LCAgIHdpZHRoID0gLjQsICBoZWlnaHQgPSAuMDEpICsNCiAgZHJhd19wbG90KHBsb3RfYm94X2RlbnNpdHlfRVJOLCAgICAgeCA9IC4wMSwgIHkgPSAuMDQsICB3aWR0aCA9IC4zLCAgaGVpZ2h0ID0gLjI5KSArDQogIGRyYXdfcGxvdChwbG90X0xNTV9FUk4sICAgICAgICAgICAgIHggPSAuNiwgICB5ID0gLjA0LCAgd2lkdGggPSAuMiwgIGhlaWdodCA9IC4zMikgKw0KICBkcmF3X3Bsb3QocGxvdF9ib3hfZGVuc2l0eV9DUk4sICAgICB4ID0gLjMsICAgeSA9IC4wNCwgIHdpZHRoID0gLjMsICBoZWlnaHQgPSAuMjkpICsNCiAgZHJhd19wbG90KHBsb3RfTE1NX0NSTiwgICAgICAgICAgICAgeCA9IC44LCAgIHkgPSAuMDQsICB3aWR0aCA9IC4yLCAgaGVpZ2h0ID0gLjMyKSArDQogIGRyYXdfcGxvdChsZWdlbmRfTUZOLCAgICAgICAgICAgICAgIHggPSAuMzE4LCB5ID0gLjAzNSwgd2lkdGggPSAuNCwgIGhlaWdodCA9IC4wMSkgKw0KICBkcmF3X3Bsb3RfbGFiZWwoYygiQSIsICJCIiwgIkMiKSwgYygwLCAwLCAuNTkpLCBjKDEsIC4zNiwgLjM2KSwgc2l6ZSA9IDE1KQ0KZmlndXJlX0VSTl9DUk4NCg0KDQojIFNhdmUgcGxvdA0KZ2dzYXZlKHBsb3QgPSBmaWd1cmVfRVJOX0NSTiwgIi4vZmlndXJlcy9maWd1cmVfRVJOX0NSTi50aWZmIiwgd2lkdGggPSAyMCwgaGVpZ2h0ID0gMjQsDQogICAgICAgdW5pdHMgPSAiY20iLCBkcGkgPSA2MDAsIGNvbXByZXNzaW9uID0gImx6dyIpDQpgYGANCjxicj48YnI+DQoNCiMjIFBlDQoqKioNCg0KVGhpcyBmaWd1cmUgY29ycmVzcG9uZHMgdG8gRmlndXJlIFMxIGluIHRoZSBzdXBwbGVtZW50YWwgbWF0ZXJpYWwuDQoNCmBgYHtyIGFycmFuZ2UtcGxvdHMtUGUsIGZpZy53aWR0aCA9IDgsIGZpZy5oZWlnaHQgPSA0LCBjYWNoZSA9IGtuaXRyX2NhY2hlX2VuYWJsZWQsIGRwaSA9IDYwMCwgZmlnLmNhcCA9ICJOb3RlLiAoQSkgUmVzcG9uc2UtbG9ja2VkIGdyYW5kIGF2ZXJhZ2Ugd2F2ZWZvcm1zIHdpdGggOTUlIGNvbmZpZGVuY2UgaW50ZXJ2YWxzIChDSXMpIGZvciBpbmNvcnJlY3QgcmVzcG9uc2VzIGF0IGVsZWN0cm9kZSBzaXRlIFB6IGluIHRoZSBzaGFtIGFuZCBjYXRob2RhbCB0RENTIGNvbmRpdGlvbiBmb3IgcGF0aWVudHMgd2l0aCBPQ0QgYW5kIEhDIHBhcnRpY2lwYW50cywgYWxvbmcgd2l0aCB0b3BvZ3JhcGhpZXMgb2YgdGhlIFBlICgyMDDigJM0MDAgbXMpLiBHcmF5LXNoYWRlZCBhcmVhcyBpbiB0aGUgd2F2ZWZvcm0gcGxvdHMgaW5kaWNhdGUgdGhlIHRpbWUgd2luZG93IHVzZWQgZm9yIFBlIHF1YW50aWZpY2F0aW9uLiAoQikgUGUgbWVhbiBhbXBsaXR1ZGUgdmFsdWVzIHBlciBncm91cCBhbmQgdERDUyBjb25kaXRpb24gYXJlIHByZXNlbnRlZCBhcyBib3hwbG90cyBhbmQgcHJvYmFiaWxpdHkgZGVuc2l0eSBwbG90cyBiYXNlZCBvbiByYXcgZGF0YS4gKEMpIFByZWRpY3RlZCBQZSBtZWFuIGFtcGxpdHVkZSB2YWx1ZXMgYnkgZ3JvdXAgYW5kIHREQ1MgY29uZGl0aW9uLCBjYWxjdWxhdGVkIGFzIHBhcnRpYWwgZWZmZWN0cyBmcm9tIGxpbmVhciBtaXhlZCBtb2RlbHMuIEVycm9yIGJhcnMgcmVwcmVzZW50IDk1JSBDSXMuIn0NCg0KIyBPdmVybGF5IHdhdmVmb3JtcyBhbmQgdHBvcGdyYXBoeSBwbG90cw0KYWxpZ25lZF9wbG90czFfUGUgIDwtIGFsaWduX3Bsb3RzKHBsb3Rfd2F2ZWZvcm1fUGUsIHBsb3RfdG9wb19IQ19QZSwgIGF4aXMgPSAidHIiKQ0KYWxpZ25lZF9wbG90czJfUGUgIDwtIGFsaWduX3Bsb3RzKHBsb3Rfd2F2ZWZvcm1fUGUsIHBsb3RfdG9wb19PQ0RfUGUsIGF4aXMgPSAidHIiKQ0KDQoNCiMgQXJyYW5nZSBwbG90cw0KZmlndXJlX1BlIDwtIGdnZHJhdygpICsNCiAgZHJhd19wbG90KGFsaWduZWRfcGxvdHMxX1BlW1sxXV0sIHggPSAgMCwgICB5ID0gLjA1LCAgd2lkdGggPSAuNzY1LCBoZWlnaHQgPSAuOTIpICsNCiAgZHJhd19wbG90KGFsaWduZWRfcGxvdHMxX1BlW1syXV0sIHggPSAuMDcsICB5ID0gLjY2NCwgd2lkdGggPSAuMywgICBoZWlnaHQgPSAuMjIpICsNCiAgZHJhd19wbG90KGFsaWduZWRfcGxvdHMyX1BlW1syXV0sIHggPSAuNDQ3LCB5ID0gLjY2NCwgd2lkdGggPSAuMywgICBoZWlnaHQgPSAuMjIpICsNCiAgZHJhd19wbG90KHBsb3RfYm94X2RlbnNpdHlfUGUsICAgIHggPSAuNzcsICB5ID0gLjQ4LCAgd2lkdGggPSAuMjUsICBoZWlnaHQgPSAuNDcpICsNCiAgZHJhd19wbG90KHBsb3RfTE1NX1BlLCAgICAgICAgICAgIHggPSAuNzc0LCB5ID0gLjA1LCAgd2lkdGggPSAuMjUsICBoZWlnaHQgPSAuNDgpICsNCiAgZHJhd19wbG90KGxlZ2VuZF9QZSwgICAgICAgICAgICAgIHggPSAuMywgICB5ID0gLjAxLCAgd2lkdGggPSAuMiwgICBoZWlnaHQgPSAuMDEpICsNCiAgZHJhd19wbG90X2xhYmVsKGMoIkEiLCAiQiIsICJDIiksIGMoMCwgLjc1LCAuNzUpLCBjKDEsIDEsIC41OCksIHNpemUgPSAxNSkNCmZpZ3VyZV9QZQ0KDQoNCiMgU2F2ZSBwbG90DQpnZ3NhdmUocGxvdCA9IGZpZ3VyZV9QZSwgIi4vZmlndXJlcy9maWd1cmVfUGUudGlmZiIsIHdpZHRoID0gMjAsIGhlaWdodCA9IDEyLA0KICAgICAgIHVuaXRzID0gImNtIiwgZHBpID0gNjAwLCBjb21wcmVzc2lvbiA9ICJsenciKQ0KYGBgDQo8YnI+PGJyPg0KDQojIyBTZXNzaW9uIEluZm8NCioqKg0KDQpgYGB7ciBzZXNzaW9uLWluZm99DQoNCnNlc3Npb25JbmZvKCkNCmBgYA0K