The Exercise
Although we are conducting our Repeated Measures ANOVA in SPSS, it is worth illustrating some of the advantages of visualizing your data in R and ggplot (i.e., raw data, three-way interactions, polynomial trends, etc.)
Loading Packages & Data
From Personal/Lab Computer
Load tidyverse to get access to ggplot2, dplyr, and tidyr.
Load haven to load in SPSS data.
ipak <- function(pkg){
new.pkg <- pkg[!(pkg %in% installed.packages()[, "Package"])]
if (length(new.pkg))
install.packages(new.pkg, dependencies = TRUE)
sapply(pkg, require, character.only = TRUE)
}
packages <- c("tidyverse", "dplyr","haven", "stringr")
ipak(packages)
# Change ggplot theme to light background
old <- theme_set(theme_light(base_size = 12))
Load and Restructure Data
Load in lab data using read_sav() function from haven package. Let’s also create new variables that map labels onto our coded variables (e.g., language (1) = Excel).
lab14mw_data <- read_sav("/Users/Julian/GDrive/Misc/Classes/InterStats/Lab14M/Lab14MW_data.sav") %>%
mutate(SubjID = row_number()) %>%
select(SubjID, everything()) %>%
mutate(language_lab = ifelse(language == 1, "Excel", NA),
language_lab = ifelse(language == 2, "SPSS", language_lab),
language_lab = ifelse(language == 3, "R", language_lab)) %>%
mutate(school_lab = ifelse(school == 1, "School 1", NA),
school_lab = ifelse(school == 2, "School 2", school_lab))
lab14mw_data
Notice, however, that our repeated measures span four columns (once for each interval, e.g. diff_time1). Let’s use the gather() function from the tidyr package to convert our data from wide to long. This way we will have four rows per subject, as well as a new column (“time”) to indicate the specific time measurement of perceived difficulty (“diff”).
NOTE: This method also drops subjects with missing data. This is definitely not always recommended, but we will do this so that our plots are in sync with the SPSS analysis (which also drops incomplete cases).
lab14mw_data <- read_sav("/Users/Julian/GDrive/Misc/Classes/InterStats/Lab14M/Lab14MW_data.sav") %>%
mutate(SubjID = row_number()) %>%
select(SubjID, everything()) %>%
mutate(language_lab = ifelse(language == 1, "Excel", NA),
language_lab = ifelse(language == 2, "SPSS", language_lab),
language_lab = ifelse(language == 3, "R", language_lab)) %>%
mutate(school_lab = ifelse(school == 1, "School 1", NA),
school_lab = ifelse(school == 2, "School 2", school_lab)) %>%
gather(time, diff, diff_time1:diff_time4) %>%
mutate(time = as.numeric(str_replace(time,"diff_time",""))) %>%
arrange(SubjID, time)
lab14mw_data
Violin Plots
We can examine the distribution of difficulty at each time interval.
lab14mw_data %>%
mutate(time = factor(time)) %>%
ggplot(aes(time, diff)) + geom_violin() + geom_jitter(alpha=.5,width=.1,height=0) +
labs(x="Time Interval", y = "Perceived Difficulty",
title="Perceived Difficulty over Time", subtitle = "Violin Plots with (jittered) Observations")

Main Effect of Time
lab14mw_data %>%
ggplot(aes(time, diff)) +
stat_summary(fun.data = mean_cl_boot, geom="ribbon", alpha=.3) +
stat_summary(fun.y = mean, geom="line") +
labs(x="Time Interval", y = "Perceived Difficulty",
title="Perceived Difficulty over Time", subtitle = "Mean and Boostrapped 95% Confidence Intervals")

Language x Time Interaction
This is a bit cluttered, but it gives us information about the variability (unlike SPSS).
lab14mw_data %>%
ggplot(aes(time, diff, color=language_lab, fill=language_lab)) +
stat_summary(fun.data = mean_se, geom="ribbon", alpha=.1) +
stat_summary(fun.y = mean, geom="line") +
labs(x="Time Interval", y = "Perceived Difficulty",
title="Perceived Difficulty over Time\nas a function of Programming Language",
subtitle = "Mean +/- 1 Standard Error", color="Language", fill="Language")

Linear Trends
lab14mw_data %>%
ggplot(aes(time, diff, color=language_lab, fill=language_lab)) +
# facet_wrap(~school_lab) +
geom_smooth(method=lm, alpha=.2) +
labs(x="Time Interval", y = "Perceived Difficulty",
title="Perceived Difficulty over Time as a function of \nProgramming Language and School",
subtitle = "Linear Model Fit", color="Language", fill="Language")

