rm(list=ls())
knitr::opts_chunk$set(echo = TRUE, warning = FALSE, eval = TRUE)
pacman::p_load(tidyverse,ggplot2,openxlsx,dplyr,treebase,gt,revtools,ggpubr,pander) #packages loaded using pacman
# Coder's information:
# Alfredo Sanchez-Tojar (@ASanchez_Tojar)
# Profile: https://goo.gl/PmpPEB
# Department of Evolutionary Biology, Bielefeld University (GER)
# Email: alfredo.tojar@gmail.com
#
# Script first created on the 11th of Sep 2019
# importing the extracted data after fulltext screening
data.ref <- read.table("literature_review/Nakagawa_et_al_2015/Nakagawa_et_al_2015_citing_references_fulltext_screening.csv",header=T,sep=",")
# subsetting those included in the database
data.ref.included <- data.ref[data.ref$fulltext_decision=="yes" | data.ref$fulltext_decision=="yes_but_no_lnCVR",]
data.ref.included <- data.ref.included[!(is.na(data.ref.included$fulltext_decision)),]
# importing results from the search of meta-analyses in ecology and evolution
ma_ee <- read_bibliography("literature_review/Meta-analysis_Ecology_and_Evolution_2015-2019/Meta-analysis_in_Ecology_and_Evolution_2015-2019_WoS_20191107.bib")
1. Meta-analysis of variance in ecology and evolution
We counted how many meta-analyses of variance have been conducted since Nakagawa et al. (2015) to provide an overview of the use of meta-analysis of variance in ecology and evolution. On the 20th of August 2019, we extracted all the references citing Nakagawa et al. (2015) according to Web of Science (n = 42) - search performed from Bielefeld University. Titles and abstracts of all those references were screened using the software Rayyan (Ouzzani et al. 2016), and studies not performing a meta-analysis of variance or from fields other than ecology and evolution were excluded (n = 9 excluded). The full-text of all studies that passed the title-and-abstract screening (n = 33 records) were subsequently evaluated for inclusion in the final database. Our search showed that only 14 meta-analyses of variance have been conducted in ecology and evolution since Nakagawa et al. (2015; Figure S1). To place that number into context, we searched for meta-analyses published in ecology and evolution between 2015 and 2019. On the 7th of November 2019, we searched Web of Science Core Collection for studies that mentioned meta-analysis or meta-regression within the title, and that were published in an exhaustive list of journals in ecology and evolution compiled as part of an ongoing study (O’Dea et al. in preparation)(search string available at Sanchez-Tojar et al. 2019). This search showed that 394 meta-analyses have been published in ecology and evolution since 2015, which means that meta-analyses of variance only correspond to 3.6 % of the meta-analyses published in ecology and evolution since Nakagawa et al. (2015). Importantly, since our search of meta-analyses in ecology and evolution would only find studies mentioning meta-analysis or meta-regression within the title - and not in the abstract and/or keywords, the real percentage of meta-analyses of variance in ecology and evolution is likely much lower.
# counting number of studies per year for the plot
barplot <- data.ref.included %>%
group_by(year) %>%
summarise(count = n())
p<-ggplot(data=barplot, aes(x=year, y=count)) +
geom_bar(stat="identity", fill="steelblue")+
ylab("Number of meta-analyses of variance")+
xlab("Year")+
theme_bw() +
theme(panel.spacing = unit(0.1, "lines"),
text = element_text(size=16),
panel.border= element_blank(),
axis.line=element_line(),
axis.ticks.y = element_blank(),
panel.grid.major.x = element_blank(),
panel.grid.major.y = element_blank(),
panel.grid.minor.y = element_blank(),
panel.grid.minor.x = element_blank(),
legend.text = element_text(size=16),
legend.title=element_text(size=16, face = "bold"),
axis.title.x = element_text(hjust = 0.5, size = 13, face = "bold"),
axis.title.y = element_text(size = 13, hjust = 0.5, margin = margin(r=8),face = "bold"),
axis.text.y = element_text(angle = 0,color="black",hjust=0),
axis.text.x = element_text(color="black"),
plot.title = element_text(size = 16))
p

Figure S1. Number of meta-analyses of variance conducted each year in ecology and evolution since Nakagawa et al. (2015).
# estimating the rate of typos purely affecting means, sds, and ns
db.typos <- read.xlsx("data_re-extraction/re-extracted/001_EyckDev.stress_Data_FULL_TABLE_all_raw_data_re-extracted_VISUAL_manual_comp_typos.xlsx",colNames=T,sheet = 1)
# database with the corrected data
stress.data <- read.xlsx("data_re-extraction/clean_data/EyckDev_stress_clean_effect_sizes_sp_corrected.xlsx",colNames=T,sheet = 1)
missing.sign <- stress.data[is.na(stress.data$sign.inversion.ours),]
2. Data information
We used the data from Eyck et al. (2019) as a case example. While most data were made available with the original publication, the authors kindly shared a version of the dataset with us containing the raw data (means, SDs, and sample sizes) for the final subset analyzed in their study, which we used for our analyses. Before using the dataset, we made the following modifications to it: (1) We excluded effect sizes based only on inferential statistics (k = 145 effect sizes excluded) because the calculation of our effect size statistics requires raw means, SDs, and sample sizes. (2) Two observers (AST and NPM) performed a data quality check for the shared dataset, which consisted of reading the original publications and confirming the extracted means, SDs and sample sizes. Overall, we found that 23% of the control-treatment comparisons in the shared dataset required some correction(s). (3) Due to some inconsistencies in how traits were categorized in the shared dataset, we decided to reclassify those traits following Acasuso-Rivero et al. (2019), who used six levels (behaviour, development, metabolism and physiology, morphology, reproduction, and survival) instead of the five levels (behaviour, physiology, morphology, reproduction, and performance) used in Eyck et al. (2019). This reclassification was performed by a single observer (AST). Based on the list of traits available, we found our classification easier. Importantly, our decision to reclassify the traits was taken before any meta-regression was conducted (i.e. we were blind to the results). (4) We also recoded the direction of some of the effect sizes. As in Eyck et al. (2019), effect sizes were coded such that negative values indicate that developmental stress negatively affects fitness. This process was performed by one observer (AST), and consisted of going through the list of available traits identifying those for which a clear decision on the direction could be made, and those for which more information was needed. For the latter group, the observer revisited the definition and predictions available in the original publications before making a decision. Of these, 27 effect sizes from 7 studies could not be assigned a direction based on the information provided in the original publications or other available information, therefore they were excluded when calculating mean (but not variance) effect sizes. Those 27 effect sizes included organ to body/other organ ratios (e.g. hippocampus weight to brain weight ratio), thermal preference tests, and counts of specific cell types in the brain (e.g. total granule cell number in the brain; more details in the R script 003_data_preparation.R and the data available Sanchez-Tojar et al. 2019). Overall, we inverted the direction of 20% of all effect sizes in our dataset compared to the 5.6% observed in the shared dataset. (5) We excluded measurements not bounded at zero because lnRR and lnCVR assume ratio scale data (Houle et al., 2011) (k = 7). (6) We excluded group-level proportional data from the meta-analysis of variance as they do not have associated SD (e.g. 25% vs. 40% survival between control and treatment group; Nakagawa et al., 2015) (k = 3). (7) We excluded two effect sizes that were identified as outliers by the function ‘escalc()’ from the R package ‘metafor’ v.2.1-0 (Viechtbauer, 2010) due to their large mean to SD ratio.
load("data_re-extraction/clean_data/tree_random.Rdata")
plot(tree_random, cex=.5, label.offset =.1, no.margin = TRUE)

