1 Introduction

1.0.1 Description

In this data set we have data from the 2008 NFL season. More specifically we have factors that go into NFL fielgoals. Some variables include the kicking team, Name, Distance, timerem, defscore, and GOOD.

Kicking team - Name of the kicking team (categorical) Name - Name of the kicker Distance - How far the ball is from the goal Time Remaining - How much time is on the game clock remaining in the game Defensive Score - The score of the opposing team GOOD - If the field goal is made or not, a 1 for a make and 0 for a miss

1.0.2 Question

From general knowledge most fans assume that the longer the distance it becomes less likely for a field goal to be made. Our question for this analysis is to see if this statement remains true. We will be exploring the association between a made field goal and distance

1.0.3 Data Cleaning

fieldgoals <- read.csv("https://raw.githubusercontent.com/TylerBattaglini/STA-321/refs/heads/main/nfl2008_fga.csv", header = TRUE)
clean_fieldgoals <- na.omit(fieldgoals)
clean_fieldgoals <- clean_fieldgoals %>% select(-GameDate, -AwayTeam, -HomeTeam, -qtr, -min, -sec, -def, -down, -togo, -kicker, -ydline, -homekick, -offscore, -season, -Missed, -Blocked)
y0=clean_fieldgoals$GOOD
fieldgoal.01 = rep(0, length(y0))
fieldgoal.01[which(y0=="pos")] = 1
clean_fieldgoals$fieldgoal.01 = fieldgoal.01
head(clean_fieldgoals)
  kickteam        name distance kickdiff timerem defscore GOOD fieldgoal.01
1      IND A.Vinatieri       30       -3    2822        3    1            0
2      IND A.Vinatieri       46        0    3287        0    1            0
3      IND A.Vinatieri       28        7    2720        0    1            0
4      IND A.Vinatieri       37       14    2742        0    1            0
5      IND A.Vinatieri       39        0    3056        0    1            0
6      IND A.Vinatieri       40       -3    3043        3    1            0

We take out any observations with a missing value. We also take out many variables due to there being a high likeleyhood for multicollineairty. We already have a variable for time so we eliminated many variables related to time. We also already have a variable for a make so we do not need any for a miss or blocked, that would just be a repeat our data. The others are just categorical variables that are to identify the kicker or kicking team which again we already have variables that describe that.

2 Data Analysis

ylimit = max(density(clean_fieldgoals$distance)$y)
hist(clean_fieldgoals$distance, probability = TRUE, main = "Distance", xlab="Dis", 
       col = "azure1", border="lightseagreen")
  lines(density(clean_fieldgoals$distance, adjust=2), col="blue") 

We do an exploritory data anylsis on our predictor variable. We see from the histogram above that there is no skew which means there is no imbalanace.

s.logit = glm(GOOD ~ distance, 
          family = binomial(link = "logit"),
          data = clean_fieldgoals)                 
result = summary(s.logit)
result

Call:
glm(formula = GOOD ~ distance, family = binomial(link = "logit"), 
    data = clean_fieldgoals)

Coefficients:
            Estimate Std. Error z value Pr(>|z|)    
(Intercept)   6.7056     0.5480  12.236   <2e-16 ***
distance     -0.1194     0.0124  -9.631   <2e-16 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 809.65  on 1036  degrees of freedom
Residual deviance: 686.12  on 1035  degrees of freedom
AIC: 690.12

Number of Fisher Scoring iterations: 6
model.coef.stats = summary(s.logit)$coef      
conf.ci = confint(s.logit)                    
Waiting for profiling to be done...
sum.stats = cbind(model.coef.stats, conf.ci.95=conf.ci)
kable(sum.stats,caption = "The summary stats of regression coefficients") 
The summary stats of regression coefficients
Estimate Std. Error z value Pr(>|z|) 2.5 % 97.5 %
(Intercept) 6.7056029 0.5480144 12.236179 0 5.6755150 7.8271583
distance -0.1194428 0.0124020 -9.630942 0 -0.1445903 -0.0958982

