1 Introduction and Background

The dataset I am using for my analysis is an extensive collection of metrics for every NBA player’s game-by-game performance across the 2022-2023 playoff season. It was published on the open-source data science platform Kaggle (link can be found in references section below). The original source for the data’s accuracy can be confirmed at Basketball-reference.com, a well-established database for enthusiasts of the sport. All statistical analysis will be conducted via the programming language R.

As for the dataset’s contents, it is composed of all 217 players who played some amount of time in the 2022-2023 postseason. It contained 30 variables, however only 10 played a role in my analysis, so I created a reduced dataset which only contained the information pertinent to my research question. An explanation and breakdown of the names and data types for the variables used in my analysis is below:

  • “Player” = player’s name = character

  • “Pos” = player’s position on the court or in starting lineup = character

  • “Tm” = team player plays for = character

  • “Age” = player’s age = integer

  • “PTS” = player’s points per game average = double

  • “AST” = player’s assists per game average = double

  • “TRB” = player’s rebounds per game average = double

  • “STL” = player’s steals per game average = double

  • “BLK” = player’s blocks per game average = double

  • “MP” = player’s minutes per game average = double

Using this dataset, I will be exploring the relationship that a player’s impact on the game (measured via their average points, rebounds, assists, steals and blocks) and circumstance (age, position and team playing for) has on their playing time (measured by per minute averages). I will refer to the five primary metrics of productivity (points, rebounds, assists, steals and blocks) as the “five standard statistics” of basketball.

Before conducting any thorough analysis, I would assume that there is a positive correlation between a player’s playing time and their five standard statistics, and a negative correlation between a player’s playing time and their age. As for position, it would be my intuition that traditionally smaller players, such as point guards and shooting guards, have a higher average amount of playing time than their larger positional counterparts like power forwards and centers. When it comes to the importance of what team a player is on, I am unsure exactly what to expect regarding any sort of significant difference in playing time distribution from team to team, but I am sure that differences do exist considering the multidude of different coaching methodologies out there.

Given the sufficient size of my dataset, over 200 players from the 16 teams which participated in the postseason, and the reliability of its sourcing, I am confident that I will be able to come to empircally justified conclusions.

2 Initial Visual Analysis

Below I created a pairwise scatter plot in order to concisely examine the relationship that each of the quantitative variables relevant to my analysis (age and the five standard basketball stats) have with a player’s playing time.

Unsurprisingly, there was a very strong and positive correlation between a player’s average points per game and their average minutes per game (r ~ .895). Averages in assists, steals, rebounds and blocks also each shared a positive correlation with playing time, but not to as strong a degree (r ~ 0.77 to 0.54). Given that most basketball fans and analysts would consider scoring to be the most important skill for any player to posess, it does make sense that a player’s scoring average is more determinant of his playing time than any other metric.

What was noticeable from the scatter plot was the exceptionally weak relationship between a player’s age and his playing time (r ~ .115). Conventional wisdom amongst many fans would be that players very early on in their careers (low age value) and at the tail end of their careers (high age value), would typically see far less playing time than the athletes in their physical prime, however that is not a trend that this data provides any sufficient evidence for.

ggpairs(Quantitative_Variables, title = "Pairwise Scatterplot of Quantitative Variables")

3 Simple Linear Regression (SLR) and Residual Analysis

After using the aforementioned scatter plot to determine that points per game had a supremely strong correlation with minutes per game, I chose to explore the relationship between those two statistics further via a simple linear regression model.

The regression model affirmed the previous conclusion taken away from the scatter plot, which is that there is a statistically significant, strong and positive correlation between scoring averages and playing time averages. It appears that, for every additional point that a player averages, he will play approximately an additional 1.4 minutes per game. This function also operates with a slope intercept of about 7.32, meaning there is an assumption that a standard player will “start” with a playing time around 7 minutes per game before his scoring average is taken into account.

To confirm reliability of my linear regression model, I then performed residual analysis using a histogram, calculations and residual scatter plot. While the distribution of the model’s residuals is approximately normal and the mean of the residuals is extremely close to zero, homoscedasticity of errors is not particularly meant. As when the model predicted minutes per game of about 15 to 35, all the errors were overestimates. But when the model predicted minutes per game of about 40 to 55, all the errors were underestimates. Although the residuals do not show constant variance, I still believe there is strong utility in this model given that other tenants of residual analysis appear to have been sufficiently met.

Regression_Line_PTS_MP = lm(MP ~ PTS, data = Reduced_Playoff_Data)
summary(Regression_Line_PTS_MP)

Model_Residuals = resid(Regression_Line_PTS_MP)
Model_Predicted_Values = predict(Regression_Line_PTS_MP)
hist(Model_Residuals,
     main = "Residual Analysis Histogram",
     xlab = "Model Residuals")

mean(Model_Residuals)
plot(Model_Predicted_Values, Model_Residuals,
     main = "Residual Analysis Scatterplot",
     xlab = "Predicted minutes per game",
     ylab = "Model Error (mins per game)")
abline(h=0)

4 Bootstrap Sampling for Regression Coefficients

Using my regression model regarding the relationship between points per game and minutes per game, I then created confidence intervals for both the slope of the function, and the intercept of the function (points per game). These bootstrap confidence intervals were formed with a confidence level of 95%, and predicated on 1,000 samples. My most recent run of the bootstrap algorithm, produced the following values:

Intercept ~ [6.21, 8.46]

Points Per Game ~ [1.31, 1.55]

Remember, the linear model produced coefficient values that are both safely within those intervals (7.32 and 1.4 respectively).

set.seed(123)                 # for reproducibility
B = 1000                     # number of bootstrap resamples

n = nrow(Reduced_Playoff_Data)
vec_id =seq_len(n)

