Bather up

library(tidyverse)
## Warning: package 'tidyverse' was built under R version 4.0.4
## -- Attaching packages --------------------------------------- tidyverse 1.3.0 --
## v ggplot2 3.3.3     v purrr   0.3.4
## v tibble  3.0.6     v dplyr   1.0.3
## v tidyr   1.1.2     v stringr 1.4.0
## v readr   1.4.0     v forcats 0.5.1
## -- Conflicts ------------------------------------------ tidyverse_conflicts() --
## x dplyr::filter() masks stats::filter()
## x dplyr::lag()    masks stats::lag()

The data

download.file("http://www.openintro.org/stat/data/mlb11.RData", destfile = "mlb11.RData")
load("mlb11.RData")

Exercice 1

plot(mlb11$runs ~ mlb11$at_bats)
fit <- lm(mlb11$runs~mlb11$at_bats)
abline(fit, col="red")

Answer: Yes, I’d be at ease using a linear model. Scatterplot is appropriate in this situation because runs and at bats have a strong association, as expected – the more at-bat chances a player gets, the more likely he or she is to strike the ball and score runs.

cor(mlb11$runs, mlb11$at_bats)
## [1] 0.610627

Sum of squared residutial

Exercice 2

Answer: The relationship between runs and at bats tends to be fairly linear, with a positive correlation, implying that as the number of at bats increases, so does the number of runs.

plot_ss(x = mlb11$at_bats, y = mlb11$runs)

## Click two points to make a line.
                                
## Call:
## lm(formula = y ~ x, data = pts)
## 
## Coefficients:
## (Intercept)            x  
##  -2789.2429       0.6305  
## 
## Sum of Squares:  123721.9
plot_ss(x = mlb11$at_bats, y = mlb11$runs, showSquares = TRUE)

## Click two points to make a line.
                                
## Call:
## lm(formula = y ~ x, data = pts)
## 
## Coefficients:
## (Intercept)            x  
##  -2789.2429       0.6305  
## 
## Sum of Squares:  123721.9

Exercice 3

plot_ss(x = mlb11$at_bats, y = mlb11$runs)

## Click two points to make a line.
                                
## Call:
## lm(formula = y ~ x, data = pts)
## 
## Coefficients:
## (Intercept)            x  
##  -2789.2429       0.6305  
## 
## Sum of Squares:  123721.9

Answer: No matter how many times I run this function, the sum of squares remains constant at 123721.9, so I presume the neighbors are the same.

The linear model

m1 <- lm(runs ~ at_bats, data = mlb11)
summary(m1)
## 
## Call:
## lm(formula = runs ~ at_bats, data = mlb11)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -125.58  -47.05  -16.59   54.40  176.87 
## 
## Coefficients:
##               Estimate Std. Error t value Pr(>|t|)    
## (Intercept) -2789.2429   853.6957  -3.267 0.002871 ** 
## at_bats         0.6305     0.1545   4.080 0.000339 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 66.47 on 28 degrees of freedom
## Multiple R-squared:  0.3729, Adjusted R-squared:  0.3505 
## F-statistic: 16.65 on 1 and 28 DF,  p-value: 0.0003388

Execrice 4

m2 <- lm(runs ~ homeruns, mlb11)
summary(m2)
## 
## Call:
## lm(formula = runs ~ homeruns, data = mlb11)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -91.615 -33.410   3.231  24.292 104.631 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept) 415.2389    41.6779   9.963 1.04e-10 ***
## homeruns      1.8345     0.2677   6.854 1.90e-07 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 51.29 on 28 degrees of freedom
## Multiple R-squared:  0.6266, Adjusted R-squared:  0.6132 
## F-statistic: 46.98 on 1 and 28 DF,  p-value: 1.9e-07

Answer: The least squares regression line for the linear model: runs^ = 415.2389 + 1.8345 ∗ homeruns

The slope of 1.8345: each homeruns contributes 1.8345 in number of runs. So, the more homeruns, the more runs.

Prediction and prediction error

plot(mlb11$runs ~ mlb11$at_bats)
abline(m1, col="red")

Exercice 5

