This script replicates Figure 5 (Development of the mean of running attributes).


Getting started

clean up

rm (list = ls( ))


custom functions

  • fpackage.check: Check if packages are installed (and install if not) in R (source)
fpackage.check <- function(packages) {
    lapply(packages, FUN = function(x) {
        if (!require(x, character.only = TRUE)) {
            install.packages(x, dependencies = TRUE)
            library(x, character.only = TRUE)
        }
    })
}


necessary packages

We install and load the packages we need later on: - moments: for calculating statistics - dplyr: for data manipulation - ggplot2: for data visualization

packages = c("moments", "dplyr", "ggplot2")
fpackage.check(packages)

load club data

load("clubdata.RData")


data wrangling

# data males (mean run freq./vol. and mean freq./vol. other activities: cycling swimming)
mean_freq <- mean_vol <- matrix(NA, nrow=12, ncol=5)
for ( i in 1:5) {
  for ( t in 1:12) {
    mean_freq[t,i] <- mean(clubdata[[i]]$freq_run[,,t][which(clubdata[[i]]$male==1)], na.rm=T)
    mean_vol[t,i] <- mean(clubdata[[i]]$time_run[,,t][which(clubdata[[i]]$male==1)], na.rm=T)
  }
}

sd_freq <- sd_vol <- matrix(NA, nrow=12, ncol=5)
for ( i in 1:5) {
  for ( t in 1:12) {
    sd_freq[t,i] <- sd(clubdata[[i]]$freq_run[,,t][which(clubdata[[i]]$male==1)], na.rm=T)
    sd_vol[t,i] <- sd(clubdata[[i]]$time_run[,,t][which(clubdata[[i]]$male==1)], na.rm=T)
  }
}

se_freq <- se_vol <- matrix(NA, nrow=12, ncol=5) 
for ( i in 1:5) {
  for ( t in 1:12) {
    se_freq[t,i] <- sd_freq[t,i]/sqrt(sum(clubdata[[i]]$male==1))
    se_vol[t,i] <- sd_vol[t,i]/sqrt(sum(clubdata[[i]]$male==1))
  }
}

data_male <- data.frame(
  mean = as.vector(c(mean_freq, mean_vol)),
  sd = as.vector(c(sd_freq, sd_vol)),
  se =  as.vector(c(se_freq, se_vol)),
  club = as.character(sort(replicate(12, c("Club 1 (N=27)", "Club 2 (N=58)", "Club 3 (N=159)", "Club 4 (N=9)", "Club 5 (N=76)")))),
  time = rep(c(1:12)),
  Attribute = c(rep("Frequency", 12*5), rep("Volume", 12*5)),
  Group = "Male")


# data females and others
mean_freq <- matrix(NA, nrow=12, ncol=5)
mean_vol <- matrix(NA, nrow=12, ncol=5)
for ( i in 1:5) {
  for ( t in 1:12) {
    mean_freq[t,i] <- mean(clubdata[[i]]$freq_run[,,t][which(!clubdata[[i]]$male==1)],na.rm=T)
    mean_vol[t,i] <- mean(clubdata[[i]]$time_run[,,t][which(!clubdata[[i]]$male==1)],na.rm=T)
  }
}

sd_freq <- matrix(NA, nrow=12, ncol=5)
sd_vol <- matrix(NA, nrow=12, ncol=5)
for ( i in 1:5) {
  for ( t in 1:12) {
    sd_freq[t,i] <- sd(clubdata[[i]]$freq_run[,,t][which(!clubdata[[i]]$male==1)],na.rm=T)
    sd_vol[t,i] <- sd(clubdata[[i]]$time_run[,,t][which(!clubdata[[i]]$male==1)],na.rm=T)
  }
}

se_freq <- matrix(NA, nrow=12, ncol=5)  
se_vol <- matrix(NA, nrow=12, ncol=5)  
for ( i in 1:5) {
  for ( t in 1:12) {
    se_freq[t,i] <- sd_freq[t,i]/sqrt(sum(!clubdata[[1]]$male==1))
    se_vol[t,i] <- sd_vol[t,i]/sqrt(sum(!clubdata[[1]]$male==1))
  }
}

