<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en-GB">
	<id>https://nssportwiki.com/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Osarius</id>
	<title>NationStates Sports Wiki - User contributions [en-gb]</title>
	<link rel="self" type="application/atom+xml" href="https://nssportwiki.com/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Osarius"/>
	<link rel="alternate" type="text/html" href="https://nssportwiki.com/wiki/Special:Contributions/Osarius"/>
	<updated>2026-09-04T15:17:21Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.40.1</generator>
	<entry>
		<id>https://nssportwiki.com/index.php?title=World_Cup_101_qualification/Playoffs&amp;diff=76415</id>
		<title>World Cup 101 qualification/Playoffs</title>
		<link rel="alternate" type="text/html" href="https://nssportwiki.com/index.php?title=World_Cup_101_qualification/Playoffs&amp;diff=76415"/>
		<updated>2026-07-24T19:46:51Z</updated>

		<summary type="html">&lt;p&gt;Osarius: Created page with &amp;quot; ==Playoffs== ===Bracket=== {{#invoke: Team bracket colspanfix | main |rounds=8|maxround=3|byes=3|legs=3|sepwidth=1|boldwinner=high|hideomittedscores = 1|aggregate=score|nowrap=yes|compact=no|small=yes | RD1-group1 = &amp;#039;&amp;#039;&amp;lt;big&amp;gt;Bracket A&amp;lt;/big&amp;gt;&amp;#039;&amp;#039; | RD1-group3 = &amp;#039;&amp;#039;&amp;lt;big&amp;gt;Bracket B&amp;lt;/big&amp;gt;&amp;#039;&amp;#039; | RD1-group5 = &amp;#039;&amp;#039;&amp;lt;big&amp;gt;Bracket C&amp;lt;/big&amp;gt;&amp;#039;&amp;#039; | RD1-group7 = &amp;#039;&amp;#039;&amp;lt;big&amp;gt;Bracket D&amp;lt;/big&amp;gt;&amp;#039;&amp;#039; | RD1-group9 = &amp;#039;&amp;#039;&amp;lt;big&amp;gt;Bracket E&amp;lt;/big&amp;gt;&amp;#039;&amp;#039; | RD1-group11 = &amp;#039;&amp;#039;&amp;lt;big&amp;gt;Bracket F&amp;lt;/big&amp;gt;&amp;#039;&amp;#039; | RD1-group13 = &amp;#039;&amp;#039;&amp;lt;big&amp;gt;Bracket G...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
==Playoffs==&lt;br /&gt;
===Bracket===&lt;br /&gt;
{{#invoke: Team bracket colspanfix | main&lt;br /&gt;
|rounds=8|maxround=3|byes=3|legs=3|sepwidth=1|boldwinner=high|hideomittedscores = 1|aggregate=score|nowrap=yes|compact=no|small=yes&lt;br /&gt;
| RD1-group1 = &#039;&#039;&amp;lt;big&amp;gt;Bracket A&amp;lt;/big&amp;gt;&#039;&#039;&lt;br /&gt;
| RD1-group3 = &#039;&#039;&amp;lt;big&amp;gt;Bracket B&amp;lt;/big&amp;gt;&#039;&#039;&lt;br /&gt;
| RD1-group5 = &#039;&#039;&amp;lt;big&amp;gt;Bracket C&amp;lt;/big&amp;gt;&#039;&#039;&lt;br /&gt;
| RD1-group7 = &#039;&#039;&amp;lt;big&amp;gt;Bracket D&amp;lt;/big&amp;gt;&#039;&#039;&lt;br /&gt;
| RD1-group9 = &#039;&#039;&amp;lt;big&amp;gt;Bracket E&amp;lt;/big&amp;gt;&#039;&#039;&lt;br /&gt;
| RD1-group11 = &#039;&#039;&amp;lt;big&amp;gt;Bracket F&amp;lt;/big&amp;gt;&#039;&#039;&lt;br /&gt;
| RD1-group13 = &#039;&#039;&amp;lt;big&amp;gt;Bracket G&amp;lt;/big&amp;gt;&#039;&#039;&lt;br /&gt;
| RD1-group15 = &#039;&#039;&amp;lt;big&amp;gt;Bracket H&amp;lt;/big&amp;gt;&#039;&#039;&lt;br /&gt;
| RD1-group17 = &#039;&#039;&amp;lt;big&amp;gt;Bracket I&amp;lt;/big&amp;gt;&#039;&#039;&lt;br /&gt;
| RD1-group19 = &#039;&#039;&amp;lt;big&amp;gt;Bracket J&amp;lt;/big&amp;gt;&#039;&#039;&lt;br /&gt;
| RD1-group21 = &#039;&#039;&amp;lt;big&amp;gt;Bracket K&amp;lt;/big&amp;gt;&#039;&#039;&lt;br /&gt;
| RD1-group23 = &#039;&#039;&amp;lt;big&amp;gt;Bracket L&amp;lt;/big&amp;gt;&#039;&#039;&lt;br /&gt;
| RD1-group25 = &#039;&#039;&amp;lt;big&amp;gt;Bracket M&amp;lt;/big&amp;gt;&#039;&#039;&lt;br /&gt;
| RD1-group27 = &#039;&#039;&amp;lt;big&amp;gt;Bracket N&amp;lt;/big&amp;gt;&#039;&#039;&lt;br /&gt;
|RD1=Round One&lt;br /&gt;
|RD2=Round Two&lt;br /&gt;
|RD3=Round Three&lt;br /&gt;
&lt;br /&gt;
|RD1-team35={{fb|Calgasia}}|RD1-score35-1=2|RD1-score35-2=1&lt;br /&gt;
|RD1-team36={{fb|Captina Island}}|RD1-score36-1=1|RD1-score36-2=1&lt;br /&gt;
&lt;br /&gt;
|RD1-team43={{strikethrough|{{fb|Andossa Se Mitrin Vega}}}}|RD1-score43-1=1|RD1-score43-2=1&lt;br /&gt;
|RD1-team44={{fb|Russian Empire EHA}}|RD1-score44-1=0|RD1-score44-2=0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|RD1-team51={{fb|Tomerion }}|RD1-score51-1=0|RD1-score51-2=0&lt;br /&gt;
|RD1-team52={{fb|The Republic of the United Marble Tribes}}|RD1-score52-1=0|RD1-score52-2=1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|RD1-team59={{fb|Shin-Zetsubo}}|RD1-score59-1=1|RD1-score59-2=4&lt;br /&gt;
|RD1-team60={{fb|The Golden Harp}}|RD1-score60-1=2|RD1-score60-2=4&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|RD1-team67={{fb|Lisander}}|RD1-score67-1=2|RD1-score67-2=1|RD1-score67-3=1&lt;br /&gt;
|RD1-team68={{fb|The Martian Independent Republic}}|RD1-score68-1=0|RD1-score68-2=3|RD1-score68-3=2&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|RD1-team75={{fb|Aamathyr}}|RD1-score75-1=2|RD1-score75-2=1&lt;br /&gt;
|RD1-team76={{fb|Atheara}}|RD1-score76-1=0|RD1-score76-2=0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|RD1-team83={{fb|Super Earth}}|RD1-score83-1=0|RD1-score83-2=0&lt;br /&gt;
|RD1-team84={{fb|Drawkland}}|RD1-score84-1=2|RD1-score84-2=3&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|RD1-team91={{fb|Siovanija and Teusland}}|RD1-score91-1=1|RD1-score91-2=1&lt;br /&gt;
|RD1-team92={{fb|Delaclava}}|RD1-score92-1=3|RD1-score92-2=1&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--SF--&amp;gt;&lt;br /&gt;
|RD2-team1={{fb|Choppyhausen}}|RD2-score1-1=4|RD2-score1-2=1|RD2-score1-3=1&lt;br /&gt;
|RD2-team2={{fb|Katzeburg}}|RD2-score2-1=3|RD2-score2-2=2|RD2-score2-3=0&lt;br /&gt;
&lt;br /&gt;
|RD2-team5={{fb|Myrtle Beach}}|RD2-score5-1=3|RD2-score5-2=4&lt;br /&gt;
|RD2-team6={{fb|Auprussia}}|RD2-score6-1=2|RD2-score6-2=4&lt;br /&gt;
&lt;br /&gt;
|RD2-team9={{fb|Taeshan}}|RD2-score9-1=0|RD2-score9-2=1&lt;br /&gt;
|RD2-team10={{fb|Natkr}}|RD2-score10-1=2|RD2-score10-2=2&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|RD2-team13={{fb|Smoltrendestof}}|RD2-score13-1=1|RD2-score13-2=0&lt;br /&gt;
|RD2-team14={{fb|Abanhfleft}}|RD2-score14-1=3|RD2-score14-2=0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|RD2-team17={{fb|Calgasia}}|RD2-score17-1=0|RD2-score17-2=0&lt;br /&gt;
|RD2-team18={{fb|The Ko-orenite Constellation}}|RD2-score18-1=0|RD2-score18-2=4&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|RD2-team21={{fb|Russian Empire EHA}}|RD2-score21-1=1|RD2-score21-2=0&lt;br /&gt;
|RD2-team22={{fb|Kelssek}}|RD2-score22-1=2|RD2-score22-2=4&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|RD2-team25={{fb|The Republic of the United Marble Tribes}}|RD2-score25-1=1|RD2-score25-2=0&lt;br /&gt;
|RD2-team26={{fb|Darmen}}|RD2-score26-1=1|RD2-score26-2=4&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|RD2-team29={{fb|The Golden Harp}}|RD2-score29-1=2|RD2-score29-2=0&lt;br /&gt;
|RD2-team30={{fb|Soviet Kem}}|RD2-score30-1=0|RD2-score30-2=0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|RD2-team33={{fb|The Martian Independent Republic}}|RD2-score33-1=1|RD2-score33-2=4&lt;br /&gt;
|RD2-team34={{fb|Kamijiro}}|RD2-score34-1=2|RD2-score34-2=5&lt;br /&gt;
&lt;br /&gt;
|RD2-team37={{fb|Aamathyr}}|RD2-score37-1=2|RD2-score37-2=1&lt;br /&gt;
|RD2-team38={{fb|Legalese}}|RD2-score38-1=1|RD2-score38-2=0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|RD2-team41={{fb|Drawkland}}|RD2-score41-1=2|RD2-score41-2=3&lt;br /&gt;
|RD2-team42={{fb|Milchama}}|RD2-score42-1=0|RD2-score42-2=3&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|RD2-team45={{fb|Delaclava}}|RD2-score45-1=0|RD2-score45-2=0&lt;br /&gt;
|RD2-team46={{fb|StrayaRoos}}|RD2-score46-1=0|RD2-score46-2=2&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--F--&amp;gt;&lt;br /&gt;
|RD3-team1={{fb|Choppyhausen}}|RD3-score1-1=2|RD3-score1-2=2&lt;br /&gt;
|RD3-team2={{fb|Zwangzug}}|RD3-score2-1=0|RD3-score2-2=2&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|RD3-team3={{fb|Myrtle Beach}}|RD3-score3-1=2|RD3-score3-2=1|RD3-score3-3=2&lt;br /&gt;
|RD3-team4={{fb|Edsmontik}}|RD3-score4-1=3|RD3-score4-2=0|RD3-score4-3=3&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|RD3-team5={{fb|Natkr}}|RD3-score5-1=2|RD3-score5-2=1&lt;br /&gt;
|RD3-team6={{fb|Pomachetti}}|RD3-score6-1=2|RD3-score6-2=2&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|RD3-team7={{fb|Abanhfleft}}|RD3-score7-1=1|RD3-score7-2=0&lt;br /&gt;
|RD3-team8={{fb|Kwrpania}}|RD3-score8-1=0|RD3-score8-2=4&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|RD3-team9={{fb|The Ko-orenite Constellation}}|RD3-score9-1=2|RD3-score9-2=1|RD3-score9-3=2&lt;br /&gt;
|RD3-team10={{fb|Dantopia}} {{aet}}|RD3-score10-1=1|RD3-score10-2=2|RD3-score10-3=3&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|RD3-team11={{fb|Kelssek}}|RD3-score11-1=2|RD3-score11-2=0&lt;br /&gt;
|RD3-team12={{fb|TJUN-ia}}|RD3-score12-1=1|RD3-score12-2=2&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|RD3-team13={{fb|Darmen}}|RD3-score13-1=4|RD3-score13-2=0|RD3-score13-3=1&lt;br /&gt;
|RD3-team14={{fb|Bostopia}}|RD3-score14-1=1|RD3-score14-2=3|RD3-score14-3=3&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|RD3-team15={{fb|The Golden Harp}}|RD3-score15-1=3|RD3-score15-2=0&lt;br /&gt;
|RD3-team16={{fb|Sarzonia}}|RD3-score16-1=1|RD3-score16-2=0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|RD3-team17={{fb|Kamijiro}}|RD3-score17-1=2|RD3-score17-2=0&lt;br /&gt;
|RD3-team18={{fb|Sernet}}|RD3-score18-1=3|RD3-score18-2=1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|RD3-team19={{fb|Aamathyr}}|RD3-score19-1=0|RD3-score19-2=0&lt;br /&gt;
|RD3-team20={{fb|Hanalia}}|RD3-score20-1=2|RD3-score20-2=1&lt;br /&gt;
&lt;br /&gt;
|RD3-team21={{fb|Drawkland}}|RD3-score21-1=4|RD3-score21-2=2&lt;br /&gt;
|RD3-team22={{fb|Saterun}}|RD3-score22-1=2|RD3-score22-2=2&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|RD3-team23={{fb|StrayaRoos}}|RD3-score23-1=4|RD3-score23-2=3|RD3-score23-3=1&lt;br /&gt;
|RD3-team24={{fb|Biyambi}}|RD3-score24-1=4|RD3-score24-2=3|RD3-score24-3=3&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|RD3-team25={{fb|HUElavia}}|RD3-score25-1=1|RD3-score25-2=2&lt;br /&gt;
|RD3-team26={{fb|Cobrio}}|RD3-score26-1=1|RD3-score26-2=1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|RD3-team27={{fb|Airannia}}|RD3-score27-1=1|RD3-score27-2=1&lt;br /&gt;
|RD3-team28={{fb|Masraya}}|RD3-score28-1=1|RD3-score28-2=2&lt;br /&gt;
&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Osarius</name></author>
	</entry>
	<entry>
		<id>https://nssportwiki.com/index.php?title=Module:Build_bracket/Logic&amp;diff=76414</id>
		<title>Module:Build bracket/Logic</title>
		<link rel="alternate" type="text/html" href="https://nssportwiki.com/index.php?title=Module:Build_bracket/Logic&amp;diff=76414"/>
		<updated>2026-07-24T10:50:38Z</updated>

		<summary type="html">&lt;p&gt;Osarius: 1 revision imported&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local Logic = {}&lt;br /&gt;
&lt;br /&gt;
-- =======================&lt;br /&gt;
-- 1) STDLIB ALIASES&lt;br /&gt;
-- =======================&lt;br /&gt;
local m_max = math.max&lt;br /&gt;
local m_ceil = math.ceil&lt;br /&gt;
local s_match = string.match&lt;br /&gt;
local s_find = string.find&lt;br /&gt;
&lt;br /&gt;
-- =======================&lt;br /&gt;
-- 2) MODULE UPVALUES&lt;br /&gt;
-- =======================&lt;br /&gt;
local state, config, Helpers, StateChecks&lt;br /&gt;
local isempty, notempty, teamLegs&lt;br /&gt;
&lt;br /&gt;
local function bind(_state, _config, _Helpers, _StateChecks)&lt;br /&gt;
    state, config, Helpers, StateChecks = _state, _config, _Helpers, _StateChecks&lt;br /&gt;
    isempty = _Helpers and _Helpers.isempty or function(v)&lt;br /&gt;
            return v == nil or v == &amp;quot;&amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
    notempty = _Helpers and _Helpers.notempty or function(v)&lt;br /&gt;
            return v ~= nil and v ~= &amp;quot;&amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
    teamLegs = _StateChecks and _StateChecks.teamLegs&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- =======================&lt;br /&gt;
-- 3) SMALL UTILITIES&lt;br /&gt;
-- =======================&lt;br /&gt;
-- Map common Unicode fraction characters to decimal&lt;br /&gt;
local fraction_map = {&lt;br /&gt;
    [&amp;quot;½&amp;quot;] = &amp;quot;.5&amp;quot;,&lt;br /&gt;
    [&amp;quot;⅓&amp;quot;] = &amp;quot;.333&amp;quot;,&lt;br /&gt;
    [&amp;quot;⅔&amp;quot;] = &amp;quot;.667&amp;quot;,&lt;br /&gt;
    [&amp;quot;¼&amp;quot;] = &amp;quot;.25&amp;quot;,&lt;br /&gt;
    [&amp;quot;¾&amp;quot;] = &amp;quot;.75&amp;quot;,&lt;br /&gt;
    [&amp;quot;⅕&amp;quot;] = &amp;quot;.2&amp;quot;,&lt;br /&gt;
    [&amp;quot;⅖&amp;quot;] = &amp;quot;.4&amp;quot;,&lt;br /&gt;
    [&amp;quot;⅗&amp;quot;] = &amp;quot;.6&amp;quot;,&lt;br /&gt;
    [&amp;quot;⅘&amp;quot;] = &amp;quot;.8&amp;quot;,&lt;br /&gt;
    [&amp;quot;⅙&amp;quot;] = &amp;quot;.167&amp;quot;,&lt;br /&gt;
    [&amp;quot;⅚&amp;quot;] = &amp;quot;.833&amp;quot;,&lt;br /&gt;
    [&amp;quot;⅛&amp;quot;] = &amp;quot;.125&amp;quot;,&lt;br /&gt;
    [&amp;quot;⅜&amp;quot;] = &amp;quot;.375&amp;quot;,&lt;br /&gt;
    [&amp;quot;⅝&amp;quot;] = &amp;quot;.625&amp;quot;,&lt;br /&gt;
    [&amp;quot;⅞&amp;quot;] = &amp;quot;.875&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
-- Normalize fractions like &amp;quot;1½&amp;quot; to &amp;quot;1.5&amp;quot;&lt;br /&gt;
local function normalizeFractions(s)&lt;br /&gt;
    -- Replace integer + fraction (e.g. &amp;quot;1½&amp;quot; → &amp;quot;1.5&amp;quot;)&lt;br /&gt;
    s =&lt;br /&gt;
        s:gsub(&lt;br /&gt;
        &amp;quot;(%d+)%s*([%z\1-\127\194-\244][\128-\191]*)&amp;quot;,&lt;br /&gt;
        function(d, frac)&lt;br /&gt;
            local repl = fraction_map[frac]&lt;br /&gt;
            if repl then&lt;br /&gt;
                return d .. repl&lt;br /&gt;
            else&lt;br /&gt;
                return d .. frac&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    )&lt;br /&gt;
&lt;br /&gt;
    -- Replace standalone fraction (e.g. &amp;quot;½&amp;quot; → &amp;quot;0.5&amp;quot;)&lt;br /&gt;
    s =&lt;br /&gt;
        s:gsub(&lt;br /&gt;
        &amp;quot;([%z\1-\127\194-\244][\128-\191]*)&amp;quot;,&lt;br /&gt;
        function(frac)&lt;br /&gt;
            local repl = fraction_map[frac]&lt;br /&gt;
            if repl then&lt;br /&gt;
                return &amp;quot;0&amp;quot; .. repl&lt;br /&gt;
            else&lt;br /&gt;
                return frac&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    )&lt;br /&gt;
&lt;br /&gt;
    return s&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Leading integer from a value; supports string or number; nil if none.&lt;br /&gt;
local function numlead(v)&lt;br /&gt;
    if v == nil then&lt;br /&gt;
        return nil&lt;br /&gt;
    end&lt;br /&gt;
    if type(v) == &amp;quot;number&amp;quot; then&lt;br /&gt;
        return v&lt;br /&gt;
    end&lt;br /&gt;
    local s = tostring(v)&lt;br /&gt;
    if s == &amp;quot;&amp;quot; then&lt;br /&gt;
        return nil&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    -- 1) strip leading spaces and wiki bold/italic quotes (&#039;&#039; or &#039;&#039;&#039;)&lt;br /&gt;
    s = s:match(&amp;quot;^%s*&#039;*%s*(.*)&amp;quot;) or s&lt;br /&gt;
&lt;br /&gt;
    -- 2) strip *leading* simple wrappers (tags/templates/links), repeatedly, but only if they occur before the first digit.&lt;br /&gt;
    local advanced = true -- set false if you want the minimal version&lt;br /&gt;
    if advanced then&lt;br /&gt;
        local changed = true&lt;br /&gt;
        while changed do&lt;br /&gt;
            changed = false&lt;br /&gt;
            local s2 = s:gsub(&amp;quot;^%s*&amp;lt;[^&amp;gt;]-&amp;gt;%s*&amp;quot;, &amp;quot;&amp;quot;, 1) -- leading HTML tag&lt;br /&gt;
            if s2 ~= s then&lt;br /&gt;
                s, changed = s2, true&lt;br /&gt;
            end&lt;br /&gt;
            s2 = s:gsub(&amp;quot;^%s*{{.-}}%s*&amp;quot;, &amp;quot;&amp;quot;, 1) -- leading template&lt;br /&gt;
            if s2 ~= s then&lt;br /&gt;
                s, changed = s2, true&lt;br /&gt;
            end&lt;br /&gt;
            s2 = s:gsub(&amp;quot;^%s*%[%[[^%]]-%]%]%s*&amp;quot;, &amp;quot;&amp;quot;, 1) -- leading wikilink&lt;br /&gt;
            if s2 ~= s then&lt;br /&gt;
                s, changed = s2, true&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    -- 3) capture leading digits only (stops at first non-digit)&lt;br /&gt;
    s = normalizeFractions(s)&lt;br /&gt;
    local n = s:match(&amp;quot;^(%d+%.?%d*)&amp;quot;)&lt;br /&gt;
    return n and tonumber(n) or nil&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- ===========================&lt;br /&gt;
-- 4) MATCH GROUPING (PER RD)&lt;br /&gt;
-- ===========================&lt;br /&gt;
local function _matchGroups()&lt;br /&gt;
    state.matchgroup = state.matchgroup or {}&lt;br /&gt;
    local MINC, C, R = config.minc, config.c, config.r&lt;br /&gt;
    for j = MINC, C do&lt;br /&gt;
        local mgj = {}&lt;br /&gt;
        state.matchgroup[j] = mgj&lt;br /&gt;
&lt;br /&gt;
        local tpm = tonumber(state.teamsPerMatch[j]) or 2&lt;br /&gt;
        if tpm &amp;lt; 1 then&lt;br /&gt;
            tpm = 2&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        local col = state.entries[j]&lt;br /&gt;
        if col then&lt;br /&gt;
            for i = 1, R do&lt;br /&gt;
                local e = col[i]&lt;br /&gt;
                if e and e.ctype == &amp;quot;team&amp;quot; then&lt;br /&gt;
                    local idx = tonumber(e.index) or tonumber(e.altindex) or i&lt;br /&gt;
                    local g = m_ceil(idx / tpm)&lt;br /&gt;
                    mgj[i] = g&lt;br /&gt;
                    e.group = g&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Build ordered lists once per round: gid -&amp;gt; {row indices}&lt;br /&gt;
local function buildGroupsForRound(j, R)&lt;br /&gt;
    local groups = {}&lt;br /&gt;
    local mg = (state.matchgroup and state.matchgroup[j]) or {}&lt;br /&gt;
    local col = state.entries[j]&lt;br /&gt;
    if not col then&lt;br /&gt;
        return groups&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    for i = 1, R do&lt;br /&gt;
        local e = col[i]&lt;br /&gt;
        if e and e.ctype == &amp;quot;team&amp;quot; then&lt;br /&gt;
            local gid = mg[i]&lt;br /&gt;
            if gid ~= nil then&lt;br /&gt;
                local t = groups[gid]&lt;br /&gt;
                if not t then&lt;br /&gt;
                    t = {}&lt;br /&gt;
                    groups[gid] = t&lt;br /&gt;
                end&lt;br /&gt;
                t[#t + 1] = i&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return groups&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Pre-parse leg numbers for each team (per round), only when agg &amp;amp; &amp;gt;1 legs.&lt;br /&gt;
-- Returns: i -&amp;gt; { [l] = number|nil }&lt;br /&gt;
local function preparseLegs(j, R)&lt;br /&gt;
    local legNums = {}&lt;br /&gt;
    local col = state.entries[j]&lt;br /&gt;
    if not col then&lt;br /&gt;
        return legNums&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    for i = 1, R do&lt;br /&gt;
        local e = col[i]&lt;br /&gt;
        if e and e.ctype == &amp;quot;team&amp;quot; then&lt;br /&gt;
            local L = teamLegs(j, i)&lt;br /&gt;
            if config.aggregate and L &amp;gt; 1 and e.score then&lt;br /&gt;
                local t = {}&lt;br /&gt;
                for l = 1, L do&lt;br /&gt;
                    t[l] = numlead(e.score[l])&lt;br /&gt;
                end&lt;br /&gt;
                legNums[i] = t&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return legNums&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- ==========================================&lt;br /&gt;
-- 5) COMPUTE AGGREGATES (score/legs/sets)&lt;br /&gt;
-- ==========================================&lt;br /&gt;
local function _computeAggregate()&lt;br /&gt;
    if config.aggregate_mode == &amp;quot;off&amp;quot; or config.aggregate_mode == &amp;quot;manual&amp;quot; then&lt;br /&gt;
        return&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local MINC, C, R = config.minc, config.c, config.r&lt;br /&gt;
    local modeLow = (config.boldwinner_mode == &amp;quot;low&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    for j = MINC, C do&lt;br /&gt;
        local groups = buildGroupsForRound(j, R)&lt;br /&gt;
        local legNums = preparseLegs(j, R)&lt;br /&gt;
&lt;br /&gt;
        if config.aggregate_mode == &amp;quot;score&amp;quot; then&lt;br /&gt;
            -- Sum per-leg scores; operate directly on parsed legNums.&lt;br /&gt;
            for i, nums in pairs(legNums) do&lt;br /&gt;
                local e = state.entries[j][i]&lt;br /&gt;
                if e and e.ctype == &amp;quot;team&amp;quot; and config.aggregate and teamLegs(j, i) &amp;gt; 1 then&lt;br /&gt;
                    local sc = e.score&lt;br /&gt;
                    if sc and isempty(sc.agg) then&lt;br /&gt;
                        local sum = 0&lt;br /&gt;
                        for _, v in ipairs(nums) do&lt;br /&gt;
                            if v then&lt;br /&gt;
                                sum = sum + v&lt;br /&gt;
                            end&lt;br /&gt;
                        end&lt;br /&gt;
                        sc.agg = tostring(sum)&lt;br /&gt;
                    end&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
        else&lt;br /&gt;
            -- &#039;sets&#039;/&#039;legs&#039;: count wins per-leg using high/low rule; ties yield no win.&lt;br /&gt;
            for _, members in pairs(groups) do&lt;br /&gt;
                local wins = {} -- row index -&amp;gt; wins&lt;br /&gt;
&lt;br /&gt;
                -- Comparable leg count across the group = min(#numeric arrays)&lt;br /&gt;
                local commonLegs = math.huge&lt;br /&gt;
                for _, i in ipairs(members) do&lt;br /&gt;
                    local nums = legNums[i]&lt;br /&gt;
                    local L = (nums and #nums) or 0&lt;br /&gt;
                    if L == 0 then&lt;br /&gt;
                        commonLegs = 0&lt;br /&gt;
                        break&lt;br /&gt;
                    end&lt;br /&gt;
                    if L &amp;lt; commonLegs then&lt;br /&gt;
                        commonLegs = L&lt;br /&gt;
                    end&lt;br /&gt;
                end&lt;br /&gt;
&lt;br /&gt;
                for l = 1, commonLegs do&lt;br /&gt;
                    local allNumeric = true&lt;br /&gt;
                    for _, i in ipairs(members) do&lt;br /&gt;
                        local v = legNums[i] and legNums[i][l]&lt;br /&gt;
                        if v == nil then&lt;br /&gt;
                            allNumeric = false&lt;br /&gt;
                            break&lt;br /&gt;
                        end&lt;br /&gt;
                    end&lt;br /&gt;
                    if allNumeric then&lt;br /&gt;
                        local best, bestIdx, tie&lt;br /&gt;
                        for _, i in ipairs(members) do&lt;br /&gt;
                            local v = legNums[i][l]&lt;br /&gt;
                            if best == nil then&lt;br /&gt;
                                best, bestIdx, tie = v, i, false&lt;br /&gt;
                            else&lt;br /&gt;
                                if (modeLow and v &amp;lt; best) or (not modeLow and v &amp;gt; best) then&lt;br /&gt;
                                    best, bestIdx, tie = v, i, false&lt;br /&gt;
                                elseif v == best then&lt;br /&gt;
                                    tie = true&lt;br /&gt;
                                end&lt;br /&gt;
                            end&lt;br /&gt;
                        end&lt;br /&gt;
                        if not tie and bestIdx then&lt;br /&gt;
                            wins[bestIdx] = (wins[bestIdx] or 0) + 1&lt;br /&gt;
                        end&lt;br /&gt;
                    end&lt;br /&gt;
                end&lt;br /&gt;
&lt;br /&gt;
                -- Write aggregates if still empty&lt;br /&gt;
                for _, i in ipairs(members) do&lt;br /&gt;
                    local e = state.entries[j][i]&lt;br /&gt;
                    if e and e.ctype == &amp;quot;team&amp;quot; and config.aggregate and teamLegs(j, i) &amp;gt; 1 then&lt;br /&gt;
                        local sc = e.score&lt;br /&gt;
                        if sc and isempty(sc.agg) then&lt;br /&gt;
                            sc.agg = tostring(wins[i] or 0)&lt;br /&gt;
                        end&lt;br /&gt;
                    end&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- ==========================================&lt;br /&gt;
-- 6) BOLD WINNERS (per cells &amp;amp; whole rows)&lt;br /&gt;
-- ==========================================&lt;br /&gt;
local function _boldWinner()&lt;br /&gt;
    local function isWin(mine, theirs)&lt;br /&gt;
        return modeLow and (mine &amp;lt; theirs) or (not modeLow and mine &amp;gt; theirs)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local function isAggWin(mine, theirs, colKey)&lt;br /&gt;
        -- For aggregate counts (legs/sets won), higher is always better&lt;br /&gt;
        if colKey == &amp;quot;agg&amp;quot; and (config.aggregate_mode ~= &amp;quot;score&amp;quot;) then&lt;br /&gt;
            return mine &amp;gt; theirs&lt;br /&gt;
        end&lt;br /&gt;
        return isWin(mine, theirs)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if not config or config.boldwinner_mode == &amp;quot;off&amp;quot; then&lt;br /&gt;
        -- Normalize all weights (defensive; avoids leftovers across calls)&lt;br /&gt;
        for j = config.minc, config.c do&lt;br /&gt;
            for i = 1, config.r do&lt;br /&gt;
                local e = state.entries[j] and state.entries[j][i]&lt;br /&gt;
                if e and e.ctype == &amp;quot;team&amp;quot; then&lt;br /&gt;
                    e.weight = &amp;quot;normal&amp;quot;&lt;br /&gt;
                    if e.score and e.score.weight then&lt;br /&gt;
                        for k, _ in pairs(e.score.weight) do&lt;br /&gt;
                            e.score.weight[k] = &amp;quot;normal&amp;quot;&lt;br /&gt;
                        end&lt;br /&gt;
                    end&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
        return&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local MINC, C, R = config.minc, config.c, config.r&lt;br /&gt;
    local modeLow = (config.boldwinner_mode == &amp;quot;low&amp;quot;)&lt;br /&gt;
    local aggOnly = config.boldwinner_aggonly&lt;br /&gt;
&lt;br /&gt;
    local function isWin(mine, theirs)&lt;br /&gt;
        return modeLow and (mine &amp;lt; theirs) or (not modeLow and mine &amp;gt; theirs)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local function isAggWin(mine, theirs, colKey)&lt;br /&gt;
        if colKey == &amp;quot;agg&amp;quot; and config.aggregate_mode == &amp;quot;sets&amp;quot; then&lt;br /&gt;
            -- Sets/legs won: larger count wins regardless of low/high sport&lt;br /&gt;
            return mine &amp;gt; theirs&lt;br /&gt;
        end&lt;br /&gt;
        return isWin(mine, theirs)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local function hasAllScores(e, legs)&lt;br /&gt;
        local sc = e.score&lt;br /&gt;
        for l = 1, legs do&lt;br /&gt;
            local sv = sc and sc[l]&lt;br /&gt;
            if isempty(sv) or s_find(sv or &amp;quot;&amp;quot;, &amp;quot;nbsp&amp;quot;) then -- use alias&lt;br /&gt;
                return false&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
        return true&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    for j = MINC, C do&lt;br /&gt;
        local groups = buildGroupsForRound(j, R)&lt;br /&gt;
&lt;br /&gt;
        -- Reset counters &amp;amp; ensure score/weight tables exist&lt;br /&gt;
        for i = 1, R do&lt;br /&gt;
            local e = state.entries[j] and state.entries[j][i]&lt;br /&gt;
            if e and e.ctype == &amp;quot;team&amp;quot; then&lt;br /&gt;
                e.wins, e.aggwins = 0, 0&lt;br /&gt;
                e.score = e.score or {}&lt;br /&gt;
                e.score.weight = e.score.weight or {}&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        for _, members in pairs(groups) do&lt;br /&gt;
            -- Parse per-leg and aggregate numbers ONCE for this group (works for 1+ legs)&lt;br /&gt;
            local perLegNum = {} -- row -&amp;gt; { l -&amp;gt; number|nil }&lt;br /&gt;
            local aggNum = {} -- row -&amp;gt; number|nil&lt;br /&gt;
&lt;br /&gt;
            for _, i in ipairs(members) do&lt;br /&gt;
                local e = state.entries[j][i]&lt;br /&gt;
                local legs = teamLegs(j, i)&lt;br /&gt;
                local arr = {}&lt;br /&gt;
                for l = 1, legs do&lt;br /&gt;
                    arr[l] = numlead(e.score and e.score[l])&lt;br /&gt;
                end&lt;br /&gt;
                perLegNum[i] = arr&lt;br /&gt;
                aggNum[i] = numlead(e.score and e.score.agg)&lt;br /&gt;
            end&lt;br /&gt;
&lt;br /&gt;
            -- Per-score bolding (skip entirely if agg-only)&lt;br /&gt;
            if not aggOnly then&lt;br /&gt;
                -- iterate to the max leg count in the group&lt;br /&gt;
                local maxL = 0&lt;br /&gt;
                for _, i in ipairs(members) do&lt;br /&gt;
                    local L = teamLegs(j, i)&lt;br /&gt;
                    if L &amp;gt; maxL then&lt;br /&gt;
                        maxL = L&lt;br /&gt;
                    end&lt;br /&gt;
                end&lt;br /&gt;
&lt;br /&gt;
                for l = 1, maxL do&lt;br /&gt;
                    local allNumeric = true&lt;br /&gt;
                    local best, bestIdx, tie&lt;br /&gt;
                    for _, i in ipairs(members) do&lt;br /&gt;
                        local v = perLegNum[i] and perLegNum[i][l]&lt;br /&gt;
                        if v == nil then&lt;br /&gt;
                            allNumeric = false&lt;br /&gt;
                            break&lt;br /&gt;
                        end&lt;br /&gt;
                        if best == nil then&lt;br /&gt;
                            best, bestIdx, tie = v, i, false&lt;br /&gt;
                        else&lt;br /&gt;
                            if (modeLow and v &amp;lt; best) or (not modeLow and v &amp;gt; best) then&lt;br /&gt;
                                best, bestIdx, tie = v, i, false&lt;br /&gt;
                            elseif v == best then&lt;br /&gt;
                                tie = true&lt;br /&gt;
                            end&lt;br /&gt;
                        end&lt;br /&gt;
                    end&lt;br /&gt;
&lt;br /&gt;
                    if allNumeric and not tie and bestIdx then&lt;br /&gt;
                        -- set the winner bold + increment wins&lt;br /&gt;
                        local e = state.entries[j][bestIdx]&lt;br /&gt;
                        e.score.weight[l] = &amp;quot;bold&amp;quot;&lt;br /&gt;
                        e.wins = (e.wins or 0) + 1&lt;br /&gt;
                        -- normalize others on this leg&lt;br /&gt;
                        for _, i in ipairs(members) do&lt;br /&gt;
                            if i ~= bestIdx then&lt;br /&gt;
                                state.entries[j][i].score.weight[l] = &amp;quot;normal&amp;quot;&lt;br /&gt;
                            end&lt;br /&gt;
                        end&lt;br /&gt;
                    else&lt;br /&gt;
                        -- no unique winner: normalize everyone for this leg&lt;br /&gt;
                        for _, i in ipairs(members) do&lt;br /&gt;
                            state.entries[j][i].score.weight[l] = &amp;quot;normal&amp;quot;&lt;br /&gt;
                        end&lt;br /&gt;
                    end&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
&lt;br /&gt;
            -- Aggregate column (if configured &amp;amp; multi-leg)&lt;br /&gt;
            do&lt;br /&gt;
                local needAgg = false&lt;br /&gt;
                for _, i in ipairs(members) do&lt;br /&gt;
                    if config.aggregate and teamLegs(j, i) &amp;gt; 1 then&lt;br /&gt;
                        needAgg = true&lt;br /&gt;
                        break&lt;br /&gt;
                    end&lt;br /&gt;
                end&lt;br /&gt;
&lt;br /&gt;
                if needAgg then&lt;br /&gt;
                    local allNumeric = true&lt;br /&gt;
                    local best, bestIdx, tie&lt;br /&gt;
&lt;br /&gt;
                    -- comparator: for legs/sets counts, higher always wins&lt;br /&gt;
                    local function betterAgg(a, b)&lt;br /&gt;
                        if config.aggregate_mode ~= &amp;quot;score&amp;quot; then&lt;br /&gt;
                            return a &amp;gt; b&lt;br /&gt;
                        else&lt;br /&gt;
                            return (modeLow and a &amp;lt; b) or (not modeLow and a &amp;gt; b)&lt;br /&gt;
                        end&lt;br /&gt;
                    end&lt;br /&gt;
&lt;br /&gt;
                    for _, i in ipairs(members) do&lt;br /&gt;
                        local v = aggNum[i]&lt;br /&gt;
                        if v == nil then&lt;br /&gt;
                            allNumeric = false&lt;br /&gt;
                            break&lt;br /&gt;
                        end&lt;br /&gt;
                        if best == nil then&lt;br /&gt;
                            best, bestIdx, tie = v, i, false&lt;br /&gt;
                        else&lt;br /&gt;
                            if betterAgg(v, best) then&lt;br /&gt;
                                best, bestIdx, tie = v, i, false&lt;br /&gt;
                            elseif v == best then&lt;br /&gt;
                                tie = true&lt;br /&gt;
                            end&lt;br /&gt;
                        end&lt;br /&gt;
                    end&lt;br /&gt;
&lt;br /&gt;
                    if allNumeric and not tie and bestIdx then&lt;br /&gt;
                        local e = state.entries[j][bestIdx]&lt;br /&gt;
                        e.score.weight.agg = &amp;quot;bold&amp;quot;&lt;br /&gt;
                        e.aggwins = 1&lt;br /&gt;
                        for _, i in ipairs(members) do&lt;br /&gt;
                            if i ~= bestIdx then&lt;br /&gt;
                                local o = state.entries[j][i]&lt;br /&gt;
                                o.score.weight.agg = &amp;quot;normal&amp;quot;&lt;br /&gt;
                                o.aggwins = 0&lt;br /&gt;
                            end&lt;br /&gt;
                        end&lt;br /&gt;
                    else&lt;br /&gt;
                        for _, i in ipairs(members) do&lt;br /&gt;
                            local e = state.entries[j][i]&lt;br /&gt;
                            if e.score then&lt;br /&gt;
                                e.score.weight.agg = &amp;quot;normal&amp;quot;&lt;br /&gt;
                            end&lt;br /&gt;
                            e.aggwins = 0&lt;br /&gt;
                        end&lt;br /&gt;
                    end&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
&lt;br /&gt;
            -- Whole-team bolding (skip if agg-only so only agg cell bolds)&lt;br /&gt;
            if not aggOnly then&lt;br /&gt;
                for _, i in ipairs(members) do&lt;br /&gt;
                    local e = state.entries[j][i]&lt;br /&gt;
                    local legs = teamLegs(j, i)&lt;br /&gt;
                    local useAggregate = config.aggregate and legs &amp;gt; 1&lt;br /&gt;
                    local winsKey = useAggregate and &amp;quot;aggwins&amp;quot; or &amp;quot;wins&amp;quot;&lt;br /&gt;
&lt;br /&gt;
                    if not useAggregate then&lt;br /&gt;
                        if (e[winsKey] or 0) &amp;gt; legs / 2 then&lt;br /&gt;
                            e.weight = &amp;quot;bold&amp;quot;&lt;br /&gt;
                        else&lt;br /&gt;
                            e.weight = hasAllScores(e, legs) and &amp;quot;bold&amp;quot; or &amp;quot;normal&amp;quot;&lt;br /&gt;
                        end&lt;br /&gt;
                    end&lt;br /&gt;
&lt;br /&gt;
                    -- Must strictly beat any opponent on winsKey&lt;br /&gt;
                    for _, oi in ipairs(members) do&lt;br /&gt;
                        if oi ~= i then&lt;br /&gt;
                            local opp = state.entries[j][oi]&lt;br /&gt;
                            if (e[winsKey] or 0) &amp;lt;= tonumber(opp[winsKey] or 0) then&lt;br /&gt;
                                e.weight = &amp;quot;normal&amp;quot;&lt;br /&gt;
                                break&lt;br /&gt;
                            end&lt;br /&gt;
                        end&lt;br /&gt;
                    end&lt;br /&gt;
&lt;br /&gt;
                    if useAggregate then&lt;br /&gt;
                        -- when using aggregate, team weight follows aggwins comparison&lt;br /&gt;
                        e.weight = ((e[winsKey] or 0) &amp;gt; 0) and &amp;quot;bold&amp;quot; or &amp;quot;normal&amp;quot;&lt;br /&gt;
                        for _, oi in ipairs(members) do&lt;br /&gt;
                            if oi ~= i then&lt;br /&gt;
                                local opp = state.entries[j][oi]&lt;br /&gt;
                                if (e[winsKey] or 0) &amp;lt;= tonumber(opp[winsKey] or 0) then&lt;br /&gt;
                                    e.weight = &amp;quot;normal&amp;quot;&lt;br /&gt;
                                    break&lt;br /&gt;
                                end&lt;br /&gt;
                            end&lt;br /&gt;
                        end&lt;br /&gt;
                    end&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- ==============================&lt;br /&gt;
-- 7) UPDATE PER-ROUND MAX LEGS&lt;br /&gt;
-- ==============================&lt;br /&gt;
local function _updateMaxLegs()&lt;br /&gt;
    local MINC, C, R = config.minc, config.c, config.r&lt;br /&gt;
    for j = MINC, C do&lt;br /&gt;
        local col = state.entries[j]&lt;br /&gt;
        local rj = state.rlegs[j]&lt;br /&gt;
        local mj = rj&lt;br /&gt;
        if col then&lt;br /&gt;
            for i = 1, R do&lt;br /&gt;
                local e = col[i]&lt;br /&gt;
                if e then&lt;br /&gt;
                    if notempty(e.legs) then&lt;br /&gt;
                        mj = m_max(rj, e.legs)&lt;br /&gt;
                    end&lt;br /&gt;
                    if config.autolegs and e.score then&lt;br /&gt;
                        local l = 1&lt;br /&gt;
                        while e.score[l] and not isempty(e.score[l]) do&lt;br /&gt;
                            l = l + 1&lt;br /&gt;
                        end&lt;br /&gt;
                        mj = m_max(mj, l - 1)&lt;br /&gt;
                    end&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
        state.maxlegs[j] = mj&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- ==============&lt;br /&gt;
-- 8) PUBLIC API&lt;br /&gt;
-- ==============&lt;br /&gt;
function Logic.matchGroups(_state, _config)&lt;br /&gt;
    bind(_state, _config)&lt;br /&gt;
    _matchGroups()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Logic.computeAggregate(_state, _config, _Helpers, _StateChecks)&lt;br /&gt;
    bind(_state, _config, _Helpers, _StateChecks)&lt;br /&gt;
    _computeAggregate()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Logic.boldWinner(_state, _config, _Helpers, _StateChecks)&lt;br /&gt;
    bind(_state, _config, _Helpers, _StateChecks)&lt;br /&gt;
    _boldWinner()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Logic.updateMaxLegs(_state, _config, _Helpers)&lt;br /&gt;
    bind(_state, _config, _Helpers)&lt;br /&gt;
    _updateMaxLegs()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return Logic&lt;/div&gt;</summary>
		<author><name>Osarius</name></author>
	</entry>
	<entry>
		<id>https://nssportwiki.com/index.php?title=Module:Build_bracket/Paths&amp;diff=76412</id>
		<title>Module:Build bracket/Paths</title>
		<link rel="alternate" type="text/html" href="https://nssportwiki.com/index.php?title=Module:Build_bracket/Paths&amp;diff=76412"/>
		<updated>2026-07-24T10:50:38Z</updated>

		<summary type="html">&lt;p&gt;Osarius: 1 revision imported&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local Paths = {}&lt;br /&gt;
&lt;br /&gt;
-- ==============================&lt;br /&gt;
-- 1) MODULE STATE &amp;amp; HOT HELPERS&lt;br /&gt;
-- ==============================&lt;br /&gt;
local _pathsCache = {} -- memo for parsePaths during one build&lt;br /&gt;
local t_insert = table.insert -- stdlib alias&lt;br /&gt;
local mmin, mmax = math.min, math.max&lt;br /&gt;
&lt;br /&gt;
-- upvalues bound per call (set in bind)&lt;br /&gt;
local state, config, Helpers, StateChecks&lt;br /&gt;
local split, notempty, bargs, getFArg, isBlankEntry&lt;br /&gt;
local defaultColor&lt;br /&gt;
&lt;br /&gt;
local showByeOn = true -- toggle for bye through-lines&lt;br /&gt;
local base = 0 -- left-round base offset&lt;br /&gt;
&lt;br /&gt;
-- cache for per-round “RDx-RDy-path” OFF flags&lt;br /&gt;
local rdGateOff = {}&lt;br /&gt;
&lt;br /&gt;
-- thickness constants: renderer maps 1.0 =&amp;gt; 2px, 0.5 =&amp;gt; 1px&lt;br /&gt;
local STRONG = 1.0&lt;br /&gt;
local FEATHER = 0.5&lt;br /&gt;
&lt;br /&gt;
-- Small helpers&lt;br /&gt;
local function tpmOf(col) -- teams per match for a given team column&lt;br /&gt;
    return (state.teamsPerMatch and state.teamsPerMatch[col]) or 2&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function entries(col) -- convenience accessor&lt;br /&gt;
    return state.entries and state.entries[col]&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function clearPathsCache() -- reset parse cache each build&lt;br /&gt;
    _pathsCache = {}&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function origJ(j) -- external round index from internal j&lt;br /&gt;
    return j + base&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- ===================&lt;br /&gt;
-- 2) ROW/COLUMN MATH&lt;br /&gt;
-- ===================&lt;br /&gt;
local function rowOf(j, m)&lt;br /&gt;
    local sj = (state.shift and state.shift[j]) or 0&lt;br /&gt;
    local tpm = tpmOf(j)&lt;br /&gt;
    -- map match index m to internal row for team slot center&lt;br /&gt;
    return 2 * (m + sj) + (tpm - 2)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- ============================&lt;br /&gt;
-- 3) BIND + ARG/CONFIG WIRING&lt;br /&gt;
-- ============================&lt;br /&gt;
local function bind(_state, _config, _Helpers, _StateChecks)&lt;br /&gt;
    state, config, Helpers, StateChecks = _state, _config, _Helpers, _StateChecks&lt;br /&gt;
    split, notempty, bargs, getFArg = _Helpers.split, _Helpers.notempty, _Helpers.bargs, _Helpers.getFArg&lt;br /&gt;
    isBlankEntry = _StateChecks.isBlankEntry&lt;br /&gt;
&lt;br /&gt;
    defaultColor = (config.COLORS and config.COLORS.path_line_color) or &amp;quot;gray&amp;quot;&lt;br /&gt;
    base = config.base or 0&lt;br /&gt;
&lt;br /&gt;
    -- cache bye toggle once&lt;br /&gt;
    local v = (_Helpers.bargs and _Helpers.bargs(&amp;quot;show-bye-paths&amp;quot;)) or &amp;quot;&amp;quot;&lt;br /&gt;
    showByeOn = not Helpers.no(v)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Precompute RD gate flags once per build (RDx-RDy-path = &amp;quot;no&amp;quot; means gate ON =&amp;gt; block)&lt;br /&gt;
local function computeRoundGates()&lt;br /&gt;
    rdGateOff = {}&lt;br /&gt;
    for j = config.minc, config.c - 1 do&lt;br /&gt;
        local rd = (bargs((&amp;quot;RD%d-RD%d-path&amp;quot;):format(origJ(j), origJ(j) + 1)) or &amp;quot;&amp;quot;):lower()&lt;br /&gt;
        rdGateOff[j] = Helpers.no(rd)&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- ========================&lt;br /&gt;
-- 4) PATH PARSING + CACHE&lt;br /&gt;
-- ========================&lt;br /&gt;
local function parsePaths(j)&lt;br /&gt;
    local cached = _pathsCache[j]&lt;br /&gt;
    if cached then&lt;br /&gt;
        return cached&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local oj = origJ(j)&lt;br /&gt;
    local str = (getFArg(&amp;quot;col&amp;quot; .. oj .. &amp;quot;-col&amp;quot; .. (oj + 1) .. &amp;quot;-paths&amp;quot;) or &amp;quot;&amp;quot;):gsub(&amp;quot;%s+&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
    local result = {}&lt;br /&gt;
&lt;br /&gt;
    -- grammar: (a,b- c:d, e:f - color1,color2,...) etc.&lt;br /&gt;
    for val in str:gsub(&amp;quot;,&amp;quot;, &amp;quot;, &amp;quot;):gsub(&amp;quot;%S+&amp;quot;, &amp;quot;\0%0\0&amp;quot;):gsub(&lt;br /&gt;
        &amp;quot;%b()&amp;quot;,&lt;br /&gt;
        function(s)&lt;br /&gt;
            return s:gsub(&amp;quot;%z&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
        end&lt;br /&gt;
    ):gmatch(&amp;quot;%z(.-)%z&amp;quot;) do&lt;br /&gt;
        -- strip parens once, split once&lt;br /&gt;
        local array = split(val:gsub(&amp;quot;[()]&amp;quot;, &amp;quot;&amp;quot;), {&amp;quot;-&amp;quot;})&lt;br /&gt;
        for k, _ in ipairs(array) do&lt;br /&gt;
            array[k] = split(array[k], {&amp;quot;,&amp;quot;})&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        if notempty(array[2]) then&lt;br /&gt;
            array[3] = array[3] or {}&lt;br /&gt;
            for m = 1, #array[2] do&lt;br /&gt;
                local pair = split(array[2][m], {&amp;quot;:&amp;quot;})&lt;br /&gt;
                array[2][m] = pair[1]&lt;br /&gt;
                array[3][m] = pair[2]&lt;br /&gt;
            end&lt;br /&gt;
            for n = 1, #array[1] do&lt;br /&gt;
                local a = tonumber(array[1][n])&lt;br /&gt;
                for m = 1, #array[2] do&lt;br /&gt;
                    t_insert(result, {a, tonumber(array[2][m]), color = array[3][m]})&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    _pathsCache[j] = result&lt;br /&gt;
    return result&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- ==============================&lt;br /&gt;
-- 5) STRUCTURAL READS &amp;amp; WINDOWS&lt;br /&gt;
-- ==============================&lt;br /&gt;
-- Through-line mask that already exists in a team column (from a previous step)&lt;br /&gt;
local function throughEdgesMaskAt(teamCol, sRow)&lt;br /&gt;
    local e = entries(teamCol)&lt;br /&gt;
    if not e then&lt;br /&gt;
        return false, false&lt;br /&gt;
    end&lt;br /&gt;
    local hasBottom =&lt;br /&gt;
        (sRow - 1 &amp;gt;= 1) and e[sRow - 1] and e[sRow - 1].ctype == &amp;quot;line&amp;quot; and&lt;br /&gt;
        (e[sRow - 1].border == &amp;quot;bottom&amp;quot; or e[sRow - 1].border == &amp;quot;both&amp;quot;)&lt;br /&gt;
    local hasTop =&lt;br /&gt;
        (sRow + 1 &amp;lt;= config.r) and e[sRow + 1] and e[sRow + 1].ctype == &amp;quot;line&amp;quot; and&lt;br /&gt;
        (e[sRow + 1].border == &amp;quot;top&amp;quot; or e[sRow + 1].border == &amp;quot;both&amp;quot;)&lt;br /&gt;
    return hasBottom, hasTop&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- window = the block of rows that constitutes a match near sRow&lt;br /&gt;
local function matchWindow(col, sRow)&lt;br /&gt;
    local tpm = tpmOf(col)&lt;br /&gt;
    local half = 2 * (tpm - 1) -- distance to top/bottom team rows&lt;br /&gt;
    local lo = mmax(1, sRow - half)&lt;br /&gt;
    local hi = mmin(config.r, sRow + half)&lt;br /&gt;
    return lo, hi, tpm&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Single-pass scan: returns hasTeam, headerIndex (or nil), allTeamsBlank&lt;br /&gt;
local function scanWindow(col, sRow)&lt;br /&gt;
    local ent = entries(col)&lt;br /&gt;
    if not ent then&lt;br /&gt;
        return false, nil, true&lt;br /&gt;
    end&lt;br /&gt;
    local lo, hi = matchWindow(col, sRow)&lt;br /&gt;
    local hidx, hasTeam = nil, false&lt;br /&gt;
    local allBlank = true&lt;br /&gt;
    for r = lo, hi do&lt;br /&gt;
        local e = ent[r]&lt;br /&gt;
        if e then&lt;br /&gt;
            if not hidx and e.headerindex then&lt;br /&gt;
                hidx = e.headerindex&lt;br /&gt;
            end&lt;br /&gt;
            if e.ctype == &amp;quot;team&amp;quot; then&lt;br /&gt;
                hasTeam = true&lt;br /&gt;
                if allBlank and not isBlankEntry(col, r) then&lt;br /&gt;
                    allBlank = false&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return hasTeam, hidx, allBlank&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- =================================&lt;br /&gt;
-- 6) SLOT DISPOSITION / VISIBILITY&lt;br /&gt;
-- =================================&lt;br /&gt;
local slotDisp  -- j -&amp;gt; sRow -&amp;gt; &#039;visible&#039; | &#039;through&#039; | &#039;suppress&#039;&lt;br /&gt;
&lt;br /&gt;
local function computeSlotDispositions()&lt;br /&gt;
    slotDisp = {}&lt;br /&gt;
    local minc, c = config.minc, config.c&lt;br /&gt;
    local R = mmax(1, (config.r or 1) - 1)&lt;br /&gt;
&lt;br /&gt;
    for j = minc, c do&lt;br /&gt;
        local sdj = {}&lt;br /&gt;
        slotDisp[j] = sdj&lt;br /&gt;
        for sRow = 1, R do&lt;br /&gt;
            local hasTeam, hidx, allBlank = scanWindow(j, sRow)&lt;br /&gt;
&lt;br /&gt;
            if not hasTeam then&lt;br /&gt;
                sdj[sRow] = (j &amp;gt; minc and j &amp;lt; c) and &amp;quot;through&amp;quot; or &amp;quot;suppress&amp;quot;&lt;br /&gt;
            else&lt;br /&gt;
                local disp = &amp;quot;visible&amp;quot;&lt;br /&gt;
                if hidx then&lt;br /&gt;
                    local hid = state.hide and state.hide[j] and state.hide[j][hidx]&lt;br /&gt;
                    local byes = state.byes and state.byes[j] and state.byes[j][hidx]&lt;br /&gt;
                    if hid then&lt;br /&gt;
                        disp = &amp;quot;suppress&amp;quot;&lt;br /&gt;
                    elseif byes and allBlank then&lt;br /&gt;
                        disp = (showByeOn and j &amp;gt; minc and j &amp;lt; c) and &amp;quot;through&amp;quot; or &amp;quot;suppress&amp;quot;&lt;br /&gt;
                    end&lt;br /&gt;
                end&lt;br /&gt;
                sdj[sRow] = disp&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function dispositionOf(j, sRow) -- on-demand fallback&lt;br /&gt;
    local sdj = slotDisp and slotDisp[j]&lt;br /&gt;
    if sdj and sdj[sRow] then&lt;br /&gt;
        return sdj[sRow]&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local _, hidx, allBlank = scanWindow(j, sRow)&lt;br /&gt;
    if not hidx then&lt;br /&gt;
        return &amp;quot;visible&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local hid = state.hide and state.hide[j] and state.hide[j][hidx]&lt;br /&gt;
    local byes = state.byes and state.byes[j] and state.byes[j][hidx]&lt;br /&gt;
    if hid then&lt;br /&gt;
        return &amp;quot;suppress&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if byes and allBlank then&lt;br /&gt;
        if not showByeOn then&lt;br /&gt;
            return &amp;quot;suppress&amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
        if j &amp;gt; config.minc and j &amp;lt; config.c then&lt;br /&gt;
            return &amp;quot;through&amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
        return &amp;quot;suppress&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
    return &amp;quot;visible&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function slotIsVisiblyReal(col, sRow)&lt;br /&gt;
    local hasTeam, hidx, allBlank = scanWindow(col, sRow)&lt;br /&gt;
    if not hasTeam then&lt;br /&gt;
        return false&lt;br /&gt;
    end&lt;br /&gt;
    if hidx then&lt;br /&gt;
        local hid = state.hide and state.hide[col] and state.hide[col][hidx]&lt;br /&gt;
        local byes = state.byes and state.byes[col] and state.byes[col][hidx]&lt;br /&gt;
        if hid then&lt;br /&gt;
            return false&lt;br /&gt;
        end&lt;br /&gt;
        if byes and (not showByeOn) and allBlank then&lt;br /&gt;
            return false&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return true&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function isThroughableTeamSlot(teamCol, sRow)&lt;br /&gt;
    return dispositionOf(teamCol, sRow) == &amp;quot;through&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- =======================================&lt;br /&gt;
-- 7) RENDER PRIMITIVES (low-level utils)&lt;br /&gt;
-- =======================================&lt;br /&gt;
-- === Tiny cell primitives (keep paintVertical as-is) ===&lt;br /&gt;
local function ensurePathCell(j, i, k)&lt;br /&gt;
    state.pathCell[j] = state.pathCell[j] or {}&lt;br /&gt;
    state.pathCell[j][i] = state.pathCell[j][i] or {}&lt;br /&gt;
    local cell = state.pathCell[j][i][k]&lt;br /&gt;
    if not cell then&lt;br /&gt;
        cell = {{0, 0, 0, 0}, color = defaultColor}&lt;br /&gt;
        state.pathCell[j][i][k] = cell&lt;br /&gt;
    end&lt;br /&gt;
    return cell&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Ensure all arrays for column j exist and are sized to R rows&lt;br /&gt;
local function ensureColumnScaffolding(j)&lt;br /&gt;
    local R = assert(config.r, &amp;quot;config.r must be set before scaffolding&amp;quot;)&lt;br /&gt;
    state.pathCell[j] = state.pathCell[j] or {}&lt;br /&gt;
    state.crossCell[j] = state.crossCell[j] or {}&lt;br /&gt;
    state.skipPath[j] = state.skipPath[j] or {}&lt;br /&gt;
&lt;br /&gt;
    for i = 1, R do&lt;br /&gt;
        -- make sure the 3 path lanes exist&lt;br /&gt;
        ensurePathCell(j, i, 1)&lt;br /&gt;
        ensurePathCell(j, i, 2)&lt;br /&gt;
        ensurePathCell(j, i, 3)&lt;br /&gt;
&lt;br /&gt;
        -- default cross info&lt;br /&gt;
        state.crossCell[j][i] = state.crossCell[j][i] or {left = {0, defaultColor}, right = {0, defaultColor}}&lt;br /&gt;
&lt;br /&gt;
        -- skipPath defaults to boolean&lt;br /&gt;
        if state.skipPath[j][i] == nil then&lt;br /&gt;
            state.skipPath[j][i] = false&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function paintEdge(j, i, k, edge, val, color)&lt;br /&gt;
    local cell = ensurePathCell(j, i, k)&lt;br /&gt;
    local b = cell[1]&lt;br /&gt;
    if val &amp;gt; (b[edge] or 0) then&lt;br /&gt;
        b[edge] = val&lt;br /&gt;
    end&lt;br /&gt;
    if color then&lt;br /&gt;
        cell.color = color&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- === One generic &amp;quot;pair painter&amp;quot;  ===&lt;br /&gt;
-- kind: &#039;L&#039; (left path col = k=1), &#039;C&#039; (center = k=2), &#039;R&#039; (right = k=3)&lt;br /&gt;
-- side: &#039;upper&#039; | &#039;lower&#039;&lt;br /&gt;
-- feather: true =&amp;gt; opposite side FEATHER; false =&amp;gt; opposite side omitted (no feather)&lt;br /&gt;
local K = {L = 1, C = 2, R = 3}&lt;br /&gt;
local TOP, BOT = 1, 3&lt;br /&gt;
local function paintPair(kind, side, feather, j, row, color)&lt;br /&gt;
    local k = K[kind]&lt;br /&gt;
    local R = config.r&lt;br /&gt;
    local strongAt, weakAt = (side == &amp;quot;upper&amp;quot;) and BOT or TOP, (side == &amp;quot;upper&amp;quot;) and TOP or BOT&lt;br /&gt;
    -- strong on owned side&lt;br /&gt;
    paintEdge(j, row + (side == &amp;quot;lower&amp;quot; and 1 or 0), k, strongAt, STRONG, color)&lt;br /&gt;
    -- optional feather on the other side (skip entirely when feather=false)&lt;br /&gt;
    if feather and row + (side == &amp;quot;upper&amp;quot; and 1 or 0) &amp;lt;= R then&lt;br /&gt;
        paintEdge(j, row + (side == &amp;quot;upper&amp;quot; and 1 or 0), k, weakAt, FEATHER, color)&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Tiny wrappers (purely to keep call sites readable/short)&lt;br /&gt;
local function OUT(j, row, side, feather, color)&lt;br /&gt;
    paintPair(&amp;quot;L&amp;quot;, side, feather, j, row, color)&lt;br /&gt;
end&lt;br /&gt;
local function JOIN(j, row, side, feather, color)&lt;br /&gt;
    paintPair(&amp;quot;C&amp;quot;, side, feather, j, row, color)&lt;br /&gt;
end&lt;br /&gt;
local function IN(j, row, side, feather, color)&lt;br /&gt;
    paintPair(&amp;quot;R&amp;quot;, side, feather, j, row, color)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- vertical stroke (use left edge=2)&lt;br /&gt;
local function paintVertical(j, i1, i2, k, color)&lt;br /&gt;
    if not i1 or not i2 then&lt;br /&gt;
        return&lt;br /&gt;
    end&lt;br /&gt;
    local a, b = i1, i2&lt;br /&gt;
    if a &amp;gt; b then&lt;br /&gt;
        a, b = b, a&lt;br /&gt;
    end&lt;br /&gt;
    for r = a, b do&lt;br /&gt;
        paintEdge(j, r, k, 2, STRONG, color)&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- ===============================&lt;br /&gt;
-- 8) CROSSING / COLORING HELPERS&lt;br /&gt;
-- ===============================&lt;br /&gt;
local function getCrossRowsFor(j)&lt;br /&gt;
    local oj = origJ(j)&lt;br /&gt;
    local raw = (getFArg(&amp;quot;col&amp;quot; .. oj .. &amp;quot;-col&amp;quot; .. (oj + 1) .. &amp;quot;-cross&amp;quot;) or &amp;quot;&amp;quot;):gsub(&amp;quot;%s+&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
    if raw == &amp;quot;&amp;quot; then&lt;br /&gt;
        return {}, false&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local parts = split(raw, {&amp;quot;,&amp;quot;}, true)&lt;br /&gt;
    local rows = {}&lt;br /&gt;
    if notempty(parts[1]) then&lt;br /&gt;
        for idx = 1, #parts do&lt;br /&gt;
            local m = tonumber(parts[idx])&lt;br /&gt;
            if m then&lt;br /&gt;
                rows[#rows + 1] = rowOf(j, m)&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return rows, (#rows &amp;gt; 0)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function pickCrossBetween(crossRows, startRow, stopRow)&lt;br /&gt;
    if #crossRows == 0 then&lt;br /&gt;
        return 0&lt;br /&gt;
    end&lt;br /&gt;
    local lo, hi = startRow, stopRow&lt;br /&gt;
    if lo &amp;gt; hi then&lt;br /&gt;
        lo, hi = hi, lo&lt;br /&gt;
    end&lt;br /&gt;
    for _, cr in ipairs(crossRows) do&lt;br /&gt;
        if cr &amp;gt; lo and cr &amp;lt; hi then&lt;br /&gt;
            return cr&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return 0&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function paintVerticalWithCross(j, sRow, eRow, dir, color, crossRows, hasCross, centerUseByStart, inboundDownAt)&lt;br /&gt;
    local goingDown = (dir == &amp;quot;down&amp;quot;)&lt;br /&gt;
    if goingDown then&lt;br /&gt;
        inboundDownAt[eRow] = true&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local function markCU()&lt;br /&gt;
        local cu = centerUseByStart[sRow] or {up = false, down = false}&lt;br /&gt;
        if goingDown then&lt;br /&gt;
            cu.down = true&lt;br /&gt;
        else&lt;br /&gt;
            cu.up = true&lt;br /&gt;
        end&lt;br /&gt;
        centerUseByStart[sRow] = cu&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if not hasCross then&lt;br /&gt;
        if goingDown then&lt;br /&gt;
            paintVertical(j, sRow + 1, eRow, 1, color)&lt;br /&gt;
            IN(j, eRow, &amp;quot;upper&amp;quot;, false, color)&lt;br /&gt;
        else&lt;br /&gt;
            paintVertical(j, eRow + 1, sRow, 1, color)&lt;br /&gt;
            IN(j, eRow, &amp;quot;lower&amp;quot;, false, color)&lt;br /&gt;
        end&lt;br /&gt;
        markCU()&lt;br /&gt;
        return&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local cr = pickCrossBetween(crossRows, sRow, eRow)&lt;br /&gt;
    if cr ~= 0 then&lt;br /&gt;
        if goingDown then&lt;br /&gt;
            paintVertical(j, sRow + 1, cr - 1, 1, color)&lt;br /&gt;
            state.crossCell[j][cr].left = {1, color}&lt;br /&gt;
            state.crossCell[j][cr].right = state.crossCell[j][cr].right or {0, color}&lt;br /&gt;
            paintVertical(j, cr + 2, eRow, 2, color)&lt;br /&gt;
            IN(j, eRow, &amp;quot;upper&amp;quot;, false, color)&lt;br /&gt;
        else&lt;br /&gt;
            paintVertical(j, eRow + 1, cr - 1, 2, color)&lt;br /&gt;
            state.crossCell[j][cr].right = {1, color}&lt;br /&gt;
            state.crossCell[j][cr].left = state.crossCell[j][cr].left or {0, color}&lt;br /&gt;
            paintVertical(j, cr + 2, sRow, 1, color)&lt;br /&gt;
            IN(j, eRow, &amp;quot;lower&amp;quot;, false, color)&lt;br /&gt;
        end&lt;br /&gt;
    else&lt;br /&gt;
        if goingDown then&lt;br /&gt;
            paintVertical(j, sRow + 1, eRow, 2, color)&lt;br /&gt;
            IN(j, eRow, &amp;quot;upper&amp;quot;, false, color)&lt;br /&gt;
        else&lt;br /&gt;
            paintVertical(j, eRow + 1, sRow, 2, color)&lt;br /&gt;
            IN(j, eRow, &amp;quot;lower&amp;quot;, false, color)&lt;br /&gt;
        end&lt;br /&gt;
        markCU()&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Detect incoming style (from left path column) per row:&lt;br /&gt;
-- returns: map[row] = { side = &amp;quot;upper&amp;quot;|&amp;quot;lower&amp;quot;, feather = true|false }&lt;br /&gt;
local function detectIncomingStyle(j)&lt;br /&gt;
    local res = {}&lt;br /&gt;
    local left = state.pathCell and state.pathCell[j - 1]&lt;br /&gt;
    if not left then&lt;br /&gt;
        return res&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local R = config.r&lt;br /&gt;
    for i = 1, R - 1 do&lt;br /&gt;
        local cU = left[i] and left[i][3] and left[i][3][1] or {0, 0, 0, 0} -- row i, k=3&lt;br /&gt;
        local cL = left[i + 1] and left[i + 1][3] and left[i + 1][3][1] or {0, 0, 0, 0}&lt;br /&gt;
        -- row i+1, k=3&lt;br /&gt;
&lt;br /&gt;
        local upperStrong = (cU[3] or 0) == STRONG&lt;br /&gt;
        local lowerStrong = (cL[1] or 0) == STRONG&lt;br /&gt;
        local upperFeather = (cL[1] or 0) &amp;gt; 0 and (cL[1] ~= STRONG) -- L feather present?&lt;br /&gt;
        local lowerFeather = (cU[3] or 0) &amp;gt; 0 and (cU[3] ~= STRONG) -- U feather present?&lt;br /&gt;
&lt;br /&gt;
        if upperStrong and not lowerStrong then&lt;br /&gt;
            res[i] = {side = &amp;quot;upper&amp;quot;, feather = upperFeather}&lt;br /&gt;
        elseif lowerStrong and not upperStrong then&lt;br /&gt;
            res[i] = {side = &amp;quot;lower&amp;quot;, feather = lowerFeather}&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return res&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- If no edge is painted, returns 0, nil&lt;br /&gt;
local function getEdge(col, row, k, edge)&lt;br /&gt;
    local pc = state.pathCell and state.pathCell[col]&lt;br /&gt;
    local cell = pc and pc[row] and pc[row][k]&lt;br /&gt;
    if not cell then&lt;br /&gt;
        return 0, nil&lt;br /&gt;
    end&lt;br /&gt;
    local w = (cell[1] and cell[1][edge]) or 0&lt;br /&gt;
    return w, (w ~= 0) and cell.color or nil&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function finalizeThroughLineColors()&lt;br /&gt;
    for teamCol = config.minc + 1, config.c do&lt;br /&gt;
        local leftPathCol = teamCol - 1&lt;br /&gt;
        local rightPathCol = teamCol&lt;br /&gt;
        local Ent = state.entries[teamCol]&lt;br /&gt;
        if Ent then&lt;br /&gt;
            for sRow = 1, config.r - 1 do&lt;br /&gt;
                local hasBottom, hasTop = throughEdgesMaskAt(teamCol, sRow)&lt;br /&gt;
&lt;br /&gt;
                if hasBottom and Ent[sRow - 1] and Ent[sRow - 1].ctype == &amp;quot;line&amp;quot; then&lt;br /&gt;
                    -- bottom edges at row sRow (left k=3, right k=1) use edge=3&lt;br /&gt;
                    local wL, cL = getEdge(leftPathCol, sRow, 3, 3)&lt;br /&gt;
                    local wR, cR = getEdge(rightPathCol, sRow, 1, 3)&lt;br /&gt;
                    Ent[sRow - 1].color = (wL ~= 0 and wR ~= 0 and cL == cR) and cL or nil&lt;br /&gt;
                end&lt;br /&gt;
&lt;br /&gt;
                if hasTop and Ent[sRow + 1] and Ent[sRow + 1].ctype == &amp;quot;line&amp;quot; then&lt;br /&gt;
                    -- top edges at row sRow+1 use edge=1&lt;br /&gt;
                    local wL, cL = getEdge(leftPathCol, sRow + 1, 3, 1)&lt;br /&gt;
                    local wR, cR = getEdge(rightPathCol, sRow + 1, 1, 1)&lt;br /&gt;
                    Ent[sRow + 1].color = (wL ~= 0 and wR ~= 0 and cL == cR) and cL or nil&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- =========================&lt;br /&gt;
-- 9) PATH VISIBILITY GATES&lt;br /&gt;
-- =========================&lt;br /&gt;
local function hasVisibleOutgoingFrom(j, startRow)&lt;br /&gt;
    if j &amp;gt;= config.c then&lt;br /&gt;
        return false&lt;br /&gt;
    end&lt;br /&gt;
    for _, q in ipairs(parsePaths(j) or {}) do&lt;br /&gt;
        local qStartRow = rowOf(j, q[1])&lt;br /&gt;
        if qStartRow == startRow then&lt;br /&gt;
            local qStopRow = rowOf(j + 1, q[2])&lt;br /&gt;
            if dispositionOf(j + 1, qStopRow) ~= &amp;quot;suppress&amp;quot; then&lt;br /&gt;
                return true&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return false&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function roundGateBlocks(col, startRow)&lt;br /&gt;
    if not rdGateOff[col] then&lt;br /&gt;
        return false&lt;br /&gt;
    end&lt;br /&gt;
    local _, hidx = scanWindow(col, startRow)&lt;br /&gt;
    return (hidx == 1)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function hasNonSuppressedIncomingTo(j, startRow)&lt;br /&gt;
    if j &amp;lt;= config.minc then&lt;br /&gt;
        return false&lt;br /&gt;
    end&lt;br /&gt;
    for _, q in ipairs(parsePaths(j - 1) or {}) do&lt;br /&gt;
        if rowOf(j, q[2]) == startRow then&lt;br /&gt;
            local leftStart = rowOf(j - 1, q[1])&lt;br /&gt;
            if dispositionOf(j - 1, leftStart) ~= &amp;quot;suppress&amp;quot; and not roundGateBlocks(j - 1, leftStart) then&lt;br /&gt;
                return true&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return false&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function isPathHidden(j, start, stop, leftDisp, rightDisp)&lt;br /&gt;
    leftDisp = leftDisp or dispositionOf(j, start)&lt;br /&gt;
    rightDisp = rightDisp or dispositionOf(j + 1, stop)&lt;br /&gt;
&lt;br /&gt;
    if leftDisp == &amp;quot;suppress&amp;quot; or rightDisp == &amp;quot;suppress&amp;quot; then&lt;br /&gt;
        return true&lt;br /&gt;
    end&lt;br /&gt;
    do&lt;br /&gt;
        local b, t = throughEdgesMaskAt(j, start)&lt;br /&gt;
        if not (slotIsVisiblyReal(j, start) or b or t) then&lt;br /&gt;
            return true&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    do&lt;br /&gt;
        local b, t = throughEdgesMaskAt(j + 1, stop)&lt;br /&gt;
        if not (slotIsVisiblyReal(j + 1, stop) or isThroughableTeamSlot(j + 1, stop) or b or t) then&lt;br /&gt;
            return true&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    if leftDisp == &amp;quot;through&amp;quot; and not hasNonSuppressedIncomingTo(j, start) then&lt;br /&gt;
        return true&lt;br /&gt;
    end&lt;br /&gt;
    if rightDisp == &amp;quot;through&amp;quot; and not hasVisibleOutgoingFrom(j + 1, stop) then&lt;br /&gt;
        return true&lt;br /&gt;
    end&lt;br /&gt;
    if rdGateOff[j] then&lt;br /&gt;
        local _, hidx = scanWindow(j, start)&lt;br /&gt;
        if hidx == 1 then&lt;br /&gt;
            return true&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return false&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- ============================&lt;br /&gt;
-- 10) THROUGH-LINES INSERTION&lt;br /&gt;
-- ============================&lt;br /&gt;
local function insertThroughLinesForColumn(j)&lt;br /&gt;
    if not showByeOn then&lt;br /&gt;
        return&lt;br /&gt;
    end&lt;br /&gt;
    local Pj = state.pathCell[j]&lt;br /&gt;
    if not Pj then&lt;br /&gt;
        return&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    state.entries[j + 1] = state.entries[j + 1] or {}&lt;br /&gt;
    local Ent, R = state.entries[j + 1], config.r&lt;br /&gt;
&lt;br /&gt;
    for i = 1, R - 1 do&lt;br /&gt;
        if isThroughableTeamSlot(j + 1, i) then&lt;br /&gt;
            local c_i3 = Pj[i] and Pj[i][3]&lt;br /&gt;
            local c_ip1_3 = Pj[i + 1] and Pj[i + 1][3]&lt;br /&gt;
            local b_i3 = c_i3 and c_i3[1] or nil&lt;br /&gt;
            local b_ip1_3 = c_ip1_3 and c_ip1_3[1] or nil&lt;br /&gt;
&lt;br /&gt;
            local hasBottom = (b_i3 and (b_i3[3] or 0) ~= 0) or false&lt;br /&gt;
            local hasTop = (b_ip1_3 and (b_ip1_3[1] or 0) ~= 0) or false&lt;br /&gt;
&lt;br /&gt;
            -- bounds guards&lt;br /&gt;
            if hasBottom and (i - 1) &amp;gt;= 1 then&lt;br /&gt;
                Ent[i - 1] = {ctype = &amp;quot;line&amp;quot;, border = &amp;quot;bottom&amp;quot;}&lt;br /&gt;
                Ent[i] = Ent[i] or {ctype = &amp;quot;blank&amp;quot;}&lt;br /&gt;
            end&lt;br /&gt;
            if hasTop and (i + 1) &amp;lt;= R then&lt;br /&gt;
                Ent[i + 1] = {ctype = &amp;quot;line&amp;quot;, border = &amp;quot;top&amp;quot;}&lt;br /&gt;
                if (i + 2) &amp;lt;= R then&lt;br /&gt;
                    Ent[i + 2] = Ent[i + 2] or {ctype = &amp;quot;blank&amp;quot;}&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Thin same-color double-in at the right path column (k=3):&lt;br /&gt;
-- If both U (row i, edge=3) and L (row i+1, edge=1) are STRONG and colors match,&lt;br /&gt;
-- make L a FEATHER =&amp;gt; 2U/1L.&lt;br /&gt;
local function thinDoubleInSameColorForColumn(j)&lt;br /&gt;
    local R = config.r&lt;br /&gt;
    local pc = state.pathCell[j]&lt;br /&gt;
    if not pc then&lt;br /&gt;
        return&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    for i = 1, R - 1 do&lt;br /&gt;
        local cellU = pc[i] and pc[i][3] -- row i, k=3 (U edge lives here at b[3])&lt;br /&gt;
        local cellL = pc[i + 1] and pc[i + 1][3] -- row i+1, k=3 (L edge lives here at b[1])&lt;br /&gt;
        if cellU and cellL and cellU[1] and cellL[1] then&lt;br /&gt;
            local bU, bL = cellU[1], cellL[1]&lt;br /&gt;
            local uStrong = (bU[3] or 0) == STRONG&lt;br /&gt;
            local lStrong = (bL[1] or 0) == STRONG&lt;br /&gt;
            -- Only thin when BOTH sides are strong and colors match&lt;br /&gt;
            if uStrong and lStrong and cellU.color == cellL.color then&lt;br /&gt;
                bL[1] = FEATHER -- 2U2L -&amp;gt; 2U1L&lt;br /&gt;
            -- keep color as-is (already the same on both cells)&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function rememberRowStyle(rowStyleByColor, sRow, color, side, feather)&lt;br /&gt;
    local map = rowStyleByColor[sRow]&lt;br /&gt;
    if not map then&lt;br /&gt;
        map = {}&lt;br /&gt;
        rowStyleByColor[sRow] = map&lt;br /&gt;
    end&lt;br /&gt;
    map[color] = {side = side, feather = feather}&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function summarizeDirs(items)&lt;br /&gt;
    local hasUp, hasDown, hasStraight = false, false, false&lt;br /&gt;
    local upColor, downColor, straightColor&lt;br /&gt;
    for _, it in ipairs(items) do&lt;br /&gt;
        if it.dir == &amp;quot;up&amp;quot; then&lt;br /&gt;
            hasUp, upColor = true, it.color&lt;br /&gt;
        end&lt;br /&gt;
        if it.dir == &amp;quot;down&amp;quot; then&lt;br /&gt;
            hasDown, downColor = true, it.color&lt;br /&gt;
        end&lt;br /&gt;
        if it.dir == &amp;quot;straight&amp;quot; then&lt;br /&gt;
            hasStraight, straightColor = true, it.color&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return hasUp, hasDown, hasStraight, upColor, downColor, straightColor&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- ===========================&lt;br /&gt;
-- 11) MAIN PATH DRAWING LOOP&lt;br /&gt;
-- ===========================&lt;br /&gt;
local function drawPathsForColumn(j)&lt;br /&gt;
    local R = config.r&lt;br /&gt;
&lt;br /&gt;
    ensureColumnScaffolding(j)&lt;br /&gt;
&lt;br /&gt;
    local crossRows, hasCross = getCrossRowsFor(j)&lt;br /&gt;
    state.hascross[j] = hasCross&lt;br /&gt;
&lt;br /&gt;
    local paths = parsePaths(j) or {}&lt;br /&gt;
    local outByStart, straightStubs, centerUseByStart, inboundDownAt = {}, {}, {}, {}&lt;br /&gt;
&lt;br /&gt;
    -- record the chosen OUT style per starting row and color for this column&lt;br /&gt;
    local rowStyleByColor = {} -- [sRow] -&amp;gt; { [color] = { side=&amp;quot;upper&amp;quot;|&amp;quot;lower&amp;quot;, feather=bool } }&lt;br /&gt;
&lt;br /&gt;
    -- paint verticals + collect fork info&lt;br /&gt;
    for _, p in ipairs(paths) do&lt;br /&gt;
        local sIdx, eIdx = p[1], p[2]&lt;br /&gt;
        local color = p.color or defaultColor&lt;br /&gt;
        local sRow = rowOf(j, sIdx)&lt;br /&gt;
        local eRow = rowOf(j + 1, eIdx)&lt;br /&gt;
&lt;br /&gt;
        -- skip if either endpoint suppressed; avoid cycles by using isPathHidden&lt;br /&gt;
        local leftDisp = dispositionOf(j, sRow)&lt;br /&gt;
        local rightDisp = dispositionOf(j + 1, eRow)&lt;br /&gt;
        if not isPathHidden(j, sRow, eRow, leftDisp, rightDisp) then&lt;br /&gt;
            local dir = (sRow &amp;lt; eRow) and &amp;quot;down&amp;quot; or ((sRow &amp;gt; eRow) and &amp;quot;up&amp;quot; or &amp;quot;straight&amp;quot;)&lt;br /&gt;
            if dir == &amp;quot;down&amp;quot; then&lt;br /&gt;
                inboundDownAt[eRow] = true&lt;br /&gt;
            end&lt;br /&gt;
&lt;br /&gt;
            local bucket = outByStart[sRow]&lt;br /&gt;
            if not bucket then&lt;br /&gt;
                bucket = {}&lt;br /&gt;
                outByStart[sRow] = bucket&lt;br /&gt;
            end&lt;br /&gt;
            bucket[#bucket + 1] = {dir = dir, color = color}&lt;br /&gt;
&lt;br /&gt;
            if dir ~= &amp;quot;straight&amp;quot; then&lt;br /&gt;
                paintVerticalWithCross(j, sRow, eRow, dir, color, crossRows, hasCross, centerUseByStart, inboundDownAt)&lt;br /&gt;
            else&lt;br /&gt;
                local list = straightStubs[sRow] or {}&lt;br /&gt;
                straightStubs[sRow] = list&lt;br /&gt;
                list[#list + 1] = {stopRow = eRow, color = color}&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    -- decide fork placements and paint edges/joins/stubs&lt;br /&gt;
    local incomingStyle = detectIncomingStyle(j) -- row -&amp;gt; {side, feather}&lt;br /&gt;
&lt;br /&gt;
    for sRow, items in pairs(outByStart) do&lt;br /&gt;
        local hasUp, hasDown, hasStraight, upColor, downColor, straightColor = summarizeDirs(items)&lt;br /&gt;
        local straightPlacement = &amp;quot;upper&amp;quot; -- default&lt;br /&gt;
        local wantTopLower, topColor = false, nil&lt;br /&gt;
        local wantBottomUpper, bottomColor = false, nil&lt;br /&gt;
&lt;br /&gt;
        if hasUp then&lt;br /&gt;
            wantBottomUpper = true&lt;br /&gt;
            bottomColor = upColor&lt;br /&gt;
        end&lt;br /&gt;
        if hasDown then&lt;br /&gt;
            wantTopLower = true&lt;br /&gt;
            topColor = downColor&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        if hasStraight then&lt;br /&gt;
            if hasUp then&lt;br /&gt;
                straightPlacement = &amp;quot;lower&amp;quot;&lt;br /&gt;
            else&lt;br /&gt;
                local needsLower = false&lt;br /&gt;
                local list = straightStubs[sRow]&lt;br /&gt;
                if list then&lt;br /&gt;
                    for _, stub in ipairs(list) do&lt;br /&gt;
                        if inboundDownAt[stub.stopRow] then&lt;br /&gt;
                            needsLower = true&lt;br /&gt;
                            break&lt;br /&gt;
                        end&lt;br /&gt;
                    end&lt;br /&gt;
                end&lt;br /&gt;
                if needsLower then&lt;br /&gt;
                    straightPlacement = &amp;quot;lower&amp;quot;&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
&lt;br /&gt;
            if straightPlacement == &amp;quot;lower&amp;quot; then&lt;br /&gt;
                wantTopLower = true&lt;br /&gt;
                topColor = straightColor or topColor&lt;br /&gt;
            else&lt;br /&gt;
                wantBottomUpper = true&lt;br /&gt;
                bottomColor = straightColor or bottomColor&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        -- obey forced incoming placement if a through-edge exists from the left&lt;br /&gt;
        local appliedForced = nil&lt;br /&gt;
        do&lt;br /&gt;
            local leftHasBottom, leftHasTop = throughEdgesMaskAt(j, sRow)&lt;br /&gt;
            if (leftHasBottom or leftHasTop) then&lt;br /&gt;
                local info = incomingStyle[sRow] -- { side=&amp;quot;upper&amp;quot;|&amp;quot;lower&amp;quot;, feather=... } or nil&lt;br /&gt;
                if info and (info.side == &amp;quot;upper&amp;quot; or info.side == &amp;quot;lower&amp;quot;) then&lt;br /&gt;
                    appliedForced = info.side&lt;br /&gt;
                    -- make side intent explicit so later logic is consistent&lt;br /&gt;
                    wantBottomUpper, wantTopLower = (appliedForced == &amp;quot;upper&amp;quot;), (appliedForced == &amp;quot;lower&amp;quot;)&lt;br /&gt;
                    if appliedForced == &amp;quot;upper&amp;quot; then&lt;br /&gt;
                        bottomColor = bottomColor or straightColor or upColor or downColor or defaultColor&lt;br /&gt;
                        straightPlacement = &amp;quot;upper&amp;quot;&lt;br /&gt;
                    else&lt;br /&gt;
                        topColor = topColor or straightColor or upColor or downColor or defaultColor&lt;br /&gt;
                        straightPlacement = &amp;quot;lower&amp;quot;&lt;br /&gt;
                    end&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        -- preserve prior through-edges if present&lt;br /&gt;
        do&lt;br /&gt;
            local prevBottom, prevTop = throughEdgesMaskAt(j, sRow)&lt;br /&gt;
            if prevBottom or prevTop then&lt;br /&gt;
                wantBottomUpper = prevBottom&lt;br /&gt;
                wantTopLower = prevTop&lt;br /&gt;
                if prevBottom ~= prevTop then&lt;br /&gt;
                    appliedForced = prevBottom and &amp;quot;upper&amp;quot; or &amp;quot;lower&amp;quot;&lt;br /&gt;
                    straightPlacement = appliedForced&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        -- Decide the style to use for a single outgoing path on this row.&lt;br /&gt;
        local isSingleOut = (#items == 1)&lt;br /&gt;
&lt;br /&gt;
        -- default for single-out: always &amp;quot;upper&amp;quot; (2U/1L), unless forced by left through&lt;br /&gt;
        local styleSingle&lt;br /&gt;
        if isSingleOut then&lt;br /&gt;
            styleSingle = appliedForced or &amp;quot;upper&amp;quot;&lt;br /&gt;
        else&lt;br /&gt;
            -- multi-out: keep existing side selection logic&lt;br /&gt;
            if appliedForced then&lt;br /&gt;
                styleSingle = appliedForced -- &amp;quot;upper&amp;quot; | &amp;quot;lower&amp;quot;&lt;br /&gt;
            elseif wantBottomUpper and not wantTopLower then&lt;br /&gt;
                styleSingle = &amp;quot;upper&amp;quot;&lt;br /&gt;
            elseif wantTopLower and not wantBottomUpper then&lt;br /&gt;
                styleSingle = &amp;quot;lower&amp;quot;&lt;br /&gt;
            else&lt;br /&gt;
                styleSingle = &amp;quot;upper&amp;quot;&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        -- If we have a through edge from the left, try to copy feather/no-feather from the incoming.&lt;br /&gt;
        local lb, lt = throughEdgesMaskAt(j, sRow)&lt;br /&gt;
        local throughHere = (dispositionOf(j, sRow) == &amp;quot;through&amp;quot;) or lb or lt&lt;br /&gt;
        local forcedInfo = throughHere and incomingStyle[sRow] or nil -- gate by through&lt;br /&gt;
        local forcedFeather = forcedInfo and forcedInfo.feather -- true | false | nil&lt;br /&gt;
&lt;br /&gt;
        if isSingleOut then&lt;br /&gt;
            local singleColor = (items[1] and items[1].color) or bottomColor or topColor or defaultColor&lt;br /&gt;
&lt;br /&gt;
            if forcedFeather == false then&lt;br /&gt;
                -- through row and incoming was NO feather → out₂ NO feather&lt;br /&gt;
                OUT(j, sRow, styleSingle, false, singleColor)&lt;br /&gt;
                rememberRowStyle(rowStyleByColor, sRow, singleColor, styleSingle, false)&lt;br /&gt;
            else&lt;br /&gt;
                -- either not a through row, or incoming was feather/unknown → use feathered out (2U/1L)&lt;br /&gt;
                OUT(j, sRow, styleSingle, true, singleColor)&lt;br /&gt;
                rememberRowStyle(rowStyleByColor, sRow, singleColor, styleSingle, true)&lt;br /&gt;
            end&lt;br /&gt;
        else&lt;br /&gt;
            -- Multi-out: split sides (no feather), and record&lt;br /&gt;
            local upC = hasUp and (upColor or defaultColor) or nil&lt;br /&gt;
            local downC = hasDown and (downColor or defaultColor) or nil&lt;br /&gt;
            local straightC = hasStraight and (straightColor or defaultColor) or nil&lt;br /&gt;
&lt;br /&gt;
            local upperColors, lowerColors = {}, {}&lt;br /&gt;
&lt;br /&gt;
            if hasUp and hasDown and not hasStraight then&lt;br /&gt;
                upperColors[upC] = true -- up → U&lt;br /&gt;
                lowerColors[downC] = true -- down → L&lt;br /&gt;
            elseif hasStraight and hasDown and not hasUp then&lt;br /&gt;
                upperColors[straightC] = true -- straight → U&lt;br /&gt;
                lowerColors[downC] = true -- down → L&lt;br /&gt;
            elseif hasStraight and hasUp and not hasDown then&lt;br /&gt;
                upperColors[upC] = true -- up → U&lt;br /&gt;
                lowerColors[straightC] = true -- straight → L&lt;br /&gt;
            else&lt;br /&gt;
                if wantBottomUpper then&lt;br /&gt;
                    upperColors[(bottomColor or defaultColor)] = true&lt;br /&gt;
                end&lt;br /&gt;
                if wantTopLower then&lt;br /&gt;
                    lowerColors[(topColor or defaultColor)] = true&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
&lt;br /&gt;
            if next(upperColors) then&lt;br /&gt;
                for colstr, _ in pairs(upperColors) do&lt;br /&gt;
                    paintEdge(j, sRow, 1, 3, STRONG, colstr) -- 2U, 0L&lt;br /&gt;
                    rememberRowStyle(rowStyleByColor, sRow, colstr, &amp;quot;upper&amp;quot;, false)&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
            if next(lowerColors) and (sRow + 1) &amp;lt;= R then&lt;br /&gt;
                for colstr, _ in pairs(lowerColors) do&lt;br /&gt;
                    paintEdge(j, sRow + 1, 1, 1, STRONG, colstr) -- 0U, 2L&lt;br /&gt;
                    rememberRowStyle(rowStyleByColor, sRow, colstr, &amp;quot;lower&amp;quot;, false)&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        local cu = centerUseByStart[sRow]&lt;br /&gt;
        if state.hascross[j] then&lt;br /&gt;
            -- Look up side+feather recorded for this row+color (falls back to a side, defaults feather=true)&lt;br /&gt;
            local function styleObjFor(color, fallbackSide)&lt;br /&gt;
                local map = rowStyleByColor[sRow]&lt;br /&gt;
                local info = map and color and map[color]&lt;br /&gt;
                if info then&lt;br /&gt;
                    return info.side, info.feather&lt;br /&gt;
                end&lt;br /&gt;
                return fallbackSide, true&lt;br /&gt;
            end&lt;br /&gt;
&lt;br /&gt;
            -- Non-crossing UP hop uses center join: mimic out style for that color&lt;br /&gt;
            if cu and cu.up then&lt;br /&gt;
                local color = upColor or defaultColor&lt;br /&gt;
                local side, feather = styleObjFor(color, appliedForced or &amp;quot;upper&amp;quot;)&lt;br /&gt;
                if feather == false then&lt;br /&gt;
                    JOIN(j, sRow, side, false, color)&lt;br /&gt;
                else&lt;br /&gt;
                    JOIN(j, sRow, side, true, color)&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
&lt;br /&gt;
            -- Non-crossing DOWN hop uses center join: mimic out style for that color&lt;br /&gt;
            if cu and cu.down then&lt;br /&gt;
                local color = downColor or defaultColor&lt;br /&gt;
                local side, feather = styleObjFor(color, appliedForced or &amp;quot;lower&amp;quot;)&lt;br /&gt;
                if feather == false then&lt;br /&gt;
                    JOIN(j, sRow, side, false, color)&lt;br /&gt;
                else&lt;br /&gt;
                    JOIN(j, sRow, side, true, color)&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
&lt;br /&gt;
            -- Non-crossing STRAIGHT(s): there can be multiple colors; do one join per color&lt;br /&gt;
            if hasStraight and straightStubs[sRow] then&lt;br /&gt;
                local seen = {}&lt;br /&gt;
                for _, stub in ipairs(straightStubs[sRow]) do&lt;br /&gt;
                    local color = stub.color or bottomColor or topColor or defaultColor&lt;br /&gt;
                    if not seen[color] then&lt;br /&gt;
                        seen[color] = true&lt;br /&gt;
                        local fallbackSide = (straightPlacement == &amp;quot;lower&amp;quot; and &amp;quot;lower&amp;quot; or &amp;quot;upper&amp;quot;)&lt;br /&gt;
                        local side, feather = styleObjFor(color, fallbackSide)&lt;br /&gt;
                        if feather == false then&lt;br /&gt;
                            JOIN(j, sRow, side, false, color)&lt;br /&gt;
                        else&lt;br /&gt;
                            JOIN(j, sRow, side, true, color)&lt;br /&gt;
                        end&lt;br /&gt;
                    end&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        if hasStraight and straightStubs[sRow] then&lt;br /&gt;
            for _, stub in ipairs(straightStubs[sRow]) do&lt;br /&gt;
                local color = stub.color or bottomColor or topColor or defaultColor&lt;br /&gt;
                local info = rowStyleByColor[sRow] and rowStyleByColor[sRow][color]&lt;br /&gt;
                local side =&lt;br /&gt;
                    (info and info.side) or appliedForced or styleSingle or&lt;br /&gt;
                    (straightPlacement == &amp;quot;lower&amp;quot; and &amp;quot;lower&amp;quot; or &amp;quot;upper&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
                if info and info.feather == false then&lt;br /&gt;
                    -- origin was a shared split → IN should be no-feather (2U/0L or 0U/2L)&lt;br /&gt;
                    IN(j, stub.stopRow, side, false, color)&lt;br /&gt;
                else&lt;br /&gt;
                    -- single-out or unknown → IN mimics feathered OUT (2U/1L or 1U/2L)&lt;br /&gt;
                    IN(j, stub.stopRow, side, true, color)&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    -- Post-pass: thin same-color double-in stubs on this column&lt;br /&gt;
    thinDoubleInSameColorForColumn(j)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- ===============&lt;br /&gt;
-- 12) PUBLIC API&lt;br /&gt;
-- ===============&lt;br /&gt;
function Paths.build(_state, _config, _Helpers, _StateChecks)&lt;br /&gt;
    bind(_state, _config, _Helpers, _StateChecks)&lt;br /&gt;
    clearPathsCache()&lt;br /&gt;
    computeRoundGates()&lt;br /&gt;
    computeSlotDispositions()&lt;br /&gt;
&lt;br /&gt;
    -- draw each path column, then immediately create through-lines for the team&lt;br /&gt;
    -- column to its right so the next path column can &amp;quot;see&amp;quot; them&lt;br /&gt;
    for j = config.minc, config.c - 1 do&lt;br /&gt;
        drawPathsForColumn(j)&lt;br /&gt;
        insertThroughLinesForColumn(j)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    finalizeThroughLineColors()&lt;br /&gt;
&lt;br /&gt;
    -- ensure last column exists for renderer (fills arrays to full size)&lt;br /&gt;
    ensureColumnScaffolding(config.c)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- =======================&lt;br /&gt;
-- 13) POST-PASS GROUPING&lt;br /&gt;
-- =======================&lt;br /&gt;
local function isBlankOrBlankText(col, row)&lt;br /&gt;
    local ent = entries(col)&lt;br /&gt;
    if not ent then&lt;br /&gt;
        return true&lt;br /&gt;
    end&lt;br /&gt;
    local top = ent[row]&lt;br /&gt;
    local bot = ent[row + 1]&lt;br /&gt;
    if top == nil then&lt;br /&gt;
        if bot == nil then&lt;br /&gt;
            return true&lt;br /&gt;
        end&lt;br /&gt;
        if bot.ctype == &amp;quot;text&amp;quot; and isBlankEntry(col, row + 1) then&lt;br /&gt;
            return true&lt;br /&gt;
        end&lt;br /&gt;
    elseif top.ctype == &amp;quot;text&amp;quot; and isBlankEntry(col, row) then&lt;br /&gt;
        return true&lt;br /&gt;
    end&lt;br /&gt;
    return false&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function applyGroups() -- cosmetic grouping labels spanning left&lt;br /&gt;
    local R = config.r&lt;br /&gt;
    for j = config.minc, config.c - 1 do&lt;br /&gt;
        if (state.teamsPerMatch[j] or 2) == 2 then&lt;br /&gt;
            local groupIndex = 0&lt;br /&gt;
            for i = 1, R - 1 do&lt;br /&gt;
                local hasBottom = (getEdge(j, i, 3, 3) == STRONG)&lt;br /&gt;
                local hasTop = (getEdge(j, i + 1, 3, 1) == STRONG)&lt;br /&gt;
                if hasBottom or hasTop then&lt;br /&gt;
                    groupIndex = groupIndex + 1&lt;br /&gt;
                    if isBlankOrBlankText(j, i) then&lt;br /&gt;
                        local k = 0&lt;br /&gt;
                        repeat&lt;br /&gt;
                            local col = j - k&lt;br /&gt;
                            if&lt;br /&gt;
                                state.entries[col] and state.entries[col][i + 1] and&lt;br /&gt;
                                    state.entries[col][i + 1].ctype == &amp;quot;text&amp;quot; and&lt;br /&gt;
                                    isBlankEntry(col, i + 1)&lt;br /&gt;
                             then&lt;br /&gt;
                                state.entries[col][i + 2] = nil&lt;br /&gt;
                            end&lt;br /&gt;
&lt;br /&gt;
                            state.entries[col] = state.entries[col] or {}&lt;br /&gt;
                            state.entries[col][i] = {ctype = &amp;quot;blank&amp;quot;}&lt;br /&gt;
                            state.entries[col][i + 1] = {ctype = &amp;quot;blank&amp;quot;}&lt;br /&gt;
&lt;br /&gt;
                            if k &amp;gt; 0 and StateChecks.noPaths(col, i) then&lt;br /&gt;
                                state.skipPath[col] = state.skipPath[col] or {}&lt;br /&gt;
                                state.skipPath[col][i] = true&lt;br /&gt;
                                state.skipPath[col][i + 1] = true&lt;br /&gt;
                            end&lt;br /&gt;
&lt;br /&gt;
                            k = k + 1&lt;br /&gt;
                        until k &amp;gt; (j - 1) or not isBlankOrBlankText(j - k, i) or not StateChecks.noPaths(j - k, i)&lt;br /&gt;
&lt;br /&gt;
                        k = k - 1&lt;br /&gt;
                        local leftCol = j - k&lt;br /&gt;
                        local oj = origJ(j)&lt;br /&gt;
                        state.entries[leftCol] = state.entries[leftCol] or {}&lt;br /&gt;
                        state.entries[leftCol][i] = {&lt;br /&gt;
                            ctype = &amp;quot;group&amp;quot;,&lt;br /&gt;
                            index = groupIndex,&lt;br /&gt;
                            colspan = k + 1,&lt;br /&gt;
                            group = bargs(&amp;quot;RD&amp;quot; .. oj .. &amp;quot;-group&amp;quot; .. groupIndex),&lt;br /&gt;
                            align = &amp;quot;center&amp;quot;&lt;br /&gt;
                        }&lt;br /&gt;
                        state.entries[leftCol][i + 1] = {ctype = &amp;quot;blank&amp;quot;}&lt;br /&gt;
                    end&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Paths.attachGroups(_state, _config, _Helpers, _StateChecks)&lt;br /&gt;
    if _state then&lt;br /&gt;
        bind(_state, _config, _Helpers, _StateChecks)&lt;br /&gt;
    end&lt;br /&gt;
    applyGroups()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return Paths&lt;/div&gt;</summary>
		<author><name>Osarius</name></author>
	</entry>
	<entry>
		<id>https://nssportwiki.com/index.php?title=Module:Build_bracket/Params&amp;diff=76410</id>
		<title>Module:Build bracket/Params</title>
		<link rel="alternate" type="text/html" href="https://nssportwiki.com/index.php?title=Module:Build_bracket/Params&amp;diff=76410"/>
		<updated>2026-07-24T10:50:38Z</updated>

		<summary type="html">&lt;p&gt;Osarius: 1 revision imported&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local Params = {}&lt;br /&gt;
&lt;br /&gt;
-- =========================&lt;br /&gt;
-- 1) MODULE BINDINGS&lt;br /&gt;
-- =========================&lt;br /&gt;
-- Upvalues bound per call&lt;br /&gt;
local state, config, Helpers, StateChecks&lt;br /&gt;
&lt;br /&gt;
-- Stdlib aliases&lt;br /&gt;
local str_format = string.format&lt;br /&gt;
local t_insert = table.insert&lt;br /&gt;
local t_sort = table.sort&lt;br /&gt;
&lt;br /&gt;
-- Locals filled on bind (with safe fallbacks)&lt;br /&gt;
local isempty, notempty, bargs, getPArg, getFArg, toChar, split&lt;br /&gt;
&lt;br /&gt;
local function _toCharFallback(n)&lt;br /&gt;
    n = tonumber(n or 0) or 0&lt;br /&gt;
    if n &amp;gt;= 1 and n &amp;lt;= 26 then&lt;br /&gt;
        return string.char(96 + n) -- &#039;a&#039;..&#039;z&#039;&lt;br /&gt;
    end&lt;br /&gt;
    return tostring(n)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function bind(_state, _config, _Helpers, _StateChecks)&lt;br /&gt;
    state, config, Helpers, StateChecks = _state, _config, _Helpers, _StateChecks&lt;br /&gt;
    isempty = Helpers and Helpers.isempty or function(v)&lt;br /&gt;
            return v == nil or v == &amp;quot;&amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
    notempty = Helpers and Helpers.notempty or function(v)&lt;br /&gt;
            return v ~= nil and v ~= &amp;quot;&amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
    bargs = Helpers and Helpers.bargs&lt;br /&gt;
    getPArg = Helpers and Helpers.getPArg&lt;br /&gt;
    getFArg = Helpers and Helpers.getFArg&lt;br /&gt;
    toChar = (Helpers and Helpers.toChar) or _toCharFallback&lt;br /&gt;
    split = Helpers and Helpers.split&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Try both RDj[a]-X and RDj[A]-X; falls back to &amp;quot;&amp;quot; if not present&lt;br /&gt;
local function readPerHeaderArg(j, k, suffix)&lt;br /&gt;
    local ch = toChar(k) -- e.g. &#039;a&#039; with Helpers.toChar&lt;br /&gt;
    local key1 = &amp;quot;RD&amp;quot; .. j .. ch .. suffix&lt;br /&gt;
    local v = bargs(key1)&lt;br /&gt;
    if v ~= nil and v ~= &amp;quot;&amp;quot; then&lt;br /&gt;
        return v&lt;br /&gt;
    end&lt;br /&gt;
    local key2 = &amp;quot;RD&amp;quot; .. j .. string.upper(ch) .. suffix&lt;br /&gt;
    v = bargs(key2)&lt;br /&gt;
    if v ~= nil and v ~= &amp;quot;&amp;quot; then&lt;br /&gt;
        return v&lt;br /&gt;
    end&lt;br /&gt;
    return &amp;quot;&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- =========================&lt;br /&gt;
-- 2) ARG HELPERS&lt;br /&gt;
-- =========================&lt;br /&gt;
-- Trim + split a comma list frame arg (returns {} on blank)&lt;br /&gt;
local function readCsvArg(name)&lt;br /&gt;
    local raw = (getFArg(name) or &amp;quot;&amp;quot;):gsub(&amp;quot;%s+&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
    return split(raw, {&amp;quot;,&amp;quot;}, true)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- ========================================&lt;br /&gt;
-- 3) BUILD SKELETON (formerly getCells)&lt;br /&gt;
-- ========================================&lt;br /&gt;
local function buildSkeleton()&lt;br /&gt;
    local DEFAULT_TPM = 2&lt;br /&gt;
    local maxrow = 1&lt;br /&gt;
    local colentry = {}&lt;br /&gt;
    local hasNoHeaders = true&lt;br /&gt;
&lt;br /&gt;
    -- ensure containers&lt;br /&gt;
    state.entries = state.entries or {}&lt;br /&gt;
    state.shift = state.shift or {}&lt;br /&gt;
    state.teamsPerMatch = state.teamsPerMatch or {}&lt;br /&gt;
    state.maxtpm = state.maxtpm or 0&lt;br /&gt;
&lt;br /&gt;
    local Cmin, Cmax = config.minc, config.c&lt;br /&gt;
&lt;br /&gt;
    -- Phase 1: Determine header presence and teamsPerMatch&lt;br /&gt;
    for j = Cmin, Cmax do&lt;br /&gt;
        if notempty(getFArg(&amp;quot;col&amp;quot; .. j .. &amp;quot;-headers&amp;quot;)) then&lt;br /&gt;
            hasNoHeaders = false&lt;br /&gt;
        end&lt;br /&gt;
        local tpm =&lt;br /&gt;
            tonumber(getFArg(&amp;quot;RD&amp;quot; .. j .. &amp;quot;-teams-per-match&amp;quot;)) or tonumber(getFArg(&amp;quot;col&amp;quot; .. j .. &amp;quot;-teams-per-match&amp;quot;)) or&lt;br /&gt;
            tonumber(getFArg(&amp;quot;teams-per-match&amp;quot;)) or&lt;br /&gt;
            DEFAULT_TPM&lt;br /&gt;
        state.teamsPerMatch[j] = tpm&lt;br /&gt;
        if tpm &amp;gt; state.maxtpm then&lt;br /&gt;
            state.maxtpm = tpm&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    -- Phase 2: Build colentry for each column&lt;br /&gt;
    for j = Cmin, Cmax do&lt;br /&gt;
        state.entries[j] = {}&lt;br /&gt;
        state.shift[j] = tonumber(bargs(&amp;quot;RD&amp;quot; .. j .. &amp;quot;-shift&amp;quot;)) or tonumber(bargs(&amp;quot;shift&amp;quot;)) or 0&lt;br /&gt;
&lt;br /&gt;
        colentry[j] = {&lt;br /&gt;
            readCsvArg(&amp;quot;col&amp;quot; .. j .. &amp;quot;-headers&amp;quot;),&lt;br /&gt;
            readCsvArg(&amp;quot;col&amp;quot; .. j .. &amp;quot;-matches&amp;quot;),&lt;br /&gt;
            readCsvArg(&amp;quot;col&amp;quot; .. j .. &amp;quot;-lines&amp;quot;),&lt;br /&gt;
            readCsvArg(&amp;quot;col&amp;quot; .. j .. &amp;quot;-text&amp;quot;),&lt;br /&gt;
            readCsvArg(&amp;quot;col&amp;quot; .. j .. &amp;quot;-groups&amp;quot;) -- reserved for user-specified groups&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        -- inject a default header if none were specified anywhere (unless noheaders=y/yes)&lt;br /&gt;
        local noheaders = (getFArg(&amp;quot;noheaders&amp;quot;) or &amp;quot;&amp;quot;):lower()&lt;br /&gt;
        if hasNoHeaders and (noheaders ~= &amp;quot;y&amp;quot; and noheaders ~= &amp;quot;yes&amp;quot;) then&lt;br /&gt;
            t_insert(colentry[j][1], 1)&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    -- Ctype mapping for colentry positions&lt;br /&gt;
    local CTYPE_MAP = {&amp;quot;header&amp;quot;, &amp;quot;team&amp;quot;, &amp;quot;line&amp;quot;, &amp;quot;text&amp;quot;, &amp;quot;group&amp;quot;}&lt;br /&gt;
&lt;br /&gt;
    -- Helpers to populate entries (preserve legacy shapes)&lt;br /&gt;
    local function populateTeam(j, rowIndex, n)&lt;br /&gt;
        local TPM = state.teamsPerMatch[j]&lt;br /&gt;
        -- scaffold a text row above when needed (legacy behavior)&lt;br /&gt;
        if state.entries[j][rowIndex - 1] == nil and state.entries[j][rowIndex - 2] == nil then&lt;br /&gt;
            state.entries[j][rowIndex - 2] = {ctype = &amp;quot;text&amp;quot;, index = n}&lt;br /&gt;
            state.entries[j][rowIndex - 1] = {ctype = &amp;quot;blank&amp;quot;}&lt;br /&gt;
        end&lt;br /&gt;
        -- first team (top)&lt;br /&gt;
        state.entries[j][rowIndex] = {ctype = &amp;quot;team&amp;quot;, index = TPM * n - (TPM - 1), position = &amp;quot;top&amp;quot;}&lt;br /&gt;
        state.entries[j][rowIndex + 1] = {ctype = &amp;quot;blank&amp;quot;}&lt;br /&gt;
        -- remaining teams in the match (every 2 rows)&lt;br /&gt;
        for m = 2, TPM do&lt;br /&gt;
            local idx = TPM * n - (TPM - m)&lt;br /&gt;
            local r = rowIndex + 2 * (m - 1)&lt;br /&gt;
            state.entries[j][r] = {ctype = &amp;quot;team&amp;quot;, index = idx}&lt;br /&gt;
            state.entries[j][r + 1] = {ctype = &amp;quot;blank&amp;quot;}&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local function populateText(j, rowIndex, index)&lt;br /&gt;
        state.entries[j][rowIndex] = {ctype = &amp;quot;text&amp;quot;, index = index}&lt;br /&gt;
        state.entries[j][rowIndex + 1] = {ctype = &amp;quot;blank&amp;quot;}&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local function populateLine(j, rowIndex)&lt;br /&gt;
        -- first segment draws its bottom edge&lt;br /&gt;
        state.entries[j][rowIndex] = {ctype = &amp;quot;line&amp;quot;, border = &amp;quot;bottom&amp;quot;}&lt;br /&gt;
        state.entries[j][rowIndex + 1] = {ctype = &amp;quot;blank&amp;quot;}&lt;br /&gt;
        -- second segment draws its top edge&lt;br /&gt;
        state.entries[j][rowIndex + 2] = {ctype = &amp;quot;line&amp;quot;, border = &amp;quot;top&amp;quot;}&lt;br /&gt;
        state.entries[j][rowIndex + 3] = {ctype = &amp;quot;blank&amp;quot;}&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local function populateGroup(j, rowIndex, n)&lt;br /&gt;
        state.entries[j][rowIndex] = {ctype = &amp;quot;group&amp;quot;, index = n}&lt;br /&gt;
        state.entries[j][rowIndex + 1] = {ctype = &amp;quot;blank&amp;quot;}&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local function populateDefault(j, rowIndex, n)&lt;br /&gt;
        state.entries[j][rowIndex] = {ctype = &amp;quot;header&amp;quot;, index = n, position = &amp;quot;top&amp;quot;}&lt;br /&gt;
        state.entries[j][rowIndex + 1] = {ctype = &amp;quot;blank&amp;quot;}&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    -- Phase 3: Populate entries for each column&lt;br /&gt;
    for j = Cmin, Cmax do&lt;br /&gt;
        local textindex = 0&lt;br /&gt;
        local TPM = state.teamsPerMatch[j]&lt;br /&gt;
        local shiftJ = state.shift[j]&lt;br /&gt;
&lt;br /&gt;
        for k, positions in ipairs(colentry[j]) do&lt;br /&gt;
            t_sort(positions)&lt;br /&gt;
            local ctype = CTYPE_MAP[k]&lt;br /&gt;
&lt;br /&gt;
            for n = 1, #positions do&lt;br /&gt;
                if shiftJ ~= 0 and positions[n] &amp;gt; 1 then&lt;br /&gt;
                    positions[n] = positions[n] + shiftJ&lt;br /&gt;
                end&lt;br /&gt;
                local rowIndex = 2 * positions[n] - 1&lt;br /&gt;
                local lastRow = rowIndex + 2 * TPM - 1&lt;br /&gt;
                if lastRow &amp;gt; maxrow then&lt;br /&gt;
                    maxrow = lastRow&lt;br /&gt;
                end&lt;br /&gt;
&lt;br /&gt;
                if ctype == &amp;quot;team&amp;quot; then&lt;br /&gt;
                    populateTeam(j, rowIndex, n)&lt;br /&gt;
                    textindex = n&lt;br /&gt;
                elseif ctype == &amp;quot;text&amp;quot; then&lt;br /&gt;
                    populateText(j, rowIndex, textindex + n)&lt;br /&gt;
                elseif ctype == &amp;quot;line&amp;quot; then&lt;br /&gt;
                    populateLine(j, rowIndex)&lt;br /&gt;
                elseif ctype == &amp;quot;group&amp;quot; then&lt;br /&gt;
                    populateGroup(j, rowIndex, n)&lt;br /&gt;
                else&lt;br /&gt;
                    populateDefault(j, rowIndex, n)&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if isempty(config.r) then&lt;br /&gt;
        config.r = maxrow&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- ========================================&lt;br /&gt;
-- 4) NAME RESOLUTION HELPERS&lt;br /&gt;
-- ========================================&lt;br /&gt;
local function paramNames(cname, j, i, l)&lt;br /&gt;
    local function getArg(key)&lt;br /&gt;
        return bargs(key) or &amp;quot;&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
    local function getP(key)&lt;br /&gt;
        return getPArg(key) or &amp;quot;&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local e = state.entries[j][i]&lt;br /&gt;
    local RD = &amp;quot;RD&amp;quot; .. j&lt;br /&gt;
    local hidx = e.headerindex&lt;br /&gt;
    local hchar = toChar(hidx)&lt;br /&gt;
    local RDh = RD .. hchar&lt;br /&gt;
&lt;br /&gt;
    local SYNONYMS = {legs = {&amp;quot;legs&amp;quot;, &amp;quot;sets&amp;quot;}}&lt;br /&gt;
&lt;br /&gt;
    -- Try a list of names against base+index(+suffix); returns first non-empty&lt;br /&gt;
    local function tryAny(base, names, idx, suffix)&lt;br /&gt;
        suffix = suffix or &amp;quot;&amp;quot;&lt;br /&gt;
        for _, nm in ipairs(names) do&lt;br /&gt;
            local a = bargs(base .. &amp;quot;-&amp;quot; .. nm .. idx .. suffix) or &amp;quot;&amp;quot;&lt;br /&gt;
            if isempty(a) then&lt;br /&gt;
                a = bargs(base .. &amp;quot;-&amp;quot; .. nm .. string.format(&amp;quot;%02d&amp;quot;, idx) .. suffix) or &amp;quot;&amp;quot;&lt;br /&gt;
            end&lt;br /&gt;
            if notempty(a) then&lt;br /&gt;
                return a&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
        return &amp;quot;&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local function tryBoth(base, name, idx, suffix)&lt;br /&gt;
        suffix = suffix or &amp;quot;&amp;quot;&lt;br /&gt;
        local a = getArg(base .. &amp;quot;-&amp;quot; .. name .. idx .. suffix)&lt;br /&gt;
        if isempty(a) then&lt;br /&gt;
            a = getArg(base .. &amp;quot;-&amp;quot; .. name .. str_format(&amp;quot;%02d&amp;quot;, idx) .. suffix)&lt;br /&gt;
        end&lt;br /&gt;
        return a&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    -- Round names (prefer altname when present)&lt;br /&gt;
    local RDlabel = getArg(RD .. &amp;quot;-altname&amp;quot;) or RD&lt;br /&gt;
    local RDhlabel = getArg(RDh .. &amp;quot;-altname&amp;quot;) or RDh&lt;br /&gt;
&lt;br /&gt;
    local rname = {{RD, RDlabel}, {RDh, RDhlabel}}&lt;br /&gt;
    local name = {cname, getArg(cname .. &amp;quot;-altname&amp;quot;) or cname}&lt;br /&gt;
    local nameKeys = SYNONYMS[cname] or {name[1]}&lt;br /&gt;
    local index = {e.index, e.altindex}&lt;br /&gt;
    local result = {}&lt;br /&gt;
&lt;br /&gt;
    if cname == &amp;quot;header&amp;quot; then&lt;br /&gt;
        if hidx == 1 then&lt;br /&gt;
            for _, base in ipairs({rname[1], rname[2]}) do&lt;br /&gt;
                for k = 2, 1, -1 do&lt;br /&gt;
                    result[#result + 1] = getArg(base[k])&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
        else&lt;br /&gt;
            for k = 2, 1, -1 do&lt;br /&gt;
                result[#result + 1] = getArg(rname[2][k])&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    elseif cname == &amp;quot;pheader&amp;quot; then&lt;br /&gt;
        if hidx == 1 then&lt;br /&gt;
            for _, base in ipairs({rname[1], rname[2]}) do&lt;br /&gt;
                for k = 2, 1, -1 do&lt;br /&gt;
                    result[#result + 1] = getP(base[k])&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
        else&lt;br /&gt;
            for k = 2, 1, -1 do&lt;br /&gt;
                result[#result + 1] = getP(rname[2][k])&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    elseif cname == &amp;quot;score&amp;quot; then&lt;br /&gt;
        local bases = {rname[2][2], rname[2][1], rname[1][2], rname[1][1]}&lt;br /&gt;
        local idxs = {index[2], index[2], index[1], index[1]}&lt;br /&gt;
        for n = 1, 4 do&lt;br /&gt;
            if l == 1 then&lt;br /&gt;
                result[#result + 1] = tryAny(bases[n], nameKeys, idxs[n])&lt;br /&gt;
            end&lt;br /&gt;
            result[#result + 1] = tryAny(bases[n], nameKeys, idxs[n], &amp;quot;-&amp;quot; .. l)&lt;br /&gt;
        end&lt;br /&gt;
    elseif cname == &amp;quot;shade&amp;quot; then&lt;br /&gt;
        for k = 2, 1, -1 do&lt;br /&gt;
            local base = (hidx == 1) and rname[1][k] or rname[2][k]&lt;br /&gt;
            result[#result + 1] = getArg(base .. &amp;quot;-&amp;quot; .. name[1])&lt;br /&gt;
        end&lt;br /&gt;
        result[#result + 1] = getArg(&amp;quot;RD-shade&amp;quot;)&lt;br /&gt;
        result[#result + 1] = (config.COLORS and config.COLORS.cell_bg_dark) or &amp;quot;#eaecf0&amp;quot;&lt;br /&gt;
    elseif cname == &amp;quot;text&amp;quot; then&lt;br /&gt;
        local bases = {rname[2][2], rname[2][1], rname[1][2], rname[1][1]}&lt;br /&gt;
        local idxs = {index[2], index[2], index[1], index[1]}&lt;br /&gt;
        local names = {name[2], name[1]}&lt;br /&gt;
        for ni = 1, 2 do&lt;br /&gt;
            for n = 1, 4 do&lt;br /&gt;
                result[#result + 1] = tryBoth(bases[n], names[ni], idxs[n])&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    else&lt;br /&gt;
        local bases = {rname[2][2], rname[2][1], rname[1][2], rname[1][1]}&lt;br /&gt;
        local idxs = {index[2], index[2], index[1], index[1]}&lt;br /&gt;
        for n = 1, 4 do&lt;br /&gt;
            result[#result + 1] = tryAny(bases[n], nameKeys, idxs[n])&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    for _, val in ipairs(result) do&lt;br /&gt;
        if notempty(val) then&lt;br /&gt;
            return val&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return &amp;quot;&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- ========================================&lt;br /&gt;
-- 5) NUMBERED PARAM MODE&lt;br /&gt;
-- ========================================&lt;br /&gt;
local masterindex = 1&lt;br /&gt;
&lt;br /&gt;
local function numberedParams(j)&lt;br /&gt;
    local row = state.entries[j]&lt;br /&gt;
    if not row then&lt;br /&gt;
        return&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local function nextArg()&lt;br /&gt;
        local v = bargs(tostring(masterindex)) or &amp;quot;&amp;quot;&lt;br /&gt;
        masterindex = masterindex + 1&lt;br /&gt;
        return v&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local R = config.r&lt;br /&gt;
    for i = 1, R do&lt;br /&gt;
        local e = row[i]&lt;br /&gt;
        if e then&lt;br /&gt;
            local ct = e.ctype&lt;br /&gt;
            if ct == &amp;quot;team&amp;quot; then&lt;br /&gt;
                local legs = state.rlegs[j]&lt;br /&gt;
&lt;br /&gt;
                if config.forceseeds then&lt;br /&gt;
                    e.seed = nextArg()&lt;br /&gt;
                end&lt;br /&gt;
&lt;br /&gt;
                e.team = nextArg()&lt;br /&gt;
                e.legs = paramNames(&amp;quot;legs&amp;quot;, j, i)&lt;br /&gt;
                e.score = {weight = {}}&lt;br /&gt;
                e.weight = &amp;quot;normal&amp;quot;&lt;br /&gt;
&lt;br /&gt;
                if notempty(e.legs) then&lt;br /&gt;
                    legs = tonumber(e.legs) or legs&lt;br /&gt;
                end&lt;br /&gt;
&lt;br /&gt;
                for l = 1, legs do&lt;br /&gt;
                    e.score[l] = nextArg()&lt;br /&gt;
                    e.score.weight[l] = &amp;quot;normal&amp;quot;&lt;br /&gt;
                end&lt;br /&gt;
&lt;br /&gt;
                if config.aggregate and legs &amp;gt; 1 then&lt;br /&gt;
                    e.score.agg = nextArg()&lt;br /&gt;
                    e.score.weight.agg = &amp;quot;normal&amp;quot;&lt;br /&gt;
                end&lt;br /&gt;
            elseif ct == &amp;quot;header&amp;quot; then&lt;br /&gt;
                e.header = paramNames(&amp;quot;header&amp;quot;, j, i)&lt;br /&gt;
                e.pheader = paramNames(&amp;quot;pheader&amp;quot;, j, i)&lt;br /&gt;
                e.shade = paramNames(&amp;quot;shade&amp;quot;, j, i)&lt;br /&gt;
            elseif ct == &amp;quot;text&amp;quot; then&lt;br /&gt;
                e.text = nextArg()&lt;br /&gt;
            elseif ct == &amp;quot;group&amp;quot; then&lt;br /&gt;
                e.group = nextArg()&lt;br /&gt;
            elseif ct == &amp;quot;line&amp;quot; and e.hastext == true then&lt;br /&gt;
                e.text = nextArg()&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- ========================================&lt;br /&gt;
-- 6) NAMED MODE ASSIGNERS (per-ctype)&lt;br /&gt;
-- ========================================&lt;br /&gt;
local function cellHasMeaningfulContent(e)&lt;br /&gt;
    if not e then&lt;br /&gt;
        return false&lt;br /&gt;
    end&lt;br /&gt;
    if e.ctype == &amp;quot;team&amp;quot; then&lt;br /&gt;
        return notempty(e.team)&lt;br /&gt;
    end&lt;br /&gt;
    if e.ctype == &amp;quot;text&amp;quot; then&lt;br /&gt;
        return notempty(e.text)&lt;br /&gt;
    end&lt;br /&gt;
    if e.ctype == &amp;quot;group&amp;quot; then&lt;br /&gt;
        return notempty(e.group)&lt;br /&gt;
    end&lt;br /&gt;
    if e.ctype == &amp;quot;line&amp;quot; and e.hastext == true then&lt;br /&gt;
        return notempty(e.text)&lt;br /&gt;
    end&lt;br /&gt;
    return false&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function enforceContentUnhide(j)&lt;br /&gt;
    if not (state.hide and state.hide[j]) then&lt;br /&gt;
        return&lt;br /&gt;
    end&lt;br /&gt;
    local explicit = (state._hideExplicit and state._hideExplicit[j]) or {}&lt;br /&gt;
    local R = config.r&lt;br /&gt;
&lt;br /&gt;
    -- If master hid a header, but we later discover content in that header,&lt;br /&gt;
    -- flip it visible unless there was an EXPLICIT per-header hide.&lt;br /&gt;
    for i = 1, R do&lt;br /&gt;
        local e = state.entries[j][i]&lt;br /&gt;
        if e and e.headerindex then&lt;br /&gt;
            local h = e.headerindex&lt;br /&gt;
            if state.hide[j][h] and cellHasMeaningfulContent(e) then&lt;br /&gt;
                state.hide[j][h] = false&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function assignTeamParams(j, i)&lt;br /&gt;
    local legs = state.rlegs[j]&lt;br /&gt;
    local e = state.entries[j][i]&lt;br /&gt;
&lt;br /&gt;
    e.seed = paramNames(&amp;quot;seed&amp;quot;, j, i)&lt;br /&gt;
    e.team = paramNames(&amp;quot;team&amp;quot;, j, i)&lt;br /&gt;
    e.legs = paramNames(&amp;quot;legs&amp;quot;, j, i)&lt;br /&gt;
    e.score = {weight = {}}&lt;br /&gt;
    e.weight = &amp;quot;normal&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    if notempty(e.legs) then&lt;br /&gt;
        legs = tonumber(e.legs) or legs&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if config.autolegs then&lt;br /&gt;
        local l = 1&lt;br /&gt;
        repeat&lt;br /&gt;
            e.score[l] = paramNames(&amp;quot;score&amp;quot;, j, i, l)&lt;br /&gt;
            e.score.weight[l] = &amp;quot;normal&amp;quot;&lt;br /&gt;
            l = l + 1&lt;br /&gt;
        until isempty(paramNames(&amp;quot;score&amp;quot;, j, i, l))&lt;br /&gt;
        legs = l - 1&lt;br /&gt;
    else&lt;br /&gt;
        for l = 1, legs do&lt;br /&gt;
            e.score[l] = paramNames(&amp;quot;score&amp;quot;, j, i, l)&lt;br /&gt;
            e.score.weight[l] = &amp;quot;normal&amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if config.aggregate and legs &amp;gt; 1 then&lt;br /&gt;
        e.score.agg = paramNames(&amp;quot;score&amp;quot;, j, i, &amp;quot;agg&amp;quot;)&lt;br /&gt;
        e.score.weight.agg = &amp;quot;normal&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function assignHeaderParams(j, i)&lt;br /&gt;
    local e = state.entries[j][i]&lt;br /&gt;
    e.header = paramNames(&amp;quot;header&amp;quot;, j, i)&lt;br /&gt;
    e.pheader = paramNames(&amp;quot;pheader&amp;quot;, j, i)&lt;br /&gt;
    e.shade = paramNames(&amp;quot;shade&amp;quot;, j, i)&lt;br /&gt;
&lt;br /&gt;
    -- Did shade originate from an RD*-shade param?&lt;br /&gt;
    local hchar = toChar(e.headerindex)&lt;br /&gt;
    local rdNames = {&lt;br /&gt;
        &amp;quot;RD&amp;quot; .. j .. &amp;quot;-shade&amp;quot;,&lt;br /&gt;
        &amp;quot;RD&amp;quot; .. j .. hchar .. &amp;quot;-shade&amp;quot;,&lt;br /&gt;
        &amp;quot;RD-shade&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
    e.shade_is_rd = false&lt;br /&gt;
    for _, pname in ipairs(rdNames) do&lt;br /&gt;
        local v = bargs(pname)&lt;br /&gt;
        if notempty(v) and e.shade == v then&lt;br /&gt;
            e.shade_is_rd = true&lt;br /&gt;
            break&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function assignTextParams(j, i)&lt;br /&gt;
    state.entries[j][i].text = paramNames(&amp;quot;text&amp;quot;, j, i)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function assignGroupParams(j, i)&lt;br /&gt;
    state.entries[j][i].group = paramNames(&amp;quot;group&amp;quot;, j, i)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function assignLineTextParams(j, i)&lt;br /&gt;
    state.entries[j][i].text = paramNames(&amp;quot;text&amp;quot;, j, i)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- ========================================&lt;br /&gt;
-- 7) TABLE-WIDE ASSIGNMENT PASS&lt;br /&gt;
-- ========================================&lt;br /&gt;
local function getScalarRoundParam(j, bases) -- e.g. {&amp;quot;legs&amp;quot;,&amp;quot;sets&amp;quot;}&lt;br /&gt;
    -- prefer per-round keys, then global&lt;br /&gt;
    for _, base in ipairs(bases) do&lt;br /&gt;
        local v = bargs(&amp;quot;RD&amp;quot; .. j .. &amp;quot;-&amp;quot; .. base)&lt;br /&gt;
        if notempty(v) then&lt;br /&gt;
            return v&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    for _, base in ipairs(bases) do&lt;br /&gt;
        local v = bargs(base)&lt;br /&gt;
        if notempty(v) then&lt;br /&gt;
            return v&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return &amp;quot;&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function assignParams()&lt;br /&gt;
    masterindex = 1&lt;br /&gt;
    local maxcol = 1&lt;br /&gt;
&lt;br /&gt;
    local Cmin, Cmax, R = config.minc, config.c, config.r&lt;br /&gt;
&lt;br /&gt;
    for j = Cmin, Cmax do&lt;br /&gt;
        -- prepare per-round containers&lt;br /&gt;
        state.hide[j] = state.hide[j] or {}&lt;br /&gt;
        state.byes[j] = state.byes[j] or {}&lt;br /&gt;
&lt;br /&gt;
        -- Set legs for this column&lt;br /&gt;
        local vlegs = getScalarRoundParam(j, {&amp;quot;legs&amp;quot;, &amp;quot;sets&amp;quot;})&lt;br /&gt;
        state.rlegs[j] = tonumber(vlegs) or 1&lt;br /&gt;
        if notempty(vlegs) then&lt;br /&gt;
            config.autolegs = false&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        -- assign params&lt;br /&gt;
        if config.paramstyle == &amp;quot;numbered&amp;quot; then&lt;br /&gt;
            numberedParams(j)&lt;br /&gt;
        else&lt;br /&gt;
            local col = state.entries[j]&lt;br /&gt;
            for i = 1, R do&lt;br /&gt;
                local cell = col[i]&lt;br /&gt;
                if cell ~= nil then&lt;br /&gt;
                    local ct = cell.ctype&lt;br /&gt;
                    if ct == &amp;quot;team&amp;quot; then&lt;br /&gt;
                        assignTeamParams(j, i)&lt;br /&gt;
                    elseif ct == &amp;quot;header&amp;quot; then&lt;br /&gt;
                        assignHeaderParams(j, i)&lt;br /&gt;
                    elseif ct == &amp;quot;text&amp;quot; then&lt;br /&gt;
                        assignTextParams(j, i)&lt;br /&gt;
                    elseif ct == &amp;quot;group&amp;quot; then&lt;br /&gt;
                        assignGroupParams(j, i)&lt;br /&gt;
                    elseif ct == &amp;quot;line&amp;quot; and cell.hastext == true then&lt;br /&gt;
                        assignLineTextParams(j, i)&lt;br /&gt;
                    end&lt;br /&gt;
                end&lt;br /&gt;
                if config.autocol and not StateChecks.isBlankEntry(j, i) and j &amp;gt; maxcol then&lt;br /&gt;
                    maxcol = j&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        enforceContentUnhide(j)&lt;br /&gt;
&lt;br /&gt;
        -- parent header text forces visible&lt;br /&gt;
        for i = 1, R do&lt;br /&gt;
            local e = state.entries[j][i]&lt;br /&gt;
            if e and e.ctype == &amp;quot;header&amp;quot; then&lt;br /&gt;
                local hidx = e.headerindex&lt;br /&gt;
                if (Helpers.notempty and Helpers.notempty(e.pheader)) then&lt;br /&gt;
                    state.hide[j][hidx] = false&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if config.autocol then&lt;br /&gt;
        config.c = maxcol&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- ========================================&lt;br /&gt;
-- 8) STRUCTURE DISCOVERY (hide/byes/indices)&lt;br /&gt;
-- ========================================&lt;br /&gt;
local function getHide(j)&lt;br /&gt;
    state.hide[j] = {}&lt;br /&gt;
    state._hideExplicit = state._hideExplicit or {}&lt;br /&gt;
    state._hideExplicit[j] = {}&lt;br /&gt;
&lt;br /&gt;
    -- master round-level hide flag: RD{j}-hide&lt;br /&gt;
    local masterRaw = bargs(&amp;quot;RD&amp;quot; .. j .. &amp;quot;-hide&amp;quot;) or &amp;quot;&amp;quot;&lt;br /&gt;
    local masterOn = (Helpers and Helpers.yes and Helpers.yes(masterRaw)) or false&lt;br /&gt;
&lt;br /&gt;
    for k = 1, state.headerindex[j] do&lt;br /&gt;
        state.hide[j][k] = masterOn&lt;br /&gt;
&lt;br /&gt;
        -- per-header override&lt;br /&gt;
        local rh = readPerHeaderArg(j, k, &amp;quot;-hide&amp;quot;)&lt;br /&gt;
        if rh ~= &amp;quot;&amp;quot; then&lt;br /&gt;
            if Helpers and Helpers.yes and Helpers.yes(rh) then&lt;br /&gt;
                state.hide[j][k] = true&lt;br /&gt;
                state._hideExplicit[j][k] = true&lt;br /&gt;
            elseif Helpers and Helpers.no and Helpers.no(rh) then&lt;br /&gt;
                state.hide[j][k] = false&lt;br /&gt;
                state._hideExplicit[j][k] = true&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function getByes(j)&lt;br /&gt;
    state.byes[j] = {}&lt;br /&gt;
    for k = 1, state.headerindex[j] do&lt;br /&gt;
        -- global byes&lt;br /&gt;
        local byes = (bargs(&amp;quot;byes&amp;quot;) or &amp;quot;&amp;quot;):lower()&lt;br /&gt;
        if (Helpers.yes and Helpers.yes(byes)) then&lt;br /&gt;
            state.byes[j][k] = true&lt;br /&gt;
        elseif tonumber(byes) then&lt;br /&gt;
            state.byes[j][k] = (j &amp;lt;= tonumber(byes))&lt;br /&gt;
        else&lt;br /&gt;
            state.byes[j][k] = false&lt;br /&gt;
        end&lt;br /&gt;
        -- per-round byes&lt;br /&gt;
        local r = (bargs(&amp;quot;RD&amp;quot; .. j .. &amp;quot;-byes&amp;quot;) or &amp;quot;&amp;quot;):lower()&lt;br /&gt;
        if (Helpers.yes and Helpers.yes(r)) then&lt;br /&gt;
            state.byes[j][k] = true&lt;br /&gt;
        elseif r == &amp;quot;no&amp;quot; or r == &amp;quot;n&amp;quot; then&lt;br /&gt;
            state.byes[j][k] = false&lt;br /&gt;
        end&lt;br /&gt;
        -- per-header byes&lt;br /&gt;
        local rh = (readPerHeaderArg(j, k, &amp;quot;-byes&amp;quot;) or &amp;quot;&amp;quot;):lower()&lt;br /&gt;
        if (Helpers.yes and Helpers.yes(rh)) then&lt;br /&gt;
            state.byes[j][k] = true&lt;br /&gt;
        elseif rh == &amp;quot;no&amp;quot; or rh == &amp;quot;n&amp;quot; then&lt;br /&gt;
            state.byes[j][k] = false&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function getAltIndices()&lt;br /&gt;
    local Cmin, Cmax, R = config.minc, config.c, config.r&lt;br /&gt;
&lt;br /&gt;
    for j = Cmin, Cmax do&lt;br /&gt;
        state.headerindex[j] = 0&lt;br /&gt;
&lt;br /&gt;
        -- per-round counters&lt;br /&gt;
        local teamindex, textindex, groupindex = 1, 1, 1&lt;br /&gt;
        local row = state.entries[j]&lt;br /&gt;
&lt;br /&gt;
        -- if the very first cell is nil, bump headerindex once (legacy quirk)&lt;br /&gt;
        if row and row[1] == nil then&lt;br /&gt;
            state.headerindex[j] = state.headerindex[j] + 1&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        -- walk rows in the round&lt;br /&gt;
        for i = 1, R do&lt;br /&gt;
            local e = row and row[i] or nil&lt;br /&gt;
            if e then&lt;br /&gt;
                local ct = e.ctype&lt;br /&gt;
                if ct == &amp;quot;header&amp;quot; then&lt;br /&gt;
                    e.altindex = state.headerindex[j]&lt;br /&gt;
                    teamindex, textindex = 1, 1&lt;br /&gt;
                    state.headerindex[j] = state.headerindex[j] + 1&lt;br /&gt;
                elseif ct == &amp;quot;team&amp;quot; then&lt;br /&gt;
                    e.altindex = teamindex&lt;br /&gt;
                    teamindex = teamindex + 1&lt;br /&gt;
                elseif ct == &amp;quot;text&amp;quot; or (ct == &amp;quot;line&amp;quot; and e.hastext == true) then&lt;br /&gt;
                    e.altindex = textindex&lt;br /&gt;
                    textindex = textindex + 1&lt;br /&gt;
                elseif ct == &amp;quot;group&amp;quot; then&lt;br /&gt;
                    e.altindex = groupindex&lt;br /&gt;
                    groupindex = groupindex + 1&lt;br /&gt;
                end&lt;br /&gt;
                e.headerindex = state.headerindex[j]&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        getByes(j)&lt;br /&gt;
        getHide(j)&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- ========================================&lt;br /&gt;
-- 9) PUBLIC API&lt;br /&gt;
-- ========================================&lt;br /&gt;
function Params.buildSkeleton(_state, _config, _Helpers, _StateChecks)&lt;br /&gt;
    bind(_state, _config, _Helpers, _StateChecks)&lt;br /&gt;
    buildSkeleton()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Params.scanStructure(_state, _config, _Helpers, _StateChecks)&lt;br /&gt;
    bind(_state, _config, _Helpers, _StateChecks)&lt;br /&gt;
    getAltIndices()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Params.assign(_state, _config, _Helpers, _StateChecks)&lt;br /&gt;
    bind(_state, _config, _Helpers, _StateChecks)&lt;br /&gt;
    assignParams()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- ========================================&lt;br /&gt;
-- 10) SLICING FOR MIN ROUND (base offset)&lt;br /&gt;
-- ========================================&lt;br /&gt;
local function shiftCols(tbl, base, c)&lt;br /&gt;
    if not tbl then&lt;br /&gt;
        return {}&lt;br /&gt;
    end&lt;br /&gt;
    local out = {}&lt;br /&gt;
    for j = base + 1, c do&lt;br /&gt;
        out[j - base] = tbl[j]&lt;br /&gt;
    end&lt;br /&gt;
    return out&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Params.sliceForMinround(_state, _config)&lt;br /&gt;
    local base = _config.base or 0&lt;br /&gt;
    if base &amp;lt;= 0 then&lt;br /&gt;
        return&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local oldC = _config.c&lt;br /&gt;
    local newC = oldC - base&lt;br /&gt;
    if newC &amp;lt; 1 then&lt;br /&gt;
        newC = 1&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    -- Shift all column-indexed tables&lt;br /&gt;
    _state.entries = shiftCols(_state.entries, base, oldC)&lt;br /&gt;
    _state.headerindex = shiftCols(_state.headerindex, base, oldC)&lt;br /&gt;
    _state.rlegs = shiftCols(_state.rlegs, base, oldC)&lt;br /&gt;
    _state.maxlegs = {} -- recompute later&lt;br /&gt;
    _state.hascross = {} -- rebuild later&lt;br /&gt;
    _state.crossCell = {} -- rebuild later&lt;br /&gt;
    _state.pathCell = {} -- rebuild later&lt;br /&gt;
    _state.skipPath = {} -- rebuild later&lt;br /&gt;
    _state.hide = shiftCols(_state.hide, base, oldC)&lt;br /&gt;
    _state.byes = shiftCols(_state.byes, base, oldC)&lt;br /&gt;
    _state.teamsPerMatch = shiftCols(_state.teamsPerMatch, base, oldC)&lt;br /&gt;
    _state.matchgroup = {} -- recompute&lt;br /&gt;
&lt;br /&gt;
    -- Update view range: now we render 1..newC&lt;br /&gt;
    _config.c = newC&lt;br /&gt;
    _config.minc = 1&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return Params&lt;/div&gt;</summary>
		<author><name>Osarius</name></author>
	</entry>
	<entry>
		<id>https://nssportwiki.com/index.php?title=Module:Build_bracket/StateChecks&amp;diff=76408</id>
		<title>Module:Build bracket/StateChecks</title>
		<link rel="alternate" type="text/html" href="https://nssportwiki.com/index.php?title=Module:Build_bracket/StateChecks&amp;diff=76408"/>
		<updated>2026-07-24T10:50:37Z</updated>

		<summary type="html">&lt;p&gt;Osarius: 1 revision imported&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local StateChecks = {}&lt;br /&gt;
&lt;br /&gt;
-- =========================&lt;br /&gt;
-- 1) MODULE BINDINGS&lt;br /&gt;
-- =========================&lt;br /&gt;
-- Bound at runtime&lt;br /&gt;
local state, config, Helpers&lt;br /&gt;
&lt;br /&gt;
-- Local aliases (filled in bind; with fallbacks)&lt;br /&gt;
local isempty, notempty&lt;br /&gt;
&lt;br /&gt;
function StateChecks.bind(_state, _config, _Helpers)&lt;br /&gt;
    state, config, Helpers = _state, _config, _Helpers&lt;br /&gt;
    isempty  = (Helpers and Helpers.isempty)  or function(v) return v == nil or v == &amp;quot;&amp;quot; end&lt;br /&gt;
    notempty = (Helpers and Helpers.notempty) or function(v) return v ~= nil and v ~= &amp;quot;&amp;quot; end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- =========================&lt;br /&gt;
-- 2) CONTENT CHECKS&lt;br /&gt;
-- =========================&lt;br /&gt;
-- True when the entry at (col,row) is empty for rendering purposes.&lt;br /&gt;
-- For &#039;team&#039; → check team text; for &#039;text&#039; → check text; everything else counts as blank.&lt;br /&gt;
function StateChecks.isBlankEntry(col, row)&lt;br /&gt;
    local colEntries = state.entries and state.entries[col]&lt;br /&gt;
    if not colEntries then return true end&lt;br /&gt;
&lt;br /&gt;
    local e = colEntries[row]&lt;br /&gt;
    if not e then return true end&lt;br /&gt;
&lt;br /&gt;
    local ct = e.ctype&lt;br /&gt;
    if ct == &amp;quot;team&amp;quot; then&lt;br /&gt;
        return isempty(e.team)&lt;br /&gt;
    elseif ct == &amp;quot;text&amp;quot; then&lt;br /&gt;
        return isempty(e.text)&lt;br /&gt;
    end&lt;br /&gt;
    -- headers/lines/blanks or anything else are non-content here&lt;br /&gt;
    return true&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- =========================&lt;br /&gt;
-- 3) SEED VISIBILITY&lt;br /&gt;
-- =========================&lt;br /&gt;
-- Show seeds when forced, when this team has a seed, or when any teammate in the same match has a seed.&lt;br /&gt;
function StateChecks.showSeeds(j, i)&lt;br /&gt;
    local col = state.entries and state.entries[j]&lt;br /&gt;
    if not col then return false end&lt;br /&gt;
&lt;br /&gt;
    local e = col[i]&lt;br /&gt;
    if not e or e.ctype ~= &amp;quot;team&amp;quot; then return false end&lt;br /&gt;
&lt;br /&gt;
    if config.forceseeds or notempty(e.seed) then&lt;br /&gt;
        return true&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local group = e.group&lt;br /&gt;
    local tpm   = state.teamsPerMatch[j] or 2&lt;br /&gt;
    if tpm &amp;lt;= 1 then return false end&lt;br /&gt;
&lt;br /&gt;
    -- Teams are laid out every 2 rows per match.&lt;br /&gt;
    local step  = 2&lt;br /&gt;
    local R     = config.r&lt;br /&gt;
&lt;br /&gt;
    local function neighborHasSeed(idx)&lt;br /&gt;
        local n = col[idx]&lt;br /&gt;
        return n and n.ctype == &amp;quot;team&amp;quot; and n.group == group and notempty(n.seed)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    -- Check teammates forward/back within the match block&lt;br /&gt;
    for k = 1, tpm - 1 do&lt;br /&gt;
        local plus  = i + step * k&lt;br /&gt;
        local minus = i - step * k&lt;br /&gt;
        if plus  &amp;lt;= R and neighborHasSeed(plus)  then return true end&lt;br /&gt;
        if minus &amp;gt;= 1 and neighborHasSeed(minus) then return true end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    return false&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- =========================&lt;br /&gt;
-- 4) ROUND VISIBILITY (HIDE)&lt;br /&gt;
-- =========================&lt;br /&gt;
-- Mutates state.hide[j][hidx] to false when content is found under a header (keeps legacy semantics).&lt;br /&gt;
&lt;br /&gt;
function StateChecks.teamLegs(j, i)&lt;br /&gt;
    local col          = state.entries and state.entries[j]&lt;br /&gt;
    local roundDefault = (state.rlegs and state.rlegs[j]) or 1&lt;br /&gt;
    if not col then return roundDefault end&lt;br /&gt;
&lt;br /&gt;
    local e = col[i]&lt;br /&gt;
    if not e or e.ctype ~= &amp;quot;team&amp;quot; then return roundDefault end&lt;br /&gt;
&lt;br /&gt;
    local legs = roundDefault&lt;br /&gt;
    if notempty(e.legs) then&lt;br /&gt;
        legs = tonumber(e.legs) or legs&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    -- Treat nil/&#039;&#039; and strings containing &#039;nbsp&#039; as blank&lt;br /&gt;
    local function isScoreBlank(v)&lt;br /&gt;
        if isempty(v) then return true end&lt;br /&gt;
        return type(v) == &amp;quot;string&amp;quot; and v:find(&amp;quot;nbsp&amp;quot;, 1, true) ~= nil&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if config.autolegs and e.score then&lt;br /&gt;
        local l = 1&lt;br /&gt;
        while not isScoreBlank(e.score[l]) do&lt;br /&gt;
            l = l + 1&lt;br /&gt;
        end&lt;br /&gt;
        local inferred = l - 1&lt;br /&gt;
        if inferred &amp;gt; 0 then&lt;br /&gt;
            legs = inferred&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    return legs&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- =========================&lt;br /&gt;
-- 6) ROUND CONTENT CHECK&lt;br /&gt;
-- =========================&lt;br /&gt;
-- Used for &#039;byes&#039; detection: true when there is no content until the next header (or end).&lt;br /&gt;
function StateChecks.roundIsEmpty(j, i)&lt;br /&gt;
    local col = state.entries and state.entries[j]&lt;br /&gt;
    if not col then return true end&lt;br /&gt;
&lt;br /&gt;
    local row, R = i + 1, config.r&lt;br /&gt;
    while row &amp;lt;= R do&lt;br /&gt;
        local e = col[row]&lt;br /&gt;
        if e and e.ctype == &amp;quot;header&amp;quot; then break end&lt;br /&gt;
        if not StateChecks.isBlankEntry(j, row) then&lt;br /&gt;
            return false&lt;br /&gt;
        end&lt;br /&gt;
        row = row + 1&lt;br /&gt;
    end&lt;br /&gt;
    return true&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- =========================&lt;br /&gt;
-- 7) DEFAULT HEADER TEXT&lt;br /&gt;
-- =========================&lt;br /&gt;
-- Default header text when none provided (keeps legacy strings).&lt;br /&gt;
function StateChecks.defaultHeaderText(j, headerindex)&lt;br /&gt;
    if headerindex ~= 1 then&lt;br /&gt;
        return &amp;quot;Lower round &amp;quot; .. tostring(j)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local base    = config.base or 0&lt;br /&gt;
    local orig_j  = j + base&lt;br /&gt;
    local total   = config.c_total or (config.c + base)&lt;br /&gt;
    local rem     = total - orig_j&lt;br /&gt;
&lt;br /&gt;
    if rem == 0 then&lt;br /&gt;
        return &amp;quot;Final&amp;quot;&lt;br /&gt;
    elseif rem == 1 then&lt;br /&gt;
        return &amp;quot;Semifinals&amp;quot;&lt;br /&gt;
    elseif rem == 2 then&lt;br /&gt;
        return &amp;quot;Quarterfinals&amp;quot;&lt;br /&gt;
    else&lt;br /&gt;
        return &amp;quot;Round &amp;quot; .. tostring(orig_j)&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- =========================&lt;br /&gt;
-- 8) PATH PRESENCE CHECK&lt;br /&gt;
-- =========================&lt;br /&gt;
-- True when the path block between j → j+1 at row i has no visible lines at all.&lt;br /&gt;
function StateChecks.noPaths(j, i)&lt;br /&gt;
    local hasCross = state.hascross and state.hascross[j]&lt;br /&gt;
    local cols     = hasCross and 3 or 2&lt;br /&gt;
&lt;br /&gt;
    -- Path cells: any nonzero border means a path&lt;br /&gt;
    local pcj = state.pathCell and state.pathCell[j]&lt;br /&gt;
    local pci = pcj and pcj[i]&lt;br /&gt;
    if pci then&lt;br /&gt;
        for k = 1, cols do&lt;br /&gt;
            local edges = pci[k] and pci[k][1]&lt;br /&gt;
            if edges and (&lt;br /&gt;
                (edges[1] and edges[1] ~= 0) or&lt;br /&gt;
                (edges[2] and edges[2] ~= 0) or&lt;br /&gt;
                (edges[3] and edges[3] ~= 0) or&lt;br /&gt;
                (edges[4] and edges[4] ~= 0)&lt;br /&gt;
            ) then&lt;br /&gt;
                return false&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    -- Cross cells: left/right flag at index 1 means a cross path&lt;br /&gt;
    if hasCross then&lt;br /&gt;
        local ccj = state.crossCell and state.crossCell[j]&lt;br /&gt;
        local cci = ccj and ccj[i]&lt;br /&gt;
        if cci then&lt;br /&gt;
            local left, right = cci.left, cci.right&lt;br /&gt;
            if (left and left[1] == 1) or (right and right[1] == 1) then&lt;br /&gt;
                return false&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    return true&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return StateChecks&lt;/div&gt;</summary>
		<author><name>Osarius</name></author>
	</entry>
	<entry>
		<id>https://nssportwiki.com/index.php?title=Module:Build_bracket/Render&amp;diff=76406</id>
		<title>Module:Build bracket/Render</title>
		<link rel="alternate" type="text/html" href="https://nssportwiki.com/index.php?title=Module:Build_bracket/Render&amp;diff=76406"/>
		<updated>2026-07-24T10:50:37Z</updated>

		<summary type="html">&lt;p&gt;Osarius: 1 revision imported&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local Render = {}&lt;br /&gt;
&lt;br /&gt;
-- ================================&lt;br /&gt;
-- 1) MODULE STATE &amp;amp; BIND INJECTS&lt;br /&gt;
-- ================================&lt;br /&gt;
-- Upvalues bound in buildTable(...)&lt;br /&gt;
local state, config, Helpers, StateChecks&lt;br /&gt;
&lt;br /&gt;
-- Local stdlib aliases&lt;br /&gt;
local t_insert = table.insert&lt;br /&gt;
&lt;br /&gt;
-- Helper/function locals (set during bind)&lt;br /&gt;
local isempty, notempty, cellBorder, unboldParenthetical&lt;br /&gt;
local showSeeds, teamLegs, roundIsEmpty, defaultHeaderText, isBlankEntry&lt;br /&gt;
&lt;br /&gt;
-- =========================&lt;br /&gt;
-- 2) CORE &amp;lt;td&amp;gt; CONSTRUCTOR&lt;br /&gt;
-- =========================&lt;br /&gt;
local function Cell(tbl, j, i, opts)&lt;br /&gt;
    opts = opts or {}&lt;br /&gt;
    local cell = tbl:tag(&amp;quot;td&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    -- classes/attributes&lt;br /&gt;
    if opts.classes then&lt;br /&gt;
        for _, c in ipairs(opts.classes) do&lt;br /&gt;
            cell:addClass(c)&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    if opts.colspan and opts.colspan ~= 1 then&lt;br /&gt;
        cell:attr(&amp;quot;colspan&amp;quot;, opts.colspan)&lt;br /&gt;
    end&lt;br /&gt;
    if opts.rowspan and opts.rowspan ~= 1 then&lt;br /&gt;
        cell:attr(&amp;quot;rowspan&amp;quot;, opts.rowspan)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    -- styling&lt;br /&gt;
    if opts.borderWidth then&lt;br /&gt;
        cell:css(&amp;quot;border-width&amp;quot;, cellBorder(opts.borderWidth))&lt;br /&gt;
    end&lt;br /&gt;
    if opts.weight == &amp;quot;bold&amp;quot; then&lt;br /&gt;
        cell:css(&amp;quot;font-weight&amp;quot;, &amp;quot;bold&amp;quot;)&lt;br /&gt;
    end&lt;br /&gt;
    if opts.bg then&lt;br /&gt;
        cell:css(&amp;quot;background&amp;quot;, opts.bg)&lt;br /&gt;
    end&lt;br /&gt;
    if opts.color then&lt;br /&gt;
        cell:css(&amp;quot;color&amp;quot;, opts.color)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    -- alignment helpers&lt;br /&gt;
    if opts.align == &amp;quot;center&amp;quot; then&lt;br /&gt;
        cell:addClass(&amp;quot;brk-center&amp;quot;)&lt;br /&gt;
    elseif opts.align == &amp;quot;right&amp;quot; then&lt;br /&gt;
        cell:css(&amp;quot;text-align&amp;quot;, &amp;quot;right&amp;quot;)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if opts.text then&lt;br /&gt;
        cell:wikitext(opts.text)&lt;br /&gt;
    end&lt;br /&gt;
    return cell&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- =====================================&lt;br /&gt;
-- 3) ENTRY SIZING (computed per-round)&lt;br /&gt;
-- =====================================&lt;br /&gt;
local entryColspan = nil&lt;br /&gt;
local function getEntryColspan(j)&lt;br /&gt;
    return entryColspan and entryColspan[j] or 1&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- ==========================&lt;br /&gt;
-- 4) TEAM / SCORE CELLS&lt;br /&gt;
-- ==========================&lt;br /&gt;
local function teamCell(tbl, k, j, i, l, colspan)&lt;br /&gt;
    local classes = {&amp;quot;brk-td&amp;quot;, &amp;quot;brk-b&amp;quot;, (k == &amp;quot;seed&amp;quot;) and &amp;quot;brk-bgD&amp;quot; or &amp;quot;brk-bgL&amp;quot;}&lt;br /&gt;
    if k == &amp;quot;seed&amp;quot; or k == &amp;quot;score&amp;quot; then&lt;br /&gt;
        classes[#classes + 1] = &amp;quot;brk-center&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    -- strict bolding&lt;br /&gt;
    local weightFlag&lt;br /&gt;
    if k == &amp;quot;team&amp;quot; then&lt;br /&gt;
        if state.entries[j][i].weight == &amp;quot;bold&amp;quot; then&lt;br /&gt;
            weightFlag = &amp;quot;bold&amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
    elseif k == &amp;quot;score&amp;quot; and l ~= nil then&lt;br /&gt;
        local sc = state.entries[j][i].score&lt;br /&gt;
        if sc and sc.weight and sc.weight[l] == &amp;quot;bold&amp;quot; then&lt;br /&gt;
            weightFlag = &amp;quot;bold&amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local legs = teamLegs(j, i)&lt;br /&gt;
    local opts = {&lt;br /&gt;
        classes = classes,&lt;br /&gt;
        colspan = colspan,&lt;br /&gt;
        rowspan = 2,&lt;br /&gt;
        borderWidth = {0, 0, 1, 1},&lt;br /&gt;
        weight = weightFlag -- &#039;bold&#039; or nil&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    -- borders&lt;br /&gt;
    if k == &amp;quot;team&amp;quot; and legs == 0 then&lt;br /&gt;
        opts.borderWidth[2] = 1&lt;br /&gt;
    end&lt;br /&gt;
    if state.entries[j][i].position == &amp;quot;top&amp;quot; then&lt;br /&gt;
        opts.borderWidth[1] = 1&lt;br /&gt;
    end&lt;br /&gt;
    if l == legs or l == &amp;quot;agg&amp;quot; or k == &amp;quot;seed&amp;quot; then&lt;br /&gt;
        opts.borderWidth[2] = 1&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    -- text&lt;br /&gt;
    local function tostr(x)&lt;br /&gt;
        return (x == nil) and &amp;quot;&amp;quot; or tostring(x)&lt;br /&gt;
    end&lt;br /&gt;
    if l == nil then&lt;br /&gt;
        opts.text = unboldParenthetical(tostr(state.entries[j][i][k]))&lt;br /&gt;
    else&lt;br /&gt;
        local v = state.entries[j][i][k] and state.entries[j][i][k][l]&lt;br /&gt;
        opts.text = tostr(v)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    -- ensure seeds inherit team bold without affecting score logic&lt;br /&gt;
    if k == &amp;quot;seed&amp;quot; and state.entries[j][i] and state.entries[j][i].weight == &amp;quot;bold&amp;quot; then&lt;br /&gt;
        opts.weight = opts.weight or &amp;quot;bold&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
    return Cell(tbl, j, i, opts)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- ======================================&lt;br /&gt;
-- 5) NIL/BLANK ENTRY HANDLING PER CELL&lt;br /&gt;
-- ======================================&lt;br /&gt;
local function handleEmptyOrNilEntry(tbl, j, i, R)&lt;br /&gt;
    local entry_colspan = getEntryColspan(j)&lt;br /&gt;
    local col = state.entries[j] or {}&lt;br /&gt;
&lt;br /&gt;
    -- nil entry: optionally emit spanning blank to keep grid intact&lt;br /&gt;
    if col[i] == nil then&lt;br /&gt;
        if col[i - 1] ~= nil or i == 1 then&lt;br /&gt;
            local rowspan, row = 0, i&lt;br /&gt;
            repeat&lt;br /&gt;
                rowspan = rowspan + 1&lt;br /&gt;
                row = row + 1&lt;br /&gt;
            until col[row] ~= nil or row &amp;gt; R&lt;br /&gt;
            Cell(tbl, j, i, {rowspan = rowspan, colspan = entry_colspan})&lt;br /&gt;
            return true&lt;br /&gt;
        else&lt;br /&gt;
            return true -- intentionally omitted cell&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if col[i][&amp;quot;ctype&amp;quot;] == &amp;quot;blank&amp;quot; then&lt;br /&gt;
        return true&lt;br /&gt;
    end&lt;br /&gt;
    return false&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- ============================&lt;br /&gt;
-- 6) ENTRY INSERTORS (ctype)&lt;br /&gt;
-- ============================&lt;br /&gt;
-- 6.1 Header&lt;br /&gt;
local function insertHeader(tbl, j, i, entry)&lt;br /&gt;
    local byesJ = state.byes[j]&lt;br /&gt;
    local hideJ = state.hide[j]&lt;br /&gt;
    local entry_colspan = getEntryColspan(j)&lt;br /&gt;
&lt;br /&gt;
    if (byesJ and byesJ[entry.headerindex] and roundIsEmpty(j, i)) or (hideJ and hideJ[entry.headerindex]) then&lt;br /&gt;
        return Cell(tbl, j, i, {rowspan = 2, colspan = entry_colspan})&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if isempty(entry.header) then&lt;br /&gt;
        entry.header = defaultHeaderText(j, entry.headerindex)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local classes = {&amp;quot;brk-td&amp;quot;, &amp;quot;brk-b&amp;quot;, &amp;quot;brk-center&amp;quot;}&lt;br /&gt;
    local useCustomShade = entry.shade_is_rd and not isempty(entry.shade)&lt;br /&gt;
    if not useCustomShade then&lt;br /&gt;
        t_insert(classes, &amp;quot;brk-bgD&amp;quot;)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local cellOpts = {&lt;br /&gt;
        rowspan = 2,&lt;br /&gt;
        colspan = entry_colspan,&lt;br /&gt;
        text = entry.header,&lt;br /&gt;
        classes = classes,&lt;br /&gt;
        borderWidth = {1, 1, 1, 1}&lt;br /&gt;
    }&lt;br /&gt;
    if useCustomShade then&lt;br /&gt;
        cellOpts.bg = entry.shade&lt;br /&gt;
    end&lt;br /&gt;
    return Cell(tbl, j, i, cellOpts)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- 6.2 Team (+seed/+scores/+agg)&lt;br /&gt;
local function insertTeam(tbl, j, i, entry)&lt;br /&gt;
    local byesJ = state.byes[j]&lt;br /&gt;
    local hideJ = state.hide[j]&lt;br /&gt;
    local entry_colspan = getEntryColspan(j)&lt;br /&gt;
    local maxlegs = state.maxlegs[j] or 1&lt;br /&gt;
    local legs = teamLegs(j, i)&lt;br /&gt;
    local team_colspan = maxlegs - legs + 1&lt;br /&gt;
&lt;br /&gt;
    -- bye/hidden → reserve footprint&lt;br /&gt;
    if ((byesJ and byesJ[entry.headerindex]) and isBlankEntry(j, i)) or (hideJ and hideJ[entry.headerindex]) then&lt;br /&gt;
        return Cell(tbl, j, i, {rowspan = 2, colspan = entry_colspan})&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if config.aggregate and legs == 1 and maxlegs &amp;gt; 1 then&lt;br /&gt;
        team_colspan = team_colspan + 1&lt;br /&gt;
    end&lt;br /&gt;
    if maxlegs == 0 then&lt;br /&gt;
        team_colspan = team_colspan + 1&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    -- seed&lt;br /&gt;
    if config.seeds then&lt;br /&gt;
        if showSeeds(j, i) == true then&lt;br /&gt;
            teamCell(tbl, &amp;quot;seed&amp;quot;, j, i)&lt;br /&gt;
        else&lt;br /&gt;
            team_colspan = team_colspan + 1&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    -- team name&lt;br /&gt;
    teamCell(tbl, &amp;quot;team&amp;quot;, j, i, nil, team_colspan)&lt;br /&gt;
&lt;br /&gt;
    -- scores&lt;br /&gt;
    for l = 1, legs do&lt;br /&gt;
        teamCell(tbl, &amp;quot;score&amp;quot;, j, i, l)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    -- aggregate&lt;br /&gt;
    if config.aggregate and legs &amp;gt; 1 then&lt;br /&gt;
        teamCell(tbl, &amp;quot;score&amp;quot;, j, i, &amp;quot;agg&amp;quot;)&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- 6.3 Text&lt;br /&gt;
local function insertText(tbl, j, i, entry)&lt;br /&gt;
    Cell(tbl, j, i, {rowspan = 2, colspan = getEntryColspan(j), text = entry.text})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- 6.4 Group (spans columns)&lt;br /&gt;
local function insertGroup(tbl, j, i, entry)&lt;br /&gt;
    local span = state.entries[j][i].colspan or 1&lt;br /&gt;
    local colspan = 0&lt;br /&gt;
&lt;br /&gt;
    -- sum entry widths per column&lt;br /&gt;
    for m = j, j + span - 1 do&lt;br /&gt;
        colspan = colspan + state.maxlegs[m] + 2&lt;br /&gt;
        if not config.seeds then&lt;br /&gt;
            colspan = colspan - 1&lt;br /&gt;
        end&lt;br /&gt;
        if (config.aggregate and state.maxlegs[m] &amp;gt; 1) or state.maxlegs[m] == 0 then&lt;br /&gt;
            colspan = colspan + 1&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    -- add path columns between rounds&lt;br /&gt;
    for m = j, j + span - 2 do&lt;br /&gt;
        colspan = colspan + (state.hascross[m] and 3 or 2)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    return Cell(tbl, j, i, {rowspan = 2, colspan = colspan, classes = {&amp;quot;brk-center&amp;quot;}, text = entry.group or &amp;quot;&amp;quot;})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- 6.5 Line&lt;br /&gt;
local function insertLine(tbl, j, i, entry)&lt;br /&gt;
    local entry_colspan = getEntryColspan(j)&lt;br /&gt;
&lt;br /&gt;
    local borderWidth = {0, 0, 0, 0}&lt;br /&gt;
    if entry.borderWidth then&lt;br /&gt;
        borderWidth = entry.borderWidth&lt;br /&gt;
    else&lt;br /&gt;
        -- derive from left path column&lt;br /&gt;
        local wantTop = entry.border == &amp;quot;top&amp;quot; or entry.border == &amp;quot;both&amp;quot;&lt;br /&gt;
        local wantBottom = (entry.border == nil) or entry.border == &amp;quot;bottom&amp;quot; or entry.border == &amp;quot;both&amp;quot;&lt;br /&gt;
&lt;br /&gt;
        if wantBottom and state.pathCell[j - 1] and state.pathCell[j - 1][i + 1] then&lt;br /&gt;
            borderWidth[3] = 2 * (state.pathCell[j - 1][i + 1][3][1][3] or 0)&lt;br /&gt;
        end&lt;br /&gt;
        if wantTop and state.pathCell[j - 1] and state.pathCell[j - 1][i] then&lt;br /&gt;
            borderWidth[1] = 2 * (state.pathCell[j - 1][i][3][1][1] or 0)&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local cell = Cell(tbl, j, i, {rowspan = 2, colspan = entry_colspan, text = entry.text, borderWidth = borderWidth})&lt;br /&gt;
    cell:addClass(&amp;quot;brk-line&amp;quot;)&lt;br /&gt;
    if entry.color then&lt;br /&gt;
        cell:css(&amp;quot;border-color&amp;quot;, entry.color)&lt;br /&gt;
    end&lt;br /&gt;
    return cell&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local INSERTORS = {&lt;br /&gt;
    header = insertHeader,&lt;br /&gt;
    team = insertTeam,&lt;br /&gt;
    text = insertText,&lt;br /&gt;
    group = insertGroup,&lt;br /&gt;
    line = insertLine&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
local function insertEntry(tbl, j, i, R)&lt;br /&gt;
    if handleEmptyOrNilEntry(tbl, j, i, R) then&lt;br /&gt;
        return&lt;br /&gt;
    end&lt;br /&gt;
    local entry = state.entries[j][i]&lt;br /&gt;
    if not entry then&lt;br /&gt;
        return&lt;br /&gt;
    end&lt;br /&gt;
    local fn = INSERTORS[entry.ctype]&lt;br /&gt;
    if fn then&lt;br /&gt;
        return fn(tbl, j, i, entry)&lt;br /&gt;
    end&lt;br /&gt;
    return Cell(tbl, j, i, {rowspan = 2, colspan = getEntryColspan(j)})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- ===================================&lt;br /&gt;
-- 7) PATH CELL EMITTERS (between RDs)&lt;br /&gt;
-- ===================================&lt;br /&gt;
-- Always emit the correct number of &amp;lt;td&amp;gt;s:&lt;br /&gt;
-- - 2 lanes when no cross (k=1,3)&lt;br /&gt;
-- - 3 lanes when cross (k=1,2,3). The center lane (k=2) is skipped only if no cross.&lt;br /&gt;
local function generatePathCell(tbl, j, i, k, bg, rowspan)&lt;br /&gt;
    if not state.hascross[j] and k == 2 then&lt;br /&gt;
        return&lt;br /&gt;
    end -- keep table aligned&lt;br /&gt;
&lt;br /&gt;
    local colData = state.pathCell[j][i][k]&lt;br /&gt;
    local borders = (colData and colData[1]) or {0, 0, 0, 0}&lt;br /&gt;
    local color = (colData and colData.color) or &amp;quot;transparent&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    local cell = tbl:tag(&amp;quot;td&amp;quot;)&lt;br /&gt;
    if rowspan and rowspan ~= 1 then&lt;br /&gt;
        cell:attr(&amp;quot;rowspan&amp;quot;, rowspan)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if k == 2 and state.hascross[j] and notempty(bg) then&lt;br /&gt;
        cell:css(&amp;quot;background&amp;quot;, bg):css(&amp;quot;transform&amp;quot;, &amp;quot;translate(-1px)&amp;quot;)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if borders[1] ~= 0 or borders[2] ~= 0 or borders[3] ~= 0 or borders[4] ~= 0 then&lt;br /&gt;
        cell:css(&amp;quot;border&amp;quot;, &amp;quot;solid &amp;quot; .. color):css(&lt;br /&gt;
            &amp;quot;border-width&amp;quot;,&lt;br /&gt;
            (2 * borders[1]) ..&lt;br /&gt;
                &amp;quot;px &amp;quot; .. (2 * borders[2]) .. &amp;quot;px &amp;quot; .. (2 * borders[3]) .. &amp;quot;px &amp;quot; .. (2 * borders[4]) .. &amp;quot;px&amp;quot;&lt;br /&gt;
        )&lt;br /&gt;
    end&lt;br /&gt;
    return cell&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function insertPath(tbl, j, i, R)&lt;br /&gt;
    if state.skipPath[j][i] then&lt;br /&gt;
        return&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local colspan, rowspan = 2, 1&lt;br /&gt;
    local bg = &amp;quot;&amp;quot;&lt;br /&gt;
    local cross = {&amp;quot;&amp;quot;, &amp;quot;&amp;quot;}&lt;br /&gt;
&lt;br /&gt;
    local Pj = state.pathCell[j]&lt;br /&gt;
    local Xj = state.crossCell[j]&lt;br /&gt;
    local SPj = state.skipPath[j]&lt;br /&gt;
&lt;br /&gt;
    -- vertical merge: extend rowspan down while borders repeat identically&lt;br /&gt;
    if i &amp;lt; R then&lt;br /&gt;
        local function sameBorders(a)&lt;br /&gt;
            if a &amp;gt; R - 1 or SPj[a] then&lt;br /&gt;
                return false&lt;br /&gt;
            end&lt;br /&gt;
            local pi, pa = Pj[i], Pj[a]&lt;br /&gt;
            for k = 1, 3 do&lt;br /&gt;
                local bi, ba = pi[k][1], pa[k][1]&lt;br /&gt;
                if bi[1] ~= ba[1] or bi[2] ~= ba[2] or bi[3] ~= ba[3] or bi[4] ~= ba[4] then&lt;br /&gt;
                    return false&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
            return true&lt;br /&gt;
        end&lt;br /&gt;
        if sameBorders(i) then&lt;br /&gt;
            local row = i&lt;br /&gt;
            repeat&lt;br /&gt;
                if row ~= i and sameBorders(row) then&lt;br /&gt;
                    SPj[row] = true&lt;br /&gt;
                end&lt;br /&gt;
                rowspan = rowspan + 1&lt;br /&gt;
                row = row + 1&lt;br /&gt;
            until row &amp;gt; R or not sameBorders(row)&lt;br /&gt;
            rowspan = rowspan - 1&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    -- avoid double-emitting cross rows (previous row already spans)&lt;br /&gt;
    if&lt;br /&gt;
        i &amp;gt; 1 and Xj[i - 1] and&lt;br /&gt;
            ((Xj[i - 1].left and Xj[i - 1].left[1] == 1) or (Xj[i - 1].right and Xj[i - 1].right[1] == 1))&lt;br /&gt;
     then&lt;br /&gt;
        return&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    -- cross visuals&lt;br /&gt;
    if state.hascross[j] then&lt;br /&gt;
        colspan = 3&lt;br /&gt;
        if Xj[i].left[1] == 1 or Xj[i].right[1] == 1 then&lt;br /&gt;
            rowspan = 2&lt;br /&gt;
            if Xj[i].left[1] == 1 then&lt;br /&gt;
                cross[1] =&lt;br /&gt;
                    &amp;quot;linear-gradient(to top right, transparent calc(50% - 1px),&amp;quot; ..&lt;br /&gt;
                    Xj[i].left[2] ..&lt;br /&gt;
                        &amp;quot; calc(50% - 1px),&amp;quot; .. Xj[i].left[2] .. &amp;quot; calc(50% + 1px), transparent calc(50% + 1px))&amp;quot;&lt;br /&gt;
            end&lt;br /&gt;
            if Xj[i].right[1] == 1 then&lt;br /&gt;
                cross[2] =&lt;br /&gt;
                    &amp;quot;linear-gradient(to bottom right, transparent calc(50% - 1px),&amp;quot; ..&lt;br /&gt;
                    Xj[i].right[2] ..&lt;br /&gt;
                        &amp;quot; calc(50% - 1px),&amp;quot; .. Xj[i].right[2] .. &amp;quot; calc(50% + 1px), transparent calc(50% + 1px))&amp;quot;&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
        if notempty(cross[1]) and notempty(cross[2]) then&lt;br /&gt;
            cross[1] = cross[1] .. &amp;quot;,&amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
        bg = cross[1] .. cross[2]&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    -- emit L | (CENTER) | R cells&lt;br /&gt;
    for k = 1, 3 do&lt;br /&gt;
        generatePathCell(tbl, j, i, k, bg, rowspan)&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- =========================================&lt;br /&gt;
-- 8) INVISIBLE SCAFFOLDING (LEGACY COMPAT)&lt;br /&gt;
-- =========================================&lt;br /&gt;
local function emitRowHeight(tr, rowHeightPx) -- left height cell per data row&lt;br /&gt;
    tr:tag(&amp;quot;td&amp;quot;):css(&amp;quot;height&amp;quot;, rowHeightPx)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- widths row: fixes widths for seed/team/score(+agg) and path columns&lt;br /&gt;
local function emitWidthsRow(tbl, MINC, C, seedW, teamW, scoreW, aggW, pathW, leftPad, rightPad, crossW, crossPad)&lt;br /&gt;
    tbl:tag(&amp;quot;tr&amp;quot;):css(&amp;quot;visibility&amp;quot;, &amp;quot;collapse&amp;quot;) -- spacer&lt;br /&gt;
&lt;br /&gt;
    local tr = tbl:tag(&amp;quot;tr&amp;quot;)&lt;br /&gt;
    tr:tag(&amp;quot;td&amp;quot;):css(&amp;quot;width&amp;quot;, &amp;quot;1px&amp;quot;) -- tiny leading gutter&lt;br /&gt;
&lt;br /&gt;
    for j = MINC, C do&lt;br /&gt;
        if config.seeds then&lt;br /&gt;
            tr:tag(&amp;quot;td&amp;quot;):css(&amp;quot;width&amp;quot;, seedW)&lt;br /&gt;
        end&lt;br /&gt;
        tr:tag(&amp;quot;td&amp;quot;):css(&amp;quot;width&amp;quot;, teamW)&lt;br /&gt;
&lt;br /&gt;
        local maxlegs = (state.maxlegs and state.maxlegs[j]) or 1&lt;br /&gt;
        if maxlegs &amp;lt;= 0 then&lt;br /&gt;
            tr:tag(&amp;quot;td&amp;quot;):css(&amp;quot;width&amp;quot;, scoreW) -- legacy extra column when maxlegs == 0&lt;br /&gt;
        else&lt;br /&gt;
            for _ = 1, maxlegs do&lt;br /&gt;
                tr:tag(&amp;quot;td&amp;quot;):css(&amp;quot;width&amp;quot;, scoreW)&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
        if config.aggregate and maxlegs &amp;gt; 1 then&lt;br /&gt;
            tr:tag(&amp;quot;td&amp;quot;):css(&amp;quot;width&amp;quot;, aggW)&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        if j &amp;lt; C then&lt;br /&gt;
            if state.hascross and state.hascross[j] then&lt;br /&gt;
                tr:tag(&amp;quot;td&amp;quot;):css(&amp;quot;width&amp;quot;, pathW):css(&amp;quot;padding-left&amp;quot;, leftPad) -- L&lt;br /&gt;
                tr:tag(&amp;quot;td&amp;quot;):css(&amp;quot;width&amp;quot;, crossW):css(&amp;quot;padding-left&amp;quot;, crossPad) -- CENTER&lt;br /&gt;
                tr:tag(&amp;quot;td&amp;quot;):css(&amp;quot;width&amp;quot;, pathW):css(&amp;quot;padding-right&amp;quot;, rightPad) -- R&lt;br /&gt;
            else&lt;br /&gt;
                tr:tag(&amp;quot;td&amp;quot;):css(&amp;quot;width&amp;quot;, pathW):css(&amp;quot;padding-left&amp;quot;, leftPad) -- L&lt;br /&gt;
                tr:tag(&amp;quot;td&amp;quot;):css(&amp;quot;width&amp;quot;, pathW):css(&amp;quot;padding-right&amp;quot;, rightPad) -- R&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- ==============================&lt;br /&gt;
-- 9) PUBLIC: BUILD THE TABLE&lt;br /&gt;
-- ==============================&lt;br /&gt;
function Render.buildTable(frame, _state, _config, _Helpers, _StateChecks)&lt;br /&gt;
    -- Bind upvalues&lt;br /&gt;
    state, config, Helpers, StateChecks = _state, _config, _Helpers, _StateChecks&lt;br /&gt;
&lt;br /&gt;
    -- Helpers&lt;br /&gt;
    isempty, notempty = Helpers.isempty, Helpers.notempty&lt;br /&gt;
    cellBorder = Helpers.cellBorder&lt;br /&gt;
    unboldParenthetical = Helpers.unboldParenthetical&lt;br /&gt;
&lt;br /&gt;
    -- State checks&lt;br /&gt;
    showSeeds = StateChecks.showSeeds&lt;br /&gt;
    teamLegs = StateChecks.teamLegs&lt;br /&gt;
    roundIsEmpty = StateChecks.roundIsEmpty&lt;br /&gt;
    defaultHeaderText = StateChecks.defaultHeaderText&lt;br /&gt;
    isBlankEntry = StateChecks.isBlankEntry&lt;br /&gt;
&lt;br /&gt;
    -- Hot locals&lt;br /&gt;
    local MINC, C = config.minc, config.c&lt;br /&gt;
    local R0 = tonumber(config.r) or 0&lt;br /&gt;
    local entries = state.entries&lt;br /&gt;
    local pathCell = state.pathCell&lt;br /&gt;
    local crossCell = state.crossCell&lt;br /&gt;
    local hide = state.hide or {}&lt;br /&gt;
    local byes = state.byes or {}&lt;br /&gt;
    local maxlegsArr = state.maxlegs or {}&lt;br /&gt;
    local hascross = state.hascross or {}&lt;br /&gt;
&lt;br /&gt;
    -- Respect explicit |rows=|&lt;br /&gt;
    local userRowsArg = config._fargs and config._fargs.rows&lt;br /&gt;
&lt;br /&gt;
    -- Is this entry visibly rendered&lt;br /&gt;
    local function entryIsVisible(j, i)&lt;br /&gt;
        local col = entries[j]&lt;br /&gt;
        local e = col and col[i]&lt;br /&gt;
        if not e then&lt;br /&gt;
            return false&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        local ct = e.ctype&lt;br /&gt;
        local hidx = e.headerindex&lt;br /&gt;
        local hid = (hide[j] and hide[j][hidx]) or false&lt;br /&gt;
        if hid then&lt;br /&gt;
            return false&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        if ct == &amp;quot;team&amp;quot; then&lt;br /&gt;
            local bye = (byes[j] and byes[j][hidx]) or false&lt;br /&gt;
            if bye and isBlankEntry(j, i) then&lt;br /&gt;
                return false&lt;br /&gt;
            end&lt;br /&gt;
            return true&lt;br /&gt;
        elseif ct == &amp;quot;header&amp;quot; then&lt;br /&gt;
            local bye = (byes[j] and byes[j][hidx]) or false&lt;br /&gt;
            if bye and roundIsEmpty(j, i) then&lt;br /&gt;
                return false&lt;br /&gt;
            end&lt;br /&gt;
            return true -- header shows (defaults applied) unless hidden or bye+empty&lt;br /&gt;
        elseif ct == &amp;quot;text&amp;quot; then&lt;br /&gt;
            return notempty(e.text)&lt;br /&gt;
        elseif ct == &amp;quot;group&amp;quot; then&lt;br /&gt;
            return notempty(e.group)&lt;br /&gt;
        elseif ct == &amp;quot;line&amp;quot; then&lt;br /&gt;
            -- Count visible borders via path scan, not the placeholder cell itself&lt;br /&gt;
            return notempty(e.text) -- only count if it actually prints text&lt;br /&gt;
        end&lt;br /&gt;
        return false&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    -- Backward scan for last visually-used row (entries or painted paths)&lt;br /&gt;
    local function computeBottomUsedRow(R)&lt;br /&gt;
        for i = R, 1, -1 do&lt;br /&gt;
            -- Any visible entry on this row?&lt;br /&gt;
            for j = MINC, C do&lt;br /&gt;
                if entryIsVisible(j, i) then&lt;br /&gt;
                    local e = entries[j][i]&lt;br /&gt;
                    -- teams occupy a row pair → include the following row if within bounds&lt;br /&gt;
                    if e.ctype == &amp;quot;team&amp;quot; then&lt;br /&gt;
                        return (i + 1 &amp;lt;= R) and (i + 1) or i&lt;br /&gt;
                    else&lt;br /&gt;
                        return i&lt;br /&gt;
                    end&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
&lt;br /&gt;
            -- Any path/cross on this row?&lt;br /&gt;
            for j = MINC, C - 1 do&lt;br /&gt;
                local Pj = pathCell[j]&lt;br /&gt;
                local Xj = crossCell[j]&lt;br /&gt;
&lt;br /&gt;
                -- Cross uses a row pair&lt;br /&gt;
                local cc = Xj and Xj[i]&lt;br /&gt;
                if cc and ((cc.left and cc.left[1] == 1) or (cc.right and cc.right[1] == 1)) then&lt;br /&gt;
                    return (i + 1 &amp;lt;= R) and (i + 1) or i&lt;br /&gt;
                end&lt;br /&gt;
&lt;br /&gt;
                -- Any nonzero border on any lane?&lt;br /&gt;
                local row = Pj and Pj[i]&lt;br /&gt;
                if row then&lt;br /&gt;
                    for k = 1, 3 do&lt;br /&gt;
                        local cell = row[k]&lt;br /&gt;
                        local b = cell and cell[1]&lt;br /&gt;
                        if b and ((b[1] or 0) ~= 0 or (b[2] or 0) ~= 0 or (b[3] or 0) ~= 0 or (b[4] or 0) ~= 0) then&lt;br /&gt;
                            return i&lt;br /&gt;
                        end&lt;br /&gt;
                    end&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
        return 1 -- nothing visible; keep at least one row&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    -- Effective number of data rows to emit&lt;br /&gt;
    local R_eff = (userRowsArg and userRowsArg ~= &amp;quot;&amp;quot;) and R0 or computeBottomUsedRow(R0)&lt;br /&gt;
&lt;br /&gt;
    -- Precompute entryColspan per round&lt;br /&gt;
    entryColspan = {}&lt;br /&gt;
    for j = MINC, C do&lt;br /&gt;
        local ml = maxlegsArr[j] or 1&lt;br /&gt;
        local col = ml + 2&lt;br /&gt;
        if not config.seeds then&lt;br /&gt;
            col = col - 1&lt;br /&gt;
        end&lt;br /&gt;
        if (config.aggregate and ml &amp;gt; 1) or ml == 0 then&lt;br /&gt;
            col = col + 1&lt;br /&gt;
        end&lt;br /&gt;
        entryColspan[j] = col&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    -- Table skeleton&lt;br /&gt;
    local tbl = mw.html.create(&amp;quot;table&amp;quot;):addClass(&amp;quot;brk&amp;quot;)&lt;br /&gt;
    if config.nowrap then&lt;br /&gt;
        tbl:addClass(&amp;quot;brk-nw&amp;quot;)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    -- Fixed internal row height (do NOT use config.height here)&lt;br /&gt;
    local rowHeightPx = &amp;quot;11px&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    -- Column widths (resolve once)&lt;br /&gt;
    local getWidth = Helpers.getWidth&lt;br /&gt;
    local seedW = (getWidth and getWidth(&amp;quot;seed&amp;quot;, &amp;quot;25px&amp;quot;)) or &amp;quot;25px&amp;quot;&lt;br /&gt;
    local teamW = (getWidth and getWidth(&amp;quot;team&amp;quot;, &amp;quot;150px&amp;quot;)) or &amp;quot;150px&amp;quot;&lt;br /&gt;
    local scoreW = (getWidth and getWidth(&amp;quot;score&amp;quot;, &amp;quot;25px&amp;quot;)) or &amp;quot;25px&amp;quot;&lt;br /&gt;
    local aggRaw = (getWidth and getWidth(&amp;quot;agg&amp;quot;, nil)) or nil&lt;br /&gt;
    local aggW = Helpers.isempty(aggRaw) and scoreW or aggRaw&lt;br /&gt;
    local pathW = &amp;quot;2px&amp;quot;&lt;br /&gt;
    local crossW = (getWidth and getWidth(&amp;quot;cross&amp;quot;, &amp;quot;5px&amp;quot;)) or &amp;quot;5px&amp;quot;&lt;br /&gt;
    local crossPad = (getWidth and getWidth(&amp;quot;crosspad&amp;quot;, &amp;quot;5px&amp;quot;)) or &amp;quot;5px&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    -- between-round spacing split (e.g., 6 → 4px left, 2px right)&lt;br /&gt;
    local spacing = tonumber(config.colspacing) or 6&lt;br /&gt;
    local leftFrac = math.floor(spacing * 2 / 3)&lt;br /&gt;
    local leftPad, rightPad = (leftFrac .. &amp;quot;px&amp;quot;), ((spacing - leftFrac) .. &amp;quot;px&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    -- widths row&lt;br /&gt;
    emitWidthsRow(tbl, MINC, C, seedW, teamW, scoreW, aggW, pathW, leftPad, rightPad, crossW, crossPad)&lt;br /&gt;
&lt;br /&gt;
    -- Data rows&lt;br /&gt;
    for i = 1, R_eff do&lt;br /&gt;
        local tr = tbl:tag(&amp;quot;tr&amp;quot;)&lt;br /&gt;
        emitRowHeight(tr, rowHeightPx) -- left height cell&lt;br /&gt;
&lt;br /&gt;
        for j = MINC, C do&lt;br /&gt;
            insertEntry(tr, j, i, R_eff)&lt;br /&gt;
            if j &amp;lt; C then&lt;br /&gt;
                insertPath(tr, j, i, R_eff)&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    -- Wrap with a div that loads TemplateStyles and enables scroll overflow&lt;br /&gt;
    local fr = frame or mw.getCurrentFrame()&lt;br /&gt;
    local container = mw.html.create(&amp;quot;div&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    -- Height now applies to container (numbers → px; units respected)&lt;br /&gt;
    local containerHeight = Helpers.toCssLength(config.height, nil)&lt;br /&gt;
    if containerHeight then&lt;br /&gt;
        container:css(&amp;quot;max-height&amp;quot;, containerHeight)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    container:css(&amp;quot;overflow-x&amp;quot;, &amp;quot;auto&amp;quot;):css(&amp;quot;overflow-y&amp;quot;, &amp;quot;auto&amp;quot;)&lt;br /&gt;
    container:wikitext(fr:extensionTag(&amp;quot;templatestyles&amp;quot;, &amp;quot;&amp;quot;, {src = &amp;quot;Module:Build bracket/styles.css&amp;quot;}))&lt;br /&gt;
    container:node(tbl)&lt;br /&gt;
&lt;br /&gt;
    return tostring(container)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- ============&lt;br /&gt;
-- 10) EXPORTS&lt;br /&gt;
-- ============&lt;br /&gt;
return Render&lt;/div&gt;</summary>
		<author><name>Osarius</name></author>
	</entry>
	<entry>
		<id>https://nssportwiki.com/index.php?title=Module:Build_bracket/Helpers&amp;diff=76404</id>
		<title>Module:Build bracket/Helpers</title>
		<link rel="alternate" type="text/html" href="https://nssportwiki.com/index.php?title=Module:Build_bracket/Helpers&amp;diff=76404"/>
		<updated>2026-07-24T10:50:37Z</updated>

		<summary type="html">&lt;p&gt;Osarius: 1 revision imported&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local Helpers = {}&lt;br /&gt;
&lt;br /&gt;
-- ====================================&lt;br /&gt;
-- 1) ARG ACCESS / BARGS WIRING&lt;br /&gt;
-- ====================================&lt;br /&gt;
local _bargs = nil&lt;br /&gt;
&lt;br /&gt;
function Helpers.setBargs(fn)&lt;br /&gt;
    _bargs = fn&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- If Config.init doesn&#039;t call this, Helpers installs fallbacks below.&lt;br /&gt;
function Helpers.installArgAccessors(fargs, pargs)&lt;br /&gt;
    Helpers.getFArg = function(k) return fargs[k] end&lt;br /&gt;
    Helpers.getPArg = function(k) return pargs[k] end&lt;br /&gt;
    Helpers.bargs   = function(k)&lt;br /&gt;
        local v = pargs[k]&lt;br /&gt;
        if v == nil or v == &amp;quot;&amp;quot; then v = fargs[k] end&lt;br /&gt;
        return v&lt;br /&gt;
    end&lt;br /&gt;
    Helpers.setBargs(Helpers.bargs)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Default bargs (so unit tests don’t explode without Config.init)&lt;br /&gt;
Helpers.bargs = function(key)&lt;br /&gt;
    if _bargs then return _bargs(key) end&lt;br /&gt;
    return nil&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- ====================================&lt;br /&gt;
-- 2) BASIC CHECKS &amp;amp; YES/NO PARSERS&lt;br /&gt;
-- ====================================&lt;br /&gt;
function Helpers.isempty(s) return s == nil or s == &amp;quot;&amp;quot; end&lt;br /&gt;
function Helpers.notempty(s) return s ~= nil and s ~= &amp;quot;&amp;quot; end&lt;br /&gt;
&lt;br /&gt;
-- tolerant, case-insensitive&lt;br /&gt;
function Helpers.yes(val)&lt;br /&gt;
    if val == nil then return false end&lt;br /&gt;
    val = tostring(val):lower()&lt;br /&gt;
    return val == &amp;quot;y&amp;quot; or val == &amp;quot;yes&amp;quot; or val == &amp;quot;true&amp;quot; or val == &amp;quot;1&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
function Helpers.no(val)&lt;br /&gt;
    if val == nil then return false end&lt;br /&gt;
    val = tostring(val):lower()&lt;br /&gt;
    return val == &amp;quot;n&amp;quot; or val == &amp;quot;no&amp;quot; or val == &amp;quot;false&amp;quot; or val == &amp;quot;0&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- ====================================&lt;br /&gt;
-- 3) STRING HELPERS&lt;br /&gt;
-- ====================================&lt;br /&gt;
-- 1 -&amp;gt; &#039;a&#039;, 2 -&amp;gt; &#039;b&#039;, ...; wraps beyond 26; clamps nil/invalid to &#039;a&#039;&lt;br /&gt;
function Helpers.toChar(num)&lt;br /&gt;
    num = tonumber(num) or 1&lt;br /&gt;
    if num &amp;lt; 1 then num = 1 end&lt;br /&gt;
    -- wrap to 1..26 to avoid errors if headers exceed 26&lt;br /&gt;
    num = ((num - 1) % 26) + 1&lt;br /&gt;
    return string.char(string.byte(&amp;quot;a&amp;quot;) + num - 1)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Escape single characters for use inside a Lua pattern character class.&lt;br /&gt;
local function _esc_cc(ch)&lt;br /&gt;
    -- dash, caret, percent, closing bracket need escaping inside [...]&lt;br /&gt;
    if ch == &amp;quot;-&amp;quot; or ch == &amp;quot;^&amp;quot; or ch == &amp;quot;]&amp;quot; or ch == &amp;quot;%&amp;quot; then&lt;br /&gt;
        return &amp;quot;%&amp;quot; .. ch&lt;br /&gt;
    end&lt;br /&gt;
    return ch&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Fast split over single-char delimiters; drops empties; optional number-cast.&lt;br /&gt;
function Helpers.split(str, delim, tonum)&lt;br /&gt;
    if Helpers.isempty(str) then return {} end&lt;br /&gt;
    local result, buf = {}, {}&lt;br /&gt;
    for i = 1, #delim do buf[#buf + 1] = _esc_cc(delim[i]) end&lt;br /&gt;
    local patt = &amp;quot;[^&amp;quot; .. table.concat(buf) .. &amp;quot;]+&amp;quot;&lt;br /&gt;
    for w in string.gmatch(str, patt) do&lt;br /&gt;
        result[#result + 1] = (tonum == true) and tonumber(w) or w&lt;br /&gt;
    end&lt;br /&gt;
    return result&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Remove bold inside (...) and [...] while preserving wikilinks [[...]]&lt;br /&gt;
function Helpers.unboldParenthetical(text)&lt;br /&gt;
    if Helpers.isempty(text) then return text end&lt;br /&gt;
&lt;br /&gt;
    local STYLE_NORMAL = &#039;&amp;lt;span style=&amp;quot;font-weight:normal&amp;quot;&amp;gt;%s&amp;lt;/span&amp;gt;&#039;&lt;br /&gt;
    local PREFIX = &amp;quot;__WIKILINK__&amp;quot;&lt;br /&gt;
    local counter, placeholders = 0, {}&lt;br /&gt;
&lt;br /&gt;
    -- 1) Extract wikilinks to placeholders&lt;br /&gt;
    text = text:gsub(&amp;quot;%[%[(.-)%]%]&amp;quot;, function(link)&lt;br /&gt;
        counter = counter + 1&lt;br /&gt;
        local key = PREFIX .. counter .. &amp;quot;__&amp;quot;&lt;br /&gt;
        placeholders[key] = link&lt;br /&gt;
        return key&lt;br /&gt;
    end)&lt;br /&gt;
&lt;br /&gt;
    -- 2) Wrap balanced (...) and [...]&lt;br /&gt;
    text = text:gsub(&amp;quot;(%b())&amp;quot;, function(m) return string.format(STYLE_NORMAL, m) end)&lt;br /&gt;
               :gsub(&amp;quot;(%b[])&amp;quot;, function(m) return string.format(STYLE_NORMAL, m) end)&lt;br /&gt;
&lt;br /&gt;
    -- 3) Restore wikilinks&lt;br /&gt;
    for key, link in pairs(placeholders) do&lt;br /&gt;
        text = text:gsub(key, &amp;quot;[[&amp;quot; .. link .. &amp;quot;]]&amp;quot;)&lt;br /&gt;
    end&lt;br /&gt;
    return text&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- ====================================&lt;br /&gt;
-- 4) STYLE &amp;amp; DIMENSIONS&lt;br /&gt;
-- ====================================&lt;br /&gt;
-- Border mask is {top, right, bottom, left}&lt;br /&gt;
function Helpers.cellBorder(b)&lt;br /&gt;
    -- assume well-formed input; callers always pass 4 numbers&lt;br /&gt;
    return b[1] .. &amp;quot;px &amp;quot; .. b[2] .. &amp;quot;px &amp;quot; .. b[3] .. &amp;quot;px &amp;quot; .. b[4] .. &amp;quot;px&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Normalize CSS length: numbers -&amp;gt; &amp;quot;Npx&amp;quot;; strings with units pass through.&lt;br /&gt;
function Helpers.toCssLength(v, defaultVal)&lt;br /&gt;
    if v == nil or v == &amp;quot;&amp;quot; then return defaultVal end&lt;br /&gt;
    local n = tonumber(v)&lt;br /&gt;
    if n then return tostring(n) .. &amp;quot;px&amp;quot; end&lt;br /&gt;
    return v&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Resolve widths from args with normalization &amp;amp; default&lt;br /&gt;
function Helpers.getWidth(ctype, defaultVal)&lt;br /&gt;
    local raw = Helpers.bargs(ctype .. &amp;quot;-width&amp;quot;)&lt;br /&gt;
    return Helpers.toCssLength(raw, defaultVal)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return Helpers&lt;/div&gt;</summary>
		<author><name>Osarius</name></author>
	</entry>
	<entry>
		<id>https://nssportwiki.com/index.php?title=Module:Build_bracket/Config&amp;diff=76402</id>
		<title>Module:Build bracket/Config</title>
		<link rel="alternate" type="text/html" href="https://nssportwiki.com/index.php?title=Module:Build_bracket/Config&amp;diff=76402"/>
		<updated>2026-07-24T10:50:37Z</updated>

		<summary type="html">&lt;p&gt;Osarius: 1 revision imported&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local Config = {}&lt;br /&gt;
&lt;br /&gt;
-- ====================================&lt;br /&gt;
-- 1) INIT &amp;amp; DEFENSIVE ACCESSORS&lt;br /&gt;
-- ====================================&lt;br /&gt;
function Config.init(frame, state, config, Helpers)&lt;br /&gt;
    -- Defend against nil inputs; don&#039;t mutate caller refs&lt;br /&gt;
    state   = state   or {}&lt;br /&gt;
    config  = config  or {}&lt;br /&gt;
    Helpers = Helpers or {}&lt;br /&gt;
&lt;br /&gt;
    -- Pull args from frame/parent (both optional)&lt;br /&gt;
    local fargs  = (frame and frame.args) or {}&lt;br /&gt;
    local parent = (frame and frame.getParent and frame:getParent()) or nil&lt;br /&gt;
    local pargs  = (parent and parent.args) or {}&lt;br /&gt;
&lt;br /&gt;
    -- Keep originals for debugging&lt;br /&gt;
    config._fargs, config._pargs = fargs, pargs&lt;br /&gt;
&lt;br /&gt;
    -- Install arg accessors (use provided installer if present)&lt;br /&gt;
    if Helpers.installArgAccessors then&lt;br /&gt;
        Helpers.installArgAccessors(fargs, pargs)&lt;br /&gt;
    else&lt;br /&gt;
        Helpers.getFArg = function(k) return fargs[k] end&lt;br /&gt;
        Helpers.getPArg = function(k) return pargs[k] end&lt;br /&gt;
        Helpers.bargs   = function(k)&lt;br /&gt;
            local v = pargs[k]&lt;br /&gt;
            if v == nil or v == &amp;quot;&amp;quot; then v = fargs[k] end&lt;br /&gt;
            return v&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    -- Short aliases&lt;br /&gt;
    local bargs   = Helpers.bargs&lt;br /&gt;
    local getFArg = Helpers.getFArg&lt;br /&gt;
    local getPArg = Helpers.getPArg&lt;br /&gt;
&lt;br /&gt;
    -- ====================================&lt;br /&gt;
    -- 2) YES/NO FALLBACKS (robust parsing)&lt;br /&gt;
    -- ====================================&lt;br /&gt;
    local function yesish(s)&lt;br /&gt;
        s = (s or &amp;quot;&amp;quot;):lower()&lt;br /&gt;
        return s == &amp;quot;y&amp;quot; or s == &amp;quot;yes&amp;quot; or s == &amp;quot;true&amp;quot; or s == &amp;quot;1&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
    local function noish(s)&lt;br /&gt;
        s = (s or &amp;quot;&amp;quot;):lower()&lt;br /&gt;
        return s == &amp;quot;n&amp;quot; or s == &amp;quot;no&amp;quot; or s == &amp;quot;false&amp;quot; or s == &amp;quot;0&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    -- Prefer Helpers.yes/no if provided; fall back to yesish/noish&lt;br /&gt;
    local YES = Helpers.yes or yesish&lt;br /&gt;
    local NO  = Helpers.no  or noish&lt;br /&gt;
&lt;br /&gt;
    -- ====================================&lt;br /&gt;
    -- 3) CORE DIMENSIONS &amp;amp; CLAMPING&lt;br /&gt;
    -- ====================================&lt;br /&gt;
    -- Rows: keep &#039;&#039; sentinel when user didn’t set |rows=|&lt;br /&gt;
    config.r = tonumber(getFArg(&amp;quot;rows&amp;quot;)) or &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    -- Rounds: {{#invoke:..|rounds=}} with optional parent override maxround(s)&lt;br /&gt;
    local rounds_f = tonumber(getFArg(&amp;quot;rounds&amp;quot;)) or 1&lt;br /&gt;
    local maxc     = tonumber(getPArg(&amp;quot;maxrounds&amp;quot;)) or tonumber(getPArg(&amp;quot;maxround&amp;quot;)) or nil&lt;br /&gt;
&lt;br /&gt;
    config.c = (type(maxc) == &amp;quot;number&amp;quot;) and maxc or rounds_f&lt;br /&gt;
&lt;br /&gt;
    -- minround -&amp;gt; base (clamped)&lt;br /&gt;
    local minr = tonumber(getPArg(&amp;quot;minround&amp;quot;)) or 1&lt;br /&gt;
    if minr &amp;lt; 1 then minr = 1 end&lt;br /&gt;
    if minr &amp;gt; config.c then minr = config.c end&lt;br /&gt;
    config.minc   = minr&lt;br /&gt;
    config.base   = minr - 1&lt;br /&gt;
    config.c_total = config.c  -- persist original visible round count&lt;br /&gt;
&lt;br /&gt;
    -- ====================================&lt;br /&gt;
    -- 4) LAYOUT/STYLE FLAGS&lt;br /&gt;
    -- ====================================&lt;br /&gt;
    config.autocol    = YES(getFArg(&amp;quot;autocol&amp;quot;))&lt;br /&gt;
    config.colspacing = tonumber(getFArg(&amp;quot;col-spacing&amp;quot;)) or 6&lt;br /&gt;
    config.height     = bargs(&amp;quot;height&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    -- nowrap can be supplied in parent or direct call&lt;br /&gt;
    local nowrapArg = getPArg(&amp;quot;nowrap&amp;quot;) or getFArg(&amp;quot;nowrap&amp;quot;)&lt;br /&gt;
    config.nowrap = not NO(nowrapArg)&lt;br /&gt;
&lt;br /&gt;
    -- ====================================&lt;br /&gt;
    -- 5) BOLDWINNER MODE/POLICY&lt;br /&gt;
    -- ====================================&lt;br /&gt;
    local bw = (bargs(&amp;quot;boldwinner&amp;quot;) or &amp;quot;&amp;quot;):lower()&lt;br /&gt;
    config.boldwinner           = bw&lt;br /&gt;
    config.boldwinner_mode      = &amp;quot;off&amp;quot;   -- &#039;high&#039; | &#039;low&#039; | &#039;off&#039;&lt;br /&gt;
    config.boldwinner_aggonly   = false   -- only bold aggregate cell/row&lt;br /&gt;
&lt;br /&gt;
    if bw == &amp;quot;low&amp;quot; then&lt;br /&gt;
        config.boldwinner_mode = &amp;quot;low&amp;quot;&lt;br /&gt;
    elseif bw == &amp;quot;high&amp;quot; or YES(bw) then&lt;br /&gt;
        config.boldwinner_mode = &amp;quot;high&amp;quot;&lt;br /&gt;
    elseif bw == &amp;quot;aggregate&amp;quot; or bw == &amp;quot;agg&amp;quot; or bw == &amp;quot;aggregate-high&amp;quot; or bw == &amp;quot;agg-high&amp;quot; then&lt;br /&gt;
        config.boldwinner_mode    = &amp;quot;high&amp;quot;&lt;br /&gt;
        config.boldwinner_aggonly = true&lt;br /&gt;
    elseif bw == &amp;quot;aggregate-low&amp;quot; or bw == &amp;quot;agg-low&amp;quot; then&lt;br /&gt;
        config.boldwinner_mode    = &amp;quot;low&amp;quot;&lt;br /&gt;
        config.boldwinner_aggonly = true&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if YES(bargs(&amp;quot;boldwinner-aggregate-only&amp;quot;)) then&lt;br /&gt;
        config.boldwinner_aggonly = true&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    -- ====================================&lt;br /&gt;
    -- 6) SEEDS &amp;amp; AGGREGATE SETTINGS&lt;br /&gt;
    -- ====================================&lt;br /&gt;
    -- forceseeds: explicit truthy; seeds: true unless explicitly &amp;quot;no&amp;quot;&lt;br /&gt;
    local seedsArg       = bargs(&amp;quot;seeds&amp;quot;)&lt;br /&gt;
    config.forceseeds    = YES(seedsArg)&lt;br /&gt;
    config.seeds         = not NO(seedsArg)&lt;br /&gt;
&lt;br /&gt;
    -- aggregate mode&lt;br /&gt;
    do&lt;br /&gt;
        local aval = (bargs(&amp;quot;aggregate&amp;quot;) or &amp;quot;&amp;quot;):lower()&lt;br /&gt;
        if aval == &amp;quot;sets&amp;quot; or aval == &amp;quot;legs&amp;quot; then&lt;br /&gt;
            config.aggregate_mode = &amp;quot;sets&amp;quot;&lt;br /&gt;
        elseif aval == &amp;quot;score&amp;quot; then&lt;br /&gt;
            config.aggregate_mode = &amp;quot;score&amp;quot;&lt;br /&gt;
        elseif YES(aval) then&lt;br /&gt;
            config.aggregate_mode = &amp;quot;manual&amp;quot;&lt;br /&gt;
        else&lt;br /&gt;
            config.aggregate_mode = &amp;quot;off&amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
        config.aggregate = (config.aggregate_mode ~= &amp;quot;off&amp;quot;)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    -- show-bye-paths (default true; only explicit &amp;quot;no&amp;quot; disables)&lt;br /&gt;
    do&lt;br /&gt;
        local v = (bargs(&amp;quot;show-bye-paths&amp;quot;) or &amp;quot;&amp;quot;):lower()&lt;br /&gt;
        config.show_bye_paths = (v == &amp;quot;&amp;quot;) and true or (not NO(v))&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    -- autolegs (explicit truthy)&lt;br /&gt;
    config.autolegs = YES(bargs(&amp;quot;autolegs&amp;quot;))&lt;br /&gt;
&lt;br /&gt;
    -- ====================================&lt;br /&gt;
    -- 7) PARAMSTYLE INFERENCE&lt;br /&gt;
    -- ====================================&lt;br /&gt;
    local styleArg = (bargs(&amp;quot;paramstyle&amp;quot;) or &amp;quot;&amp;quot;):lower()&lt;br /&gt;
    local function hasNumberedArgs()&lt;br /&gt;
        -- Scan a reasonable window of positional args from both parent/frame via bargs&lt;br /&gt;
        for n = 1, 48 do&lt;br /&gt;
            local v = bargs(tostring(n))&lt;br /&gt;
            if v ~= nil and v ~= &amp;quot;&amp;quot; then return true end&lt;br /&gt;
        end&lt;br /&gt;
        return false&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if styleArg == &amp;quot;numbered&amp;quot; then&lt;br /&gt;
        config.paramstyle = &amp;quot;numbered&amp;quot;&lt;br /&gt;
    elseif styleArg == &amp;quot;indexed&amp;quot; then&lt;br /&gt;
        config.paramstyle = &amp;quot;indexed&amp;quot;&lt;br /&gt;
    else&lt;br /&gt;
        config.paramstyle = hasNumberedArgs() and &amp;quot;numbered&amp;quot; or &amp;quot;indexed&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    -- ====================================&lt;br /&gt;
    -- 8) THEME CONSTANTS (DEFAULTS)&lt;br /&gt;
    -- ====================================&lt;br /&gt;
    config.COLORS = config.COLORS or {&lt;br /&gt;
        cell_bg_light   = &amp;quot;var(--background-color-neutral-subtle,#f8f9fa)&amp;quot;,&lt;br /&gt;
        cell_bg_dark    = &amp;quot;var(--background-color-neutral,#eaecf0)&amp;quot;,&lt;br /&gt;
        text_color      = &amp;quot;var(--color-base,#202122)&amp;quot;,&lt;br /&gt;
        path_line_color = &amp;quot;gray&amp;quot;,&lt;br /&gt;
        cell_border     = &amp;quot;var(--border-color-base,#a2a9b1)&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return state, config, Helpers&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return Config&lt;/div&gt;</summary>
		<author><name>Osarius</name></author>
	</entry>
	<entry>
		<id>https://nssportwiki.com/index.php?title=Template:Template_for_discussion/styles.css&amp;diff=76400</id>
		<title>Template:Template for discussion/styles.css</title>
		<link rel="alternate" type="text/html" href="https://nssportwiki.com/index.php?title=Template:Template_for_discussion/styles.css&amp;diff=76400"/>
		<updated>2026-07-24T10:50:37Z</updated>

		<summary type="html">&lt;p&gt;Osarius: 1 revision imported&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* {{pp-template|small=yes}} */&lt;br /&gt;
/* See [[Template:Tfd/dated]] and [[Template:Tfm/dated]] */&lt;br /&gt;
.tfd-dated {&lt;br /&gt;
	font-size: 85%;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.tfd-default {&lt;br /&gt;
	border-bottom: 1px solid var(--border-color-base, #a2a9b1);&lt;br /&gt;
	/* clear: both; probably over kill e.g. https://en.wikipedia.org/w/index.php?title=Disclosure_Day&amp;amp;oldid=1361448791#Critical_response */&lt;br /&gt;
	text-align: center;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.tfd-tiny {&lt;br /&gt;
	font-weight: bold;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.tfd-inline {&lt;br /&gt;
	border: 1px solid var(--border-color-base, #a2a9b1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.tfd-sidebar {&lt;br /&gt;
	border-bottom: 1px solid var(--border-color-base, #a2a9b1);&lt;br /&gt;
	text-align: center;&lt;br /&gt;
	position: relative;&lt;br /&gt;
	font-size: 88%;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media (min-width: 640px) {&lt;br /&gt;
	.tfd-sidebar {&lt;br /&gt;
		clear: right;&lt;br /&gt;
		float: right;&lt;br /&gt;
		width: 22em;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Hide all but the first TFD notice in each paragraph */&lt;br /&gt;
:not(.mw-parser-output):not(.documentation) &amp;gt; .tfd-dedup ~ .tfd-dedup,&lt;br /&gt;
:not(.mw-parser-output):not(.documentation) &amp;gt; .tfd-dedup ~ * .tfd-dedup {&lt;br /&gt;
    display: none;&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Osarius</name></author>
	</entry>
	<entry>
		<id>https://nssportwiki.com/index.php?title=Module:Bracket&amp;diff=76398</id>
		<title>Module:Bracket</title>
		<link rel="alternate" type="text/html" href="https://nssportwiki.com/index.php?title=Module:Bracket&amp;diff=76398"/>
		<updated>2026-07-24T10:50:36Z</updated>

		<summary type="html">&lt;p&gt;Osarius: 1 revision imported&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local p = {}&lt;br /&gt;
&lt;br /&gt;
local yesno = require(&#039;Module:yesno&#039;)&lt;br /&gt;
&lt;br /&gt;
local notblank = function(v) return (v or &#039;&#039;) ~= &#039;&#039; end&lt;br /&gt;
local rmzero = function(k) return mw.ustring.gsub(k, &amp;quot;0(%d)$&amp;quot;, &amp;quot;%1&amp;quot;) end&lt;br /&gt;
&lt;br /&gt;
p[&#039;_Bracket&#039;] = function (frame, template, subs, args)&lt;br /&gt;
	-- figure out parameters from template name&lt;br /&gt;
	local consols = string.find(template, &amp;quot;-Consols&amp;quot;)&lt;br /&gt;
	local pagePlayoff = string.find(template, &amp;quot;-PagePlayoff&amp;quot;)&lt;br /&gt;
	local stepladder = string.find(template, &amp;quot;-Stepladder&amp;quot;)&lt;br /&gt;
	if (consols or pagePlayoff or stepladder) then args.build = true end&lt;br /&gt;
	&lt;br /&gt;
	args.rounds = args.rounds or mw.ustring.match(template, &amp;quot;^(%d*)Round&amp;quot;)&lt;br /&gt;
	if not args.rounds then&lt;br /&gt;
		local teams = tonumber(mw.ustring.match(template, &amp;quot;^(%d*)Team&amp;quot;))&lt;br /&gt;
		if teams and teams &amp;gt; 1 then -- log2(teams) is the number of rounds&lt;br /&gt;
			args.rounds = math.ceil( math.log(teams)/math.log(2) )&lt;br /&gt;
			if consols then&lt;br /&gt;
				args.rounds = (args.rounds * 2) - 1&lt;br /&gt;
			elseif (pagePlayoff or stepladder) then&lt;br /&gt;
				args.rounds = args.rounds + 1&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local tennis = mw.ustring.match(template, &amp;quot;-Tennis(%d*)&amp;quot;)&lt;br /&gt;
	local squash = mw.ustring.match(template, &amp;quot;-Squash(%d*)&amp;quot;) &lt;br /&gt;
	if tennis or squash then&lt;br /&gt;
		args.sets = args.sets or tennis or squash&lt;br /&gt;
		args.seeds = args.seeds or &#039;yes&#039;&lt;br /&gt;
		args.nowrap = args.nowrap or &#039;yes&#039;&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if string.find(template, &amp;quot;-Compact&amp;quot;) then&lt;br /&gt;
		args.compact = args.compact or &#039;yes&#039;&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- remove leading zeros from defaults&lt;br /&gt;
	for k, v in pairs(args) do&lt;br /&gt;
		if k ~= rmzero(k) then&lt;br /&gt;
			args[rmzero(k)] = v&lt;br /&gt;
			args[k] = nil&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- overwrite defaults with frame args and alternative args&lt;br /&gt;
	for k, v in pairs(frame.args) do&lt;br /&gt;
		local leadingzero = mw.ustring.gsub(k, &amp;quot;([^0])(%d)$&amp;quot;, &amp;quot;%10%2&amp;quot;)&lt;br /&gt;
		-- remove leading 0&lt;br /&gt;
		k = rmzero(k)&lt;br /&gt;
		-- do substitutes&lt;br /&gt;
		if notblank(subs[k] or subs[leadingzero]) then&lt;br /&gt;
			-- strip leading 0s from substitutes&lt;br /&gt;
			k = rmzero(subs[k] or subs[leadingzero])&lt;br /&gt;
		end&lt;br /&gt;
		args[k] = v&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- process parameters for &#039;-Info&#039; templates&lt;br /&gt;
	local info = string.find(template, &amp;quot;-Info&amp;quot;)&lt;br /&gt;
	if info then&lt;br /&gt;
		for i = 1,5 do&lt;br /&gt;
			local rd = &#039;RD&#039; .. i&lt;br /&gt;
			if notblank(args[rd .. &#039;-date&#039;]) then&lt;br /&gt;
				args[rd] = (args[rd] or &#039;&#039;) .. &#039;&amp;lt;br /&amp;gt;&#039; .. args[rd .. &#039;-date&#039;]&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		args.build = true&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- return template&lt;br /&gt;
	local newFrame = frame:newChild{title = (&amp;quot;Template:&amp;quot; .. template), args = args}&lt;br /&gt;
	if args.build then&lt;br /&gt;
		return require(&#039;Module:Build bracket&#039;).main(newFrame) ..&lt;br /&gt;
			require(&#039;Module:Team bracket tracking&#039;).tracking(newFrame)&lt;br /&gt;
	end&lt;br /&gt;
	return require(&#039;Module:Team bracket&#039;).main(newFrame)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p[&#039;2TeamBracket&#039;] = function (frame)&lt;br /&gt;
	return p._Bracket(frame, &#039;2TeamBracket&#039;, {}, {autoseeds = &amp;quot;y&amp;quot;})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p[&#039;2TeamBracket-Info&#039;] = function (frame)&lt;br /&gt;
	return p._Bracket(frame, &#039;2TeamBracket-Info&#039;, {&lt;br /&gt;
		[&#039;RD1-name&#039;] = &#039;RD1&#039;,&lt;br /&gt;
		[&#039;RD1T1-loc&#039;] = &#039;RD1-text1&#039;,&lt;br /&gt;
		[&#039;RD2&#039;] = &#039;RD1b&#039;,&lt;br /&gt;
	}, {&lt;br /&gt;
		[&#039;col1-headers&#039;] = &#039;1,6&#039;,&lt;br /&gt;
		[&#039;col1-matches&#039;] = &#039;3,8&#039;,&lt;br /&gt;
		[&#039;RD1&#039;] = &#039;Final&#039;,&lt;br /&gt;
		[&#039;RD1b&#039;] = &#039;Third place&#039;,&lt;br /&gt;
		[&#039;RD1b-hide&#039;] = &#039;y&#039;&lt;br /&gt;
	})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p[&#039;3TeamBracket-PagePlayoff&#039;] = function (frame)&lt;br /&gt;
	return p._Bracket(frame, &#039;3TeamBracket-PagePlayoff&#039;, {&lt;br /&gt;
	}, {&lt;br /&gt;
		[&#039;col1-matches&#039;] = &#039;3&#039;,&lt;br /&gt;
		[&#039;col2-matches&#039;] = &#039;5&#039;,&lt;br /&gt;
		[&#039;col3-matches&#039;] = &#039;3&#039;,&lt;br /&gt;
		&lt;br /&gt;
		[&#039;col1-col2-paths&#039;] = &#039;3-3,3-5:red&#039;,&lt;br /&gt;
		[&#039;col2-col3-paths&#039;] = &#039;(3,5)-3&#039;,&lt;br /&gt;
		&lt;br /&gt;
		[&#039;RD1&#039;] = &#039;[[Page playoff]]&#039;,&lt;br /&gt;
		[&#039;RD2&#039;] = &#039;Semifinal&#039;,&lt;br /&gt;
	})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p[&#039;4TeamBracket&#039;] = function (frame)&lt;br /&gt;
	return p._Bracket(frame, &#039;4TeamBracket&#039;, {&lt;br /&gt;
		group1 = &amp;quot;RD1-group1&amp;quot;&lt;br /&gt;
	}, {&lt;br /&gt;
		autoseeds = &amp;quot;y&amp;quot;,&lt;br /&gt;
		[&#039;RD1-group1&#039;] = &amp;quot;&amp;quot;&lt;br /&gt;
	})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p[&#039;4TeamBracket-Consols&#039;] = function (frame)&lt;br /&gt;
	return p._Bracket(frame, &#039;4TeamBracket-Consols&#039;, {&lt;br /&gt;
		[&#039;RD1T1-loc&#039;] = &amp;quot;RD1-text1&amp;quot;,&lt;br /&gt;
		[&#039;RD2T1-loc&#039;] = &amp;quot;RD2-text1&amp;quot;,&lt;br /&gt;
		[&#039;RD2T2-loc&#039;] = &amp;quot;RD2-text2&amp;quot;,&lt;br /&gt;
		[&#039;RD3T1-loc&#039;] = &amp;quot;RD3-text1&amp;quot;,&lt;br /&gt;
	}, {&lt;br /&gt;
		autocol = &amp;quot;y&amp;quot;,&lt;br /&gt;
		[&#039;col1-matches&#039;] = &amp;quot;4.5&amp;quot;,&lt;br /&gt;
		[&#039;col2-matches&#039;] = &amp;quot;3,6&amp;quot;,&lt;br /&gt;
		[&#039;col3-matches&#039;] = &amp;quot;4.5&amp;quot;,&lt;br /&gt;
		[&#039;col1-col2-paths&#039;] = &amp;quot;4.5-3:red, 4.5-6:red&amp;quot;,&lt;br /&gt;
		[&#039;col2-col3-paths&#039;] = &amp;quot;(3,6)-4.5&amp;quot;,&lt;br /&gt;
		&lt;br /&gt;
		[&#039;RD1&#039;] = &amp;quot;Third place&amp;quot;,&lt;br /&gt;
		[&#039;RD1-shade&#039;] = &amp;quot;#FFFFFF&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
		[&#039;RD1-altname&#039;] = &amp;quot;consolation&amp;quot;,&lt;br /&gt;
		[&#039;RD2-altname&#039;] = &amp;quot;SF&amp;quot;,&lt;br /&gt;
		[&#039;RD3-altname&#039;] = &amp;quot;final&amp;quot;,&lt;br /&gt;
		[&#039;text-altname&#039;] = &amp;quot;details&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
		[&#039;RD2-team1&#039;] = &amp;quot;&amp;amp;nbsp&amp;quot;,&lt;br /&gt;
	})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p[&#039;4TeamBracket-PagePlayoff&#039;] = function (frame)&lt;br /&gt;
	local RD1b = notblank(frame.args.RD1b)&lt;br /&gt;
	return p._Bracket(frame, &#039;4TeamBracket-PagePlayoff&#039;, {&lt;br /&gt;
	}, {&lt;br /&gt;
		[&#039;RD3b-hide&#039;] = &#039;y&#039;,&lt;br /&gt;
		&lt;br /&gt;
		[&#039;col1-headers&#039;] = &#039;1,&#039; .. (RD1b and &#039;6&#039; or &#039;&#039;),&lt;br /&gt;
		[&#039;col2-headers&#039;] = &#039;1&#039;,&lt;br /&gt;
		[&#039;col3-headers&#039;] = &#039;1,6&#039;,&lt;br /&gt;
		&lt;br /&gt;
		[&#039;col1-matches&#039;] = &#039;3,&#039; .. (RD1b and &#039;8&#039; or &#039;7&#039;),&lt;br /&gt;
		[&#039;col2-matches&#039;] = &#039;5&#039;,&lt;br /&gt;
		[&#039;col3-matches&#039;] = &#039;3,8&#039;,&lt;br /&gt;
		&lt;br /&gt;
		[&#039;col1-col2-paths&#039;] = string.format(&#039;3-3, 3-5:red,%s-5&#039;, (RD1b and 8 or 7)),&lt;br /&gt;
		[&#039;col2-col3-paths&#039;] = &#039;(3,5)-3&#039;,&lt;br /&gt;
		&lt;br /&gt;
		[&#039;RD1&#039;] = &#039;Semifinals&#039;,&lt;br /&gt;
		[&#039;RD2&#039;] = &#039;Preliminary final&#039;,&lt;br /&gt;
		[&#039;RD3b&#039;] = &#039;Third place&#039;,&lt;br /&gt;
	})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p[&#039;4TeamBracket-Stepladder&#039;] = function (frame)&lt;br /&gt;
	return p._Bracket(frame, &#039;4TeamBracket-Stepladder&#039;, {&lt;br /&gt;
	}, {&lt;br /&gt;
		[&#039;col1-matches&#039;] = &#039;5&#039;,&lt;br /&gt;
		[&#039;col2-matches&#039;] = &#039;4&#039;,&lt;br /&gt;
		[&#039;col3-matches&#039;] = &#039;3&#039;,&lt;br /&gt;
		&lt;br /&gt;
		[&#039;col1-col2-paths&#039;] = &#039;5-4&#039;,&lt;br /&gt;
		[&#039;col2-col3-paths&#039;] = &#039;4-3&#039;,&lt;br /&gt;
		&lt;br /&gt;
		[&#039;RD1&#039;] = &#039;First round&#039;,&lt;br /&gt;
		[&#039;RD2&#039;] = &#039;Second round&#039;,&lt;br /&gt;
&lt;br /&gt;
		[&#039;RD1-seed1&#039;] = &#039;3&#039;,&lt;br /&gt;
		[&#039;RD1-seed2&#039;] = &#039;4&#039;,&lt;br /&gt;
		[&#039;RD2-seed1&#039;] = &#039;2&#039;,&lt;br /&gt;
		[&#039;RD3-seed1&#039;] = &#039;1&#039;,&lt;br /&gt;
	})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p[&#039;4TeamBracket-Tennis3&#039;] = function (frame)&lt;br /&gt;
	return p._Bracket(frame, &#039;4TeamBracket-Tennis3&#039;, {}, {&lt;br /&gt;
		seeds = &#039;&#039;,&lt;br /&gt;
		RD2 = &amp;quot;Final&amp;quot;,&lt;br /&gt;
		[&#039;team-width&#039;] = 125&lt;br /&gt;
	})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p[&#039;4TeamBracket-Tennis5&#039;] = function (frame)&lt;br /&gt;
	return p._Bracket(frame, &#039;4TeamBracket-Tennis5&#039;, {}, {&lt;br /&gt;
		seeds = &#039;&#039;,&lt;br /&gt;
		RD1 = &amp;quot;Quarterfinals&amp;quot;,&lt;br /&gt;
		RD2 = &amp;quot;Semifinals&amp;quot;,&lt;br /&gt;
		[&#039;team-width&#039;] = 125,&lt;br /&gt;
		[&#039;RD1-seed1&#039;] = &#039;&#039;,&lt;br /&gt;
		[&#039;RD1-seed2&#039;] = &#039;&#039;,&lt;br /&gt;
		[&#039;RD1-seed3&#039;] = &#039;&#039;,&lt;br /&gt;
		[&#039;RD1-seed4&#039;] = &#039;&#039;,&lt;br /&gt;
	})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p[&#039;4TeamBracket-Tennis35&#039;] = function (frame)&lt;br /&gt;
	return p._Bracket(frame, &#039;4TeamBracket-Tennis35&#039;, {}, {&lt;br /&gt;
		sets = &amp;quot;3/5&amp;quot;,&lt;br /&gt;
		RD1 = &amp;quot;Semifinals&amp;quot;,&lt;br /&gt;
		RD2 = &amp;quot;Final&amp;quot;,&lt;br /&gt;
		[&#039;RD1-seed1&#039;] = &#039;&#039;,&lt;br /&gt;
		[&#039;RD1-seed2&#039;] = &#039;&#039;,&lt;br /&gt;
		[&#039;RD1-seed3&#039;] = &#039;&#039;,&lt;br /&gt;
		[&#039;RD1-seed4&#039;] = &#039;&#039;,&lt;br /&gt;
	})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p[&#039;4TeamBracket-Info&#039;] = function (frame)&lt;br /&gt;
	local qual = yesno(frame.args.qualifiers or &#039;&#039;)&lt;br /&gt;
	local losernext = yesno(frame.args.losernext or &#039;&#039;)&lt;br /&gt;
	local page = yesno(frame.args.page or &#039;&#039;)&lt;br /&gt;
	local C1C2PN = &#039;3-4.5&#039; .. ((losernext or page) and &#039;:red&#039; or &#039;&#039;)&lt;br /&gt;
	C1C2PN = C1C2PN .. &#039;,6-4.5&#039; .. (losernext and &#039;:red&#039; or &#039;&#039;)&lt;br /&gt;
	&lt;br /&gt;
	return p._Bracket(frame, &#039;4TeamBracket-Info&#039;, {&lt;br /&gt;
		[&#039;RD1T1-loc&#039;] = &#039;RD1-text1&#039;,&lt;br /&gt;
		[&#039;RD1T2-loc&#039;] = &#039;RD1-text2&#039;,&lt;br /&gt;
		[&#039;RD2T1-loc&#039;] = &#039;RD2-text1&#039;,&lt;br /&gt;
		[&#039;RD1-name&#039;] = &#039;RD1&#039;,&lt;br /&gt;
		[&#039;RD2-name&#039;] = &#039;RD2&#039;,&lt;br /&gt;
	}, {&lt;br /&gt;
		[&#039;col2-teams-per-match&#039;] = qual and &#039;1&#039; or nil,&lt;br /&gt;
		[&#039;RD2-legs&#039;] = qual and &#039;0&#039; or nil,&lt;br /&gt;
		[&#039;col1-headers&#039;] = &#039;1&#039;,&lt;br /&gt;
		[&#039;col2-headers&#039;] = &#039;1,7.5&#039;,&lt;br /&gt;
		[&#039;col1-matches&#039;] = &#039;3,6&#039;,&lt;br /&gt;
		[&#039;col2-matches&#039;] = qual and &#039;3.5,6.5&#039; or &#039;4.5,9.5&#039;,&lt;br /&gt;
		[&#039;col1-col2-paths&#039;] = C1C2PN,&lt;br /&gt;
		RD1 = &#039;Semifinals&#039;,&lt;br /&gt;
		RD2 = qual and &#039;Qualified&#039; or &#039;Final&#039;,&lt;br /&gt;
		RD2b = &#039;Third place&#039;,&lt;br /&gt;
		[&#039;RD2b-hide&#039;] = &#039;y&#039;,&lt;br /&gt;
	})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p[&#039;5TeamBracket&#039;] = function (frame)&lt;br /&gt;
	return p._Bracket(frame, &#039;5TeamBracket&#039;, {&lt;br /&gt;
		group1 = &amp;quot;RD1-group1&amp;quot;,&lt;br /&gt;
		group2 = &amp;quot;RD1-group2&amp;quot;,&lt;br /&gt;
	}, {&lt;br /&gt;
		byes = &amp;quot;1&amp;quot;,&lt;br /&gt;
		[&#039;RD1-omit&#039;] = &amp;quot;1/2&amp;quot;,&lt;br /&gt;
		[&#039;RD1-seed1&#039;] = &amp;quot;4&amp;quot;,&lt;br /&gt;
		[&#039;RD1-team1&#039;] = &amp;quot;&amp;amp;nbsp;&amp;quot;,&lt;br /&gt;
		[&#039;RD1-seed2&#039;] = &amp;quot;5&amp;quot;,&lt;br /&gt;
		[&#039;RD1-team2&#039;] = &amp;quot;&amp;amp;nbsp;&amp;quot;,&lt;br /&gt;
		[&#039;RD2-seed1&#039;] = &amp;quot;1&amp;quot;,&lt;br /&gt;
		[&#039;RD2-seed3&#039;] = &amp;quot;2&amp;quot;,&lt;br /&gt;
		[&#039;RD2-seed4&#039;] = &amp;quot;3&amp;quot;,&lt;br /&gt;
	})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p[&#039;5TeamBracket-Consols&#039;] = function (frame)&lt;br /&gt;
	return p._Bracket(frame, &#039;5TeamBracket-Consols&#039;, {&lt;br /&gt;
	}, {&lt;br /&gt;
		[&#039;col1-headers&#039;] = &amp;quot;1,9&amp;quot;,&lt;br /&gt;
		[&#039;col2-headers&#039;] = &amp;quot;1&amp;quot;,&lt;br /&gt;
		[&#039;col3-headers&#039;] = &amp;quot;1&amp;quot;,&lt;br /&gt;
		[&#039;col4-headers&#039;] = &amp;quot;1&amp;quot;,&lt;br /&gt;
		[&#039;col5-headers&#039;] = &amp;quot;1,9&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
		[&#039;col1-matches&#039;] = &amp;quot;6,11&amp;quot;,&lt;br /&gt;
		[&#039;col2-matches&#039;] = &amp;quot;9&amp;quot;,&lt;br /&gt;
		[&#039;col3-matches&#039;] = &amp;quot;6&amp;quot;,&lt;br /&gt;
		[&#039;col4-matches&#039;] = &amp;quot;3,9&amp;quot;,&lt;br /&gt;
		[&#039;col5-matches&#039;] = &amp;quot;6,11&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
		[&#039;col1-col2-paths&#039;] = &amp;quot;6-(3,9)&amp;quot;,&lt;br /&gt;
		[&#039;col2-col3-paths&#039;] = &amp;quot;3-3, 9-(6,9)&amp;quot;,&lt;br /&gt;
		[&#039;col3-col4-paths&#039;] = &amp;quot;3-3, 9-9, 6-&amp;quot; .. (&lt;br /&gt;
			(tonumber(frame.args.style) == 2) and &amp;quot;9&amp;quot; or &amp;quot;3&amp;quot;&lt;br /&gt;
		),&lt;br /&gt;
		[&#039;col4-col5-paths&#039;] = &amp;quot;(3,9)-6&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
		[&#039;RD1&#039;] = &amp;quot;Third place&amp;quot;,&lt;br /&gt;
		[&#039;RD2&#039;] = &amp;quot;Consolation semifinals&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
		[&#039;RD1b-hide&#039;] = &amp;quot;y&amp;quot;,&lt;br /&gt;
		[&#039;RD5b-hide&#039;] = &amp;quot;y&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
		[&#039;RD1-shade&#039;] = &amp;quot;#FFFFFF&amp;quot;,&lt;br /&gt;
		[&#039;RD2-shade&#039;] = &amp;quot;#FFFFFF&amp;quot;,&lt;br /&gt;
		[&#039;RD1b-shade&#039;] = &amp;quot;#FFFFFF&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
		[&#039;RD1-altname&#039;] = &amp;quot;fifth&amp;quot;,&lt;br /&gt;
		[&#039;RD2-altname&#039;] = &amp;quot;consolation&amp;quot;,&lt;br /&gt;
		[&#039;RD3-altname&#039;] = &amp;quot;QF&amp;quot;,&lt;br /&gt;
		[&#039;RD4-altname&#039;] = &amp;quot;SF&amp;quot;,&lt;br /&gt;
		[&#039;RD5-altname&#039;] = &amp;quot;final&amp;quot;,&lt;br /&gt;
		[&#039;text-altname&#039;] = &amp;quot;details&amp;quot;,&lt;br /&gt;
	})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p[&#039;5TeamBracket-Stepladder&#039;] = function (frame)&lt;br /&gt;
	return p._Bracket(frame, &#039;5TeamBracket-Stepladder&#039;, {&lt;br /&gt;
	}, {&lt;br /&gt;
		[&#039;col1-matches&#039;] = &#039;6&#039;,&lt;br /&gt;
		[&#039;col2-matches&#039;] = &#039;5&#039;,&lt;br /&gt;
		[&#039;col3-matches&#039;] = &#039;4&#039;,&lt;br /&gt;
		[&#039;col4-matches&#039;] = &#039;3&#039;,&lt;br /&gt;
		&lt;br /&gt;
		[&#039;col1-col2-paths&#039;] = &#039;6-5&#039;,&lt;br /&gt;
		[&#039;col2-col3-paths&#039;] = &#039;5-4&#039;,&lt;br /&gt;
		[&#039;col3-col4-paths&#039;] = &#039;4-3&#039;,&lt;br /&gt;
		&lt;br /&gt;
		[&#039;RD1&#039;] = &#039;First round&#039;,&lt;br /&gt;
		[&#039;RD2&#039;] = &#039;Second round&#039;,&lt;br /&gt;
		[&#039;RD3&#039;] = &#039;Semifinal&#039;,&lt;br /&gt;
		&lt;br /&gt;
		[&#039;RD1-seed1&#039;] = &#039;4&#039;,&lt;br /&gt;
		[&#039;RD1-seed2&#039;] = &#039;5&#039;,&lt;br /&gt;
		[&#039;RD2-seed1&#039;] = &#039;3&#039;,&lt;br /&gt;
		[&#039;RD3-seed1&#039;] = &#039;2&#039;,&lt;br /&gt;
		[&#039;RD4-seed1&#039;] = &#039;1&#039;,&lt;br /&gt;
	})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p[&#039;6TeamBracket&#039;] = function (frame)&lt;br /&gt;
	local stepdown = yesno(frame.args.stepdown)&lt;br /&gt;
	return p._Bracket(frame, &#039;6TeamBracket&#039;, {&lt;br /&gt;
		group1 = &amp;quot;RD1-group1&amp;quot;,&lt;br /&gt;
		group2 = &amp;quot;RD1-group2&amp;quot;,&lt;br /&gt;
		group3 = &amp;quot;RD2-group1&amp;quot;,&lt;br /&gt;
	}, {&lt;br /&gt;
		compact = &amp;quot;y&amp;quot;,&lt;br /&gt;
		seeds = &amp;quot;y&amp;quot;,&lt;br /&gt;
		byes = &#039;&#039;,&lt;br /&gt;
		[&#039;RD1-omit&#039;] = stepdown and &amp;quot;3/4/7/8&amp;quot; or &amp;quot;1/2/5/6&amp;quot;,&lt;br /&gt;
		[&#039;RD1-group1&#039;] = &amp;quot;&amp;quot;,&lt;br /&gt;
		[&#039;RD1-group2&#039;] = &amp;quot;&amp;quot;,&lt;br /&gt;
		[&#039;RD2-group1&#039;] = &amp;quot;&amp;quot;,&lt;br /&gt;
		[&#039;RD1-seed1&#039;] = 4,&lt;br /&gt;
		[&#039;RD1-seed2&#039;] = 5,&lt;br /&gt;
		[&#039;RD1-seed3&#039;] = 3,&lt;br /&gt;
		[&#039;RD1-seed4&#039;] = 6,&lt;br /&gt;
		[&#039;RD2-seed1&#039;] = stepdown and &#039;&#039; or 1,&lt;br /&gt;
		[&#039;RD2-seed2&#039;] = stepdown and 1 or &#039;&#039;,&lt;br /&gt;
		[&#039;RD2-seed3&#039;] = stepdown and &#039;&#039; or 2,&lt;br /&gt;
		[&#039;RD2-seed4&#039;] = stepdown and 2 or &#039;&#039;,&lt;br /&gt;
	})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p[&#039;6TeamBracket-PagePlayoff&#039;] = function (frame)&lt;br /&gt;
	return p._Bracket(frame, &#039;6TeamBracket-PagePlayoff&#039;, {&lt;br /&gt;
	}, {&lt;br /&gt;
		[&#039;col1-matches&#039;] = &#039;3,7&#039;,&lt;br /&gt;
		[&#039;col2-matches&#039;] = &#039;5&#039;,&lt;br /&gt;
		[&#039;col3-matches&#039;] = &#039;3,7&#039;,&lt;br /&gt;
		[&#039;col4-matches&#039;] = &#039;5&#039;,&lt;br /&gt;
		&lt;br /&gt;
		[&#039;col1-col2-paths&#039;] = &#039;3-5,7-5:red,7-7&#039;,&lt;br /&gt;
		[&#039;col2-col3-paths&#039;] = &#039;7-7, 5-3&#039;,&lt;br /&gt;
		[&#039;col3-col4-paths&#039;] = &#039;(3,7)-5&#039;,&lt;br /&gt;
		&lt;br /&gt;
		[&#039;RD1&#039;] = &#039;Seeding/Play-in qualifier&#039;,&lt;br /&gt;
		[&#039;RD2&#039;] = &#039;Play-in game&#039;,&lt;br /&gt;
		&lt;br /&gt;
		[&#039;RD1-seed1&#039;] = &#039;5&#039;,&lt;br /&gt;
		[&#039;RD1-seed2&#039;] = &#039;6&#039;,&lt;br /&gt;
		[&#039;RD1-seed3&#039;] = &#039;3&#039;,&lt;br /&gt;
		[&#039;RD1-seed4&#039;] = &#039;4&#039;,&lt;br /&gt;
		[&#039;RD3-seed1&#039;] = &#039;1&#039;,&lt;br /&gt;
		[&#039;RD3-seed3&#039;] = &#039;2&#039;,&lt;br /&gt;
	})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p[&#039;7TeamBracket&#039;] = function (frame)&lt;br /&gt;
	return p._Bracket(frame, &#039;7TeamBracket&#039;, {&lt;br /&gt;
		group1 = &amp;quot;RD1-group1&amp;quot;,&lt;br /&gt;
		group2 = &amp;quot;RD1-group2&amp;quot;,&lt;br /&gt;
		group3 = &amp;quot;RD2-group1&amp;quot;,&lt;br /&gt;
	}, {&lt;br /&gt;
		[&#039;RD1-omit&#039;] = &amp;quot;1/2&amp;quot;,&lt;br /&gt;
		byes = 1,&lt;br /&gt;
		[&#039;RD1-group1&#039;] = &amp;quot;&amp;quot;,&lt;br /&gt;
		[&#039;RD1-group2&#039;] = &amp;quot;&amp;quot;,&lt;br /&gt;
		[&#039;RD2-group1&#039;] = &amp;quot;&amp;quot;,&lt;br /&gt;
		[&#039;RD1-seed1&#039;] = 4,&lt;br /&gt;
		[&#039;RD1-seed2&#039;] = 5,&lt;br /&gt;
		[&#039;RD1-seed3&#039;] = 2,&lt;br /&gt;
		[&#039;RD1-seed4&#039;] = 7,&lt;br /&gt;
		[&#039;RD1-seed5&#039;] = 3,&lt;br /&gt;
		[&#039;RD1-seed6&#039;] = 6,&lt;br /&gt;
		[&#039;RD2-seed1&#039;] = 1,&lt;br /&gt;
		[&#039;RD1-team1&#039;] = &#039;&amp;amp;nbsp;&#039;,&lt;br /&gt;
		[&#039;RD1-team2&#039;] = &#039;&amp;amp;nbsp;&#039;,&lt;br /&gt;
		[&#039;RD1-team3&#039;] = &#039;&amp;amp;nbsp;&#039;,&lt;br /&gt;
		[&#039;RD1-team4&#039;] = &#039;&amp;amp;nbsp;&#039;,&lt;br /&gt;
		[&#039;RD1-team5&#039;] = &#039;&amp;amp;nbsp;&#039;,&lt;br /&gt;
		[&#039;RD1-team6&#039;] = &#039;&amp;amp;nbsp;&#039;,&lt;br /&gt;
&lt;br /&gt;
	})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p[&#039;7TeamBracket-Consols&#039;] = function (frame)&lt;br /&gt;
	return p._Bracket(frame, &#039;7TeamBracket-Consols&#039;, {&lt;br /&gt;
	}, {&lt;br /&gt;
		[&#039;col1-headers&#039;] = &amp;quot;1,9&amp;quot;,&lt;br /&gt;
		[&#039;col2-headers&#039;] = &amp;quot;1&amp;quot;,&lt;br /&gt;
		[&#039;col3-headers&#039;] = &amp;quot;1&amp;quot;,&lt;br /&gt;
		[&#039;col4-headers&#039;] = &amp;quot;1&amp;quot;,&lt;br /&gt;
		[&#039;col5-headers&#039;] = &amp;quot;1,9&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
		[&#039;col1-matches&#039;] = &amp;quot;6,11&amp;quot;,&lt;br /&gt;
		[&#039;col2-matches&#039;] = &amp;quot;8.5&amp;quot;,&lt;br /&gt;
		[&#039;col3-matches&#039;] = &amp;quot;4,7,10&amp;quot;,&lt;br /&gt;
		[&#039;col4-matches&#039;] = &amp;quot;3,8.5&amp;quot;,&lt;br /&gt;
		[&#039;col5-matches&#039;] = &amp;quot;6,11&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
		[&#039;col1-col2-paths&#039;] = &amp;quot;6-(4,8.5)&amp;quot;,&lt;br /&gt;
		[&#039;col2-col3-paths&#039;] = &amp;quot;4-4,8.5-(7,10)&amp;quot;,&lt;br /&gt;
		[&#039;col3-col4-paths&#039;] = &amp;quot;4-3, (7,10)-8.5&amp;quot;,&lt;br /&gt;
		[&#039;col4-col5-paths&#039;] = &amp;quot;(3,8.5)-6&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
		[&#039;RD1b-hide&#039;] = &amp;quot;y&amp;quot;,&lt;br /&gt;
		[&#039;RD5b-hide&#039;] = &amp;quot;y&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
		[&#039;RD1&#039;] = &amp;quot;Fifth place&amp;quot;,&lt;br /&gt;
		[&#039;RD2&#039;] = &amp;quot;Consolation semifinals&amp;quot;,&lt;br /&gt;
		[&#039;RD1b&#039;] = &amp;quot;Seventh place&amp;quot;,&lt;br /&gt;
		[&#039;RD5b&#039;] = &amp;quot;Third place&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
		[&#039;RD1-shade&#039;] = &amp;quot;#FFFFFF&amp;quot;,&lt;br /&gt;
		[&#039;RD2-shade&#039;] = &amp;quot;#FFFFFF&amp;quot;,&lt;br /&gt;
		[&#039;RD1b-shade&#039;] = &amp;quot;#FFFFFF&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
		[&#039;RD1-altname&#039;] = &amp;quot;fifth&amp;quot;,&lt;br /&gt;
		[&#039;RD2-altname&#039;] = &amp;quot;consolation&amp;quot;,&lt;br /&gt;
		[&#039;RD3-altname&#039;] = &amp;quot;QF&amp;quot;,&lt;br /&gt;
		[&#039;RD4-altname&#039;] = &amp;quot;SF&amp;quot;,&lt;br /&gt;
		[&#039;RD5-altname&#039;] = &amp;quot;final&amp;quot;,&lt;br /&gt;
		[&#039;RD1b-altname&#039;] = &amp;quot;seventh&amp;quot;,&lt;br /&gt;
		[&#039;RD5b-altname&#039;] = &amp;quot;third&amp;quot;,&lt;br /&gt;
		[&#039;text-altname&#039;] = &amp;quot;details&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
	})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p[&#039;7TeamBracket-StepladderToSF&#039;] = function (frame)&lt;br /&gt;
	local shift1, shift2, shift3, shift4 = &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;&lt;br /&gt;
	local matches2 = &amp;quot;4,8&amp;quot;&lt;br /&gt;
	local paths12, paths23 = &amp;quot;5-4&amp;quot;, &amp;quot;4-3, 8-7&amp;quot;&lt;br /&gt;
	local RD3b = (&lt;br /&gt;
		notblank(frame.args.RD3b) or&lt;br /&gt;
		notblank(frame.args[&#039;RD3b-team1&#039;]) or&lt;br /&gt;
		notblank(frame.args[&#039;RD3b-team5&#039;])&lt;br /&gt;
	)&lt;br /&gt;
	&lt;br /&gt;
	if tonumber(frame.args.style) == 2 then&lt;br /&gt;
		shift1, shift2, shift3, shift4 = &amp;quot;1&amp;quot;, &amp;quot;-1&amp;quot;, &amp;quot;1&amp;quot;, &amp;quot;1&amp;quot;&lt;br /&gt;
		paths12 = &amp;quot;5-8&amp;quot;&lt;br /&gt;
	elseif tonumber(frame.args.style) == 3 then&lt;br /&gt;
		shift1, shift2, shift3, shift4 = &amp;quot;-2&amp;quot;, &amp;quot;0&amp;quot;, &amp;quot;2&amp;quot;, &amp;quot;2&amp;quot;&lt;br /&gt;
	elseif tonumber(frame.args.style) == 4 then&lt;br /&gt;
		shift1, shift2, shift3, shift4 = &amp;quot;5&amp;quot;, &amp;quot;1&amp;quot;, &amp;quot;1&amp;quot;, &amp;quot;1&amp;quot;&lt;br /&gt;
		matches2 = &amp;quot;2,8&amp;quot;&lt;br /&gt;
		paths12, paths23 = &amp;quot;5-8&amp;quot;, &amp;quot;2-3, 8-7&amp;quot;&lt;br /&gt;
	elseif tonumber(frame.args.style) == 5 then&lt;br /&gt;
		shift1, shift2, shift3, shift4 = &amp;quot;-1&amp;quot;, &amp;quot;-1&amp;quot;, &amp;quot;1&amp;quot;, &amp;quot;1&amp;quot;&lt;br /&gt;
		matches2 = &amp;quot;4,10&amp;quot;&lt;br /&gt;
		paths23 = &amp;quot;4-3, 10-7&amp;quot;&lt;br /&gt;
	elseif tonumber(frame.args.style) == 6 then&lt;br /&gt;
		shift1, shift2, shift3, shift4 = &amp;quot;-2&amp;quot;, &amp;quot;0&amp;quot;, &amp;quot;2&amp;quot;, &amp;quot;2&amp;quot;&lt;br /&gt;
		matches2 = &amp;quot;4,10&amp;quot;&lt;br /&gt;
		paths23 = &amp;quot;4-3, 10-7&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return p._Bracket(frame, &#039;7TeamBracket-StepladderToSF&#039;, {&lt;br /&gt;
	}, {&lt;br /&gt;
		[&#039;RD1-shift&#039;] = shift1,&lt;br /&gt;
		[&#039;RD2-shift&#039;] = shift2,&lt;br /&gt;
		[&#039;RD3-shift&#039;] = shift3,&lt;br /&gt;
		[&#039;RD4-shift&#039;] = shift4,&lt;br /&gt;
		&lt;br /&gt;
		[&#039;RD3b-hide&#039;] = &#039;y&#039;,&lt;br /&gt;
		[&#039;RD4b-hide&#039;] = &#039;y&#039;,&lt;br /&gt;
&lt;br /&gt;
		[&#039;col1-headers&#039;] = &#039;1&#039;,&lt;br /&gt;
		[&#039;col2-headers&#039;] = &#039;1&#039;,&lt;br /&gt;
		[&#039;col3-headers&#039;] = &#039;1,10&#039;,&lt;br /&gt;
		[&#039;col4-headers&#039;] = RD3b and &#039;1,10&#039; or &#039;1,8&#039;,&lt;br /&gt;
&lt;br /&gt;
		[&#039;col1-matches&#039;] = &#039;5&#039;,&lt;br /&gt;
		[&#039;col2-matches&#039;] = matches2,&lt;br /&gt;
		[&#039;col3-matches&#039;] = &#039;3,7,12&#039;,&lt;br /&gt;
		[&#039;col4-matches&#039;] = RD3b and &#039;5,12&#039; or &#039;5,10&#039;,&lt;br /&gt;
&lt;br /&gt;
		[&#039;col1-col2-paths&#039;] = paths12,&lt;br /&gt;
		[&#039;col2-col3-paths&#039;] = paths23,&lt;br /&gt;
		[&#039;col3-col4-paths&#039;] = &#039;(3,7)-5&#039;,&lt;br /&gt;
		&lt;br /&gt;
		[&#039;RD1&#039;] = &#039;Wild card&#039;,&lt;br /&gt;
		[&#039;RD3b&#039;] = &#039;Fifth place&#039;,&lt;br /&gt;
		[&#039;RD4b&#039;] = &#039;Third place&#039;,&lt;br /&gt;
	})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p[&#039;8TeamBracket&#039;] = function (frame)&lt;br /&gt;
	return p._Bracket(frame, &#039;8TeamBracket&#039;, {&lt;br /&gt;
		group1 = &#039;RD1-group1&#039;,&lt;br /&gt;
		group2 = &#039;RD1-group2&#039;,&lt;br /&gt;
		group3 = &#039;RD2-group1&#039;,&lt;br /&gt;
	}, {&lt;br /&gt;
		[&#039;RD1-seed1&#039;] = 1,&lt;br /&gt;
		[&#039;RD1-seed2&#039;] = 8,&lt;br /&gt;
		[&#039;RD1-seed3&#039;] = 4,&lt;br /&gt;
		[&#039;RD1-seed4&#039;] = 5,&lt;br /&gt;
		[&#039;RD1-seed5&#039;] = 2,&lt;br /&gt;
		[&#039;RD1-seed6&#039;] = 7,&lt;br /&gt;
		[&#039;RD1-seed7&#039;] = 3,&lt;br /&gt;
		[&#039;RD1-seed8&#039;] = 6,&lt;br /&gt;
	})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p[&#039;8TeamBracket-2Leg&#039;] = function (frame)&lt;br /&gt;
	local scorewidth = 25&lt;br /&gt;
	-- replicate {{ifempty}}&lt;br /&gt;
	for _,v in ipairs({&#039;score-width&#039;, &#039;game-score-width&#039;, &#039;leg-width&#039;}) do&lt;br /&gt;
		if notblank(frame.args[v]) then&lt;br /&gt;
			scorewidth = frame.args[v]&lt;br /&gt;
			break&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return p._Bracket(frame, &#039;8TeamBracket-2Leg&#039;, {&lt;br /&gt;
		group1 = &#039;RD1-group1&#039;,&lt;br /&gt;
		group2 = &#039;RD1-group2&#039;,&lt;br /&gt;
		group3 = &#039;RD2-group1&#039;,&lt;br /&gt;
	}, {&lt;br /&gt;
		sets = 2,&lt;br /&gt;
		aggregate = &#039;y&#039;,&lt;br /&gt;
		autoseeds = &#039;y&#039;,&lt;br /&gt;
&lt;br /&gt;
		[&#039;score-width&#039;] = scorewidth,&lt;br /&gt;
		seeds = notblank(frame.args.noseeds) and &#039;n&#039; or nil,&lt;br /&gt;
	})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p[&#039;8TeamBracket-Byes&#039;] = function (frame)&lt;br /&gt;
	return p._Bracket(frame, &#039;8TeamBracket-Byes&#039;, {&lt;br /&gt;
		group1 = &amp;quot;RD1-group1&amp;quot;,&lt;br /&gt;
		group2 = &amp;quot;RD1-group2&amp;quot;,&lt;br /&gt;
		group3 = &amp;quot;RD2-group1&amp;quot;,&lt;br /&gt;
		Consol = &amp;quot;RD3b&amp;quot;&lt;br /&gt;
	}, {&lt;br /&gt;
		seeds = &#039;yes&#039;,&lt;br /&gt;
		byes = 1,&lt;br /&gt;
		[&#039;team-width&#039;] = &#039;11em&#039;,&lt;br /&gt;
		[&#039;score-width&#039;] = &#039;2em&#039;,&lt;br /&gt;
		[&#039;RD1-group1&#039;] = &#039;&#039;,&lt;br /&gt;
		[&#039;RD1-group2&#039;] = &#039;&#039;,&lt;br /&gt;
		[&#039;RD2-group1&#039;] = &#039;&#039;,&lt;br /&gt;
		RD3b = frame.args[&#039;RD3-team3&#039;] and &amp;quot;Third place&amp;quot; or &amp;quot;&amp;quot;&lt;br /&gt;
	})&lt;br /&gt;
end&lt;br /&gt;
p[&#039;3RoundBracket-Byes&#039;] = p[&#039;8TeamBracket-Byes&#039;]&lt;br /&gt;
&lt;br /&gt;
p[&#039;8TeamBracket-Compact-Byes&#039;] = function (frame)&lt;br /&gt;
	return p._Bracket(frame, &#039;8TeamBracket-Compact-Byes&#039;, {&lt;br /&gt;
	}, {&lt;br /&gt;
		nowrap = &#039;y&#039;,&lt;br /&gt;
		byes = 1,&lt;br /&gt;
		[&#039;seed-width&#039;] = 5,&lt;br /&gt;
		[&#039;team-width&#039;] = &#039;125&#039;,&lt;br /&gt;
		[&#039;score-width&#039;] = &#039;15&#039;,&lt;br /&gt;
	})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p[&#039;8TeamBracket-Compact-NoSeeds-Byes&#039;] = function (frame)&lt;br /&gt;
	return p._Bracket(frame, &#039;8TeamBracket-Compact-NoSeeds-Byes&#039;, {&lt;br /&gt;
	}, {&lt;br /&gt;
		byes = 2,&lt;br /&gt;
		[&#039;team-width&#039;] = &#039;125&#039;,&lt;br /&gt;
		[&#039;score-width&#039;] = &#039;25&#039;,&lt;br /&gt;
		RD1 = &#039;Quarterfinals&#039;,&lt;br /&gt;
		RD2 = &#039;Semifinals&#039;,&lt;br /&gt;
		RD3 = &#039;Final&#039;,&lt;br /&gt;
	})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p[&#039;8TeamBracket-Consols&#039;] = function (frame)&lt;br /&gt;
	return p._Bracket(frame, &#039;8TeamBracket-Consols&#039;, {&lt;br /&gt;
	}, {&lt;br /&gt;
		[&#039;col1-headers&#039;] = &amp;quot;1,13&amp;quot;,&lt;br /&gt;
		[&#039;col2-headers&#039;] = &amp;quot;1&amp;quot;,&lt;br /&gt;
		[&#039;col3-headers&#039;] = &amp;quot;1&amp;quot;,&lt;br /&gt;
		[&#039;col4-headers&#039;] = &amp;quot;1&amp;quot;,&lt;br /&gt;
		[&#039;col5-headers&#039;] = &amp;quot;1,13&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
		[&#039;col1-matches&#039;] = &amp;quot;9,15&amp;quot;,&lt;br /&gt;
		[&#039;col2-matches&#039;] = &amp;quot;5,13&amp;quot;,&lt;br /&gt;
		[&#039;col3-matches&#039;] = &amp;quot;3,7,11,15&amp;quot;,&lt;br /&gt;
		[&#039;col4-matches&#039;] = &amp;quot;5,13&amp;quot;,&lt;br /&gt;
		[&#039;col5-matches&#039;] = &amp;quot;9,15&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
		[&#039;col1-col2-paths&#039;] = &amp;quot;9-(5,13)&amp;quot;,&lt;br /&gt;
		[&#039;col2-col3-paths&#039;] = &amp;quot;5-(3,7), 13-(11,15)&amp;quot;,&lt;br /&gt;
		[&#039;col3-col4-paths&#039;] = &amp;quot;(3,7)-5, (11,15)-13&amp;quot;,&lt;br /&gt;
		[&#039;col4-col5-paths&#039;] = &amp;quot;(5,13)-9&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
		[&#039;RD1b-hide&#039;] = &amp;quot;y&amp;quot;,&lt;br /&gt;
		[&#039;RD5b-hide&#039;] = &amp;quot;y&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
		[&#039;RD1&#039;] = &amp;quot;Fifth place&amp;quot;,&lt;br /&gt;
		[&#039;RD2&#039;] = &amp;quot;Consolation semifinals&amp;quot;,&lt;br /&gt;
		[&#039;RD1b&#039;] = &amp;quot;Seventh place&amp;quot;,&lt;br /&gt;
		[&#039;RD5b&#039;] = &amp;quot;Third place&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
		[&#039;RD1-shade&#039;] = &amp;quot;#FFFFFF&amp;quot;,&lt;br /&gt;
		[&#039;RD2-shade&#039;] = &amp;quot;#FFFFFF&amp;quot;,&lt;br /&gt;
		[&#039;RD1b-shade&#039;] = &amp;quot;#FFFFFF&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
		[&#039;RD1-altname&#039;] = &amp;quot;fifth&amp;quot;,&lt;br /&gt;
		[&#039;RD2-altname&#039;] = &amp;quot;consolation&amp;quot;,&lt;br /&gt;
		[&#039;RD3-altname&#039;] = &amp;quot;QF&amp;quot;,&lt;br /&gt;
		[&#039;RD4-altname&#039;] = &amp;quot;SF&amp;quot;,&lt;br /&gt;
		[&#039;RD5-altname&#039;] = &amp;quot;final&amp;quot;,&lt;br /&gt;
		[&#039;RD1b-altname&#039;] = &amp;quot;seventh&amp;quot;,&lt;br /&gt;
		[&#039;RD5b-altname&#039;] = &amp;quot;third&amp;quot;,&lt;br /&gt;
		[&#039;text-altname&#039;] = &amp;quot;details&amp;quot;,&lt;br /&gt;
	})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p[&#039;8TeamBracket-PagePlayoff&#039;] = function (frame)&lt;br /&gt;
	local cross12 = notblank(frame.args[&#039;RD1-RD2-cross&#039;])&lt;br /&gt;
	local cross23 = notblank(frame.args[&#039;RD2-RD3-cross&#039;])&lt;br /&gt;
	local path12 = cross12 and {13, 5} or {5, 13}&lt;br /&gt;
	local path23 = cross23 and {13, 5} or {5, 13}&lt;br /&gt;
	return p._Bracket(frame, &#039;8TeamBracket-PagePlayoff&#039;, {&lt;br /&gt;
	}, {&lt;br /&gt;
		[&#039;col-spacing&#039;] = (cross12 or cross23) and &#039;12&#039; or &#039;&#039;,&lt;br /&gt;
		[&#039;shift&#039;] = notblank(frame.args[&#039;RD1-text1&#039;]) and &#039;1&#039; or &#039;&#039;,&lt;br /&gt;
		&lt;br /&gt;
		[&#039;col1-matches&#039;] = &#039;3,7,11,15&#039;,&lt;br /&gt;
		[&#039;col2-matches&#039;] = &#039;5,13&#039;,&lt;br /&gt;
		[&#039;col3-matches&#039;] = &#039;7,11&#039;,&lt;br /&gt;
		[&#039;col4-matches&#039;] = &#039;9&#039;,&lt;br /&gt;
		&lt;br /&gt;
		[&#039;col1-col2-paths&#039;] = string.format(&#039;7-%s,11-%s,3-3,3-5:#FF3333,15-15,15-13:#FF3333&#039;,path12[1], path12[2]),&lt;br /&gt;
		[&#039;col2-col3-paths&#039;] = string.format(&#039;(3,%s)-7, (%s,15)-11&#039;, path23[1], path23[2]),&lt;br /&gt;
		[&#039;col3-col4-paths&#039;] = &#039;(7,11)-9&#039;,&lt;br /&gt;
		[&#039;col1-col2-cross&#039;] = cross12 and &#039;9&#039; or &#039;&#039;,&lt;br /&gt;
		[&#039;col2-col3-cross&#039;] = cross23 and &#039;9&#039; or &#039;&#039;,&lt;br /&gt;
		&lt;br /&gt;
		[&#039;RD1&#039;] = &#039;Qualifying and elimination finals&#039;,&lt;br /&gt;
		[&#039;RD2&#039;] = &#039;Semi-finals&#039;,&lt;br /&gt;
		[&#039;RD3&#039;] = &#039;Preliminary finals&#039;,&lt;br /&gt;
		[&#039;RD4&#039;] = &#039;Grand final&#039;,&lt;br /&gt;
		&lt;br /&gt;
		[&#039;RD1-seed1&#039;] = &#039;1&#039;,&lt;br /&gt;
		[&#039;RD1-seed2&#039;] = &#039;4&#039;,&lt;br /&gt;
		[&#039;RD1-seed3&#039;] = &#039;5&#039;,&lt;br /&gt;
		[&#039;RD1-seed4&#039;] = &#039;8&#039;,&lt;br /&gt;
		[&#039;RD1-seed5&#039;] = &#039;6&#039;,&lt;br /&gt;
		[&#039;RD1-seed6&#039;] = &#039;7&#039;,&lt;br /&gt;
		[&#039;RD1-seed7&#039;] = &#039;2&#039;,&lt;br /&gt;
		[&#039;RD1-seed8&#039;] = &#039;3&#039;,&lt;br /&gt;
	})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p[&#039;8TeamBracket-Stepladder&#039;] = function (frame)&lt;br /&gt;
	return p._Bracket(frame, &#039;8TeamBracket-Stepladder&#039;, {&lt;br /&gt;
	}, {&lt;br /&gt;
		[&#039;RD4b-hide&#039;] = &#039;y&#039;,&lt;br /&gt;
		[&#039;RD4b&#039;] = &#039;Third place&#039;,&lt;br /&gt;
		&lt;br /&gt;
		[&#039;col1-headers&#039;] = &#039;1&#039;,&lt;br /&gt;
		[&#039;col2-headers&#039;] = &#039;1&#039;,&lt;br /&gt;
		[&#039;col3-headers&#039;] = &#039;1&#039;,&lt;br /&gt;
		[&#039;col4-headers&#039;] = &#039;1,8&#039;,&lt;br /&gt;
		&lt;br /&gt;
		[&#039;col1-matches&#039;] = &#039;5,9&#039;,&lt;br /&gt;
		[&#039;col2-matches&#039;] = &#039;4,8&#039;,&lt;br /&gt;
		[&#039;col3-matches&#039;] = &#039;3,7&#039;,&lt;br /&gt;
		[&#039;col4-matches&#039;] = &#039;5,10&#039;,&lt;br /&gt;
		&lt;br /&gt;
		[&#039;col1-col2-paths&#039;] = &#039;5-4, 9-8&#039;,&lt;br /&gt;
		[&#039;col2-col3-paths&#039;] = &#039;4-3, 8-7&#039;,&lt;br /&gt;
		[&#039;col3-col4-paths&#039;] = &#039;(3,7)-5&#039;,&lt;br /&gt;
		&lt;br /&gt;
		[&#039;RD1&#039;] = &#039;First round&#039;,&lt;br /&gt;
		[&#039;RD2&#039;] = &#039;Second round&#039;,&lt;br /&gt;
		[&#039;RD3&#039;] = &#039;Semifinals&#039;,&lt;br /&gt;
		[&#039;RD4&#039;] = &#039;Final&#039;,&lt;br /&gt;
		&lt;br /&gt;
		[&#039;RD1-seed1&#039;] = &#039;5&#039;,&lt;br /&gt;
		[&#039;RD1-seed2&#039;] = &#039;8&#039;,&lt;br /&gt;
		[&#039;RD1-seed3&#039;] = &#039;6&#039;,&lt;br /&gt;
		[&#039;RD1-seed4&#039;] = &#039;7&#039;,&lt;br /&gt;
		[&#039;RD2-seed1&#039;] = &#039;4&#039;,&lt;br /&gt;
		[&#039;RD2-seed3&#039;] = &#039;3&#039;,&lt;br /&gt;
		[&#039;RD3-seed1&#039;] = &#039;1&#039;,&lt;br /&gt;
		[&#039;RD3-seed3&#039;] = &#039;2&#039;,&lt;br /&gt;
	})&lt;br /&gt;
end&lt;br /&gt;
p[&#039;8TeamBracket-Double-Stepladder&#039;] = p[&#039;8TeamBracket-Stepladder&#039;]&lt;br /&gt;
&lt;br /&gt;
p[&#039;8TeamBracket-Tennis3&#039;] = function (frame)&lt;br /&gt;
	return p._Bracket(frame, &#039;8TeamBracket-Tennis3&#039;, {}, {&lt;br /&gt;
		RD1 = &#039;Quarterfinals&#039;,&lt;br /&gt;
		RD2 = &#039;Semifinals&#039;,&lt;br /&gt;
		RD3 = &#039;Finals&#039;,&lt;br /&gt;
		[&#039;team-width&#039;] = 140,&lt;br /&gt;
		[&#039;RD1-seed1&#039;] = 1,&lt;br /&gt;
		[&#039;RD1-seed2&#039;] = 8,&lt;br /&gt;
		[&#039;RD1-seed3&#039;] = 4,&lt;br /&gt;
		[&#039;RD1-seed4&#039;] = 5,&lt;br /&gt;
		[&#039;RD1-seed5&#039;] = 3,&lt;br /&gt;
		[&#039;RD1-seed6&#039;] = 6,&lt;br /&gt;
		[&#039;RD1-seed7&#039;] = 2,&lt;br /&gt;
		[&#039;RD1-seed8&#039;] = 7,&lt;br /&gt;
	})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p[&#039;8TeamBracket-Tennis5&#039;] = function (frame)&lt;br /&gt;
	return p._Bracket(frame, &#039;8TeamBracket-Tennis5&#039;, {}, {&lt;br /&gt;
		RD1 = &#039;Quarterfinals&#039;,&lt;br /&gt;
		RD2 = &#039;Semifinals&#039;,&lt;br /&gt;
		RD3 = &#039;Final&#039;,&lt;br /&gt;
	})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p[&#039;8TeamBracket-Info&#039;] = function (frame)&lt;br /&gt;
	local RD2b = notblank(frame.arg[&#039;RD2b&#039;])&lt;br /&gt;
		or notblank(frame.arg[&#039;RD2b-team1&#039;])&lt;br /&gt;
		or notblank(frame.arg[&#039;RD2-team5&#039;])&lt;br /&gt;
	&lt;br /&gt;
	return p._Bracket(frame, &#039;8TeamBracket-Info&#039;, {&lt;br /&gt;
		[&#039;RD1-name&#039;] = &#039;RD1&#039;,&lt;br /&gt;
		[&#039;RD2-name&#039;] = &#039;RD2&#039;,&lt;br /&gt;
		[&#039;RD3-name&#039;] = &#039;RD3&#039;,&lt;br /&gt;
&lt;br /&gt;
		[&#039;RD1-text1&#039;] = &#039;RD1-text1&#039;,&lt;br /&gt;
		[&#039;RD1-info1&#039;] = &#039;RD1-text1&#039;,&lt;br /&gt;
		[&#039;RD1T1-loc&#039;] = &#039;RD1-text1&#039;,&lt;br /&gt;
		[&#039;RD1-text2&#039;] = &#039;RD1-text2&#039;,&lt;br /&gt;
		[&#039;RD1-info2&#039;] = &#039;RD1-text2&#039;,&lt;br /&gt;
		[&#039;RD1T2-loc&#039;] = &#039;RD1-text2&#039;,&lt;br /&gt;
		[&#039;RD1-text3&#039;] = &#039;RD1-text3&#039;,&lt;br /&gt;
		[&#039;RD1-info3&#039;] = &#039;RD1-text3&#039;,&lt;br /&gt;
		[&#039;RD1T3-loc&#039;] = &#039;RD1-text3&#039;,&lt;br /&gt;
		[&#039;RD1-text4&#039;] = &#039;RD1-text4&#039;,&lt;br /&gt;
		[&#039;RD1-info4&#039;] = &#039;RD1-text4&#039;,&lt;br /&gt;
		[&#039;RD1T4-loc&#039;] = &#039;RD1-text4&#039;,&lt;br /&gt;
		[&#039;RD2-text1&#039;] = &#039;RD2-text1&#039;,&lt;br /&gt;
		[&#039;RD2-info1&#039;] = &#039;RD2-text1&#039;,&lt;br /&gt;
		[&#039;RD2T1-loc&#039;] = &#039;RD2-text1&#039;,&lt;br /&gt;
		[&#039;RD2-text2&#039;] = &#039;RD2-text2&#039;,&lt;br /&gt;
		[&#039;RD2-info2&#039;] = &#039;RD2-text2&#039;,&lt;br /&gt;
		[&#039;RD2T2-loc&#039;] = &#039;RD2-text2&#039;,&lt;br /&gt;
		[&#039;RD3-text1&#039;] = &#039;RD3-text1&#039;,&lt;br /&gt;
		[&#039;RD3-info1&#039;] = &#039;RD3-text1&#039;,&lt;br /&gt;
		[&#039;RD3T1-loc&#039;] = &#039;RD3-text1&#039;,&lt;br /&gt;
	}, {&lt;br /&gt;
		[&#039;RD2b-hide&#039;] = &#039;y&#039;,&lt;br /&gt;
		[&#039;RD3b-hide&#039;] = &#039;y&#039;,&lt;br /&gt;
		&lt;br /&gt;
		[&#039;col1-headers&#039;] = &#039;1&#039;,&lt;br /&gt;
		[&#039;col2-headers&#039;] = &#039;1&#039; .. (RD2b and &#039;,13.5&#039; or &#039;&#039;),&lt;br /&gt;
		[&#039;col3-headers&#039;] = &#039;1,&#039; .. (RD2b and &#039;13.5&#039; or &#039;10.5&#039;),&lt;br /&gt;
		&lt;br /&gt;
		[&#039;col1-matches&#039;] = &#039;3,6,9,12&#039;,&lt;br /&gt;
		[&#039;col2-matches&#039;] = &#039;4.5,10.5&#039; .. (RD2b and &#039;,15.5&#039; or &#039;&#039;),&lt;br /&gt;
		[&#039;col3-matches&#039;] = &#039;7.5,&#039; .. (RD2b and &#039;15.5&#039; or &#039;12.5&#039;),&lt;br /&gt;
&lt;br /&gt;
		[&#039;col1-col2-paths&#039;] = &#039;(3,6)-4.5,(9,12)-10.5&#039;,&lt;br /&gt;
		[&#039;col2-col3-paths&#039;] = &#039;(4.5,10.5)-7.5&#039;,&lt;br /&gt;
		&lt;br /&gt;
		RD1 = &#039;Quarterfinals&#039;,&lt;br /&gt;
		RD2 = &#039;Semifinals&#039;,&lt;br /&gt;
		RD3 = &#039;Final&#039;,&lt;br /&gt;
		RD3b = &#039;Third place&#039;,&lt;br /&gt;
	})&lt;br /&gt;
end&lt;br /&gt;
p[&#039;8TeamBracket-info&#039;] = p[&#039;8TeamBracket-Info&#039;]&lt;br /&gt;
&lt;br /&gt;
p[&#039;9TeamBracket&#039;] = function (frame)&lt;br /&gt;
	return p._Bracket(frame, &#039;9TeamBracket&#039;, {&lt;br /&gt;
	}, {&lt;br /&gt;
		[&#039;compact&#039;] = &#039;y&#039;,&lt;br /&gt;
		[&#039;byes&#039;] = &#039;1&#039;,&lt;br /&gt;
		[&#039;RD1-omit&#039;] = &#039;1/2&#039;,&lt;br /&gt;
		&lt;br /&gt;
		RD1 = &#039;First round&#039;,&lt;br /&gt;
		RD2 = &#039;Quarterfinals&#039;,&lt;br /&gt;
		RD3 = &#039;Semifinals&#039;,&lt;br /&gt;
		RD4 = &#039;Finals&#039;,&lt;br /&gt;
	})&lt;br /&gt;
end&lt;br /&gt;
	&lt;br /&gt;
p[&#039;10TeamBracket&#039;] = function (frame)&lt;br /&gt;
	return p._Bracket(frame, &#039;10TeamBracket&#039;, {&lt;br /&gt;
		[&#039;group1&#039;]		= &amp;quot;RD2-group1&amp;quot;,&lt;br /&gt;
		[&#039;group2&#039;]		= &amp;quot;RD2-group2&amp;quot;,&lt;br /&gt;
	}, {&lt;br /&gt;
		[&#039;compact&#039;]		= &amp;quot;y&amp;quot;,&lt;br /&gt;
		[&#039;seeds&#039;]		= &amp;quot;y&amp;quot;,&lt;br /&gt;
		[&#039;RD1-omit&#039;]	= &amp;quot;1/2/5/6/7/8/9/10/13/14/15/16&amp;quot;,&lt;br /&gt;
		&lt;br /&gt;
		[&#039;RD1&#039;]			= &amp;quot;First round&amp;quot;,&lt;br /&gt;
		[&#039;RD2&#039;]			= &amp;quot;Quarterfinals&amp;quot;,&lt;br /&gt;
		[&#039;RD3&#039;]			= &amp;quot;Semifinals&amp;quot;,&lt;br /&gt;
		[&#039;RD4&#039;]			= &amp;quot;Finals&amp;quot;,&lt;br /&gt;
		&lt;br /&gt;
		[&#039;RD1-seed1&#039;]	= &amp;quot;8&amp;quot;,&lt;br /&gt;
		[&#039;RD1-seed2&#039;]	= &amp;quot;9&amp;quot;,&lt;br /&gt;
		[&#039;RD1-seed3&#039;]	= &amp;quot;7&amp;quot;,&lt;br /&gt;
		[&#039;RD1-seed4&#039;]	= &amp;quot;10&amp;quot;,&lt;br /&gt;
		[&#039;RD2-seed1&#039;]	= &amp;quot;1&amp;quot;,&lt;br /&gt;
		[&#039;RD2-seed3&#039;]	= &amp;quot;4&amp;quot;,&lt;br /&gt;
		[&#039;RD2-seed4&#039;]	= &amp;quot;5&amp;quot;,&lt;br /&gt;
		[&#039;RD2-seed5&#039;]	= &amp;quot;2&amp;quot;,&lt;br /&gt;
		[&#039;RD2-seed7&#039;]	= &amp;quot;3&amp;quot;,&lt;br /&gt;
		[&#039;RD2-seed8&#039;]	= &amp;quot;6&amp;quot;&lt;br /&gt;
	})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p[&#039;12TeamBracket&#039;] = function (frame)&lt;br /&gt;
	return p._Bracket(frame, &#039;8TeamBracket&#039;, {&lt;br /&gt;
		[&#039;subgroup1&#039;] = &amp;quot;RD1-group1&amp;quot;,&lt;br /&gt;
		[&#039;subgroup2&#039;] = &amp;quot;RD1-group2&amp;quot;,&lt;br /&gt;
		[&#039;subgroup3&#039;] = &amp;quot;RD1-group3&amp;quot;,&lt;br /&gt;
		[&#039;subgroup4&#039;] = &amp;quot;RD1-group4&amp;quot;,&lt;br /&gt;
		&lt;br /&gt;
		[&#039;group1&#039;] = &amp;quot;RD2-group1&amp;quot;,&lt;br /&gt;
		[&#039;group2&#039;] = &amp;quot;RD2-group2&amp;quot;,&lt;br /&gt;
		[&#039;group3&#039;] = &amp;quot;RD3-group1&amp;quot;,&lt;br /&gt;
	}, {&lt;br /&gt;
		[&#039;RD1-omit&#039;] = &amp;quot;1/2/5/6/9/10/13/14&amp;quot;,&lt;br /&gt;
		&lt;br /&gt;
		[&#039;compact&#039;] = &amp;quot;y&amp;quot;,&lt;br /&gt;
				&lt;br /&gt;
		[&#039;RD1&#039;] = &amp;quot;First round&amp;quot;,&lt;br /&gt;
		[&#039;RD2&#039;] = &amp;quot;Quarter-finals&amp;quot;,&lt;br /&gt;
		[&#039;RD3&#039;] = &amp;quot;Semi-finals&amp;quot;,&lt;br /&gt;
		[&#039;RD4&#039;] = &amp;quot;Final&amp;quot;,&lt;br /&gt;
		&lt;br /&gt;
		[&#039;RD1-seed1&#039;] = &amp;quot;8&amp;quot;,&lt;br /&gt;
		[&#039;RD1-seed2&#039;] = &amp;quot;9&amp;quot;,&lt;br /&gt;
		[&#039;RD1-seed3&#039;] = &amp;quot;5&amp;quot;,&lt;br /&gt;
		[&#039;RD1-seed4&#039;] = &amp;quot;12&amp;quot;,&lt;br /&gt;
		[&#039;RD1-seed5&#039;] = &amp;quot;7&amp;quot;,&lt;br /&gt;
		[&#039;RD1-seed6&#039;] = &amp;quot;10&amp;quot;,&lt;br /&gt;
		[&#039;RD1-seed7&#039;] = &amp;quot;6&amp;quot;,&lt;br /&gt;
		[&#039;RD1-seed8&#039;] = &amp;quot;11&amp;quot;,&lt;br /&gt;
		[&#039;RD2-seed1&#039;] = &amp;quot;1&amp;quot;,&lt;br /&gt;
		[&#039;RD2-seed3&#039;] = &amp;quot;4&amp;quot;,&lt;br /&gt;
		[&#039;RD2-seed5&#039;] = &amp;quot;2&amp;quot;,&lt;br /&gt;
		[&#039;RD2-seed7&#039;] = &amp;quot;3&amp;quot;,&lt;br /&gt;
	})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p[&#039;12TeamBracket-Consols&#039;] = function (frame)&lt;br /&gt;
	return p._Bracket(frame, &#039;12TeamBracket-Consols&#039;, {&lt;br /&gt;
	}, {&lt;br /&gt;
		[&#039;rounds&#039;] = &amp;quot;6&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
		[&#039;col1-headers&#039;] = &amp;quot;1,12.5&amp;quot;,&lt;br /&gt;
		[&#039;col2-headers&#039;] = &amp;quot;1&amp;quot;,&lt;br /&gt;
		[&#039;col3-headers&#039;] = &amp;quot;1&amp;quot;,&lt;br /&gt;
		[&#039;col4-headers&#039;] = &amp;quot;1&amp;quot;,&lt;br /&gt;
		[&#039;col5-headers&#039;] = &amp;quot;1,16.5&amp;quot;,&lt;br /&gt;
		[&#039;col6-headers&#039;] = &amp;quot;1,12,16.5,23&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
		[&#039;col1-matches&#039;] = &amp;quot;8.5,14.5&amp;quot;,&lt;br /&gt;
		[&#039;col2-matches&#039;] = &amp;quot;5.5,11.5&amp;quot;,&lt;br /&gt;
		[&#039;col3-matches&#039;] = &amp;quot;4,7,10,13&amp;quot;,&lt;br /&gt;
		[&#039;col4-matches&#039;] = &amp;quot;3,6,9,12&amp;quot;,&lt;br /&gt;
		[&#039;col5-matches&#039;] = &amp;quot;4.5,10.5,18.5,21.5&amp;quot;,&lt;br /&gt;
		[&#039;col6-matches&#039;] = &amp;quot;7.5,14,20,25&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
		[&#039;col1-col2-paths&#039;] = &amp;quot;8.5-(5.5,11.5)&amp;quot;,&lt;br /&gt;
		[&#039;col2-col3-paths&#039;] = &amp;quot;5.5-(4,7), 11.5-(10,13)&amp;quot;,&lt;br /&gt;
		[&#039;col3-col4-paths&#039;] = &amp;quot;4-3,7-6,10-9,13-12&amp;quot;,&lt;br /&gt;
		[&#039;col4-col5-paths&#039;] = &amp;quot;(3,6)-4.5, (9,12)-10.5&amp;quot;,&lt;br /&gt;
		[&#039;col5-col6-paths&#039;] = &amp;quot;(4.5,10.5)-7.5,(18.5,21.5)-20&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
		[&#039;RD1b-hide&#039;] = &amp;quot;y&amp;quot;,&lt;br /&gt;
		[&#039;RD5b-hide&#039;] = &amp;quot;y&amp;quot;,&lt;br /&gt;
		[&#039;RD6b-hide&#039;] = &amp;quot;y&amp;quot;, [&#039;RD6c-hide&#039;] = &amp;quot;y&amp;quot;, [&#039;RD6d-hide&#039;] = &amp;quot;y&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
		[&#039;RD1&#039;] = &amp;quot;Ninth place&amp;quot;,&lt;br /&gt;
		[&#039;RD2&#039;] = &amp;quot;Consolation semifinals&amp;quot;,&lt;br /&gt;
		[&#039;RD3&#039;] = &amp;quot;First round&amp;quot;,&lt;br /&gt;
		[&#039;RD1b&#039;] = &amp;quot;Eleventh place&amp;quot;,&lt;br /&gt;
		[&#039;RD5b&#039;] = &amp;quot;5th–8th classification&amp;quot;,&lt;br /&gt;
		[&#039;RD6b&#039;] = &amp;quot;Third place&amp;quot;, [&#039;RD6c&#039;] = &amp;quot;Fifth place&amp;quot;, [&#039;RD6d&#039;] = &amp;quot;Seventh place&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
		[&#039;RD1-shade&#039;] = &amp;quot;#FFFFFF&amp;quot;,&lt;br /&gt;
		[&#039;RD2-shade&#039;] = &amp;quot;#FFFFFF&amp;quot;,&lt;br /&gt;
		[&#039;RD1b-shade&#039;] = &amp;quot;#FFFFFF&amp;quot;, [&#039;RD1c-shade&#039;] = &amp;quot;#FFFFFF&amp;quot;, [&#039;RD1d-shade&#039;] = &amp;quot;#FFFFFF&amp;quot;,&lt;br /&gt;
		[&#039;RD2b-shade&#039;] = &amp;quot;#FFFFFF&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
		[&#039;RD1-altname&#039;] = &amp;quot;9thplace&amp;quot;,&lt;br /&gt;
		[&#039;RD2-altname&#039;] = &amp;quot;9to12SF&amp;quot;,&lt;br /&gt;
		[&#039;RD3-altname&#039;] = &amp;quot;9to16QF&amp;quot;,&lt;br /&gt;
		[&#039;RD4-altname&#039;] = &amp;quot;Ro16&amp;quot;,&lt;br /&gt;
		[&#039;RD5-altname&#039;] = &amp;quot;QF&amp;quot;,&lt;br /&gt;
		[&#039;RD6-altname&#039;] = &amp;quot;SF&amp;quot;,&lt;br /&gt;
		[&#039;RD7-altname&#039;] = &amp;quot;final&amp;quot;,&lt;br /&gt;
		[&#039;RD1b-altname&#039;] = &amp;quot;11thplace&amp;quot;, [&#039;RD1c-altname&#039;] = &amp;quot;13thplace&amp;quot;, [&#039;RD1d-altname&#039;] = &amp;quot;15thplace&amp;quot;,&lt;br /&gt;
		[&#039;RD2b-altname&#039;] = &amp;quot;13to16SF&amp;quot;,&lt;br /&gt;
		[&#039;RD6b-altname&#039;] = &amp;quot;5to8SF&amp;quot;,&lt;br /&gt;
		[&#039;RD7b-altname&#039;] = &amp;quot;3rdplace&amp;quot;, [&#039;RD7c-altname&#039;] = &amp;quot;5thplace&amp;quot;, [&#039;RD7d-altname&#039;] = &amp;quot;7thplace&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
		[&#039;text-altname&#039;] = &amp;quot;details&amp;quot;,&lt;br /&gt;
	})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p[&#039;14TeamBracket&#039;] = function (frame)&lt;br /&gt;
	return p._Bracket(frame, &#039;14TeamBracket&#039;, {&lt;br /&gt;
		[&#039;subgroup1&#039;] = &amp;quot;RD1-group1&amp;quot;,&lt;br /&gt;
		[&#039;subgroup2&#039;] = &amp;quot;RD1-group2&amp;quot;,&lt;br /&gt;
		[&#039;subgroup3&#039;] = &amp;quot;RD1-group3&amp;quot;,&lt;br /&gt;
		[&#039;subgroup4&#039;] = &amp;quot;RD1-group4&amp;quot;,&lt;br /&gt;
		&lt;br /&gt;
		[&#039;group1&#039;] = &amp;quot;RD2-group1&amp;quot;,&lt;br /&gt;
		[&#039;group2&#039;] = &amp;quot;RD2-group2&amp;quot;,&lt;br /&gt;
		[&#039;group3&#039;] = &amp;quot;RD3-group1&amp;quot;,&lt;br /&gt;
	}, {&lt;br /&gt;
		[&#039;RD1-omit&#039;] = &amp;quot;1/2/9/10&amp;quot;,&lt;br /&gt;
		&lt;br /&gt;
		[&#039;RD1&#039;] = &amp;quot;First round&amp;quot;,&lt;br /&gt;
		[&#039;RD2&#039;] = &amp;quot;Quarterfinals&amp;quot;,&lt;br /&gt;
		[&#039;RD3&#039;] = &amp;quot;Semifinals&amp;quot;,&lt;br /&gt;
		[&#039;RD4&#039;] = &amp;quot;Final&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
		[&#039;RD1-team1&#039;] = &amp;quot;&amp;amp;nbsp;&amp;quot;,&lt;br /&gt;
		[&#039;RD1-team2&#039;] = &amp;quot;&amp;amp;nbsp;&amp;quot;,&lt;br /&gt;
		[&#039;RD1-team3&#039;] = &amp;quot;&amp;amp;nbsp;&amp;quot;,&lt;br /&gt;
		[&#039;RD1-team4&#039;] = &amp;quot;&amp;amp;nbsp;&amp;quot;,&lt;br /&gt;
		[&#039;RD1-team5&#039;] = &amp;quot;&amp;amp;nbsp;&amp;quot;,&lt;br /&gt;
		[&#039;RD1-team6&#039;] = &amp;quot;&amp;amp;nbsp;&amp;quot;,&lt;br /&gt;
		[&#039;RD1-team7&#039;] = &amp;quot;&amp;amp;nbsp;&amp;quot;,&lt;br /&gt;
		[&#039;RD1-team8&#039;] = &amp;quot;&amp;amp;nbsp;&amp;quot;,&lt;br /&gt;
		[&#039;RD1-team9&#039;] = &amp;quot;&amp;amp;nbsp;&amp;quot;,&lt;br /&gt;
		[&#039;RD1-team10&#039;] = &amp;quot;&amp;amp;nbsp;&amp;quot;,&lt;br /&gt;
		[&#039;RD1-team11&#039;] = &amp;quot;&amp;amp;nbsp;&amp;quot;,&lt;br /&gt;
		[&#039;RD1-team12&#039;] = &amp;quot;&amp;amp;nbsp;&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
		[&#039;RD1-group1&#039;] = &amp;quot;&amp;quot;,&lt;br /&gt;
		[&#039;RD1-group2&#039;] = &amp;quot;&amp;quot;,&lt;br /&gt;
		[&#039;RD1-group3&#039;] = &amp;quot;&amp;quot;,&lt;br /&gt;
		[&#039;RD1-group4&#039;] = &amp;quot;&amp;quot;,&lt;br /&gt;
		[&#039;RD2-group1&#039;] = &amp;quot;&amp;quot;,&lt;br /&gt;
		[&#039;RD2-group2&#039;] = &amp;quot;&amp;quot;,&lt;br /&gt;
		[&#039;RD3-group1&#039;] = &amp;quot;&amp;quot;,&lt;br /&gt;
		[&#039;RD1-seed1&#039;] = &amp;quot;8&amp;quot;,&lt;br /&gt;
		[&#039;RD1-seed2&#039;] = &amp;quot;9&amp;quot;,&lt;br /&gt;
		[&#039;RD1-seed3&#039;] = &amp;quot;4&amp;quot;,&lt;br /&gt;
		[&#039;RD1-seed4&#039;] = &amp;quot;13&amp;quot;,&lt;br /&gt;
		[&#039;RD1-seed5&#039;] = &amp;quot;5&amp;quot;,&lt;br /&gt;
		[&#039;RD1-seed6&#039;] = &amp;quot;12&amp;quot;,&lt;br /&gt;
		[&#039;RD1-seed7&#039;] = &amp;quot;7&amp;quot;,&lt;br /&gt;
		[&#039;RD1-seed8&#039;] = &amp;quot;10&amp;quot;,&lt;br /&gt;
		[&#039;RD1-seed9&#039;] = &amp;quot;3&amp;quot;,&lt;br /&gt;
		[&#039;RD1-seed10&#039;] = &amp;quot;14&amp;quot;,&lt;br /&gt;
		[&#039;RD1-seed11&#039;] = &amp;quot;6&amp;quot;,&lt;br /&gt;
		[&#039;RD1-seed12&#039;] = &amp;quot;11&amp;quot;,&lt;br /&gt;
		[&#039;RD2-seed1&#039;] = &amp;quot;1&amp;quot;,&lt;br /&gt;
		[&#039;RD2-seed5&#039;] = &amp;quot;2&amp;quot;,&lt;br /&gt;
	})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p[&#039;14TeamBracket-Consols&#039;] = function (frame)&lt;br /&gt;
	return p._Bracket(frame, &#039;14TeamBracket-Consols&#039;, {&lt;br /&gt;
	}, {&lt;br /&gt;
		[&#039;rounds&#039;] = &amp;quot;5&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
		[&#039;col1-headers&#039;] = &amp;quot;1&amp;quot;,&lt;br /&gt;
		[&#039;col2-headers&#039;] = &amp;quot;1&amp;quot;,&lt;br /&gt;
		[&#039;col3-headers&#039;] = &amp;quot;1,18.5&amp;quot;,&lt;br /&gt;
		[&#039;col4-headers&#039;] = &amp;quot;1,18.5&amp;quot;,&lt;br /&gt;
		[&#039;col5-headers&#039;] = &amp;quot;1&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
		[&#039;col1-matches&#039;] = &amp;quot;5,9,13,17&amp;quot;,&lt;br /&gt;
		[&#039;col2-matches&#039;] = &amp;quot;4,8,12,16&amp;quot;,&lt;br /&gt;
		[&#039;col3-matches&#039;] = &amp;quot;6,14,20&amp;quot;,&lt;br /&gt;
		[&#039;col4-matches&#039;] = &amp;quot;5,13,20&amp;quot;,&lt;br /&gt;
		[&#039;col5-matches&#039;] = &amp;quot;9&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
		[&#039;col1-col2-paths&#039;] = &amp;quot;5-4,9-8,13-12,17-16&amp;quot;,&lt;br /&gt;
		[&#039;col2-col3-paths&#039;] = &amp;quot;(4,8)-6,(12,16)-14&amp;quot;,&lt;br /&gt;
		[&#039;col3-col4-paths&#039;] = &amp;quot;6-5,14-13&amp;quot;,&lt;br /&gt;
		[&#039;col4-col5-paths&#039;] = &amp;quot;(5,13)-9&amp;quot;,&lt;br /&gt;
	})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p[&#039;14TeamBracket-Stepladder&#039;] = function (frame)&lt;br /&gt;
	return p._Bracket(frame, &#039;14TeamBracket-Stepladder&#039;, {&lt;br /&gt;
	}, {&lt;br /&gt;
		[&#039;rounds&#039;] = &#039;7&#039;,&lt;br /&gt;
		&lt;br /&gt;
		[&#039;col1-matches&#039;] = &#039;8,15&#039;,&lt;br /&gt;
		[&#039;col2-matches&#039;] = &#039;7,14&#039;,&lt;br /&gt;
		[&#039;col3-matches&#039;] = &#039;6,13&#039;,&lt;br /&gt;
		[&#039;col4-matches&#039;] = &#039;5,12&#039;,&lt;br /&gt;
		[&#039;col5-matches&#039;] = &#039;4,11&#039;,&lt;br /&gt;
		[&#039;col6-matches&#039;] = &#039;3,10&#039;,&lt;br /&gt;
		[&#039;col7-matches&#039;] = &#039;7&#039;,&lt;br /&gt;
		&lt;br /&gt;
		[&#039;col1-col2-paths&#039;] = &#039;8-7,15-14&#039;,&lt;br /&gt;
		[&#039;col2-col3-paths&#039;] = &#039;7-6,14-13&#039;,&lt;br /&gt;
		[&#039;col3-col4-paths&#039;] = &#039;6-5,13-12&#039;,&lt;br /&gt;
		[&#039;col4-col5-paths&#039;] = &#039;5-4,12-11&#039;,&lt;br /&gt;
		[&#039;col5-col6-paths&#039;] = &#039;4-3,11-10&#039;,&lt;br /&gt;
		[&#039;col6-col7-paths&#039;] = &#039;(3,10)-7&#039;,&lt;br /&gt;
		&lt;br /&gt;
		[&#039;RD1-seed01&#039;] = &#039;12&#039;,&lt;br /&gt;
		[&#039;RD1-seed02&#039;] = &#039;13&#039;,&lt;br /&gt;
		[&#039;RD1-seed03&#039;] = &#039;11&#039;,&lt;br /&gt;
		[&#039;RD1-seed04&#039;] = &#039;14&#039;,&lt;br /&gt;
		&lt;br /&gt;
		[&#039;RD2-seed01&#039;] = &#039;9&#039;,&lt;br /&gt;
		[&#039;RD2-seed03&#039;] = &#039;10&#039;,&lt;br /&gt;
		&lt;br /&gt;
		[&#039;RD3-seed01&#039;] = &#039;8&#039;,&lt;br /&gt;
		[&#039;RD3-seed03&#039;] = &#039;7&#039;,&lt;br /&gt;
		&lt;br /&gt;
		[&#039;RD4-seed01&#039;] = &#039;5&#039;,&lt;br /&gt;
		[&#039;RD4-seed03&#039;] = &#039;6&#039;,&lt;br /&gt;
		&lt;br /&gt;
		[&#039;RD5-seed01&#039;] = &#039;4&#039;,&lt;br /&gt;
		[&#039;RD5-seed03&#039;] = &#039;3&#039;,&lt;br /&gt;
		&lt;br /&gt;
		[&#039;RD6-seed01&#039;] = &#039;1&#039;,&lt;br /&gt;
		[&#039;RD6-seed03&#039;] = &#039;2&#039;,&lt;br /&gt;
	})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p[&#039;16TeamBracket&#039;] = function (frame)&lt;br /&gt;
	return p._Bracket(frame, &#039;16TeamBracket&#039;, {&lt;br /&gt;
		subgroup1 = &#039;RD1-group1&#039;,&lt;br /&gt;
		subgroup2 = &#039;RD1-group2&#039;,&lt;br /&gt;
		subgroup3 = &#039;RD1-group3&#039;,&lt;br /&gt;
		subgroup4 = &#039;RD1-group4&#039;,&lt;br /&gt;
		&lt;br /&gt;
		group1 = &#039;RD2-group1&#039;,&lt;br /&gt;
		group2 = &#039;RD2-group2&#039;,&lt;br /&gt;
		group3 = &#039;RD3-group1&#039;,&lt;br /&gt;
	}, {&lt;br /&gt;
		[&#039;RD1-seed1&#039;] = 1,&lt;br /&gt;
		[&#039;RD1-seed2&#039;] = 16,&lt;br /&gt;
		[&#039;RD1-seed3&#039;] = 8,&lt;br /&gt;
		[&#039;RD1-seed4&#039;] = 9,&lt;br /&gt;
		[&#039;RD1-seed5&#039;] = 5,&lt;br /&gt;
		[&#039;RD1-seed6&#039;] = 12,&lt;br /&gt;
		[&#039;RD1-seed7&#039;] = 4,&lt;br /&gt;
		[&#039;RD1-seed8&#039;] = 13,&lt;br /&gt;
		[&#039;RD1-seed9&#039;] = 6,&lt;br /&gt;
		[&#039;RD1-seed10&#039;] = 11,&lt;br /&gt;
		[&#039;RD1-seed11&#039;] = 3,&lt;br /&gt;
		[&#039;RD1-seed12&#039;] = 14,&lt;br /&gt;
		[&#039;RD1-seed13&#039;] = 7,&lt;br /&gt;
		[&#039;RD1-seed14&#039;] = 10,&lt;br /&gt;
		[&#039;RD1-seed15&#039;] = 2,&lt;br /&gt;
		[&#039;RD1-seed16&#039;] = 15,&lt;br /&gt;
		RD1 = &#039;First round&#039;,&lt;br /&gt;
		RD2 = &#039;Quarter-finals&#039;,&lt;br /&gt;
		RD3 = &#039;Semi-finals&#039;,&lt;br /&gt;
		RD4 = &#039;Final&#039;,&lt;br /&gt;
	})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p[&#039;16TeamBracket-Byes&#039;] = function (frame)&lt;br /&gt;
	return p._Bracket(frame, &#039;16TeamBracket-Byes&#039;, {&lt;br /&gt;
		group1 = &amp;quot;RD1-group1&amp;quot;,&lt;br /&gt;
		group2 = &amp;quot;RD2-group2&amp;quot;,&lt;br /&gt;
	}, {&lt;br /&gt;
		seeds = &#039;yes&#039;,&lt;br /&gt;
		byes = 1,&lt;br /&gt;
		RD1 = &#039;First round&#039;,&lt;br /&gt;
		RD2 = &#039;Second round&#039;,&lt;br /&gt;
		RD3 = &#039;Semifinals&#039;,&lt;br /&gt;
		RD4 = &#039;Finals&#039;,&lt;br /&gt;
		[&#039;team-width&#039;] = &#039;11em&#039;,&lt;br /&gt;
		[&#039;score-width&#039;] = &#039;2em&#039;,&lt;br /&gt;
		[&#039;RD1-group1&#039;] = &#039;&#039;,&lt;br /&gt;
		[&#039;RD2-group2&#039;] = &#039;&#039;,&lt;br /&gt;
	})&lt;br /&gt;
end&lt;br /&gt;
p[&#039;4RoundBracket-Byes&#039;] = p[&#039;16TeamBracket-Byes&#039;]&lt;br /&gt;
&lt;br /&gt;
p[&#039;16TeamBracket-Consols&#039;] = function (frame)&lt;br /&gt;
	return p._Bracket(frame, &#039;16TeamBracket-Consols&#039;, {&lt;br /&gt;
	}, {&lt;br /&gt;
		[&#039;RD1b-hide&#039;] = &amp;quot;y&amp;quot;, [&#039;RD1c-hide&#039;] = &amp;quot;y&amp;quot;, [&#039;RD1d-hide&#039;] = &amp;quot;y&amp;quot;,&lt;br /&gt;
		[&#039;RD2b-hide&#039;] = &amp;quot;y&amp;quot;,&lt;br /&gt;
		[&#039;RD6b-hide&#039;] = &amp;quot;y&amp;quot;,&lt;br /&gt;
		[&#039;RD7b-hide&#039;] = &amp;quot;y&amp;quot;, [&#039;RD7c-hide&#039;] = &amp;quot;y&amp;quot;, [&#039;RD7d-hide&#039;] = &amp;quot;y&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
		[&#039;col1-headers&#039;] = &amp;quot;1,16.5,22.5,29&amp;quot;,&lt;br /&gt;
		[&#039;col2-headers&#039;] = &amp;quot;1,22.5&amp;quot;,&lt;br /&gt;
		[&#039;col3-headers&#039;] = &amp;quot;1&amp;quot;,&lt;br /&gt;
		[&#039;col4-headers&#039;] = &amp;quot;1&amp;quot;,&lt;br /&gt;
		[&#039;col5-headers&#039;] = &amp;quot;1&amp;quot;,&lt;br /&gt;
		[&#039;col6-headers&#039;] = &amp;quot;1,22.5&amp;quot;,&lt;br /&gt;
		[&#039;col7-headers&#039;] = &amp;quot;1,16.5,22.5,29&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
		[&#039;col1-matches&#039;] = &amp;quot;13.5,18.5,26,31&amp;quot;,&lt;br /&gt;
		[&#039;col2-matches&#039;] = &amp;quot;7.5,19.5,24.5,27.5&amp;quot;,&lt;br /&gt;
		[&#039;col3-matches&#039;] = &amp;quot;4.5,10.5,16.5,22.5&amp;quot;,&lt;br /&gt;
		[&#039;col4-matches&#039;] = &amp;quot;3,6,9,12,15,18,21,24&amp;quot;,&lt;br /&gt;
		[&#039;col5-matches&#039;] = &amp;quot;4.5,10.5,16.5,22.5&amp;quot;,&lt;br /&gt;
		[&#039;col6-matches&#039;] = &amp;quot;7.5,19.5,24.5,27.5&amp;quot;,&lt;br /&gt;
		[&#039;col7-matches&#039;] = &amp;quot;13.5,18.5,26,31&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
		[&#039;col1-col2-paths&#039;] = &amp;quot;13.5-(7.5,19.5),26-(24.5,27.5)&amp;quot;,&lt;br /&gt;
		[&#039;col2-col3-paths&#039;] = &amp;quot;7.5-(4.5,10.5), 19.5-(16.5,22.5)&amp;quot;,&lt;br /&gt;
		[&#039;col3-col4-paths&#039;] = &amp;quot;4.5-(3,6), 10.5-(9,12), 16.5-(15,18), 22.5-(21,24)&amp;quot;,&lt;br /&gt;
		[&#039;col4-col5-paths&#039;] = &amp;quot;(3,6)-4.5, (9,12)-10.5, (15,18)-16.5, (21,24)-22.5&amp;quot;,&lt;br /&gt;
		[&#039;col5-col6-paths&#039;] = &amp;quot;(4.5,10.5)-7.5, (16.5,22.5)-19.5&amp;quot;,&lt;br /&gt;
		[&#039;col6-col7-paths&#039;] = &amp;quot;(7.5,19.5)-13.5,(24.5,27.5)-26&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
		[&#039;RD1&#039;] = &amp;quot;Ninth place&amp;quot;,&lt;br /&gt;
		[&#039;RD2&#039;] = &amp;quot;Consolation semifinals&amp;quot;,&lt;br /&gt;
		[&#039;RD3&#039;] = &amp;quot;Consolation quarterfinals&amp;quot;,&lt;br /&gt;
		[&#039;RD4&#039;] = &amp;quot;Round of 16&amp;quot;,&lt;br /&gt;
		[&#039;RD1b&#039;] = &amp;quot;Eleventh place&amp;quot;,&lt;br /&gt;
		[&#039;RD1c&#039;] = &amp;quot;Thirteenth place&amp;quot;,&lt;br /&gt;
		[&#039;RD1d&#039;] = &amp;quot;Fifteenth place&amp;quot;,&lt;br /&gt;
		[&#039;RD2b&#039;] = &amp;quot;13th–16th classification&amp;quot;,&lt;br /&gt;
		[&#039;RD6b&#039;] = &amp;quot;5th–8th classification&amp;quot;,&lt;br /&gt;
		[&#039;RD7b&#039;] = &amp;quot;Third place&amp;quot;,&lt;br /&gt;
		[&#039;RD7c&#039;] = &amp;quot;Fifth place&amp;quot;,&lt;br /&gt;
		[&#039;RD7d&#039;] = &amp;quot;Seventh place&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
		[&#039;RD1-shade&#039;] = &amp;quot;#FFFFFF&amp;quot;,&lt;br /&gt;
		[&#039;RD2-shade&#039;] = &amp;quot;#FFFFFF&amp;quot;,&lt;br /&gt;
		[&#039;RD3-shade&#039;] = &amp;quot;#FFFFFF&amp;quot;,&lt;br /&gt;
		[&#039;RD1b-shade&#039;] = &amp;quot;#FFFFFF&amp;quot;,&lt;br /&gt;
		[&#039;RD1c-shade&#039;] = &amp;quot;#FFFFFF&amp;quot;,&lt;br /&gt;
		[&#039;RD1d-shade&#039;] = &amp;quot;#FFFFFF&amp;quot;,&lt;br /&gt;
		[&#039;RD2b-shade&#039;] = &amp;quot;#FFFFFF&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
		[&#039;RD1-altname&#039;] = &amp;quot;9thplace&amp;quot;,&lt;br /&gt;
		[&#039;RD2-altname&#039;] = &amp;quot;9to12SF&amp;quot;,&lt;br /&gt;
		[&#039;RD3-altname&#039;] = &amp;quot;9to16QF&amp;quot;,&lt;br /&gt;
		[&#039;RD4-altname&#039;] = &amp;quot;Ro16&amp;quot;,&lt;br /&gt;
		[&#039;RD5-altname&#039;] = &amp;quot;QF&amp;quot;,&lt;br /&gt;
		[&#039;RD6-altname&#039;] = &amp;quot;SF&amp;quot;,&lt;br /&gt;
		[&#039;RD7-altname&#039;] = &amp;quot;final&amp;quot;,&lt;br /&gt;
		[&#039;RD1b-altname&#039;] = &amp;quot;11thplace&amp;quot;,&lt;br /&gt;
		[&#039;RD1c-altname&#039;] = &amp;quot;13thplace&amp;quot;,&lt;br /&gt;
		[&#039;RD1d-altname&#039;] = &amp;quot;15thplace&amp;quot;,&lt;br /&gt;
		[&#039;RD2b-altname&#039;] = &amp;quot;13to16SF&amp;quot;,&lt;br /&gt;
		[&#039;RD6b-altname&#039;] = &amp;quot;5to8SF&amp;quot;,&lt;br /&gt;
		[&#039;RD7b-altname&#039;] = &amp;quot;3rdplace&amp;quot;,&lt;br /&gt;
		[&#039;RD7c-altname&#039;] = &amp;quot;5thplace&amp;quot;,&lt;br /&gt;
		[&#039;RD7d-altname&#039;] = &amp;quot;7thplace&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
		[&#039;text-altname&#039;] = &amp;quot;details&amp;quot;,&lt;br /&gt;
	})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p[&#039;16TeamBracket-Tennis3&#039;] = function (frame)&lt;br /&gt;
	return p._Bracket(frame, &#039;16TeamBracket-Tennis3&#039;, {}, {&lt;br /&gt;
		[&#039;team-width&#039;] = 140,&lt;br /&gt;
		[&#039;score-width&#039;] = 25,&lt;br /&gt;
		RD1 = &#039;First round&#039;,&lt;br /&gt;
		RD2 = &#039;Quarterfinals&#039;,&lt;br /&gt;
		RD3 = &#039;Semifinals&#039;,&lt;br /&gt;
		RD4 = &#039;Final&#039;,&lt;br /&gt;
	})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p[&#039;16TeamBracket-Tennis3-Byes&#039;] = function (frame)&lt;br /&gt;
	return p._Bracket(frame, &#039;16TeamBracket-Tennis3-Byes&#039;, {}, {&lt;br /&gt;
		byes = 1,&lt;br /&gt;
		[&#039;team-width&#039;] = 125,&lt;br /&gt;
		[&#039;score-width&#039;] = 25,&lt;br /&gt;
		RD1 = &#039;First round&#039;,&lt;br /&gt;
		RD2 = &#039;Quarterfinals&#039;,&lt;br /&gt;
		RD3 = &#039;Semifinals&#039;,&lt;br /&gt;
		RD4 = &#039;Finals&#039;,&lt;br /&gt;
	})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p[&#039;16TeamBracket-Compact-NoSeeds-Byes&#039;] = function (frame)&lt;br /&gt;
	return p._Bracket(frame, &#039;16TeamBracket-Compact-NoSeeds-Byes&#039;, {&lt;br /&gt;
	}, {&lt;br /&gt;
		byes = 3,&lt;br /&gt;
		RD1 = &#039;Round of 16&#039;,&lt;br /&gt;
		RD2 = &#039;Quarterfinals&#039;,&lt;br /&gt;
		RD3 = &#039;Semifinals&#039;,&lt;br /&gt;
		RD4 = &#039;Final&#039;,&lt;br /&gt;
		[&#039;team-width&#039;] = 125,&lt;br /&gt;
		[&#039;score-width&#039;] = 25&lt;br /&gt;
	})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p[&#039;16TeamBracket-Compact-Tennis3&#039;] = function (frame)&lt;br /&gt;
	return p._Bracket(frame, &#039;16TeamBracket-Compact-Tennis3&#039;, {}, {&lt;br /&gt;
		RD1 = &#039;1st round&#039;,&lt;br /&gt;
		RD2 = &#039;2nd round&#039;,&lt;br /&gt;
	})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p[&#039;16TeamBracket-Compact-Tennis3-Byes&#039;] = function (frame)&lt;br /&gt;
	return p._Bracket(frame, &#039;16TeamBracket-Compact-Tennis3-Byes&#039;, {}, {&lt;br /&gt;
		byes = 2,&lt;br /&gt;
		[&#039;seed-width&#039;] = 25,&lt;br /&gt;
		[&#039;team-width&#039;] = 150,&lt;br /&gt;
		RD1 = &#039;1st round&#039;,&lt;br /&gt;
		RD2 = &#039;2nd round&#039;,&lt;br /&gt;
		RD3 = &#039;Semifinals&#039;,&lt;br /&gt;
		RD4 = &#039;Final&#039;,&lt;br /&gt;
	})&lt;br /&gt;
end&lt;br /&gt;
p[&#039;4RoundBracket-Compact-Tennis3-Byes&#039;] = p[&#039;16TeamBracket-Compact-Tennis3-Byes&#039;]&lt;br /&gt;
&lt;br /&gt;
p[&#039;16TeamBracket-Compact-Archery&#039;] = function (frame)&lt;br /&gt;
	return p._Bracket(frame, &#039;16TeamBracket-Compact-Archery&#039;, {}, {&lt;br /&gt;
		nowrap = &#039;yes&#039;,&lt;br /&gt;
		sets = 6,&lt;br /&gt;
		seeds = &#039;yes&#039;,&lt;br /&gt;
		[&#039;team-width&#039;] = 150,&lt;br /&gt;
		[&#039;score-width&#039;] = 12,&lt;br /&gt;
		RD1 = &#039;1st round&#039;,&lt;br /&gt;
		RD2 = &#039;2nd round&#039;,&lt;br /&gt;
		RD3 = &#039;Semifinals&#039;,&lt;br /&gt;
		RD4 = &#039;Finals&#039;,&lt;br /&gt;
	})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p[&#039;16TeamBracket-Tennis5&#039;] = function (frame)&lt;br /&gt;
	return p._Bracket(frame, &#039;16TeamBracket-Tennis5&#039;, {}, {&lt;br /&gt;
		RD1 = &#039;First round&#039;,&lt;br /&gt;
		RD2 = &#039;Quarterfinals&#039;,&lt;br /&gt;
		RD3 = &#039;Semifinals&#039;,&lt;br /&gt;
		RD4 = &#039;Final&#039;,&lt;br /&gt;
		[&#039;seed-width&#039;] = 25,&lt;br /&gt;
		[&#039;team-width&#039;] = 150,&lt;br /&gt;
		[&#039;score-width&#039;] = 12,&lt;br /&gt;
	})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p[&#039;16TeamBracket-Compact-Tennis5&#039;] = function (frame)&lt;br /&gt;
	return p._Bracket(frame, &#039;16TeamBracket-Compact-Tennis5&#039;, {}, {&lt;br /&gt;
		RD1 = &#039;First round&#039;,&lt;br /&gt;
		RD2 = &#039;Second round&#039;,&lt;br /&gt;
		RD3 = &#039;Third round&#039;,&lt;br /&gt;
		RD4 = &#039;Fourth round&#039;,&lt;br /&gt;
	})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p[&#039;16TeamBracket-Compact-Tennis5-Byes&#039;] = function (frame)&lt;br /&gt;
	return p._Bracket(frame, &#039;16TeamBracket-Compact-Tennis5-Byes&#039;, {}, {&lt;br /&gt;
		byes = 1,&lt;br /&gt;
		RD1 = &#039;First round&#039;,&lt;br /&gt;
		RD2 = &#039;Second round&#039;,&lt;br /&gt;
		RD3 = &#039;Semifinals&#039;,&lt;br /&gt;
		RD4 = &#039;Final&#039;,&lt;br /&gt;
	})&lt;br /&gt;
end&lt;br /&gt;
p[&#039;4RoundBracket-Compact-Tennis5-Byes&#039;] = p[&#039;16TeamBracket-Compact-Tennis5-Byes&#039;]&lt;br /&gt;
&lt;br /&gt;
p[&#039;16TeamBracket-Info&#039;] = function (frame)&lt;br /&gt;
	return p._Bracket(frame, &#039;16TeamBracket-Info&#039;, {&lt;br /&gt;
		[&#039;RD1T1-loc&#039;] = &#039;RD1-text1&#039;,&lt;br /&gt;
		[&#039;RD1T2-loc&#039;] = &#039;RD1-text2&#039;,&lt;br /&gt;
		[&#039;RD1T3-loc&#039;] = &#039;RD1-text3&#039;,&lt;br /&gt;
		[&#039;RD1T4-loc&#039;] = &#039;RD1-text4&#039;,&lt;br /&gt;
		[&#039;RD1T5-loc&#039;] = &#039;RD1-text5&#039;,&lt;br /&gt;
		[&#039;RD1T6-loc&#039;] = &#039;RD1-text6&#039;,&lt;br /&gt;
		[&#039;RD1T7-loc&#039;] = &#039;RD1-text7&#039;,&lt;br /&gt;
		[&#039;RD1T8-loc&#039;] = &#039;RD1-text8&#039;,&lt;br /&gt;
		[&#039;RD2T1-loc&#039;] = &#039;RD2-text1&#039;,&lt;br /&gt;
		[&#039;RD2T2-loc&#039;] = &#039;RD2-text2&#039;,&lt;br /&gt;
		[&#039;RD2T3-loc&#039;] = &#039;RD2-text3&#039;,&lt;br /&gt;
		[&#039;RD2T4-loc&#039;] = &#039;RD2-text4&#039;,&lt;br /&gt;
		[&#039;RD3T1-loc&#039;] = &#039;RD3-text1&#039;,&lt;br /&gt;
		[&#039;RD3T2-loc&#039;] = &#039;RD3-text2&#039;,&lt;br /&gt;
		[&#039;RD4T1-loc&#039;] = &#039;RD4-text1&#039;,&lt;br /&gt;
		[&#039;RD1-name&#039;] = &#039;RD1&#039;,&lt;br /&gt;
		[&#039;RD2-name&#039;] = &#039;RD2&#039;,&lt;br /&gt;
		[&#039;RD3-name&#039;] = &#039;RD3&#039;,&lt;br /&gt;
		[&#039;RD4-name&#039;] = &#039;RD4&#039;,&lt;br /&gt;
	}, {&lt;br /&gt;
		[&#039;col1-headers&#039;] = &#039;1&#039;,&lt;br /&gt;
		[&#039;col2-headers&#039;] = &#039;1&#039;,&lt;br /&gt;
		[&#039;col3-headers&#039;] = &#039;1&#039;,&lt;br /&gt;
		[&#039;col4-headers&#039;] = &#039;1,20.5&#039;,&lt;br /&gt;
&lt;br /&gt;
		[&#039;col1-matches&#039;] = &#039;3,6,9,12,15,18,21,24&#039;,&lt;br /&gt;
		[&#039;col2-matches&#039;] = &#039;4.5,10.5,16.5,22.5&#039;,&lt;br /&gt;
		[&#039;col3-matches&#039;] = &#039;7.5,19.5&#039;,&lt;br /&gt;
		[&#039;col4-matches&#039;] = &#039;13.5,22.5&#039;,&lt;br /&gt;
&lt;br /&gt;
		[&#039;col1-col2-paths&#039;] = &#039;(3,6)-4.5,(9,12)-10.5,(15,18)-16.5,(21,24)-22.5&#039;,&lt;br /&gt;
		[&#039;col2-col3-paths&#039;] = &#039;(4.5,10.5)-7.5,(16.5,22.5)-19.5&#039;,&lt;br /&gt;
		[&#039;col3-col4-paths&#039;] = &#039;(7.5,19.5)-13.5&#039;,&lt;br /&gt;
&lt;br /&gt;
		[&#039;RD1&#039;] = &#039;First round&#039;,&lt;br /&gt;
		[&#039;RD2&#039;] = &#039;Quarterfinals&#039;,&lt;br /&gt;
		[&#039;RD3&#039;] = &#039;Semifinals&#039;,&lt;br /&gt;
		[&#039;RD4&#039;] = &#039;Final&#039;,&lt;br /&gt;
		[&#039;RD4b&#039;] = &#039;Third place&#039;,&lt;br /&gt;
&lt;br /&gt;
		[&#039;RD4b-hide&#039;] = &#039;y&#039;,&lt;br /&gt;
	})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p[&#039;18TeamBracket&#039;] = function (frame)&lt;br /&gt;
	return p._Bracket(frame, &#039;18TeamBracket&#039;, {&lt;br /&gt;
	}, {&lt;br /&gt;
		compact = &#039;yes&#039;,&lt;br /&gt;
		[&#039;RD1-omit&#039;] = &#039;1/2/5/6/7/8/9/10/11/12/13/14/15/16/17/18/21/22/23/24/25/26/27/28/29/30/31/32&#039;,&lt;br /&gt;
		RD1        = &#039;First round&#039;,&lt;br /&gt;
		RD2        = &#039;Second round&#039;,&lt;br /&gt;
		RD3        = &#039;Quarterfinals&#039;,&lt;br /&gt;
		RD4        = &#039;Semifinals&#039;,&lt;br /&gt;
		RD5        = &#039;Finals&#039;,&lt;br /&gt;
		&lt;br /&gt;
		[&#039;RD1-seed1&#039;] = 16,&lt;br /&gt;
		[&#039;RD1-seed2&#039;] = 17,&lt;br /&gt;
		[&#039;RD1-seed3&#039;] = 15,&lt;br /&gt;
		[&#039;RD1-seed4&#039;] = 18,&lt;br /&gt;
		&lt;br /&gt;
		[&#039;RD2-seed01&#039;] = 1,&lt;br /&gt;
		[&#039;RD2-seed02&#039;] = &#039;&#039;,&lt;br /&gt;
		[&#039;RD2-seed03&#039;] = 8,&lt;br /&gt;
		[&#039;RD2-seed04&#039;] = 9,&lt;br /&gt;
		[&#039;RD2-seed05&#039;] = 4,&lt;br /&gt;
		[&#039;RD2-seed06&#039;] = 13,&lt;br /&gt;
		[&#039;RD2-seed07&#039;] = 5,&lt;br /&gt;
		[&#039;RD2-seed08&#039;] = 12,&lt;br /&gt;
		[&#039;RD2-seed09&#039;] = 2,&lt;br /&gt;
		[&#039;RD2-seed10&#039;] = &#039;&#039;,&lt;br /&gt;
		[&#039;RD2-seed11&#039;] = 7,&lt;br /&gt;
		[&#039;RD2-seed12&#039;] = 10,&lt;br /&gt;
		[&#039;RD2-seed13&#039;] = 3,&lt;br /&gt;
		[&#039;RD2-seed14&#039;] = 14,&lt;br /&gt;
		[&#039;RD2-seed15&#039;] = 6,&lt;br /&gt;
		[&#039;RD2-seed16&#039;] = 11,&lt;br /&gt;
	})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p[&#039;24TeamBracket&#039;] = function (frame)&lt;br /&gt;
	local groups = {&amp;quot;RD1-group1&amp;quot;,&amp;quot;RD1-group2&amp;quot;,&amp;quot;RD1-group3&amp;quot;,&amp;quot;RD1-group4&amp;quot;,&amp;quot;RD1-group5&amp;quot;,&amp;quot;RD1-group6&amp;quot;,&amp;quot;RD1-group7&amp;quot;,&amp;quot;RD1-group8&amp;quot;,&amp;quot;RD2-group1&amp;quot;,&amp;quot;RD2-group2&amp;quot;,&amp;quot;RD2-group3&amp;quot;,&amp;quot;RD2-group4&amp;quot;,&amp;quot;RD3-group1&amp;quot;,&amp;quot;RD3-group2&amp;quot;,&amp;quot;RD4-group1&amp;quot;}&lt;br /&gt;
	local compact = &amp;quot;yes&amp;quot;&lt;br /&gt;
	for _, v in ipairs(groups) do&lt;br /&gt;
		if notblank(frame[v]) then&lt;br /&gt;
			compact = &amp;quot;&amp;quot;&lt;br /&gt;
			break&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return p._Bracket(frame, &#039;24TeamBracket&#039;, {&lt;br /&gt;
	}, {&lt;br /&gt;
		[&#039;RD1=omit&#039;] = &#039;1/2/5/6/9/10/13/14/17/18/21/22/25/26/29/30&#039;,&lt;br /&gt;
		byes = &#039;1&#039;,&lt;br /&gt;
		compact = compact,&lt;br /&gt;
		RD1 = &#039;First Round&#039;,&lt;br /&gt;
		RD2 = &#039;Round of 16&#039;,&lt;br /&gt;
		[&#039;RD1-team1&#039;]  = &#039;&amp;amp;nbsp;&#039;,&lt;br /&gt;
		[&#039;RD1-team2&#039;]  = &#039;&amp;amp;nbsp;&#039;,&lt;br /&gt;
		[&#039;RD1-team3&#039;]  = &#039;&amp;amp;nbsp;&#039;,&lt;br /&gt;
		[&#039;RD1-team4&#039;]  = &#039;&amp;amp;nbsp;&#039;,&lt;br /&gt;
		[&#039;RD1-team5&#039;]  = &#039;&amp;amp;nbsp;&#039;,&lt;br /&gt;
		[&#039;RD1-team6&#039;]  = &#039;&amp;amp;nbsp;&#039;,&lt;br /&gt;
		[&#039;RD1-team7&#039;]  = &#039;&amp;amp;nbsp;&#039;,&lt;br /&gt;
		[&#039;RD1-team8&#039;]  = &#039;&amp;amp;nbsp;&#039;,&lt;br /&gt;
		[&#039;RD1-team9&#039;]  = &#039;&amp;amp;nbsp;&#039;,&lt;br /&gt;
		[&#039;RD1-team10&#039;] = &#039;&amp;amp;nbsp;&#039;,&lt;br /&gt;
		[&#039;RD1-team11&#039;] = &#039;&amp;amp;nbsp;&#039;,&lt;br /&gt;
		[&#039;RD1-team12&#039;] = &#039;&amp;amp;nbsp;&#039;,&lt;br /&gt;
		[&#039;RD1-team13&#039;] = &#039;&amp;amp;nbsp;&#039;,&lt;br /&gt;
		[&#039;RD1-team14&#039;] = &#039;&amp;amp;nbsp;&#039;,&lt;br /&gt;
		[&#039;RD1-team15&#039;] = &#039;&amp;amp;nbsp;&#039;,&lt;br /&gt;
		[&#039;RD1-team16&#039;] = &#039;&amp;amp;nbsp;&#039;,&lt;br /&gt;
	})&lt;br /&gt;
end&lt;br /&gt;
p[&#039;24TeamBracket-Byes2&#039;] = p[&#039;24TeamBracket&#039;]&lt;br /&gt;
p[&#039;24TeamBracket-NoSeeds&#039;] = p[&#039;24TeamBracket&#039;]&lt;br /&gt;
&lt;br /&gt;
p[&#039;24TeamBracket-Info&#039;] = function (frame)&lt;br /&gt;
	local above = notblank(frame.args.above)&lt;br /&gt;
	return p._Bracket(frame, &#039;24TeamBracket-Info&#039;, {&lt;br /&gt;
	}, {&lt;br /&gt;
		shift = above and &#039;1&#039; or &#039;&#039;,&lt;br /&gt;
		[&#039;col1-matches&#039;] = above and &#039;2,5,8,11,14,17,20,23&#039; or &#039;4,7,10,13,16,19,22,25&#039;,&lt;br /&gt;
		[&#039;col2-matches&#039;] = &#039;3,6,9,12,15,18,21,24&#039;,&lt;br /&gt;
		[&#039;col3-matches&#039;] = &#039;4.5,10.5,16.5,22.5&#039;,&lt;br /&gt;
		[&#039;col4-matches&#039;] = &#039;7.5,19.5&#039;,&lt;br /&gt;
		[&#039;col5-matches&#039;] = &#039;13.5&#039;,&lt;br /&gt;
&lt;br /&gt;
		[&#039;col1-col2-paths&#039;] = above and &#039;2-3,5-6,8-9,11-12,14-15,17-18,20-21,23-24&#039; or &#039;4-3,7-6,10-9,13-12,16-15,19-18,22-21,25-24&#039;,&lt;br /&gt;
		[&#039;col2-col3-paths&#039;] = &#039;(3,6)-4.5,(9,12)-10.5,(15,18)-16.5,(21,24)-22.5&#039;,&lt;br /&gt;
		[&#039;col3-col4-paths&#039;] = &#039;(4.5,10.5)-7.5,(16.5,22.5)-19.5&#039;,&lt;br /&gt;
		[&#039;col4-col5-paths&#039;] = &#039;(7.5,19.5)-13.5&#039;,&lt;br /&gt;
&lt;br /&gt;
		[&#039;RD1&#039;] = &#039;First round&#039;,&lt;br /&gt;
		[&#039;RD2&#039;] = &#039;Second round&#039;,&lt;br /&gt;
	})&lt;br /&gt;
end&lt;br /&gt;
p[&#039;24TeamBracket-Byes&#039;] = p[&#039;24TeamBracket-Info&#039;]&lt;br /&gt;
&lt;br /&gt;
p[&#039;32TeamBracket&#039;] = function (frame)&lt;br /&gt;
	return p._Bracket(frame, &#039;32TeamBracket&#039;, {&lt;br /&gt;
		subgroup1 = &#039;RD1-group1&#039;,&lt;br /&gt;
		subgroup2 = &#039;RD1-group2&#039;,&lt;br /&gt;
		subgroup3 = &#039;RD1-group3&#039;,&lt;br /&gt;
		subgroup4 = &#039;RD1-group4&#039;,&lt;br /&gt;
		subgroup5 = &#039;RD1-group5&#039;,&lt;br /&gt;
		subgroup6 = &#039;RD1-group6&#039;,&lt;br /&gt;
		subgroup7 = &#039;RD1-group7&#039;,&lt;br /&gt;
		subgroup8 = &#039;RD1-group8&#039;,&lt;br /&gt;
		group1 = &#039;RD2-group1&#039;,&lt;br /&gt;
		group2 = &#039;RD2-group2&#039;,&lt;br /&gt;
		group3 = &#039;RD3-group3&#039;,&lt;br /&gt;
		group4 = &#039;RD2-group4&#039;,&lt;br /&gt;
		half1 = &#039;RD3-group1&#039;,&lt;br /&gt;
		half2 = &#039;RD3-group2&#039;,&lt;br /&gt;
		group5 = &#039;RD4-group1&#039;,&lt;br /&gt;
	}, {&lt;br /&gt;
		autoseeds = &#039;y&#039;,&lt;br /&gt;
		RD1 = &amp;quot;1st Round&amp;quot;,&lt;br /&gt;
		RD2 = &amp;quot;2nd Round&amp;quot;,&lt;br /&gt;
	})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p[&#039;32TeamBracket-Byes&#039;] = function (frame)&lt;br /&gt;
	return p._Bracket(frame, &#039;32TeamBracket-Byes&#039;, {}, {&lt;br /&gt;
		byes = 1,&lt;br /&gt;
		seeds = &#039;y&#039;,&lt;br /&gt;
		RD1 = &amp;quot;First Round&amp;quot;,&lt;br /&gt;
		RD2 = &amp;quot;Second Round&amp;quot;,&lt;br /&gt;
		RD3 = &amp;quot;Quarter Finals&amp;quot;,&lt;br /&gt;
		RD4 = &amp;quot;Semi Finals&amp;quot;,&lt;br /&gt;
		RD5 = &amp;quot;Final&amp;quot;,&lt;br /&gt;
		[&#039;seed-width&#039;] = &#039;2em&#039;,&lt;br /&gt;
		[&#039;team-width&#039;] = &#039;11em&#039;,&lt;br /&gt;
		[&#039;score-width&#039;] = &#039;2em&#039;,&lt;br /&gt;
	})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p[&#039;32TeamBracket-Compact-NoSeeds-Byes&#039;] = function (frame)&lt;br /&gt;
	return p._Bracket(frame, &#039;32TeamBracket-Compact-NoSeeds-Byes&#039;, {}, {&lt;br /&gt;
		byes = 4,&lt;br /&gt;
		RD1 = &amp;quot;Round of 32&amp;quot;,&lt;br /&gt;
		RD2 = &amp;quot;Round of 16&amp;quot;,&lt;br /&gt;
		RD3 = &amp;quot;Quarterfinals&amp;quot;,&lt;br /&gt;
		RD4 = &amp;quot;Semifinals&amp;quot;,&lt;br /&gt;
		RD5 = &amp;quot;Final&amp;quot;,&lt;br /&gt;
		[&#039;team-width&#039;] = 125,&lt;br /&gt;
		[&#039;score-width&#039;] = 25,&lt;br /&gt;
	})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p[&#039;32TeamBracket-Compact-Squash5&#039;] = function (frame)&lt;br /&gt;
	return p._Bracket(frame, &#039;32TeamBracket-Compact-Squash5&#039;, {}, {&lt;br /&gt;
		[&#039;compact-final&#039;] = &#039;yes&#039;,&lt;br /&gt;
		[&#039;team-width&#039;] = 190,&lt;br /&gt;
		[&#039;score-width&#039;] = 12,&lt;br /&gt;
		[&#039;seed-width&#039;] = 10,&lt;br /&gt;
		RD1 = &amp;quot;1st round&amp;quot;,&lt;br /&gt;
		RD2 = &amp;quot;2nd round&amp;quot;,&lt;br /&gt;
		RD3 = &amp;quot;3rd round&amp;quot;,&lt;br /&gt;
		RD4 = &amp;quot;4th round&amp;quot;,&lt;br /&gt;
		RD5 = &amp;quot;5th round&amp;quot;,&lt;br /&gt;
	})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p[&#039;32TeamBracket-Compact-Tennis3&#039;] = function (frame)&lt;br /&gt;
	return p._Bracket(frame, &#039;32TeamBracket-Compact-Tennis3&#039;, {}, {&lt;br /&gt;
		seeds = &#039;&#039;,&lt;br /&gt;
		[&#039;compact-final&#039;] = &#039;yes&#039;,&lt;br /&gt;
		[&#039;team-width&#039;] = &#039;auto&#039;,&lt;br /&gt;
		[&#039;score-width&#039;] = 12,&lt;br /&gt;
		RD1 = &amp;quot;1st round&amp;quot;,&lt;br /&gt;
		RD2 = &amp;quot;2nd round&amp;quot;,&lt;br /&gt;
		RD3 = &amp;quot;Quarterfinals&amp;quot;,&lt;br /&gt;
		RD4 = &amp;quot;Semifinals&amp;quot;,&lt;br /&gt;
		RD5 = &amp;quot;Finals&amp;quot;,&lt;br /&gt;
	})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p[&#039;32TeamBracket-Tennis3&#039;] = function (frame)&lt;br /&gt;
	return p._Bracket(frame, &#039;32TeamBracket-Tennis3&#039;, {}, {&lt;br /&gt;
		compact = &#039;yes&#039;,&lt;br /&gt;
		RD1 = &amp;quot;First Round&amp;quot;,&lt;br /&gt;
		RD2 = &amp;quot;Second Round&amp;quot;,&lt;br /&gt;
		RD3 = &amp;quot;Quarterfinals&amp;quot;,&lt;br /&gt;
		RD4 = &amp;quot;Semifinals&amp;quot;,&lt;br /&gt;
		RD5 = &amp;quot;Final&amp;quot;,&lt;br /&gt;
	})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p[&#039;32TeamBracket-Info&#039;] = function (frame)&lt;br /&gt;
	local compact = notblank(frame.args.compact)&lt;br /&gt;
	&lt;br /&gt;
	return p._Bracket(frame, &#039;32TeamBracket-Info&#039;, {&lt;br /&gt;
		[&#039;RD1-name&#039;] = &#039;RD1&#039;,&lt;br /&gt;
		[&#039;RD2-name&#039;] = &#039;RD2&#039;,&lt;br /&gt;
		[&#039;RD3-name&#039;] = &#039;RD3&#039;,&lt;br /&gt;
		[&#039;RD4-name&#039;] = &#039;RD4&#039;,&lt;br /&gt;
		[&#039;RD5-name&#039;] = &#039;RD5&#039;,&lt;br /&gt;
&lt;br /&gt;
		[&#039;RD1T1-loc&#039;] = &#039;RD1-text1&#039;,&lt;br /&gt;
		[&#039;RD2T1-loc&#039;] = &#039;RD2-text1&#039;,&lt;br /&gt;
		[&#039;RD2T2-loc&#039;] = &#039;RD2-text2&#039;,&lt;br /&gt;
		[&#039;RD2T3-loc&#039;] = &#039;RD2-text3&#039;,&lt;br /&gt;
		[&#039;RD2T4-loc&#039;] = &#039;RD2-text4&#039;,&lt;br /&gt;
		[&#039;RD2T5-loc&#039;] = &#039;RD2-text5&#039;,&lt;br /&gt;
		[&#039;RD2T6-loc&#039;] = &#039;RD2-text6&#039;,&lt;br /&gt;
		[&#039;RD2T7-loc&#039;] = &#039;RD2-text7&#039;,&lt;br /&gt;
		[&#039;RD2T8-loc&#039;] = &#039;RD2-text8&#039;,&lt;br /&gt;
		[&#039;RD3T1-loc&#039;] = &#039;RD3-text1&#039;,&lt;br /&gt;
		[&#039;RD3T2-loc&#039;] = &#039;RD3-text2&#039;,&lt;br /&gt;
		[&#039;RD3T3-loc&#039;] = &#039;RD3-text3&#039;,&lt;br /&gt;
		[&#039;RD3T4-loc&#039;] = &#039;RD3-text4&#039;,&lt;br /&gt;
		[&#039;RD4T1-loc&#039;] = &#039;RD4-text1&#039;,&lt;br /&gt;
		[&#039;RD4T2-loc&#039;] = &#039;RD4-text2&#039;,&lt;br /&gt;
		[&#039;RD5T1-loc&#039;] = &#039;RD5-text1&#039;,&lt;br /&gt;
	}, {&lt;br /&gt;
		[&#039;col1-matches&#039;] = compact and &#039;3,5,7,9,11,13,15,17,19,21,23,25,27,29,31,33&#039; or &#039;3,6,9,12,15,18,21,24,27,30,33,36,39,42,45,48&#039;,&lt;br /&gt;
		[&#039;col2-matches&#039;] = compact and &#039;4,8,12,16,20,24,28,32&#039; or &#039;4.5,10.5,16.5,22.5,28.5,34.5,40.5,46.5&#039;,&lt;br /&gt;
		[&#039;col3-matches&#039;] = compact and &#039;6,14,22,30&#039; or &#039;7.5,19.5,31.5,43.5&#039;,&lt;br /&gt;
		[&#039;col4-matches&#039;] = compact and &#039;10,26&#039; or &#039;13.5,37.5&#039;,&lt;br /&gt;
		[&#039;col5-matches&#039;] = compact and &#039;18&#039; or &#039;25.5&#039;,&lt;br /&gt;
		&lt;br /&gt;
		[&#039;col1-col2-paths&#039;] = compact and &#039;(3,5)-4,(7,9)-8,(11,13)-12,(15,17)-16,(19,21)-20,(23,25)-24,(27,29)-28,(31,33)-32&#039; or&lt;br /&gt;
			&#039;(3,6)-4.5,(9,12)-10.5,(15,18)-16.5,(21,24)-22.5,(27,30)-28.5,(33,36)-34.5,(39,42)-40.5,(45,48)-46.5&#039;,&lt;br /&gt;
		[&#039;col2-col3-paths&#039;] = compact and &#039;(4,8)-6,(12,16)-14,(20,24)-22,(28,32)-30&#039; or&lt;br /&gt;
			&#039;(4.5,10.5)-7.5,(16.5,22.5)-19.5,(28.5,34.5)-31.5,(40.5,46.5)-43.5&#039;,&lt;br /&gt;
		[&#039;col3-col4-paths&#039;] = compact and &#039;(6,14)-10,(22,30)-26&#039; or &#039;(7.5,19.5)-13.5,(31.5,43.5)-37.5&#039;,&lt;br /&gt;
		[&#039;col4-col5-paths&#039;] = compact and &#039;(10,26)-18&#039; or &#039;(13.5,37.5)-25.5&#039;,&lt;br /&gt;
&lt;br /&gt;
		[&#039;RD1&#039;] = &#039;First round&#039;,&lt;br /&gt;
		[&#039;RD2&#039;] = &#039;Second round&#039;,&lt;br /&gt;
		[&#039;RD3&#039;] = &#039;Quarterfinals&#039;,&lt;br /&gt;
		[&#039;RD4&#039;] = &#039;Semifinals&#039;,&lt;br /&gt;
		[&#039;RD5&#039;] = &#039;Final&#039;,&lt;br /&gt;
	})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p[&#039;64TeamBracket&#039;] = function (frame)&lt;br /&gt;
	return p._Bracket(frame, &#039;64TeamBracket&#039;, {&lt;br /&gt;
		subgroup1 = &#039;RD1-group1&#039;,&lt;br /&gt;
		subgroup2 = &#039;RD1-group2&#039;,&lt;br /&gt;
		subgroup3 = &#039;RD1-group3&#039;,&lt;br /&gt;
		subgroup4 = &#039;RD1-group4&#039;,&lt;br /&gt;
		subgroup5 = &#039;RD1-group5&#039;,&lt;br /&gt;
		subgroup6 = &#039;RD1-group6&#039;,&lt;br /&gt;
		subgroup7 = &#039;RD1-group7&#039;,&lt;br /&gt;
		subgroup8 = &#039;RD1-group8&#039;,&lt;br /&gt;
		subgroup9 = &#039;RD1-group9&#039;,&lt;br /&gt;
		subgroup10 = &#039;RD1-group10&#039;,&lt;br /&gt;
		subgroup11 = &#039;RD1-group11&#039;,&lt;br /&gt;
		subgroup12 = &#039;RD1-group12&#039;,&lt;br /&gt;
		subgroup13 = &#039;RD1-group13&#039;,&lt;br /&gt;
		subgroup14 = &#039;RD1-group14&#039;,&lt;br /&gt;
		subgroup15 = &#039;RD1-group15&#039;,&lt;br /&gt;
		subgroup16 = &#039;RD1-group16&#039;,&lt;br /&gt;
		group1 = &#039;RD2-group1&#039;,&lt;br /&gt;
		group2 = &#039;RD2-group2&#039;,&lt;br /&gt;
		group3 = &#039;RD3-group3&#039;,&lt;br /&gt;
		group4 = &#039;RD2-group4&#039;,&lt;br /&gt;
		group5 = &#039;RD2-group5&#039;,&lt;br /&gt;
		group6 = &#039;RD3-group6&#039;,&lt;br /&gt;
		group7 = &#039;RD2-group7&#039;,&lt;br /&gt;
		group8 = &#039;RD2-group8&#039;,&lt;br /&gt;
		quarter1 = &#039;RD3-group1&#039;,&lt;br /&gt;
		quarter2 = &#039;RD3-group2&#039;,&lt;br /&gt;
		quarter3 = &#039;RD3-group3&#039;,&lt;br /&gt;
		quarter4 = &#039;RD3-group4&#039;,&lt;br /&gt;
		half1 = &#039;RD4-group1&#039;,&lt;br /&gt;
		half2 = &#039;RD4-group2&#039;,&lt;br /&gt;
		group9 = &#039;RD5-group1&#039;,&lt;br /&gt;
	}, {&lt;br /&gt;
		autoseeds = &#039;y&#039;,&lt;br /&gt;
		RD1 = &amp;quot;1st Round&amp;quot;,&lt;br /&gt;
		RD2 = &amp;quot;2nd Round&amp;quot;,&lt;br /&gt;
		RD3 = &amp;quot;3rd Round&amp;quot;,&lt;br /&gt;
	})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p[&#039;list&#039;] = function (frame)&lt;br /&gt;
	local funcs={}&lt;br /&gt;
&lt;br /&gt;
	for k,_ in pairs(p) do&lt;br /&gt;
		if string.match(k, &amp;quot;^%d+Team&amp;quot;) then&lt;br /&gt;
			table.insert(funcs, k)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	table.sort(funcs, function (a,b)&lt;br /&gt;
		local na, nb = tonumber(string.match(a, &amp;quot;^%d+&amp;quot;)), tonumber(string.match(b, &amp;quot;^%d+&amp;quot;))&lt;br /&gt;
		return na == nb and string.match(a, &amp;quot;^%d*(.*)$&amp;quot;) &amp;lt; string.match(b, &amp;quot;^%d*(.*)$&amp;quot;) or na &amp;lt; nb&lt;br /&gt;
	end)&lt;br /&gt;
	&lt;br /&gt;
	return frame.preprocess(frame,&lt;br /&gt;
		&amp;quot;\n* {{tl|&amp;quot;..table.concat(funcs, &amp;quot;}}\n* {{tl|&amp;quot;)..&amp;quot;}}&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p[&#039;doc&#039;] = function (frame)&lt;br /&gt;
	local pagename = mw.title.getCurrentTitle().rootText&lt;br /&gt;
	if type(p[pagename]) == &amp;quot;function&amp;quot; then&lt;br /&gt;
		return frame.preprocess(frame, &amp;quot;{{tlx|&amp;quot;..pagename..&amp;quot;}} can be &amp;quot; ..&lt;br /&gt;
			&amp;quot;replaced with {{mlx|bracket|&amp;quot;..pagename..&amp;quot;}}.&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
	return frame.preprocess(frame, &amp;quot;In most cases, the name of the bracket &amp;quot; ..&lt;br /&gt;
		&amp;quot;template can be used as the function name for {{ml|Bracket}}, e.g. &amp;quot; ..&lt;br /&gt;
		&amp;quot;{{tlx|16TeamBracket-Compact-Tennis3}}→&amp;quot; ..&lt;br /&gt;
		&amp;quot;{{mlx|bracket|16TeamBracket-Compact-Tennis3}}.&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Osarius</name></author>
	</entry>
	<entry>
		<id>https://nssportwiki.com/index.php?title=Module:Build_bracket/styles.css&amp;diff=76396</id>
		<title>Module:Build bracket/styles.css</title>
		<link rel="alternate" type="text/html" href="https://nssportwiki.com/index.php?title=Module:Build_bracket/styles.css&amp;diff=76396"/>
		<updated>2026-07-24T10:50:36Z</updated>

		<summary type="html">&lt;p&gt;Osarius: 1 revision imported&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* exact spacing baseline */&lt;br /&gt;
.brk { font-size:90%; border-collapse:separate; border-spacing:0; margin:1em 2em 0 1em; color:var(--color-base,#202122); }&lt;br /&gt;
.brk-nw { white-space:nowrap; }&lt;br /&gt;
&lt;br /&gt;
/* reset everything, then opt-in padding only where we want it */&lt;br /&gt;
.brk td, .brk th { padding:0; vertical-align:middle; }&lt;br /&gt;
.brk td.brk-td { padding:0 .3em; }  /* higher specificity than .brk td */&lt;br /&gt;
&lt;br /&gt;
/* backgrounds */&lt;br /&gt;
.brk-bgL { background-color:var(--background-color-neutral-subtle,#f8f9fa); }&lt;br /&gt;
.brk-bgD { background-color:var(--background-color-neutral,#eaecf0); }&lt;br /&gt;
&lt;br /&gt;
/* borders */&lt;br /&gt;
.brk-b { border-style:solid; border-color:#a2a9b1; }&lt;br /&gt;
&lt;br /&gt;
/* alignment + misc */&lt;br /&gt;
.brk-center { text-align:center; }&lt;br /&gt;
.brk-bold { font-weight:bold; }&lt;br /&gt;
.brk-line { border-style: solid; border-color: gray; }&lt;/div&gt;</summary>
		<author><name>Osarius</name></author>
	</entry>
	<entry>
		<id>https://nssportwiki.com/index.php?title=Template:8TeamBracket-PagePlayoff&amp;diff=76394</id>
		<title>Template:8TeamBracket-PagePlayoff</title>
		<link rel="alternate" type="text/html" href="https://nssportwiki.com/index.php?title=Template:8TeamBracket-PagePlayoff&amp;diff=76394"/>
		<updated>2026-07-24T10:50:36Z</updated>

		<summary type="html">&lt;p&gt;Osarius: 1 revision imported&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;includeonly&amp;gt;{{#invoke:Build bracket|main&lt;br /&gt;
| rounds = 4&lt;br /&gt;
| col-spacing = {{{col-spacing|{{#if:{{{RD1-RD2-cross|}}}{{{RD2-RD3-cross|}}}|12}}}}}&lt;br /&gt;
| shift = {{#if:{{{RD1-text1|}}}|1}}&lt;br /&gt;
&lt;br /&gt;
| col1-matches = 3,7,11,15&lt;br /&gt;
| col2-matches = 5,13&lt;br /&gt;
| col3-matches = 7,11&lt;br /&gt;
| col4-matches = 9&lt;br /&gt;
&lt;br /&gt;
| col1-col2-paths = {{#if:{{{RD1-RD2-cross|}}}|7-13,11-5|7-5,11-13}},3-3,3-5:#FF3333,15-15,15-13:#FF3333&lt;br /&gt;
| col2-col3-paths = {{#if:{{{RD2-RD3-cross|}}}|(3,13)-7, (5,15)-11|(3,5)-7, (13,15)-11}}&lt;br /&gt;
| col3-col4-paths = (7,11)-9&lt;br /&gt;
| col1-col2-cross = {{#if:{{{RD1-RD2-cross|}}}|9}}&lt;br /&gt;
| col2-col3-cross = {{#if:{{{RD2-RD3-cross|}}}|9}}&lt;br /&gt;
&lt;br /&gt;
| RD1 = Qualifiers and eliminators&lt;br /&gt;
| RD2 = Repechage&lt;br /&gt;
| RD3 = Semifinals&lt;br /&gt;
| RD4 = Final&lt;br /&gt;
&lt;br /&gt;
| RD1-seed1 = 1&lt;br /&gt;
| RD1-seed2 = 4&lt;br /&gt;
| RD1-seed3 = 5&lt;br /&gt;
| RD1-seed4 = 8&lt;br /&gt;
| RD1-seed5 = 6&lt;br /&gt;
| RD1-seed6 = 7&lt;br /&gt;
| RD1-seed7 = 2&lt;br /&gt;
| RD1-seed8 = 3&lt;br /&gt;
}}&amp;lt;/includeonly&amp;gt;&amp;lt;noinclude&amp;gt;{{Documentation}}&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Osarius</name></author>
	</entry>
	<entry>
		<id>https://nssportwiki.com/index.php?title=Module:Build_bracket/doc&amp;diff=76392</id>
		<title>Module:Build bracket/doc</title>
		<link rel="alternate" type="text/html" href="https://nssportwiki.com/index.php?title=Module:Build_bracket/doc&amp;diff=76392"/>
		<updated>2026-07-24T10:50:36Z</updated>

		<summary type="html">&lt;p&gt;Osarius: 1 revision imported&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{#switch:{{NAMESPACE}}&lt;br /&gt;
| Module = &lt;br /&gt;
{{high-use|| Wikipedia talk:High-risk templates}}&lt;br /&gt;
{{Module rating|release}}&lt;br /&gt;
&lt;br /&gt;
This module is intended to be used to create and edit intricate sports brackets that cannot be made by [[Module:RoundN]] or [[Module:Team bracket]]. For example, additional headers (for double-elimination brackets; 3rd-, 5th-, 7th-place matches; etc), singular omitted matches (i.e., having a horizonal line instead of a match), and &#039;&#039;N&#039;&#039;-way brackets (&#039;&#039;N&#039;&#039; teams per match). The syntax is slightly more complicated than the aforementioned brackets, but simpler than using the standard wikitable code.&lt;br /&gt;
| #default = &lt;br /&gt;
{{lua|Module:Build bracket}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Usage ==&lt;br /&gt;
{{#switch:{{NAMESPACE}}&lt;br /&gt;
| Module = &lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
{{#invoke:Build bracket|main&lt;br /&gt;
| rounds =&lt;br /&gt;
&lt;br /&gt;
| col1-headers = &lt;br /&gt;
| col1-matches = &lt;br /&gt;
&lt;br /&gt;
| col2-headers = &lt;br /&gt;
| col2-matches = &lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
| col1-col2-paths = &lt;br /&gt;
| col2-col3-paths = &lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
| #default = {{#tag:syntaxhighlight|&lt;br /&gt;
{{((}}{{BASEPAGENAME}}&amp;lt;nowiki&amp;gt;&lt;br /&gt;
| RD1 =&lt;br /&gt;
| RD1-seed1   =&lt;br /&gt;
| RD1-team1   =&lt;br /&gt;
| RD1-score1  =&lt;br /&gt;
 ...&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
{{))}}|lang=&amp;quot;wikitext&amp;quot;}}&lt;br /&gt;
Per [[MOS:ACCESS#Font size]] and [[MOS:SMALLFONT]], &amp;quot;avoid using smaller font sizes in elements that already use a smaller font size, such as infoboxes, navboxes and reference sections&amp;quot;.  Since this template&#039;s text is already reduced to 90% of the normal size, use of the {{tl|Small}} template or {{tag|small}} tags within this template produces a font size that is 77% of the page default, well below the 85% minimum specified in the linked guidelines.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Parameters ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter !! Description !! Default&lt;br /&gt;
|-&lt;br /&gt;
{{#switch:{{NAMESPACE}}&lt;br /&gt;
| Module = &lt;br /&gt;
{{!}} &amp;lt;code&amp;gt;rounds&amp;lt;/code&amp;gt; {{!!}} number of rounds (columns). {{!!}} &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;&lt;br /&gt;
{{!-}}&lt;br /&gt;
{{!}} &amp;lt;code&amp;gt;autocol&amp;lt;/code&amp;gt; {{!!}} set to &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt; to automatically set set maximum round to display based on entries. {{!!}} &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;&lt;br /&gt;
{{!-}}&lt;br /&gt;
{{!}} &amp;lt;code&amp;gt;rows&amp;lt;/code&amp;gt; {{!!}} manually set the number of rows. {{!!}} Automatic&lt;br /&gt;
{{!-}}&lt;br /&gt;
{{!}} &amp;lt;code&amp;gt;teams-per-match&amp;lt;/code&amp;gt; {{!!}} enter the number of teams in each match. Use &amp;lt;code&amp;gt;col&amp;lt;i&amp;gt;m&amp;lt;/i&amp;gt;-teams-per-match&amp;lt;/code&amp;gt; to set individual columns {{!!}} &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
{{!-}}&lt;br /&gt;
{{!}} &amp;lt;code&amp;gt;col&amp;lt;i&amp;gt;m&amp;lt;/i&amp;gt;-headers&amp;lt;/code&amp;gt; {{!!}} (optional) enter the row numbers where headers are desired in column &#039;&#039;m&#039;&#039;. Separate entries with &amp;lt;code&amp;gt;,&amp;lt;/code&amp;gt;. Half integer values are allowed. {{!!}} Automatic&lt;br /&gt;
{{!-}}&lt;br /&gt;
{{!}} &amp;lt;code&amp;gt;col&amp;lt;i&amp;gt;m&amp;lt;/i&amp;gt;-matches&amp;lt;/code&amp;gt; {{!!}} enter the row numbers where a match is desired in column &#039;&#039;m&#039;&#039;. Matches take up two rows by default. Separate entries with &amp;lt;code&amp;gt;,&amp;lt;/code&amp;gt;. Half integer values are allowed. {{!!}}&lt;br /&gt;
{{!-}}&lt;br /&gt;
{{!}} &amp;lt;code&amp;gt;col&amp;lt;i&amp;gt;m&amp;lt;/i&amp;gt;-text&amp;lt;/code&amp;gt; {{!!}} enter the row numbers where additional text is desired in column &#039;&#039;m&#039;&#039;. Separate entries with &amp;lt;code&amp;gt;,&amp;lt;/code&amp;gt;. Half integer values are allowed. {{!!}}&lt;br /&gt;
{{!-}}&lt;br /&gt;
{{!}} &amp;lt;code&amp;gt;col&amp;lt;i&amp;gt;m&amp;lt;/i&amp;gt;-col&amp;lt;i&amp;gt;m&amp;lt;/i&amp;gt;+1-paths&amp;lt;/code&amp;gt; {{!!}} enter the starting and ending row numbers, separated by &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;, from columns &#039;&#039;m&#039;&#039; and &#039;&#039;m&#039;&#039;+1 where a path is desired. Separate entries with &amp;lt;code&amp;gt;,&amp;lt;/code&amp;gt;. Half integer values are allowed. {{!!}}&lt;br /&gt;
{{!-}}&lt;br /&gt;
{{!}} &amp;lt;code&amp;gt;col&amp;lt;i&amp;gt;m&amp;lt;/i&amp;gt;-col&amp;lt;i&amp;gt;m&amp;lt;/i&amp;gt;+1-cross&amp;lt;/code&amp;gt; {{!!}} enter the row number where paths intersect from column &#039;&#039;m&#039;&#039; to &#039;&#039;m&#039;&#039;+1. {{!!}}&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
{{!-}}&lt;br /&gt;
{{!}} &amp;lt;code&amp;gt;compact&amp;lt;/code&amp;gt; {{!!}} set to &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt; to vertically condense the bracket. {{!!}} &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
{{!-}}&lt;br /&gt;
{{!}} &amp;lt;code&amp;gt;RD&amp;lt;i&amp;gt;m&amp;lt;/i&amp;gt;-altname&amp;lt;/code&amp;gt; {{!!}} Alternate name for &amp;lt;code&amp;gt;RD&amp;lt;i&amp;gt;m&amp;lt;/i&amp;gt;&amp;lt;/code&amp;gt; (e.g., if {{para|RD1-altname|first}}, then &amp;lt;code&amp;gt;first-team1&amp;lt;/code&amp;gt; can be used instead of &amp;lt;code&amp;gt;RD1-team1&amp;lt;/code&amp;gt;). Use &amp;lt;code&amp;gt;RD&amp;lt;i&amp;gt;mh&amp;lt;/i&amp;gt;-altname&amp;lt;/code&amp;gt; for cells under header &#039;&#039;mh&#039;&#039;. {{!!}}&lt;br /&gt;
{{!-}}&lt;br /&gt;
{{!}} &amp;lt;code&amp;gt;text-altname&amp;lt;/code&amp;gt; {{!!}} Alternate name for &amp;lt;code&amp;gt;RD&amp;lt;i&amp;gt;m&amp;lt;/i&amp;gt;-text&amp;lt;i&amp;gt;k&amp;lt;/i&amp;gt;&amp;lt;/code&amp;gt; (e.g., if {{para|text-altname|details}}, then &amp;lt;code&amp;gt;RD&amp;lt;i&amp;gt;m&amp;lt;/i&amp;gt;-details1&amp;lt;/code&amp;gt; can be used instead of &amp;lt;code&amp;gt;RD&amp;lt;i&amp;gt;m&amp;lt;/i&amp;gt;-text1&amp;lt;/code&amp;gt;). {{!!}}&lt;br /&gt;
{{!-}}&lt;br /&gt;
{{!}} colspan=3 {{!}}&lt;br /&gt;
}}&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;maxround&amp;lt;/code&amp;gt; || final round to display. This parameter should be omitted unless it is less than the default value set by &amp;lt;code&amp;gt;rounds&amp;lt;/code&amp;gt;. || &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;minround&amp;lt;/code&amp;gt; || first round to display. || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;height&amp;lt;/code&amp;gt; || the amount of vertical visibility desired for the bracket. Creates a vertical scroll bar. Enter a number with units (e.g., &amp;lt;code&amp;gt;30em&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;480px&amp;lt;/code&amp;gt;). || &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;col-spacing&amp;lt;/code&amp;gt; || the amount of horizontal space between rounds. Enter as a plain number (e.g., &amp;lt;code&amp;gt;10&amp;lt;/code&amp;gt; for 10px). || &amp;lt;code&amp;gt;5&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;seed-width&amp;lt;/code&amp;gt; || the width of the cells for seeds. Plain numbers are assumed to be in px units (e.g., &amp;lt;code&amp;gt;25&amp;lt;/code&amp;gt; for 25px or &amp;lt;code&amp;gt;2em&amp;lt;/code&amp;gt; for 2em) || &amp;lt;code&amp;gt;25&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;team-width&amp;lt;/code&amp;gt; || the width of the cells for team names. Plain numbers are assumed to be in px units (e.g., &amp;lt;code&amp;gt;200&amp;lt;/code&amp;gt; for 200px or &amp;lt;code&amp;gt;15em&amp;lt;/code&amp;gt; for 15em) || &amp;lt;code&amp;gt;150&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;score-width&amp;lt;/code&amp;gt; || the width of the cells for scores. Plain numbers are assumed to be in px units (e.g., &amp;lt;code&amp;gt;25&amp;lt;/code&amp;gt; for 25px or &amp;lt;code&amp;gt;2em&amp;lt;/code&amp;gt; for 2em) || &amp;lt;code&amp;gt;25&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;agg-width&amp;lt;/code&amp;gt; || the width of the cells for aggregate scores. &amp;lt;code&amp;gt;score-width&amp;lt;/code&amp;gt; will change aggregate score widths unless this parameter is used. Plain numbers are assumed to be in px units (e.g., &amp;lt;code&amp;gt;25&amp;lt;/code&amp;gt; for 25px or &amp;lt;code&amp;gt;2em&amp;lt;/code&amp;gt; for 2em) || &amp;lt;code&amp;gt;25&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;seeds&amp;lt;/code&amp;gt; || set to &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt; to omit seeds in in all matches. set to &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt; to show seed cells to show for all matches. || &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;legs&amp;lt;/code&amp;gt; || the number of legs for all rounds. Use &amp;lt;code&amp;gt;RD&amp;lt;i&amp;gt;m&amp;lt;/i&amp;gt;-legs&amp;lt;/code&amp;gt; to individually set columns. Use &amp;lt;code&amp;gt;RD&amp;lt;i&amp;gt;m&amp;lt;/i&amp;gt;-legs&amp;lt;i&amp;gt;k&amp;lt;/i&amp;gt;&amp;lt;/code&amp;gt; to individually set teams. || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;autolegs&amp;lt;/code&amp;gt; || set to &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt; to automatically generate score cells per team. If &amp;lt;code&amp;gt;legs&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;RD&amp;lt;i&amp;gt;m&amp;lt;/i&amp;gt;-legs&amp;lt;/code&amp;gt; is used, &amp;lt;code&amp;gt;autolegs&amp;lt;/code&amp;gt; will be set to &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt; .|| &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;byes&amp;lt;/code&amp;gt; || set to &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt; to hide any team cells that are empty. Alternatively, set to &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; to have rounds &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; through &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; hide any team cells that are empty. Use &amp;lt;code&amp;gt;RD&amp;lt;i&amp;gt;m&amp;lt;/i&amp;gt;-byes&amp;lt;/code&amp;gt; for just matches under column &#039;&#039;m&#039;&#039;. Use &amp;lt;code&amp;gt;RD&amp;lt;i&amp;gt;mh&amp;lt;/i&amp;gt;-byes&amp;lt;/code&amp;gt; for just matches under header &#039;&#039;h&#039;&#039; only in column &#039;&#039;m&#039;&#039;. || &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RD&amp;lt;i&amp;gt;m&amp;lt;/i&amp;gt;-hide&amp;lt;/code&amp;gt; || set to &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt; to hide the all matches in columns &#039;&#039;m&#039;&#039; unless any of those entries are non empty. Use &amp;lt;code&amp;gt;RD&amp;lt;i&amp;gt;mh&amp;lt;/i&amp;gt;-byes&amp;lt;/code&amp;gt; to hide the (alpha) &#039;&#039;h&#039;&#039;th header and all matches beneath it in column &#039;&#039;m&#039;&#039;. Useful for consolation matches. {{!!}}&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;show-bye-paths&amp;lt;/code&amp;gt; || set to &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt; to replace any team cells that that are hidden &amp;lt;code&amp;gt;byes&amp;lt;/code&amp;gt; with a path. || &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RD&amp;lt;i&amp;gt;m&amp;lt;/i&amp;gt;-score&amp;lt;i&amp;gt;k&amp;lt;/i&amp;gt;-shade&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;code&amp;gt;RD&amp;lt;i&amp;gt;m&amp;lt;/i&amp;gt;-score&amp;lt;i&amp;gt;k&amp;lt;/i&amp;gt;-&amp;lt;i&amp;gt;l&amp;lt;/i&amp;gt;-shade&amp;lt;/code&amp;gt; || the background color (in hex format, e.g. &amp;lt;code&amp;gt;#ABCDEF&amp;lt;/code&amp;gt;) the (&#039;&#039;l&#039;&#039;th leg of) &#039;&#039;k&#039;&#039;th team&#039;s score column &#039;&#039;m&#039;&#039;.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;aggregate&amp;lt;/code&amp;gt; || Set to &amp;lt;code&amp;gt;sets&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;legs&amp;lt;/code&amp;gt; to sum the sets/legs won and append to the end of the scores. Set to &amp;lt;code&amp;gt;score&amp;lt;/code&amp;gt; to sum the scores from each set/leg and append to the end of the scores. Set to &amp;lt;code&amp;gt;y&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt; to enable the &amp;lt;code&amp;gt;-agg&amp;lt;/code&amp;gt; suffix, but without any auto computation. Only works when there are two or more legs/sets in the round. Any automatically computed value can be overridden by setting the value manually with the &amp;lt;code&amp;gt;-agg&amp;lt;/code&amp;gt; suffix for the score. || &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;boldwinner&amp;lt;/code&amp;gt; || set to &amp;lt;code&amp;gt;high&amp;lt;/code&amp;gt; to automatically bold the seed/team/score with the higher score in each match. Set to &amp;lt;code&amp;gt;low&amp;lt;/code&amp;gt; for the lowest score. Set to &amp;lt;code&amp;gt;aggregate&amp;lt;/code&amp;gt; to only bold the higher aggregate score. Set to &amp;lt;code&amp;gt;aggregate-low&amp;lt;/code&amp;gt; to only bold the lower aggregate score. || &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;shift&amp;lt;/code&amp;gt; || vertically shifts all of the entries by the number entered. Use &amp;lt;code&amp;gt;RD&amp;lt;i&amp;gt;m&amp;lt;/i&amp;gt;-shift&amp;lt;/code&amp;gt; for individual in columns. || &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| colspan=3 | &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RD&amp;lt;i&amp;gt;m&amp;lt;/i&amp;gt;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;RD&amp;lt;i&amp;gt;mh&amp;lt;/i&amp;gt;&amp;lt;/code&amp;gt; || The header text of the (alpha &#039;&#039;h&#039;&#039;th) header in column &#039;&#039;m&#039;&#039; (e.g., &amp;lt;code&amp;gt;RD1&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;RD1a&amp;lt;/code&amp;gt; for the first header and &amp;lt;code&amp;gt;RD1b&amp;lt;/code&amp;gt; for the second header in column 1). || &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RD&amp;lt;i&amp;gt;m&amp;lt;/i&amp;gt;-seed&amp;lt;i&amp;gt;k&amp;lt;/i&amp;gt;&amp;lt;/code&amp;gt; || The seed of the &#039;&#039;k&#039;&#039;th team in column &#039;&#039;m&#039;&#039;. Alternatively, use &amp;lt;code&amp;gt;RD&amp;lt;i&amp;gt;mh&amp;lt;/i&amp;gt;-seed&amp;lt;i&amp;gt;k&amp;lt;/i&amp;gt;&amp;lt;/code&amp;gt; for the &#039;&#039;k&#039;&#039;th team under header &#039;&#039;mh&#039;&#039;. || &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RD&amp;lt;i&amp;gt;m&amp;lt;/i&amp;gt;-team&amp;lt;i&amp;gt;k&amp;lt;/i&amp;gt;&amp;lt;/code&amp;gt; || The name of the &#039;&#039;k&#039;&#039;th team in column &#039;&#039;m&#039;&#039;. Alternatively, use &amp;lt;code&amp;gt;RD&amp;lt;i&amp;gt;mh&amp;lt;/i&amp;gt;-team&amp;lt;i&amp;gt;k&amp;lt;/i&amp;gt;&amp;lt;/code&amp;gt; for the &#039;&#039;k&#039;&#039;th team under header &#039;&#039;mh&#039;&#039;. || &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RD&amp;lt;i&amp;gt;m&amp;lt;/i&amp;gt;-score&amp;lt;i&amp;gt;k&amp;lt;/i&amp;gt;&amp;lt;/code&amp;gt; || The score of the &#039;&#039;k&#039;&#039;th team in column &#039;&#039;m&#039;&#039;. Alternatively, use &amp;lt;code&amp;gt;RD&amp;lt;i&amp;gt;mh&amp;lt;/i&amp;gt;-score&amp;lt;i&amp;gt;k&amp;lt;/i&amp;gt;&amp;lt;/code&amp;gt; for the &#039;&#039;k&#039;&#039;th team under header &#039;&#039;mh&#039;&#039;. Append the suffix &amp;lt;code&amp;gt;-&amp;lt;i&amp;gt;l&amp;lt;/i&amp;gt;&amp;lt;/code&amp;gt; for the &#039;&#039;l&#039;&#039;th leg or &amp;lt;code&amp;gt;-agg&amp;lt;/code&amp;gt; for the aggregate score. || &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RD&amp;lt;i&amp;gt;m&amp;lt;/i&amp;gt;-text&amp;lt;i&amp;gt;k&amp;lt;/i&amp;gt;&amp;lt;/code&amp;gt; || The text above the &#039;&#039;k&#039;&#039;th match in column &#039;&#039;m&#039;&#039;. Alternatively, use &amp;lt;code&amp;gt;RD&amp;lt;i&amp;gt;mh&amp;lt;/i&amp;gt;-text&amp;lt;i&amp;gt;k&amp;lt;/i&amp;gt;&amp;lt;/code&amp;gt; for the &#039;&#039;k&#039;&#039;th match under header &#039;&#039;mh&#039;&#039;. || &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RD&amp;lt;i&amp;gt;m&amp;lt;/i&amp;gt;-group&amp;lt;i&amp;gt;k&amp;lt;/i&amp;gt;&amp;lt;/code&amp;gt; || The text for the &#039;&#039;k&#039;&#039;th group in column &#039;&#039;m&#039;&#039;. Group text will appear to the left of whenever two paths meet. || &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RD-shade&amp;lt;/code&amp;gt; || the background color (in hex format, e.g. &amp;lt;code&amp;gt;#ABCDEF&amp;lt;/code&amp;gt;) of all headers. Use &amp;lt;code&amp;gt;RD&amp;lt;i&amp;gt;m&amp;lt;/i&amp;gt;-shade&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;RD&amp;lt;i&amp;gt;mh&amp;lt;/i&amp;gt;-shade&amp;lt;/code&amp;gt; for individual headers. || &amp;lt;code&amp;gt;#F2F2F2&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RD&amp;lt;i&amp;gt;m&amp;lt;/i&amp;gt;-RD(&amp;lt;i&amp;gt;m&amp;lt;/i&amp;gt;+1)-path&amp;lt;/code&amp;gt;{{efn|name=note1}} || set to &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; to omit the paths from round &#039;&#039;m&#039;&#039; to round &#039;&#039;m&#039;&#039;+1. || &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;paramstyle&amp;lt;/code&amp;gt;{{efn|name=note2}} || set to &amp;lt;code&amp;gt;numbered&amp;lt;/code&amp;gt; change the parameter name style of &amp;lt;code&amp;gt;RD&amp;lt;i&amp;gt;m&amp;lt;/i&amp;gt;-text&amp;lt;i&amp;gt;k&amp;lt;/i&amp;gt;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;RD&amp;lt;i&amp;gt;m&amp;lt;/i&amp;gt;-seed&amp;lt;i&amp;gt;k&amp;lt;/i&amp;gt;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;RD&amp;lt;i&amp;gt;m&amp;lt;/i&amp;gt;-team&amp;lt;i&amp;gt;k&amp;lt;/i&amp;gt;&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;RD&amp;lt;i&amp;gt;m&amp;lt;/i&amp;gt;-score&amp;lt;i&amp;gt;k&amp;lt;/i&amp;gt;&amp;lt;/code&amp;gt; to a numbered notation ({{para|1}},{{para|2}}...). Set {{para|seeds|yes}} add seeds. ||&lt;br /&gt;
|}&lt;br /&gt;
{{notelist|refs=&lt;br /&gt;
  {{efn|name=note1|Does not currently work for paths under subheaders.}}&lt;br /&gt;
  {{efn|name=note2|&amp;lt;code&amp;gt;numbered&amp;lt;/code&amp;gt; may not be compatible with certain other features, e.g. groups.}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Parameter hierarchy ===&lt;br /&gt;
*Whenever there are multiple headers in a single column, more than one parameter may be assigned to a cell value. For example, in the following bracket, both {{para|RD1-team3}} and {{para|RD1b-team1}} can be used to assign the third team in the first column. By default, entries with subheader prefixes will override those without. In the below example, &amp;lt;code&amp;gt;RD1b-team1&amp;lt;/code&amp;gt; will override any value that has been set by &amp;lt;code&amp;gt;RD1-team3&amp;lt;/code&amp;gt;.&lt;br /&gt;
{{#invoke:Build bracket|main&lt;br /&gt;
| rounds = 1&lt;br /&gt;
| col1-headers = 1,6&lt;br /&gt;
| col1-matches = 3,8&lt;br /&gt;
| RD1 = Upper round&lt;br /&gt;
| RD1b = Lower round&lt;br /&gt;
| RD1-team3 = &amp;lt;code&amp;gt;RD1-team3&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;RD1b-team1&amp;lt;/code&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
*Parameters used in articles take precedence over parameters used in the template itself. For example, suppose ArticleX used the template NTeamBracket, and suppose NTeamBracket had the parameter {{para|RD1-seed1|1}} set. If ArticleX implemented &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;{{NTeamBracket|RD1-seed1=2}}&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;, then the first team in round 1 would have a seed of 2.&lt;br /&gt;
&lt;br /&gt;
{{#switch:{{NAMESPACE}}&lt;br /&gt;
| Module = &lt;br /&gt;
=== Path codes ===&lt;br /&gt;
Path codes are entered in the form &amp;lt;code&amp;gt;a-b&amp;lt;/code&amp;gt;, where &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; is associated match in the first column, and &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; is associated match in the second column. Path codes can be grouped; for example, &amp;lt;code&amp;gt;(a,b)-c&amp;lt;/code&amp;gt; is equivalent to &amp;lt;code&amp;gt;a-c, b-c&amp;lt;/code&amp;gt;. To add color, append &amp;lt;code&amp;gt;:&#039;&#039;color&#039;&#039;&amp;lt;/code&amp;gt; to the end of a path, e.g. &amp;lt;code&amp;gt;3-5:red&amp;lt;/code&amp;gt;. Only one extra color can be used in a bracket.&lt;br /&gt;
{{wikitable| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Example !! Output&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;1-3&amp;lt;/code&amp;gt;&lt;br /&gt;
| {{#invoke:Build bracket|main|rounds=2|noheaders=yes|col1-matches=1|col2-matches=3|col1-col2-paths=1-3}}&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;(1,5)-3&amp;lt;/code&amp;gt;&lt;br /&gt;
| {{#invoke:Build bracket|main|rounds=2|noheaders=yes|col1-matches=1,5|col2-matches=3|col1-col2-paths=(1,5)-3}}&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;3-1,3-5:red&amp;lt;/code&amp;gt;&lt;br /&gt;
| {{#invoke:Build bracket|main|rounds=2|noheaders=yes|col1-matches=3|col2-matches=1,5|col1-col2-paths=3-1,3-5:red}}&lt;br /&gt;
}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
{{#switch:{{NAMESPACE}}&lt;br /&gt;
| Module = &lt;br /&gt;
&#039;&#039;&#039;Note&#039;&#039;&#039;: These are only examples to illustrate parameters. Standard 4-team, 8-team, etc. brackets are better handled by [[Module:Team bracket]].&lt;br /&gt;
&lt;br /&gt;
=== Standard 4-team bracket ===&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow: auto;&amp;quot;&amp;gt;&lt;br /&gt;
{{#invoke:Build bracket|main&lt;br /&gt;
| rounds=2&lt;br /&gt;
&lt;br /&gt;
| col1-headers = 1&lt;br /&gt;
| col2-headers = 1&lt;br /&gt;
&lt;br /&gt;
| col1-matches = 3,7&lt;br /&gt;
| col2-matches = 5&lt;br /&gt;
&lt;br /&gt;
| col1-col2-paths = (3,7)-5&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Defaults --&amp;gt;&lt;br /&gt;
| RD2 = Grand Final&lt;br /&gt;
&lt;br /&gt;
| RD1-seed1 = 1&lt;br /&gt;
| RD1-seed3 = 2&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{#invoke:Build bracket|main&lt;br /&gt;
| rounds=2&lt;br /&gt;
&lt;br /&gt;
| col1-headers = 1&lt;br /&gt;
| col2-headers = 1&lt;br /&gt;
&lt;br /&gt;
| col1-matches = 3,7&lt;br /&gt;
| col2-matches = 5&lt;br /&gt;
&lt;br /&gt;
| col1-col2-paths = (3,7)-5&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Defaults --&amp;gt;&lt;br /&gt;
| RD2 = Grand Final&lt;br /&gt;
&lt;br /&gt;
| RD1-seed1 = 1&lt;br /&gt;
| RD1-seed3 = 2&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== 3-way bracket ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{{#invoke:Build bracket|main&lt;br /&gt;
| rounds=2&lt;br /&gt;
| teams-per-match = 3&lt;br /&gt;
&lt;br /&gt;
| col1-headers = 1&lt;br /&gt;
| col2-headers = 1&lt;br /&gt;
&lt;br /&gt;
| col1-matches = 3,7,11&lt;br /&gt;
| col2-matches = 7&lt;br /&gt;
&lt;br /&gt;
| col1-col2-paths = (3,7,11)-7&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
{{#invoke:Build bracket|main&lt;br /&gt;
| rounds=2&lt;br /&gt;
| teams-per-match = 3&lt;br /&gt;
&lt;br /&gt;
| col1-headers = 1&lt;br /&gt;
| col2-headers = 1&lt;br /&gt;
&lt;br /&gt;
| col1-matches = 3,7,11&lt;br /&gt;
| col2-matches = 7&lt;br /&gt;
&lt;br /&gt;
| col1-col2-paths = (3,7,11)-7&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Double-elimination bracket ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{{#invoke:Build bracket|main&lt;br /&gt;
| rounds=4&lt;br /&gt;
&lt;br /&gt;
| col1-headers = 1,7&lt;br /&gt;
| col2-headers = 1,7&lt;br /&gt;
| col3-headers = 7&lt;br /&gt;
| col4-headers = 1&lt;br /&gt;
&lt;br /&gt;
| col1-matches = 4,11&lt;br /&gt;
| col2-matches = 3,10&lt;br /&gt;
| col3-matches = 9&lt;br /&gt;
| col4-matches = 6&lt;br /&gt;
&lt;br /&gt;
| col1-col2-paths = 4-3, 11-10&lt;br /&gt;
| col2-col3-paths = 3-3, 10-9&lt;br /&gt;
| col3-col4-paths = (3,9)-6&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Defaults --&amp;gt;&lt;br /&gt;
| RD1 = Upper round 1&lt;br /&gt;
| RD2 = Upper final&lt;br /&gt;
| RD3b = Lower final&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
{{#invoke:Build bracket|main&lt;br /&gt;
| rounds=4&lt;br /&gt;
&lt;br /&gt;
| col1-headers = 1,7&lt;br /&gt;
| col2-headers = 1,7&lt;br /&gt;
| col3-headers = 7&lt;br /&gt;
| col4-headers = 1&lt;br /&gt;
&lt;br /&gt;
| col1-matches = 4,11&lt;br /&gt;
| col2-matches = 3,10&lt;br /&gt;
| col3-matches = 9&lt;br /&gt;
| col4-matches = 6&lt;br /&gt;
&lt;br /&gt;
| col1-col2-paths = 4-3, 11-10&lt;br /&gt;
| col2-col3-paths = 3-3, 10-9&lt;br /&gt;
| col3-col4-paths = (3,9)-6&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Defaults --&amp;gt;&lt;br /&gt;
| RD1 = Upper round 1&lt;br /&gt;
| RD2 = Upper final&lt;br /&gt;
| RD3b = Lower final&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Crossing paths ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{{#invoke:Build bracket|main&lt;br /&gt;
| rounds=2&lt;br /&gt;
&lt;br /&gt;
| col1-matches = 3,7&lt;br /&gt;
| col2-matches = 3,7&lt;br /&gt;
&lt;br /&gt;
| col1-col2-paths = 3-7, 7-3&lt;br /&gt;
| col1-col2-cross = 5&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
{{#invoke:Build bracket|main&lt;br /&gt;
| rounds=2&lt;br /&gt;
&lt;br /&gt;
| col1-matches = 3,7&lt;br /&gt;
| col2-matches = 3,7&lt;br /&gt;
&lt;br /&gt;
| col1-col2-paths = 3-7, 7-3&lt;br /&gt;
| col1-col2-cross = 5&lt;br /&gt;
}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Text ===&lt;br /&gt;
{{#switch:{{NAMESPACE}}&lt;br /&gt;
| Module = &lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow: auto;&amp;quot;&amp;gt;&lt;br /&gt;
{{#invoke:Build bracket|main&lt;br /&gt;
| rounds=2&lt;br /&gt;
| col1-matches = 3,6&lt;br /&gt;
| col2-matches = 4.5&lt;br /&gt;
| col1-col2-paths = (3,6)-4.5&lt;br /&gt;
&lt;br /&gt;
| RD1-text1 = Text 1&lt;br /&gt;
| RD1-text2 = Text 2&lt;br /&gt;
| RD2-text1 = Text 3&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
{{#invoke:Build bracket|main&lt;br /&gt;
| rounds=2&lt;br /&gt;
| col1-matches = 3,6&lt;br /&gt;
| col2-matches = 4.5&lt;br /&gt;
| col1-col2-paths = (3,6)-4.5&lt;br /&gt;
&lt;br /&gt;
| RD1-text1 = Text 1&lt;br /&gt;
| RD1-text2 = Text 2&lt;br /&gt;
| RD2-text1 = Text 3&lt;br /&gt;
}}&lt;br /&gt;
|#default =&lt;br /&gt;
{{#tag:syntaxhighlight|&lt;br /&gt;
{{((}}{{BASEPAGENAME}}&amp;lt;nowiki&amp;gt;&lt;br /&gt;
| RD1-text1 = Text 1&lt;br /&gt;
| RD1-text2 = Text 2&lt;br /&gt;
| RD2-text1 = Text 3&lt;br /&gt;
| RD1 =&lt;br /&gt;
| RD1-seed1   =&lt;br /&gt;
| RD1-team1   =&lt;br /&gt;
| RD1-score1  =&lt;br /&gt;
 ...&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
{{))}}|lang=&amp;quot;wikitext&amp;quot;}}&lt;br /&gt;
{{{{#if:{{{limitexamples|}}}|void|{{BASEPAGENAME}}}}|RD1-text1=Text 1|RD1-text2=Text 2|RD2-text1=Text 3}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Groups ===&lt;br /&gt;
{{#switch:{{NAMESPACE}}&lt;br /&gt;
| Module = &lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow: auto;&amp;quot;&amp;gt;&lt;br /&gt;
{{#invoke:Build bracket|main&lt;br /&gt;
| rounds=3&lt;br /&gt;
| col1-matches = 3,6,9,12&lt;br /&gt;
| col2-matches = 4.5,10.5&lt;br /&gt;
| col3-matches = 7.5&lt;br /&gt;
&lt;br /&gt;
| col1-col2-paths = (3,6)-4.5, (9,12)-10.5&lt;br /&gt;
| col2-col3-paths = (4.5,10.5)-7.5&lt;br /&gt;
&lt;br /&gt;
| RD1-group1 = Group 1&lt;br /&gt;
| RD1-group2 = Group 2&lt;br /&gt;
| RD2-group1 = Group 3&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
{{#invoke:Build bracket|main&lt;br /&gt;
| rounds=3&lt;br /&gt;
| col1-matches = 3,6,9,12&lt;br /&gt;
| col2-matches = 4.5,10.5&lt;br /&gt;
| col3-matches = 7.5&lt;br /&gt;
&lt;br /&gt;
| col1-col2-paths = (3,6)-4.5, (9,12)-10.5&lt;br /&gt;
| col2-col3-paths = (4.5,10.5)-7.5&lt;br /&gt;
&lt;br /&gt;
| RD1-group1 = Group 1&lt;br /&gt;
| RD1-group2 = Group 2&lt;br /&gt;
| RD2-group1 = Group 3&lt;br /&gt;
}}&lt;br /&gt;
|#default =&lt;br /&gt;
{{#tag:syntaxhighlight|&lt;br /&gt;
{{((}}{{BASEPAGENAME}}&amp;lt;nowiki&amp;gt;&lt;br /&gt;
| RD1-group1 = Group 1&lt;br /&gt;
| RD1-group2 = Group 2&lt;br /&gt;
| RD2-group1 = Group 3&lt;br /&gt;
| RD1 =&lt;br /&gt;
| RD1-seed1   =&lt;br /&gt;
| RD1-team1   =&lt;br /&gt;
| RD1-score1  =&lt;br /&gt;
 ...&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
{{))}}|lang=&amp;quot;wikitext&amp;quot;}}&lt;br /&gt;
{{{{#if:{{{limitexamples|}}}|void|{{BASEPAGENAME}}}}|RD1-group1=Group 1|RD1-group2=Group 2|RD2-group1=Group 3}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Legs and aggregate ===&lt;br /&gt;
{{#switch:{{NAMESPACE}}&lt;br /&gt;
| Module = &lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow: auto;&amp;quot;&amp;gt;&lt;br /&gt;
{{#invoke:Build bracket|main&lt;br /&gt;
| rounds=3&lt;br /&gt;
| legs = 2&lt;br /&gt;
| RD1-legs = 3&lt;br /&gt;
| aggregate = y&lt;br /&gt;
&lt;br /&gt;
| col1-matches = 3,6,9,12&lt;br /&gt;
| col2-matches = 4.5,10.5&lt;br /&gt;
| col3-matches = 7.5&lt;br /&gt;
&lt;br /&gt;
| col1-col2-paths = (3,6)-4.5, (9,12)-10.5&lt;br /&gt;
| col2-col3-paths = (4.5,10.5)-7.5&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
{{#invoke:Build bracket|main&lt;br /&gt;
| rounds=3&lt;br /&gt;
| legs = 2&lt;br /&gt;
| RD1-legs = 3&lt;br /&gt;
| aggregate = y&lt;br /&gt;
&lt;br /&gt;
| col1-matches = 3,6,9,12&lt;br /&gt;
| col2-matches = 4.5,10.5&lt;br /&gt;
| col3-matches = 7.5&lt;br /&gt;
&lt;br /&gt;
| col1-col2-paths = (3,6)-4.5, (9,12)-10.5&lt;br /&gt;
| col2-col3-paths = (4.5,10.5)-7.5&lt;br /&gt;
}}&lt;br /&gt;
|#default =&lt;br /&gt;
{{#tag:syntaxhighlight|&lt;br /&gt;
{{((}}{{BASEPAGENAME}}&amp;lt;nowiki&amp;gt;&lt;br /&gt;
| legs = 2&lt;br /&gt;
| RD1-legs = 3&lt;br /&gt;
| aggregate = y&lt;br /&gt;
| RD1 =&lt;br /&gt;
| RD1-seed1   =&lt;br /&gt;
| RD1-team1   =&lt;br /&gt;
| RD1-score1-1=&lt;br /&gt;
| RD1-score1-2=&lt;br /&gt;
| RD1-score1-3=&lt;br /&gt;
| RD1-score1-agg=&lt;br /&gt;
 ...&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
{{))}}|lang=&amp;quot;wikitext&amp;quot;}}&lt;br /&gt;
{{{{#if:{{{limitexamples|}}}|void|{{BASEPAGENAME}}}}|legs=2|RD1-legs=3|aggregate=y}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Byes ===&lt;br /&gt;
{{#switch:{{NAMESPACE}}&lt;br /&gt;
| Module = &lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow: auto;&amp;quot;&amp;gt;&lt;br /&gt;
{{#invoke:Build bracket|main&lt;br /&gt;
| rounds=3&lt;br /&gt;
| RD1-byes = y&lt;br /&gt;
&lt;br /&gt;
| col1-matches = 3,6,9,12&lt;br /&gt;
| col2-matches = 4.5,10.5&lt;br /&gt;
| col3-matches = 7.5&lt;br /&gt;
&lt;br /&gt;
| col1-col2-paths = (3,6)-4.5, (9,12)-10.5&lt;br /&gt;
| col2-col3-paths = (4.5,10.5)-7.5&lt;br /&gt;
&lt;br /&gt;
| RD1-team1 = Team 1&lt;br /&gt;
| RD1-team2 = Team 2&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
{{#invoke:Build bracket|main&lt;br /&gt;
| rounds=3&lt;br /&gt;
| RD1-byes = y&lt;br /&gt;
&lt;br /&gt;
| col1-matches = 3,6,9,12&lt;br /&gt;
| col2-matches = 4.5,10.5&lt;br /&gt;
| col3-matches = 7.5&lt;br /&gt;
&lt;br /&gt;
| col1-col2-paths = (3,6)-4.5, (9,12)-10.5&lt;br /&gt;
| col2-col3-paths = (4.5,10.5)-7.5&lt;br /&gt;
&lt;br /&gt;
| RD1-team1 = Team 1&lt;br /&gt;
| RD1-team2 = Team 2&lt;br /&gt;
}}&lt;br /&gt;
|#default =&lt;br /&gt;
{{#tag:syntaxhighlight|&lt;br /&gt;
{{((}}{{BASEPAGENAME}}&amp;lt;nowiki&amp;gt;&lt;br /&gt;
| RD1-byes = y&lt;br /&gt;
| RD1 =&lt;br /&gt;
| RD1-seed1   =&lt;br /&gt;
| RD1-team1   = Team 1&lt;br /&gt;
| RD1-score1  =&lt;br /&gt;
| RD1-seed2   =&lt;br /&gt;
| RD1-team2   = Team 2&lt;br /&gt;
| RD1-score2  =&lt;br /&gt;
 ...&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
{{))}}|lang=&amp;quot;wikitext&amp;quot;}}&lt;br /&gt;
{{{{#if:{{{limitexamples|}}}|void|{{BASEPAGENAME}}}}|RD1-byes=y|RD1-team1=Team 1|RD1-team2=Team 2}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--=== Numbered parameters ===&lt;br /&gt;
{{#switch:{{NAMESPACE}}&lt;br /&gt;
| Module = &lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow: auto;&amp;quot;&amp;gt;&lt;br /&gt;
{{#invoke:Build bracket|main&lt;br /&gt;
| rounds=2&lt;br /&gt;
| col1-matches = 3,7&lt;br /&gt;
| col2-matches = 5&lt;br /&gt;
| col1-col2-paths = (3,7)-5&lt;br /&gt;
&lt;br /&gt;
| paramstyle = numbered&lt;br /&gt;
| seeds = yes&lt;br /&gt;
&lt;br /&gt;
| Text 1 | 1 | Team 1 | 5 | 4 | Team 2 | 11&lt;br /&gt;
| Text 2 | 2 | Team 3 | 6 | 3 | Team 4 | 3&lt;br /&gt;
&lt;br /&gt;
| Text 3 | 4 | Team 2 | 2 | 2 | Team 3 | 1 &lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
{{#invoke:Build bracket|main&lt;br /&gt;
| rounds=2&lt;br /&gt;
| col1-matches = 3,7&lt;br /&gt;
| col2-matches = 5&lt;br /&gt;
| col1-col2-paths = (3,7)-5&lt;br /&gt;
&lt;br /&gt;
| paramstyle = numbered&lt;br /&gt;
| seeds = yes&lt;br /&gt;
&lt;br /&gt;
| Text 1 | 1 | Team 1 | 5 | 4 | Team 2 | 11&lt;br /&gt;
| Text 2 | 2 | Team 3 | 6 | 3 | Team 4 | 3&lt;br /&gt;
&lt;br /&gt;
| Text 3 | 4 | Team 2 | 2 | 2 | Team 3 | 1 &lt;br /&gt;
}}&lt;br /&gt;
|#default =&lt;br /&gt;
{{#tag:syntaxhighlight|&lt;br /&gt;
{{((}}{{BASEPAGENAME}}&amp;lt;nowiki&amp;gt;&lt;br /&gt;
| paramstyle = numbered&lt;br /&gt;
| RD1 =&lt;br /&gt;
&lt;br /&gt;
| Text 1 | Team 1 | S1 | Team 2 | S2&lt;br /&gt;
| Text 2 | Team 3 | S3 | Team 4 | S4&lt;br /&gt;
 ...&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
{{))}}|lang=&amp;quot;wikitext&amp;quot;}}&lt;br /&gt;
{{{{#if:{{{limitexamples|}}}|void|{{BASEPAGENAME}}}}|paramstyle=numbered|1=Text 1|2=Team 1|3=S1 |4=Team 2|5=S2|6=Text 2|7=Team 3|8=S3|9=Team 4|10=S4}}&lt;br /&gt;
}}--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{#switch:{{NAMESPACE}}&lt;br /&gt;
| Module = &lt;br /&gt;
=== Bold winner ===&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow: auto;&amp;quot;&amp;gt;&lt;br /&gt;
{{#invoke:Build bracket|main&lt;br /&gt;
| rounds=2&lt;br /&gt;
| legs = 3&lt;br /&gt;
| boldwinner=y&lt;br /&gt;
| col1-matches = 3,7&lt;br /&gt;
| col2-matches = 5&lt;br /&gt;
| col1-col2-paths = (3,7)-5&lt;br /&gt;
&lt;br /&gt;
| RD1-seed1 = 1 | RD1-team1 = Team 1 | RD1-score1-1 = 5  | RD1-score1-2 = 12 | RD1-score1-3 = 15&lt;br /&gt;
| RD1-seed2 = 4 | RD1-team2 = Team 2 | RD1-score2-1 = 11 | RD1-score2-2 = 10 | RD1-score2-3 = 4&lt;br /&gt;
&lt;br /&gt;
| RD1-seed3 = 2 | RD1-team3 = Team 3 | RD1-score3-1 = 6  | RD1-score3-2 = 13 | RD1-score3-3 = {{ndash}}&lt;br /&gt;
| RD1-seed4 = 3 | RD1-team4 = Team 4 | RD1-score4-1 = 3  | RD1-score4-2 = 2  | RD1-score4-3 = {{ndash}}&lt;br /&gt;
&lt;br /&gt;
| RD2-seed1 = 4 | RD2-team1 = Team 2 | RD2-score1-1 = 2  | RD2-score1-2 = 2  | RD2-score1-3 = 5&lt;br /&gt;
| RD2-seed2 = 2 | RD2-team2 = Team 3 | RD2-score2-1 = 1  | RD2-score2-2 = 7  | RD2-score2-3 = 2&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
{{#invoke:Build bracket|main&lt;br /&gt;
| rounds=2&lt;br /&gt;
| legs = 3&lt;br /&gt;
| boldwinner=y&lt;br /&gt;
| col1-matches = 3,7&lt;br /&gt;
| col2-matches = 5&lt;br /&gt;
| col1-col2-paths = (3,7)-5&lt;br /&gt;
&lt;br /&gt;
| RD1-seed1 = 1 | RD1-team1 = Team 1 | RD1-score1-1 = 5  | RD1-score1-2 = 12 | RD1-score1-3 = 15&lt;br /&gt;
| RD1-seed2 = 4 | RD1-team2 = Team 2 | RD1-score2-1 = 11 | RD1-score2-2 = 10 | RD1-score2-3 = 4&lt;br /&gt;
&lt;br /&gt;
| RD1-seed3 = 2 | RD1-team3 = Team 3 | RD1-score3-1 = 6  | RD1-score3-2 = 13 | RD1-score3-3 = {{ndash}}&lt;br /&gt;
| RD1-seed4 = 3 | RD1-team4 = Team 4 | RD1-score4-1 = 3  | RD1-score4-2 = 2  | RD1-score4-3 = {{ndash}}&lt;br /&gt;
&lt;br /&gt;
| RD2-seed1 = 4 | RD2-team1 = Team 2 | RD2-score1-1 = 2  | RD2-score1-2 = 2  | RD2-score1-3 = 5&lt;br /&gt;
| RD2-seed2 = 2 | RD2-team2 = Team 3 | RD2-score2-1 = 1  | RD2-score2-2 = 7  | RD2-score2-3 = 2&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
|#default=&lt;br /&gt;
{{{examples|}}}&lt;br /&gt;
}}&lt;br /&gt;
{{#switch:{{NAMESPACE}}&lt;br /&gt;
| Module = &lt;br /&gt;
== See also ==&lt;br /&gt;
* [[Module:Team bracket]]&lt;br /&gt;
* [[Module:RoundN]]&lt;br /&gt;
* [[Module:Bracket]]&lt;br /&gt;
&amp;lt;includeonly&amp;gt;{{#ifeq:{{SUBPAGENAME}}|sandbox||&lt;br /&gt;
&amp;lt;!-- Categories go here, and interwikis go in Wikidata --&amp;gt;&lt;br /&gt;
[[Category:Sports modules]]&lt;br /&gt;
}}&amp;lt;/includeonly&amp;gt;&lt;br /&gt;
| #default = &lt;br /&gt;
==Alternatives to avoid Wikipedia&#039;s [[WP:PEIS|Post-expand include size]] limit==&lt;br /&gt;
Pages with many brackets or large brackets, especially those containing flag icons, may come close to or exceed Wikipedia&#039;s [[WP:PEIS|Post-expand include size]] limit.  In these cases consider using modules directly instead:&lt;br /&gt;
* {{#invoke:Bracket|doc}}&lt;br /&gt;
* In most cases, flag templates can be replaced with {{ml|flag}}, e.g. {{tlx|flag|CAN}}→{{mlx|flag|{{!}}CAN}} or {{tlx|flag athlete|CAN}}→{{mlx|flag|athlete|CAN}}.&lt;br /&gt;
&lt;br /&gt;
{{#if:{{{see also|}}}|&lt;br /&gt;
== See also ==&lt;br /&gt;
{{{see also|* {{tl|Build bracket}}}}}&lt;br /&gt;
}}&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;noinclude&amp;gt;&lt;br /&gt;
[[Category:Module documentation pages]]&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Osarius</name></author>
	</entry>
	<entry>
		<id>https://nssportwiki.com/index.php?title=Module:Build_bracket&amp;diff=76390</id>
		<title>Module:Build bracket</title>
		<link rel="alternate" type="text/html" href="https://nssportwiki.com/index.php?title=Module:Build_bracket&amp;diff=76390"/>
		<updated>2026-07-24T10:50:35Z</updated>

		<summary type="html">&lt;p&gt;Osarius: 1 revision imported&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local p = {}&lt;br /&gt;
&lt;br /&gt;
-- Submodules&lt;br /&gt;
local Helpers = require(&amp;quot;Module:Build bracket/Helpers&amp;quot;)&lt;br /&gt;
local Config = require(&amp;quot;Module:Build bracket/Config&amp;quot;)&lt;br /&gt;
local Params = require(&amp;quot;Module:Build bracket/Params&amp;quot;)&lt;br /&gt;
local StateChecks = require(&amp;quot;Module:Build bracket/StateChecks&amp;quot;)&lt;br /&gt;
local Logic = require(&amp;quot;Module:Build bracket/Logic&amp;quot;)&lt;br /&gt;
local Paths = require(&amp;quot;Module:Build bracket/Paths&amp;quot;)&lt;br /&gt;
local Render = require(&amp;quot;Module:Build bracket/Render&amp;quot;)&lt;br /&gt;
-- local Deprecations = require(&#039;Module:Build bracket/Deprecations&#039;)&lt;br /&gt;
&lt;br /&gt;
function p.main(frame)&lt;br /&gt;
    -- Shared mutable state passed among submodules&lt;br /&gt;
    local state = {&lt;br /&gt;
        headerindex = {},&lt;br /&gt;
        rlegs = {},&lt;br /&gt;
        maxlegs = {},&lt;br /&gt;
        hascross = {},&lt;br /&gt;
        crossCell = {},&lt;br /&gt;
        pathCell = {},&lt;br /&gt;
        skipPath = {},&lt;br /&gt;
        hide = {},&lt;br /&gt;
        byes = {},&lt;br /&gt;
        teamsPerMatch = {},&lt;br /&gt;
        matchgroup = {},&lt;br /&gt;
        maxtpm = 0&lt;br /&gt;
    }&lt;br /&gt;
    local config = {}&lt;br /&gt;
&lt;br /&gt;
    -- 1) Parse args &amp;amp; set config (also installs arg accessors on Helpers)&lt;br /&gt;
    Config.init(frame, state, config, Helpers)&lt;br /&gt;
&lt;br /&gt;
    -- 2) Bind StateChecks (used by Params/Logic/Paths/Render)&lt;br /&gt;
    StateChecks.bind(state, config, Helpers)&lt;br /&gt;
&lt;br /&gt;
    -- 3) Build entries skeleton from args (headers/teams/text/lines/groups)&lt;br /&gt;
    Params.buildSkeleton(state, config, Helpers, StateChecks)&lt;br /&gt;
&lt;br /&gt;
    -- 4) Discover indices/byes/hide across the skeleton&lt;br /&gt;
    Params.scanStructure(state, config, Helpers, StateChecks)&lt;br /&gt;
&lt;br /&gt;
    -- 5) assign per-entry params&lt;br /&gt;
    Params.assign(state, config, Helpers, StateChecks)&lt;br /&gt;
&lt;br /&gt;
    -- 5.5) apply minround slicing (reindex to start at 1)&lt;br /&gt;
    Params.sliceForMinround(state, config)&lt;br /&gt;
&lt;br /&gt;
    -- 6) Logic passes (max legs, grouping, aggregates, bolding)&lt;br /&gt;
    Logic.updateMaxLegs(state, config, Helpers)&lt;br /&gt;
    Logic.matchGroups(state, config)&lt;br /&gt;
    Logic.computeAggregate(state, config, Helpers, StateChecks)&lt;br /&gt;
    Logic.boldWinner(state, config, Helpers, StateChecks)&lt;br /&gt;
&lt;br /&gt;
    -- 7) paths + derive groups from paths&lt;br /&gt;
    Paths.build(state, config, Helpers, StateChecks)&lt;br /&gt;
    Paths.attachGroups(state, config, Helpers, StateChecks)&lt;br /&gt;
&lt;br /&gt;
    -- (Harmless guard if user passed odd ranges)&lt;br /&gt;
    if (tonumber(config.c) or 1) &amp;lt; (tonumber(config.minc) or 1) then&lt;br /&gt;
        config.c = config.minc&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    -- 8) Render HTML table&lt;br /&gt;
    local html = Render.buildTable(frame, state, config, Helpers, StateChecks)&lt;br /&gt;
    return tostring(html)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Exposed for tests/scripts that invoke without a frame&lt;br /&gt;
p._main = p.main&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Osarius</name></author>
	</entry>
	<entry>
		<id>https://nssportwiki.com/index.php?title=Template:Parameter&amp;diff=76388</id>
		<title>Template:Parameter</title>
		<link rel="alternate" type="text/html" href="https://nssportwiki.com/index.php?title=Template:Parameter&amp;diff=76388"/>
		<updated>2026-07-24T10:50:34Z</updated>

		<summary type="html">&lt;p&gt;Osarius: 1 revision imported&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{safesubst:&amp;lt;noinclude /&amp;gt;#if:{{{plain|}}}{{{mxt|}}}{{{green|}}}{{{!mxt|}}}{{{red|}}}{{{color|}}}&lt;br /&gt;
	| &amp;lt;code class=&amp;quot;tpl-para&amp;quot; style=&amp;quot;word-break:break-word;{{safesubst:&amp;lt;noinclude /&amp;gt;#if:{{{plain|}}}&lt;br /&gt;
		| border: none; background-color: inherit;&lt;br /&gt;
	}} {{safesubst:&amp;lt;noinclude /&amp;gt;#if:{{{color|}}}&lt;br /&gt;
		| color: {{{color}}};&lt;br /&gt;
		| {{safesubst:&amp;lt;noinclude /&amp;gt;#if:{{{mxt|}}}{{{green|}}}&lt;br /&gt;
			| color: #006400;&lt;br /&gt;
			| {{safesubst:&amp;lt;noinclude /&amp;gt;#if:{{{!mxt|}}}{{{red|}}}&lt;br /&gt;
				| color: #8B0000;&lt;br /&gt;
				| color: inherit;&lt;br /&gt;
			}}&lt;br /&gt;
		}}&lt;br /&gt;
	}} {{safesubst:&amp;lt;noinclude /&amp;gt;#if:{{{style|}}}|{{{style}}}}}&amp;quot;&amp;gt;&amp;amp;#124;{{safesubst:&amp;lt;noinclude /&amp;gt;#if:{{{1|}}}&lt;br /&gt;
		| {{{1}}}&amp;amp;#61;&lt;br /&gt;
	}}{{{2|}}}&amp;lt;/code&amp;gt;&lt;br /&gt;
	| &amp;lt;syntaxhighlight lang=&amp;quot;wikitext&amp;quot; inline style=&amp;quot;display: none;&amp;quot; /&amp;gt;&amp;lt;!-- required to fetch syntaxhighlight&#039;s css --&amp;gt;&amp;lt;code class=&amp;quot;mw-highlight&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;p&amp;quot;&amp;gt;&amp;amp;#124;&amp;lt;/span&amp;gt;{{safesubst:&amp;lt;noinclude /&amp;gt;#if:{{{1|}}}&lt;br /&gt;
		| &amp;lt;span class=&amp;quot;nl&amp;quot;&amp;gt;{{{1}}}&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;o&amp;quot;&amp;gt;=&amp;lt;/span&amp;gt;&lt;br /&gt;
	}}{{{2|}}}&amp;lt;/code&amp;gt;&lt;br /&gt;
}}&amp;lt;noinclude&amp;gt;&lt;br /&gt;
{{Documentation}}&lt;br /&gt;
&amp;lt;!-- Categories go near the bottom of the /doc subpage – interwikis go to Wikidata, thank you! --&amp;gt;&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Osarius</name></author>
	</entry>
	<entry>
		<id>https://nssportwiki.com/index.php?title=Template:Ml&amp;diff=76386</id>
		<title>Template:Ml</title>
		<link rel="alternate" type="text/html" href="https://nssportwiki.com/index.php?title=Template:Ml&amp;diff=76386"/>
		<updated>2026-07-24T10:50:34Z</updated>

		<summary type="html">&lt;p&gt;Osarius: 1 revision imported&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Template:Module link]]&lt;br /&gt;
&lt;br /&gt;
{{Redirect category shell|&lt;br /&gt;
{{R from move}}&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Osarius</name></author>
	</entry>
	<entry>
		<id>https://nssportwiki.com/index.php?title=Template:Lua&amp;diff=76384</id>
		<title>Template:Lua</title>
		<link rel="alternate" type="text/html" href="https://nssportwiki.com/index.php?title=Template:Lua&amp;diff=76384"/>
		<updated>2026-07-24T10:50:34Z</updated>

		<summary type="html">&lt;p&gt;Osarius: 1 revision imported&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template for discussion/dated|action=|page=Lua|otherpage=|link=Wikipedia:Templates for discussion/Log/2026 July 24#Template:Lua|type=sidebar|help=off|bigbox={{#invoke:Noinclude|noinclude|text=yes}}}}&lt;br /&gt;
&amp;lt;includeonly&amp;gt;{{#invoke:Lua banner|main}}&amp;lt;/includeonly&amp;gt;&amp;lt;noinclude&amp;gt;&lt;br /&gt;
{{Lua|Module:Lua banner}}&lt;br /&gt;
{{documentation}}&lt;br /&gt;
&amp;lt;!-- Categories go on the /doc subpage and interwikis go on Wikidata. --&amp;gt;&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Osarius</name></author>
	</entry>
	<entry>
		<id>https://nssportwiki.com/index.php?title=Template:Template_for_discussion/dated&amp;diff=76382</id>
		<title>Template:Template for discussion/dated</title>
		<link rel="alternate" type="text/html" href="https://nssportwiki.com/index.php?title=Template:Template_for_discussion/dated&amp;diff=76382"/>
		<updated>2026-07-24T10:50:33Z</updated>

		<summary type="html">&lt;p&gt;Osarius: 1 revision imported&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{SAFESUBST:&amp;lt;noinclude /&amp;gt;#invoke:Unsubst||type= |page= |link= |help= |$B={{#ifeq:{{{bigbox|&amp;lt;noinclude&amp;gt;yes&amp;lt;/noinclude&amp;gt;}}}|yes|{{#invoke:Message box|ombox&lt;br /&gt;
  |class = mbox-tfd&lt;br /&gt;
  |type  = delete&lt;br /&gt;
  |image = none&lt;br /&gt;
  |small = {{{small|no}}}&lt;br /&gt;
  |text  = This {{#ifeq:{{lc:{{{type}}}}}|module|[[Help:Module|module]]|[[Help:Template|template]]}} is being discussed {{#if:{{{action|}}}|for {{{action}}}|in accordance with Wikipedia&#039;s [[Wikipedia:Deletion policy|deletion policy]]}}. Help reach a consensus at [[{{{link}}}|&#039;&#039;&#039;its entry&#039;&#039;&#039;]].&lt;br /&gt;
{{#ifeq:{{{help}}}|off||----&lt;br /&gt;
&#039;&#039;&amp;lt;small class=&amp;quot;plainlinks&amp;quot; style=&amp;quot;line-height:1.3em;&amp;quot;&amp;gt;[[Wikipedia:Maintenance|Maintenance]] use only:&amp;lt;br /&amp;gt;1. [{{fullurl:{{{link}}}|action=edit&amp;amp;editintro=Wikipedia:Templates_for_discussion/editnotice&amp;amp;section=1}} Edit the TfD log] to create the discussion entry.&amp;lt;br /&amp;gt;2. Please consider notifying the [{{fullurl:{{FULLPAGENAME}}|action=history}} author(s)] by placing &amp;lt;span class=&amp;quot;nowrap&amp;quot;&amp;gt;{{#Invoke:Template link general|main|code=on|subst=on|{{#ifeq:{{lc:{{{action}}}}}|rename|TfR|{{#ifeq:{{lc:{{{action}}}}}|renaming|TfR|{{#ifeq:{{lc:{{{action}}}}}|move|TfR|{{#ifeq:{{lc:{{{action}}}}}|moving|TfR|TfD}}}}}}}} notice|{{PAGENAME}}{{#ifeq:{{lc:{{{type}}}}}|module|{{!}}module=yes}}}} &amp;lt;nowiki&amp;gt;~~~~&amp;lt;/nowiki&amp;gt;&amp;lt;/span&amp;gt; on their talk page(s).&amp;lt;/small&amp;gt;&#039;&#039;&lt;br /&gt;
 }}}}{{#invoke:Category handler|main&lt;br /&gt;
  | all = [[Category:Templates for deletion]]&lt;br /&gt;
  | nocat = {{{nocat|{{#ifeq:{{Template:FULLBASEPAGENAME|{{FULLBASEPAGENAME}}}}|Template:Template for discussion|true}}|true}}}&lt;br /&gt;
  | category2 = {{{category|¬}}}&lt;br /&gt;
 }}&amp;lt;span id=&amp;quot;delete-reason&amp;quot; style=&amp;quot;display:none&amp;quot;&amp;gt;{{URLENCODE:[[{{{link}}}]]}}&amp;lt;/span&amp;gt;&amp;lt;span id=&amp;quot;delete-criterion&amp;quot; style=&amp;quot;display:none&amp;quot;&amp;gt; &amp;lt;/span&amp;gt;&lt;br /&gt;
|{{#switch:{{lc:{{{type}}}}}&lt;br /&gt;
 |tiny = &amp;lt;templatestyles src=&amp;quot;Template:Template for discussion/styles.css&amp;quot; /&amp;gt;&amp;lt;span class=&amp;quot;noprint tfd tfd-dated tfd-tiny {{#ifeq:{{{dedup|}}}|no||tfd-dedup}}&amp;quot;&amp;gt;[[{{{link}}}|‹See Tfd›]]&amp;lt;/span&amp;gt;&lt;br /&gt;
 |inline = &amp;lt;templatestyles src=&amp;quot;Template:Template for discussion/styles.css&amp;quot; /&amp;gt;&amp;lt;span class=&amp;quot;noprint {{#ifeq:{{{dedup|}}}|no||tfd-dedup}}&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;tfd tfd-dated tfd-inline&amp;quot;&amp;gt;‹The [[Help:Template|template]] &#039;&#039;[[Template:{{{page}}}|{{{page}}}]]&#039;&#039; is being [[{{{link}}}|considered for {{if empty|{{{action|}}}|deletion}}]].›&amp;lt;/span&amp;gt;&amp;amp;nbsp;&amp;lt;/span&amp;gt;&lt;br /&gt;
 |infobox|box|sidebar = &amp;lt;templatestyles src=&amp;quot;Template:Template for discussion/styles.css&amp;quot; /&amp;gt;&amp;lt;div class=&amp;quot;boilerplate metadata plainlinks tfd tfd-dated tfd-sidebar navigation-not-searchable {{#ifeq:{{{dedup|}}}|no||tfd-dedup}}&amp;quot; id=&amp;quot;tfd{{urlencode:{{{page}}}|WIKI}}&amp;quot;&amp;gt;‹&amp;amp;nbsp;The [[Help:Template|template]] &#039;&#039;[[Template:{{{page}}}|{{{page}}}]]&#039;&#039; is being [[{{{link}}}|considered for {{if empty|{{{action|}}}|deletion}}]].&amp;amp;nbsp;›&amp;lt;/div&amp;gt;&lt;br /&gt;
 |hide|disabled = &amp;lt;noinclude&amp;gt;&amp;lt;!-- No output --&amp;gt;&amp;lt;/noinclude&amp;gt;&lt;br /&gt;
 |#default = &amp;lt;templatestyles src=&amp;quot;Template:Template for discussion/styles.css&amp;quot; /&amp;gt;&amp;lt;div class=&amp;quot;boilerplate metadata plainlinks tfd tfd-dated tfd-default navigation-not-searchable {{#ifeq:{{{dedup|}}}|no||tfd-dedup}}&amp;quot; id=&amp;quot;tfd{{urlencode:{{{page}}}|WIKI}}&amp;quot;&amp;gt;‹&amp;amp;nbsp;The [[Help:Template|template]] below (&#039;&#039;[[Template:{{{page}}}|{{{page}}}]]&#039;&#039;) is being considered for {{if empty|{{{action|}}}|deletion}}{{#if:{{{otherpage|}}}|&amp;amp;#32;to {{{otherpage|}}}}}. See [[{{{link}}}|templates for discussion]] to help reach a consensus.&amp;amp;nbsp;›&amp;lt;/div&amp;gt;&lt;br /&gt;
}}}}}}&amp;lt;noinclude&amp;gt;&lt;br /&gt;
{{Documentation}}&lt;br /&gt;
&amp;lt;!-- Add categories to the /doc subpage, please, not here! --&amp;gt;&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Osarius</name></author>
	</entry>
	<entry>
		<id>https://nssportwiki.com/index.php?title=Template:Tag&amp;diff=76380</id>
		<title>Template:Tag</title>
		<link rel="alternate" type="text/html" href="https://nssportwiki.com/index.php?title=Template:Tag&amp;diff=76380"/>
		<updated>2026-07-24T10:50:32Z</updated>

		<summary type="html">&lt;p&gt;Osarius: 1 revision imported&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;code class=&amp;quot;{{#ifeq:{{{wrap|}}}|yes|wrap|nowrap}}&amp;quot; style=&amp;quot;{{#ifeq:{{{style|}}}|plain|border:none;background:transparent;color:inherit;|{{{style|}}}}}&amp;quot;&amp;gt;&amp;lt;!--&lt;br /&gt;
 Opening tag&lt;br /&gt;
--&amp;gt;{{#switch:{{{2|pair}}}&lt;br /&gt;
  |c|close =&lt;br /&gt;
  |e|empty|s|single|v|void&lt;br /&gt;
  |o|open&lt;br /&gt;
  |p|pair = &amp;amp;lt;{{#if:{{{link|}}}|[[HTML element#{{{1|tag}}}|{{{1|tag}}}]]|{{{1|tag}}}}}{{#if:{{{params|{{{attribs|}}}}}}|&amp;amp;#32;{{{params|{{{attribs}}}}}}}}&lt;br /&gt;
 }}&amp;lt;!--&lt;br /&gt;
 Content between tags&lt;br /&gt;
--&amp;gt;{{#switch:{{{2|pair}}}&lt;br /&gt;
  |c|close = {{{content|}}}&lt;br /&gt;
  |e|empty|s|single|v|void = &amp;amp;#32;&amp;amp;#47;&amp;amp;gt;&lt;br /&gt;
  |o|open = &amp;amp;gt;{{{content|}}}&lt;br /&gt;
  |p|pair = {{#ifeq:{{{1|tag}}}|!--||&amp;amp;gt;}}{{{content|...}}}&lt;br /&gt;
 }}&amp;lt;!--&lt;br /&gt;
 Closing tag&lt;br /&gt;
--&amp;gt;{{#switch:{{{2|pair}}}&lt;br /&gt;
  |e|empty|s|single|v|void&lt;br /&gt;
  |o|open =&lt;br /&gt;
  |c|close&lt;br /&gt;
  |p|pair = {{#ifeq:{{{1|tag}}}|!--|--&amp;amp;gt;|&amp;amp;lt;&amp;amp;#47;{{{1|tag}}}&amp;amp;gt;}}&lt;br /&gt;
 }}&amp;lt;!--&lt;br /&gt;
--&amp;gt;&amp;lt;/code&amp;gt;&amp;lt;noinclude&amp;gt;&lt;br /&gt;
{{Documentation}}&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Osarius</name></author>
	</entry>
	<entry>
		<id>https://nssportwiki.com/index.php?title=Template:Notelist&amp;diff=76378</id>
		<title>Template:Notelist</title>
		<link rel="alternate" type="text/html" href="https://nssportwiki.com/index.php?title=Template:Notelist&amp;diff=76378"/>
		<updated>2026-07-24T10:50:32Z</updated>

		<summary type="html">&lt;p&gt;Osarius: 1 revision imported&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{safesubst&amp;lt;noinclude /&amp;gt;:reflist|{{{1|{{{colwidth|}}}}}}|refs={{{refs|{{{notes|}}}}}}|group={{safesubst&amp;lt;noinclude /&amp;gt;:#switch: {{{group|}}}&lt;br /&gt;
    | note&lt;br /&gt;
    | upper-alpha&lt;br /&gt;
    | upper-roman&lt;br /&gt;
    | lower-alpha&lt;br /&gt;
    | lower-greek&lt;br /&gt;
    | lower-roman = {{{group|}}}&lt;br /&gt;
    | #default = lower-alpha&lt;br /&gt;
   }}}}{{safesubst&amp;lt;noinclude /&amp;gt;:#invoke:Check for unknown parameters|check|unknown={{main other|[[Category:Pages using notelist with unknown parameters|_VALUE_{{PAGENAME}}]]}}|preview=Page using [[Template:Notelist]] with unknown parameter &amp;quot;_VALUE_&amp;quot;|ignoreblank=y| 1 | colwidth | group | notes | refs }}&amp;lt;noinclude&amp;gt;&lt;br /&gt;
{{documentation}}&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Osarius</name></author>
	</entry>
	<entry>
		<id>https://nssportwiki.com/index.php?title=Template:Reflist/styles.css&amp;diff=76376</id>
		<title>Template:Reflist/styles.css</title>
		<link rel="alternate" type="text/html" href="https://nssportwiki.com/index.php?title=Template:Reflist/styles.css&amp;diff=76376"/>
		<updated>2026-07-24T10:50:32Z</updated>

		<summary type="html">&lt;p&gt;Osarius: 1 revision imported&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* {{pp|small=yes}} */&lt;br /&gt;
/* columns-2 and columns-3 are legacy for &amp;quot;2 or more&amp;quot; column view from when the&lt;br /&gt;
 * template was implemented with column-count.&lt;br /&gt;
 */&lt;br /&gt;
.reflist-columns-2 {&lt;br /&gt;
	column-width: 30em;&lt;br /&gt;
}&lt;br /&gt;
.reflist-columns-3 {&lt;br /&gt;
	column-width: 25em;&lt;br /&gt;
}&lt;br /&gt;
/* Match Vector 2022 after [[gerrit:1185300]]. */&lt;br /&gt;
body.skin-vector-2022 .reflist-columns-2 {&lt;br /&gt;
	column-width: 27em;&lt;br /&gt;
}&lt;br /&gt;
body.skin-vector-2022 .reflist-columns-3 {&lt;br /&gt;
	column-width: 22.5em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* These should probably be moved to MediaWiki:Common.css to work with &amp;lt;references&amp;gt; as well. */&lt;br /&gt;
.references[data-mw-group=upper-alpha] {&lt;br /&gt;
	list-style-type: upper-alpha;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.references[data-mw-group=upper-roman] {&lt;br /&gt;
	list-style-type: upper-roman;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.references[data-mw-group=lower-alpha] {&lt;br /&gt;
	list-style-type: lower-alpha;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.references[data-mw-group=lower-greek] {&lt;br /&gt;
	list-style-type: lower-greek;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.references[data-mw-group=lower-roman] {&lt;br /&gt;
	list-style-type: lower-roman;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Liststyle param. */&lt;br /&gt;
div.reflist-liststyle-upper-alpha .references {&lt;br /&gt;
	list-style-type: upper-alpha;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
div.reflist-liststyle-upper-roman .references {&lt;br /&gt;
	list-style-type: upper-roman;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
div.reflist-liststyle-lower-alpha .references {&lt;br /&gt;
	list-style-type: lower-alpha;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
div.reflist-liststyle-lower-greek .references {&lt;br /&gt;
	list-style-type: lower-greek;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
div.reflist-liststyle-lower-roman .references {&lt;br /&gt;
	list-style-type: lower-roman;&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Osarius</name></author>
	</entry>
	<entry>
		<id>https://nssportwiki.com/index.php?title=Template:Reflist&amp;diff=76374</id>
		<title>Template:Reflist</title>
		<link rel="alternate" type="text/html" href="https://nssportwiki.com/index.php?title=Template:Reflist&amp;diff=76374"/>
		<updated>2026-07-24T10:50:31Z</updated>

		<summary type="html">&lt;p&gt;Osarius: 1 revision imported&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;templatestyles src=&amp;quot;Reflist/styles.css&amp;quot; /&amp;gt;&amp;lt;div class=&amp;quot;reflist &amp;lt;!--&lt;br /&gt;
--&amp;gt;{{#if:{{{1|}}}{{{colwidth|}}}|reflist-columns references-column-width}} &amp;lt;!--&lt;br /&gt;
--&amp;gt;{{#switch:{{{liststyle|{{{group|}}}}}}|upper-alpha|upper-roman|lower-alpha|lower-greek|lower-roman=reflist-{{{liststyle|{{{group}}}}}}}} &amp;lt;!--&lt;br /&gt;
--&amp;gt;{{#if:{{{1|}}}|{{#iferror:{{#ifexpr: {{{1|1}}} &amp;gt; 1 }}||{{#switch:{{{1|}}}|1=|2=reflist-columns-2|#default=reflist-columns-3}} }}}}&amp;quot; &amp;lt;!-- end class&lt;br /&gt;
--&amp;gt;{{#if: {{{1|}}}&amp;lt;!-- start style --&amp;gt;&lt;br /&gt;
    | {{#iferror: {{#ifexpr: {{{1|1}}} &amp;gt; 1 }} |style=&amp;quot;column-width: {{{1}}};&amp;quot;}}&lt;br /&gt;
    | {{#if: {{{colwidth|}}}|style=&amp;quot;column-width: {{{colwidth}}};&amp;quot;}}&lt;br /&gt;
    }}&amp;gt;&lt;br /&gt;
{{#tag:references|{{{refs|}}}|group={{{group|}}}|responsive={{#if:{{{1|}}}{{{colwidth|}}}|0|1}}}}&amp;lt;/div&amp;gt;{{#invoke:Check for unknown parameters|check|unknown={{main other|[[Category:Pages using reflist with unknown parameters|_VALUE_{{PAGENAME}}]]}}|preview=Page using [[Template:Reflist]] with unknown parameter &amp;quot;_VALUE_&amp;quot;|ignoreblank=y| 1 | colwidth | group | liststyle | refs }}&amp;lt;noinclude&amp;gt;&lt;br /&gt;
{{Documentation}}&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Osarius</name></author>
	</entry>
	<entry>
		<id>https://nssportwiki.com/index.php?title=Template:8TeamBracket-PagePlayoff/doc&amp;diff=76372</id>
		<title>Template:8TeamBracket-PagePlayoff/doc</title>
		<link rel="alternate" type="text/html" href="https://nssportwiki.com/index.php?title=Template:8TeamBracket-PagePlayoff/doc&amp;diff=76372"/>
		<updated>2026-07-24T10:50:31Z</updated>

		<summary type="html">&lt;p&gt;Osarius: 1 revision imported&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Documentation subpage}}&lt;br /&gt;
;Standard paths&lt;br /&gt;
{{#tag:syntaxhighlight|&lt;br /&gt;
{{((}}{{BASEPAGENAME}}&amp;lt;nowiki&amp;gt;&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
{{))}}|lang=&amp;quot;wikitext&amp;quot;}}&lt;br /&gt;
{{{{BASEPAGENAME}}|}}&lt;br /&gt;
&lt;br /&gt;
;Crossing paths&lt;br /&gt;
{{#tag:syntaxhighlight|&lt;br /&gt;
{{((}}{{BASEPAGENAME}}&amp;lt;nowiki&amp;gt;&lt;br /&gt;
| RD1-RD2-cross = yes&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
{{))}}|lang=&amp;quot;wikitext&amp;quot;}}&lt;br /&gt;
{{{{BASEPAGENAME}}|RD1-RD2-cross=yes}}&lt;br /&gt;
&lt;br /&gt;
{{#tag:syntaxhighlight|&lt;br /&gt;
{{((}}{{BASEPAGENAME}}&amp;lt;nowiki&amp;gt;&lt;br /&gt;
| RD2-RD3-cross = yes&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
{{))}}|lang=&amp;quot;wikitext&amp;quot;}}&lt;br /&gt;
{{{{BASEPAGENAME}}|RD2-RD3-cross=yes}}&lt;br /&gt;
&lt;br /&gt;
{{Module:Build bracket/doc|examples=|see also=&lt;br /&gt;
}}&amp;lt;includeonly&amp;gt;{{Sandbox other||&lt;br /&gt;
&amp;lt;!-- CATEGORIES HERE, THANKS --&amp;gt;&lt;br /&gt;
[[Category:8-Team bracket templates]]&lt;br /&gt;
}}&amp;lt;/includeonly&amp;gt;&lt;/div&gt;</summary>
		<author><name>Osarius</name></author>
	</entry>
	<entry>
		<id>https://nssportwiki.com/index.php?title=Template:UICA_association_Novum-castrum&amp;diff=76150</id>
		<title>Template:UICA association Novum-castrum</title>
		<link rel="alternate" type="text/html" href="https://nssportwiki.com/index.php?title=Template:UICA_association_Novum-castrum&amp;diff=76150"/>
		<updated>2026-07-13T17:32:43Z</updated>

		<summary type="html">&lt;p&gt;Osarius: Created page with &amp;quot;{{ {{{1&amp;lt;noinclude&amp;gt;|UICA show association&amp;lt;/noinclude&amp;gt;}}} | association = Novum-castrum | trigram = NVC | association link = Curia Harpasti et Pediludii Imperii | flag = Flag of Novum-castrum.svg | club = {{{club|}}} | club logo-Castrum-sub-Calcis       = Unknown_club_logo.svg }}&amp;lt;noinclude&amp;gt; List of included clubs: * {{UICAclublt|Castrum-sub-Calcis|NVC}} &amp;lt;/noinclude&amp;gt;&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ {{{1&amp;lt;noinclude&amp;gt;|UICA show association&amp;lt;/noinclude&amp;gt;}}}&lt;br /&gt;
| association = Novum-castrum&lt;br /&gt;
| trigram = NVC&lt;br /&gt;
| association link = Curia Harpasti et Pediludii Imperii&lt;br /&gt;
| flag = Flag of Novum-castrum.svg&lt;br /&gt;
| club = {{{club|}}}&lt;br /&gt;
| club logo-Castrum-sub-Calcis       = Unknown_club_logo.svg&lt;br /&gt;
}}&amp;lt;noinclude&amp;gt;&lt;br /&gt;
List of included clubs:&lt;br /&gt;
* {{UICAclublt|Castrum-sub-Calcis|NVC}}&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Osarius</name></author>
	</entry>
	<entry>
		<id>https://nssportwiki.com/index.php?title=Template:UICA_association_Xiaolin&amp;diff=76149</id>
		<title>Template:UICA association Xiaolin</title>
		<link rel="alternate" type="text/html" href="https://nssportwiki.com/index.php?title=Template:UICA_association_Xiaolin&amp;diff=76149"/>
		<updated>2026-07-13T17:32:34Z</updated>

		<summary type="html">&lt;p&gt;Osarius: Created page with &amp;quot;{{ {{{1&amp;lt;noinclude&amp;gt;|UICA show association&amp;lt;/noinclude&amp;gt;}}} | association = Xiaolin | trigram = XIA | association link = Xiaolin Football Council | flag = Flag of Xiaolin.png | club = {{{club|}}} | club logo-Bhedstai Iron         = Unknown_club_logo.svg | club logo-Fouzhan Tigers        = Unknown_club_logo.svg | club logo-Hawkmont Supreme      = Unknown_club_logo.svg }}&amp;lt;noinclude&amp;gt; List of included clubs: * {{UICAclublt|Bhedstai Iron|XIA}} * {{UICAclublt|Fouzhan Tigers|XIA}}...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ {{{1&amp;lt;noinclude&amp;gt;|UICA show association&amp;lt;/noinclude&amp;gt;}}}&lt;br /&gt;
| association = Xiaolin&lt;br /&gt;
| trigram = XIA&lt;br /&gt;
| association link = Xiaolin Football Council&lt;br /&gt;
| flag = Flag of Xiaolin.png&lt;br /&gt;
| club = {{{club|}}}&lt;br /&gt;
| club logo-Bhedstai Iron         = Unknown_club_logo.svg&lt;br /&gt;
| club logo-Fouzhan Tigers        = Unknown_club_logo.svg&lt;br /&gt;
| club logo-Hawkmont Supreme      = Unknown_club_logo.svg&lt;br /&gt;
}}&amp;lt;noinclude&amp;gt;&lt;br /&gt;
List of included clubs:&lt;br /&gt;
* {{UICAclublt|Bhedstai Iron|XIA}}&lt;br /&gt;
* {{UICAclublt|Fouzhan Tigers|XIA}}&lt;br /&gt;
* {{UICAclublt|Hawkmont Supreme|XIA}}&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Osarius</name></author>
	</entry>
	<entry>
		<id>https://nssportwiki.com/index.php?title=Template:UICA_association_Tobar_Gainimh&amp;diff=76148</id>
		<title>Template:UICA association Tobar Gainimh</title>
		<link rel="alternate" type="text/html" href="https://nssportwiki.com/index.php?title=Template:UICA_association_Tobar_Gainimh&amp;diff=76148"/>
		<updated>2026-07-13T17:32:07Z</updated>

		<summary type="html">&lt;p&gt;Osarius: Created page with &amp;quot;{{ {{{1&amp;lt;noinclude&amp;gt;|UICA show association&amp;lt;/noinclude&amp;gt;}}} | association = Tobar Gainimh | trigram = TBG | association link = Ard-Chumann Caide den Ghaineamh | flag = Flag of Tobar Gainimh.svg | club = {{{club|}}} | club logo-Cnoc Mór Cromáin         = Unknown_club_logo.svg }}&amp;lt;noinclude&amp;gt; List of included clubs: * {{UICAclublt|Cnoc Mór Cromáin|TBG}} &amp;lt;/noinclude&amp;gt;&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ {{{1&amp;lt;noinclude&amp;gt;|UICA show association&amp;lt;/noinclude&amp;gt;}}}&lt;br /&gt;
| association = Tobar Gainimh&lt;br /&gt;
| trigram = TBG&lt;br /&gt;
| association link = Ard-Chumann Caide den Ghaineamh&lt;br /&gt;
| flag = Flag of Tobar Gainimh.svg&lt;br /&gt;
| club = {{{club|}}}&lt;br /&gt;
| club logo-Cnoc Mór Cromáin         = Unknown_club_logo.svg&lt;br /&gt;
}}&amp;lt;noinclude&amp;gt;&lt;br /&gt;
List of included clubs:&lt;br /&gt;
* {{UICAclublt|Cnoc Mór Cromáin|TBG}}&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Osarius</name></author>
	</entry>
	<entry>
		<id>https://nssportwiki.com/index.php?title=Template:UICA_association_XIA&amp;diff=76147</id>
		<title>Template:UICA association XIA</title>
		<link rel="alternate" type="text/html" href="https://nssportwiki.com/index.php?title=Template:UICA_association_XIA&amp;diff=76147"/>
		<updated>2026-07-13T17:31:43Z</updated>

		<summary type="html">&lt;p&gt;Osarius: Redirected page to Template:UICA association Xiaolin&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Template:UICA association Xiaolin]]&lt;/div&gt;</summary>
		<author><name>Osarius</name></author>
	</entry>
	<entry>
		<id>https://nssportwiki.com/index.php?title=Template:UICA_association_TBG&amp;diff=76146</id>
		<title>Template:UICA association TBG</title>
		<link rel="alternate" type="text/html" href="https://nssportwiki.com/index.php?title=Template:UICA_association_TBG&amp;diff=76146"/>
		<updated>2026-07-13T17:31:29Z</updated>

		<summary type="html">&lt;p&gt;Osarius: Redirected page to Template:UICA association Tobar Gainimh&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Template:UICA association Tobar Gainimh]]&lt;/div&gt;</summary>
		<author><name>Osarius</name></author>
	</entry>
	<entry>
		<id>https://nssportwiki.com/index.php?title=Template:UICA_association_NVC&amp;diff=76145</id>
		<title>Template:UICA association NVC</title>
		<link rel="alternate" type="text/html" href="https://nssportwiki.com/index.php?title=Template:UICA_association_NVC&amp;diff=76145"/>
		<updated>2026-07-13T17:30:34Z</updated>

		<summary type="html">&lt;p&gt;Osarius: Redirected page to Template:UICA association Novum-castrum&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Template:UICA association Novum-castrum]]&lt;/div&gt;</summary>
		<author><name>Osarius</name></author>
	</entry>
	<entry>
		<id>https://nssportwiki.com/index.php?title=Template:UICA_association_Marmaladaica&amp;diff=76144</id>
		<title>Template:UICA association Marmaladaica</title>
		<link rel="alternate" type="text/html" href="https://nssportwiki.com/index.php?title=Template:UICA_association_Marmaladaica&amp;diff=76144"/>
		<updated>2026-07-13T17:29:39Z</updated>

		<summary type="html">&lt;p&gt;Osarius: Created page with &amp;quot;{{ {{{1&amp;lt;noinclude&amp;gt;|UICA show association&amp;lt;/noinclude&amp;gt;}}} | association = Marmaladaica | trigram = MRM | association link = Marmaladaican Soccer Friendship Council | flag = MarmaladaicaFlag.svg | club = {{{club|}}} | club logo-Cydonia Bears         = Unknown_club_logo.svg }}&amp;lt;noinclude&amp;gt; List of included clubs: * {{UICAclublt|Cydonia Bears|MRM}} &amp;lt;/noinclude&amp;gt;&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ {{{1&amp;lt;noinclude&amp;gt;|UICA show association&amp;lt;/noinclude&amp;gt;}}}&lt;br /&gt;
| association = Marmaladaica&lt;br /&gt;
| trigram = MRM&lt;br /&gt;
| association link = Marmaladaican Soccer Friendship Council&lt;br /&gt;
| flag = MarmaladaicaFlag.svg&lt;br /&gt;
| club = {{{club|}}}&lt;br /&gt;
| club logo-Cydonia Bears         = Unknown_club_logo.svg&lt;br /&gt;
}}&amp;lt;noinclude&amp;gt;&lt;br /&gt;
List of included clubs:&lt;br /&gt;
* {{UICAclublt|Cydonia Bears|MRM}}&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Osarius</name></author>
	</entry>
	<entry>
		<id>https://nssportwiki.com/index.php?title=Template:UICA_association_MRM&amp;diff=76143</id>
		<title>Template:UICA association MRM</title>
		<link rel="alternate" type="text/html" href="https://nssportwiki.com/index.php?title=Template:UICA_association_MRM&amp;diff=76143"/>
		<updated>2026-07-13T17:28:23Z</updated>

		<summary type="html">&lt;p&gt;Osarius: Redirected page to Template:UICA association Marmaladaica&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Template:UICA association Marmaladaica]]&lt;/div&gt;</summary>
		<author><name>Osarius</name></author>
	</entry>
	<entry>
		<id>https://nssportwiki.com/index.php?title=Template:UICA_association_Kryosis&amp;diff=76141</id>
		<title>Template:UICA association Kryosis</title>
		<link rel="alternate" type="text/html" href="https://nssportwiki.com/index.php?title=Template:UICA_association_Kryosis&amp;diff=76141"/>
		<updated>2026-07-13T17:27:39Z</updated>

		<summary type="html">&lt;p&gt;Osarius: Created page with &amp;quot;{{ {{{1&amp;lt;noinclude&amp;gt;|UICA show association&amp;lt;/noinclude&amp;gt;}}} | association = Kryosis | trigram = KRS | association link = Revolutionary Imperial Soccer Enterprise | flag = Flag of Kryosis.png | club = {{{club|}}} | club logo-CF Alcázorro         = Unknown_club_logo.svg | club logo-Raiel Rockets        = Unknown_club_logo.svg | club logo-Revolo Rapids        = Unknown_club_logo.svg }}&amp;lt;noinclude&amp;gt; List of included clubs: * {{UICAclublt|CF Alcázorro|KRS}} * {{UICAclublt|Raiel R...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ {{{1&amp;lt;noinclude&amp;gt;|UICA show association&amp;lt;/noinclude&amp;gt;}}}&lt;br /&gt;
| association = Kryosis&lt;br /&gt;
| trigram = KRS&lt;br /&gt;
| association link = Revolutionary Imperial Soccer Enterprise&lt;br /&gt;
| flag = Flag of Kryosis.png&lt;br /&gt;
| club = {{{club|}}}&lt;br /&gt;
| club logo-CF Alcázorro         = Unknown_club_logo.svg&lt;br /&gt;
| club logo-Raiel Rockets        = Unknown_club_logo.svg&lt;br /&gt;
| club logo-Revolo Rapids        = Unknown_club_logo.svg&lt;br /&gt;
}}&amp;lt;noinclude&amp;gt;&lt;br /&gt;
List of included clubs:&lt;br /&gt;
* {{UICAclublt|CF Alcázorro|KRS}}&lt;br /&gt;
* {{UICAclublt|Raiel Rockets|KRS}}&lt;br /&gt;
* {{UICAclublt|Revolo Rapids|KRS}}&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Osarius</name></author>
	</entry>
	<entry>
		<id>https://nssportwiki.com/index.php?title=Template:UICA_association_KRS&amp;diff=76140</id>
		<title>Template:UICA association KRS</title>
		<link rel="alternate" type="text/html" href="https://nssportwiki.com/index.php?title=Template:UICA_association_KRS&amp;diff=76140"/>
		<updated>2026-07-13T17:27:28Z</updated>

		<summary type="html">&lt;p&gt;Osarius: Redirected page to Template:UICA association Kryosis&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Template:UICA association Kryosis]]&lt;/div&gt;</summary>
		<author><name>Osarius</name></author>
	</entry>
	<entry>
		<id>https://nssportwiki.com/index.php?title=Template:UICA_association_Kage_no_Ryouiki&amp;diff=76139</id>
		<title>Template:UICA association Kage no Ryouiki</title>
		<link rel="alternate" type="text/html" href="https://nssportwiki.com/index.php?title=Template:UICA_association_Kage_no_Ryouiki&amp;diff=76139"/>
		<updated>2026-07-13T17:26:42Z</updated>

		<summary type="html">&lt;p&gt;Osarius: Created page with &amp;quot;{{ {{{1&amp;lt;noinclude&amp;gt;|UICA show association&amp;lt;/noinclude&amp;gt;}}} | association = Kage no Ryouiki | trigram = KNR | association link = Abyssal Council of Yokai Football | flag = Flag of Kage no Ryouiki.svg | club = {{{club|}}} | club logo-Yamiku Void           = Unknown_club_logo.svg | club logo-Malebolge Butchers    = Unknown_club_logo.svg | club logo-Chinoike Bloodhounds  = Unknown_club_logo.svg | club logo-Ganzir Ironclad       = Unknown_club_logo.svg | club logo-Naraka Frost G...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ {{{1&amp;lt;noinclude&amp;gt;|UICA show association&amp;lt;/noinclude&amp;gt;}}}&lt;br /&gt;
| association = Kage no Ryouiki&lt;br /&gt;
| trigram = KNR&lt;br /&gt;
| association link = Abyssal Council of Yokai Football&lt;br /&gt;
| flag = Flag of Kage no Ryouiki.svg&lt;br /&gt;
| club = {{{club|}}}&lt;br /&gt;
| club logo-Yamiku Void           = Unknown_club_logo.svg&lt;br /&gt;
| club logo-Malebolge Butchers    = Unknown_club_logo.svg&lt;br /&gt;
| club logo-Chinoike Bloodhounds  = Unknown_club_logo.svg&lt;br /&gt;
| club logo-Ganzir Ironclad       = Unknown_club_logo.svg&lt;br /&gt;
| club logo-Naraka Frost Giants   = Unknown_club_logo.svg&lt;br /&gt;
| club logo-Shura Blitz           = Unknown_club_logo.svg&lt;br /&gt;
| club logo-Sanzu Wave            = Unknown_club_logo.svg&lt;br /&gt;
| club logo-Gashadokuro Breakers  = Unknown_club_logo.svg&lt;br /&gt;
}}&amp;lt;noinclude&amp;gt;&lt;br /&gt;
List of included clubs:&lt;br /&gt;
* {{UICAclublt|Yamiku Void|KNR}}&lt;br /&gt;
* {{UICAclublt|Malebolge Butchers|KNR}}&lt;br /&gt;
* {{UICAclublt|Chinoike Bloodhounds|KNR}}&lt;br /&gt;
* {{UICAclublt|Ganzir Ironclad|KNR}}&lt;br /&gt;
* {{UICAclublt|Naraka Frost Giants|KNR}}&lt;br /&gt;
* {{UICAclublt|Shura Blitz|KNR}}&lt;br /&gt;
* {{UICAclublt|Sanzu Wave|KNR}}&lt;br /&gt;
* {{UICAclublt|Gashadokuro Breakers|KNR}}&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Osarius</name></author>
	</entry>
	<entry>
		<id>https://nssportwiki.com/index.php?title=Template:UICA_association_KNR&amp;diff=76138</id>
		<title>Template:UICA association KNR</title>
		<link rel="alternate" type="text/html" href="https://nssportwiki.com/index.php?title=Template:UICA_association_KNR&amp;diff=76138"/>
		<updated>2026-07-13T17:26:22Z</updated>

		<summary type="html">&lt;p&gt;Osarius: Redirected page to Template:UICA association Kage no Ryouiki&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Template:UICA association Kage no Ryouiki]]&lt;/div&gt;</summary>
		<author><name>Osarius</name></author>
	</entry>
	<entry>
		<id>https://nssportwiki.com/index.php?title=Template:UICA_association_Erdingham&amp;diff=76137</id>
		<title>Template:UICA association Erdingham</title>
		<link rel="alternate" type="text/html" href="https://nssportwiki.com/index.php?title=Template:UICA_association_Erdingham&amp;diff=76137"/>
		<updated>2026-07-13T17:26:02Z</updated>

		<summary type="html">&lt;p&gt;Osarius: Created page with &amp;quot;{{ {{{1&amp;lt;noinclude&amp;gt;|UICA show association&amp;lt;/noinclude&amp;gt;}}} | association = Erdingham | trigram = ERD | association link = Erdingham National Football Board | flag = Flag of Erdingham.svg | club = {{{club|}}} | club logo-San Edmundo         = Unknown_club_logo.svg }}&amp;lt;noinclude&amp;gt; List of included clubs: * {{UICAclublt|San Edmundo|ERD}} &amp;lt;/noinclude&amp;gt;&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ {{{1&amp;lt;noinclude&amp;gt;|UICA show association&amp;lt;/noinclude&amp;gt;}}}&lt;br /&gt;
| association = Erdingham&lt;br /&gt;
| trigram = ERD&lt;br /&gt;
| association link = Erdingham National Football Board&lt;br /&gt;
| flag = Flag of Erdingham.svg&lt;br /&gt;
| club = {{{club|}}}&lt;br /&gt;
| club logo-San Edmundo         = Unknown_club_logo.svg&lt;br /&gt;
}}&amp;lt;noinclude&amp;gt;&lt;br /&gt;
List of included clubs:&lt;br /&gt;
* {{UICAclublt|San Edmundo|ERD}}&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Osarius</name></author>
	</entry>
	<entry>
		<id>https://nssportwiki.com/index.php?title=Template:UICA_association_Eristicea&amp;diff=76136</id>
		<title>Template:UICA association Eristicea</title>
		<link rel="alternate" type="text/html" href="https://nssportwiki.com/index.php?title=Template:UICA_association_Eristicea&amp;diff=76136"/>
		<updated>2026-07-13T17:25:36Z</updated>

		<summary type="html">&lt;p&gt;Osarius: Created page with &amp;quot;{{ {{{1&amp;lt;noinclude&amp;gt;|UICA show association&amp;lt;/noinclude&amp;gt;}}} | association = Eristicea | trigram = ERS | association link = Eristicean Football Syndicate | flag = Flag of Eristicea.png | club = {{{club|}}} | club logo-AED Ajna        = Unknown_club_logo.svg | club logo-NP Ajna         = Unknown_club_logo.svg | club logo-PAOD Ajna       = Unknown_club_logo.svg }}&amp;lt;noinclude&amp;gt; List of included clubs: * {{UICAclublt|AED Ajna|ERS}} * {{UICAclublt|NP Ajna|ERS}} * {{UICAclublt|PAOD A...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ {{{1&amp;lt;noinclude&amp;gt;|UICA show association&amp;lt;/noinclude&amp;gt;}}}&lt;br /&gt;
| association = Eristicea&lt;br /&gt;
| trigram = ERS&lt;br /&gt;
| association link = Eristicean Football Syndicate&lt;br /&gt;
| flag = Flag of Eristicea.png&lt;br /&gt;
| club = {{{club|}}}&lt;br /&gt;
| club logo-AED Ajna        = Unknown_club_logo.svg&lt;br /&gt;
| club logo-NP Ajna         = Unknown_club_logo.svg&lt;br /&gt;
| club logo-PAOD Ajna       = Unknown_club_logo.svg&lt;br /&gt;
}}&amp;lt;noinclude&amp;gt;&lt;br /&gt;
List of included clubs:&lt;br /&gt;
* {{UICAclublt|AED Ajna|ERS}}&lt;br /&gt;
* {{UICAclublt|NP Ajna|ERS}}&lt;br /&gt;
* {{UICAclublt|PAOD Ajna|ERS}}&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Osarius</name></author>
	</entry>
	<entry>
		<id>https://nssportwiki.com/index.php?title=Template:UICA_association_Diwedd_Ardal&amp;diff=76135</id>
		<title>Template:UICA association Diwedd Ardal</title>
		<link rel="alternate" type="text/html" href="https://nssportwiki.com/index.php?title=Template:UICA_association_Diwedd_Ardal&amp;diff=76135"/>
		<updated>2026-07-13T17:24:51Z</updated>

		<summary type="html">&lt;p&gt;Osarius: Created page with &amp;quot;{{ {{{1&amp;lt;noinclude&amp;gt;|UICA show association&amp;lt;/noinclude&amp;gt;}}} | association = Diwedd Ardal | trigram = DWA | association link = Goruchel Gymdeithas Bêl-droed Ardaly | flag = Flag of Diwedd Ardal.svg | club = {{{club|}}} | club logo-Llwynog a Gŵydd          = Unknown_club_logo.svg }}&amp;lt;noinclude&amp;gt; List of included clubs: * {{UICAclublt|Llwynog a Gŵydd|DWA}} &amp;lt;/noinclude&amp;gt;&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ {{{1&amp;lt;noinclude&amp;gt;|UICA show association&amp;lt;/noinclude&amp;gt;}}}&lt;br /&gt;
| association = Diwedd Ardal&lt;br /&gt;
| trigram = DWA&lt;br /&gt;
| association link = Goruchel Gymdeithas Bêl-droed Ardaly&lt;br /&gt;
| flag = Flag of Diwedd Ardal.svg&lt;br /&gt;
| club = {{{club|}}}&lt;br /&gt;
| club logo-Llwynog a Gŵydd          = Unknown_club_logo.svg&lt;br /&gt;
}}&amp;lt;noinclude&amp;gt;&lt;br /&gt;
List of included clubs:&lt;br /&gt;
* {{UICAclublt|Llwynog a Gŵydd|DWA}}&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Osarius</name></author>
	</entry>
	<entry>
		<id>https://nssportwiki.com/index.php?title=Template:UICA_association_ERD&amp;diff=76134</id>
		<title>Template:UICA association ERD</title>
		<link rel="alternate" type="text/html" href="https://nssportwiki.com/index.php?title=Template:UICA_association_ERD&amp;diff=76134"/>
		<updated>2026-07-13T17:24:39Z</updated>

		<summary type="html">&lt;p&gt;Osarius: Redirected page to Template:UICA association Erdingham&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Template:UICA association Erdingham]]&lt;/div&gt;</summary>
		<author><name>Osarius</name></author>
	</entry>
	<entry>
		<id>https://nssportwiki.com/index.php?title=Template:UICA_association_ERS&amp;diff=76133</id>
		<title>Template:UICA association ERS</title>
		<link rel="alternate" type="text/html" href="https://nssportwiki.com/index.php?title=Template:UICA_association_ERS&amp;diff=76133"/>
		<updated>2026-07-13T17:24:12Z</updated>

		<summary type="html">&lt;p&gt;Osarius: Redirected page to Template:UICA association Eristicea&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Template:UICA association Eristicea]]&lt;/div&gt;</summary>
		<author><name>Osarius</name></author>
	</entry>
	<entry>
		<id>https://nssportwiki.com/index.php?title=Template:UICA_association_DWA&amp;diff=76132</id>
		<title>Template:UICA association DWA</title>
		<link rel="alternate" type="text/html" href="https://nssportwiki.com/index.php?title=Template:UICA_association_DWA&amp;diff=76132"/>
		<updated>2026-07-13T17:23:15Z</updated>

		<summary type="html">&lt;p&gt;Osarius: Redirected page to Template:UICA association Diwedd Ardal&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Template:UICA association Diwedd Ardal]]&lt;/div&gt;</summary>
		<author><name>Osarius</name></author>
	</entry>
	<entry>
		<id>https://nssportwiki.com/index.php?title=Template:UICA_association_Limey_George&amp;diff=76126</id>
		<title>Template:UICA association Limey George</title>
		<link rel="alternate" type="text/html" href="https://nssportwiki.com/index.php?title=Template:UICA_association_Limey_George&amp;diff=76126"/>
		<updated>2026-07-13T14:34:23Z</updated>

		<summary type="html">&lt;p&gt;Osarius: Created page with &amp;quot;{{ {{{1&amp;lt;noinclude&amp;gt;|UICA show association&amp;lt;/noinclude&amp;gt;}}} | association = Limey George | trigram = LMG | association link = Limey Association Football Federation | flag = Flag of Limey George.svg | club = {{{club|}}} &amp;lt;!-- Limey League --&amp;gt; | club logo-Bermont Town          = Unknown club logo.svg | club logo-Georgstead Albion     = Unknown club logo.svg | club logo-Haestacre Combination = Unknown club logo.svg | club logo-Jameshurst Wanderers  = Unknown club logo.svg | club...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ {{{1&amp;lt;noinclude&amp;gt;|UICA show association&amp;lt;/noinclude&amp;gt;}}}&lt;br /&gt;
| association = Limey George&lt;br /&gt;
| trigram = LMG&lt;br /&gt;
| association link = Limey Association Football Federation&lt;br /&gt;
| flag = Flag of Limey George.svg&lt;br /&gt;
| club = {{{club|}}}&lt;br /&gt;
&amp;lt;!-- Limey League --&amp;gt;&lt;br /&gt;
| club logo-Bermont Town          = Unknown club logo.svg&lt;br /&gt;
| club logo-Georgstead Albion     = Unknown club logo.svg&lt;br /&gt;
| club logo-Haestacre Combination = Unknown club logo.svg&lt;br /&gt;
| club logo-Jameshurst Wanderers  = Unknown club logo.svg&lt;br /&gt;
| club logo-Morristone United     = Unknown club logo.svg&lt;br /&gt;
| club logo-Sandthorpe Athletic   = Unknown club logo.svg&lt;br /&gt;
| club logo-Tuistby Orchard       = Unknown club logo.svg&lt;br /&gt;
| club logo-Valthwaite Town       = Unknown club logo.svg&lt;br /&gt;
| club logo-Rævborg FC            = Unknown club logo.svg&lt;br /&gt;
}}&amp;lt;noinclude&amp;gt;&lt;br /&gt;
List of included clubs:&lt;br /&gt;
* {{UICAclublt|Bermont Town|LMG}}&lt;br /&gt;
* {{UICAclublt|Georgstead Albion|LMG}}&lt;br /&gt;
* {{UICAclublt|Haestacre Combination|LMG}}&lt;br /&gt;
* {{UICAclublt|Jameshurst Wanderers|LMG}}&lt;br /&gt;
* {{UICAclublt|Morristone United|LMG}}&lt;br /&gt;
* {{UICAclublt|Sandthorpe Athletic|LMG}}&lt;br /&gt;
* {{UICAclublt|Tuistby Orchard|LMG}}&lt;br /&gt;
* {{UICAclublt|Valthwaite Town|LMG}}&lt;br /&gt;
* {{UICAclublt|Rævborg FC|LMG}}&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Osarius</name></author>
	</entry>
	<entry>
		<id>https://nssportwiki.com/index.php?title=Template:UICA_association_Limey_Isles&amp;diff=76125</id>
		<title>Template:UICA association Limey Isles</title>
		<link rel="alternate" type="text/html" href="https://nssportwiki.com/index.php?title=Template:UICA_association_Limey_Isles&amp;diff=76125"/>
		<updated>2026-07-13T14:30:24Z</updated>

		<summary type="html">&lt;p&gt;Osarius: Redirected page to Template:UICA association Limey George&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Template:UICA association Limey George]]&lt;/div&gt;</summary>
		<author><name>Osarius</name></author>
	</entry>
	<entry>
		<id>https://nssportwiki.com/index.php?title=Template:UICA_association_LMG&amp;diff=76124</id>
		<title>Template:UICA association LMG</title>
		<link rel="alternate" type="text/html" href="https://nssportwiki.com/index.php?title=Template:UICA_association_LMG&amp;diff=76124"/>
		<updated>2026-07-13T14:29:39Z</updated>

		<summary type="html">&lt;p&gt;Osarius: Redirected page to Template:UICA association Limey George&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Template:UICA association Limey George]]&lt;/div&gt;</summary>
		<author><name>Osarius</name></author>
	</entry>
	<entry>
		<id>https://nssportwiki.com/index.php?title=Template:UICA_association_Callistea&amp;diff=76117</id>
		<title>Template:UICA association Callistea</title>
		<link rel="alternate" type="text/html" href="https://nssportwiki.com/index.php?title=Template:UICA_association_Callistea&amp;diff=76117"/>
		<updated>2026-07-11T23:31:36Z</updated>

		<summary type="html">&lt;p&gt;Osarius: Created page with &amp;quot;{{ {{{1&amp;lt;noinclude&amp;gt;|UICA show association&amp;lt;/noinclude&amp;gt;}}} | association = Callistea | trigram = CLS | association link = Grand Royal Association of Cytherean Episkyros | flag = Flag of Callistea.png | club = {{{club|}}} &amp;lt;!-- Radiant League --&amp;gt; | club logo-Asteres Dendera         = Unknown_club_logo.svg | club logo-Aurea Stargleams        = Unknown_club_logo.svg | club logo-Cloacina Peristeria     = Unknown_club_logo.svg | club logo-Cythera Dolphins        = Unknown_club_lo...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ {{{1&amp;lt;noinclude&amp;gt;|UICA show association&amp;lt;/noinclude&amp;gt;}}}&lt;br /&gt;
| association = Callistea&lt;br /&gt;
| trigram = CLS&lt;br /&gt;
| association link = Grand Royal Association of Cytherean Episkyros&lt;br /&gt;
| flag = Flag of Callistea.png&lt;br /&gt;
| club = {{{club|}}}&lt;br /&gt;
&amp;lt;!-- Radiant League --&amp;gt;&lt;br /&gt;
| club logo-Asteres Dendera         = Unknown_club_logo.svg&lt;br /&gt;
| club logo-Aurea Stargleams        = Unknown_club_logo.svg&lt;br /&gt;
| club logo-Cloacina Peristeria     = Unknown_club_logo.svg&lt;br /&gt;
| club logo-Cythera Dolphins        = Unknown_club_logo.svg&lt;br /&gt;
| club logo-Cythera Thorns          = Unknown_club_logo.svg&lt;br /&gt;
| club logo-Daughters of Tahira     = Unknown_club_logo.svg&lt;br /&gt;
| club logo-Kallista Sunbeams       = Unknown_club_logo.svg&lt;br /&gt;
| club logo-Lakeside Serenity       = Unknown_club_logo.svg&lt;br /&gt;
| club logo-Libertina Splendour     = Unknown_club_logo.svg&lt;br /&gt;
| club logo-Murcia Swans            = Unknown_club_logo.svg&lt;br /&gt;
| club logo-Paphos Guardians        = Unknown_club_logo.svg&lt;br /&gt;
| club logo-Serdica Ancients        = Unknown_club_logo.svg&lt;br /&gt;
&amp;lt;!-- Non League --&amp;gt;&lt;br /&gt;
| club logo-Kastro-Alepou Guardians = Unknown_club_logo.svg&lt;br /&gt;
}}&amp;lt;noinclude&amp;gt;&lt;br /&gt;
List of included clubs:&lt;br /&gt;
* {{UICAclublt|Asteres Dendera|CLS}}&lt;br /&gt;
* {{UICAclublt|Aurea Stargleams|CLS}}&lt;br /&gt;
* {{UICAclublt|Cloacina Peristeria|CLS}}&lt;br /&gt;
* {{UICAclublt|Cythera Dolphins|CLS}}&lt;br /&gt;
* {{UICAclublt|Cythera Thorns|CLS}}&lt;br /&gt;
* {{UICAclublt|Daughters of Tahira|CLS}}&lt;br /&gt;
* {{UICAclublt|Kallista Sunbeams|CLS}}&lt;br /&gt;
* {{UICAclublt|Lakeside Serenity|CLS}}&lt;br /&gt;
* {{UICAclublt|Libertina Splendour|CLS}}&lt;br /&gt;
* {{UICAclublt|Murcia Swans|CLS}}&lt;br /&gt;
* {{UICAclublt|Paphos Guardians|CLS}}&lt;br /&gt;
* {{UICAclublt|Serdica Ancients|CLS}}&lt;br /&gt;
* {{UICAclublt|Kastro-Alepou Guardians|CLS}}&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Osarius</name></author>
	</entry>
	<entry>
		<id>https://nssportwiki.com/index.php?title=Template:UICA_association_CLS&amp;diff=76116</id>
		<title>Template:UICA association CLS</title>
		<link rel="alternate" type="text/html" href="https://nssportwiki.com/index.php?title=Template:UICA_association_CLS&amp;diff=76116"/>
		<updated>2026-07-11T23:31:30Z</updated>

		<summary type="html">&lt;p&gt;Osarius: Redirected page to Template:UICA association Callistea&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Template:UICA association Callistea]]&lt;/div&gt;</summary>
		<author><name>Osarius</name></author>
	</entry>
	<entry>
		<id>https://nssportwiki.com/index.php?title=Template:UICA_association_Aquillian&amp;diff=76115</id>
		<title>Template:UICA association Aquillian</title>
		<link rel="alternate" type="text/html" href="https://nssportwiki.com/index.php?title=Template:UICA_association_Aquillian&amp;diff=76115"/>
		<updated>2026-07-11T23:01:03Z</updated>

		<summary type="html">&lt;p&gt;Osarius: Created page with &amp;quot;{{ {{{1&amp;lt;noinclude&amp;gt;|UICA show association&amp;lt;/noinclude&amp;gt;}}} | association = Aquillian | trigram = AQL | association link = Asociación de Fútbol Aquilliano | flag = Flag of Aquillian.png | club = {{{club|}}} | club logo-Bahia Rojo          = Unknown_club_logo.svg | club logo-Genesia             = Unknown_club_logo.svg | club logo-Real Seaga          = Unknown_club_logo.svg }}&amp;lt;noinclude&amp;gt; List of included clubs: * {{UICAclublt|Bahia Rojo|AQL}} * {{UICAclublt|Genesia|AQL}} * {...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ {{{1&amp;lt;noinclude&amp;gt;|UICA show association&amp;lt;/noinclude&amp;gt;}}}&lt;br /&gt;
| association = Aquillian&lt;br /&gt;
| trigram = AQL&lt;br /&gt;
| association link = Asociación de Fútbol Aquilliano&lt;br /&gt;
| flag = Flag of Aquillian.png&lt;br /&gt;
| club = {{{club|}}}&lt;br /&gt;
| club logo-Bahia Rojo          = Unknown_club_logo.svg&lt;br /&gt;
| club logo-Genesia             = Unknown_club_logo.svg&lt;br /&gt;
| club logo-Real Seaga          = Unknown_club_logo.svg&lt;br /&gt;
}}&amp;lt;noinclude&amp;gt;&lt;br /&gt;
List of included clubs:&lt;br /&gt;
* {{UICAclublt|Bahia Rojo|AQL}}&lt;br /&gt;
* {{UICAclublt|Genesia|AQL}}&lt;br /&gt;
* {{UICAclublt|Real Seaga|AQL}}&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Osarius</name></author>
	</entry>
	<entry>
		<id>https://nssportwiki.com/index.php?title=Template:UICA_association_AQL&amp;diff=76114</id>
		<title>Template:UICA association AQL</title>
		<link rel="alternate" type="text/html" href="https://nssportwiki.com/index.php?title=Template:UICA_association_AQL&amp;diff=76114"/>
		<updated>2026-07-11T22:55:50Z</updated>

		<summary type="html">&lt;p&gt;Osarius: Redirected page to Template:UICA association Aquillian&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Template:UICA association Aquillian]]&lt;/div&gt;</summary>
		<author><name>Osarius</name></author>
	</entry>
	<entry>
		<id>https://nssportwiki.com/index.php?title=Template:UICA_association_CBR&amp;diff=76113</id>
		<title>Template:UICA association CBR</title>
		<link rel="alternate" type="text/html" href="https://nssportwiki.com/index.php?title=Template:UICA_association_CBR&amp;diff=76113"/>
		<updated>2026-07-11T22:55:17Z</updated>

		<summary type="html">&lt;p&gt;Osarius: Redirected page to Template:UICA association Cobrio&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Template:UICA association Cobrio]]&lt;/div&gt;</summary>
		<author><name>Osarius</name></author>
	</entry>
	<entry>
		<id>https://nssportwiki.com/index.php?title=Template:UICA_association_Cobrio&amp;diff=76112</id>
		<title>Template:UICA association Cobrio</title>
		<link rel="alternate" type="text/html" href="https://nssportwiki.com/index.php?title=Template:UICA_association_Cobrio&amp;diff=76112"/>
		<updated>2026-07-11T22:54:28Z</updated>

		<summary type="html">&lt;p&gt;Osarius: Created page with &amp;quot;{{ {{{1&amp;lt;noinclude&amp;gt;|UICA show association&amp;lt;/noinclude&amp;gt;}}} | association = Cobrio | trigram = CBR | association link = Cobre Football Federation | flag = Flag of Cobrio.png | club = {{{club|}}} | club logo-Dynapolis United         = Unknown_club_logo.svg | club logo-Jraxville FC             = Unknown_club_logo.svg | club logo-Negus Koromanti          = Unknown_club_logo.svg }}&amp;lt;noinclude&amp;gt; List of included clubs: * {{UICAclublt|Dynapolis United|CBR}} * {{UICAclublt|Jraxville...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ {{{1&amp;lt;noinclude&amp;gt;|UICA show association&amp;lt;/noinclude&amp;gt;}}}&lt;br /&gt;
| association = Cobrio&lt;br /&gt;
| trigram = CBR&lt;br /&gt;
| association link = Cobre Football Federation&lt;br /&gt;
| flag = Flag of Cobrio.png&lt;br /&gt;
| club = {{{club|}}}&lt;br /&gt;
| club logo-Dynapolis United         = Unknown_club_logo.svg&lt;br /&gt;
| club logo-Jraxville FC             = Unknown_club_logo.svg&lt;br /&gt;
| club logo-Negus Koromanti          = Unknown_club_logo.svg&lt;br /&gt;
}}&amp;lt;noinclude&amp;gt;&lt;br /&gt;
List of included clubs:&lt;br /&gt;
* {{UICAclublt|Dynapolis United|CBR}}&lt;br /&gt;
* {{UICAclublt|Jraxville FC|CBR}}&lt;br /&gt;
* {{UICAclublt|Negus Koromanti|CBR}}&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Osarius</name></author>
	</entry>
</feed>