at.bats <- 5578
hat.runs <- -2789.2429 + 0.6305 * at.bats
hat.runs
## [1] 727.6861

Answer: Based on the regression line, he would have expected 727.6861 runs. According to the numbers, a team with 5579 at bats has 713 runs. The disparity yields a -14.6861 negative residual, which overestimates the observation.

Model diagnistics

plot(m1$residuals ~ mlb11$at_bats)
abline(h = 0, lty = 3, col="red") 

Exercice 6

ANswer: No, there is not. In the resiudal plot, there is no discernible trend. The number of residual points above and below the line seems to be equal. As a result, the linear regression model is trustworthy.

hist(m1$residuals)

qqnorm(m1$residuals)
qqline(m1$residuals, col="red")  

Exercice 7

sd(m1$residuals)
## [1] 65.3167
summary(m1$residuals)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
## -125.58  -47.05  -16.59    0.00   54.40  176.87

Answer: Based on the histogram and the normal probability plot, the nearly normal residuals condition does appear to be met.

Exercice 8

Answer: Yes, it is roughly constant in the first scatterplot between at-bats and runs.

On Your Owm

Exercice 9

plot(mlb11$hits, mlb11$runs)
fit <- lm( mlb11$runs~mlb11$hits)
abline(fit, col="red")

Answer: It seems to be a linear relationship between hits and runs.

Exercice 10

m3 <- lm(runs ~ hits, mlb11)
# at_bats vs runs
summary(m1)
## 
## Call:
## lm(formula = runs ~ at_bats, data = mlb11)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -125.58  -47.05  -16.59   54.40  176.87 
## 
## Coefficients:
##               Estimate Std. Error t value Pr(>|t|)    
## (Intercept) -2789.2429   853.6957  -3.267 0.002871 ** 
## at_bats         0.6305     0.1545   4.080 0.000339 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 66.47 on 28 degrees of freedom
## Multiple R-squared:  0.3729, Adjusted R-squared:  0.3505 
## F-statistic: 16.65 on 1 and 28 DF,  p-value: 0.0003388

Answer: R^2 = 0.3729 with at_bats, 37.3% of the variability in runs is explained by at_bats.

# hits vs runs
summary(m3)
## 
## Call:
## lm(formula = runs ~ hits, data = mlb11)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -103.718  -27.179   -5.233   19.322  140.693 
## 
## Coefficients:
##              Estimate Std. Error t value Pr(>|t|)    
## (Intercept) -375.5600   151.1806  -2.484   0.0192 *  
## hits           0.7589     0.1071   7.085 1.04e-07 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 50.23 on 28 degrees of freedom
## Multiple R-squared:  0.6419, Adjusted R-squared:  0.6292 
## F-statistic:  50.2 on 1 and 28 DF,  p-value: 1.043e-07

Answer: R^2 = 0.6419 with hits, 64.2% of the variability in runs is explained by at_bats

We could state that hits is the better predictor looking at R^2

Exercice 11

cor(mlb11$runs, mlb11$homeruns)
## [1] 0.7915577
cor(mlb11$runs, mlb11$bat_avg)
## [1] 0.8099859
cor(mlb11$runs, mlb11$strikeouts)
## [1] -0.4115312
cor(mlb11$runs, mlb11$stolen_bases)
## [1] 0.05398141
cor(mlb11$runs, mlb11$wins)
## [1] 0.6008088

Answer: The data bat_avg seems to have the strongest relationship with runs of the standard variables. It has a correlation of 0.8099859, and the linear model shows 65.61 % of the variability in runs.

m4 <- lm(runs ~ bat_avg, mlb11)
plot(mlb11$runs ~ mlb11$bat_avg)
abline(m4, col="red")

summary(m4)
## 
## Call:
## lm(formula = runs ~ bat_avg, data = mlb11)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -94.676 -26.303  -5.496  28.482 131.113 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)   -642.8      183.1  -3.511  0.00153 ** 
## bat_avg       5242.2      717.3   7.308 5.88e-08 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 49.23 on 28 degrees of freedom
## Multiple R-squared:  0.6561, Adjusted R-squared:  0.6438 
## F-statistic: 53.41 on 1 and 28 DF,  p-value: 5.877e-08
plot_ss(x = mlb11$bat_avg, y = mlb11$runs, showSquares = TRUE)