Quadratic Trends
lab14mw_data %>%
ggplot(aes(time, diff, color=language_lab, fill=language_lab)) +
# facet_wrap(~school_lab) +
geom_smooth(method=lm, alpha=.2, formula= y ~ x + I(x^2)) +
labs(x="Time Interval", y = "Perceived Difficulty",
title="Perceived Difficulty over Time as a function of \nProgramming Language and School",
subtitle = "Quadratic Model Fit", color="Language", fill="Language")

Language x School x Time Interaction
lab14mw_data %>%
ggplot(aes(time, diff, color=language_lab, fill=language_lab)) +
facet_wrap(~school_lab) +
stat_summary(fun.data = mean_se, alpha=1, position=position_dodge(width=.5)) +
stat_summary(fun.y = mean, geom="line", position=position_dodge(width=.5)) +
labs(x="Time Interval", y = "Perceived Difficulty",
title="Perceived Difficulty over Time as a function of \nProgramming Language and School",
subtitle = "Mean +/- 1 Standard Error", color="Language", fill="Language")

Compare Polynomial Trends
lab14mw_data %>%
ggplot(aes(time, diff, color=language_lab, fill=language_lab)) +
facet_wrap(~school_lab) +
geom_smooth(method=lm, formula= y ~ x + I(x^1), se=F, linetype=1) +
geom_smooth(method=lm, formula= y ~ x + I(x^2), se=F, linetype=3) +
labs(x="Time Interval", y = "Perceived Difficulty",
title="Perceived Difficulty over Time as a function of \nProgramming Language and School",
subtitle = "Linear (solid) vs. Quadratic (dotted) Fit", color="Language", fill="Language")

