Introduction

In this project, I wanted to create a rushing defense metric that can give us a better overview of how defenses perform versus workhorse rushers. I then compared my created metric to the NFL’s traditional average yards per carry allowed stat.

Creating a Metric

Below, I filtered to games where a ball carrier had at least 14 rushing attempts. In today’s NFL it’s harder to find true 20+ carry workloads every week, so 14 felt like a reasonable cutoff for “workhorse usage.” I didn’t filter out quarterbacks because if a QB is carrying the ball 14+ times, that rushing impact is still meaningful. For each qualifying player-game, I computed that player’s yards per carry in the game and compared it to their season-long yards per carry. The difference (game YPC − season YPC) measures how much more (or less) efficient that player was against a specific defense than they typically are.

Comparing Metrics

Here, we compare my created metric to the NFL’s average yards per carry allowed. Although both metrics are constructed from play-by-play data, they differ in how the data are aggregated. The traditional yards-per-carry allowed metric summarizes all rushing attempts faced by a defense, treating each play equally and aggregating directly to the team level. In contrast, the proposed metric conditions on high-volume rushing performances and evaluates how a defense affects a runner’s efficiency relative to their season baseline. Using play-by-play data for both metrics ensures consistency in data coverage while isolating the effect of aggregation strategy. So, the first metric answers “how many yards per rush does a defense allow overall,” while the second answers “do runners become more efficient than usual when they hit a workhorse workload against this defense?” To keep the plot readable, I show teams that rank in the bottom 10 by either metric.

We see that a few teams remain in similar ranks (Bills, Giants, Bengals, Dolphins, Cardinals, etc), but we also see some major discrepancies. The Panthers are ranked 11th in yards per carry but 3rd when they allow 14+ carries. The Chargers drop from 16th to 9th. Surprisingly, the Bears, Jets, and Falcons become more stout as their opponent gets more carries.

Conclusion

This project shows how using the same play-by-play data but changing how it’s aggregated can lead to very different conclusions about run defense. Traditional yards per carry allowed reflects overall efficiency, but it misses how defenses perform when opponents commit to a heavy rushing workload. By focusing on high-volume rushing games and comparing performance to season baselines, the workhorse rusher metric highlights situational weaknesses that standard metrics overlook. Some defenses remain consistent across both measures, while others change dramatically, suggesting that workload context plays an important role in evaluating run defense performance.