data_female <- data.frame(
  mean = as.vector(c(mean_freq, mean_vol)),
  sd = as.vector(c(sd_freq, sd_vol)),
  se =  as.vector(c(se_freq, se_vol)),
  club = as.character(sort(replicate(12, c("Club 1 (N=27)", "Club 2 (N=58)", "Club 3 (N=159)", "Club 4 (N=9)", "Club 5 (N=76)")))),
  time = rep(c(1:12)),
  Attribute = c(rep("Frequency", 12*5), rep("Volume", 12*5)),
  Group = "Female and others"
)

Plotting

plot <- rbind(data_male, data_female) #, data_all)

pd <- position_dodge(width = .8) # dodge between points to prevent overlap of CIs

plot$Group <- factor(plot$Group,
                     levels = c("Male", "Female and others"))

ggplot(plot, aes(x=time, y=mean, colour=Group, #shape = Attribute,
                 group=Group)) +
  #group=interaction(Group, Attribute))) + 
  geom_point(size = 1.5, position = pd) + 
  geom_line(size = .75, position = pd) +
  geom_errorbar(aes(time, mean, ymin = mean - se, ymax = mean + se), 
                width = 0.6, position = pd) +
  labs(title="Development of running activity attribute means over time", 
       subtitle="Disaggregated by running measure (frequency and volume), club and gender") +
  scale_colour_manual(values=c("#56B4E9", "#E69F00")) +
  labs(x = "", y = "Hours per week        Times per week") +
  scale_y_continuous(breaks = seq(0, 5, by = 1)) +
  scale_x_discrete(limits=c("Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec")) +
  facet_grid(Attribute~club) +
  theme(axis.text.x = element_text(size = 8, angle = 70, vjust = -.2, hjust=-.1), 
        legend.position = "top",
        legend.box.just = "right",
        legend.direction = "horizontal",
        legend.background = element_rect(fill="lightgray", size=.5, linetype="dotted"),
        legend.title = element_text(face = "bold"),
        #legend.background = element_rect(fill ="gray90", size=.5),
        strip.text.y = element_blank())

