1 Picking a Chart Type

https://www.data-to-viz.com

5 Font

You can download the lab fonts for figures here1: https://drive.google.com/drive/u/0/folders/1fqlrnEe7NFnWZoIrsHmr8ulDS4nhs-H3

5.1 Preamble

5.1.1 Install Libraries

#install.packages("remotes")
#remotes::install_github("DevPsyLab/petersenlab")

5.1.2 Load Libraries

library("petersenlab")
library("ellipse")
library("ggplot2")
library("grid")
library("reshape")
library("plyr")
library("RColorBrewer")
library("reshape2")
library("ggExtra")
library("viridis")
library("ggthemes")
library("ggpubr")

5.2 Simulate Data

set.seed(52242)

n <- 1000

predictor <- rbeta(n, 1.5, 5) * 100
outcome <- predictor + rnorm(n, mean = 0, sd = 20) + 50
number <- sample(1:1000, replace = TRUE)

predictorOverplot <- sample(1:50, n, replace = TRUE)
outcomeOverplot <- predictorOverplot + sample(1:75, n, replace = TRUE)

df <- data.frame(predictor = predictor,
                 outcome = outcome,
                 predictorOverplot = predictorOverplot,
                 outcomeOverplot = outcomeOverplot)

df[sample(1:n, size = 10), "predictor"] <- NA
df[sample(1:n, size = 10), "outcome"] <- NA
df[sample(1:n, size = 10), "predictorOverplot"] <- NA
df[sample(1:n, size = 10), "outcomeOverplot"] <- NA

5.3 Line

plot.new()
lines(
  x = seq(from = -10, to = 10, length.out = 100),
  y = seq(from = -25, to = 25, length.out = 100))

5.4 Curve

curve(x^3 - 3*x, from = -2, to = 2)
curve(x^2 - 2, add = TRUE, col = "violet")

5.5 Basic Scatterplot

5.5.1 Base R

plot(outcome ~ predictor, data = df)

plot(df$predictor, df$outcome)

5.5.1.1 Best-fit line

plot(outcome ~ predictor, data = df)
abline(lm(outcome ~ predictor, data = df), col = "red") #regression line (y~x)

5.5.1.2 Best-fit line with correlation coefficient

plot(outcome ~ predictor, data = df)
abline(lm(outcome ~ predictor, data = df), col = "red") #regression line (y~x)
addText(x = df$predictor, y = df$outcome)

5.5.1.3 Loess line

plot(outcome ~ predictor, data = df)
lines(loess.smooth(df$predictor, df$outcome)) #loess line (x,y)

5.5.2 ggplot2

ggplot(df, aes(x = predictor, y = outcome)) +
  geom_point() +
  theme_classic()

5.5.2.1 Best-fit line

ggplot(df, aes(x = predictor, y = outcome)) +
  geom_point() +
  stat_smooth(method = "lm", formula = y ~ x) +
  theme_classic()

5.5.2.2 Best-fit line with correlation coefficient

ggplot(df, aes(x = predictor, y = outcome)) +
  geom_point() +
  stat_smooth(method = "lm", formula = y ~ x) +
  stat_cor(
    cor.coef.name = "r",
    p.accuracy = 0.001,
    r.accuracy = 0.01) +
  theme_classic()

5.5.2.3 Loess line

ggplot(df, aes(x = predictor, y = outcome)) +
  geom_point() +
  stat_smooth(method = "loess", formula = y ~ x) +
  theme_classic()

5.6 Change Plot Style

5.6.1 Change Theme

basePlot <- ggplot(df, aes(x = predictor, y = outcome)) +
  geom_point()

5.6.1.1 Default Theme

basePlot

5.6.1.2 Grayscale: theme_gray()

basePlot + theme_gray() + theme(text = element_text(family = "Gotham"))

5.6.1.3 Black-and-White: theme_bw()

basePlot + theme_bw() + theme(text = element_text(family = "Gotham"))

5.6.1.4 Line Drawing: theme_linedraw()

A theme with only black lines of various widths on white backgrounds, reminiscent of a line drawing. Note that this theme has some very thin lines (<< 1 pt) which some journals may refuse.

basePlot + theme_linedraw() + theme(text = element_text(family = "Gotham"))

5.6.1.5 Light: theme_light()

basePlot + theme_light() + theme(text = element_text(family = "Gotham"))

5.6.1.6 Dark: theme_dark()

basePlot + theme_dark() + theme(text = element_text(family = "Gotham"))

5.6.1.7 Minimal: theme_minimal()

basePlot + theme_minimal() + theme(text = element_text(family = "Gotham"))

5.6.1.8 Classic: theme_classic()

basePlot + theme_classic() + theme(text = element_text(family = "Gotham"))

5.6.1.9 A Completely Empty Theme: theme_void()

basePlot + theme_void() + theme(text = element_text(family = "Gotham"))

5.6.1.10 Visual Unit Tests: theme_test()

basePlot + theme_test() + theme(text = element_text(family = "Gotham"))

5.6.1.11 Edward Tufte: theme_tufte()

Theme based on Edward Tufte.

basePlot + theme_tufte()

5.6.1.12 Wall Street Journal: theme_wsj()

Theme based on the publication, the Wall Street Journal.

basePlot + theme_wsj()

5.6.1.13 FiveThirtyEight: theme_fivethirtyeight()

Theme based on the publication, FiveThirtyEight.

basePlot + theme_fivethirtyeight()

5.6.1.14 The Economist: theme_economist()

Theme based on the publication, The Economist.

basePlot + theme_economist()

5.6.1.15 Stephen Few: theme_few()

Theme based on the rules and examples from Stephen Few’s Show Me the Numbers and “Practical Rules for Using Color in Charts”.

basePlot + theme_few()

5.7 Add Marginal Distributions

scatterplot <- ggplot(df, aes(x = predictor, y = outcome)) +
  geom_point() +
  theme_classic() +
  theme(text = element_text(family = "Gotham"))

5.7.1 Density Plot

densityMarginal <- ggMarginal(scatterplot, type = "density", xparams = list(fill = "gray"), yparams = list(fill = "gray"))
print(densityMarginal, newpage = TRUE)

5.7.2 Histogram

histogramMarginal <- ggMarginal(scatterplot, type = "histogram", xparams = list(fill = "gray"), yparams = list(fill = "gray"))
print(histogramMarginal, newpage = TRUE)

5.7.3 Boxplot

boxplotMarginal <- ggMarginal(scatterplot, type = "boxplot", xparams = list(fill = "gray"), yparams = list(fill = "gray"))
print(boxplotMarginal, newpage = TRUE)

5.7.4 Violin Plot

violinMarginal <- ggMarginal(scatterplot, type = "violin", xparams = list(fill = "gray"), yparams = list(fill = "gray"))
print(violinMarginal, newpage = TRUE)

5.7.5 Density Plot and Histogram

densigramMarginal <- ggMarginal(scatterplot, type = "densigram", xparams = list(fill = "gray"), yparams = list(fill = "gray"))
print(densigramMarginal, newpage = TRUE)

5.8 Ellipse

5.8.1 Basic Ellipse

ggplot(df, aes(x = predictor, y = outcome)) +
  geom_point() +
  stat_ellipse(alpha = 0.4, level = 0.95, geom = "polygon", fill = "red", color = "red") +
  theme_classic() +
  theme(text = element_text(family = "Gotham"))

5.8.2 Align Coordinates

ggplot(df, aes(x = predictor, y = outcome)) +
  geom_point() +
  stat_ellipse(alpha = 0.4, level = 0.95, geom = "polygon", fill = "red", color = "red") +
  scale_x_continuous(expand = c(0, 0)) +
  scale_y_continuous(expand = c(0, 0)) +
  coord_fixed(ratio = (max(predictor, na.rm = TRUE) - min(predictor, na.rm = TRUE))/(max(outcome, na.rm = TRUE) - min(outcome, na.rm = TRUE)),
              xlim = c(0, max(predictor, na.rm = TRUE)), 
              ylim = c(0, max(outcome, na.rm = TRUE))) +
  theme_classic() +
  theme(text = element_text(family = "Gotham"))

5.8.3 Reduce Dot Size

ggplot(df, aes(x = predictor, y = outcome)) +
  geom_point(size = 0.5) +
  stat_ellipse(alpha = 0.4, level = 0.95, geom = "polygon", fill = "red", color = "red") +
  scale_x_continuous(expand = c(0, 0)) +
  scale_y_continuous(expand = c(0, 0)) +
  coord_fixed(ratio = (max(predictor, na.rm = TRUE) - min(predictor, na.rm = TRUE))/(max(outcome, na.rm = TRUE) - min(outcome, na.rm = TRUE)),
              xlim = c(0, max(predictor, na.rm = TRUE)), 
              ylim = c(0, max(outcome, na.rm = TRUE))) +
  theme_classic() +
  theme(text = element_text(family = "Gotham"))

5.8.4 Transparency

ggplot(df, aes(x = predictor, y = outcome)) +
  geom_point(alpha = 0.3) +
  stat_ellipse(alpha = 0.4, level = 0.95, geom = "polygon", fill = "red", color = "red") +
  scale_x_continuous(expand = c(0, 0)) +
  scale_y_continuous(expand = c(0, 0)) +
  coord_fixed(ratio = (max(predictor, na.rm = TRUE) - min(predictor, na.rm = TRUE))/(max(outcome, na.rm = TRUE) - min(outcome, na.rm = TRUE)),
              xlim = c(0, max(predictor, na.rm = TRUE)), 
              ylim = c(0, max(outcome, na.rm = TRUE))) +
  theme_classic() +
  theme(text = element_text(family = "Gotham"))

5.9 Bubble Chart

5.9.1 Basic Bubble Chart

ggplot(df, aes(x = predictorOverplot, y = outcomeOverplot)) +
  geom_count(aes(size = ..n..)) +
  scale_size_area() +
  theme_classic() +
  theme(text = element_text(family = "Gotham"))

5.9.2 Specify Sizes

ggplot(df, aes(x = predictorOverplot, y = outcomeOverplot)) +
  geom_count(aes(size = ..n..)) +
  scale_size_continuous(breaks = c(1, 2, 3, 4), range = c(1, 7)) +
  theme_classic() +
  theme(text = element_text(family = "Gotham"))

5.10 2-Dimensional Density

ggplot(df, aes(x = predictor, y = outcome)) +
  stat_density_2d(aes(fill = ..density..), geom = "raster", contour = FALSE) +
  scale_x_continuous(expand = c(0, 0)) +
  scale_y_continuous(expand = c(0, 0)) +
  scale_fill_viridis() +
  theme(
    legend.position = "none",
    text = element_text(family = "Gotham")
  )

5.11 Combined Ellipse and Bubble Chart

5.11.1 ggplot2

ggplot(df, aes(x = predictorOverplot, y = outcomeOverplot)) +
  geom_count(alpha = .6, color = rgb(0,0,.7,.5)) +
  scale_size_continuous(breaks = c(1, 2, 3, 4), range = c(1, 7)) +
  stat_smooth(method = "loess", se = TRUE, color = "green") + 
  stat_smooth(method = "lm") +
  stat_ellipse(alpha = 0.4, level = 0.95, geom = "polygon", fill = "red", color = "red") +
  scale_x_continuous(expand = c(0, 0)) +
  scale_y_continuous(expand = c(0, 0)) +
  coord_fixed(ratio = (max(predictorOverplot, na.rm = TRUE) - min(predictorOverplot, na.rm = TRUE))/(max(outcomeOverplot, na.rm = TRUE) - min(outcomeOverplot, na.rm = TRUE)),
              xlim = c(0, max(predictorOverplot, na.rm = TRUE)), 
              ylim = c(0, max(outcomeOverplot, na.rm = TRUE))) +
  theme_classic() +
  theme(text = element_text(family = "Gotham"))