## Click two points to make a line.
                                
## Call:
## lm(formula = y ~ x, data = pts)
## 
## Coefficients:
## (Intercept)            x  
##      -642.8       5242.2  
## 
## Sum of Squares:  67849.52
plot(m4$residuals ~ mlb11$bat_avg)
abline(h = 0, lty =3, col="red")

Execrice 12

cor(mlb11$runs, mlb11$new_onbase)
## [1] 0.9214691
cor(mlb11$runs, mlb11$new_slug)
## [1] 0.9470324
cor(mlb11$runs, mlb11$new_obs)
## [1] 0.9669163
m5 <- lm(runs ~ new_onbase, mlb11)
m6 <- lm(runs ~ new_slug, mlb11)
m7 <- lm(runs ~ new_obs, mlb11)
summary(m5)
## 
## Call:
## lm(formula = runs ~ new_onbase, data = mlb11)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -58.270 -18.335   3.249  19.520  69.002 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  -1118.4      144.5  -7.741 1.97e-08 ***
## new_onbase    5654.3      450.5  12.552 5.12e-13 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 32.61 on 28 degrees of freedom
## Multiple R-squared:  0.8491, Adjusted R-squared:  0.8437 
## F-statistic: 157.6 on 1 and 28 DF,  p-value: 5.116e-13
summary(m6)
## 
## Call:
## lm(formula = runs ~ new_slug, data = mlb11)
## 
## Residuals:
##    Min     1Q Median     3Q    Max 
## -45.41 -18.66  -0.91  16.29  52.29 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  -375.80      68.71   -5.47 7.70e-06 ***
## new_slug     2681.33     171.83   15.61 2.42e-15 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 26.96 on 28 degrees of freedom
## Multiple R-squared:  0.8969, Adjusted R-squared:  0.8932 
## F-statistic: 243.5 on 1 and 28 DF,  p-value: 2.42e-15
summary(m7)
## 
## Call:
## lm(formula = runs ~ new_obs, data = mlb11)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -43.456 -13.690   1.165  13.935  41.156 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  -686.61      68.93  -9.962 1.05e-10 ***
## new_obs      1919.36      95.70  20.057  < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 21.41 on 28 degrees of freedom
## Multiple R-squared:  0.9349, Adjusted R-squared:  0.9326 
## F-statistic: 402.3 on 1 and 28 DF,  p-value: < 2.2e-16
plot(mlb11$runs ~ mlb11$new_obs)
abline(m7, col="red")

Answer: The newer variables seem to be more efficient than the older ones. The new obs variable seems to have the largest R2 of all ten variables. This makes sense because being on base to hit extra bases would almost certainly result in runs for the team.

Exercice 13

plot(m7)

Answer: Linearity: there seems to be a strong relationship, based on scatterplot. / Normality: there seems to be a nearly normal residuals, based on histogram and qqplot. / Constant variability: the variability is roughly constant, based on residual plot. / Independent observations: could be assumed.

