1 Introduction

This report analyzes the 2024 WNBA season box score data to build a regression model predicting the Las Vegas Aces’ team score. The dataset includes game statistics for all WNBA teams. All-Star game observations were removed, leaving only regular season games. The goal is to identify which performance metrics (field goal percentage, rebounds, 3-point percentage, and steals) best predict how many points the Aces score in a given game.

2 Tables

The league summary table shows mean and standard deviation of key statistics for all 12 WNBA teams. The Aces summary table breaks these statistics down by game result. On average, the Aces scored 88.6 points in wins and 79.8 points in losses, a difference of 8.8 points.

#Creates table with summary of each teams statistics
summary_by_team %>%
  kbl(digits = 2, caption = "Summary Statistics by Team") %>%
  kable_classic(full_width = FALSE, html_font = "Cambria")
Summary Statistics by Team
team_name mean_score sd_score mean_reb sd_reb mean_fg_pct sd_fg_pct mean_3ptfgpct sd_3ptfgpct mean_steals sd_steals
Aces 85.52 9.56 33.78 5.88 45.27 5.82 35.27 7.08 6.80 2.67
Dream 76.93 10.59 35.95 4.41 41.28 6.78 30.83 9.32 7.14 2.82
Fever 84.50 10.17 35.10 5.49 45.56 5.38 35.00 8.99 5.88 2.29
Liberty 84.98 9.92 36.90 5.77 44.53 5.61 35.38 10.06 7.75 2.19
Lynx 82.36 11.39 33.15 5.06 45.21 6.34 37.80 9.43 8.36 3.17
Mercury 81.93 12.60 32.26 5.39 44.28 7.34 32.97 10.34 6.55 2.12
Mystics 79.30 8.69 31.85 4.66 43.36 4.82 36.64 8.69 7.28 2.24
Sky 77.40 9.62 36.60 5.57 42.44 5.22 31.74 11.62 7.00 3.30
Sparks 78.40 10.57 32.67 5.52 42.63 6.15 32.09 11.00 7.30 2.78
Storm 82.67 9.65 34.67 6.02 43.43 5.39 28.35 9.03 9.24 3.27
Sun 80.36 9.89 33.43 4.62 44.30 5.28 32.84 11.67 7.89 3.29
Wings 84.20 11.47 34.75 4.65 44.47 5.24 32.06 11.75 7.12 2.95
#Creates table with summary of Aces win/loss stats
summaryAces %>%
  kbl(digits = 2, caption = "Aces Summary by Game Result") %>%
  kable_classic(full_width = FALSE, html_font = "Cambria")
Aces Summary by Game Result
team_winner mean sd_score mean_reb sd_reb mean_fg_pct sd_fg_pct mean_3ptfgpct sd_3ptfgpct mean_steals sd_steals
FALSE 79.81 9.95 29.56 6.64 42.08 5.65 33.74 7.19 5.94 2.57
TRUE 88.57 7.93 36.03 3.97 46.97 5.23 36.08 7.00 7.27 2.65

3 Graphs

The histogram and boxplot show the distribution of Aces team scores separated by game result. Wins tend to cluster at higher scores, while losses are concentrated at lower values. Both distributions appear roughly symmetric. The boxplot confirms that winning games are associated with notably higher point totals, with less overlap than expected by chance.

#Creates a side by side histogram with a distribution of Aces Team score seperated by game results (win/loss)
ggplot(data_hist, aes(x = team_score, fill = result)) +
  geom_histogram(color = "white", alpha = 0.7, bins = 15, position = "dodge") +
  scale_fill_manual(values = c("Win" = "#69b3a2", "Loss" = "#404080")) +
  labs(title = "Distribution of Team Score by Game Result (Aces)",
       x = "Team Score",
       y = "Count",
       fill = "Result") +
  theme_minimal()

#Creates a Box plot with distribution of Aces Team score seperated by game results (win/loss)
boxplot(team_score ~ result, data = data_hist,
        col=c('lightblue','lightpink'),
        main = "points score by game result",
        xlab = "Result", ylab = "Points"

        )

4 First Order Model

Multicollinearity Check (Model 1 → Model 2)

The full first-order model included field goal percentage, total rebounds, 3-point percentage, and steals. Examining the correlation matrix, no pair of predictors exceeded |r| = 0.8 — the highest correlation among predictors was between field_goal_pct and three_point_field_goal_pct (r = 0.41). VIF values for all predictors were below 1.25, confirming no multicollinearity concern. However, steals showed virtually no linear relationship with team score (r = 0.016) and was removed to simplify the model. Model 2 retains field_goal_pct, total_rebounds, and three_point_field_goal_pct.

5 Interaction Model

The full interaction model (Model 3) was built on the three variables from Model 2. Interaction terms were evaluated at the alpha = 0.15 significance level. Two of the three interactions were non-significant and removed:

  • field_goal_pct:total_rebounds (p = 0.489)
  • total_rebounds:three_point_field_goal_pct (p = 0.250)

The interaction field_goal_pct:three_point_field_goal_pct was retained (p = 0.072 < 0.15), producing the final Model 4.

My final model is:

team_score = -35.972 + 2.228 * field_goal_pct + 0.451 * total_rebounds + 1.582 * three_point_field_goal_pct + -0.031 * (field_goal_pct * three_point_field_goal_pct)

This model is statistically significant, F(4, 41) = 22.04, p < 0.0001, adjusted R² = 0.652, indicating that the model explains 65.2% of the variance in team score.

6 Residuals

Residual analysis of Model 4 shows that residuals are approximately normally distributed with no strong skew. The versus-fits plot shows no obvious fan shape, suggesting constant variance is reasonably satisfied. No observations had a studentized residual exceeding |3|, so there are no extreme outliers.

Four observations were flagged as influential by Cook’s distance (threshold = 4/n = 0.087): games on 2024-09-24 vs. Storm, 2024-09-08 vs. Liberty, 2024-06-09 vs. Sparks, and 2024-05-14 vs. Mercury. These games represent unusual combinations of the predictor variables but are legitimate observations and were retained in the model.

# histogram of residuals — checking normality assumption
hist(model4$residual)

# versus fits plot — checking constant variance assumption
plot(model4$fitted.values, model4$residuals)

