Skip to content

An iterative method for ranking college football teams (or anything else) based on win/loss outcomes alone. Non-linear weighted wins and losses generate fair rankings that naturally account for signature wins and crushing losses.

License

Notifications You must be signed in to change notification settings

maxposchmann/SelfConsistentCFBRanker

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Self-Consistent CFB Ranker

Current Rankings (December 1, 2024):

Rank Team NAW AAW NCS NRS Record
1 Oregon 13.841 1.153 13.841 2.147 12 - 0
2 Notre Dame 11.865 0.989 13.876 0.000 11 - 1
3 Texas 11.702 0.975 14.331 0.000 11 - 1
4 Ohio State 10.915 0.910 16.160 0.000 10 - 2
5 SMU 10.719 0.893 13.124 1.585 11 - 1
6 Georgia 10.706 0.892 15.467 0.000 10 - 2
7 Penn State 10.575 0.881 13.230 2.718 11 - 1
8 Alabama 9.252 0.771 15.661 0.000 9 - 3
9 Indiana 9.172 0.764 11.827 0.000 11 - 1
10 Boise State 8.880 0.740 11.966 0.000 11 - 1
11 Iowa State 8.798 0.733 12.977 0.000 10 - 2
12 Miami (FL) 8.711 0.726 13.150 0.000 10 - 2
13 BYU 8.663 0.722 13.051 0.000 10 - 2
14 Arizona State 8.338 0.695 12.503 0.000 10 - 2
15 South Carolina 8.313 0.693 15.302 0.000 9 - 3
16 Tennessee 8.077 0.673 12.708 0.000 10 - 2
17 Syracuse 8.006 0.667 14.191 0.000 9 - 3
18 Ole Miss 7.451 0.621 13.780 0.000 9 - 3
19 Missouri 6.653 0.554 13.662 0.000 9 - 3
20 Army 6.573 0.598 9.354 0.000 10 - 1
21 LSU 6.557 0.546 15.305 0.000 8 - 4
22 Illinois 6.546 0.546 14.286 0.000 9 - 3
23 Nevada-Las Vegas 6.487 0.541 11.257 0.000 10 - 2
24 Clemson 6.374 0.531 13.572 2.169 9 - 3
25 Colorado 6.157 0.513 12.330 0.000 9 - 3
26 Louisville 6.097 0.508 15.987 0.000 8 - 4
27 Memphis 6.010 0.501 10.125 0.000 10 - 2
28 Louisiana 5.935 0.495 10.116 0.000 10 - 2
29 Duke 5.854 0.488 12.989 0.000 9 - 3
30 Tulane 5.846 0.487 12.235 0.000 9 - 3
31 Texas A&M 5.724 0.477 15.641 0.000 8 - 4
32 Texas Tech 5.579 0.465 13.989 0.000 8 - 4
33 Michigan 5.489 0.457 18.033 0.000 7 - 5
34 Kansas State 5.401 0.450 14.616 0.000 8 - 4
35 Marshall 5.189 0.432 11.947 0.000 9 - 3
36 Baylor 4.867 0.406 13.901 0.000 8 - 4
37 Navy 4.299 0.391 11.344 0.000 8 - 3
38 Ohio 4.269 0.356 10.668 0.000 9 - 3
39 Georgia Tech 4.238 0.353 16.226 0.000 7 - 5
40 Florida 4.128 0.344 16.449 0.000 7 - 5
41 Iowa 4.117 0.343 13.194 0.000 8 - 4
42 Texas Christian 3.671 0.306 12.474 0.000 8 - 4
43 Boston College 3.588 0.299 14.690 0.000 7 - 5
44 Georgia Southern 3.550 0.296 12.396 0.000 8 - 4
45 Sam Houston 3.157 0.263 9.214 0.000 9 - 3
46 Pitt 3.027 0.252 14.139 0.000 7 - 5
47 Miami (OH) 2.926 0.244 11.745 0.000 8 - 4
48 Oklahoma 2.906 0.242 17.147 0.000 6 - 6
49 Minnesota 2.806 0.234 13.689 0.000 7 - 5
50 Virginia Tech 2.654 0.221 15.842 0.000 6 - 6
51 Buffalo 2.236 0.186 10.594 0.000 8 - 4
52 James Madison 2.175 0.181 10.416 0.000 8 - 4
53 Rutgers 2.039 0.170 12.299 0.000 7 - 5
54 USC 2.019 0.168 15.661 0.000 6 - 6
55 Western Kentucky 1.858 0.155 10.631 0.000 8 - 4
56 Washington 1.798 0.150 16.077 0.000 6 - 6
57 Vanderbilt 1.708 0.142 15.814 0.000 6 - 6
58 Connecticut 1.681 0.140 10.280 0.000 8 - 4
59 Kansas 1.671 0.139 16.852 0.000 5 - 7
60 Washington State 1.576 0.131 10.668 0.000 8 - 4
61 Colorado State 1.571 0.131 10.589 0.000 8 - 4
62 Jacksonville State 1.469 0.122 9.756 0.000 8 - 4
63 Northern Illinois 1.446 0.120 11.738 0.000 7 - 5
64 West Virginia 0.998 0.083 14.520 0.000 6 - 6
65 Liberty 0.954 0.087 7.844 0.000 8 - 3
66 Nebraska 0.907 0.076 14.358 0.000 6 - 6
67 Bowling Green 0.816 0.068 11.662 0.000 7 - 5
68 Texas State 0.732 0.061 11.510 0.000 7 - 5
69 Arkansas 0.676 0.056 14.483 0.000 6 - 6
70 Arkansas State 0.674 0.056 11.445 0.000 7 - 5
71 UCLA 0.656 0.055 17.118 0.000 5 - 7
72 Toledo 0.607 0.051 10.829 0.000 7 - 5
73 North Carolina State 0.450 0.037 13.678 0.000 6 - 6
74 East Carolina 0.288 0.024 10.647 0.000 7 - 5
75 San Jose State 0.170 0.014 10.860 0.000 7 - 5
76 Cincinnati 0.118 0.010 15.180 0.000 5 - 7
77 North Carolina 0.108 0.009 12.525 0.000 6 - 6
78 South Alabama -0.254 -0.021 12.149 0.000 6 - 6
79 Virginia -0.510 -0.043 15.382 0.000 5 - 7
80 California -0.582 -0.049 12.998 0.000 6 - 6
81 Michigan State -0.612 -0.051 16.060 0.000 5 - 7
82 Appalachian State -0.660 -0.060 11.954 0.000 5 - 6
83 Coastal Carolina -0.746 -0.062 11.794 0.000 6 - 6
84 Old Dominion -0.871 -0.073 13.710 0.000 5 - 7
85 Wisconsin -0.906 -0.075 15.413 0.000 5 - 7
86 South Florida -1.034 -0.086 12.392 0.000 6 - 6
87 Auburn -1.064 -0.089 14.328 0.000 5 - 7
88 North Texas -1.127 -0.094 11.658 0.000 6 - 6
89 Utah -1.442 -0.120 14.100 0.000 5 - 7
90 Kentucky -1.446 -0.121 16.971 0.000 4 - 8
91 Western Michigan -1.515 -0.126 11.485 0.000 6 - 6
92 Fresno State -1.675 -0.140 10.919 0.000 6 - 6
93 UTSA -1.835 -0.153 11.701 0.000 6 - 6
94 Houston -1.911 -0.159 15.373 0.000 4 - 8
95 Charlotte -2.163 -0.180 12.792 0.000 5 - 7
96 UCF -2.318 -0.193 15.186 0.000 4 - 8
97 Maryland -2.419 -0.202 15.926 0.000 4 - 8
98 Louisiana-Monroe -2.428 -0.202 12.671 0.000 5 - 7
99 Northwestern -2.617 -0.218 15.173 0.000 4 - 8
100 Wake Forest -2.840 -0.237 14.453 0.000 4 - 8
101 Oregon State -2.884 -0.240 13.214 0.000 5 - 7
102 Arizona -3.210 -0.267 14.193 0.000 4 - 8
103 Eastern Michigan -3.623 -0.302 10.653 0.000 5 - 7
104 Stanford -3.643 -0.304 16.137 0.000 3 - 9
105 Akron -3.858 -0.321 13.339 0.000 4 - 8
106 Rice -3.978 -0.332 12.946 0.000 4 - 8
107 Air Force -4.218 -0.352 10.869 0.000 5 - 7
108 Hawaii -4.406 -0.367 10.913 0.000 5 - 7
109 Oklahoma State -4.660 -0.388 14.851 0.000 3 - 9
110 Troy -4.753 -0.396 12.017 0.000 4 - 8
111 Florida State -5.280 -0.440 17.382 0.000 2 - 10
112 Georgia State -5.518 -0.460 12.836 0.000 3 - 9
113 Mississippi State -5.614 -0.468 17.297 0.000 2 - 10
114 Central Michigan -5.904 -0.492 11.088 0.000 4 - 8
115 Utah State -5.958 -0.497 11.205 0.000 4 - 8
116 Temple -6.252 -0.521 12.342 0.000 3 - 9
117 UAB -6.315 -0.526 12.462 0.000 3 - 9
118 Ball State -6.408 -0.534 12.408 0.000 3 - 9
119 Louisiana Tech -6.681 -0.557 8.879 0.000 5 - 7
120 New Mexico -6.832 -0.569 8.898 0.000 5 - 7
121 Nevada -7.067 -0.544 14.544 0.000 3 - 10
122 Purdue -7.984 -0.665 17.923 0.000 1 - 11
123 Florida Atlantic -8.219 -0.685 10.289 0.000 3 - 9
124 Wyoming -8.336 -0.695 12.656 0.000 3 - 9
125 Massachusetts -8.505 -0.709 12.699 0.000 2 - 10
126 San Diego State -8.753 -0.729 10.670 0.000 3 - 9
127 Middle Tennessee State -8.997 -0.750 10.976 0.000 3 - 9
128 Tulsa -9.228 -0.769 9.914 0.000 3 - 9
129 New Mexico State -9.535 -0.795 10.063 0.000 3 - 9
130 UTEP -9.932 -0.828 10.351 0.000 3 - 9
131 Florida International -9.933 -0.828 9.484 0.000 4 - 8
132 Southern Mississippi -10.445 -0.870 12.091 0.000 1 - 11
133 Kennesaw State -12.187 -1.016 10.478 0.000 2 - 10
134 Kent State -13.300 -1.108 13.425 0.000 0 - 12