LS0tDQp0aXRsZTogIkxhYiAxMDogSW50cm9kdWN0aW9uIHRvIGxpbmVhciByZWdyZXNzaW9uIg0KYXV0aG9yOiAiQXVyaWFuZSBHcmlwcGkiDQpkYXRlOiAiYHIgU3lzLkRhdGUoKWAiDQpvdXRwdXQ6IG9wZW5pbnRybzo6bGFiX3JlcG9ydA0KLS0tDQoNCiMjIEJhdGhlciB1cA0KDQpgYGB7cn0NCmxpYnJhcnkodGlkeXZlcnNlKQ0KYGBgDQoNCg0KIyMgVGhlIGRhdGENCg0KYGBge3J9DQpkb3dubG9hZC5maWxlKCJodHRwOi8vd3d3Lm9wZW5pbnRyby5vcmcvc3RhdC9kYXRhL21sYjExLlJEYXRhIiwgZGVzdGZpbGUgPSAibWxiMTEuUkRhdGEiKQ0KbG9hZCgibWxiMTEuUkRhdGEiKQ0KYGBgDQoNCg0KIyMjIEV4ZXJjaWNlIDENCg0KYGBge3J9DQpwbG90KG1sYjExJHJ1bnMgfiBtbGIxMSRhdF9iYXRzKQ0KZml0IDwtIGxtKG1sYjExJHJ1bnN+bWxiMTEkYXRfYmF0cykNCmFibGluZShmaXQsIGNvbD0icmVkIikNCmBgYA0KDQpBbnN3ZXI6IFllcywgSSdkIGJlIGF0IGVhc2UgdXNpbmcgYSBsaW5lYXIgbW9kZWwuIFNjYXR0ZXJwbG90IGlzIGFwcHJvcHJpYXRlIGluIHRoaXMgc2l0dWF0aW9uIGJlY2F1c2UgcnVucyBhbmQgYXQgYmF0cyBoYXZlIGEgc3Ryb25nIGFzc29jaWF0aW9uLCBhcyBleHBlY3RlZCDigJMgdGhlIG1vcmUgYXQtYmF0IGNoYW5jZXMgYSBwbGF5ZXIgZ2V0cywgdGhlIG1vcmUgbGlrZWx5IGhlIG9yIHNoZSBpcyB0byBzdHJpa2UgdGhlIGJhbGwgYW5kIHNjb3JlIHJ1bnMuDQoNCg0KYGBge3J9DQpjb3IobWxiMTEkcnVucywgbWxiMTEkYXRfYmF0cykNCmBgYA0KDQoNCiMjIFN1bSBvZiBzcXVhcmVkIHJlc2lkdXRpYWwNCg0KIyMjIEV4ZXJjaWNlIDINCg0KQW5zd2VyOiBUaGUgcmVsYXRpb25zaGlwIGJldHdlZW4gcnVucyBhbmQgYXQgYmF0cyB0ZW5kcyB0byBiZSBmYWlybHkgbGluZWFyLCB3aXRoIGEgcG9zaXRpdmUgY29ycmVsYXRpb24sIGltcGx5aW5nIHRoYXQgYXMgdGhlIG51bWJlciBvZiBhdCBiYXRzIGluY3JlYXNlcywgc28gZG9lcyB0aGUgbnVtYmVyIG9mIHJ1bnMuDQoNCg0KYGBge3J9DQpwbG90X3NzKHggPSBtbGIxMSRhdF9iYXRzLCB5ID0gbWxiMTEkcnVucykNCmBgYA0KDQpgYGB7cn0NCnBsb3Rfc3MoeCA9IG1sYjExJGF0X2JhdHMsIHkgPSBtbGIxMSRydW5zLCBzaG93U3F1YXJlcyA9IFRSVUUpDQpgYGANCg0KIyMjIEV4ZXJjaWNlIDMNCg0KYGBge3J9DQpwbG90X3NzKHggPSBtbGIxMSRhdF9iYXRzLCB5ID0gbWxiMTEkcnVucykNCmBgYA0KDQpBbnN3ZXI6IE5vIG1hdHRlciBob3cgbWFueSB0aW1lcyBJIHJ1biB0aGlzIGZ1bmN0aW9uLCB0aGUgc3VtIG9mIHNxdWFyZXMgcmVtYWlucyBjb25zdGFudCBhdCAxMjM3MjEuOSwgc28gSSBwcmVzdW1lIHRoZSBuZWlnaGJvcnMgYXJlIHRoZSBzYW1lLg0KDQoNCiMjIFRoZSBsaW5lYXIgbW9kZWwNCg0KYGBge3J9DQptMSA8LSBsbShydW5zIH4gYXRfYmF0cywgZGF0YSA9IG1sYjExKQ0KYGBgDQoNCmBgYHtyfQ0Kc3VtbWFyeShtMSkNCmBgYA0KDQojIyMgRXhlY3JpY2UgNA0KDQpgYGB7cn0NCm0yIDwtIGxtKHJ1bnMgfiBob21lcnVucywgbWxiMTEpDQpzdW1tYXJ5KG0yKQ0KYGBgDQoNCkFuc3dlcjogVGhlIGxlYXN0IHNxdWFyZXMgcmVncmVzc2lvbiBsaW5lIGZvciB0aGUgbGluZWFyIG1vZGVsOiBydW5zXiA9IDQxNS4yMzg5ICsgMS44MzQ1IOKIlyBob21lcnVucw0KDQpUaGUgc2xvcGUgb2YgMS44MzQ1OiBlYWNoIGhvbWVydW5zIGNvbnRyaWJ1dGVzIDEuODM0NSBpbiBudW1iZXIgb2YgcnVucy4gU28sIHRoZSBtb3JlIGhvbWVydW5zLCB0aGUgbW9yZSBydW5zLg0KDQoNCiMjIFByZWRpY3Rpb24gYW5kIHByZWRpY3Rpb24gZXJyb3INCg0KYGBge3J9DQpwbG90KG1sYjExJHJ1bnMgfiBtbGIxMSRhdF9iYXRzKQ0KYWJsaW5lKG0xLCBjb2w9InJlZCIpDQpgYGANCg0KIyMjIEV4ZXJjaWNlIDUNCg0KYGBge3J9DQphdC5iYXRzIDwtIDU1NzgNCmhhdC5ydW5zIDwtIC0yNzg5LjI0MjkgKyAwLjYzMDUgKiBhdC5iYXRzDQpoYXQucnVucw0KYGBgDQoNCkFuc3dlcjogQmFzZWQgb24gdGhlIHJlZ3Jlc3Npb24gbGluZSwgaGUgd291bGQgaGF2ZSBleHBlY3RlZCA3MjcuNjg2MSBydW5zLiBBY2NvcmRpbmcgdG8gdGhlIG51bWJlcnMsIGEgdGVhbSB3aXRoIDU1NzkgYXQgYmF0cyBoYXMgNzEzIHJ1bnMuIFRoZSBkaXNwYXJpdHkgeWllbGRzIGEgLTE0LjY4NjEgbmVnYXRpdmUgcmVzaWR1YWwsIHdoaWNoIG92ZXJlc3RpbWF0ZXMgdGhlIG9ic2VydmF0aW9uLg0KDQoNCiMjIE1vZGVsIGRpYWduaXN0aWNzDQoNCmBgYHtyfQ0KcGxvdChtMSRyZXNpZHVhbHMgfiBtbGIxMSRhdF9iYXRzKQ0KYWJsaW5lKGggPSAwLCBsdHkgPSAzLCBjb2w9InJlZCIpIA0KYGBgDQoNCiMjIyBFeGVyY2ljZSA2DQoNCkFOc3dlcjogTm8sIHRoZXJlIGlzIG5vdC4gSW4gdGhlIHJlc2l1ZGFsIHBsb3QsIHRoZXJlIGlzIG5vIGRpc2Nlcm5pYmxlIHRyZW5kLiBUaGUgbnVtYmVyIG9mIHJlc2lkdWFsIHBvaW50cyBhYm92ZSBhbmQgYmVsb3cgdGhlIGxpbmUgc2VlbXMgdG8gYmUgZXF1YWwuIEFzIGEgcmVzdWx0LCB0aGUgbGluZWFyIHJlZ3Jlc3Npb24gbW9kZWwgaXMgdHJ1c3R3b3J0aHkuDQoNCg0KYGBge3J9DQpoaXN0KG0xJHJlc2lkdWFscykNCmBgYA0KDQpgYGB7cn0NCnFxbm9ybShtMSRyZXNpZHVhbHMpDQpxcWxpbmUobTEkcmVzaWR1YWxzLCBjb2w9InJlZCIpICANCmBgYA0KDQojIyMgRXhlcmNpY2UgNw0KDQpgYGB7cn0NCnNkKG0xJHJlc2lkdWFscykNCnN1bW1hcnkobTEkcmVzaWR1YWxzKQ0KYGBgDQoNCkFuc3dlcjogQmFzZWQgb24gdGhlIGhpc3RvZ3JhbSBhbmQgdGhlIG5vcm1hbCBwcm9iYWJpbGl0eSBwbG90LCB0aGUgbmVhcmx5IG5vcm1hbCByZXNpZHVhbHMgY29uZGl0aW9uIGRvZXMgYXBwZWFyIHRvIGJlIG1ldC4NCg0KDQojIyMgRXhlcmNpY2UgOA0KDQpBbnN3ZXI6IFllcywgaXQgaXMgcm91Z2hseSBjb25zdGFudCBpbiB0aGUgZmlyc3Qgc2NhdHRlcnBsb3QgYmV0d2VlbiBhdC1iYXRzIGFuZCBydW5zLg0KDQoNCiMjIE9uIFlvdXIgT3dtDQoNCiMjIyBFeGVyY2ljZSA5DQoNCmBgYHtyfQ0KcGxvdChtbGIxMSRoaXRzLCBtbGIxMSRydW5zKQ0KZml0IDwtIGxtKCBtbGIxMSRydW5zfm1sYjExJGhpdHMpDQphYmxpbmUoZml0LCBjb2w9InJlZCIpDQpgYGANCg0KQW5zd2VyOiBJdCBzZWVtcyB0byBiZSBhIGxpbmVhciByZWxhdGlvbnNoaXAgYmV0d2VlbiBoaXRzIGFuZCBydW5zLg0KDQojIyMgRXhlcmNpY2UgMTANCg0KYGBge3J9DQptMyA8LSBsbShydW5zIH4gaGl0cywgbWxiMTEpDQpgYGANCg0KYGBge3J9DQojIGF0X2JhdHMgdnMgcnVucw0Kc3VtbWFyeShtMSkNCmBgYA0KDQpBbnN3ZXI6IFJeMiA9IDAuMzcyOSB3aXRoIGF0X2JhdHMsIDM3LjMlIG9mIHRoZSB2YXJpYWJpbGl0eSBpbiBydW5zIGlzIGV4cGxhaW5lZCBieSBhdF9iYXRzLg0KDQpgYGB7cn0NCiMgaGl0cyB2cyBydW5zDQpzdW1tYXJ5KG0zKQ0KYGBgDQoNCkFuc3dlcjogUl4yID0gMC42NDE5IHdpdGggaGl0cywgNjQuMiUgb2YgdGhlIHZhcmlhYmlsaXR5IGluIHJ1bnMgaXMgZXhwbGFpbmVkIGJ5IGF0X2JhdHMNCg0KV2UgY291bGQgc3RhdGUgdGhhdCBoaXRzIGlzIHRoZSBiZXR0ZXIgcHJlZGljdG9yIGxvb2tpbmcgYXQgUl4yDQoNCg0KIyMjIEV4ZXJjaWNlIDExDQoNCmBgYHtyfQ0KY29yKG1sYjExJHJ1bnMsIG1sYjExJGhvbWVydW5zKQ0KYGBgDQoNCmBgYHtyfQ0KY29yKG1sYjExJHJ1bnMsIG1sYjExJGJhdF9hdmcpDQpgYGANCg0KYGBge3J9DQpjb3IobWxiMTEkcnVucywgbWxiMTEkc3RyaWtlb3V0cykNCmBgYA0KDQpgYGB7cn0NCmNvcihtbGIxMSRydW5zLCBtbGIxMSRzdG9sZW5fYmFzZXMpDQpgYGANCg0KYGBge3J9DQpjb3IobWxiMTEkcnVucywgbWxiMTEkd2lucykNCmBgYA0KDQpBbnN3ZXI6IFRoZSBkYXRhIGJhdF9hdmcgc2VlbXMgdG8gaGF2ZSB0aGUgc3Ryb25nZXN0IHJlbGF0aW9uc2hpcCB3aXRoIHJ1bnMgb2YgdGhlIHN0YW5kYXJkIHZhcmlhYmxlcy4gSXQgaGFzIGEgY29ycmVsYXRpb24gb2YgMC44MDk5ODU5LCBhbmQgdGhlIGxpbmVhciBtb2RlbCBzaG93cyA2NS42MSAlIG9mIHRoZSB2YXJpYWJpbGl0eSBpbiBydW5zLg0KDQpgYGB7cn0NCm00IDwtIGxtKHJ1bnMgfiBiYXRfYXZnLCBtbGIxMSkNCnBsb3QobWxiMTEkcnVucyB+IG1sYjExJGJhdF9hdmcpDQphYmxpbmUobTQsIGNvbD0icmVkIikNCmBgYA0KDQpgYGB7cn0NCnN1bW1hcnkobTQpDQpgYGANCg0KYGBge3J9DQpwbG90X3NzKHggPSBtbGIxMSRiYXRfYXZnLCB5ID0gbWxiMTEkcnVucywgc2hvd1NxdWFyZXMgPSBUUlVFKQ0KYGBgDQoNCmBgYHtyfQ0KcGxvdChtNCRyZXNpZHVhbHMgfiBtbGIxMSRiYXRfYXZnKQ0KYWJsaW5lKGggPSAwLCBsdHkgPTMsIGNvbD0icmVkIikNCmBgYA0KDQoNCiMjIyBFeGVjcmljZSAxMg0KDQpgYGB7cn0NCmNvcihtbGIxMSRydW5zLCBtbGIxMSRuZXdfb25iYXNlKQ0KYGBgDQoNCmBgYHtyfQ0KY29yKG1sYjExJHJ1bnMsIG1sYjExJG5ld19zbHVnKQ0KYGBgDQoNCmBgYHtyfQ0KY29yKG1sYjExJHJ1bnMsIG1sYjExJG5ld19vYnMpDQpgYGANCg0KYGBge3J9DQptNSA8LSBsbShydW5zIH4gbmV3X29uYmFzZSwgbWxiMTEpDQptNiA8LSBsbShydW5zIH4gbmV3X3NsdWcsIG1sYjExKQ0KbTcgPC0gbG0ocnVucyB+IG5ld19vYnMsIG1sYjExKQ0KYGBgDQoNCmBgYHtyfQ0Kc3VtbWFyeShtNSkNCmBgYA0KDQpgYGB7cn0NCnN1bW1hcnkobTYpDQpgYGANCg0KYGBge3J9DQpzdW1tYXJ5KG03KQ0KYGBgDQoNCmBgYHtyfQ0KcGxvdChtbGIxMSRydW5zIH4gbWxiMTEkbmV3X29icykNCmFibGluZShtNywgY29sPSJyZWQiKQ0KYGBgDQoNCkFuc3dlcjogVGhlIG5ld2VyIHZhcmlhYmxlcyBzZWVtIHRvIGJlIG1vcmUgZWZmaWNpZW50IHRoYW4gdGhlIG9sZGVyIG9uZXMuIFRoZSBuZXcgb2JzIHZhcmlhYmxlIHNlZW1zIHRvIGhhdmUgdGhlIGxhcmdlc3QgUjIgb2YgYWxsIHRlbiB2YXJpYWJsZXMuIFRoaXMgbWFrZXMgc2Vuc2UgYmVjYXVzZSBiZWluZyBvbiBiYXNlIHRvIGhpdCBleHRyYSBiYXNlcyB3b3VsZCBhbG1vc3QgY2VydGFpbmx5IHJlc3VsdCBpbiBydW5zIGZvciB0aGUgdGVhbS4NCg0KIyMjIEV4ZXJjaWNlIDEzDQoNCmBgYHtyfQ0KcGxvdChtNykNCmBgYA0KDQpBbnN3ZXI6IA0KTGluZWFyaXR5OiB0aGVyZSBzZWVtcyB0byBiZSBhIHN0cm9uZyByZWxhdGlvbnNoaXAsIGJhc2VkIG9uIHNjYXR0ZXJwbG90LiAvIE5vcm1hbGl0eTogdGhlcmUgc2VlbXMgdG8gYmUgYSBuZWFybHkgbm9ybWFsIHJlc2lkdWFscywgYmFzZWQgb24gaGlzdG9ncmFtIGFuZCBxcXBsb3QuIC8gQ29uc3RhbnQgdmFyaWFiaWxpdHk6ICB0aGUgdmFyaWFiaWxpdHkgaXMgcm91Z2hseSBjb25zdGFudCwgYmFzZWQgb24gcmVzaWR1YWwgcGxvdC4gLyBJbmRlcGVuZGVudCBvYnNlcnZhdGlvbnM6IGNvdWxkIGJlIGFzc3VtZWQuDQoNCg==