<!doctype html>
<html>
<head>
<meta name="chromevox" content-script="no">
<title>World Cup 2026 Prediction</title>
<link rel="stylesheet" href="https://fonts.googleapis.com/icon?family=Material+Icons" nonce="tudW1l4DNLgaJaosEsYCDw"><link rel="stylesheet" href="/static/macros/client/css/2208734863-mae_html_css_ltr.css">
<script type="text/javascript" src="/static/macros/client/js/1964698814-warden_bin_i18n_warden.js"></script>
</head>
<body>
<table id="warning-bar-table" class="full_size" cellspacing="0" cellpadding="0"><tr><td><div id="warning" class="warning-bar"></div></td></tr><tr><td style="height: 100%"><iframe id="sandboxFrame" title="World Cup 2026 Prediction" allow="accelerometer *; ambient-light-sensor *; autoplay *; clipboard-read *; clipboard-write *; encrypted-media *; fullscreen *; geolocation *; gyroscope *; local-network-access *; magnetometer *; midi *; payment *; picture-in-picture *; screen-wake-lock *; speaker *; sync-xhr *; vibrate *; vr *; web-share *" sandbox="allow-downloads allow-forms allow-modals allow-popups allow-popups-to-escape-sandbox allow-same-origin allow-scripts allow-top-navigation-by-user-activation allow-storage-access-by-user-activation">
</iframe>
</td></tr></table><script nonce="mYvuqYz0n5P3u9NwbTNDqw">
(function() {
var el = document.getElementById('sandboxFrame');
el.onload = function() {
goog.script.init("\x7b\x22functionNames\x22:\x5b\x22doGet\x22,\x22doPost\x22,\x22jsonResponse\x22,\x22getInitialData\x22,\x22submitPhase1Entry\x22,\x22generateKnockoutBracket\x22,\x22getLeaderboard\x22,\x22getEntryDetail\x22,\x22testGroupTeams\x22,\x22testInitialData\x22,\x22testGenerateKnockoutFromLastEntry\x22,\x22testCreatePdfFromLastEntry\x22,\x22testEmailLastEntryPdf\x22,\x22testPdfFolderAccess\x22,\x22testEntriesRawHeaders\x22,\x22scoringTestSettings\x22,\x22scoringDebugActualGroupHeaders\x22,\x22scoringDebugActualGroupRows\x22,\x22scoringDebugGroupA\x22,\x22scoringDebugActualRounds\x22,\x22scoringScoreAllGroups\x22,\x22scoringScoreAllProgression\x22,\x22scoringScoreAllMatches\x22,\x22scoringDebugActualMatchMap\x22,\x22scoringBuildLeaderboard\x22,\x22scoringRebuildAll\x22\x5d,\x22sandboxMode\x22:\x22IFRAME_SANDBOX\x22,\x22callbackTimeout\x22:390000,\x22deploymentId\x22:\x22AKfycbzThbgrqjQytw8ak4PY3GcnxhF-JdnF1CcossbeB4_NaXbKKIPfryU1oOm5Y6r9HSw\x22,\x22eei\x22:\x22\x22,\x22sandboxHost\x22:\x22https:\/\/n-qddrd56zh7wnotrsr2rycgyhdzzfvtwwqlc6lha-0lu-script.googleusercontent.com\x22,\x22clientSideProperties\x22:\x7b\x22google.script.sandbox.mode\x22:\x22IFRAME_SANDBOX\x22,\x22google.script.host.origin\x22:\x22https:\/\/docs.google.com\x22\x7d,\x22actionPrefix\x22:\x22\/macros\/s\/AKfycbzThbgrqjQytw8ak4PY3GcnxhF-JdnF1CcossbeB4_NaXbKKIPfryU1oOm5Y6r9HSw\x22,\x22userHtml\x22:\x22\x3c!DOCTYPE html\x3e\\n\x3chtml lang\x3d\\\x22en\\\x22\x3e\\n\x3chead\x3e\\n  \x3cmeta charset\x3d\\\x22UTF-8\\\x22 \/\x3e\\n  \x3cmeta name\x3d\\\x22viewport\\\x22 content\x3d\\\x22width\x3ddevice-width, initial-scale\x3d1.0, viewport-fit\x3dcover\\\x22 \/\x3e\\n  \x3ctitle\x3eEnter \\u2014 Mick\x26#39;s World Cup Predictor 2026\x3c\\\/title\x3e\\n  \x3clink rel\x3d\\\x22stylesheet\\\x22 href\x3d\\\x22style.css\\\x22 \/\x3e\\n  \x3clink rel\x3d\\\x22preconnect\\\x22 href\x3d\\\x22https:\/\/fonts.googleapis.com\\\x22\x3e\\n  \x3clink href\x3d\\\x22https:\/\/fonts.googleapis.com\/css2?family\x3dBarlow\x26#43;Condensed:wght@400;600;700;800\x26amp;family\x3dBarlow:wght@400;500;600\x26amp;display\x3dswap\\\x22 rel\x3d\\\x22stylesheet\\\x22\x3e\\n  \x3cstyle\x3e\\n    :root \x7b\\n      --pitch:   #0d5c2e;\\n      --pitch-d: #09401f;\\n      --pitch-l: #1a7a3f;\\n      --gold:    #d4a843;\\n      --gold-d:  #a07820;\\n      --red:     #c0392b;\\n      --sky:     #1a6fa8;\\n      --ink:     #1a1f2e;\\n      --ink-2:   #3d4455;\\n      --ink-3:   #6b7280;\\n      --surface: #ffffff;\\n      --surface-2: #f7f9fb;\\n      --surface-3: #edf0f4;\\n      --border:  #e4e8ee;\\n      --border-2:#c8cdd6;\\n      --shadow-sm: 0 1px 3px rgba(0,0,0,.05), 0 1px 2px rgba(0,0,0,.04);\\n      --shadow:  0 4px 16px rgba(0,0,0,.07), 0 1px 4px rgba(0,0,0,.04);\\n      --shadow-lg: 0 12px 32px rgba(0,0,0,.09), 0 2px 8px rgba(0,0,0,.05);\\n      --radius:  10px;\\n      --radius-lg: 16px;\\n      --font-head: \x27Barlow Condensed\x27, sans-serif;\\n      --font-body: \x27Barlow\x27, sans-serif;\\n      --success: #1a7f4b;\\n      --success-bg: #eaf7f0;\\n      --error:   #b91c1c;\\n      --error-bg: #fef2f2;\\n      --warn:    #92400e;\\n      --warn-bg: #fef9ec;\\n      --trans: .18s ease;\\n\\n       \\n      --chrome:      #1a1f2e;\\n      --chrome-mid:  #222840;\\n      --chrome-lite: #2d3450;\\n\\n      --r32-bg: #ecfdf5;\\n      --r32-border: #86efac;\\n      --r32-text: #166534;\\n\\n      --r16-bg: #eff6ff;\\n      --r16-border: #93c5fd;\\n      --r16-text: #1d4ed8;\\n\\n      --qf-bg: #f5f3ff;\\n      --qf-border: #c4b5fd;\\n      --qf-text: #6d28d9;\\n\\n      --sf-bg: #fff7ed;\\n      --sf-border: #fdba74;\\n      --sf-text: #c2410c;\\n\\n      --final-bg: #fef3c7;\\n      --final-border: #fcd34d;\\n      --final-text: #92400e;\\n\\n      --pos-1st-bg: #fef3c7;\\n      --pos-1st-text: #78350f;\\n      --pos-1st-border: #fcd34d;\\n      --pos-2nd-bg: #e0f2fe;\\n      --pos-2nd-text: #0c4a6e;\\n      --pos-2nd-border: #7dd3fc;\\n      --pos-3rd-bg: #f3e8ff;\\n      --pos-3rd-text: #4c1d95;\\n      --pos-3rd-border: #c4b5fd;\\n    \x7d\\n\\n    *, *::before, *::after \x7b box-sizing: border-box; margin: 0; padding: 0; \x7d\\n\\n  html, body \x7b\\n  max-width: 100%;\\n  overflow-x: hidden;\\n  height: auto;\\n\x7d\\n\\n    body \x7b\\n      font-family: var(--font-body);\\n      font-size: 15px;\\n      color: var(--ink);\\n      background: var(--surface-2);\\n      line-height: 1.5;\\n      min-height: unset;\\n      -webkit-text-size-adjust: 100%;\\n    \x7d\\n\\n     \\n    #countdownBanner \x7b\\n      display: none;\\n      background: linear-gradient(90deg, #7c1d1d 0%, #991b1b 100%);\\n      color: #fff;\\n      padding: 9px 20px;\\n      text-align: center;\\n      font-family: var(--font-body);\\n      font-size: 13px;\\n      font-weight: 500;\\n      letter-spacing: 0.1px;\\n      line-height: 1.4;\\n    \x7d\\n\\n    #countdownBanner.visible \x7b display: block; \x7d\\n\\n    #countdownBanner strong \x7b\\n      font-family: var(--font-head);\\n      font-size: 15px;\\n      font-weight: 800;\\n      letter-spacing: 0.5px;\\n    \x7d\\n\\n    .countdown-units \x7b\\n      display: inline-flex;\\n      align-items: center;\\n      gap: 4px;\\n      margin-left: 8px;\\n      vertical-align: middle;\\n    \x7d\\n\\n    .cd-unit \x7b\\n      display: inline-flex;\\n      flex-direction: column;\\n      align-items: center;\\n      background: rgba(255,255,255,0.15);\\n      border-radius: 6px;\\n      padding: 3px 7px 2px;\\n      min-width: 36px;\\n      line-height: 1;\\n    \x7d\\n\\n    .cd-num \x7b\\n      font-family: var(--font-head);\\n      font-size: 17px;\\n      font-weight: 800;\\n      letter-spacing: 0.5px;\\n      color: #fff;\\n    \x7d\\n\\n    .cd-label \x7b\\n      font-size: 8px;\\n      font-weight: 600;\\n      letter-spacing: 0.5px;\\n      text-transform: uppercase;\\n      color: rgba(255,255,255,0.65);\\n      margin-top: 1px;\\n    \x7d\\n\\n    .cd-sep \x7b\\n      font-family: var(--font-head);\\n      font-size: 16px;\\n      font-weight: 700;\\n      color: rgba(255,255,255,0.4);\\n      align-self: flex-start;\\n      margin-top: 2px;\\n    \x7d\\n\\n     \\n    #closedScreen \x7b\\n      display: none;\\n      min-height: 100vh;\\n      background: var(--ink);\\n      position: relative;\\n      overflow: hidden;\\n    \x7d\\n\\n    #closedScreen.visible \x7b display: block; \x7d\\n\\n    .closed-bg-gradient \x7b\\n      position: absolute;\\n      inset: 0;\\n      background:\\n        radial-gradient(ellipse 70% 60% at 80% 30%, rgba(192,57,43,0.18), transparent),\\n        radial-gradient(ellipse 50% 70% at 10% 80%, rgba(212,168,67,0.10), transparent);\\n      pointer-events: none;\\n    \x7d\\n\\n    .closed-rainbow \x7b\\n      position: absolute;\\n      top: 0; left: 0; right: 0;\\n      height: 4px;\\n      background: linear-gradient(90deg,\\n        #1a56db 0%, #0ea5e9 20%, #7c3aed 40%,\\n        #be123c 60%, #f59e0b 80%, #14532d 100%\\n      );\\n    \x7d\\n\\n    .closed-inner \x7b\\n      position: relative;\\n      max-width: 680px;\\n      margin: 0 auto;\\n      padding: 80px 24px 60px;\\n      text-align: center;\\n    \x7d\\n\\n    .closed-icon \x7b\\n      font-size: 56px;\\n      margin-bottom: 20px;\\n      display: block;\\n      line-height: 1;\\n    \x7d\\n\\n    .closed-eyebrow \x7b\\n      font-family: var(--font-head);\\n      font-size: 12px;\\n      font-weight: 700;\\n      letter-spacing: 2px;\\n      text-transform: uppercase;\\n      color: var(--red);\\n      margin-bottom: 10px;\\n    \x7d\\n\\n    .closed-title \x7b\\n      font-family: var(--font-head);\\n      font-size: clamp(36px, 6vw, 56px);\\n      font-weight: 900;\\n      color: #ffffff;\\n      line-height: 1.0;\\n      letter-spacing: -0.5px;\\n      margin-bottom: 18px;\\n    \x7d\\n\\n    .closed-title span \x7b color: var(--gold); \x7d\\n\\n    .closed-body \x7b\\n      font-size: 16px;\\n      line-height: 1.6;\\n      color: rgba(255,255,255,0.65);\\n      max-width: 480px;\\n      margin: 0 auto 32px;\\n    \x7d\\n\\n    .closed-deadline-box \x7b\\n      display: inline-block;\\n      background: rgba(255,255,255,0.06);\\n      border: 1px solid rgba(255,255,255,0.12);\\n      border-radius: var(--radius-lg);\\n      padding: 16px 28px;\\n      margin-bottom: 32px;\\n    \x7d\\n\\n    .closed-deadline-label \x7b\\n      font-size: 11px;\\n      font-weight: 700;\\n      letter-spacing: 1.2px;\\n      text-transform: uppercase;\\n      color: rgba(255,255,255,0.4);\\n      margin-bottom: 6px;\\n    \x7d\\n\\n    .closed-deadline-value \x7b\\n      font-family: var(--font-head);\\n      font-size: 20px;\\n      font-weight: 800;\\n      color: #ffffff;\\n    \x7d\\n\\n    .closed-pills \x7b\\n      display: flex;\\n      justify-content: center;\\n      gap: 10px;\\n      flex-wrap: wrap;\\n    \x7d\\n\\n    .closed-pill \x7b\\n      display: inline-flex;\\n      align-items: center;\\n      gap: 7px;\\n      padding: 9px 18px;\\n      border-radius: 999px;\\n      font-size: 14px;\\n      font-weight: 600;\\n      font-family: var(--font-body);\\n    \x7d\\n\\n    .closed-pill.primary \x7b\\n      background: var(--gold);\\n      color: var(--ink);\\n    \x7d\\n\\n    .closed-pill.secondary \x7b\\n      background: rgba(255,255,255,0.08);\\n      border: 1px solid rgba(255,255,255,0.15);\\n      color: rgba(255,255,255,0.75);\\n    \x7d\\n\\n    .closed-footer \x7b\\n      margin-top: 60px;\\n      padding-top: 20px;\\n      border-top: 1px solid rgba(255,255,255,0.08);\\n      font-size: 13px;\\n      color: rgba(255,255,255,0.25);\\n    \x7d\\n\\n     \\n    .progress-bar-wrap \x7b\\n      position: sticky;\\n      top: 0;\\n      z-index: 100;\\n      background: #222840;\\n      padding: 0 20px;\\n      display: flex;\\n      align-items: center;\\n      gap: 0;\\n      min-height: 48px;\\n      overflow-x: auto;\\n      border-bottom: 1px solid rgba(255,255,255,.06);\\n      scrollbar-width: none;\\n    \x7d\\n    .progress-bar-wrap::-webkit-scrollbar \x7b display: none; \x7d\\n\\n    .progress-steps \x7b\\n      display: flex;\\n      align-items: center;\\n      gap: 0;\\n      flex: 1;\\n      min-width: max-content;\\n    \x7d\\n\\n    .ps-item \x7b\\n      display: flex;\\n      align-items: center;\\n      gap: 8px;\\n      padding: 0 12px;\\n      min-height: 48px;\\n      font-family: var(--font-head);\\n      font-size: 13px;\\n      font-weight: 600;\\n      letter-spacing: .5px;\\n      text-transform: uppercase;\\n      color: rgba(255,255,255,.4);\\n      border-right: 1px solid rgba(255,255,255,.08);\\n      white-space: nowrap;\\n      transition: color var(--trans);\\n    \x7d\\n\\n    .ps-item:last-child \x7b border-right: none; \x7d\\n    .ps-item.done \x7b color: var(--gold); \x7d\\n    .ps-item.active \x7b color: #fff; \x7d\\n\\n    .ps-dot \x7b\\n      width: 20px;\\n      height: 20px;\\n      border-radius: 50%;\\n      border: 2px solid rgba(255,255,255,.2);\\n      display: flex;\\n      align-items: center;\\n      justify-content: center;\\n      font-size: 10px;\\n      font-weight: 700;\\n      flex-shrink: 0;\\n      transition: all var(--trans);\\n    \x7d\\n\\n    .ps-item.done .ps-dot \x7b background: var(--gold); border-color: var(--gold); color: var(--ink); \x7d\\n    .ps-item.done .ps-dot::after \x7b content: \x27✓\x27; \x7d\\n    .ps-item:not(.done) .ps-dot::after \x7b content: attr(data-n); color: rgba(255,255,255,.5); \x7d\\n    .ps-item.active .ps-dot \x7b border-color: #fff; \x7d\\n    .ps-item.active .ps-dot::after \x7b color: #fff; \x7d\\n\\n     \\n    .hero \x7b\\n      background: linear-gradient(180deg, #2d3450 0%, #252b42 100%);\\n      color: #fff;\\n      padding: 28px 24px 32px;\\n      position: relative;\\n      overflow: hidden;\\n    \x7d\\n\\n    .hero::before \x7b\\n      content: \x27\x27;\\n      position: absolute;\\n      inset: 0;\\n      background:\\n        radial-gradient(ellipse 60% 80% at 85% 50%, rgba(212,168,67,.10), transparent),\\n        radial-gradient(ellipse 40% 60% at 10% 80%, rgba(13,92,46,.15), transparent);\\n      pointer-events: none;\\n    \x7d\\n\\n     \\n    .hero::after \x7b\\n      content: \x27\x27;\\n      position: absolute;\\n      bottom: -24px;\\n      left: 0; right: 0;\\n      height: 24px;\\n      background: linear-gradient(180deg, #252b42 0%, var(--surface-2) 100%);\\n      pointer-events: none;\\n      z-index: 1;\\n    \x7d\\n\\n    .hero-inner \x7b position: relative; max-width: 960px; margin: 0 auto; \x7d\\n\\n    .hero-eyebrow \x7b\\n      font-family: var(--font-head);\\n      font-size: 12px;\\n      font-weight: 700;\\n      letter-spacing: 2px;\\n      text-transform: uppercase;\\n      color: var(--gold);\\n      margin-bottom: 6px;\\n    \x7d\\n\\n    .hero h1 \x7b\\n      font-family: var(--font-head);\\n      font-size: clamp(32px, 5vw, 52px);\\n      font-weight: 800;\\n      line-height: 1.0;\\n      letter-spacing: -0.5px;\\n      margin-bottom: 10px;\\n    \x7d\\n\\n    .hero h1 span \x7b color: var(--gold); \x7d\\n\\n    .hero-sub \x7b\\n      font-size: 15px;\\n      color: rgba(255,255,255,.7);\\n      max-width: 540px;\\n      line-height: 1.5;\\n    \x7d\\n\\n    .hero-meta \x7b\\n      margin-top: 18px;\\n      display: flex;\\n      gap: 10px;\\n      align-items: center;\\n      flex-wrap: wrap;\\n    \x7d\\n\\n    .hero-pill \x7b\\n      display: inline-flex;\\n      align-items: center;\\n      gap: 6px;\\n      padding: 5px 12px;\\n      border-radius: 999px;\\n      background: rgba(255,255,255,.08);\\n      border: 1px solid rgba(255,255,255,.12);\\n      font-size: 13px;\\n      color: rgba(255,255,255,.75);\\n    \x7d\\n\\n    .hero-pill .dot \x7b\\n      width: 7px; height: 7px;\\n      border-radius: 50%;\\n      background: #4ade80;\\n      animation: pulse 2s ease infinite;\\n    \x7d\\n\\n    @keyframes pulse \x7b\\n      0%,100%\x7bopacity:1;transform:scale(1)\x7d\\n      50%\x7bopacity:.6;transform:scale(.85)\x7d\\n    \x7d\\n\\n    .hero-clear-btn \x7b\\n      padding: 5px 14px;\\n      border-radius: 999px;\\n      background: transparent;\\n      border: 1px solid rgba(255,255,255,.2);\\n      color: rgba(255,255,255,.6);\\n      font-size: 13px;\\n      font-family: var(--font-body);\\n      cursor: pointer;\\n      transition: all var(--trans);\\n      min-height: 30px;\\n    \x7d\\n\\n    .hero-clear-btn:hover \x7b background: rgba(255,255,255,.08); color: rgba(255,255,255,.9); \x7d\\n\\n    .autosave-note \x7b\\n      display: flex;\\n      align-items: center;\\n      gap: 7px;\\n      padding: 9px 14px;\\n      background: #eff6ff;\\n      border: 1px solid #bfdbfe;\\n      border-radius: var(--radius);\\n      font-size: 13px;\\n      color: #1e40af;\\n      margin-bottom: 16px;\\n    \x7d\\n    .autosave-note svg \x7b flex-shrink: 0; \x7d\\n\\n    .container \x7b\\n      max-width: 980px;\\n      margin: 0 auto;\\n      padding: 24px 16px 60px;\\n    \x7d\\n\\n    .card \x7b\\n      background: var(--surface);\\n      border: 1px solid var(--border);\\n      border-radius: var(--radius-lg);\\n      box-shadow: var(--shadow-sm);\\n      margin-bottom: 16px;\\n      scroll-margin-top: 60px;\\n      overflow: hidden;\\n    \x7d\\n\\n    .card-header \x7b\\n      display: flex;\\n      align-items: flex-start;\\n      gap: 14px;\\n      padding: 20px 24px;\\n      cursor: default;\\n    \x7d\\n\\n    .card-header.collapsable \x7b\\n      cursor: pointer;\\n      user-select: none;\\n    \x7d\\n    .card-header.collapsable:hover \x7b background: var(--surface-2); \x7d\\n\\n    .card-body \x7b\\n      padding: 0 24px 24px;\\n    \x7d\\n\\n    .card.collapsed .card-body \x7b display: none; \x7d\\n\\n    .card-number \x7b\\n      width: 36px;\\n      height: 36px;\\n      border-radius: 50%;\\n      background: var(--ink);\\n      color: #fff;\\n      font-family: var(--font-head);\\n      font-size: 16px;\\n      font-weight: 700;\\n      display: flex;\\n      align-items: center;\\n      justify-content: center;\\n      flex-shrink: 0;\\n      margin-top: 2px;\\n    \x7d\\n\\n    .card-title-wrap \x7b flex: 1; min-width: 0; \x7d\\n\\n    .card-title-wrap h2 \x7b\\n      font-family: var(--font-head);\\n      font-size: 22px;\\n      font-weight: 700;\\n      color: var(--ink);\\n      letter-spacing: -.2px;\\n      line-height: 1.1;\\n    \x7d\\n\\n    .card-title-wrap p \x7b\\n      margin-top: 4px;\\n      font-size: 14px;\\n      color: var(--ink-3);\\n      line-height: 1.4;\\n    \x7d\\n\\n    .collapse-chevron \x7b\\n      width: 28px;\\n      height: 28px;\\n      border-radius: 50%;\\n      border: 1.5px solid var(--border);\\n      display: flex;\\n      align-items: center;\\n      justify-content: center;\\n      flex-shrink: 0;\\n      margin-top: 4px;\\n      transition: transform var(--trans), background var(--trans);\\n      color: var(--ink-3);\\n    \x7d\\n\\n    .card-header.collapsable:hover .collapse-chevron \x7b background: var(--surface-3); \x7d\\n    .card.collapsed .collapse-chevron \x7b transform: rotate(-90deg); \x7d\\n\\n    .section-complete-badge \x7b\\n      display: none;\\n      align-items: center;\\n      gap: 6px;\\n      padding: 4px 10px;\\n      border-radius: 999px;\\n      background: var(--success-bg);\\n      border: 1px solid #bbf7d0;\\n      color: var(--success);\\n      font-size: 12px;\\n      font-weight: 600;\\n      flex-shrink: 0;\\n    \x7d\\n\\n    .section-complete-badge.visible \x7b display: flex; \x7d\\n\\n    .grid-2 \x7b\\n      display: grid;\\n      grid-template-columns: repeat(2, 1fr);\\n      gap: 14px;\\n    \x7d\\n\\n    .field \x7b display: flex; flex-direction: column; gap: 6px; \x7d\\n\\n    .field label \x7b\\n      font-size: 13px;\\n      font-weight: 600;\\n      color: var(--ink-2);\\n      letter-spacing: .2px;\\n    \x7d\\n\\n    .field input,\\n    .field select \x7b\\n      width: 100%;\\n      min-height: 44px;\\n      border: 1.5px solid var(--border);\\n      border-radius: var(--radius);\\n      padding: 10px 13px;\\n      font-size: 15px;\\n      font-family: var(--font-body);\\n      background: var(--surface);\\n      color: var(--ink);\\n      transition: border-color var(--trans), box-shadow var(--trans);\\n      appearance: none;\\n      -webkit-appearance: none;\\n    \x7d\\n\\n    .field input:focus,\\n    .field select:focus \x7b\\n      outline: none;\\n      border-color: var(--pitch);\\n      box-shadow: 0 0 0 3px rgba(13,92,46,.1);\\n    \x7d\\n\\n    .field input.has-error,\\n    .field select.has-error \x7b\\n      border-color: var(--error);\\n      box-shadow: 0 0 0 3px rgba(185,28,28,.08);\\n    \x7d\\n\\n    .field input.is-valid \x7b border-color: var(--success); \x7d\\n\\n    .field-error \x7b\\n      font-size: 12px;\\n      color: var(--error);\\n      font-weight: 500;\\n      min-height: 16px;\\n      line-height: 1.3;\\n    \x7d\\n\\n    .section-error \x7b\\n      margin-top: 10px;\\n      padding: 10px 13px;\\n      border-radius: var(--radius);\\n      background: var(--error-bg);\\n      border: 1px solid #fecaca;\\n      color: var(--error);\\n      font-size: 13px;\\n      font-weight: 500;\\n      display: none;\\n    \x7d\\n\\n    .section-error.visible \x7b display: block; \x7d\\n\\n    .groups-progress \x7b\\n      display: flex;\\n      align-items: center;\\n      gap: 10px;\\n      margin-bottom: 16px;\\n      padding: 10px 14px;\\n      background: var(--surface-2);\\n      border-radius: var(--radius);\\n      border: 1px solid var(--border);\\n    \x7d\\n\\n    .groups-progress-label \x7b font-size: 13px; color: var(--ink-2); font-weight: 500; white-space: nowrap; \x7d\\n\\n    .groups-progress-track \x7b\\n      flex: 1;\\n      height: 6px;\\n      background: var(--border);\\n      border-radius: 3px;\\n      overflow: hidden;\\n    \x7d\\n\\n    .groups-progress-fill \x7b\\n      height: 100%;\\n      background: var(--pitch);\\n      border-radius: 3px;\\n      transition: width .3s ease;\\n    \x7d\\n\\n    .groups-progress-count \x7b\\n      font-family: var(--font-head);\\n      font-size: 15px;\\n      font-weight: 700;\\n      color: var(--pitch);\\n      white-space: nowrap;\\n    \x7d\\n\\n    .grid-groups \x7b\\n      display: grid;\\n      grid-template-columns: repeat(4, 1fr);\\n      gap: 12px;\\n    \x7d\\n\\n     \\n    .grid-groups.cols-2 \x7b grid-template-columns: repeat(2, 1fr); gap: 10px; \x7d\\n    .grid-groups.cols-1 \x7b grid-template-columns: 1fr; gap: 8px; \x7d\\n\\n    .group-card \x7b\\n      border: 2px solid var(--border-2);\\n      border-left: 4px solid var(--pitch);\\n      border-radius: var(--radius);\\n      padding: 14px;\\n      background: var(--surface);\\n      transition: border-color var(--trans), background var(--trans), box-shadow var(--trans);\\n      box-shadow: 0 2px 8px rgba(0,0,0,.06), 0 1px 2px rgba(0,0,0,.04);\\n    \x7d\\n\\n    .group-card:hover \x7b\\n      box-shadow: 0 4px 12px rgba(0,0,0,.09), 0 1px 3px rgba(0,0,0,.05);\\n    \x7d\\n\\n    .group-card.complete \x7b\\n      border-color: #86efac;\\n      border-left-color: var(--success);\\n      background: #f0fdf4;\\n      box-shadow: 0 2px 8px rgba(26,127,75,.08), 0 1px 2px rgba(26,127,75,.05);\\n    \x7d\\n\\n    .group-card-header \x7b\\n      display: flex;\\n      align-items: center;\\n      justify-content: space-between;\\n      margin-bottom: 10px;\\n      padding-bottom: 8px;\\n      border-bottom: 1px solid var(--border);\\n    \x7d\\n\\n    .group-card.complete .group-card-header \x7b\\n      border-bottom-color: #bbf7d0;\\n    \x7d\\n\\n    .group-card h3 \x7b\\n      font-family: var(--font-head);\\n      font-size: 17px;\\n      font-weight: 800;\\n      color: var(--pitch);\\n      letter-spacing: .3px;\\n    \x7d\\n\\n    .group-card.complete h3 \x7b\\n      color: var(--success);\\n    \x7d\\n\\n    .group-check \x7b\\n      width: 20px;\\n      height: 20px;\\n      border-radius: 50%;\\n      background: var(--success);\\n      color: #fff;\\n      font-size: 11px;\\n      display: none;\\n      align-items: center;\\n      justify-content: center;\\n    \x7d\\n\\n    .group-card.complete .group-check \x7b display: flex; \x7d\\n\\n     \\n\\n     \\n    .pos-bar \x7b\\n      display: grid;\\n      grid-template-columns: 1fr 1fr 1fr;\\n      gap: 4px;\\n      margin-bottom: 8px;\\n    \x7d\\n\\n    .pos-slot \x7b\\n      border-radius: 7px;\\n      padding: 5px 6px 5px 7px;\\n      display: flex;\\n      align-items: center;\\n      gap: 5px;\\n      min-height: 34px;\\n      border: 2px dashed var(--border-2);\\n      background: var(--surface-2);\\n      transition: all var(--trans);\\n      overflow: hidden;\\n    \x7d\\n\\n    .pos-slot-label \x7b\\n      font-family: var(--font-head);\\n      font-size: 10px;\\n      font-weight: 800;\\n      letter-spacing: .5px;\\n      flex-shrink: 0;\\n      line-height: 1;\\n    \x7d\\n\\n    .pos-slot-team \x7b\\n      font-size: 11px;\\n      font-weight: 600;\\n      white-space: nowrap;\\n      overflow: hidden;\\n      text-overflow: ellipsis;\\n      flex: 1;\\n      line-height: 1.2;\\n    \x7d\\n\\n    .pos-slot-clear \x7b\\n      width: 16px;\\n      height: 16px;\\n      border-radius: 50%;\\n      background: rgba(0,0,0,0.12);\\n      border: none;\\n      cursor: pointer;\\n      display: none;\\n      align-items: center;\\n      justify-content: center;\\n      font-size: 11px;\\n      line-height: 1;\\n      color: inherit;\\n      flex-shrink: 0;\\n      padding: 0;\\n      -webkit-tap-highlight-color: transparent;\\n      transition: background var(--trans);\\n    \x7d\\n\\n    .pos-slot-clear:hover \x7b background: rgba(0,0,0,0.2); \x7d\\n\\n     \\n    .pos-slot.filled-1 \x7b\\n      border-style: solid;\\n      border-color: #f59e0b;\\n      background: #fffbeb;\\n      color: #78350f;\\n    \x7d\\n    .pos-slot.filled-1 .pos-slot-label \x7b color: #92400e; \x7d\\n    .pos-slot.filled-1 .pos-slot-clear \x7b display: flex; \x7d\\n\\n    .pos-slot.filled-2 \x7b\\n      border-style: solid;\\n      border-color: #3b82f6;\\n      background: #eff6ff;\\n      color: #1e3a8a;\\n    \x7d\\n    .pos-slot.filled-2 .pos-slot-label \x7b color: #1e40af; \x7d\\n    .pos-slot.filled-2 .pos-slot-clear \x7b display: flex; \x7d\\n\\n    .pos-slot.filled-3 \x7b\\n      border-style: solid;\\n      border-color: #a855f7;\\n      background: #faf5ff;\\n      color: #4c1d95;\\n    \x7d\\n    .pos-slot.filled-3 .pos-slot-label \x7b color: #6b21a8; \x7d\\n    .pos-slot.filled-3 .pos-slot-clear \x7b display: flex; \x7d\\n\\n     \\n    .pos-slot:not(\x5bclass*\x3d\\\x22filled-\\\x22\x5d) .pos-slot-label \x7b\\n      opacity: 0.35;\\n    \x7d\\n    .pos-slot:not(\x5bclass*\x3d\\\x22filled-\\\x22\x5d).slot-1 .pos-slot-label \x7b color: var(--pos-1st-text); \x7d\\n    .pos-slot:not(\x5bclass*\x3d\\\x22filled-\\\x22\x5d).slot-2 .pos-slot-label \x7b color: var(--pos-2nd-text); \x7d\\n    .pos-slot:not(\x5bclass*\x3d\\\x22filled-\\\x22\x5d).slot-3 .pos-slot-label \x7b color: var(--pos-3rd-text); \x7d\\n\\n     \\n    .team-btns \x7b\\n      display: flex;\\n      flex-direction: column;\\n      gap: 5px;\\n    \x7d\\n\\n    .team-btn \x7b\\n      display: flex;\\n      align-items: center;\\n      gap: 9px;\\n      width: 100%;\\n      min-height: 40px;\\n      padding: 7px 10px;\\n      border: 2px solid var(--border-2);\\n      border-radius: 8px;\\n      background: var(--surface-2);\\n      font-family: var(--font-body);\\n      font-size: 13px;\\n      font-weight: 600;\\n      color: var(--ink-2);\\n      cursor: pointer;\\n      text-align: left;\\n      transition: all var(--trans);\\n      -webkit-tap-highlight-color: transparent;\\n      position: relative;\\n      box-shadow: 0 1px 3px rgba(0,0,0,.06);\\n    \x7d\\n\\n    .team-btn:hover \x7b\\n      border-color: var(--pitch);\\n      background: #f0fdf4;\\n      color: var(--ink);\\n      box-shadow: 0 2px 6px rgba(13,92,46,.12);\\n    \x7d\\n\\n    .team-btn:active \x7b transform: scale(0.98); \x7d\\n\\n     \\n    .team-btn-pos \x7b\\n      width: 24px;\\n      height: 24px;\\n      border-radius: 6px;\\n      font-family: var(--font-head);\\n      font-size: 11px;\\n      font-weight: 800;\\n      display: flex;\\n      align-items: center;\\n      justify-content: center;\\n      flex-shrink: 0;\\n      background: var(--border-2);\\n      color: var(--ink-3);\\n      border: 1.5px solid var(--border-2);\\n      transition: all var(--trans);\\n      letter-spacing: .3px;\\n    \x7d\\n\\n    .team-btn-name \x7b\\n      flex: 1;\\n      white-space: nowrap;\\n      overflow: hidden;\\n      text-overflow: ellipsis;\\n    \x7d\\n\\n     \\n    .team-btn.assigned-1 \x7b\\n      background: #fffbeb;\\n      border-color: #f59e0b;\\n      color: #78350f;\\n      box-shadow: 0 1px 4px rgba(245,158,11,.15);\\n    \x7d\\n    .team-btn.assigned-1 .team-btn-pos \x7b\\n      background: #f59e0b;\\n      color: #fff;\\n      border-color: #d97706;\\n    \x7d\\n\\n    .team-btn.assigned-2 \x7b\\n      background: #eff6ff;\\n      border-color: #3b82f6;\\n      color: #1e3a8a;\\n      box-shadow: 0 1px 4px rgba(59,130,246,.15);\\n    \x7d\\n    .team-btn.assigned-2 .team-btn-pos \x7b\\n      background: #3b82f6;\\n      color: #fff;\\n      border-color: #2563eb;\\n    \x7d\\n\\n    .team-btn.assigned-3 \x7b\\n      background: #faf5ff;\\n      border-color: #a855f7;\\n      color: #4c1d95;\\n      box-shadow: 0 1px 4px rgba(168,85,247,.15);\\n    \x7d\\n    .team-btn.assigned-3 .team-btn-pos \x7b\\n      background: #a855f7;\\n      color: #fff;\\n      border-color: #9333ea;\\n    \x7d\\n\\n    .group-error \x7b margin-top: 6px; font-size: 11px; color: var(--error); font-weight: 500; min-height: 14px; \x7d\\n\\n    .btn \x7b\\n      display: inline-flex;\\n      align-items: center;\\n      gap: 8px;\\n      min-height: 44px;\\n      padding: 0 20px;\\n      border-radius: var(--radius);\\n      font-size: 14px;\\n      font-weight: 600;\\n      font-family: var(--font-body);\\n      cursor: pointer;\\n      border: none;\\n      transition: all var(--trans);\\n      text-decoration: none;\\n      white-space: nowrap;\\n    \x7d\\n\\n    .btn-primary \x7b background: var(--pitch); color: #fff; box-shadow: 0 2px 8px rgba(13,92,46,.2); \x7d\\n    .btn-primary:hover \x7b background: var(--pitch-d); box-shadow: 0 4px 12px rgba(13,92,46,.25); \x7d\\n    .btn-primary:disabled \x7b background: #9ca3af; box-shadow: none; cursor: not-allowed; \x7d\\n\\n    .btn-secondary \x7b background: var(--surface); color: var(--ink-2); border: 1.5px solid var(--border-2); \x7d\\n    .btn-secondary:hover \x7b background: var(--surface-2); border-color: var(--ink-3); \x7d\\n\\n    .btn-gold \x7b background: var(--gold); color: var(--ink); font-weight: 700; box-shadow: 0 2px 8px rgba(212,168,67,.25); \x7d\\n    .btn-gold:hover \x7b background: var(--gold-d); \x7d\\n    .btn-gold:disabled \x7b background: #d1d5db; color: #9ca3af; box-shadow: none; cursor: not-allowed; \x7d\\n\\n    .actions \x7b display: flex; gap: 10px; flex-wrap: wrap; align-items: center; \x7d\\n\\n    .status-msg \x7b\\n      font-size: 13px;\\n      font-weight: 500;\\n      min-height: 18px;\\n      line-height: 1.4;\\n      padding: 8px 12px;\\n      border-radius: var(--radius);\\n      display: none;\\n    \x7d\\n\\n    .status-msg.visible \x7b display: block; \x7d\\n    .status-msg.success \x7b background: var(--success-bg); color: var(--success); border: 1px solid #bbf7d0; \x7d\\n    .status-msg.error   \x7b background: var(--error-bg); color: var(--error); border: 1px solid #fecaca; \x7d\\n    .status-msg.warn    \x7b background: var(--warn-bg); color: var(--warn); border: 1px solid #fde68a; \x7d\\n    .status-msg.info    \x7b background: #eff6ff; color: #1e40af; border: 1px solid #bfdbfe; \x7d\\n\\n    .rank-list \x7b display: flex; flex-direction: column; gap: 3px; margin: 8px 0 8px; \x7d\\n\\n    .rank-item \x7b\\n      display: grid;\\n      grid-template-columns: 34px 1fr auto;\\n      gap: 6px;\\n      align-items: center;\\n      padding: 5px 8px;\\n      border: 1.5px solid var(--border);\\n      border-radius: 8px;\\n      background: var(--surface);\\n      cursor: grab;\\n      user-select: none;\\n      transition: border-color var(--trans), box-shadow var(--trans), opacity var(--trans);\\n    \x7d\\n\\n    .rank-item:hover \x7b border-color: var(--border-2); box-shadow: var(--shadow-sm); \x7d\\n    .rank-item.qualifying \x7b border-color: #bbf7d0; \x7d\\n    .rank-item.qualifying:hover \x7b border-color: #86efac; \x7d\\n\\n    .rank-item.non-qualifying \x7b background: #2d3450; border-color: #3d4565; \x7d\\n    .rank-item.non-qualifying .rank-team \x7b color: rgba(255,255,255,.65); \x7d\\n    .rank-item.dragging \x7b opacity: .45; border-style: dashed; \x7d\\n    .rank-item.drag-over \x7b border-color: var(--pitch); box-shadow: 0 0 0 3px rgba(13,92,46,.12); \x7d\\n\\n    .rank-number \x7b\\n      width: 28px;\\n      height: 28px;\\n      border-radius: 6px;\\n      background: var(--surface-2);\\n      color: var(--ink-3);\\n      font-family: var(--font-head);\\n      font-size: 12px;\\n      font-weight: 700;\\n      display: flex;\\n      align-items: center;\\n      justify-content: center;\\n      flex-shrink: 0;\\n    \x7d\\n\\n    .rank-item.qualifying .rank-number \x7b background: var(--pitch); color: #fff; \x7d\\n    .rank-item.non-qualifying .rank-number \x7b background: #374151; color: rgba(255,255,255,.5); \x7d\\n\\n    .rank-main \x7b display: flex; align-items: center; gap: 6px; min-width: 0; \x7d\\n\\n    .rank-team \x7b\\n      font-size: 13px;\\n      font-weight: 600;\\n      color: var(--ink);\\n      white-space: nowrap;\\n      overflow: hidden;\\n      text-overflow: ellipsis;\\n    \x7d\\n\\n    .rank-badge \x7b\\n      display: inline-flex;\\n      align-items: center;\\n      padding: 1px 6px;\\n      border-radius: 999px;\\n      font-size: 10px;\\n      font-weight: 600;\\n      flex-shrink: 0;\\n    \x7d\\n\\n    .rank-badge.qualifies \x7b background: #dcfce7; color: #15803d; \x7d\\n    .rank-badge.out \x7b background: #374151; color: rgba(255,255,255,.4); \x7d\\n\\n    .rank-controls \x7b display: flex; gap: 3px; \x7d\\n\\n    .rank-mini-btn \x7b\\n      width: 26px;\\n      height: 26px;\\n      border-radius: 6px;\\n      border: 1.5px solid var(--border);\\n      background: var(--surface);\\n      color: var(--ink-2);\\n      font-size: 12px;\\n      cursor: pointer;\\n      display: flex;\\n      align-items: center;\\n      justify-content: center;\\n      transition: all var(--trans);\\n      font-family: var(--font-body);\\n    \x7d\\n\\n    .rank-mini-btn:hover:not(:disabled) \x7b background: var(--surface-2); border-color: var(--border-2); \x7d\\n    .rank-mini-btn:disabled \x7b opacity: .35; cursor: not-allowed; \x7d\\n    .rank-item.non-qualifying .rank-mini-btn \x7b border-color: #374151; background: #1f2937; color: rgba(255,255,255,.5); \x7d\\n    .rank-item.non-qualifying .rank-mini-btn:hover:not(:disabled) \x7b background: #374151; \x7d\\n\\n    .rank-divider \x7b display: flex; align-items: center; gap: 10px; margin: 2px 0; \x7d\\n    .rank-divider-line \x7b flex: 1; height: 1px; background: var(--border); \x7d\\n    .rank-divider-label \x7b\\n      font-size: 10px;\\n      font-weight: 600;\\n      color: var(--ink-3);\\n      letter-spacing: .5px;\\n      text-transform: uppercase;\\n      white-space: nowrap;\\n    \x7d\\n\\n    .qualification-note \x7b\\n      padding: 7px 12px;\\n      background: var(--warn-bg);\\n      border: 1px solid #fde68a;\\n      border-radius: var(--radius);\\n      color: var(--warn);\\n      font-size: 12px;\\n      font-weight: 500;\\n      margin-top: 6px;\\n    \x7d\\n\\n    .third-rank-locked \x7b\\n      padding: 14px;\\n      background: var(--surface-2);\\n      border: 1.5px dashed var(--border-2);\\n      border-radius: var(--radius);\\n      text-align: center;\\n      color: var(--ink-3);\\n      font-size: 13px;\\n      font-weight: 500;\\n    \x7d\\n\\n    .expand-note \x7b\\n      margin-top: 10px;\\n      border: 1px solid #bfdbfe;\\n      border-radius: var(--radius);\\n      background: #eff6ff;\\n      overflow: hidden;\\n    \x7d\\n\\n    .expand-note-btn \x7b\\n      width: 100%;\\n      border: none;\\n      background: transparent;\\n      color: #1e40af;\\n      padding: 11px 14px;\\n      display: flex;\\n      align-items: center;\\n      justify-content: space-between;\\n      gap: 12px;\\n      text-align: left;\\n      font-family: var(--font-body);\\n      font-size: 13px;\\n      font-weight: 600;\\n      cursor: pointer;\\n    \x7d\\n\\n    .expand-note-btn:hover \x7b background: rgba(255,255,255,.35); \x7d\\n\\n    .expand-note-icon \x7b flex-shrink: 0; font-size: 16px; line-height: 1; color: #1e40af; \x7d\\n\\n    .expand-note-body \x7b\\n      display: none;\\n      padding: 0 14px 14px;\\n      font-size: 13px;\\n      line-height: 1.5;\\n      color: #1e40af;\\n    \x7d\\n\\n    .expand-note-body.open \x7b display: block; \x7d\\n    .expand-note-body p + p \x7b margin-top: 10px; \x7d\\n\\n    .round-wrap \x7b\\n      border: 1px solid var(--border);\\n      border-radius: var(--radius);\\n      overflow: hidden;\\n      background: var(--surface);\\n    \x7d\\n\\n    .round-header \x7b\\n      display: flex;\\n      align-items: center;\\n      gap: 10px;\\n      padding: 12px 16px;\\n      cursor: pointer;\\n      user-select: none;\\n      background: var(--surface-2);\\n      border-bottom: 1px solid var(--border);\\n      transition: background var(--trans);\\n    \x7d\\n\\n    .round-header:hover \x7b background: var(--surface-3); \x7d\\n    .round-wrap.collapsed .round-header \x7b border-bottom: none; \x7d\\n\\n    .round-title \x7b\\n      font-family: var(--font-head);\\n      font-size: 17px;\\n      font-weight: 700;\\n      color: var(--ink);\\n      flex: 1;\\n    \x7d\\n\\n    .round-progress-chip \x7b\\n      font-family: var(--font-body);\\n      font-size: 12px;\\n      font-weight: 600;\\n      padding: 3px 10px;\\n      border-radius: 999px;\\n      background: var(--surface);\\n      color: var(--ink-3);\\n      border: 1px solid var(--border);\\n    \x7d\\n\\n    .round-progress-chip.complete \x7b background: #dcfce7; color: #15803d; border-color: #bbf7d0; \x7d\\n\\n    .round-chevron \x7b\\n      width: 24px;\\n      height: 24px;\\n      border-radius: 50%;\\n      border: 1.5px solid var(--border);\\n      display: flex;\\n      align-items: center;\\n      justify-content: center;\\n      color: var(--ink-3);\\n      transition: transform var(--trans);\\n      flex-shrink: 0;\\n    \x7d\\n\\n    .round-wrap.collapsed .round-chevron \x7b transform: rotate(-90deg); \x7d\\n\\n    .round-wrap.round-r32 .round-header \x7b background: var(--r32-bg); border-bottom-color: var(--r32-border); \x7d\\n    .round-wrap.round-r32 .round-title, .round-wrap.round-r32 .round-chevron \x7b color: var(--r32-text); \x7d\\n    .round-wrap.round-r32 .round-progress-chip \x7b background: #fff; border-color: var(--r32-border); color: var(--r32-text); \x7d\\n\\n    .round-wrap.round-r16 .round-header \x7b background: var(--r16-bg); border-bottom-color: var(--r16-border); \x7d\\n    .round-wrap.round-r16 .round-title, .round-wrap.round-r16 .round-chevron \x7b color: var(--r16-text); \x7d\\n    .round-wrap.round-r16 .round-progress-chip \x7b background: #fff; border-color: var(--r16-border); color: var(--r16-text); \x7d\\n\\n    .round-wrap.round-qf .round-header \x7b background: var(--qf-bg); border-bottom-color: var(--qf-border); \x7d\\n    .round-wrap.round-qf .round-title, .round-wrap.round-qf .round-chevron \x7b color: var(--qf-text); \x7d\\n    .round-wrap.round-qf .round-progress-chip \x7b background: #fff; border-color: var(--qf-border); color: var(--qf-text); \x7d\\n\\n    .round-wrap.round-sf .round-header \x7b background: var(--sf-bg); border-bottom-color: var(--sf-border); \x7d\\n    .round-wrap.round-sf .round-title, .round-wrap.round-sf .round-chevron \x7b color: var(--sf-text); \x7d\\n    .round-wrap.round-sf .round-progress-chip \x7b background: #fff; border-color: var(--sf-border); color: var(--sf-text); \x7d\\n\\n    .round-wrap.round-final .round-header \x7b background: var(--final-bg); border-bottom-color: var(--final-border); \x7d\\n    .round-wrap.round-final .round-title, .round-wrap.round-final .round-chevron \x7b color: var(--final-text); \x7d\\n    .round-wrap.round-final .round-progress-chip \x7b background: #fff; border-color: var(--final-border); color: var(--final-text); \x7d\\n\\n    .round-body \x7b padding: 12px 16px; \x7d\\n    .round-wrap.collapsed .round-body \x7b display: none; \x7d\\n\\n    .matches-list \x7b display: flex; flex-direction: column; gap: 6px; \x7d\\n\\n    .match-card \x7b\\n      border: 1.5px solid var(--border);\\n      border-radius: 8px;\\n      padding: 8px 12px;\\n      background: var(--surface);\\n      transition: border-color var(--trans);\\n    \x7d\\n\\n    .match-card.has-winner \x7b border-color: #bbf7d0; background: #fafffe; \x7d\\n\\n    .match-meta \x7b\\n      font-size: 11px;\\n      color: var(--pitch);\\n      font-weight: 700;\\n      margin-bottom: 6px;\\n      letter-spacing: .2px;\\n      display: flex;\\n      align-items: center;\\n      gap: 5px;\\n    \x7d\\n\\n    .match-meta-num \x7b\\n      font-family: var(--font-head);\\n      font-size: 12px;\\n      font-weight: 800;\\n      color: var(--pitch);\\n      white-space: nowrap;\\n    \x7d\\n\\n    .match-meta-rest \x7b\\n      flex: 1;\\n      color: var(--ink-3);\\n      font-weight: 500;\\n      font-size: 10px;\\n      white-space: nowrap;\\n      overflow: hidden;\\n      text-overflow: ellipsis;\\n    \x7d\\n\\n     \\n    .match-info-btn \x7b\\n      width: 18px;\\n      height: 18px;\\n      border-radius: 50%;\\n      border: 1.5px solid var(--border-2);\\n      background: var(--surface-2);\\n      color: var(--ink-3);\\n      font-size: 11px;\\n      font-weight: 700;\\n      font-family: var(--font-body);\\n      cursor: pointer;\\n      display: inline-flex;\\n      align-items: center;\\n      justify-content: center;\\n      flex-shrink: 0;\\n      position: relative;\\n      transition: all var(--trans);\\n      line-height: 1;\\n      padding: 0;\\n    \x7d\\n\\n    .match-info-btn:hover \x7b background: var(--pitch); border-color: var(--pitch); color: #fff; \x7d\\n\\n    .match-tooltip \x7b\\n      display: none;\\n      position: absolute;\\n      bottom: calc(100% + 6px);\\n      left: 0;\\n      transform: none;\\n      min-width: 220px;\\n      max-width: 320px;\\n      background: var(--ink);\\n      color: #fff;\\n      font-size: 11px;\\n      font-weight: 500;\\n      font-family: var(--font-body);\\n      line-height: 1.4;\\n      white-space: normal;\\n      padding: 7px 11px;\\n      border-radius: 6px;\\n      box-shadow: var(--shadow-lg);\\n      z-index: 50;\\n      pointer-events: none;\\n    \x7d\\n\\n    .match-tooltip::after \x7b\\n      content: \x27\x27;\\n      position: absolute;\\n      top: 100%;\\n      left: 10px;\\n      transform: none;\\n      border: 5px solid transparent;\\n      border-top-color: var(--ink);\\n    \x7d\\n\\n    .match-info-btn:hover .match-tooltip,\\n    .match-info-btn.tip-open .match-tooltip \x7b display: block; \x7d\\n\\n     \\n    .match-info-btn.tip-down .match-tooltip \x7b\\n      bottom: auto;\\n      top: calc(100% + 6px);\\n    \x7d\\n\\n    .match-info-btn.tip-down .match-tooltip::after \x7b\\n      top: auto;\\n      bottom: 100%;\\n      border-top-color: transparent;\\n      border-bottom-color: var(--ink);\\n    \x7d\\n\\n    .match-row \x7b\\n      display: grid;\\n      grid-template-columns: 1fr 42px 22px 42px 1fr;\\n      align-items: center;\\n      gap: 0;\\n    \x7d\\n\\n    .match-team-left \x7b text-align: right; padding-right: 8px; \x7d\\n    .match-team-right \x7b text-align: left; padding-left: 8px; \x7d\\n\\n    .match-team-name \x7b\\n      font-size: 13px;\\n      font-weight: 600;\\n      color: var(--ink);\\n      line-height: 1.2;\\n      transition: color var(--trans);\\n      overflow-wrap: anywhere;\\n    \x7d\\n\\n    .match-team-name.winner \x7b color: var(--success); \x7d\\n    .match-team-name.loser  \x7b color: var(--ink-3); \x7d\\n\\n    .score-input \x7b\\n      width: 42px;\\n      height: 38px;\\n      border: 2px solid var(--pitch);\\n      border-radius: 8px;\\n      text-align: center;\\n      font-size: 18px;\\n      font-weight: 800;\\n      font-family: var(--font-head);\\n      color: var(--pitch);\\n      background: #f0fdf4;\\n      transition: border-color var(--trans), box-shadow var(--trans), background var(--trans);\\n      appearance: textfield;\\n      -moz-appearance: textfield;\\n      box-shadow: 0 1px 4px rgba(13,92,46,.08);\\n    \x7d\\n\\n    .score-input::-webkit-outer-spin-button,\\n    .score-input::-webkit-inner-spin-button \x7b -webkit-appearance: none; \x7d\\n\\n    .score-input:focus \x7b\\n      outline: none;\\n      border-color: var(--pitch-d);\\n      box-shadow: 0 0 0 3px rgba(13,92,46,.15);\\n      background: #e8f8ef;\\n    \x7d\\n\\n    .score-input.has-winner \x7b\\n      border-color: var(--pitch);\\n      background: #dcfce7;\\n      color: var(--pitch-d);\\n    \x7d\\n\\n    .score-sep \x7b\\n      text-align: center;\\n      font-size: 14px;\\n      color: var(--ink-3);\\n      font-weight: 800;\\n      font-family: var(--font-head);\\n      padding: 0 2px;\\n    \x7d\\n\\n    .match-error \x7b margin-top: 5px; font-size: 11px; color: var(--error); font-weight: 500; min-height: 13px; \x7d\\n\\n    .match-row-mobile \x7b display: none; \x7d\\n\\n    .mobile-team-score-row \x7b\\n      display: flex;\\n      align-items: center;\\n      gap: 8px;\\n      padding: 3px 0;\\n    \x7d\\n\\n    .mobile-team-score-row .score-input \x7b flex-shrink: 0; \x7d\\n\\n    .mobile-team-name \x7b\\n      flex: 1;\\n      font-size: 13px;\\n      font-weight: 600;\\n      color: var(--ink);\\n      transition: color var(--trans);\\n      overflow-wrap: anywhere;\\n    \x7d\\n\\n    .mobile-team-name.winner \x7b color: var(--success); \x7d\\n    .mobile-team-name.loser  \x7b color: var(--ink-3); \x7d\\n\\n    .champion-box \x7b\\n      display: flex;\\n      align-items: center;\\n      gap: 16px;\\n      padding: 20px;\\n      background: linear-gradient(135deg, #1e2a1a 0%, #0d5c2e 100%);\\n      border-radius: var(--radius-lg);\\n      color: #fff;\\n    \x7d\\n\\n    .champion-trophy \x7b font-size: 36px; flex-shrink: 0; \x7d\\n\\n    .champion-label \x7b\\n      font-size: 12px;\\n      font-weight: 600;\\n      letter-spacing: 1px;\\n      text-transform: uppercase;\\n      color: var(--gold);\\n      margin-bottom: 4px;\\n    \x7d\\n\\n    .champion-name \x7b\\n      font-family: var(--font-head);\\n      font-size: 28px;\\n      font-weight: 800;\\n      color: #fff;\\n      letter-spacing: -.2px;\\n    \x7d\\n\\n    .submit-card \x7b border-color: var(--pitch); \x7d\\n    .submit-note \x7b font-size: 13px; color: var(--ink-3); margin-top: 10px; line-height: 1.4; \x7d\\n\\n    .submit-locked \x7b\\n      padding: 18px;\\n      background: var(--surface-2);\\n      border: 1.5px dashed var(--border-2);\\n      border-radius: var(--radius);\\n      text-align: center;\\n      color: var(--ink-3);\\n      font-size: 14px;\\n      font-weight: 500;\\n      line-height: 1.5;\\n    \x7d\\n\\n    .submit-locked strong \x7b\\n      color: var(--ink-2);\\n      font-weight: 700;\\n    \x7d\\n\\n    .hidden \x7b display: none !important; \x7d\\n\\n    .draft-banner \x7b font-size: 12px; color: rgba(255,255,255,.45); padding: 4px 0; \x7d\\n\\n    .save-toast \x7b\\n      position: fixed;\\n      bottom: 20px;\\n      right: 20px;\\n      z-index: 200;\\n      background: #2d3450;\\n      color: #fff;\\n      padding: 10px 16px;\\n      border-radius: var(--radius);\\n      font-size: 13px;\\n      font-weight: 500;\\n      box-shadow: var(--shadow-lg);\\n      display: flex;\\n      align-items: center;\\n      gap: 8px;\\n      transform: translateY(8px);\\n      opacity: 0;\\n      transition: opacity .25s ease, transform .25s ease;\\n      pointer-events: none;\\n    \x7d\\n\\n    .save-toast.visible \x7b opacity: 1; transform: translateY(0); \x7d\\n    .save-dot \x7b width: 7px; height: 7px; border-radius: 50%; background: #4ade80; \x7d\\n\\n    @media (max-width: 900px) \x7b\\n       \\n    \x7d\\n\\n     \\n  .welcome-screen \x7b\\n  background: linear-gradient(145deg, #1a1f2e 0%, #1e2a1a 50%, #1a2030 100%);\\n  min-height: 100vh;\\n  min-height: -webkit-fill-available;\\n  display: flex;\\n  align-items: flex-start;\\n  justify-content: center;\\n  padding: 24px 20px 32px;\\n  position: relative;\\n  overflow: hidden;\\n\x7d\\n\\n    .welcome-screen::before \x7b\\n      content: \x27\x27;\\n      position: absolute;\\n      inset: 0;\\n      background:\\n        radial-gradient(ellipse 55% 60% at 80% 30%, rgba(212,168,67,.10), transparent),\\n        radial-gradient(ellipse 45% 55% at 10% 75%, rgba(13,92,46,.18), transparent);\\n      pointer-events: none;\\n    \x7d\\n\\n    .welcome-rainbow \x7b\\n      position: absolute;\\n      top: 0; left: 0; right: 0;\\n      height: 4px;\\n      background: linear-gradient(90deg,\\n        #1a56db 0%, #0ea5e9 20%, #7c3aed 40%,\\n        #be123c 60%, #f59e0b 80%, #14532d 100%\\n      );\\n    \x7d\\n\\n    .welcome-inner \x7b\\n      position: relative;\\n      max-width: 580px;\\n      width: 100%;\\n    \x7d\\n\\n    .welcome-eyebrow \x7b\\n      font-family: var(--font-head);\\n      font-size: 11px;\\n      font-weight: 700;\\n      letter-spacing: 2px;\\n      text-transform: uppercase;\\n      color: var(--gold);\\n      margin-bottom: 4px;\\n    \x7d\\n\\n    .welcome-title \x7b\\n      font-family: var(--font-head);\\n      font-size: clamp(26px, 5vw, 42px);\\n      font-weight: 900;\\n      color: #fff;\\n      line-height: 1.0;\\n      letter-spacing: -.4px;\\n      margin-bottom: 5px;\\n    \x7d\\n\\n    .welcome-title span \x7b color: var(--gold); \x7d\\n\\n    .welcome-sub \x7b\\n      font-size: 14px;\\n      color: rgba(255,255,255,.6);\\n      line-height: 1.4;\\n      margin-bottom: 12px;\\n    \x7d\\n\\n     \\n    .welcome-steps \x7b\\n      display: flex;\\n      flex-direction: column;\\n      gap: 5px;\\n      margin-bottom: 14px;\\n    \x7d\\n\\n    .welcome-step \x7b\\n      display: flex;\\n      align-items: center;\\n      gap: 12px;\\n      background: rgba(255,255,255,.07);\\n      border: 1px solid rgba(255,255,255,.12);\\n      border-radius: var(--radius);\\n      padding: 9px 14px;\\n      transition: border-color var(--trans), background var(--trans);\\n    \x7d\\n\\n    .welcome-step:hover \x7b background: rgba(255,255,255,.11); border-color: rgba(255,255,255,.2); \x7d\\n\\n    .ws-icon \x7b\\n      font-size: 18px;\\n      line-height: 1;\\n      flex-shrink: 0;\\n    \x7d\\n\\n    .ws-content \x7b flex: 1; min-width: 0; \x7d\\n\\n    .ws-label \x7b\\n      font-family: var(--font-head);\\n      font-size: 14px;\\n      font-weight: 700;\\n      color: #fff;\\n      letter-spacing: .2px;\\n      margin-bottom: 1px;\\n    \x7d\\n\\n    .ws-desc \x7b\\n      font-size: 12px;\\n      color: rgba(255,255,255,.5);\\n      line-height: 1.3;\\n    \x7d\\n\\n    .ws-num \x7b\\n      width: 20px;\\n      height: 20px;\\n      border-radius: 50%;\\n      background: var(--pitch);\\n      color: #fff;\\n      font-family: var(--font-head);\\n      font-size: 10px;\\n      font-weight: 800;\\n      display: flex;\\n      align-items: center;\\n      justify-content: center;\\n      flex-shrink: 0;\\n    \x7d\\n\\n     \\n    .welcome-actions \x7b\\n      display: flex;\\n      flex-direction: column;\\n      gap: 8px;\\n    \x7d\\n\\n    .btn-welcome-go \x7b\\n      width: 100%;\\n      min-height: 48px;\\n      background: var(--gold);\\n      color: var(--ink);\\n      border: none;\\n      border-radius: var(--radius);\\n      font-family: var(--font-head);\\n      font-size: 19px;\\n      font-weight: 800;\\n      letter-spacing: .3px;\\n      cursor: pointer;\\n      transition: all var(--trans);\\n      display: flex;\\n      align-items: center;\\n      justify-content: center;\\n      gap: 10px;\\n      -webkit-tap-highlight-color: transparent;\\n    \x7d\\n\\n    .btn-welcome-go:hover \x7b background: var(--gold-d); \x7d\\n    .btn-welcome-go:active \x7b transform: scale(0.98); \x7d\\n\\n    .welcome-draft-note \x7b\\n      text-align: center;\\n      font-size: 13px;\\n      color: rgba(255,255,255,.35);\\n      line-height: 1.4;\\n    \x7d\\n\\n    .welcome-draft-note button \x7b\\n      background: none;\\n      border: none;\\n      color: var(--gold);\\n      font-size: 13px;\\n      font-family: var(--font-body);\\n      cursor: pointer;\\n      text-decoration: underline;\\n      padding: 0;\\n    \x7d\\n\\n    .welcome-fee-note \x7b\\n      text-align: center;\\n      font-size: 13px;\\n      color: rgba(255,255,255,.6);\\n      margin-top: 10px;\\n      letter-spacing: .2px;\\n      line-height: 1.5;\\n    \x7d\\n\\n    .welcome-fee-note strong \x7b\\n      color: var(--gold);\\n      font-weight: 700;\\n    \x7d\\n\\n     \\n    .welcome-screen.exiting \x7b\\n      animation: welcomeExit .35s ease forwards;\\n    \x7d\\n\\n    @keyframes welcomeExit \x7b\\n      from \x7b opacity: 1; transform: translateY(0); \x7d\\n      to   \x7b opacity: 0; transform: translateY(-24px); \x7d\\n    \x7d\\n\\n    .form-body-wrap \x7b\\n      animation: formEnter .3s ease forwards;\\n    \x7d\\n\\n    @keyframes formEnter \x7b\\n      from \x7b opacity: 0; transform: translateY(12px); \x7d\\n      to   \x7b opacity: 1; transform: translateY(0); \x7d\\n    \x7d\\n     \\n    .group-card .group-card-body-wrap \x7b\\n       \\n    \x7d\\n\\n    @media (max-width: 780px) \x7b\\n      .group-card.complete.collapsed-mobile .team-btns \x7b display: none; \x7d\\n      .group-card.complete.collapsed-mobile .pos-bar \x7b margin-bottom: 0; \x7d\\n\\n       \\n      .group-card-header \x7b\\n        cursor: pointer;\\n        user-select: none;\\n        -webkit-tap-highlight-color: transparent;\\n      \x7d\\n\\n      .group-caret \x7b\\n        display: flex;\\n        align-items: center;\\n        justify-content: center;\\n        width: 22px;\\n        height: 22px;\\n        border-radius: 50%;\\n        border: 1.5px solid var(--border);\\n        color: var(--ink-3);\\n        flex-shrink: 0;\\n        font-size: 11px;\\n        transition: transform var(--trans);\\n      \x7d\\n\\n      .group-card.complete.collapsed-mobile .group-caret \x7b\\n        transform: rotate(-90deg);\\n      \x7d\\n    \x7d\\n\\n     \\n    .group-caret \x7b display: none; \x7d\\n    body.is-narrow .group-caret \x7b display: flex; \x7d\\n\\n     \\n\\n    body.is-narrow \x7b font-size: 15px; \x7d\\n\\n    body.is-narrow .grid-2 \x7b grid-template-columns: 1fr; \x7d\\n    body.is-narrow .card-body \x7b padding: 0 14px 16px; \x7d\\n    body.is-narrow .card-header \x7b padding: 14px; gap: 12px; \x7d\\n    body.is-narrow .card-number \x7b width: 32px; height: 32px; font-size: 15px; \x7d\\n    body.is-narrow .card-title-wrap h2 \x7b font-size: 20px; \x7d\\n    body.is-narrow .card-title-wrap p \x7b font-size: 13px; \x7d\\n\\n    body.is-narrow .hero \x7b padding: 20px 16px 18px; \x7d\\n    body.is-narrow .hero-sub \x7b font-size: 14px; \x7d\\n    body.is-narrow .hero-meta \x7b gap: 8px; \x7d\\n    body.is-narrow .hero-clear-btn \x7b min-height: 34px; font-size: 12px; padding: 4px 12px; \x7d\\n\\n    body.is-narrow .progress-bar-wrap \x7b padding: 0 10px; min-height: 44px; \x7d\\n    body.is-narrow .ps-item \x7b padding: 0 8px; font-size: 11px; min-height: 44px; gap: 6px; \x7d\\n    body.is-narrow .ps-dot \x7b width: 18px; height: 18px; font-size: 9px; \x7d\\n    body.is-narrow .draft-banner \x7b display: none; \x7d\\n\\n    body.is-narrow .group-card \x7b padding: 12px; \x7d\\n    body.is-narrow .team-btn \x7b min-height: 46px; padding: 9px 12px; font-size: 14px; \x7d\\n    body.is-narrow .team-btn-pos \x7b width: 26px; height: 26px; font-size: 11px; \x7d\\n    body.is-narrow .pos-slot \x7b min-height: 38px; padding: 6px 7px; \x7d\\n    body.is-narrow .pos-slot-team \x7b font-size: 12px; \x7d\\n    body.is-narrow .pos-slot-label \x7b font-size: 11px; \x7d\\n\\n    body.is-narrow .match-row \x7b display: none; \x7d\\n    body.is-narrow .match-row-mobile \x7b display: block; \x7d\\n    body.is-narrow .match-card \x7b padding: 10px 12px; \x7d\\n    body.is-narrow .mobile-team-score-row \x7b padding: 6px 0; gap: 10px; \x7d\\n    body.is-narrow .mobile-team-name \x7b font-size: 14px; \x7d\\n    body.is-narrow .score-input \x7b width: 48px; height: 44px; font-size: 20px; \x7d\\n\\n    body.is-narrow .rank-item \x7b grid-template-columns: 36px 1fr; padding: 10px 12px; gap: 10px; \x7d\\n    body.is-narrow .rank-controls \x7b grid-column: 1 \/ -1; justify-content: stretch; gap: 8px; margin-top: 4px; \x7d\\n    body.is-narrow .rank-controls .rank-mini-btn \x7b flex: 1; height: 38px; font-size: 16px; \x7d\\n    body.is-narrow .rank-main \x7b flex-wrap: wrap; \x7d\\n\\n    body.is-narrow .round-header \x7b padding: 14px; \x7d\\n    body.is-narrow .round-title \x7b font-size: 16px; \x7d\\n    body.is-narrow .round-body \x7b padding: 10px 12px; \x7d\\n\\n    body.is-narrow .btn \x7b min-height: 48px; padding: 0 22px; font-size: 15px; \x7d\\n\\n    body.is-narrow .countdown-units \x7b display: flex; flex-wrap: wrap; justify-content: center; margin-top: 6px; margin-left: 0; gap: 3px; \x7d\\n    body.is-narrow #countdownBanner \x7b padding: 10px 14px; font-size: 12px; \x7d\\n\\n    body.is-narrow .champion-box \x7b padding: 16px; gap: 14px; \x7d\\n    body.is-narrow .champion-trophy \x7b font-size: 30px; \x7d\\n    body.is-narrow .champion-name \x7b font-size: 24px; \x7d\\n\\n    body.is-narrow .autosave-note \x7b font-size: 12px; padding: 9px 12px; \x7d\\n    body.is-narrow .submit-locked \x7b padding: 16px; font-size: 13px; \x7d\\n    body.is-narrow #submitBtn \x7b width: 100%; justify-content: center; \x7d\\n\\n     \\n    body.is-very-narrow .ps-item span \x7b display: none; \x7d\\n    body.is-very-narrow .ps-item \x7b padding: 0 6px; border-right-color: transparent; \x7d\\n    body.is-very-narrow .hero h1 \x7b font-size: 30px; \x7d\\n    body.is-very-narrow .hero-eyebrow \x7b font-size: 11px; letter-spacing: 1.5px; \x7d\\n    body.is-very-narrow .group-card h3 \x7b font-size: 16px; \x7d\\n    body.is-very-narrow .round-title \x7b font-size: 15px; \x7d\\n\\n  \x3c\\\/style\x3e\\n\x3c\\\/head\x3e\\n\x3cbody\x3e\\n\\n\x3cnav style\x3d\\\x22position:sticky;top:0;z-index:200;background:#1a1f2e;height:60px;display:flex;align-items:center;padding:0 20px;box-shadow:0 2px 12px rgba(0,0,0,.2);\\\x22\x3e\\n  \x3ca href\x3d\\\x22https:\/\/predictioncompetitions.github.io\/wc2026\/index.html\\\x22 style\x3d\\\x22display:flex;align-items:center;gap:10px;text-decoration:none;flex-shrink:0;\\\x22\x3e\\n    \x3cspan style\x3d\\\x22font-size:20px;line-height:1;\\\x22\x3e⚽\x3c\\\/span\x3e\\n    \x3cspan style\x3d\\\x22font-family:\x27Barlow Condensed\x27,sans-serif;font-size:18px;font-weight:800;color:#fff;letter-spacing:-.2px;\\\x22\x3eMick\x27s \x3cspan style\x3d\\\x22color:#d4a843;\\\x22\x3eWC26\x3c\\\/span\x3e\x3c\\\/span\x3e\\n  \x3c\\\/a\x3e\\n  \x3cdiv style\x3d\\\x22margin-left:auto;display:flex;\\\x22 id\x3d\\\x22siteNavLinks\\\x22\x3e\\n    \x3ca href\x3d\\\x22https:\/\/predictioncompetitions.github.io\/wc2026\/index.html\\\x22 style\x3d\\\x22display:flex;align-items:center;height:60px;padding:0 12px;font-family:\x27Barlow Condensed\x27,sans-serif;font-size:12px;font-weight:700;letter-spacing:.5px;text-transform:uppercase;color:rgba(255,255,255,.55);text-decoration:none;\\\x22\x3e🏠 Home\x3c\\\/a\x3e\\n    \x3ca href\x3d\\\x22https:\/\/predictioncompetitions.github.io\/wc2026\/rules.html\\\x22 style\x3d\\\x22display:flex;align-items:center;height:60px;padding:0 12px;font-family:\x27Barlow Condensed\x27,sans-serif;font-size:12px;font-weight:700;letter-spacing:.5px;text-transform:uppercase;color:rgba(255,255,255,.55);text-decoration:none;\\\x22\x3e📋 Rules\x3c\\\/a\x3e\\n    \x3ca href\x3d\\\x22https:\/\/predictioncompetitions.github.io\/wc2026\/leaderboard.html\\\x22 style\x3d\\\x22display:flex;align-items:center;height:60px;padding:0 12px;font-family:\x27Barlow Condensed\x27,sans-serif;font-size:12px;font-weight:700;letter-spacing:.5px;text-transform:uppercase;color:rgba(255,255,255,.55);text-decoration:none;\\\x22\x3e🏆 Leaderboard\x3c\\\/a\x3e\\n  \x3c\\\/div\x3e\\n\x3c\\\/nav\x3e\\n\\n\\n\x3cdiv id\x3d\\\x22countdownBanner\\\x22\x3e\\n  \x3cspan id\x3d\\\x22countdownText\\\x22\x3e⏰ Entries close in\x3c\\\/span\x3e\\n  \x3cspan class\x3d\\\x22countdown-units\\\x22 id\x3d\\\x22countdownUnits\\\x22\x3e\\n    \x3cspan class\x3d\\\x22cd-unit\\\x22\x3e\x3cspan class\x3d\\\x22cd-num\\\x22 id\x3d\\\x22cd-days\\\x22\x3e--\x3c\\\/span\x3e\x3cspan class\x3d\\\x22cd-label\\\x22\x3eDays\x3c\\\/span\x3e\x3c\\\/span\x3e\\n    \x3cspan class\x3d\\\x22cd-sep\\\x22\x3e:\x3c\\\/span\x3e\\n    \x3cspan class\x3d\\\x22cd-unit\\\x22\x3e\x3cspan class\x3d\\\x22cd-num\\\x22 id\x3d\\\x22cd-hours\\\x22\x3e--\x3c\\\/span\x3e\x3cspan class\x3d\\\x22cd-label\\\x22\x3eHrs\x3c\\\/span\x3e\x3c\\\/span\x3e\\n    \x3cspan class\x3d\\\x22cd-sep\\\x22\x3e:\x3c\\\/span\x3e\\n    \x3cspan class\x3d\\\x22cd-unit\\\x22\x3e\x3cspan class\x3d\\\x22cd-num\\\x22 id\x3d\\\x22cd-mins\\\x22\x3e--\x3c\\\/span\x3e\x3cspan class\x3d\\\x22cd-label\\\x22\x3eMin\x3c\\\/span\x3e\x3c\\\/span\x3e\\n    \x3cspan class\x3d\\\x22cd-sep\\\x22\x3e:\x3c\\\/span\x3e\\n    \x3cspan class\x3d\\\x22cd-unit\\\x22\x3e\x3cspan class\x3d\\\x22cd-num\\\x22 id\x3d\\\x22cd-secs\\\x22\x3e--\x3c\\\/span\x3e\x3cspan class\x3d\\\x22cd-label\\\x22\x3eSec\x3c\\\/span\x3e\x3c\\\/span\x3e\\n  \x3c\\\/span\x3e\\n\x3c\\\/div\x3e\\n\\n\\n\x3cdiv id\x3d\\\x22closedScreen\\\x22\x3e\\n  \x3cdiv class\x3d\\\x22closed-bg-gradient\\\x22\x3e\x3c\\\/div\x3e\\n  \x3cdiv class\x3d\\\x22closed-rainbow\\\x22\x3e\x3c\\\/div\x3e\\n  \x3cdiv class\x3d\\\x22closed-inner\\\x22\x3e\\n    \x3cspan class\x3d\\\x22closed-icon\\\x22 id\x3d\\\x22closedIcon\\\x22\x3e🔒\x3c\\\/span\x3e\\n    \x3cdiv class\x3d\\\x22closed-eyebrow\\\x22 id\x3d\\\x22closedEyebrow\\\x22\x3eEntries Closed\x3c\\\/div\x3e\\n    \x3ch1 class\x3d\\\x22closed-title\\\x22 id\x3d\\\x22closedTitle\\\x22\x3eThe predictor is now \x3cspan\x3eclosed\x3c\\\/span\x3e\x3c\\\/h1\x3e\\n    \x3cp class\x3d\\\x22closed-body\\\x22 id\x3d\\\x22closedBody\\\x22\x3e\\n      The deadline for entries has passed. Thanks to everyone who took part \\u2014 the competition is now locked in and ready to go!\\n    \x3c\\\/p\x3e\\n    \x3cdiv class\x3d\\\x22closed-deadline-box\\\x22 id\x3d\\\x22closedDeadlineBox\\\x22 style\x3d\\\x22display:none\\\x22\x3e\\n      \x3cdiv class\x3d\\\x22closed-deadline-label\\\x22\x3eEntry deadline was\x3c\\\/div\x3e\\n      \x3cdiv class\x3d\\\x22closed-deadline-value\\\x22 id\x3d\\\x22closedDeadlineValue\\\x22\x3e\x3c\\\/div\x3e\\n    \x3c\\\/div\x3e\\n    \x3cdiv class\x3d\\\x22closed-pills\\\x22\x3e\\n      \x3cspan class\x3d\\\x22closed-pill secondary\\\x22\x3e⚽ World Cup 2026 kicks off on 11 June 2026\x3c\\\/span\x3e\\n    \x3c\\\/div\x3e\\n    \x3cdiv class\x3d\\\x22closed-footer\\\x22 id\x3d\\\x22closedFooter\\\x22\x3eWorld Cup 2026 Predictor\x3c\\\/div\x3e\\n  \x3c\\\/div\x3e\\n\x3c\\\/div\x3e\\n\\n\\n\x3cdiv id\x3d\\\x22mainFormWrap\\\x22 class\x3d\\\x22hidden\\\x22\x3e\\n\\n  \\n  \x3cdiv class\x3d\\\x22welcome-screen\\\x22 id\x3d\\\x22welcomeScreen\\\x22\x3e\\n    \x3cdiv class\x3d\\\x22welcome-rainbow\\\x22\x3e\x3c\\\/div\x3e\\n    \x3cdiv class\x3d\\\x22welcome-inner\\\x22\x3e\\n      \x3cdiv class\x3d\\\x22welcome-eyebrow\\\x22\x3eFIFA World Cup 2026\x3c\\\/div\x3e\\n      \x3ch1 class\x3d\\\x22welcome-title\\\x22\x3eMick\x27s World Cup\x3cbr\x3e\x3cspan\x3ePredictor\x3c\\\/span\x3e\x3c\\\/h1\x3e\\n      \x3cp class\x3d\\\x22welcome-sub\\\x22\x3eHere\x27s how it works \\u2014 five steps from start to submit.\x3c\\\/p\x3e\\n\\n      \x3cdiv class\x3d\\\x22welcome-steps\\\x22\x3e\\n\\n        \x3cdiv class\x3d\\\x22welcome-step\\\x22\x3e\\n          \x3cdiv class\x3d\\\x22ws-num\\\x22\x3e1\x3c\\\/div\x3e\\n          \x3cdiv class\x3d\\\x22ws-icon\\\x22\x3e📝\x3c\\\/div\x3e\\n          \x3cdiv class\x3d\\\x22ws-content\\\x22\x3e\\n            \x3cdiv class\x3d\\\x22ws-label\\\x22\x3eYour details\x3c\\\/div\x3e\\n            \x3cdiv class\x3d\\\x22ws-desc\\\x22\x3eEnter your name and email address so we can record your entry.\x3c\\\/div\x3e\\n          \x3c\\\/div\x3e\\n        \x3c\\\/div\x3e\\n\\n        \x3cdiv class\x3d\\\x22welcome-step\\\x22\x3e\\n          \x3cdiv class\x3d\\\x22ws-num\\\x22\x3e2\x3c\\\/div\x3e\\n          \x3cdiv class\x3d\\\x22ws-icon\\\x22\x3e🌍\x3c\\\/div\x3e\\n          \x3cdiv class\x3d\\\x22ws-content\\\x22\x3e\\n            \x3cdiv class\x3d\\\x22ws-label\\\x22\x3eGroup predictions\x3c\\\/div\x3e\\n            \x3cdiv class\x3d\\\x22ws-desc\\\x22\x3eFor each of the 12 groups, tap teams to set who finishes 1st, 2nd and 3rd.\x3c\\\/div\x3e\\n          \x3c\\\/div\x3e\\n        \x3c\\\/div\x3e\\n\\n        \x3cdiv class\x3d\\\x22welcome-step\\\x22\x3e\\n          \x3cdiv class\x3d\\\x22ws-num\\\x22\x3e3\x3c\\\/div\x3e\\n          \x3cdiv class\x3d\\\x22ws-icon\\\x22\x3e🔢\x3c\\\/div\x3e\\n          \x3cdiv class\x3d\\\x22ws-content\\\x22\x3e\\n            \x3cdiv class\x3d\\\x22ws-label\\\x22\x3eRank the third-placed teams\x3c\\\/div\x3e\\n            \x3cdiv class\x3d\\\x22ws-desc\\\x22\x3eOnce groups are done, drag to rank all 12 third-placed teams. The top 8 qualify for the knockout stage.\x3c\\\/div\x3e\\n          \x3c\\\/div\x3e\\n        \x3c\\\/div\x3e\\n\\n        \x3cdiv class\x3d\\\x22welcome-step\\\x22\x3e\\n          \x3cdiv class\x3d\\\x22ws-num\\\x22\x3e4\x3c\\\/div\x3e\\n          \x3cdiv class\x3d\\\x22ws-icon\\\x22\x3e⚔️\x3c\\\/div\x3e\\n          \x3cdiv class\x3d\\\x22ws-content\\\x22\x3e\\n            \x3cdiv class\x3d\\\x22ws-label\\\x22\x3eKnockout stage scores\x3c\\\/div\x3e\\n            \x3cdiv class\x3d\\\x22ws-desc\\\x22\x3ePredict every score from the Round of 32 through to the Final. Winners automatically progress \\u2014 the fixture list will build itself as you go. No draws allowed; for a penalty win, enter it as a 1-goal win.\x3c\\\/div\x3e\\n          \x3c\\\/div\x3e\\n        \x3c\\\/div\x3e\\n\\n        \x3cdiv class\x3d\\\x22welcome-step\\\x22\x3e\\n          \x3cdiv class\x3d\\\x22ws-num\\\x22\x3e5\x3c\\\/div\x3e\\n          \x3cdiv class\x3d\\\x22ws-icon\\\x22\x3e🏆\x3c\\\/div\x3e\\n          \x3cdiv class\x3d\\\x22ws-content\\\x22\x3e\\n            \x3cdiv class\x3d\\\x22ws-label\\\x22\x3eSubmit\x3c\\\/div\x3e\\n            \x3cdiv class\x3d\\\x22ws-desc\\\x22\x3eOnce every step is complete the submit button appears. You\x27ll get a confirmation email with a PDF of all your picks.\x3c\\\/div\x3e\\n          \x3c\\\/div\x3e\\n        \x3c\\\/div\x3e\\n\\n      \x3c\\\/div\x3e\\n\\n      \x3cdiv class\x3d\\\x22welcome-actions\\\x22\x3e\\n        \x3cbutton type\x3d\\\x22button\\\x22 class\x3d\\\x22btn-welcome-go\\\x22 id\x3d\\\x22welcomeGoBtn\\\x22\x3e\\n          Let\x27s go ⚽\\n        \x3c\\\/button\x3e\\n        \x3cdiv class\x3d\\\x22welcome-draft-note\\\x22 id\x3d\\\x22welcomeDraftNote\\\x22 style\x3d\\\x22display:none;\\\x22\x3e\\n          You have a saved draft \\u2014 \x3cbutton type\x3d\\\x22button\\\x22 id\x3d\\\x22welcomeContinueBtn\\\x22\x3econtinue where you left off\x3c\\\/button\x3e\\n        \x3c\\\/div\x3e\\n      \x3c\\\/div\x3e\\n\\n      \x3cdiv class\x3d\\\x22welcome-fee-note\\\x22\x3e\x3cstrong\x3e\\u20ac10\x3c\\\/strong\x3e entry fee · \x3cstrong\x3e100%\x3c\\\/strong\x3e goes to the prize pool · Entries auto-save as you go\x3c\\\/div\x3e\\n    \x3c\\\/div\x3e\\n  \x3c\\\/div\x3e\\n\\n  \\n  \x3cdiv id\x3d\\\x22formBodyWrap\\\x22 class\x3d\\\x22hidden\\\x22\x3e\\n\\n  \x3cdiv class\x3d\\\x22progress-bar-wrap\\\x22 id\x3d\\\x22progressBar\\\x22\x3e\\n    \x3cdiv class\x3d\\\x22progress-steps\\\x22\x3e\\n      \x3cdiv class\x3d\\\x22ps-item active\\\x22 id\x3d\\\x22ps1\\\x22\x3e\\n        \x3cdiv class\x3d\\\x22ps-dot\\\x22 data-n\x3d\\\x221\\\x22\x3e\x3c\\\/div\x3e\\n        \x3cspan\x3eDetails\x3c\\\/span\x3e\\n      \x3c\\\/div\x3e\\n      \x3cdiv class\x3d\\\x22ps-item\\\x22 id\x3d\\\x22ps2\\\x22\x3e\\n        \x3cdiv class\x3d\\\x22ps-dot\\\x22 data-n\x3d\\\x222\\\x22\x3e\x3c\\\/div\x3e\\n        \x3cspan\x3eGroups\x3c\\\/span\x3e\\n      \x3c\\\/div\x3e\\n      \x3cdiv class\x3d\\\x22ps-item\\\x22 id\x3d\\\x22ps3\\\x22\x3e\\n        \x3cdiv class\x3d\\\x22ps-dot\\\x22 data-n\x3d\\\x223\\\x22\x3e\x3c\\\/div\x3e\\n        \x3cspan\x3e3rd-place rank\x3c\\\/span\x3e\\n      \x3c\\\/div\x3e\\n      \x3cdiv class\x3d\\\x22ps-item\\\x22 id\x3d\\\x22ps4\\\x22\x3e\\n        \x3cdiv class\x3d\\\x22ps-dot\\\x22 data-n\x3d\\\x224\\\x22\x3e\x3c\\\/div\x3e\\n        \x3cspan\x3eKnockout Stages\x3c\\\/span\x3e\\n      \x3c\\\/div\x3e\\n      \x3cdiv class\x3d\\\x22ps-item\\\x22 id\x3d\\\x22ps5\\\x22\x3e\\n        \x3cdiv class\x3d\\\x22ps-dot\\\x22 data-n\x3d\\\x225\\\x22\x3e\x3c\\\/div\x3e\\n        \x3cspan\x3eSubmit\x3c\\\/span\x3e\\n      \x3c\\\/div\x3e\\n    \x3c\\\/div\x3e\\n    \x3cdiv style\x3d\\\x22margin-left:auto;padding-left:12px;\\\x22\x3e\\n      \x3cdiv class\x3d\\\x22draft-banner\\\x22 id\x3d\\\x22draftBanner\\\x22\x3eNo saved draft\x3c\\\/div\x3e\\n    \x3c\\\/div\x3e\\n  \x3c\\\/div\x3e\\n\\n  \x3cdiv class\x3d\\\x22hero\\\x22\x3e\\n    \x3cdiv class\x3d\\\x22hero-inner\\\x22\x3e\\n      \x3cdiv class\x3d\\\x22hero-eyebrow\\\x22\x3eFIFA · Mick\x27s World Cup 2026 Predictor\x3c\\\/div\x3e\\n      \x3ch1 id\x3d\\\x22competitionTitle\\\x22\x3eYour \x3cspan\x3eEntry\x3c\\\/span\x3e\x3c\\\/h1\x3e\\n      \x3cdiv class\x3d\\\x22hero-meta\\\x22\x3e\\n        \x3cdiv class\x3d\\\x22hero-pill\\\x22\x3e\x3cspan class\x3d\\\x22dot\\\x22\x3e\x3c\\\/span\x3e Entries open\x3c\\\/div\x3e\\n        \x3cbutton type\x3d\\\x22button\\\x22 class\x3d\\\x22hero-clear-btn\\\x22 id\x3d\\\x22clearDraftBtn\\\x22\x3eClear saved draft\x3c\\\/button\x3e\\n      \x3c\\\/div\x3e\\n    \x3c\\\/div\x3e\\n  \x3c\\\/div\x3e\\n\\n  \x3cdiv class\x3d\\\x22save-toast\\\x22 id\x3d\\\x22saveToast\\\x22\x3e\\n    \x3cspan class\x3d\\\x22save-dot\\\x22\x3e\x3c\\\/span\x3e\\n    Draft saved\\n  \x3c\\\/div\x3e\\n\\n  \x3cdiv class\x3d\\\x22container\\\x22\x3e\\n\\n    \x3cdiv class\x3d\\\x22autosave-note\\\x22\x3e\\n      \x3csvg width\x3d\\\x2215\\\x22 height\x3d\\\x2215\\\x22 viewBox\x3d\\\x220 0 15 15\\\x22 fill\x3d\\\x22none\\\x22 xmlns\x3d\\\x22http:\/\/www.w3.org\/2000\/svg\\\x22\x3e\\n        \x3cpath d\x3d\\\x22M7.5 1a6.5 6.5 0 100 13A6.5 6.5 0 007.5 1zm0 1a5.5 5.5 0 110 11A5.5 5.5 0 017.5 2zm0 3a.75.75 0 100 1.5.75.75 0 000-1.5zm-.5 2.5v4h1v-4h-1z\\\x22 fill\x3d\\\x22currentColor\\\x22\/\x3e\\n      \x3c\\\/svg\x3e\\n      Your progress is \x3cstrong\x3eautomatically saved\x3c\\\/strong\x3e to this device as you fill in the form \\u2014 you can safely close the tab and return later.\\n    \x3c\\\/div\x3e\\n\\n    \x3cform id\x3d\\\x22predictorForm\\\x22 novalidate\x3e\\n\\n      \x3cdiv class\x3d\\\x22card\\\x22 id\x3d\\\x22card-details\\\x22\x3e\\n        \x3cdiv class\x3d\\\x22card-header\\\x22\x3e\\n          \x3cdiv class\x3d\\\x22card-number\\\x22\x3e1\x3c\\\/div\x3e\\n          \x3cdiv class\x3d\\\x22card-title-wrap\\\x22\x3e\\n            \x3ch2\x3eYour details\x3c\\\/h2\x3e\\n            \x3cp\x3eEnter your name and email exactly as you want them recorded.\x3c\\\/p\x3e\\n          \x3c\\\/div\x3e\\n          \x3cdiv class\x3d\\\x22section-complete-badge\\\x22 id\x3d\\\x22badge-details\\\x22\x3e\\n            \x3csvg width\x3d\\\x2212\\\x22 height\x3d\\\x2212\\\x22 viewBox\x3d\\\x220 0 12 12\\\x22 fill\x3d\\\x22none\\\x22\x3e\x3cpath d\x3d\\\x22M2 6l3 3 5-5\\\x22 stroke\x3d\\\x22currentColor\\\x22 stroke-width\x3d\\\x221.5\\\x22 stroke-linecap\x3d\\\x22round\\\x22 stroke-linejoin\x3d\\\x22round\\\x22\/\x3e\x3c\\\/svg\x3e\\n            Complete\\n          \x3c\\\/div\x3e\\n        \x3c\\\/div\x3e\\n        \x3cdiv class\x3d\\\x22card-body\\\x22\x3e\\n          \x3cdiv class\x3d\\\x22grid-2\\\x22\x3e\\n            \x3cdiv class\x3d\\\x22field\\\x22\x3e\\n              \x3clabel for\x3d\\\x22fullName\\\x22\x3eFull name\x3c\\\/label\x3e\\n              \x3cinput type\x3d\\\x22text\\\x22 id\x3d\\\x22fullName\\\x22 name\x3d\\\x22FULL_NAME\\\x22 maxlength\x3d\\\x22100\\\x22 required autocomplete\x3d\\\x22name\\\x22 placeholder\x3d\\\x22e.g. Joe Bloggs\\\x22 \/\x3e\\n              \x3cdiv class\x3d\\\x22field-error\\\x22 id\x3d\\\x22fullNameError\\\x22\x3e\x3c\\\/div\x3e\\n            \x3c\\\/div\x3e\\n            \x3cdiv class\x3d\\\x22field\\\x22\x3e\\n              \x3clabel for\x3d\\\x22email\\\x22\x3eEmail address\x3c\\\/label\x3e\\n              \x3cinput type\x3d\\\x22email\\\x22 id\x3d\\\x22email\\\x22 name\x3d\\\x22EMAIL\\\x22 maxlength\x3d\\\x22150\\\x22 required autocomplete\x3d\\\x22email\\\x22 placeholder\x3d\\\x22you@example.com\\\x22 \/\x3e\\n              \x3cdiv class\x3d\\\x22field-error\\\x22 id\x3d\\\x22emailError\\\x22\x3e\x3c\\\/div\x3e\\n            \x3c\\\/div\x3e\\n          \x3c\\\/div\x3e\\n        \x3c\\\/div\x3e\\n      \x3c\\\/div\x3e\\n\\n      \x3cdiv class\x3d\\\x22card\\\x22 id\x3d\\\x22card-groups\\\x22\x3e\\n        \x3cdiv class\x3d\\\x22card-header collapsable\\\x22 id\x3d\\\x22card-groups-header\\\x22\x3e\\n          \x3cdiv class\x3d\\\x22card-number\\\x22\x3e2\x3c\\\/div\x3e\\n          \x3cdiv class\x3d\\\x22card-title-wrap\\\x22\x3e\\n            \x3ch2\x3eGroup predictions\x3c\\\/h2\x3e\\n            \x3cp\x3eTap a team to set who finishes 1st, 2nd and 3rd.. Tap × on a slot to clear it.\x3c\\\/p\x3e\\n          \x3c\\\/div\x3e\\n          \x3cdiv class\x3d\\\x22section-complete-badge\\\x22 id\x3d\\\x22badge-groups\\\x22\x3e\\n            \x3csvg width\x3d\\\x2212\\\x22 height\x3d\\\x2212\\\x22 viewBox\x3d\\\x220 0 12 12\\\x22 fill\x3d\\\x22none\\\x22\x3e\x3cpath d\x3d\\\x22M2 6l3 3 5-5\\\x22 stroke\x3d\\\x22currentColor\\\x22 stroke-width\x3d\\\x221.5\\\x22 stroke-linecap\x3d\\\x22round\\\x22 stroke-linejoin\x3d\\\x22round\\\x22\/\x3e\x3c\\\/svg\x3e\\n            Complete\\n          \x3c\\\/div\x3e\\n          \x3cdiv class\x3d\\\x22collapse-chevron\\\x22\x3e\\n            \x3csvg width\x3d\\\x2212\\\x22 height\x3d\\\x2212\\\x22 viewBox\x3d\\\x220 0 12 12\\\x22 fill\x3d\\\x22none\\\x22\x3e\x3cpath d\x3d\\\x22M2 4l4 4 4-4\\\x22 stroke\x3d\\\x22currentColor\\\x22 stroke-width\x3d\\\x221.5\\\x22 stroke-linecap\x3d\\\x22round\\\x22 stroke-linejoin\x3d\\\x22round\\\x22\/\x3e\x3c\\\/svg\x3e\\n          \x3c\\\/div\x3e\\n        \x3c\\\/div\x3e\\n        \x3cdiv class\x3d\\\x22card-body\\\x22\x3e\\n          \x3cdiv class\x3d\\\x22groups-progress\\\x22\x3e\\n            \x3cspan class\x3d\\\x22groups-progress-label\\\x22\x3eGroups completed\x3c\\\/span\x3e\\n            \x3cdiv class\x3d\\\x22groups-progress-track\\\x22\x3e\\n              \x3cdiv class\x3d\\\x22groups-progress-fill\\\x22 id\x3d\\\x22groupsProgressFill\\\x22 style\x3d\\\x22width:0%\\\x22\x3e\x3c\\\/div\x3e\\n            \x3c\\\/div\x3e\\n            \x3cspan class\x3d\\\x22groups-progress-count\\\x22 id\x3d\\\x22groupsProgressCount\\\x22\x3e0 \/ 12\x3c\\\/span\x3e\\n          \x3c\\\/div\x3e\\n          \x3cdiv class\x3d\\\x22grid-groups\\\x22 id\x3d\\\x22groupsContainer\\\x22\x3e\x3c\\\/div\x3e\\n          \x3cdiv class\x3d\\\x22section-error\\\x22 id\x3d\\\x22groupsError\\\x22\x3e\x3c\\\/div\x3e\\n        \x3c\\\/div\x3e\\n      \x3c\\\/div\x3e\\n\\n      \x3cdiv class\x3d\\\x22card\\\x22 id\x3d\\\x22card-third\\\x22\x3e\\n        \x3cdiv class\x3d\\\x22card-header collapsable\\\x22 id\x3d\\\x22card-third-header\\\x22\x3e\\n          \x3cdiv class\x3d\\\x22card-number\\\x22\x3e3\x3c\\\/div\x3e\\n          \x3cdiv class\x3d\\\x22card-title-wrap\\\x22\x3e\\n            \x3ch2\x3eRank your 12 third-placed teams\x3c\\\/h2\x3e\\n            \x3cp\x3eYour ranking appears automatically once all groups are complete. Drag teams or use the ↑ ↓ buttons. Only the top 8 qualify.\x3c\\\/p\x3e\\n          \x3c\\\/div\x3e\\n          \x3cdiv class\x3d\\\x22section-complete-badge\\\x22 id\x3d\\\x22badge-third\\\x22\x3e\\n            \x3csvg width\x3d\\\x2212\\\x22 height\x3d\\\x2212\\\x22 viewBox\x3d\\\x220 0 12 12\\\x22 fill\x3d\\\x22none\\\x22\x3e\x3cpath d\x3d\\\x22M2 6l3 3 5-5\\\x22 stroke\x3d\\\x22currentColor\\\x22 stroke-width\x3d\\\x221.5\\\x22 stroke-linecap\x3d\\\x22round\\\x22 stroke-linejoin\x3d\\\x22round\\\x22\/\x3e\x3c\\\/svg\x3e\\n            Complete\\n          \x3c\\\/div\x3e\\n          \x3cdiv class\x3d\\\x22collapse-chevron\\\x22\x3e\\n            \x3csvg width\x3d\\\x2212\\\x22 height\x3d\\\x2212\\\x22 viewBox\x3d\\\x220 0 12 12\\\x22 fill\x3d\\\x22none\\\x22\x3e\x3cpath d\x3d\\\x22M2 4l4 4 4-4\\\x22 stroke\x3d\\\x22currentColor\\\x22 stroke-width\x3d\\\x221.5\\\x22 stroke-linecap\x3d\\\x22round\\\x22 stroke-linejoin\x3d\\\x22round\\\x22\/\x3e\x3c\\\/svg\x3e\\n          \x3c\\\/div\x3e\\n        \x3c\\\/div\x3e\\n        \x3cdiv class\x3d\\\x22card-body\\\x22\x3e\\n          \x3cdiv id\x3d\\\x22thirdRankLocked\\\x22 class\x3d\\\x22third-rank-locked\\\x22\x3e\\n            Complete all 12 groups above and your 3rd-place ranking will appear here automatically.\\n          \x3c\\\/div\x3e\\n          \x3cdiv id\x3d\\\x22thirdRankSection\\\x22 class\x3d\\\x22hidden\\\x22\x3e\\n            \x3cdiv class\x3d\\\x22rank-list\\\x22 id\x3d\\\x22thirdRankList\\\x22\x3e\x3c\\\/div\x3e\\n            \x3cdiv class\x3d\\\x22qualification-note\\\x22\x3e\\n              Only the top 8 third-placed teams qualify for the knockout stage. Teams ranked 9\\u201312 (shown in dark) are eliminated.\\n            \x3c\\\/div\x3e\\n          \x3c\\\/div\x3e\\n          \x3cdiv class\x3d\\\x22section-error\\\x22 id\x3d\\\x22thirdRankError\\\x22\x3e\x3c\\\/div\x3e\\n        \x3c\\\/div\x3e\\n      \x3c\\\/div\x3e\\n\\n      \x3cdiv class\x3d\\\x22card\\\x22 id\x3d\\\x22card-bracket\\\x22\x3e\\n        \x3cdiv class\x3d\\\x22card-header\\\x22\x3e\\n          \x3cdiv class\x3d\\\x22card-number\\\x22\x3e4\x3c\\\/div\x3e\\n          \x3cdiv class\x3d\\\x22card-title-wrap\\\x22\x3e\\n            \x3ch2\x3eKnockout Stages\x3c\\\/h2\x3e\\n            \x3cp\x3eGenerate your knock out stages, then predict every score. No draws are allowed. For a penalty win, record it as a 1-goal win.\x3c\\\/p\x3e\\n          \x3c\\\/div\x3e\\n          \x3cdiv class\x3d\\\x22section-complete-badge\\\x22 id\x3d\\\x22badge-bracket\\\x22\x3e\\n            \x3csvg width\x3d\\\x2212\\\x22 height\x3d\\\x2212\\\x22 viewBox\x3d\\\x220 0 12 12\\\x22 fill\x3d\\\x22none\\\x22\x3e\x3cpath d\x3d\\\x22M2 6l3 3 5-5\\\x22 stroke\x3d\\\x22currentColor\\\x22 stroke-width\x3d\\\x221.5\\\x22 stroke-linecap\x3d\\\x22round\\\x22 stroke-linejoin\x3d\\\x22round\\\x22\/\x3e\x3c\\\/svg\x3e\\n            Complete\\n          \x3c\\\/div\x3e\\n        \x3c\\\/div\x3e\\n        \x3cdiv class\x3d\\\x22card-body\\\x22\x3e\\n          \x3cdiv class\x3d\\\x22actions\\\x22\x3e\\n            \x3cbutton type\x3d\\\x22button\\\x22 class\x3d\\\x22btn btn-primary\\\x22 id\x3d\\\x22generateBracketBtn\\\x22\x3eGenerate Knock Out stages\x3c\\\/button\x3e\\n          \x3c\\\/div\x3e\\n\\n          \x3cdiv class\x3d\\\x22expand-note\\\x22\x3e\\n            \x3cbutton type\x3d\\\x22button\\\x22 class\x3d\\\x22expand-note-btn\\\x22 id\x3d\\\x22thirdPlaceNoteBtn\\\x22\x3e\\n              \x3cspan\x3eClick here for information on how 3rd-placed teams are assigned in the Round of 32\x3c\\\/span\x3e\\n              \x3cspan class\x3d\\\x22expand-note-icon\\\x22 id\x3d\\\x22thirdPlaceNoteIcon\\\x22\x3e+\x3c\\\/span\x3e\\n            \x3c\\\/button\x3e\\n            \x3cdiv class\x3d\\\x22expand-note-body\\\x22 id\x3d\\\x22thirdPlaceNoteBody\\\x22\x3e\\n              \x3cp\x3eFor this prediction competition, the Round of 32 fixtures involving the best third-placed teams are generated using a simplified competition method rather than FIFA\x27s full official allocation system.\x3c\\\/p\x3e\\n              \x3cp\x3eIn the official FIFA World Cup 2026 format, the eight best third-placed teams are allocated using a more detailed tournament matrix that depends on exactly which groups those teams come from.\x3c\\\/p\x3e\\n              \x3cp\x3eFor this competition, the top 8 third-placed teams still qualify based on your rankings, but their Round of 32 matchups are then allocated using this competition\x27s own simplified fixture logic.\x3c\\\/p\x3e\\n              \x3cp\x3eSafeguards are included to avoid obvious anomalies, such as a group winner being drawn against the third-placed team from its own group in the Round of 32, and to help keep each side of the draw balanced.\x3c\\\/p\x3e\\n              \x3cp\x3eAs a result, some Round of 32 pairings may differ from the exact official FIFA tournament bracket.\x3c\\\/p\x3e\\n            \x3c\\\/div\x3e\\n          \x3c\\\/div\x3e\\n\\n          \x3cdiv class\x3d\\\x22status-msg\\\x22 id\x3d\\\x22bracketStatus\\\x22 style\x3d\\\x22margin-top:10px;\\\x22\x3e\x3c\\\/div\x3e\\n\\n          \x3cdiv id\x3d\\\x22bracketSection\\\x22 class\x3d\\\x22hidden\\\x22 style\x3d\\\x22margin-top:16px;display:flex;flex-direction:column;gap:10px;\\\x22\x3e\\n\\n            \x3cdiv class\x3d\\\x22round-wrap round-r32\\\x22 id\x3d\\\x22roundOf32Wrap\\\x22\x3e\\n              \x3cdiv class\x3d\\\x22round-header\\\x22 id\x3d\\\x22rh-R32\\\x22\x3e\\n                \x3cdiv class\x3d\\\x22round-title\\\x22\x3eRound of 32\x3c\\\/div\x3e\\n                \x3cspan class\x3d\\\x22round-progress-chip\\\x22 id\x3d\\\x22r32Chip\\\x22\x3e0 \/ 16\x3c\\\/span\x3e\\n                \x3cdiv class\x3d\\\x22round-chevron\\\x22\x3e\x3csvg width\x3d\\\x2210\\\x22 height\x3d\\\x2210\\\x22 viewBox\x3d\\\x220 0 10 10\\\x22 fill\x3d\\\x22none\\\x22\x3e\x3cpath d\x3d\\\x22M1.5 3.5l3 3 3-3\\\x22 stroke\x3d\\\x22currentColor\\\x22 stroke-width\x3d\\\x221.5\\\x22 stroke-linecap\x3d\\\x22round\\\x22 stroke-linejoin\x3d\\\x22round\\\x22\/\x3e\x3c\\\/svg\x3e\x3c\\\/div\x3e\\n              \x3c\\\/div\x3e\\n              \x3cdiv class\x3d\\\x22round-body\\\x22\x3e\x3cdiv class\x3d\\\x22matches-list\\\x22 id\x3d\\\x22roundOf32Container\\\x22\x3e\x3c\\\/div\x3e\x3c\\\/div\x3e\\n            \x3c\\\/div\x3e\\n\\n            \x3cdiv class\x3d\\\x22round-wrap round-r16 hidden\\\x22 id\x3d\\\x22roundOf16Wrap\\\x22\x3e\\n              \x3cdiv class\x3d\\\x22round-header\\\x22 id\x3d\\\x22rh-R16\\\x22\x3e\\n                \x3cdiv class\x3d\\\x22round-title\\\x22\x3eRound of 16\x3c\\\/div\x3e\\n                \x3cspan class\x3d\\\x22round-progress-chip\\\x22 id\x3d\\\x22r16Chip\\\x22\x3e0 \/ 8\x3c\\\/span\x3e\\n                \x3cdiv class\x3d\\\x22round-chevron\\\x22\x3e\x3csvg width\x3d\\\x2210\\\x22 height\x3d\\\x2210\\\x22 viewBox\x3d\\\x220 0 10 10\\\x22 fill\x3d\\\x22none\\\x22\x3e\x3cpath d\x3d\\\x22M1.5 3.5l3 3 3-3\\\x22 stroke\x3d\\\x22currentColor\\\x22 stroke-width\x3d\\\x221.5\\\x22 stroke-linecap\x3d\\\x22round\\\x22 stroke-linejoin\x3d\\\x22round\\\x22\/\x3e\x3c\\\/svg\x3e\x3c\\\/div\x3e\\n              \x3c\\\/div\x3e\\n              \x3cdiv class\x3d\\\x22round-body\\\x22\x3e\x3cdiv class\x3d\\\x22matches-list\\\x22 id\x3d\\\x22roundOf16Container\\\x22\x3e\x3c\\\/div\x3e\x3c\\\/div\x3e\\n            \x3c\\\/div\x3e\\n\\n            \x3cdiv class\x3d\\\x22round-wrap round-qf hidden\\\x22 id\x3d\\\x22quarterFinalsWrap\\\x22\x3e\\n              \x3cdiv class\x3d\\\x22round-header\\\x22 id\x3d\\\x22rh-QF\\\x22\x3e\\n                \x3cdiv class\x3d\\\x22round-title\\\x22\x3eQuarter-finals\x3c\\\/div\x3e\\n                \x3cspan class\x3d\\\x22round-progress-chip\\\x22 id\x3d\\\x22qfChip\\\x22\x3e0 \/ 4\x3c\\\/span\x3e\\n                \x3cdiv class\x3d\\\x22round-chevron\\\x22\x3e\x3csvg width\x3d\\\x2210\\\x22 height\x3d\\\x2210\\\x22 viewBox\x3d\\\x220 0 10 10\\\x22 fill\x3d\\\x22none\\\x22\x3e\x3cpath d\x3d\\\x22M1.5 3.5l3 3 3-3\\\x22 stroke\x3d\\\x22currentColor\\\x22 stroke-width\x3d\\\x221.5\\\x22 stroke-linecap\x3d\\\x22round\\\x22 stroke-linejoin\x3d\\\x22round\\\x22\/\x3e\x3c\\\/svg\x3e\x3c\\\/div\x3e\\n              \x3c\\\/div\x3e\\n              \x3cdiv class\x3d\\\x22round-body\\\x22\x3e\x3cdiv class\x3d\\\x22matches-list\\\x22 id\x3d\\\x22quarterFinalsContainer\\\x22\x3e\x3c\\\/div\x3e\x3c\\\/div\x3e\\n            \x3c\\\/div\x3e\\n\\n            \x3cdiv class\x3d\\\x22round-wrap round-sf hidden\\\x22 id\x3d\\\x22semiFinalsWrap\\\x22\x3e\\n              \x3cdiv class\x3d\\\x22round-header\\\x22 id\x3d\\\x22rh-SF\\\x22\x3e\\n                \x3cdiv class\x3d\\\x22round-title\\\x22\x3eSemi-finals\x3c\\\/div\x3e\\n                \x3cspan class\x3d\\\x22round-progress-chip\\\x22 id\x3d\\\x22sfChip\\\x22\x3e0 \/ 2\x3c\\\/span\x3e\\n                \x3cdiv class\x3d\\\x22round-chevron\\\x22\x3e\x3csvg width\x3d\\\x2210\\\x22 height\x3d\\\x2210\\\x22 viewBox\x3d\\\x220 0 10 10\\\x22 fill\x3d\\\x22none\\\x22\x3e\x3cpath d\x3d\\\x22M1.5 3.5l3 3 3-3\\\x22 stroke\x3d\\\x22currentColor\\\x22 stroke-width\x3d\\\x221.5\\\x22 stroke-linecap\x3d\\\x22round\\\x22 stroke-linejoin\x3d\\\x22round\\\x22\/\x3e\x3c\\\/svg\x3e\x3c\\\/div\x3e\\n              \x3c\\\/div\x3e\\n              \x3cdiv class\x3d\\\x22round-body\\\x22\x3e\x3cdiv class\x3d\\\x22matches-list\\\x22 id\x3d\\\x22semiFinalsContainer\\\x22\x3e\x3c\\\/div\x3e\x3c\\\/div\x3e\\n            \x3c\\\/div\x3e\\n\\n            \x3cdiv class\x3d\\\x22round-wrap round-final hidden\\\x22 id\x3d\\\x22finalWrap\\\x22\x3e\\n              \x3cdiv class\x3d\\\x22round-header\\\x22 id\x3d\\\x22rh-FINAL\\\x22\x3e\\n                \x3cdiv class\x3d\\\x22round-title\\\x22\x3eFinal\x3c\\\/div\x3e\\n                \x3cspan class\x3d\\\x22round-progress-chip\\\x22 id\x3d\\\x22finalChip\\\x22\x3e0 \/ 1\x3c\\\/span\x3e\\n                \x3cdiv class\x3d\\\x22round-chevron\\\x22\x3e\x3csvg width\x3d\\\x2210\\\x22 height\x3d\\\x2210\\\x22 viewBox\x3d\\\x220 0 10 10\\\x22 fill\x3d\\\x22none\\\x22\x3e\x3cpath d\x3d\\\x22M1.5 3.5l3 3 3-3\\\x22 stroke\x3d\\\x22currentColor\\\x22 stroke-width\x3d\\\x221.5\\\x22 stroke-linecap\x3d\\\x22round\\\x22 stroke-linejoin\x3d\\\x22round\\\x22\/\x3e\x3c\\\/svg\x3e\x3c\\\/div\x3e\\n              \x3c\\\/div\x3e\\n              \x3cdiv class\x3d\\\x22round-body\\\x22\x3e\x3cdiv class\x3d\\\x22matches-list\\\x22 id\x3d\\\x22finalContainer\\\x22\x3e\x3c\\\/div\x3e\x3c\\\/div\x3e\\n            \x3c\\\/div\x3e\\n\\n            \x3cdiv id\x3d\\\x22championWrap\\\x22 class\x3d\\\x22hidden\\\x22\x3e\\n              \x3cdiv class\x3d\\\x22champion-box\\\x22 id\x3d\\\x22championBox\\\x22\x3e\x3c\\\/div\x3e\\n            \x3c\\\/div\x3e\\n\\n          \x3c\\\/div\x3e\\n        \x3c\\\/div\x3e\\n      \x3c\\\/div\x3e\\n\\n      \x3cdiv class\x3d\\\x22card submit-card\\\x22 id\x3d\\\x22card-submit\\\x22\x3e\\n        \x3cdiv class\x3d\\\x22card-header\\\x22\x3e\\n          \x3cdiv class\x3d\\\x22card-number\\\x22 style\x3d\\\x22background:var(--gold);color:var(--ink);\\\x22\x3e5\x3c\\\/div\x3e\\n          \x3cdiv class\x3d\\\x22card-title-wrap\\\x22\x3e\\n            \x3ch2\x3eSubmit your entry\x3c\\\/h2\x3e\\n            \x3cp\x3eComplete all steps above, then submit to save your full prediction.\x3c\\\/p\x3e\\n          \x3c\\\/div\x3e\\n        \x3c\\\/div\x3e\\n        \x3cdiv class\x3d\\\x22card-body\\\x22\x3e\\n          \x3cdiv id\x3d\\\x22submitLocked\\\x22 class\x3d\\\x22submit-locked\\\x22\x3e\\n            The \x3cstrong\x3eSubmit\x3c\\\/strong\x3e button will appear once every step above is complete.\\n          \x3c\\\/div\x3e\\n          \x3cdiv id\x3d\\\x22submitReady\\\x22 class\x3d\\\x22hidden\\\x22\x3e\\n            \x3cdiv class\x3d\\\x22actions\\\x22\x3e\\n              \x3cbutton type\x3d\\\x22submit\\\x22 class\x3d\\\x22btn btn-gold\\\x22 id\x3d\\\x22submitBtn\\\x22\x3eSubmit entry\x3c\\\/button\x3e\\n            \x3c\\\/div\x3e\\n            \x3cp class\x3d\\\x22submit-note\\\x22\x3eBy submitting, you confirm your entry details are correct and cannot be amended.\x3c\\\/p\x3e\\n          \x3c\\\/div\x3e\\n          \x3cdiv class\x3d\\\x22status-msg\\\x22 id\x3d\\\x22submitStatus\\\x22 style\x3d\\\x22margin-top:12px;\\\x22\x3e\x3c\\\/div\x3e\\n        \x3c\\\/div\x3e\\n      \x3c\\\/div\x3e\\n\\n    \x3c\\\/form\x3e\\n  \x3c\\\/div\x3e\\n\\n  \x3c\\\/div\x3e\\n\\n\x3c\\\/div\x3e\\n\\n\x3cscript\x3e\\n  \\n\\n  function scriptGet(action, params) \x7b\\n    return new Promise((resolve, reject) \x3d\x3e \x7b\\n      google.script.run\\n        .withSuccessHandler(resolve)\\n        .withFailureHandler(reject)\\n        \x5baction\x5d(params || \x7b\x7d);\\n    \x7d);\\n  \x7d\\n\\n  function scriptPost(action, payload) \x7b\\n    return new Promise((resolve, reject) \x3d\x3e \x7b\\n      google.script.run\\n        .withSuccessHandler(resolve)\\n        .withFailureHandler(reject)\\n        \x5baction\x5d(payload);\\n    \x7d);\\n  \x7d\\n\\n   \\n  let GROUPS \x3d \x7b\x7d;\\n  let GROUP_LETTERS \x3d \x5b\x5d;\\n  let FORM_VERSION \x3d \x27V1\x27;\\n  let thirdRankTeams \x3d \x5b\x5d;\\n  let draggedIndex \x3d null;\\n  let generatedBracket \x3d null;\\n\\n  \\n  let groupSelections \x3d \x7b\x7d;\\n\\n  let roundOf32Matches \x3d \x5b\x5d;\\n  let roundOf16Matches \x3d \x5b\x5d;\\n  let quarterFinalMatches \x3d \x5b\x5d;\\n  let semiFinalMatches \x3d \x5b\x5d;\\n  let finalMatch \x3d null;\\n  let predictedChampion \x3d null;\\n\\n  let saveDraftTimer \x3d null;\\n  let formReady \x3d false;\\n  let suppressAutoSave \x3d false;\\n\\n  let entryDeadline \x3d null;\\n  let countdownInterval \x3d null;\\n\\n  const DRAFT_KEY_PREFIX \x3d \x27wc2026_predictor_draft\x27;\\n\\n  const $ \x3d id \x3d\x3e document.getElementById(id);\\n\\n  const groupsContainer     \x3d $(\x27groupsContainer\x27);\\n  const thirdRankSection    \x3d $(\x27thirdRankSection\x27);\\n  const thirdRankLocked     \x3d $(\x27thirdRankLocked\x27);\\n  const thirdRankList       \x3d $(\x27thirdRankList\x27);\\n  const predictorForm       \x3d $(\x27predictorForm\x27);\\n  const submitBtn           \x3d $(\x27submitBtn\x27);\\n  const submitLocked        \x3d $(\x27submitLocked\x27);\\n  const submitReady         \x3d $(\x27submitReady\x27);\\n  const bracketSection      \x3d $(\x27bracketSection\x27);\\n  const generateBracketBtn  \x3d $(\x27generateBracketBtn\x27);\\n  const saveToast           \x3d $(\x27saveToast\x27);\\n  let saveToastTimer;\\n\\n   \\n  function startCountdown(deadline) \x7b\\n    const banner \x3d $(\x27countdownBanner\x27);\\n    banner.classList.add(\x27visible\x27);\\n\\n    function tick() \x7b\\n      const now  \x3d Date.now();\\n      const diff \x3d deadline.getTime() - now;\\n\\n      if (diff \x3c\x3d 0) \x7b\\n        clearInterval(countdownInterval);\\n        showClosedScreen(deadline, null);\\n        return;\\n      \x7d\\n\\n      const totalSecs \x3d Math.floor(diff \/ 1000);\\n      const days  \x3d Math.floor(totalSecs \/ 86400);\\n      const hours \x3d Math.floor((totalSecs % 86400) \/ 3600);\\n      const mins  \x3d Math.floor((totalSecs % 3600) \/ 60);\\n      const secs  \x3d totalSecs % 60;\\n\\n      $(\x27cd-days\x27).textContent  \x3d String(days).padStart(2, \x270\x27);\\n      $(\x27cd-hours\x27).textContent \x3d String(hours).padStart(2, \x270\x27);\\n      $(\x27cd-mins\x27).textContent  \x3d String(mins).padStart(2, \x270\x27);\\n      $(\x27cd-secs\x27).textContent  \x3d String(secs).padStart(2, \x270\x27);\\n\\n      const daysUnit \x3d $(\x27cd-days\x27).closest(\x27.cd-unit\x27);\\n      const daysSep  \x3d daysUnit ? daysUnit.nextElementSibling : null;\\n      if (days \x3d\x3d\x3d 0) \x7b\\n        if (daysUnit)  daysUnit.style.display \x3d \x27none\x27;\\n        if (daysSep)   daysSep.style.display  \x3d \x27none\x27;\\n      \x7d else \x7b\\n        if (daysUnit)  daysUnit.style.display \x3d \x27\x27;\\n        if (daysSep)   daysSep.style.display  \x3d \x27\x27;\\n      \x7d\\n    \x7d\\n\\n    tick();\\n    countdownInterval \x3d setInterval(tick, 1000);\\n  \x7d\\n\\n   \\n  function showClosedScreen(deadline, competitionName) \x7b\\n    $(\x27countdownBanner\x27).classList.remove(\x27visible\x27);\\n    $(\x27mainFormWrap\x27).classList.add(\x27hidden\x27);\\n\\n    const screen \x3d $(\x27closedScreen\x27);\\n    screen.classList.add(\x27visible\x27);\\n\\n    if (competitionName) \x7b\\n      $(\x27closedFooter\x27).textContent \x3d competitionName + \x27 · World Cup 2026 Predictor\x27;\\n    \x7d\\n\\n    if (deadline) \x7b\\n      const formatted \x3d deadline.toLocaleString(\x27en-IE\x27, \x7b\\n        weekday: \x27long\x27, day: \x27numeric\x27, month: \x27long\x27, year: \x27numeric\x27,\\n        hour: \x272-digit\x27, minute: \x272-digit\x27, timeZoneName: \x27short\x27\\n      \x7d);\\n      $(\x27closedDeadlineValue\x27).textContent \x3d formatted;\\n      $(\x27closedDeadlineBox\x27).style.display \x3d \x27inline-block\x27;\\n    \x7d\\n  \x7d\\n\\n   \\n  function initCollapsable(headerId, cardId) \x7b\\n    const header \x3d $(headerId);\\n    const card   \x3d $(cardId);\\n    if (!header || !card) return;\\n    header.addEventListener(\x27click\x27, () \x3d\x3e card.classList.toggle(\x27collapsed\x27));\\n  \x7d\\n\\n  initCollapsable(\x27card-groups-header\x27, \x27card-groups\x27);\\n  initCollapsable(\x27card-third-header\x27,  \x27card-third\x27);\\n\\n  function initRoundCollapse(roundHeaderId, roundWrapId) \x7b\\n    const header \x3d $(roundHeaderId);\\n    const wrap   \x3d $(roundWrapId);\\n    if (!header || !wrap) return;\\n    header.addEventListener(\x27click\x27, () \x3d\x3e wrap.classList.toggle(\x27collapsed\x27));\\n  \x7d\\n\\n  initRoundCollapse(\x27rh-R32\x27,   \x27roundOf32Wrap\x27);\\n  initRoundCollapse(\x27rh-R16\x27,   \x27roundOf16Wrap\x27);\\n  initRoundCollapse(\x27rh-QF\x27,    \x27quarterFinalsWrap\x27);\\n  initRoundCollapse(\x27rh-SF\x27,    \x27semiFinalsWrap\x27);\\n  initRoundCollapse(\x27rh-FINAL\x27, \x27finalWrap\x27);\\n\\n  function setCardCollapsed(cardId, collapsed) \x7b\\n    const el \x3d $(cardId);\\n    if (!el) return;\\n    el.classList.toggle(\x27collapsed\x27, !!collapsed);\\n  \x7d\\n\\n  function setRoundCollapsed(roundWrapId, collapsed) \x7b\\n    const el \x3d $(roundWrapId);\\n    if (!el) return;\\n    el.classList.toggle(\x27collapsed\x27, !!collapsed);\\n  \x7d\\n\\n   \\n  function draftKey() \x7b return `$\x7bDRAFT_KEY_PREFIX\x7d_$\x7bFORM_VERSION\x7d`; \x7d\\n\\n  function showSaveToast() \x7b\\n    saveToast.classList.add(\x27visible\x27);\\n    clearTimeout(saveToastTimer);\\n    saveToastTimer \x3d setTimeout(() \x3d\x3e saveToast.classList.remove(\x27visible\x27), 2000);\\n  \x7d\\n\\n  function setDraftBanner(text) \x7b $(\x27draftBanner\x27).textContent \x3d text; \x7d\\n\\n  const PS_STEPS \x3d \x5b\x27ps1\x27,\x27ps2\x27,\x27ps3\x27,\x27ps4\x27,\x27ps5\x27\x5d;\\n\\n  function updateProgressBar() \x7b\\n    const doneMap \x3d \x7b\\n      ps1: isDetailsComplete(),\\n      ps2: isGroupsComplete(),\\n      ps3: isThirdRankComplete(),\\n      ps4: isKnockoutComplete(),\\n      ps5: false\\n    \x7d;\\n\\n    let highestActive \x3d 0;\\n    PS_STEPS.forEach((id, i) \x3d\x3e \x7b\\n      const el \x3d $(id);\\n      if (doneMap\x5bid\x5d) \x7b\\n        el.classList.add(\x27done\x27);\\n        el.classList.remove(\x27active\x27);\\n        highestActive \x3d i + 1;\\n      \x7d else \x7b\\n        el.classList.remove(\x27done\x27);\\n      \x7d\\n    \x7d);\\n\\n    PS_STEPS.forEach((id, i) \x3d\x3e \x7b\\n      const el \x3d $(id);\\n      if (i \x3d\x3d\x3d highestActive \x26\x26 !doneMap\x5bid\x5d) el.classList.add(\x27active\x27);\\n      else if (!doneMap\x5bid\x5d) el.classList.remove(\x27active\x27);\\n    \x7d);\\n\\n    updateSubmitVisibility();\\n  \x7d\\n\\n  function updateSubmitVisibility() \x7b\\n    const allDone \x3d isDetailsComplete() \x26\x26 isGroupsComplete() \x26\x26 isThirdRankComplete() \x26\x26 isKnockoutComplete();\\n    if (allDone) \x7b\\n      submitLocked.classList.add(\x27hidden\x27);\\n      submitReady.classList.remove(\x27hidden\x27);\\n    \x7d else \x7b\\n      submitLocked.classList.remove(\x27hidden\x27);\\n      submitReady.classList.add(\x27hidden\x27);\\n    \x7d\\n  \x7d\\n\\n  function updateSectionBadge(badgeId, complete) \x7b\\n    const el \x3d $(badgeId);\\n    if (!el) return;\\n    if (complete) el.classList.add(\x27visible\x27);\\n    else el.classList.remove(\x27visible\x27);\\n  \x7d\\n\\n  function isDetailsComplete() \x7b\\n    const name  \x3d $(\x27fullName\x27).value.trim();\\n    const email \x3d $(\x27email\x27).value.trim();\\n    return name.length \x3e 0 \x26\x26 \/^\x5b^\\\\s@\x5d+@\x5b^\\\\s@\x5d+\\\\.\x5b^\\\\s@\x5d+$\/.test(email);\\n  \x7d\\n\\n  function isGroupsComplete() \x7b\\n    if (!GROUP_LETTERS.length) return false;\\n    return GROUP_LETTERS.every(g \x3d\x3e \x7b\\n      const s \x3d groupSelections\x5bg\x5d || \x7b\x7d;\\n      return s\x5b\x271ST\x27\x5d \x26\x26 s\x5b\x272ND\x27\x5d \x26\x26 s\x5b\x273RD\x27\x5d \x26\x26 new Set(\x5bs\x5b\x271ST\x27\x5d,s\x5b\x272ND\x27\x5d,s\x5b\x273RD\x27\x5d\x5d).size \x3d\x3d\x3d 3;\\n    \x7d);\\n  \x7d\\n\\n  function isThirdRankComplete() \x7b\\n    return !thirdRankSection.classList.contains(\x27hidden\x27) \x26\x26\\n           Array.isArray(thirdRankTeams) \x26\x26\\n           thirdRankTeams.length \x3d\x3d\x3d 12 \x26\x26\\n           new Set(thirdRankTeams).size \x3d\x3d\x3d 12;\\n  \x7d\\n\\n  function isKnockoutComplete() \x7b\\n    return !!(generatedBracket \x26\x26\\n           validateRoundComplete(roundOf32Matches) \x26\x26\\n           validateRoundComplete(roundOf16Matches) \x26\x26\\n           validateRoundComplete(quarterFinalMatches) \x26\x26\\n           validateRoundComplete(semiFinalMatches) \x26\x26\\n           finalMatch \x26\x26 validateRoundComplete(\x5bfinalMatch\x5d) \x26\x26\\n           predictedChampion);\\n  \x7d\\n\\n  function esc(str) \x7b\\n    return String(str)\\n      .replace(\/\x26\/g,\x27\x26amp;\x27).replace(\/\x3c\\\/g,\x27\x26lt;\x27).replace(\/\x3e\/g,\x27\x26gt;\x27)\\n      .replace(\/\\\x22\/g,\x27\x26quot;\x27).replace(\/\x27\/g,\x27\x26#039;\x27);\\n  \x7d\\n\\n  \\n\\n  const FIXTURE_DESC \x3d \x7b\\n    \\n    73:  \x27Runner-up Group A vs Runner-up Group B\x27,\\n    75:  \x27Winner Group F vs Runner-up Group C\x27,\\n    76:  \x27Winner Group C vs Runner-up Group F\x27,\\n    78:  \x27Runner-up Group E vs Runner-up Group I\x27,\\n    83:  \x27Runner-up Group K vs Runner-up Group L\x27,\\n    84:  \x27Winner Group H vs Runner-up Group J\x27,\\n    86:  \x27Winner Group J vs Runner-up Group H\x27,\\n    88:  \x27Runner-up Group D vs Runner-up Group G\x27,\\n    \\n    74:  \x27Winner Group E vs Best 3rd-place team\x27,\\n    77:  \x27Winner Group I vs Best 3rd-place team\x27,\\n    79:  \x27Winner Group A vs Best 3rd-place team\x27,\\n    80:  \x27Winner Group L vs Best 3rd-place team\x27,\\n    81:  \x27Winner Group D vs Best 3rd-place team\x27,\\n    82:  \x27Winner Group G vs Best 3rd-place team\x27,\\n    85:  \x27Winner Group B vs Best 3rd-place team\x27,\\n    87:  \x27Winner Group K vs Best 3rd-place team\x27,\\n    \\n    89:  \x27Winner Match 74 vs Winner Match 77\x27,\\n    90:  \x27Winner Match 73 vs Winner Match 75\x27,\\n    91:  \x27Winner Match 76 vs Winner Match 78\x27,\\n    92:  \x27Winner Match 79 vs Winner Match 80\x27,\\n    93:  \x27Winner Match 83 vs Winner Match 84\x27,\\n    94:  \x27Winner Match 81 vs Winner Match 82\x27,\\n    95:  \x27Winner Match 86 vs Winner Match 88\x27,\\n    96:  \x27Winner Match 85 vs Winner Match 87\x27,\\n    \\n    97:  \x27Winner Match 89 vs Winner Match 90\x27,\\n    98:  \x27Winner Match 93 vs Winner Match 94\x27,\\n    99:  \x27Winner Match 91 vs Winner Match 92\x27,\\n    100: \x27Winner Match 95 vs Winner Match 96\x27,\\n    \\n    101: \x27Winner Match 97 vs Winner Match 98\x27,\\n    102: \x27Winner Match 99 vs Winner Match 100\x27,\\n    \\n    104: \x27Winner Match 101 vs Winner Match 102\x27\\n  \x7d;\\n\\n  function formatMatchMeta(match) \x7b\\n    const parts \x3d \x5b`Match $\x7bmatch.matchNo\x7d`\x5d;\\n    if (match.date) parts.push(match.date);\\n    if (match.kickOffGMT) parts.push(match.kickOffGMT);\\n    if (match.round) parts.push(match.round);\\n    return parts.join(\x27 · \x27);\\n  \x7d\\n\\n  \\n  function splitMatchMeta(match) \x7b\\n    const num \x3d `Match $\x7bmatch.matchNo\x7d`;\\n    const restParts \x3d \x5b\x5d;\\n    if (match.date) restParts.push(match.date);\\n    if (match.kickOffGMT) restParts.push(match.kickOffGMT);\\n    if (match.round) restParts.push(match.round);\\n    return \x7b num, rest: restParts.join(\x27 · \x27) \x7d;\\n  \x7d\\n\\n  function scheduleDraftSave() \x7b\\n    if (!formReady || suppressAutoSave) return;\\n    clearTimeout(saveDraftTimer);\\n    saveDraftTimer \x3d setTimeout(saveDraft, 300);\\n  \x7d\\n\\n  function saveDraft() \x7b\\n    if (!formReady || suppressAutoSave) return;\\n    try \x7b\\n      localStorage.setItem(draftKey(), JSON.stringify(collectDraft()));\\n      showSaveToast();\\n      setDraftBanner(`Saved $\x7bnew Date().toLocaleTimeString()\x7d`);\\n    \x7d catch(e) \x7b console.error(e); \x7d\\n  \x7d\\n\\n  function collectDraft() \x7b\\n    return \x7b\\n      savedAt: new Date().toISOString(),\\n      formVersion: FORM_VERSION,\\n      details: \x7b fullName: $(\x27fullName\x27).value.trim(), email: $(\x27email\x27).value.trim() \x7d,\\n      groupSelections: clone(groupSelections),\\n      thirdRankTeams: \x5b...thirdRankTeams\x5d,\\n      thirdRankVisible: !thirdRankSection.classList.contains(\x27hidden\x27),\\n      generatedBracket,\\n      roundOf32Matches: clone(roundOf32Matches),\\n      roundOf16Matches: clone(roundOf16Matches),\\n      quarterFinalMatches: clone(quarterFinalMatches),\\n      semiFinalMatches: clone(semiFinalMatches),\\n      finalMatch: clone(finalMatch),\\n      predictedChampion: predictedChampion || \x27\x27\\n    \x7d;\\n  \x7d\\n\\n  function loadDraft() \x7b\\n    try \x7b\\n      const raw \x3d localStorage.getItem(draftKey());\\n      return raw ? JSON.parse(raw) : null;\\n    \x7d catch(e) \x7b return null; \x7d\\n  \x7d\\n\\n  function clearDraft(msg \x3d true) \x7b\\n    try \x7b localStorage.removeItem(draftKey()); \x7d catch(e) \x7b\x7d\\n    if (msg) setDraftBanner(\x27Draft cleared\x27);\\n  \x7d\\n\\n  function applyDraft(d) \x7b\\n    if (!d || typeof d !\x3d\x3d \x27object\x27) return;\\n    suppressAutoSave \x3d true;\\n    try \x7b\\n      if (d.details) \x7b\\n        $(\x27fullName\x27).value \x3d d.details.fullName || \x27\x27;\\n        $(\x27email\x27).value    \x3d d.details.email    || \x27\x27;\\n        validateDetailsField(\x27fullName\x27);\\n        validateDetailsField(\x27email\x27);\\n      \x7d\\n\\n      if (d.groupSelections) \x7b\\n        GROUP_LETTERS.forEach(g \x3d\x3e \x7b\\n          const gs \x3d d.groupSelections\x5bg\x5d || \x7b\x7d;\\n          groupSelections\x5bg\x5d \x3d \x7b\\n            \x271ST\x27: gs\x5b\x271ST\x27\x5d || \x27\x27,\\n            \x272ND\x27: gs\x5b\x272ND\x27\x5d || \x27\x27,\\n            \x273RD\x27: gs\x5b\x273RD\x27\x5d || \x27\x27\\n          \x7d;\\n        \x7d);\\n        \\n        GROUP_LETTERS.forEach(renderGroupCard);\\n        updateGroupsProgress();\\n        const groupsComplete \x3d isGroupsComplete();\\n        updateSectionBadge(\x27badge-groups\x27, groupsComplete);\\n        if (groupsComplete) autoBuildThirdRank();\\n      \x7d\\n\\n      \\n      if (d.thirdRankVisible \x26\x26 Array.isArray(d.thirdRankTeams) \x26\x26 d.thirdRankTeams.length \x3d\x3d\x3d 12) \x7b\\n        const valid  \x3d getThirdPlacedTeams().filter(Boolean).sort();\\n        const ranked \x3d \x5b...d.thirdRankTeams\x5d.sort();\\n        if (JSON.stringify(valid) \x3d\x3d\x3d JSON.stringify(ranked)) \x7b\\n          thirdRankTeams \x3d \x5b...d.thirdRankTeams\x5d;\\n          renderThirdRankList();\\n          thirdRankSection.classList.remove(\x27hidden\x27);\\n          thirdRankLocked.classList.add(\x27hidden\x27);\\n        \x7d\\n      \x7d\\n\\n      if (d.generatedBracket \x26\x26 Array.isArray(d.roundOf32Matches) \x26\x26 d.roundOf32Matches.length) \x7b\\n        generatedBracket    \x3d d.generatedBracket;\\n        bracketSection.classList.remove(\x27hidden\x27);\\n\\n        roundOf32Matches    \x3d d.roundOf32Matches || \x5b\x5d;\\n        roundOf16Matches    \x3d d.roundOf16Matches || \x5b\x5d;\\n        quarterFinalMatches \x3d d.quarterFinalMatches || \x5b\x5d;\\n        semiFinalMatches    \x3d d.semiFinalMatches || \x5b\x5d;\\n        finalMatch          \x3d d.finalMatch || null;\\n        predictedChampion   \x3d d.predictedChampion || null;\\n\\n        renderRound(roundOf32Matches, $(\x27roundOf32Container\x27), \x27R32\x27);\\n\\n        if (roundOf16Matches.length) \x7b\\n          $(\x27roundOf16Wrap\x27).classList.remove(\x27hidden\x27);\\n          renderRound(roundOf16Matches, $(\x27roundOf16Container\x27), \x27R16\x27);\\n        \x7d\\n        if (quarterFinalMatches.length) \x7b\\n          $(\x27quarterFinalsWrap\x27).classList.remove(\x27hidden\x27);\\n          renderRound(quarterFinalMatches, $(\x27quarterFinalsContainer\x27), \x27QF\x27);\\n        \x7d\\n        if (semiFinalMatches.length) \x7b\\n          $(\x27semiFinalsWrap\x27).classList.remove(\x27hidden\x27);\\n          renderRound(semiFinalMatches, $(\x27semiFinalsContainer\x27), \x27SF\x27);\\n        \x7d\\n        if (finalMatch) \x7b\\n          $(\x27finalWrap\x27).classList.remove(\x27hidden\x27);\\n          renderRound(\x5bfinalMatch\x5d, $(\x27finalContainer\x27), \x27FINAL\x27);\\n        \x7d\\n\\n        updateProgression();\\n        showBracketStatus(\x27Saved draft restored.\x27, \x27success\x27);\\n      \x7d\\n\\n      setDraftBanner(d.savedAt ? `Restored from $\x7bnew Date(d.savedAt).toLocaleString()\x7d` : \x27Draft restored\x27);\\n    \x7d catch(e) \x7b\\n      console.error(e);\\n    \x7d finally \x7b\\n      suppressAutoSave \x3d false;\\n      updateProgressBar();\\n    \x7d\\n  \x7d\\n\\n  function clone(v) \x7b\\n    if (v \x3d\x3d\x3d null || v \x3d\x3d\x3d undefined) return v;\\n    return JSON.parse(JSON.stringify(v));\\n  \x7d\\n\\n   \\n  function buildGroupCards() \x7b\\n    groupsContainer.innerHTML \x3d \x27\x27;\\n    GROUP_LETTERS.forEach(g \x3d\x3e \x7b\\n      if (!groupSelections\x5bg\x5d) groupSelections\x5bg\x5d \x3d \x7b \x271ST\x27:\x27\x27, \x272ND\x27:\x27\x27, \x273RD\x27:\x27\x27 \x7d;\\n\\n      const card \x3d document.createElement(\x27div\x27);\\n      card.className \x3d \x27group-card\x27;\\n      card.id \x3d `gc_$\x7bg\x7d`;\\n      card.innerHTML \x3d `\\n        \x3cdiv class\x3d\\\x22group-card-header\\\x22 id\x3d\\\x22gch_$\x7bg\x7d\\\x22\x3e\\n          \x3ch3\x3eGroup $\x7besc(g)\x7d\x3c\\\/h3\x3e\\n          \x3cdiv class\x3d\\\x22group-check\\\x22\x3e✓\x3c\\\/div\x3e\\n          \x3cdiv class\x3d\\\x22group-caret\\\x22\x3e\\n            \x3csvg width\x3d\\\x2210\\\x22 height\x3d\\\x2210\\\x22 viewBox\x3d\\\x220 0 10 10\\\x22 fill\x3d\\\x22none\\\x22\x3e\x3cpath d\x3d\\\x22M1.5 3.5l3 3 3-3\\\x22 stroke\x3d\\\x22currentColor\\\x22 stroke-width\x3d\\\x221.5\\\x22 stroke-linecap\x3d\\\x22round\\\x22 stroke-linejoin\x3d\\\x22round\\\x22\/\x3e\x3c\\\/svg\x3e\\n          \x3c\\\/div\x3e\\n        \x3c\\\/div\x3e\\n        \x3cdiv class\x3d\\\x22pos-bar\\\x22 id\x3d\\\x22posbar_$\x7bg\x7d\\\x22\x3e\\n          \x3cdiv class\x3d\\\x22pos-slot slot-1\\\x22 id\x3d\\\x22slot_$\x7bg\x7d_1\\\x22\x3e\\n            \x3cspan class\x3d\\\x22pos-slot-label\\\x22\x3e1ST\x3c\\\/span\x3e\\n            \x3cspan class\x3d\\\x22pos-slot-team\\\x22\x3e\x3c\\\/span\x3e\\n            \x3cbutton type\x3d\\\x22button\\\x22 class\x3d\\\x22pos-slot-clear\\\x22 aria-label\x3d\\\x22Clear 1st place\\\x22\x3e×\x3c\\\/button\x3e\\n          \x3c\\\/div\x3e\\n          \x3cdiv class\x3d\\\x22pos-slot slot-2\\\x22 id\x3d\\\x22slot_$\x7bg\x7d_2\\\x22\x3e\\n            \x3cspan class\x3d\\\x22pos-slot-label\\\x22\x3e2ND\x3c\\\/span\x3e\\n            \x3cspan class\x3d\\\x22pos-slot-team\\\x22\x3e\x3c\\\/span\x3e\\n            \x3cbutton type\x3d\\\x22button\\\x22 class\x3d\\\x22pos-slot-clear\\\x22 aria-label\x3d\\\x22Clear 2nd place\\\x22\x3e×\x3c\\\/button\x3e\\n          \x3c\\\/div\x3e\\n          \x3cdiv class\x3d\\\x22pos-slot slot-3\\\x22 id\x3d\\\x22slot_$\x7bg\x7d_3\\\x22\x3e\\n            \x3cspan class\x3d\\\x22pos-slot-label\\\x22\x3e3RD\x3c\\\/span\x3e\\n            \x3cspan class\x3d\\\x22pos-slot-team\\\x22\x3e\x3c\\\/span\x3e\\n            \x3cbutton type\x3d\\\x22button\\\x22 class\x3d\\\x22pos-slot-clear\\\x22 aria-label\x3d\\\x22Clear 3rd place\\\x22\x3e×\x3c\\\/button\x3e\\n          \x3c\\\/div\x3e\\n        \x3c\\\/div\x3e\\n        \x3cdiv class\x3d\\\x22team-btns\\\x22 id\x3d\\\x22teambtns_$\x7bg\x7d\\\x22\x3e\x3c\\\/div\x3e\\n        \x3cdiv class\x3d\\\x22group-error\\\x22 id\x3d\\\x22$\x7bg\x7d_ERROR\\\x22\x3e\x3c\\\/div\x3e\\n      `;\\n      groupsContainer.appendChild(card);\\n\\n      \\n      \x5b\x271\x27,\x272\x27,\x273\x27\x5d.forEach(n \x3d\x3e \x7b\\n        const posKey \x3d n \x3d\x3d\x3d \x271\x27 ? \x271ST\x27 : n \x3d\x3d\x3d \x272\x27 ? \x272ND\x27 : \x273RD\x27;\\n        const clearBtn \x3d card.querySelector(`#slot_$\x7bg\x7d_$\x7bn\x7d .pos-slot-clear`);\\n        clearBtn.addEventListener(\x27click\x27, e \x3d\x3e \x7b\\n          e.stopPropagation();\\n          clearPosition(g, posKey);\\n        \x7d);\\n      \x7d);\\n\\n      \\n      const header \x3d $(`gch_$\x7bg\x7d`);\\n      if (header) \x7b\\n        header.addEventListener(\x27click\x27, () \x3d\x3e \x7b\\n          if (isNarrow() \x26\x26 card.classList.contains(\x27complete\x27)) \x7b\\n            card.classList.toggle(\x27collapsed-mobile\x27);\\n          \x7d\\n        \x7d);\\n      \x7d\\n\\n      renderGroupCard(g);\\n    \x7d);\\n  \x7d\\n\\n  function renderGroupCard(g) \x7b\\n    const teams \x3d GROUPS\x5bg\x5d || \x5b\x5d;\\n    const sel \x3d groupSelections\x5bg\x5d || \x7b \x271ST\x27:\x27\x27, \x272ND\x27:\x27\x27, \x273RD\x27:\x27\x27 \x7d;\\n\\n    \\n    updatePosSlot(g, 1, sel\x5b\x271ST\x27\x5d);\\n    updatePosSlot(g, 2, sel\x5b\x272ND\x27\x5d);\\n    updatePosSlot(g, 3, sel\x5b\x273RD\x27\x5d);\\n\\n    \\n    const btnWrap \x3d $(`teambtns_$\x7bg\x7d`);\\n    if (!btnWrap) return;\\n    btnWrap.innerHTML \x3d \x27\x27;\\n\\n    teams.forEach(team \x3d\x3e \x7b\\n      const posKey \x3d posForTeam(g, team);\\n      const posNum \x3d posKey \x3d\x3d\x3d \x271ST\x27 ? 1 : posKey \x3d\x3d\x3d \x272ND\x27 ? 2 : posKey \x3d\x3d\x3d \x273RD\x27 ? 3 : 0;\\n      const posLabel \x3d posNum ? `$\x7bposNum\x7d$\x7bposNum\x3d\x3d\x3d1?\x27ST\x27:posNum\x3d\x3d\x3d2?\x27ND\x27:\x27RD\x27\x7d` : \x27\x27;\\n\\n      const btn \x3d document.createElement(\x27button\x27);\\n      btn.type \x3d \x27button\x27;\\n      btn.className \x3d `team-btn$\x7bposNum ? \x27 assigned-\x27 + posNum : \x27\x27\x7d`;\\n      btn.dataset.group \x3d g;\\n      btn.dataset.team \x3d team;\\n      btn.setAttribute(\x27aria-label\x27, team + (posKey ? `, assigned $\x7bposKey\x7d` : \x27\x27));\\n      btn.innerHTML \x3d `\\n        \x3cspan class\x3d\\\x22team-btn-pos\\\x22\x3e$\x7bposLabel || \x27\\u2014\x27\x7d\x3c\\\/span\x3e\\n        \x3cspan class\x3d\\\x22team-btn-name\\\x22\x3e$\x7besc(team)\x7d\x3c\\\/span\x3e\\n      `;\\n      btn.addEventListener(\x27click\x27, () \x3d\x3e handleTeamBtnClick(g, team));\\n      btnWrap.appendChild(btn);\\n    \x7d);\\n\\n    \\n    const complete \x3d !!(sel\x5b\x271ST\x27\x5d \x26\x26 sel\x5b\x272ND\x27\x5d \x26\x26 sel\x5b\x273RD\x27\x5d \x26\x26\\n      new Set(\x5bsel\x5b\x271ST\x27\x5d,sel\x5b\x272ND\x27\x5d,sel\x5b\x273RD\x27\x5d\x5d).size \x3d\x3d\x3d 3);\\n    const card \x3d $(`gc_$\x7bg\x7d`);\\n    card.classList.toggle(\x27complete\x27, complete);\\n    if (complete \x26\x26 isNarrow()) \x7b\\n      card.classList.add(\x27collapsed-mobile\x27);\\n    \x7d else if (!complete) \x7b\\n      card.classList.remove(\x27collapsed-mobile\x27);\\n    \x7d\\n    const errEl \x3d $(`$\x7bg\x7d_ERROR`);\\n    if (errEl) errEl.textContent \x3d \x27\x27;\\n  \x7d\\n\\n  function updatePosSlot(g, posNum, team) \x7b\\n    const slot \x3d $(`slot_$\x7bg\x7d_$\x7bposNum\x7d`);\\n    if (!slot) return;\\n    const teamEl \x3d slot.querySelector(\x27.pos-slot-team\x27);\\n    const filledClass \x3d `filled-$\x7bposNum\x7d`;\\n\\n    \\n    slot.classList.remove(\x27filled-1\x27,\x27filled-2\x27,\x27filled-3\x27);\\n\\n    if (team) \x7b\\n      slot.classList.add(filledClass);\\n      teamEl.textContent \x3d team;\\n    \x7d else \x7b\\n      teamEl.textContent \x3d \x27\x27;\\n    \x7d\\n  \x7d\\n\\n  \\n  \\n  \\n  function handleTeamBtnClick(g, team) \x7b\\n    const sel \x3d groupSelections\x5bg\x5d || \x7b \x271ST\x27:\x27\x27, \x272ND\x27:\x27\x27, \x273RD\x27:\x27\x27 \x7d;\\n    const currentPos \x3d posForTeam(g, team);\\n\\n    if (currentPos) \x7b\\n      \\n      sel\x5bcurrentPos\x5d \x3d \x27\x27;\\n    \x7d else \x7b\\n      \\n      const next \x3d !sel\x5b\x271ST\x27\x5d ? \x271ST\x27 : !sel\x5b\x272ND\x27\x5d ? \x272ND\x27 : !sel\x5b\x273RD\x27\x5d ? \x273RD\x27 : null;\\n      if (!next) \x7b\\n        \\n        const errEl \x3d $(`$\x7bg\x7d_ERROR`);\\n        if (errEl) \x7b\\n          errEl.textContent \x3d \x27All 3 positions are filled. Tap × to clear one first.\x27;\\n          clearTimeout(errEl._t);\\n          errEl._t \x3d setTimeout(() \x3d\x3e \x7b errEl.textContent \x3d \x27\x27; \x7d, 2200);\\n        \x7d\\n        return;\\n      \x7d\\n      sel\x5bnext\x5d \x3d team;\\n    \x7d\\n\\n    groupSelections\x5bg\x5d \x3d sel;\\n    renderGroupCard(g);\\n    onGroupSelectionChanged(g);\\n  \x7d\\n\\n  function clearPosition(g, posKey) \x7b\\n    const sel \x3d groupSelections\x5bg\x5d || \x7b \x271ST\x27:\x27\x27, \x272ND\x27:\x27\x27, \x273RD\x27:\x27\x27 \x7d;\\n    sel\x5bposKey\x5d \x3d \x27\x27;\\n    groupSelections\x5bg\x5d \x3d sel;\\n    renderGroupCard(g);\\n    onGroupSelectionChanged(g);\\n  \x7d\\n\\n  function posForTeam(g, team) \x7b\\n    const sel \x3d groupSelections\x5bg\x5d || \x7b\x7d;\\n    if (sel\x5b\x271ST\x27\x5d \x3d\x3d\x3d team) return \x271ST\x27;\\n    if (sel\x5b\x272ND\x27\x5d \x3d\x3d\x3d team) return \x272ND\x27;\\n    if (sel\x5b\x273RD\x27\x5d \x3d\x3d\x3d team) return \x273RD\x27;\\n    return \x27\x27;\\n  \x7d\\n\\n  function onGroupSelectionChanged(g) \x7b\\n    updateGroupsProgress();\\n\\n    const groupsComplete \x3d isGroupsComplete();\\n    updateSectionBadge(\x27badge-groups\x27, groupsComplete);\\n\\n    if (groupsComplete) \x7b\\n      setCardCollapsed(\x27card-groups\x27, true);\\n      setCardCollapsed(\x27card-third\x27, false);\\n      autoBuildThirdRank();\\n      \\n      setTimeout(() \x3d\x3e \x7b\\n        const el \x3d $(\x27card-third\x27);\\n        if (el) el.scrollIntoView(\x7b behavior: \x27smooth\x27, block: \x27start\x27 \x7d);\\n      \x7d, 220);\\n    \x7d else \x7b\\n      hideThirdRank();\\n      clearGeneratedBracket();\\n    \x7d\\n\\n    clearGeneratedBracket();\\n    scheduleDraftSave();\\n    updateProgressBar();\\n  \x7d\\n\\n  function updateGroupsProgress() \x7b\\n    const done \x3d GROUP_LETTERS.filter(g \x3d\x3e \x7b\\n      const s \x3d groupSelections\x5bg\x5d || \x7b\x7d;\\n      return s\x5b\x271ST\x27\x5d \x26\x26 s\x5b\x272ND\x27\x5d \x26\x26 s\x5b\x273RD\x27\x5d \x26\x26 new Set(\x5bs\x5b\x271ST\x27\x5d,s\x5b\x272ND\x27\x5d,s\x5b\x273RD\x27\x5d\x5d).size \x3d\x3d\x3d 3;\\n    \x7d).length;\\n    const total \x3d GROUP_LETTERS.length;\\n    const pct \x3d total ? (done \/ total) * 100 : 0;\\n    $(\x27groupsProgressFill\x27).style.width \x3d pct + \x27%\x27;\\n    $(\x27groupsProgressCount\x27).textContent \x3d `$\x7bdone\x7d \/ $\x7btotal\x7d`;\\n  \x7d\\n\\n  function validateDetailsField(fieldId) \x7b\\n    const el    \x3d $(fieldId);\\n    const errEl \x3d $(fieldId + \x27Error\x27);\\n    const val   \x3d el.value.trim();\\n    let err \x3d \x27\x27;\\n\\n    if (fieldId \x3d\x3d\x3d \x27fullName\x27 \x26\x26 !val) err \x3d \x27Full name is required.\x27;\\n    if (fieldId \x3d\x3d\x3d \x27email\x27) \x7b\\n      if (!val) err \x3d \x27Email address is required.\x27;\\n      else if (!\/^\x5b^\\\\s@\x5d+@\x5b^\\\\s@\x5d+\\\\.\x5b^\\\\s@\x5d+$\/.test(val)) err \x3d \x27Please enter a valid email address.\x27;\\n    \x7d\\n\\n    errEl.textContent \x3d err;\\n    el.classList.toggle(\x27has-error\x27, !!err);\\n    el.classList.toggle(\x27is-valid\x27, !err \x26\x26 val.length \x3e 0);\\n\\n    updateSectionBadge(\x27badge-details\x27, isDetailsComplete());\\n    updateProgressBar();\\n    return !err;\\n  \x7d\\n\\n  function validateDetails() \x7b\\n    return !!(validateDetailsField(\x27fullName\x27) \x26 validateDetailsField(\x27email\x27));\\n  \x7d\\n\\n  function validateGroups() \x7b\\n    const errEl \x3d $(\x27groupsError\x27);\\n    let valid \x3d true;\\n\\n    GROUP_LETTERS.forEach(g \x3d\x3e \x7b\\n      const errG \x3d $(g+\x27_ERROR\x27);\\n      if (errG) errG.textContent \x3d \x27\x27;\\n      const sel \x3d groupSelections\x5bg\x5d || \x7b\x7d;\\n      const vals \x3d \x5bsel\x5b\x271ST\x27\x5d, sel\x5b\x272ND\x27\x5d, sel\x5b\x273RD\x27\x5d\x5d;\\n      if (vals.some(v \x3d\x3e !v)) \x7b\\n        if (errG) errG.textContent \x3d \x27Please complete all 3 positions.\x27;\\n        valid \x3d false;\\n      \x7d else if (new Set(vals).size !\x3d\x3d 3) \x7b\\n        if (errG) errG.textContent \x3d \x27Each team can only be used once.\x27;\\n        valid \x3d false;\\n      \x7d\\n    \x7d);\\n\\n    if (!valid) \x7b\\n      errEl.textContent \x3d \x27Please fix the highlighted group issues before continuing.\x27;\\n      errEl.classList.add(\x27visible\x27);\\n    \x7d else \x7b\\n      errEl.classList.remove(\x27visible\x27);\\n    \x7d\\n    return valid;\\n  \x7d\\n\\n  function getThirdPlacedTeams() \x7b\\n    return GROUP_LETTERS.map(g \x3d\x3e (groupSelections\x5bg\x5d \x26\x26 groupSelections\x5bg\x5d\x5b\x273RD\x27\x5d) || \x27\x27);\\n  \x7d\\n\\n  function hideThirdRank() \x7b\\n    thirdRankSection.classList.add(\x27hidden\x27);\\n    thirdRankLocked.classList.remove(\x27hidden\x27);\\n    thirdRankTeams \x3d \x5b\x5d;\\n    $(\x27thirdRankError\x27).classList.remove(\x27visible\x27);\\n    updateSectionBadge(\x27badge-third\x27, false);\\n  \x7d\\n\\n  \\n  function autoBuildThirdRank() \x7b\\n    if (!isGroupsComplete()) \x7b hideThirdRank(); return; \x7d\\n\\n    const thirds \x3d getThirdPlacedTeams();\\n    if (thirds.some(t \x3d\x3e !t)) \x7b hideThirdRank(); return; \x7d\\n\\n    \\n    const existing \x3d thirdRankTeams.filter(t \x3d\x3e thirds.includes(t));\\n    const newcomers \x3d thirds.filter(t \x3d\x3e !existing.includes(t));\\n    thirdRankTeams \x3d \x5b...existing, ...newcomers\x5d;\\n\\n    \\n    if (thirdRankTeams.length !\x3d\x3d 12 || new Set(thirdRankTeams).size !\x3d\x3d 12) \x7b\\n      thirdRankTeams \x3d \x5b...thirds\x5d;\\n    \x7d\\n\\n    renderThirdRankList();\\n    thirdRankSection.classList.remove(\x27hidden\x27);\\n    thirdRankLocked.classList.add(\x27hidden\x27);\\n    $(\x27thirdRankError\x27).classList.remove(\x27visible\x27);\\n    updateSectionBadge(\x27badge-third\x27, isThirdRankComplete());\\n    updateProgressBar();\\n    scheduleDraftSave();\\n  \x7d\\n\\n  function renderThirdRankList() \x7b\\n    thirdRankList.innerHTML \x3d \x27\x27;\\n\\n    thirdRankTeams.forEach((team, i) \x3d\x3e \x7b\\n      const qualifying \x3d i \x3c 8;\\n\\n      if (i \x3d\x3d\x3d 8) \x7b\\n        const div \x3d document.createElement(\x27div\x27);\\n        div.className \x3d \x27rank-divider\x27;\\n        div.innerHTML \x3d `\\n          \x3cdiv class\x3d\\\x22rank-divider-line\\\x22\x3e\x3c\\\/div\x3e\\n          \x3cdiv class\x3d\\\x22rank-divider-label\\\x22\x3eDo not qualify\x3c\\\/div\x3e\\n          \x3cdiv class\x3d\\\x22rank-divider-line\\\x22\x3e\x3c\\\/div\x3e\\n        `;\\n        thirdRankList.appendChild(div);\\n      \x7d\\n\\n      const item \x3d document.createElement(\x27div\x27);\\n      item.className \x3d `rank-item $\x7bqualifying ? \x27qualifying\x27 : \x27non-qualifying\x27\x7d`;\\n      item.draggable \x3d true;\\n      item.dataset.index \x3d String(i);\\n\\n      item.innerHTML \x3d `\\n        \x3cdiv class\x3d\\\x22rank-number\\\x22\x3e#$\x7bi+1\x7d\x3c\\\/div\x3e\\n        \x3cdiv class\x3d\\\x22rank-main\\\x22\x3e\\n          \x3cdiv class\x3d\\\x22rank-team\\\x22\x3e$\x7besc(team)\x7d\x3c\\\/div\x3e\\n          \x3cspan class\x3d\\\x22rank-badge $\x7bqualifying ? \x27qualifies\x27 : \x27out\x27\x7d\\\x22\x3e$\x7bqualifying ? \x27Qualifies\x27 : \x27Out\x27\x7d\x3c\\\/span\x3e\\n        \x3c\\\/div\x3e\\n        \x3cdiv class\x3d\\\x22rank-controls\\\x22\x3e\\n          \x3cbutton type\x3d\\\x22button\\\x22 class\x3d\\\x22rank-mini-btn up-btn\\\x22 aria-label\x3d\\\x22Move up\\\x22 $\x7bi\x3d\x3d\x3d0?\x27disabled\x27:\x27\x27\x7d\x3e↑\x3c\\\/button\x3e\\n          \x3cbutton type\x3d\\\x22button\\\x22 class\x3d\\\x22rank-mini-btn down-btn\\\x22 aria-label\x3d\\\x22Move down\\\x22 $\x7bi\x3d\x3d\x3dthirdRankTeams.length-1?\x27disabled\x27:\x27\x27\x7d\x3e↓\x3c\\\/button\x3e\\n        \x3c\\\/div\x3e\\n      `;\\n\\n      item.addEventListener(\x27dragstart\x27, e \x3d\x3e \x7b\\n        draggedIndex \x3d i;\\n        item.classList.add(\x27dragging\x27);\\n        e.dataTransfer.effectAllowed \x3d \x27move\x27;\\n      \x7d);\\n\\n      item.addEventListener(\x27dragover\x27, e \x3d\x3e \x7b\\n        e.preventDefault();\\n        e.dataTransfer.dropEffect \x3d \x27move\x27;\\n      \x7d);\\n\\n      item.addEventListener(\x27dragenter\x27, () \x3d\x3e item.classList.add(\x27drag-over\x27));\\n      item.addEventListener(\x27dragleave\x27, () \x3d\x3e item.classList.remove(\x27drag-over\x27));\\n\\n      item.addEventListener(\x27drop\x27, e \x3d\x3e \x7b\\n        e.preventDefault();\\n        item.classList.remove(\x27drag-over\x27);\\n        if (draggedIndex \x3d\x3d\x3d null || draggedIndex \x3d\x3d\x3d i) return;\\n        const moved \x3d thirdRankTeams.splice(draggedIndex, 1)\x5b0\x5d;\\n        thirdRankTeams.splice(i, 0, moved);\\n        draggedIndex \x3d null;\\n        renderThirdRankList();\\n        clearGeneratedBracket();\\n        updateSectionBadge(\x27badge-third\x27, isThirdRankComplete());\\n        scheduleDraftSave();\\n        updateProgressBar();\\n      \x7d);\\n\\n      item.addEventListener(\x27dragend\x27, () \x3d\x3e \x7b\\n        draggedIndex \x3d null;\\n        document.querySelectorAll(\x27.rank-item\x27).forEach(el \x3d\x3e el.classList.remove(\x27dragging\x27,\x27drag-over\x27));\\n      \x7d);\\n\\n      item.querySelector(\x27.up-btn\x27).addEventListener(\x27click\x27, () \x3d\x3e \x7b\\n        if (i \x3c\x3d 0) return;\\n        \x5bthirdRankTeams\x5bi-1\x5d, thirdRankTeams\x5bi\x5d\x5d \x3d \x5bthirdRankTeams\x5bi\x5d, thirdRankTeams\x5bi-1\x5d\x5d;\\n        renderThirdRankList();\\n        clearGeneratedBracket();\\n        updateSectionBadge(\x27badge-third\x27, isThirdRankComplete());\\n        scheduleDraftSave();\\n        updateProgressBar();\\n      \x7d);\\n\\n      item.querySelector(\x27.down-btn\x27).addEventListener(\x27click\x27, () \x3d\x3e \x7b\\n        if (i \x3e\x3d thirdRankTeams.length-1) return;\\n        \x5bthirdRankTeams\x5bi+1\x5d, thirdRankTeams\x5bi\x5d\x5d \x3d \x5bthirdRankTeams\x5bi\x5d, thirdRankTeams\x5bi+1\x5d\x5d;\\n        renderThirdRankList();\\n        clearGeneratedBracket();\\n        updateSectionBadge(\x27badge-third\x27, isThirdRankComplete());\\n        scheduleDraftSave();\\n        updateProgressBar();\\n      \x7d);\\n\\n      thirdRankList.appendChild(item);\\n    \x7d);\\n  \x7d\\n\\n  function validateThirdRank() \x7b\\n    const errEl \x3d $(\x27thirdRankError\x27);\\n    errEl.classList.remove(\x27visible\x27);\\n\\n    if (thirdRankSection.classList.contains(\x27hidden\x27)) \x7b\\n      errEl.textContent \x3d \x27Please complete all groups first \\u2014 the ranking builds automatically.\x27;\\n      errEl.classList.add(\x27visible\x27);\\n      return false;\\n    \x7d\\n    if (!Array.isArray(thirdRankTeams) || thirdRankTeams.length !\x3d\x3d 12) \x7b\\n      errEl.textContent \x3d \x27The 3rd-place ranking needs 12 teams.\x27;\\n      errEl.classList.add(\x27visible\x27);\\n      return false;\\n    \x7d\\n    if (new Set(thirdRankTeams).size !\x3d\x3d 12) \x7b\\n      errEl.textContent \x3d \x27Each third-placed team can only appear once.\x27;\\n      errEl.classList.add(\x27visible\x27);\\n      return false;\\n    \x7d\\n    const valid \x3d getThirdPlacedTeams();\\n    if (JSON.stringify(\x5b...thirdRankTeams\x5d.sort()) !\x3d\x3d JSON.stringify(\x5b...valid\x5d.sort())) \x7b\\n      errEl.textContent \x3d \x27Your ranking must use exactly the teams selected to finish 3rd.\x27;\\n      errEl.classList.add(\x27visible\x27);\\n      return false;\\n    \x7d\\n    return true;\\n  \x7d\\n\\n  generateBracketBtn.addEventListener(\x27click\x27, () \x3d\x3e \x7b\\n    hideStatus(\x27bracketStatus\x27);\\n    if (!validateDetails() || !validateGroups() || !validateThirdRank()) \x7b\\n      showBracketStatus(\x27Please fix the errors above before generating the bracket.\x27, \x27error\x27);\\n      return;\\n    \x7d\\n\\n    generateBracketBtn.disabled \x3d true;\\n    showBracketStatus(\x27Generating your knockout fixtures\\u2026\x27, \x27info\x27);\\n\\n    scriptPost(\x27generateKnockoutBracket\x27, buildPayload())\\n      .then(res \x3d\x3e \x7b\\n        generateBracketBtn.disabled \x3d false;\\n        if (!res || !res.ok) \x7b\\n          showBracketStatus(res \x26\x26 res.message ? res.message : \x27Failed to generate fixtures.\x27, \x27error\x27);\\n          return;\\n        \x7d\\n        renderGeneratedBracket(res.bracket);\\n        showBracketStatus(\x27Your knockout fixtures generated successfully.\x27, \x27success\x27);\\n        scheduleDraftSave();\\n      \x7d)\\n      .catch(err \x3d\x3e \x7b\\n        generateBracketBtn.disabled \x3d false;\\n        showBracketStatus(\x27Error: \x27 + (err \x26\x26 err.message ? err.message : String(err)), \x27error\x27);\\n      \x7d);\\n  \x7d);\\n\\n  function showBracketStatus(msg, type) \x7b\\n    const el \x3d $(\x27bracketStatus\x27);\\n    el.textContent \x3d msg;\\n    el.className \x3d \x27status-msg visible \x27 + type;\\n  \x7d\\n\\n  function hideStatus(id) \x7b\\n    const el \x3d $(id);\\n    el.className \x3d \x27status-msg\x27;\\n    el.textContent \x3d \x27\x27;\\n  \x7d\\n\\n  function renderGeneratedBracket(bracket) \x7b\\n    generatedBracket \x3d bracket;\\n    initRoundOf32(bracket.roundOf32 || \x5b\x5d);\\n    bracketSection.classList.remove(\x27hidden\x27);\\n    setRoundCollapsed(\x27roundOf32Wrap\x27, false);\\n    scheduleDraftSave();\\n  \x7d\\n\\n  function initRoundOf32(fixtures) \x7b\\n    roundOf32Matches \x3d fixtures.map(f \x3d\x3e (\x7b\\n      matchNo: f.matchNo,\\n      round: f.round,\\n      date: f.date,\\n      kickOffGMT: f.kickOffGMT || \x27\x27,\\n      team1: f.team1,\\n      team2: f.team2,\\n      score1: \x27\x27,\\n      score2: \x27\x27,\\n      winner: \x27\x27\\n    \x7d));\\n    renderRound(roundOf32Matches, $(\x27roundOf32Container\x27), \x27R32\x27);\\n    updateProgression();\\n  \x7d\\n\\n  function renderRound(matches, container, rk) \x7b\\n    container.innerHTML \x3d \x27\x27;\\n    const isMobile \x3d isNarrow();\\n\\n    matches.forEach((match, i) \x3d\x3e \x7b\\n      const \x7b num, rest \x7d \x3d splitMatchMeta(match);\\n      const desc \x3d FIXTURE_DESC\x5bmatch.matchNo\x5d || \x27\x27;\\n      const infoBtn \x3d desc\\n        ? `\x3cbutton type\x3d\\\x22button\\\x22 class\x3d\\\x22match-info-btn\\\x22 aria-label\x3d\\\x22Fixture info\\\x22 data-desc\x3d\\\x22$\x7besc(desc)\x7d\\\x22\x3eⓘ\x3cspan class\x3d\\\x22match-tooltip\\\x22\x3e$\x7besc(desc)\x7d\x3c\\\/span\x3e\x3c\\\/button\x3e`\\n        : \x27\x27;\\n\\n      const card \x3d document.createElement(\x27div\x27);\\n      card.className \x3d \x27match-card\x27 + (match.winner ? \x27 has-winner\x27 : \x27\x27);\\n\\n      if (isMobile) \x7b\\n        card.innerHTML \x3d `\\n          \x3cdiv class\x3d\\\x22match-meta\\\x22\x3e\\n            \x3cspan class\x3d\\\x22match-meta-num\\\x22\x3e$\x7besc(num)\x7d\x3c\\\/span\x3e\\n            $\x7binfoBtn\x7d\\n            \x3cspan class\x3d\\\x22match-meta-rest\\\x22\x3e$\x7besc(rest)\x7d\x3c\\\/span\x3e\\n          \x3c\\\/div\x3e\\n          \x3cdiv class\x3d\\\x22match-row-mobile\\\x22\x3e\\n            \x3cdiv class\x3d\\\x22mobile-team-score-row\\\x22\x3e\\n              \x3cinput class\x3d\\\x22score-input\\\x22 type\x3d\\\x22text\\\x22 inputmode\x3d\\\x22numeric\\\x22 maxlength\x3d\\\x221\\\x22\\n                id\x3d\\\x22$\x7brk\x7d_$\x7bi\x7d_S1\\\x22 value\x3d\\\x22$\x7bmatch.score1\x7d\\\x22 aria-label\x3d\\\x22$\x7besc(match.team1)\x7d score\\\x22\x3e\\n              \x3cspan class\x3d\\\x22mobile-team-name\\\x22 id\x3d\\\x22$\x7brk\x7d_$\x7bi\x7d_TEAM1\\\x22\x3e$\x7besc(match.team1)\x7d\x3c\\\/span\x3e\\n            \x3c\\\/div\x3e\\n            \x3cdiv class\x3d\\\x22mobile-team-score-row\\\x22 style\x3d\\\x22margin-top:4px;\\\x22\x3e\\n              \x3cinput class\x3d\\\x22score-input\\\x22 type\x3d\\\x22text\\\x22 inputmode\x3d\\\x22numeric\\\x22 maxlength\x3d\\\x221\\\x22\\n                id\x3d\\\x22$\x7brk\x7d_$\x7bi\x7d_S2\\\x22 value\x3d\\\x22$\x7bmatch.score2\x7d\\\x22 aria-label\x3d\\\x22$\x7besc(match.team2)\x7d score\\\x22\x3e\\n              \x3cspan class\x3d\\\x22mobile-team-name\\\x22 id\x3d\\\x22$\x7brk\x7d_$\x7bi\x7d_TEAM2\\\x22\x3e$\x7besc(match.team2)\x7d\x3c\\\/span\x3e\\n            \x3c\\\/div\x3e\\n          \x3c\\\/div\x3e\\n          \x3cdiv class\x3d\\\x22match-error\\\x22 id\x3d\\\x22$\x7brk\x7d_$\x7bi\x7d_ERROR\\\x22\x3e\x3c\\\/div\x3e\\n        `;\\n      \x7d else \x7b\\n        card.innerHTML \x3d `\\n          \x3cdiv class\x3d\\\x22match-meta\\\x22\x3e\\n            \x3cspan class\x3d\\\x22match-meta-num\\\x22\x3e$\x7besc(num)\x7d\x3c\\\/span\x3e\\n            $\x7binfoBtn\x7d\\n            \x3cspan class\x3d\\\x22match-meta-rest\\\x22\x3e$\x7besc(rest)\x7d\x3c\\\/span\x3e\\n          \x3c\\\/div\x3e\\n          \x3cdiv class\x3d\\\x22match-row\\\x22\x3e\\n            \x3cdiv class\x3d\\\x22match-team-left\\\x22\x3e\\n              \x3cspan class\x3d\\\x22match-team-name\\\x22 id\x3d\\\x22$\x7brk\x7d_$\x7bi\x7d_TEAM1\\\x22\x3e$\x7besc(match.team1)\x7d\x3c\\\/span\x3e\\n            \x3c\\\/div\x3e\\n            \x3cinput class\x3d\\\x22score-input\\\x22 type\x3d\\\x22text\\\x22 inputmode\x3d\\\x22numeric\\\x22 maxlength\x3d\\\x221\\\x22\\n              id\x3d\\\x22$\x7brk\x7d_$\x7bi\x7d_S1\\\x22 value\x3d\\\x22$\x7bmatch.score1\x7d\\\x22 aria-label\x3d\\\x22$\x7besc(match.team1)\x7d score\\\x22\x3e\\n            \x3cdiv class\x3d\\\x22score-sep\\\x22\x3e\\u2013\x3c\\\/div\x3e\\n            \x3cinput class\x3d\\\x22score-input\\\x22 type\x3d\\\x22text\\\x22 inputmode\x3d\\\x22numeric\\\x22 maxlength\x3d\\\x221\\\x22\\n              id\x3d\\\x22$\x7brk\x7d_$\x7bi\x7d_S2\\\x22 value\x3d\\\x22$\x7bmatch.score2\x7d\\\x22 aria-label\x3d\\\x22$\x7besc(match.team2)\x7d score\\\x22\x3e\\n            \x3cdiv class\x3d\\\x22match-team-right\\\x22\x3e\\n              \x3cspan class\x3d\\\x22match-team-name\\\x22 id\x3d\\\x22$\x7brk\x7d_$\x7bi\x7d_TEAM2\\\x22\x3e$\x7besc(match.team2)\x7d\x3c\\\/span\x3e\\n            \x3c\\\/div\x3e\\n          \x3c\\\/div\x3e\\n          \x3cdiv class\x3d\\\x22match-error\\\x22 id\x3d\\\x22$\x7brk\x7d_$\x7bi\x7d_ERROR\\\x22\x3e\x3c\\\/div\x3e\\n        `;\\n      \x7d\\n\\n      container.appendChild(card);\\n\\n      \/\/ Wire info button \\u2014 hover works on desktop via CSS,\\n      \\n      const infoEl \x3d card.querySelector(\x27.match-info-btn\x27);\\n      if (infoEl) \x7b\\n        infoEl.addEventListener(\x27click\x27, e \x3d\x3e \x7b\\n          e.stopPropagation();\\n          const isOpen \x3d infoEl.classList.contains(\x27tip-open\x27);\\n          \\n          document.querySelectorAll(\x27.match-info-btn.tip-open\x27).forEach(el \x3d\x3e el.classList.remove(\x27tip-open\x27));\\n          if (!isOpen) \x7b\\n            infoEl.classList.add(\x27tip-open\x27);\\n            \\n            const rect \x3d infoEl.getBoundingClientRect();\\n            infoEl.classList.toggle(\x27tip-down\x27, rect.top \x3c 80);\\n          \x7d\\n        \x7d);\\n      \x7d\\n\\n      const s1el \x3d $(`$\x7brk\x7d_$\x7bi\x7d_S1`);\\n      const s2el \x3d $(`$\x7brk\x7d_$\x7bi\x7d_S2`);\\n\\n      \x5bs1el, s2el\x5d.forEach(el \x3d\x3e \x7b\\n        el.addEventListener(\x27keydown\x27, restrictScoreInput);\\n        el.addEventListener(\x27input\x27, e \x3d\x3e \x7b\\n          normaliseScoreInput(e.target);\\n          handleScoreInput(matches, i, rk);\\n          autoAdvanceScoreInput(e.target, rk, i);\\n        \x7d);\\n        el.addEventListener(\x27blur\x27, () \x3d\x3e handleScoreBlur(matches, i, rk));\\n        el.addEventListener(\x27paste\x27, e \x3d\x3e e.preventDefault());\\n      \x7d);\\n\\n      updateTeamColours(matches, i, rk);\\n    \x7d);\\n  \x7d\\n\\n  function restrictScoreInput(e) \x7b\\n    const allowedKeys \x3d \x5b\x27Backspace\x27,\x27Delete\x27,\x27Tab\x27,\x27ArrowLeft\x27,\x27ArrowRight\x27,\x27ArrowUp\x27,\x27ArrowDown\x27,\x27Home\x27,\x27End\x27\x5d;\\n    if (allowedKeys.includes(e.key)) return;\\n    if (!\/^\x5b0-9\x5d$\/.test(e.key)) \x7b e.preventDefault(); return; \x7d\\n    const input \x3d e.target;\\n    const selectedLength \x3d input.selectionEnd - input.selectionStart;\\n    const currentLength \x3d input.value.length;\\n    if (currentLength \x3e\x3d 1 \x26\x26 selectedLength \x3d\x3d\x3d 0) e.preventDefault();\\n  \x7d\\n\\n  function normaliseScoreInput(input) \x7b\\n    let v \x3d String(input.value || \x27\x27).replace(\/\x5b^0-9\x5d\/g, \x27\x27);\\n    if (v.length \x3e 1) v \x3d v.slice(0, 1);\\n    input.value \x3d v;\\n  \x7d\\n\\n  function autoAdvanceScoreInput(input, rk, matchIndex) \x7b\\n    const value \x3d String(input.value || \x27\x27);\\n    if (!\/^\x5b0-9\x5d$\/.test(value)) return;\\n    const isS1 \x3d input.id.endsWith(\x27_S1\x27);\\n    if (isS1) \x7b\\n      const sameMatchSecond \x3d $(`$\x7brk\x7d_$\x7bmatchIndex\x7d_S2`);\\n      if (sameMatchSecond) requestAnimationFrame(() \x3d\x3e \x7b sameMatchSecond.focus(); sameMatchSecond.select(); \x7d);\\n      return;\\n    \x7d\\n    const nextSameRound \x3d $(`$\x7brk\x7d_$\x7bmatchIndex + 1\x7d_S1`);\\n    if (nextSameRound) \x7b\\n      requestAnimationFrame(() \x3d\x3e \x7b nextSameRound.focus(); nextSameRound.select(); \x7d);\\n      return;\\n    \x7d\\n    updateProgression();\\n    setTimeout(() \x3d\x3e \x7b\\n      const nextInput \x3d getNextRoundFirstInput(rk);\\n      if (nextInput) \x7b nextInput.focus(); nextInput.select(); \x7d\\n    \x7d, 30);\\n  \x7d\\n\\n  function getNextRoundFirstInput(currentRoundKey) \x7b\\n    const roundOrder \x3d \x5b\x27R32\x27, \x27R16\x27, \x27QF\x27, \x27SF\x27, \x27FINAL\x27\x5d;\\n    const currentIndex \x3d roundOrder.indexOf(currentRoundKey);\\n    if (currentIndex \x3d\x3d\x3d -1) return null;\\n    for (let i \x3d currentIndex + 1; i \x3c roundOrder.length; i++) \x7b\\n      const el \x3d $(`$\x7broundOrder\x5bi\x5d\x7d_0_S1`);\\n      if (el \x26\x26 el.offsetParent !\x3d\x3d null) return el;\\n    \x7d\\n    return null;\\n  \x7d\\n\\n  function handleScoreInput(matches, i, rk) \x7b\\n    const s1 \x3d $(`$\x7brk\x7d_$\x7bi\x7d_S1`).value;\\n    const s2 \x3d $(`$\x7brk\x7d_$\x7bi\x7d_S2`).value;\\n    matches\x5bi\x5d.score1 \x3d s1;\\n    matches\x5bi\x5d.score2 \x3d s2;\\n    matches\x5bi\x5d.winner \x3d \x27\x27;\\n\\n    if (s1 !\x3d\x3d \x27\x27 \x26\x26 s2 !\x3d\x3d \x27\x27) \x7b\\n      const n1 \x3d Number(s1), n2 \x3d Number(s2);\\n      if (Number.isInteger(n1) \x26\x26 Number.isInteger(n2) \x26\x26 n1 \x3e\x3d 0 \x26\x26 n2 \x3e\x3d 0 \x26\x26 n1 !\x3d\x3d n2) \x7b\\n        matches\x5bi\x5d.winner \x3d n1 \x3e n2 ? matches\x5bi\x5d.team1 : matches\x5bi\x5d.team2;\\n      \x7d\\n    \x7d\\n\\n    updateTeamColours(matches, i, rk);\\n    const errEl \x3d $(`$\x7brk\x7d_$\x7bi\x7d_ERROR`);\\n    if (errEl) errEl.textContent \x3d \x27\x27;\\n    updateProgression();\\n    scheduleDraftSave();\\n  \x7d\\n\\n  function handleScoreBlur(matches, i, rk) \x7b\\n    const errEl \x3d $(`$\x7brk\x7d_$\x7bi\x7d_ERROR`);\\n    if (!errEl) return;\\n    const m \x3d matches\x5bi\x5d;\\n    if (m.score1 \x3d\x3d\x3d \x27\x27 || m.score2 \x3d\x3d\x3d \x27\x27) \x7b errEl.textContent \x3d \x27\x27; return; \x7d\\n    const n1 \x3d Number(m.score1), n2 \x3d Number(m.score2);\\n    if (n1 \x3d\x3d\x3d n2) errEl.textContent \x3d \x27Draws are not allowed. For a penalty win, record as a 1-goal win.\x27;\\n    else errEl.textContent \x3d \x27\x27;\\n    updateProgression();\\n  \x7d\\n\\n  function updateTeamColours(matches, i, rk) \x7b\\n    const t1 \x3d $(`$\x7brk\x7d_$\x7bi\x7d_TEAM1`);\\n    const t2 \x3d $(`$\x7brk\x7d_$\x7bi\x7d_TEAM2`);\\n    if (!t1 || !t2) return;\\n\\n    \x5bt1, t2\x5d.forEach(el \x3d\x3e el.classList.remove(\x27winner\x27,\x27loser\x27));\\n    const m \x3d matches\x5bi\x5d;\\n    if (!m.winner) return;\\n\\n    if (m.winner \x3d\x3d\x3d m.team1) \x7b t1.classList.add(\x27winner\x27); t2.classList.add(\x27loser\x27); \x7d\\n    else \x7b t2.classList.add(\x27winner\x27); t1.classList.add(\x27loser\x27); \x7d\\n\\n    const s1el \x3d $(`$\x7brk\x7d_$\x7bi\x7d_S1`);\\n    const s2el \x3d $(`$\x7brk\x7d_$\x7bi\x7d_S2`);\\n    if (s1el \x26\x26 s2el) \x7b\\n      s1el.classList.toggle(\x27has-winner\x27, !!m.winner);\\n      s2el.classList.toggle(\x27has-winner\x27, !!m.winner);\\n    \x7d\\n\\n    const card \x3d t1.closest(\x27.match-card\x27);\\n    if (card) card.classList.toggle(\x27has-winner\x27, !!m.winner);\\n  \x7d\\n\\n  function updateRoundChip(chipId, matches) \x7b\\n    const el \x3d $(chipId);\\n    if (!el) return;\\n    const done  \x3d matches.filter(m \x3d\x3e m.winner).length;\\n    const total \x3d matches.length;\\n    el.textContent \x3d `$\x7bdone\x7d \/ $\x7btotal\x7d`;\\n    el.classList.toggle(\x27complete\x27, done \x3d\x3d\x3d total \x26\x26 total \x3e 0);\\n  \x7d\\n\\n  function validateRoundComplete(matches) \x7b\\n    return matches.length \x3e 0 \x26\x26 matches.every(m \x3d\x3e\\n      m.team1 \x26\x26 m.team2 \x26\x26\\n      m.score1 !\x3d\x3d \x27\x27 \x26\x26 m.score2 !\x3d\x3d \x27\x27 \x26\x26\\n      m.winner \x26\x26\\n      m.winner \x3d\x3d\x3d (Number(m.score1) \x3e Number(m.score2) ? m.team1 : m.team2) \x26\x26\\n      Number(m.score1) !\x3d\x3d Number(m.score2)\\n    );\\n  \x7d\\n\\n  function updateProgression() \x7b\\n    updateRoundChip(\x27r32Chip\x27, roundOf32Matches);\\n\\n    if (!validateRoundComplete(roundOf32Matches)) \x7b\\n      setRoundCollapsed(\x27roundOf32Wrap\x27, false);\\n      resetFrom(\x27R16\x27);\\n      return;\\n    \x7d\\n\\n    buildR16();\\n    updateRoundChip(\x27r16Chip\x27, roundOf16Matches);\\n    setRoundCollapsed(\x27roundOf32Wrap\x27, true);\\n    setRoundCollapsed(\x27roundOf16Wrap\x27, false);\\n\\n    if (!validateRoundComplete(roundOf16Matches)) \x7b resetFrom(\x27QF\x27); return; \x7d\\n\\n    buildQF();\\n    updateRoundChip(\x27qfChip\x27, quarterFinalMatches);\\n    setRoundCollapsed(\x27roundOf16Wrap\x27, true);\\n    setRoundCollapsed(\x27quarterFinalsWrap\x27, false);\\n\\n    if (!validateRoundComplete(quarterFinalMatches)) \x7b resetFrom(\x27SF\x27); return; \x7d\\n\\n    buildSF();\\n    updateRoundChip(\x27sfChip\x27, semiFinalMatches);\\n    setRoundCollapsed(\x27quarterFinalsWrap\x27, true);\\n    setRoundCollapsed(\x27semiFinalsWrap\x27, false);\\n\\n    if (!validateRoundComplete(semiFinalMatches)) \x7b resetFrom(\x27FINAL\x27); return; \x7d\\n\\n    buildFinal();\\n    updateRoundChip(\x27finalChip\x27, finalMatch ? \x5bfinalMatch\x5d : \x5b\x5d);\\n    setRoundCollapsed(\x27semiFinalsWrap\x27, true);\\n    setRoundCollapsed(\x27finalWrap\x27, false);\\n\\n    if (!finalMatch || !validateRoundComplete(\x5bfinalMatch\x5d)) \x7b\\n      predictedChampion \x3d null;\\n      $(\x27championWrap\x27).classList.add(\x27hidden\x27);\\n      updateSectionBadge(\x27badge-bracket\x27, false);\\n      updateProgressBar();\\n      return;\\n    \x7d\\n\\n    predictedChampion \x3d finalMatch.winner;\\n    $(\x27championWrap\x27).classList.remove(\x27hidden\x27);\\n    $(\x27championBox\x27).innerHTML \x3d `\\n      \x3cdiv class\x3d\\\x22champion-trophy\\\x22\x3e🏆\x3c\\\/div\x3e\\n      \x3cdiv\x3e\\n        \x3cdiv class\x3d\\\x22champion-label\\\x22\x3eYour predicted champion\x3c\\\/div\x3e\\n        \x3cdiv class\x3d\\\x22champion-name\\\x22\x3e$\x7besc(predictedChampion)\x7d\x3c\\\/div\x3e\\n      \x3c\\\/div\x3e\\n    `;\\n    updateSectionBadge(\x27badge-bracket\x27, true);\\n    updateProgressBar();\\n    scheduleDraftSave();\\n  \x7d\\n\\n  function buildR16() \x7b\\n    const pairs \x3d \x5b\\n      \x5b74,77,89,\x274 July\x27\x5d, \x5b73,75,90,\x274 July\x27\x5d, \x5b76,78,91,\x275 July\x27\x5d, \x5b79,80,92,\x275 July\x27\x5d,\\n      \x5b83,84,93,\x276 July\x27\x5d, \x5b81,82,94,\x276 July\x27\x5d, \x5b86,88,95,\x277 July\x27\x5d, \x5b85,87,96,\x277 July\x27\x5d\\n    \x5d;\\n\\n    const newMatches \x3d pairs.map((\x5bm1,m2,mn,date\x5d) \x3d\x3e (\x7b\\n      matchNo: mn, round: \x27Round of 16\x27, date,\\n      kickOffGMT: fixtureKickOffByMatchNo(generatedBracket, mn),\\n      team1: winnerOf(roundOf32Matches, m1),\\n      team2: winnerOf(roundOf32Matches, m2)\\n    \x7d));\\n\\n    const structureChanged \x3d roundOf16Matches.length !\x3d\x3d newMatches.length ||\\n      newMatches.some((m, i) \x3d\x3e \x7b\\n        const old \x3d roundOf16Matches\x5bi\x5d;\\n        return !old || old.matchNo !\x3d\x3d m.matchNo || old.team1 !\x3d\x3d m.team1 || old.team2 !\x3d\x3d m.team2 || old.kickOffGMT !\x3d\x3d m.kickOffGMT;\\n      \x7d);\\n\\n    if (!structureChanged) return;\\n\\n    const prev \x3d byMatchNo(roundOf16Matches);\\n    roundOf16Matches \x3d newMatches.map(m \x3d\x3e \x7b\\n      const old \x3d prev\x5bm.matchNo\x5d;\\n      const same \x3d old \x26\x26 old.team1 \x3d\x3d\x3d m.team1 \x26\x26 old.team2 \x3d\x3d\x3d m.team2;\\n      return \x7b ...m, score1: same ? old.score1 : \x27\x27, score2: same ? old.score2 : \x27\x27, winner: same ? deriveWinner(m.team1, m.team2, old.score1, old.score2) : \x27\x27 \x7d;\\n    \x7d);\\n\\n    $(\x27roundOf16Wrap\x27).classList.remove(\x27hidden\x27);\\n    renderRound(roundOf16Matches, $(\x27roundOf16Container\x27), \x27R16\x27);\\n  \x7d\\n\\n  function buildQF() \x7b\\n    const pairs \x3d \x5b\\n      \x5b89,90,97,\x279 July\x27\x5d, \x5b93,94,98,\x2710 July\x27\x5d, \x5b91,92,99,\x2711 July\x27\x5d, \x5b95,96,100,\x2711 July\x27\x5d\\n    \x5d;\\n\\n    const newMatches \x3d pairs.map((\x5bm1,m2,mn,date\x5d) \x3d\x3e (\x7b\\n      matchNo: mn, round: \x27Quarter-final\x27, date,\\n      kickOffGMT: fixtureKickOffByMatchNo(generatedBracket, mn),\\n      team1: winnerOf(roundOf16Matches, m1),\\n      team2: winnerOf(roundOf16Matches, m2)\\n    \x7d));\\n\\n    const structureChanged \x3d quarterFinalMatches.length !\x3d\x3d newMatches.length ||\\n      newMatches.some((m, i) \x3d\x3e \x7b\\n        const old \x3d quarterFinalMatches\x5bi\x5d;\\n        return !old || old.matchNo !\x3d\x3d m.matchNo || old.team1 !\x3d\x3d m.team1 || old.team2 !\x3d\x3d m.team2 || old.kickOffGMT !\x3d\x3d m.kickOffGMT;\\n      \x7d);\\n\\n    if (!structureChanged) return;\\n\\n    const prev \x3d byMatchNo(quarterFinalMatches);\\n    quarterFinalMatches \x3d newMatches.map(m \x3d\x3e \x7b\\n      const old \x3d prev\x5bm.matchNo\x5d;\\n      const same \x3d old \x26\x26 old.team1 \x3d\x3d\x3d m.team1 \x26\x26 old.team2 \x3d\x3d\x3d m.team2;\\n      return \x7b ...m, score1: same ? old.score1 : \x27\x27, score2: same ? old.score2 : \x27\x27, winner: same ? deriveWinner(m.team1, m.team2, old.score1, old.score2) : \x27\x27 \x7d;\\n    \x7d);\\n\\n    $(\x27quarterFinalsWrap\x27).classList.remove(\x27hidden\x27);\\n    renderRound(quarterFinalMatches, $(\x27quarterFinalsContainer\x27), \x27QF\x27);\\n  \x7d\\n\\n  function buildSF() \x7b\\n    const pairs \x3d \x5b\x5b97,98,101,\x2714 July\x27\x5d, \x5b99,100,102,\x2715 July\x27\x5d\x5d;\\n\\n    const newMatches \x3d pairs.map((\x5bm1,m2,mn,date\x5d) \x3d\x3e (\x7b\\n      matchNo: mn, round: \x27Semi-final\x27, date,\\n      kickOffGMT: fixtureKickOffByMatchNo(generatedBracket, mn),\\n      team1: winnerOf(quarterFinalMatches, m1),\\n      team2: winnerOf(quarterFinalMatches, m2)\\n    \x7d));\\n\\n    const structureChanged \x3d semiFinalMatches.length !\x3d\x3d newMatches.length ||\\n      newMatches.some((m, i) \x3d\x3e \x7b\\n        const old \x3d semiFinalMatches\x5bi\x5d;\\n        return !old || old.matchNo !\x3d\x3d m.matchNo || old.team1 !\x3d\x3d m.team1 || old.team2 !\x3d\x3d m.team2 || old.kickOffGMT !\x3d\x3d m.kickOffGMT;\\n      \x7d);\\n\\n    if (!structureChanged) return;\\n\\n    const prev \x3d byMatchNo(semiFinalMatches);\\n    semiFinalMatches \x3d newMatches.map(m \x3d\x3e \x7b\\n      const old \x3d prev\x5bm.matchNo\x5d;\\n      const same \x3d old \x26\x26 old.team1 \x3d\x3d\x3d m.team1 \x26\x26 old.team2 \x3d\x3d\x3d m.team2;\\n      return \x7b ...m, score1: same ? old.score1 : \x27\x27, score2: same ? old.score2 : \x27\x27, winner: same ? deriveWinner(m.team1, m.team2, old.score1, old.score2) : \x27\x27 \x7d;\\n    \x7d);\\n\\n    $(\x27semiFinalsWrap\x27).classList.remove(\x27hidden\x27);\\n    renderRound(semiFinalMatches, $(\x27semiFinalsContainer\x27), \x27SF\x27);\\n  \x7d\\n\\n  function buildFinal() \x7b\\n    const team1 \x3d winnerOf(semiFinalMatches, 101);\\n    const team2 \x3d winnerOf(semiFinalMatches, 102);\\n    const kickOffGMT \x3d fixtureKickOffByMatchNo(generatedBracket, 104);\\n\\n    const structureChanged \x3d !finalMatch || finalMatch.team1 !\x3d\x3d team1 || finalMatch.team2 !\x3d\x3d team2 || finalMatch.kickOffGMT !\x3d\x3d kickOffGMT;\\n    if (!structureChanged) return;\\n\\n    const old \x3d finalMatch;\\n    const same \x3d old \x26\x26 old.team1 \x3d\x3d\x3d team1 \x26\x26 old.team2 \x3d\x3d\x3d team2;\\n    finalMatch \x3d \x7b\\n      matchNo: 104, round: \x27Final\x27, date: \x2719 July\x27, kickOffGMT: kickOffGMT || \x27\x27,\\n      team1, team2,\\n      score1: same ? old.score1 : \x27\x27, score2: same ? old.score2 : \x27\x27,\\n      winner: same ? deriveWinner(team1, team2, old.score1, old.score2) : \x27\x27\\n    \x7d;\\n\\n    $(\x27finalWrap\x27).classList.remove(\x27hidden\x27);\\n    renderRound(\x5bfinalMatch\x5d, $(\x27finalContainer\x27), \x27FINAL\x27);\\n  \x7d\\n\\n  function fixtureKickOffByMatchNo(bracket, matchNo) \x7b\\n    if (!bracket || !Array.isArray(bracket.roundOf32)) return \x27\x27;\\n    const allFixtures \x3d \x5b\\n      ...(bracket.roundOf32 || \x5b\x5d), ...(bracket.roundOf16 || \x5b\x5d),\\n      ...(bracket.quarterFinals || \x5b\x5d), ...(bracket.semiFinals || \x5b\x5d),\\n      ...(bracket.final ? \x5bbracket.final\x5d : \x5b\x5d)\\n    \x5d;\\n    const fixture \x3d allFixtures.find(x \x3d\x3e Number(x.matchNo) \x3d\x3d\x3d Number(matchNo));\\n    return fixture \x26\x26 fixture.kickOffGMT ? fixture.kickOffGMT : \x27\x27;\\n  \x7d\\n\\n  function deriveWinner(t1, t2, s1, s2) \x7b\\n    if (!t1 || !t2 || s1 \x3d\x3d\x3d \x27\x27 || s2 \x3d\x3d\x3d \x27\x27 || s1 \x3d\x3d\x3d undefined || s2 \x3d\x3d\x3d undefined) return \x27\x27;\\n    const n1 \x3d Number(s1), n2 \x3d Number(s2);\\n    if (!Number.isInteger(n1) || !Number.isInteger(n2) || n1 \x3c 0 || n2 \x3c 0 || n1 \x3d\x3d\x3d n2) return \x27\x27;\\n    return n1 \x3e n2 ? t1 : t2;\\n  \x7d\\n\\n  function resetFrom(stage) \x7b\\n    if (stage \x3d\x3d\x3d \x27R16\x27) \x7b\\n      roundOf16Matches \x3d \x5b\x5d;\\n      $(\x27roundOf16Wrap\x27).classList.add(\x27hidden\x27);\\n      $(\x27roundOf16Container\x27).innerHTML \x3d \x27\x27;\\n      setRoundCollapsed(\x27roundOf32Wrap\x27, false);\\n    \x7d\\n\\n    if (stage \x3d\x3d\x3d \x27R16\x27 || stage \x3d\x3d\x3d \x27QF\x27) \x7b\\n      quarterFinalMatches \x3d \x5b\x5d;\\n      $(\x27quarterFinalsWrap\x27).classList.add(\x27hidden\x27);\\n      $(\x27quarterFinalsContainer\x27).innerHTML \x3d \x27\x27;\\n    \x7d\\n\\n    if (stage \x3d\x3d\x3d \x27R16\x27 || stage \x3d\x3d\x3d \x27QF\x27 || stage \x3d\x3d\x3d \x27SF\x27) \x7b\\n      semiFinalMatches \x3d \x5b\x5d;\\n      $(\x27semiFinalsWrap\x27).classList.add(\x27hidden\x27);\\n      $(\x27semiFinalsContainer\x27).innerHTML \x3d \x27\x27;\\n    \x7d\\n\\n    finalMatch \x3d null;\\n    predictedChampion \x3d null;\\n    $(\x27finalWrap\x27).classList.add(\x27hidden\x27);\\n    $(\x27finalContainer\x27).innerHTML \x3d \x27\x27;\\n    $(\x27championWrap\x27).classList.add(\x27hidden\x27);\\n    $(\x27championBox\x27).innerHTML \x3d \x27\x27;\\n\\n    updateRoundChip(\x27r16Chip\x27, roundOf16Matches);\\n    updateRoundChip(\x27qfChip\x27, quarterFinalMatches);\\n    updateRoundChip(\x27sfChip\x27, semiFinalMatches);\\n    updateRoundChip(\x27finalChip\x27, finalMatch ? \x5bfinalMatch\x5d : \x5b\x5d);\\n\\n    updateSectionBadge(\x27badge-bracket\x27, false);\\n    updateProgressBar();\\n  \x7d\\n\\n  function winnerOf(matches, matchNo) \x7b\\n    const m \x3d matches.find(x \x3d\x3e Number(x.matchNo) \x3d\x3d\x3d Number(matchNo));\\n    return m ? m.winner : \x27\x27;\\n  \x7d\\n\\n  function byMatchNo(matches) \x7b\\n    const map \x3d \x7b\x7d;\\n    matches.forEach(m \x3d\x3e \x7b map\x5bm.matchNo\x5d \x3d m; \x7d);\\n    return map;\\n  \x7d\\n\\n  function clearGeneratedBracket() \x7b\\n    generatedBracket \x3d null;\\n    roundOf32Matches \x3d \x5b\x5d;\\n    roundOf16Matches \x3d \x5b\x5d;\\n    quarterFinalMatches \x3d \x5b\x5d;\\n    semiFinalMatches \x3d \x5b\x5d;\\n    finalMatch \x3d null;\\n    predictedChampion \x3d null;\\n\\n    bracketSection.classList.add(\x27hidden\x27);\\n\\n    \x5b\x27roundOf32Container\x27,\x27roundOf16Container\x27,\x27quarterFinalsContainer\x27,\x27semiFinalsContainer\x27,\x27finalContainer\x27,\x27championBox\x27\x5d.forEach(id \x3d\x3e \x7b\\n      const el \x3d $(id);\\n      if (el) el.innerHTML \x3d \x27\x27;\\n    \x7d);\\n\\n    \x5b\x27roundOf16Wrap\x27,\x27quarterFinalsWrap\x27,\x27semiFinalsWrap\x27,\x27finalWrap\x27,\x27championWrap\x27\x5d.forEach(id \x3d\x3e \x7b\\n      const el \x3d $(id);\\n      if (el) el.classList.add(\x27hidden\x27);\\n    \x7d);\\n\\n    \x5b\x27roundOf32Wrap\x27,\x27roundOf16Wrap\x27,\x27quarterFinalsWrap\x27,\x27semiFinalsWrap\x27,\x27finalWrap\x27\x5d.forEach(id \x3d\x3e setRoundCollapsed(id, false));\\n\\n    updateRoundChip(\x27r32Chip\x27, roundOf32Matches);\\n    updateRoundChip(\x27r16Chip\x27, roundOf16Matches);\\n    updateRoundChip(\x27qfChip\x27, quarterFinalMatches);\\n    updateRoundChip(\x27sfChip\x27, semiFinalMatches);\\n    updateRoundChip(\x27finalChip\x27, finalMatch ? \x5bfinalMatch\x5d : \x5b\x5d);\\n\\n    hideStatus(\x27bracketStatus\x27);\\n    updateSectionBadge(\x27badge-bracket\x27, false);\\n    updateProgressBar();\\n  \x7d\\n\\n  function validateKnockout() \x7b\\n    const el \x3d $(\x27submitStatus\x27);\\n    if (!generatedBracket) \x7b showMsg(el, \x27Please generate your knockout bracket first.\x27, \x27error\x27); return false; \x7d\\n    if (!validateRoundComplete(roundOf32Matches)) \x7b showMsg(el, \x27Please complete every Round of 32 score.\x27, \x27error\x27); return false; \x7d\\n    if (!validateRoundComplete(roundOf16Matches)) \x7b showMsg(el, \x27Please complete every Round of 16 score.\x27, \x27error\x27); return false; \x7d\\n    if (!validateRoundComplete(quarterFinalMatches)) \x7b showMsg(el, \x27Please complete every quarter-final score.\x27, \x27error\x27); return false; \x7d\\n    if (!validateRoundComplete(semiFinalMatches)) \x7b showMsg(el, \x27Please complete every semi-final score.\x27, \x27error\x27); return false; \x7d\\n    if (!finalMatch || !validateRoundComplete(\x5bfinalMatch\x5d)) \x7b showMsg(el, \x27Please complete the final score.\x27, \x27error\x27); return false; \x7d\\n    if (!predictedChampion) \x7b showMsg(el, \x27Your predicted champion has not been determined.\x27, \x27error\x27); return false; \x7d\\n    return true;\\n  \x7d\\n\\n  function showMsg(el, text, type) \x7b\\n    el.textContent \x3d text;\\n    el.className \x3d \x27status-msg visible \x27 + type;\\n  \x7d\\n\\n  function buildPayload() \x7b\\n    const payload \x3d \x7b\\n      FULL_NAME: $(\x27fullName\x27).value.trim(),\\n      EMAIL: $(\x27email\x27).value.trim(),\\n      DISPLAY_NAME: $(\x27fullName\x27).value.trim(),\\n      FORM_VERSION: FORM_VERSION\\n    \x7d;\\n\\n    GROUP_LETTERS.forEach(g \x3d\x3e \x7b\\n      const sel \x3d groupSelections\x5bg\x5d || \x7b\x7d;\\n      payload\x5b`$\x7bg\x7d_1ST`\x5d \x3d sel\x5b\x271ST\x27\x5d || \x27\x27;\\n      payload\x5b`$\x7bg\x7d_2ND`\x5d \x3d sel\x5b\x272ND\x27\x5d || \x27\x27;\\n      payload\x5b`$\x7bg\x7d_3RD`\x5d \x3d sel\x5b\x273RD\x27\x5d || \x27\x27;\\n    \x7d);\\n\\n    thirdRankTeams.forEach((t, i) \x3d\x3e \x7b payload\x5b`THIRD_RANK_$\x7bi+1\x7d`\x5d \x3d t; \x7d);\\n\\n    payload.KNOCKOUT_DATA \x3d \x7b\\n      top8Thirds: generatedBracket ? (generatedBracket.top8Thirds || \x5b\x5d) : \x5b\x5d,\\n      thirdPlaceAssignments: generatedBracket ? (generatedBracket.thirdPlaceAssignments || \x7b\x7d) : \x7b\x7d,\\n      roundOf32: roundOf32Matches,\\n      roundOf16: roundOf16Matches,\\n      quarterFinals: quarterFinalMatches,\\n      semiFinals: semiFinalMatches,\\n      final: finalMatch,\\n      predictedChampion: predictedChampion || \x27\x27\\n    \x7d;\\n\\n    return payload;\\n  \x7d\\n\\n  predictorForm.addEventListener(\x27submit\x27, e \x3d\x3e \x7b\\n    e.preventDefault();\\n    hideStatus(\x27submitStatus\x27);\\n\\n    const ok \x3d validateDetails() \x26\x26 validateGroups() \x26\x26 validateThirdRank() \x26\x26 validateKnockout();\\n    if (!ok) \x7b\\n      if ($(\x27submitStatus\x27).textContent \x3d\x3d\x3d \x27\x27) \x7b\\n        showMsg($(\x27submitStatus\x27), \x27Please complete all steps above before submitting.\x27, \x27error\x27);\\n      \x7d\\n      return;\\n    \x7d\\n\\n    submitBtn.disabled \x3d true;\\n    showMsg($(\x27submitStatus\x27), \x27Submitting your entry\\u2026\x27, \x27info\x27);\\n\\n    scriptPost(\x27submitPhase1Entry\x27, buildPayload())\\n      .then(res \x3d\x3e \x7b\\n        submitBtn.disabled \x3d false;\\n        if (!res || !res.ok) \x7b\\n          showMsg($(\x27submitStatus\x27), res \x26\x26 res.message ? res.message : \x27Submission failed.\x27, \x27error\x27);\\n          return;\\n        \x7d\\n        clearDraft(false);\\n        resetFormState();\\n        setDraftBanner(\x27Draft cleared after submission\x27);\\n        showMsg($(\x27submitStatus\x27), res.message || \x27Entry submitted successfully. Good luck!\x27, \x27success\x27);\\n      \x7d)\\n      .catch(err \x3d\x3e \x7b\\n        submitBtn.disabled \x3d false;\\n        showMsg($(\x27submitStatus\x27), \x27Submission error: \x27 + (err \x26\x26 err.message ? err.message : String(err)), \x27error\x27);\\n      \x7d);\\n  \x7d);\\n\\n  function resetFormState() \x7b\\n    predictorForm.reset();\\n    groupSelections \x3d \x7b\x7d;\\n    GROUP_LETTERS.forEach(g \x3d\x3e \x7b groupSelections\x5bg\x5d \x3d \x7b \x271ST\x27:\x27\x27, \x272ND\x27:\x27\x27, \x273RD\x27:\x27\x27 \x7d; \x7d);\\n    buildGroupCards();\\n    thirdRankList.innerHTML \x3d \x27\x27;\\n    hideThirdRank();\\n    $(\x27groupsError\x27).classList.remove(\x27visible\x27);\\n    $(\x27thirdRankError\x27).classList.remove(\x27visible\x27);\\n    thirdRankTeams \x3d \x5b\x5d;\\n    draggedIndex \x3d null;\\n    clearGeneratedBracket();\\n    setCardCollapsed(\x27card-groups\x27, false);\\n    setCardCollapsed(\x27card-third\x27, false);\\n    \x5b\x27badge-details\x27,\x27badge-groups\x27,\x27badge-third\x27,\x27badge-bracket\x27\x5d.forEach(id \x3d\x3e \x7b\\n      const el \x3d $(id);\\n      if (el) el.classList.remove(\x27visible\x27);\\n    \x7d);\\n    updateProgressBar();\\n    updateGroupsProgress();\\n  \x7d\\n\\n  function initExpandableNote() \x7b\\n    const btn \x3d $(\x27thirdPlaceNoteBtn\x27);\\n    const body \x3d $(\x27thirdPlaceNoteBody\x27);\\n    const icon \x3d $(\x27thirdPlaceNoteIcon\x27);\\n    if (!btn || !body || !icon) return;\\n    btn.addEventListener(\x27click\x27, () \x3d\x3e \x7b\\n      const isOpen \x3d body.classList.contains(\x27open\x27);\\n      body.classList.toggle(\x27open\x27, !isOpen);\\n      icon.textContent \x3d isOpen ? \x27+\x27 : \x27−\x27;\\n    \x7d);\\n  \x7d\\n\\n  \/* ─── Main init ─────────────────────────────────────── *\/\\n  function initForm() \x7b\\n    $(\x27closedScreen\x27).classList.remove(\x27visible\x27);\\n\\n    scriptGet(\x27getInitialData\x27)\\n      .then(data \x3d\x3e \x7b\\n        if (!data || !data.ok) \x7b\\n          $(\x27closedBody\x27).textContent \x3d data \x26\x26 data.message\\n            ? data.message\\n            : \x27Unable to load the predictor. Please try again later.\x27;\\n          $(\x27closedScreen\x27).classList.add(\x27visible\x27);\\n          return;\\n        \x7d\\n\\n        const isOpen \x3d String(data.entryStatus || \x27\x27).toUpperCase() \x3d\x3d\x3d \x27OPEN\x27;\\n\\n        let deadline \x3d null;\\n        if (data.entryDeadline) \x7b\\n          deadline \x3d new Date(data.entryDeadline);\\n          if (isNaN(deadline.getTime())) deadline \x3d null;\\n        \x7d\\n\\n        if (!isOpen) \x7b\\n          showClosedScreen(deadline, data.competitionName || null);\\n          return;\\n        \x7d\\n\\n        GROUPS        \x3d data.groups || \x7b\x7d;\\n        GROUP_LETTERS \x3d Object.keys(GROUPS).sort();\\n        FORM_VERSION  \x3d data.formVersion || \x27V1\x27;\\n\\n        const titleEl \x3d $(\x27competitionTitle\x27);\\n        if (titleEl \x26\x26 data.competitionName) \x7b\\n          titleEl.innerHTML \x3d data.competitionName;\\n        \x7d\\n\\n        if (!GROUP_LETTERS.length) \x7b\\n          $(\x27closedBody\x27).textContent \x3d \x27No group data was found. Please contact the organiser.\x27;\\n          $(\x27closedScreen\x27).classList.add(\x27visible\x27);\\n          return;\\n        \x7d\\n\\n        GROUP_LETTERS.forEach(g \x3d\x3e \x7b groupSelections\x5bg\x5d \x3d \x7b \x271ST\x27:\x27\x27, \x272ND\x27:\x27\x27, \x273RD\x27:\x27\x27 \x7d; \x7d);\\n\\n        $(\x27mainFormWrap\x27).classList.remove(\x27hidden\x27);\\n\\n        if (deadline \x26\x26 deadline \x3e new Date()) \x7b\\n          startCountdown(deadline);\\n        \x7d\\n\\n        buildGroupCards();\\n        initExpandableNote();\\n        formReady \x3d true;\\n\\n        \/\/ Draft is handled by the welcome screen \\u2014\\n        \\n        updateProgressBar();\\n        updateGroupsProgress();\\n        showWelcomeScreen();\\n      \x7d)\\n      .catch(err \x3d\x3e \x7b\\n        $(\x27closedIcon\x27).textContent \x3d \x27⚠️\x27;\\n        $(\x27closedEyebrow\x27).textContent \x3d \x27Connection error\x27;\\n        $(\x27closedTitle\x27).innerHTML \x3d \x27Could not load \x3cspan\x3ethe predictor\x3c\\\/span\x3e\x27;\\n        $(\x27closedBody\x27).textContent \x3d \x27Something went wrong loading the form. Please refresh the page and try again. If the problem persists, contact the organiser.\x27;\\n        $(\x27closedScreen\x27).classList.add(\x27visible\x27);\\n      \x7d);\\n  \x7d\\n\\n  $(\x27clearDraftBtn\x27).addEventListener(\x27click\x27, () \x3d\x3e \x7b\\n    if (!window.confirm(\x27Clear the saved draft on this device?\x27)) return;\\n    clearDraft();\\n    suppressAutoSave \x3d true;\\n    resetFormState();\\n    suppressAutoSave \x3d false;\\n  \x7d);\\n\\n  $(\x27fullName\x27).addEventListener(\x27blur\x27,  () \x3d\x3e \x7b validateDetailsField(\x27fullName\x27); scheduleDraftSave(); \x7d);\\n  $(\x27email\x27).addEventListener(\x27blur\x27,     () \x3d\x3e \x7b validateDetailsField(\x27email\x27); scheduleDraftSave(); \x7d);\\n  $(\x27fullName\x27).addEventListener(\x27input\x27, scheduleDraftSave);\\n  $(\x27email\x27).addEventListener(\x27input\x27,    scheduleDraftSave);\\n\\n  window.addEventListener(\x27resize\x27, () \x3d\x3e \x7b\\n    const target \x3d document.querySelector(\x27.container\x27) || document.body;\\n    applyLayoutClasses(target.getBoundingClientRect().width || document.body.clientWidth);\\n    if (generatedBracket) \x7b\\n      renderRound(roundOf32Matches, $(\x27roundOf32Container\x27), \x27R32\x27);\\n      if (roundOf16Matches.length)    renderRound(roundOf16Matches, $(\x27roundOf16Container\x27), \x27R16\x27);\\n      if (quarterFinalMatches.length) renderRound(quarterFinalMatches, $(\x27quarterFinalsContainer\x27), \x27QF\x27);\\n      if (semiFinalMatches.length)    renderRound(semiFinalMatches, $(\x27semiFinalsContainer\x27), \x27SF\x27);\\n      if (finalMatch)                 renderRound(\x5bfinalMatch\x5d, $(\x27finalContainer\x27), \x27FINAL\x27);\\n    \x7d\\n  \x7d);\\n\\n  window.addEventListener(\x27beforeunload\x27, () \x3d\x3e \x7b\\n    if (formReady \x26\x26 !suppressAutoSave) saveDraft();\\n  \x7d);\\n\\n  \\n\\n  function applyLayoutClasses(width) \x7b\\n    document.body.classList.toggle(\x27is-narrow\x27,      width \x3c 700);\\n    document.body.classList.toggle(\x27is-very-narrow\x27, width \x3c 420);\\n\\n    \\n    const gc \x3d $(\x27groupsContainer\x27);\\n    if (gc) \x7b\\n      gc.classList.toggle(\x27cols-1\x27, width \x3c 700);\\n      gc.classList.toggle(\x27cols-2\x27, width \x3e\x3d 700 \x26\x26 width \x3c 960);\\n    \x7d\\n  \x7d\\n\\n  function isNarrow() \x7b return document.body.classList.contains(\x27is-narrow\x27); \x7d\\n\\n  \\n  \\n  function initResizeObserver() \x7b\\n    const target \x3d document.querySelector(\x27.container\x27) || document.body;\\n\\n    function getWidth() \x7b\\n      const rect \x3d target.getBoundingClientRect().width;\\n      return Math.min(rect || Infinity, window.innerWidth || Infinity, screen.width || Infinity);\\n    \x7d\\n\\n    if (typeof ResizeObserver !\x3d\x3d \x27undefined\x27) \x7b\\n      const ro \x3d new ResizeObserver(() \x3d\x3e applyLayoutClasses(getWidth()));\\n      ro.observe(target);\\n    \x7d\\n\\n    window.addEventListener(\x27resize\x27, () \x3d\x3e applyLayoutClasses(getWidth()));\\n    applyLayoutClasses(getWidth());\\n  \x7d\\n  \\n\\n  function showWelcomeScreen() \x7b\\n    const welcomeScreen  \x3d $(\x27welcomeScreen\x27);\\n    const formBodyWrap   \x3d $(\x27formBodyWrap\x27);\\n    const draftNote      \x3d $(\x27welcomeDraftNote\x27);\\n    const goBtn          \x3d $(\x27welcomeGoBtn\x27);\\n    const continueBtn    \x3d $(\x27welcomeContinueBtn\x27);\\n\\n    \\n    const draft \x3d loadDraft();\\n    if (draft \x26\x26 draft.details \x26\x26 (draft.details.fullName || draft.details.email)) \x7b\\n      draftNote.style.display \x3d \x27block\x27;\\n    \x7d\\n\\n    function dismissWelcome(restoreDraft) \x7b\\n      welcomeScreen.classList.add(\x27exiting\x27);\\n      setTimeout(() \x3d\x3e \x7b\\n        welcomeScreen.style.display \x3d \x27none\x27;\\n        formBodyWrap.classList.remove(\x27hidden\x27);\\n        formBodyWrap.classList.add(\x27form-body-wrap\x27);\\n        \\n        window.scrollTo(\x7b top: 0, behavior: \x27instant\x27 \x7d);\\n\\n        if (restoreDraft \x26\x26 draft) \x7b\\n          applyDraft(draft);\\n        \x7d\\n      \x7d, 340);\\n    \x7d\\n\\n    goBtn.addEventListener(\x27click\x27, () \x3d\x3e dismissWelcome(false));\\n    if (continueBtn) \x7b\\n      continueBtn.addEventListener(\x27click\x27, () \x3d\x3e dismissWelcome(true));\\n    \x7d\\n  \x7d\\n\\n  \\n  document.addEventListener(\x27click\x27, () \x3d\x3e \x7b\\n    document.querySelectorAll(\x27.match-info-btn.tip-open\x27).forEach(el \x3d\x3e el.classList.remove(\x27tip-open\x27));\\n  \x7d);\\n\\n  initForm();\\n\x3c\\\/script\x3e\\n\x3cscript\x3e\\n  \\n  function fixIframeHeight() \x7b\\n    document.documentElement.style.height \x3d \x27auto\x27;\\n    document.body.style.height \x3d \x27auto\x27;\\n    document.body.style.minHeight \x3d \x27unset\x27;\\n    const welcome \x3d document.getElementById(\x27welcomeScreen\x27);\\n    if (welcome) \x7b\\n      welcome.style.minHeight \x3d \x27unset\x27;\\n      welcome.style.height \x3d \x27auto\x27;\\n    \x7d\\n  \x7d\\n  fixIframeHeight();\\n  window.addEventListener(\x27load\x27, fixIframeHeight);\\n\x3c\\\/script\x3e\\n\x3c\\\/body\x3e\\n\x3c\\\/html\x3e\x22,\x22ncc\x22:\x22\x7b\\\x22awhs\\\x22:true\x7d\x22\x7d", "", undefined, true , false  , "false", "https:\/\/n-qddrd56zh7wnotrsr2rycgyhdzzfvtwwqlc6lha-0lu-script.googleusercontent.com", "https:\/\/drive.google.com\/abuse?id\x3dAKkXjowPqG8P1bKVVnRP6rJIOnUfSt_Xh-MH3y3eeDq_pg6VdG2iGPO8e_OTBtNY9CydtYGAb-zQ-f4ydQLrmlTPLzz6S_achVtzmQxq%3A0\x26docurl\x3dhttps%3A%2F%2Fscript.google.com%2Fmacros%2Fs%2FAKfycbzThbgrqjQytw8ak4PY3GcnxhF-JdnF1CcossbeB4_NaXbKKIPfryU1oOm5Y6r9HSw%2Fexec");}
el.src = 'https:\/\/n-qddrd56zh7wnotrsr2rycgyhdzzfvtwwqlc6lha-0lu-script.googleusercontent.com\/userCodeAppPanel';
}());
</script>
</body>
</html>