Explanation:

I was looking at a couple of computer CFB rankings, and the following occurred to me:

  • I can use a computer.
  • I know about football.
  • My opinions are better than other people's opinions.

So of course I had to do my own ranking system. Here are my principles:

  • Games are won or lost. Point differentials are meaningless. Really, your team is better because your 8th-string QB rushed for a couple garbage time TDs?
  • Wins and losses both matter. Equally.
  • The order in which games are played doesn't matter. No late-season bias. No inertia.
  • Beating a good team is better than beating a bad team, and similarly losing to a good team isn't as bad as losing to a bad team.
  • No judgement should be involved. No adjustable parameters. In other words, there's no seed from a preseason poll, nor should there be sorting by P5/G5 etc. The rankings themselves have to determine what is a good win.
  • The ratings used to generate rankings should be continuous rather than discrete and separate from the rankings themselves. The gap between #14 and #15, for example, may be small or large, and the value of beating these teams should reflect that.
  • Rankings should be self-consistent. If the final set of ratings is used to generate rankings, there should be no change.

And thus the foundations of the Self-Consistent CFB Ranker (SCCR) were laid. The first step in executing this vision is choosing a function to generate the ratings. A new rating system, Net Adjusted Wins (NAW) was invented for this purpose.

Net Wins

Net wins is simply wins minus losses, like the team record with the dash interpreted as subtraction. So a 8-4 teams has 4 net wins. A 1-11 teams has -10 net wins. In the days of ties, a 4-5-1 teams has -1 net wins.