# storage
Boot.beta0 = numeric(B) # intercept
Boot.beta1 = numeric(B) # slope

for (i in seq_len(B)) {
  boot_id = sample(vec_id, n, replace = TRUE) # resample rows
  boot_reg = lm(MP ~ PTS, data = Reduced_Playoff_Data[boot_id, , drop = FALSE]) 
  co = coef(boot_reg)
  Boot.beta0[i] = co[1]    # intercept
  Boot.beta1[i] = co[2]    # slope for PTS
}

# 95% percentile confidence intervals
ci_beta0 = quantile(Boot.beta0, c(0.025, 0.975))
ci_beta1 = quantile(Boot.beta1, c(0.025, 0.975))
ci_beta0
ci_beta1

hist(Boot.beta0, main = "Slope Intercept Model Coefficient", xlab = "Slope Intercept Value", ylab = "Bootstrap Sample Frequency")

hist(Boot.beta1, main = "Points Per Game Model Coefficient", xlab = "Points Per Game Value", ylab = "Bootstrap Sample Frequency")

5 Conclusions

Ultimately, we can conclude that there is certainly a strong, positive and linear relationship between a NBA player’s scoring average and his average playing time. Per the simple regression model, a player’s minutes per game average increases by 1.4 for every additional point he averages. Our bootstrap sampling coefficient calculations produced confidence intervals at the 95% confidence level that strongly overlapped with those values. If forced to pick one model to predict a player’s playing time based on his scoring output, the bootstrap method may be deemed more reliable due to the regression model producing residuals of an inconsistent variance.