Figure S2. Phylogeny used to model the phylogenetic relationships among the animal species studied. This phylogeny was retrieved from the Open Tree of Life (Hinchliff et al. 2015; see section 'Random effects' in main text).
# function that calculates biased (used in the original meta-analysis)
# and unbiased cohen's d, and their sampling variances
cohensD <- function(mean_control,mean_treatment,sd_control,sd_treatment,n_control,n_treatment,append=T,data){
sd_pooled <- sqrt(((data[,n_treatment]-1)*data[,sd_treatment]^2+(data[,n_control]-1)*data[,sd_control]^2)/(data[,n_control]+data[,n_treatment]-2))
correction <- sqrt((data[,n_treatment]+data[,n_control]-2)/(data[,n_treatment]+data[,n_control]))
cohens.biased <- (data[,mean_treatment]-data[,mean_control])/(sd_pooled*correction)
cohens.biased.sv <- (((data[,n_control]+data[,n_treatment])/(data[,n_control]*data[,n_treatment]))+((cohens.biased^2)/(2*(data[,n_control]+data[,n_treatment]))))
cohens.unbiased <- (data[,mean_treatment]-data[,mean_control])/sd_pooled
cohens.unbiased.sv <- (((data[,n_control]+data[,n_treatment])/(data[,n_control]*data[,n_treatment]))+((cohens.unbiased^2)/(2*(data[,n_control]+data[,n_treatment]))))
if(append){
return(cbind(data,cohens.biased,cohens.biased.sv,cohens.unbiased,cohens.unbiased.sv))
} else{
return(as.data.frame(cbind(data,cohens.biased,cohens.biased.sv,cohens.unbiased,cohens.unbiased.sv)))
}
}
3. Standardized Mean Difference
Eyck et al. (2019) used a version of Cohen's d as the effect size statistic (equation available in the code above). For comparison, we present here the mean level results based on a standard mean difference that accounts for heteroscedasticity (SMDH; Bonett 2008, 2009). We used (and recommend using) the SMDH rather than other commonly used variants of standardized mean difference effect size statistics, such as Cohen's d (Cohen 1988) or Hedges' g (Hedges 1981), because we expected and found unequal variances between experimental and control treatments (i.e. we found heteroscedasticity).
Our results based on SMDH confirmed a moderate (following the benchmarks outlined by Cohen 1988) and negative effect of developmental stress on mean trait values (Table S1). However, in contrast to the original study, the uncertainty around the mean effect was rather large (Table S1). This large uncertainty was likely because we additionally accounted for shared control and phylogenetic non-independence (see section 'Methods'), but it might have also been due to the differences between the datasets used (see section 'Data information'). As in the case of lnRR (see main text), heterogeneity was large, and the results of the Egger's regression test showed that publication bias might be present in this dataset (Table S1).
Table S1. Results of the multilevel meta-analysis using a heteroscedasticity-corrected standardized mean difference to test the effect of developmental stress on mean trait values. The results of the Egger's regression test are also shown (see section 'Publication bias' in the main text).
table1.SMDH <- read.table("tables/tableS1_supplements_data.csv",header=T,sep=",")
tableS1.gt <- table1.SMDH %>%
gt() %>%
cols_label(Effect.size=md("**Effect size**"),
K=md("**k**"),
Metaanalytic.mean=md("**Meta-analytic mean**"),
Observational=md("***I*<sup>2</sup><sub>Obser.</sub> (%)**"),
Study=md("***I*<sup>2</sup><sub>Study</sub> (%)**"),
Species=md("***I*<sup>2</sup><sub>Species</sub> (%)**"),
Phylogeny=md("***I*<sup>2</sup><sub>Phylo</sub> (%)**"),
Total=md("***I*<sup>2</sup><sub> Total</sub> (%)**"),
Qtest=md("***Q*<sub>test</sub>**"),
Eggers=md("**Egger's test**")) %>%
cols_align(align = "right") %>%
tab_source_note(source_note = md("k = number of estimates; *I*<sup>2</sup> = heterogeneity; *Q*<sub>test</sub> = Cochrane's *Q* test; NA = not applicable; Obser. = Observational or residual variance; Phylo = Phylogeny. Egger's test = intercept of an Egger's regression (Nakagawa and Santos 2012). Estimates shown correspond to modes and 95% Highest Posterior Density Intervals. N = 90 studies.")) %>%
tab_options(table.width=775)
tableS1.gt
| Effect size |
k |
Meta-analytic mean |
I2Obser. (%) |
I2Study (%) |
I2Species (%) |
I2Phylo (%) |
I2 Total (%) |
Qtest |
Egger's test |
| SMDH |
684 |
-0.49 [-1.13,0.10] |
42.1 [32.4,51.9] |
5.2 [0.0,17.4] |
22.5 [8.8,34.0] |
22.2 [5.6,45.6] |
95.2 [94.0,96.3] |
4766 |
-0.29 [-0.41,-0.18] |
| k = number of estimates; I2 = heterogeneity; Qtest = Cochrane's Q test; NA = not applicable; Obser. = Observational or residual variance; Phylo = Phylogeny. Egger's test = intercept of an Egger's regression (Nakagawa and Santos 2012). Estimates shown correspond to modes and 95% Highest Posterior Density Intervals. N = 90 studies. |
4. Mean-Variance relationship
# first, adding the corrected trait classes
trait.database <- read.xlsx("data_re-extraction/clean_data/EyckDev_stress_clean_effect_sizes_sp_corrected_trait_modification.xlsx",colNames=T,sheet = 1)
# reducing database to only the unique identifier and the trait classs
trait.database.red <- trait.database[,c("esID","trait.class.2")]
# and adding those corrected trait classes to the database
stress.data.2 <- merge(stress.data,trait.database.red,by="esID",all.x=T)
# then, reducing dataset to ratio scale data only
stress.data.ratio.scale <- stress.data.2[!(is.na(stress.data.2$lnRR.ours)),]
# theme for the plots
tm <- theme(panel.background = element_blank(),
axis.line = element_line(size = 0.75),
axis.text = element_text(size = 10, colour = "black"),
axis.title = element_text(size = 12),
plot.title = element_text(size = 16, hjust = 0.5))
# are ln(mean) and ln(sd) correlated in each group? are ln(mean) and ln(sd) correlated in for each trait in each group?
# control
#cor.control <- round(cor(log(stress.data.ratio.scale$mean.control),log(stress.data.ratio.scale$SD.control)),2)
cor.control <- cor.test(log(stress.data.ratio.scale$mean.control),log(stress.data.ratio.scale$SD.control))
# estimating each cor per trait
cor.control.trait.name <- c()
cor.control.trait.cor <- c()
cor.control.trait.cor.lower <- c()
cor.control.trait.cor.upper <- c()
cor.control.trait.n <- c()
for(i in levels(factor(stress.data.ratio.scale$trait.class.2))){
x <- stress.data.ratio.scale[stress.data.ratio.scale$trait.class.2==i,]
cor.control.trait.name <- c(cor.control.trait.name,i)
cor.trait <- round(cor(log(x$mean.control),log(x$SD.control)),3)
cor.control.trait.cor <- c(cor.control.trait.cor,cor.trait)
lower.trait <- cor.test(log(x$mean.control),log(x$SD.control))$conf.int[1]
cor.control.trait.cor.lower <- c(cor.control.trait.cor.lower,round(lower.trait,3))
upper.trait <- cor.test(log(x$mean.control),log(x$SD.control))$conf.int[2]
cor.control.trait.cor.upper <- c(cor.control.trait.cor.upper,round(upper.trait,3))
cor.control.trait.n <- c(cor.control.trait.n,nrow(x))
}
correlations.control <- as.data.frame(cbind(cor.control.trait.name,cor.control.trait.cor,cor.control.trait.cor.lower,cor.control.trait.cor.upper,cor.control.trait.n))
# treatment
cor.treatment <- cor.test(log(stress.data.ratio.scale$mean.treat),log(stress.data.ratio.scale$SD.treat))
# estimating each cor per trait
cor.treatment.trait.name <- c()
cor.treatment.trait.cor <- c()
cor.treatment.trait.cor.lower <- c()
cor.treatment.trait.cor.upper <- c()
cor.treatment.trait.n <- c()
for(i in levels(factor(stress.data.ratio.scale$trait.class.2))){
x <- stress.data.ratio.scale[stress.data.ratio.scale$trait.class.2==i,]
cor.treatment.trait.name <- c(cor.treatment.trait.name,i)
cor.trait <- round(cor(log(x$mean.treat),log(x$SD.treat)),3)
cor.treatment.trait.cor <- c(cor.treatment.trait.cor,cor.trait)
lower.trait <- cor.test(log(x$mean.treat),log(x$SD.treat))$conf.int[1]
cor.treatment.trait.cor.lower <- c(cor.treatment.trait.cor.lower,round(lower.trait,3))
upper.trait <- cor.test(log(x$mean.treat),log(x$SD.treat))$conf.int[2]
cor.treatment.trait.cor.upper <- c(cor.treatment.trait.cor.upper,round(upper.trait,3))
cor.treatment.trait.n <- c(cor.treatment.trait.n,nrow(x))
}
correlations.treatments <- as.data.frame(cbind(cor.treatment.trait.name,cor.treatment.trait.cor,cor.treatment.trait.cor.lower,cor.treatment.trait.cor.upper,cor.treatment.trait.n))
# we are plotting each group (i.e. control and treatment), separately
# first, renaming trait levels
stress.data.ratio.scale <- stress.data.ratio.scale %>% mutate(trait.class.2=recode(trait.class.2,behavioural="Behaviour",
development="Development",
metabolism_and_physiology="Metabolism\nand Physiology",
morphological="Morphology",
reproduction="Reproduction",
survival="Survival"))
control.plot <- ggplot(stress.data.ratio.scale, aes(x = log(mean.control), y = log(SD.control), colour = trait.class.2)) +
geom_point(alpha = 0.25) + tm + labs(x = "ln(mean)", y = "ln(SD)") +
geom_smooth(method=lm, se=FALSE) +
scale_color_manual(name = "Trait class",values = c("Behaviour" = "#999999", "Development" = "#E6D300", "Metabolism\nand Physiology" = "#56B4E9",
"Morphology" = "#009E73", "Reproduction" = "#D55E00", "Survival" = "#CC79A7")) +
#annotate(geom="text", x=-2.5, y=10.5, label=paste0("Overall r = ",cor.control),size=4)+
annotate(geom="text", x=8, y=10.5, label="A: Control",size=4)+
theme(legend.position = c(0.85, 0.25),
legend.title = element_text(size = 9),
legend.text = element_text(size = 8),
legend.key = element_rect(fill = alpha("white", 0.0)))
treatment.plot <- ggplot(stress.data.ratio.scale, aes(x = log(mean.treat), y = log(SD.treat), colour = trait.class.2)) +
geom_point(alpha = 0.25) + tm + labs(x = "ln(mean)", y = "ln(SD)") +
geom_smooth(method=lm, se=FALSE) +
scale_color_manual(name = "Trait class",values = c("Behaviour" = "#999999", "Development" = "#E6D300", "Metabolism\nand Physiology" = "#56B4E9",
"Morphology" = "#009E73", "Reproduction" = "#D55E00", "Survival" = "#CC79A7")) +
#annotate(geom="text", x=-2.5, y=10.5, label=paste0("Overall r = ",cor.treatment),size=4)+
annotate(geom="text", x=8, y=10.5, label="B: Treatment",size=4)+
theme(legend.position = c(0.85, 0.25),
legend.title = element_text(size = 9),
legend.text = element_text(size = 8),
legend.key = element_rect(fill = alpha("white", 0.0)))
# multipannel plot
ggarrange(control.plot, treatment.plot,
heights = c(1.5,1.5),
widths = c(4,4),
ncol = 2, nrow = 1)