LS0tDQp0aXRsZTogIldoaWNoIE5GTCBEZWZlbnNlcyBQZXJmb3JtZWQgdGhlIFdvcnN0IEFnYWluc3QgV29ya2hvcnNlIFJ1c2hlcnM/Ig0KYXV0aG9yOiAiTHVrZSBWb2xtIg0KZGF0ZTogIjIwMjYtMDEtMDciDQpvdXRwdXQ6DQogIGh0bWxfZG9jdW1lbnQ6ICAgICAgICAgICAjIG91dHB1dCBkb2N1bWVudCBmb3JtYXQNCiAgICB0b2M6IHllcyAgICAgICAgICAgICAgICMgYWRkIHRhYmxlIGNvbnRlbnRzDQogICAgdG9jX2Zsb2F0OiB5ZXMgICAgICAgICAjIHRvY19wcm9wZXJ0eTogZmxvYXRpbmcNCiAgICB0b2NfZGVwdGg6IDQgICAgICAgICAgICMgZGVwdGggb2YgVE9DIGhlYWRpbmdzDQogICAgZmlnX3dpZHRoOiA2ICAgICAgICAgICAjIGdsb2JhbCBmaWd1cmUgd2lkdGgNCiAgICBmaWdfaGVpZ2h0OiA0ICAgICAgICAgICMgZ2xvYmFsIGZpZ3VyZSBoZWlnaHQNCiAgICBmaWdfY2FwdGlvbjogeWVzICAgICAgICMgYWRkIGZpZ3VyZSBjYXB0aW9uDQogICAgbnVtYmVyX3NlY3Rpb25zOiBubyAgICMgbnVtYmVyaW5nIHNlY3Rpb24gaGVhZGluZ3MNCiAgICB0b2NfY29sbGFwc2VkOiB5ZXMgICAgICMgVE9DIHN1YmhlYWRpbmcgY29sbGFwc2luZw0KICAgIGNvZGVfZm9sZGluZzogaGlkZSAgICAgIyBmb2xkaW5nL3Nob3dpbmcgY29kZSANCiAgICBjb2RlX2Rvd25sb2FkOiB5ZXMgICAgICMgYWxsb3cgdG8gZG93bmxvYWQgY29tcGxldGUgUk1hcmtkb3duIHNvdXJjZSBjb2RlDQogICAgc21vb3RoX3Njcm9sbDogeWVzICAgICAjIHNjcm9sbGluZyB0ZXh0IG9mIHRoZSBkb2N1bWVudA0KICAgIHRoZW1lOiBsdW1lbiAgICAgICAgICAgIyB2aXN1YWwgdGhlbWUgZm9yIEhUTUwgZG9jdW1lbnQgb25seQ0KICAgIGhpZ2hsaWdodDogdGFuZ28gICAgICAgIyBjb2RlIHN5bnRheCBoaWdobGlnaHRpbmcgc3R5bGVzDQogIHBkZl9kb2N1bWVudDogDQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZGVwdGg6IDQNCiAgICBmaWdfY2FwdGlvbjogeWVzDQogICAgbnVtYmVyX3NlY3Rpb25zOiB5ZXMNCiAgd29yZF9kb2N1bWVudDoNCiAgICB0b2M6IHllcw0KICAgIHRvY19kZXB0aDogJzQnDQotLS0NCg0KYGBge2NzcywgZWNobyA9IEZBTFNFfQ0KZGl2I1RPQyB7DQogIGxpc3Qtc3R5bGU6IHVwcGVyLXJvbWFuOw0KICBiYWNrZ3JvdW5kLWltYWdlOiBub25lOw0KICBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0Ow0KICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAwOw0KfQ0KDQpoMS50aXRsZSB7ICAgIC8qIGxldmVsIDEgaGVhZGVyIG9mIHRpdGxlICAqLw0KICBmb250LXNpemU6IDI0cHg7DQogIGZvbnQtd2VpZ2h0OiBib2xkOw0KICBjb2xvcjogRGFya1JlZDsNCiAgdGV4dC1hbGlnbjogY2VudGVyOw0KfQ0KDQpoNC5hdXRob3IgeyAvKiBIZWFkZXIgNCAtIGFuZCB0aGUgYXV0aG9yIGFuZCBkYXRhIGhlYWRlcnMgdXNlIHRoaXMgdG9vICAqLw0KICBmb250LXNpemU6IDE4cHg7DQogIGZvbnQtd2VpZ2h0OiBib2xkOw0KICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsNCiAgY29sb3I6IERhcmtSZWQ7DQogIHRleHQtYWxpZ246IGNlbnRlcjsNCn0NCg0KaDQuZGF0ZSB7IC8qIEhlYWRlciA0IC0gYW5kIHRoZSBhdXRob3IgYW5kIGRhdGEgaGVhZGVycyB1c2UgdGhpcyB0b28gICovDQogIGZvbnQtc2l6ZTogMThweDsNCiAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICBjb2xvcjogRGFya0JsdWU7DQogIHRleHQtYWxpZ246IGNlbnRlcjsNCn0NCg0KaDEgeyAvKiBIZWFkZXIgMSAtIGFuZCB0aGUgYXV0aG9yIGFuZCBkYXRhIGhlYWRlcnMgdXNlIHRoaXMgdG9vICAqLw0KICAgIGZvbnQtc2l6ZTogMjBweDsNCiAgICBmb250LXdlaWdodDogYm9sZDsNCiAgICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsNCiAgICBjb2xvcjogZGFya3JlZDsNCiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7DQp9DQoNCmgyIHsgLyogSGVhZGVyIDIgLSBhbmQgdGhlIGF1dGhvciBhbmQgZGF0YSBoZWFkZXJzIHVzZSB0aGlzIHRvbyAgKi8NCiAgICBmb250LXNpemU6IDE4cHg7DQogICAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogICAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7DQogICAgY29sb3I6IG5hdnk7DQogICAgdGV4dC1hbGlnbjogbGVmdDsNCn0NCg0KaDMgeyAvKiBIZWFkZXIgMyAtIGFuZCB0aGUgYXV0aG9yIGFuZCBkYXRhIGhlYWRlcnMgdXNlIHRoaXMgdG9vICAqLw0KICAgIGZvbnQtc2l6ZTogMTZweDsNCiAgICBmb250LXdlaWdodDogYm9sZDsNCiAgICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsNCiAgICBjb2xvcjogbmF2eTsNCiAgICB0ZXh0LWFsaWduOiBsZWZ0Ow0KfQ0KDQpoNCB7IC8qIEhlYWRlciA0IC0gYW5kIHRoZSBhdXRob3IgYW5kIGRhdGEgaGVhZGVycyB1c2UgdGhpcyB0b28gICovDQogICAgZm9udC1zaXplOiAxNHB4Ow0KICBmb250LXdlaWdodDogYm9sZDsNCiAgICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsNCiAgICBjb2xvcjogZGFya3JlZDsNCiAgICB0ZXh0LWFsaWduOiBsZWZ0Ow0KfQ0KDQovKiBBZGQgZG90cyBhZnRlciBudW1iZXJlZCBoZWFkZXJzICovDQouaGVhZGVyLXNlY3Rpb24tbnVtYmVyOjphZnRlciB7DQogIGNvbnRlbnQ6ICIuIjsNCn0NCmBgYA0KLS0tDQoNCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBGQUxTRSkNCmxpYnJhcnkoZHBseXIpDQpsaWJyYXJ5KGtuaXRyKQ0KbGlicmFyeSh0aWR5cikNCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkoc2NhbGVzKQ0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KG5mbHJlYWRyKQ0KbGlicmFyeShwdXJycikNCmN1cnJlbnRfc2Vhc29uIDwtIG5mbHJlYWRyOjptb3N0X3JlY2VudF9zZWFzb24oKQ0KDQoNCm5mbHJlYWRyOjouY2xlYXJfY2FjaGUoKQ0KDQpwYnAgPC0gbmZscmVhZHI6OmxvYWRfcGJwKGN1cnJlbnRfc2Vhc29uKQ0KDQptYXgocGJwJHdlZWssIG5hLnJtID0gVFJVRSkNCmBgYA0KDQojIEludHJvZHVjdGlvbg0KDQpJbiB0aGlzIHByb2plY3QsIEkgd2FudGVkIHRvIGNyZWF0ZSBhIHJ1c2hpbmcgZGVmZW5zZSBtZXRyaWMgdGhhdCBjYW4gZ2l2ZSB1cyBhIGJldHRlciBvdmVydmlldyBvZiBob3cgZGVmZW5zZXMgcGVyZm9ybSB2ZXJzdXMgd29ya2hvcnNlIHJ1c2hlcnMuIEkgdGhlbiBjb21wYXJlZCBteSBjcmVhdGVkIG1ldHJpYyB0byB0aGUgTkZMJ3MgdHJhZGl0aW9uYWwgYXZlcmFnZSB5YXJkcyBwZXIgY2FycnkgYWxsb3dlZCBzdGF0LiANCg0KIyBDcmVhdGluZyBhIE1ldHJpYw0KDQpCZWxvdywgSSBmaWx0ZXJlZCB0byBnYW1lcyB3aGVyZSBhIGJhbGwgY2FycmllciBoYWQgYXQgbGVhc3QgMTQgcnVzaGluZyBhdHRlbXB0cy4gSW4gdG9kYXnigJlzIE5GTCBpdOKAmXMgaGFyZGVyIHRvIGZpbmQgdHJ1ZSAyMCsgY2Fycnkgd29ya2xvYWRzIGV2ZXJ5IHdlZWssIHNvIDE0IGZlbHQgbGlrZSBhIHJlYXNvbmFibGUgY3V0b2ZmIGZvciDigJx3b3JraG9yc2UgdXNhZ2Uu4oCdIEkgZGlkbuKAmXQgZmlsdGVyIG91dCBxdWFydGVyYmFja3MgYmVjYXVzZSBpZiBhIFFCIGlzIGNhcnJ5aW5nIHRoZSBiYWxsIDE0KyB0aW1lcywgdGhhdCBydXNoaW5nIGltcGFjdCBpcyBzdGlsbCBtZWFuaW5nZnVsLiBGb3IgZWFjaCBxdWFsaWZ5aW5nIHBsYXllci1nYW1lLCBJIGNvbXB1dGVkIHRoYXQgcGxheWVy4oCZcyB5YXJkcyBwZXIgY2FycnkgaW4gdGhlIGdhbWUgYW5kIGNvbXBhcmVkIGl0IHRvIHRoZWlyIHNlYXNvbi1sb25nIHlhcmRzIHBlciBjYXJyeS4gVGhlIGRpZmZlcmVuY2UgKGdhbWUgWVBDIOKIkiBzZWFzb24gWVBDKSBtZWFzdXJlcyBob3cgbXVjaCBtb3JlIChvciBsZXNzKSBlZmZpY2llbnQgdGhhdCBwbGF5ZXIgd2FzIGFnYWluc3QgYSBzcGVjaWZpYyBkZWZlbnNlIHRoYW4gdGhleSB0eXBpY2FsbHkgYXJlLg0KDQpgYGB7ciwgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgcmVzdWx0cz0iaGlkZSJ9DQoNCiMgcGJwIG11c3QgYWxyZWFkeSBleGlzdCAoZXg6IHBicCA8LSBsb2FkX3BicChjdXJyZW50X3NlYXNvbikpDQoNCiMgLS0tIFNlYXNvbi1sb25nIGJhc2VsaW5lIChjb21wdXRlIG9uY2UpIC0tLQ0KcmJfc2Vhc29uIDwtIHBicCAlPiUNCiAgZmlsdGVyKHJ1c2hfYXR0ZW1wdCA9PSAxLCAhaXMubmEocnVzaGVyX3BsYXllcl9pZCkpICU+JQ0KICBncm91cF9ieShydXNoZXJfcGxheWVyX2lkLCBydXNoZXJfcGxheWVyX25hbWUpICU+JQ0KICBzdW1tYXJpc2UoDQogICAgdG90YWxfYXR0ICAgPSBuKCksDQogICAgdG90YWxfeWFyZHMgPSBzdW0ocnVzaGluZ195YXJkcywgbmEucm0gPSBUUlVFKSwNCiAgICBzZWFzb25feXBjICA9IHRvdGFsX3lhcmRzIC8gdG90YWxfYXR0LA0KICAgIC5ncm91cHMgPSAiZHJvcCINCiAgKQ0KDQojIC0tLSBGdW5jdGlvbjogcmV0dXJucyBzdW1tYXJ5IGZvciBvbmUgZGVmZW5zZSAtLS0NCnJiX3ZzX2RlZl9zdW1tYXJ5IDwtIGZ1bmN0aW9uKGRlZl9hYmJyLCBtaW5fYXR0ID0gMTQpIHsNCg0KICBjb21wIDwtIHBicCAlPiUNCiAgICBmaWx0ZXIocnVzaF9hdHRlbXB0ID09IDEsICFpcy5uYShydXNoZXJfcGxheWVyX2lkKSwgZGVmdGVhbSA9PSBkZWZfYWJicikgJT4lDQogICAgZ3JvdXBfYnkoZ2FtZV9pZCwgd2VlaywgcnVzaGVyX3BsYXllcl9pZCwgcnVzaGVyX3BsYXllcl9uYW1lKSAlPiUNCiAgICBzdW1tYXJpc2UoDQogICAgICBhdHRfdnNfZGVmICAgPSBuKCksDQogICAgICB5YXJkc192c19kZWYgPSBzdW0ocnVzaGluZ195YXJkcywgbmEucm0gPSBUUlVFKSwNCiAgICAgIHlwY192c19kZWYgICA9IHlhcmRzX3ZzX2RlZiAvIGF0dF92c19kZWYsDQogICAgICAuZ3JvdXBzID0gImRyb3AiDQogICAgKSAlPiUNCiAgICBsZWZ0X2pvaW4ocmJfc2Vhc29uLCBieSA9IGMoInJ1c2hlcl9wbGF5ZXJfaWQiLCAicnVzaGVyX3BsYXllcl9uYW1lIikpICU+JQ0KICAgIG11dGF0ZSgNCiAgICAgIGRpZmZfeXBjID0geXBjX3ZzX2RlZiAtIHNlYXNvbl95cGMsDQogICAgICBwZXJjZW50X2NoYW5nZSA9ICh5cGNfdnNfZGVmIC8gc2Vhc29uX3lwYyAtIDEpICogMTAwDQogICAgKSAlPiUNCiAgICBmaWx0ZXIoYXR0X3ZzX2RlZiA+PSBtaW5fYXR0KQ0KDQogIGNvbXAgJT4lDQogICAgc3VtbWFyaXNlKA0KICAgICAgZGVmdGVhbSA9IGRlZl9hYmJyLA0KICAgICAgbl9wbGF5ZXJfZ2FtZXMgPSBuKCksDQogICAgICBhdmdfZGlmZl95cGMgPSBtZWFuKGRpZmZfeXBjLCBuYS5ybSA9IFRSVUUpLA0KICAgICAgYXZnX3BlcmNlbnRfY2hhbmdlID0gbWVhbihwZXJjZW50X2NoYW5nZSwgbmEucm0gPSBUUlVFKSwNCiAgICAgIC5ncm91cHMgPSAiZHJvcCINCiAgICApDQp9DQoNCiMgLS0tIFJ1biBmb3IgZXZlcnkgZGVmZW5zZSBpbiB0aGUgZGF0YSAtLS0NCmFsbF90ZWFtcyA8LSBzb3J0KHVuaXF1ZShuYS5vbWl0KHBicCRkZWZ0ZWFtKSkpDQoNCmFsbF9zdW1tYXJpZXMgPC0gbWFwX2RmcihhbGxfdGVhbXMsIH4gcmJfdnNfZGVmX3N1bW1hcnkoLngsIG1pbl9hdHQgPSAxNCkpICU+JQ0KICBhcnJhbmdlKGRlc2MoYXZnX2RpZmZfeXBjKSkNCg0KYWxsX3N1bW1hcmllcw0KDQpgYGANCg0KDQpgYGB7cn0NCg0KcGxvdF9kZiA8LSBhbGxfc3VtbWFyaWVzDQoNCmdncGxvdChwbG90X2RmLA0KICAgICAgIGFlcyh4ID0gcmVvcmRlcihkZWZ0ZWFtLCBhdmdfZGlmZl95cGMpLA0KICAgICAgICAgICB5ID0gYXZnX2RpZmZfeXBjLA0KICAgICAgICAgICBmaWxsID0gYXZnX2RpZmZfeXBjID4gMCkpICsNCiAgZ2VvbV9jb2woKSArDQogIGNvb3JkX2ZsaXAoKSArDQogIHNjYWxlX2ZpbGxfbWFudWFsKA0KICAgIHZhbHVlcyA9IGMoIlRSVUUiID0gInN0ZWVsYmx1ZSIsICJGQUxTRSIgPSAiZmlyZWJyaWNrIiksDQogICAgbGFiZWxzID0gYygiVFJVRSIgPSAiUkJzIG91dHBlcmZvcm0iLCAiRkFMU0UiID0gIlJCcyB1bmRlcnBlcmZvcm0iKQ0KICApICsNCiAgbGFicygNCiAgICB0aXRsZSA9ICJXb3JzdCBEZWZlbnNlcyB2cyBXb3JraG9yc2UgUnVzaGVycyIsDQogICAgeCA9ICJEZWZlbnNlIiwNCiAgICB5ID0gIkF2ZyBZUEMgRGlmZmVyZW5jZSAodnMgc2Vhc29uIGF2ZXJhZ2UpIg0KICApICsNCiAgdGhlbWUobGVnZW5kLnRpdGxlID0gZWxlbWVudF9ibGFuaygpKQ0KYGBgDQoNCg0KYGBge3IsIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIHJlc3VsdHM9ImhpZGUifQ0KDQpkZWZfeXBjX2FsbG93ZWQgPC0gcGJwICU+JQ0KICBmaWx0ZXIocnVzaF9hdHRlbXB0ID09IDEsICFpcy5uYShkZWZ0ZWFtKSkgJT4lDQogIGdyb3VwX2J5KGRlZnRlYW0pICU+JQ0KICBzdW1tYXJpc2UoDQogICAgeXBjX2FsbG93ZWQgPSBtZWFuKHJ1c2hpbmdfeWFyZHMsIG5hLnJtID0gVFJVRSksDQogICAgLmdyb3VwcyA9ICJkcm9wIg0KICApICU+JQ0KICBhcnJhbmdlKGRlc2MoeXBjX2FsbG93ZWQpKQ0KDQpkZWZfeXBjX2FsbG93ZWQNCmBgYA0KDQojIENvbXBhcmluZyBNZXRyaWNzDQoNCkhlcmUsIHdlIGNvbXBhcmUgbXkgY3JlYXRlZCBtZXRyaWMgdG8gdGhlIE5GTCdzIGF2ZXJhZ2UgeWFyZHMgcGVyIGNhcnJ5IGFsbG93ZWQuIEFsdGhvdWdoIGJvdGggbWV0cmljcyBhcmUgY29uc3RydWN0ZWQgZnJvbSBwbGF5LWJ5LXBsYXkgZGF0YSwgdGhleSBkaWZmZXIgaW4gaG93IHRoZSBkYXRhIGFyZSBhZ2dyZWdhdGVkLiBUaGUgdHJhZGl0aW9uYWwgeWFyZHMtcGVyLWNhcnJ5IGFsbG93ZWQgbWV0cmljIHN1bW1hcml6ZXMgYWxsIHJ1c2hpbmcgYXR0ZW1wdHMgZmFjZWQgYnkgYSBkZWZlbnNlLCB0cmVhdGluZyBlYWNoIHBsYXkgZXF1YWxseSBhbmQgYWdncmVnYXRpbmcgZGlyZWN0bHkgdG8gdGhlIHRlYW0gbGV2ZWwuIEluIGNvbnRyYXN0LCB0aGUgcHJvcG9zZWQgbWV0cmljIGNvbmRpdGlvbnMgb24gaGlnaC12b2x1bWUgcnVzaGluZyBwZXJmb3JtYW5jZXMgYW5kIGV2YWx1YXRlcyBob3cgYSBkZWZlbnNlIGFmZmVjdHMgYSBydW5uZXLigJlzIGVmZmljaWVuY3kgcmVsYXRpdmUgdG8gdGhlaXIgc2Vhc29uIGJhc2VsaW5lLiBVc2luZyBwbGF5LWJ5LXBsYXkgZGF0YSBmb3IgYm90aCBtZXRyaWNzIGVuc3VyZXMgY29uc2lzdGVuY3kgaW4gZGF0YSBjb3ZlcmFnZSB3aGlsZSBpc29sYXRpbmcgdGhlIGVmZmVjdCBvZiBhZ2dyZWdhdGlvbiBzdHJhdGVneS4gU28sIHRoZSBmaXJzdCBtZXRyaWMgYW5zd2VycyAiaG93IG1hbnkgeWFyZHMgcGVyIHJ1c2ggZG9lcyBhIGRlZmVuc2UgYWxsb3cgb3ZlcmFsbCwiIHdoaWxlIHRoZSBzZWNvbmQgYW5zd2VycyAiZG8gcnVubmVycyBiZWNvbWUgbW9yZSBlZmZpY2llbnQgdGhhbiB1c3VhbCB3aGVuIHRoZXkgaGl0IGEgd29ya2hvcnNlIHdvcmtsb2FkIGFnYWluc3QgdGhpcyBkZWZlbnNlPyIgVG8ga2VlcCB0aGUgcGxvdCByZWFkYWJsZSwgSSBzaG93IHRlYW1zIHRoYXQgcmFuayBpbiB0aGUgYm90dG9tIDEwIGJ5IGVpdGhlciBtZXRyaWMuDQoNCmBgYHtyfQ0KcmFua19jb21wYXJlIDwtIGFsbF9zdW1tYXJpZXMgJT4lDQogIGRwbHlyOjpzZWxlY3QoZGVmdGVhbSwgYXZnX2RpZmZfeXBjKSAlPiUNCiAgbGVmdF9qb2luKGRlZl95cGNfYWxsb3dlZCwgYnkgPSAiZGVmdGVhbSIpICU+JQ0KICBtdXRhdGUoDQogICAgcmFua19hdmdfZGlmZl95cGMgPSBkZW5zZV9yYW5rKGRlc2MoYXZnX2RpZmZfeXBjKSksDQogICAgcmFua195cGNfYWxsb3dlZCAgPSBkZW5zZV9yYW5rKGRlc2MoeXBjX2FsbG93ZWQpKSwNCiAgICByYW5rX2dhcCAgICAgICAgICA9IHJhbmtfYXZnX2RpZmZfeXBjIC0gcmFua195cGNfYWxsb3dlZA0KICApDQoNCiMgcGxvdCAxMCB0ZWFtcyB0aGF0IGFyZSB0b3AtMTAgd29yc3QgYnkgZWl0aGVyIG1ldHJpYw0KZHVtYmJlbGxfZGYgPC0gcmFua19jb21wYXJlICU+JQ0KICBmaWx0ZXIocmFua19hdmdfZGlmZl95cGMgPD0gMTAgfCByYW5rX3lwY19hbGxvd2VkIDw9IDEwKSAlPiUNCiAgbXV0YXRlKGRlZnRlYW0gPSByZW9yZGVyKGRlZnRlYW0sIHJhbmtfYXZnX2RpZmZfeXBjKSkgJT4lDQogIGFycmFuZ2UocmFua19hdmdfZGlmZl95cGMpDQoNCmdncGxvdChkdW1iYmVsbF9kZiwgYWVzKHkgPSBkZWZ0ZWFtKSkgKw0KICBnZW9tX3NlZ21lbnQoDQogICAgYWVzKHggPSByYW5rX3lwY19hbGxvd2VkLCB4ZW5kID0gcmFua19hdmdfZGlmZl95cGMpLA0KICAgIGxpbmV3aWR0aCA9IDEsDQogICAgY29sb3IgPSAiZ3JheTYwIg0KICApICsNCiAgZ2VvbV9wb2ludChhZXMoeCA9IHJhbmtfeXBjX2FsbG93ZWQsIGNvbG9yID0gIlRyYWRpdGlvbmFsIFlQQyBBbGxvd2VkIiksIHNpemUgPSAzKSArDQogIGdlb21fcG9pbnQoYWVzKHggPSByYW5rX2F2Z19kaWZmX3lwYywgY29sb3IgPSAiV29ya2hvcnNlIFJCIE1ldHJpYyIpLCBzaXplID0gMykgKw0KICBzY2FsZV94X3JldmVyc2UoDQogICAgYnJlYWtzID0gc2VxKDEsIDMyLCA0KSwNCiAgICBsaW1pdHMgPSBjKDMyLCAxKQ0KICApICsNCiAgc2NhbGVfY29sb3JfbWFudWFsKA0KICAgIG5hbWUgPSAiTWV0cmljIiwNCiAgICB2YWx1ZXMgPSBjKA0KICAgICAgIlRyYWRpdGlvbmFsIFlQQyBBbGxvd2VkIiA9ICJmaXJlYnJpY2siLA0KICAgICAgIldvcmtob3JzZSBSdXNoaW5nIE1ldHJpYyIgICAgID0gInN0ZWVsYmx1ZSINCiAgICApDQogICkgKw0KICBsYWJzKA0KICAgIHRpdGxlID0gIlJ1biBEZWZlbnNlIFJhbmsgRGlmZmVyZW5jZXMgYnkgTWV0cmljIiwNCiAgICB4ID0gIkRlZmVuc2l2ZSBSYW5rICgxID0gV29yc3QsIDMyID0gQmVzdCkiLA0KICAgIHkgPSAiVGVhbSINCiAgKSArDQogIHRoZW1lX21pbmltYWwoKSArDQogIHRoZW1lKA0KICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iLA0KICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChmYWNlID0gImJvbGQiKQ0KICApDQpgYGANCg0KV2Ugc2VlIHRoYXQgYSBmZXcgdGVhbXMgcmVtYWluIGluIHNpbWlsYXIgcmFua3MgKEJpbGxzLCBHaWFudHMsIEJlbmdhbHMsIERvbHBoaW5zLCBDYXJkaW5hbHMsIGV0YyksIGJ1dCB3ZSBhbHNvIHNlZSBzb21lIG1ham9yIGRpc2NyZXBhbmNpZXMuIFRoZSBQYW50aGVycyBhcmUgcmFua2VkIDExdGggaW4geWFyZHMgcGVyIGNhcnJ5IGJ1dCAzcmQgd2hlbiB0aGV5IGFsbG93IDE0KyBjYXJyaWVzLiBUaGUgQ2hhcmdlcnMgZHJvcCBmcm9tIDE2dGggdG8gOXRoLiBTdXJwcmlzaW5nbHksIHRoZSBCZWFycywgSmV0cywgYW5kIEZhbGNvbnMgYmVjb21lIG1vcmUgc3RvdXQgYXMgdGhlaXIgb3Bwb25lbnQgZ2V0cyBtb3JlIGNhcnJpZXMuDQoNCiMgQ29uY2x1c2lvbg0KDQpUaGlzIHByb2plY3Qgc2hvd3MgaG93IHVzaW5nIHRoZSBzYW1lIHBsYXktYnktcGxheSBkYXRhIGJ1dCBjaGFuZ2luZyBob3cgaXTigJlzIGFnZ3JlZ2F0ZWQgY2FuIGxlYWQgdG8gdmVyeSBkaWZmZXJlbnQgY29uY2x1c2lvbnMgYWJvdXQgcnVuIGRlZmVuc2UuIFRyYWRpdGlvbmFsIHlhcmRzIHBlciBjYXJyeSBhbGxvd2VkIHJlZmxlY3RzIG92ZXJhbGwgZWZmaWNpZW5jeSwgYnV0IGl0IG1pc3NlcyBob3cgZGVmZW5zZXMgcGVyZm9ybSB3aGVuIG9wcG9uZW50cyBjb21taXQgdG8gYSBoZWF2eSBydXNoaW5nIHdvcmtsb2FkLiBCeSBmb2N1c2luZyBvbiBoaWdoLXZvbHVtZSBydXNoaW5nIGdhbWVzIGFuZCBjb21wYXJpbmcgcGVyZm9ybWFuY2UgdG8gc2Vhc29uIGJhc2VsaW5lcywgdGhlIHdvcmtob3JzZSBydXNoZXIgbWV0cmljIGhpZ2hsaWdodHMgc2l0dWF0aW9uYWwgd2Vha25lc3NlcyB0aGF0IHN0YW5kYXJkIG1ldHJpY3Mgb3Zlcmxvb2suIFNvbWUgZGVmZW5zZXMgcmVtYWluIGNvbnNpc3RlbnQgYWNyb3NzIGJvdGggbWVhc3VyZXMsIHdoaWxlIG90aGVycyBjaGFuZ2UgZHJhbWF0aWNhbGx5LCBzdWdnZXN0aW5nIHRoYXQgd29ya2xvYWQgY29udGV4dCBwbGF5cyBhbiBpbXBvcnRhbnQgcm9sZSBpbiBldmFsdWF0aW5nIHJ1biBkZWZlbnNlIHBlcmZvcm1hbmNlLg==