LS0tCnRpdGxlOiAiSG93IGFuIE5CQSBQbGF5ZXIncyBTY29yaW5nIE91dHB1dCBBZmZlY3RzIGhpcyBQbGF5aW5nIFRpbWUiCmF1dGhvcjogIkNocmlzIEJhaG0iCmRhdGU6ICIyMDI1LTA5LTE0IgpvdXRwdXQ6CiAgaHRtbF9kb2N1bWVudDoKICAgIHRvYzogdHJ1ZQogICAgdG9jX2Zsb2F0OgogICAgICBjb2xsYXBzZWQ6IHRydWUKICAgICAgc21vb3RoX3Njcm9sbDogdHJ1ZQogICAgdG9jX2RlcHRoOiA0CiAgICBmaWdfd2lkdGg6IDYKICAgIGZpZ19oZWlnaHQ6IDQKICAgIGZpZ19jYXB0aW9uOiB0cnVlCiAgICBudW1iZXJfc2VjdGlvbnM6IHRydWUKICAgIGNvZGVfZm9sZGluZzogaGlkZQogICAgY29kZV9kb3dubG9hZDogdHJ1ZQogICAgdGhlbWU6IGx1bWVuCiAgICBoaWdobGlnaHQ6IHRhbmdvCiAgcGRmX2RvY3VtZW50OgogICAgdG9jOiB0cnVlCiAgICB0b2NfZGVwdGg6IDQKICAgIGZpZ19jYXB0aW9uOiB0cnVlCiAgICBudW1iZXJfc2VjdGlvbnM6IHRydWUKICB3b3JkX2RvY3VtZW50OgogICAgdG9jOiB0cnVlCiAgICB0b2NfZGVwdGg6IDQKLS0tCgpgYGB7Y3NzLCBlY2hvID0gRkFMU0V9CmRpdiNUT0MgbGkgeyAgICAgLyogdGFibGUgb2YgY29udGVudCAgKi8KICAgIGxpc3Qtc3R5bGU6dXBwZXItcm9tYW47CiAgICBiYWNrZ3JvdW5kLWltYWdlOm5vbmU7CiAgICBiYWNrZ3JvdW5kLXJlcGVhdDpub25lOwogICAgYmFja2dyb3VuZC1wb3NpdGlvbjowOwp9CgpoMS50aXRsZSB7ICAgIC8qIGxldmVsIDEgaGVhZGVyIG9mIHRpdGxlICAqLwogIGZvbnQtc2l6ZTogMjRweDsKICBmb250LXdlaWdodDogYm9sZDsKICBjb2xvcjogRGFya1JlZDsKICB0ZXh0LWFsaWduOiBjZW50ZXI7Cn0KCmg0LmF1dGhvciB7IC8qIEhlYWRlciA0IC0gYW5kIHRoZSBhdXRob3IgYW5kIGRhdGEgaGVhZGVycyB1c2UgdGhpcyB0b28gICovCiAgZm9udC1zaXplOiAxOHB4OwogIGZvbnQtd2VpZ2h0OiBib2xkOwogIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOwogIGNvbG9yOiBEYXJrUmVkOwogIHRleHQtYWxpZ246IGNlbnRlcjsKfQoKaDQuZGF0ZSB7IC8qIEhlYWRlciA0IC0gYW5kIHRoZSBhdXRob3IgYW5kIGRhdGEgaGVhZGVycyB1c2UgdGhpcyB0b28gICovCiAgZm9udC1zaXplOiAxOHB4OwogIGZvbnQtd2VpZ2h0OiBib2xkOwogIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOwogIGNvbG9yOiBEYXJrQmx1ZTsKICB0ZXh0LWFsaWduOiBjZW50ZXI7Cn0KCmgxIHsgLyogSGVhZGVyIDEgLSBhbmQgdGhlIGF1dGhvciBhbmQgZGF0YSBoZWFkZXJzIHVzZSB0aGlzIHRvbyAgKi8KICAgIGZvbnQtc2l6ZTogMjBweDsKICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7CiAgICBjb2xvcjogZGFya3JlZDsKICAgIHRleHQtYWxpZ246IGNlbnRlcjsKfQoKaDIgeyAvKiBIZWFkZXIgMiAtIGFuZCB0aGUgYXV0aG9yIGFuZCBkYXRhIGhlYWRlcnMgdXNlIHRoaXMgdG9vICAqLwogICAgZm9udC1zaXplOiAxOHB4OwogICAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsKICAgIGNvbG9yOiBuYXZ5OwogICAgdGV4dC1hbGlnbjogbGVmdDsKfQoKaDMgeyAvKiBIZWFkZXIgMyAtIGFuZCB0aGUgYXV0aG9yIGFuZCBkYXRhIGhlYWRlcnMgdXNlIHRoaXMgdG9vICAqLwogICAgZm9udC1zaXplOiAxNnB4OwogICAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsKICAgIGNvbG9yOiBuYXZ5OwogICAgdGV4dC1hbGlnbjogbGVmdDsKfQoKaDQgeyAvKiBIZWFkZXIgNCAtIGFuZCB0aGUgYXV0aG9yIGFuZCBkYXRhIGhlYWRlcnMgdXNlIHRoaXMgdG9vICAqLwogICAgZm9udC1zaXplOiAxNHB4OwogIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7CiAgICBjb2xvcjogZGFya3JlZDsKICAgIHRleHQtYWxpZ246IGxlZnQ7Cn0KCi8qIEFkZCBkb3RzIGFmdGVyIG51bWJlcmVkIGhlYWRlcnMgKi8KLmhlYWRlci1zZWN0aW9uLW51bWJlcjo6YWZ0ZXIgewogIGNvbnRlbnQ6ICIuIjsKfQpgYGAKCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQojIGNvZGUgY2h1bmsgc3BlY2lmaWVzIHdoZXRoZXIgdGhlIFIgY29kZSwgd2FybmluZ3MsIGFuZCBvdXRwdXQgCiMgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgb3V0cHV0IGZpbGVzLgoKaWYgKCFyZXF1aXJlKCJrbml0ciIpKSB7ICAgICAgICAgICAgICAgICAgICAgICMgdXNlIGNvbmRpdGlvbmFsIHN0YXRlbWVudCB0byBkZXRlY3QKICAgaW5zdGFsbC5wYWNrYWdlcygia25pdHIiKSAgICAgICAgICAgICAgICAgICMgd2hldGhlciBhIHBhY2thZ2Ugd2FzIGluc3RhbGxlZCBpbgogICBsaWJyYXJ5KGtuaXRyKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyB5b3VyIG1hY2hpbmUuIElmIG5vdCwgaW5zdGFsbCBpdCBhbmQKfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgbG9hZCBpdCB0byB0aGUgd29ya2luZyBkaXJlY3RvcnkuCiMKa25pdHI6Om9wdHNfY2h1bmskc2V0KAoJZWNobyA9IFRSVUUsCgltZXNzYWdlID0gRkFMU0UsCgl3YXJuaW5nID0gRkFMU0UsCgljb21tZW50ID0gTkEsCglyZXN1bHRzID0gVFJVRQopCiAgIApsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShHR2FsbHkpCgpgYGAKCiMjIEludHJvZHVjdGlvbiBhbmQgQmFja2dyb3VuZApUaGUgZGF0YXNldCBJIGFtIHVzaW5nIGZvciBteSBhbmFseXNpcyBpcyBhbiBleHRlbnNpdmUgY29sbGVjdGlvbiBvZiBtZXRyaWNzIGZvciBldmVyeSBOQkEgcGxheWVyJ3MgZ2FtZS1ieS1nYW1lIHBlcmZvcm1hbmNlIGFjcm9zcyB0aGUgMjAyMi0yMDIzIHBsYXlvZmYgc2Vhc29uLiBJdCB3YXMgcHVibGlzaGVkIG9uIHRoZSBvcGVuLXNvdXJjZSBkYXRhIHNjaWVuY2UgcGxhdGZvcm0gS2FnZ2xlIChsaW5rIGNhbiBiZSBmb3VuZCBpbiByZWZlcmVuY2VzIHNlY3Rpb24gYmVsb3cpLiBUaGUgb3JpZ2luYWwgc291cmNlIGZvciB0aGUgZGF0YSdzIGFjY3VyYWN5IGNhbiBiZSBjb25maXJtZWQgYXQgQmFza2V0YmFsbC1yZWZlcmVuY2UuY29tLCBhIHdlbGwtZXN0YWJsaXNoZWQgZGF0YWJhc2UgZm9yIGVudGh1c2lhc3RzIG9mIHRoZSBzcG9ydC4gQWxsIHN0YXRpc3RpY2FsIGFuYWx5c2lzIHdpbGwgYmUgY29uZHVjdGVkIHZpYSB0aGUgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UgUi4KCkFzIGZvciB0aGUgZGF0YXNldCdzIGNvbnRlbnRzLCBpdCBpcyBjb21wb3NlZCBvZiBhbGwgMjE3IHBsYXllcnMgd2hvIHBsYXllZCBzb21lIGFtb3VudCBvZiB0aW1lIGluIHRoZSAyMDIyLTIwMjMgcG9zdHNlYXNvbi4gSXQgY29udGFpbmVkIDMwIHZhcmlhYmxlcywgaG93ZXZlciBvbmx5IDEwIHBsYXllZCBhIHJvbGUgaW4gbXkgYW5hbHlzaXMsIHNvIEkgY3JlYXRlZCBhIHJlZHVjZWQgZGF0YXNldCB3aGljaCBvbmx5IGNvbnRhaW5lZCB0aGUgaW5mb3JtYXRpb24gcGVydGluZW50IHRvIG15IHJlc2VhcmNoIHF1ZXN0aW9uLiBBbiBleHBsYW5hdGlvbiBhbmQgYnJlYWtkb3duIG9mIHRoZSBuYW1lcyBhbmQgZGF0YSB0eXBlcyBmb3IgdGhlIHZhcmlhYmxlcyB1c2VkIGluIG15IGFuYWx5c2lzIGlzIGJlbG93OgoKLSAgICJQbGF5ZXIiID0gcGxheWVyJ3MgbmFtZSA9IGNoYXJhY3RlcgoKLSAgICJQb3MiID0gcGxheWVyJ3MgcG9zaXRpb24gb24gdGhlIGNvdXJ0IG9yIGluIHN0YXJ0aW5nIGxpbmV1cCA9IGNoYXJhY3RlcgoKLSAgICJUbSIgPSB0ZWFtIHBsYXllciBwbGF5cyBmb3IgPSBjaGFyYWN0ZXIKCi0gICAiQWdlIiA9IHBsYXllcidzIGFnZSA9IGludGVnZXIKCi0gICAiUFRTIiA9IHBsYXllcidzIHBvaW50cyBwZXIgZ2FtZSBhdmVyYWdlID0gZG91YmxlCgotICAgIkFTVCIgPSBwbGF5ZXIncyBhc3Npc3RzIHBlciBnYW1lIGF2ZXJhZ2UgPSBkb3VibGUKCi0gICAiVFJCIiA9IHBsYXllcidzIHJlYm91bmRzIHBlciBnYW1lIGF2ZXJhZ2UgPSBkb3VibGUKCi0gICAiU1RMIiA9IHBsYXllcidzIHN0ZWFscyBwZXIgZ2FtZSBhdmVyYWdlID0gZG91YmxlCgotICAgIkJMSyIgPSBwbGF5ZXIncyBibG9ja3MgcGVyIGdhbWUgYXZlcmFnZSA9IGRvdWJsZQoKLSAgICJNUCIgPSBwbGF5ZXIncyBtaW51dGVzIHBlciBnYW1lIGF2ZXJhZ2UgPSBkb3VibGUKClVzaW5nIHRoaXMgZGF0YXNldCwgSSB3aWxsIGJlIGV4cGxvcmluZyB0aGUgcmVsYXRpb25zaGlwIHRoYXQgYSBwbGF5ZXIncyBpbXBhY3Qgb24gdGhlIGdhbWUgKG1lYXN1cmVkIHZpYSB0aGVpciBhdmVyYWdlIHBvaW50cywgcmVib3VuZHMsIGFzc2lzdHMsIHN0ZWFscyBhbmQgYmxvY2tzKSBhbmQgY2lyY3Vtc3RhbmNlIChhZ2UsIHBvc2l0aW9uIGFuZCB0ZWFtIHBsYXlpbmcgZm9yKSBoYXMgb24gdGhlaXIgcGxheWluZyB0aW1lIChtZWFzdXJlZCBieSBwZXIgbWludXRlIGF2ZXJhZ2VzKS4gSSB3aWxsIHJlZmVyIHRvIHRoZSBmaXZlIHByaW1hcnkgbWV0cmljcyBvZiBwcm9kdWN0aXZpdHkgKHBvaW50cywgcmVib3VuZHMsIGFzc2lzdHMsIHN0ZWFscyBhbmQgYmxvY2tzKSBhcyB0aGUgImZpdmUgc3RhbmRhcmQgc3RhdGlzdGljcyIgb2YgYmFza2V0YmFsbC4KCkJlZm9yZSBjb25kdWN0aW5nIGFueSB0aG9yb3VnaCBhbmFseXNpcywgSSB3b3VsZCBhc3N1bWUgdGhhdCB0aGVyZSBpcyBhIHBvc2l0aXZlIGNvcnJlbGF0aW9uIGJldHdlZW4gYSBwbGF5ZXIncyBwbGF5aW5nIHRpbWUgYW5kIHRoZWlyIGZpdmUgc3RhbmRhcmQgc3RhdGlzdGljcywgYW5kIGEgbmVnYXRpdmUgY29ycmVsYXRpb24gYmV0d2VlbiBhIHBsYXllcidzIHBsYXlpbmcgdGltZSBhbmQgdGhlaXIgYWdlLiBBcyBmb3IgcG9zaXRpb24sIGl0IHdvdWxkIGJlIG15IGludHVpdGlvbiB0aGF0IHRyYWRpdGlvbmFsbHkgc21hbGxlciBwbGF5ZXJzLCBzdWNoIGFzIHBvaW50IGd1YXJkcyBhbmQgc2hvb3RpbmcgZ3VhcmRzLCBoYXZlIGEgaGlnaGVyIGF2ZXJhZ2UgYW1vdW50IG9mIHBsYXlpbmcgdGltZSB0aGFuIHRoZWlyIGxhcmdlciBwb3NpdGlvbmFsIGNvdW50ZXJwYXJ0cyBsaWtlIHBvd2VyIGZvcndhcmRzIGFuZCBjZW50ZXJzLiBXaGVuIGl0IGNvbWVzIHRvIHRoZSBpbXBvcnRhbmNlIG9mIHdoYXQgdGVhbSBhIHBsYXllciBpcyBvbiwgSSBhbSB1bnN1cmUgZXhhY3RseSB3aGF0IHRvIGV4cGVjdCByZWdhcmRpbmcgYW55IHNvcnQgb2Ygc2lnbmlmaWNhbnQgZGlmZmVyZW5jZSBpbiBwbGF5aW5nIHRpbWUgZGlzdHJpYnV0aW9uIGZyb20gdGVhbSB0byB0ZWFtLCBidXQgSSBhbSBzdXJlIHRoYXQgZGlmZmVyZW5jZXMgZG8gZXhpc3QgY29uc2lkZXJpbmcgdGhlIG11bHRpZHVkZSBvZiBkaWZmZXJlbnQgY29hY2hpbmcgbWV0aG9kb2xvZ2llcyBvdXQgdGhlcmUuCgpHaXZlbiB0aGUgc3VmZmljaWVudCBzaXplIG9mIG15IGRhdGFzZXQsIG92ZXIgMjAwIHBsYXllcnMgZnJvbSB0aGUgMTYgdGVhbXMgd2hpY2ggcGFydGljaXBhdGVkIGluIHRoZSBwb3N0c2Vhc29uLCBhbmQgdGhlIHJlbGlhYmlsaXR5IG9mIGl0cyBzb3VyY2luZywgSSBhbSBjb25maWRlbnQgdGhhdCBJIHdpbGwgYmUgYWJsZSB0byBjb21lIHRvIGVtcGlyY2FsbHkganVzdGlmaWVkIGNvbmNsdXNpb25zLgpgYGB7ciBEYXRhX1JlYWRfaW5fYW5kX0NsZWFuaW5nLCBpbmNsdWRlPUZBTFNFfQpGdWxsX1BsYXlvZmZfRGF0YV9TZXQgPSByZWFkLmNzdjIoIlBsYXlvZmZfRGF0YS5jc3YiKSAlPiUKICBtdXRhdGUoYWNyb3NzKGMoQWdlLCBNUCwgRkcsIEZHQSwgRkcuLCBYM1AsIFgzUEEsIFgzUC4sIFgyUCwgWDJQQSwgWDJQLiwgZUZHLiwgRlQsCiAgICAgICAgICAgICAgICAgIEZUQSwgRlQuLCBPUkIsIERSQiwgVFJCLCBBU1QsIFNUTCwgQkxLLCBUT1YsIFBGLCBQVFMpLAogICAgICAgICAgICAgICAgYXMuZG91YmxlKSkKIyMgTW92aW5nIGZvcndhcmQgcmVhZCBpbiBkYXRhIHNldCBmcm9tIEdpdEh1YiAoOS8xOC8yNSkKCmdsaW1wc2UoRnVsbF9QbGF5b2ZmX0RhdGFfU2V0KQoKUmVkdWNlZF9QbGF5b2ZmX0RhdGEgPSBGdWxsX1BsYXlvZmZfRGF0YV9TZXQgJT4lCiAgc2VsZWN0KFBsYXllciwgUG9zLCBUbSwgQWdlLCBQVFMsIEFTVCwgVFJCLCBTVEwsIEJMSywgTVApCgpnbGltcHNlKFJlZHVjZWRfUGxheW9mZl9EYXRhKQoKUGxheWVyID0gUmVkdWNlZF9QbGF5b2ZmX0RhdGEkUGxheWVyClBvcyA9IFJlZHVjZWRfUGxheW9mZl9EYXRhJFBvcwpUbSA9IFJlZHVjZWRfUGxheW9mZl9EYXRhJFRtCkFnZSA9IFJlZHVjZWRfUGxheW9mZl9EYXRhJEFnZQpQVFMgPSBSZWR1Y2VkX1BsYXlvZmZfRGF0YSRQVFMKQVNUID0gUmVkdWNlZF9QbGF5b2ZmX0RhdGEkQVNUClRSQiA9IFJlZHVjZWRfUGxheW9mZl9EYXRhJFRSQgpTVEwgPSBSZWR1Y2VkX1BsYXlvZmZfRGF0YSRTVEwKQkxLID0gUmVkdWNlZF9QbGF5b2ZmX0RhdGEkQkxLCk1QID0gUmVkdWNlZF9QbGF5b2ZmX0RhdGEkTVAKClF1YW50aXRhdGl2ZV9WYXJpYWJsZXMgPSBSZWR1Y2VkX1BsYXlvZmZfRGF0YVtjKCJBZ2UiLCAiUFRTIiwgIkFTVCIsICJUUkIiLCAiU1RMIiwgIkJMSyIsICJNUCIpXQoKQ2F0ZWdvcmljYWxfVmFyaWFibGVzID0gUmVkdWNlZF9QbGF5b2ZmX0RhdGFbYygiUG9zIiwgIlRtIildCmBgYAoKIyMgSW5pdGlhbCBWaXN1YWwgQW5hbHlzaXMgCkJlbG93IEkgY3JlYXRlZCBhIHBhaXJ3aXNlIHNjYXR0ZXIgcGxvdCBpbiBvcmRlciB0byBjb25jaXNlbHkgZXhhbWluZSB0aGUgcmVsYXRpb25zaGlwIHRoYXQgZWFjaCBvZiB0aGUgcXVhbnRpdGF0aXZlIHZhcmlhYmxlcyByZWxldmFudCB0byBteSBhbmFseXNpcyAoYWdlIGFuZCB0aGUgZml2ZSBzdGFuZGFyZCBiYXNrZXRiYWxsIHN0YXRzKSBoYXZlIHdpdGggYSBwbGF5ZXIncyBwbGF5aW5nIHRpbWUuIAoKVW5zdXJwcmlzaW5nbHksIHRoZXJlIHdhcyBhIHZlcnkgc3Ryb25nIGFuZCBwb3NpdGl2ZSBjb3JyZWxhdGlvbiBiZXR3ZWVuIGEgcGxheWVyJ3MgYXZlcmFnZSBwb2ludHMgcGVyIGdhbWUgYW5kIHRoZWlyIGF2ZXJhZ2UgbWludXRlcyBwZXIgZ2FtZSAociB+IC44OTUpLiBBdmVyYWdlcyBpbiBhc3Npc3RzLCBzdGVhbHMsIHJlYm91bmRzIGFuZCBibG9ja3MgYWxzbyBlYWNoIHNoYXJlZCBhIHBvc2l0aXZlIGNvcnJlbGF0aW9uIHdpdGggcGxheWluZyB0aW1lLCBidXQgbm90IHRvIGFzIHN0cm9uZyBhIGRlZ3JlZSAociB+IDAuNzcgdG8gMC41NCkuIEdpdmVuIHRoYXQgbW9zdCBiYXNrZXRiYWxsIGZhbnMgYW5kIGFuYWx5c3RzIHdvdWxkIGNvbnNpZGVyIHNjb3JpbmcgdG8gYmUgdGhlIG1vc3QgaW1wb3J0YW50IHNraWxsIGZvciBhbnkgcGxheWVyIHRvIHBvc2VzcywgaXQgZG9lcyBtYWtlIHNlbnNlIHRoYXQgYSBwbGF5ZXIncyBzY29yaW5nIGF2ZXJhZ2UgaXMgbW9yZSBkZXRlcm1pbmFudCBvZiBoaXMgcGxheWluZyB0aW1lIHRoYW4gYW55IG90aGVyIG1ldHJpYy4KCldoYXQgd2FzIG5vdGljZWFibGUgZnJvbSB0aGUgc2NhdHRlciBwbG90IHdhcyB0aGUgZXhjZXB0aW9uYWxseSB3ZWFrIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGEgcGxheWVyJ3MgYWdlIGFuZCBoaXMgcGxheWluZyB0aW1lIChyIH4gLjExNSkuIENvbnZlbnRpb25hbCB3aXNkb20gYW1vbmdzdCBtYW55IGZhbnMgd291bGQgYmUgdGhhdCBwbGF5ZXJzIHZlcnkgZWFybHkgb24gaW4gdGhlaXIgY2FyZWVycyAobG93IGFnZSB2YWx1ZSkgYW5kIGF0IHRoZSB0YWlsIGVuZCBvZiB0aGVpciBjYXJlZXJzIChoaWdoIGFnZSB2YWx1ZSksIHdvdWxkIHR5cGljYWxseSBzZWUgZmFyIGxlc3MgcGxheWluZyB0aW1lIHRoYW4gdGhlIGF0aGxldGVzIGluIHRoZWlyIHBoeXNpY2FsIHByaW1lLCBob3dldmVyIHRoYXQgaXMgbm90IGEgdHJlbmQgdGhhdCB0aGlzIGRhdGEgcHJvdmlkZXMgYW55IHN1ZmZpY2llbnQgZXZpZGVuY2UgZm9yLiAKYGBge3IgRGF0YV9BbmFseXNpcywgcmVzdWx0cz0naGlkZSd9CmdncGFpcnMoUXVhbnRpdGF0aXZlX1ZhcmlhYmxlcywgdGl0bGUgPSAiUGFpcndpc2UgU2NhdHRlcnBsb3Qgb2YgUXVhbnRpdGF0aXZlIFZhcmlhYmxlcyIpCmBgYAoKIyMgU2ltcGxlIExpbmVhciBSZWdyZXNzaW9uIChTTFIpIGFuZCBSZXNpZHVhbCBBbmFseXNpcwpBZnRlciB1c2luZyB0aGUgYWZvcmVtZW50aW9uZWQgc2NhdHRlciBwbG90IHRvIGRldGVybWluZSB0aGF0IHBvaW50cyBwZXIgZ2FtZSBoYWQgYSBzdXByZW1lbHkgc3Ryb25nIGNvcnJlbGF0aW9uIHdpdGggbWludXRlcyBwZXIgZ2FtZSwgSSBjaG9zZSB0byBleHBsb3JlIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiB0aG9zZSB0d28gc3RhdGlzdGljcyBmdXJ0aGVyIHZpYSBhIHNpbXBsZSBsaW5lYXIgcmVncmVzc2lvbiBtb2RlbC4gCgpUaGUgcmVncmVzc2lvbiBtb2RlbCBhZmZpcm1lZCB0aGUgcHJldmlvdXMgY29uY2x1c2lvbiB0YWtlbiBhd2F5IGZyb20gdGhlIHNjYXR0ZXIgcGxvdCwgd2hpY2ggaXMgdGhhdCB0aGVyZSBpcyBhIHN0YXRpc3RpY2FsbHkgc2lnbmlmaWNhbnQsIHN0cm9uZyBhbmQgcG9zaXRpdmUgY29ycmVsYXRpb24gYmV0d2VlbiBzY29yaW5nIGF2ZXJhZ2VzIGFuZCBwbGF5aW5nIHRpbWUgYXZlcmFnZXMuIEl0IGFwcGVhcnMgdGhhdCwgZm9yIGV2ZXJ5IGFkZGl0aW9uYWwgcG9pbnQgdGhhdCBhIHBsYXllciBhdmVyYWdlcywgaGUgd2lsbCBwbGF5IGFwcHJveGltYXRlbHkgYW4gYWRkaXRpb25hbCAxLjQgbWludXRlcyBwZXIgZ2FtZS4gVGhpcyBmdW5jdGlvbiBhbHNvIG9wZXJhdGVzIHdpdGggYSBzbG9wZSBpbnRlcmNlcHQgb2YgYWJvdXQgNy4zMiwgbWVhbmluZyB0aGVyZSBpcyBhbiBhc3N1bXB0aW9uIHRoYXQgYSBzdGFuZGFyZCBwbGF5ZXIgd2lsbCAic3RhcnQiIHdpdGggYSBwbGF5aW5nIHRpbWUgYXJvdW5kIDcgbWludXRlcyBwZXIgZ2FtZSBiZWZvcmUgaGlzIHNjb3JpbmcgYXZlcmFnZSBpcyB0YWtlbiBpbnRvIGFjY291bnQuCgpUbyBjb25maXJtIHJlbGlhYmlsaXR5IG9mIG15IGxpbmVhciByZWdyZXNzaW9uIG1vZGVsLCBJIHRoZW4gcGVyZm9ybWVkIHJlc2lkdWFsIGFuYWx5c2lzIHVzaW5nIGEgaGlzdG9ncmFtLCBjYWxjdWxhdGlvbnMgYW5kIHJlc2lkdWFsIHNjYXR0ZXIgcGxvdC4gV2hpbGUgdGhlIGRpc3RyaWJ1dGlvbiBvZiB0aGUgbW9kZWwncyByZXNpZHVhbHMgaXMgYXBwcm94aW1hdGVseSBub3JtYWwgYW5kIHRoZSBtZWFuIG9mIHRoZSByZXNpZHVhbHMgaXMgZXh0cmVtZWx5IGNsb3NlIHRvIHplcm8sIGhvbW9zY2VkYXN0aWNpdHkgb2YgZXJyb3JzIGlzIG5vdCBwYXJ0aWN1bGFybHkgbWVhbnQuIEFzIHdoZW4gdGhlIG1vZGVsIHByZWRpY3RlZCBtaW51dGVzIHBlciBnYW1lIG9mIGFib3V0IDE1IHRvIDM1LCBhbGwgdGhlIGVycm9ycyB3ZXJlIG92ZXJlc3RpbWF0ZXMuIEJ1dCB3aGVuIHRoZSBtb2RlbCBwcmVkaWN0ZWQgbWludXRlcyBwZXIgZ2FtZSBvZiBhYm91dCA0MCB0byA1NSwgYWxsIHRoZSBlcnJvcnMgd2VyZSB1bmRlcmVzdGltYXRlcy4gQWx0aG91Z2ggdGhlIHJlc2lkdWFscyBkbyBub3Qgc2hvdyBjb25zdGFudCB2YXJpYW5jZSwgSSBzdGlsbCBiZWxpZXZlIHRoZXJlIGlzIHN0cm9uZyB1dGlsaXR5IGluIHRoaXMgbW9kZWwgZ2l2ZW4gdGhhdCBvdGhlciB0ZW5hbnRzIG9mIHJlc2lkdWFsIGFuYWx5c2lzIGFwcGVhciB0byBoYXZlIGJlZW4gc3VmZmljaWVudGx5IG1ldC4KYGBge3IgTGluZWFyX1JlZ3Jlc3Npb24sIHJlc3VsdHM9J2hpZGUnfQpSZWdyZXNzaW9uX0xpbmVfUFRTX01QID0gbG0oTVAgfiBQVFMsIGRhdGEgPSBSZWR1Y2VkX1BsYXlvZmZfRGF0YSkKc3VtbWFyeShSZWdyZXNzaW9uX0xpbmVfUFRTX01QKQoKTW9kZWxfUmVzaWR1YWxzID0gcmVzaWQoUmVncmVzc2lvbl9MaW5lX1BUU19NUCkKTW9kZWxfUHJlZGljdGVkX1ZhbHVlcyA9IHByZWRpY3QoUmVncmVzc2lvbl9MaW5lX1BUU19NUCkKaGlzdChNb2RlbF9SZXNpZHVhbHMsCiAgICAgbWFpbiA9ICJSZXNpZHVhbCBBbmFseXNpcyBIaXN0b2dyYW0iLAogICAgIHhsYWIgPSAiTW9kZWwgUmVzaWR1YWxzIikKbWVhbihNb2RlbF9SZXNpZHVhbHMpCnBsb3QoTW9kZWxfUHJlZGljdGVkX1ZhbHVlcywgTW9kZWxfUmVzaWR1YWxzLAogICAgIG1haW4gPSAiUmVzaWR1YWwgQW5hbHlzaXMgU2NhdHRlcnBsb3QiLAogICAgIHhsYWIgPSAiUHJlZGljdGVkIG1pbnV0ZXMgcGVyIGdhbWUiLAogICAgIHlsYWIgPSAiTW9kZWwgRXJyb3IgKG1pbnMgcGVyIGdhbWUpIikKYWJsaW5lKGg9MCkKYGBgCgojIyBCb290c3RyYXAgU2FtcGxpbmcgZm9yIFJlZ3Jlc3Npb24gQ29lZmZpY2llbnRzClVzaW5nIG15IHJlZ3Jlc3Npb24gbW9kZWwgcmVnYXJkaW5nIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBwb2ludHMgcGVyIGdhbWUgYW5kIG1pbnV0ZXMgcGVyIGdhbWUsIEkgdGhlbiBjcmVhdGVkIGNvbmZpZGVuY2UgaW50ZXJ2YWxzIGZvciBib3RoIHRoZSBzbG9wZSBvZiB0aGUgZnVuY3Rpb24sIGFuZCB0aGUgaW50ZXJjZXB0IG9mIHRoZSBmdW5jdGlvbiAocG9pbnRzIHBlciBnYW1lKS4gVGhlc2UgYm9vdHN0cmFwIGNvbmZpZGVuY2UgaW50ZXJ2YWxzIHdlcmUgZm9ybWVkIHdpdGggYSBjb25maWRlbmNlIGxldmVsIG9mIDk1JSwgYW5kIHByZWRpY2F0ZWQgb24gMSwwMDAgc2FtcGxlcy4gTXkgbW9zdCByZWNlbnQgcnVuIG9mIHRoZSBib290c3RyYXAgYWxnb3JpdGhtLCBwcm9kdWNlZCB0aGUgZm9sbG93aW5nIHZhbHVlczoKCkludGVyY2VwdCB+IFs2LjIxLCA4LjQ2XQoKUG9pbnRzIFBlciBHYW1lIH4gWzEuMzEsIDEuNTVdCgpSZW1lbWJlciwgdGhlIGxpbmVhciBtb2RlbCBwcm9kdWNlZCBjb2VmZmljaWVudCB2YWx1ZXMgdGhhdCBhcmUgYm90aCBzYWZlbHkgd2l0aGluIHRob3NlIGludGVydmFscyAoNy4zMiBhbmQgMS40IHJlc3BlY3RpdmVseSkuCgpgYGB7ciBCb290c3RyYXAgUmVncmVzc2lvbiwgcmVzdWx0cz0naGlkZSd9CnNldC5zZWVkKDEyMykgICAgICAgICAgICAgICAgICMgZm9yIHJlcHJvZHVjaWJpbGl0eQpCID0gMTAwMCAgICAgICAgICAgICAgICAgICAgICMgbnVtYmVyIG9mIGJvb3RzdHJhcCByZXNhbXBsZXMKCm4gPSBucm93KFJlZHVjZWRfUGxheW9mZl9EYXRhKQp2ZWNfaWQgPXNlcV9sZW4obikKCiMgc3RvcmFnZQpCb290LmJldGEwID0gbnVtZXJpYyhCKSAjIGludGVyY2VwdApCb290LmJldGExID0gbnVtZXJpYyhCKSAjIHNsb3BlCgpmb3IgKGkgaW4gc2VxX2xlbihCKSkgewogIGJvb3RfaWQgPSBzYW1wbGUodmVjX2lkLCBuLCByZXBsYWNlID0gVFJVRSkgIyByZXNhbXBsZSByb3dzCiAgYm9vdF9yZWcgPSBsbShNUCB+IFBUUywgZGF0YSA9IFJlZHVjZWRfUGxheW9mZl9EYXRhW2Jvb3RfaWQsICwgZHJvcCA9IEZBTFNFXSkgCiAgY28gPSBjb2VmKGJvb3RfcmVnKQogIEJvb3QuYmV0YTBbaV0gPSBjb1sxXSAgICAjIGludGVyY2VwdAogIEJvb3QuYmV0YTFbaV0gPSBjb1syXSAgICAjIHNsb3BlIGZvciBQVFMKfQoKIyA5NSUgcGVyY2VudGlsZSBjb25maWRlbmNlIGludGVydmFscwpjaV9iZXRhMCA9IHF1YW50aWxlKEJvb3QuYmV0YTAsIGMoMC4wMjUsIDAuOTc1KSkKY2lfYmV0YTEgPSBxdWFudGlsZShCb290LmJldGExLCBjKDAuMDI1LCAwLjk3NSkpCmNpX2JldGEwCmNpX2JldGExCgpoaXN0KEJvb3QuYmV0YTAsIG1haW4gPSAiU2xvcGUgSW50ZXJjZXB0IE1vZGVsIENvZWZmaWNpZW50IiwgeGxhYiA9ICJTbG9wZSBJbnRlcmNlcHQgVmFsdWUiLCB5bGFiID0gIkJvb3RzdHJhcCBTYW1wbGUgRnJlcXVlbmN5IikKaGlzdChCb290LmJldGExLCBtYWluID0gIlBvaW50cyBQZXIgR2FtZSBNb2RlbCBDb2VmZmljaWVudCIsIHhsYWIgPSAiUG9pbnRzIFBlciBHYW1lIFZhbHVlIiwgeWxhYiA9ICJCb290c3RyYXAgU2FtcGxlIEZyZXF1ZW5jeSIpCmBgYAoKIyMgQ29uY2x1c2lvbnMKVWx0aW1hdGVseSwgd2UgY2FuIGNvbmNsdWRlIHRoYXQgdGhlcmUgaXMgY2VydGFpbmx5IGEgc3Ryb25nLCBwb3NpdGl2ZSBhbmQgbGluZWFyIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGEgTkJBIHBsYXllcidzIHNjb3JpbmcgYXZlcmFnZSBhbmQgaGlzIGF2ZXJhZ2UgcGxheWluZyB0aW1lLiAKUGVyIHRoZSBzaW1wbGUgcmVncmVzc2lvbiBtb2RlbCwgYSBwbGF5ZXIncyBtaW51dGVzIHBlciBnYW1lIGF2ZXJhZ2UgaW5jcmVhc2VzIGJ5IDEuNCBmb3IgZXZlcnkgYWRkaXRpb25hbCBwb2ludCBoZSBhdmVyYWdlcy4gT3VyIGJvb3RzdHJhcCBzYW1wbGluZyBjb2VmZmljaWVudCBjYWxjdWxhdGlvbnMgcHJvZHVjZWQgY29uZmlkZW5jZSBpbnRlcnZhbHMgYXQgdGhlIDk1JSBjb25maWRlbmNlIGxldmVsIHRoYXQgc3Ryb25nbHkgb3ZlcmxhcHBlZCB3aXRoIHRob3NlIHZhbHVlcy4gSWYgZm9yY2VkIHRvIHBpY2sgb25lIG1vZGVsIHRvIHByZWRpY3QgYSBwbGF5ZXIncyBwbGF5aW5nIHRpbWUgYmFzZWQgb24gaGlzIHNjb3Jpbmcgb3V0cHV0LCB0aGUgYm9vdHN0cmFwIG1ldGhvZCBtYXkgYmUgZGVlbWVkIG1vcmUgcmVsaWFibGUgZHVlIHRvIHRoZSByZWdyZXNzaW9uIG1vZGVsIHByb2R1Y2luZyByZXNpZHVhbHMgb2YgYW4gaW5jb25zaXN0ZW50IHZhcmlhbmNlLgoKIyMgUmVmZXJlbmNlczoKCkRhdGFzZXQgTGluazogPGh0dHBzOi8vd3d3LmthZ2dsZS5jb20vZGF0YXNldHMvdml2b3ZpbmNvLzIwMjIyMDIzLW5iYS1wbGF5ZXItc3RhdHMtcmVndWxhcj4K