`geom_smooth()` using formula = 'y ~ x'
`geom_smooth()` using formula = 'y ~ x'

ggplot(df, aes(x = predictorOverplot, y = outcomeOverplot)) +
  geom_count(alpha = .6, color = rgb(0,0,.7,.5)) +
  scale_size_continuous(breaks = c(1, 2, 3, 4), range = c(1, 7)) +
  stat_smooth(method = "loess", se = TRUE, color = "green") + 
  stat_smooth(method = "lm") +
  stat_ellipse(color = "red", size = 1.5) +
  scale_x_continuous(expand = c(0, 0)) +
  scale_y_continuous(expand = c(0, 0)) +
  coord_fixed(ratio = (max(predictorOverplot, na.rm = TRUE) - min(predictorOverplot, na.rm = TRUE))/(max(outcomeOverplot, na.rm = TRUE) - min(outcomeOverplot, na.rm = TRUE)),
              xlim = c(0, max(predictorOverplot, na.rm = TRUE)), 
              ylim = c(0, max(outcomeOverplot, na.rm = TRUE))) +
  theme_classic() +
  theme(text = element_text(family = "Gotham"))
`geom_smooth()` using formula = 'y ~ x'
`geom_smooth()` using formula = 'y ~ x'

5.11.2 Other implementation

From: https://stats.stackexchange.com/questions/7899/complex-regression-plot-in-r

5.11.2.1 ggplot2

df$x <- df$predictorOverplot
df$y <- df$outcomeOverplot

xc <- with(df, xyTable(x, y))
df2 <- cbind.data.frame(x = xc$x, y = xc$y, number = xc$number)
df2$n <- cut(df2$number, c(0,1.5,2.5,Inf), labels = c(1,2,4))
df.ell <- as.data.frame(with(df, ellipse(cor(df$x, df$y, use = "pairwise.complete.obs"),
                                         scale = c(sd(df$x, na.rm = TRUE), sd(df$y, na.rm = TRUE)),
                                         centre = c(mean(df$x, na.rm = TRUE), mean(df$y, na.rm = TRUE)),
                                         level = .95)))

ggplot(data = na.omit(df2), aes(x = x, y = y)) + 
  geom_point(aes(size = n), alpha = .6, color = rgb(0,0,.7,.5)) + 
  stat_smooth(data = df, method = "loess", se = FALSE, color = "green") + 
  stat_smooth(data = df, method = "lm", col = "red") +
  geom_path(data = df.ell, colour = "green", size = 1) +
  coord_cartesian(xlim = c(-1,60), ylim = c(-1,130))
`geom_smooth()` using formula = 'y ~ x'
`geom_smooth()` using formula = 'y ~ x'

5.11.2.2 Base R

do.it <- function(df, type="confidence", ...) {
  require(ellipse)
  lm0 <- lm(y ~ x, data=df)
  xc <- with(df, xyTable(x, y))
  df.new <- data.frame(x = seq(min(df$x), max(df$x), 0.1))
  pred.ulb <- predict(lm0, df.new, interval = type)
  pred.lo <- predict(loess(y ~ x, data = df), df.new)
  plot(xc$x, xc$y, cex = xc$number*1/4, xlab = "x", ylab = "y", ...) #change number*X to change dot size
  abline(lm0, col = "red")
  lines(df.new$x, pred.lo, col="green", lwd = 2)
  lines(df.new$x, pred.ulb[,"lwr"], lty = 2, col = "red")
  lines(df.new$x, pred.ulb[,"upr"], lty = 2, col = "red")    
  lines(ellipse(cor(df$x, df$y), scale=c(sd(df$x),sd(df$y)), 
                centre = c(mean(df$x), mean(df$y)), level = .95), lwd = 2, col = "green")
  invisible(lm0)
}

df3 <- na.omit(df[sample(nrow(df), nrow(df), rep = TRUE),])
df3$x <- df3$predictorOverplot
df3$y <- df3$outcomeOverplot

do.it(df3, pch = 19, col = rgb(0,0,.7,.5))

5.12 Visually-Weighted Regression

5.12.1 Default

vwReg(outcome ~ predictor, data = df)

5.12.2 Shade

vwReg(outcome ~ predictor, data = df, shade = TRUE, spag = FALSE, show.lm = TRUE, show.CI = TRUE, bw = FALSE, B = 1000, quantize = "continuous")

vwReg(outcome ~ predictor, data = df, shade = TRUE, spag = FALSE, show.lm = TRUE, show.CI = TRUE, bw = FALSE, B = 1000, quantize = "SD")

5.12.3 Spaghetti

vwReg(outcome ~ predictor, data = df, shade = FALSE, spag = TRUE, show.lm = TRUE, show.CI = TRUE, bw = FALSE, B = 1000)

vwReg(outcome ~ predictor, data = df, shade = FALSE, spag = TRUE, show.lm = FALSE, show.CI = FALSE, bw = FALSE, B = 1000)

5.12.4 Black/white

vwReg(outcome ~ predictor, data = df, shade = TRUE, spag = FALSE, show.lm = TRUE, show.CI = TRUE, bw = TRUE, B = 1000, quantize = "continuous")

vwReg(outcome ~ predictor, data = df, shade = TRUE, spag = FALSE, show.lm = TRUE, show.CI = TRUE, bw = TRUE, B = 1000, quantize = "SD")

vwReg(outcome ~ predictor, data = df, shade = FALSE, spag = TRUE, show.lm = TRUE, show.CI = TRUE, bw = TRUE, B = 1000, quantize = "SD")

6 Graphic Design Principles for Data Visualization

https://www.data-to-viz.com/caveats.html

7 Types of Plots

7.1 Univariate Distribution

Used for: distribution of one numeric variable

7.2 Bivariate Scatterplots

Used for: association between two numeric variables

7.2.1 Base R

plot(x, y)

7.2.2 ggplot2 package

http://www.cookbook-r.com/Graphs/Scatterplots_(ggplot2)/

ggplot(data, aes(x, y)) +
    geom_point()

7.3 Bivariate Barplots

Used for: association between one categorical variable and one numeric variable (or for depicting the frequency of categories of a categorical variable)

7.4 Multivariate Correlation Matrices

Used for: association between multiple numeric variables

For correlation matrices, I do the following:

  1. I use the lab’s cor.table() function (with type = "manuscript") from the petersenlab package to create a correlation matrix.
  2. I save the correlation matrix to a .csv file.
    1. For example: https://research-git.uiowa.edu/PetersenLab/SRS/SRS-SelfRegulationDevelopment/-/blob/master/Analyses/selfRegulationDevelopment.Rmd#self-regulation-measures
  3. I open the .csv file in Excel and create the table in Excel that can be copied and pasted to Word/Powerpoint/etc.

7.5 Path Diagrams

Used for: SEM/CFA/path analysis