Adjusted Wins

As stated above, in CFB some wins are better than others, and some losses worse than others. To represent this, an Adjusted Wins function was selected. The adjusted win value ($\omega$) for an opponent strength of $\beta$ is:

$\omega_{win}$ = $\exp(\beta / \gamma)$

where $\gamma$ is a scaling factor. The adjusted win value for a loss against the same opponent would be:

$\omega_{loss}$ = $-\exp(-\beta/\gamma)$.

Net Adjusted Wins

Combining the two concepts above, Net Adjusted Wins for any team is simply:

NAW = $\sum_{games}$ $\omega_{game}$.

Now, what should the strength, $\beta$, be for each team? Simply that team's NAW!

Comparing the $\omega_{win}$ and $\omega_{loss}$ functions, it can be seen that the magnitude of a win against a team with a high NAW will be similar to that of a loss to a team with a low NAW. Note that an average NAW (i.e., for a team with an even record) will be around 0. This means for an opponent with an average NAW, $\omega_{win} \doteq 1$ and $\omega_{loss} \doteq -1$. In other words, the average adjustment factor is roughly unity.

The only remaining parameter to set is $\gamma$. The choice $\gamma$ = max(abs(NAW)) is arbitrary, but turns out to work pretty nicely. It ensures that the adjusted values of wins remain roughly constant over the course of a season, and defines the maximum possible ratio of values of FBS wins (or losses) to be exp(2) = 7.389. By this win metric, a team would do much better to split a series with the best team in FBS (+2.3504 net wins) than to beat the worst team in FBS twice (+0.7358 net wins). This feels reasonably fair, and also has the benefit of converging well.

