1 Introduction

This data set includes the box scores for each WNBA team for every game of the 2025 season. The team I will be analyzing is the Indiana Fever. The goal of this project is to build the best model to predict team score in a median game for the Indiana Fever.

2 Tables

The Summary Table provides the mean and standard deviation for each teams score, rebounds, field goal percentage, 3 point field goal percentage, and steals over the 2025 season for every WNBA team. My Team Summary Table provides these same statistics for each game result, a win or a loss, for the Indiana Fever.

summary_score %>%
  kable(digits = 2, caption = "Summary Table") %>%
  kable_paper(full_width = F, html_font = "Times New Roman")
Summary Table
team_name mean_score sd_score mean_reb sd_reb mean_fgp sd_fgp mean_3fgp sd_3fgp mean_stl sd_stl
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
my_team_result %>%
  kable(digits = 2, caption = "My Team Summary Table") %>%
  kable_paper(full_width = F, html_font = "Times New Roman")
My Team Summary Table
team_winner mean_score sd_score mean_reb sd_reb mean_fgp sd_fgp mean_3fgp sd_3fgp mean_stl sd_stl
FALSE 79.18 7.85 33.82 5.94 43.58 5.13 32.72 8.11 5.68 2.59
TRUE 90.35 9.29 36.50 4.71 47.74 4.87 37.50 9.44 6.10 1.94

3 Graphs

This section provides two graphs to analyze team score and game results. The first graph is a histogram that shows the number of games with certain scores, separated by wins(green) and losses(red). The next graph is a box plot for scores of games, once again separated by wins and losses.

p = df_hist %>%
  ggplot(aes(x = team_score, fill = result)) +
  geom_histogram(color="#e9ecef", alpha=0.6, position = "identity", binwidth = 2) +
  scale_fill_manual(values = c("red", "green")) +
  labs(fill="result",
       title = "Histogram of Team Score by Game Result",
       x = "Team Score",
       y = "Number of games") +
  theme(plot.title = element_text(hjust = 0.5))
      
p

 boxplot(team_score ~ result, data = df_hist,
      col = c("red", "green", "black"),
      main = "Box Plot of Points Scored by Game Result",
      xlab = "Result", ylab = "Points")

4 Models

\(~\)

To create my final model, I began with a first order model with 4 terms. I then created a correlation matrix to see that none of my variables were highly correlated, and therefore could remain in the model. Then I created a full interaction model with 6 interaction terms and the original 4 first order terms. The only Interaction terms with a p>0.15 were field_goal_pct:three_point_field_goal_pct and total_rebounds:three_point_field_goal_pct, so they remained in the modell while the other four were removed.

My final model is team_score = -84.9750256 + 2.1844956* field_goal_pct + 1.5768015 * total_rebounds + 3.2460005 * three_point_field_goal_pct + 0.285595 steals + -0.0347063* field_goal_pctthree_point_field_goal_pct + -0.0364072 total_rebounds*three_point_field_goal_pct

This model significantly predicts team score, F(6,35)= 9.7732521, p<0.001, adjusted R^2=0.5621506.

The following table summarizes this model:

Dependent variable:
team_score
field_goal_pct 2.184***
(0.784)
total_rebounds 1.577*
(0.787)
three_point_field_goal_pct 3.246**
(1.221)
steals 0.286
(0.499)
field_goal_pct:three_point_field_goal_pct -0.035
(0.021)
total_rebounds:three_point_field_goal_pct -0.036
(0.022)
Constant -84.975*
(41.879)
Observations 42
R2 0.626
Adjusted R2 0.562
Residual Std. Error 6.729 (df = 35)
F Statistic 9.773*** (df = 6; 35)
Note: p<0.1; p<0.05; p<0.01

5 Residuals

This section provides the following residual plots: histogram, versus fits plot, studentized residual plot, leverage plot, and a Cook’s distance bar chart. The histogram shows a bell-shaped curve and the versus fits plot shows no pattern or correlation. This indicates that the conditions of normality and constant variance are met for this model. The remaining plots show that observation 4 is an outlier with high leverage. This game was played on 2024-09-15, when the fever faced the wings. In this game, the Indiana Fever had a team score of 110 points, tying a franchise record for points scored in a game.

ols_plot_resid_fit(model4)

ols_plot_resid_hist(model4)

ols_plot_resid_stud(model4)

ols_plot_resid_lev(model4, threshold = 3)

ols_plot_cooksd_chart(model4)

6 Prediction

I built this model to predict my teams points for a game in which they achieve the median value for each variable. The predicted team score is 84.0296441, with a 95% confidence interval (81.4983101, 86.5609781 ).