Figure S3. Evidence for a mean-variance relationship in the dataset. Data shown for each trait class in control (A) and treatment groups (B). Lines correspond to linear regressions between log sample means ‘ln(mean)’ and log sample standard deviations ‘ln(SD)’. Data used correspond to ratio scale data only.
R Session Information
R session information detailing the versions and packages used in this script for reproducibility purposes.
sessionInfo() %>% pander()
R version 3.5.1 (2018-07-02)
Platform: x86_64-w64-mingw32/x64 (64-bit)
locale: C
attached base packages: stats, graphics, grDevices, utils, datasets, methods and base
other attached packages: pander(v.0.6.3), ggpubr(v.0.2.3.999), magrittr(v.1.5), revtools(v.0.3.0), gt(v.0.1.0), treebase(v.0.1.4), ape(v.5.2), openxlsx(v.4.1.0), forcats(v.0.3.0), stringr(v.1.4.0), dplyr(v.0.8.5), purrr(v.0.3.2), readr(v.1.3.1), tidyr(v.0.8.3), tibble(v.2.1.1), ggplot2(v.3.1.0) and tidyverse(v.1.2.1)
loaded via a namespace (and not attached): httr(v.1.4.0), sass(v.0.1.1), jsonlite(v.1.6), viridisLite(v.0.3.0), modelr(v.0.1.2), shiny(v.1.2.0), assertthat(v.0.2.1), stats4(v.3.5.1), cellranger(v.1.1.0), slam(v.0.1-43), yaml(v.2.2.0), pillar(v.1.3.1), backports(v.1.1.2), lattice(v.0.20-35), glue(v.1.3.1), digest(v.0.6.18), ggsignif(v.0.5.0), promises(v.1.0.1), checkmate(v.1.9.3), rvest(v.0.3.2), colorspace(v.1.3-2), cowplot(v.0.9.4), htmltools(v.0.3.6), httpuv(v.1.4.5.1), plyr(v.1.8.4), tm(v.0.7-5), XML(v.3.98-1.16), pkgconfig(v.2.0.2), broom(v.0.5.0), haven(v.2.0.0), xtable(v.1.8-3), scales(v.1.0.0), later(v.0.7.5), pacman(v.0.5.0), withr(v.2.1.2), lazyeval(v.0.2.1), NLP(v.0.2-0), cli(v.1.1.0), crayon(v.1.3.4), readxl(v.1.2.0), mime(v.0.6), evaluate(v.0.12), nlme(v.3.1-137), MASS(v.7.3-50), xml2(v.1.2.0), shinydashboard(v.0.7.1), tools(v.3.5.1), data.table(v.1.11.8), hms(v.0.4.2), plotly(v.4.8.0), munsell(v.0.5.0), zip(v.2.0.1), ade4(v.1.7-13), compiler(v.3.5.1), rlang(v.0.4.0), grid(v.3.5.1), RCurl(v.1.95-4.11), rstudioapi(v.0.8), htmlwidgets(v.1.3), labeling(v.0.3), bitops(v.1.0-6), base64enc(v.0.1-3), rmarkdown(v.1.11), topicmodels(v.0.2-7), gtable(v.0.2.0), R6(v.2.4.0), lubridate(v.1.7.4), knitr(v.1.21), commonmark(v.1.7), modeltools(v.0.2-22), stringi(v.1.4.3), parallel(v.3.5.1), Rcpp(v.1.0.1), tidyselect(v.0.2.5) and xfun(v.0.5)
References
Acasuso-Rivero, C., Murren, C.J., Schlichting, C.D., Steiner, U.K., 2019. Adaptive phenotypic plasticity for life-history and less fitness-related traits. Proc. R. Soc. B Biol. Sci. 286, 20190653. https://doi.org/10.1098/rspb.2019.0653
Bonett, D.G., 2009. Meta-analytic interval estimation for standardized and unstandardized mean differences. Psychol. Methods 14, 225-238. https://doi.org/10.1037/a0016619
Bonett, D.G., 2008. Confidence intervals for standardized linear contrasts of means. Psychol. Methods 13, 99-109. https://doi.org/10.1037/1082-989X.13.2.99
Cohen, J., 1988. Statistical power analysis for the behavioral sciences, 2nd ed. ed. L. Erlbaum Associates, Hillsdale, N.J.
Eyck, H.J.F., Buchanan, K.L., Crino, O.L., Jessop, T.S., 2019. Effects of developmental stress on animal phenotype and performance: a quantitative review. Biol. Rev. 94, 1143-1160. https://doi.org/10.1111/brv.12496
Hedges, L.V., 1981. Distribution Theory for Glass's Estimator of Effect size and Related Estimators. J. Educ. Stat. 6, 107-128. https://doi.org/10.3102/10769986006002107
Hinchliff, C.E., Smith, S.A., Allman, J.F., Burleigh, J.G., Chaudhary, R., Coghill, L.M., Crandall, K.A., Deng, J., Drew, B.T., Gazis, R., Gude, K., Hibbett, D.S., Katz, L.A., Laughinghouse, H.D., McTavish, E.J., Midford, P.E., Owen, C.L., Ree, R.H., Rees, J.A., Soltis, D.E., Williams, T., Cranston, K.A., 2015. Synthesis of phylogeny and taxonomy into a comprehensive tree of life. Proc. Natl. Acad. Sci. 112, 12764-12769. https://doi.org/10.1073/pnas.1423041112
Houle, D., Pelabon, C., Wagner, G.P., Hansen, T.F., 2011. Measurement and Meaning in Biology. The Quarterly Review of Biology 86, 3–34. https://doi.org/10.1086/658408
Nakagawa, S., Poulin, R., Mengersen, K., Reinhold, K., Engqvist, L., Lagisz, M., Senior, A.M., 2015. Meta-analysis of variation: ecological and evolutionary applications and beyond. Methods Ecol. Evol. 6, 143-152. https://doi.org/10.1111/2041-210X.12309
Nakagawa, S., Santos, E.S.A., 2012. Methodological issues and advances in biological meta-analysis. Evol. Ecol. 26, 1253-1274. https://doi.org/10.1007/s10682-012-9555-5
Ouzzani, M., Hammady, H., Fedorowicz, Z., Elmagarmid, A., 2016. Rayyan - a web and mobile app for systematic reviews. Systematic Reviews 5, 210. https://doi.org/10.1186/s13643-016-0384-4
Sanchez-Tojar, A., Moran, N.P., O'Dea, R.E., Reinhold, K., Nakagawa, S., 2019. Materials for 'Illustrating the importance of meta-analysing variances alongside means in ecology and evolution.' Open Sci. Framew. https://doi.org/10.17605/OSF.IO/YJUA8
Viechtbauer, W., 2010. Conducting Meta-Analyses in R with the metafor Package. J. Stat. Softw. 36, 1–48. https://doi.org/10.18637/jss.v036.i03
LS0tDQp0aXRsZTogSWxsdXN0cmF0aW5nIHRoZSBpbXBvcnRhbmNlIG9mIG1ldGEtYW5hbHlzaW5nIHZhcmlhbmNlcyBhbG9uZ3NpZGUgbWVhbnMgaW4NCiAgZWNvbG9neSBhbmQgZXZvbHV0aW9uDQphdXRob3I6IEFsZnJlZG8gU2FuY2hlei1Ub2phciwgTmljaG9sYXMgUC4gTW9yYW4sIFJvc2UgRS4gTydEZWEsIEtsYXVzIFJlaW5ob2xkLCBTaGluaWNoaQ0KICBOYWthZ2F3YQ0KZGF0ZTogJ0xhc3QgdXBkYXRlZDogYHIgZm9ybWF0KFN5cy50aW1lKCksICIlZCAlQiwgJVkiKWAnDQpvdXRwdXQ6DQogIGh0bWxfZG9jdW1lbnQ6DQogICAgY29kZV9kb3dubG9hZDogeWVzDQogICAgY29kZV9mb2xkaW5nOiBoaWRlDQogICAgdGhlbWU6IHVuaXRlZA0KICAgIHRvYzogeWVzDQogICAgdG9jX2Zsb2F0OiB5ZXMNCiAgcGRmX2RvY3VtZW50Og0KICAgIHRvYzogeWVzDQogIHdvcmRfZG9jdW1lbnQ6DQogICAgdG9jOiB5ZXMNCnN1YnRpdGxlOiBFbGVjdHJvbmljIFN1cHBsZW1lbnRhcnkgSW5mb3JtYXRpb24NCi0tLQ0KDQpgYGB7cixlY2hvPUZBTFNFLCBjYWNoZT1GQUxTRX0NCiMjIG51bWJlcnMgPj0gMTBeNSB3aWxsIGJlIGRlbm90ZWQgaW4gc2NpZW50aWZpYyBub3RhdGlvbiwgYW5kIHJvdW5kZWQgdG8gMiBkaWdpdHMNCm9wdGlvbnMoZGlnaXRzID0gMikNCmBgYA0KDQpgYGB7ciBzZXR1cCwgcmVzdWx0cz0iaGlkZSJ9DQpybShsaXN0PWxzKCkpDQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUsIHdhcm5pbmcgPSBGQUxTRSwgZXZhbCA9IFRSVUUpDQpwYWNtYW46OnBfbG9hZCh0aWR5dmVyc2UsZ2dwbG90MixvcGVueGxzeCxkcGx5cix0cmVlYmFzZSxndCxyZXZ0b29scyxnZ3B1YnIscGFuZGVyKSAjcGFja2FnZXMgbG9hZGVkIHVzaW5nIHBhY21hbg0KDQojIENvZGVyJ3MgaW5mb3JtYXRpb246IA0KIyAgICBBbGZyZWRvIFNhbmNoZXotVG9qYXIgKEBBU2FuY2hlel9Ub2phcikNCiMgICAgUHJvZmlsZTogaHR0cHM6Ly9nb28uZ2wvUG1wUEVCDQojICAgIERlcGFydG1lbnQgb2YgRXZvbHV0aW9uYXJ5IEJpb2xvZ3ksIEJpZWxlZmVsZCBVbml2ZXJzaXR5IChHRVIpIA0KIyAgICBFbWFpbDogYWxmcmVkby50b2phckBnbWFpbC5jb20NCiMNCiMgU2NyaXB0IGZpcnN0IGNyZWF0ZWQgb24gdGhlIDExdGggb2YgU2VwIDIwMTkNCmBgYA0KDQpgYGB7ciwgcmVzdWx0cz0iaGlkZSJ9DQojIGltcG9ydGluZyB0aGUgZXh0cmFjdGVkIGRhdGEgYWZ0ZXIgZnVsbHRleHQgc2NyZWVuaW5nDQpkYXRhLnJlZiA8LSByZWFkLnRhYmxlKCJsaXRlcmF0dXJlX3Jldmlldy9OYWthZ2F3YV9ldF9hbF8yMDE1L05ha2FnYXdhX2V0X2FsXzIwMTVfY2l0aW5nX3JlZmVyZW5jZXNfZnVsbHRleHRfc2NyZWVuaW5nLmNzdiIsaGVhZGVyPVQsc2VwPSIsIikNCg0KIyBzdWJzZXR0aW5nIHRob3NlIGluY2x1ZGVkIGluIHRoZSBkYXRhYmFzZQ0KZGF0YS5yZWYuaW5jbHVkZWQgPC0gZGF0YS5yZWZbZGF0YS5yZWYkZnVsbHRleHRfZGVjaXNpb249PSJ5ZXMiIHwgZGF0YS5yZWYkZnVsbHRleHRfZGVjaXNpb249PSJ5ZXNfYnV0X25vX2xuQ1ZSIixdDQpkYXRhLnJlZi5pbmNsdWRlZCA8LSBkYXRhLnJlZi5pbmNsdWRlZFshKGlzLm5hKGRhdGEucmVmLmluY2x1ZGVkJGZ1bGx0ZXh0X2RlY2lzaW9uKSksXQ0KDQojIGltcG9ydGluZyByZXN1bHRzIGZyb20gdGhlIHNlYXJjaCBvZiBtZXRhLWFuYWx5c2VzIGluIGVjb2xvZ3kgYW5kIGV2b2x1dGlvbg0KbWFfZWUgPC0gcmVhZF9iaWJsaW9ncmFwaHkoImxpdGVyYXR1cmVfcmV2aWV3L01ldGEtYW5hbHlzaXNfRWNvbG9neV9hbmRfRXZvbHV0aW9uXzIwMTUtMjAxOS9NZXRhLWFuYWx5c2lzX2luX0Vjb2xvZ3lfYW5kX0V2b2x1dGlvbl8yMDE1LTIwMTlfV29TXzIwMTkxMTA3LmJpYiIpDQpgYGANCiMjIDEuIE1ldGEtYW5hbHlzaXMgb2YgdmFyaWFuY2UgaW4gZWNvbG9neSBhbmQgZXZvbHV0aW9uDQpXZSBjb3VudGVkIGhvdyBtYW55IG1ldGEtYW5hbHlzZXMgb2YgdmFyaWFuY2UgaGF2ZSBiZWVuIGNvbmR1Y3RlZCBzaW5jZSBbTmFrYWdhd2EgZXQgYWwuICgyMDE1KV0oaHR0cHM6Ly9kb2kub3JnLzEwLjExMTEvMjA0MS0yMTBYLjEyMzA5KSB0byBwcm92aWRlIGFuIG92ZXJ2aWV3IG9mIHRoZSB1c2Ugb2YgbWV0YS1hbmFseXNpcyBvZiB2YXJpYW5jZSBpbiBlY29sb2d5IGFuZCBldm9sdXRpb24uIE9uIHRoZSAyMHRoIG9mIEF1Z3VzdCAyMDE5LCB3ZSBleHRyYWN0ZWQgYWxsIHRoZSByZWZlcmVuY2VzIGNpdGluZyBbTmFrYWdhd2EgZXQgYWwuICgyMDE1KV0oaHR0cHM6Ly9kb2kub3JnLzEwLjExMTEvMjA0MS0yMTBYLjEyMzA5KSBhY2NvcmRpbmcgdG8gV2ViIG9mIFNjaWVuY2UgKG4gPSBgciBucm93KGRhdGEucmVmKWApIC0gc2VhcmNoIHBlcmZvcm1lZCBmcm9tIEJpZWxlZmVsZCBVbml2ZXJzaXR5LiBUaXRsZXMgYW5kIGFic3RyYWN0cyBvZiBhbGwgdGhvc2UgcmVmZXJlbmNlcyB3ZXJlIHNjcmVlbmVkIHVzaW5nIHRoZSBzb2Z0d2FyZSBSYXl5YW4gKFtPdXp6YW5pIGV0IGFsLiAyMDE2XShodHRwczovL2RvaS5vcmcvMTAuMTE4Ni9zMTM2NDMtMDE2LTAzODQtNCkpLCBhbmQgc3R1ZGllcyBub3QgcGVyZm9ybWluZyBhIG1ldGEtYW5hbHlzaXMgb2YgdmFyaWFuY2Ugb3IgZnJvbSBmaWVsZHMgb3RoZXIgdGhhbiBlY29sb2d5IGFuZCBldm9sdXRpb24gd2VyZSBleGNsdWRlZCAobiA9IGByIHRhYmxlKGRhdGEucmVmJHQuYW5kLmFfZGVjaXNpb24pWzFdYCBleGNsdWRlZCkuIFRoZSBmdWxsLXRleHQgb2YgYWxsIHN0dWRpZXMgdGhhdCBwYXNzZWQgdGhlIHRpdGxlLWFuZC1hYnN0cmFjdCBzY3JlZW5pbmcgKG4gPSBgciB0YWJsZShkYXRhLnJlZiR0LmFuZC5hX2RlY2lzaW9uKVsyXWAgcmVjb3Jkcykgd2VyZSBzdWJzZXF1ZW50bHkgZXZhbHVhdGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIGZpbmFsIGRhdGFiYXNlLiBPdXIgc2VhcmNoIHNob3dlZCB0aGF0IG9ubHkgYHIgbnJvdyhkYXRhLnJlZi5pbmNsdWRlZClgIG1ldGEtYW5hbHlzZXMgb2YgdmFyaWFuY2UgaGF2ZSBiZWVuIGNvbmR1Y3RlZCBpbiBlY29sb2d5IGFuZCBldm9sdXRpb24gc2luY2UgW05ha2FnYXdhIGV0IGFsLiAoMjAxNV0oaHR0cHM6Ly9kb2kub3JnLzEwLjExMTEvMjA0MS0yMTBYLjEyMzA5KTsgRmlndXJlIFMxKS4gVG8gcGxhY2UgdGhhdCBudW1iZXIgaW50byBjb250ZXh0LCB3ZSBzZWFyY2hlZCBmb3IgbWV0YS1hbmFseXNlcyBwdWJsaXNoZWQgaW4gZWNvbG9neSBhbmQgZXZvbHV0aW9uIGJldHdlZW4gMjAxNSBhbmQgMjAxOS4gT24gdGhlIDd0aCBvZiBOb3ZlbWJlciAyMDE5LCB3ZSBzZWFyY2hlZCBXZWIgb2YgU2NpZW5jZSBDb3JlIENvbGxlY3Rpb24gZm9yIHN0dWRpZXMgdGhhdCBtZW50aW9uZWQgbWV0YS1hbmFseXNpcyBvciBtZXRhLXJlZ3Jlc3Npb24gd2l0aGluIHRoZSB0aXRsZSwgYW5kIHRoYXQgd2VyZSBwdWJsaXNoZWQgaW4gYW4gZXhoYXVzdGl2ZSBsaXN0IG9mIGpvdXJuYWxzIGluIGVjb2xvZ3kgYW5kIGV2b2x1dGlvbiBjb21waWxlZCBhcyBwYXJ0IG9mIGFuIG9uZ29pbmcgc3R1ZHkgKE8nRGVhIGV0IGFsLiAqaW4gcHJlcGFyYXRpb24qKShzZWFyY2ggc3RyaW5nIGF2YWlsYWJsZSBhdCBbU2FuY2hlei1Ub2phciBldCBhbC4gMjAxOV0oaHR0cHM6Ly9kb2kub3JnLzEwLjE3NjA1L09TRi5JTy9ZSlVBOCkpLiBUaGlzIHNlYXJjaCBzaG93ZWQgdGhhdCBgciBucm93KG1hX2VlKWAgbWV0YS1hbmFseXNlcyBoYXZlIGJlZW4gcHVibGlzaGVkIGluIGVjb2xvZ3kgYW5kIGV2b2x1dGlvbiBzaW5jZSAyMDE1LCB3aGljaCBtZWFucyB0aGF0IG1ldGEtYW5hbHlzZXMgb2YgdmFyaWFuY2Ugb25seSBjb3JyZXNwb25kIHRvIGByIHJvdW5kKChucm93KGRhdGEucmVmLmluY2x1ZGVkKS9ucm93KG1hX2VlKSkqMTAwLDEpYCAlIG9mIHRoZSBtZXRhLWFuYWx5c2VzIHB1Ymxpc2hlZCBpbiBlY29sb2d5IGFuZCBldm9sdXRpb24gc2luY2UgW05ha2FnYXdhIGV0IGFsLiAoMjAxNSldKGh0dHBzOi8vZG9pLm9yZy8xMC4xMTExLzIwNDEtMjEwWC4xMjMwOSkuIEltcG9ydGFudGx5LCBzaW5jZSBvdXIgc2VhcmNoIG9mIG1ldGEtYW5hbHlzZXMgaW4gZWNvbG9neSBhbmQgZXZvbHV0aW9uIHdvdWxkIG9ubHkgZmluZCBzdHVkaWVzIG1lbnRpb25pbmcgbWV0YS1hbmFseXNpcyBvciBtZXRhLXJlZ3Jlc3Npb24gd2l0aGluIHRoZSB0aXRsZSAtIGFuZCBub3QgaW4gdGhlIGFic3RyYWN0IGFuZC9vciBrZXl3b3JkcywgdGhlIHJlYWwgcGVyY2VudGFnZSBvZiBtZXRhLWFuYWx5c2VzIG9mIHZhcmlhbmNlIGluIGVjb2xvZ3kgYW5kIGV2b2x1dGlvbiBpcyBsaWtlbHkgbXVjaCBsb3dlci4NCg0KYGBge3J9DQojIGNvdW50aW5nIG51bWJlciBvZiBzdHVkaWVzIHBlciB5ZWFyIGZvciB0aGUgcGxvdA0KYmFycGxvdCA8LSBkYXRhLnJlZi5pbmNsdWRlZCAlPiUgDQogIGdyb3VwX2J5KHllYXIpICU+JSANCiAgc3VtbWFyaXNlKGNvdW50ID0gbigpKQ0KDQpwPC1nZ3Bsb3QoZGF0YT1iYXJwbG90LCBhZXMoeD15ZWFyLCB5PWNvdW50KSkgKw0KICBnZW9tX2JhcihzdGF0PSJpZGVudGl0eSIsIGZpbGw9InN0ZWVsYmx1ZSIpKw0KICB5bGFiKCJOdW1iZXIgb2YgbWV0YS1hbmFseXNlcyBvZiB2YXJpYW5jZSIpKw0KICB4bGFiKCJZZWFyIikrDQogIHRoZW1lX2J3KCkgKw0KICB0aGVtZShwYW5lbC5zcGFjaW5nID0gdW5pdCgwLjEsICJsaW5lcyIpLA0KICAgICAgICB0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemU9MTYpLA0KICAgICAgICBwYW5lbC5ib3JkZXI9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgYXhpcy5saW5lPWVsZW1lbnRfbGluZSgpLCANCiAgICAgICAgYXhpcy50aWNrcy55ID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBwYW5lbC5ncmlkLm1ham9yLnggPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIHBhbmVsLmdyaWQubWFqb3IueSA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgcGFuZWwuZ3JpZC5taW5vci55ID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBwYW5lbC5ncmlkLm1pbm9yLnggPSBlbGVtZW50X2JsYW5rKCksIA0KICAgICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplPTE2KSwgDQogICAgICAgIGxlZ2VuZC50aXRsZT1lbGVtZW50X3RleHQoc2l6ZT0xNiwgZmFjZSA9ICJib2xkIiksDQogICAgICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSwgc2l6ZSA9IDEzLCBmYWNlID0gImJvbGQiKSwNCiAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMywgaGp1c3QgPSAwLjUsIG1hcmdpbiA9IG1hcmdpbihyPTgpLGZhY2UgPSAiYm9sZCIpLA0KICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDAsY29sb3I9ImJsYWNrIixoanVzdD0wKSwNCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoY29sb3I9ImJsYWNrIiksDQogICAgICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE2KSkNCnANCmBgYA0KDQoqKkZpZ3VyZSBTMSoqLiBOdW1iZXIgb2YgbWV0YS1hbmFseXNlcyBvZiB2YXJpYW5jZSBjb25kdWN0ZWQgZWFjaCB5ZWFyIGluIGVjb2xvZ3kgYW5kIGV2b2x1dGlvbiBzaW5jZSBbTmFrYWdhd2EgZXQgYWwuICgyMDE1KV0oaHR0cHM6Ly9kb2kub3JnLzEwLjExMTEvMjA0MS0yMTBYLjEyMzA5KS4gDQoNCmBgYHtyLHJlc3VsdHM9ImhpZGUifQ0KIyBlc3RpbWF0aW5nIHRoZSByYXRlIG9mIHR5cG9zIHB1cmVseSBhZmZlY3RpbmcgbWVhbnMsIHNkcywgYW5kIG5zDQpkYi50eXBvcyA8LSByZWFkLnhsc3goImRhdGFfcmUtZXh0cmFjdGlvbi9yZS1leHRyYWN0ZWQvMDAxX0V5Y2tEZXYuc3RyZXNzX0RhdGFfRlVMTF9UQUJMRV9hbGxfcmF3X2RhdGFfcmUtZXh0cmFjdGVkX1ZJU1VBTF9tYW51YWxfY29tcF90eXBvcy54bHN4Iixjb2xOYW1lcz1ULHNoZWV0ID0gMSkNCg0KIyBkYXRhYmFzZSB3aXRoIHRoZSBjb3JyZWN0ZWQgZGF0YQ0Kc3RyZXNzLmRhdGEgPC0gcmVhZC54bHN4KCJkYXRhX3JlLWV4dHJhY3Rpb24vY2xlYW5fZGF0YS9FeWNrRGV2X3N0cmVzc19jbGVhbl9lZmZlY3Rfc2l6ZXNfc3BfY29ycmVjdGVkLnhsc3giLGNvbE5hbWVzPVQsc2hlZXQgPSAxKQ0KbWlzc2luZy5zaWduIDwtIHN0cmVzcy5kYXRhW2lzLm5hKHN0cmVzcy5kYXRhJHNpZ24uaW52ZXJzaW9uLm91cnMpLF0NCmBgYA0KIyMgMi4gRGF0YSBpbmZvcm1hdGlvbg0KV2UgdXNlZCB0aGUgZGF0YSBmcm9tIFtFeWNrIGV0IGFsLiAoMjAxOSldKGh0dHBzOi8vZG9pLm9yZy8xMC4xMTExL2Jydi4xMjQ5NikgYXMgYSBjYXNlIGV4YW1wbGUuIFdoaWxlIG1vc3QgZGF0YSB3ZXJlIG1hZGUgYXZhaWxhYmxlIHdpdGggdGhlIG9yaWdpbmFsIHB1YmxpY2F0aW9uLCB0aGUgYXV0aG9ycyBraW5kbHkgc2hhcmVkIGEgdmVyc2lvbiBvZiB0aGUgZGF0YXNldCB3aXRoIHVzIGNvbnRhaW5pbmcgdGhlIHJhdyBkYXRhIChtZWFucywgU0RzLCBhbmQgc2FtcGxlIHNpemVzKSBmb3IgdGhlIGZpbmFsIHN1YnNldCBhbmFseXplZCBpbiB0aGVpciBzdHVkeSwgd2hpY2ggd2UgdXNlZCBmb3Igb3VyIGFuYWx5c2VzLiBCZWZvcmUgdXNpbmcgdGhlIGRhdGFzZXQsIHdlIG1hZGUgdGhlIGZvbGxvd2luZyBtb2RpZmljYXRpb25zIHRvIGl0OiAqKigxKSoqIFdlIGV4Y2x1ZGVkIGVmZmVjdCBzaXplcyBiYXNlZCBvbmx5IG9uIGluZmVyZW50aWFsIHN0YXRpc3RpY3MgKGsgPSAxNDUgZWZmZWN0IHNpemVzIGV4Y2x1ZGVkKSBiZWNhdXNlIHRoZSBjYWxjdWxhdGlvbiBvZiBvdXIgZWZmZWN0IHNpemUgc3RhdGlzdGljcyByZXF1aXJlcyByYXcgbWVhbnMsIFNEcywgYW5kIHNhbXBsZSBzaXplcy4gKiooMikqKiBUd28gb2JzZXJ2ZXJzIChBU1QgYW5kIE5QTSkgcGVyZm9ybWVkIGEgZGF0YSBxdWFsaXR5IGNoZWNrIGZvciB0aGUgc2hhcmVkIGRhdGFzZXQsIHdoaWNoIGNvbnNpc3RlZCBvZiByZWFkaW5nIHRoZSBvcmlnaW5hbCBwdWJsaWNhdGlvbnMgYW5kIGNvbmZpcm1pbmcgdGhlIGV4dHJhY3RlZCBtZWFucywgU0RzIGFuZCBzYW1wbGUgc2l6ZXMuIE92ZXJhbGwsIHdlIGZvdW5kIHRoYXQgYHIgcm91bmQoKHRhYmxlKGRiLnR5cG9zJG1pc3Rha2UpWzJdL25yb3coZGIudHlwb3MpKSoxMDAsMClgJSBvZiB0aGUgY29udHJvbC10cmVhdG1lbnQgY29tcGFyaXNvbnMgaW4gdGhlIHNoYXJlZCBkYXRhc2V0IHJlcXVpcmVkIHNvbWUgY29ycmVjdGlvbihzKS4gKiooMykqKiBEdWUgdG8gc29tZSBpbmNvbnNpc3RlbmNpZXMgaW4gaG93IHRyYWl0cyB3ZXJlIGNhdGVnb3JpemVkIGluIHRoZSBzaGFyZWQgZGF0YXNldCwgd2UgZGVjaWRlZCB0byByZWNsYXNzaWZ5IHRob3NlIHRyYWl0cyBmb2xsb3dpbmcgW0FjYXN1c28tUml2ZXJvIGV0IGFsLiAoMjAxOSldKGh0dHBzOi8vZG9pLm9yZy8xMC4xMDk4L3JzcGIuMjAxOS4wNjUzKSwgd2hvIHVzZWQgc2l4IGxldmVscyAoYmVoYXZpb3VyLCBkZXZlbG9wbWVudCwgbWV0YWJvbGlzbSBhbmQgcGh5c2lvbG9neSwgbW9ycGhvbG9neSwgcmVwcm9kdWN0aW9uLCBhbmQgc3Vydml2YWwpIGluc3RlYWQgb2YgdGhlIGZpdmUgbGV2ZWxzIChiZWhhdmlvdXIsIHBoeXNpb2xvZ3ksIG1vcnBob2xvZ3ksIHJlcHJvZHVjdGlvbiwgYW5kIHBlcmZvcm1hbmNlKSB1c2VkIGluIFtFeWNrIGV0IGFsLiAoMjAxOSldKGh0dHBzOi8vZG9pLm9yZy8xMC4xMTExL2Jydi4xMjQ5NikuIFRoaXMgcmVjbGFzc2lmaWNhdGlvbiB3YXMgcGVyZm9ybWVkIGJ5IGEgc2luZ2xlIG9ic2VydmVyIChBU1QpLiBCYXNlZCBvbiB0aGUgbGlzdCBvZiB0cmFpdHMgYXZhaWxhYmxlLCB3ZSBmb3VuZCBvdXIgY2xhc3NpZmljYXRpb24gZWFzaWVyLiBJbXBvcnRhbnRseSwgb3VyIGRlY2lzaW9uIHRvIHJlY2xhc3NpZnkgdGhlIHRyYWl0cyB3YXMgdGFrZW4gYmVmb3JlIGFueSBtZXRhLXJlZ3Jlc3Npb24gd2FzIGNvbmR1Y3RlZCAoaS5lLiB3ZSB3ZXJlIGJsaW5kIHRvIHRoZSByZXN1bHRzKS4gKiooNCkqKiBXZSBhbHNvIHJlY29kZWQgdGhlIGRpcmVjdGlvbiBvZiBzb21lIG9mIHRoZSBlZmZlY3Qgc2l6ZXMuIEFzIGluIFtFeWNrIGV0IGFsLiAoMjAxOSldKGh0dHBzOi8vZG9pLm9yZy8xMC4xMTExL2Jydi4xMjQ5NiksIGVmZmVjdCBzaXplcyB3ZXJlIGNvZGVkIHN1Y2ggdGhhdCBuZWdhdGl2ZSB2YWx1ZXMgaW5kaWNhdGUgdGhhdCBkZXZlbG9wbWVudGFsIHN0cmVzcyBuZWdhdGl2ZWx5IGFmZmVjdHMgZml0bmVzcy4gVGhpcyBwcm9jZXNzIHdhcyBwZXJmb3JtZWQgYnkgb25lIG9ic2VydmVyIChBU1QpLCBhbmQgY29uc2lzdGVkIG9mIGdvaW5nIHRocm91Z2ggdGhlIGxpc3Qgb2YgYXZhaWxhYmxlIHRyYWl0cyBpZGVudGlmeWluZyB0aG9zZSBmb3Igd2hpY2ggYSBjbGVhciBkZWNpc2lvbiBvbiB0aGUgZGlyZWN0aW9uIGNvdWxkIGJlIG1hZGUsIGFuZCB0aG9zZSBmb3Igd2hpY2ggbW9yZSBpbmZvcm1hdGlvbiB3YXMgbmVlZGVkLiBGb3IgdGhlIGxhdHRlciBncm91cCwgdGhlIG9ic2VydmVyIHJldmlzaXRlZCB0aGUgZGVmaW5pdGlvbiBhbmQgcHJlZGljdGlvbnMgYXZhaWxhYmxlIGluIHRoZSBvcmlnaW5hbCBwdWJsaWNhdGlvbnMgYmVmb3JlIG1ha2luZyBhIGRlY2lzaW9uLiBPZiB0aGVzZSwgYHIgbnJvdyhtaXNzaW5nLnNpZ24pYCBlZmZlY3Qgc2l6ZXMgZnJvbSBgciBsZW5ndGgodW5pcXVlKG1pc3Npbmcuc2lnbiRzdHVkeUlEKSlgIHN0dWRpZXMgY291bGQgbm90IGJlIGFzc2lnbmVkIGEgZGlyZWN0aW9uIGJhc2VkIG9uIHRoZSBpbmZvcm1hdGlvbiBwcm92aWRlZCBpbiB0aGUgb3JpZ2luYWwgcHVibGljYXRpb25zIG9yIG90aGVyIGF2YWlsYWJsZSBpbmZvcm1hdGlvbiwgdGhlcmVmb3JlIHRoZXkgd2VyZSBleGNsdWRlZCB3aGVuIGNhbGN1bGF0aW5nIG1lYW4gKGJ1dCBub3QgdmFyaWFuY2UpIGVmZmVjdCBzaXplcy4gVGhvc2UgYHIgbnJvdyhtaXNzaW5nLnNpZ24pYCBlZmZlY3Qgc2l6ZXMgaW5jbHVkZWQgb3JnYW4gdG8gYm9keS9vdGhlciBvcmdhbiByYXRpb3MgKGUuZy4gaGlwcG9jYW1wdXMgd2VpZ2h0IHRvIGJyYWluIHdlaWdodCByYXRpbyksIHRoZXJtYWwgcHJlZmVyZW5jZSB0ZXN0cywgYW5kIGNvdW50cyBvZiBzcGVjaWZpYyBjZWxsIHR5cGVzIGluIHRoZSBicmFpbiAoZS5nLiB0b3RhbCBncmFudWxlIGNlbGwgbnVtYmVyIGluIHRoZSBicmFpbjsgbW9yZSBkZXRhaWxzIGluIHRoZSBSIHNjcmlwdCBbYDAwM19kYXRhX3ByZXBhcmF0aW9uLlJgXShodHRwczovL2dpdGh1Yi5jb20vQVNhbmNoZXotVG9qYXIvbWV0YS1hbmFseXNpc19vZl92YXJpYW5jZS9ibG9iL21hc3Rlci8wMDNfZGF0YV9wcmVwYXJhdGlvbi5SKSBhbmQgdGhlIGRhdGEgYXZhaWxhYmxlIFtTYW5jaGV6LVRvamFyIGV0IGFsLiAyMDE5XShodHRwczovL2RvaS5vcmcvMTAuMTc2MDUvT1NGLklPL1lKVUE4KSkuIE92ZXJhbGwsIHdlIGludmVydGVkIHRoZSBkaXJlY3Rpb24gb2YgYHIgcm91bmQoKHRhYmxlKHN0cmVzcy5kYXRhJHNpZ24uaW52ZXJzaW9uLm91cnMpWzFdL25yb3coc3RyZXNzLmRhdGEpKSoxMDAsMSlgJSBvZiBhbGwgZWZmZWN0IHNpemVzIGluIG91ciBkYXRhc2V0IGNvbXBhcmVkIHRvIHRoZSBgciByb3VuZCgodGFibGUoc3RyZXNzLmRhdGEkc2lnbi5pbnZlcnNpb24uSEUpWzFdL25yb3coc3RyZXNzLmRhdGEpKSoxMDAsMSlgJSBvYnNlcnZlZCBpbiB0aGUgc2hhcmVkIGRhdGFzZXQuICoqKDUpKiogV2UgZXhjbHVkZWQgbWVhc3VyZW1lbnRzIG5vdCBib3VuZGVkIGF0IHplcm8gYmVjYXVzZSBsblJSIGFuZCBsbkNWUiBhc3N1bWUgcmF0aW8gc2NhbGUgZGF0YSAoW0hvdWxlIGV0IGFsLiwgMjAxMV0oaHR0cHM6Ly9kb2kub3JnLzEwLjEwODYvNjU4NDA4KSkgKGsgPSA3KS4gKiooNikqKiBXZSBleGNsdWRlZCBncm91cC1sZXZlbCBwcm9wb3J0aW9uYWwgZGF0YSBmcm9tIHRoZSBtZXRhLWFuYWx5c2lzIG9mIHZhcmlhbmNlIGFzIHRoZXkgZG8gbm90IGhhdmUgYXNzb2NpYXRlZCBTRCAoZS5nLiAyNSUgdnMuIDQwJSBzdXJ2aXZhbCBiZXR3ZWVuIGNvbnRyb2wgYW5kIHRyZWF0bWVudCBncm91cDsgW05ha2FnYXdhIGV0IGFsLiwgMjAxNV0oaHR0cHM6Ly9kb2kub3JnLzEwLjExMTEvMjA0MS0yMTBYLjEyMzA5KSkgKGsgPSAzKS4gKiooNykqKiBXZSBleGNsdWRlZCB0d28gZWZmZWN0IHNpemVzIHRoYXQgd2VyZSBpZGVudGlmaWVkIGFzIG91dGxpZXJzIGJ5IHRoZSBmdW5jdGlvbiDigJhlc2NhbGMoKeKAmSBmcm9tIHRoZSBSIHBhY2thZ2Ug4oCYbWV0YWZvcuKAmSB2LjIuMS0wIChbVmllY2h0YmF1ZXIsIDIwMTBdKGh0dHBzOi8vZG9pLm9yZy8xMC4xODYzNy9qc3MudjAzNi5pMDMpKSBkdWUgdG8gdGhlaXIgbGFyZ2UgbWVhbiB0byBTRCByYXRpby4NCg0KYGBge3J9DQpsb2FkKCJkYXRhX3JlLWV4dHJhY3Rpb24vY2xlYW5fZGF0YS90cmVlX3JhbmRvbS5SZGF0YSIpDQpwbG90KHRyZWVfcmFuZG9tLCBjZXg9LjUsIGxhYmVsLm9mZnNldCA9LjEsIG5vLm1hcmdpbiA9IFRSVUUpDQpgYGAgDQoNCioqRmlndXJlIFMyKiouIFBoeWxvZ2VueSB1c2VkIHRvIG1vZGVsIHRoZSBwaHlsb2dlbmV0aWMgcmVsYXRpb25zaGlwcyBhbW9uZyB0aGUgYW5pbWFsIHNwZWNpZXMgc3R1ZGllZC4gVGhpcyBwaHlsb2dlbnkgd2FzIHJldHJpZXZlZCBmcm9tIHRoZSBPcGVuIFRyZWUgb2YgTGlmZSAoW0hpbmNobGlmZiBldCBhbC4gMjAxNV0oaHR0cHM6Ly9kb2kub3JnLzEwLjEwNzMvcG5hcy4xNDIzMDQxMTEyKTsgc2VlIHNlY3Rpb24gXCdSYW5kb20gZWZmZWN0c1wnIGluIG1haW4gdGV4dCkuDQoNCmBgYHtyfQ0KIyBmdW5jdGlvbiB0aGF0IGNhbGN1bGF0ZXMgYmlhc2VkICh1c2VkIGluIHRoZSBvcmlnaW5hbCBtZXRhLWFuYWx5c2lzKQ0KIyBhbmQgdW5iaWFzZWQgY29oZW4ncyBkLCBhbmQgdGhlaXIgc2FtcGxpbmcgdmFyaWFuY2VzDQpjb2hlbnNEIDwtIGZ1bmN0aW9uKG1lYW5fY29udHJvbCxtZWFuX3RyZWF0bWVudCxzZF9jb250cm9sLHNkX3RyZWF0bWVudCxuX2NvbnRyb2wsbl90cmVhdG1lbnQsYXBwZW5kPVQsZGF0YSl7DQogIHNkX3Bvb2xlZCA8LSBzcXJ0KCgoZGF0YVssbl90cmVhdG1lbnRdLTEpKmRhdGFbLHNkX3RyZWF0bWVudF1eMisoZGF0YVssbl9jb250cm9sXS0xKSpkYXRhWyxzZF9jb250cm9sXV4yKS8oZGF0YVssbl9jb250cm9sXStkYXRhWyxuX3RyZWF0bWVudF0tMikpDQogIGNvcnJlY3Rpb24gPC0gc3FydCgoZGF0YVssbl90cmVhdG1lbnRdK2RhdGFbLG5fY29udHJvbF0tMikvKGRhdGFbLG5fdHJlYXRtZW50XStkYXRhWyxuX2NvbnRyb2xdKSkNCiAgY29oZW5zLmJpYXNlZCA8LSAoZGF0YVssbWVhbl90cmVhdG1lbnRdLWRhdGFbLG1lYW5fY29udHJvbF0pLyhzZF9wb29sZWQqY29ycmVjdGlvbikNCiAgY29oZW5zLmJpYXNlZC5zdiA8LSAoKChkYXRhWyxuX2NvbnRyb2xdK2RhdGFbLG5fdHJlYXRtZW50XSkvKGRhdGFbLG5fY29udHJvbF0qZGF0YVssbl90cmVhdG1lbnRdKSkrKChjb2hlbnMuYmlhc2VkXjIpLygyKihkYXRhWyxuX2NvbnRyb2xdK2RhdGFbLG5fdHJlYXRtZW50XSkpKSkNCiAgY29oZW5zLnVuYmlhc2VkIDwtIChkYXRhWyxtZWFuX3RyZWF0bWVudF0tZGF0YVssbWVhbl9jb250cm9sXSkvc2RfcG9vbGVkDQogIGNvaGVucy51bmJpYXNlZC5zdiA8LSAoKChkYXRhWyxuX2NvbnRyb2xdK2RhdGFbLG5fdHJlYXRtZW50XSkvKGRhdGFbLG5fY29udHJvbF0qZGF0YVssbl90cmVhdG1lbnRdKSkrKChjb2hlbnMudW5iaWFzZWReMikvKDIqKGRhdGFbLG5fY29udHJvbF0rZGF0YVssbl90cmVhdG1lbnRdKSkpKQ0KICBpZihhcHBlbmQpew0KICAgIHJldHVybihjYmluZChkYXRhLGNvaGVucy5iaWFzZWQsY29oZW5zLmJpYXNlZC5zdixjb2hlbnMudW5iaWFzZWQsY29oZW5zLnVuYmlhc2VkLnN2KSkNCiAgfSBlbHNlew0KICAgIHJldHVybihhcy5kYXRhLmZyYW1lKGNiaW5kKGRhdGEsY29oZW5zLmJpYXNlZCxjb2hlbnMuYmlhc2VkLnN2LGNvaGVucy51bmJpYXNlZCxjb2hlbnMudW5iaWFzZWQuc3YpKSkNCiAgfQ0KfQ0KYGBgDQojIyAzLiBTdGFuZGFyZGl6ZWQgTWVhbiBEaWZmZXJlbmNlDQpbRXljayBldCBhbC4gKDIwMTkpXShodHRwczovL2RvaS5vcmcvMTAuMTExMS9icnYuMTI0OTYpIHVzZWQgYSB2ZXJzaW9uIG9mIENvaGVuXCdzIGQgYXMgdGhlIGVmZmVjdCBzaXplIHN0YXRpc3RpYyAoZXF1YXRpb24gYXZhaWxhYmxlIGluIHRoZSBjb2RlIGFib3ZlKS4gRm9yIGNvbXBhcmlzb24sIHdlIHByZXNlbnQgaGVyZSB0aGUgbWVhbiBsZXZlbCByZXN1bHRzIGJhc2VkIG9uIGEgc3RhbmRhcmQgbWVhbiBkaWZmZXJlbmNlIHRoYXQgYWNjb3VudHMgZm9yIGhldGVyb3NjZWRhc3RpY2l0eSAoU01ESDsgQm9uZXR0IFsyMDA4XShodHRwczovL2RvaS5vcmcvMTAuMTAzNy8xMDgyLTk4OVguMTMuMi45OSksIFsyMDA5XShodHRwczovL2RvaS5vcmcvMTAuMTAzNy9hMDAxNjYxOSkpLiBXZSB1c2VkIChhbmQgcmVjb21tZW5kIHVzaW5nKSB0aGUgU01ESCByYXRoZXIgdGhhbiBvdGhlciBjb21tb25seSB1c2VkIHZhcmlhbnRzIG9mIHN0YW5kYXJkaXplZCBtZWFuIGRpZmZlcmVuY2UgZWZmZWN0IHNpemUgc3RhdGlzdGljcywgc3VjaCBhcyBDb2hlblwncyBkIChDb2hlbiAxOTg4KSBvciBIZWRnZXNcJyBnIChbSGVkZ2VzIDE5ODFdKGh0dHBzOi8vZG9pLm9yZy8xMC4zMTAyLzEwNzY5OTg2MDA2MDAyMTA3KSksIGJlY2F1c2Ugd2UgZXhwZWN0ZWQgYW5kIGZvdW5kIHVuZXF1YWwgdmFyaWFuY2VzIGJldHdlZW4gZXhwZXJpbWVudGFsIGFuZCBjb250cm9sIHRyZWF0bWVudHMgKGkuZS4gd2UgZm91bmQgaGV0ZXJvc2NlZGFzdGljaXR5KS4gDQoNCk91ciByZXN1bHRzIGJhc2VkIG9uIFNNREggY29uZmlybWVkIGEgbW9kZXJhdGUgKGZvbGxvd2luZyB0aGUgYmVuY2htYXJrcyBvdXRsaW5lZCBieSBDb2hlbiAxOTg4KSBhbmQgbmVnYXRpdmUgZWZmZWN0IG9mIGRldmVsb3BtZW50YWwgc3RyZXNzIG9uIG1lYW4gdHJhaXQgdmFsdWVzIChUYWJsZSBTMSkuIEhvd2V2ZXIsIGluIGNvbnRyYXN0IHRvIHRoZSBvcmlnaW5hbCBzdHVkeSwgdGhlIHVuY2VydGFpbnR5IGFyb3VuZCB0aGUgbWVhbiBlZmZlY3Qgd2FzIHJhdGhlciBsYXJnZSAoVGFibGUgUzEpLiBUaGlzIGxhcmdlIHVuY2VydGFpbnR5IHdhcyBsaWtlbHkgYmVjYXVzZSB3ZSBhZGRpdGlvbmFsbHkgYWNjb3VudGVkIGZvciBzaGFyZWQgY29udHJvbCBhbmQgcGh5bG9nZW5ldGljIG5vbi1pbmRlcGVuZGVuY2UgKHNlZSBzZWN0aW9uIFwnTWV0aG9kc1wnKSwgYnV0IGl0IG1pZ2h0IGhhdmUgYWxzbyBiZWVuIGR1ZSB0byB0aGUgZGlmZmVyZW5jZXMgYmV0d2VlbiB0aGUgZGF0YXNldHMgdXNlZCAoc2VlIHNlY3Rpb24gXCdEYXRhIGluZm9ybWF0aW9uXCcpLiBBcyBpbiB0aGUgY2FzZSBvZiBsblJSIChzZWUgbWFpbiB0ZXh0KSwgaGV0ZXJvZ2VuZWl0eSB3YXMgbGFyZ2UsIGFuZCB0aGUgcmVzdWx0cyBvZiB0aGUgRWdnZXJcJ3MgcmVncmVzc2lvbiB0ZXN0IHNob3dlZCB0aGF0IHB1YmxpY2F0aW9uIGJpYXMgbWlnaHQgYmUgcHJlc2VudCBpbiB0aGlzIGRhdGFzZXQgKFRhYmxlIFMxKS4NCg0KDQoqKlRhYmxlIFMxKiouIFJlc3VsdHMgb2YgdGhlIG11bHRpbGV2ZWwgbWV0YS1hbmFseXNpcyB1c2luZyBhIGhldGVyb3NjZWRhc3RpY2l0eS1jb3JyZWN0ZWQgc3RhbmRhcmRpemVkIG1lYW4gZGlmZmVyZW5jZSB0byB0ZXN0IHRoZSBlZmZlY3Qgb2YgZGV2ZWxvcG1lbnRhbCBzdHJlc3Mgb24gbWVhbiB0cmFpdCB2YWx1ZXMuIFRoZSByZXN1bHRzIG9mIHRoZSBFZ2dlclwncyByZWdyZXNzaW9uIHRlc3QgYXJlIGFsc28gc2hvd24gKHNlZSBzZWN0aW9uIFwnUHVibGljYXRpb24gYmlhc1wnIGluIHRoZSBtYWluIHRleHQpLg0KDQpgYGB7cn0NCnRhYmxlMS5TTURIIDwtIHJlYWQudGFibGUoInRhYmxlcy90YWJsZVMxX3N1cHBsZW1lbnRzX2RhdGEuY3N2IixoZWFkZXI9VCxzZXA9IiwiKQ0KdGFibGVTMS5ndCA8LSB0YWJsZTEuU01ESCAlPiUgDQogIGd0KCkgJT4lIA0KICBjb2xzX2xhYmVsKEVmZmVjdC5zaXplPW1kKCIqKkVmZmVjdCBzaXplKioiKSwNCiAgICAgICAgICAgICBLPW1kKCIqKmsqKiIpLA0KICAgICAgICAgICAgIE1ldGFhbmFseXRpYy5tZWFuPW1kKCIqKk1ldGEtYW5hbHl0aWMgbWVhbioqIiksDQogICAgICAgICAgICAgT2JzZXJ2YXRpb25hbD1tZCgiKioqSSo8c3VwPjI8L3N1cD48c3ViPk9ic2VyLjwvc3ViPiAoJSkqKiIpLA0KICAgICAgICAgICAgIFN0dWR5PW1kKCIqKipJKjxzdXA+Mjwvc3VwPjxzdWI+U3R1ZHk8L3N1Yj4gKCUpKioiKSwNCiAgICAgICAgICAgICBTcGVjaWVzPW1kKCIqKipJKjxzdXA+Mjwvc3VwPjxzdWI+U3BlY2llczwvc3ViPiAoJSkqKiIpLA0KICAgICAgICAgICAgIFBoeWxvZ2VueT1tZCgiKioqSSo8c3VwPjI8L3N1cD48c3ViPlBoeWxvPC9zdWI+ICglKSoqIiksDQogICAgICAgICAgICAgVG90YWw9bWQoIioqKkkqPHN1cD4yPC9zdXA+PHN1Yj4gVG90YWw8L3N1Yj4gKCUpKioiKSwNCiAgICAgICAgICAgICBRdGVzdD1tZCgiKioqUSo8c3ViPnRlc3Q8L3N1Yj4qKiIpLA0KICAgICAgICAgICAgIEVnZ2Vycz1tZCgiKipFZ2dlcidzIHRlc3QqKiIpKSAlPiUNCiAgY29sc19hbGlnbihhbGlnbiA9ICJyaWdodCIpICU+JQ0KICB0YWJfc291cmNlX25vdGUoc291cmNlX25vdGUgPSBtZCgiayA9IG51bWJlciBvZiBlc3RpbWF0ZXM7ICpJKjxzdXA+Mjwvc3VwPiA9IGhldGVyb2dlbmVpdHk7ICpRKjxzdWI+dGVzdDwvc3ViPiA9IENvY2hyYW5lJ3MgKlEqIHRlc3Q7IE5BID0gbm90IGFwcGxpY2FibGU7IE9ic2VyLiA9IE9ic2VydmF0aW9uYWwgb3IgcmVzaWR1YWwgdmFyaWFuY2U7IFBoeWxvID0gUGh5bG9nZW55LiBFZ2dlcidzIHRlc3QgPSBpbnRlcmNlcHQgb2YgYW4gRWdnZXIncyByZWdyZXNzaW9uIChOYWthZ2F3YSBhbmQgU2FudG9zIDIwMTIpLiBFc3RpbWF0ZXMgc2hvd24gY29ycmVzcG9uZCB0byBtb2RlcyBhbmQgOTUlIEhpZ2hlc3QgUG9zdGVyaW9yIERlbnNpdHkgSW50ZXJ2YWxzLiBOID0gOTAgc3R1ZGllcy4iKSkgJT4lDQogIHRhYl9vcHRpb25zKHRhYmxlLndpZHRoPTc3NSkNCg0KdGFibGVTMS5ndA0KYGBgDQoNCiMjIDQuIE1lYW4tVmFyaWFuY2UgcmVsYXRpb25zaGlwDQoNCmBgYHtyfQ0KIyBmaXJzdCwgYWRkaW5nIHRoZSBjb3JyZWN0ZWQgdHJhaXQgY2xhc3Nlcw0KdHJhaXQuZGF0YWJhc2UgPC0gcmVhZC54bHN4KCJkYXRhX3JlLWV4dHJhY3Rpb24vY2xlYW5fZGF0YS9FeWNrRGV2X3N0cmVzc19jbGVhbl9lZmZlY3Rfc2l6ZXNfc3BfY29ycmVjdGVkX3RyYWl0X21vZGlmaWNhdGlvbi54bHN4Iixjb2xOYW1lcz1ULHNoZWV0ID0gMSkNCg0KIyByZWR1Y2luZyBkYXRhYmFzZSB0byBvbmx5IHRoZSB1bmlxdWUgaWRlbnRpZmllciBhbmQgdGhlIHRyYWl0IGNsYXNzcw0KdHJhaXQuZGF0YWJhc2UucmVkIDwtIHRyYWl0LmRhdGFiYXNlWyxjKCJlc0lEIiwidHJhaXQuY2xhc3MuMiIpXQ0KDQojIGFuZCBhZGRpbmcgdGhvc2UgY29ycmVjdGVkIHRyYWl0IGNsYXNzZXMgdG8gdGhlIGRhdGFiYXNlDQpzdHJlc3MuZGF0YS4yIDwtIG1lcmdlKHN0cmVzcy5kYXRhLHRyYWl0LmRhdGFiYXNlLnJlZCxieT0iZXNJRCIsYWxsLng9VCkNCg0KIyB0aGVuLCByZWR1Y2luZyBkYXRhc2V0IHRvIHJhdGlvIHNjYWxlIGRhdGEgb25seQ0Kc3RyZXNzLmRhdGEucmF0aW8uc2NhbGUgPC0gc3RyZXNzLmRhdGEuMlshKGlzLm5hKHN0cmVzcy5kYXRhLjIkbG5SUi5vdXJzKSksXQ0KDQojIHRoZW1lIGZvciB0aGUgcGxvdHMNCnRtIDwtIHRoZW1lKHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgICAgICBheGlzLmxpbmUgPSBlbGVtZW50X2xpbmUoc2l6ZSA9IDAuNzUpLA0KICAgICAgICAgICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCwgY29sb3VyID0gImJsYWNrIiksDQogICAgICAgICAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiksDQogICAgICAgICAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNiwgaGp1c3QgPSAwLjUpKQ0KDQojIGFyZSBsbihtZWFuKSBhbmQgbG4oc2QpIGNvcnJlbGF0ZWQgaW4gZWFjaCBncm91cD8gYXJlIGxuKG1lYW4pIGFuZCBsbihzZCkgY29ycmVsYXRlZCBpbiBmb3IgZWFjaCB0cmFpdCBpbiBlYWNoIGdyb3VwPw0KIyBjb250cm9sDQojY29yLmNvbnRyb2wgPC0gcm91bmQoY29yKGxvZyhzdHJlc3MuZGF0YS5yYXRpby5zY2FsZSRtZWFuLmNvbnRyb2wpLGxvZyhzdHJlc3MuZGF0YS5yYXRpby5zY2FsZSRTRC5jb250cm9sKSksMikNCmNvci5jb250cm9sIDwtIGNvci50ZXN0KGxvZyhzdHJlc3MuZGF0YS5yYXRpby5zY2FsZSRtZWFuLmNvbnRyb2wpLGxvZyhzdHJlc3MuZGF0YS5yYXRpby5zY2FsZSRTRC5jb250cm9sKSkNCg0KIyBlc3RpbWF0aW5nIGVhY2ggY29yIHBlciB0cmFpdA0KY29yLmNvbnRyb2wudHJhaXQubmFtZSA8LSBjKCkNCmNvci5jb250cm9sLnRyYWl0LmNvciA8LSBjKCkNCmNvci5jb250cm9sLnRyYWl0LmNvci5sb3dlciA8LSBjKCkNCmNvci5jb250cm9sLnRyYWl0LmNvci51cHBlciA8LSBjKCkNCmNvci5jb250cm9sLnRyYWl0Lm4gPC0gYygpDQoNCmZvcihpIGluIGxldmVscyhmYWN0b3Ioc3RyZXNzLmRhdGEucmF0aW8uc2NhbGUkdHJhaXQuY2xhc3MuMikpKXsNCiAgeCA8LSBzdHJlc3MuZGF0YS5yYXRpby5zY2FsZVtzdHJlc3MuZGF0YS5yYXRpby5zY2FsZSR0cmFpdC5jbGFzcy4yPT1pLF0NCiAgDQogIGNvci5jb250cm9sLnRyYWl0Lm5hbWUgPC0gYyhjb3IuY29udHJvbC50cmFpdC5uYW1lLGkpDQogIA0KICBjb3IudHJhaXQgPC0gcm91bmQoY29yKGxvZyh4JG1lYW4uY29udHJvbCksbG9nKHgkU0QuY29udHJvbCkpLDMpDQogIGNvci5jb250cm9sLnRyYWl0LmNvciA8LSBjKGNvci5jb250cm9sLnRyYWl0LmNvcixjb3IudHJhaXQpDQogIA0KICBsb3dlci50cmFpdCA8LSBjb3IudGVzdChsb2coeCRtZWFuLmNvbnRyb2wpLGxvZyh4JFNELmNvbnRyb2wpKSRjb25mLmludFsxXQ0KICBjb3IuY29udHJvbC50cmFpdC5jb3IubG93ZXIgPC0gYyhjb3IuY29udHJvbC50cmFpdC5jb3IubG93ZXIscm91bmQobG93ZXIudHJhaXQsMykpDQogIA0KICB1cHBlci50cmFpdCA8LSBjb3IudGVzdChsb2coeCRtZWFuLmNvbnRyb2wpLGxvZyh4JFNELmNvbnRyb2wpKSRjb25mLmludFsyXQ0KICBjb3IuY29udHJvbC50cmFpdC5jb3IudXBwZXIgPC0gYyhjb3IuY29udHJvbC50cmFpdC5jb3IudXBwZXIscm91bmQodXBwZXIudHJhaXQsMykpDQogIA0KICBjb3IuY29udHJvbC50cmFpdC5uIDwtIGMoY29yLmNvbnRyb2wudHJhaXQubixucm93KHgpKQ0KICANCn0NCg0KY29ycmVsYXRpb25zLmNvbnRyb2wgPC0gYXMuZGF0YS5mcmFtZShjYmluZChjb3IuY29udHJvbC50cmFpdC5uYW1lLGNvci5jb250cm9sLnRyYWl0LmNvcixjb3IuY29udHJvbC50cmFpdC5jb3IubG93ZXIsY29yLmNvbnRyb2wudHJhaXQuY29yLnVwcGVyLGNvci5jb250cm9sLnRyYWl0Lm4pKQ0KDQojIHRyZWF0bWVudA0KY29yLnRyZWF0bWVudCA8LSBjb3IudGVzdChsb2coc3RyZXNzLmRhdGEucmF0aW8uc2NhbGUkbWVhbi50cmVhdCksbG9nKHN0cmVzcy5kYXRhLnJhdGlvLnNjYWxlJFNELnRyZWF0KSkNCg0KIyBlc3RpbWF0aW5nIGVhY2ggY29yIHBlciB0cmFpdA0KY29yLnRyZWF0bWVudC50cmFpdC5uYW1lIDwtIGMoKQ0KY29yLnRyZWF0bWVudC50cmFpdC5jb3IgPC0gYygpDQpjb3IudHJlYXRtZW50LnRyYWl0LmNvci5sb3dlciA8LSBjKCkNCmNvci50cmVhdG1lbnQudHJhaXQuY29yLnVwcGVyIDwtIGMoKQ0KY29yLnRyZWF0bWVudC50cmFpdC5uIDwtIGMoKQ0KDQpmb3IoaSBpbiBsZXZlbHMoZmFjdG9yKHN0cmVzcy5kYXRhLnJhdGlvLnNjYWxlJHRyYWl0LmNsYXNzLjIpKSl7DQogIHggPC0gc3RyZXNzLmRhdGEucmF0aW8uc2NhbGVbc3RyZXNzLmRhdGEucmF0aW8uc2NhbGUkdHJhaXQuY2xhc3MuMj09aSxdDQogIA0KICBjb3IudHJlYXRtZW50LnRyYWl0Lm5hbWUgPC0gYyhjb3IudHJlYXRtZW50LnRyYWl0Lm5hbWUsaSkNCiAgDQogIGNvci50cmFpdCA8LSByb3VuZChjb3IobG9nKHgkbWVhbi50cmVhdCksbG9nKHgkU0QudHJlYXQpKSwzKQ0KICBjb3IudHJlYXRtZW50LnRyYWl0LmNvciA8LSBjKGNvci50cmVhdG1lbnQudHJhaXQuY29yLGNvci50cmFpdCkNCiAgDQogIGxvd2VyLnRyYWl0IDwtIGNvci50ZXN0KGxvZyh4JG1lYW4udHJlYXQpLGxvZyh4JFNELnRyZWF0KSkkY29uZi5pbnRbMV0NCiAgY29yLnRyZWF0bWVudC50cmFpdC5jb3IubG93ZXIgPC0gYyhjb3IudHJlYXRtZW50LnRyYWl0LmNvci5sb3dlcixyb3VuZChsb3dlci50cmFpdCwzKSkNCiAgDQogIHVwcGVyLnRyYWl0IDwtIGNvci50ZXN0KGxvZyh4JG1lYW4udHJlYXQpLGxvZyh4JFNELnRyZWF0KSkkY29uZi5pbnRbMl0NCiAgY29yLnRyZWF0bWVudC50cmFpdC5jb3IudXBwZXIgPC0gYyhjb3IudHJlYXRtZW50LnRyYWl0LmNvci51cHBlcixyb3VuZCh1cHBlci50cmFpdCwzKSkNCiAgDQogIGNvci50cmVhdG1lbnQudHJhaXQubiA8LSBjKGNvci50cmVhdG1lbnQudHJhaXQubixucm93KHgpKQ0KICANCn0NCg0KY29ycmVsYXRpb25zLnRyZWF0bWVudHMgPC0gYXMuZGF0YS5mcmFtZShjYmluZChjb3IudHJlYXRtZW50LnRyYWl0Lm5hbWUsY29yLnRyZWF0bWVudC50cmFpdC5jb3IsY29yLnRyZWF0bWVudC50cmFpdC5jb3IubG93ZXIsY29yLnRyZWF0bWVudC50cmFpdC5jb3IudXBwZXIsY29yLnRyZWF0bWVudC50cmFpdC5uKSkNCg0KIyB3ZSBhcmUgcGxvdHRpbmcgZWFjaCBncm91cCAoaS5lLiBjb250cm9sIGFuZCB0cmVhdG1lbnQpLCBzZXBhcmF0ZWx5DQoNCiMgZmlyc3QsIHJlbmFtaW5nIHRyYWl0IGxldmVscw0Kc3RyZXNzLmRhdGEucmF0aW8uc2NhbGUgPC0gc3RyZXNzLmRhdGEucmF0aW8uc2NhbGUgJT4lIG11dGF0ZSh0cmFpdC5jbGFzcy4yPXJlY29kZSh0cmFpdC5jbGFzcy4yLGJlaGF2aW91cmFsPSJCZWhhdmlvdXIiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZlbG9wbWVudD0iRGV2ZWxvcG1lbnQiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhYm9saXNtX2FuZF9waHlzaW9sb2d5PSJNZXRhYm9saXNtXG5hbmQgUGh5c2lvbG9neSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vcnBob2xvZ2ljYWw9Ik1vcnBob2xvZ3kiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXByb2R1Y3Rpb249IlJlcHJvZHVjdGlvbiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cnZpdmFsPSJTdXJ2aXZhbCIpKQ0KDQpjb250cm9sLnBsb3QgPC0gZ2dwbG90KHN0cmVzcy5kYXRhLnJhdGlvLnNjYWxlLCBhZXMoeCA9IGxvZyhtZWFuLmNvbnRyb2wpLCB5ID0gbG9nKFNELmNvbnRyb2wpLCBjb2xvdXIgPSB0cmFpdC5jbGFzcy4yKSkgKw0KICBnZW9tX3BvaW50KGFscGhhID0gMC4yNSkgKyB0bSArIGxhYnMoeCA9ICJsbihtZWFuKSIsIHkgPSAibG4oU0QpIikgKw0KICBnZW9tX3Ntb290aChtZXRob2Q9bG0sIHNlPUZBTFNFKSArIA0KICBzY2FsZV9jb2xvcl9tYW51YWwobmFtZSA9ICJUcmFpdCBjbGFzcyIsdmFsdWVzID0gYygiQmVoYXZpb3VyIiA9ICIjOTk5OTk5IiwgIkRldmVsb3BtZW50IiA9ICIjRTZEMzAwIiwgIk1ldGFib2xpc21cbmFuZCBQaHlzaW9sb2d5IiA9ICIjNTZCNEU5IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1vcnBob2xvZ3kiID0gIiMwMDlFNzMiLCAiUmVwcm9kdWN0aW9uIiA9ICIjRDU1RTAwIiwgIlN1cnZpdmFsIiA9ICIjQ0M3OUE3IikpICsNCiAgI2Fubm90YXRlKGdlb209InRleHQiLCB4PS0yLjUsIHk9MTAuNSwgbGFiZWw9cGFzdGUwKCJPdmVyYWxsIHIgPSAiLGNvci5jb250cm9sKSxzaXplPTQpKw0KICBhbm5vdGF0ZShnZW9tPSJ0ZXh0IiwgeD04LCB5PTEwLjUsIGxhYmVsPSJBOiBDb250cm9sIixzaXplPTQpKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSBjKDAuODUsIDAuMjUpLA0KICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDkpLA0KICAgICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gOCksDQogICAgICAgIGxlZ2VuZC5rZXkgPSBlbGVtZW50X3JlY3QoZmlsbCA9IGFscGhhKCJ3aGl0ZSIsIDAuMCkpKQ0KDQp0cmVhdG1lbnQucGxvdCA8LSBnZ3Bsb3Qoc3RyZXNzLmRhdGEucmF0aW8uc2NhbGUsIGFlcyh4ID0gbG9nKG1lYW4udHJlYXQpLCB5ID0gbG9nKFNELnRyZWF0KSwgY29sb3VyID0gdHJhaXQuY2xhc3MuMikpICsNCiAgZ2VvbV9wb2ludChhbHBoYSA9IDAuMjUpICsgdG0gKyBsYWJzKHggPSAibG4obWVhbikiLCB5ID0gImxuKFNEKSIpICsNCiAgZ2VvbV9zbW9vdGgobWV0aG9kPWxtLCBzZT1GQUxTRSkgKyANCiAgc2NhbGVfY29sb3JfbWFudWFsKG5hbWUgPSAiVHJhaXQgY2xhc3MiLHZhbHVlcyA9IGMoIkJlaGF2aW91ciIgPSAiIzk5OTk5OSIsICJEZXZlbG9wbWVudCIgPSAiI0U2RDMwMCIsICJNZXRhYm9saXNtXG5hbmQgUGh5c2lvbG9neSIgPSAiIzU2QjRFOSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNb3JwaG9sb2d5IiA9ICIjMDA5RTczIiwgIlJlcHJvZHVjdGlvbiIgPSAiI0Q1NUUwMCIsICJTdXJ2aXZhbCIgPSAiI0NDNzlBNyIpKSArDQogICNhbm5vdGF0ZShnZW9tPSJ0ZXh0IiwgeD0tMi41LCB5PTEwLjUsIGxhYmVsPXBhc3RlMCgiT3ZlcmFsbCByID0gIixjb3IudHJlYXRtZW50KSxzaXplPTQpKw0KICBhbm5vdGF0ZShnZW9tPSJ0ZXh0IiwgeD04LCB5PTEwLjUsIGxhYmVsPSJCOiBUcmVhdG1lbnQiLHNpemU9NCkrDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9IGMoMC44NSwgMC4yNSksDQogICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gOSksDQogICAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSA4KSwNCiAgICAgICAgbGVnZW5kLmtleSA9IGVsZW1lbnRfcmVjdChmaWxsID0gYWxwaGEoIndoaXRlIiwgMC4wKSkpDQoNCg0KIyBtdWx0aXBhbm5lbCBwbG90DQpnZ2FycmFuZ2UoY29udHJvbC5wbG90LCB0cmVhdG1lbnQucGxvdCwNCiAgICAgICAgICBoZWlnaHRzID0gYygxLjUsMS41KSwNCiAgICAgICAgICB3aWR0aHMgPSBjKDQsNCksDQogICAgICAgICAgbmNvbCA9IDIsIG5yb3cgPSAxKQ0KDQoNCmBgYA0KDQoqKkZpZ3VyZSBTMyoqLiBFdmlkZW5jZSBmb3IgYSBtZWFuLXZhcmlhbmNlIHJlbGF0aW9uc2hpcCBpbiB0aGUgZGF0YXNldC4gRGF0YSBzaG93biBmb3IgZWFjaCB0cmFpdCBjbGFzcyBpbiBjb250cm9sIChBKSBhbmQgdHJlYXRtZW50IGdyb3VwcyAoQikuIExpbmVzIGNvcnJlc3BvbmQgdG8gbGluZWFyIHJlZ3Jlc3Npb25zIGJldHdlZW4gbG9nIHNhbXBsZSBtZWFucyAnbG4obWVhbiknIGFuZCBsb2cgc2FtcGxlIHN0YW5kYXJkIGRldmlhdGlvbnMgJ2xuKFNEKScuIERhdGEgdXNlZCBjb3JyZXNwb25kIHRvIHJhdGlvIHNjYWxlIGRhdGEgb25seS4gDQoNCiMjIFIgU2Vzc2lvbiBJbmZvcm1hdGlvbg0KDQpSIHNlc3Npb24gaW5mb3JtYXRpb24gZGV0YWlsaW5nIHRoZSB2ZXJzaW9ucyBhbmQgcGFja2FnZXMgdXNlZCBpbiB0aGlzIHNjcmlwdCBmb3IgcmVwcm9kdWNpYmlsaXR5IHB1cnBvc2VzLg0KDQpgYGB7cn0NCnNlc3Npb25JbmZvKCkgJT4lIHBhbmRlcigpDQpgYGANCg0KIyMgUmVmZXJlbmNlcw0KQWNhc3Vzby1SaXZlcm8sIEMuLCBNdXJyZW4sIEMuSi4sIFNjaGxpY2h0aW5nLCBDLkQuLCBTdGVpbmVyLCBVLksuLCAyMDE5LiBBZGFwdGl2ZSBwaGVub3R5cGljIHBsYXN0aWNpdHkgZm9yIGxpZmUtaGlzdG9yeSBhbmQgbGVzcyBmaXRuZXNzLXJlbGF0ZWQgdHJhaXRzLiBQcm9jLiBSLiBTb2MuIEIgQmlvbC4gU2NpLiAyODYsIDIwMTkwNjUzLiBodHRwczovL2RvaS5vcmcvMTAuMTA5OC9yc3BiLjIwMTkuMDY1Mw0KDQpCb25ldHQsIEQuRy4sIDIwMDkuIE1ldGEtYW5hbHl0aWMgaW50ZXJ2YWwgZXN0aW1hdGlvbiBmb3Igc3RhbmRhcmRpemVkIGFuZCB1bnN0YW5kYXJkaXplZCBtZWFuIGRpZmZlcmVuY2VzLiBQc3ljaG9sLiBNZXRob2RzIDE0LCAyMjVcLTIzOC4gaHR0cHM6Ly9kb2kub3JnLzEwLjEwMzcvYTAwMTY2MTkNCg0KQm9uZXR0LCBELkcuLCAyMDA4LiBDb25maWRlbmNlIGludGVydmFscyBmb3Igc3RhbmRhcmRpemVkIGxpbmVhciBjb250cmFzdHMgb2YgbWVhbnMuIFBzeWNob2wuIE1ldGhvZHMgMTMsIDk5XC0xMDkuIGh0dHBzOi8vZG9pLm9yZy8xMC4xMDM3LzEwODItOTg5WC4xMy4yLjk5DQoNCkNvaGVuLCBKLiwgMTk4OC4gU3RhdGlzdGljYWwgcG93ZXIgYW5hbHlzaXMgZm9yIHRoZSBiZWhhdmlvcmFsIHNjaWVuY2VzLCAybmQgZWQuIGVkLiBMLiBFcmxiYXVtIEFzc29jaWF0ZXMsIEhpbGxzZGFsZSwgTi5KLg0KDQpFeWNrLCBILkouRi4sIEJ1Y2hhbmFuLCBLLkwuLCBDcmlubywgTy5MLiwgSmVzc29wLCBULlMuLCAyMDE5LiBFZmZlY3RzIG9mIGRldmVsb3BtZW50YWwgc3RyZXNzIG9uIGFuaW1hbCBwaGVub3R5cGUgYW5kIHBlcmZvcm1hbmNlOiBhIHF1YW50aXRhdGl2ZSByZXZpZXcuIEJpb2wuIFJldi4gOTQsIDExNDNcLTExNjAuIGh0dHBzOi8vZG9pLm9yZy8xMC4xMTExL2Jydi4xMjQ5Ng0KDQpIZWRnZXMsIEwuVi4sIDE5ODEuIERpc3RyaWJ1dGlvbiBUaGVvcnkgZm9yIEdsYXNzXCdzIEVzdGltYXRvciBvZiBFZmZlY3Qgc2l6ZSBhbmQgUmVsYXRlZCBFc3RpbWF0b3JzLiBKLiBFZHVjLiBTdGF0LiA2LCAxMDdcLTEyOC4gaHR0cHM6Ly9kb2kub3JnLzEwLjMxMDIvMTA3Njk5ODYwMDYwMDIxMDcNCg0KSGluY2hsaWZmLCBDLkUuLCBTbWl0aCwgUy5BLiwgQWxsbWFuLCBKLkYuLCBCdXJsZWlnaCwgSi5HLiwgQ2hhdWRoYXJ5LCBSLiwgQ29naGlsbCwgTC5NLiwgQ3JhbmRhbGwsIEsuQS4sIERlbmcsIEouLCBEcmV3LCBCLlQuLCBHYXppcywgUi4sIEd1ZGUsIEsuLCBIaWJiZXR0LCBELlMuLCBLYXR6LCBMLkEuLCBMYXVnaGluZ2hvdXNlLCBILkQuLCBNY1RhdmlzaCwgRS5KLiwgTWlkZm9yZCwgUC5FLiwgT3dlbiwgQy5MLiwgUmVlLCBSLkguLCBSZWVzLCBKLkEuLCBTb2x0aXMsIEQuRS4sIFdpbGxpYW1zLCBULiwgQ3JhbnN0b24sIEsuQS4sIDIwMTUuIFN5bnRoZXNpcyBvZiBwaHlsb2dlbnkgYW5kIHRheG9ub215IGludG8gYSBjb21wcmVoZW5zaXZlIHRyZWUgb2YgbGlmZS4gUHJvYy4gTmF0bC4gQWNhZC4gU2NpLiAxMTIsIDEyNzY0XC0xMjc2OS4gaHR0cHM6Ly9kb2kub3JnLzEwLjEwNzMvcG5hcy4xNDIzMDQxMTEyDQoNCkhvdWxlLCBELiwgUGVsYWJvbiwgQy4sIFdhZ25lciwgRy5QLiwgSGFuc2VuLCBULkYuLCAyMDExLiBNZWFzdXJlbWVudCBhbmQgTWVhbmluZyBpbiBCaW9sb2d5LiBUaGUgUXVhcnRlcmx5IFJldmlldyBvZiBCaW9sb2d5IDg2LCAzXOKAkzM0LiBodHRwczovL2RvaS5vcmcvMTAuMTA4Ni82NTg0MDgNCg0KTmFrYWdhd2EsIFMuLCBQb3VsaW4sIFIuLCBNZW5nZXJzZW4sIEsuLCBSZWluaG9sZCwgSy4sIEVuZ3F2aXN0LCBMLiwgTGFnaXN6LCBNLiwgU2VuaW9yLCBBLk0uLCAyMDE1LiBNZXRhLWFuYWx5c2lzIG9mIHZhcmlhdGlvbjogZWNvbG9naWNhbCBhbmQgZXZvbHV0aW9uYXJ5IGFwcGxpY2F0aW9ucyBhbmQgYmV5b25kLiBNZXRob2RzIEVjb2wuIEV2b2wuIDYsIDE0M1wtMTUyLiBodHRwczovL2RvaS5vcmcvMTAuMTExMS8yMDQxLTIxMFguMTIzMDkNCg0KTmFrYWdhd2EsIFMuLCBTYW50b3MsIEUuUy5BLiwgMjAxMi4gTWV0aG9kb2xvZ2ljYWwgaXNzdWVzIGFuZCBhZHZhbmNlcyBpbiBiaW9sb2dpY2FsIG1ldGEtYW5hbHlzaXMuIEV2b2wuIEVjb2wuIDI2LCAxMjUzXC0xMjc0LiBodHRwczovL2RvaS5vcmcvMTAuMTAwNy9zMTA2ODItMDEyLTk1NTUtNQ0KDQpPdXp6YW5pLCBNLiwgSGFtbWFkeSwgSC4sIEZlZG9yb3dpY3osIFouLCBFbG1hZ2FybWlkLCBBLiwgMjAxNi4gUmF5eWFuIFwtIGEgd2ViIGFuZCBtb2JpbGUgYXBwIGZvciBzeXN0ZW1hdGljIHJldmlld3MuIFN5c3RlbWF0aWMgUmV2aWV3cyA1LCAyMTAuIGh0dHBzOi8vZG9pLm9yZy8xMC4xMTg2L3MxMzY0My0wMTYtMDM4NC00DQoNClNhbmNoZXotVG9qYXIsIEEuLCBNb3JhbiwgTi5QLiwgT1wnRGVhLCBSLkUuLCBSZWluaG9sZCwgSy4sIE5ha2FnYXdhLCBTLiwgMjAxOS4gTWF0ZXJpYWxzIGZvciBcJ0lsbHVzdHJhdGluZyB0aGUgaW1wb3J0YW5jZSBvZiBtZXRhLWFuYWx5c2luZyB2YXJpYW5jZXMgYWxvbmdzaWRlIG1lYW5zIGluIGVjb2xvZ3kgYW5kIGV2b2x1dGlvbi5cJyBPcGVuIFNjaS4gRnJhbWV3LiBodHRwczovL2RvaS5vcmcvMTAuMTc2MDUvT1NGLklPL1lKVUE4DQoNClZpZWNodGJhdWVyLCBXLiwgMjAxMC4gQ29uZHVjdGluZyBNZXRhLUFuYWx5c2VzIGluIFIgd2l0aCB0aGUgbWV0YWZvciBQYWNrYWdlLiBKLiBTdGF0LiBTb2Z0dy4gMzYsIDFc4oCTNDguIGh0dHBzOi8vZG9pLm9yZy8xMC4xODYzNy9qc3MudjAzNi5pMDM=