A few more calculation details. The algorithm is initialized with the unadjusted net wins for each team. The adjusted wins are calculated and NAW summed iteratively until self-consistency of NAW for all teams is achieved. Multiple games against the same opponent are counted separately, rather than cancelling. Ties (though no longer part of CFB) are counted as 0.5 wins + 0.5 losses, so increase NAW if the opponent has NAW above 0, and decrease it if the opponent has NAW below 0.

Also calculated is Average Adjusted Wins (AAW), which is NAW per game played. The NAW of the Completed Schedule (NCS) and NAW of Remaining Schedule (NRS) for each team are also output as estimates of strength of schedule and strength of remaining schedule.

One caveat about the "no inputs" thing: only FBS teams are tracked, and all non-FBS teams have NAW set to (minimum FBS NAW - 1.0).

Results are downloaded from Sports Reference (i.e. https://www.sports-reference.com/cfb/years/2024-schedule.html click on "Share & Export" then "Get table as CSV (for Excel)").

Team Reports:

If team names are given as arguments, a report on the specified teams will be output instead of the full rankings. This includes the games played by that team, the outcomes of those games, and how they affected the computed team NAW. If games remain on the schedule, those are shown separately, along with estimated NAW changes for win/loss outcomes.

For example, California after week 13, 2021:

California (4 - 6)

NAW AAW NCS NRS
Value -4.201 -0.420 8.933 2.047
Rank 100 102 125 9
Played Outcome Change
71 Texas Christian Loss - 0.997
44 Nevada Loss - 0.837
105 Stanford Win + 0.692
64 Washington State Loss - 0.947
20 Oregon Loss - 0.606
52 Oregon State Win + 1.132
108 Washington Loss - 1.523
96 Colorado Win + 0.754
127 Arizona Loss - 2.210
131 Non-FBS Win + 0.341
Remaining If Win If Loss
86 USC + 0.853 - 1.173
45 UCLA + 1.194 - 0.837

Examples:

2019

Let's take a look at the top 25 prior to bowl games for the 2019 season. I'll use the results as of December 8th to match the final CFP committee:

Rank Team NAW CFP Committee Rank
1 Ohio State 16.622 2
2 LSU 15.179 1
3 Clemson 12.756 3
4 Memphis 12.101 17
5 Oklahoma 11.840 4
6 Boise State 11.224 19
7 Georgia 10.840 5
8 Appalachian State 10.437 20
9 Oregon 9.867 6
10 Notre Dame 9.632 15
11 Wisconsin 9.452 8
12 Penn State 9.320 10
13 Baylor 9.180 7
14 Utah 9.117 11
15 Cincinnati 8.558 21
16 Florida 8.429 9
17 Michigan 8.099 14
18 Auburn 7.988 12
19 SMU 7.937 NR
20 Minnesota 7.762 18
21 Alabama 7.713 13
22 Air Force 7.537 NR
23 Navy 7.487 23
24 Iowa 7.092 16
25 Florida Atlantic 6.777 NR

This ranking results in 3 of the 4 playoff selection, and Oklahoma is only edged out by Memphis by a razor-thin margin. Evidently this ranking system is not the hot-take generator I had feared. In total 4 of the top-25 teams differ from the CFP committee's list. Dropped are 8-4 USC (22), 9-4 Virginia (24), and 8-4 Oklahoma State (25). Added are 10-3 SMU, 11-2 Air Force, and 11-3 FAU. Overall this ranking prefers G5 teams with more wins over P5 teams with fewer, relative to the CFP. I agree.

So 2019 is a nice, uncontroversial year. LSU were champs, they deserved to be in the CFP, and after all bowls SCCR agrees that they were the best.

2017

But what about 2017? Starting with the same point (December 3rd), who should have been in the CFP?

Rank Team NAW CFP Committee Rank
1 Clemson 14.609 1
2 Georgia 13.282 3
3 Oklahoma 13.282 2
4 UCF 12.599 12
5 Wisconsin 12.540 6
6 Ohio State 12.511 5
7 USC 11.728 8
8 Alabama 11.303 4
9 Auburn 10.581 7
10 Notre Dame 10.301 14

That's only a little different from the CFP as well.. According to SCCR, UCF should been given a chance to play for the title over Alabama.

Interestingly, the Colley Matrix still put UCF at 1 after bowl games, even though they didn't get to face off in the CFP. Since this ranking bears some similarity in philosophy to Colley, let's see if that's true for SCCR also.

Rank Team NAW
1 Alabama 16.426
2 Georgia 16.006
3 Ohio State 15.099
4 Wisconsin 14.802
5 UCF 14.489
6 Clemson 13.863
7 Oklahoma 13.681
8 Penn State 11.798
9 Notre Dame 11.595
10 Auburn 10.879

Sorry UCF, but SCCR agrees that Alabama were the 2017 national champions, with their playoff victories vaulting them to the top.

Comparison with Colley Matrix

It has come to my attention that there is already a self-consistent ranking method, the Colley Matrix (https://www.colleyrankings.com/index.html), which was part of the BCS system (prior to the CFP), and is still recognized by NCAA. No surprise that something similar has been done, as Daryl says: there's no such thing as an original sin. Anyway it seems some comparison is warranted. Please note that I am not an expert on the Colley system, but I will do my best to discuss it accurately. The similarities between the two are substantial:

  • Only wins and losses are considered (no score differential).
  • There is no sorting by conference or history (bias-free).
  • The order in which games are played is irrelevant.
  • The results are self-consistent.

However, there are also substantial differences between the two methods. First, to state the obvious, the two generate different rankings unless some miraculous coincidence has occurred. Here are some more details and examples:

Units.

SCCR outputs NAWs with units of wins, with wins against above-average teams being worth >1 win and wins against below-average teams worth <1 win, and with losses negative and opposite to wins. Thus as of week 5 2021, 4-0 Michigan is at #1 with 4.42142527 effective wins. Meanwhile the Colley matrix returns ratings which are more similar to win percentages. Colley also has Michigan at #1 for the same week, with a rating of 0.92392. In the Colley system, ratings are (almost) always between 0 and 1, so even an undefeated team with the highest strength-of-schedule will show a rating <1. In SCCR NAWs average around 0, and beating an average team yields exp(0) = 1 wins. In Colley, ratings average to 0.5, i.e. an even win-loss rate.

Strength-of-schedule adjustments for win/loss outcomes.

Both systems use the strengths of all opponents iteratively to determine the values of wins and losses. However, in Colley whether a particular game was won or lost does not affect the strength of schedule adjustment (to first order). In SCCR the win-loss state is directly accounted for in the NAW exponential function. This is best demonstrated by example. Again, let's take (the current at time of writing) week 5 2021. Rutgers is 3-1, having just lost to #1 Michigan. In SCCR Rutgers is ranked at #28 with NAW 1.98208119. In Colley, Rutgers is #16 with rating 0.7713. Now, let's imagine a hypothetical in which Rutgers had beaten Michigan, but lost a previous game against Temple. In Colley, Rutgers remains at #16 and has rating 0.7700. This is nearly identical to before. In SCCR, Rutgers rises to #25 (a jump of 3 positions) and has NAW 2.24361296 (+0.26153177 wins). This is because in SCCR the value of beating a very good opponent outweighs the penalty of losing to a middling opponent. On the other hand, in Colley, Rutger's rating only changes at all because of the changes in the strength-of-schedule of other teams (which is why it hardly budged).

Differing number of games completed.

As discussed in point 1, SCCR is effectively a cumulative resume rating system, while Colley is based on a rate. Therefore SCCR will prefer teams with larger numbers of games played (or more specifically, won) relative to Colley. I demonstrate this on the 2020 "regular" season (I had to use the Wayback Machine on the Colley website, and this only shows top 25 ranks and no ratings). Here are SCCR and Colley ranks for 2020 as of December 20th:

Rank Team NAW Colley Team
1 Coastal Carolina 11.935 Alabama
2 Alabama 11.690 Cincinnati
3 Clemson 10.739 Coastal Carolina
4 Notre Dame 9.867 Clemson
5 Cincinnati 9.789 Ohio State
6 Louisiana 9.096 San Jose State
7 BYU 8.899 Louisiana
8 Miami (FL) 7.371 Notre Dame
9 San Jose State 7.199 BYU
10 Iowa State 6.949 Miami
11 Oklahoma 6.939 Ball State
12 Texas A&M 6.507 Texas A&M
13 Ohio State 6.122 Indiana
14 North Carolina 5.504 Oklahoma
15 Oklahoma State 5.369 Tulsa
16 Ball State 5.338 Iowa State
17 North Carolina State 5.306 Georgia
18 Army 5.261 USC
19 Liberty 5.109 Buffalo
20 Tulsa 4.851 Colorado
21 Georgia 4.687 North Carolina
22 Florida 4.681 North Carolina State
23 Marshall 4.633 Army
24 Appalachian State 4.610 Oklahoma State
25 Indiana 4.608 Northwestern

Notice that 6-0 Ohio State has dropped from playoff position at #3 in the CFP rankings to #13 here (#5 in Colley), due to not having earned enough wins in their shortened season. They would have been replaced by the Chanticleers! Now tell me there's a better rating system.

Comparing the Colley rankings to SCCR rankings, the big gainers under Colley were B1G and PAC-12 teams like Ohio State, Indiana, USC, and Colorado, who all played shortened seasons. So as expected, SCCR prefers teams with more wins under their belt relative to Colley. While neither is intended as a predictive method, it is probably fair to say that Colley has more traits of a predictive method and SCCR comes closer to a pure resume ranker.

Note that AAW (NAW per game played) is also available within SCCR, if you prefer an efficiency metric. The top four teams by AAW in 2020 were: Cincinnati, Coastal Carolina, Alabama, and San Jose State.

What's a win worth?

In SCCR, the answer is the same for everyone: exp({opponent NAW}/{maximum NAW}). In Colley, the answer depends on how your year has been going. Here's an example. As I write this, it is Monday morning following week 13 of 2021. Iowa sits at #13 in SCCR with NAW of 7.42832202, and #10 in Colley with rating 0.81598. Meanwhile Ohio is #121 (-8.07105492) by SCCR and #123 (0.25856) by Colley. Let's imagine these two took it upon themselves to play an unscheduled match here on Monday morning while the rest of the teams rest. Iowa wins of course. By SCCR, Iowa gains 0.54494081 to total 7.97326283 wins and moves up to #11. Per Colley, Iowa loses 0.00411 rating points and drops to #11 with 0.81187. Punished for winning!

Now suppose that instead of Iowa, it was the California Golden Bears who beat Ohio tonight. California is currently #100 (-4.20083795) by SCCR and #102 (0.36630) by Colley. After this hypothetical win, they gain 0.52891463 wins to move to #96 (-3.67192332) in SCCR, and gain 0.03103 points to go to #115 (0.39733) in Colley.

So what do we learn? In Colley, a win against a bad team can decrease your strength-of-schedule adjustment by enough to outweight the value of the win (especially if you are undefeated), while in SCCR beating a given opponent is worth (approximately) the same amount to every team. As we can see, the win value in SCCR is not identically the same because the outcome adjusts the NAWs of schedule for all teams (specifically, California beating Ohio decreases Ohio's NAW by much more than Iowa beating them would). This effect would be diminished if the example was after a complete season, but unfortunately the Colley website only allows for hypothetical games to be added to the current season-in-progress.

About

An iterative method for ranking college football teams (or anything else) based on win/loss outcomes alone. Non-linear weighted wins and losses generate fair rankings that naturally account for signature wins and crushing losses.

Resources

License

Stars

Watchers

Forks

Languages