From ouroutput above we see that distance is negatively asscoiated with a made field goal. Our estimate is equal to -.1194. Our 95% CI is [-.144, -.095]. This confidence interval also supports our hypothesis.

model.coef.stats = summary(s.logit)$coef
odds.ratio = exp(coef(s.logit))
out.stats = cbind(model.coef.stats, odds.ratio = odds.ratio)                 
kable(out.stats,caption = "Summary Stats with Odds Ratios")
Summary Stats with Odds Ratios
Estimate Std. Error z value Pr(>|z|) odds.ratio
(Intercept) 6.7056029 0.5480144 12.236179 0 816.9704676
distance -0.1194428 0.0124020 -9.630942 0 0.8874148

Now we convert our estimate to an odds ratio. The odds ratio associated with distance is .887 meaning that as distance increases by one unit, the odds of being a made field goal goes down by 11.3%.

bmi.range = range(clean_fieldgoals$distance)
x = seq(bmi.range[1], bmi.range[2], length = 200)
beta.x = coef(s.logit)[1] + coef(s.logit)[2]*x
success.prob = exp(beta.x)/(1+exp(beta.x))
failure.prob = 1/(1+exp(beta.x))
ylimit = max(success.prob, failure.prob)
##
beta1 = coef(s.logit)[2]
success.prob.rate = beta1*exp(beta.x)/(1+exp(beta.x))^2
##
##
par(mfrow = c(1,2))
plot(x, success.prob, type = "l", lwd = 2, col = "navy",
     main = "The probability of being \n a made field goal", 
     ylim=c(0, 1.1*ylimit),
     xlab = "distance",
     ylab = "probability",
     axes = FALSE,
     col.main = "navy",
     cex.main = 0.8)
# lines(x, failure.prob,lwd = 2, col = "darkred")
axis(1, pos = 0)
axis(2)

The graph above is our S curve which is pointing down like we think it would because it shows probability of a made field goal as distance goes up. We see that the probability of a field goal goes down as the distance goes up.

3 Conclusion

We used a real world dataset of the 2008 NFL season of NFL kicking field goals. We have concluded from the analysis above that our hypothesis is correct. As the distance of a field goal goes up in distance the probability of a make goes down.