LS0tDQp0aXRsZTogIlJlcGxpY2F0aW5nIFRhYmxlIDEiDQpkYXRlOiAiTGFzdCBjb21waWxlZCBvbiBgciBmb3JtYXQoU3lzLnRpbWUoKSwgJyVCLCAlWScpYCINCmJpYmxpb2dyYXBoeTogcmVmZXJlbmNlcy5iaWINCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDoNCiAgICBjc3M6IHR3ZWFrcy5jc3MNCiAgICB0b2M6IHRydWUNCiAgICB0b2NfZmxvYXQ6IHRydWUNCiAgICBjb2xsYXBzZWQ6IGZhbHNlDQogICAgbnVtYmVyX3NlY3Rpb25zOiBmYWxzZQ0KICAgIHRvY19kZXB0aDogMQ0KICAgIGNvZGVfZm9sZGluZzogc2hvdw0KICAgIGNvZGVfZG93bmxvYWQ6IHllcw0KLS0tDQoNCg0KYGBge3IsIGdsb2JhbHNldHRpbmdzLCBlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCByZXN1bHRzPSdoaWRlJ30NCg0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFKQ0Kb3B0c19jaHVuayRzZXQodGlkeS5vcHRzPWxpc3Qod2lkdGguY3V0b2ZmPTEwMCksdGlkeT1UUlVFLCB3YXJuaW5nID0gRkFMU0UsIG1lc3NhZ2UgPSBGQUxTRSxjb21tZW50ID0gIiM+IiwgY2FjaGU9VFJVRSwgY2xhc3Muc291cmNlPWMoInRlc3QiKSwgY2xhc3Mub3V0cHV0PWMoInRlc3QyIikpDQpvcHRpb25zKHdpZHRoID0gMTAwKQ0KcmdsOjpzZXR1cEtuaXRyKCkNCg0KDQoNCmNvbG9yaXplIDwtIGZ1bmN0aW9uKHgsIGNvbG9yKSB7c3ByaW50ZigiPHNwYW4gc3R5bGU9J2NvbG9yOiAlczsnPiVzPC9zcGFuPiIsIGNvbG9yLCB4KSB9DQoNCmBgYA0KDQpgYGB7ciBrbGlwcHksIGVjaG89RkFMU0UsIGluY2x1ZGU9VFJVRX0NCmtsaXBweTo6a2xpcHB5KHBvc2l0aW9uID0gYygndG9wJywgJ3JpZ2h0JykpDQoja2xpcHB5OjprbGlwcHkoY29sb3IgPSAnZGFya3JlZCcpDQoja2xpcHB5OjprbGlwcHkodG9vbHRpcF9tZXNzYWdlID0gJ0NsaWNrIHRvIGNvcHknLCB0b29sdGlwX3N1Y2Nlc3MgPSAnRG9uZScpDQpgYGANCg0KDQoNCi0tLQ0KDQpUaGlzIHNjcmlwdCByZXBsaWNhdGVzIEZpZ3VyZSA1IChEZXZlbG9wbWVudCBvZiB0aGUgbWVhbiBvZiBydW5uaW5nIGF0dHJpYnV0ZXMpLg0KDQo8YnI+DQoNCiMgR2V0dGluZyBzdGFydGVkDQoNCiMjIGNsZWFuIHVwDQoNCmBgYHtyLCBhdHRyLm91dHB1dD0nc3R5bGU9Im1heC1oZWlnaHQ6IDIwMHB4OyInfQ0Kcm0gKGxpc3QgPSBscyggKSkNCmBgYA0KDQo8YnI+IA0KDQojIyBjdXN0b20gZnVuY3Rpb25zDQoNCi0gYGZwYWNrYWdlLmNoZWNrYDogQ2hlY2sgaWYgcGFja2FnZXMgYXJlIGluc3RhbGxlZCAoYW5kIGluc3RhbGwgaWYgbm90KSBpbiBSIChbc291cmNlXShodHRwczovL3ZiYWxpZ2EuZ2l0aHViLmlvL3ZlcmlmeS10aGF0LXItcGFja2FnZXMtYXJlLWluc3RhbGxlZC1hbmQtbG9hZGVkLykpDQoNCmBgYHtyLCByZXN1bHRzPSdoaWRlJ30NCg0KZnBhY2thZ2UuY2hlY2sgPC0gZnVuY3Rpb24ocGFja2FnZXMpIHsNCiAgICBsYXBwbHkocGFja2FnZXMsIEZVTiA9IGZ1bmN0aW9uKHgpIHsNCiAgICAgICAgaWYgKCFyZXF1aXJlKHgsIGNoYXJhY3Rlci5vbmx5ID0gVFJVRSkpIHsNCiAgICAgICAgICAgIGluc3RhbGwucGFja2FnZXMoeCwgZGVwZW5kZW5jaWVzID0gVFJVRSkNCiAgICAgICAgICAgIGxpYnJhcnkoeCwgY2hhcmFjdGVyLm9ubHkgPSBUUlVFKQ0KICAgICAgICB9DQogICAgfSkNCn0NCmBgYA0KDQo8YnI+DQoNCg0KIyMgbmVjZXNzYXJ5IHBhY2thZ2VzDQoNCldlIGluc3RhbGwgYW5kIGxvYWQgdGhlIHBhY2thZ2VzIHdlIG5lZWQgbGF0ZXIgb246DQotIGBtb21lbnRzYDogZm9yIGNhbGN1bGF0aW5nIHN0YXRpc3RpY3MNCi0gYGRwbHlyYDogZm9yIGRhdGEgbWFuaXB1bGF0aW9uDQotIGBnZ3Bsb3QyYDogZm9yIGRhdGEgdmlzdWFsaXphdGlvbg0KDQpgYGB7ciBwYWNrYWdlcywgcmVzdWx0cz0naGlkZSd9DQpwYWNrYWdlcyA9IGMoIm1vbWVudHMiLCAiZHBseXIiLCAiZ2dwbG90MiIpDQpmcGFja2FnZS5jaGVjayhwYWNrYWdlcykNCmBgYA0KDQoNCiMjIGxvYWQgY2x1YiBkYXRhIA0KYGBge3IsIHdhcm5pbmc9RkFMU0V9DQpsb2FkKCJjbHViZGF0YS5SRGF0YSIpDQoNCmBgYA0KDQo8YnI+DQotLS0tDQoNCiMgZGF0YSB3cmFuZ2xpbmcNCg0KYGBge3J9DQoNCiMgZGF0YSBtYWxlcyAobWVhbiBydW4gZnJlcS4vdm9sLiBhbmQgbWVhbiBmcmVxLi92b2wuIG90aGVyIGFjdGl2aXRpZXM6IGN5Y2xpbmcgc3dpbW1pbmcpDQptZWFuX2ZyZXEgPC0gbWVhbl92b2wgPC0gbWF0cml4KE5BLCBucm93PTEyLCBuY29sPTUpDQpmb3IgKCBpIGluIDE6NSkgew0KICBmb3IgKCB0IGluIDE6MTIpIHsNCiAgICBtZWFuX2ZyZXFbdCxpXSA8LSBtZWFuKGNsdWJkYXRhW1tpXV0kZnJlcV9ydW5bLCx0XVt3aGljaChjbHViZGF0YVtbaV1dJG1hbGU9PTEpXSwgbmEucm09VCkNCiAgICBtZWFuX3ZvbFt0LGldIDwtIG1lYW4oY2x1YmRhdGFbW2ldXSR0aW1lX3J1blssLHRdW3doaWNoKGNsdWJkYXRhW1tpXV0kbWFsZT09MSldLCBuYS5ybT1UKQ0KICB9DQp9DQoNCnNkX2ZyZXEgPC0gc2Rfdm9sIDwtIG1hdHJpeChOQSwgbnJvdz0xMiwgbmNvbD01KQ0KZm9yICggaSBpbiAxOjUpIHsNCiAgZm9yICggdCBpbiAxOjEyKSB7DQogICAgc2RfZnJlcVt0LGldIDwtIHNkKGNsdWJkYXRhW1tpXV0kZnJlcV9ydW5bLCx0XVt3aGljaChjbHViZGF0YVtbaV1dJG1hbGU9PTEpXSwgbmEucm09VCkNCiAgICBzZF92b2xbdCxpXSA8LSBzZChjbHViZGF0YVtbaV1dJHRpbWVfcnVuWywsdF1bd2hpY2goY2x1YmRhdGFbW2ldXSRtYWxlPT0xKV0sIG5hLnJtPVQpDQogIH0NCn0NCg0Kc2VfZnJlcSA8LSBzZV92b2wgPC0gbWF0cml4KE5BLCBucm93PTEyLCBuY29sPTUpIA0KZm9yICggaSBpbiAxOjUpIHsNCiAgZm9yICggdCBpbiAxOjEyKSB7DQogICAgc2VfZnJlcVt0LGldIDwtIHNkX2ZyZXFbdCxpXS9zcXJ0KHN1bShjbHViZGF0YVtbaV1dJG1hbGU9PTEpKQ0KICAgIHNlX3ZvbFt0LGldIDwtIHNkX3ZvbFt0LGldL3NxcnQoc3VtKGNsdWJkYXRhW1tpXV0kbWFsZT09MSkpDQogIH0NCn0NCg0KZGF0YV9tYWxlIDwtIGRhdGEuZnJhbWUoDQogIG1lYW4gPSBhcy52ZWN0b3IoYyhtZWFuX2ZyZXEsIG1lYW5fdm9sKSksDQogIHNkID0gYXMudmVjdG9yKGMoc2RfZnJlcSwgc2Rfdm9sKSksDQogIHNlID0gIGFzLnZlY3RvcihjKHNlX2ZyZXEsIHNlX3ZvbCkpLA0KICBjbHViID0gYXMuY2hhcmFjdGVyKHNvcnQocmVwbGljYXRlKDEyLCBjKCJDbHViIDEgKE49MjcpIiwgIkNsdWIgMiAoTj01OCkiLCAiQ2x1YiAzIChOPTE1OSkiLCAiQ2x1YiA0IChOPTkpIiwgIkNsdWIgNSAoTj03NikiKSkpKSwNCiAgdGltZSA9IHJlcChjKDE6MTIpKSwNCiAgQXR0cmlidXRlID0gYyhyZXAoIkZyZXF1ZW5jeSIsIDEyKjUpLCByZXAoIlZvbHVtZSIsIDEyKjUpKSwNCiAgR3JvdXAgPSAiTWFsZSIpDQoNCg0KIyBkYXRhIGZlbWFsZXMgYW5kIG90aGVycw0KbWVhbl9mcmVxIDwtIG1hdHJpeChOQSwgbnJvdz0xMiwgbmNvbD01KQ0KbWVhbl92b2wgPC0gbWF0cml4KE5BLCBucm93PTEyLCBuY29sPTUpDQpmb3IgKCBpIGluIDE6NSkgew0KICBmb3IgKCB0IGluIDE6MTIpIHsNCiAgICBtZWFuX2ZyZXFbdCxpXSA8LSBtZWFuKGNsdWJkYXRhW1tpXV0kZnJlcV9ydW5bLCx0XVt3aGljaCghY2x1YmRhdGFbW2ldXSRtYWxlPT0xKV0sbmEucm09VCkNCiAgICBtZWFuX3ZvbFt0LGldIDwtIG1lYW4oY2x1YmRhdGFbW2ldXSR0aW1lX3J1blssLHRdW3doaWNoKCFjbHViZGF0YVtbaV1dJG1hbGU9PTEpXSxuYS5ybT1UKQ0KICB9DQp9DQoNCnNkX2ZyZXEgPC0gbWF0cml4KE5BLCBucm93PTEyLCBuY29sPTUpDQpzZF92b2wgPC0gbWF0cml4KE5BLCBucm93PTEyLCBuY29sPTUpDQpmb3IgKCBpIGluIDE6NSkgew0KICBmb3IgKCB0IGluIDE6MTIpIHsNCiAgICBzZF9mcmVxW3QsaV0gPC0gc2QoY2x1YmRhdGFbW2ldXSRmcmVxX3J1blssLHRdW3doaWNoKCFjbHViZGF0YVtbaV1dJG1hbGU9PTEpXSxuYS5ybT1UKQ0KICAgIHNkX3ZvbFt0LGldIDwtIHNkKGNsdWJkYXRhW1tpXV0kdGltZV9ydW5bLCx0XVt3aGljaCghY2x1YmRhdGFbW2ldXSRtYWxlPT0xKV0sbmEucm09VCkNCiAgfQ0KfQ0KDQpzZV9mcmVxIDwtIG1hdHJpeChOQSwgbnJvdz0xMiwgbmNvbD01KSAgDQpzZV92b2wgPC0gbWF0cml4KE5BLCBucm93PTEyLCBuY29sPTUpICANCmZvciAoIGkgaW4gMTo1KSB7DQogIGZvciAoIHQgaW4gMToxMikgew0KICAgIHNlX2ZyZXFbdCxpXSA8LSBzZF9mcmVxW3QsaV0vc3FydChzdW0oIWNsdWJkYXRhW1sxXV0kbWFsZT09MSkpDQogICAgc2Vfdm9sW3QsaV0gPC0gc2Rfdm9sW3QsaV0vc3FydChzdW0oIWNsdWJkYXRhW1sxXV0kbWFsZT09MSkpDQogIH0NCn0NCg0KZGF0YV9mZW1hbGUgPC0gZGF0YS5mcmFtZSgNCiAgbWVhbiA9IGFzLnZlY3RvcihjKG1lYW5fZnJlcSwgbWVhbl92b2wpKSwNCiAgc2QgPSBhcy52ZWN0b3IoYyhzZF9mcmVxLCBzZF92b2wpKSwNCiAgc2UgPSAgYXMudmVjdG9yKGMoc2VfZnJlcSwgc2Vfdm9sKSksDQogIGNsdWIgPSBhcy5jaGFyYWN0ZXIoc29ydChyZXBsaWNhdGUoMTIsIGMoIkNsdWIgMSAoTj0yNykiLCAiQ2x1YiAyIChOPTU4KSIsICJDbHViIDMgKE49MTU5KSIsICJDbHViIDQgKE49OSkiLCAiQ2x1YiA1IChOPTc2KSIpKSkpLA0KICB0aW1lID0gcmVwKGMoMToxMikpLA0KICBBdHRyaWJ1dGUgPSBjKHJlcCgiRnJlcXVlbmN5IiwgMTIqNSksIHJlcCgiVm9sdW1lIiwgMTIqNSkpLA0KICBHcm91cCA9ICJGZW1hbGUgYW5kIG90aGVycyINCikNCmBgYA0KDQotLS0tDQoNCiMgUGxvdHRpbmcNCmBgYHtyfQ0KcGxvdCA8LSByYmluZChkYXRhX21hbGUsIGRhdGFfZmVtYWxlKSAjLCBkYXRhX2FsbCkNCg0KcGQgPC0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAuOCkgIyBkb2RnZSBiZXR3ZWVuIHBvaW50cyB0byBwcmV2ZW50IG92ZXJsYXAgb2YgQ0lzDQoNCnBsb3QkR3JvdXAgPC0gZmFjdG9yKHBsb3QkR3JvdXAsDQogICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCJNYWxlIiwgIkZlbWFsZSBhbmQgb3RoZXJzIikpDQoNCmdncGxvdChwbG90LCBhZXMoeD10aW1lLCB5PW1lYW4sIGNvbG91cj1Hcm91cCwgI3NoYXBlID0gQXR0cmlidXRlLA0KICAgICAgICAgICAgICAgICBncm91cD1Hcm91cCkpICsNCiAgI2dyb3VwPWludGVyYWN0aW9uKEdyb3VwLCBBdHRyaWJ1dGUpKSkgKyANCiAgZ2VvbV9wb2ludChzaXplID0gMS41LCBwb3NpdGlvbiA9IHBkKSArIA0KICBnZW9tX2xpbmUoc2l6ZSA9IC43NSwgcG9zaXRpb24gPSBwZCkgKw0KICBnZW9tX2Vycm9yYmFyKGFlcyh0aW1lLCBtZWFuLCB5bWluID0gbWVhbiAtIHNlLCB5bWF4ID0gbWVhbiArIHNlKSwgDQogICAgICAgICAgICAgICAgd2lkdGggPSAwLjYsIHBvc2l0aW9uID0gcGQpICsNCiAgbGFicyh0aXRsZT0iRGV2ZWxvcG1lbnQgb2YgcnVubmluZyBhY3Rpdml0eSBhdHRyaWJ1dGUgbWVhbnMgb3ZlciB0aW1lIiwgDQogICAgICAgc3VidGl0bGU9IkRpc2FnZ3JlZ2F0ZWQgYnkgcnVubmluZyBtZWFzdXJlIChmcmVxdWVuY3kgYW5kIHZvbHVtZSksIGNsdWIgYW5kIGdlbmRlciIpICsNCiAgc2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXM9YygiIzU2QjRFOSIsICIjRTY5RjAwIikpICsNCiAgbGFicyh4ID0gIiIsIHkgPSAiSG91cnMgcGVyIHdlZWsgICAgICAgIFRpbWVzIHBlciB3ZWVrIikgKw0KICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDAsIDUsIGJ5ID0gMSkpICsNCiAgc2NhbGVfeF9kaXNjcmV0ZShsaW1pdHM9YygiSmFuIiwgIkZlYiIsICJNYXIiLCAiQXByIiwgIk1heSIsICJKdW4iLCAiSnVsIiwgIkF1ZyIsICJTZXAiLCAiT2N0IiwgIk5vdiIsICJEZWMiKSkgKw0KICBmYWNldF9ncmlkKEF0dHJpYnV0ZX5jbHViKSArDQogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSA4LCBhbmdsZSA9IDcwLCB2anVzdCA9IC0uMiwgaGp1c3Q9LS4xKSwgDQogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJ0b3AiLA0KICAgICAgICBsZWdlbmQuYm94Lmp1c3QgPSAicmlnaHQiLA0KICAgICAgICBsZWdlbmQuZGlyZWN0aW9uID0gImhvcml6b250YWwiLA0KICAgICAgICBsZWdlbmQuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsPSJsaWdodGdyYXkiLCBzaXplPS41LCBsaW5ldHlwZT0iZG90dGVkIiksDQogICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChmYWNlID0gImJvbGQiKSwNCiAgICAgICAgI2xlZ2VuZC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSJncmF5OTAiLCBzaXplPS41KSwNCiAgICAgICAgc3RyaXAudGV4dC55ID0gZWxlbWVudF9ibGFuaygpKQ0KYGBgDQoNCg0KDQoNCg0K


Copyright © 2021 Rob Franken