LS0tDQp0aXRsZTogIlIgQXNzaWdubWVudCA2Ig0KYXV0aG9yOiAiTm9haCBLaW5nIg0KZGF0ZTogImByIFN5cy5EYXRlKClgIg0Kb3V0cHV0Og0KICBodG1sX2RvY3VtZW50OiANCiAgICB0b2M6IHllcw0KICAgIHRvY19kZXB0aDogNA0KICAgIHRvY19mbG9hdDogeWVzDQogICAgbnVtYmVyX3NlY3Rpb25zOiB5ZXMNCiAgICB0b2NfY29sbGFwc2VkOiB5ZXMNCiAgICBjb2RlX2ZvbGRpbmc6IGhpZGUNCiAgICBjb2RlX2Rvd25sb2FkOiB5ZXMNCiAgICBzbW9vdGhfc2Nyb2xsOiB5ZXMNCiAgICB0aGVtZTogbHVtZW4NCiAgcGRmX2RvY3VtZW50OiANCiAgICB0b2M6IHllcw0KICAgIHRvY19kZXB0aDogNA0KICAgIGZpZ19jYXB0aW9uOiB5ZXMNCiAgICBudW1iZXJfc2VjdGlvbnM6IHllcw0KICAgIGZpZ193aWR0aDogMw0KICAgIGZpZ19oZWlnaHQ6IDMNCiAgd29yZF9kb2N1bWVudDogDQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZGVwdGg6IDQNCiAgICBmaWdfY2FwdGlvbjogeWVzDQogICAga2VlcF9tZDogeWVzDQplZGl0b3Jfb3B0aW9uczogDQogIGNodW5rX291dHB1dF90eXBlOiBpbmxpbmUNCi0tLQ0KDQoNCmBgYHtjc3MsIGVjaG8gPSBGQUxTRX0NCiNUT0M6OmJlZm9yZSB7DQogIGNvbnRlbnQ6ICJUYWJsZSBvZiBDb250ZW50cyI7DQogIGZvbnQtd2VpZ2h0OiBib2xkOw0KICBmb250LXNpemU6IDEuMmVtOw0KICBkaXNwbGF5OiBibG9jazsNCiAgY29sb3I6IGJsYWNrOw0KICBtYXJnaW4tYm90dG9tOiAxMHB4Ow0KfQ0KDQoNCmRpdiNUT0MgbGkgeyAgICAgLyogdGFibGUgb2YgY29udGVudCAgKi8NCiAgICBsaXN0LXN0eWxlOnVwcGVyLXJvbWFuOw0KICAgIGJhY2tncm91bmQtaW1hZ2U6bm9uZTsNCiAgICBiYWNrZ3JvdW5kLXJlcGVhdDpub25lOw0KICAgIGJhY2tncm91bmQtcG9zaXRpb246MDsNCn0NCg0KDQpoMS50aXRsZSB7IC8qIGxldmVsIDEgaGVhZGVyIG9mIHRpdGxlICAqLw0KICAgIGZvbnQtc2l6ZTogMjJweDsNCiAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogIGNvbG9yOiBibGFjazsNCiAgdGV4dC1hbGlnbjogY2VudGVyICFpbXBvcnRhbnQ7DQogIGZvbnQtZmFtaWx5OiAiR2lsbCBTYW5zIiwgc2Fucy1zZXJpZjsNCn0NCg0KDQpoNC5hdXRob3IgeyAvKiBIZWFkZXIgNCAtIGFuZCB0aGUgYXV0aG9yIGFuZCBkYXRhIGhlYWRlcnMgdXNlIHRoaXMgdG9vICAqLw0KICAgIGZvbnQtc2l6ZTogMTVweDsNCiAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogIGZvbnQtZmFtaWx5OiBzeXN0ZW0tdWk7DQogIGNvbG9yOiBncmV5Ow0KICB0ZXh0LWFsaWduOiBjZW50ZXIgIWltcG9ydGFudDsNCn0NCg0KDQpoNC5kYXRlIHsgLyogSGVhZGVyIDQgLSBhbmQgdGhlIGF1dGhvciBhbmQgZGF0YSBoZWFkZXJzIHVzZSB0aGlzIHRvbyAgKi8NCiAgICBmb250LXNpemU6IDE4cHg7DQogIGZvbnQtd2VpZ2h0OiBib2xkOw0KICBmb250LWZhbWlseTogIkdpbGwgU2FucyIsIHNhbnMtc2VyaWY7DQogIGNvbG9yOiBncmV5Ow0KICB0ZXh0LWFsaWduOiBjZW50ZXIgIWltcG9ydGFudDsNCn0NCg0KDQpoMSB7IC8qIEhlYWRlciAxIC0gYW5kIHRoZSBhdXRob3IgYW5kIGRhdGEgaGVhZGVycyB1c2UgdGhpcyB0b28gICovDQogICAgZm9udC1zaXplOiAyMHB4Ow0KICAgIGZvbnQtd2VpZ2h0OiBib2xkOw0KICAgIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICAgIGNvbG9yOiBibGFjazsNCiAgICB0ZXh0LWFsaWduOiBsZWZ0Ow0KfQ0KDQpoMiB7IC8qIEhlYWRlciAyIC0gYW5kIHRoZSBhdXRob3IgYW5kIGRhdGEgaGVhZGVycyB1c2UgdGhpcyB0b28gICovDQogICAgZm9udC1zaXplOiAxOHB4Ow0KICAgIGZvbnQtd2VpZ2h0OiBib2xkOw0KICAgIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICAgIGNvbG9yOiBibGFjazsNCiAgICB0ZXh0LWFsaWduOiBsZWZ0Ow0KfQ0KDQpoMyB7IC8qIEhlYWRlciAzIC0gYW5kIHRoZSBhdXRob3IgYW5kIGRhdGEgaGVhZGVycyB1c2UgdGhpcyB0b28gICovDQogICAgZm9udC1zaXplOiAxNnB4Ow0KICAgIGZvbnQtd2VpZ2h0OiBib2xkOw0KICAgIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICAgIGNvbG9yOiBCbGFjazsNCiAgICB0ZXh0LWFsaWduOiBsZWZ0Ow0KfQ0KDQpoNCB7IC8qIEhlYWRlciA0IC0gYW5kIHRoZSBhdXRob3IgYW5kIGRhdGEgaGVhZGVycyB1c2UgdGhpcyB0b28gICovDQogICAgZm9udC1zaXplOiAxNHB4Ow0KICBmb250LXdlaWdodDogYm9sZDsNCiAgICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsNCiAgICBjb2xvcjogZGFya3JlZDsNCiAgICB0ZXh0LWFsaWduOiBsZWZ0Ow0KfQ0KDQovKiBBZGQgZG90cyBhZnRlciBudW1iZXJlZCBoZWFkZXJzICovDQouaGVhZGVyLXNlY3Rpb24tbnVtYmVyOjphZnRlciB7DQogIGNvbnRlbnQ6ICIuIjsNCn0NCmJvZHkgeyBiYWNrZ3JvdW5kLWNvbG9yOndoaXRlOyB9DQoNCi5oaWdobGlnaHRtZSB7IGJhY2tncm91bmQtY29sb3I6eWVsbG93OyB9DQoNCnAgeyBiYWNrZ3JvdW5kLWNvbG9yOndoaXRlOyB9DQoNCg0KYGBgDQoNCmBgYHtSIHNldHVwLCBpbmNsdWRlPUZ9DQoNCnNldHdkKCJ+L1NUQSAzMTkiKQ0KDQpkYXRhPXJlYWQuY3N2KCJXTkJBXzIwMjVfYm94LXNjb3Jlcy5jc3YiLCBoZWFkZXI9VCkNCg0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkoY2FyKQ0KbGlicmFyeShvbHNycikNCmxpYnJhcnkoa2FibGVFeHRyYSkNCg0KDQoNCg0KYGBgDQoNCmBgYHtSIFdyYW5nbGluZywgaW5jbHVkZSA9IEZ9DQpzdW1tYXJ5KGRhdGEpDQoNCiNBbGwgV05CQSB0ZWFtcyBpbmNsdWRlZCAsIHJlbW92ZSBzY29yZXMgZnJvbSBhbGwgc3RhcnQgZ2FtZQ0KZGF0YSA9IGRhdGEgJT4lDQogIGZpbHRlcih0ZWFtX25hbWUhPSJUZWFtIFdOQkEiICYgdGVhbV9uYW1lIT0iVGVhbSBVU0EiKQ0KDQojZ3JvdXAgZGF0YSBieSB0ZWFtLCBmaW5kIG1lYW4vc2Qgb2YgYWxsIHZhcmlhYmxlcw0Kc3VtbWFyeV9zY29yZT1kYXRhICU+JQ0KICBncm91cF9ieSh0ZWFtX25hbWUpICU+JQ0KICBzdW1tYXJpc2UobWVhbl9zY29yZT1tZWFuKHRlYW1fc2NvcmUpLCBzZF9zY29yZT1zZCh0ZWFtX3Njb3JlKSwNCiAgICAgICAgICAgIG1lYW5fcmViPW1lYW4odG90YWxfcmVib3VuZHMpLCBzZF9yZWI9c2QodG90YWxfcmVib3VuZHMpLA0KICAgICAgICAgICAgbWVhbl9mZ3A9bWVhbihmaWVsZF9nb2FsX3BjdCksIHNkX2ZncD1zZChmaWVsZF9nb2FsX3BjdCksDQogICAgICAgICAgICBtZWFuXzNmZ3A9bWVhbih0aHJlZV9wb2ludF9maWVsZF9nb2FsX3BjdCksIHNkXzNmZ3A9c2QodGhyZWVfcG9pbnRfZmllbGRfZ29hbF9wY3QpLA0KICAgICAgICAgICAgbWVhbl9zdGw9bWVhbihzdGVhbHMpLCBzZF9zdGw9c2Qoc3RlYWxzKSkNCg0KDQojc2VsZWN0IG9ubHkgdmFyaWFibGVzIHdlIG5lZWQgYW5kIGZpbHRlciBvbiBteSB0ZWFtDQpteV90ZWFtPWRhdGEgJT4lDQogIHNlbGVjdCh0ZWFtX3Njb3JlLCBmaWVsZF9nb2FsX3BjdCwgdG90YWxfcmVib3VuZHMsIA0KICAgICAgICAgdGhyZWVfcG9pbnRfZmllbGRfZ29hbF9wY3QsIHN0ZWFscywgdGVhbV9uYW1lLCB0ZWFtX3dpbm5lcikgJT4lDQogIGZpbHRlcih0ZWFtX25hbWU9PSJGZXZlciIpDQogIA0KI2dyb3VwcyBjYXNlcyBieSB3aW4gdnMuIGxvc3MNCiNzdW1tYXJpemUgYWxsIHZhcmlhYmxlcyB3aXRoIG1lYW4gYW5kIHNkDQpteV90ZWFtX3Jlc3VsdD1teV90ZWFtJT4lDQogIGdyb3VwX2J5KHRlYW1fd2lubmVyKSAlPiUNCiAgc3VtbWFyaXNlKG1lYW5fc2NvcmU9bWVhbih0ZWFtX3Njb3JlKSwgc2Rfc2NvcmU9c2QodGVhbV9zY29yZSksDQogICAgICAgICAgICBtZWFuX3JlYj1tZWFuKHRvdGFsX3JlYm91bmRzKSwgc2RfcmViPXNkKHRvdGFsX3JlYm91bmRzKSwNCiAgICAgICAgICAgIG1lYW5fZmdwPW1lYW4oZmllbGRfZ29hbF9wY3QpLCBzZF9mZ3A9c2QoZmllbGRfZ29hbF9wY3QpLA0KICAgICAgICAgICAgbWVhbl8zZmdwPW1lYW4odGhyZWVfcG9pbnRfZmllbGRfZ29hbF9wY3QpLCBzZF8zZmdwPXNkKHRocmVlX3BvaW50X2ZpZWxkX2dvYWxfcGN0KSwNCiAgICAgICAgICAgIG1lYW5fc3RsPW1lYW4oc3RlYWxzKSwgc2Rfc3RsPXNkKHN0ZWFscykpDQoNCmRmX2hpc3Q9ZGF0YSU+JQ0KICBmaWx0ZXIodGVhbV9uYW1lPT0iRmV2ZXIiKSU+JQ0KICBtdXRhdGUocmVzdWx0PWNhc2Vfd2hlbih0ZWFtX3dpbm5lcj09VFJVRX4id2luIix0ZWFtX3dpbm5lcj09RkFMU0V+Imxvc3MiKSkNCmBgYA0KDQojIEludHJvZHVjdGlvbg0KDQpUaGlzIGRhdGEgc2V0IGluY2x1ZGVzIHRoZSBib3ggc2NvcmVzIGZvciBlYWNoIFdOQkEgdGVhbSBmb3IgZXZlcnkgZ2FtZSBvZiB0aGUgMjAyNSBzZWFzb24uIFRoZSB0ZWFtIEkgd2lsbCBiZSBhbmFseXppbmcgaXMgdGhlIEluZGlhbmEgRmV2ZXIuIFRoZSBnb2FsIG9mIHRoaXMgcHJvamVjdCBpcyB0byBidWlsZCB0aGUgYmVzdCBtb2RlbCB0byBwcmVkaWN0IHRlYW0gc2NvcmUgaW4gYSBtZWRpYW4gZ2FtZSBmb3IgdGhlIEluZGlhbmEgRmV2ZXIuIA0KDQoNCg0KIyBUYWJsZXMNCg0KVGhlIFN1bW1hcnkgVGFibGUgcHJvdmlkZXMgdGhlIG1lYW4gYW5kIHN0YW5kYXJkIGRldmlhdGlvbiBmb3IgZWFjaCB0ZWFtcyBzY29yZSwgcmVib3VuZHMsIGZpZWxkIGdvYWwgcGVyY2VudGFnZSwgMyBwb2ludCBmaWVsZCBnb2FsIHBlcmNlbnRhZ2UsIGFuZCBzdGVhbHMgb3ZlciB0aGUgMjAyNSBzZWFzb24gZm9yIGV2ZXJ5IFdOQkEgdGVhbS4gTXkgVGVhbSBTdW1tYXJ5IFRhYmxlIHByb3ZpZGVzIHRoZXNlIHNhbWUgc3RhdGlzdGljcyBmb3IgZWFjaCBnYW1lIHJlc3VsdCwgYSB3aW4gb3IgYSBsb3NzLCBmb3IgdGhlIEluZGlhbmEgRmV2ZXIuDQpgYGB7ciBUYWJsZXMsIGluY2x1ZGUgPSBUfQ0KDQpzdW1tYXJ5X3Njb3JlICU+JQ0KICBrYWJsZShkaWdpdHMgPSAyLCBjYXB0aW9uID0gIlN1bW1hcnkgVGFibGUiKSAlPiUNCiAga2FibGVfcGFwZXIoZnVsbF93aWR0aCA9IEYsIGh0bWxfZm9udCA9ICJUaW1lcyBOZXcgUm9tYW4iKQ0KICANCm15X3RlYW1fcmVzdWx0ICU+JQ0KICBrYWJsZShkaWdpdHMgPSAyLCBjYXB0aW9uID0gIk15IFRlYW0gU3VtbWFyeSBUYWJsZSIpICU+JQ0KICBrYWJsZV9wYXBlcihmdWxsX3dpZHRoID0gRiwgaHRtbF9mb250ID0gIlRpbWVzIE5ldyBSb21hbiIpDQoNCmBgYA0KDQojIEdyYXBocw0KDQpUaGlzIHNlY3Rpb24gcHJvdmlkZXMgdHdvIGdyYXBocyB0byBhbmFseXplIHRlYW0gc2NvcmUgYW5kIGdhbWUgcmVzdWx0cy4gVGhlIGZpcnN0IGdyYXBoIGlzIGEgaGlzdG9ncmFtIHRoYXQgc2hvd3MgdGhlIG51bWJlciBvZiBnYW1lcyB3aXRoIGNlcnRhaW4gc2NvcmVzLCBzZXBhcmF0ZWQgYnkgd2lucyhncmVlbikgYW5kIGxvc3NlcyhyZWQpLiBUaGUgbmV4dCBncmFwaCBpcyBhIGJveCBwbG90IGZvciBzY29yZXMgb2YgZ2FtZXMsIG9uY2UgYWdhaW4gc2VwYXJhdGVkIGJ5IHdpbnMgYW5kIGxvc3Nlcy4gDQpgYGB7ciBHcmFwaHMsIGluY2x1ZGUgPSBULCBmaWcud2lkdGg9NCwgZmlnLmhlaWdodD01LCBmaWcuYWxpZ249J2NlbnRlcid9DQoNCnAgPSBkZl9oaXN0ICU+JQ0KICBnZ3Bsb3QoYWVzKHggPSB0ZWFtX3Njb3JlLCBmaWxsID0gcmVzdWx0KSkgKw0KICBnZW9tX2hpc3RvZ3JhbShjb2xvcj0iI2U5ZWNlZiIsIGFscGhhPTAuNiwgcG9zaXRpb24gPSAiaWRlbnRpdHkiLCBiaW53aWR0aCA9IDIpICsNCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygicmVkIiwgImdyZWVuIikpICsNCiAgbGFicyhmaWxsPSJyZXN1bHQiLA0KICAgICAgIHRpdGxlID0gIkhpc3RvZ3JhbSBvZiBUZWFtIFNjb3JlIGJ5IEdhbWUgUmVzdWx0IiwNCiAgICAgICB4ID0gIlRlYW0gU2NvcmUiLA0KICAgICAgIHkgPSAiTnVtYmVyIG9mIGdhbWVzIikgKw0KICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkNCiAgICAgIA0KcA0KDQogDQogYm94cGxvdCh0ZWFtX3Njb3JlIH4gcmVzdWx0LCBkYXRhID0gZGZfaGlzdCwNCiAgICAgIGNvbCA9IGMoInJlZCIsICJncmVlbiIsICJibGFjayIpLA0KICAgICAgbWFpbiA9ICJCb3ggUGxvdCBvZiBQb2ludHMgU2NvcmVkIGJ5IEdhbWUgUmVzdWx0IiwNCiAgICAgIHhsYWIgPSAiUmVzdWx0IiwgeWxhYiA9ICJQb2ludHMiKQ0KDQogDQoNCmBgYA0KDQojIE1vZGVscw0KDQpgYGB7ciBGaXJzdCBPcmRlciBNb2RlbCwgaW5jbHVkZT1GQUxTRX0NCg0KI21vZGVsIDEgaXMgYSBmaXJzdCBvcmRlciBtb2RlbCB3aXRoIDQgdGVybXMNCm1vZGVsMT1sbSh0ZWFtX3Njb3JlfmZpZWxkX2dvYWxfcGN0K3RvdGFsX3JlYm91bmRzKw0KICAgICAgICAgdGhyZWVfcG9pbnRfZmllbGRfZ29hbF9wY3Qrc3RlYWxzLCBkYXRhPW15X3RlYW0pDQpzdW1tYXJ5KG1vZGVsMSkNCg0KI2NvcnJlbGF0aW9uIG1hdHJpeCByZXF1aXJlcyBvbmx5IHF1YW50aXRhdGl2ZSB2YXJpYWJsZXMNCmNvcl9kYXRhPW15X3RlYW0gJT4lDQogIHNlbGVjdChmaWVsZF9nb2FsX3BjdCwgdG90YWxfcmVib3VuZHMsIA0KICAgICAgICAgdGhyZWVfcG9pbnRfZmllbGRfZ29hbF9wY3QsIHN0ZWFscykNCg0KI2NvcnJlbGF0aW9uIG1hdHJpeA0KY29yKGNvcl9kYXRhKQ0KDQojVklGIHZhbHVlcw0KdmlmKG1vZGVsMSkNCmBgYA0KDQoNCg0KYGBge3IgSW50ZXJhY3Rpb24gTW9kZWwsIHJlc3VsdHM9J2FzaXMnLCBlY2hvPUYsIGluY2x1ZGU9RiwgY29tbWVudD1UfQ0KI21vZGVsIDMgaXMgYW4gaW50ZXJhY3Rpb24gbW9kZWwgd2l0aCA2IGludGVyYWN0aW9uIHRlcm1zIGFuZCA0IGZpcnN0IG9yZGVyIHRlcm1zDQptb2RlbDMgPSBsbSh0ZWFtX3Njb3JlIH4NCiAgICAgICAgICAgICAgIGZpZWxkX2dvYWxfcGN0ICsNCiAgICAgICAgICAgICAgIHRvdGFsX3JlYm91bmRzICsNCiAgICAgICAgICAgICAgIHRocmVlX3BvaW50X2ZpZWxkX2dvYWxfcGN0ICsNCiAgICAgICAgICAgICAgIHN0ZWFscyArDQogICAgICAgICAgICAgICBmaWVsZF9nb2FsX3BjdDp0b3RhbF9yZWJvdW5kcyArDQogICAgICAgICAgICAgICBmaWVsZF9nb2FsX3BjdDp0aHJlZV9wb2ludF9maWVsZF9nb2FsX3BjdCArDQogICAgICAgICAgICAgICBmaWVsZF9nb2FsX3BjdDpzdGVhbHMgKw0KICAgICAgICAgICAgICAgdG90YWxfcmVib3VuZHM6dGhyZWVfcG9pbnRfZmllbGRfZ29hbF9wY3QgKw0KICAgICAgICAgICAgICAgdG90YWxfcmVib3VuZHM6c3RlYWxzICsNCiAgICAgICAgICAgICAgIHRocmVlX3BvaW50X2ZpZWxkX2dvYWxfcGN0OnN0ZWFscywNCiAgICAgICAgICAgICBkYXRhID0gbXlfdGVhbSkNCnN1bW1hcnkobW9kZWwzKQ0KDQojbW9kZWwgNCBpcyB0aGUgcmVkdWNlZCBtb2RlbCB3aGVyZSB0ZXJtcyBmcm9tIG1vZGVsMyB3aXRoIGE8MC4xNSBhcmUgcmVtb3ZlZA0KbW9kZWw0ID0gbG0odGVhbV9zY29yZSB+DQogICAgICAgICAgICAgICBmaWVsZF9nb2FsX3BjdCArDQogICAgICAgICAgICAgICB0b3RhbF9yZWJvdW5kcyArDQogICAgICAgICAgICAgICB0aHJlZV9wb2ludF9maWVsZF9nb2FsX3BjdCArDQogICAgICAgICAgICAgICBzdGVhbHMgKw0KICAgICAgICAgICAgICAgZmllbGRfZ29hbF9wY3Q6dGhyZWVfcG9pbnRfZmllbGRfZ29hbF9wY3QgKw0KICAgICAgICAgICAgICAgdG90YWxfcmVib3VuZHM6dGhyZWVfcG9pbnRfZmllbGRfZ29hbF9wY3QsDQogICAgICAgICAgICAgZGF0YSA9IG15X3RlYW0pDQptb2RlbDRzdW09c3VtbWFyeShtb2RlbDQpDQoNCg0KDQpgYGANCg0KJH4kDQoNClRvIGNyZWF0ZSBteSBmaW5hbCBtb2RlbCwgSSBiZWdhbiB3aXRoIGEgZmlyc3Qgb3JkZXIgbW9kZWwgd2l0aCA0IHRlcm1zLiBJIHRoZW4gY3JlYXRlZCBhIGNvcnJlbGF0aW9uIG1hdHJpeCB0byBzZWUgdGhhdCBub25lIG9mIG15IHZhcmlhYmxlcyB3ZXJlIGhpZ2hseSBjb3JyZWxhdGVkLCBhbmQgdGhlcmVmb3JlIGNvdWxkIHJlbWFpbiBpbiB0aGUgbW9kZWwuIFRoZW4gSSBjcmVhdGVkIGEgZnVsbCBpbnRlcmFjdGlvbiBtb2RlbCB3aXRoIDYgaW50ZXJhY3Rpb24gdGVybXMgYW5kIHRoZSBvcmlnaW5hbCA0IGZpcnN0IG9yZGVyIHRlcm1zLiBUaGUgb25seSBJbnRlcmFjdGlvbiB0ZXJtcyB3aXRoIGEgcD4wLjE1IHdlcmUgZmllbGRfZ29hbF9wY3Q6dGhyZWVfcG9pbnRfZmllbGRfZ29hbF9wY3QgYW5kIHRvdGFsX3JlYm91bmRzOnRocmVlX3BvaW50X2ZpZWxkX2dvYWxfcGN0LCBzbyB0aGV5IHJlbWFpbmVkIGluIHRoZSBtb2RlbGwgd2hpbGUgdGhlIG90aGVyIGZvdXIgd2VyZSByZW1vdmVkLiANCg0KTXkgZmluYWwgbW9kZWwgaXMgdGVhbV9zY29yZSA9IGByIG1vZGVsNCRjb2VmZmljaWVudHNbMV1gICsgYHIgbW9kZWw0JGNvZWZmaWNpZW50c1syXWAqIGZpZWxkX2dvYWxfcGN0ICsgDQpgciBtb2RlbDQkY29lZmZpY2llbnRzWzNdYCAqIHRvdGFsX3JlYm91bmRzICsgYHIgbW9kZWw0JGNvZWZmaWNpZW50c1s0XWAgKiB0aHJlZV9wb2ludF9maWVsZF9nb2FsX3BjdCArDQpgciBtb2RlbDQkY29lZmZpY2llbnRzWzVdYCBzdGVhbHMgKyBgciBtb2RlbDQkY29lZmZpY2llbnRzWzZdYCogZmllbGRfZ29hbF9wY3QqdGhyZWVfcG9pbnRfZmllbGRfZ29hbF9wY3QgKw0KYHIgbW9kZWw0JGNvZWZmaWNpZW50c1s3XWAgKiB0b3RhbF9yZWJvdW5kcyp0aHJlZV9wb2ludF9maWVsZF9nb2FsX3BjdA0KDQpUaGlzIG1vZGVsIHNpZ25pZmljYW50bHkgcHJlZGljdHMgdGVhbSBzY29yZSwgRihgciBtb2RlbDRzdW0kZnN0YXRpc3RpY1syXWAsYHIgbW9kZWw0c3VtJGZzdGF0aXN0aWNbM11gKT0gYHIgbW9kZWw0c3VtJGZzdGF0aXN0aWNbMV1gLCBwPDAuMDAxLCBhZGp1c3RlZCBSXjI9YHIgbW9kZWw0c3VtJGFkai5yLnNxdWFyZWRgLg0KDQpUaGUgZm9sbG93aW5nIHRhYmxlIHN1bW1hcml6ZXMgdGhpcyBtb2RlbDoNCmBgYHtyLCBpbmNsdWRlPVRSVUUsIHJlc3VsdHM9J2FzaXMnLCBlY2hvPUZBTFNFLCBjb21tZW50PVQsIG1lc3NhZ2U9RkFMU0UsfQ0KbGlicmFyeShzdGFyZ2F6ZXIpDQpzdGFyZ2F6ZXIobW9kZWw0LCB0eXBlID0gImh0bWwiKQ0KYGBgDQoNCg0KIyBSZXNpZHVhbHMNCg0KVGhpcyBzZWN0aW9uIHByb3ZpZGVzIHRoZSBmb2xsb3dpbmcgcmVzaWR1YWwgcGxvdHM6IGhpc3RvZ3JhbSwgdmVyc3VzIGZpdHMgcGxvdCwgc3R1ZGVudGl6ZWQgcmVzaWR1YWwgcGxvdCwgbGV2ZXJhZ2UgcGxvdCwgYW5kIGEgQ29va+KAmXMgZGlzdGFuY2UgYmFyIGNoYXJ0LiBUaGUgaGlzdG9ncmFtIHNob3dzIGEgYmVsbC1zaGFwZWQgY3VydmUgYW5kIHRoZSB2ZXJzdXMgZml0cyBwbG90IHNob3dzIG5vIHBhdHRlcm4gb3IgY29ycmVsYXRpb24uIFRoaXMgaW5kaWNhdGVzIHRoYXQgdGhlIGNvbmRpdGlvbnMgb2Ygbm9ybWFsaXR5IGFuZCBjb25zdGFudCB2YXJpYW5jZSBhcmUgbWV0IGZvciB0aGlzIG1vZGVsLiBUaGUgcmVtYWluaW5nIHBsb3RzIHNob3cgdGhhdCBvYnNlcnZhdGlvbiA0IGlzIGFuIG91dGxpZXIgd2l0aCBoaWdoIGxldmVyYWdlLiBUaGlzIGdhbWUgd2FzIHBsYXllZCBvbiAyMDI0LTA5LTE1LCB3aGVuIHRoZSBmZXZlciBmYWNlZCB0aGUgd2luZ3MuIEluIHRoaXMgZ2FtZSwgdGhlIEluZGlhbmEgRmV2ZXIgaGFkIGEgdGVhbSBzY29yZSBvZiAxMTAgcG9pbnRzLCB0eWluZyBhIGZyYW5jaGlzZSByZWNvcmQgZm9yIHBvaW50cyBzY29yZWQgaW4gYSBnYW1lLiANCmBgYHtyIFJlc2lkdWFscywgZmlnLndpZHRoPTQsIGZpZy5oZWlnaHQ9NSwgZmlnLmFsaWduPSdjZW50ZXInfQ0KDQpvbHNfcGxvdF9yZXNpZF9maXQobW9kZWw0KQ0Kb2xzX3Bsb3RfcmVzaWRfaGlzdChtb2RlbDQpDQpvbHNfcGxvdF9yZXNpZF9zdHVkKG1vZGVsNCkNCm9sc19wbG90X3Jlc2lkX2xldihtb2RlbDQsIHRocmVzaG9sZCA9IDMpDQpvbHNfcGxvdF9jb29rc2RfY2hhcnQobW9kZWw0KQ0KDQoNCmBgYA0KDQoNCiMgUHJlZGljdGlvbg0KDQpgYGB7ciBQcmVkaWN0aW9uLCBpbmNsdWRlPUZ9DQojRm9yIGZpbmRpbmcgbWVkaWFuIHZhbHVlcw0Kc3VtbWFyeShjb3JfZGF0YSkNCg0KI1RoaXMgaXMgYSBuZXcgZGF0YSBmcmFtZSBmb3IgdGhlIG1lZGlhbiBnYW1lDQpuZXdkYXRhPWRhdGEuZnJhbWUoZmllbGRfZ29hbF9wY3Q9NDQuOTAsIHRvdGFsX3JlYm91bmRzPTM1LCANCiAgICAgICAgICAgICAgICAgICB0aHJlZV9wb2ludF9maWVsZF9nb2FsX3BjdD0zNC42LCBzdGVhbHM9NSkNCiANCiNwcmVkaWN0aW5nDQpwcmVkaWN0aW9uPXByZWRpY3QobW9kZWw0LCBuZXdkYXRhLCBpbnRlcnZhbCA9ICJjb25maWRlbmNlIiwgbGV2ZWwgPSAuOTUpDQpgYGANCg0KSSBidWlsdCB0aGlzIG1vZGVsIHRvIHByZWRpY3QgbXkgdGVhbXMgcG9pbnRzIGZvciBhIGdhbWUgaW4gd2hpY2ggdGhleSBhY2hpZXZlIHRoZSBtZWRpYW4gdmFsdWUgZm9yIGVhY2ggdmFyaWFibGUuIFRoZSBwcmVkaWN0ZWQgdGVhbSBzY29yZSBpcyBgciBwcmVkaWN0aW9uWzFdYCwgd2l0aCBhIDk1JSBjb25maWRlbmNlIGludGVydmFsIChgciBwcmVkaWN0aW9uWzJdYCwgYHIgcHJlZGljdGlvblszXWAgKS4g