# studentized residuals — flagging outliers beyond |3|
plot(rstudent(model4))

# leverage plot — identifying high influence on model fit
plot(hatvalues(model4))

# Cook's distance — identifying observations that strongly affect coefficients
plot(cooks.distance(model4))

7 Prediction

Using the median values of each predictor — field goal percentage of 45.4%, 34 total rebounds, and 3-point percentage of 36% — Model 4 predicts a team score of 86.4 points, with a 95% confidence interval of (84.6, 88.2) points.

The experimental region for this model is: field_goal_pct ∈ [31.3, 59.4], total_rebounds ∈ [17, 45], three_point_field_goal_pct ∈ [20.7, 47.8]. Predictions outside this range should be made with caution.

LS0tDQp0aXRsZTogIklTUCBTdGF0aXN0aWNhbCBBbmFseXNpcyBSZXBvcnQiDQphdXRob3I6ICJKb3NodWEgWGF2aWVyIg0KZGF0ZTogIjUvNC8yMDI2Ig0Kb3V0cHV0Og0KICBodG1sX2RvY3VtZW50OiANCiAgICB0b2M6IHllcw0KICAgIHRvY19kZXB0aDogNA0KICAgIHRvY19mbG9hdDogeWVzDQogICAgbnVtYmVyX3NlY3Rpb25zOiB5ZXMNCiAgICB0b2NfY29sbGFwc2VkOiB5ZXMNCiAgICBjb2RlX2ZvbGRpbmc6IGhpZGUNCiAgICBjb2RlX2Rvd25sb2FkOiB5ZXMNCiAgICBzbW9vdGhfc2Nyb2xsOiB5ZXMNCiAgICB0aGVtZTogbHVtZW4NCiAgcGRmX2RvY3VtZW50OiANCiAgICB0b2M6IHllcw0KICAgIHRvY19kZXB0aDogNA0KICAgIGZpZ19jYXB0aW9uOiB5ZXMNCiAgICBudW1iZXJfc2VjdGlvbnM6IHllcw0KICAgIGZpZ193aWR0aDogMw0KICAgIGZpZ19oZWlnaHQ6IDMNCiAgd29yZF9kb2N1bWVudDogDQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZGVwdGg6IDQNCiAgICBmaWdfY2FwdGlvbjogeWVzDQogICAga2VlcF9tZDogeWVzDQplZGl0b3Jfb3B0aW9uczogDQogIGNodW5rX291dHB1dF90eXBlOiBpbmxpbmUNCi0tLQ0KDQpgYGB7Y3NzLCBlY2hvID0gRkFMU0V9DQojVE9DOjpiZWZvcmUgew0KICBjb250ZW50OiAiVGFibGUgb2YgQ29udGVudHMiOw0KICBmb250LXdlaWdodDogYm9sZDsNCiAgZm9udC1zaXplOiAxLjJlbTsNCiAgZGlzcGxheTogYmxvY2s7DQogIGNvbG9yOiBuYXZ5Ow0KICBtYXJnaW4tYm90dG9tOiAxMHB4Ow0KfQ0KDQoNCmRpdiNUT0MgbGkgeyAgICAgLyogdGFibGUgb2YgY29udGVudCAgKi8NCiAgICBsaXN0LXN0eWxlOnVwcGVyLXJvbWFuOw0KICAgIGJhY2tncm91bmQtaW1hZ2U6bm9uZTsNCiAgICBiYWNrZ3JvdW5kLXJlcGVhdDpub25lOw0KICAgIGJhY2tncm91bmQtcG9zaXRpb246MDsNCn0NCg0KaDEudGl0bGUgeyAgICAvKiBsZXZlbCAxIGhlYWRlciBvZiB0aXRsZSAgKi8NCiAgZm9udC1zaXplOiAyMnB4Ow0KICBmb250LXdlaWdodDogYm9sZDsNCiAgY29sb3I6IERhcmtSZWQ7DQogIHRleHQtYWxpZ246IGNlbnRlcjsNCiAgZm9udC1mYW1pbHk6ICJHaWxsIFNhbnMiLCBzYW5zLXNlcmlmOw0KfQ0KDQpoNC5hdXRob3IgeyAvKiBIZWFkZXIgNCAtIGFuZCB0aGUgYXV0aG9yIGFuZCBkYXRhIGhlYWRlcnMgdXNlIHRoaXMgdG9vICAqLw0KICBmb250LXNpemU6IDE1cHg7DQogIGZvbnQtd2VpZ2h0OiBib2xkOw0KICBmb250LWZhbWlseTogc3lzdGVtLXVpOw0KICBjb2xvcjogbmF2eTsNCiAgdGV4dC1hbGlnbjogY2VudGVyOw0KfQ0KDQpoNC5kYXRlIHsgLyogSGVhZGVyIDQgLSBhbmQgdGhlIGF1dGhvciBhbmQgZGF0YSBoZWFkZXJzIHVzZSB0aGlzIHRvbyAgKi8NCiAgZm9udC1zaXplOiAxOHB4Ow0KICBmb250LXdlaWdodDogYm9sZDsNCiAgZm9udC1mYW1pbHk6ICJHaWxsIFNhbnMiLCBzYW5zLXNlcmlmOw0KICBjb2xvcjogRGFya0JsdWU7DQogIHRleHQtYWxpZ246IGNlbnRlcjsNCn0NCg0KaDEgeyAvKiBIZWFkZXIgMSAtIGFuZCB0aGUgYXV0aG9yIGFuZCBkYXRhIGhlYWRlcnMgdXNlIHRoaXMgdG9vICAqLw0KICAgIGZvbnQtc2l6ZTogMjBweDsNCiAgICBmb250LXdlaWdodDogYm9sZDsNCiAgICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsNCiAgICBjb2xvcjogZGFya3JlZDsNCiAgICB0ZXh0LWFsaWduOiBsZWZ0Ow0KfQ0KDQpoMiB7IC8qIEhlYWRlciAyIC0gYW5kIHRoZSBhdXRob3IgYW5kIGRhdGEgaGVhZGVycyB1c2UgdGhpcyB0b28gICovDQogICAgZm9udC1zaXplOiAxOHB4Ow0KICAgIGZvbnQtd2VpZ2h0OiBib2xkOw0KICAgIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICAgIGNvbG9yOiBuYXZ5Ow0KICAgIHRleHQtYWxpZ246IGxlZnQ7DQp9DQoNCmgzIHsgLyogSGVhZGVyIDMgLSBhbmQgdGhlIGF1dGhvciBhbmQgZGF0YSBoZWFkZXJzIHVzZSB0aGlzIHRvbyAgKi8NCiAgICBmb250LXNpemU6IDE2cHg7DQogICAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogICAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7DQogICAgY29sb3I6IG5hdnk7DQogICAgdGV4dC1hbGlnbjogbGVmdDsNCn0NCg0KaDQgeyAvKiBIZWFkZXIgNCAtIGFuZCB0aGUgYXV0aG9yIGFuZCBkYXRhIGhlYWRlcnMgdXNlIHRoaXMgdG9vICAqLw0KICAgIGZvbnQtc2l6ZTogMTRweDsNCiAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogICAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7DQogICAgY29sb3I6IGRhcmtyZWQ7DQogICAgdGV4dC1hbGlnbjogbGVmdDsNCn0NCg0KLyogQWRkIGRvdHMgYWZ0ZXIgbnVtYmVyZWQgaGVhZGVycyAqLw0KLmhlYWRlci1zZWN0aW9uLW51bWJlcjo6YWZ0ZXIgew0KICBjb250ZW50OiAiLiI7DQoNCmJvZHkgeyBiYWNrZ3JvdW5kLWNvbG9yOndoaXRlOyB9DQoNCi5oaWdobGlnaHRtZSB7IGJhY2tncm91bmQtY29sb3I6eWVsbG93OyB9DQoNCnAgeyBiYWNrZ3JvdW5kLWNvbG9yOndoaXRlOyB9DQoNCn0NCmBgYA0KDQpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0NCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSkNCg0Kc2V0d2QoIkM6L1VzZXJzL2pvc2h1L09uZURyaXZlL0Rlc2t0b3AvU3RhdDMxOVNwcmluZyIpDQpkYXRhIDwtIHJlYWQuY3N2KCJXTkJBXzIwMjRfYm94LXNjb3Jlcy5jc3YiKQ0KDQoNCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkoZHBseXIpDQpsaWJyYXJ5KGNhcikNCmxpYnJhcnkob2xzcnIpDQojIGthYmxlRXh0cmEgbWFrZXMgdGhlIHRhYmxlcyBsb29rIG5pY2UNCmxpYnJhcnkoa2FibGVFeHRyYSkNCg0KDQoNCmBgYA0KDQpgYGB7ciB3cmFuZ2xpbmcsIGluY2x1ZGUgPSBGfQ0KDQojcmVtb3ZlcyB0ZWFtIHNjb3JlcyBmcm9tIEFsbCBzdGFyIGdhbWUgc28gb25seSBtYWluIFdOQkEgdGVhbXMgYXJlIGluY2x1ZGVkDQpkYXRhPWRhdGElPiUNCiAgZmlsdGVyKHRlYW1fbmFtZSAhPSAiVGVhbSBXTkJBIiwNCiAgICAgICAgIHRlYW1fbmFtZSAhPSAiVGVhbSBVU0EiKQ0KDQoNCiMgR3JvdXAgZGF0YSBieSB0ZWFtIGFuZCBjb21wdXRlIG1lYW4gJiBzZCBmb3IgYWxsIHJlcXVpcmVkIHZhcmlhYmxlcw0KIyBjb21wdXRlIGxlYWd1ZS13aWRlIHN1bW1hcnkgc28gd2UgY2FuIGNvbXBhcmUgQWNlcyB0byBhbGwgb3RoZXIgdGVhbXMNCiBzdW1tYXJ5X2J5X3RlYW0gPSBkYXRhICU+JQ0KICAgZ3JvdXBfYnkodGVhbV9uYW1lKSAlPiUNCiAgIHN1bW1hcmlzZSgNCiAgICAgbWVhbl9zY29yZT1tZWFuKHRlYW1fc2NvcmUpLCANCiAgICAgc2Rfc2NvcmU9c2QodGVhbV9zY29yZSksDQogICAgIG1lYW5fcmViPW1lYW4odG90YWxfcmVib3VuZHMpLCANCiAgICAgc2RfcmViPXNkKHRvdGFsX3JlYm91bmRzKSwNCiAgICAgbWVhbl9mZ19wY3Q9bWVhbihmaWVsZF9nb2FsX3BjdCksDQogICAgIHNkX2ZnX3BjdD1zZChmaWVsZF9nb2FsX3BjdCksDQogICAgIG1lYW5fM3B0ZmdwY3Q9bWVhbih0aHJlZV9wb2ludF9maWVsZF9nb2FsX3BjdCksDQogICAgIHNkXzNwdGZncGN0PXNkKHRocmVlX3BvaW50X2ZpZWxkX2dvYWxfcGN0KSwNCiAgICAgbWVhbl9zdGVhbHM9bWVhbihzdGVhbHMpLA0KICAgICBzZF9zdGVhbHM9c2Qoc3RlYWxzKQ0KICAgICkNCiAgIA0KDQojU2VsZWN0IHZhcmlhYmxlcyBhbmQgZmlsdGVyIHRvIG15IHRlYW0NCiNjcmVhdGVzIGEgZGF0YSBzZXQgd2l0aCBvbmx5IHRoZSBzbGVjdGVkIHZhcmlhYmxlcyBmb3IgbXkgdGVhbSAoQWNlcykNCm15X3RlYW0gPC0gZGF0YSAlPiUNCiAgc2VsZWN0KHRlYW1fc2NvcmUsIGZpZWxkX2dvYWxfcGN0LCB0b3RhbF9yZWJvdW5kcywgDQogICAgICAgICB0aHJlZV9wb2ludF9maWVsZF9nb2FsX3BjdCwgc3RlYWxzLCB0ZWFtX25hbWUsIA0KICAgICAgICAgdGVhbV93aW5uZXIpICU+JQ0KICANCiAgZmlsdGVyKHRlYW1fbmFtZSA9PSAiQWNlcyIpDQoNCiNHcm91cHMgY2FzZXMgYnkgd2luIHZzLiBsb3NzDQojc3VtbWFyaXplIGFsbCB2YXJpYWJsZXMgd2l0aCBtZWFuIGFuZCBzZCBmb3IgbXkgdGVhbQ0KI0Vzc2VudGlhbGx5IHNhbWUgYXMgc3VtbWFyeSBieSB0ZWFtLCBidXQgZm9yIEFjZXMgc3RhdHMgb25seQ0Kc3VtbWFyeUFjZXMgPSBteV90ZWFtICU+JQ0KICBncm91cF9ieSh0ZWFtX3dpbm5lciklPiUNCiAgc3VtbWFyaXNlKA0KICAgICAgICAgICAgbWVhbj1tZWFuKHRlYW1fc2NvcmUpLA0KICAgICAgICAgICAgc2Rfc2NvcmU9c2QodGVhbV9zY29yZSksDQogICAgICAgICAgICBtZWFuX3JlYj1tZWFuKHRvdGFsX3JlYm91bmRzKSwgDQogICAgICAgICAgICBzZF9yZWI9c2QodG90YWxfcmVib3VuZHMpLA0KICAgICAgICAgICAgbWVhbl9mZ19wY3Q9bWVhbihmaWVsZF9nb2FsX3BjdCksDQogICAgICAgICAgICBzZF9mZ19wY3Q9c2QoZmllbGRfZ29hbF9wY3QpLA0KICAgICAgICAgICAgbWVhbl8zcHRmZ3BjdD1tZWFuKHRocmVlX3BvaW50X2ZpZWxkX2dvYWxfcGN0KSwNCiAgICAgICAgICAgIHNkXzNwdGZncGN0PXNkKHRocmVlX3BvaW50X2ZpZWxkX2dvYWxfcGN0KSwNCiAgICAgICAgICAgIG1lYW5fc3RlYWxzPW1lYW4oc3RlYWxzKSwNCiAgICAgICAgICAgIHNkX3N0ZWFscz1zZChzdGVhbHMpDQogICAgICAgICAgKQ0KDQojQ3JlYXRlcyBjbGVhbiBkYXRhIHNldCBmb3IgaGlzdG9ncmFtIHRvIHVzZQ0KZGF0YV9oaXN0IDwtIGRhdGElPiUNCmZpbHRlcih0ZWFtX25hbWU9PSJBY2VzIikgJT4lDQogIG11dGF0ZShyZXN1bHQ9Y2FzZV93aGVuKA0KICAgIHRlYW1fd2lubmVyPT1UUlVFfiAiV2luIiwNCiAgICB0ZWFtX3dpbm5lcj09RkFMU0V+Ikxvc3MiKSkNCg0KDQoNCmBgYA0KDQojIEludHJvZHVjdGlvbg0KVGhpcyByZXBvcnQgYW5hbHl6ZXMgdGhlIDIwMjQgV05CQSBzZWFzb24gYm94IHNjb3JlIGRhdGEgdG8gYnVpbGQgYSByZWdyZXNzaW9uIA0KbW9kZWwgcHJlZGljdGluZyB0aGUgTGFzIFZlZ2FzIEFjZXMnIHRlYW0gc2NvcmUuIFRoZSBkYXRhc2V0IGluY2x1ZGVzIGdhbWUgDQpzdGF0aXN0aWNzIGZvciBhbGwgV05CQSB0ZWFtcy4gQWxsLVN0YXIgZ2FtZSBvYnNlcnZhdGlvbnMgd2VyZSByZW1vdmVkLCBsZWF2aW5nIA0Kb25seSByZWd1bGFyIHNlYXNvbiBnYW1lcy4gVGhlIGdvYWwgaXMgdG8gaWRlbnRpZnkgd2hpY2ggcGVyZm9ybWFuY2UgbWV0cmljcyANCihmaWVsZCBnb2FsIHBlcmNlbnRhZ2UsIHJlYm91bmRzLCAzLXBvaW50IHBlcmNlbnRhZ2UsIGFuZCBzdGVhbHMpIGJlc3QgcHJlZGljdCANCmhvdyBtYW55IHBvaW50cyB0aGUgQWNlcyBzY29yZSBpbiBhIGdpdmVuIGdhbWUuDQoNCiMgVGFibGVzDQpUaGUgbGVhZ3VlIHN1bW1hcnkgdGFibGUgc2hvd3MgbWVhbiBhbmQgc3RhbmRhcmQgZGV2aWF0aW9uIG9mIGtleSBzdGF0aXN0aWNzIA0KZm9yIGFsbCAxMiBXTkJBIHRlYW1zLiBUaGUgQWNlcyBzdW1tYXJ5IHRhYmxlIGJyZWFrcyB0aGVzZSBzdGF0aXN0aWNzIGRvd24gYnkgDQpnYW1lIHJlc3VsdC4gT24gYXZlcmFnZSwgdGhlIEFjZXMgc2NvcmVkIGByIHJvdW5kKHN1bW1hcnlBY2VzJG1lYW5bMl0sIDEpYCANCnBvaW50cyBpbiB3aW5zIGFuZCBgciByb3VuZChzdW1tYXJ5QWNlcyRtZWFuWzFdLCAxKWAgcG9pbnRzIGluIGxvc3NlcywgDQphIGRpZmZlcmVuY2Ugb2YgYHIgcm91bmQoc3VtbWFyeUFjZXMkbWVhblsyXSAtIHN1bW1hcnlBY2VzJG1lYW5bMV0sIDEpYCBwb2ludHMuDQoNCmBgYHtyIHRhYmxlcywgaW5jbHVkZSA9IFR9DQoNCiNDcmVhdGVzIHRhYmxlIHdpdGggc3VtbWFyeSBvZiBlYWNoIHRlYW1zIHN0YXRpc3RpY3MNCnN1bW1hcnlfYnlfdGVhbSAlPiUNCiAga2JsKGRpZ2l0cyA9IDIsIGNhcHRpb24gPSAiU3VtbWFyeSBTdGF0aXN0aWNzIGJ5IFRlYW0iKSAlPiUNCiAga2FibGVfY2xhc3NpYyhmdWxsX3dpZHRoID0gRkFMU0UsIGh0bWxfZm9udCA9ICJDYW1icmlhIikNCg0KI0NyZWF0ZXMgdGFibGUgd2l0aCBzdW1tYXJ5IG9mIEFjZXMgd2luL2xvc3Mgc3RhdHMNCnN1bW1hcnlBY2VzICU+JQ0KICBrYmwoZGlnaXRzID0gMiwgY2FwdGlvbiA9ICJBY2VzIFN1bW1hcnkgYnkgR2FtZSBSZXN1bHQiKSAlPiUNCiAga2FibGVfY2xhc3NpYyhmdWxsX3dpZHRoID0gRkFMU0UsIGh0bWxfZm9udCA9ICJDYW1icmlhIikNCg0KYGBgDQoNCg0KDQoNCiMgR3JhcGhzDQpUaGUgaGlzdG9ncmFtIGFuZCBib3hwbG90IHNob3cgdGhlIGRpc3RyaWJ1dGlvbiBvZiBBY2VzIHRlYW0gc2NvcmVzIHNlcGFyYXRlZCANCmJ5IGdhbWUgcmVzdWx0LiBXaW5zIHRlbmQgdG8gY2x1c3RlciBhdCBoaWdoZXIgc2NvcmVzLCB3aGlsZSBsb3NzZXMgYXJlIA0KY29uY2VudHJhdGVkIGF0IGxvd2VyIHZhbHVlcy4gQm90aCBkaXN0cmlidXRpb25zIGFwcGVhciByb3VnaGx5IHN5bW1ldHJpYy4gDQpUaGUgYm94cGxvdCBjb25maXJtcyB0aGF0IHdpbm5pbmcgZ2FtZXMgYXJlIGFzc29jaWF0ZWQgd2l0aCBub3RhYmx5IGhpZ2hlciANCnBvaW50IHRvdGFscywgd2l0aCBsZXNzIG92ZXJsYXAgdGhhbiBleHBlY3RlZCBieSBjaGFuY2UuDQpgYGB7ciBncmFwaHMsIGluY2x1ZGU9IFQsIGZpZy53aWR0aD01LCBmaWcuaGVpZ2h0PTV9DQoNCiNDcmVhdGVzIGEgc2lkZSBieSBzaWRlIGhpc3RvZ3JhbSB3aXRoIGEgZGlzdHJpYnV0aW9uIG9mIEFjZXMgVGVhbSBzY29yZSBzZXBlcmF0ZWQgYnkgZ2FtZSByZXN1bHRzICh3aW4vbG9zcykNCmdncGxvdChkYXRhX2hpc3QsIGFlcyh4ID0gdGVhbV9zY29yZSwgZmlsbCA9IHJlc3VsdCkpICsNCiAgZ2VvbV9oaXN0b2dyYW0oY29sb3IgPSAid2hpdGUiLCBhbHBoYSA9IDAuNywgYmlucyA9IDE1LCBwb3NpdGlvbiA9ICJkb2RnZSIpICsNCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygiV2luIiA9ICIjNjliM2EyIiwgIkxvc3MiID0gIiM0MDQwODAiKSkgKw0KICBsYWJzKHRpdGxlID0gIkRpc3RyaWJ1dGlvbiBvZiBUZWFtIFNjb3JlIGJ5IEdhbWUgUmVzdWx0IChBY2VzKSIsDQogICAgICAgeCA9ICJUZWFtIFNjb3JlIiwNCiAgICAgICB5ID0gIkNvdW50IiwNCiAgICAgICBmaWxsID0gIlJlc3VsdCIpICsNCiAgdGhlbWVfbWluaW1hbCgpDQoNCiNDcmVhdGVzIGEgQm94IHBsb3Qgd2l0aCBkaXN0cmlidXRpb24gb2YgQWNlcyBUZWFtIHNjb3JlIHNlcGVyYXRlZCBieSBnYW1lIHJlc3VsdHMgKHdpbi9sb3NzKQ0KYm94cGxvdCh0ZWFtX3Njb3JlIH4gcmVzdWx0LCBkYXRhID0gZGF0YV9oaXN0LA0KICAgICAgICBjb2w9YygnbGlnaHRibHVlJywnbGlnaHRwaW5rJyksDQogICAgICAgIG1haW4gPSAicG9pbnRzIHNjb3JlIGJ5IGdhbWUgcmVzdWx0IiwNCiAgICAgICAgeGxhYiA9ICJSZXN1bHQiLCB5bGFiID0gIlBvaW50cyINCg0KICAgICAgICApDQoNCmBgYA0KDQoNCg0KYGBge3IgRmlyc3QgT3JkZXIgTW9kZWwsIGluY2x1ZGUgPSBULCBlY2hvPUYsIH0NCiMgZnVsbCBmaXJzdC1vcmRlciBtb2RlbCB3aXRoIGFsbCA0IGNhbmRpZGF0ZSBwcmVkaWN0b3JzDQptb2RlbDEgPC0gbG0odGVhbV9zY29yZSB+IGZpZWxkX2dvYWxfcGN0ICsgdG90YWxfcmVib3VuZHMgKw0KICAgICAgICAgICAgICAgdGhyZWVfcG9pbnRfZmllbGRfZ29hbF9wY3QgKyBzdGVhbHMsDQogICAgICAgICAgICAgZGF0YSA9IG15X3RlYW0pDQogDQojQ29ycmVsYXRpb24gbWF0cml4IG9mIEFjZXMgdmFyaWFibGVzDQpjb3JfZGF0YT0gbXlfdGVhbSAlPiUNCiAgc2VsZWN0KHRlYW1fc2NvcmUsZmllbGRfZ29hbF9wY3QsIHRvdGFsX3JlYm91bmRzLHRocmVlX3BvaW50X2ZpZWxkX2dvYWxfcGN0LA0KICAgICAgICAgc3RlYWxzKQ0KI2Nvcihjb3JfZGF0YSkNCg0KDQojbGV0cyB1cyBsb29rIGF0IHRoZSBzdGF0cyBvZiB0aGUgYWNlcyBmcm9tIHRoZSBmaXJzdCBtb2RlbA0KI3N1bW1hcnkobW9kZWwxKQ0KI3ZpZihtb2RlbDEpDQoNCiNOZXcgcmVkY3VlZCBtb2RlbCBnZXRzIHJpZCBvZiB2YXJpYWJsZSBzdGVhbHMgc2luY2UgaXQncyB8cnw+MC44DQptb2RlbDIgPC0gbG0odGVhbV9zY29yZSB+IGZpZWxkX2dvYWxfcGN0ICsgdG90YWxfcmVib3VuZHMgKw0KICAgICAgICAgICAgICAgdGhyZWVfcG9pbnRfZmllbGRfZ29hbF9wY3QsIGRhdGEgPSBteV90ZWFtKQ0KDQojc3VtbWFyeShtb2RlbDIpDQojdmlmKG1vZGVsMikNCmBgYA0KIyBGaXJzdCBPcmRlciBNb2RlbA0KKipNdWx0aWNvbGxpbmVhcml0eSBDaGVjayAoTW9kZWwgMSDihpIgTW9kZWwgMikqKg0KDQpUaGUgZnVsbCBmaXJzdC1vcmRlciBtb2RlbCBpbmNsdWRlZCBmaWVsZCBnb2FsIHBlcmNlbnRhZ2UsIHRvdGFsIHJlYm91bmRzLCANCjMtcG9pbnQgcGVyY2VudGFnZSwgYW5kIHN0ZWFscy4gRXhhbWluaW5nIHRoZSBjb3JyZWxhdGlvbiBtYXRyaXgsIG5vIHBhaXIgb2YgDQpwcmVkaWN0b3JzIGV4Y2VlZGVkIHxyfCA9IDAuOCDigJQgdGhlIGhpZ2hlc3QgY29ycmVsYXRpb24gYW1vbmcgcHJlZGljdG9ycyB3YXMgDQpiZXR3ZWVuIGZpZWxkX2dvYWxfcGN0IGFuZCB0aHJlZV9wb2ludF9maWVsZF9nb2FsX3BjdCAociA9IDAuNDEpLiBWSUYgdmFsdWVzIA0KZm9yIGFsbCBwcmVkaWN0b3JzIHdlcmUgYmVsb3cgMS4yNSwgY29uZmlybWluZyBubyBtdWx0aWNvbGxpbmVhcml0eSBjb25jZXJuLiANCkhvd2V2ZXIsIHN0ZWFscyBzaG93ZWQgdmlydHVhbGx5IG5vIGxpbmVhciByZWxhdGlvbnNoaXAgd2l0aCB0ZWFtIHNjb3JlIA0KKHIgPSAwLjAxNikgYW5kIHdhcyByZW1vdmVkIHRvIHNpbXBsaWZ5IHRoZSBtb2RlbC4gTW9kZWwgMiByZXRhaW5zIA0KZmllbGRfZ29hbF9wY3QsIHRvdGFsX3JlYm91bmRzLCBhbmQgdGhyZWVfcG9pbnRfZmllbGRfZ29hbF9wY3QuDQoNCg0KYGBge3IgSW50ZXJhY3Rpb24gTW9kZWwsIHJlc3VsdHM9J2FzaXMnLCBlY2hvPUYsIGluY2x1ZGU9VCwgY29tbWVudD1OQX0NCg0KIyBmdWxsIGludGVyYWN0aW9uIG1vZGVsIGJ1aWx0IGZyb20gbW9kZWwyIHZhcmlhYmxlcyBvbmx5IChzdGVhbHMgYWxyZWFkeSByZW1vdmVkKSAgICAgIA0KbW9kZWwzIDwtIGxtKHRlYW1fc2NvcmUgfiAoZmllbGRfZ29hbF9wY3QgKyB0b3RhbF9yZWJvdW5kcyArIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWVfcG9pbnRfZmllbGRfZ29hbF9wY3QpXjIsIGRhdGEgPSBteV90ZWFtKQ0KI3N1bW1hcnkobW9kZWwzKQ0KICAgICAgICAgICAgDQogICAgICAgICAgICANCiNzdW1tYXJ5KG1vZGVsNCkNCiMgcmVtb3ZlZCBmZzpyZWIgKHA9MC40ODkpIGFuZCByZWI6M3B0IChwPTAuMjUwKSDigJQgYm90aCBleGNlZWRlZCBhbHBoYT0wLjE1DQptb2RlbDQ9bG0odGVhbV9zY29yZX5maWVsZF9nb2FsX3BjdCt0b3RhbF9yZWJvdW5kcyt0aHJlZV9wb2ludF9maWVsZF9nb2FsX3BjdCtmaWVsZF9nb2FsX3BjdCp0aHJlZV9wb2ludF9maWVsZF9nb2FsX3BjdCxkYXRhPW15X3RlYW0pDQoNCiMgc2F2ZSBzdW1tYXJ5IHNvIHdlIGNhbiByZWZlcmVuY2UgRi1zdGF0IGFuZCBSXjIgd2l0aCBpbmxpbmUgY29kZQ0KbW9kZWw0c3VtIDwtIHN1bW1hcnkobW9kZWw0KQ0KDQojc3VtbWFyeShtb2RlbDQpDQoNCiMNCiNsaWJyYXJ5KG1vZGVybmRpdmUpDQojdDQ9Z2V0X3JlZ3Jlc3Npb25fdGFibGUobW9kZWw0KQ0KI3Q0ICU+JSANCiMga2JsKGRpZ2l0cyA9IDMsIGNhcHRpb249IkZpbmFsIE1vZGVsIFJlc3VsdHMiKSAlPiUNCiMgIGthYmxlX2NsYXNzaWMoZnVsbF93aWR0aCA9IEYpDQogIA0KYGBgDQojIEludGVyYWN0aW9uIE1vZGVsDQpUaGUgZnVsbCBpbnRlcmFjdGlvbiBtb2RlbCAoTW9kZWwgMykgd2FzIGJ1aWx0IG9uIHRoZSB0aHJlZSB2YXJpYWJsZXMgZnJvbSANCk1vZGVsIDIuIEludGVyYWN0aW9uIHRlcm1zIHdlcmUgZXZhbHVhdGVkIGF0IHRoZSBhbHBoYSA9IDAuMTUgc2lnbmlmaWNhbmNlIGxldmVsLiANClR3byBvZiB0aGUgdGhyZWUgaW50ZXJhY3Rpb25zIHdlcmUgbm9uLXNpZ25pZmljYW50IGFuZCByZW1vdmVkOg0KDQotIGZpZWxkX2dvYWxfcGN0OnRvdGFsX3JlYm91bmRzIChwID0gMC40ODkpDQotIHRvdGFsX3JlYm91bmRzOnRocmVlX3BvaW50X2ZpZWxkX2dvYWxfcGN0IChwID0gMC4yNTApDQoNClRoZSBpbnRlcmFjdGlvbiBmaWVsZF9nb2FsX3BjdDp0aHJlZV9wb2ludF9maWVsZF9nb2FsX3BjdCB3YXMgcmV0YWluZWQgDQoocCA9IDAuMDcyIDwgMC4xNSksIHByb2R1Y2luZyB0aGUgZmluYWwgTW9kZWwgNC4NCg0KTXkgZmluYWwgbW9kZWwgaXM6DQoNCnRlYW1fc2NvcmUgPSBgciByb3VuZChtb2RlbDQkY29lZmZpY2llbnRzWzFdLCAzKWAgKyANCmByIHJvdW5kKG1vZGVsNCRjb2VmZmljaWVudHNbMl0sIDMpYCAqIGZpZWxkX2dvYWxfcGN0ICsgDQpgciByb3VuZChtb2RlbDQkY29lZmZpY2llbnRzWzNdLCAzKWAgKiB0b3RhbF9yZWJvdW5kcyArIA0KYHIgcm91bmQobW9kZWw0JGNvZWZmaWNpZW50c1s0XSwgMylgICogdGhyZWVfcG9pbnRfZmllbGRfZ29hbF9wY3QgKyANCmByIHJvdW5kKG1vZGVsNCRjb2VmZmljaWVudHNbNV0sIDMpYCAqIChmaWVsZF9nb2FsX3BjdCAqIHRocmVlX3BvaW50X2ZpZWxkX2dvYWxfcGN0KQ0KDQpUaGlzIG1vZGVsIGlzIHN0YXRpc3RpY2FsbHkgc2lnbmlmaWNhbnQsIEYoYHIgbW9kZWw0c3VtJGZzdGF0aXN0aWNbMl1gLCANCmByIG1vZGVsNHN1bSRmc3RhdGlzdGljWzNdYCkgPSBgciByb3VuZChtb2RlbDRzdW0kZnN0YXRpc3RpY1sxXSwgMilgLCANCnAgPCAwLjAwMDEsIGFkanVzdGVkIFLCsiA9IGByIHJvdW5kKG1vZGVsNHN1bSRhZGouci5zcXVhcmVkLCAzKWAsIGluZGljYXRpbmcgDQp0aGF0IHRoZSBtb2RlbCBleHBsYWlucyBgciByb3VuZChtb2RlbDRzdW0kYWRqLnIuc3F1YXJlZCAqIDEwMCwgMSlgJSBvZiB0aGUgDQp2YXJpYW5jZSBpbiB0ZWFtIHNjb3JlLg0KDQpgYGB7ciBpbmZsdWVudGlhbC1nYW1lcywgaW5jbHVkZT1GQUxTRX0NCiMgUHVsbCBmdWxsIGRhdGFzZXQgd2l0aCBnYW1lIGluZm8gdG8gaWRlbnRpZnkgaW5mbHVlbnRpYWwgb2JzZXJ2YXRpb25zDQpteV90ZWFtX2Z1bGwgPC0gZGF0YSAlPiUNCiAgZmlsdGVyKHRlYW1fbmFtZSA9PSAiQWNlcyIpICU+JQ0KICBzZWxlY3QodGVhbV9zY29yZSwgZmllbGRfZ29hbF9wY3QsIHRvdGFsX3JlYm91bmRzLA0KICAgICAgICAgdGhyZWVfcG9pbnRfZmllbGRfZ29hbF9wY3QsIHN0ZWFscywgdGVhbV9uYW1lLA0KICAgICAgICAgdGVhbV93aW5uZXIsIGdhbWVfZGF0ZSwgb3Bwb25lbnRfdGVhbV9uYW1lKQ0KDQojIFJvd3MgNSwgMTIsIDM4LCA0NiB3ZXJlIGZsYWdnZWQgYnkgQ29vaydzIGRpc3RhbmNlDQppbmZsdWVudGlhbCA8LSBteV90ZWFtX2Z1bGxbYyg1LCAxMiwgMzgsIDQ2KSwgXQ0KYGBgDQoNCg0KIyBSZXNpZHVhbHMNClJlc2lkdWFsIGFuYWx5c2lzIG9mIE1vZGVsIDQgc2hvd3MgdGhhdCByZXNpZHVhbHMgYXJlIGFwcHJveGltYXRlbHkgbm9ybWFsbHkgDQpkaXN0cmlidXRlZCB3aXRoIG5vIHN0cm9uZyBza2V3LiBUaGUgdmVyc3VzLWZpdHMgcGxvdCBzaG93cyBubyBvYnZpb3VzIA0KZmFuIHNoYXBlLCBzdWdnZXN0aW5nIGNvbnN0YW50IHZhcmlhbmNlIGlzIHJlYXNvbmFibHkgc2F0aXNmaWVkLiBObyBvYnNlcnZhdGlvbnMgDQpoYWQgYSBzdHVkZW50aXplZCByZXNpZHVhbCBleGNlZWRpbmcgfDN8LCBzbyB0aGVyZSBhcmUgbm8gZXh0cmVtZSBvdXRsaWVycy4NCg0KRm91ciBvYnNlcnZhdGlvbnMgd2VyZSBmbGFnZ2VkIGFzIGluZmx1ZW50aWFsIGJ5IENvb2sncyBkaXN0YW5jZSANCih0aHJlc2hvbGQgPSA0L24gPSBgciByb3VuZCg0L25yb3cobXlfdGVhbSksIDMpYCk6IGdhbWVzIG9uIA0KYHIgaW5mbHVlbnRpYWwkZ2FtZV9kYXRlWzFdYCB2cy4gYHIgaW5mbHVlbnRpYWwkb3Bwb25lbnRfdGVhbV9uYW1lWzFdYCwgDQpgciBpbmZsdWVudGlhbCRnYW1lX2RhdGVbMl1gIHZzLiBgciBpbmZsdWVudGlhbCRvcHBvbmVudF90ZWFtX25hbWVbMl1gLCANCmByIGluZmx1ZW50aWFsJGdhbWVfZGF0ZVszXWAgdnMuIGByIGluZmx1ZW50aWFsJG9wcG9uZW50X3RlYW1fbmFtZVszXWAsIGFuZCANCmByIGluZmx1ZW50aWFsJGdhbWVfZGF0ZVs0XWAgdnMuIGByIGluZmx1ZW50aWFsJG9wcG9uZW50X3RlYW1fbmFtZVs0XWAuIA0KVGhlc2UgZ2FtZXMgcmVwcmVzZW50IHVudXN1YWwgY29tYmluYXRpb25zIG9mIHRoZSBwcmVkaWN0b3IgdmFyaWFibGVzIA0KYnV0IGFyZSBsZWdpdGltYXRlIG9ic2VydmF0aW9ucyBhbmQgd2VyZSByZXRhaW5lZCBpbiB0aGUgbW9kZWwuDQoNCmBgYHtyIFJlc2lkdWFsc30NCg0KIyBoaXN0b2dyYW0gb2YgcmVzaWR1YWxzIOKAlCBjaGVja2luZyBub3JtYWxpdHkgYXNzdW1wdGlvbg0KaGlzdChtb2RlbDQkcmVzaWR1YWwpDQoNCiMgdmVyc3VzIGZpdHMgcGxvdCDigJQgY2hlY2tpbmcgY29uc3RhbnQgdmFyaWFuY2UgYXNzdW1wdGlvbg0KcGxvdChtb2RlbDQkZml0dGVkLnZhbHVlcywgbW9kZWw0JHJlc2lkdWFscykNCg0KIyBzdHVkZW50aXplZCByZXNpZHVhbHMg4oCUIGZsYWdnaW5nIG91dGxpZXJzIGJleW9uZCB8M3wNCnBsb3QocnN0dWRlbnQobW9kZWw0KSkNCg0KIyBsZXZlcmFnZSBwbG90IOKAlCBpZGVudGlmeWluZyBoaWdoIGluZmx1ZW5jZSBvbiBtb2RlbCBmaXQNCnBsb3QoaGF0dmFsdWVzKG1vZGVsNCkpDQoNCiMgQ29vaydzIGRpc3RhbmNlIOKAlCBpZGVudGlmeWluZyBvYnNlcnZhdGlvbnMgdGhhdCBzdHJvbmdseSBhZmZlY3QgY29lZmZpY2llbnRzDQpwbG90KGNvb2tzLmRpc3RhbmNlKG1vZGVsNCkpDQoNCmBgYA0KDQoNCg0KDQoNCmBgYHtyIFByZWRpY3Rpb24sIGluY2x1ZGU9Rn0NCiNzdW1tYXJ5KGNvcl9kYXRhKQ0KDQpuZXdkYXRhPWRhdGEuZnJhbWUoZmllbGRfZ29hbF9wY3Q9NDUuNCwgDQogICAgICAgICAgICAgICAgICB0b3RhbF9yZWJvdW5kcz0zNCwgDQogICAgICAgICAgICAgICAgICB0aHJlZV9wb2ludF9maWVsZF9nb2FsX3BjdD0zNiwNCiAgICAgICAgICAgICAgICAgIHN0ZWFscz03KQ0KDQoNCiNwcmVkaWN0KG1vZGVsNCwgbmV3ZGF0YSwgaW50ZXJ2YWwgPSAiY29uZmlkZW5jZSIsIGxldmVsPSAwLjk1KQ0KcHJlZGljdGlvbiA8LSBwcmVkaWN0KG1vZGVsNCwgbmV3ZGF0YSwgaW50ZXJ2YWwgPSAiY29uZmlkZW5jZSIsIGxldmVsID0gMC45NSkNCg0KYGBgDQojIFByZWRpY3Rpb24NClVzaW5nIHRoZSBtZWRpYW4gdmFsdWVzIG9mIGVhY2ggcHJlZGljdG9yIOKAlCBmaWVsZCBnb2FsIHBlcmNlbnRhZ2Ugb2YgNDUuNCUsIA0KMzQgdG90YWwgcmVib3VuZHMsIGFuZCAzLXBvaW50IHBlcmNlbnRhZ2Ugb2YgMzYlIOKAlCBNb2RlbCA0IHByZWRpY3RzIGEgdGVhbSANCnNjb3JlIG9mIGByIHJvdW5kKHByZWRpY3Rpb25bMV0sIDEpYCBwb2ludHMsIHdpdGggYSA5NSUgY29uZmlkZW5jZSBpbnRlcnZhbCANCm9mIChgciByb3VuZChwcmVkaWN0aW9uWzJdLCAxKWAsIGByIHJvdW5kKHByZWRpY3Rpb25bM10sIDEpYCkgcG9pbnRzLg0KDQpUaGUgZXhwZXJpbWVudGFsIHJlZ2lvbiBmb3IgdGhpcyBtb2RlbCBpczogZmllbGRfZ29hbF9wY3Qg4oiIIA0KW2ByIG1pbihteV90ZWFtJGZpZWxkX2dvYWxfcGN0KWAsIGByIG1heChteV90ZWFtJGZpZWxkX2dvYWxfcGN0KWBdLCANCnRvdGFsX3JlYm91bmRzIOKIiCBbYHIgbWluKG15X3RlYW0kdG90YWxfcmVib3VuZHMpYCwgDQpgciBtYXgobXlfdGVhbSR0b3RhbF9yZWJvdW5kcylgXSwgdGhyZWVfcG9pbnRfZmllbGRfZ29hbF9wY3Qg4oiIIA0KW2ByIG1pbihteV90ZWFtJHRocmVlX3BvaW50X2ZpZWxkX2dvYWxfcGN0KWAsIA0KYHIgbWF4KG15X3RlYW0kdGhyZWVfcG9pbnRfZmllbGRfZ29hbF9wY3QpYF0uIA0KUHJlZGljdGlvbnMgb3V0c2lkZSB0aGlzIHJhbmdlIHNob3VsZCBiZSBtYWRlIHdpdGggY2F1dGlvbi4NCg0K