LS0tDQp0aXRsZTogIkxhYjE0TVciDQphdXRob3I6ICJKdWxpYW4gV2lsbHMiDQpkYXRlOiAiRGVjZW1iZXIgNXRoLTd0aCwgMjAxNiINCm91dHB1dDoNCiAgaHRtbF9ub3RlYm9vazoNCiAgICB0aGVtZTogcmVhZGFibGUNCiAgICB0b2M6IHllcw0KLS0tDQojIyBUaGUgRXhlcmNpc2UNCkFsdGhvdWdoIHdlIGFyZSBjb25kdWN0aW5nIG91ciBSZXBlYXRlZCBNZWFzdXJlcyBBTk9WQSBpbiBTUFNTLCBpdCBpcyB3b3J0aCBpbGx1c3RyYXRpbmcgc29tZSBvZiB0aGUgYWR2YW50YWdlcyBvZiB2aXN1YWxpemluZyB5b3VyIGRhdGEgaW4gUiBhbmQgZ2dwbG90IChpLmUuLCByYXcgZGF0YSwgdGhyZWUtd2F5IGludGVyYWN0aW9ucywgcG9seW5vbWlhbCB0cmVuZHMsIGV0Yy4pIA0KDQojIyBMb2FkaW5nIFBhY2thZ2VzICYgRGF0YQ0KDQojIyMgRnJvbSBQZXJzb25hbC9MYWIgQ29tcHV0ZXINCkxvYWQgKip0aWR5dmVyc2UqKiB0byBnZXQgYWNjZXNzIHRvIGdncGxvdDIsIGRwbHlyLCBhbmQgdGlkeXIuICAgDQpMb2FkICoqaGF2ZW4qKiB0byBsb2FkIGluIFNQU1MgZGF0YS4gDQoNCmBgYHtyLCByZXN1bHRzPSdoaWRlJywgbWVzc2FnZT1GQUxTRX0NCmlwYWsgPC0gZnVuY3Rpb24ocGtnKXsNCiAgbmV3LnBrZyA8LSBwa2dbIShwa2cgJWluJSBpbnN0YWxsZWQucGFja2FnZXMoKVssICJQYWNrYWdlIl0pXQ0KICBpZiAobGVuZ3RoKG5ldy5wa2cpKSANCiAgICBpbnN0YWxsLnBhY2thZ2VzKG5ldy5wa2csIGRlcGVuZGVuY2llcyA9IFRSVUUpDQogICAgc2FwcGx5KHBrZywgcmVxdWlyZSwgY2hhcmFjdGVyLm9ubHkgPSBUUlVFKQ0KDQp9DQoNCnBhY2thZ2VzIDwtIGMoInRpZHl2ZXJzZSIsICJkcGx5ciIsImhhdmVuIiwgInN0cmluZ3IiKQ0KaXBhayhwYWNrYWdlcykNCg0KIyBDaGFuZ2UgZ2dwbG90IHRoZW1lIHRvIGxpZ2h0IGJhY2tncm91bmQNCm9sZCA8LSB0aGVtZV9zZXQodGhlbWVfbGlnaHQoYmFzZV9zaXplID0gMTIpKQ0KYGBgDQoNCiMjIyBMb2FkIGFuZCBSZXN0cnVjdHVyZSBEYXRhDQoNCkxvYWQgaW4gbGFiIGRhdGEgdXNpbmcgKipyZWFkX3NhdigpKiogZnVuY3Rpb24gZnJvbSBoYXZlbiBwYWNrYWdlLg0KTGV0J3MgYWxzbyBjcmVhdGUgbmV3IHZhcmlhYmxlcyB0aGF0IG1hcCBsYWJlbHMgb250byBvdXIgY29kZWQgdmFyaWFibGVzIChlLmcuLCBsYW5ndWFnZSAoMSkgPSBFeGNlbCkuDQpgYGB7ciwgd2FybmluZz1GQUxTRX0NCmxhYjE0bXdfZGF0YSA8LSByZWFkX3NhdigiL1VzZXJzL0p1bGlhbi9HRHJpdmUvTWlzYy9DbGFzc2VzL0ludGVyU3RhdHMvTGFiMTRNL0xhYjE0TVdfZGF0YS5zYXYiKSAlPiUgDQogIG11dGF0ZShTdWJqSUQgPSByb3dfbnVtYmVyKCkpICU+JSANCiAgc2VsZWN0KFN1YmpJRCwgZXZlcnl0aGluZygpKSAlPiUgDQogIG11dGF0ZShsYW5ndWFnZV9sYWIgPSBpZmVsc2UobGFuZ3VhZ2UgPT0gMSwgIkV4Y2VsIiwgTkEpLA0KICAgICAgICAgbGFuZ3VhZ2VfbGFiID0gaWZlbHNlKGxhbmd1YWdlID09IDIsICJTUFNTIiwgbGFuZ3VhZ2VfbGFiKSwNCiAgICAgICAgIGxhbmd1YWdlX2xhYiA9IGlmZWxzZShsYW5ndWFnZSA9PSAzLCAiUiIsIGxhbmd1YWdlX2xhYikpICU+JSANCiAgbXV0YXRlKHNjaG9vbF9sYWIgPSBpZmVsc2Uoc2Nob29sID09IDEsICJTY2hvb2wgMSIsIE5BKSwNCiAgICAgICAgIHNjaG9vbF9sYWIgPSBpZmVsc2Uoc2Nob29sID09IDIsICJTY2hvb2wgMiIsIHNjaG9vbF9sYWIpKQ0KbGFiMTRtd19kYXRhDQpgYGANCiAgDQoNCk5vdGljZSwgaG93ZXZlciwgdGhhdCBvdXIgcmVwZWF0ZWQgbWVhc3VyZXMgc3BhbiBmb3VyIGNvbHVtbnMgKG9uY2UgZm9yIGVhY2ggaW50ZXJ2YWwsIGUuZy4gZGlmZl90aW1lMSkuIA0KTGV0J3MgdXNlIHRoZSAqKmdhdGhlcigpKiogZnVuY3Rpb24gZnJvbSB0aGUgdGlkeXIgcGFja2FnZSB0byBjb252ZXJ0IG91ciBkYXRhIGZyb20gd2lkZSB0byBsb25nLg0KVGhpcyB3YXkgd2Ugd2lsbCBoYXZlIGZvdXIgcm93cyBwZXIgc3ViamVjdCwgYXMgd2VsbCBhcyBhIG5ldyBjb2x1bW4gKCJ0aW1lIikgdG8gaW5kaWNhdGUgdGhlIHNwZWNpZmljIHRpbWUgDQptZWFzdXJlbWVudCBvZiBwZXJjZWl2ZWQgZGlmZmljdWx0eSAoImRpZmYiKS4gDQoNCk5PVEU6IFRoaXMgbWV0aG9kIGFsc28gZHJvcHMgc3ViamVjdHMgd2l0aCBtaXNzaW5nIGRhdGEuIFRoaXMgaXMgZGVmaW5pdGVseSBub3QgYWx3YXlzIHJlY29tbWVuZGVkLCBidXQgd2Ugd2lsbCANCmRvIHRoaXMgc28gdGhhdCBvdXIgcGxvdHMgYXJlIGluIHN5bmMgd2l0aCB0aGUgU1BTUyBhbmFseXNpcyAod2hpY2ggYWxzbyBkcm9wcyBpbmNvbXBsZXRlIGNhc2VzKS4gDQpgYGB7ciwgd2FybmluZz1GQUxTRX0NCmxhYjE0bXdfZGF0YSA8LSByZWFkX3NhdigiL1VzZXJzL0p1bGlhbi9HRHJpdmUvTWlzYy9DbGFzc2VzL0ludGVyU3RhdHMvTGFiMTRNL0xhYjE0TVdfZGF0YS5zYXYiKSAlPiUgDQogIG11dGF0ZShTdWJqSUQgPSByb3dfbnVtYmVyKCkpICU+JSANCiAgc2VsZWN0KFN1YmpJRCwgZXZlcnl0aGluZygpKSAlPiUgDQogIG11dGF0ZShsYW5ndWFnZV9sYWIgPSBpZmVsc2UobGFuZ3VhZ2UgPT0gMSwgIkV4Y2VsIiwgTkEpLA0KICAgICAgICAgbGFuZ3VhZ2VfbGFiID0gaWZlbHNlKGxhbmd1YWdlID09IDIsICJTUFNTIiwgbGFuZ3VhZ2VfbGFiKSwNCiAgICAgICAgIGxhbmd1YWdlX2xhYiA9IGlmZWxzZShsYW5ndWFnZSA9PSAzLCAiUiIsIGxhbmd1YWdlX2xhYikpICU+JSANCiAgbXV0YXRlKHNjaG9vbF9sYWIgPSBpZmVsc2Uoc2Nob29sID09IDEsICJTY2hvb2wgMSIsIE5BKSwNCiAgICAgICAgIHNjaG9vbF9sYWIgPSBpZmVsc2Uoc2Nob29sID09IDIsICJTY2hvb2wgMiIsIHNjaG9vbF9sYWIpKSAlPiUgDQogIGdhdGhlcih0aW1lLCBkaWZmLCBkaWZmX3RpbWUxOmRpZmZfdGltZTQpICU+JSANCiAgbXV0YXRlKHRpbWUgPSBhcy5udW1lcmljKHN0cl9yZXBsYWNlKHRpbWUsImRpZmZfdGltZSIsIiIpKSkgJT4lIA0KICBhcnJhbmdlKFN1YmpJRCwgdGltZSkNCmxhYjE0bXdfZGF0YQ0KYGBgDQoNCg0KIyMgVmlvbGluIFBsb3RzDQoNCldlIGNhbiBleGFtaW5lIHRoZSBkaXN0cmlidXRpb24gb2YgZGlmZmljdWx0eSBhdCBlYWNoIHRpbWUgaW50ZXJ2YWwuDQpgYGB7cn0NCg0KbGFiMTRtd19kYXRhICU+JSANCiAgbXV0YXRlKHRpbWUgPSBmYWN0b3IodGltZSkpICU+JSANCiAgZ2dwbG90KGFlcyh0aW1lLCBkaWZmKSkgKyBnZW9tX3Zpb2xpbigpICsgZ2VvbV9qaXR0ZXIoYWxwaGE9LjUsd2lkdGg9LjEsaGVpZ2h0PTApICsgDQogIGxhYnMoeD0iVGltZSBJbnRlcnZhbCIsIHkgPSAiUGVyY2VpdmVkIERpZmZpY3VsdHkiLCANCiAgICAgICB0aXRsZT0iUGVyY2VpdmVkIERpZmZpY3VsdHkgb3ZlciBUaW1lIiwgc3VidGl0bGUgPSAiVmlvbGluIFBsb3RzIHdpdGggKGppdHRlcmVkKSBPYnNlcnZhdGlvbnMiKQ0KYGBgDQoNCiMjIE1haW4gRWZmZWN0IG9mIFRpbWUNCg0KYGBge3J9DQoNCmxhYjE0bXdfZGF0YSAlPiUgDQogIGdncGxvdChhZXModGltZSwgZGlmZikpICArIA0KICBzdGF0X3N1bW1hcnkoZnVuLmRhdGEgPSBtZWFuX2NsX2Jvb3QsIGdlb209InJpYmJvbiIsIGFscGhhPS4zKSArIA0KICBzdGF0X3N1bW1hcnkoZnVuLnkgPSBtZWFuLCBnZW9tPSJsaW5lIikgKyANCiAgbGFicyh4PSJUaW1lIEludGVydmFsIiwgeSA9ICJQZXJjZWl2ZWQgRGlmZmljdWx0eSIsIA0KICAgICAgIHRpdGxlPSJQZXJjZWl2ZWQgRGlmZmljdWx0eSBvdmVyIFRpbWUiLCBzdWJ0aXRsZSA9ICJNZWFuIGFuZCBCb29zdHJhcHBlZCA5NSUgQ29uZmlkZW5jZSBJbnRlcnZhbHMiKQ0KYGBgDQoNCiMjIExhbmd1YWdlIHggVGltZSBJbnRlcmFjdGlvbg0KDQpUaGlzIGlzIGEgYml0IGNsdXR0ZXJlZCwgYnV0IGl0IGdpdmVzIHVzIGluZm9ybWF0aW9uIGFib3V0IHRoZSB2YXJpYWJpbGl0eSAodW5saWtlIFNQU1MpLg0KYGBge3J9DQoNCmxhYjE0bXdfZGF0YSAlPiUgDQogIGdncGxvdChhZXModGltZSwgZGlmZiwgY29sb3I9bGFuZ3VhZ2VfbGFiLCBmaWxsPWxhbmd1YWdlX2xhYikpICArIA0KICBzdGF0X3N1bW1hcnkoZnVuLmRhdGEgPSBtZWFuX3NlLCBnZW9tPSJyaWJib24iLCBhbHBoYT0uMSkgKw0KICBzdGF0X3N1bW1hcnkoZnVuLnkgPSBtZWFuLCBnZW9tPSJsaW5lIikgKyANCiAgbGFicyh4PSJUaW1lIEludGVydmFsIiwgeSA9ICJQZXJjZWl2ZWQgRGlmZmljdWx0eSIsIA0KICAgICAgIHRpdGxlPSJQZXJjZWl2ZWQgRGlmZmljdWx0eSBvdmVyIFRpbWVcbmFzIGEgZnVuY3Rpb24gb2YgUHJvZ3JhbW1pbmcgTGFuZ3VhZ2UiLA0KICAgICAgIHN1YnRpdGxlID0gIk1lYW4gKy8tIDEgU3RhbmRhcmQgRXJyb3IiLCBjb2xvcj0iTGFuZ3VhZ2UiLCBmaWxsPSJMYW5ndWFnZSIpDQpgYGANCg0KIyMjIExpbmVhciBUcmVuZHMNCg0KYGBge3J9DQoNCmxhYjE0bXdfZGF0YSAlPiUgDQogIGdncGxvdChhZXModGltZSwgZGlmZiwgY29sb3I9bGFuZ3VhZ2VfbGFiLCBmaWxsPWxhbmd1YWdlX2xhYikpICArIA0KICBnZW9tX3Ntb290aChtZXRob2Q9bG0sIGFscGhhPS4yKSArIA0KICBsYWJzKHg9IlRpbWUgSW50ZXJ2YWwiLCB5ID0gIlBlcmNlaXZlZCBEaWZmaWN1bHR5IiwgDQogICAgICAgdGl0bGU9IlBlcmNlaXZlZCBEaWZmaWN1bHR5IG92ZXIgVGltZSBhcyBhIGZ1bmN0aW9uIG9mIFxuUHJvZ3JhbW1pbmcgTGFuZ3VhZ2UgYW5kIFNjaG9vbCIsDQogICAgICAgc3VidGl0bGUgPSAiTGluZWFyIE1vZGVsIEZpdCIsIGNvbG9yPSJMYW5ndWFnZSIsIGZpbGw9Ikxhbmd1YWdlIikNCg0KYGBgDQoNCiMjIyBRdWFkcmF0aWMgVHJlbmRzDQoNCmBgYHtyfQ0KDQpsYWIxNG13X2RhdGEgJT4lIA0KICBnZ3Bsb3QoYWVzKHRpbWUsIGRpZmYsIGNvbG9yPWxhbmd1YWdlX2xhYiwgZmlsbD1sYW5ndWFnZV9sYWIpKSAgKyANCiAgZ2VvbV9zbW9vdGgobWV0aG9kPWxtLCBhbHBoYT0uMiwgZm9ybXVsYT0geSB+IHggKyBJKHheMikpICsgDQogIGxhYnMoeD0iVGltZSBJbnRlcnZhbCIsIHkgPSAiUGVyY2VpdmVkIERpZmZpY3VsdHkiLCANCiAgICAgICB0aXRsZT0iUGVyY2VpdmVkIERpZmZpY3VsdHkgb3ZlciBUaW1lIGFzIGEgZnVuY3Rpb24gb2YgXG5Qcm9ncmFtbWluZyBMYW5ndWFnZSBhbmQgU2Nob29sIiwNCiAgICAgICBzdWJ0aXRsZSA9ICJRdWFkcmF0aWMgTW9kZWwgRml0IiwgY29sb3I9Ikxhbmd1YWdlIiwgZmlsbD0iTGFuZ3VhZ2UiKQ0KDQpgYGANCg0KDQoNCiMjIExhbmd1YWdlIHggU2Nob29sIHggVGltZSBJbnRlcmFjdGlvbg0KDQpgYGB7cn0NCg0KbGFiMTRtd19kYXRhICU+JSANCiAgZ2dwbG90KGFlcyh0aW1lLCBkaWZmLCBjb2xvcj1sYW5ndWFnZV9sYWIsIGZpbGw9bGFuZ3VhZ2VfbGFiKSkgICsgDQogIGZhY2V0X3dyYXAofnNjaG9vbF9sYWIpICsgDQogIHN0YXRfc3VtbWFyeShmdW4uZGF0YSA9IG1lYW5fc2UsIGFscGhhPTEsIHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKHdpZHRoPS41KSkgKw0KICBzdGF0X3N1bW1hcnkoZnVuLnkgPSBtZWFuLCBnZW9tPSJsaW5lIiwgcG9zaXRpb249cG9zaXRpb25fZG9kZ2Uod2lkdGg9LjUpKSArDQogIGxhYnMoeD0iVGltZSBJbnRlcnZhbCIsIHkgPSAiUGVyY2VpdmVkIERpZmZpY3VsdHkiLCANCiAgICAgICB0aXRsZT0iUGVyY2VpdmVkIERpZmZpY3VsdHkgb3ZlciBUaW1lIGFzIGEgZnVuY3Rpb24gb2YgXG5Qcm9ncmFtbWluZyBMYW5ndWFnZSBhbmQgU2Nob29sIiwNCiAgICAgICBzdWJ0aXRsZSA9ICJNZWFuICsvLSAxIFN0YW5kYXJkIEVycm9yIiwgY29sb3I9Ikxhbmd1YWdlIiwgZmlsbD0iTGFuZ3VhZ2UiKQ0KYGBgDQoNCg0KIyMjIENvbXBhcmUgUG9seW5vbWlhbCBUcmVuZHMNCg0KYGBge3IsIHdhcm5pbmc9RkFMU0V9DQoNCmxhYjE0bXdfZGF0YSAlPiUgDQogIGdncGxvdChhZXModGltZSwgZGlmZiwgY29sb3I9bGFuZ3VhZ2VfbGFiLCBmaWxsPWxhbmd1YWdlX2xhYikpICArIA0KICBmYWNldF93cmFwKH5zY2hvb2xfbGFiKSArIA0KICBnZW9tX3Ntb290aChtZXRob2Q9bG0sIGZvcm11bGE9IHkgfiB4ICsgSSh4XjEpLCBzZT1GLCBsaW5ldHlwZT0xKSArIA0KICBnZW9tX3Ntb290aChtZXRob2Q9bG0sIGZvcm11bGE9IHkgfiB4ICsgSSh4XjIpLCBzZT1GLCBsaW5ldHlwZT0zKSArIA0KICBsYWJzKHg9IlRpbWUgSW50ZXJ2YWwiLCB5ID0gIlBlcmNlaXZlZCBEaWZmaWN1bHR5IiwgDQogICAgICAgdGl0bGU9IlBlcmNlaXZlZCBEaWZmaWN1bHR5IG92ZXIgVGltZSBhcyBhIGZ1bmN0aW9uIG9mIFxuUHJvZ3JhbW1pbmcgTGFuZ3VhZ2UgYW5kIFNjaG9vbCIsDQogICAgICAgc3VidGl0bGUgPSAiTGluZWFyIChzb2xpZCkgdnMuIFF1YWRyYXRpYyAoZG90dGVkKSBGaXQiLCBjb2xvcj0iTGFuZ3VhZ2UiLCBmaWxsPSJMYW5ndWFnZSIpDQoNCmBgYA0KDQoNCg==