If you are just trying to visualize the results of a SEM model fitted using the lavaan package, I recommend the semPlot package (http://sachaepskamp.com/semPlot/examples) in R. You can see examples of my implementation here: https://isaactpetersen.github.io/Principles-Psychological-Assessment/sem.html#semModelPathDiagram-sem

If you are trying to create a figure for a paper or poster, you might want something that you can draw and customize yourself. I use Adobe Illustrator for hand-drawn figures.

You can look at various options below:

8 Color Palettes

8.3 Qualitative/Categorical

Color palettes for color-blindness:

8.3.1 8 Colors

# From here: https://github.com/clauswilke/colorblindr/blob/master/R/palettes.R
# Two color palettes taken from the article ["Color Universal Design" by Okabe and Ito](https://web.archive.org/web/20210108233739/http://jfly.iam.u-tokyo.ac.jp/color/)
# The variant `palette_OkabeIto` contains a gray color, while `palette_OkabeIto_black` contains black instead

palette_OkabeIto <- c("#E69F00", "#56B4E9", "#009E73", "#F0E442", "#0072B2", "#D55E00", "#CC79A7", "#999999")

pie(rep(1, 8), col = palette_OkabeIto)

palette_OkabeIto_black <- c("#E69F00", "#56B4E9", "#009E73", "#F0E442", "#0072B2", "#D55E00", "#CC79A7", "#000000")

pie(rep(1, 8), col = palette_OkabeIto_black)

8.3.2 25 Colors

https://stackoverflow.com/a/9568659 (archived at https://perma.cc/5ALZ-3AQD)

c25 <- c(
  "dodgerblue2", "#E31A1C", # red
  "green4",
  "#6A3D9A", # purple
  "#FF7F00", # orange
  "black", "gold1",
  "skyblue2", "#FB9A99", # lt pink
  "palegreen2",
  "#CAB2D6", # lt purple
  "#FDBF6F", # lt orange
  "gray70", "khaki2",
  "maroon", "orchid1", "deeppink1", "blue1", "steelblue4",
  "darkturquoise", "green1", "yellow4", "yellow3",
  "darkorange4", "brown"
)
pie(rep(1, 25), col = c25)

8.3.3 36 Colors

# from: Polychrome::palette36.colors(36)

c36 <- c("#5A5156","#E4E1E3","#F6222E","#FE00FA","#16FF32","#3283FE","#FEAF16","#B00068","#1CFFCE","#90AD1C","#2ED9FF","#DEA0FD","#AA0DFE","#F8A19F","#325A9B","#C4451C","#1C8356","#85660D","#B10DA1","#FBE426","#1CBE4F","#FA0087",
"#FC1CBF","#F7E1A0","#C075A6","#782AB6","#AAF400","#BDCDFF","#822E1C","#B5EFB5","#7ED7D1","#1C7F93","#D85FF7","#683B79","#66B0FF","#3B00FB")

pie(rep(1, 36), col = c36)

9 Session Info

sessionInfo()
R version 4.4.2 (2024-10-31)
Platform: x86_64-pc-linux-gnu
Running under: Ubuntu 22.04.5 LTS

Matrix products: default
BLAS:   /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 
LAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so;  LAPACK version 3.10.0

locale:
 [1] LC_CTYPE=C.UTF-8       LC_NUMERIC=C           LC_TIME=C.UTF-8       
 [4] LC_COLLATE=C.UTF-8     LC_MONETARY=C.UTF-8    LC_MESSAGES=C.UTF-8   
 [7] LC_PAPER=C.UTF-8       LC_NAME=C              LC_ADDRESS=C          
[10] LC_TELEPHONE=C         LC_MEASUREMENT=C.UTF-8 LC_IDENTIFICATION=C   

time zone: UTC
tzcode source: system (glibc)

attached base packages:
[1] grid      stats     graphics  grDevices utils     datasets  methods  
[8] base     

other attached packages:
 [1] ggpubr_0.6.0       ggthemes_5.1.0     viridis_0.6.5      viridisLite_0.4.2 
 [5] ggExtra_0.10.1     reshape2_1.4.4     RColorBrewer_1.1-3 plyr_1.8.9        
 [9] reshape_0.8.9      ggplot2_3.5.1      ellipse_0.5.0      petersenlab_1.1.0 

loaded via a namespace (and not attached):
 [1] tidyselect_1.2.1  psych_2.4.6.26    farver_2.1.2      dplyr_1.1.4      
 [5] fastmap_1.2.0     promises_1.3.0    digest_0.6.37     rpart_4.1.23     
 [9] mime_0.12         lifecycle_1.0.4   cluster_2.1.6     magrittr_2.0.3   
[13] compiler_4.4.2    rlang_1.1.4       Hmisc_5.2-0       sass_0.4.9       
[17] tools_4.4.2       utf8_1.2.4        yaml_2.3.10       data.table_1.16.2
[21] knitr_1.49        ggsignif_0.6.4    labeling_0.4.3    htmlwidgets_1.6.4
[25] mnormt_2.1.1      abind_1.4-8       miniUI_0.1.1.1    foreign_0.8-87   
[29] withr_3.0.2       purrr_1.0.2       nnet_7.3-19       stats4_4.4.2     
[33] fansi_1.0.6       lavaan_0.6-19     xtable_1.8-4      colorspace_2.1-1 
[37] MASS_7.3-61       scales_1.3.0      cli_3.6.3         mvtnorm_1.3-2    
[41] rmarkdown_2.29    generics_0.1.3    rstudioapi_0.17.1 DBI_1.2.3        
[45] cachem_1.1.0      stringr_1.5.1     splines_4.4.2     parallel_4.4.2   
[49] base64enc_0.1-3   mitools_2.4       vctrs_0.6.5       Matrix_1.7-1     
[53] carData_3.0-5     jsonlite_1.8.9    car_3.1-3         rstatix_0.7.2    
[57] Formula_1.2-5     htmlTable_2.4.3   tidyr_1.3.1       jquerylib_0.1.4  
[61] glue_1.8.0        stringi_1.8.4     gtable_0.3.6      later_1.3.2      
[65] quadprog_1.5-8    munsell_0.5.1     tibble_3.2.1      pillar_1.9.0     
[69] htmltools_0.5.8.1 R6_2.5.1          mix_1.0-12        evaluate_1.0.1   
[73] shiny_1.9.1       pbivnorm_0.6.0    lattice_0.22-6    backports_1.5.0  
[77] broom_1.0.7       httpuv_1.6.15     bslib_0.8.0       Rcpp_1.0.13-1    
[81] gridExtra_2.3     nlme_3.1-166      checkmate_2.3.2   mgcv_1.9-1       
[85] xfun_0.49         pkgconfig_2.0.3  

  1. Ask me to give you access.↩︎

LS0tCnRpdGxlOiAiRmlndXJlcyBpbiBSIgotLS0KCmBgYHtyIHNldHVwLCBpbmNsdWRlID0gRkFMU0V9CmtuaXRyOjpvcHRzX2NodW5rJHNldCgKICBlY2hvID0gVFJVRSwKICBlcnJvciA9IFRSVUUsCiAgd2FybmluZyA9IEZBTFNFLAogIGNvbW1lbnQgPSAiIikKYGBgCgojIFBpY2tpbmcgYSBDaGFydCBUeXBlCgpodHRwczovL3d3dy5kYXRhLXRvLXZpei5jb20KCiMgR2FsbGVyeQoKaHR0cHM6Ly93d3cuci1ncmFwaC1nYWxsZXJ5LmNvbQoKIyBSZXNvdXJjZXMgZm9yIExlYXJuaW5nIGBSYCBTeW50YXggZm9yIEZpZ3VyZXMKCmh0dHBzOi8vd3d3LnN0YXRtZXRob2RzLm5ldC9ncmFwaHMvaW5kZXguaHRtbAoKaHR0cDovL3d3dy5jb29rYm9vay1yLmNvbS9HcmFwaHMvCgojIFBldGVyc2VuIExhYiBFeGFtcGxlcwoKaHR0cHM6Ly9yZXNlYXJjaC1naXQudWlvd2EuZWR1L1BldGVyc2VuTGFiL1ItUGxvdHRpbmcvLS90cmVlL21haW4vQW5hbHlzZXMKCiMgRm9udAoKWW91IGNhbiBkb3dubG9hZCB0aGUgbGFiIGZvbnRzIGZvciBmaWd1cmVzIGhlcmVbXjFdOiBodHRwczovL2RyaXZlLmdvb2dsZS5jb20vZHJpdmUvdS8wL2ZvbGRlcnMvMWZxbHJuRWU3TkZuV1pvSXJzSG1yOHVsRFM0bmhzLUgzCgojIyBQcmVhbWJsZQoKIyMjIEluc3RhbGwgTGlicmFyaWVzCgpgYGB7cn0KI2luc3RhbGwucGFja2FnZXMoInJlbW90ZXMiKQojcmVtb3Rlczo6aW5zdGFsbF9naXRodWIoIkRldlBzeUxhYi9wZXRlcnNlbmxhYiIpCmBgYAoKIyMjIExvYWQgTGlicmFyaWVzCgpgYGB7ciwgbWVzc2FnZSA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0V9CmxpYnJhcnkoInBldGVyc2VubGFiIikKbGlicmFyeSgiZWxsaXBzZSIpCmxpYnJhcnkoImdncGxvdDIiKQpsaWJyYXJ5KCJncmlkIikKbGlicmFyeSgicmVzaGFwZSIpCmxpYnJhcnkoInBseXIiKQpsaWJyYXJ5KCJSQ29sb3JCcmV3ZXIiKQpsaWJyYXJ5KCJyZXNoYXBlMiIpCmxpYnJhcnkoImdnRXh0cmEiKQpsaWJyYXJ5KCJ2aXJpZGlzIikKbGlicmFyeSgiZ2d0aGVtZXMiKQpsaWJyYXJ5KCJnZ3B1YnIiKQpgYGAKCiMjIFNpbXVsYXRlIERhdGEKCmBgYHtyfQpzZXQuc2VlZCg1MjI0MikKCm4gPC0gMTAwMAoKcHJlZGljdG9yIDwtIHJiZXRhKG4sIDEuNSwgNSkgKiAxMDAKb3V0Y29tZSA8LSBwcmVkaWN0b3IgKyBybm9ybShuLCBtZWFuID0gMCwgc2QgPSAyMCkgKyA1MApudW1iZXIgPC0gc2FtcGxlKDE6MTAwMCwgcmVwbGFjZSA9IFRSVUUpCgpwcmVkaWN0b3JPdmVycGxvdCA8LSBzYW1wbGUoMTo1MCwgbiwgcmVwbGFjZSA9IFRSVUUpCm91dGNvbWVPdmVycGxvdCA8LSBwcmVkaWN0b3JPdmVycGxvdCArIHNhbXBsZSgxOjc1LCBuLCByZXBsYWNlID0gVFJVRSkKCmRmIDwtIGRhdGEuZnJhbWUocHJlZGljdG9yID0gcHJlZGljdG9yLAogICAgICAgICAgICAgICAgIG91dGNvbWUgPSBvdXRjb21lLAogICAgICAgICAgICAgICAgIHByZWRpY3Rvck92ZXJwbG90ID0gcHJlZGljdG9yT3ZlcnBsb3QsCiAgICAgICAgICAgICAgICAgb3V0Y29tZU92ZXJwbG90ID0gb3V0Y29tZU92ZXJwbG90KQoKZGZbc2FtcGxlKDE6biwgc2l6ZSA9IDEwKSwgInByZWRpY3RvciJdIDwtIE5BCmRmW3NhbXBsZSgxOm4sIHNpemUgPSAxMCksICJvdXRjb21lIl0gPC0gTkEKZGZbc2FtcGxlKDE6biwgc2l6ZSA9IDEwKSwgInByZWRpY3Rvck92ZXJwbG90Il0gPC0gTkEKZGZbc2FtcGxlKDE6biwgc2l6ZSA9IDEwKSwgIm91dGNvbWVPdmVycGxvdCJdIDwtIE5BCmBgYAoKIyMgTGluZQoKYGBge3J9CnBsb3QubmV3KCkKbGluZXMoCiAgeCA9IHNlcShmcm9tID0gLTEwLCB0byA9IDEwLCBsZW5ndGgub3V0ID0gMTAwKSwKICB5ID0gc2VxKGZyb20gPSAtMjUsIHRvID0gMjUsIGxlbmd0aC5vdXQgPSAxMDApKQpgYGAKCiMjIEN1cnZlCgpgYGB7cn0KY3VydmUoeF4zIC0gMyp4LCBmcm9tID0gLTIsIHRvID0gMikKY3VydmUoeF4yIC0gMiwgYWRkID0gVFJVRSwgY29sID0gInZpb2xldCIpCmBgYAoKIyMgQmFzaWMgU2NhdHRlcnBsb3QKCiMjIyBCYXNlIFIKCmBgYHtyfQpwbG90KG91dGNvbWUgfiBwcmVkaWN0b3IsIGRhdGEgPSBkZikKcGxvdChkZiRwcmVkaWN0b3IsIGRmJG91dGNvbWUpCmBgYAoKIyMjIyBCZXN0LWZpdCBsaW5lCgpgYGB7cn0KcGxvdChvdXRjb21lIH4gcHJlZGljdG9yLCBkYXRhID0gZGYpCmFibGluZShsbShvdXRjb21lIH4gcHJlZGljdG9yLCBkYXRhID0gZGYpLCBjb2wgPSAicmVkIikgI3JlZ3Jlc3Npb24gbGluZSAoeX54KQpgYGAKCiMjIyMgQmVzdC1maXQgbGluZSB3aXRoIGNvcnJlbGF0aW9uIGNvZWZmaWNpZW50CgpgYGB7cn0KcGxvdChvdXRjb21lIH4gcHJlZGljdG9yLCBkYXRhID0gZGYpCmFibGluZShsbShvdXRjb21lIH4gcHJlZGljdG9yLCBkYXRhID0gZGYpLCBjb2wgPSAicmVkIikgI3JlZ3Jlc3Npb24gbGluZSAoeX54KQphZGRUZXh0KHggPSBkZiRwcmVkaWN0b3IsIHkgPSBkZiRvdXRjb21lKQpgYGAKCiMjIyMgTG9lc3MgbGluZQoKYGBge3J9CnBsb3Qob3V0Y29tZSB+IHByZWRpY3RvciwgZGF0YSA9IGRmKQpsaW5lcyhsb2Vzcy5zbW9vdGgoZGYkcHJlZGljdG9yLCBkZiRvdXRjb21lKSkgI2xvZXNzIGxpbmUgKHgseSkKYGBgCgojIyMgYGdncGxvdDJgCgpgYGB7cn0KZ2dwbG90KGRmLCBhZXMoeCA9IHByZWRpY3RvciwgeSA9IG91dGNvbWUpKSArCiAgZ2VvbV9wb2ludCgpICsKICB0aGVtZV9jbGFzc2ljKCkKYGBgCgojIyMjIEJlc3QtZml0IGxpbmUKCmBgYHtyfQpnZ3Bsb3QoZGYsIGFlcyh4ID0gcHJlZGljdG9yLCB5ID0gb3V0Y29tZSkpICsKICBnZW9tX3BvaW50KCkgKwogIHN0YXRfc21vb3RoKG1ldGhvZCA9ICJsbSIsIGZvcm11bGEgPSB5IH4geCkgKwogIHRoZW1lX2NsYXNzaWMoKQpgYGAKCiMjIyMgQmVzdC1maXQgbGluZSB3aXRoIGNvcnJlbGF0aW9uIGNvZWZmaWNpZW50CgpgYGB7cn0KZ2dwbG90KGRmLCBhZXMoeCA9IHByZWRpY3RvciwgeSA9IG91dGNvbWUpKSArCiAgZ2VvbV9wb2ludCgpICsKICBzdGF0X3Ntb290aChtZXRob2QgPSAibG0iLCBmb3JtdWxhID0geSB+IHgpICsKICBzdGF0X2NvcigKICAgIGNvci5jb2VmLm5hbWUgPSAiciIsCiAgICBwLmFjY3VyYWN5ID0gMC4wMDEsCiAgICByLmFjY3VyYWN5ID0gMC4wMSkgKwogIHRoZW1lX2NsYXNzaWMoKQpgYGAKCiMjIyMgTG9lc3MgbGluZQoKYGBge3J9CmdncGxvdChkZiwgYWVzKHggPSBwcmVkaWN0b3IsIHkgPSBvdXRjb21lKSkgKwogIGdlb21fcG9pbnQoKSArCiAgc3RhdF9zbW9vdGgobWV0aG9kID0gImxvZXNzIiwgZm9ybXVsYSA9IHkgfiB4KSArCiAgdGhlbWVfY2xhc3NpYygpCmBgYAoKIyMgQ2hhbmdlIFBsb3QgU3R5bGUKCiMjIyBDaGFuZ2UgVGhlbWUKCmBgYHtyfQpiYXNlUGxvdCA8LSBnZ3Bsb3QoZGYsIGFlcyh4ID0gcHJlZGljdG9yLCB5ID0gb3V0Y29tZSkpICsKICBnZW9tX3BvaW50KCkKYGBgCgojIyMjIERlZmF1bHQgVGhlbWUKCmBgYHtyfQpiYXNlUGxvdApgYGAKCiMjIyMgR3JheXNjYWxlOiBgdGhlbWVfZ3JheSgpYAoKYGBge3J9CmJhc2VQbG90ICsgdGhlbWVfZ3JheSgpICsgdGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSAiR290aGFtIikpCmBgYAoKIyMjIyBCbGFjay1hbmQtV2hpdGU6IGB0aGVtZV9idygpYAoKYGBge3J9CmJhc2VQbG90ICsgdGhlbWVfYncoKSArIHRoZW1lKHRleHQgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gIkdvdGhhbSIpKQpgYGAKCiMjIyMgTGluZSBEcmF3aW5nOiBgdGhlbWVfbGluZWRyYXcoKWAKCkEgdGhlbWUgd2l0aCBvbmx5IGJsYWNrIGxpbmVzIG9mIHZhcmlvdXMgd2lkdGhzIG9uIHdoaXRlIGJhY2tncm91bmRzLCByZW1pbmlzY2VudCBvZiBhIGxpbmUgZHJhd2luZy4KTm90ZSB0aGF0IHRoaXMgdGhlbWUgaGFzIHNvbWUgdmVyeSB0aGluIGxpbmVzICg8PCAxIHB0KSB3aGljaCBzb21lIGpvdXJuYWxzIG1heSByZWZ1c2UuCgpgYGB7cn0KYmFzZVBsb3QgKyB0aGVtZV9saW5lZHJhdygpICsgdGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSAiR290aGFtIikpCmBgYAoKIyMjIyBMaWdodDogYHRoZW1lX2xpZ2h0KClgCgpgYGB7cn0KYmFzZVBsb3QgKyB0aGVtZV9saWdodCgpICsgdGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSAiR290aGFtIikpCmBgYAoKIyMjIyBEYXJrOiBgdGhlbWVfZGFyaygpYAoKYGBge3J9CmJhc2VQbG90ICsgdGhlbWVfZGFyaygpICsgdGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSAiR290aGFtIikpCmBgYAoKIyMjIyBNaW5pbWFsOiBgdGhlbWVfbWluaW1hbCgpYAoKYGBge3J9CmJhc2VQbG90ICsgdGhlbWVfbWluaW1hbCgpICsgdGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSAiR290aGFtIikpCmBgYAoKIyMjIyBDbGFzc2ljOiBgdGhlbWVfY2xhc3NpYygpYAoKYGBge3J9CmJhc2VQbG90ICsgdGhlbWVfY2xhc3NpYygpICsgdGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSAiR290aGFtIikpCmBgYAoKIyMjIyBBIENvbXBsZXRlbHkgRW1wdHkgVGhlbWU6IGB0aGVtZV92b2lkKClgCgpgYGB7cn0KYmFzZVBsb3QgKyB0aGVtZV92b2lkKCkgKyB0aGVtZSh0ZXh0ID0gZWxlbWVudF90ZXh0KGZhbWlseSA9ICJHb3RoYW0iKSkKYGBgCgojIyMjIFZpc3VhbCBVbml0IFRlc3RzOiBgdGhlbWVfdGVzdCgpYAoKYGBge3J9CmJhc2VQbG90ICsgdGhlbWVfdGVzdCgpICsgdGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSAiR290aGFtIikpCmBgYAoKIyMjIyBFZHdhcmQgVHVmdGU6IGB0aGVtZV90dWZ0ZSgpYAoKVGhlbWUgYmFzZWQgb24gRWR3YXJkIFR1ZnRlLgoKYGBge3J9CmJhc2VQbG90ICsgdGhlbWVfdHVmdGUoKQpgYGAKCiMjIyMgV2FsbCBTdHJlZXQgSm91cm5hbDogYHRoZW1lX3dzaigpYAoKVGhlbWUgYmFzZWQgb24gdGhlIHB1YmxpY2F0aW9uLCB0aGUgV2FsbCBTdHJlZXQgSm91cm5hbC4KCmBgYHtyfQpiYXNlUGxvdCArIHRoZW1lX3dzaigpCmBgYAoKIyMjIyBGaXZlVGhpcnR5RWlnaHQ6IGB0aGVtZV9maXZldGhpcnR5ZWlnaHQoKWAKClRoZW1lIGJhc2VkIG9uIHRoZSBwdWJsaWNhdGlvbiwgRml2ZVRoaXJ0eUVpZ2h0LgoKYGBge3J9CmJhc2VQbG90ICsgdGhlbWVfZml2ZXRoaXJ0eWVpZ2h0KCkKYGBgCgojIyMjIFRoZSBFY29ub21pc3Q6IGB0aGVtZV9lY29ub21pc3QoKWAKClRoZW1lIGJhc2VkIG9uIHRoZSBwdWJsaWNhdGlvbiwgVGhlIEVjb25vbWlzdC4KCmBgYHtyfQpiYXNlUGxvdCArIHRoZW1lX2Vjb25vbWlzdCgpCmBgYAoKIyMjIyBTdGVwaGVuIEZldzogYHRoZW1lX2ZldygpYAoKVGhlbWUgYmFzZWQgb24gdGhlIHJ1bGVzIGFuZCBleGFtcGxlcyBmcm9tIFN0ZXBoZW4gRmV3J3MgKlNob3cgTWUgdGhlIE51bWJlcnMqIGFuZCAiUHJhY3RpY2FsIFJ1bGVzIGZvciBVc2luZyBDb2xvciBpbiBDaGFydHMiLgoKYGBge3J9CmJhc2VQbG90ICsgdGhlbWVfZmV3KCkKYGBgCgojIyBBZGQgTWFyZ2luYWwgRGlzdHJpYnV0aW9ucyB7I21hcmdpbmFsRGlzdHJpYnV0aW9uc30KCmBgYHtyfQpzY2F0dGVycGxvdCA8LSBnZ3Bsb3QoZGYsIGFlcyh4ID0gcHJlZGljdG9yLCB5ID0gb3V0Y29tZSkpICsKICBnZW9tX3BvaW50KCkgKwogIHRoZW1lX2NsYXNzaWMoKSArCiAgdGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSAiR290aGFtIikpCmBgYAoKIyMjIERlbnNpdHkgUGxvdAoKYGBge3J9CmRlbnNpdHlNYXJnaW5hbCA8LSBnZ01hcmdpbmFsKHNjYXR0ZXJwbG90LCB0eXBlID0gImRlbnNpdHkiLCB4cGFyYW1zID0gbGlzdChmaWxsID0gImdyYXkiKSwgeXBhcmFtcyA9IGxpc3QoZmlsbCA9ICJncmF5IikpCmBgYAoKYGBge3J9CnByaW50KGRlbnNpdHlNYXJnaW5hbCwgbmV3cGFnZSA9IFRSVUUpCmBgYAoKIyMjIEhpc3RvZ3JhbQoKYGBge3J9Cmhpc3RvZ3JhbU1hcmdpbmFsIDwtIGdnTWFyZ2luYWwoc2NhdHRlcnBsb3QsIHR5cGUgPSAiaGlzdG9ncmFtIiwgeHBhcmFtcyA9IGxpc3QoZmlsbCA9ICJncmF5IiksIHlwYXJhbXMgPSBsaXN0KGZpbGwgPSAiZ3JheSIpKQpgYGAKCmBgYHtyfQpwcmludChoaXN0b2dyYW1NYXJnaW5hbCwgbmV3cGFnZSA9IFRSVUUpCmBgYAoKIyMjIEJveHBsb3QKCmBgYHtyfQpib3hwbG90TWFyZ2luYWwgPC0gZ2dNYXJnaW5hbChzY2F0dGVycGxvdCwgdHlwZSA9ICJib3hwbG90IiwgeHBhcmFtcyA9IGxpc3QoZmlsbCA9ICJncmF5IiksIHlwYXJhbXMgPSBsaXN0KGZpbGwgPSAiZ3JheSIpKQpgYGAKCmBgYHtyfQpwcmludChib3hwbG90TWFyZ2luYWwsIG5ld3BhZ2UgPSBUUlVFKQpgYGAKCiMjIyBWaW9saW4gUGxvdAoKYGBge3J9CnZpb2xpbk1hcmdpbmFsIDwtIGdnTWFyZ2luYWwoc2NhdHRlcnBsb3QsIHR5cGUgPSAidmlvbGluIiwgeHBhcmFtcyA9IGxpc3QoZmlsbCA9ICJncmF5IiksIHlwYXJhbXMgPSBsaXN0KGZpbGwgPSAiZ3JheSIpKQpgYGAKCmBgYHtyfQpwcmludCh2aW9saW5NYXJnaW5hbCwgbmV3cGFnZSA9IFRSVUUpCmBgYAoKIyMjIERlbnNpdHkgUGxvdCBhbmQgSGlzdG9ncmFtCgpgYGB7cn0KZGVuc2lncmFtTWFyZ2luYWwgPC0gZ2dNYXJnaW5hbChzY2F0dGVycGxvdCwgdHlwZSA9ICJkZW5zaWdyYW0iLCB4cGFyYW1zID0gbGlzdChmaWxsID0gImdyYXkiKSwgeXBhcmFtcyA9IGxpc3QoZmlsbCA9ICJncmF5IikpCmBgYAoKYGBge3J9CnByaW50KGRlbnNpZ3JhbU1hcmdpbmFsLCBuZXdwYWdlID0gVFJVRSkKYGBgCgojIyBFbGxpcHNlCgojIyMgQmFzaWMgRWxsaXBzZQoKYGBge3J9CmdncGxvdChkZiwgYWVzKHggPSBwcmVkaWN0b3IsIHkgPSBvdXRjb21lKSkgKwogIGdlb21fcG9pbnQoKSArCiAgc3RhdF9lbGxpcHNlKGFscGhhID0gMC40LCBsZXZlbCA9IDAuOTUsIGdlb20gPSAicG9seWdvbiIsIGZpbGwgPSAicmVkIiwgY29sb3IgPSAicmVkIikgKwogIHRoZW1lX2NsYXNzaWMoKSArCiAgdGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSAiR290aGFtIikpCmBgYAoKIyMjIEFsaWduIENvb3JkaW5hdGVzCgpgYGB7cn0KZ2dwbG90KGRmLCBhZXMoeCA9IHByZWRpY3RvciwgeSA9IG91dGNvbWUpKSArCiAgZ2VvbV9wb2ludCgpICsKICBzdGF0X2VsbGlwc2UoYWxwaGEgPSAwLjQsIGxldmVsID0gMC45NSwgZ2VvbSA9ICJwb2x5Z29uIiwgZmlsbCA9ICJyZWQiLCBjb2xvciA9ICJyZWQiKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGV4cGFuZCA9IGMoMCwgMCkpICsKICBzY2FsZV95X2NvbnRpbnVvdXMoZXhwYW5kID0gYygwLCAwKSkgKwogIGNvb3JkX2ZpeGVkKHJhdGlvID0gKG1heChwcmVkaWN0b3IsIG5hLnJtID0gVFJVRSkgLSBtaW4ocHJlZGljdG9yLCBuYS5ybSA9IFRSVUUpKS8obWF4KG91dGNvbWUsIG5hLnJtID0gVFJVRSkgLSBtaW4ob3V0Y29tZSwgbmEucm0gPSBUUlVFKSksCiAgICAgICAgICAgICAgeGxpbSA9IGMoMCwgbWF4KHByZWRpY3RvciwgbmEucm0gPSBUUlVFKSksIAogICAgICAgICAgICAgIHlsaW0gPSBjKDAsIG1heChvdXRjb21lLCBuYS5ybSA9IFRSVUUpKSkgKwogIHRoZW1lX2NsYXNzaWMoKSArCiAgdGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSAiR290aGFtIikpCmBgYAoKIyMjIFJlZHVjZSBEb3QgU2l6ZQoKYGBge3J9CmdncGxvdChkZiwgYWVzKHggPSBwcmVkaWN0b3IsIHkgPSBvdXRjb21lKSkgKwogIGdlb21fcG9pbnQoc2l6ZSA9IDAuNSkgKwogIHN0YXRfZWxsaXBzZShhbHBoYSA9IDAuNCwgbGV2ZWwgPSAwLjk1LCBnZW9tID0gInBvbHlnb24iLCBmaWxsID0gInJlZCIsIGNvbG9yID0gInJlZCIpICsKICBzY2FsZV94X2NvbnRpbnVvdXMoZXhwYW5kID0gYygwLCAwKSkgKwogIHNjYWxlX3lfY29udGludW91cyhleHBhbmQgPSBjKDAsIDApKSArCiAgY29vcmRfZml4ZWQocmF0aW8gPSAobWF4KHByZWRpY3RvciwgbmEucm0gPSBUUlVFKSAtIG1pbihwcmVkaWN0b3IsIG5hLnJtID0gVFJVRSkpLyhtYXgob3V0Y29tZSwgbmEucm0gPSBUUlVFKSAtIG1pbihvdXRjb21lLCBuYS5ybSA9IFRSVUUpKSwKICAgICAgICAgICAgICB4bGltID0gYygwLCBtYXgocHJlZGljdG9yLCBuYS5ybSA9IFRSVUUpKSwgCiAgICAgICAgICAgICAgeWxpbSA9IGMoMCwgbWF4KG91dGNvbWUsIG5hLnJtID0gVFJVRSkpKSArCiAgdGhlbWVfY2xhc3NpYygpICsKICB0aGVtZSh0ZXh0ID0gZWxlbWVudF90ZXh0KGZhbWlseSA9ICJHb3RoYW0iKSkKYGBgCgojIyMgVHJhbnNwYXJlbmN5CgpgYGB7cn0KZ2dwbG90KGRmLCBhZXMoeCA9IHByZWRpY3RvciwgeSA9IG91dGNvbWUpKSArCiAgZ2VvbV9wb2ludChhbHBoYSA9IDAuMykgKwogIHN0YXRfZWxsaXBzZShhbHBoYSA9IDAuNCwgbGV2ZWwgPSAwLjk1LCBnZW9tID0gInBvbHlnb24iLCBmaWxsID0gInJlZCIsIGNvbG9yID0gInJlZCIpICsKICBzY2FsZV94X2NvbnRpbnVvdXMoZXhwYW5kID0gYygwLCAwKSkgKwogIHNjYWxlX3lfY29udGludW91cyhleHBhbmQgPSBjKDAsIDApKSArCiAgY29vcmRfZml4ZWQocmF0aW8gPSAobWF4KHByZWRpY3RvciwgbmEucm0gPSBUUlVFKSAtIG1pbihwcmVkaWN0b3IsIG5hLnJtID0gVFJVRSkpLyhtYXgob3V0Y29tZSwgbmEucm0gPSBUUlVFKSAtIG1pbihvdXRjb21lLCBuYS5ybSA9IFRSVUUpKSwKICAgICAgICAgICAgICB4bGltID0gYygwLCBtYXgocHJlZGljdG9yLCBuYS5ybSA9IFRSVUUpKSwgCiAgICAgICAgICAgICAgeWxpbSA9IGMoMCwgbWF4KG91dGNvbWUsIG5hLnJtID0gVFJVRSkpKSArCiAgdGhlbWVfY2xhc3NpYygpICsKICB0aGVtZSh0ZXh0ID0gZWxlbWVudF90ZXh0KGZhbWlseSA9ICJHb3RoYW0iKSkKYGBgCgojIyBCdWJibGUgQ2hhcnQKCiMjIyBCYXNpYyBCdWJibGUgQ2hhcnQKCmBgYHtyfQpnZ3Bsb3QoZGYsIGFlcyh4ID0gcHJlZGljdG9yT3ZlcnBsb3QsIHkgPSBvdXRjb21lT3ZlcnBsb3QpKSArCiAgZ2VvbV9jb3VudChhZXMoc2l6ZSA9IC4ubi4uKSkgKwogIHNjYWxlX3NpemVfYXJlYSgpICsKICB0aGVtZV9jbGFzc2ljKCkgKwogIHRoZW1lKHRleHQgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gIkdvdGhhbSIpKQpgYGAKCiMjIyBTcGVjaWZ5IFNpemVzCgpgYGB7cn0KZ2dwbG90KGRmLCBhZXMoeCA9IHByZWRpY3Rvck92ZXJwbG90LCB5ID0gb3V0Y29tZU92ZXJwbG90KSkgKwogIGdlb21fY291bnQoYWVzKHNpemUgPSAuLm4uLikpICsKICBzY2FsZV9zaXplX2NvbnRpbnVvdXMoYnJlYWtzID0gYygxLCAyLCAzLCA0KSwgcmFuZ2UgPSBjKDEsIDcpKSArCiAgdGhlbWVfY2xhc3NpYygpICsKICB0aGVtZSh0ZXh0ID0gZWxlbWVudF90ZXh0KGZhbWlseSA9ICJHb3RoYW0iKSkKYGBgCgojIyAyLURpbWVuc2lvbmFsIERlbnNpdHkKCmBgYHtyfQpnZ3Bsb3QoZGYsIGFlcyh4ID0gcHJlZGljdG9yLCB5ID0gb3V0Y29tZSkpICsKICBzdGF0X2RlbnNpdHlfMmQoYWVzKGZpbGwgPSAuLmRlbnNpdHkuLiksIGdlb20gPSAicmFzdGVyIiwgY29udG91ciA9IEZBTFNFKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGV4cGFuZCA9IGMoMCwgMCkpICsKICBzY2FsZV95X2NvbnRpbnVvdXMoZXhwYW5kID0gYygwLCAwKSkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwKICAgIHRleHQgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gIkdvdGhhbSIpCiAgKQpgYGAKCiMjIENvbWJpbmVkIEVsbGlwc2UgYW5kIEJ1YmJsZSBDaGFydAoKIyMjIGBnZ3Bsb3QyYAoKYGBge3J9CmdncGxvdChkZiwgYWVzKHggPSBwcmVkaWN0b3JPdmVycGxvdCwgeSA9IG91dGNvbWVPdmVycGxvdCkpICsKICBnZW9tX2NvdW50KGFscGhhID0gLjYsIGNvbG9yID0gcmdiKDAsMCwuNywuNSkpICsKICBzY2FsZV9zaXplX2NvbnRpbnVvdXMoYnJlYWtzID0gYygxLCAyLCAzLCA0KSwgcmFuZ2UgPSBjKDEsIDcpKSArCiAgc3RhdF9zbW9vdGgobWV0aG9kID0gImxvZXNzIiwgc2UgPSBUUlVFLCBjb2xvciA9ICJncmVlbiIpICsgCiAgc3RhdF9zbW9vdGgobWV0aG9kID0gImxtIikgKwogIHN0YXRfZWxsaXBzZShhbHBoYSA9IDAuNCwgbGV2ZWwgPSAwLjk1LCBnZW9tID0gInBvbHlnb24iLCBmaWxsID0gInJlZCIsIGNvbG9yID0gInJlZCIpICsKICBzY2FsZV94X2NvbnRpbnVvdXMoZXhwYW5kID0gYygwLCAwKSkgKwogIHNjYWxlX3lfY29udGludW91cyhleHBhbmQgPSBjKDAsIDApKSArCiAgY29vcmRfZml4ZWQocmF0aW8gPSAobWF4KHByZWRpY3Rvck92ZXJwbG90LCBuYS5ybSA9IFRSVUUpIC0gbWluKHByZWRpY3Rvck92ZXJwbG90LCBuYS5ybSA9IFRSVUUpKS8obWF4KG91dGNvbWVPdmVycGxvdCwgbmEucm0gPSBUUlVFKSAtIG1pbihvdXRjb21lT3ZlcnBsb3QsIG5hLnJtID0gVFJVRSkpLAogICAgICAgICAgICAgIHhsaW0gPSBjKDAsIG1heChwcmVkaWN0b3JPdmVycGxvdCwgbmEucm0gPSBUUlVFKSksIAogICAgICAgICAgICAgIHlsaW0gPSBjKDAsIG1heChvdXRjb21lT3ZlcnBsb3QsIG5hLnJtID0gVFJVRSkpKSArCiAgdGhlbWVfY2xhc3NpYygpICsKICB0aGVtZSh0ZXh0ID0gZWxlbWVudF90ZXh0KGZhbWlseSA9ICJHb3RoYW0iKSkKCmdncGxvdChkZiwgYWVzKHggPSBwcmVkaWN0b3JPdmVycGxvdCwgeSA9IG91dGNvbWVPdmVycGxvdCkpICsKICBnZW9tX2NvdW50KGFscGhhID0gLjYsIGNvbG9yID0gcmdiKDAsMCwuNywuNSkpICsKICBzY2FsZV9zaXplX2NvbnRpbnVvdXMoYnJlYWtzID0gYygxLCAyLCAzLCA0KSwgcmFuZ2UgPSBjKDEsIDcpKSArCiAgc3RhdF9zbW9vdGgobWV0aG9kID0gImxvZXNzIiwgc2UgPSBUUlVFLCBjb2xvciA9ICJncmVlbiIpICsgCiAgc3RhdF9zbW9vdGgobWV0aG9kID0gImxtIikgKwogIHN0YXRfZWxsaXBzZShjb2xvciA9ICJyZWQiLCBzaXplID0gMS41KSArCiAgc2NhbGVfeF9jb250aW51b3VzKGV4cGFuZCA9IGMoMCwgMCkpICsKICBzY2FsZV95X2NvbnRpbnVvdXMoZXhwYW5kID0gYygwLCAwKSkgKwogIGNvb3JkX2ZpeGVkKHJhdGlvID0gKG1heChwcmVkaWN0b3JPdmVycGxvdCwgbmEucm0gPSBUUlVFKSAtIG1pbihwcmVkaWN0b3JPdmVycGxvdCwgbmEucm0gPSBUUlVFKSkvKG1heChvdXRjb21lT3ZlcnBsb3QsIG5hLnJtID0gVFJVRSkgLSBtaW4ob3V0Y29tZU92ZXJwbG90LCBuYS5ybSA9IFRSVUUpKSwKICAgICAgICAgICAgICB4bGltID0gYygwLCBtYXgocHJlZGljdG9yT3ZlcnBsb3QsIG5hLnJtID0gVFJVRSkpLCAKICAgICAgICAgICAgICB5bGltID0gYygwLCBtYXgob3V0Y29tZU92ZXJwbG90LCBuYS5ybSA9IFRSVUUpKSkgKwogIHRoZW1lX2NsYXNzaWMoKSArCiAgdGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSAiR290aGFtIikpCmBgYAoKIyMjIE90aGVyIGltcGxlbWVudGF0aW9uCgpGcm9tOiBodHRwczovL3N0YXRzLnN0YWNrZXhjaGFuZ2UuY29tL3F1ZXN0aW9ucy83ODk5L2NvbXBsZXgtcmVncmVzc2lvbi1wbG90LWluLXIKCiMjIyMgYGdncGxvdDJgCgpgYGB7cn0KZGYkeCA8LSBkZiRwcmVkaWN0b3JPdmVycGxvdApkZiR5IDwtIGRmJG91dGNvbWVPdmVycGxvdAoKeGMgPC0gd2l0aChkZiwgeHlUYWJsZSh4LCB5KSkKZGYyIDwtIGNiaW5kLmRhdGEuZnJhbWUoeCA9IHhjJHgsIHkgPSB4YyR5LCBudW1iZXIgPSB4YyRudW1iZXIpCmRmMiRuIDwtIGN1dChkZjIkbnVtYmVyLCBjKDAsMS41LDIuNSxJbmYpLCBsYWJlbHMgPSBjKDEsMiw0KSkKZGYuZWxsIDwtIGFzLmRhdGEuZnJhbWUod2l0aChkZiwgZWxsaXBzZShjb3IoZGYkeCwgZGYkeSwgdXNlID0gInBhaXJ3aXNlLmNvbXBsZXRlLm9icyIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlID0gYyhzZChkZiR4LCBuYS5ybSA9IFRSVUUpLCBzZChkZiR5LCBuYS5ybSA9IFRSVUUpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZW50cmUgPSBjKG1lYW4oZGYkeCwgbmEucm0gPSBUUlVFKSwgbWVhbihkZiR5LCBuYS5ybSA9IFRSVUUpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbCA9IC45NSkpKQoKZ2dwbG90KGRhdGEgPSBuYS5vbWl0KGRmMiksIGFlcyh4ID0geCwgeSA9IHkpKSArIAogIGdlb21fcG9pbnQoYWVzKHNpemUgPSBuKSwgYWxwaGEgPSAuNiwgY29sb3IgPSByZ2IoMCwwLC43LC41KSkgKyAKICBzdGF0X3Ntb290aChkYXRhID0gZGYsIG1ldGhvZCA9ICJsb2VzcyIsIHNlID0gRkFMU0UsIGNvbG9yID0gImdyZWVuIikgKyAKICBzdGF0X3Ntb290aChkYXRhID0gZGYsIG1ldGhvZCA9ICJsbSIsIGNvbCA9ICJyZWQiKSArCiAgZ2VvbV9wYXRoKGRhdGEgPSBkZi5lbGwsIGNvbG91ciA9ICJncmVlbiIsIHNpemUgPSAxKSArCiAgY29vcmRfY2FydGVzaWFuKHhsaW0gPSBjKC0xLDYwKSwgeWxpbSA9IGMoLTEsMTMwKSkKYGBgCgojIyMjIEJhc2UgYFJgCgpgYGB7cn0KZG8uaXQgPC0gZnVuY3Rpb24oZGYsIHR5cGU9ImNvbmZpZGVuY2UiLCAuLi4pIHsKICByZXF1aXJlKGVsbGlwc2UpCiAgbG0wIDwtIGxtKHkgfiB4LCBkYXRhPWRmKQogIHhjIDwtIHdpdGgoZGYsIHh5VGFibGUoeCwgeSkpCiAgZGYubmV3IDwtIGRhdGEuZnJhbWUoeCA9IHNlcShtaW4oZGYkeCksIG1heChkZiR4KSwgMC4xKSkKICBwcmVkLnVsYiA8LSBwcmVkaWN0KGxtMCwgZGYubmV3LCBpbnRlcnZhbCA9IHR5cGUpCiAgcHJlZC5sbyA8LSBwcmVkaWN0KGxvZXNzKHkgfiB4LCBkYXRhID0gZGYpLCBkZi5uZXcpCiAgcGxvdCh4YyR4LCB4YyR5LCBjZXggPSB4YyRudW1iZXIqMS80LCB4bGFiID0gIngiLCB5bGFiID0gInkiLCAuLi4pICNjaGFuZ2UgbnVtYmVyKlggdG8gY2hhbmdlIGRvdCBzaXplCiAgYWJsaW5lKGxtMCwgY29sID0gInJlZCIpCiAgbGluZXMoZGYubmV3JHgsIHByZWQubG8sIGNvbD0iZ3JlZW4iLCBsd2QgPSAyKQogIGxpbmVzKGRmLm5ldyR4LCBwcmVkLnVsYlssImx3ciJdLCBsdHkgPSAyLCBjb2wgPSAicmVkIikKICBsaW5lcyhkZi5uZXckeCwgcHJlZC51bGJbLCJ1cHIiXSwgbHR5ID0gMiwgY29sID0gInJlZCIpICAgIAogIGxpbmVzKGVsbGlwc2UoY29yKGRmJHgsIGRmJHkpLCBzY2FsZT1jKHNkKGRmJHgpLHNkKGRmJHkpKSwgCiAgICAgICAgICAgICAgICBjZW50cmUgPSBjKG1lYW4oZGYkeCksIG1lYW4oZGYkeSkpLCBsZXZlbCA9IC45NSksIGx3ZCA9IDIsIGNvbCA9ICJncmVlbiIpCiAgaW52aXNpYmxlKGxtMCkKfQoKZGYzIDwtIG5hLm9taXQoZGZbc2FtcGxlKG5yb3coZGYpLCBucm93KGRmKSwgcmVwID0gVFJVRSksXSkKZGYzJHggPC0gZGYzJHByZWRpY3Rvck92ZXJwbG90CmRmMyR5IDwtIGRmMyRvdXRjb21lT3ZlcnBsb3QKCmRvLml0KGRmMywgcGNoID0gMTksIGNvbCA9IHJnYigwLDAsLjcsLjUpKQpgYGAKCiMjIFZpc3VhbGx5LVdlaWdodGVkIFJlZ3Jlc3Npb24KCiMjIyBEZWZhdWx0CgpgYGB7ciwgbWVzc2FnZSA9IEZBTFNFLCByZXN1bHRzID0gImhpZGUifQp2d1JlZyhvdXRjb21lIH4gcHJlZGljdG9yLCBkYXRhID0gZGYpCmBgYAoKIyMjIFNoYWRlCgpgYGB7ciwgbWVzc2FnZSA9IEZBTFNFLCByZXN1bHRzID0gImhpZGUifQp2d1JlZyhvdXRjb21lIH4gcHJlZGljdG9yLCBkYXRhID0gZGYsIHNoYWRlID0gVFJVRSwgc3BhZyA9IEZBTFNFLCBzaG93LmxtID0gVFJVRSwgc2hvdy5DSSA9IFRSVUUsIGJ3ID0gRkFMU0UsIEIgPSAxMDAwLCBxdWFudGl6ZSA9ICJjb250aW51b3VzIikKdndSZWcob3V0Y29tZSB+IHByZWRpY3RvciwgZGF0YSA9IGRmLCBzaGFkZSA9IFRSVUUsIHNwYWcgPSBGQUxTRSwgc2hvdy5sbSA9IFRSVUUsIHNob3cuQ0kgPSBUUlVFLCBidyA9IEZBTFNFLCBCID0gMTAwMCwgcXVhbnRpemUgPSAiU0QiKQpgYGAKCiMjIyBTcGFnaGV0dGkKCmBgYHtyLCBtZXNzYWdlID0gRkFMU0UsIHJlc3VsdHMgPSAiaGlkZSJ9CnZ3UmVnKG91dGNvbWUgfiBwcmVkaWN0b3IsIGRhdGEgPSBkZiwgc2hhZGUgPSBGQUxTRSwgc3BhZyA9IFRSVUUsIHNob3cubG0gPSBUUlVFLCBzaG93LkNJID0gVFJVRSwgYncgPSBGQUxTRSwgQiA9IDEwMDApCnZ3UmVnKG91dGNvbWUgfiBwcmVkaWN0b3IsIGRhdGEgPSBkZiwgc2hhZGUgPSBGQUxTRSwgc3BhZyA9IFRSVUUsIHNob3cubG0gPSBGQUxTRSwgc2hvdy5DSSA9IEZBTFNFLCBidyA9IEZBTFNFLCBCID0gMTAwMCkKYGBgCgojIyMgQmxhY2svd2hpdGUKCmBgYHtyLCBtZXNzYWdlID0gRkFMU0UsIHJlc3VsdHMgPSAiaGlkZSJ9CnZ3UmVnKG91dGNvbWUgfiBwcmVkaWN0b3IsIGRhdGEgPSBkZiwgc2hhZGUgPSBUUlVFLCBzcGFnID0gRkFMU0UsIHNob3cubG0gPSBUUlVFLCBzaG93LkNJID0gVFJVRSwgYncgPSBUUlVFLCBCID0gMTAwMCwgcXVhbnRpemUgPSAiY29udGludW91cyIpCnZ3UmVnKG91dGNvbWUgfiBwcmVkaWN0b3IsIGRhdGEgPSBkZiwgc2hhZGUgPSBUUlVFLCBzcGFnID0gRkFMU0UsIHNob3cubG0gPSBUUlVFLCBzaG93LkNJID0gVFJVRSwgYncgPSBUUlVFLCBCID0gMTAwMCwgcXVhbnRpemUgPSAiU0QiKQp2d1JlZyhvdXRjb21lIH4gcHJlZGljdG9yLCBkYXRhID0gZGYsIHNoYWRlID0gRkFMU0UsIHNwYWcgPSBUUlVFLCBzaG93LmxtID0gVFJVRSwgc2hvdy5DSSA9IFRSVUUsIGJ3ID0gVFJVRSwgQiA9IDEwMDAsIHF1YW50aXplID0gIlNEIikKYGBgCgojIEdyYXBoaWMgRGVzaWduIFByaW5jaXBsZXMgZm9yIERhdGEgVmlzdWFsaXphdGlvbgoKaHR0cHM6Ly93d3cuZGF0YS10by12aXouY29tL2NhdmVhdHMuaHRtbAoKIyBUeXBlcyBvZiBQbG90cwoKIyMgVW5pdmFyaWF0ZSBEaXN0cmlidXRpb24KClVzZWQgZm9yOiBkaXN0cmlidXRpb24gb2Ygb25lIG51bWVyaWMgdmFyaWFibGUKCiMjIyBHYWxsZXJ5CgotIFZpb2xpbiBjaGFydDogaHR0cHM6Ly9yLWdyYXBoLWdhbGxlcnkuY29tL3Zpb2xpbi5odG1sCi0gRGVuc2l0eSBjaGFydDogaHR0cHM6Ly9yLWdyYXBoLWdhbGxlcnkuY29tL2RlbnNpdHktcGxvdC5odG1sCi0gSGlzdG9ncmFtOiBodHRwczovL3ItZ3JhcGgtZ2FsbGVyeS5jb20vaGlzdG9ncmFtLmh0bWwKLSBCb3hwbG90OiBodHRwczovL3ItZ3JhcGgtZ2FsbGVyeS5jb20vYm94cGxvdC5odG1sCi0gUmlkZ2VsaW5lIGNoYXJ0OiBodHRwczovL3ItZ3JhcGgtZ2FsbGVyeS5jb20vcmlkZ2VsaW5lLXBsb3QuaHRtbAoKIyMgQml2YXJpYXRlIFNjYXR0ZXJwbG90cwoKVXNlZCBmb3I6IGFzc29jaWF0aW9uIGJldHdlZW4gdHdvIG51bWVyaWMgdmFyaWFibGVzCgojIyMgQmFzZSBgUmAKCmBgYApwbG90KHgsIHkpCmBgYAoKIyMjIGdncGxvdDIgcGFja2FnZQoKaHR0cDovL3d3dy5jb29rYm9vay1yLmNvbS9HcmFwaHMvU2NhdHRlcnBsb3RzXyhnZ3Bsb3QyKS8KCmBgYApnZ3Bsb3QoZGF0YSwgYWVzKHgsIHkpKSArCiAgICBnZW9tX3BvaW50KCkKYGBgCgojIyMgR2FsbGVyeQoKLSBTY2F0dGVycGxvdDogaHR0cHM6Ly9yLWdyYXBoLWdhbGxlcnkuY29tL3NjYXR0ZXJwbG90Lmh0bWwKLSBCdWJibGUgcGxvdDogaHR0cHM6Ly9yLWdyYXBoLWdhbGxlcnkuY29tL2J1YmJsZS1jaGFydC5odG1sCi0gMkQgZGVuc2l0eSBjaGFydDogaHR0cHM6Ly9yLWdyYXBoLWdhbGxlcnkuY29tLzJkLWRlbnNpdHktY2hhcnQuaHRtbAotIEhlYXRtYXA6IGh0dHBzOi8vci1ncmFwaC1nYWxsZXJ5LmNvbS9oZWF0bWFwLmh0bWwKCiMjIyBBZGQgbGluZXMKCi0gTGluZSBjaGFydDogaHR0cHM6Ly9yLWdyYXBoLWdhbGxlcnkuY29tL2xpbmUtcGxvdC5odG1sCi0gQ29ubmVjdGVkIHNjYXR0ZXJwbG90OiBodHRwczovL3ItZ3JhcGgtZ2FsbGVyeS5jb20vY29ubmVjdGVkLXNjYXR0ZXJwbG90Lmh0bWwKLSBWaXN1YWxseS13ZWlnaHRlZCByZWdyZXNzaW9uOiBodHRwczovL3d3dy5uaWNlYnJlYWQuZGUvdmlzdWFsbHktd2VpZ2h0ZWQtd2F0ZXJjb2xvci1wbG90cy1uZXctdmFyaWFudHMtcGxlYXNlLXZvdGUvCi0gVXNlIHRoZSBgdndSZWcoKWAgZnVuY3Rpb24gZnJvbSB0aGUgYHBldGVyc2VubGFiYCBwYWNrYWdlOiBodHRwczovL2dpdGh1Yi5jb20vRGV2UHN5TGFiL3BldGVyc2VubGFiL2Jsb2IvbWFpbi9SL3Z3UmVnLlIKCiMjIyBBcmVhCgotIEFyZWEgY2hhcnQ6IGh0dHBzOi8vci1ncmFwaC1nYWxsZXJ5LmNvbS9hcmVhLWNoYXJ0Lmh0bWwKLSBTdGFja2VkIGFyZWEgY2hhcnQ6IGh0dHBzOi8vci1ncmFwaC1nYWxsZXJ5LmNvbS9zdGFja2VkLWFyZWEtZ3JhcGguaHRtbAotIFN0cmVhbWdyYXBoOiBodHRwczovL3ItZ3JhcGgtZ2FsbGVyeS5jb20vc3RyZWFtZ3JhcGguaHRtbAoKIyMgQml2YXJpYXRlIEJhcnBsb3RzCgpVc2VkIGZvcjogYXNzb2NpYXRpb24gYmV0d2VlbiBvbmUgY2F0ZWdvcmljYWwgdmFyaWFibGUgYW5kIG9uZSBudW1lcmljIHZhcmlhYmxlIChvciBmb3IgZGVwaWN0aW5nIHRoZSBmcmVxdWVuY3kgb2YgY2F0ZWdvcmllcyBvZiBhIGNhdGVnb3JpY2FsIHZhcmlhYmxlKQoKIyMjIEdhbGxlcnkKCi0gQmFycGxvdDogaHR0cHM6Ly9yLWdyYXBoLWdhbGxlcnkuY29tL2JhcnBsb3QuaHRtbAotIExvbGxpcG9wIHBsb3Q6IGh0dHBzOi8vci1ncmFwaC1nYWxsZXJ5LmNvbS9sb2xsaXBvcC1wbG90Lmh0bWwKCiMjIE11bHRpdmFyaWF0ZSBDb3JyZWxhdGlvbiBNYXRyaWNlcwoKVXNlZCBmb3I6IGFzc29jaWF0aW9uIGJldHdlZW4gbXVsdGlwbGUgbnVtZXJpYyB2YXJpYWJsZXMKCkZvciBjb3JyZWxhdGlvbiBtYXRyaWNlcywgSSBkbyB0aGUgZm9sbG93aW5nOgoKMS4gSSB1c2UgdGhlIGxhYidzIGBjb3IudGFibGUoKWAgZnVuY3Rpb24gKHdpdGggYHR5cGUgPSAibWFudXNjcmlwdCJgKSBmcm9tIHRoZSBgcGV0ZXJzZW5sYWJgIHBhY2thZ2UgdG8gY3JlYXRlIGEgY29ycmVsYXRpb24gbWF0cml4LgoxLiBJIHNhdmUgdGhlIGNvcnJlbGF0aW9uIG1hdHJpeCB0byBhIGAuY3N2YCBmaWxlLgogICAgYS4gRm9yIGV4YW1wbGU6IGh0dHBzOi8vcmVzZWFyY2gtZ2l0LnVpb3dhLmVkdS9QZXRlcnNlbkxhYi9TUlMvU1JTLVNlbGZSZWd1bGF0aW9uRGV2ZWxvcG1lbnQvLS9ibG9iL21hc3Rlci9BbmFseXNlcy9zZWxmUmVndWxhdGlvbkRldmVsb3BtZW50LlJtZCNzZWxmLXJlZ3VsYXRpb24tbWVhc3VyZXMKMS4gSSBvcGVuIHRoZSAuY3N2IGZpbGUgaW4gRXhjZWwgYW5kIGNyZWF0ZSB0aGUgdGFibGUgaW4gRXhjZWwgdGhhdCBjYW4gYmUgY29waWVkIGFuZCBwYXN0ZWQgdG8gV29yZC9Qb3dlcnBvaW50L2V0Yy4KCiMjIyBDb3JyZWxvZ3JhbXMKCi0gYGNvcnJwbG90YCBwYWNrYWdlOiBodHRwczovL2NyYW4uci1wcm9qZWN0Lm9yZy93ZWIvcGFja2FnZXMvY29ycnBsb3QvdmlnbmV0dGVzL2NvcnJwbG90LWludHJvLmh0bWwKLSBgY29ycmdyYW1gIHBhY2thZ2U6IGh0dHBzOi8vY3Jhbi5yLXByb2plY3Qub3JnL3dlYi9wYWNrYWdlcy9jb3JyZ3JhbS92aWduZXR0ZXMvY29ycmdyYW1fZXhhbXBsZXMuaHRtbAoKIyMjIyBHYWxsZXJ5CgpodHRwczovL3ItZ3JhcGgtZ2FsbGVyeS5jb20vY29ycmVsb2dyYW0uaHRtbAoKIyMjIFBhaXJzIHBhbmVscwoKYHBzeWNoYCBwYWNrYWdlOiBodHRwczovL3BlcnNvbmFsaXR5LXByb2plY3Qub3JnL3IvcHN5Y2gvaGVscC9wYWlycy5wYW5lbHMuaHRtbAoKSSBkZXBpY3QgZXhhbXBsZXMgb2YgY29ycmVsb2dyYW1zIGFuZCBwYWlycyBwYW5lbHMgaGVyZTogaHR0cHM6Ly9pc2FhY3RwZXRlcnNlbi5naXRodWIuaW8vUHJpbmNpcGxlcy1Qc3ljaG9sb2dpY2FsLUFzc2Vzc21lbnQvZmFjdG9yLWFuYWx5c2lzLVBDQS5odG1sI2NvcnJlbGF0aW9ucy1mYWN0b3JBbmFseXNpcwoKIyMgUGF0aCBEaWFncmFtcyB7I3BhdGhEaWFncmFtc30KClVzZWQgZm9yOiBTRU0vQ0ZBL3BhdGggYW5hbHlzaXMKCklmIHlvdSBhcmUganVzdCB0cnlpbmcgdG8gdmlzdWFsaXplIHRoZSByZXN1bHRzIG9mIGEgU0VNIG1vZGVsIGZpdHRlZCB1c2luZyB0aGUgYGxhdmFhbmAgcGFja2FnZSwgSSByZWNvbW1lbmQgdGhlIGBzZW1QbG90YCBwYWNrYWdlIChodHRwOi8vc2FjaGFlcHNrYW1wLmNvbS9zZW1QbG90L2V4YW1wbGVzKSBpbiBgUmAuCllvdSBjYW4gc2VlIGV4YW1wbGVzIG9mIG15IGltcGxlbWVudGF0aW9uIGhlcmU6IGh0dHBzOi8vaXNhYWN0cGV0ZXJzZW4uZ2l0aHViLmlvL1ByaW5jaXBsZXMtUHN5Y2hvbG9naWNhbC1Bc3Nlc3NtZW50L3NlbS5odG1sI3NlbU1vZGVsUGF0aERpYWdyYW0tc2VtCgpJZiB5b3UgYXJlIHRyeWluZyB0byBjcmVhdGUgYSBmaWd1cmUgZm9yIGEgcGFwZXIgb3IgcG9zdGVyLCB5b3UgbWlnaHQgd2FudCBzb21ldGhpbmcgdGhhdCB5b3UgY2FuIGRyYXcgYW5kIGN1c3RvbWl6ZSB5b3Vyc2VsZi4KSSB1c2UgQWRvYmUgSWxsdXN0cmF0b3IgZm9yIGhhbmQtZHJhd24gZmlndXJlcy4KCllvdSBjYW4gbG9vayBhdCB2YXJpb3VzIG9wdGlvbnMgYmVsb3c6CgotIGBzZW1QbG90YCBwYWNrYWdlCi0gYEFkb2JlIElsbHVzdHJhdG9yYAotIGh0dHBzOi8vd3d3LmRpYWdyYW1zLm5ldAotIGBPbnl4YDogaHR0cHM6Ly9vbnl4LXNlbS5jb20KLSBgeXdvcmtzYDogaHR0cHM6Ly93d3cueXdvcmtzLmNvbQotIGBNaWNyb3NvZnQgVmlzaW9gOiBodHRwczovL3d3dy5taWNyb3NvZnQuY29tL2VuLXVzL21pY3Jvc29mdC0zNjUvdmlzaW8vZmxvd2NoYXJ0LXNvZnR3YXJlCi0gYE1pY3Jvc29mdCBQb3dlcnBvaW50YAotIGBBTU9TYAotIGBXYXJwcGxzYAotIGBHcmFwaHZpemA6IGh0dHBzOi8vZ3JhcGh2aXoub3JnCiAgICAtIGhhcyBhbiBgUmAgcG9ydOKAlHRoaXMgaXMgd2hhdCB3ZSB1c2UgZm9yIG91ciBzdHVkeSBmbG93Y2hhcnQgdmlhIHRoZSBgRGlhZ3JhbW1lUmAgcGFja2FnZTogaHR0cHM6Ly9yaWNoLWlhbm5vbmUuZ2l0aHViLmlvL0RpYWdyYW1tZVIvaW5kZXguaHRtbAotIGh0dHBzOi8vYXBwLmRpYWdyYW1zLm5ldAotIGh0dHBzOi8vZ2l0aHViLmNvbS9qZ3JhcGgvZHJhd2lvLWRlc2t0b3AvcmVsZWFzZXMKCiMjIEludGVyYWN0aXZlCgpHYWxsZXJ5OiBodHRwczovL3ItZ3JhcGgtZ2FsbGVyeS5jb20vaW50ZXJhY3RpdmUtY2hhcnRzLmh0bWwKCiMjIEFuaW1hdGlvbgoKR2FsbGVyeTogaHR0cHM6Ly9yLWdyYXBoLWdhbGxlcnkuY29tL2FuaW1hdGlvbi5odG1sCgojIyAzRAoKR2FsbGVyeTogaHR0cHM6Ly9yLWdyYXBoLWdhbGxlcnkuY29tLzNkLmh0bWwKCiMgQ29sb3IgUGFsZXR0ZXMKCi0gaHR0cHM6Ly9jb2xvcmJyZXdlcjIub3JnCgojIyBTZXF1ZW50aWFsCgotIGh0dHBzOi8vY29sb3JicmV3ZXIyLm9yZy8jdHlwZT1zZXF1ZW50aWFsJnNjaGVtZT1CdUduJm49MwotIHZpcmlkaXMsIGNpdmlkaXMsIGV0Yy46IGh0dHBzOi8vY3Jhbi5yLXByb2plY3Qub3JnL3dlYi9wYWNrYWdlcy92aXJpZGlzL3ZpZ25ldHRlcy9pbnRyby10by12aXJpZGlzLmh0bWwKCiMjIERpdmVyZ2luZwoKLSBodHRwczovL2NvbG9yYnJld2VyMi5vcmcvI3R5cGU9ZGl2ZXJnaW5nJnNjaGVtZT1CckJHJm49MwoKIyMgUXVhbGl0YXRpdmUvQ2F0ZWdvcmljYWwKCi0gaHR0cHM6Ly9jb2xvcmJyZXdlcjIub3JnLyN0eXBlPXF1YWxpdGF0aXZlJnNjaGVtZT1BY2NlbnQmbj0zCi0gYFBvbHljaHJvbWVgIHBhY2thZ2U6IGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vYS82MjkzOTQwNSAoYXJjaGl2ZWQgYXQgaHR0cHM6Ly9wZXJtYS5jYy8zSFdNLU1NRlMpCi0gYHBhbHNgIHBhY2thZ2U6IGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vYS80MTIzMDY4NSAoYXJjaGl2ZWQgYXQgaHR0cHM6Ly9wZXJtYS5jYy9XSDU2LUhNVkQpCgpDb2xvciBwYWxldHRlcyBmb3IgY29sb3ItYmxpbmRuZXNzOgoKLSBgU2FmZWAgcGFsZXR0ZSBmcm9tIHRoZSBgcmNhcnRvY29sb3JgIHBhY2thZ2U6IGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vYS81NjA2NjcxMiAoYXJjaGl2ZWQgYXQgaHR0cHM6Ly9wZXJtYS5jYy9XVUg1LUY0WjcpCi0gT2thYmUgSXRvIHNjYWxlOiBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL2EvNTYwNjY3MTIgKGFyY2hpdmVkIGF0IGh0dHBzOi8vcGVybWEuY2MvV1VINS1GNFo3KQoKIyMjIDggQ29sb3JzCgpgYGB7cn0KIyBGcm9tIGhlcmU6IGh0dHBzOi8vZ2l0aHViLmNvbS9jbGF1c3dpbGtlL2NvbG9yYmxpbmRyL2Jsb2IvbWFzdGVyL1IvcGFsZXR0ZXMuUgojIFR3byBjb2xvciBwYWxldHRlcyB0YWtlbiBmcm9tIHRoZSBhcnRpY2xlIFsiQ29sb3IgVW5pdmVyc2FsIERlc2lnbiIgYnkgT2thYmUgYW5kIEl0b10oaHR0cHM6Ly93ZWIuYXJjaGl2ZS5vcmcvd2ViLzIwMjEwMTA4MjMzNzM5L2h0dHA6Ly9qZmx5LmlhbS51LXRva3lvLmFjLmpwL2NvbG9yLykKIyBUaGUgdmFyaWFudCBgcGFsZXR0ZV9Pa2FiZUl0b2AgY29udGFpbnMgYSBncmF5IGNvbG9yLCB3aGlsZSBgcGFsZXR0ZV9Pa2FiZUl0b19ibGFja2AgY29udGFpbnMgYmxhY2sgaW5zdGVhZAoKcGFsZXR0ZV9Pa2FiZUl0byA8LSBjKCIjRTY5RjAwIiwgIiM1NkI0RTkiLCAiIzAwOUU3MyIsICIjRjBFNDQyIiwgIiMwMDcyQjIiLCAiI0Q1NUUwMCIsICIjQ0M3OUE3IiwgIiM5OTk5OTkiKQoKcGllKHJlcCgxLCA4KSwgY29sID0gcGFsZXR0ZV9Pa2FiZUl0bykKCnBhbGV0dGVfT2thYmVJdG9fYmxhY2sgPC0gYygiI0U2OUYwMCIsICIjNTZCNEU5IiwgIiMwMDlFNzMiLCAiI0YwRTQ0MiIsICIjMDA3MkIyIiwgIiNENTVFMDAiLCAiI0NDNzlBNyIsICIjMDAwMDAwIikKCnBpZShyZXAoMSwgOCksIGNvbCA9IHBhbGV0dGVfT2thYmVJdG9fYmxhY2spCmBgYAoKIyMjIDI1IENvbG9ycwoKaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9hLzk1Njg2NTkgKGFyY2hpdmVkIGF0IGh0dHBzOi8vcGVybWEuY2MvNUFMWi0zQVFEKQoKYGBge3J9CmMyNSA8LSBjKAogICJkb2RnZXJibHVlMiIsICIjRTMxQTFDIiwgIyByZWQKICAiZ3JlZW40IiwKICAiIzZBM0Q5QSIsICMgcHVycGxlCiAgIiNGRjdGMDAiLCAjIG9yYW5nZQogICJibGFjayIsICJnb2xkMSIsCiAgInNreWJsdWUyIiwgIiNGQjlBOTkiLCAjIGx0IHBpbmsKICAicGFsZWdyZWVuMiIsCiAgIiNDQUIyRDYiLCAjIGx0IHB1cnBsZQogICIjRkRCRjZGIiwgIyBsdCBvcmFuZ2UKICAiZ3JheTcwIiwgImtoYWtpMiIsCiAgIm1hcm9vbiIsICJvcmNoaWQxIiwgImRlZXBwaW5rMSIsICJibHVlMSIsICJzdGVlbGJsdWU0IiwKICAiZGFya3R1cnF1b2lzZSIsICJncmVlbjEiLCAieWVsbG93NCIsICJ5ZWxsb3czIiwKICAiZGFya29yYW5nZTQiLCAiYnJvd24iCikKcGllKHJlcCgxLCAyNSksIGNvbCA9IGMyNSkKYGBgCgojIyMgMzYgQ29sb3JzCgpgYGB7cn0KIyBmcm9tOiBQb2x5Y2hyb21lOjpwYWxldHRlMzYuY29sb3JzKDM2KQoKYzM2IDwtIGMoIiM1QTUxNTYiLCIjRTRFMUUzIiwiI0Y2MjIyRSIsIiNGRTAwRkEiLCIjMTZGRjMyIiwiIzMyODNGRSIsIiNGRUFGMTYiLCIjQjAwMDY4IiwiIzFDRkZDRSIsIiM5MEFEMUMiLCIjMkVEOUZGIiwiI0RFQTBGRCIsIiNBQTBERkUiLCIjRjhBMTlGIiwiIzMyNUE5QiIsIiNDNDQ1MUMiLCIjMUM4MzU2IiwiIzg1NjYwRCIsIiNCMTBEQTEiLCIjRkJFNDI2IiwiIzFDQkU0RiIsIiNGQTAwODciLAoiI0ZDMUNCRiIsIiNGN0UxQTAiLCIjQzA3NUE2IiwiIzc4MkFCNiIsIiNBQUY0MDAiLCIjQkRDREZGIiwiIzgyMkUxQyIsIiNCNUVGQjUiLCIjN0VEN0QxIiwiIzFDN0Y5MyIsIiNEODVGRjciLCIjNjgzQjc5IiwiIzY2QjBGRiIsIiMzQjAwRkIiKQoKcGllKHJlcCgxLCAzNiksIGNvbCA9IGMzNikKYGBgCgojIyBNYXBzCgotIGh0dHBzOi8vZ2l0aHViLmNvbS90aG9tYXNwODUvc2NpY28KCiMgU2Vzc2lvbiBJbmZvCgpgYGB7cn0Kc2Vzc2lvbkluZm8oKQpgYGAKClteMV06IEFzayBtZSB0byBnaXZlIHlvdSBhY2Nlc3MuCg==



Developmental Psychopathology Lab