This document demonstrates how you can do meta-analyses on randomised controlled trails using the {meta}, {metafor},{dmetar} packages in R. Further documentation for the packages can be found in Harrer et al.

Study details can be found her:

PROSPERO: https://www.crd.york.ac.uk/prospero/display_record.php?RecordID=64681

Final publication:
Liljehult J, Christensen T, Molsted S, Overgaard D, Mesot Liljehult M, Møller T. Effect and efficacy of lifestyle interventions as secondary prevention. Acta Neurol Scand. 2020 Oct;142(4):299-313. doi: 10.1111/ane.13308. Epub 2020 Jul 15. PMID: 32620044; PMCID: PMC7540464.
https://PubMed.ncbi.nlm.nih.gov/32620044/ or
https://www.ncbi.nlm.nih.gov/pmc/articles/PMC7540464/

Litteratur:
Harrer, M., Cuijpers, P., Furukawa, T.A., & Ebert, D.D. (2021). Doing Meta-Analysis with R: A Hands-On Guide. Boca Raton, FL and London: Chapmann & Hall/CRC Press. ISBN 978-0-367-61007-4. https://bookdown.org/MathiasHarrer/Doing_Meta_Analysis_in_R/

Following libraries are used:
{dplyr}, {meta}, {metafor}, {dmetar}, {robvis}, {ggplot2}

library(dplyr)
library(meta)
library(metafor)
library(dmetar)
library(robvis)
library(ggplot2)

1 Vital signs

1.1 Systolic Blood Pressure

Meta-analysis of the effect of behavioural interventions on systolic blood pressure on patients with stroke or TIA

behavMeta <- data.frame(
  #Systolic blood pressure
  domain = rep("SBP",14),
  author = c("Adie et al 2010", "Barker-Collo et al 2015", "Boss et al 2014", 
             "Chanruengvanich et al 2006", "Cheng et al 2018", "Faulkner et al 2014","Holzemer et al 2011", 
             "Hornnes et al 2011", "Irewall et al 2015", "Joubert et al 2006", 
             "Joubert et al 2006", "Kirk et al 2014", "Kono et al 2013", "McManus et al 2009"),
  n.e = c(29,172,10,31,204,30,12,145,241,35,91,12,35,49),
  est.e = c(142,137.41,120,141.19,132.3,129,138.7,139.4,131.9,132.34,128.5,131.92,122.1,143),
  sd.e = c(19.3,18.79,12.6,16.77,20.5,12,31,21.3,15.7,0,13.7,15.2,15.9,18.8),
  n.c = c(27,172,10,31,200,30,15,158,243,45,95,12,35,53),
  est.c = c(142.4,138.42,127,137.94,136.1,138,144.7,142.4,135,136.58,134.5,131.92,138.9,139),
  sd.c = c(17.2,17.69,21.3,22.74,20.8,15,30.2,22.2,17.5,0,19.4,18.1,13.8,21.6),
  year = c(2010,2015,2014,2006,2018,2014,2011,2011,2015,2006,2009,2014,2013,2009),
  recruitment = factor(c(2,2,1,9,3,2,1,9,2,1,1,2,1,3), 
                       levels = c(1,2,3,9), labels = c("Early","Medium","Late","Unclear")),
  intlength = factor(c(2,2,1,1,3,1,1,2,3,3,3,1,2,2), 
                  levels = c(1,2,3), labels = c("Short","Medium","Long")),
  training = factor(c(2,2,1,2,2,1,2,2,2,2,2,1,1,2), 
                    levels = c(1,2), labels = c("Yes","No")),
  theory = factor(c(1,1,1,1,1,1,1,2,2,2,2,2,2,2), 
                    levels = c(1,2), labels = c("Yes","No")),
  support = factor(c(2,2,2,1,2,2,2,2,2,1,1,2,2,2), 
                    levels = c(1,2), labels = c("Yes","No")),
  population = factor(c(1,3,1,1,2,1,3,2,2,2,2,1,1,3), levels = c(1,2,3), labels = c("Minor/TIA","All","Unknown"))
)
behavMeta

1.1.1 Overall meta-analysis

m.behav.sbp <- behavMeta %>% 
    filter(domain == "SBP") %>% 
    metacont(n.e = n.e,
                   mean.e = est.e,
                   sd.e = sd.e,
                   n.c = n.c,
                   mean.c = est.c,
                   sd.c = sd.c,
                   studlab = author,
                   #data = behavMeta,
                   sm = "MD",
                   method.smd = "Hedges",
                   comb.fixed = FALSE,
                   comb.random = TRUE,
                   method.tau = "REML",
                   hakn = F,
                   title = "Systolic Blood Pressure")