LS0tDQp0aXRsZTogIkZhY3RvcnMgSW5mbHVlbmNlIE5GTCBGaWVsZCBHb2FscyINCmF1dGhvcjogJ1R5bGVyIEJhdHRhZ2xpbmknDQpkYXRlOiAiMjAyNC0xMC0xMSINCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDogDQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZGVwdGg6IDQNCiAgICB0b2NfZmxvYXQ6IHllcw0KICAgIGZpZ193aWR0aDogNA0KICAgIGZpZ19jYXB0aW9uOiB5ZXMNCiAgICBudW1iZXJfc2VjdGlvbnM6IHllcw0KICAgIHRvY19jb2xsYXBzZWQ6IHllcw0KICAgIGNvZGVfZm9sZGluZzogaGlkZQ0KICAgIGNvZGVfZG93bmxvYWQ6IHllcw0KICAgIHNtb290aF9zY3JvbGw6IHllcw0KICAgIHRoZW1lOiBsdW1lbg0KICB3b3JkX2RvY3VtZW50OiANCiAgICB0b2M6IHllcw0KICAgIHRvY19kZXB0aDogNA0KICAgIGZpZ19jYXB0aW9uOiB5ZXMNCiAgICBrZWVwX21kOiB5ZXMNCiAgcGRmX2RvY3VtZW50OiANCiAgICB0b2M6IHllcw0KICAgIHRvY19kZXB0aDogNA0KICAgIGZpZ19jYXB0aW9uOiB5ZXMNCiAgICBudW1iZXJfc2VjdGlvbnM6IHllcw0KICAgIGZpZ193aWR0aDogMw0KICAgIGZpZ19oZWlnaHQ6IDMNCmVkaXRvcl9vcHRpb25zOiANCiAgY2h1bmtfb3V0cHV0X3R5cGU6IGlubGluZQ0KYWx3YXlzX2FsbG93X2h0bWw6IHRydWUNCi0tLQ0KDQpgYGB7PWh0bWx9DQoNCjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+DQoNCi8qIENhc2NhZGluZyBTdHlsZSBTaGVldHMgKENTUykgaXMgYSBzdHlsZXNoZWV0IGxhbmd1YWdlIHVzZWQgdG8gZGVzY3JpYmUgdGhlIHByZXNlbnRhdGlvbiBvZiBhIGRvY3VtZW50IHdyaXR0ZW4gaW4gSFRNTCBvciBYTUwuIGl0IGlzIGEgc2ltcGxlIG1lY2hhbmlzbSBmb3IgYWRkaW5nIHN0eWxlIChlLmcuLCBmb250cywgY29sb3JzLCBzcGFjaW5nKSB0byBXZWIgZG9jdW1lbnRzLiAqLw0KDQpoMS50aXRsZSB7ICAvKiBUaXRsZSAtIGZvbnQgc3BlY2lmaWNhdGlvbnMgb2YgdGhlIHJlcG9ydCB0aXRsZSAqLw0KICBmb250LXNpemU6IDI0cHg7DQogIGZvbnQtd2VpZ2h0OiBib2xkOw0KICBjb2xvcjogRGFya1JlZDsNCiAgdGV4dC1hbGlnbjogY2VudGVyOw0KICBmb250LWZhbWlseTogIkdpbGwgU2FucyIsIHNhbnMtc2VyaWY7DQp9DQpoNC5hdXRob3IgeyAvKiBIZWFkZXIgNCAtIGZvbnQgc3BlY2lmaWNhdGlvbnMgZm9yIGF1dGhvcnMgICovDQogIGZvbnQtc2l6ZTogMjBweDsNCiAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogIGZvbnQtZmFtaWx5OiBzeXN0ZW0tdWk7DQogIGNvbG9yOiBEYXJrUmVkOw0KICB0ZXh0LWFsaWduOiBjZW50ZXI7DQp9DQpoNC5kYXRlIHsgLyogSGVhZGVyIDQgLSBmb250IHNwZWNpZmljYXRpb25zIGZvciB0aGUgZGF0ZSAgKi8NCiAgZm9udC1zaXplOiAxOHB4Ow0KICBmb250LXdlaWdodDogYm9sZDsNCiAgZm9udC1mYW1pbHk6IHN5c3RlbS11aTsNCiAgY29sb3I6IERhcmtCbHVlOw0KICB0ZXh0LWFsaWduOiBjZW50ZXI7DQp9DQpoMSB7IC8qIEhlYWRlciAxIC0gZm9udCBzcGVjaWZpY2F0aW9ucyBmb3IgbGV2ZWwgMSBzZWN0aW9uIHRpdGxlICAqLw0KICAgIGZvbnQtc2l6ZTogMjJweDsNCiAgICBmb250LXdlaWdodDogYm9sZDsNCiAgICBmb250LWZhbWlseTogc3lzdGVtLXVpOw0KICAgIGNvbG9yOiBuYXZ5Ow0KICAgIHRleHQtYWxpZ246IGxlZnQ7DQp9DQpoMiB7IC8qIEhlYWRlciAyIC0gZm9udCBzcGVjaWZpY2F0aW9ucyBmb3IgbGV2ZWwgMiBzZWN0aW9uIHRpdGxlICovDQogICAgZm9udC1zaXplOiAyMHB4Ow0KICAgIGZvbnQtd2VpZ2h0OiBib2xkOw0KICAgIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICAgIGNvbG9yOiBuYXZ5Ow0KICAgIHRleHQtYWxpZ246IGxlZnQ7DQp9DQoNCmgzIHsgLyogSGVhZGVyIDMgLSBmb250IHNwZWNpZmljYXRpb25zIG9mIGxldmVsIDMgc2VjdGlvbiB0aXRsZSAgKi8NCiAgICBmb250LXNpemU6IDE4cHg7DQogICAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogICAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7DQogICAgY29sb3I6IG5hdnk7DQogICAgdGV4dC1hbGlnbjogbGVmdDsNCn0NCg0KaDQgeyAvKiBIZWFkZXIgNCAtIGZvbnQgc3BlY2lmaWNhdGlvbnMgb2YgbGV2ZWwgNCBzZWN0aW9uIHRpdGxlICAqLw0KICAgIGZvbnQtc2l6ZTogMThweDsNCiAgICBmb250LXdlaWdodDogYm9sZDsNCiAgICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsNCiAgICBjb2xvcjogZGFya3JlZDsNCiAgICB0ZXh0LWFsaWduOiBsZWZ0Ow0KfQ0KDQpib2R5IHsgYmFja2dyb3VuZC1jb2xvcjp3aGl0ZTsgfQ0KDQouaGlnaGxpZ2h0bWUgeyBiYWNrZ3JvdW5kLWNvbG9yOnllbGxvdzsgfQ0KDQpwIHsgYmFja2dyb3VuZC1jb2xvcjp3aGl0ZTsgfQ0KDQo8L3N0eWxlPg0KYGBgDQoNCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQ0KIyBEZXRlY3QsIGluc3RhbGwgYW5kIGxvYWQgcGFja2FnZXMgaWYgbmVlZGVkLg0KaWYgKCFyZXF1aXJlKCJrbml0ciIpKSB7DQogICBpbnN0YWxsLnBhY2thZ2VzKCJrbml0ciIpDQogICBsaWJyYXJ5KGtuaXRyKQ0KfQ0KaWYgKCFyZXF1aXJlKCJNQVNTIikpIHsNCiAgIGluc3RhbGwucGFja2FnZXMoIk1BU1MiKQ0KICAgbGlicmFyeShNQVNTKQ0KfQ0KaWYgKCFyZXF1aXJlKCJubGVxc2x2IikpIHsNCiAgIGluc3RhbGwucGFja2FnZXMoIm5sZXFzbHYiKQ0KICAgbGlicmFyeShubGVxc2x2KQ0KfQ0KIw0KaWYgKCFyZXF1aXJlKCJwYW5kZXIiKSkgew0KICAgaW5zdGFsbC5wYWNrYWdlcygicGFuZGVyIikNCiAgIGxpYnJhcnkocGFuZGVyKQ0KfQ0KDQppZiAoIXJlcXVpcmUoInBzeWNoIikpIHsgICANCiAgaW5zdGFsbC5wYWNrYWdlcygicHN5Y2giKQ0KICAgbGlicmFyeShwc3ljaCkNCn0NCmlmICghcmVxdWlyZSgiTUFTUyIpKSB7ICAgDQogIGluc3RhbGwucGFja2FnZXMoIk1BU1MiKQ0KICAgbGlicmFyeShNQVNTKQ0KfQ0KaWYgKCFyZXF1aXJlKCJnZ3Bsb3QyIikpIHsgICANCiAgaW5zdGFsbC5wYWNrYWdlcygiZ2dwbG90MiIpDQogICBsaWJyYXJ5KGdncGxvdDIpDQp9DQppZiAoIXJlcXVpcmUoIkdHYWxseSIpKSB7ICAgDQogIGluc3RhbGwucGFja2FnZXMoIkdHYWxseSIpDQogICBsaWJyYXJ5KEdHYWxseSkNCn0NCmlmICghcmVxdWlyZSgiY2FyIikpIHsgICANCiAgaW5zdGFsbC5wYWNrYWdlcygiY2FyIikNCiAgIGxpYnJhcnkoY2FyKQ0KfQ0KaWYgKCFyZXF1aXJlKCJkcGx5ciIpKSB7ICAgDQogIGluc3RhbGwucGFja2FnZXMoImRwbHlyIikNCiAgIGxpYnJhcnkoZHBseXIpDQp9DQppZiAoIXJlcXVpcmUoImNhcmV0IikpIHsgICANCiAgaW5zdGFsbC5wYWNrYWdlcygiY2FyZXQiKQ0KICAgbGlicmFyeShjYXJldCkNCn0NCg0KIyBzcGVjaWZpY2F0aW9ucyBvZiBvdXRwdXRzIG9mIGNvZGUgaW4gY29kZSBjaHVua3MNCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSwgICAgICAjIGluY2x1ZGUgY29kZSBjaHVuayBpbiB0aGUgb3V0cHV0IGZpbGUNCiAgICAgICAgICAgICAgICAgICAgICB3YXJuaW5ncyA9IEZBTFNFLCAgIyBzb21ldGltZXMsIHlvdSBjb2RlIG1heSBwcm9kdWNlIHdhcm5pbmcgbWVzc2FnZXMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgeW91IGNhbiBjaG9vc2UgdG8gaW5jbHVkZSB0aGUgd2FybmluZyBtZXNzYWdlcyBpbg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHRoZSBvdXRwdXQgZmlsZS4gDQogICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZXMgPSBGQUxTRSwgICMNCiAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzID0gVFJVRSwNCiAgICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICBjb21tZW50ID0gTkEgICAgICAgIyB5b3UgY2FuIGFsc28gZGVjaWRlIHdoZXRoZXIgdG8gaW5jbHVkZSB0aGUgb3V0cHV0DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgaW4gdGhlIG91dHB1dCBmaWxlLg0KICAgICAgICAgICAgICAgICAgICAgICkgICANCmBgYA0KDQojIEludHJvZHVjdGlvbg0KDQojIyMgRGVzY3JpcHRpb24NCkluIHRoaXMgZGF0YSBzZXQgd2UgaGF2ZSBkYXRhIGZyb20gdGhlIDIwMDggTkZMIHNlYXNvbi4gTW9yZSBzcGVjaWZpY2FsbHkgd2UgaGF2ZSBmYWN0b3JzIHRoYXQgZ28gaW50byBORkwgZmllbGdvYWxzLiBTb21lIHZhcmlhYmxlcyBpbmNsdWRlIHRoZSBraWNraW5nIHRlYW0sIE5hbWUsIERpc3RhbmNlLCB0aW1lcmVtLCBkZWZzY29yZSwgYW5kIEdPT0QuDQoNCktpY2tpbmcgdGVhbSAtIE5hbWUgb2YgdGhlIGtpY2tpbmcgdGVhbSAoY2F0ZWdvcmljYWwpDQpOYW1lIC0gTmFtZSBvZiB0aGUga2lja2VyDQpEaXN0YW5jZSAtIEhvdyBmYXIgdGhlIGJhbGwgaXMgZnJvbSB0aGUgZ29hbA0KVGltZSBSZW1haW5pbmcgLSBIb3cgbXVjaCB0aW1lIGlzIG9uIHRoZSBnYW1lIGNsb2NrIHJlbWFpbmluZyBpbiB0aGUgZ2FtZQ0KRGVmZW5zaXZlIFNjb3JlIC0gVGhlIHNjb3JlIG9mIHRoZSBvcHBvc2luZyB0ZWFtDQpHT09EIC0gSWYgdGhlIGZpZWxkIGdvYWwgaXMgbWFkZSBvciBub3QsIGEgMSBmb3IgYSBtYWtlIGFuZCAwIGZvciBhIG1pc3MNCg0KIyMjIFF1ZXN0aW9uDQoNCkZyb20gZ2VuZXJhbCBrbm93bGVkZ2UgbW9zdCBmYW5zIGFzc3VtZSB0aGF0IHRoZSBsb25nZXIgdGhlIGRpc3RhbmNlIGl0IGJlY29tZXMgbGVzcyBsaWtlbHkgZm9yIGEgZmllbGQgZ29hbCB0byBiZSBtYWRlLiBPdXIgcXVlc3Rpb24gZm9yIHRoaXMgYW5hbHlzaXMgaXMgdG8gc2VlIGlmIHRoaXMgc3RhdGVtZW50IHJlbWFpbnMgdHJ1ZS4gV2Ugd2lsbCBiZSBleHBsb3JpbmcgdGhlIGFzc29jaWF0aW9uIGJldHdlZW4gYSBtYWRlIGZpZWxkIGdvYWwgYW5kIGRpc3RhbmNlDQoNCiMjIyBEYXRhIENsZWFuaW5nDQoNCmBgYHtyfQ0KDQpmaWVsZGdvYWxzIDwtIHJlYWQuY3N2KCJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vVHlsZXJCYXR0YWdsaW5pL1NUQS0zMjEvcmVmcy9oZWFkcy9tYWluL25mbDIwMDhfZmdhLmNzdiIsIGhlYWRlciA9IFRSVUUpDQoNCmBgYA0KDQpgYGB7cn0NCmNsZWFuX2ZpZWxkZ29hbHMgPC0gbmEub21pdChmaWVsZGdvYWxzKQ0KY2xlYW5fZmllbGRnb2FscyA8LSBjbGVhbl9maWVsZGdvYWxzICU+JSBzZWxlY3QoLUdhbWVEYXRlLCAtQXdheVRlYW0sIC1Ib21lVGVhbSwgLXF0ciwgLW1pbiwgLXNlYywgLWRlZiwgLWRvd24sIC10b2dvLCAta2lja2VyLCAteWRsaW5lLCAtaG9tZWtpY2ssIC1vZmZzY29yZSwgLXNlYXNvbiwgLU1pc3NlZCwgLUJsb2NrZWQpDQp5MD1jbGVhbl9maWVsZGdvYWxzJEdPT0QNCmZpZWxkZ29hbC4wMSA9IHJlcCgwLCBsZW5ndGgoeTApKQ0KZmllbGRnb2FsLjAxW3doaWNoKHkwPT0icG9zIildID0gMQ0KY2xlYW5fZmllbGRnb2FscyRmaWVsZGdvYWwuMDEgPSBmaWVsZGdvYWwuMDENCmhlYWQoY2xlYW5fZmllbGRnb2FscykNCmBgYA0KV2UgdGFrZSBvdXQgYW55IG9ic2VydmF0aW9ucyB3aXRoIGEgbWlzc2luZyB2YWx1ZS4gV2UgYWxzbyB0YWtlIG91dCBtYW55IHZhcmlhYmxlcyBkdWUgdG8gdGhlcmUgYmVpbmcgYSBoaWdoIGxpa2VsZXlob29kIGZvciBtdWx0aWNvbGxpbmVhaXJ0eS4gV2UgYWxyZWFkeSBoYXZlIGEgdmFyaWFibGUgZm9yIHRpbWUgc28gd2UgZWxpbWluYXRlZCBtYW55IHZhcmlhYmxlcyByZWxhdGVkIHRvIHRpbWUuIFdlIGFsc28gYWxyZWFkeSBoYXZlIGEgdmFyaWFibGUgZm9yIGEgbWFrZSBzbyB3ZSBkbyBub3QgbmVlZCBhbnkgZm9yIGEgbWlzcyBvciBibG9ja2VkLCB0aGF0IHdvdWxkIGp1c3QgYmUgYSByZXBlYXQgb3VyIGRhdGEuIFRoZSBvdGhlcnMgYXJlIGp1c3QgY2F0ZWdvcmljYWwgdmFyaWFibGVzIHRoYXQgYXJlIHRvIGlkZW50aWZ5IHRoZSBraWNrZXIgb3Iga2lja2luZyB0ZWFtIHdoaWNoIGFnYWluIHdlIGFscmVhZHkgaGF2ZSB2YXJpYWJsZXMgdGhhdCBkZXNjcmliZSB0aGF0LiANCg0KDQoNCiMgRGF0YSBBbmFseXNpcw0KDQpgYGB7cn0NCnlsaW1pdCA9IG1heChkZW5zaXR5KGNsZWFuX2ZpZWxkZ29hbHMkZGlzdGFuY2UpJHkpDQpoaXN0KGNsZWFuX2ZpZWxkZ29hbHMkZGlzdGFuY2UsIHByb2JhYmlsaXR5ID0gVFJVRSwgbWFpbiA9ICJEaXN0YW5jZSIsIHhsYWI9IkRpcyIsIA0KICAgICAgIGNvbCA9ICJhenVyZTEiLCBib3JkZXI9ImxpZ2h0c2VhZ3JlZW4iKQ0KICBsaW5lcyhkZW5zaXR5KGNsZWFuX2ZpZWxkZ29hbHMkZGlzdGFuY2UsIGFkanVzdD0yKSwgY29sPSJibHVlIikgDQpgYGANCg0KV2UgZG8gYW4gZXhwbG9yaXRvcnkgZGF0YSBhbnlsc2lzIG9uIG91ciBwcmVkaWN0b3IgdmFyaWFibGUuIFdlIHNlZSBmcm9tIHRoZSBoaXN0b2dyYW0gYWJvdmUgdGhhdCB0aGVyZSBpcyBubyBza2V3IHdoaWNoIG1lYW5zIHRoZXJlIGlzIG5vIGltYmFsYW5hY2UuIA0KDQpgYGB7cn0NCnMubG9naXQgPSBnbG0oR09PRCB+IGRpc3RhbmNlLCANCiAgICAgICAgICBmYW1pbHkgPSBiaW5vbWlhbChsaW5rID0gImxvZ2l0IiksDQogICAgICAgICAgZGF0YSA9IGNsZWFuX2ZpZWxkZ29hbHMpICAgICAgICAgICAgICAgICANCnJlc3VsdCA9IHN1bW1hcnkocy5sb2dpdCkNCnJlc3VsdA0KDQoNCmBgYA0KDQpgYGB7cn0NCm1vZGVsLmNvZWYuc3RhdHMgPSBzdW1tYXJ5KHMubG9naXQpJGNvZWYgICAgICANCmNvbmYuY2kgPSBjb25maW50KHMubG9naXQpICAgICAgICAgICAgICAgICAgICANCnN1bS5zdGF0cyA9IGNiaW5kKG1vZGVsLmNvZWYuc3RhdHMsIGNvbmYuY2kuOTU9Y29uZi5jaSkNCmthYmxlKHN1bS5zdGF0cyxjYXB0aW9uID0gIlRoZSBzdW1tYXJ5IHN0YXRzIG9mIHJlZ3Jlc3Npb24gY29lZmZpY2llbnRzIikgDQoNCmBgYA0KDQpGcm9tIG91cm91dHB1dCBhYm92ZSB3ZSBzZWUgdGhhdCBkaXN0YW5jZSBpcyBuZWdhdGl2ZWx5IGFzc2NvaWF0ZWQgd2l0aCBhIG1hZGUgZmllbGQgZ29hbC4gT3VyIGVzdGltYXRlIGlzIGVxdWFsIHRvIC0uMTE5NC4gT3VyIDk1JSBDSSBpcyBbLS4xNDQsIC0uMDk1XS4gVGhpcyBjb25maWRlbmNlIGludGVydmFsIGFsc28gc3VwcG9ydHMgb3VyIGh5cG90aGVzaXMuDQoNCmBgYHtyfQ0KbW9kZWwuY29lZi5zdGF0cyA9IHN1bW1hcnkocy5sb2dpdCkkY29lZg0Kb2Rkcy5yYXRpbyA9IGV4cChjb2VmKHMubG9naXQpKQ0Kb3V0LnN0YXRzID0gY2JpbmQobW9kZWwuY29lZi5zdGF0cywgb2Rkcy5yYXRpbyA9IG9kZHMucmF0aW8pICAgICAgICAgICAgICAgICANCmthYmxlKG91dC5zdGF0cyxjYXB0aW9uID0gIlN1bW1hcnkgU3RhdHMgd2l0aCBPZGRzIFJhdGlvcyIpDQoNCmBgYA0KDQpOb3cgd2UgY29udmVydCBvdXIgZXN0aW1hdGUgdG8gYW4gb2RkcyByYXRpby4gVGhlIG9kZHMgcmF0aW8gYXNzb2NpYXRlZCB3aXRoIGRpc3RhbmNlIGlzIC44ODcgbWVhbmluZyB0aGF0IGFzIGRpc3RhbmNlIGluY3JlYXNlcyBieSBvbmUgdW5pdCwgdGhlIG9kZHMgb2YgYmVpbmcgYSBtYWRlIGZpZWxkIGdvYWwgZ29lcyBkb3duIGJ5IDExLjMlLiANCg0KYGBge3J9DQpibWkucmFuZ2UgPSByYW5nZShjbGVhbl9maWVsZGdvYWxzJGRpc3RhbmNlKQ0KeCA9IHNlcShibWkucmFuZ2VbMV0sIGJtaS5yYW5nZVsyXSwgbGVuZ3RoID0gMjAwKQ0KYmV0YS54ID0gY29lZihzLmxvZ2l0KVsxXSArIGNvZWYocy5sb2dpdClbMl0qeA0Kc3VjY2Vzcy5wcm9iID0gZXhwKGJldGEueCkvKDErZXhwKGJldGEueCkpDQpmYWlsdXJlLnByb2IgPSAxLygxK2V4cChiZXRhLngpKQ0KeWxpbWl0ID0gbWF4KHN1Y2Nlc3MucHJvYiwgZmFpbHVyZS5wcm9iKQ0KIyMNCmJldGExID0gY29lZihzLmxvZ2l0KVsyXQ0Kc3VjY2Vzcy5wcm9iLnJhdGUgPSBiZXRhMSpleHAoYmV0YS54KS8oMStleHAoYmV0YS54KSleMg0KIyMNCiMjDQpwYXIobWZyb3cgPSBjKDEsMikpDQpwbG90KHgsIHN1Y2Nlc3MucHJvYiwgdHlwZSA9ICJsIiwgbHdkID0gMiwgY29sID0gIm5hdnkiLA0KICAgICBtYWluID0gIlRoZSBwcm9iYWJpbGl0eSBvZiBiZWluZyBcbiBhIG1hZGUgZmllbGQgZ29hbCIsIA0KICAgICB5bGltPWMoMCwgMS4xKnlsaW1pdCksDQogICAgIHhsYWIgPSAiZGlzdGFuY2UiLA0KICAgICB5bGFiID0gInByb2JhYmlsaXR5IiwNCiAgICAgYXhlcyA9IEZBTFNFLA0KICAgICBjb2wubWFpbiA9ICJuYXZ5IiwNCiAgICAgY2V4Lm1haW4gPSAwLjgpDQojIGxpbmVzKHgsIGZhaWx1cmUucHJvYixsd2QgPSAyLCBjb2wgPSAiZGFya3JlZCIpDQpheGlzKDEsIHBvcyA9IDApDQpheGlzKDIpDQpgYGANCg0KVGhlIGdyYXBoIGFib3ZlIGlzIG91ciBTIGN1cnZlIHdoaWNoIGlzIHBvaW50aW5nIGRvd24gbGlrZSB3ZSB0aGluayBpdCB3b3VsZCBiZWNhdXNlIGl0IHNob3dzIHByb2JhYmlsaXR5IG9mIGEgbWFkZSBmaWVsZCBnb2FsIGFzIGRpc3RhbmNlIGdvZXMgdXAuIFdlIHNlZSB0aGF0IHRoZSBwcm9iYWJpbGl0eSBvZiBhIGZpZWxkIGdvYWwgZ29lcyBkb3duIGFzIHRoZSBkaXN0YW5jZSBnb2VzIHVwLg0KDQojIENvbmNsdXNpb24NCg0KV2UgdXNlZCBhIHJlYWwgd29ybGQgZGF0YXNldCBvZiB0aGUgMjAwOCBORkwgc2Vhc29uIG9mIE5GTCBraWNraW5nIGZpZWxkIGdvYWxzLiBXZSBoYXZlIGNvbmNsdWRlZCBmcm9tIHRoZSBhbmFseXNpcyBhYm92ZSB0aGF0IG91ciBoeXBvdGhlc2lzIGlzIGNvcnJlY3QuIEFzIHRoZSBkaXN0YW5jZSBvZiBhIGZpZWxkIGdvYWwgZ29lcyB1cCBpbiBkaXN0YW5jZSB0aGUgcHJvYmFiaWxpdHkgb2YgYSBtYWtlIGdvZXMgZG93bi4NCg0KDQoNCg==