Warning in metacont(., n.e = n.e, mean.e = est.e, sd.e = sd.e, n.c = n.c,  :
  Note, studies with non-positive values for sd.e or sd.c get no weight in meta-analysis.
m.behav.sbp
Review:     Systolic Blood Pressure

                                 MD              95%-CI %W(random)
Adie et al 2010             -0.4000 [ -9.9620;  9.1620]        5.7
Barker-Collo et al 2015     -1.0100 [ -4.8667;  2.8467]       11.9
Boss et al 2014             -7.0000 [-22.3385;  8.3385]        2.9
Chanruengvanich et al 2006   3.2500 [ -6.6963; 13.1963]        5.4
Cheng et al 2018            -3.8000 [ -7.8278;  0.2278]       11.7
Faulkner et al 2014         -9.0000 [-15.8739; -2.1261]        8.1
Holzemer et al 2011         -6.0000 [-29.2639; 17.2639]        1.4
Hornnes et al 2011          -3.0000 [ -7.8992;  1.8992]       10.5
Irewall et al 2015          -3.1000 [ -6.0615; -0.1385]       13.0
Joubert et al 2006          -4.2400                            0.0
Joubert et al 2006          -6.0000 [-10.8106; -1.1894]       10.6
Kirk et al 2014              0.0000 [-13.3730; 13.3730]        3.6
Kono et al 2013            -16.8000 [-23.7749; -9.8251]        8.0
McManus et al 2009           4.0000 [ -3.8438; 11.8438]        7.1

Number of studies combined: k = 13
Number of observations: o = 2222

                          MD             95%-CI     z p-value
Random effects model -3.8489 [-6.7383; -0.9596] -2.61  0.0090

Quantifying heterogeneity:
 tau^2 = 14.4022 [0.9895; 64.6695]; tau = 3.7950 [0.9947; 8.0417]
 I^2 = 52.7% [11.1%; 74.8%]; H = 1.45 [1.06; 1.99]

Test of heterogeneity:
     Q d.f. p-value
 25.36   12  0.0132

Details on meta-analytical method:
- Inverse variance method
- Restricted maximum-likelihood estimator for tau^2
- Q-profile method for confidence interval of tau^2 and tau

The warning means that a study (Joubert et al 2006) has been omitted from the meta-analysis because no SD was stated. A mean difference has been calculated, but no confidence interval, and the study is not included in the random effects model (weight = 0%).

Forest plot

forest.meta(m.behav.sbp, # Model to be plotted
            sortvar = author, # The studies are sorted alphabetically by author
            predict = FALSE, # Prediction interval is omitted from the plot
            print.tau2 = FALSE, # Tau is omitted from the text
            colgap = "3mm", # Regulates the space between the columns 
            leftlabs = # Column labels
              c("Study", "mean","SD", "n","mean","SD","n","Weight","MD","95%CI"),
            leftcols = # Defines the content of the columns on the left
              c("studlab","est.e","sd.e","n.e","est.c","sd.c","n.c","w.random","TE","ci"),
            digits.sd = 2, # Number of digits after SD, default is 4
            col.square = "blue", # Colour of the squares
            col.square.lines = "blue", # Colour of the square lines
            col.diamond = "black", # Colour of the summary diamond
            layout = "RevMan5" # Using the Review Manager 5 layout 
            )

#' Note: In markdown the forest plot is not re-sized to fit the window and in most 
#' cases the sides will be cut off. This can be prevented by forcing the size of the 
#' plot by adding fig.width and fig.height arguments to the chuck code.

1.2 Subgroup analyses

Sub-group analysis is done by making an updated model and adding a strata variable with the argument {byvar}. The strata variable must be a factor variable for this to work and adding labels is highly recommended.

1.2.1 Strata: Study population

m.behav.sbp2 <- update.meta(m.behav.sbp, # name of model
            byvar = population, # stratifying variable
            tau.common = FALSE)
m.behav.sbp2
Review:     Systolic Blood Pressure

                                 MD              95%-CI %W(random) population
Adie et al 2010             -0.4000 [ -9.9620;  9.1620]        5.7  Minor/TIA
Barker-Collo et al 2015     -1.0100 [ -4.8667;  2.8467]       11.9    Unknown
Boss et al 2014             -7.0000 [-22.3385;  8.3385]        2.9  Minor/TIA
Chanruengvanich et al 2006   3.2500 [ -6.6963; 13.1963]        5.4  Minor/TIA
Cheng et al 2018            -3.8000 [ -7.8278;  0.2278]       11.7        All
Faulkner et al 2014         -9.0000 [-15.8739; -2.1261]        8.1  Minor/TIA
Holzemer et al 2011         -6.0000 [-29.2639; 17.2639]        1.4    Unknown
Hornnes et al 2011          -3.0000 [ -7.8992;  1.8992]       10.5        All
Irewall et al 2015          -3.1000 [ -6.0615; -0.1385]       13.0        All
Joubert et al 2006          -4.2400                            0.0        All
Joubert et al 2006          -6.0000 [-10.8106; -1.1894]       10.6        All
Kirk et al 2014              0.0000 [-13.3730; 13.3730]        3.6  Minor/TIA
Kono et al 2013            -16.8000 [-23.7749; -9.8251]        8.0  Minor/TIA
McManus et al 2009           4.0000 [ -3.8438; 11.8438]        7.1    Unknown

Number of studies combined: k = 13
Number of observations: o = 2222

                          MD             95%-CI     z p-value
Random effects model -3.8489 [-6.7383; -0.9596] -2.61  0.0090

Quantifying heterogeneity:
 tau^2 = 14.4022 [0.9895; 64.6695]; tau = 3.7950 [0.9947; 8.0417]
 I^2 = 52.7% [11.1%; 74.8%]; H = 1.45 [1.06; 1.99]

Test of heterogeneity:
     Q d.f. p-value
 25.36   12  0.0132

Results for subgroups (random effects model):
                         k      MD              95%-CI   tau^2    tau     Q   I^2
population = Minor/TIA   6 -5.6853 [-12.3393;  0.9686] 42.6628 6.5317 14.83 66.3%
population = All         4 -3.7306 [ -5.6898; -1.7715]       0      0  1.12  0.0%
population = Unknown     3 -0.1154 [ -3.6853;  3.4545]  0.4110 0.6411  1.51  0.0%

Test for subgroup differences (random effects model):
                    Q d.f. p-value
Between groups   3.66    2  0.1603

Details on meta-analytical method:
- Inverse variance method
- Restricted maximum-likelihood estimator for tau^2
- Q-profile method for confidence interval of tau^2 and tau

Forest plot

#' Drawing a forest plot from a sub-group model
forest.sbp2 <- forest.meta(m.behav.sbp2, 
            sortvar = population,
            colgap = "3mm", digits.sd = 2,
            predict = FALSE, 
            print.tau2 = FALSE,
            leftlabs = c("Author","mean","SD", "n","mean","SD","n","Weight","MD","95%CI"),
            leftcols = c("studlab","est.e","sd.e","n.e","est.c","sd.c","n.c","w.random","effect","ci"),
            col.square = "blue", col.square.lines = "blue",
            col.diamond = "black",
            layout = "RevMan5"
            )

1.2.2 Strata: Recruitment

m.behav.sbp.recriut <- update.meta(m.behav.sbp, # name of model
            byvar = recruitment, # stratifying variable
            tau.common = FALSE)
m.behav.sbp.recriut
Review:     Systolic Blood Pressure

                                 MD              95%-CI %W(random) recruitment
Adie et al 2010             -0.4000 [ -9.9620;  9.1620]        5.7      Medium
Barker-Collo et al 2015     -1.0100 [ -4.8667;  2.8467]       11.9      Medium
Boss et al 2014             -7.0000 [-22.3385;  8.3385]        2.9       Early
Chanruengvanich et al 2006   3.2500 [ -6.6963; 13.1963]        5.4     Unclear
Cheng et al 2018            -3.8000 [ -7.8278;  0.2278]       11.7        Late
Faulkner et al 2014         -9.0000 [-15.8739; -2.1261]        8.1      Medium
Holzemer et al 2011         -6.0000 [-29.2639; 17.2639]        1.4       Early
Hornnes et al 2011          -3.0000 [ -7.8992;  1.8992]       10.5     Unclear
Irewall et al 2015          -3.1000 [ -6.0615; -0.1385]       13.0      Medium
Joubert et al 2006          -4.2400                            0.0       Early
Joubert et al 2006          -6.0000 [-10.8106; -1.1894]       10.6       Early
Kirk et al 2014              0.0000 [-13.3730; 13.3730]        3.6      Medium
Kono et al 2013            -16.8000 [-23.7749; -9.8251]        8.0       Early
McManus et al 2009           4.0000 [ -3.8438; 11.8438]        7.1        Late

Number of studies combined: k = 13
Number of observations: o = 2222

                          MD             95%-CI     z p-value
Random effects model -3.8489 [-6.7383; -0.9596] -2.61  0.0090

Quantifying heterogeneity:
 tau^2 = 14.4022 [0.9895; 64.6695]; tau = 3.7950 [0.9947; 8.0417]
 I^2 = 52.7% [11.1%; 74.8%]; H = 1.45 [1.06; 1.99]

Test of heterogeneity:
     Q d.f. p-value
 25.36   12  0.0132

Results for subgroups (random effects model):
                        k      MD              95%-CI   tau^2    tau    Q   I^2
recruitment = Early     4 -9.9053 [-16.9802; -2.8303] 24.8239 4.9824 6.41 53.2%
recruitment = Medium    5 -2.8145 [ -4.9517; -0.6774]       0      0 4.40  9.1%
recruitment = Late      2 -0.6560 [ -8.1548;  6.8429] 20.3003 4.5056 3.01 66.7%
recruitment = Unclear   2 -1.4354 [ -6.7421;  3.8713]  3.5307 1.8790 1.22 18.1%

Test for subgroup differences (random effects model):
                    Q d.f. p-value
Between groups   4.40    3  0.2216

Details on meta-analytical method:
- Inverse variance method
- Restricted maximum-likelihood estimator for tau^2
- Q-profile method for confidence interval of tau^2 and tau
forest.meta(m.behav.sbp.recriut, 
            sortvar = recruitment,
            colgap = "3mm",
            predict = FALSE, 
            print.tau2 = FALSE,
            leftlabs = c("Author","mean","SD", "n","mean","SD","n","Weight","MD","95%CI"),
            leftcols = c("studlab","est.e","sd.e","n.e","est.c","sd.c","n.c","w.random","effect","ci"),
            col.square = "blue", col.square.lines = "blue",
            col.diamond = "black",
            layout = "RevMan5")

1.2.3 Strata: Length of the intervention

m.behav.sbp.length <- update.meta(m.behav.sbp, # name of model
            byvar = intlength, # stratifying variable
            tau.common = FALSE)
m.behav.sbp.length
Review:     Systolic Blood Pressure

                                 MD              95%-CI %W(random) intlength
Adie et al 2010             -0.4000 [ -9.9620;  9.1620]        5.7    Medium
Barker-Collo et al 2015     -1.0100 [ -4.8667;  2.8467]       11.9    Medium
Boss et al 2014             -7.0000 [-22.3385;  8.3385]        2.9     Short
Chanruengvanich et al 2006   3.2500 [ -6.6963; 13.1963]        5.4     Short
Cheng et al 2018            -3.8000 [ -7.8278;  0.2278]       11.7      Long
Faulkner et al 2014         -9.0000 [-15.8739; -2.1261]        8.1     Short
Holzemer et al 2011         -6.0000 [-29.2639; 17.2639]        1.4     Short
Hornnes et al 2011          -3.0000 [ -7.8992;  1.8992]       10.5    Medium
Irewall et al 2015          -3.1000 [ -6.0615; -0.1385]       13.0      Long
Joubert et al 2006          -4.2400                            0.0      Long
Joubert et al 2006          -6.0000 [-10.8106; -1.1894]       10.6      Long
Kirk et al 2014              0.0000 [-13.3730; 13.3730]        3.6     Short
Kono et al 2013            -16.8000 [-23.7749; -9.8251]        8.0    Medium
McManus et al 2009           4.0000 [ -3.8438; 11.8438]        7.1    Medium

Number of studies combined: k = 13
Number of observations: o = 2222

                          MD             95%-CI     t p-value
Random effects model -3.8489 [-7.0505; -0.6473] -2.62  0.0224

Quantifying heterogeneity:
 tau^2 = 14.4022 [0.9895; 64.6695]; tau = 3.7950 [0.9947; 8.0417]
 I^2 = 52.7% [11.1%; 74.8%]; H = 1.45 [1.06; 1.99]

Test of heterogeneity:
     Q d.f. p-value
 25.36   12  0.0132

Results for subgroups (random effects model):
                     k      MD              95%-CI   tau^2    tau     Q   I^2
intlength = Short    5 -3.9265 [-11.1294;  3.2764] 14.7935 3.8462  4.53 11.7%
intlength = Medium   5 -3.5206 [-13.1754;  6.1341] 47.3062 6.8780 19.40 79.4%
intlength = Long     3 -3.8697 [ -7.2108; -0.5286]       0      0  1.01  0.0%

Test for subgroup differences (random effects model):
                    Q d.f. p-value
Between groups   0.01    2  0.9948

Details on meta-analytical method:
- Inverse variance method
- Restricted maximum-likelihood estimator for tau^2
- Q-profile method for confidence interval of tau^2 and tau
- Hartung-Knapp adjustment for random effects model
forest.meta(m.behav.sbp.length, 
            sortvar = intlength,
            colgap = "3mm",
            predict = FALSE, 
            print.tau2 = FALSE,
            leftlabs = c("Author","mean","SD", "n","mean","SD","n","Weight","MD","95%CI"),
            leftcols = c("studlab","est.e","sd.e","n.e","est.c","sd.c","n.c","w.random","effect","ci"),
            col.square = "blue", col.square.lines = "blue",
            col.diamond = "black",
            layout = "RevMan5")

1.2.4 Strata: Physical training included in the intervention

m.behav.sbp.training <- update.meta(m.behav.sbp, # name of model
            byvar = training, # stratifying variable
            tau.common = FALSE)
m.behav.sbp.training
Review:     Systolic Blood Pressure

                                 MD              95%-CI %W(random) training
Adie et al 2010             -0.4000 [ -9.9620;  9.1620]        5.7       No
Barker-Collo et al 2015     -1.0100 [ -4.8667;  2.8467]       11.9       No
Boss et al 2014             -7.0000 [-22.3385;  8.3385]        2.9      Yes
Chanruengvanich et al 2006   3.2500 [ -6.6963; 13.1963]        5.4       No
Cheng et al 2018            -3.8000 [ -7.8278;  0.2278]       11.7       No
Faulkner et al 2014         -9.0000 [-15.8739; -2.1261]        8.1      Yes
Holzemer et al 2011         -6.0000 [-29.2639; 17.2639]        1.4       No
Hornnes et al 2011          -3.0000 [ -7.8992;  1.8992]       10.5       No
Irewall et al 2015          -3.1000 [ -6.0615; -0.1385]       13.0       No
Joubert et al 2006          -4.2400                            0.0       No
Joubert et al 2006          -6.0000 [-10.8106; -1.1894]       10.6       No
Kirk et al 2014              0.0000 [-13.3730; 13.3730]        3.6      Yes
Kono et al 2013            -16.8000 [-23.7749; -9.8251]        8.0      Yes
McManus et al 2009           4.0000 [ -3.8438; 11.8438]        7.1       No

Number of studies combined: k = 13
Number of observations: o = 2222

                          MD             95%-CI     t p-value
Random effects model -3.8489 [-7.0505; -0.6473] -2.62  0.0224

Quantifying heterogeneity:
 tau^2 = 14.4022 [0.9895; 64.6695]; tau = 3.7950 [0.9947; 8.0417]
 I^2 = 52.7% [11.1%; 74.8%]; H = 1.45 [1.06; 1.99]

Test of heterogeneity:
     Q d.f. p-value
 25.36   12  0.0132

Results for subgroups (random effects model):
                 k      MD              95%-CI   tau^2    tau    Q   I^2
training = Yes   4 -9.7748 [-20.6051;  1.0556] 23.6442 4.8625 5.84 48.6%
training = No    9 -2.6095 [ -4.4753; -0.7437]       0      0 7.38  0.0%

Test for subgroup differences (random effects model):
                    Q d.f. p-value
Between groups   4.20    1  0.0405

Details on meta-analytical method:
- Inverse variance method
- Restricted maximum-likelihood estimator for tau^2
- Q-profile method for confidence interval of tau^2 and tau
- Hartung-Knapp adjustment for random effects model
forest.meta(m.behav.sbp.training, 
            sortvar = training,
            colgap = "3mm",
            predict = FALSE, 
            print.tau2 = FALSE,
            leftlabs = c("Author","mean","SD", "n","mean","SD","n","Weight","MD","95%CI"),
            leftcols = c("studlab","est.e","sd.e","n.e","est.c","sd.c","n.c","w.random","effect","ci"),
            col.square = "blue", col.square.lines = "blue",
            col.diamond = "black",
            layout = "RevMan5")

1.2.5 Strata: Theory based intervention

m.behav.sbp.theory <- update.meta(m.behav.sbp, # name of model
            byvar = theory, # stratifying variable
            tau.common = FALSE)
m.behav.sbp.theory
Review:     Systolic Blood Pressure

                                 MD              95%-CI %W(random) theory
Adie et al 2010             -0.4000 [ -9.9620;  9.1620]        5.7    Yes
Barker-Collo et al 2015     -1.0100 [ -4.8667;  2.8467]       11.9    Yes
Boss et al 2014             -7.0000 [-22.3385;  8.3385]        2.9    Yes
Chanruengvanich et al 2006   3.2500 [ -6.6963; 13.1963]        5.4    Yes
Cheng et al 2018            -3.8000 [ -7.8278;  0.2278]       11.7    Yes
Faulkner et al 2014         -9.0000 [-15.8739; -2.1261]        8.1    Yes
Holzemer et al 2011         -6.0000 [-29.2639; 17.2639]        1.4    Yes
Hornnes et al 2011          -3.0000 [ -7.8992;  1.8992]       10.5     No
Irewall et al 2015          -3.1000 [ -6.0615; -0.1385]       13.0     No
Joubert et al 2006          -4.2400                            0.0     No
Joubert et al 2006          -6.0000 [-10.8106; -1.1894]       10.6     No
Kirk et al 2014              0.0000 [-13.3730; 13.3730]        3.6     No
Kono et al 2013            -16.8000 [-23.7749; -9.8251]        8.0     No
McManus et al 2009           4.0000 [ -3.8438; 11.8438]        7.1     No

Number of studies combined: k = 13
Number of observations: o = 2222

                          MD             95%-CI     z p-value
Random effects model -3.8489 [-6.7383; -0.9596] -2.61  0.0090

Quantifying heterogeneity:
 tau^2 = 14.4022 [0.9895; 64.6695]; tau = 3.7950 [0.9947; 8.0417]
 I^2 = 52.7% [11.1%; 74.8%]; H = 1.45 [1.06; 1.99]

Test of heterogeneity:
     Q d.f. p-value
 25.36   12  0.0132

Results for subgroups (random effects model):
               k      MD             95%-CI   tau^2    tau     Q   I^2
theory = Yes   7 -2.9330 [-5.6982; -0.1679]  1.9386 1.3923  6.21  3.4%
theory = No    6 -4.5002 [-9.8356;  0.8352] 32.8014 5.7273 18.41 72.8%

Test for subgroup differences (random effects model):
                    Q d.f. p-value
Between groups   0.26    1  0.6093

Details on meta-analytical method:
- Inverse variance method
- Restricted maximum-likelihood estimator for tau^2
- Q-profile method for confidence interval of tau^2 and tau
#' Drawing a forest plot from a sub-group model
forest.meta(m.behav.sbp.theory, 
            sortvar = population,
            colgap = "3mm", digits.sd = 2,
            predict = FALSE, 
            print.tau2 = FALSE,
            leftlabs = c("Author","mean","SD", "n","mean","SD","n","Weight","MD","95%CI"),
            leftcols = c("studlab","est.e","sd.e","n.e","est.c","sd.c","n.c","w.random","effect","ci"),
            col.square = "blue", col.square.lines = "blue",
            col.diamond = "black",
            layout = "RevMan5"
            )

1.2.6 Strata: Social support part of the intervention

m.behav.sbp.support <- update.meta(m.behav.sbp, # name of model
            byvar = support, # stratifying variable
            tau.common = FALSE)
m.behav.sbp.support
Review:     Systolic Blood Pressure

                                 MD              95%-CI %W(random) support
Adie et al 2010             -0.4000 [ -9.9620;  9.1620]        5.7      No
Barker-Collo et al 2015     -1.0100 [ -4.8667;  2.8467]       11.9      No
Boss et al 2014             -7.0000 [-22.3385;  8.3385]        2.9      No
Chanruengvanich et al 2006   3.2500 [ -6.6963; 13.1963]        5.4     Yes
Cheng et al 2018            -3.8000 [ -7.8278;  0.2278]       11.7      No
Faulkner et al 2014         -9.0000 [-15.8739; -2.1261]        8.1      No
Holzemer et al 2011         -6.0000 [-29.2639; 17.2639]        1.4      No
Hornnes et al 2011          -3.0000 [ -7.8992;  1.8992]       10.5      No
Irewall et al 2015          -3.1000 [ -6.0615; -0.1385]       13.0      No
Joubert et al 2006          -4.2400                            0.0     Yes
Joubert et al 2006          -6.0000 [-10.8106; -1.1894]       10.6     Yes
Kirk et al 2014              0.0000 [-13.3730; 13.3730]        3.6      No
Kono et al 2013            -16.8000 [-23.7749; -9.8251]        8.0      No
McManus et al 2009           4.0000 [ -3.8438; 11.8438]        7.1      No

Number of studies combined: k = 13
Number of observations: o = 2222

                          MD             95%-CI     z p-value
Random effects model -3.8489 [-6.7383; -0.9596] -2.61  0.0090

Quantifying heterogeneity:
 tau^2 = 14.4022 [0.9895; 64.6695]; tau = 3.7950 [0.9947; 8.0417]
 I^2 = 52.7% [11.1%; 74.8%]; H = 1.45 [1.06; 1.99]

Test of heterogeneity:
     Q d.f. p-value
 25.36   12  0.0132

Results for subgroups (random effects model):
                k      MD              95%-CI   tau^2    tau     Q   I^2
support = Yes   2 -2.4414 [-11.2620;  6.3792] 26.8927 5.1858  2.69 62.9%
support = No   11 -4.0516 [ -7.3986; -0.7045] 17.3412 4.1643 22.58 55.7%

Test for subgroup differences (random effects model):
                    Q d.f. p-value
Between groups   0.11    1  0.7380

Details on meta-analytical method:
- Inverse variance method
- Restricted maximum-likelihood estimator for tau^2
- Q-profile method for confidence interval of tau^2 and tau
#' Drawing a forest plot from a sub-group model
forest.meta(m.behav.sbp.support, 
            sortvar = population,
            colgap = "3mm", digits.sd = 2,
            predict = FALSE, 
            print.tau2 = FALSE,
            leftlabs = c("Author","mean","SD", "n","mean","SD","n","Weight","MD","95%CI"),
            leftcols = c("studlab","est.e","sd.e","n.e","est.c","sd.c","n.c","w.random","effect","ci"),
            col.square = "blue", col.square.lines = "blue",
            col.diamond = "black",
            layout = "RevMan5"
            )

1.3 Hypertension

Meta-analysis of the number of participants who obtained their goal-blood pressure (binomial)

Meta-analysis of binomial data are made using the function {metabin()} For this the model needs the total number of participants in each group and the number events in each group.

m.behav.hyper <- behavMeta %>% 
    filter(domain == "hypertension") %>% 
    metabin(event.e = est.e, 
                 n.e = n.e,
                 event.c = est.c,
                 n.c = n.c,
                 studlab = author,
                 
                 sm = "RR",
                 method = "MH",
                 MH.exact = TRUE,
                 comb.fixed = FALSE,
                 comb.random = TRUE,
                 method.tau = "PM",
                 hakn = F,
                 title = "Goal blood pressure")
m.behav.hyper
Review:     Goal blood pressure

                  RR           95%-CI %W(random)
Allen et al   0.9464 [0.7957; 1.1257]       22.5
Boss et al    1.1250 [0.7752; 1.6327]        6.0
Cheng et al   1.1505 [0.9553; 1.3855]       20.2
Irewall et al 1.2056 [1.0489; 1.3856]       30.9
Joubert et al 1.1020 [0.7037; 1.7259]        4.2
Joubert et al 1.2981 [1.0481; 1.6076]       16.1

Number of studies combined: k = 6
Number of observations: o = 1546
Number of events: e = 908

                         RR           95%-CI    z p-value
Random effects model 1.1354 [1.0334; 1.2475] 2.64  0.0082

Quantifying heterogeneity:
 tau^2 = 0.0024 [0.0000; 0.0578]; tau = 0.0492 [0.0000; 0.2403]
 I^2 = 22.9% [0.0%; 67.0%]; H = 1.14 [1.00; 1.74]

Test of heterogeneity:
    Q d.f. p-value
 6.49    5  0.2617

Details on meta-analytical method:
- Mantel-Haenszel method
- Paule-Mandel estimator for tau^2
- Q-profile method for confidence interval of tau^2 and tau
forest.meta(m.behav.hyper, 
            sortvar = author,
            predict = FALSE, colgap = "5mm",
            print.tau2 = FALSE,
            leftlabs = c("Study","Events","n","Event", "n","Weight","Risk Ratio"),
            leftcols = c("studlab","est.e","n.e","est.c","n.c","w.random","effect.ci"),
            col.square = "blue",
            col.diamond = "black",
            layout = "RevMan5")

Other vital signs

1.4 Diastolic blood pressure

# diastolic blood pressure data
behavMeta <- behavMeta %>% add_row(
  
  domain=c('DBP','DBP','DBP','DBP','DBP','DBP','DBP','DBP','DBP','DBP','DBP','DBP'),    
  author=c('Adie et al. 2010','Barker-Collo et al. 2015','Boss et al. 2014',
           'Chanruengvanich et al. 2006','Faulkner et al. 2014','Holzemer et al. 2011',
           'Hornnes et al. 2011','Irewall et al. 2015','Joubert et al. 2009','Kirk et al. 2014',
           'Kono et al. 2013','McManus et al. 2009'),
  year=c(2010,2015,2014,2006,2014,2011,2011,2015,2009,2014,2013,2009),
  est.e=c(75.7,77.77,71.0,77.13,78.0,78.4,82.0,77.3,77.3,75.0,72.9,74.0),
    sd.e=c(10.1,12.58,0.0,11.34,9.0,13.6,13.1,10.3,8.3,7.9,9.5,10.3),   
    n.e=c(29,163,10,31,27,12,145,241,91,12,34,49),
  est.c=c(72.1,77.46,75.0,75.81,80.0,78.9,86.0,79.6,79.1,74.67,80.7,74.0),
    sd.c=c(12.1,11.66,0.0,11.54,11.0,10.8,12.3,10.5,8.9,8.7,10.7,12.2), 
    n.c=c(27,165,10,31,24,15,158,243,95,12,34,53)
)
m.behav.dbp <- behavMeta %>% 
    filter(domain == "DBP") %>% 
    metacont(n.e = n.e, mean.e = est.e, sd.e = sd.e,
                   n.c = n.c, mean.c = est.c, sd.c = sd.c,
                   studlab = author,
                   sm = "MD",
                   method.smd = "Hedges",
                   comb.fixed = FALSE,
                   comb.random = TRUE,
                   method.tau = "REML",
                   hakn = TRUE,
                   title = "Diastolic Blood Pressure")
Warning in metacont(., n.e = n.e, mean.e = est.e, sd.e = sd.e, n.c = n.c,  :
  Note, studies with non-positive values for sd.e or sd.c get no weight in meta-analysis.
m.behav.dbp
Review:     Diastolic Blood Pressure

                                 MD              95%-CI %W(random)
Adie et al. 2010             3.6000 [ -2.2603;  9.4603]        5.2
Barker-Collo et al. 2015     0.3100 [ -2.3158;  2.9358]       14.5
Boss et al. 2014            -4.0000                            0.0
Chanruengvanich et al. 2006  1.3200 [ -4.3754;  7.0154]        5.5
Faulkner et al. 2014        -2.0000 [ -7.5580;  3.5580]        5.7
Holzemer et al. 2011        -0.5000 [ -9.9383;  8.9383]        2.3
Hornnes et al. 2011         -4.0000 [ -6.8679; -1.1321]       13.4
Irewall et al. 2015         -2.3000 [ -4.1531; -0.4469]       18.7
Joubert et al. 2009         -1.8000 [ -4.2721;  0.6721]       15.3
Kirk et al. 2014             0.3300 [ -6.3190;  6.9790]        4.3
Kono et al. 2013            -7.8000 [-12.6096; -2.9904]        7.1
McManus et al. 2009          0.0000 [ -4.3709;  4.3709]        8.1

Number of studies combined: k = 11
Number of observations: o = 1711

                          MD            95%-CI     t p-value
Random effects model -1.5972 [-3.3808; 0.1864] -2.00  0.0740

Quantifying heterogeneity:
 tau^2 = 2.2430 [0.0000; 21.1272]; tau = 1.4977 [0.0000; 4.5964]
 I^2 = 39.5% [0.0%; 70.2%]; H = 1.29 [1.00; 1.83]

Test of heterogeneity:
     Q d.f. p-value
 16.53   10  0.0854

Details on meta-analytical method:
- Inverse variance method
- Restricted maximum-likelihood estimator for tau^2
- Q-profile method for confidence interval of tau^2 and tau
- Hartung-Knapp adjustment for random effects model
forest.meta(m.behav.dbp, 
            sortvar = author,colgap = "4mm",
            predict = FALSE, 
            print.tau2 = FALSE,
            leftlabs = c("Author","mean","SD", "n","mean","SD","n","Weight","MD","95%CI"),
            leftcols = c("studlab","est.e","sd.e","n.e","est.c","sd.c","n.c","w.random","effect","ci"),
            col.square = "blue", col.square.lines = "blue",
            col.diamond = "black",
            layout = "RevMan5")

1.5 Heart rate

# heart rate data
behavMeta <- behavMeta %>% add_row(
  domain=c('HR','HR'),  
  author=c('Chanruengvanich et al. 2006','Faulkner et al. 2014'),   
  year=c(2006,2014),    
  est.e=c(67.71,64.0), sd.e=c(10.09,9.0), n.e=c(31,27), 
  est.c=c(71.42,66.0), sd.c=c(9.55,9.0), n.c=c(31,24)
)
m.behav.hr <- behavMeta %>% 
    filter(domain == "HR") %>% 
    metacont(n.e = n.e, mean.e = est.e, sd.e = sd.e,
                   n.c = n.c, mean.c = est.c, sd.c = sd.c,
                   studlab = author,
                   sm = "MD",
                   method.smd = "Hedges",
                   comb.fixed = FALSE,
                   comb.random = TRUE,
                   method.tau = "REML",
                   hakn = F,
                   title = "Heart rate")
m.behav.hr
Review:     Heart rate

                                 MD            95%-CI %W(random)
Chanruengvanich et al. 2006 -3.7100 [-8.6006; 1.1806]       50.6
Faulkner et al. 2014        -2.0000 [-6.9487; 2.9487]       49.4

Number of studies combined: k = 2
Number of observations: o = 113

                          MD            95%-CI     z p-value
Random effects model -2.8651 [-6.3436; 0.6134] -1.61  0.1065

Quantifying heterogeneity:
 tau^2 = 0; tau = 0; I^2 = 0.0%; H = 1.00

Test of heterogeneity:
    Q d.f. p-value
 0.23    1  0.6300

Details on meta-analytical method:
- Inverse variance method
- Restricted maximum-likelihood estimator for tau^2
forest.meta(m.behav.hr, 
            sortvar = author,colgap = "5mm", digits.sd = 2,
            predict = FALSE, 
            print.tau2 = FALSE,
            leftlabs = c("Author","mean","SD", "n","mean","SD","n","Weight","MD","95%CI"),
            leftcols = c("studlab","est.e","sd.e","n.e","est.c","sd.c","n.c","w.random","effect","ci"),
            col.square = "blue", col.square.lines = "blue",
            col.diamond = "black",
            layout = "RevMan5",
            xlim = c(-15,15),
            at = c(-10,-5,0,5,10),
            )

2 Biochemistry

2.1 Total cholesterol

# total cholesterol data
behavMeta <- behavMeta %>% add_row(
  domain=c('TCHOL','TCHOL','TCHOL','TCHOL','TCHOL','TCHOL','TCHOL','TCHOL','TCHOL','TCHOL'),    
  author=c('Adie et al. 2010','Barker-Collo et al. 2015','Chanruengvanich et al. 2006',
           'Faulkner et al. 2014','Holzemer et al. 2011','Joubert et al. 2006','Joubert et al. 2009',
           'Kim et al. 2013','Kirk et al. 2014','McManus et al. 2009'),
  year=c(2010,2015,2006,2014,2011,2006,2009,2013,2014,2009),
  est.e=c(169.88,151.74,207.1,136.68,159.2,184.56,189.19,154.7,146.72,166.02),
    sd.e=c(42.47,35.14,45.23,21.62,35.2,0.0,38.61,35.5,0.0,46.33),  
    n.e=c(29,157,31,27,12,32,91,18,12,49),
  est.c=c(158.3,160.23,200.42,147.88,174.8,196.91,193.05,144.7,137.07,173.75),
    sd.c=c(34.75,37.45,34.2,33.98,56.9,0.0,38.61,28.0,0.0,34.75),   
    n.c=c(27,159,31,24,15,33,95,18,12,53)
)
m.behav.tcol <- behavMeta %>% 
    filter(domain == "TCHOL") %>% 
    metacont(n.e = n.e, mean.e = est.e, sd.e = sd.e,
                   n.c = n.c, mean.c = est.c, sd.c = sd.c,
                   studlab = author,
                   sm = "MD",
                   method.smd = "Hedges",
                   comb.fixed = FALSE,
                   comb.random = TRUE,
                   method.tau = "REML",
                   hakn = TRUE,
                   title = "Diastolic Blood Pressure")
Warning in metacont(., n.e = n.e, mean.e = est.e, sd.e = sd.e, n.c = n.c,  :
  Note, studies with non-positive values for sd.e or sd.c get no weight in meta-analysis.
m.behav.tcol
Review:     Diastolic Blood Pressure

                                  MD              95%-CI %W(random)
Adie et al. 2010             11.5800 [ -8.6866; 31.8466]        6.2
Barker-Collo et al. 2015     -8.4900 [-16.4961; -0.4839]       38.8
Chanruengvanich et al. 2006   6.6800 [-13.2811; 26.6411]        6.4
Faulkner et al. 2014        -11.2000 [-27.0530;  4.6530]       10.1
Holzemer et al. 2011        -15.6000 [-50.6112; 19.4112]        2.1
Joubert et al. 2006         -12.3500                            0.0
Joubert et al. 2009          -3.8600 [-14.9600;  7.2400]       20.5
Kim et al. 2013              10.0000 [-10.8871; 30.8871]        5.9
Kirk et al. 2014              9.6500                            0.0
McManus et al. 2009          -7.7300 [-23.7238;  8.2638]       10.0

Number of studies combined: k = 8
Number of observations: o = 925

                          MD             95%-CI     t p-value
Random effects model -4.5820 [-10.9562; 1.7921] -1.70  0.1330

Quantifying heterogeneity:
 tau^2 = 0.5592 [0.0000; >100.0000]; tau = 0.7478 [0.0000; >10.0000]
 I^2 = 8.7% [0.0%; 70.4%]; H = 1.05 [1.00; 1.84]

Test of heterogeneity:
    Q d.f. p-value
 7.67    7  0.3628

Details on meta-analytical method:
- Inverse variance method
- Restricted maximum-likelihood estimator for tau^2
- Q-profile method for confidence interval of tau^2 and tau
- Hartung-Knapp adjustment for random effects model
forest.meta(m.behav.tcol, 
            sortvar = author,colgap = "4mm", digits.sd = 2,
            predict = FALSE, 
            print.tau2 = FALSE,
            leftlabs = c("Author","mean","SD", "n","mean","SD","n","Weight","MD","95%CI"),
            leftcols = c("studlab","est.e","sd.e","n.e","est.c","sd.c","n.c","w.random","effect","ci"),
            col.square = "blue", col.square.lines = "blue",
            col.diamond = "black",
            layout = "RevMan5")

2.2 High Density Lipoprotein

# HDL data
behavMeta <- behavMeta %>% add_row(
  domain=c('HDL','HDL','HDL','HDL','HDL','HDL'),    
  author=c('Barker-Collo et al. 2015','Chanruengvanich et al. 2006','Faulkner et al. 2014',
           'Holzemer et al. 2011','Kirk et al. 2014','Kono et al. 2013'),   
  year=c(2015,2006,2014,2011,2014,2013),    
  est.e=c(50.97,42.94,50.19,59.0,47.1,62.6), sd.e=c(21.62,10.93,20.85,24.8,11.58,17.2), 
    n.e=c(159,31,27,12,12,34),  
  est.c=c(50.58,42.84,52.51,50.6,42.47,56.3), sd.c=c(16.6,12.34,17.37,15.1,7.72,15.5),  
    n.c=c(161,31,24,15,12,34)
)
m.behav.hdl <- behavMeta %>% 
    filter(domain == "HDL") %>% 
    metacont(n.e = n.e, mean.e = est.e, sd.e = sd.e,
                   n.c = n.c, mean.c = est.c, sd.c = sd.c,
                   studlab = author,
                   sm = "MD",
                   method.smd = "Hedges",
                   comb.fixed = FALSE,
                   comb.random = TRUE,
                   method.tau = "REML",
                   hakn = TRUE,
                   title = "Diastolic Blood Pressure")
m.behav.hdl
Review:     Diastolic Blood Pressure

                                 MD              95%-CI %W(random)
Barker-Collo et al. 2015     0.3900 [ -3.8370;  4.6170]       42.6
Chanruengvanich et al. 2006  0.1000 [ -5.7029;  5.9029]       22.6
Faulkner et al. 2014        -2.3200 [-12.8149;  8.1749]        6.9
Holzemer et al. 2011         8.4000 [ -7.5775; 24.3775]        3.0
Kirk et al. 2014             4.6300 [ -3.2444; 12.5044]       12.3
Kono et al. 2013             6.3000 [ -1.4826; 14.0826]       12.6

Number of studies combined: k = 6
Number of observations: o = 552

                         MD            95%-CI    t p-value
Random effects model 1.6400 [-1.5039; 4.7838] 1.34  0.2376

Quantifying heterogeneity:
 tau^2 = 0 [0.0000; 71.5168]; tau = 0 [0.0000; 8.4568]
 I^2 = 0.0% [0.0%; 74.6%]; H = 1.00 [1.00; 1.99]

Test of heterogeneity:
    Q d.f. p-value
 3.77    5  0.5827

Details on meta-analytical method:
- Inverse variance method
- Restricted maximum-likelihood estimator for tau^2
- Q-profile method for confidence interval of tau^2 and tau
- Hartung-Knapp adjustment for random effects model
forest.meta(m.behav.hdl, 
            sortvar = author,colgap = "4mm",
            predict = FALSE, 
            print.tau2 = FALSE,
            leftlabs = c("Author","mean","SD", "n","mean","SD","n","Weight","MD","95%CI"),
            leftcols = c("studlab","est.e","sd.e","n.e","est.c","sd.c","n.c","w.random","effect","ci"),
            col.square = "blue", col.square.lines = "blue",
            col.diamond = "black",
            layout = "RevMan5")

2.3 Low Density Lipoprotein

# LDL data
behavMeta <- behavMeta %>% add_row(
  domain=c('LDL','LDL','LDL','LDL','LDL'),  
  author=c('Boss et al. 2014','Cheng et al. 2018','Holzemer et al. 2011','Irewall et al. 2015',
           'Kono et al. 2013'),
  year=c(2014,2018,2011,2015,2013), 
  est.e=c(82.0,86.8,81.0,88.8,103.4), sd.e=c(0.0,38.9,21.8,27.0,24.8), n.e=c(10,204,12,241,34), 
  est.c=c(98.6,92.3,100.9,100.39,102.6), sd.c=c(0.0,41.1,55.8,34.7,20.8), n.c=c(10,200,15,243,34)
)

Standardised mean differences are used for this meta-analysis because the results are reported in different units.

m.behav.ldl <- behavMeta %>% 
    filter(domain == "LDL") %>% 
    metacont(n.e = n.e, mean.e = est.e, sd.e = sd.e,
                   n.c = n.c, mean.c = est.c, sd.c = sd.c,
                   studlab = author,
                   sm = "SMD",
                   method.smd = "Hedge",
                   comb.fixed = FALSE,
                   comb.random = TRUE,
                   method.tau = "REML",
                   hakn = FALSE,
                   title = "Low Density Lipoprotein")
Warning in metacont(., n.e = n.e, mean.e = est.e, sd.e = sd.e, n.c = n.c,  :
  Note, studies with non-positive values for sd.e or sd.c get no weight in meta-analysis.
m.behav.ldl
Review:     Low Density Lipoprotein

                         SMD             95%-CI %W(random)
Boss et al. 2014          NA                           0.0
Cheng et al. 2018    -0.1372 [-0.3325;  0.0580]       39.3
Holzemer et al. 2011 -0.4367 [-1.2062;  0.3328]        5.7
Irewall et al. 2015  -0.3720 [-0.5518; -0.1923]       41.9
Kono et al. 2013      0.0346 [-0.4408;  0.5100]       13.1

Number of studies combined: k = 4
Number of observations: o = 1003

                         SMD             95%-CI     z p-value
Random effects model -0.2303 [-0.4219; -0.0386] -2.35  0.0185

Quantifying heterogeneity:
 tau^2 = 0.0144 [0.0000; 0.5814]; tau = 0.1200 [0.0000; 0.7625]
 I^2 = 35.5% [0.0%; 77.6%]; H = 1.25 [1.00; 2.11]

Test of heterogeneity:
    Q d.f. p-value
 4.65    3  0.1990

Details on meta-analytical method:
- Inverse variance method
- Restricted maximum-likelihood estimator for tau^2
- Q-profile method for confidence interval of tau^2 and tau
- Hedges' g (bias corrected standardised mean difference)
forest.meta(m.behav.ldl, 
            sortvar = author,colgap = "5mm",
            predict = FALSE, 
            print.tau2 = FALSE,
            leftlabs = c("Author","mean","SD", "n","mean","SD","n","Weight","SMD","95%CI"),
            leftcols = c("studlab","est.e","sd.e","n.e","est.c","sd.c","n.c","w.random","effect","ci"),
            col.square = "blue", col.square.lines = "blue",
            col.diamond = "black",
            layout = "RevMan5")

2.4 Triglycerides

# Triglycerides data
behavMeta <- behavMeta %>% add_row(
  domain=c('TRIG','TRIG'),  
  author=c('Holzemer et al. 2011','Kim et al. 2013'),   
  year=c(2011,2013),    
  est.e=c(96.2,140.0), sd.e=c(36.6,63.2), n.e=c(12,18), 
  est.c=c(116.3,145.5), sd.c=c(57.5,78.8), n.c=c(15,18)
)
m.behav.trig <- behavMeta %>% 
    filter(domain == "TRIG") %>% 
    metacont(n.e = n.e, mean.e = est.e, sd.e = sd.e,
                   n.c = n.c, mean.c = est.c, sd.c = sd.c,
                   studlab = author,
                   sm = "MD",
                   method.smd = "Hedges",
                   comb.fixed = FALSE,
                   comb.random = TRUE,
                   method.tau = "REML",
                   hakn = F,
                   title = "Triglycerides")
m.behav.trig
Review:     Triglycerides

                           MD              95%-CI %W(random)
Holzemer et al. 2011 -20.1000 [-55.8148; 15.6148]       63.1
Kim et al. 2013       -5.5000 [-52.1649; 41.1649]       36.9

Number of studies combined: k = 2
Number of observations: o = 63

                           MD              95%-CI     z p-value
Random effects model -14.7070 [-43.0685; 13.6546] -1.02  0.3095

Quantifying heterogeneity:
 tau^2 = 0; tau = 0; I^2 = 0.0%; H = 1.00

Test of heterogeneity:
    Q d.f. p-value
 0.24    1  0.6263

Details on meta-analytical method:
- Inverse variance method
- Restricted maximum-likelihood estimator for tau^2
forest.meta(m.behav.trig, 
            sortvar = author,colgap = "5mm",
            predict = FALSE, 
            print.tau2 = FALSE,
            leftlabs = c("Author","mean","SD", "n","mean","SD","n","Weight","MD","95%CI"),
            leftcols = c("studlab","est.e","sd.e","n.e","est.c","sd.c","n.c","w.random","effect","ci"),
            col.square = "blue", col.square.lines = "blue",
            col.diamond = "black",
            layout = "RevMan5")

2.5 Fasting blood glucose

# Fasting blood glucose data
behavMeta <- behavMeta %>% add_row(
  domain=c('FGLUC','FGLUC'),    
  author=c('Faulkner et al. 2014','Kirk et al. 2014'),  
  year=c(2014,2014),    
  est.e=c(5.45,5.2), sd.e=c(1.22,0.4), n.e=c(27,12),    
  est.c=c(5.66,5.38), sd.c=c(1.03,0.4), n.c=c(24,12)
)
m.behav.fgluc <- behavMeta %>% 
    filter(domain == "FGLUC") %>% 
    metacont(n.e = n.e, mean.e = est.e, sd.e = sd.e,
                   n.c = n.c, mean.c = est.c, sd.c = sd.c,
                   studlab = author,
                   sm = "MD",
                   method.smd = "Hedges",
                   comb.fixed = FALSE,
                   comb.random = TRUE,
                   method.tau = "REML",
                   hakn = F,
                   title = "Fasting blood glucose")
m.behav.fgluc
Review:     Fasting blood glucose

                          MD            95%-CI %W(random)
Faulkner et al. 2014 -0.2100 [-0.8277; 0.4077]       21.2
Kirk et al. 2014     -0.1800 [-0.5001; 0.1401]       78.8

Number of studies combined: k = 2
Number of observations: o = 75

                          MD            95%-CI     z p-value
Random effects model -0.1863 [-0.4705; 0.0978] -1.29  0.1987

Quantifying heterogeneity:
 tau^2 = 0; tau = 0; I^2 = 0.0%; H = 1.00

Test of heterogeneity:
    Q d.f. p-value
 0.01    1  0.9326

Details on meta-analytical method:
- Inverse variance method
- Restricted maximum-likelihood estimator for tau^2
forest.meta(m.behav.fgluc, 
            sortvar = author,colgap = "5mm",
            predict = FALSE, 
            print.tau2 = FALSE,
            leftlabs = c("Author","mean","SD", "n","mean","SD","n","Weight","MD","95%CI"),
            leftcols = c("studlab","est.e","sd.e","n.e","est.c","sd.c","n.c","w.random","effect","ci"),
            col.square = "blue", col.square.lines = "blue",
            col.diamond = "black",
            layout = "RevMan5")

2.6 HbA1c

# HbA1c data
behavMeta <- behavMeta %>% add_row(
  domain=c('HBA','HBA'),    
  author=c('Kono et al. 2013','McManus et al. 2009'),   
  year=c(2013,2009),    
  est.e=c(5.87,8.0), sd.e=c(0.46,1.9), n.e=c(34,49),    
  est.c=c(5.98,7.5), sd.c=c(0.71,1.5), n.c=c(34,53)
)
m.behav.hba <- behavMeta %>% 
    filter(domain == "HBA") %>% 
    metacont(n.e = n.e, mean.e = est.e, sd.e = sd.e,
                   n.c = n.c, mean.c = est.c, sd.c = sd.c,
                   studlab = author,
                   sm = "MD",
                   method.smd = "Hedges",
                   comb.fixed = FALSE,
                   comb.random = TRUE,
                   method.tau = "REML",
                   hakn = F,
                   title = "HbA1c")
m.behav.hba
Review:     HbA1c

                         MD            95%-CI %W(random)
Kono et al. 2013    -0.1100 [-0.3944; 0.1744]       62.8
McManus et al. 2009  0.5000 [-0.1679; 1.1679]       37.2

Number of studies combined: k = 2
Number of observations: o = 170

                         MD            95%-CI    z p-value
Random effects model 0.1171 [-0.4609; 0.6950] 0.40  0.6914

Quantifying heterogeneity:
 tau^2 = 0.1175; tau = 0.3427; I^2 = 63.1% [0.0%; 91.5%]; H = 1.65 [1.00; 3.44]

Test of heterogeneity:
    Q d.f. p-value
 2.71    1  0.0996

Details on meta-analytical method:
- Inverse variance method
- Restricted maximum-likelihood estimator for tau^2
forest.meta(m.behav.hba, 
            sortvar = author,colgap = "5mm", digits.sd = 2,
            predict = FALSE, 
            print.tau2 = FALSE,
            leftlabs = c("Author","mean","SD", "n","mean","SD","n","Weight","MD","95%CI"),
            leftcols = c("studlab","est.e","sd.e","n.e","est.c","sd.c","n.c","w.random","effect","ci"),
            col.square = "blue", col.square.lines = "blue",
            col.diamond = "black",
            layout = "RevMan5")

2.7 Total cholesterol/HDL ratio

# chol/HDL ratio data
behavMeta <- behavMeta %>% add_row(
  domain=c('THR','THR'),    
  author=c('Faulkner et al. 2014','Kirk et al. 2014'),  
  year=c(2014,2014),    
  est.e=c(3.13,3.49), sd.e=c(1.23,1.04), n.e=c(27,12),  
  est.c=c(3.02,3.82), sd.c=c(0.83,1.37), n.c=c(24,12)
)
m.behav.thr <- behavMeta %>% 
    filter(domain == "THR") %>% 
    metacont(n.e = n.e, mean.e = est.e, sd.e = sd.e,
                   n.c = n.c, mean.c = est.c, sd.c = sd.c,
                   studlab = author,
                   sm = "MD",
                   method.smd = "Hedges",
                   comb.fixed = FALSE,
                   comb.random = TRUE,
                   method.tau = "REML",
                   hakn = F,
                   title = "Total cholesterol/HDL ratio")
m.behav.thr
Review:     Total cholesterol/HDL ratio

                          MD            95%-CI %W(random)
Faulkner et al. 2014  0.1100 [-0.4605; 0.6805]       74.4
Kirk et al. 2014     -0.3300 [-1.3032; 0.6432]       25.6

Number of studies combined: k = 2
Number of observations: o = 75

                          MD            95%-CI     z p-value
Random effects model -0.0025 [-0.4947; 0.4896] -0.01  0.9919

Quantifying heterogeneity:
 tau^2 = 0; tau = 0; I^2 = 0.0%; H = 1.00

Test of heterogeneity:
    Q d.f. p-value
 0.58    1  0.4446

Details on meta-analytical method:
- Inverse variance method
- Restricted maximum-likelihood estimator for tau^2
forest.meta(m.behav.thr, 
            sortvar = author,colgap = "5mm", digits.sd = 2,
            predict = FALSE, 
            print.tau2 = FALSE,
            leftlabs = c("Author","mean","SD", "n","mean","SD","n","Weight","MD","95%CI"),
            leftcols = c("studlab","est.e","sd.e","n.e","est.c","sd.c","n.c","w.random","effect","ci"),
            col.square = "blue", col.square.lines = "blue",
            col.diamond = "black",
            layout = "RevMan5")

3 Body composition

3.1 Body Mass Index

# BMI data
behavMeta <- behavMeta %>% add_row(
  domain=c('BMI','BMI','BMI','BMI'),    
  author=c('Faulkner et al. 2014','Joubert et al. 2009','Kirk et al. 2014','Kono et al. 2013'),
  year=c(2014,2009,2014,2013),  
  est.e=c(28.2,27.5,28.19,22.6), sd.e=c(4.8,5.4,0.0,2.69), n.e=c(27,91,12,34),  
  est.c=c(28.2,28.7,27.87,22.7), sd.c=c(4.5,6.3,0.0,2.72), n.c=c(24,95,12,34)
)
m.behav.bmi <- behavMeta %>% 
    filter(domain == "BMI") %>% 
    metacont(n.e = n.e, mean.e = est.e, sd.e = sd.e,
                   n.c = n.c, mean.c = est.c, sd.c = sd.c,
                   studlab = author,
                   sm = "MD",
                   method.smd = "Hedges",
                   comb.fixed = FALSE,
                   comb.random = TRUE,
                   method.tau = "REML",
                   hakn = F,
                   title = "Body Mass Index")
Warning in metacont(., n.e = n.e, mean.e = est.e, sd.e = sd.e, n.c = n.c,  :
  Note, studies with non-positive values for sd.e or sd.c get no weight in meta-analysis.
m.behav.bmi
Review:     Body Mass Index

                          MD            95%-CI %W(random)
Faulkner et al. 2014  0.0000 [-2.5533; 2.5533]       13.8
Joubert et al. 2009  -1.2000 [-2.8840; 0.4840]       31.7
Kirk et al. 2014      0.3200                          0.0
Kono et al. 2013     -0.1000 [-1.3859; 1.1859]       54.4

Number of studies combined: k = 3
Number of observations: o = 329

                          MD            95%-CI     z p-value
Random effects model -0.4354 [-1.3842; 0.5134] -0.90  0.3685

Quantifying heterogeneity:
 tau^2 = 0 [0.0000; 16.6161]; tau = 0 [0.0000; 4.0763]
 I^2 = 0.0% [0.0%; 89.6%]; H = 1.00 [1.00; 3.10]

Test of heterogeneity:
    Q d.f. p-value
 1.16    2  0.5585

Details on meta-analytical method:
- Inverse variance method
- Restricted maximum-likelihood estimator for tau^2
- Q-profile method for confidence interval of tau^2 and tau
forest.meta(m.behav.bmi, 
            sortvar = author,colgap = "5mm", digits.sd = 2,
            predict = FALSE, 
            print.tau2 = FALSE,
            leftlabs = c("Author","mean","SD", "n","mean","SD","n","Weight","MD","95%CI"),
            leftcols = c("studlab","est.e","sd.e","n.e","est.c","sd.c","n.c","w.random","effect","ci"),
            col.square = "blue", col.square.lines = "blue",
            col.diamond = "black",
            xlim = c(-3,3), # By default the x-axis was only shown from -2 - 2
            #at = c(-3,-2,-1,0,1,2,3), 
            layout = "RevMan5")

3.2 Body weight

# Body weight data
behavMeta <- behavMeta %>% add_row(
  domain=c('BW','BW','BW','BW'),    
  author=c('Adie et al. 2010','Faulkner et al. 2014','Flemming et al. 2013','Kono et al. 2013'),    
  year=c(2010,2014,2013,2013),  
  est.e=c(77.1,75.7,0.0,58.5),  sd.e=c(11.9,16.0,0.0,8.69), n.e=c(29,27,0,34),  
  est.c=c(77.9,75.7,0.0,59.1),  sd.c=c(17.2,14.0,0.0,10.5), n.c=c(27,24,0,34)
)
m.behav.weight <- behavMeta %>% 
    filter(domain == "BW") %>% 
    metacont(n.e = n.e, mean.e = est.e, sd.e = sd.e,
                   n.c = n.c, mean.c = est.c, sd.c = sd.c,
                   studlab = author,
                   sm = "MD",
                   method.smd = "Hedges",
                   comb.fixed = FALSE,
                   comb.random = TRUE,
                   method.tau = "REML",
                   hakn = TRUE,
                   title = "Body weight")
Warning in metacont(., n.e = n.e, mean.e = est.e, sd.e = sd.e, n.c = n.c,  :
  Note, studies with non-positive values for sd.e or sd.c get no weight in meta-analysis.
m.behav.weight
Review:     Body weight

                          MD            95%-CI %W(random)
Adie et al. 2010     -0.8000 [-8.6006; 7.0006]       20.8
Faulkner et al. 2014  0.0000 [-8.2337; 8.2337]       18.7
Flemming et al. 2013  0.0000                          0.0
Kono et al. 2013     -0.6000 [-5.1813; 3.9813]       60.4

Number of studies combined: k = 3
Number of observations: o = 175

                          MD            95%-CI     t p-value
Random effects model -0.5294 [-1.3385; 0.2797] -2.82  0.1064

Quantifying heterogeneity:
 tau^2 = 0; tau = 0; I^2 = 0.0% [0.0%; 89.6%]; H = 1.00 [1.00; 3.10]

Test of heterogeneity:
    Q d.f. p-value
 0.02    2  0.9893

Details on meta-analytical method:
- Inverse variance method
- Restricted maximum-likelihood estimator for tau^2
- Hartung-Knapp adjustment for random effects model
forest.meta(m.behav.weight, 
            sortvar = author,colgap = "5mm", digits.sd = 2,
            predict = FALSE, 
            print.tau2 = FALSE,
            leftlabs = c("Author","mean","SD", "n","mean","SD","n","Weight","MD","95%CI"),
            leftcols = c("studlab","est.e","sd.e","n.e","est.c","sd.c","n.c","w.random","effect","ci"),
            col.square = "blue", col.square.lines = "blue",
            col.diamond = "black",
            # by default the x-axis was only shown as (-5, 0, 5)
            xlim = c(-10,10), at = c(-10,-5,0,5,10), 
            layout = "RevMan5")

3.3 Waist/hip ratio

# waist/hip ratio data
behavMeta <- behavMeta %>% add_row(
  domain=c('WHR','WHR'),    
  author=c('Faulkner et al. 2014','Kirk et al. 2014'),  
  year=c(2014,2014),    
  est.e=c(0.95,0.96),   sd.e=c(0.08,0.07),  n.e=c(27,12),   
  est.c=c(0.95,0.97),   sd.c=c(0.08,0.07),  n.c=c(24,12)
)
m.behav.whr <- behavMeta %>% 
    filter(domain == "WHR") %>% 
    metacont(n.e = n.e, mean.e = est.e, sd.e = sd.e,
                   n.c = n.c, mean.c = est.c, sd.c = sd.c,
                   studlab = author,
                   sm = "MD",
                   method.smd = "Hedges",
                   comb.fixed = FALSE,
                   comb.random = TRUE,
                   method.tau = "REML",
                   hakn = F,
                   title = "Waist/hip ratio")
m.behav.whr
Review:     Waist/hip ratio

                          MD            95%-CI %W(random)
Faulkner et al. 2014  0.0000 [-0.0440; 0.0440]       61.9
Kirk et al. 2014     -0.0100 [-0.0660; 0.0460]       38.1

Number of studies combined: k = 2
Number of observations: o = 75

                          MD            95%-CI     z p-value
Random effects model -0.0038 [-0.0384; 0.0308] -0.22  0.8289

Quantifying heterogeneity:
 tau^2 = 0; tau = 0; I^2 = 0.0%; H = 1.00

Test of heterogeneity:
    Q d.f. p-value
 0.08    1  0.7832

Details on meta-analytical method:
- Inverse variance method
- Restricted maximum-likelihood estimator for tau^2
forest.meta(m.behav.whr, 
sortvar = author,colgap = "5mm", digits.sd = 2,
            predict = FALSE, 
            print.tau2 = FALSE,
            leftlabs = c("Author","mean","SD", "n","mean","SD","n","Weight","MD","95%CI"),
            leftcols = c("studlab","est.e","sd.e","n.e","est.c","sd.c","n.c","w.random","effect","ci"),
            col.square = "blue", col.square.lines = "blue",
            col.diamond = "black",
            # by default the x-axis labels were shown as (-0.06,-0.02,0,0.02,0.04,0.06) for ??? reason
            at = c(-0.06,-0.03,0,0.03,0.06), 
            layout = "RevMan5")

4 Epidemiological measures

4.1 Mortality

# Mortality data
behavMeta <- behavMeta %>% add_row(
  domain=c('MORS','MORS','MORS','MORS','MORS'), 
  author=c('Allen et al. 2002','Allen et al. 2009','Boysen et al. 2009',
           'Faulkner et al. 2014','Peng et al. 2004'),  
  year=c(2002,2009,2009,2014,2004), 
  est.e=c(1,9,11,0,13), sd.e=c(NA,NA,NA,NA,NA), n.e=c(47,190,157,30,1795),  
  est.c=c(4,7,9,4,15),  sd.c=c(NA,NA,NA,NA,NA), n.c=c(46,190,157,30,2026)
)
m.behav.mors <- behavMeta %>% 
    filter(domain == "MORS") %>% 
    metabin(event.e = est.e, 
                 n.e = n.e,
                 event.c = est.c,
                 n.c = n.c,
                 studlab = author,
                 
                 sm = "RR",
                 method = "MH",
                 MH.exact = TRUE,
                 comb.fixed = FALSE,
                 comb.random = TRUE,
                 method.tau = "PM",
                 hakn = F,
                 title = "All Cause Mortality")
m.behav.mors
Review:     All Cause Mortality

                         RR           95%-CI %W(random)
Allen et al. 2002    0.2447 [0.0284; 2.1074]        6.3
Allen et al. 2009    1.2857 [0.4888; 3.3816]       24.7
Boysen et al. 2009   1.2222 [0.5210; 2.8673]       29.6
Faulkner et al. 2014 0.1111 [0.0062; 1.9760]        3.6
Peng et al. 2004     0.9782 [0.4667; 2.0502]       35.8

Number of studies combined: k = 5
Number of observations: o = 4668
Number of events: e = 73

                         RR           95%-CI     z p-value
Random effects model 0.9479 [0.5432; 1.6541] -0.19  0.8506

Quantifying heterogeneity:
 tau^2 = 0.0830 [0.0000; 8.8326]; tau = 0.2881 [0.0000; 2.9720]
 I^2 = 8.1% [0.0%; 80.9%]; H = 1.04 [1.00; 2.29]

Test of heterogeneity:
    Q d.f. p-value
 4.35    4  0.3604

Details on meta-analytical method:
- Mantel-Haenszel method (without continuity correction)
- Paule-Mandel estimator for tau^2
- Q-profile method for confidence interval of tau^2 and tau
- Continuity correction of 0.5 in studies with zero cell frequencies
forest.meta(m.behav.mors, 
            sortvar = author,
            predict = FALSE, colgap = "5mm",
            print.tau2 = FALSE,
            leftlabs = c("Study","Events","n","Event", "n","Weight","Risk Ratio"),
            leftcols = c("studlab","est.e","n.e","est.c","n.c","w.random","effect.ci"),
            col.square = "blue",
            col.diamond = "black",
            layout = "RevMan5")

4.2 Recurrent stroke/TIA

# recurrence data
behavMeta <- behavMeta %>% add_row(
  domain=c('RECUR','RECUR','RECUR','RECUR'),    
  author=c('Allen et al. 2002','Boysen et al. 2009','McManus et al. 2009','Peng et al. 2004'),  
  year=c(2002,2009,2009,2004),  
  est.e=c(1,7,14,46),   sd.e=c(NA,NA,NA,NA),    n.e=c(47,49,157,1795),  
  est.c=c(0,6,11,52),   sd.c=c(NA,NA,NA,NA),    n.c=c(46,53,157,2026)
)
m.behav.recur <- behavMeta %>% 
    filter(domain == "RECUR") %>% 
    metabin(event.e = est.e, 
                 n.e = n.e,
                 event.c = est.c,
                 n.c = n.c,
                 studlab = author,
                 
                 sm = "RR",
                 method = "MH",
                 MH.exact = TRUE,
                 comb.fixed = FALSE,
                 comb.random = TRUE,
                 method.tau = "PM",
                 hakn = F,
                 title = "Goal blood pressure")
m.behav.recur
Review:     Goal blood pressure

                        RR            95%-CI %W(random)
Allen et al. 2002   2.9368 [0.1227; 70.2669]        1.1
Boysen et al. 2009  1.2619 [0.4555;  3.4956]       10.3
McManus et al. 2009 1.2727 [0.5964;  2.7162]       18.7
Peng et al. 2004    0.9985 [0.6749;  1.4771]       69.9

Number of studies combined: k = 4
Number of observations: o = 4330
Number of events: e = 137

                         RR           95%-CI    z p-value
Random effects model 1.0827 [0.7803; 1.5022] 0.48  0.6346

Quantifying heterogeneity:
 tau^2 = 0 [0.0000; 1.3782]; tau = 0 [0.0000; 1.1740]
 I^2 = 0.0% [0.0%; 84.7%]; H = 1.00 [1.00; 2.56]

Test of heterogeneity:
    Q d.f. p-value
 0.81    3  0.8482

Details on meta-analytical method:
- Mantel-Haenszel method (without continuity correction)
- Paule-Mandel estimator for tau^2
- Q-profile method for confidence interval of tau^2 and tau
- Continuity correction of 0.5 in studies with zero cell frequencies
forest.meta(m.behav.recur, 
            sortvar = author,
            predict = FALSE, colgap = "5mm",
            print.tau2 = FALSE,
            leftlabs = c("Study","Events","n","Event", "n","Weight","Risk Ratio"),
            leftcols = c("studlab","est.e","n.e","est.c","n.c","w.random","effect.ci"),
            col.square = "blue",
            col.diamond = "black",
            # One of the confidence intervals goes up to 70; limiting the x-axis adds an arrow to the 
            # confidence interval line to indicate that is goes beyond the limit
            xlim = c(0.1,10),
            layout = "RevMan5")

4.3 Adverse events

# Adverse events data
behavMeta <- behavMeta %>% add_row(
  domain=c('ADVERSE','ADVERSE','ADVERSE','ADVERSE','ADVERSE','ADVERSE','ADVERSE'),  
  author=c('Allen et al. 2002','Allen et al. 2009','Boysen et al. 2009','English et al. 2016',
           'Kono et al. 2013','McManus et al. 2009','Peng et al. 2004'),    
  year=c(2002,2009,2009,2016,2013,2009,2004),   
  est.e=c(10,9,28,2,1,13,63),   sd.e=c(NA,NA,NA,NA,NA,NA,NA),   n.e=c(47,190,157,19,35,49,1795),    
  est.c=c(19,7,29,2,12,22,73),  sd.c=c(NA,NA,NA,NA,NA,NA,NA),   n.c=c(46,190,157,14,35,53,2026)
)
m.behav.adv <- behavMeta %>% 
    filter(domain == "ADVERSE") %>% 
    metabin(event.e = est.e, 
                 n.e = n.e,
                 event.c = est.c,
                 n.c = n.c,
                 studlab = author,
                 
                 sm = "RR",
                 method = "MH",
                 MH.exact = TRUE,
                 comb.fixed = FALSE,
                 comb.random = TRUE,
                 method.tau = "PM",
                 hakn = F,
                 title = "Goal blood pressure")
m.behav.adv
Review:     Goal blood pressure

                        RR           95%-CI %W(random)
Allen et al. 2002   0.5151 [0.2692; 0.9857]       16.9
Allen et al. 2009   1.2857 [0.4888; 3.3816]       11.4
Boysen et al. 2009  0.9655 [0.6036; 1.5445]       20.8
English et al. 2016 0.7368 [0.1177; 4.6135]        4.5
Kono et al. 2013    0.0833 [0.0114; 0.6069]        3.9
McManus et al. 2009 0.6391 [0.3633; 1.1246]       18.7
Peng et al. 2004    0.9741 [0.6996; 1.3563]       23.9

Number of studies combined: k = 7
Number of observations: o = 4813
Number of events: e = 290

                         RR           95%-CI     z p-value
Random effects model 0.7472 [0.4892; 1.1412] -1.35  0.1774

Quantifying heterogeneity:
 tau^2 = 0.1670 [0.0000; 3.2371]; tau = 0.4087 [0.0000; 1.7992]
 I^2 = 40.9% [0.0%; 75.1%]; H = 1.30 [1.00; 2.01]

Test of heterogeneity:
     Q d.f. p-value
 10.15    6  0.1187

Details on meta-analytical method:
- Mantel-Haenszel method
- Paule-Mandel estimator for tau^2
- Q-profile method for confidence interval of tau^2 and tau
forest.meta(m.behav.adv, 
            sortvar = author,
            predict = FALSE, colgap = "5mm",
            print.tau2 = FALSE,
            leftlabs = c("Study","Events","n","Event", "n","Weight","Risk Ratio"),
            leftcols = c("studlab","est.e","n.e","est.c","n.c","w.random","effect.ci"),
            col.square = "blue",
            col.diamond = "black",
            xlim = c(0.05,20), at = c(0.1,0.5,1,2,10),
            layout = "RevMan5")

5 Other outcomes

5.1 Modified Rankin Scale

# MRS data

behavMeta <- behavMeta %>% add_row(
  domain=c('MRS','MRS','MRS','MRS'),    
  author=c('Adie et al. 2010','Boysen et al. 2009','Joubert et al. 2009','Wan al. 2016'),   
  year=c(2010,2009,2009,2016),  
  est.e=c(0,1.45,1.2,0.18), sd.e=c(1,1.19,1.1,0.5), n.e=c(29,137,91,40),    
  est.c=c(0,1.5,1.9,0.4),   sd.c=c(1,1.26,1.2,0.71),    n.c=c(27,147,95,40))
m.behav.mrs <- behavMeta %>% 
    filter(domain == "MRS") %>% 
    metacont(n.e = n.e, mean.e = est.e, sd.e = sd.e,
                   n.c = n.c, mean.c = est.c, sd.c = sd.c,
                   studlab = author,
                   sm = "SMD",
                   method.smd = "Hedges",
                   comb.fixed = FALSE,
                   comb.random = TRUE,
                   method.tau = "REML",
                   hakn = F,
                   title = "Modified Rankin Scale")
m.behav.mrs
Review:     Modified Rankin Scale

                        SMD             95%-CI %W(random)
Adie et al. 2010     0.0000 [-0.5242;  0.5242]       18.0
Boysen et al. 2009  -0.0406 [-0.2734;  0.1921]       32.0
Joubert et al. 2009 -0.6051 [-0.8992; -0.3109]       28.7
Wan al. 2016        -0.3548 [-0.7967;  0.0870]       21.3

Number of studies combined: k = 4
Number of observations: o = 606

                         SMD            95%-CI     z p-value
Random effects model -0.2624 [-0.5628; 0.0380] -1.71  0.0869

Quantifying heterogeneity:
 tau^2 = 0.0593 [0.0010; 1.0934]; tau = 0.2435 [0.0315; 1.0457]
 I^2 = 69.4% [11.7%; 89.4%]; H = 1.81 [1.06; 3.07]

Test of heterogeneity:
    Q d.f. p-value
 9.79    3  0.0204

Details on meta-analytical method:
- Inverse variance method
- Restricted maximum-likelihood estimator for tau^2
- Q-profile method for confidence interval of tau^2 and tau
- Hedges' g (bias corrected standardised mean difference)
forest.meta(m.behav.mrs, 
            sortvar = author,colgap = "5mm", digits.sd = 2,
            predict = FALSE, 
            print.tau2 = FALSE,
            leftlabs = c("Author","mean","SD", "n","mean","SD","n","Weight","MD","95%CI"),
            leftcols = c("studlab","est.e","sd.e","n.e","est.c","sd.c","n.c","w.random","effect","ci"),
            col.square = "blue", col.square.lines = "blue",
            col.diamond = "black",
            # by default the {xlim} was shown as (-0.5, 0.5); it is expanded for aesthetic reasons
            xlim = c(-1,1),
            layout = "RevMan5")

5.2 Quality of life

# Quality of life data
behavMeta <- behavMeta %>% add_row(
  domain=c('QOL','QOL','QOL','QOL','QOL'),  
  author=c('Barker-Collo et al. 2015','Damush et al. 2011','Joubert et al. 2009',
           'Kirk et al. 2014','McManus et al. 2009'),   
  year=c(2015,2011,2009,2014,2009), 
  est.e=c(43.02,3.82,26.4,43.0,62.0),   sd.e=c(10.82,0.88,5.3,9.7,2.9), n.e=c(165,30,91,12,49), 
  est.c=c(43.52,3.94,29.7,47.42,60.0),  sd.c=c(10.73,0.82,6.2,5.5,2.8), n.c=c(169,33,95,12,53)
)
m.behav.qol <- behavMeta %>% 
    filter(domain == "QOL") %>% 
    metacont(n.e = n.e, mean.e = est.e, sd.e = sd.e,
                   n.c = n.c, mean.c = est.c, sd.c = sd.c,
                   studlab = author,
                   sm = "MD",
                   method.smd = "Hedges",
                   comb.fixed = FALSE,
                   comb.random = TRUE,
                   method.tau = "REML",
                   hakn = F,
                   title = "Quality of life")
m.behav.qol
Review:     Quality of life

                              MD              95%-CI %W(random)
Barker-Collo et al. 2015 -0.5000 [ -2.8114;  1.8114]       19.8
Damush et al. 2011       -0.1200 [ -0.5412;  0.3012]       25.8
Joubert et al. 2009      -3.3000 [ -4.9553; -1.6447]       22.4
Kirk et al. 2014         -4.4200 [-10.7290;  1.8890]        7.7
McManus et al. 2009       2.0000 [  0.8920;  3.1080]       24.3

Number of studies combined: k = 5
Number of observations: o = 709

                          MD            95%-CI     z p-value
Random effects model -0.7227 [-2.8045; 1.3590] -0.68  0.4962

Quantifying heterogeneity:
 tau^2 = 4.3203 [0.9443; 51.1594]; tau = 2.0785 [0.9718; 7.1526]
 I^2 = 86.7% [71.1%; 93.9%]; H = 2.74 [1.86; 4.04]

Test of heterogeneity:
     Q d.f.  p-value
 30.05    4 < 0.0001

Details on meta-analytical method:
- Inverse variance method
- Restricted maximum-likelihood estimator for tau^2
- Q-profile method for confidence interval of tau^2 and tau
forest.meta(m.behav.qol, 
            sortvar = author,colgap = "5mm", digits.sd = 2,
            predict = FALSE, 
            print.tau2 = FALSE,
            leftlabs = c("Author","mean","SD", "n","mean","SD","n","Weight","MD","95%CI"),
            leftcols = c("studlab","est.e","sd.e","n.e","est.c","sd.c","n.c","w.random","effect","ci"),
            col.square = "blue", col.square.lines = "blue",
            col.diamond = "black",
            xlim = c(-5,5), at = c(-5,-2.5,0,2.5,5),
            layout = "RevMan5")

6 Risk of bias

In our study We used the first version of Cochrane’s Risk of Bias assessment (RoB1).

behavROB <- data.frame(
  Study = factor(c("Adie 2010","Allen 2002","Allen 2009","Barker-Collo 2015","Boss 2014","Boysen 2009",
                   "Brunner Frandsen 2012","Chanruengvanich 2006","Cheng 2018","Damush 2011","English 2016",
                   "Evans-Hudnall 2014","Faulkner 2014","Flemming 2013","Gillham 2010","Holzemer 2011",
                   "Hornnes 2011","Irewall 2015","Joubert 2006","Joubert 2009","Kim 2013","Kirk 2014",
                   "Kono 2013","McManus 2009","Moren 2016","Nir 2004","Peng 2004","Wan 2016","Wolfe 2010")),
  Random.sequence.generation. = factor(c('Low','Low','Low','Low','High','Low','Low','Some concerns',
                                         'Low','Low',
                                         'Low','Low','Low','Low','Low','Low','Low','Low','Low','Low','Low',
                                         'Low','Low','Low','Low','Some concerns','Some concerns','Low',
                                         'Low')),
  Allocation.concealment.= factor(c('Low','Low','Low','Low','Some concerns','Low','Low','Some concerns',
                                    'Low','Low','Low','Low','Low','Some concerns','Low','Some concerns',
                                    'Low','Low','Some concerns','Some concerns','Some concerns','Low',
                                    'Low','Low','Some concerns','Some concerns','High','Low','Low')),
  Blinding.of.participants.and.personnel. = factor(c('High','High','High','High','Some concerns','High',
                                                     'High','High','High','High','High','High','High',
                                                     'High','High','High','High','High','High','High',
                                                     'High','High','High','High','High','High','High',
                                                     'High','High')),
  Blinding.of.outcome.assessment. = factor(c('High','Low','Low','Low','Some concerns','Low','High',
                                             'High','Low','Low','Low','High','Low','High','High','High',
                                             'Low','High','High','High','High','Low','Low','High','Low',
                                             'High','High','Low','High')),
  Incomplete.outcome.data. = factor(c('Low','Low','Low','High','Low','Some concerns','Some concerns',
                                      'Low','Low','Low','Low','Low','Low','High','Low','High','Low',
                                      'Low','Some concerns','Low','Low','Low','Low','Low','Low',
                                      'Some concerns','High','Low','Low')),
  Selective.reporting. = factor(c('Low','Low','Low','Low','Some concerns','Low','Low','Low','Low','Low',
                                  'Low','Low','Low','Some concerns','Low','Some concerns','Low','Low',
                                  'High','Low','Low','Low','Low','Low','Low','Low','Some concerns',
                                  'Low','Low')),
  Other.sources.of.bias. = factor(c('Low','High','High','Some concerns','Some concerns','Low','Low',
                                    'High','Low','High','Low','High','Low','Low','High','Low','High',
                                    'Low','High','High','High','Low','Low','Low','High','Some concerns',
                                    'High','High','Low')),
  weight = rep(1,29)
  )

A summary bar chart of Rob1 can be drawn with the function {rob_summary()} from the library {robvis}

# library(robvis)
ro_sum <- rob_summary(data = behavROB, 
                  tool = "ROB1",weighted = F)
#' The figure is rendered with ggplot2 and can therefore be modified by adding theme arguments
ro_sum + theme(axis.text.y = element_text(size = 13, color = "black", hjust = 1),
               axis.text.x = element_text(size = 10),
               legend.text = element_text(size = 11) )

A traffic light table is a table that shows the Risk of Bias assessment for each individual study. This can be build with the function {rob_traffic_ligth} from the library {robvis}. Unfortunately, this function does not support Rob1, but has Rob2 as its’ default.

#' This function makes the traffic light table in the Rob2 format. The function restructures the data and renders the table using ggplot2

robLight <- rob_traffic_light(data = behavROB, 
                  tool = "ROB2", psize = 10)

# robLight + scale_size(range = c(1,10)) +
#  theme(
#    strip.background = element_rect(colour = "black", fill = "white"),
#    strip.text.y.left = element_text(angle = 0, size = 10),
#    strip.text.x = element_text(angle = 90, size = 10)
#  )

Although the function {rob_traffic_light} does not support RoB1 in itself, we can still use some its’ functionality to build a traffic light table from Rob1-data. In this example I have reused the restructured data generated from the function {rob_traffic_light} and rebuild the code used to render the table in {ggplot2}.


psize = 10
ssize <- psize - (psize/4)

rob.tidy <- robLight$data # Extracts the restructured data generated \function{rob_traffic_light}
trafficlightplot <- ggplot2::ggplot(rob.tidy, ggplot2::aes(x = 1, y = 1, colour = judgement)) + 
                    ggplot2::facet_grid(Study ~ 
                                          factor(domain, levels = c("D1", "D2", "D3",
                                                                    "D4","D5", "Overall"),
                                                 labels = c("Domain 1", "Domain 2", "Domain 3",
                                                            "Domain 4","Domain 5", "Domain 6")), 
                                                            switch = "y", space = "free") +
                    ggplot2::geom_point(size = 6) + 
                    ggplot2::geom_point(size = 4, colour = "black", ggplot2::aes(shape = judgement)) +
                    ggplot2::geom_rect(data = rob.tidy[which(rob.tidy$domain != "Overall"), ], 
                                       fill = "#ffffff", xmin = -Inf, xmax = Inf, ymin = -Inf, 
                                       ymax = Inf, show.legend = FALSE) +
                    ggplot2::geom_rect(data = rob.tidy[which(rob.tidy$domain == "Overall"), ], 
                                       fill = "#ffffff", xmin = -Inf, xmax = Inf, ymin = -Inf, ymax = Inf,
                                       show.legend = FALSE) +
                    ggplot2::geom_point(size = psize, show.legend = FALSE) +
                    ggplot2::geom_point(shape = 1, colour = "black", size = psize, show.legend = FALSE) +  
                    ggplot2::geom_point(size = ssize, colour = "black", ggplot2::aes(shape = judgement), 
                            show.legend = FALSE) + 
                    ggplot2::ggtitle("Figure #: Risk of bias") +
                    ggplot2::labs(caption = 
                              "    Domains:
    D1: Bias due to randomisation.
    D2: Bias due to allocation concealment.
    D3: Bias due to blinding of participants and personnel.
    D4: Bias due to blinding of outcome assessment.
    D5: Bias due to incomplete outcome data.
    D6: Bias due to selective reporting.
") +
                    ggplot2::scale_x_discrete(position = "top", name = "Risk of bias domains") +
                    ggplot2::scale_y_continuous(limits = c(1, 1), labels = NULL, breaks = NULL, 
                                                name = "", position = "left") +
                    ggplot2::scale_colour_manual(values = c(h = "#BF0000", s = "#E2DF07", l = "#02C100"),
                                                 labels = c(h = "High", s = "Some concerns", l = "Low")) + 
                    ggplot2::scale_shape_manual(values = c(h = 120, s = 45, l = 43), 
                                                labels = c(h = "High", s = "Some concerns",l = "Low")) +
                    ggplot2::scale_size(range = c(5,20)) + 
                    ggplot2::theme_bw() + 
                    ggplot2::theme(
                      # Title of the plot
                      plot.title = element_text(face = "bold", size = 14, hjust = 0),
                      # Panels
                      panel.border = ggplot2::element_rect(colour = "black"),
                      panel.spacing = ggplot2::unit(0, "line"), 
                      # Legend
                      legend.title = ggplot2::element_text(size = 9, face="bold"),
                      legend.position = "bottom", legend.justification = "right", 
                      legend.direction = "vertical", 
                      legend.text = ggplot2::element_text(size = 9),
                      legend.margin = ggplot2::margin(t = -0.2, r = 0, b = -2.5, l = -10, unit = "cm"),
                      # Captions
                      plot.caption = ggplot2::element_text(size = 10, hjust = 0, vjust = 1),
                      plot.caption.position =  "plot",
                      # Strip (Text along the axis)
                      strip.text.x = ggplot2::element_text(angle = 90, size = 10),
                      strip.text.y = ggplot2::element_text(angle = 180, size = 10), 
                      strip.text.y.left = element_text(angle = 0, size = 10, hjust = 1),
                      strip.background = ggplot2::element_rect(fill = "white")
                              ) + 
                    ggplot2::guides(shape = ggplot2::guide_legend(override.aes = list(fill = NA))) +
                    ggplot2::labs(shape = "Judgement", colour = "Judgement") 
                    
trafficlightplot 

7 Publication bias

7.1 Funnel-plot

Funnel-plots can be made with the function {funnel.meta} from the library {meta}. In this example the funnel-plots are based in the model for systolic blood pressure.

funnel.meta(m.behav.sbp)

#' Added contour lines with significance levels and the names of the studies
funnel.meta(m.behav.sbp, studlab = TRUE, zval = TRUE,
            contour = c(0.9, 0.95, 0.99),
            col.contour = c("gray90", "gray95", "gray99"))
legend(x = 10, y = 0.01, 
       legend = c("p < 0.1", "p < 0.05", "p < 0.01"),
       fill = c("gray90", "gray95", "gray99"))

7.2 Statistical test for publication bias

Egger’s test can be calculated using the function {metabias} from the libray {meta}

metabias(m.behav.sbp, method.bias = "linreg")
Warning in metabias.meta(m.behav.sbp, method.bias = "linreg") :
  1 observation(s) dropped due to missing values
Review:     Systolic Blood Pressure

Linear regression test of funnel plot asymmetry

Test result: t = -0.19, df = 11, p-value = 0.8539

Sample estimates:
    bias se.bias intercept se.intercept
 -0.1694  0.8990   -3.2135       2.5565

Details:
- multiplicative residual heterogeneity variance (tau^2 = 2.2979)
- predictor: standard error
- weight:    inverse variance
- reference: Egger et al. (1997), BMJ
eggers.test(m.behav.sbp)
Warning in metabias.meta(x, k.min = 3, method = "linreg") :
  1 observation(s) dropped due to missing values
Eggers' test of the intercept 
============================= 

Eggers' test does not indicate the presence of funnel plot asymmetry. 

Contact:
Jacob Mesot Liljehult, RN MScHS
Department of Neurology
Nordsjællands Hospital
Denmark

LS0tDQp0aXRsZTogIk1ldGFhbmFseXNpcyINCm91dHB1dDogaHRtbF9ub3RlYm9vaw0KLS0tDQoNClRoaXMgZG9jdW1lbnQgZGVtb25zdHJhdGVzIGhvdyB5b3UgY2FuIGRvIG1ldGEtYW5hbHlzZXMgb24gcmFuZG9taXNlZCBjb250cm9sbGVkIHRyYWlscyB1c2luZyB0aGUge21ldGF9LCB7bWV0YWZvcn0se2RtZXRhcn0gcGFja2FnZXMgaW4gUi4gRnVydGhlciBkb2N1bWVudGF0aW9uIGZvciB0aGUgcGFja2FnZXMgY2FuIGJlIGZvdW5kIGluIFtIYXJyZXIgZXQgYWwuXShodHRwczovL2Jvb2tkb3duLm9yZy9NYXRoaWFzSGFycmVyL0RvaW5nX01ldGFfQW5hbHlzaXNfaW5fUi8pDQoNClN0dWR5IGRldGFpbHMgY2FuIGJlIGZvdW5kIGhlcjoNCg0KX19QUk9TUEVSTzpfXyBodHRwczovL3d3dy5jcmQueW9yay5hYy51ay9wcm9zcGVyby9kaXNwbGF5X3JlY29yZC5waHA/UmVjb3JkSUQ9NjQ2ODENCg0KX19GaW5hbCBwdWJsaWNhdGlvbjpfXyBcDQpMaWxqZWh1bHQgSiwgQ2hyaXN0ZW5zZW4gVCwgTW9sc3RlZCBTLCBPdmVyZ2FhcmQgRCwgTWVzb3QgTGlsamVodWx0IE0sIE3DuGxsZXIgVC4gKkVmZmVjdCBhbmQgZWZmaWNhY3kgb2YgbGlmZXN0eWxlIGludGVydmVudGlvbnMgYXMgc2Vjb25kYXJ5IHByZXZlbnRpb24qLiBBY3RhIE5ldXJvbCBTY2FuZC4gMjAyMCBPY3Q7MTQyKDQpOjI5OS0zMTMuIGRvaTogMTAuMTExMS9hbmUuMTMzMDguIEVwdWIgMjAyMCBKdWwgMTUuIFBNSUQ6IDMyNjIwMDQ0OyBQTUNJRDogUE1DNzU0MDQ2NC5cDQpodHRwczovL1B1Yk1lZC5uY2JpLm5sbS5uaWguZ292LzMyNjIwMDQ0LyBvclwNCmh0dHBzOi8vd3d3Lm5jYmkubmxtLm5paC5nb3YvcG1jL2FydGljbGVzL1BNQzc1NDA0NjQvDQoNCg0KX19MaXR0ZXJhdHVyOl9fIFwNCkhhcnJlciwgTS4sIEN1aWpwZXJzLCBQLiwgRnVydWthd2EsIFQuQS4sICYgRWJlcnQsIEQuRC4gKDIwMjEpLiAqRG9pbmcgTWV0YS1BbmFseXNpcyB3aXRoIFI6IEEgSGFuZHMtT24gR3VpZGUuKiBCb2NhIFJhdG9uLCBGTCBhbmQgTG9uZG9uOiBDaGFwbWFubiAmIEhhbGwvQ1JDIFByZXNzLiBJU0JOIDk3OC0wLTM2Ny02MTAwNy00Lg0KaHR0cHM6Ly9ib29rZG93bi5vcmcvTWF0aGlhc0hhcnJlci9Eb2luZ19NZXRhX0FuYWx5c2lzX2luX1IvDQoNCkZvbGxvd2luZyBsaWJyYXJpZXMgYXJlIHVzZWQ6ICANCntkcGx5cn0sIHttZXRhfSwge21ldGFmb3J9LCB7ZG1ldGFyfSwge3JvYnZpc30sIHtnZ3Bsb3QyfQ0KDQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBpbmNsdWRlPUZBTFNFfQ0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkobWV0YSkNCmxpYnJhcnkobWV0YWZvcikNCmxpYnJhcnkoZG1ldGFyKQ0KbGlicmFyeShyb2J2aXMpDQpsaWJyYXJ5KGdncGxvdDIpDQpgYGANCg0KYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgZXZhbD1GQUxTRX0NCmxpYnJhcnkoZHBseXIpDQpsaWJyYXJ5KG1ldGEpDQpsaWJyYXJ5KG1ldGFmb3IpDQpsaWJyYXJ5KGRtZXRhcikNCmxpYnJhcnkocm9idmlzKQ0KbGlicmFyeShnZ3Bsb3QyKQ0KYGBgDQoNCiMjIDEgVml0YWwgc2lnbnMNCiMjIyAxLjEgU3lzdG9saWMgQmxvb2QgUHJlc3N1cmUNCk1ldGEtYW5hbHlzaXMgb2YgdGhlIGVmZmVjdCBvZiBiZWhhdmlvdXJhbCBpbnRlcnZlbnRpb25zIG9uIHN5c3RvbGljIGJsb29kIHByZXNzdXJlIG9uIHBhdGllbnRzIHdpdGggc3Ryb2tlIG9yIFRJQQ0KYGBge3J9DQpiZWhhdk1ldGEgPC0gZGF0YS5mcmFtZSgNCiAgIyBTeXN0b2xpYyBibG9vZCBwcmVzc3VyZQ0KICBkb21haW4gPSByZXAoIlNCUCIsMTQpLA0KICBhdXRob3IgPSBjKCJBZGllIGV0IGFsIDIwMTAiLCAiQmFya2VyLUNvbGxvIGV0IGFsIDIwMTUiLCAiQm9zcyBldCBhbCAyMDE0IiwgDQogICAgICAgICAgICAgIkNoYW5ydWVuZ3ZhbmljaCBldCBhbCAyMDA2IiwgIkNoZW5nIGV0IGFsIDIwMTgiLCAiRmF1bGtuZXIgZXQgYWwgMjAxNCIsIkhvbHplbWVyIGV0IGFsIDIwMTEiLCANCiAgICAgICAgICAgICAiSG9ybm5lcyBldCBhbCAyMDExIiwgIklyZXdhbGwgZXQgYWwgMjAxNSIsICJKb3ViZXJ0IGV0IGFsIDIwMDYiLCANCiAgICAgICAgICAgICAiSm91YmVydCBldCBhbCAyMDA5IiwgIktpcmsgZXQgYWwgMjAxNCIsICJLb25vIGV0IGFsIDIwMTMiLCAiTWNNYW51cyBldCBhbCAyMDA5IiksDQogIG4uZSA9IGMoMjksMTcyLDEwLDMxLDIwNCwzMCwxMiwxNDUsMjQxLDM1LDkxLDEyLDM1LDQ5KSwNCiAgZXN0LmUgPSBjKDE0MiwxMzcuNDEsMTIwLDE0MS4xOSwxMzIuMywxMjksMTM4LjcsMTM5LjQsMTMxLjksMTMyLjM0LDEyOC41LDEzMS45MiwxMjIuMSwxNDMpLA0KICBzZC5lID0gYygxOS4zLDE4Ljc5LDEyLjYsMTYuNzcsMjAuNSwxMiwzMSwyMS4zLDE1LjcsMCwxMy43LDE1LjIsMTUuOSwxOC44KSwNCiAgbi5jID0gYygyNywxNzIsMTAsMzEsMjAwLDMwLDE1LDE1OCwyNDMsNDUsOTUsMTIsMzUsNTMpLA0KICBlc3QuYyA9IGMoMTQyLjQsMTM4LjQyLDEyNywxMzcuOTQsMTM2LjEsMTM4LDE0NC43LDE0Mi40LDEzNSwxMzYuNTgsMTM0LjUsMTMxLjkyLDEzOC45LDEzOSksDQogIHNkLmMgPSBjKDE3LjIsMTcuNjksMjEuMywyMi43NCwyMC44LDE1LDMwLjIsMjIuMiwxNy41LDAsMTkuNCwxOC4xLDEzLjgsMjEuNiksDQogIHllYXIgPSBjKDIwMTAsMjAxNSwyMDE0LDIwMDYsMjAxOCwyMDE0LDIwMTEsMjAxMSwyMDE1LDIwMDYsMjAwOSwyMDE0LDIwMTMsMjAwOSksDQogIA0KICAjIFN0cmF0YXMgZm9yIHN1Ymdyb3VwIGFuYWx5c2VzDQogIHJlY3J1aXRtZW50ID0gZmFjdG9yKGMoMiwyLDEsOSwzLDIsMSw5LDIsMSwxLDIsMSwzKSwgDQogICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoMSwyLDMsOSksIGxhYmVscyA9IGMoIkVhcmx5IiwiTWVkaXVtIiwiTGF0ZSIsIlVuY2xlYXIiKSksDQogIGludGxlbmd0aCA9IGZhY3RvcihjKDIsMiwxLDEsMywxLDEsMiwzLDMsMywxLDIsMiksIA0KICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygxLDIsMyksIGxhYmVscyA9IGMoIlNob3J0IiwiTWVkaXVtIiwiTG9uZyIpKSwNCiAgdHJhaW5pbmcgPSBmYWN0b3IoYygyLDIsMSwyLDIsMSwyLDIsMiwyLDIsMSwxLDIpLCANCiAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygxLDIpLCBsYWJlbHMgPSBjKCJZZXMiLCJObyIpKSwNCiAgdGhlb3J5ID0gZmFjdG9yKGMoMSwxLDEsMSwxLDEsMSwyLDIsMiwyLDIsMiwyKSwgDQogICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoMSwyKSwgbGFiZWxzID0gYygiWWVzIiwiTm8iKSksDQogIHN1cHBvcnQgPSBmYWN0b3IoYygyLDIsMiwxLDIsMiwyLDIsMiwxLDEsMiwyLDIpLCANCiAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygxLDIpLCBsYWJlbHMgPSBjKCJZZXMiLCJObyIpKSwNCiAgcG9wdWxhdGlvbiA9IGZhY3RvcihjKDEsMywxLDEsMiwxLDMsMiwyLDIsMiwxLDEsMyksIA0KICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoMSwyLDMpLCBsYWJlbHMgPSBjKCJNaW5vci9USUEiLCJBbGwiLCJVbmtub3duIikpDQopDQpiZWhhdk1ldGENCmBgYA0KDQoNCiMjIyMgMS4xLjEgT3ZlcmFsbCBtZXRhLWFuYWx5c2lzDQpgYGB7cn0NCm0uYmVoYXYuc2JwIDwtIGJlaGF2TWV0YSAlPiUgDQogICAgZmlsdGVyKGRvbWFpbiA9PSAiU0JQIikgJT4lIA0KICAgIG1ldGFjb250KCBuLmUgPSBuLmUsICMgbnVtYmVyIGluIGV4cGVyaW1lbnRhbCBncm91cCANCiAgICAgICAgICAgICAgbWVhbi5lID0gZXN0LmUsICMgbWVhbiBvZiBleHBlcmltZW50YWwgZ3JvdXANCiAgICAgICAgICAgICAgc2QuZSA9IHNkLmUsICMgU0Qgb2YgZXhwZXJpbWVudGFsIGdyb3VwDQogICAgICAgICAgICAgIG4uYyA9IG4uYywgIyBudW1iZXIgaW4gY29udHJvbCBncm91cA0KICAgICAgICAgICAgICBtZWFuLmMgPSBlc3QuYywgIyBtZWFuIG9mIGNvbnRyb2wgZ3JvdXANCiAgICAgICAgICAgICAgc2QuYyA9IHNkLmMsICMgU0Qgb2YgY29udHJvbCBncm91cA0KICAgICAgICAgICAgICBzdHVkbGFiID0gYXV0aG9yLCANCiAgICAgICAgICAgICAgc20gPSAiTUQiLCAjIHBvb2xpbmcgbWV0aG9kLCBNRCBpcyBNZWFuIERpZmZlcmVuY2UNCiAgICAgICAgICAgICAgbWV0aG9kLnNtZCA9ICJIZWRnZXMiLA0KICAgICAgICAgICAgICBjb21iLmZpeGVkID0gRkFMU0UsICMgTm90IGRvaW5nIGZpeGVkIGVmZmVjdCBtb2RlbA0KICAgICAgICAgICAgICBjb21iLnJhbmRvbSA9IFRSVUUsICMgRG9pbmcgcmFuZG9tIGVmZmVjdHMgbW9kZWwNCiAgICAgICAgICAgICAgbWV0aG9kLnRhdSA9ICJSRU1MIiwgIyBEZWZpbmluZyBtZXRob2QgZm9yIHRhdQ0KICAgICAgICAgICAgICBoYWtuID0gRkFMU0UsICMgTm90IHVzaW5nIEtuYXBwLUhhcnR1bmcgYWRqdXN0bWVudA0KICAgICAgICAgICAgICB0aXRsZSA9ICJTeXN0b2xpYyBCbG9vZCBQcmVzc3VyZSIpDQptLmJlaGF2LnNicA0KYGBgDQpUaGUgd2FybmluZyBtZWFucyB0aGF0IGEgc3R1ZHkgKEpvdWJlcnQgZXQgYWwgMjAwNikgaGFzIGJlZW4gb21pdHRlZCBmcm9tIHRoZSBtZXRhLWFuYWx5c2lzIGJlY2F1c2Ugbm8gU0Qgd2FzIHN0YXRlZC4gQSBtZWFuIGRpZmZlcmVuY2UgaGFzIGJlZW4gY2FsY3VsYXRlZCwgYnV0IG5vIGNvbmZpZGVuY2UgaW50ZXJ2YWwsIGFuZCB0aGUgc3R1ZHkgaXMgbm90IGluY2x1ZGVkIGluIHRoZSByYW5kb20gZWZmZWN0cyBtb2RlbCAod2VpZ2h0ID0gMCUpLg0KDQpfX0ZvcmVzdCBwbG90X18NCmBgYHtyIGZpZy53aWR0aD0xMC41LCBmaWcuaGVpZ2h0PTV9DQpmb3Jlc3QubWV0YShtLmJlaGF2LnNicCwgIyBNb2RlbCB0byBiZSBwbG90dGVkDQogICAgICAgICAgICBzb3J0dmFyID0gYXV0aG9yLCAjIFRoZSBzdHVkaWVzIGFyZSBzb3J0ZWQgYWxwaGFiZXRpY2FsbHkgYnkgYXV0aG9yDQogICAgICAgICAgICBwcmVkaWN0ID0gRkFMU0UsICMgUHJlZGljdGlvbiBpbnRlcnZhbCBpcyBvbWl0dGVkIGZyb20gdGhlIHBsb3QNCiAgICAgICAgICAgIHByaW50LnRhdTIgPSBGQUxTRSwgIyBUYXUgaXMgb21pdHRlZCBmcm9tIHRoZSB0ZXh0DQogICAgICAgICAgICBjb2xnYXAgPSAiM21tIiwgIyBSZWd1bGF0ZXMgdGhlIHNwYWNlIGJldHdlZW4gdGhlIGNvbHVtbnMgDQogICAgICAgICAgICBsZWZ0bGFicyA9ICMgQ29sdW1uIGxhYmVscw0KICAgICAgICAgICAgICBjKCJTdHVkeSIsICJtZWFuIiwiU0QiLCAibiIsIm1lYW4iLCJTRCIsIm4iLCJXZWlnaHQiLCJNRCIsIjk1JUNJIiksDQogICAgICAgICAgICBsZWZ0Y29scyA9ICMgRGVmaW5lcyB0aGUgY29udGVudCBvZiB0aGUgY29sdW1ucyBvbiB0aGUgbGVmdA0KICAgICAgICAgICAgICBjKCJzdHVkbGFiIiwiZXN0LmUiLCJzZC5lIiwibi5lIiwiZXN0LmMiLCJzZC5jIiwibi5jIiwidy5yYW5kb20iLCJURSIsImNpIiksDQogICAgICAgICAgICBkaWdpdHMuc2QgPSAyLCAjIE51bWJlciBvZiBkaWdpdHMgYWZ0ZXIgU0QsIGRlZmF1bHQgaXMgNA0KICAgICAgICAgICAgY29sLnNxdWFyZSA9ICJibHVlIiwgIyBDb2xvdXIgb2YgdGhlIHNxdWFyZXMNCiAgICAgICAgICAgIGNvbC5zcXVhcmUubGluZXMgPSAiYmx1ZSIsICMgQ29sb3VyIG9mIHRoZSBzcXVhcmUgbGluZXMNCiAgICAgICAgICAgIGNvbC5kaWFtb25kID0gImJsYWNrIiwgIyBDb2xvdXIgb2YgdGhlIHN1bW1hcnkgZGlhbW9uZA0KICAgICAgICAgICAgbGF5b3V0ID0gIlJldk1hbjUiICMgVXNpbmcgdGhlIFJldmlldyBNYW5hZ2VyIDUgbGF5b3V0IA0KICAgICAgICAgICAgKQ0KIycgTm90ZTogSW4gbWFya2Rvd24gdGhlIGZvcmVzdCBwbG90IGlzIG5vdCByZS1zaXplZCB0byBmaXQgdGhlIHdpbmRvdyBhbmQgaW4gbW9zdCANCiMnIGNhc2VzIHRoZSBzaWRlcyB3aWxsIGJlIGN1dCBvZmYuIFRoaXMgY2FuIGJlIHByZXZlbnRlZCBieSBmb3JjaW5nIHRoZSBzaXplIG9mIHRoZSANCiMnIHBsb3QgYnkgYWRkaW5nIHtmaWcud2lkdGh9IGFuZCB7ZmlnLmhlaWdodH0gYXJndW1lbnRzIHRvIHRoZSBjaHVjayBjb2RlLg0KYGBgDQojIyMgMS4yIFN1Ymdyb3VwIGFuYWx5c2VzDQpTdWItZ3JvdXAgYW5hbHlzaXMgaXMgZG9uZSBieSBtYWtpbmcgYW4gdXBkYXRlZCBtb2RlbCBhbmQgYWRkaW5nIGEgc3RyYXRhIHZhcmlhYmxlIHdpdGggdGhlIGFyZ3VtZW50IHtieXZhcn0uIFRoZSBzdHJhdGEgdmFyaWFibGUgbXVzdCBiZSBhIGZhY3RvciB2YXJpYWJsZSBmb3IgdGhpcyB0byB3b3JrIGFuZCBhZGRpbmcgbGFiZWxzIGlzIGhpZ2hseSByZWNvbW1lbmRlZC4NCg0KIyMjIyAxLjIuMSBTdHJhdGE6IFN0dWR5IHBvcHVsYXRpb24NCmBgYHtyfQ0KbS5iZWhhdi5zYnAyIDwtIHVwZGF0ZS5tZXRhKG0uYmVoYXYuc2JwLCAjIG5hbWUgb2YgbW9kZWwNCiAgICAgICAgICAgIGJ5dmFyID0gcG9wdWxhdGlvbiwgIyBzdHJhdGlmeWluZyBieSBzdHVkeSBwb3B1bGF0aW9uDQogICAgICAgICAgICB0YXUuY29tbW9uID0gRkFMU0UpDQptLmJlaGF2LnNicDINCmBgYA0KDQpfX0ZvcmVzdCBwbG90X18NCmBgYHtyIGZpZy53aWR0aD0xMSwgZmlnLmhlaWdodD03fQ0KIycgRHJhd2luZyBhIGZvcmVzdCBwbG90IGZyb20gYSBzdWItZ3JvdXAgbW9kZWwNCmZvcmVzdC5zYnAyIDwtIGZvcmVzdC5tZXRhKG0uYmVoYXYuc2JwMiwgDQogICAgICAgICAgICBzb3J0dmFyID0gcG9wdWxhdGlvbiwNCiAgICAgICAgICAgIGNvbGdhcCA9ICIzbW0iLCBkaWdpdHMuc2QgPSAyLA0KICAgICAgICAgICAgcHJlZGljdCA9IEZBTFNFLCANCiAgICAgICAgICAgIHByaW50LnRhdTIgPSBGQUxTRSwNCiAgICAgICAgICAgIGxlZnRsYWJzID0gYygiQXV0aG9yIiwibWVhbiIsIlNEIiwgIm4iLCJtZWFuIiwiU0QiLCJuIiwiV2VpZ2h0IiwiTUQiLCI5NSVDSSIpLA0KICAgICAgICAgICAgbGVmdGNvbHMgPSBjKCJzdHVkbGFiIiwiZXN0LmUiLCJzZC5lIiwibi5lIiwiZXN0LmMiLCJzZC5jIiwibi5jIiwidy5yYW5kb20iLCJlZmZlY3QiLCJjaSIpLA0KICAgICAgICAgICAgY29sLnNxdWFyZSA9ICJibHVlIiwgY29sLnNxdWFyZS5saW5lcyA9ICJibHVlIiwNCiAgICAgICAgICAgIGNvbC5kaWFtb25kID0gImJsYWNrIiwNCiAgICAgICAgICAgIGxheW91dCA9ICJSZXZNYW41Ig0KICAgICAgICAgICAgKQ0KYGBgDQoNCiMjIyMgMS4yLjIgU3RyYXRhOiBSZWNydWl0bWVudA0KYGBge3J9DQptLmJlaGF2LnNicC5yZWNyaXV0IDwtIHVwZGF0ZS5tZXRhKG0uYmVoYXYuc2JwLCAjIG5hbWUgb2YgbW9kZWwNCiAgICAgICAgICAgIGJ5dmFyID0gcmVjcnVpdG1lbnQsICMgc3RyYXRpZnlpbmcgdmFyaWFibGUNCiAgICAgICAgICAgIHRhdS5jb21tb24gPSBGQUxTRSkNCm0uYmVoYXYuc2JwLnJlY3JpdXQNCmBgYA0KYGBge3IgZmlnLndpZHRoPTExLCBmaWcuaGVpZ2h0PTh9DQpmb3Jlc3QubWV0YShtLmJlaGF2LnNicC5yZWNyaXV0LCANCiAgICAgICAgICAgIHNvcnR2YXIgPSByZWNydWl0bWVudCwNCiAgICAgICAgICAgIGNvbGdhcCA9ICIzbW0iLCBkaWdpdHMuc2QgPSAyLA0KICAgICAgICAgICAgcHJlZGljdCA9IEZBTFNFLCANCiAgICAgICAgICAgIHByaW50LnRhdTIgPSBGQUxTRSwNCiAgICAgICAgICAgIGxlZnRsYWJzID0gYygiQXV0aG9yIiwibWVhbiIsIlNEIiwgIm4iLCJtZWFuIiwiU0QiLCJuIiwiV2VpZ2h0IiwiTUQiLCI5NSVDSSIpLA0KICAgICAgICAgICAgbGVmdGNvbHMgPSBjKCJzdHVkbGFiIiwiZXN0LmUiLCJzZC5lIiwibi5lIiwiZXN0LmMiLCJzZC5jIiwibi5jIiwidy5yYW5kb20iLCJlZmZlY3QiLCJjaSIpLA0KICAgICAgICAgICAgY29sLnNxdWFyZSA9ICJibHVlIiwgY29sLnNxdWFyZS5saW5lcyA9ICJibHVlIiwNCiAgICAgICAgICAgIGNvbC5kaWFtb25kID0gImJsYWNrIiwNCiAgICAgICAgICAgIGxheW91dCA9ICJSZXZNYW41IikNCmBgYA0KDQojIyMjIDEuMi4zIFN0cmF0YTogTGVuZ3RoIG9mIHRoZSBpbnRlcnZlbnRpb24NCmBgYHtyfQ0KbS5iZWhhdi5zYnAubGVuZ3RoIDwtIHVwZGF0ZS5tZXRhKG0uYmVoYXYuc2JwLCAjIG5hbWUgb2YgbW9kZWwNCiAgICAgICAgICAgIGJ5dmFyID0gaW50bGVuZ3RoLCAjIHN0cmF0aWZ5aW5nIHZhcmlhYmxlDQogICAgICAgICAgICB0YXUuY29tbW9uID0gRkFMU0UpDQptLmJlaGF2LnNicC5sZW5ndGgNCmBgYA0KYGBge3IgZmlnLndpZHRoPTExLCBmaWcuaGVpZ2h0PTd9DQpmb3Jlc3QubWV0YShtLmJlaGF2LnNicC5sZW5ndGgsIA0KICAgICAgICAgICAgc29ydHZhciA9IGludGxlbmd0aCwNCiAgICAgICAgICAgIGNvbGdhcCA9ICIzbW0iLCBkaWdpdHMuc2QgPSAyLA0KICAgICAgICAgICAgcHJlZGljdCA9IEZBTFNFLCANCiAgICAgICAgICAgIHByaW50LnRhdTIgPSBGQUxTRSwNCiAgICAgICAgICAgIGxlZnRsYWJzID0gYygiQXV0aG9yIiwibWVhbiIsIlNEIiwgIm4iLCJtZWFuIiwiU0QiLCJuIiwiV2VpZ2h0IiwiTUQiLCI5NSVDSSIpLA0KICAgICAgICAgICAgbGVmdGNvbHMgPSBjKCJzdHVkbGFiIiwiZXN0LmUiLCJzZC5lIiwibi5lIiwiZXN0LmMiLCJzZC5jIiwibi5jIiwidy5yYW5kb20iLCJlZmZlY3QiLCJjaSIpLA0KICAgICAgICAgICAgY29sLnNxdWFyZSA9ICJibHVlIiwgY29sLnNxdWFyZS5saW5lcyA9ICJibHVlIiwNCiAgICAgICAgICAgIGNvbC5kaWFtb25kID0gImJsYWNrIiwNCiAgICAgICAgICAgIGxheW91dCA9ICJSZXZNYW41IikNCmBgYA0KDQojIyMjIDEuMi40IFN0cmF0YTogUGh5c2ljYWwgdHJhaW5pbmcgaW5jbHVkZWQgaW4gdGhlIGludGVydmVudGlvbg0KYGBge3J9DQptLmJlaGF2LnNicC50cmFpbmluZyA8LSB1cGRhdGUubWV0YShtLmJlaGF2LnNicCwgIyBuYW1lIG9mIG1vZGVsDQogICAgICAgICAgICBieXZhciA9IHRyYWluaW5nLCAjIHN0cmF0aWZ5aW5nIHZhcmlhYmxlDQogICAgICAgICAgICB0YXUuY29tbW9uID0gRkFMU0UpDQptLmJlaGF2LnNicC50cmFpbmluZw0KYGBgDQpgYGB7ciBmaWcud2lkdGg9MTEsIGZpZy5oZWlnaHQ9Nn0NCmZvcmVzdC5tZXRhKG0uYmVoYXYuc2JwLnRyYWluaW5nLCANCiAgICAgICAgICAgIHNvcnR2YXIgPSB0cmFpbmluZywNCiAgICAgICAgICAgIGNvbGdhcCA9ICIzbW0iLCBkaWdpdHMuc2QgPSAyLA0KICAgICAgICAgICAgcHJlZGljdCA9IEZBTFNFLCANCiAgICAgICAgICAgIHByaW50LnRhdTIgPSBGQUxTRSwNCiAgICAgICAgICAgIGxlZnRsYWJzID0gYygiQXV0aG9yIiwibWVhbiIsIlNEIiwgIm4iLCJtZWFuIiwiU0QiLCJuIiwiV2VpZ2h0IiwiTUQiLCI5NSVDSSIpLA0KICAgICAgICAgICAgbGVmdGNvbHMgPSBjKCJzdHVkbGFiIiwiZXN0LmUiLCJzZC5lIiwibi5lIiwiZXN0LmMiLCJzZC5jIiwibi5jIiwidy5yYW5kb20iLCJlZmZlY3QiLCJjaSIpLA0KICAgICAgICAgICAgY29sLnNxdWFyZSA9ICJibHVlIiwgY29sLnNxdWFyZS5saW5lcyA9ICJibHVlIiwNCiAgICAgICAgICAgIGNvbC5kaWFtb25kID0gImJsYWNrIiwNCiAgICAgICAgICAgIGxheW91dCA9ICJSZXZNYW41IikNCmBgYA0KDQojIyMjIDEuMi41IFN0cmF0YTogVGhlb3J5IGJhc2VkIGludGVydmVudGlvbg0KYGBge3J9DQptLmJlaGF2LnNicC50aGVvcnkgPC0gdXBkYXRlLm1ldGEobS5iZWhhdi5zYnAsICMgbmFtZSBvZiBtb2RlbA0KICAgICAgICAgICAgYnl2YXIgPSB0aGVvcnksICMgc3RyYXRpZnlpbmcgdmFyaWFibGUNCiAgICAgICAgICAgIHRhdS5jb21tb24gPSBGQUxTRSkNCm0uYmVoYXYuc2JwLnRoZW9yeQ0KYGBgDQoNCmBgYHtyIGZpZy53aWR0aD0xMSwgZmlnLmhlaWdodD03fQ0KIycgRHJhd2luZyBhIGZvcmVzdCBwbG90IGZyb20gYSBzdWItZ3JvdXAgbW9kZWwNCmZvcmVzdC5tZXRhKG0uYmVoYXYuc2JwLnRoZW9yeSwgDQogICAgICAgICAgICBzb3J0dmFyID0gcG9wdWxhdGlvbiwNCiAgICAgICAgICAgIGNvbGdhcCA9ICIzbW0iLCBkaWdpdHMuc2QgPSAyLA0KICAgICAgICAgICAgcHJlZGljdCA9IEZBTFNFLCANCiAgICAgICAgICAgIHByaW50LnRhdTIgPSBGQUxTRSwNCiAgICAgICAgICAgIGxlZnRsYWJzID0gYygiQXV0aG9yIiwibWVhbiIsIlNEIiwgIm4iLCJtZWFuIiwiU0QiLCJuIiwiV2VpZ2h0IiwiTUQiLCI5NSVDSSIpLA0KICAgICAgICAgICAgbGVmdGNvbHMgPSBjKCJzdHVkbGFiIiwiZXN0LmUiLCJzZC5lIiwibi5lIiwiZXN0LmMiLCJzZC5jIiwibi5jIiwidy5yYW5kb20iLCJlZmZlY3QiLCJjaSIpLA0KICAgICAgICAgICAgY29sLnNxdWFyZSA9ICJibHVlIiwgY29sLnNxdWFyZS5saW5lcyA9ICJibHVlIiwNCiAgICAgICAgICAgIGNvbC5kaWFtb25kID0gImJsYWNrIiwNCiAgICAgICAgICAgIGxheW91dCA9ICJSZXZNYW41Ig0KICAgICAgICAgICAgKQ0KYGBgDQoNCg0KIyMjIyAxLjIuNiBTdHJhdGE6IFNvY2lhbCBzdXBwb3J0IHBhcnQgb2YgdGhlIGludGVydmVudGlvbg0KYGBge3J9DQptLmJlaGF2LnNicC5zdXBwb3J0IDwtIHVwZGF0ZS5tZXRhKG0uYmVoYXYuc2JwLCAjIG5hbWUgb2YgbW9kZWwNCiAgICAgICAgICAgIGJ5dmFyID0gc3VwcG9ydCwgIyBzdHJhdGlmeWluZyB2YXJpYWJsZQ0KICAgICAgICAgICAgdGF1LmNvbW1vbiA9IEZBTFNFKQ0KbS5iZWhhdi5zYnAuc3VwcG9ydA0KYGBgDQpgYGB7ciBmaWcud2lkdGg9MTEsIGZpZy5oZWlnaHQ9N30NCiMnIERyYXdpbmcgYSBmb3Jlc3QgcGxvdCBmcm9tIGEgc3ViLWdyb3VwIG1vZGVsDQpmb3Jlc3QubWV0YShtLmJlaGF2LnNicC5zdXBwb3J0LCANCiAgICAgICAgICAgIHNvcnR2YXIgPSBwb3B1bGF0aW9uLA0KICAgICAgICAgICAgY29sZ2FwID0gIjNtbSIsIGRpZ2l0cy5zZCA9IDIsDQogICAgICAgICAgICBwcmVkaWN0ID0gRkFMU0UsIA0KICAgICAgICAgICAgcHJpbnQudGF1MiA9IEZBTFNFLA0KICAgICAgICAgICAgbGVmdGxhYnMgPSBjKCJBdXRob3IiLCJtZWFuIiwiU0QiLCAibiIsIm1lYW4iLCJTRCIsIm4iLCJXZWlnaHQiLCJNRCIsIjk1JUNJIiksDQogICAgICAgICAgICBsZWZ0Y29scyA9IGMoInN0dWRsYWIiLCJlc3QuZSIsInNkLmUiLCJuLmUiLCJlc3QuYyIsInNkLmMiLCJuLmMiLCJ3LnJhbmRvbSIsImVmZmVjdCIsImNpIiksDQogICAgICAgICAgICBjb2wuc3F1YXJlID0gImJsdWUiLCBjb2wuc3F1YXJlLmxpbmVzID0gImJsdWUiLA0KICAgICAgICAgICAgY29sLmRpYW1vbmQgPSAiYmxhY2siLA0KICAgICAgICAgICAgbGF5b3V0ID0gIlJldk1hbjUiDQogICAgICAgICAgICApDQpgYGANCg0KIyMjIDEuMyBIeXBlcnRlbnNpb24NCk1ldGEtYW5hbHlzaXMgb2YgdGhlIG51bWJlciBvZiBwYXJ0aWNpcGFudHMgd2hvIG9idGFpbmVkIHRoZWlyIGdvYWwtYmxvb2QgcHJlc3N1cmUgKGJpbm9taWFsKQ0KDQpgYGB7cn0NCiMgSHlwZXJ0ZW5zaW9uIGRhdGENCmJlaGF2TWV0YSA8LSBiZWhhdk1ldGEgJT4lIGFkZF9yb3coDQogIGRvbWFpbiA9IHJlcCgiaHlwZXJ0ZW5zaW9uIiw2KSwNCiAgYXV0aG9yID0gYygiQWxsZW4gZXQgYWwiLCJCb3NzIGV0IGFsIiwiQ2hlbmcgZXQgYWwiLCJJcmV3YWxsIGV0IGFsIiwiSm91YmVydCBldCBhbCIsIkpvdWJlcnQgZXQgYWwiKSwNCiAgeWVhciA9IGMoMjAwOSwyMDE0LDIwMTgsMjAxNSwyMDA2LDIwMDkpLA0KICBlc3QuZSA9IGMoMTA2LDksMTE1LDE2NSwxOCw2NiksDQogIG4uZSA9IGMoMTkwLDEwLDIwNCwyNDEsMzUsODgpLA0KICBlc3QuYyA9IGMoMTEyLDgsOTgsMTM4LDIxLDUyKSwNCiAgbi5jID0gYygxOTAsMTAsMjAwLDI0Myw0NSw5MCkgDQopDQojJyBWYXJpYWJsZXMgdGhhdCBhcmUgbm90IGRlZmluZWQgYXJlIGF1dG9tYXRpY2FsbHkgc2V0IHRvIE5BLCBzbyB0aGV5IGNhbiBqdXN0IGJlIGxlZnQgb3V0DQpiZWhhdk1ldGEgJT4lIGZpbHRlcihkb21haW4gPT0gImh5cGVydGVuc2lvbiIpDQpgYGANCk1ldGEtYW5hbHlzaXMgb2YgYmlub21pYWwgZGF0YSBhcmUgbWFkZSB1c2luZyB0aGUgZnVuY3Rpb24ge21ldGFiaW4oKX0gDQpGb3IgdGhpcyB0aGUgbW9kZWwgbmVlZHMgdGhlIHRvdGFsIG51bWJlciBvZiBwYXJ0aWNpcGFudHMgaW4gZWFjaCBncm91cCBhbmQgdGhlIG51bWJlciBldmVudHMgaW4gZWFjaCBncm91cC4gDQoNCmBgYHtyfQ0KbS5iZWhhdi5oeXBlciA8LSBiZWhhdk1ldGEgJT4lIA0KICAgIGZpbHRlcihkb21haW4gPT0gImh5cGVydGVuc2lvbiIpICU+JSANCiAgICBtZXRhYmluKGV2ZW50LmUgPSBlc3QuZSwgIyBudW1iZXIgb2YgZXZlbnRzIGluIHRoZSBleHBlcmltZW50YWwgZ3JvdXBzDQogICAgICAgICAgICAgICAgIG4uZSA9IG4uZSwgIyB0b3RhbCBudW1iZXIgb2YgcGFydGljaXBhbnRzIGluIHRoZSBleHBlcmltZW50YWwgZ3JvdXBzDQogICAgICAgICAgICAgICAgIGV2ZW50LmMgPSBlc3QuYywgIyBudW1iZXIgb2YgZXZlbnRzIGluIHRoZSBjb21wYXJpc29uIGdyb3Vwcw0KICAgICAgICAgICAgICAgICBuLmMgPSBuLmMsICMgdG90YWwgbnVtYmVyIG9mIHBhcnRpY2lwYW50cyBpbiB0aGUgY29tcGFyaXNvbiBncm91cHMNCiAgICAgICAgICAgICAgICAgc3R1ZGxhYiA9IGF1dGhvciwNCiAgICAgICAgICAgICAgICAgc20gPSAiUlIiLCAjIFRoZSBtb2RlbCBpcyBiYXNlZCBpbiByaXNrIHJhdGlvcw0KICAgICAgICAgICAgICAgICBtZXRob2QgPSAiTUgiLCAjIE1hbnRlbC1IYWVuc3plbCwgd2hpY2ggaXMgYWxzbyB0aGUgZGVmYXVsdA0KICAgICAgICAgICAgICAgICBNSC5leGFjdCA9IFRSVUUsDQogICAgICAgICAgICAgICAgIGNvbWIuZml4ZWQgPSBGQUxTRSwNCiAgICAgICAgICAgICAgICAgY29tYi5yYW5kb20gPSBUUlVFLCAjIFRoZSBtb2RlbCBpcyBidWlsZCBhcyBhIHJhbmRvbSBlZmZlY3RzIG1vZGVsDQogICAgICAgICAgICAgICAgIG1ldGhvZC50YXUgPSAiUE0iLA0KICAgICAgICAgICAgICAgICBoYWtuID0gRiwNCiAgICAgICAgICAgICAgICAgdGl0bGUgPSAiR29hbCBibG9vZCBwcmVzc3VyZSIpDQptLmJlaGF2Lmh5cGVyDQpgYGANCmBgYHtyIGZpZy53aWR0aD05LCBmaWcuaGVpZ2h0PTN9DQpmb3Jlc3QubWV0YShtLmJlaGF2Lmh5cGVyLCANCiAgICAgICAgICAgIHNvcnR2YXIgPSBhdXRob3IsDQogICAgICAgICAgICBwcmVkaWN0ID0gRkFMU0UsIGNvbGdhcCA9ICI1bW0iLA0KICAgICAgICAgICAgcHJpbnQudGF1MiA9IEZBTFNFLA0KICAgICAgICAgICAgbGVmdGxhYnMgPSBjKCJTdHVkeSIsIkV2ZW50cyIsIm4iLCJFdmVudCIsICJuIiwiV2VpZ2h0IiwiUmlzayBSYXRpbyIpLA0KICAgICAgICAgICAgbGVmdGNvbHMgPSBjKCJzdHVkbGFiIiwiZXN0LmUiLCJuLmUiLCJlc3QuYyIsIm4uYyIsIncucmFuZG9tIiwiZWZmZWN0LmNpIiksDQogICAgICAgICAgICBjb2wuc3F1YXJlID0gImJsdWUiLA0KICAgICAgICAgICAgY29sLmRpYW1vbmQgPSAiYmxhY2siLA0KICAgICAgICAgICAgbGF5b3V0ID0gIlJldk1hbjUiKQ0KYGBgDQojIyMgT3RoZXIgdml0YWwgc2lnbnMNCg0KIyMjIDEuNCBEaWFzdG9saWMgYmxvb2QgcHJlc3N1cmUNCmBgYHtyfQ0KIyBkaWFzdG9saWMgYmxvb2QgcHJlc3N1cmUgZGF0YQ0KYmVoYXZNZXRhIDwtIGJlaGF2TWV0YSAlPiUgYWRkX3JvdygNCiAgDQogIGRvbWFpbj1jKCdEQlAnLCdEQlAnLCdEQlAnLCdEQlAnLCdEQlAnLCdEQlAnLCdEQlAnLCdEQlAnLCdEQlAnLCdEQlAnLCdEQlAnLCdEQlAnKSwJDQogIGF1dGhvcj1jKCdBZGllIGV0IGFsLiAyMDEwJywnQmFya2VyLUNvbGxvIGV0IGFsLiAyMDE1JywnQm9zcyBldCBhbC4gMjAxNCcsDQogICAgICAgICAgICdDaGFucnVlbmd2YW5pY2ggZXQgYWwuIDIwMDYnLCdGYXVsa25lciBldCBhbC4gMjAxNCcsJ0hvbHplbWVyIGV0IGFsLiAyMDExJywNCiAgICAgICAgICAgJ0hvcm5uZXMgZXQgYWwuIDIwMTEnLCdJcmV3YWxsIGV0IGFsLiAyMDE1JywnSm91YmVydCBldCBhbC4gMjAwOScsJ0tpcmsgZXQgYWwuIDIwMTQnLA0KICAgICAgICAgICAnS29ubyBldCBhbC4gMjAxMycsJ01jTWFudXMgZXQgYWwuIDIwMDknKSwNCiAgeWVhcj1jKDIwMTAsMjAxNSwyMDE0LDIwMDYsMjAxNCwyMDExLDIwMTEsMjAxNSwyMDA5LDIwMTQsMjAxMywyMDA5KSwNCiAgZXN0LmU9Yyg3NS43LDc3Ljc3LDcxLjAsNzcuMTMsNzguMCw3OC40LDgyLjAsNzcuMyw3Ny4zLDc1LjAsNzIuOSw3NC4wKSwNCiAgICBzZC5lPWMoMTAuMSwxMi41OCwwLjAsMTEuMzQsOS4wLDEzLjYsMTMuMSwxMC4zLDguMyw3LjksOS41LDEwLjMpLAkNCiAgICBuLmU9YygyOSwxNjMsMTAsMzEsMjcsMTIsMTQ1LDI0MSw5MSwxMiwzNCw0OSksDQogIGVzdC5jPWMoNzIuMSw3Ny40Niw3NS4wLDc1LjgxLDgwLjAsNzguOSw4Ni4wLDc5LjYsNzkuMSw3NC42Nyw4MC43LDc0LjApLA0KICAgIHNkLmM9YygxMi4xLDExLjY2LDAuMCwxMS41NCwxMS4wLDEwLjgsMTIuMywxMC41LDguOSw4LjcsMTAuNywxMi4yKSwJDQogICAgbi5jPWMoMjcsMTY1LDEwLDMxLDI0LDE1LDE1OCwyNDMsOTUsMTIsMzQsNTMpDQopDQpgYGANCg0KDQpgYGB7cn0NCm0uYmVoYXYuZGJwIDwtIGJlaGF2TWV0YSAlPiUgDQogICAgZmlsdGVyKGRvbWFpbiA9PSAiREJQIikgJT4lIA0KICAgIG1ldGFjb250KG4uZSA9IG4uZSwgbWVhbi5lID0gZXN0LmUsIHNkLmUgPSBzZC5lLA0KICAgICAgICAgICAgICAgICAgIG4uYyA9IG4uYywgbWVhbi5jID0gZXN0LmMsIHNkLmMgPSBzZC5jLA0KICAgICAgICAgICAgICAgICAgIHN0dWRsYWIgPSBhdXRob3IsDQogICAgICAgICAgICAgICAgICAgc20gPSAiTUQiLA0KICAgICAgICAgICAgICAgICAgIG1ldGhvZC5zbWQgPSAiSGVkZ2VzIiwNCiAgICAgICAgICAgICAgICAgICBjb21iLmZpeGVkID0gRkFMU0UsDQogICAgICAgICAgICAgICAgICAgY29tYi5yYW5kb20gPSBUUlVFLA0KICAgICAgICAgICAgICAgICAgIG1ldGhvZC50YXUgPSAiUkVNTCIsDQogICAgICAgICAgICAgICAgICAgaGFrbiA9IEYsDQogICAgICAgICAgICAgICAgICAgdGl0bGUgPSAiRGlhc3RvbGljIEJsb29kIFByZXNzdXJlIikNCm0uYmVoYXYuZGJwDQpgYGANCmBgYHtyIGZpZy53aWR0aD0xMSwgZmlnLmhlaWdodD00fQ0KZm9yZXN0Lm1ldGEobS5iZWhhdi5kYnAsIA0KICAgICAgICAgICAgc29ydHZhciA9IGF1dGhvcixjb2xnYXAgPSAiNG1tIiwgZGlnaXRzLnNkID0gMiwNCiAgICAgICAgICAgIHByZWRpY3QgPSBGQUxTRSwgDQogICAgICAgICAgICBwcmludC50YXUyID0gRkFMU0UsDQogICAgICAgICAgICBsZWZ0bGFicyA9IGMoIkF1dGhvciIsIm1lYW4iLCJTRCIsICJuIiwibWVhbiIsIlNEIiwibiIsIldlaWdodCIsIk1EIiwiOTUlQ0kiKSwNCiAgICAgICAgICAgIGxlZnRjb2xzID0gYygic3R1ZGxhYiIsImVzdC5lIiwic2QuZSIsIm4uZSIsImVzdC5jIiwic2QuYyIsIm4uYyIsIncucmFuZG9tIiwiZWZmZWN0IiwiY2kiKSwNCiAgICAgICAgICAgIGNvbC5zcXVhcmUgPSAiYmx1ZSIsIGNvbC5zcXVhcmUubGluZXMgPSAiYmx1ZSIsDQogICAgICAgICAgICBjb2wuZGlhbW9uZCA9ICJibGFjayIsDQogICAgICAgICAgICBsYXlvdXQgPSAiUmV2TWFuNSIpDQpgYGANCiMjIyAxLjUgSGVhcnQgcmF0ZQ0KYGBge3J9DQojIGhlYXJ0IHJhdGUgZGF0YQ0KYmVoYXZNZXRhIDwtIGJlaGF2TWV0YSAlPiUgYWRkX3JvdygNCiAgZG9tYWluPWMoJ0hSJywnSFInKSwJDQogIGF1dGhvcj1jKCdDaGFucnVlbmd2YW5pY2ggZXQgYWwuIDIwMDYnLCdGYXVsa25lciBldCBhbC4gMjAxNCcpLAkNCiAgeWVhcj1jKDIwMDYsMjAxNCksCQ0KICBlc3QuZT1jKDY3LjcxLDY0LjApLCBzZC5lPWMoMTAuMDksOS4wKSwgbi5lPWMoMzEsMjcpLAkNCiAgZXN0LmM9Yyg3MS40Miw2Ni4wKSwgc2QuYz1jKDkuNTUsOS4wKSwgbi5jPWMoMzEsMjQpDQopDQpgYGANCmBgYHtyfQ0KbS5iZWhhdi5ociA8LSBiZWhhdk1ldGEgJT4lIA0KICAgIGZpbHRlcihkb21haW4gPT0gIkhSIikgJT4lIA0KICAgIG1ldGFjb250KG4uZSA9IG4uZSwgbWVhbi5lID0gZXN0LmUsIHNkLmUgPSBzZC5lLA0KICAgICAgICAgICAgICAgICAgIG4uYyA9IG4uYywgbWVhbi5jID0gZXN0LmMsIHNkLmMgPSBzZC5jLA0KICAgICAgICAgICAgICAgICAgIHN0dWRsYWIgPSBhdXRob3IsDQogICAgICAgICAgICAgICAgICAgc20gPSAiTUQiLA0KICAgICAgICAgICAgICAgICAgIG1ldGhvZC5zbWQgPSAiSGVkZ2VzIiwNCiAgICAgICAgICAgICAgICAgICBjb21iLmZpeGVkID0gRkFMU0UsDQogICAgICAgICAgICAgICAgICAgY29tYi5yYW5kb20gPSBUUlVFLA0KICAgICAgICAgICAgICAgICAgIG1ldGhvZC50YXUgPSAiUkVNTCIsDQogICAgICAgICAgICAgICAgICAgaGFrbiA9IEYsDQogICAgICAgICAgICAgICAgICAgdGl0bGUgPSAiSGVhcnQgcmF0ZSIpDQptLmJlaGF2LmhyDQpgYGANCmBgYHtyIGZpZy53aWR0aD0xMSwgZmlnLmhlaWdodD0yfQ0KZm9yZXN0Lm1ldGEobS5iZWhhdi5ociwgDQogICAgICAgICAgICBzb3J0dmFyID0gYXV0aG9yLGNvbGdhcCA9ICI1bW0iLCBkaWdpdHMuc2QgPSAyLA0KICAgICAgICAgICAgcHJlZGljdCA9IEZBTFNFLCANCiAgICAgICAgICAgIHByaW50LnRhdTIgPSBGQUxTRSwNCiAgICAgICAgICAgIGxlZnRsYWJzID0gYygiQXV0aG9yIiwibWVhbiIsIlNEIiwgIm4iLCJtZWFuIiwiU0QiLCJuIiwiV2VpZ2h0IiwiTUQiLCI5NSVDSSIpLA0KICAgICAgICAgICAgbGVmdGNvbHMgPSBjKCJzdHVkbGFiIiwiZXN0LmUiLCJzZC5lIiwibi5lIiwiZXN0LmMiLCJzZC5jIiwibi5jIiwidy5yYW5kb20iLCJlZmZlY3QiLCJjaSIpLA0KICAgICAgICAgICAgY29sLnNxdWFyZSA9ICJibHVlIiwgY29sLnNxdWFyZS5saW5lcyA9ICJibHVlIiwNCiAgICAgICAgICAgIGNvbC5kaWFtb25kID0gImJsYWNrIiwNCiAgICAgICAgICAgIGxheW91dCA9ICJSZXZNYW41IiwNCiAgICAgICAgICAgIHhsaW0gPSBjKC0xNSwxNSksDQogICAgICAgICAgICBhdCA9IGMoLTEwLC01LDAsNSwxMCksDQogICAgICAgICAgICApDQpgYGANCg0KIyMgMiBCaW9jaGVtaXN0cnkNCg0KIyMjIDIuMSBUb3RhbCBjaG9sZXN0ZXJvbA0KYGBge3J9DQojIHRvdGFsIGNob2xlc3Rlcm9sIGRhdGENCmJlaGF2TWV0YSA8LSBiZWhhdk1ldGEgJT4lIGFkZF9yb3coDQogIGRvbWFpbj1jKCdUQ0hPTCcsJ1RDSE9MJywnVENIT0wnLCdUQ0hPTCcsJ1RDSE9MJywnVENIT0wnLCdUQ0hPTCcsJ1RDSE9MJywnVENIT0wnLCdUQ0hPTCcpLAkNCiAgYXV0aG9yPWMoJ0FkaWUgZXQgYWwuIDIwMTAnLCdCYXJrZXItQ29sbG8gZXQgYWwuIDIwMTUnLCdDaGFucnVlbmd2YW5pY2ggZXQgYWwuIDIwMDYnLA0KICAgICAgICAgICAnRmF1bGtuZXIgZXQgYWwuIDIwMTQnLCdIb2x6ZW1lciBldCBhbC4gMjAxMScsJ0pvdWJlcnQgZXQgYWwuIDIwMDYnLCdKb3ViZXJ0IGV0IGFsLiAyMDA5JywNCiAgICAgICAgICAgJ0tpbSBldCBhbC4gMjAxMycsJ0tpcmsgZXQgYWwuIDIwMTQnLCdNY01hbnVzIGV0IGFsLiAyMDA5JyksDQogIHllYXI9YygyMDEwLDIwMTUsMjAwNiwyMDE0LDIwMTEsMjAwNiwyMDA5LDIwMTMsMjAxNCwyMDA5KSwNCiAgZXN0LmU9YygxNjkuODgsMTUxLjc0LDIwNy4xLDEzNi42OCwxNTkuMiwxODQuNTYsMTg5LjE5LDE1NC43LDE0Ni43MiwxNjYuMDIpLA0KICAgIHNkLmU9Yyg0Mi40NywzNS4xNCw0NS4yMywyMS42MiwzNS4yLDAuMCwzOC42MSwzNS41LDAuMCw0Ni4zMyksCQ0KICAgIG4uZT1jKDI5LDE1NywzMSwyNywxMiwzMiw5MSwxOCwxMiw0OSksDQogIGVzdC5jPWMoMTU4LjMsMTYwLjIzLDIwMC40MiwxNDcuODgsMTc0LjgsMTk2LjkxLDE5My4wNSwxNDQuNywxMzcuMDcsMTczLjc1KSwNCiAgICBzZC5jPWMoMzQuNzUsMzcuNDUsMzQuMiwzMy45OCw1Ni45LDAuMCwzOC42MSwyOC4wLDAuMCwzNC43NSksCQ0KICAgIG4uYz1jKDI3LDE1OSwzMSwyNCwxNSwzMyw5NSwxOCwxMiw1MykNCikNCmBgYA0KYGBge3J9DQptLmJlaGF2LnRjb2wgPC0gYmVoYXZNZXRhICU+JSANCiAgICBmaWx0ZXIoZG9tYWluID09ICJUQ0hPTCIpICU+JSANCiAgICBtZXRhY29udChuLmUgPSBuLmUsIG1lYW4uZSA9IGVzdC5lLCBzZC5lID0gc2QuZSwNCiAgICAgICAgICAgICAgICAgICBuLmMgPSBuLmMsIG1lYW4uYyA9IGVzdC5jLCBzZC5jID0gc2QuYywNCiAgICAgICAgICAgICAgICAgICBzdHVkbGFiID0gYXV0aG9yLA0KICAgICAgICAgICAgICAgICAgIHNtID0gIk1EIiwNCiAgICAgICAgICAgICAgICAgICBtZXRob2Quc21kID0gIkhlZGdlcyIsDQogICAgICAgICAgICAgICAgICAgY29tYi5maXhlZCA9IEZBTFNFLA0KICAgICAgICAgICAgICAgICAgIGNvbWIucmFuZG9tID0gVFJVRSwNCiAgICAgICAgICAgICAgICAgICBtZXRob2QudGF1ID0gIlJFTUwiLA0KICAgICAgICAgICAgICAgICAgIGhha24gPSBGLA0KICAgICAgICAgICAgICAgICAgIHRpdGxlID0gIlRvdGFsIGNob2xlc3Rlcm9sIikNCm0uYmVoYXYudGNvbA0KYGBgDQpgYGB7ciBmaWcud2lkdGg9MTEsIGZpZy5oZWlnaHQ9My41fQ0KZm9yZXN0Lm1ldGEobS5iZWhhdi50Y29sLCANCiAgICAgICAgICAgIHNvcnR2YXIgPSBhdXRob3IsY29sZ2FwID0gIjRtbSIsIGRpZ2l0cy5zZCA9IDIsDQogICAgICAgICAgICBwcmVkaWN0ID0gRkFMU0UsIA0KICAgICAgICAgICAgcHJpbnQudGF1MiA9IEZBTFNFLA0KICAgICAgICAgICAgbGVmdGxhYnMgPSBjKCJBdXRob3IiLCJtZWFuIiwiU0QiLCAibiIsIm1lYW4iLCJTRCIsIm4iLCJXZWlnaHQiLCJNRCIsIjk1JUNJIiksDQogICAgICAgICAgICBsZWZ0Y29scyA9IGMoInN0dWRsYWIiLCJlc3QuZSIsInNkLmUiLCJuLmUiLCJlc3QuYyIsInNkLmMiLCJuLmMiLCJ3LnJhbmRvbSIsImVmZmVjdCIsImNpIiksDQogICAgICAgICAgICBjb2wuc3F1YXJlID0gImJsdWUiLCBjb2wuc3F1YXJlLmxpbmVzID0gImJsdWUiLA0KICAgICAgICAgICAgY29sLmRpYW1vbmQgPSAiYmxhY2siLA0KICAgICAgICAgICAgbGF5b3V0ID0gIlJldk1hbjUiKQ0KYGBgDQoNCiMjIyAyLjIgSGlnaCBEZW5zaXR5IExpcG9wcm90ZWluDQpgYGB7cn0NCiMgSERMIGRhdGENCmJlaGF2TWV0YSA8LSBiZWhhdk1ldGEgJT4lIGFkZF9yb3coDQogIGRvbWFpbj1jKCdIREwnLCdIREwnLCdIREwnLCdIREwnLCdIREwnLCdIREwnKSwJDQogIGF1dGhvcj1jKCdCYXJrZXItQ29sbG8gZXQgYWwuIDIwMTUnLCdDaGFucnVlbmd2YW5pY2ggZXQgYWwuIDIwMDYnLCdGYXVsa25lciBldCBhbC4gMjAxNCcsDQogICAgICAgICAgICdIb2x6ZW1lciBldCBhbC4gMjAxMScsJ0tpcmsgZXQgYWwuIDIwMTQnLCdLb25vIGV0IGFsLiAyMDEzJyksCQ0KICB5ZWFyPWMoMjAxNSwyMDA2LDIwMTQsMjAxMSwyMDE0LDIwMTMpLAkNCiAgZXN0LmU9Yyg1MC45Nyw0Mi45NCw1MC4xOSw1OS4wLDQ3LjEsNjIuNiksIHNkLmU9YygyMS42MiwxMC45MywyMC44NSwyNC44LDExLjU4LDE3LjIpLAkNCiAgICBuLmU9YygxNTksMzEsMjcsMTIsMTIsMzQpLAkNCiAgZXN0LmM9Yyg1MC41OCw0Mi44NCw1Mi41MSw1MC42LDQyLjQ3LDU2LjMpLCBzZC5jPWMoMTYuNiwxMi4zNCwxNy4zNywxNS4xLDcuNzIsMTUuNSksCQ0KICAgIG4uYz1jKDE2MSwzMSwyNCwxNSwxMiwzNCkNCikNCmBgYA0KYGBge3J9DQptLmJlaGF2LmhkbCA8LSBiZWhhdk1ldGEgJT4lIA0KICAgIGZpbHRlcihkb21haW4gPT0gIkhETCIpICU+JSANCiAgICBtZXRhY29udChuLmUgPSBuLmUsIG1lYW4uZSA9IGVzdC5lLCBzZC5lID0gc2QuZSwNCiAgICAgICAgICAgICAgICAgICBuLmMgPSBuLmMsIG1lYW4uYyA9IGVzdC5jLCBzZC5jID0gc2QuYywNCiAgICAgICAgICAgICAgICAgICBzdHVkbGFiID0gYXV0aG9yLA0KICAgICAgICAgICAgICAgICAgIHNtID0gIk1EIiwNCiAgICAgICAgICAgICAgICAgICBtZXRob2Quc21kID0gIkhlZGdlcyIsDQogICAgICAgICAgICAgICAgICAgY29tYi5maXhlZCA9IEZBTFNFLA0KICAgICAgICAgICAgICAgICAgIGNvbWIucmFuZG9tID0gVFJVRSwNCiAgICAgICAgICAgICAgICAgICBtZXRob2QudGF1ID0gIlJFTUwiLA0KICAgICAgICAgICAgICAgICAgIGhha24gPSBGLA0KICAgICAgICAgICAgICAgICAgIHRpdGxlID0gIkhpZ2ggRGVuc2l0eSBMaXBvcHJvdGVpbiIpDQptLmJlaGF2LmhkbA0KYGBgDQpgYGB7ciBmaWcud2lkdGg9MTEsIGZpZy5oZWlnaHQ9M30NCmZvcmVzdC5tZXRhKG0uYmVoYXYuaGRsLCANCiAgICAgICAgICAgIHNvcnR2YXIgPSBhdXRob3IsY29sZ2FwID0gIjRtbSIsIGRpZ2l0cy5zZCA9IDIsDQogICAgICAgICAgICBwcmVkaWN0ID0gRkFMU0UsIA0KICAgICAgICAgICAgcHJpbnQudGF1MiA9IEZBTFNFLA0KICAgICAgICAgICAgbGVmdGxhYnMgPSBjKCJBdXRob3IiLCJtZWFuIiwiU0QiLCAibiIsIm1lYW4iLCJTRCIsIm4iLCJXZWlnaHQiLCJNRCIsIjk1JUNJIiksDQogICAgICAgICAgICBsZWZ0Y29scyA9IGMoInN0dWRsYWIiLCJlc3QuZSIsInNkLmUiLCJuLmUiLCJlc3QuYyIsInNkLmMiLCJuLmMiLCJ3LnJhbmRvbSIsImVmZmVjdCIsImNpIiksDQogICAgICAgICAgICBjb2wuc3F1YXJlID0gImJsdWUiLCBjb2wuc3F1YXJlLmxpbmVzID0gImJsdWUiLA0KICAgICAgICAgICAgY29sLmRpYW1vbmQgPSAiYmxhY2siLA0KICAgICAgICAgICAgbGF5b3V0ID0gIlJldk1hbjUiKQ0KYGBgDQoNCiMjIyAyLjMgTG93IERlbnNpdHkgTGlwb3Byb3RlaW4NCmBgYHtyfQ0KIyBMREwgZGF0YQ0KYmVoYXZNZXRhIDwtIGJlaGF2TWV0YSAlPiUgYWRkX3JvdygNCiAgZG9tYWluPWMoJ0xETCcsJ0xETCcsJ0xETCcsJ0xETCcsJ0xETCcpLAkNCiAgYXV0aG9yPWMoJ0Jvc3MgZXQgYWwuIDIwMTQnLCdDaGVuZyBldCBhbC4gMjAxOCcsJ0hvbHplbWVyIGV0IGFsLiAyMDExJywnSXJld2FsbCBldCBhbC4gMjAxNScsDQogICAgICAgICAgICdLb25vIGV0IGFsLiAyMDEzJyksDQogIHllYXI9YygyMDE0LDIwMTgsMjAxMSwyMDE1LDIwMTMpLAkNCiAgZXN0LmU9Yyg4Mi4wLDg2LjgsODEuMCw4OC44LDEwMy40KSwgc2QuZT1jKDAuMCwzOC45LDIxLjgsMjcuMCwyNC44KSwgbi5lPWMoMTAsMjA0LDEyLDI0MSwzNCksCQ0KICBlc3QuYz1jKDk4LjYsOTIuMywxMDAuOSwxMDAuMzksMTAyLjYpLCBzZC5jPWMoMC4wLDQxLjEsNTUuOCwzNC43LDIwLjgpLCBuLmM9YygxMCwyMDAsMTUsMjQzLDM0KQ0KKQ0KYGBgDQoNClN0YW5kYXJkaXNlZCBtZWFuIGRpZmZlcmVuY2VzIGFyZSB1c2VkIGZvciB0aGlzIG1ldGEtYW5hbHlzaXMgYmVjYXVzZSB0aGUgcmVzdWx0cyBhcmUgcmVwb3J0ZWQgaW4gZGlmZmVyZW50IHVuaXRzLg0KYGBge3J9DQptLmJlaGF2LmxkbCA8LSBiZWhhdk1ldGEgJT4lIA0KICAgIGZpbHRlcihkb21haW4gPT0gIkxETCIpICU+JSANCiAgICBtZXRhY29udChuLmUgPSBuLmUsIG1lYW4uZSA9IGVzdC5lLCBzZC5lID0gc2QuZSwNCiAgICAgICAgICAgICAgICAgICBuLmMgPSBuLmMsIG1lYW4uYyA9IGVzdC5jLCBzZC5jID0gc2QuYywNCiAgICAgICAgICAgICAgICAgICBzdHVkbGFiID0gYXV0aG9yLA0KICAgICAgICAgICAgICAgICAgIHNtID0gIlNNRCIsICMgU3RhbmRhcmRpc2VkIG1lYW4gZGlmZmVyZW5jZXMgd2VyZSB1c2VkIA0KICAgICAgICAgICAgICAgICAgIG1ldGhvZC5zbWQgPSAiSGVkZ2UiLCAjIG1ldGhvZCBmb3IgaG93IHRoZSBtZWFuIGRpZmZlcmVuY2VzIGFyZSBzdGFuZGFyZGlzZWQNCiAgICAgICAgICAgICAgICAgICBjb21iLmZpeGVkID0gRkFMU0UsDQogICAgICAgICAgICAgICAgICAgY29tYi5yYW5kb20gPSBUUlVFLA0KICAgICAgICAgICAgICAgICAgIG1ldGhvZC50YXUgPSAiUkVNTCIsDQogICAgICAgICAgICAgICAgICAgaGFrbiA9IEZBTFNFLA0KICAgICAgICAgICAgICAgICAgIHRpdGxlID0gIkxvdyBEZW5zaXR5IExpcG9wcm90ZWluIikNCm0uYmVoYXYubGRsDQpgYGANCmBgYHtyIGZpZy53aWR0aD0xMSwgZmlnLmhlaWdodD0zfQ0KZm9yZXN0Lm1ldGEobS5iZWhhdi5sZGwsIA0KICAgICAgICAgICAgc29ydHZhciA9IGF1dGhvcixjb2xnYXAgPSAiNW1tIiwgZGlnaXRzLnNkID0gMiwNCiAgICAgICAgICAgIHByZWRpY3QgPSBGQUxTRSwgDQogICAgICAgICAgICBwcmludC50YXUyID0gRkFMU0UsDQogICAgICAgICAgICBsZWZ0bGFicyA9IGMoIkF1dGhvciIsIm1lYW4iLCJTRCIsICJuIiwibWVhbiIsIlNEIiwibiIsIldlaWdodCIsIlNNRCIsIjk1JUNJIiksDQogICAgICAgICAgICBsZWZ0Y29scyA9IGMoInN0dWRsYWIiLCJlc3QuZSIsInNkLmUiLCJuLmUiLCJlc3QuYyIsInNkLmMiLCJuLmMiLCJ3LnJhbmRvbSIsImVmZmVjdCIsImNpIiksDQogICAgICAgICAgICBjb2wuc3F1YXJlID0gImJsdWUiLCBjb2wuc3F1YXJlLmxpbmVzID0gImJsdWUiLA0KICAgICAgICAgICAgY29sLmRpYW1vbmQgPSAiYmxhY2siLA0KICAgICAgICAgICAgbGF5b3V0ID0gIlJldk1hbjUiKQ0KYGBgDQoNCiMjIyAyLjQgVHJpZ2x5Y2VyaWRlcw0KYGBge3J9DQojIFRyaWdseWNlcmlkZXMgZGF0YQ0KYmVoYXZNZXRhIDwtIGJlaGF2TWV0YSAlPiUgYWRkX3JvdygNCiAgZG9tYWluPWMoJ1RSSUcnLCdUUklHJyksCQ0KICBhdXRob3I9YygnSG9semVtZXIgZXQgYWwuIDIwMTEnLCdLaW0gZXQgYWwuIDIwMTMnKSwJDQogIHllYXI9YygyMDExLDIwMTMpLAkNCiAgZXN0LmU9Yyg5Ni4yLDE0MC4wKSwgc2QuZT1jKDM2LjYsNjMuMiksIG4uZT1jKDEyLDE4KSwJDQogIGVzdC5jPWMoMTE2LjMsMTQ1LjUpLCBzZC5jPWMoNTcuNSw3OC44KSwgbi5jPWMoMTUsMTgpDQopDQpgYGANCmBgYHtyfQ0KbS5iZWhhdi50cmlnIDwtIGJlaGF2TWV0YSAlPiUgDQogICAgZmlsdGVyKGRvbWFpbiA9PSAiVFJJRyIpICU+JSANCiAgICBtZXRhY29udChuLmUgPSBuLmUsIG1lYW4uZSA9IGVzdC5lLCBzZC5lID0gc2QuZSwNCiAgICAgICAgICAgICAgICAgICBuLmMgPSBuLmMsIG1lYW4uYyA9IGVzdC5jLCBzZC5jID0gc2QuYywNCiAgICAgICAgICAgICAgICAgICBzdHVkbGFiID0gYXV0aG9yLA0KICAgICAgICAgICAgICAgICAgIHNtID0gIk1EIiwNCiAgICAgICAgICAgICAgICAgICBtZXRob2Quc21kID0gIkhlZGdlcyIsDQogICAgICAgICAgICAgICAgICAgY29tYi5maXhlZCA9IEZBTFNFLA0KICAgICAgICAgICAgICAgICAgIGNvbWIucmFuZG9tID0gVFJVRSwNCiAgICAgICAgICAgICAgICAgICBtZXRob2QudGF1ID0gIlJFTUwiLA0KICAgICAgICAgICAgICAgICAgIGhha24gPSBGLA0KICAgICAgICAgICAgICAgICAgIHRpdGxlID0gIlRyaWdseWNlcmlkZXMiKQ0KbS5iZWhhdi50cmlnDQpgYGANCmBgYHtyIGZpZy53aWR0aD0xMSwgZmlnLmhlaWdodD0yfQ0KZm9yZXN0Lm1ldGEobS5iZWhhdi50cmlnLCANCiAgICAgICAgICAgIHNvcnR2YXIgPSBhdXRob3IsY29sZ2FwID0gIjVtbSIsIGRpZ2l0cy5zZCA9IDIsDQogICAgICAgICAgICBwcmVkaWN0ID0gRkFMU0UsIA0KICAgICAgICAgICAgcHJpbnQudGF1MiA9IEZBTFNFLA0KICAgICAgICAgICAgbGVmdGxhYnMgPSBjKCJBdXRob3IiLCJtZWFuIiwiU0QiLCAibiIsIm1lYW4iLCJTRCIsIm4iLCJXZWlnaHQiLCJNRCIsIjk1JUNJIiksDQogICAgICAgICAgICBsZWZ0Y29scyA9IGMoInN0dWRsYWIiLCJlc3QuZSIsInNkLmUiLCJuLmUiLCJlc3QuYyIsInNkLmMiLCJuLmMiLCJ3LnJhbmRvbSIsImVmZmVjdCIsImNpIiksDQogICAgICAgICAgICBjb2wuc3F1YXJlID0gImJsdWUiLCBjb2wuc3F1YXJlLmxpbmVzID0gImJsdWUiLA0KICAgICAgICAgICAgY29sLmRpYW1vbmQgPSAiYmxhY2siLA0KICAgICAgICAgICAgbGF5b3V0ID0gIlJldk1hbjUiKQ0KYGBgDQoNCiMjIyAyLjUgRmFzdGluZyBibG9vZCBnbHVjb3NlDQpgYGB7cn0NCiMgRmFzdGluZyBibG9vZCBnbHVjb3NlIGRhdGENCmJlaGF2TWV0YSA8LSBiZWhhdk1ldGEgJT4lIGFkZF9yb3coDQogIGRvbWFpbj1jKCdGR0xVQycsJ0ZHTFVDJyksCQ0KICBhdXRob3I9YygnRmF1bGtuZXIgZXQgYWwuIDIwMTQnLCdLaXJrIGV0IGFsLiAyMDE0JyksCQ0KICB5ZWFyPWMoMjAxNCwyMDE0KSwJDQogIGVzdC5lPWMoNS40NSw1LjIpLCBzZC5lPWMoMS4yMiwwLjQpLCBuLmU9YygyNywxMiksCQ0KICBlc3QuYz1jKDUuNjYsNS4zOCksIHNkLmM9YygxLjAzLDAuNCksIG4uYz1jKDI0LDEyKQ0KKQ0KYGBgDQpgYGB7cn0NCm0uYmVoYXYuZmdsdWMgPC0gYmVoYXZNZXRhICU+JSANCiAgICBmaWx0ZXIoZG9tYWluID09ICJGR0xVQyIpICU+JSANCiAgICBtZXRhY29udChuLmUgPSBuLmUsIG1lYW4uZSA9IGVzdC5lLCBzZC5lID0gc2QuZSwNCiAgICAgICAgICAgICAgICAgICBuLmMgPSBuLmMsIG1lYW4uYyA9IGVzdC5jLCBzZC5jID0gc2QuYywNCiAgICAgICAgICAgICAgICAgICBzdHVkbGFiID0gYXV0aG9yLA0KICAgICAgICAgICAgICAgICAgIHNtID0gIk1EIiwNCiAgICAgICAgICAgICAgICAgICBtZXRob2Quc21kID0gIkhlZGdlcyIsDQogICAgICAgICAgICAgICAgICAgY29tYi5maXhlZCA9IEZBTFNFLA0KICAgICAgICAgICAgICAgICAgIGNvbWIucmFuZG9tID0gVFJVRSwNCiAgICAgICAgICAgICAgICAgICBtZXRob2QudGF1ID0gIlJFTUwiLA0KICAgICAgICAgICAgICAgICAgIGhha24gPSBGLA0KICAgICAgICAgICAgICAgICAgIHRpdGxlID0gIkZhc3RpbmcgYmxvb2QgZ2x1Y29zZSIpDQptLmJlaGF2LmZnbHVjDQpgYGANCmBgYHtyIGZpZy53aWR0aD0xMSwgZmlnLmhlaWdodD0yfQ0KZm9yZXN0Lm1ldGEobS5iZWhhdi5mZ2x1YywgDQogICAgICAgICAgICBzb3J0dmFyID0gYXV0aG9yLGNvbGdhcCA9ICI1bW0iLCBkaWdpdHMuc2QgPSAyLA0KICAgICAgICAgICAgcHJlZGljdCA9IEZBTFNFLCANCiAgICAgICAgICAgIHByaW50LnRhdTIgPSBGQUxTRSwNCiAgICAgICAgICAgIGxlZnRsYWJzID0gYygiQXV0aG9yIiwibWVhbiIsIlNEIiwgIm4iLCJtZWFuIiwiU0QiLCJuIiwiV2VpZ2h0IiwiTUQiLCI5NSVDSSIpLA0KICAgICAgICAgICAgbGVmdGNvbHMgPSBjKCJzdHVkbGFiIiwiZXN0LmUiLCJzZC5lIiwibi5lIiwiZXN0LmMiLCJzZC5jIiwibi5jIiwidy5yYW5kb20iLCJlZmZlY3QiLCJjaSIpLA0KICAgICAgICAgICAgY29sLnNxdWFyZSA9ICJibHVlIiwgY29sLnNxdWFyZS5saW5lcyA9ICJibHVlIiwNCiAgICAgICAgICAgIGNvbC5kaWFtb25kID0gImJsYWNrIiwNCiAgICAgICAgICAgIGxheW91dCA9ICJSZXZNYW41IikNCmBgYA0KDQojIyMgMi42IEhiQTFjDQpgYGB7cn0NCiMgSGJBMWMgZGF0YQ0KYmVoYXZNZXRhIDwtIGJlaGF2TWV0YSAlPiUgYWRkX3JvdygNCiAgZG9tYWluPWMoJ0hCQScsJ0hCQScpLAkNCiAgYXV0aG9yPWMoJ0tvbm8gZXQgYWwuIDIwMTMnLCdNY01hbnVzIGV0IGFsLiAyMDA5JyksCQ0KICB5ZWFyPWMoMjAxMywyMDA5KSwJDQogIGVzdC5lPWMoNS44Nyw4LjApLCBzZC5lPWMoMC40NiwxLjkpLCBuLmU9YygzNCw0OSksCQ0KICBlc3QuYz1jKDUuOTgsNy41KSwgc2QuYz1jKDAuNzEsMS41KSwgbi5jPWMoMzQsNTMpDQopDQpgYGANCmBgYHtyfQ0KbS5iZWhhdi5oYmEgPC0gYmVoYXZNZXRhICU+JSANCiAgICBmaWx0ZXIoZG9tYWluID09ICJIQkEiKSAlPiUgDQogICAgbWV0YWNvbnQobi5lID0gbi5lLCBtZWFuLmUgPSBlc3QuZSwgc2QuZSA9IHNkLmUsDQogICAgICAgICAgICAgICAgICAgbi5jID0gbi5jLCBtZWFuLmMgPSBlc3QuYywgc2QuYyA9IHNkLmMsDQogICAgICAgICAgICAgICAgICAgc3R1ZGxhYiA9IGF1dGhvciwNCiAgICAgICAgICAgICAgICAgICBzbSA9ICJNRCIsDQogICAgICAgICAgICAgICAgICAgbWV0aG9kLnNtZCA9ICJIZWRnZXMiLA0KICAgICAgICAgICAgICAgICAgIGNvbWIuZml4ZWQgPSBGQUxTRSwNCiAgICAgICAgICAgICAgICAgICBjb21iLnJhbmRvbSA9IFRSVUUsDQogICAgICAgICAgICAgICAgICAgbWV0aG9kLnRhdSA9ICJSRU1MIiwNCiAgICAgICAgICAgICAgICAgICBoYWtuID0gRiwNCiAgICAgICAgICAgICAgICAgICB0aXRsZSA9ICJIYkExYyIpDQptLmJlaGF2LmhiYQ0KYGBgDQpgYGB7ciBmaWcud2lkdGg9MTAsIGZpZy5oZWlnaHQ9Mn0NCmZvcmVzdC5tZXRhKG0uYmVoYXYuaGJhLCANCiAgICAgICAgICAgIHNvcnR2YXIgPSBhdXRob3IsY29sZ2FwID0gIjVtbSIsIGRpZ2l0cy5zZCA9IDIsDQogICAgICAgICAgICBwcmVkaWN0ID0gRkFMU0UsIA0KICAgICAgICAgICAgcHJpbnQudGF1MiA9IEZBTFNFLA0KICAgICAgICAgICAgbGVmdGxhYnMgPSBjKCJBdXRob3IiLCJtZWFuIiwiU0QiLCAibiIsIm1lYW4iLCJTRCIsIm4iLCJXZWlnaHQiLCJNRCIsIjk1JUNJIiksDQogICAgICAgICAgICBsZWZ0Y29scyA9IGMoInN0dWRsYWIiLCJlc3QuZSIsInNkLmUiLCJuLmUiLCJlc3QuYyIsInNkLmMiLCJuLmMiLCJ3LnJhbmRvbSIsImVmZmVjdCIsImNpIiksDQogICAgICAgICAgICBjb2wuc3F1YXJlID0gImJsdWUiLCBjb2wuc3F1YXJlLmxpbmVzID0gImJsdWUiLA0KICAgICAgICAgICAgY29sLmRpYW1vbmQgPSAiYmxhY2siLA0KICAgICAgICAgICAgbGF5b3V0ID0gIlJldk1hbjUiKQ0KYGBgDQoNCiMjIyAyLjcgVG90YWwgY2hvbGVzdGVyb2wvSERMIHJhdGlvDQpgYGB7cn0NCiMgY2hvbC9IREwgcmF0aW8gZGF0YQ0KYmVoYXZNZXRhIDwtIGJlaGF2TWV0YSAlPiUgYWRkX3JvdygNCiAgZG9tYWluPWMoJ1RIUicsJ1RIUicpLAkNCiAgYXV0aG9yPWMoJ0ZhdWxrbmVyIGV0IGFsLiAyMDE0JywnS2lyayBldCBhbC4gMjAxNCcpLAkNCiAgeWVhcj1jKDIwMTQsMjAxNCksCQ0KICBlc3QuZT1jKDMuMTMsMy40OSksIHNkLmU9YygxLjIzLDEuMDQpLCBuLmU9YygyNywxMiksCQ0KICBlc3QuYz1jKDMuMDIsMy44MiksIHNkLmM9YygwLjgzLDEuMzcpLCBuLmM9YygyNCwxMikNCikNCmBgYA0KYGBge3J9DQptLmJlaGF2LnRociA8LSBiZWhhdk1ldGEgJT4lIA0KICAgIGZpbHRlcihkb21haW4gPT0gIlRIUiIpICU+JSANCiAgICBtZXRhY29udChuLmUgPSBuLmUsIG1lYW4uZSA9IGVzdC5lLCBzZC5lID0gc2QuZSwNCiAgICAgICAgICAgICAgICAgICBuLmMgPSBuLmMsIG1lYW4uYyA9IGVzdC5jLCBzZC5jID0gc2QuYywNCiAgICAgICAgICAgICAgICAgICBzdHVkbGFiID0gYXV0aG9yLA0KICAgICAgICAgICAgICAgICAgIHNtID0gIk1EIiwNCiAgICAgICAgICAgICAgICAgICBtZXRob2Quc21kID0gIkhlZGdlcyIsDQogICAgICAgICAgICAgICAgICAgY29tYi5maXhlZCA9IEZBTFNFLA0KICAgICAgICAgICAgICAgICAgIGNvbWIucmFuZG9tID0gVFJVRSwNCiAgICAgICAgICAgICAgICAgICBtZXRob2QudGF1ID0gIlJFTUwiLA0KICAgICAgICAgICAgICAgICAgIGhha24gPSBGLA0KICAgICAgICAgICAgICAgICAgIHRpdGxlID0gIlRvdGFsIGNob2xlc3Rlcm9sL0hETCByYXRpbyIpDQptLmJlaGF2LnRocg0KYGBgDQpgYGB7ciBmaWcud2lkdGg9MTAsIGZpZy5oZWlnaHQ9Mi41fQ0KZm9yZXN0Lm1ldGEobS5iZWhhdi50aHIsIA0KICAgICAgICAgICAgc29ydHZhciA9IGF1dGhvcixjb2xnYXAgPSAiNW1tIiwgZGlnaXRzLnNkID0gMiwNCiAgICAgICAgICAgIHByZWRpY3QgPSBGQUxTRSwgDQogICAgICAgICAgICBwcmludC50YXUyID0gRkFMU0UsDQogICAgICAgICAgICBsZWZ0bGFicyA9IGMoIkF1dGhvciIsIm1lYW4iLCJTRCIsICJuIiwibWVhbiIsIlNEIiwibiIsIldlaWdodCIsIk1EIiwiOTUlQ0kiKSwNCiAgICAgICAgICAgIGxlZnRjb2xzID0gYygic3R1ZGxhYiIsImVzdC5lIiwic2QuZSIsIm4uZSIsImVzdC5jIiwic2QuYyIsIm4uYyIsIncucmFuZG9tIiwiZWZmZWN0IiwiY2kiKSwNCiAgICAgICAgICAgIGNvbC5zcXVhcmUgPSAiYmx1ZSIsIGNvbC5zcXVhcmUubGluZXMgPSAiYmx1ZSIsDQogICAgICAgICAgICBjb2wuZGlhbW9uZCA9ICJibGFjayIsDQogICAgICAgICAgICBsYXlvdXQgPSAiUmV2TWFuNSIpDQpgYGANCg0KIyMgMyBCb2R5IGNvbXBvc2l0aW9uDQoNCiMjIyAzLjEgQm9keSBNYXNzIEluZGV4DQpgYGB7cn0NCiMgQk1JIGRhdGENCmJlaGF2TWV0YSA8LSBiZWhhdk1ldGEgJT4lIGFkZF9yb3coDQogIGRvbWFpbj1jKCdCTUknLCdCTUknLCdCTUknLCdCTUknKSwJDQogIGF1dGhvcj1jKCdGYXVsa25lciBldCBhbC4gMjAxNCcsJ0pvdWJlcnQgZXQgYWwuIDIwMDknLCdLaXJrIGV0IGFsLiAyMDE0JywnS29ubyBldCBhbC4gMjAxMycpLA0KICB5ZWFyPWMoMjAxNCwyMDA5LDIwMTQsMjAxMyksCQ0KICBlc3QuZT1jKDI4LjIsMjcuNSwyOC4xOSwyMi42KSwgc2QuZT1jKDQuOCw1LjQsMC4wLDIuNjkpLCBuLmU9YygyNyw5MSwxMiwzNCksCQ0KICBlc3QuYz1jKDI4LjIsMjguNywyNy44NywyMi43KSwgc2QuYz1jKDQuNSw2LjMsMC4wLDIuNzIpLCBuLmM9YygyNCw5NSwxMiwzNCkNCikNCmBgYA0KYGBge3J9DQptLmJlaGF2LmJtaSA8LSBiZWhhdk1ldGEgJT4lIA0KICAgIGZpbHRlcihkb21haW4gPT0gIkJNSSIpICU+JSANCiAgICBtZXRhY29udChuLmUgPSBuLmUsIG1lYW4uZSA9IGVzdC5lLCBzZC5lID0gc2QuZSwNCiAgICAgICAgICAgICAgICAgICBuLmMgPSBuLmMsIG1lYW4uYyA9IGVzdC5jLCBzZC5jID0gc2QuYywNCiAgICAgICAgICAgICAgICAgICBzdHVkbGFiID0gYXV0aG9yLA0KICAgICAgICAgICAgICAgICAgIHNtID0gIk1EIiwNCiAgICAgICAgICAgICAgICAgICBtZXRob2Quc21kID0gIkhlZGdlcyIsDQogICAgICAgICAgICAgICAgICAgY29tYi5maXhlZCA9IEZBTFNFLA0KICAgICAgICAgICAgICAgICAgIGNvbWIucmFuZG9tID0gVFJVRSwNCiAgICAgICAgICAgICAgICAgICBtZXRob2QudGF1ID0gIlJFTUwiLA0KICAgICAgICAgICAgICAgICAgIGhha24gPSBGLA0KICAgICAgICAgICAgICAgICAgIHRpdGxlID0gIkJvZHkgTWFzcyBJbmRleCIpDQptLmJlaGF2LmJtaQ0KYGBgDQpgYGB7ciBmaWcud2lkdGg9MTAsIGZpZy5oZWlnaHQ9Mi41fQ0KZm9yZXN0Lm1ldGEobS5iZWhhdi5ibWksIA0KICAgICAgICAgICAgc29ydHZhciA9IGF1dGhvcixjb2xnYXAgPSAiNW1tIiwgZGlnaXRzLnNkID0gMiwNCiAgICAgICAgICAgIHByZWRpY3QgPSBGQUxTRSwgDQogICAgICAgICAgICBwcmludC50YXUyID0gRkFMU0UsDQogICAgICAgICAgICBsZWZ0bGFicyA9IGMoIkF1dGhvciIsIm1lYW4iLCJTRCIsICJuIiwibWVhbiIsIlNEIiwibiIsIldlaWdodCIsIk1EIiwiOTUlQ0kiKSwNCiAgICAgICAgICAgIGxlZnRjb2xzID0gYygic3R1ZGxhYiIsImVzdC5lIiwic2QuZSIsIm4uZSIsImVzdC5jIiwic2QuYyIsIm4uYyIsIncucmFuZG9tIiwiZWZmZWN0IiwiY2kiKSwNCiAgICAgICAgICAgIGNvbC5zcXVhcmUgPSAiYmx1ZSIsIGNvbC5zcXVhcmUubGluZXMgPSAiYmx1ZSIsDQogICAgICAgICAgICBjb2wuZGlhbW9uZCA9ICJibGFjayIsDQogICAgICAgICAgICB4bGltID0gYygtMywzKSwgIyBCeSBkZWZhdWx0IHRoZSB4LWF4aXMgd2FzIG9ubHkgc2hvd24gYXMgKC0yLDIpOyB7eGxpbX0gZXhwYW5kcyBpdCB0byAoLTMsMykNCiAgICAgICAgICAgIGF0ID0gYygtMywtMiwtMSwwLDEsMiwzKSwgIyB7YXR9IGRlZmluZXMgdGhlIHRpY2tzIG9uIHRoZSB4LWF4aXMNCiAgICAgICAgICAgIGxheW91dCA9ICJSZXZNYW41IikNCmBgYA0KDQojIyMgMy4yIEJvZHkgd2VpZ2h0DQpgYGB7cn0NCiMgQm9keSB3ZWlnaHQgZGF0YQ0KYmVoYXZNZXRhIDwtIGJlaGF2TWV0YSAlPiUgYWRkX3JvdygNCiAgZG9tYWluPWMoJ0JXJywnQlcnLCdCVycsJ0JXJyksCQ0KICBhdXRob3I9YygnQWRpZSBldCBhbC4gMjAxMCcsJ0ZhdWxrbmVyIGV0IGFsLiAyMDE0JywnRmxlbW1pbmcgZXQgYWwuIDIwMTMnLCdLb25vIGV0IGFsLiAyMDEzJyksCQ0KICB5ZWFyPWMoMjAxMCwyMDE0LDIwMTMsMjAxMyksCQ0KICBlc3QuZT1jKDc3LjEsNzUuNywwLjAsNTguNSksCXNkLmU9YygxMS45LDE2LjAsMC4wLDguNjkpLAluLmU9YygyOSwyNywwLDM0KSwJDQogIGVzdC5jPWMoNzcuOSw3NS43LDAuMCw1OS4xKSwJc2QuYz1jKDE3LjIsMTQuMCwwLjAsMTAuNSksCW4uYz1jKDI3LDI0LDAsMzQpDQopDQpgYGANCmBgYHtyfQ0KbS5iZWhhdi53ZWlnaHQgPC0gYmVoYXZNZXRhICU+JSANCiAgICBmaWx0ZXIoZG9tYWluID09ICJCVyIpICU+JSANCiAgICBtZXRhY29udChuLmUgPSBuLmUsIG1lYW4uZSA9IGVzdC5lLCBzZC5lID0gc2QuZSwNCiAgICAgICAgICAgICAgICAgICBuLmMgPSBuLmMsIG1lYW4uYyA9IGVzdC5jLCBzZC5jID0gc2QuYywNCiAgICAgICAgICAgICAgICAgICBzdHVkbGFiID0gYXV0aG9yLA0KICAgICAgICAgICAgICAgICAgIHNtID0gIk1EIiwNCiAgICAgICAgICAgICAgICAgICBtZXRob2Quc21kID0gIkhlZGdlcyIsDQogICAgICAgICAgICAgICAgICAgY29tYi5maXhlZCA9IEZBTFNFLA0KICAgICAgICAgICAgICAgICAgIGNvbWIucmFuZG9tID0gVFJVRSwNCiAgICAgICAgICAgICAgICAgICBtZXRob2QudGF1ID0gIlJFTUwiLA0KICAgICAgICAgICAgICAgICAgIGhha24gPSBGLA0KICAgICAgICAgICAgICAgICAgIHRpdGxlID0gIkJvZHkgd2VpZ2h0IikNCm0uYmVoYXYud2VpZ2h0DQpgYGANCmBgYHtyIGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD0yLjV9DQpmb3Jlc3QubWV0YShtLmJlaGF2LndlaWdodCwgDQogICAgICAgICAgICBzb3J0dmFyID0gYXV0aG9yLGNvbGdhcCA9ICI1bW0iLCBkaWdpdHMuc2QgPSAyLA0KICAgICAgICAgICAgcHJlZGljdCA9IEZBTFNFLCANCiAgICAgICAgICAgIHByaW50LnRhdTIgPSBGQUxTRSwNCiAgICAgICAgICAgIGxlZnRsYWJzID0gYygiQXV0aG9yIiwibWVhbiIsIlNEIiwgIm4iLCJtZWFuIiwiU0QiLCJuIiwiV2VpZ2h0IiwiTUQiLCI5NSVDSSIpLA0KICAgICAgICAgICAgbGVmdGNvbHMgPSBjKCJzdHVkbGFiIiwiZXN0LmUiLCJzZC5lIiwibi5lIiwiZXN0LmMiLCJzZC5jIiwibi5jIiwidy5yYW5kb20iLCJlZmZlY3QiLCJjaSIpLA0KICAgICAgICAgICAgY29sLnNxdWFyZSA9ICJibHVlIiwgY29sLnNxdWFyZS5saW5lcyA9ICJibHVlIiwNCiAgICAgICAgICAgIGNvbC5kaWFtb25kID0gImJsYWNrIiwNCiAgICAgICAgICAgICMgYnkgZGVmYXVsdCB0aGUgeC1heGlzIHdhcyBvbmx5IHNob3duIGFzICgtNSwgMCwgNSkgYW5kIGl0IHdhcyB0aGVyZWZvcmUgZXhwYW5kZWQNCiAgICAgICAgICAgIHhsaW0gPSBjKC0xMCwxMCksIGF0ID0gYygtMTAsLTUsMCw1LDEwKSwgDQogICAgICAgICAgICBsYXlvdXQgPSAiUmV2TWFuNSIpDQpgYGANCg0KIyMjIDMuMyBXYWlzdC9oaXAgcmF0aW8NCmBgYHtyfQ0KIyB3YWlzdC9oaXAgcmF0aW8gZGF0YQ0KYmVoYXZNZXRhIDwtIGJlaGF2TWV0YSAlPiUgYWRkX3JvdygNCiAgZG9tYWluPWMoJ1dIUicsJ1dIUicpLAkNCiAgYXV0aG9yPWMoJ0ZhdWxrbmVyIGV0IGFsLiAyMDE0JywnS2lyayBldCBhbC4gMjAxNCcpLAkNCiAgeWVhcj1jKDIwMTQsMjAxNCksCQ0KICBlc3QuZT1jKDAuOTUsMC45NiksCXNkLmU9YygwLjA4LDAuMDcpLAluLmU9YygyNywxMiksCQ0KICBlc3QuYz1jKDAuOTUsMC45NyksCXNkLmM9YygwLjA4LDAuMDcpLAluLmM9YygyNCwxMikNCikNCmBgYA0KYGBge3J9DQptLmJlaGF2LndociA8LSBiZWhhdk1ldGEgJT4lIA0KICAgIGZpbHRlcihkb21haW4gPT0gIldIUiIpICU+JSANCiAgICBtZXRhY29udChuLmUgPSBuLmUsIG1lYW4uZSA9IGVzdC5lLCBzZC5lID0gc2QuZSwNCiAgICAgICAgICAgICAgICAgICBuLmMgPSBuLmMsIG1lYW4uYyA9IGVzdC5jLCBzZC5jID0gc2QuYywNCiAgICAgICAgICAgICAgICAgICBzdHVkbGFiID0gYXV0aG9yLA0KICAgICAgICAgICAgICAgICAgIHNtID0gIk1EIiwNCiAgICAgICAgICAgICAgICAgICBtZXRob2Quc21kID0gIkhlZGdlcyIsDQogICAgICAgICAgICAgICAgICAgY29tYi5maXhlZCA9IEZBTFNFLA0KICAgICAgICAgICAgICAgICAgIGNvbWIucmFuZG9tID0gVFJVRSwNCiAgICAgICAgICAgICAgICAgICBtZXRob2QudGF1ID0gIlJFTUwiLA0KICAgICAgICAgICAgICAgICAgIGhha24gPSBGLA0KICAgICAgICAgICAgICAgICAgIHRpdGxlID0gIldhaXN0L2hpcCByYXRpbyIpDQptLmJlaGF2Lndocg0KYGBgDQpgYGB7ciBmaWcud2lkdGg9MTAsIGZpZy5oZWlnaHQ9Mn0NCmZvcmVzdC5tZXRhKG0uYmVoYXYud2hyLCANCnNvcnR2YXIgPSBhdXRob3IsY29sZ2FwID0gIjVtbSIsIGRpZ2l0cy5zZCA9IDIsDQogICAgICAgICAgICBwcmVkaWN0ID0gRkFMU0UsIA0KICAgICAgICAgICAgcHJpbnQudGF1MiA9IEZBTFNFLA0KICAgICAgICAgICAgbGVmdGxhYnMgPSBjKCJBdXRob3IiLCJtZWFuIiwiU0QiLCAibiIsIm1lYW4iLCJTRCIsIm4iLCJXZWlnaHQiLCJNRCIsIjk1JUNJIiksDQogICAgICAgICAgICBsZWZ0Y29scyA9IGMoInN0dWRsYWIiLCJlc3QuZSIsInNkLmUiLCJuLmUiLCJlc3QuYyIsInNkLmMiLCJuLmMiLCJ3LnJhbmRvbSIsImVmZmVjdCIsImNpIiksDQogICAgICAgICAgICBjb2wuc3F1YXJlID0gImJsdWUiLCBjb2wuc3F1YXJlLmxpbmVzID0gImJsdWUiLA0KICAgICAgICAgICAgY29sLmRpYW1vbmQgPSAiYmxhY2siLA0KICAgICAgICAgICAgIyBieSBkZWZhdWx0IHRoZSB4LWF4aXMgbGFiZWxzIHdlcmUgc2hvd24gYXMgKC0wLjA2LC0wLjAyLDAsMC4wMiwwLjA0LDAuMDYpIGZvciA/Pz8gcmVhc29uDQogICAgICAgICAgICBhdCA9IGMoLTAuMDYsLTAuMDMsMCwwLjAzLDAuMDYpLCANCiAgICAgICAgICAgIGxheW91dCA9ICJSZXZNYW41IikNCmBgYA0KDQojIyA0IEVwaWRlbWlvbG9naWNhbCBtZWFzdXJlcw0KDQojIyMgNC4xIE1vcnRhbGl0eQ0KYGBge3J9DQojIE1vcnRhbGl0eSBkYXRhDQpiZWhhdk1ldGEgPC0gYmVoYXZNZXRhICU+JSBhZGRfcm93KA0KICBkb21haW49YygnTU9SUycsJ01PUlMnLCdNT1JTJywnTU9SUycsJ01PUlMnKSwJDQogIGF1dGhvcj1jKCdBbGxlbiBldCBhbC4gMjAwMicsJ0FsbGVuIGV0IGFsLiAyMDA5JywnQm95c2VuIGV0IGFsLiAyMDA5JywNCiAgICAgICAgICAgJ0ZhdWxrbmVyIGV0IGFsLiAyMDE0JywnUGVuZyBldCBhbC4gMjAwNCcpLAkNCiAgeWVhcj1jKDIwMDIsMjAwOSwyMDA5LDIwMTQsMjAwNCksCQ0KICBlc3QuZT1jKDEsOSwxMSwwLDEzKSwJc2QuZT1jKE5BLE5BLE5BLE5BLE5BKSwJbi5lPWMoNDcsMTkwLDE1NywzMCwxNzk1KSwJDQogIGVzdC5jPWMoNCw3LDksNCwxNSksCXNkLmM9YyhOQSxOQSxOQSxOQSxOQSksCW4uYz1jKDQ2LDE5MCwxNTcsMzAsMjAyNikNCikNCmBgYA0KYGBge3J9DQptLmJlaGF2Lm1vcnMgPC0gYmVoYXZNZXRhICU+JSANCiAgICBmaWx0ZXIoZG9tYWluID09ICJNT1JTIikgJT4lIA0KICAgIG1ldGFiaW4oZXZlbnQuZSA9IGVzdC5lLCANCiAgICAgICAgICAgICAgICAgbi5lID0gbi5lLA0KICAgICAgICAgICAgICAgICBldmVudC5jID0gZXN0LmMsDQogICAgICAgICAgICAgICAgIG4uYyA9IG4uYywNCiAgICAgICAgICAgICAgICAgc3R1ZGxhYiA9IGF1dGhvciwNCiAgICAgICAgICAgICAgICAgc20gPSAiUlIiLA0KICAgICAgICAgICAgICAgICBtZXRob2QgPSAiTUgiLA0KICAgICAgICAgICAgICAgICBNSC5leGFjdCA9IFRSVUUsDQogICAgICAgICAgICAgICAgIGNvbWIuZml4ZWQgPSBGQUxTRSwNCiAgICAgICAgICAgICAgICAgY29tYi5yYW5kb20gPSBUUlVFLA0KICAgICAgICAgICAgICAgICBtZXRob2QudGF1ID0gIlBNIiwNCiAgICAgICAgICAgICAgICAgaGFrbiA9IEYsDQogICAgICAgICAgICAgICAgIHRpdGxlID0gIkFsbCBDYXVzZSBNb3J0YWxpdHkiKQ0KbS5iZWhhdi5tb3JzDQpgYGANCmBgYHtyIGZpZy53aWR0aD05LCBmaWcuaGVpZ2h0PTIuNX0NCmZvcmVzdC5tZXRhKG0uYmVoYXYubW9ycywgDQogICAgICAgICAgICBzb3J0dmFyID0gYXV0aG9yLA0KICAgICAgICAgICAgcHJlZGljdCA9IEZBTFNFLCBjb2xnYXAgPSAiNW1tIiwNCiAgICAgICAgICAgIHByaW50LnRhdTIgPSBGQUxTRSwNCiAgICAgICAgICAgIGxlZnRsYWJzID0gYygiU3R1ZHkiLCJFdmVudHMiLCJuIiwiRXZlbnQiLCAibiIsIldlaWdodCIsIlJpc2sgUmF0aW8iKSwNCiAgICAgICAgICAgIGxlZnRjb2xzID0gYygic3R1ZGxhYiIsImVzdC5lIiwibi5lIiwiZXN0LmMiLCJuLmMiLCJ3LnJhbmRvbSIsImVmZmVjdC5jaSIpLA0KICAgICAgICAgICAgY29sLnNxdWFyZSA9ICJibHVlIiwNCiAgICAgICAgICAgIGNvbC5kaWFtb25kID0gImJsYWNrIiwNCiAgICAgICAgICAgIGxheW91dCA9ICJSZXZNYW41IikNCmBgYA0KDQoNCiMjIyA0LjIgUmVjdXJyZW50IHN0cm9rZS9USUENCmBgYHtyfQ0KIyByZWN1cnJlbmNlIGRhdGENCmJlaGF2TWV0YSA8LSBiZWhhdk1ldGEgJT4lIGFkZF9yb3coDQogIGRvbWFpbj1jKCdSRUNVUicsJ1JFQ1VSJywnUkVDVVInLCdSRUNVUicpLAkNCiAgYXV0aG9yPWMoJ0FsbGVuIGV0IGFsLiAyMDAyJywnQm95c2VuIGV0IGFsLiAyMDA5JywnTWNNYW51cyBldCBhbC4gMjAwOScsJ1BlbmcgZXQgYWwuIDIwMDQnKSwJDQogIHllYXI9YygyMDAyLDIwMDksMjAwOSwyMDA0KSwJDQogIGVzdC5lPWMoMSw3LDE0LDQ2KSwJc2QuZT1jKE5BLE5BLE5BLE5BKSwJbi5lPWMoNDcsNDksMTU3LDE3OTUpLAkNCiAgZXN0LmM9YygwLDYsMTEsNTIpLAlzZC5jPWMoTkEsTkEsTkEsTkEpLAluLmM9Yyg0Niw1MywxNTcsMjAyNikNCikNCmBgYA0KYGBge3J9DQptLmJlaGF2LnJlY3VyIDwtIGJlaGF2TWV0YSAlPiUgDQogICAgZmlsdGVyKGRvbWFpbiA9PSAiUkVDVVIiKSAlPiUgDQogICAgbWV0YWJpbihldmVudC5lID0gZXN0LmUsIA0KICAgICAgICAgICAgICAgICBuLmUgPSBuLmUsDQogICAgICAgICAgICAgICAgIGV2ZW50LmMgPSBlc3QuYywNCiAgICAgICAgICAgICAgICAgbi5jID0gbi5jLA0KICAgICAgICAgICAgICAgICBzdHVkbGFiID0gYXV0aG9yLA0KICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgc20gPSAiUlIiLA0KICAgICAgICAgICAgICAgICBtZXRob2QgPSAiTUgiLA0KICAgICAgICAgICAgICAgICBNSC5leGFjdCA9IFRSVUUsDQogICAgICAgICAgICAgICAgIGNvbWIuZml4ZWQgPSBGQUxTRSwNCiAgICAgICAgICAgICAgICAgY29tYi5yYW5kb20gPSBUUlVFLA0KICAgICAgICAgICAgICAgICBtZXRob2QudGF1ID0gIlBNIiwNCiAgICAgICAgICAgICAgICAgaGFrbiA9IEYsDQogICAgICAgICAgICAgICAgIHRpdGxlID0gIkdvYWwgYmxvb2QgcHJlc3N1cmUiKQ0KbS5iZWhhdi5yZWN1cg0KYGBgDQpgYGB7ciBmaWcud2lkdGg9OS4xLGZpZy5oZWlnaHQ9Mi41fQ0KZm9yZXN0Lm1ldGEobS5iZWhhdi5yZWN1ciwgDQogICAgICAgICAgICBzb3J0dmFyID0gYXV0aG9yLA0KICAgICAgICAgICAgcHJlZGljdCA9IEZBTFNFLCBjb2xnYXAgPSAiNW1tIiwNCiAgICAgICAgICAgIHByaW50LnRhdTIgPSBGQUxTRSwNCiAgICAgICAgICAgIGxlZnRsYWJzID0gYygiU3R1ZHkiLCJFdmVudHMiLCJuIiwiRXZlbnQiLCAibiIsIldlaWdodCIsIlJpc2sgUmF0aW8iKSwNCiAgICAgICAgICAgIGxlZnRjb2xzID0gYygic3R1ZGxhYiIsImVzdC5lIiwibi5lIiwiZXN0LmMiLCJuLmMiLCJ3LnJhbmRvbSIsImVmZmVjdC5jaSIpLA0KICAgICAgICAgICAgY29sLnNxdWFyZSA9ICJibHVlIiwNCiAgICAgICAgICAgIGNvbC5kaWFtb25kID0gImJsYWNrIiwNCiAgICAgICAgICAgICMgT25lIG9mIHRoZSBjb25maWRlbmNlIGludGVydmFscyBnb2VzIHVwIHRvIDcwOyBsaW1pdGluZyB0aGUgeC1heGlzIGFkZHMgYW4gYXJyb3cgdG8gdGhlIA0KICAgICAgICAgICAgIyBjb25maWRlbmNlIGludGVydmFsIGxpbmUgdG8gaW5kaWNhdGUgdGhhdCBpcyBnb2VzIGJleW9uZCB0aGUgbGltaXQNCiAgICAgICAgICAgIHhsaW0gPSBjKDAuMSwxMCksDQogICAgICAgICAgICBsYXlvdXQgPSAiUmV2TWFuNSIpDQpgYGANCg0KIyMjIDQuMyBBZHZlcnNlIGV2ZW50cw0KYGBge3J9DQojIEFkdmVyc2UgZXZlbnRzIGRhdGENCmJlaGF2TWV0YSA8LSBiZWhhdk1ldGEgJT4lIGFkZF9yb3coDQogIGRvbWFpbj1jKCdBRFZFUlNFJywnQURWRVJTRScsJ0FEVkVSU0UnLCdBRFZFUlNFJywnQURWRVJTRScsJ0FEVkVSU0UnLCdBRFZFUlNFJyksCQ0KICBhdXRob3I9YygnQWxsZW4gZXQgYWwuIDIwMDInLCdBbGxlbiBldCBhbC4gMjAwOScsJ0JveXNlbiBldCBhbC4gMjAwOScsJ0VuZ2xpc2ggZXQgYWwuIDIwMTYnLA0KICAgICAgICAgICAnS29ubyBldCBhbC4gMjAxMycsJ01jTWFudXMgZXQgYWwuIDIwMDknLCdQZW5nIGV0IGFsLiAyMDA0JyksCQ0KICB5ZWFyPWMoMjAwMiwyMDA5LDIwMDksMjAxNiwyMDEzLDIwMDksMjAwNCksCQ0KICBlc3QuZT1jKDEwLDksMjgsMiwxLDEzLDYzKSwJc2QuZT1jKE5BLE5BLE5BLE5BLE5BLE5BLE5BKSwJbi5lPWMoNDcsMTkwLDE1NywxOSwzNSw0OSwxNzk1KSwJDQogIGVzdC5jPWMoMTksNywyOSwyLDEyLDIyLDczKSwJc2QuYz1jKE5BLE5BLE5BLE5BLE5BLE5BLE5BKSwJbi5jPWMoNDYsMTkwLDE1NywxNCwzNSw1MywyMDI2KQ0KKQ0KYGBgDQpgYGB7cn0NCm0uYmVoYXYuYWR2IDwtIGJlaGF2TWV0YSAlPiUgDQogICAgZmlsdGVyKGRvbWFpbiA9PSAiQURWRVJTRSIpICU+JSANCiAgICBtZXRhYmluKGV2ZW50LmUgPSBlc3QuZSwgDQogICAgICAgICAgICAgICAgIG4uZSA9IG4uZSwNCiAgICAgICAgICAgICAgICAgZXZlbnQuYyA9IGVzdC5jLA0KICAgICAgICAgICAgICAgICBuLmMgPSBuLmMsDQogICAgICAgICAgICAgICAgIHN0dWRsYWIgPSBhdXRob3IsDQogICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICBzbSA9ICJSUiIsDQogICAgICAgICAgICAgICAgIG1ldGhvZCA9ICJNSCIsDQogICAgICAgICAgICAgICAgIE1ILmV4YWN0ID0gVFJVRSwNCiAgICAgICAgICAgICAgICAgY29tYi5maXhlZCA9IEZBTFNFLA0KICAgICAgICAgICAgICAgICBjb21iLnJhbmRvbSA9IFRSVUUsDQogICAgICAgICAgICAgICAgIG1ldGhvZC50YXUgPSAiUE0iLA0KICAgICAgICAgICAgICAgICBoYWtuID0gRiwNCiAgICAgICAgICAgICAgICAgdGl0bGUgPSAiR29hbCBibG9vZCBwcmVzc3VyZSIpDQptLmJlaGF2LmFkdg0KYGBgDQpgYGB7ciBmaWcud2lkdGg9OSwgZmlnLmhlaWdodD0zfQ0KZm9yZXN0Lm1ldGEobS5iZWhhdi5hZHYsIA0KICAgICAgICAgICAgc29ydHZhciA9IGF1dGhvciwNCiAgICAgICAgICAgIHByZWRpY3QgPSBGQUxTRSwgY29sZ2FwID0gIjVtbSIsDQogICAgICAgICAgICBwcmludC50YXUyID0gRkFMU0UsDQogICAgICAgICAgICBsZWZ0bGFicyA9IGMoIlN0dWR5IiwiRXZlbnRzIiwibiIsIkV2ZW50IiwgIm4iLCJXZWlnaHQiLCJSaXNrIFJhdGlvIiksDQogICAgICAgICAgICBsZWZ0Y29scyA9IGMoInN0dWRsYWIiLCJlc3QuZSIsIm4uZSIsImVzdC5jIiwibi5jIiwidy5yYW5kb20iLCJlZmZlY3QuY2kiKSwNCiAgICAgICAgICAgIGNvbC5zcXVhcmUgPSAiYmx1ZSIsDQogICAgICAgICAgICBjb2wuZGlhbW9uZCA9ICJibGFjayIsDQogICAgICAgICAgICB4bGltID0gYygwLjA1LDIwKSwgYXQgPSBjKDAuMSwwLjUsMSwyLDEwKSwNCiAgICAgICAgICAgIGxheW91dCA9ICJSZXZNYW41IikNCmBgYA0KDQojIyA1IE90aGVyIG91dGNvbWVzDQoNCiMjIyA1LjEgTW9kaWZpZWQgUmFua2luIFNjYWxlDQpgYGB7cn0NCiMgTVJTIGRhdGENCmJlaGF2TWV0YSA8LSBiZWhhdk1ldGEgJT4lIGFkZF9yb3coDQogIGRvbWFpbj1jKCdNUlMnLCdNUlMnLCdNUlMnLCdNUlMnKSwJDQogIGF1dGhvcj1jKCdBZGllIGV0IGFsLiAyMDEwJywnQm95c2VuIGV0IGFsLiAyMDA5JywnSm91YmVydCBldCBhbC4gMjAwOScsJ1dhbiBhbC4gMjAxNicpLAkNCiAgeWVhcj1jKDIwMTAsMjAwOSwyMDA5LDIwMTYpLAkNCiAgZXN0LmU9YygwLDEuNDUsMS4yLDAuMTgpLAlzZC5lPWMoMSwxLjE5LDEuMSwwLjUpLAluLmU9YygyOSwxMzcsOTEsNDApLAkNCiAgZXN0LmM9YygwLDEuNSwxLjksMC40KSwJc2QuYz1jKDEsMS4yNiwxLjIsMC43MSksCW4uYz1jKDI3LDE0Nyw5NSw0MCkpDQpgYGANCmBgYHtyfQ0KbS5iZWhhdi5tcnMgPC0gYmVoYXZNZXRhICU+JSANCiAgICBmaWx0ZXIoZG9tYWluID09ICJNUlMiKSAlPiUgDQogICAgbWV0YWNvbnQobi5lID0gbi5lLCBtZWFuLmUgPSBlc3QuZSwgc2QuZSA9IHNkLmUsDQogICAgICAgICAgICAgICAgICAgbi5jID0gbi5jLCBtZWFuLmMgPSBlc3QuYywgc2QuYyA9IHNkLmMsDQogICAgICAgICAgICAgICAgICAgc3R1ZGxhYiA9IGF1dGhvciwNCiAgICAgICAgICAgICAgICAgICBzbSA9ICJTTUQiLA0KICAgICAgICAgICAgICAgICAgIG1ldGhvZC5zbWQgPSAiSGVkZ2VzIiwNCiAgICAgICAgICAgICAgICAgICBjb21iLmZpeGVkID0gRkFMU0UsDQogICAgICAgICAgICAgICAgICAgY29tYi5yYW5kb20gPSBUUlVFLA0KICAgICAgICAgICAgICAgICAgIG1ldGhvZC50YXUgPSAiUkVNTCIsDQogICAgICAgICAgICAgICAgICAgaGFrbiA9IEYsDQogICAgICAgICAgICAgICAgICAgdGl0bGUgPSAiTW9kaWZpZWQgUmFua2luIFNjYWxlIikNCm0uYmVoYXYubXJzDQpgYGANCg0KYGBge3IgZmlnLndpZHRoID0gOS44LCBmaWcuaGVpZ2h0ID0gMi4zfQ0KZm9yZXN0Lm1ldGEobS5iZWhhdi5tcnMsIA0KICAgICAgICAgICAgc29ydHZhciA9IGF1dGhvcixjb2xnYXAgPSAiNW1tIiwgZGlnaXRzLnNkID0gMiwNCiAgICAgICAgICAgIHByZWRpY3QgPSBGQUxTRSwgDQogICAgICAgICAgICBwcmludC50YXUyID0gRkFMU0UsDQogICAgICAgICAgICBsZWZ0bGFicyA9IGMoIkF1dGhvciIsIm1lYW4iLCJTRCIsICJuIiwibWVhbiIsIlNEIiwibiIsIldlaWdodCIsIk1EIiwiOTUlQ0kiKSwNCiAgICAgICAgICAgIGxlZnRjb2xzID0gYygic3R1ZGxhYiIsImVzdC5lIiwic2QuZSIsIm4uZSIsImVzdC5jIiwic2QuYyIsIm4uYyIsIncucmFuZG9tIiwiZWZmZWN0IiwiY2kiKSwNCiAgICAgICAgICAgIGNvbC5zcXVhcmUgPSAiYmx1ZSIsIGNvbC5zcXVhcmUubGluZXMgPSAiYmx1ZSIsDQogICAgICAgICAgICBjb2wuZGlhbW9uZCA9ICJibGFjayIsDQogICAgICAgICAgICAjIGJ5IGRlZmF1bHQgdGhlIHt4bGltfSB3YXMgc2hvd24gYXMgKC0wLjUsIDAuNSk7IGl0IGlzIGV4cGFuZGVkIGZvciBhZXN0aGV0aWMgcmVhc29ucw0KICAgICAgICAgICAgeGxpbSA9IGMoLTEsMSksDQogICAgICAgICAgICBsYXlvdXQgPSAiUmV2TWFuNSIpDQpgYGANCg0KIyMjIDUuMiBRdWFsaXR5IG9mIGxpZmUNCmBgYHtyfQ0KIyBRdWFsaXR5IG9mIGxpZmUgZGF0YQ0KYmVoYXZNZXRhIDwtIGJlaGF2TWV0YSAlPiUgYWRkX3JvdygNCiAgZG9tYWluPWMoJ1FPTCcsJ1FPTCcsJ1FPTCcsJ1FPTCcsJ1FPTCcpLAkNCiAgYXV0aG9yPWMoJ0Jhcmtlci1Db2xsbyBldCBhbC4gMjAxNScsJ0RhbXVzaCBldCBhbC4gMjAxMScsJ0pvdWJlcnQgZXQgYWwuIDIwMDknLA0KICAgICAgICAgICAnS2lyayBldCBhbC4gMjAxNCcsJ01jTWFudXMgZXQgYWwuIDIwMDknKSwJDQogIHllYXI9YygyMDE1LDIwMTEsMjAwOSwyMDE0LDIwMDkpLAkNCiAgZXN0LmU9Yyg0My4wMiwzLjgyLDI2LjQsNDMuMCw2Mi4wKSwJc2QuZT1jKDEwLjgyLDAuODgsNS4zLDkuNywyLjkpLAluLmU9YygxNjUsMzAsOTEsMTIsNDkpLAkNCiAgZXN0LmM9Yyg0My41MiwzLjk0LDI5LjcsNDcuNDIsNjAuMCksCXNkLmM9YygxMC43MywwLjgyLDYuMiw1LjUsMi44KSwJbi5jPWMoMTY5LDMzLDk1LDEyLDUzKQ0KKQ0KYGBgDQpgYGB7cn0NCm0uYmVoYXYucW9sIDwtIGJlaGF2TWV0YSAlPiUgDQogICAgZmlsdGVyKGRvbWFpbiA9PSAiUU9MIikgJT4lIA0KICAgIG1ldGFjb250KG4uZSA9IG4uZSwgbWVhbi5lID0gZXN0LmUsIHNkLmUgPSBzZC5lLA0KICAgICAgICAgICAgICAgICAgIG4uYyA9IG4uYywgbWVhbi5jID0gZXN0LmMsIHNkLmMgPSBzZC5jLA0KICAgICAgICAgICAgICAgICAgIHN0dWRsYWIgPSBhdXRob3IsDQogICAgICAgICAgICAgICAgICAgc20gPSAiTUQiLA0KICAgICAgICAgICAgICAgICAgIG1ldGhvZC5zbWQgPSAiSGVkZ2VzIiwNCiAgICAgICAgICAgICAgICAgICBjb21iLmZpeGVkID0gRkFMU0UsDQogICAgICAgICAgICAgICAgICAgY29tYi5yYW5kb20gPSBUUlVFLA0KICAgICAgICAgICAgICAgICAgIG1ldGhvZC50YXUgPSAiUkVNTCIsDQogICAgICAgICAgICAgICAgICAgaGFrbiA9IEYsDQogICAgICAgICAgICAgICAgICAgdGl0bGUgPSAiUXVhbGl0eSBvZiBsaWZlIikNCm0uYmVoYXYucW9sDQpgYGANCmBgYHtyIGZpZy53aWR0aD0xMC43LCBmaWcuaGVpZ2h0PTIuNX0NCmZvcmVzdC5tZXRhKG0uYmVoYXYucW9sLCANCiAgICAgICAgICAgIHNvcnR2YXIgPSBhdXRob3IsY29sZ2FwID0gIjVtbSIsIGRpZ2l0cy5zZCA9IDIsDQogICAgICAgICAgICBwcmVkaWN0ID0gRkFMU0UsIA0KICAgICAgICAgICAgcHJpbnQudGF1MiA9IEZBTFNFLA0KICAgICAgICAgICAgbGVmdGxhYnMgPSBjKCJBdXRob3IiLCJtZWFuIiwiU0QiLCAibiIsIm1lYW4iLCJTRCIsIm4iLCJXZWlnaHQiLCJNRCIsIjk1JUNJIiksDQogICAgICAgICAgICBsZWZ0Y29scyA9IGMoInN0dWRsYWIiLCJlc3QuZSIsInNkLmUiLCJuLmUiLCJlc3QuYyIsInNkLmMiLCJuLmMiLCJ3LnJhbmRvbSIsImVmZmVjdCIsImNpIiksDQogICAgICAgICAgICBjb2wuc3F1YXJlID0gImJsdWUiLCBjb2wuc3F1YXJlLmxpbmVzID0gImJsdWUiLA0KICAgICAgICAgICAgY29sLmRpYW1vbmQgPSAiYmxhY2siLA0KICAgICAgICAgICAgeGxpbSA9IGMoLTUsNSksIGF0ID0gYygtNSwtMi41LDAsMi41LDUpLA0KICAgICAgICAgICAgbGF5b3V0ID0gIlJldk1hbjUiKQ0KYGBgDQoNCg0KDQojIyA2IFJpc2sgb2YgYmlhcw0KDQpJbiBvdXIgc3R1ZHkgV2UgdXNlZCB0aGUgZmlyc3QgdmVyc2lvbiBvZiBDb2NocmFuZSdzIFJpc2sgb2YgQmlhcyBhc3Nlc3NtZW50IChSb0IxKS4NCmBgYHtyfQ0KYmVoYXZST0IgPC0gZGF0YS5mcmFtZSgNCiAgU3R1ZHkgPSBmYWN0b3IoYygiQWRpZSAyMDEwIiwiQWxsZW4gMjAwMiIsIkFsbGVuIDIwMDkiLCJCYXJrZXItQ29sbG8gMjAxNSIsIkJvc3MgMjAxNCIsIkJveXNlbiAyMDA5IiwNCiAgICAgICAgICAgICAgICAgICAiQnJ1bm5lciBGcmFuZHNlbiAyMDEyIiwiQ2hhbnJ1ZW5ndmFuaWNoIDIwMDYiLCJDaGVuZyAyMDE4IiwiRGFtdXNoIDIwMTEiLCJFbmdsaXNoIDIwMTYiLA0KICAgICAgICAgICAgICAgICAgICJFdmFucy1IdWRuYWxsIDIwMTQiLCJGYXVsa25lciAyMDE0IiwiRmxlbW1pbmcgMjAxMyIsIkdpbGxoYW0gMjAxMCIsIkhvbHplbWVyIDIwMTEiLA0KICAgICAgICAgICAgICAgICAgICJIb3JubmVzIDIwMTEiLCJJcmV3YWxsIDIwMTUiLCJKb3ViZXJ0IDIwMDYiLCJKb3ViZXJ0IDIwMDkiLCJLaW0gMjAxMyIsIktpcmsgMjAxNCIsDQogICAgICAgICAgICAgICAgICAgIktvbm8gMjAxMyIsIk1jTWFudXMgMjAwOSIsIk1vcmVuIDIwMTYiLCJOaXIgMjAwNCIsIlBlbmcgMjAwNCIsIldhbiAyMDE2IiwiV29sZmUgMjAxMCIpKSwNCiAgUmFuZG9tLnNlcXVlbmNlLmdlbmVyYXRpb24uID0gZmFjdG9yKGMoJ0xvdycsJ0xvdycsJ0xvdycsJ0xvdycsJ0hpZ2gnLCdMb3cnLCdMb3cnLCdTb21lIGNvbmNlcm5zJywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0xvdycsJ0xvdycsJ0xvdycsJ0xvdycsJ0xvdycsJ0xvdycsJ0xvdycsJ0xvdycsJ0xvdycsJ0xvdycsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdMb3cnLCdMb3cnLCdMb3cnLCdMb3cnLCdMb3cnLCdMb3cnLCdMb3cnLCdTb21lIGNvbmNlcm5zJywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1NvbWUgY29uY2VybnMnLCdMb3cnLCdMb3cnKSksDQogIEFsbG9jYXRpb24uY29uY2VhbG1lbnQuPSBmYWN0b3IoYygnTG93JywnTG93JywnTG93JywnTG93JywnU29tZSBjb25jZXJucycsJ0xvdycsJ0xvdycsJ1NvbWUgY29uY2VybnMnLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0xvdycsJ0xvdycsJ0xvdycsJ0xvdycsJ0xvdycsJ1NvbWUgY29uY2VybnMnLCdMb3cnLCdTb21lIGNvbmNlcm5zJywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdMb3cnLCdMb3cnLCdTb21lIGNvbmNlcm5zJywnU29tZSBjb25jZXJucycsJ1NvbWUgY29uY2VybnMnLCdMb3cnLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0xvdycsJ0xvdycsJ1NvbWUgY29uY2VybnMnLCdTb21lIGNvbmNlcm5zJywnSGlnaCcsJ0xvdycsJ0xvdycpKSwNCiAgQmxpbmRpbmcub2YucGFydGljaXBhbnRzLmFuZC5wZXJzb25uZWwuID0gZmFjdG9yKGMoJ0hpZ2gnLCdIaWdoJywnSGlnaCcsJ0hpZ2gnLCdTb21lIGNvbmNlcm5zJywnSGlnaCcsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdIaWdoJywnSGlnaCcsJ0hpZ2gnLCdIaWdoJywnSGlnaCcsJ0hpZ2gnLCdIaWdoJywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0hpZ2gnLCdIaWdoJywnSGlnaCcsJ0hpZ2gnLCdIaWdoJywnSGlnaCcsJ0hpZ2gnLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnSGlnaCcsJ0hpZ2gnLCdIaWdoJywnSGlnaCcsJ0hpZ2gnLCdIaWdoJywnSGlnaCcsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdIaWdoJywnSGlnaCcpKSwNCiAgQmxpbmRpbmcub2Yub3V0Y29tZS5hc3Nlc3NtZW50LiA9IGZhY3RvcihjKCdIaWdoJywnTG93JywnTG93JywnTG93JywnU29tZSBjb25jZXJucycsJ0xvdycsJ0hpZ2gnLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0hpZ2gnLCdMb3cnLCdMb3cnLCdMb3cnLCdIaWdoJywnTG93JywnSGlnaCcsJ0hpZ2gnLCdIaWdoJywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdMb3cnLCdIaWdoJywnSGlnaCcsJ0hpZ2gnLCdIaWdoJywnTG93JywnTG93JywnSGlnaCcsJ0xvdycsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnSGlnaCcsJ0hpZ2gnLCdMb3cnLCdIaWdoJykpLA0KICBJbmNvbXBsZXRlLm91dGNvbWUuZGF0YS4gPSBmYWN0b3IoYygnTG93JywnTG93JywnTG93JywnSGlnaCcsJ0xvdycsJ1NvbWUgY29uY2VybnMnLCdTb21lIGNvbmNlcm5zJywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0xvdycsJ0xvdycsJ0xvdycsJ0xvdycsJ0xvdycsJ0xvdycsJ0hpZ2gnLCdMb3cnLCdIaWdoJywnTG93JywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0xvdycsJ1NvbWUgY29uY2VybnMnLCdMb3cnLCdMb3cnLCdMb3cnLCdMb3cnLCdMb3cnLCdMb3cnLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnU29tZSBjb25jZXJucycsJ0hpZ2gnLCdMb3cnLCdMb3cnKSksDQogIFNlbGVjdGl2ZS5yZXBvcnRpbmcuID0gZmFjdG9yKGMoJ0xvdycsJ0xvdycsJ0xvdycsJ0xvdycsJ1NvbWUgY29uY2VybnMnLCdMb3cnLCdMb3cnLCdMb3cnLCdMb3cnLCdMb3cnLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdMb3cnLCdMb3cnLCdMb3cnLCdTb21lIGNvbmNlcm5zJywnTG93JywnU29tZSBjb25jZXJucycsJ0xvdycsJ0xvdycsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0hpZ2gnLCdMb3cnLCdMb3cnLCdMb3cnLCdMb3cnLCdMb3cnLCdMb3cnLCdMb3cnLCdTb21lIGNvbmNlcm5zJywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnTG93JywnTG93JykpLA0KICBPdGhlci5zb3VyY2VzLm9mLmJpYXMuID0gZmFjdG9yKGMoJ0xvdycsJ0hpZ2gnLCdIaWdoJywnU29tZSBjb25jZXJucycsJ1NvbWUgY29uY2VybnMnLCdMb3cnLCdMb3cnLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0hpZ2gnLCdMb3cnLCdIaWdoJywnTG93JywnSGlnaCcsJ0xvdycsJ0xvdycsJ0hpZ2gnLCdMb3cnLCdIaWdoJywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdMb3cnLCdIaWdoJywnSGlnaCcsJ0hpZ2gnLCdMb3cnLCdMb3cnLCdMb3cnLCdIaWdoJywnU29tZSBjb25jZXJucycsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnSGlnaCcsJ0hpZ2gnLCdMb3cnKSksDQogIHdlaWdodCA9IHJlcCgxLDI5KQ0KICApDQoNCg0KDQpgYGANCg0KQSBzdW1tYXJ5IGJhciBjaGFydCBvZiBSb2IxIGNhbiBiZSBkcmF3biB3aXRoIHRoZSBmdW5jdGlvbiB7cm9iX3N1bW1hcnkoKX0gZnJvbSB0aGUgbGlicmFyeSB7cm9idmlzfSANCmBgYHtyIGZpZy5oZWlnaHQ9MywgZmlnLndpZHRoPTEyfQ0KIyBsaWJyYXJ5KHJvYnZpcykNCnJvX3N1bSA8LSByb2Jfc3VtbWFyeShkYXRhID0gYmVoYXZST0IsIA0KICAgICAgICAgICAgICAgICAgdG9vbCA9ICJST0IxIix3ZWlnaHRlZCA9IEYpDQojJyBUaGUgZmlndXJlIGlzIHJlbmRlcmVkIHdpdGggZ2dwbG90MiBhbmQgY2FuIHRoZXJlZm9yZSBiZSBtb2RpZmllZCBieSBhZGRpbmcgdGhlbWUgYXJndW1lbnRzDQpyb19zdW0gKyB0aGVtZShheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTMsIGNvbG9yID0gImJsYWNrIiwgaGp1c3QgPSAxKSwNCiAgICAgICAgICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCksDQogICAgICAgICAgICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTEpICkNCmBgYA0KDQpBICp0cmFmZmljIGxpZ2h0IHRhYmxlKiBpcyBhIHRhYmxlIHRoYXQgc2hvd3MgdGhlIFJpc2sgb2YgQmlhcyBhc3Nlc3NtZW50IGZvciBlYWNoIGluZGl2aWR1YWwgc3R1ZHkuIFRoaXMgY2FuIGJlIGJ1aWxkIHdpdGggdGhlIGZ1bmN0aW9uIHtyb2JfdHJhZmZpY19saWd0aH0gZnJvbSB0aGUgbGlicmFyeSB7cm9idmlzfS4gVW5mb3J0dW5hdGVseSwgdGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBzdXBwb3J0IFJvYjEsIGJ1dCBoYXMgUm9iMiBhcyBpdHMnIGRlZmF1bHQuICANCmBgYHtyIGZpZy5oZWlnaHQ9MTgsIGZpZy53aWR0aD02fQ0KIycgVGhpcyBmdW5jdGlvbiBtYWtlcyB0aGUgdHJhZmZpYyBsaWdodCB0YWJsZSBpbiB0aGUgUm9iMiBmb3JtYXQuIFRoZSBmdW5jdGlvbiByZXN0cnVjdHVyZXMgdGhlIGRhdGEgYW5kIHJlbmRlcnMgdGhlIHRhYmxlIHVzaW5nIGdncGxvdDINCg0Kcm9iTGlnaHQgPC0gcm9iX3RyYWZmaWNfbGlnaHQoZGF0YSA9IGJlaGF2Uk9CLCANCiAgICAgICAgICAgICAgICAgIHRvb2wgPSAiUk9CMiIsIHBzaXplID0gMTApDQoNCiMgcm9iTGlnaHQgKyBzY2FsZV9zaXplKHJhbmdlID0gYygxLDEwKSkgKw0KIyAgdGhlbWUoDQojICAgIHN0cmlwLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoY29sb3VyID0gImJsYWNrIiwgZmlsbCA9ICJ3aGl0ZSIpLA0KIyAgICBzdHJpcC50ZXh0LnkubGVmdCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDAsIHNpemUgPSAxMCksDQojICAgIHN0cmlwLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLCBzaXplID0gMTApDQojICApDQpgYGANCg0KQWx0aG91Z2ggdGhlIGZ1bmN0aW9uIHtyb2JfdHJhZmZpY19saWdodH0gZG9lcyBub3Qgc3VwcG9ydCBSb0IxIGluIGl0c2VsZiwgd2UgY2FuIHN0aWxsIHVzZSBzb21lIGl0cycgZnVuY3Rpb25hbGl0eSB0byBidWlsZCBhIHRyYWZmaWMgbGlnaHQgdGFibGUgZnJvbSBSb2IxLWRhdGEuIEluIHRoaXMgZXhhbXBsZSBJIGhhdmUgcmV1c2VkIHRoZSByZXN0cnVjdHVyZWQgZGF0YSBnZW5lcmF0ZWQgZnJvbSB0aGUgZnVuY3Rpb24ge3JvYl90cmFmZmljX2xpZ2h0fSBhbmQgcmVidWlsZCB0aGUgY29kZSB1c2VkIHRvIHJlbmRlciB0aGUgdGFibGUgaW4gIHtnZ3Bsb3QyfS4NCmBgYHtyIGZpZy5oZWlnaHQ9MTUsIGZpZy53aWR0aD01fQ0KDQpwc2l6ZSA9IDEwDQpzc2l6ZSA8LSBwc2l6ZSAtIChwc2l6ZS80KQ0KDQpyb2IudGlkeSA8LSByb2JMaWdodCRkYXRhICMgRXh0cmFjdHMgdGhlIHJlc3RydWN0dXJlZCBkYXRhIGdlbmVyYXRlZCBcZnVuY3Rpb257cm9iX3RyYWZmaWNfbGlnaHR9DQp0cmFmZmljbGlnaHRwbG90IDwtIGdncGxvdDI6OmdncGxvdChyb2IudGlkeSwgZ2dwbG90Mjo6YWVzKHggPSAxLCB5ID0gMSwgY29sb3VyID0ganVkZ2VtZW50KSkgKyANCiAgICAgICAgICAgICAgICAgICAgZ2dwbG90Mjo6ZmFjZXRfZ3JpZChTdHVkeSB+IA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjdG9yKGRvbWFpbiwgbGV2ZWxzID0gYygiRDEiLCAiRDIiLCAiRDMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRDQiLCJENSIsICJPdmVyYWxsIiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiRG9tYWluIDEiLCAiRG9tYWluIDIiLCAiRG9tYWluIDMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkRvbWFpbiA0IiwiRG9tYWluIDUiLCAiRG9tYWluIDYiKSksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoID0gInkiLCBzcGFjZSA9ICJmcmVlIikgKw0KICAgICAgICAgICAgICAgICAgICBnZ3Bsb3QyOjpnZW9tX3BvaW50KHNpemUgPSA2KSArIA0KICAgICAgICAgICAgICAgICAgICBnZ3Bsb3QyOjpnZW9tX3BvaW50KHNpemUgPSA0LCBjb2xvdXIgPSAiYmxhY2siLCBnZ3Bsb3QyOjphZXMoc2hhcGUgPSBqdWRnZW1lbnQpKSArDQogICAgICAgICAgICAgICAgICAgIGdncGxvdDI6Omdlb21fcmVjdChkYXRhID0gcm9iLnRpZHlbd2hpY2gocm9iLnRpZHkkZG9tYWluICE9ICJPdmVyYWxsIiksIF0sIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbCA9ICIjZmZmZmZmIiwgeG1pbiA9IC1JbmYsIHhtYXggPSBJbmYsIHltaW4gPSAtSW5mLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHltYXggPSBJbmYsIHNob3cubGVnZW5kID0gRkFMU0UpICsNCiAgICAgICAgICAgICAgICAgICAgZ2dwbG90Mjo6Z2VvbV9yZWN0KGRhdGEgPSByb2IudGlkeVt3aGljaChyb2IudGlkeSRkb21haW4gPT0gIk92ZXJhbGwiKSwgXSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsID0gIiNmZmZmZmYiLCB4bWluID0gLUluZiwgeG1heCA9IEluZiwgeW1pbiA9IC1JbmYsIHltYXggPSBJbmYsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG93LmxlZ2VuZCA9IEZBTFNFKSArDQogICAgICAgICAgICAgICAgICAgIGdncGxvdDI6Omdlb21fcG9pbnQoc2l6ZSA9IHBzaXplLCBzaG93LmxlZ2VuZCA9IEZBTFNFKSArDQogICAgICAgICAgICAgICAgICAgIGdncGxvdDI6Omdlb21fcG9pbnQoc2hhcGUgPSAxLCBjb2xvdXIgPSAiYmxhY2siLCBzaXplID0gcHNpemUsIHNob3cubGVnZW5kID0gRkFMU0UpICsgIA0KICAgICAgICAgICAgICAgICAgICBnZ3Bsb3QyOjpnZW9tX3BvaW50KHNpemUgPSBzc2l6ZSwgY29sb3VyID0gImJsYWNrIiwgZ2dwbG90Mjo6YWVzKHNoYXBlID0ganVkZ2VtZW50KSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvdy5sZWdlbmQgPSBGQUxTRSkgKyANCiAgICAgICAgICAgICAgICAgICAgZ2dwbG90Mjo6Z2d0aXRsZSgiRmlndXJlICM6IFJpc2sgb2YgYmlhcyIpICsNCiAgICAgICAgICAgICAgICAgICAgZ2dwbG90Mjo6bGFicyhjYXB0aW9uID0gDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgIERvbWFpbnM6DQogICAgRDE6IEJpYXMgZHVlIHRvIHJhbmRvbWlzYXRpb24uDQogICAgRDI6IEJpYXMgZHVlIHRvIGFsbG9jYXRpb24gY29uY2VhbG1lbnQuDQogICAgRDM6IEJpYXMgZHVlIHRvIGJsaW5kaW5nIG9mIHBhcnRpY2lwYW50cyBhbmQgcGVyc29ubmVsLg0KICAgIEQ0OiBCaWFzIGR1ZSB0byBibGluZGluZyBvZiBvdXRjb21lIGFzc2Vzc21lbnQuDQogICAgRDU6IEJpYXMgZHVlIHRvIGluY29tcGxldGUgb3V0Y29tZSBkYXRhLg0KICAgIEQ2OiBCaWFzIGR1ZSB0byBzZWxlY3RpdmUgcmVwb3J0aW5nLg0KIikgKw0KICAgICAgICAgICAgICAgICAgICBnZ3Bsb3QyOjpzY2FsZV94X2Rpc2NyZXRlKHBvc2l0aW9uID0gInRvcCIsIG5hbWUgPSAiUmlzayBvZiBiaWFzIGRvbWFpbnMiKSArDQogICAgICAgICAgICAgICAgICAgIGdncGxvdDI6OnNjYWxlX3lfY29udGludW91cyhsaW1pdHMgPSBjKDEsIDEpLCBsYWJlbHMgPSBOVUxMLCBicmVha3MgPSBOVUxMLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSAiIiwgcG9zaXRpb24gPSAibGVmdCIpICsNCiAgICAgICAgICAgICAgICAgICAgZ2dwbG90Mjo6c2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXMgPSBjKGggPSAiI0JGMDAwMCIsIHMgPSAiI0UyREYwNyIsIGwgPSAiIzAyQzEwMCIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoaCA9ICJIaWdoIiwgcyA9ICJTb21lIGNvbmNlcm5zIiwgbCA9ICJMb3ciKSkgKyANCiAgICAgICAgICAgICAgICAgICAgZ2dwbG90Mjo6c2NhbGVfc2hhcGVfbWFudWFsKHZhbHVlcyA9IGMoaCA9IDEyMCwgcyA9IDQ1LCBsID0gNDMpLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoaCA9ICJIaWdoIiwgcyA9ICJTb21lIGNvbmNlcm5zIixsID0gIkxvdyIpKSArDQogICAgICAgICAgICAgICAgICAgIGdncGxvdDI6OnNjYWxlX3NpemUocmFuZ2UgPSBjKDUsMjApKSArIA0KICAgICAgICAgICAgICAgICAgICBnZ3Bsb3QyOjp0aGVtZV9idygpICsgDQogICAgICAgICAgICAgICAgICAgIGdncGxvdDI6OnRoZW1lKA0KICAgICAgICAgICAgICAgICAgICAgICMgVGl0bGUgb2YgdGhlIHBsb3QNCiAgICAgICAgICAgICAgICAgICAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGZhY2UgPSAiYm9sZCIsIHNpemUgPSAxNCwgaGp1c3QgPSAwKSwNCiAgICAgICAgICAgICAgICAgICAgICAjIFBhbmVscw0KICAgICAgICAgICAgICAgICAgICAgIHBhbmVsLmJvcmRlciA9IGdncGxvdDI6OmVsZW1lbnRfcmVjdChjb2xvdXIgPSAiYmxhY2siKSwNCiAgICAgICAgICAgICAgICAgICAgICBwYW5lbC5zcGFjaW5nID0gZ2dwbG90Mjo6dW5pdCgwLCAibGluZSIpLCANCiAgICAgICAgICAgICAgICAgICAgICAjIExlZ2VuZCAoRXhwbGFpbnMgdGhlIGNhdGVnb3JpZXMgb2YgdGhlIGFzc2Vzc21lbnRzKQ0KICAgICAgICAgICAgICAgICAgICAgIGxlZ2VuZC50aXRsZSA9IGdncGxvdDI6OmVsZW1lbnRfdGV4dChzaXplID0gOSwgZmFjZT0iYm9sZCIpLA0KICAgICAgICAgICAgICAgICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iLCBsZWdlbmQuanVzdGlmaWNhdGlvbiA9ICJyaWdodCIsIA0KICAgICAgICAgICAgICAgICAgICAgIGxlZ2VuZC5kaXJlY3Rpb24gPSAidmVydGljYWwiLCANCiAgICAgICAgICAgICAgICAgICAgICBsZWdlbmQudGV4dCA9IGdncGxvdDI6OmVsZW1lbnRfdGV4dChzaXplID0gOSksDQogICAgICAgICAgICAgICAgICAgICAgbGVnZW5kLm1hcmdpbiA9IGdncGxvdDI6Om1hcmdpbih0ID0gLTAuMiwgciA9IDAsIGIgPSAtMi41LCBsID0gLTEwLCB1bml0ID0gImNtIiksDQogICAgICAgICAgICAgICAgICAgICAgIyBDYXB0aW9ucyAoRXhwbGFpbnMgdGhlIGRvbWFpbnMpDQogICAgICAgICAgICAgICAgICAgICAgcGxvdC5jYXB0aW9uID0gZ2dwbG90Mjo6ZWxlbWVudF90ZXh0KHNpemUgPSAxMCwgaGp1c3QgPSAwLCB2anVzdCA9IDEpLA0KICAgICAgICAgICAgICAgICAgICAgIHBsb3QuY2FwdGlvbi5wb3NpdGlvbiA9ICAicGxvdCIsDQogICAgICAgICAgICAgICAgICAgICAgIyBTdHJpcCAoVGV4dCBhbG9uZyB0aGUgYXhpcykNCiAgICAgICAgICAgICAgICAgICAgICBzdHJpcC50ZXh0LnggPSBnZ3Bsb3QyOjplbGVtZW50X3RleHQoYW5nbGUgPSA5MCwgc2l6ZSA9IDEwKSwNCiAgICAgICAgICAgICAgICAgICAgICBzdHJpcC50ZXh0LnkgPSBnZ3Bsb3QyOjplbGVtZW50X3RleHQoYW5nbGUgPSAxODAsIHNpemUgPSAxMCksIA0KICAgICAgICAgICAgICAgICAgICAgIHN0cmlwLnRleHQueS5sZWZ0ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gMCwgc2l6ZSA9IDEwLCBoanVzdCA9IDEpLA0KICAgICAgICAgICAgICAgICAgICAgIHN0cmlwLmJhY2tncm91bmQgPSBnZ3Bsb3QyOjplbGVtZW50X3JlY3QoZmlsbCA9ICJ3aGl0ZSIpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICApICsgDQogICAgICAgICAgICAgICAgICAgIGdncGxvdDI6Omd1aWRlcyhzaGFwZSA9IGdncGxvdDI6Omd1aWRlX2xlZ2VuZChvdmVycmlkZS5hZXMgPSBsaXN0KGZpbGwgPSBOQSkpKSArDQogICAgICAgICAgICAgICAgICAgIGdncGxvdDI6OmxhYnMoc2hhcGUgPSAiSnVkZ2VtZW50IiwgY29sb3VyID0gIkp1ZGdlbWVudCIpIA0KICAgICAgICAgICAgICAgICAgICANCnRyYWZmaWNsaWdodHBsb3QgDQpgYGANCg0KIyMgNyBQdWJsaWNhdGlvbiBiaWFzDQojIyMgNy4xIEZ1bm5lbC1wbG90DQpGdW5uZWwtcGxvdHMgY2FuIGJlIG1hZGUgd2l0aCB0aGUgZnVuY3Rpb24ge2Z1bm5lbC5tZXRhfSBmcm9tIHRoZSBsaWJyYXJ5IHttZXRhfS4gSW4gdGhpcyBleGFtcGxlIHRoZSBmdW5uZWwtcGxvdHMgYXJlIGJhc2VkIGluIHRoZSBtb2RlbCBmb3Igc3lzdG9saWMgYmxvb2QgcHJlc3N1cmUuIA0KYGBge3J9DQojJyBCYXNpYyBmdW5uZWwtcGxvdA0KZnVubmVsLm1ldGEobS5iZWhhdi5zYnApDQpgYGANCg0KYGBge3J9DQojJyBBZGRlZCBjb250b3VyIGxpbmVzIHdpdGggc2lnbmlmaWNhbmNlIGxldmVscyBhbmQgdGhlIG5hbWVzIG9mIHRoZSBzdHVkaWVzDQpmdW5uZWwubWV0YShtLmJlaGF2LnNicCwgc3R1ZGxhYiA9IFRSVUUsIA0KICAgICAgICAgICAgY29udG91ciA9IGMoMC45LCAwLjk1LCAwLjk5KSwNCiAgICAgICAgICAgIGNvbC5jb250b3VyID0gYygiZ3JheTkwIiwgImdyYXk5NSIsICJncmF5OTkiKSkNCmxlZ2VuZCh4ID0gMTAsIHkgPSAwLjAxLCANCiAgICAgICBsZWdlbmQgPSBjKCJwIDwgMC4xIiwgInAgPCAwLjA1IiwgInAgPCAwLjAxIiksDQogICAgICAgZmlsbCA9IGMoImdyYXk5MCIsICJncmF5OTUiLCAiZ3JheTk5IikpDQpgYGANCg0KIyMjIDcuMiBTdGF0aXN0aWNhbCB0ZXN0IGZvciBwdWJsaWNhdGlvbiBiaWFzDQpFZ2dlcidzIHRlc3QgY2FuIGJlIGNhbGN1bGF0ZWQgdXNpbmcgdGhlIGZ1bmN0aW9uIHttZXRhYmlhc30gZnJvbSB0aGUgbGlicmF5IHttZXRhfQ0KYGBge3J9DQptZXRhYmlhcyhtLmJlaGF2LnNicCwgbWV0aG9kLmJpYXMgPSAibGlucmVnIikNCmVnZ2Vycy50ZXN0KG0uYmVoYXYuc2JwKQ0KYGBgDQoNCioqKg0KQ29udGFjdDogICANCkphY29iIE1lc290IExpbGplaHVsdCwgUk4gTVNjSFMgIA0KRGVwYXJ0bWVudCBvZiBOZXVyb2xvZ3kgIA0KTm9yZHNqw6ZsbGFuZHMgSG9zcGl0YWwgICANCkRlbm1hcmsgIA0KamFjb2IubWVzb3QubGlsamVodWx0QHJlZ2lvbmguZGsNCg==