{"id":25684,"date":"2026-06-04T13:22:17","date_gmt":"2026-06-04T11:22:17","guid":{"rendered":"https:\/\/onder.nl\/?page_id=25684"},"modified":"2026-06-10T22:15:37","modified_gmt":"2026-06-10T20:15:37","slug":"ai-wk-prediction-battle","status":"publish","type":"page","link":"https:\/\/onder.nl\/en\/ai-wk-voorspelling-battle\/","title":{"rendered":"The big AI World Cup Poule battle"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Vijf AI modellen kregen exact dezelfde opdracht: voorspel \u00e9lke wedstrijd van het WK 2026, van de groepsfase tot de finale. De modellen beslissen zelf welke factoren ze meenemen en hoe zwaar ze die wegen. Wij houden de score bij terwijl het toernooi vordert, wedstrijd voor wedstrijd.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Vijf AI&#8217;s, 360 voorspellingen, \u00e9\u00e9n winnaar. Moge de beste AI-nalist winnen.<\/p>\n\n\n\n<!-- WK 2026 - AI Voorspelpoule (onder.nl) - plak-klaar in een Aangepaste HTML-blok -->\n<link rel=\"preconnect\" href=\"https:\/\/fonts.googleapis.com\">\n<link rel=\"preconnect\" href=\"https:\/\/fonts.gstatic.com\" crossorigin=\"\">\n<link href=\"https:\/\/fonts.googleapis.com\/css2?family=Poppins:wght@500;600;700;800&amp;family=Mulish:wght@400;500;600;700;800&amp;family=Rajdhani:wght@500;600;700&amp;display=swap\" rel=\"stylesheet\">\n<style>\n.wk2026 {\n  \/* \u2500\u2500 onder palette \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\n  --rs-bg-base:       #FAF6F1;   \/* warm cream page *\/\n  --rs-bg-card:       #FFFFFF;   \/* white cards *\/\n  --rs-bg-muted:      #F2ECE3;\n  --rs-bg-secondary:  #F1EAE1;   \/* chips \/ secondary surface *\/\n  --rs-bg-sidebar:    #FFFFFF;\n\n  --rs-border:        #E9E0D5;\n  --rs-border-muted:  #F0E8DE;\n\n  --rs-red:           #EA5520;   \/* brand orange *\/\n  --rs-red-dim:       rgba(234,85,32,0.12);\n  --rs-red-deep:      #C9430F;\n  --rs-red-fg:        #FFFFFF;\n\n  --rs-green:         #1E9E6A;   \/* wins *\/\n  --rs-green-dim:     rgba(30,158,106,0.12);\n  --rs-green-fg:      #FFFFFF;\n\n  --rs-yellow:        #E0A02C;   \/* gold \/ 3rd place *\/\n  --rs-blue:          #17818F;   \/* petrol \/ teal accent *\/\n\n  --rs-fg:            #211C18;   \/* near-black warm *\/\n  --rs-fg-muted:      #7C746B;   \/* subdued *\/\n  --rs-fg-60:         #6A625A;\n  --rs-fg-50:         #8C8279;\n\n  --rs-gradient-hero:\n    radial-gradient(1100px 700px at 88% 18%, #FBEAE3 0%, rgba(251,234,227,0) 55%),\n    linear-gradient(180deg, #FCF8F3 0%, #FAF6F1 100%);\n  --rs-gradient-card: linear-gradient(160deg, #FFFFFF 0%, #FDFBF8 100%);\n  --rs-gradient-cta:  linear-gradient(135deg, #EE6027 0%, #EA5520 100%);\n  --rs-gradient-cta-green: linear-gradient(135deg, #20A36F 0%, #1E9E6A 100%);\n\n  --rs-glow-red:    0 8px 26px rgba(234,85,32,0.18);\n  --rs-glow-green:  0 8px 22px rgba(30,158,106,0.16);\n  --rs-shadow-card: 0 12px 34px rgba(33,28,24,0.09);\n\n  --rs-font-heading: 'Poppins', sans-serif;\n  --rs-font-body:    'Mulish', system-ui, sans-serif;\n  --rs-font-mono:    ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas,\n                     'Liberation Mono', 'Courier New', monospace;\n\n  --rs-ease:              cubic-bezier(0.4, 0, 0.2, 1);\n  --rs-transition-fast:   150ms var(--rs-ease);\n  --rs-transition:        200ms var(--rs-ease);\n  --rs-transition-slow:   300ms var(--rs-ease);\n\n  \/* accent (oranje merk standaard) \u2014 instelbaar via WK_CONFIG.accent *\/\n  --accent: #EA5520;\n  --accent-glow: 16 83% 52%;\n  --maxw: 1200px;\n  --rowpad: 14px;\n\n  \/* base body-equivalent (gescoped op de wrapper) *\/\n  background: var(--rs-bg-base);\n  color: var(--rs-fg);\n  font-family: var(--rs-font-body);\n  font-size: 16px;\n  line-height: 1.6;\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale;\n}\n\n\/* resets binnen de scope (vervangen de globale rs-tokens-resets) *\/\n.wk2026 *, .wk2026 *::before, .wk2026 *::after { box-sizing: border-box; }\n.wk2026 :where(h1, h2, h3, h4, h5, h6) {\n  margin: 0; font-family: var(--rs-font-heading); font-weight: 700;\n  line-height: 1.1; color: var(--rs-fg); letter-spacing: -0.01em;\n}\n.wk2026 :where(p) { margin: 1em 0; }\n.wk2026 :where(table) { border-collapse: collapse; }\n.wk2026 ::selection { background: rgba(234,85,32,0.18); }\n\n.wk2026 .wk-app { max-width: var(--maxw); margin: 0 auto; padding: 0 28px; }\n\n\/* ---------- masthead (onder site nav) ---------- *\/\n.wk2026 .mast {\n  position: sticky; top: 0; z-index: 50;\n  background: rgba(252,248,243,0.92);\n  backdrop-filter: blur(14px);\n  border-bottom: 1px solid var(--rs-border);\n}\n.wk2026.embed .mast { display: none; }\n.wk2026 .mast-row { max-width: var(--maxw); margin: 0 auto; padding: 0 28px;\n  height: 74px; display: flex; align-items: center; gap: 26px; }\n.wk2026 .brand { display: flex; align-items: center; gap: 3px; text-decoration: none; }\n.wk2026 .brand .ring { width: 32px; height: 32px; flex: none; }\n.wk2026 .brand .wordmark { font-family: var(--rs-font-heading); font-weight: 800; font-size: 28px;\n  letter-spacing: -0.01em; color: var(--rs-red); line-height: 1; }\n.wk2026 .mast-nav { margin-left: auto; display: flex; align-items: center; gap: 2px; }\n.wk2026 .mast-nav a { display: inline-flex; align-items: center; gap: 5px; font-family: var(--rs-font-heading);\n  font-size: 14.5px; font-weight: 600; color: var(--rs-fg); text-decoration: none;\n  padding: 8px 12px; border-radius: 9px; transition: var(--rs-transition-fast); white-space: nowrap; }\n.wk2026 .mast-nav a:hover { color: var(--rs-red); }\n.wk2026 .mast-nav a svg { opacity: 0.55; }\n.wk2026 .mast-cta { font-family: var(--rs-font-heading); font-weight: 700; font-size: 14.5px; color: #fff;\n  background: var(--rs-blue); border: none; padding: 11px 22px; border-radius: 11px; cursor: pointer;\n  text-decoration: none; transition: var(--rs-transition); white-space: nowrap; }\n.wk2026 .mast-cta:hover { filter: brightness(1.06); }\n.wk2026 .live-pill { display: inline-flex; align-items: center; gap: 7px; font-size: 11px; font-weight: 800;\n  letter-spacing: 0.07em; text-transform: uppercase; color: var(--rs-red);\n  background: rgba(234,85,32,0.10); border: 1px solid rgba(234,85,32,0.28);\n  padding: 5px 11px; border-radius: 999px; }\n.wk2026 .live-dot { width: 7px; height: 7px; border-radius: 50%; background: var(--rs-red);\n  animation: wk-blink 1.6s ease-in-out infinite; }\n@keyframes wk-blink { 0%,100%{opacity:1} 50%{opacity:.25} }\n\n\/* ---------- hero ---------- *\/\n.wk2026 .hero { position: relative; overflow: hidden; border-bottom: 1px solid var(--rs-border);\n  background: var(--rs-gradient-hero); }\n.wk2026 .hero-in { max-width: var(--maxw); margin: 0 auto; padding: 70px 28px 56px;\n  position: relative; z-index: 1; display: grid; grid-template-columns: 1.15fr 0.95fr; gap: 52px; align-items: center; }\n.wk2026 .eyebrow { display: inline-flex; align-items: center; gap: 9px;\n  font-family: var(--rs-font-heading); font-weight: 700; font-size: 13px;\n  text-transform: uppercase; letter-spacing: 0.12em; color: var(--rs-red); margin-bottom: 20px; }\n.wk2026 .eyebrow .bar { width: 26px; height: 3px; border-radius: 2px; background: var(--rs-red); }\n.wk2026 .hero h1 { font-family: var(--rs-font-heading); font-weight: 800;\n  font-size: clamp(2.7rem, 5.2vw, 4.2rem); line-height: 1.02; margin-bottom: 20px; color: var(--rs-red);\n  letter-spacing: -0.02em; }\n.wk2026 .hero h1 .em { color: var(--rs-fg); }\n.wk2026 .hero p.lead { color: #5C554E; font-size: 18px; max-width: 48ch; line-height: 1.62; font-weight: 500; }\n.wk2026 .hero-stats { display: flex; gap: 34px; margin-top: 30px; }\n.wk2026 .hstat .n { font-family: var(--rs-font-heading); font-weight: 800; font-size: 34px; line-height: 1; color: var(--rs-fg); }\n.wk2026 .hstat .l { font-size: 12.5px; color: var(--rs-fg-muted); text-transform: uppercase; letter-spacing: 0.07em; margin-top: 8px; font-weight: 600; }\n\n\/* hero leader card *\/\n.wk2026 .leadcard { background: #fff; border: 1px solid var(--rs-border);\n  border-radius: 20px; padding: 22px; box-shadow: var(--rs-shadow-card); position: relative; }\n.wk2026 .leadcard h4 { font-family: var(--rs-font-heading); font-size: 13px; font-weight: 700; text-transform: uppercase;\n  letter-spacing: 0.08em; color: var(--rs-fg-muted);\n  display: flex; align-items: center; justify-content: space-between; margin-bottom: 16px; }\n.wk2026 .mini-row { display: grid; grid-template-columns: 18px 30px 1fr auto; align-items: center; gap: 11px;\n  padding: 10px 0; border-top: 1px solid var(--rs-border-muted); }\n.wk2026 .mini-row:first-of-type { border-top: none; }\n.wk2026 .mini-rank { font-family: var(--rs-font-heading); font-weight: 800; color: var(--rs-fg-muted); font-size: 14px; }\n.wk2026 .mini-row .nm { font-weight: 700; font-size: 14.5px; }\n.wk2026 .mini-row .pts { font-family: var(--rs-font-heading); font-weight: 800; font-size: 17px; }\n.wk2026 .bar-track { grid-column: 3 \/ 5; height: 5px; border-radius: 3px; background: var(--rs-bg-secondary); overflow: hidden; margin-top: -1px; }\n.wk2026 .bar-fill { height: 100%; border-radius: 3px; }\n.wk2026 .countdown-row { margin-top: 16px; padding-top: 14px; border-top: 1px solid var(--rs-border);\n  display: flex; align-items: center; justify-content: space-between; }\n.wk2026 .countdown-row .lbl { font-size: 12px; text-transform: uppercase; letter-spacing: 0.08em; color: var(--rs-fg-muted); }\n.wk2026 .countdown-row .val { font-family: var(--rs-font-mono); font-size: 15px; color: var(--rs-fg); font-variant-numeric: tabular-nums; }\n\n\/* ---------- AI avatar badge ---------- *\/\n.wk2026 .ai-badge { display: inline-flex; align-items: center; justify-content: center; border-radius: 10px; flex: none; }\n.wk2026 .ai-badge svg { display: block; }\n.wk2026 .ai-chip { display: inline-flex; align-items: center; gap: 10px; }\n.wk2026 .ai-chip .nm { font-weight: 700; white-space: nowrap; }\n.wk2026 .ai-chip .mk { color: var(--rs-fg-muted); font-size: 12px; }\n\n\/* ---------- tabs ---------- *\/\n.wk2026 .tabs-wrap { position: sticky; top: 74px; z-index: 40;\n  background: rgba(252,248,243,0.94); backdrop-filter: blur(14px);\n  border-bottom: 1px solid var(--rs-border); }\n.wk2026.embed .tabs-wrap { top: 0; }\n.wk2026 .tabs { max-width: var(--maxw); margin: 0 auto; padding: 0 28px; display: flex; gap: 6px; overflow-x: auto; }\n.wk2026 .tab { appearance: none; background: none; border: none; cursor: pointer;\n  font-family: var(--rs-font-heading); font-weight: 700; font-size: 15.5px; letter-spacing: 0;\n  color: var(--rs-fg-muted); padding: 18px 16px 15px; position: relative; white-space: nowrap;\n  transition: color var(--rs-transition-fast); }\n.wk2026 .tab:hover { color: var(--rs-fg); }\n.wk2026 .tab.active { color: var(--rs-red); }\n.wk2026 .tab.active::after { content: \"\"; position: absolute; left: 12px; right: 12px; bottom: -1px; height: 3px;\n  background: var(--accent); border-radius: 3px 3px 0 0; }\n\n\/* ---------- section scaffolding ---------- *\/\n.wk2026 .sec { padding: 48px 0 16px; }\n.wk2026 .sec-head { margin-bottom: 26px; }\n.wk2026 .sec-head .kick { font-family: var(--rs-font-heading); font-weight: 700; font-size: 12.5px;\n  text-transform: uppercase; letter-spacing: 0.12em; color: var(--rs-red); margin-bottom: 10px; }\n.wk2026 .sec-head h2 { font-family: var(--rs-font-heading); font-weight: 800; font-size: clamp(1.8rem, 2.8vw, 2.5rem); }\n.wk2026 .sec-head p { color: var(--rs-fg-muted); margin-top: 10px; max-width: 64ch; font-size: 15.5px; line-height: 1.6; }\n.wk2026 .subhead { font-family: var(--rs-font-heading); font-weight: 700; font-size: 16px; color: var(--rs-fg);\n  margin: 40px 0 16px; display: flex; align-items: center; gap: 12px; white-space: nowrap; }\n.wk2026 .subhead .ln { flex: 1 1 auto; min-width: 24px; height: 1px; background: var(--rs-border); }\n\n\/* ---------- card ---------- *\/\n.wk2026 .card { background: #fff; border: 1px solid var(--rs-border); border-radius: 18px; }\n.wk2026 .card-pad { padding: 22px; }\n\n\/* ---------- leaderboard table ---------- *\/\n.wk2026 .lb { width: 100%; border-collapse: collapse; }\n.wk2026 .lb thead th { font-family: var(--rs-font-heading); font-weight: 700; font-size: 11.5px;\n  text-transform: uppercase; letter-spacing: 0.05em; color: var(--rs-fg-muted);\n  padding: 15px var(--rowpad); text-align: center; border-bottom: 1px solid var(--rs-border); }\n.wk2026 .lb thead th.l { text-align: left; }\n.wk2026 .lb tbody td { padding: var(--rowpad); border-bottom: 1px solid var(--rs-border-muted); text-align: center; vertical-align: middle; }\n.wk2026 .lb tbody tr:last-child td { border-bottom: none; }\n.wk2026 .lb tbody tr { transition: background var(--rs-transition-fast); }\n.wk2026 .lb tbody tr:hover { background: #FBF6F0; }\n.wk2026 .lb .rkcell { font-family: var(--rs-font-heading); font-weight: 800; font-size: 18px; width: 46px; }\n.wk2026 .lb .leader { background: rgba(234,85,32,0.05); }\n.wk2026 .lb .leader .rkcell { color: var(--rs-red); }\n.wk2026 .lb td.l { text-align: left; }\n.wk2026 .lb .ptsbig { font-family: var(--rs-font-heading); font-weight: 800; font-size: 23px; }\n.wk2026 .lb .muted { color: var(--rs-fg-muted); }\n.wk2026 .medal { font-size: 16px; }\n.wk2026 .accbar { width: 92px; height: 7px; border-radius: 4px; background: var(--rs-bg-secondary);\n  overflow: hidden; display: inline-block; vertical-align: middle; margin-left: 8px; }\n.wk2026 .accbar i { display: block; height: 100%; border-radius: 4px; }\n\n\/* trend chart *\/\n.wk2026 .chart-card { padding: 24px 26px 16px; }\n.wk2026 .legend { display: flex; flex-wrap: wrap; gap: 16px; margin-top: 14px; }\n.wk2026 .legend span { display: inline-flex; align-items: center; gap: 8px; font-size: 13px; color: var(--rs-fg-muted); font-weight: 600; }\n.wk2026 .legend i { width: 13px; height: 3px; border-radius: 2px; display: inline-block; }\n\n\/* persona cards *\/\n.wk2026 .persona-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(230px, 1fr)); gap: 16px; }\n.wk2026 .persona { padding: 20px; border-radius: 16px; border: 1px solid var(--rs-border);\n  background: #fff; position: relative; overflow: hidden; transition: var(--rs-transition-slow); box-shadow: 0 4px 16px rgba(33,28,24,0.04); }\n.wk2026 .persona:hover { transform: translateY(-3px); box-shadow: var(--rs-shadow-card); }\n.wk2026 .persona .top { display: flex; align-items: center; gap: 12px; margin-bottom: 13px; }\n.wk2026 .persona .style { font-family: var(--rs-font-heading); font-size: 11px; font-weight: 700; text-transform: uppercase;\n  letter-spacing: 0.04em; padding: 4px 10px; border-radius: 999px; margin-left: auto; }\n.wk2026 .persona p { font-size: 13.5px; color: var(--rs-fg-muted); line-height: 1.55; font-weight: 500; margin: 0; }\n.wk2026 .persona .edge { position: absolute; left: 0; top: 0; bottom: 0; width: 4px; }\n\n\/* ---------- matches ---------- *\/\n.wk2026 .filters { display: flex; flex-wrap: wrap; gap: 8px; align-items: center; margin-bottom: 22px; }\n.wk2026 .chip { appearance: none; cursor: pointer; font-family: var(--rs-font-heading); font-weight: 700;\n  font-size: 13.5px; color: var(--rs-fg-60); background: #fff;\n  border: 1px solid var(--rs-border); padding: 8px 15px; border-radius: 999px; transition: var(--rs-transition-fast); }\n.wk2026 .chip:hover { color: var(--rs-red); border-color: rgba(234,85,32,0.4); }\n.wk2026 .chip.on { color: #fff; background: var(--accent); border-color: var(--accent); }\n.wk2026 .fl-label { font-family: var(--rs-font-heading); font-size: 12px; font-weight: 700; text-transform: uppercase; letter-spacing: 0.06em; color: var(--rs-fg-muted); margin-right: 6px; }\n\n.wk2026 .match { background: #fff; border: 1px solid var(--rs-border); border-radius: 16px;\n  padding: 18px 20px; margin-bottom: 14px; transition: var(--rs-transition-slow); box-shadow: 0 4px 16px rgba(33,28,24,0.04); }\n.wk2026 .match:hover { border-color: rgba(234,85,32,0.35); box-shadow: 0 10px 26px rgba(33,28,24,0.07); }\n.wk2026 .match-top { display: flex; align-items: center; justify-content: space-between; margin-bottom: 16px; }\n.wk2026 .match-meta { font-size: 12.5px; color: var(--rs-fg-muted); display: flex; gap: 12px; align-items: center; font-weight: 600; }\n.wk2026 .match-meta .gp { font-family: var(--rs-font-heading); font-weight: 700; color: var(--rs-fg); }\n.wk2026 .badge-played { font-family: var(--rs-font-heading); font-size: 10.5px; font-weight: 700; text-transform: uppercase; letter-spacing: 0.05em;\n  padding: 4px 9px; border-radius: 6px; }\n.wk2026 .badge-played.done { background: var(--rs-green-dim); color: #15875A; }\n.wk2026 .badge-played.soon { background: var(--rs-bg-secondary); color: var(--rs-fg-muted); }\n\n.wk2026 .fixture { display: grid; grid-template-columns: 1fr auto 1fr; align-items: center; gap: 16px; margin-bottom: 16px; }\n.wk2026 .fx-team { display: flex; align-items: center; gap: 11px; font-weight: 700; font-size: 16.5px; }\n.wk2026 .fx-team.away { justify-content: flex-end; text-align: right; }\n.wk2026 .fx-flag { font-size: 25px; line-height: 1; }\n.wk2026 .fx-score { font-family: var(--rs-font-heading); font-weight: 800; font-size: 30px;\n  min-width: 80px; text-align: center; color: var(--rs-fg); }\n.wk2026 .fx-score .vs { font-size: 15px; color: var(--rs-fg-muted); font-weight: 600; }\n.wk2026 .fx-score.soon { color: var(--rs-fg-muted); }\n\n.wk2026 .preds { display: grid; grid-template-columns: repeat(5, 1fr); gap: 9px; border-top: 1px solid var(--rs-border-muted); padding-top: 16px; }\n.wk2026 .pred { text-align: center; border-radius: 12px; padding: 10px 6px; background: #FBF7F2;\n  border: 1px solid var(--rs-border); position: relative; }\n.wk2026 .pred .who { display: flex; align-items: center; justify-content: center; gap: 6px; margin-bottom: 7px; }\n.wk2026 .pred .who span { font-size: 11px; font-weight: 700; color: var(--rs-fg-muted); }\n.wk2026 .pred .sc { font-family: var(--rs-font-heading); font-weight: 800; font-size: 18px; }\n.wk2026 .pred .pt { font-family: var(--rs-font-heading); font-size: 10px; font-weight: 700; margin-top: 4px; height: 14px; }\n.wk2026 .pred.hit { box-shadow: inset 0 0 0 2px rgba(30,158,106,0.45); background: rgba(30,158,106,0.06); }\n.wk2026 .pred .pt.s4 { color: #15875A; }\n.wk2026 .pred .pt.s2 { color: #C98417; }\n.wk2026 .pred .pt.s1 { color: var(--rs-fg-muted); }\n.wk2026 .pred .pt.s0 { color: #C9462C; }\n\n\/* disagreement \/ bold cards *\/\n.wk2026 .split-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(290px, 1fr)); gap: 16px; }\n.wk2026 .diomatch { background: #fff; border: 1px solid var(--rs-border); border-radius: 16px; padding: 18px; box-shadow: 0 4px 16px rgba(33,28,24,0.04); }\n.wk2026 .diomatch .fx { display: grid; grid-template-columns: 1fr auto 1fr; align-items: center; gap: 12px;\n  font-weight: 700; font-size: 14px; margin-bottom: 14px; }\n.wk2026 .diomatch .fx > :first-child { text-align: right; }\n.wk2026 .diomatch .fx > :last-child { text-align: left; }\n.wk2026 .diomatch .fx .tname { display: inline-flex; align-items: center; gap: 7px; white-space: nowrap; overflow: hidden; }\n.wk2026 .diomatch .fx .tname .fl { font-size: 19px; }\n.wk2026 .diomatch .vote { display: flex; flex-direction: column; gap: 8px; }\n.wk2026 .voterow { display: grid; grid-template-columns: 1fr auto; align-items: center; gap: 8px; font-size: 13px; }\n.wk2026 .voterow .pick { font-family: var(--rs-font-heading); font-weight: 700; font-size: 12.5px; padding: 3px 9px; border-radius: 6px; }\n\n\/* ---------- groups ---------- *\/\n.wk2026 .groups-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(340px, 1fr)); gap: 18px; }\n.wk2026 .gcard { background: #fff; border: 1px solid var(--rs-border); border-radius: 16px; overflow: hidden; box-shadow: 0 4px 16px rgba(33,28,24,0.04); }\n.wk2026 .gcard .gh { display: flex; align-items: center; justify-content: space-between; padding: 15px 18px; border-bottom: 1px solid var(--rs-border); background: #FCFAF7; }\n.wk2026 .gcard .gh .gl { font-family: var(--rs-font-heading); font-weight: 800; font-size: 16px; }\n.wk2026 .gcard .gh .gl b { color: var(--rs-red); }\n.wk2026 .gtab { width: 100%; border-collapse: collapse; font-size: 13.5px; }\n.wk2026 .gtab th { font-size: 10.5px; text-transform: uppercase; letter-spacing: 0.04em; color: var(--rs-fg-muted);\n  font-family: var(--rs-font-heading); font-weight: 700; padding: 9px 6px; text-align: center; white-space: nowrap; }\n.wk2026 .gtab th.l { text-align: left; padding-left: 18px; }\n.wk2026 .gtab td { padding: 10px 6px; text-align: center; vertical-align: middle; white-space: nowrap; }\n.wk2026 .gtab td.l { text-align: left; padding-left: 18px; white-space: normal; }\n.wk2026 .gtab .tm { white-space: nowrap; }\n.wk2026 .gtab .tm .nm { overflow-wrap: normal; word-break: keep-all; }\n.wk2026 .gtab tbody tr { border-top: 1px solid var(--rs-border-muted); }\n.wk2026 .gtab tbody td.l { position: relative; }\n.wk2026 .gtab .pos { width: 26px; font-family: var(--rs-font-heading); font-weight: 800; color: var(--rs-fg-muted); }\n.wk2026 .gtab .tm { display: flex; align-items: center; gap: 10px; font-weight: 700; }\n.wk2026 .gtab .tm .fl { font-size: 19px; }\n.wk2026 .gtab tr.q1 .pos, .wk2026 .gtab tr.q2 .pos { color: #15875A; }\n.wk2026 .gtab tr.q1 td.l::before, .wk2026 .gtab tr.q2 td.l::before { content: \"\"; position: absolute; left: 0; top: 0; bottom: 0; width: 4px; background: var(--rs-green); }\n.wk2026 .gtab tr.q3 td.l::before { content: \"\"; position: absolute; left: 0; top: 0; bottom: 0; width: 4px; background: var(--rs-yellow); opacity: 0.6; }\n.wk2026 .gtab .ptcol { font-family: var(--rs-font-heading); font-weight: 800; font-size: 15px; }\n.wk2026 .glegend { display: flex; flex-wrap: wrap; align-items: center; }\n.wk2026 .glegend span { display: inline-flex; align-items: center; gap: 8px; font-size: 13px; color: var(--rs-fg-muted); font-weight: 600; }\n.wk2026 .glegend i { width: 13px; height: 13px; border-radius: 4px; display: inline-block; }\n.wk2026 .gpick { padding: 13px 18px; border-top: 1px solid var(--rs-border-muted); font-size: 12.5px; color: var(--rs-fg-muted); display: flex; align-items: center; gap: 9px; font-weight: 500; background: #FCFAF7; }\n.wk2026 .gpick b { color: var(--rs-fg); font-weight: 700; }\n\n\/* ---------- eindstand ---------- *\/\n.wk2026 .podium { display: grid; grid-template-columns: repeat(3, 1fr); gap: 16px; align-items: end; margin-bottom: 16px; }\n.wk2026 .pod { border-radius: 16px; border: 1px solid var(--rs-border); background: #fff;\n  text-align: center; padding: 24px 16px; position: relative; box-shadow: 0 4px 16px rgba(33,28,24,0.05); }\n.wk2026 .pod .place { font-family: var(--rs-font-heading); font-weight: 700; font-size: 13px; letter-spacing: 0.06em; text-transform: uppercase; color: var(--rs-fg-muted); }\n.wk2026 .pod .fl { font-size: 48px; line-height: 1; margin: 14px 0 10px; }\n.wk2026 .pod .tm { font-family: var(--rs-font-heading); font-weight: 800; font-size: 21px; }\n.wk2026 .pod .vt { font-size: 12.5px; color: var(--rs-fg-muted); margin-top: 7px; font-weight: 500; }\n.wk2026 .pod.p1 { background: linear-gradient(165deg, #FFF6E6 0%, #FFFFFF 62%); border-color: #F1D9A0; transform: translateY(-14px); box-shadow: 0 16px 38px rgba(224,160,44,0.18); }\n.wk2026 .pod.p1 .place { color: #C98417; }\n.wk2026 .pod.p1 .crown { font-size: 24px; margin-bottom: 4px; }\n\n.wk2026 .bracket-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(290px, 1fr)); gap: 16px; }\n.wk2026 .bcard { background: #fff; border: 1px solid var(--rs-border); border-radius: 16px; padding: 20px; position: relative; overflow: hidden; box-shadow: 0 4px 16px rgba(33,28,24,0.04); }\n.wk2026 .bcard .edge { position: absolute; left: 0; top: 0; bottom: 0; width: 4px; }\n.wk2026 .bcard .bh { display: flex; align-items: center; gap: 11px; margin-bottom: 15px; }\n.wk2026 .brow { display: flex; align-items: center; justify-content: space-between; padding: 9px 0; border-top: 1px solid var(--rs-border-muted); font-size: 14px; }\n.wk2026 .brow:first-of-type { border-top: none; }\n.wk2026 .brow .lab { color: var(--rs-fg-muted); font-size: 12px; text-transform: uppercase; letter-spacing: 0.04em; font-weight: 600; }\n.wk2026 .brow .val { font-weight: 700; display: flex; align-items: center; gap: 7px; }\n.wk2026 .bquote { margin-top: 15px; padding-top: 15px; border-top: 1px solid var(--rs-border-muted);\n  font-size: 13px; line-height: 1.55; color: var(--rs-fg-muted); font-style: italic; }\n.wk2026 .champ-tag { font-family: var(--rs-font-heading); font-weight: 800; font-size: 18px; }\n\n\/* ---------- topscorers ---------- *\/\n.wk2026 .ts-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); gap: 16px; }\n.wk2026 .ts-card { position: relative; overflow: hidden; background: #fff; border: 1px solid var(--rs-border); border-radius: 16px; padding: 18px 18px 14px; box-shadow: 0 4px 16px rgba(33,28,24,0.04); }\n.wk2026 .ts-card .edge { position: absolute; left: 0; top: 0; bottom: 0; width: 4px; }\n.wk2026 .ts-card .bh { display: flex; align-items: center; gap: 11px; margin-bottom: 12px; }\n.wk2026 .ts-list { display: flex; flex-direction: column; }\n.wk2026 .ts-row { display: grid; grid-template-columns: 18px 22px 1fr auto; align-items: center; gap: 9px; padding: 7px 0; border-top: 1px solid var(--rs-border-muted); font-size: 13.5px; }\n.wk2026 .ts-row:first-child { border-top: none; }\n.wk2026 .ts-rank { font-family: var(--rs-font-heading); font-weight: 800; color: var(--rs-fg-muted); font-size: 13px; }\n.wk2026 .ts-fl { font-size: 17px; line-height: 1; }\n.wk2026 .ts-nm { font-weight: 600; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }\n.wk2026 .ts-g { font-family: var(--rs-font-heading); font-weight: 800; font-size: 14px; }\n\n\/* ---------- knockout ---------- *\/\n.wk2026 .ko-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); gap: 12px; }\n.wk2026 .komatch { display: grid; grid-template-columns: 1fr auto 1fr; align-items: center; gap: 12px;\n  background: #fff; border: 1px solid var(--rs-border); border-radius: 12px; padding: 12px 16px;\n  box-shadow: 0 4px 16px rgba(33,28,24,0.04); font-size: 14px; }\n.wk2026 .komatch .tname { display: inline-flex; align-items: center; gap: 8px; font-weight: 700; white-space: nowrap; overflow: hidden; }\n.wk2026 .komatch .tname:first-child { justify-content: flex-end; text-align: right; }\n.wk2026 .komatch .tname .fl { font-size: 19px; line-height: 1; flex: none; }\n.wk2026 .koscore { font-family: var(--rs-font-heading); font-weight: 800; font-size: 17px; color: var(--rs-fg); white-space: nowrap; text-align: center; }\n.wk2026 .koscore .kopen { font-family: var(--rs-font-body); font-weight: 600; font-size: 11px; color: var(--rs-fg-muted); }\n\n\/* ---------- live tab ---------- *\/\n.wk2026 .fx-team .live-logo { width: 26px; height: 26px; object-fit: contain; flex: none; }\n.wk2026 .lts-row { display: grid; grid-template-columns: 26px 28px 1fr auto; align-items: center; gap: 11px; padding: 11px 16px; border-top: 1px solid var(--rs-border-muted); font-size: 14.5px; }\n.wk2026 .lts-row:first-child { border-top: none; }\n.wk2026 .lts-rank { font-family: var(--rs-font-heading); font-weight: 800; color: var(--rs-fg-muted); font-size: 13px; }\n.wk2026 .lts-img { width: 24px; height: 24px; object-fit: contain; }\n.wk2026 .lts-nm { font-weight: 700; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }\n.wk2026 .lts-team { color: var(--rs-fg-muted); font-weight: 600; font-size: 12.5px; margin-left: 8px; }\n.wk2026 .lts-goals { font-family: var(--rs-font-heading); font-weight: 800; color: var(--rs-green); }\n\n\/* ---------- footer ---------- *\/\n.wk2026 .wk-footer { border-top: 1px solid var(--rs-border); margin-top: 56px; padding: 34px 0 56px; background: #FCFAF7; }\n.wk2026.embed .wk-footer { display: none; }\n.wk2026 .disc { font-size: 12.5px; color: var(--rs-fg-muted); line-height: 1.65; max-width: 72ch; font-weight: 500; }\n.wk2026 .disc b { color: var(--rs-fg); }\n\n\/* density (op de wrapper i.p.v. body) *\/\n.wk2026[data-density=\"compact\"] { --rowpad: 9px; }\n.wk2026[data-density=\"ruim\"] { --rowpad: 18px; }\n\n\/* responsive *\/\n@media (max-width: 900px) {\n  .wk2026 .hero-in { grid-template-columns: 1fr; gap: 32px; }\n  .wk2026 .mast-nav { display: none; }\n}\n@media (max-width: 560px) {\n  .wk2026 .wk-app, .wk2026 .hero-in, .wk2026 .mast-row, .wk2026 .tabs { padding-left: 16px; padding-right: 16px; }\n  .wk2026 .preds { grid-template-columns: repeat(3, 1fr); }\n  .wk2026 .hero-stats { flex-wrap: wrap; gap: 22px; }\n  .wk2026 .fx-team { font-size: 14px; }\n  .wk2026 .lb .hide-sm { display: none; }\n}\n\n\/* reduced motion *\/\n@media (prefers-reduced-motion: reduce) {\n  .wk2026 .live-dot { animation: none; }\n  .wk2026 .persona { transition: none; }\n  .wk2026 .persona:hover { transform: none; }\n}\n\n<\/style>\n<div id=\"wk-voorspelpoule-root\"><\/div>\n<script>\nwindow.WK_CONFIG = { target: '#wk-voorspelpoule-root', chrome: 'embed', accent: 'oranje', density: 'normaal', headFont: 'Poppins', aiColors: true, resultsProxy: 'https:\/\/script.google.com\/macros\/s\/AKfycbz57_XZkK9SnPJjcZ4DmbXg7FjB15xwgMdm1-MvmFr8X9ex16lOSg4r-n8zGomDW7IW\/exec', resultsRefreshMs: 120000 };\n<\/script>\n<script>\n\/* =================================================================\n   WK 2026 \u00b7 AI Voorspelpoule \u2014 onder.nl\n   Productie-bundle: zelfstandige vanilla JS, GEEN afhankelijkheden.\n   (geen React, geen Babel, geen CDN-runtime \u2014 embed direct in WP)\n\n   Mount:\n     - Zet ergens op de pagina: <div id=\"wk-voorspelpoule-root\"><\/div>\n     - Laad deze .js + de .css. De feature mount automatisch.\n\n   Configuratie (optioneel, v\u00f3\u00f3r dit script):\n     <script>window.WK_CONFIG = {\n        target:  '#wk-voorspelpoule-root', \/\/ CSS-selector of element\n        chrome:  'full',   \/\/ 'full' = eigen masthead+footer (losse pagina)\n                           \/\/ 'embed' = zonder masthead\/footer (binnen onder.nl)\n        accent:  'oranje', \/\/ oranje | petrol | framboos | blauw | groen\n        density: 'normaal',\/\/ compact | normaal | ruim\n        headFont:'Poppins',\/\/ Poppins | Mulish | Rajdhani\n        aiColors: true     \/\/ merkkleuren per AI aan\/uit\n     };<\\\/script>\n\n   De datalaag is een deterministische simulatie (zie WK hieronder),\n   identiek aan het ontwerp-prototype. Vervang in productie door echte\n   loting\/fixtures\/uitslagen + de echte voorspellingen per model;\n   de scoring\/standen-logica is herbruikbaar als specificatie.\n   ================================================================= *\/\n(function () {\n  'use strict';\n\n  \/* ===============================================================\n     1. DATALAAG  (deterministisch, geseed \u2014 intern consistent)\n     =============================================================== *\/\n  var WK = (function () {\n    \/* ===== AI-modellen ===== *\/\n    var AIS = [{\"id\": \"chatgpt\", \"name\": \"ChatGPT\", \"maker\": \"OpenAI\", \"color\": \"#10a37f\", \"glow\": \"16,163,127\", \"glyph\": \"node\", \"tagline\": \"De consensus-machine. Speelt op safe, gokt zelden tegen de favoriet.\", \"style\": \"Voorzichtig\"}, {\"id\": \"claude\", \"name\": \"Claude\", \"maker\": \"Anthropic\", \"color\": \"#d97757\", \"glow\": \"217,119,87\", \"glyph\": \"burst\", \"tagline\": \"Beredeneert elke wedstrijd. Houdt van lage uitslagen en verrassende gelijke spelen.\", \"style\": \"Analytisch\"}, {\"id\": \"gemini\", \"name\": \"Gemini\", \"maker\": \"Google\", \"color\": \"#5b8def\", \"glow\": \"91,141,239\", \"glyph\": \"spark\", \"tagline\": \"Ziet doelpunten overal. Voorspelt de hoogste uitslagen van het stel.\", \"style\": \"Aanvallend\"}, {\"id\": \"copilot\", \"name\": \"Copilot\", \"maker\": \"Microsoft\", \"color\": \"#2aa9e0\", \"glow\": \"42,169,224\", \"glyph\": \"loop\", \"tagline\": \"Het gelijkspel-orakel. Durft de underdog een punt te gunnen.\", \"style\": \"Behoudend\"}, {\"id\": \"perplexity\", \"name\": \"Perplexity\", \"maker\": \"Perplexity AI\", \"color\": \"#20b8c4\", \"glow\": \"32,184,196\", \"glyph\": \"ring\", \"tagline\": \"Citeert vorm, blessures en weer. Soms briljant, soms te slim.\", \"style\": \"Datagedreven\"}];\n\n    \/* ===== 48 teams in 12 groepen (echte loting WK 2026) ===== *\/\n    var TEAMS = [{\"code\": \"Mexico\", \"name\": \"Mexico\", \"flag\": \"\ud83c\uddf2\ud83c\uddfd\", \"group\": \"A\"}, {\"code\": \"Zuid-Afrika\", \"name\": \"Zuid-Afrika\", \"flag\": \"\ud83c\uddff\ud83c\udde6\", \"group\": \"A\"}, {\"code\": \"Zuid-Korea\", \"name\": \"Zuid-Korea\", \"flag\": \"\ud83c\uddf0\ud83c\uddf7\", \"group\": \"A\"}, {\"code\": \"Tsjechi\u00eb\", \"name\": \"Tsjechi\u00eb\", \"flag\": \"\ud83c\udde8\ud83c\uddff\", \"group\": \"A\"}, {\"code\": \"Canada\", \"name\": \"Canada\", \"flag\": \"\ud83c\udde8\ud83c\udde6\", \"group\": \"B\"}, {\"code\": \"Bosni\u00eb\", \"name\": \"Bosni\u00eb\", \"flag\": \"\ud83c\udde7\ud83c\udde6\", \"group\": \"B\"}, {\"code\": \"Qatar\", \"name\": \"Qatar\", \"flag\": \"\ud83c\uddf6\ud83c\udde6\", \"group\": \"B\"}, {\"code\": \"Zwitserland\", \"name\": \"Zwitserland\", \"flag\": \"\ud83c\udde8\ud83c\udded\", \"group\": \"B\"}, {\"code\": \"Haiti\", \"name\": \"Haiti\", \"flag\": \"\ud83c\udded\ud83c\uddf9\", \"group\": \"C\"}, {\"code\": \"Schotland\", \"name\": \"Schotland\", \"flag\": \"\ud83c\udff4\udb40\udc67\udb40\udc62\udb40\udc73\udb40\udc63\udb40\udc74\udb40\udc7f\", \"group\": \"C\"}, {\"code\": \"Brazili\u00eb\", \"name\": \"Brazili\u00eb\", \"flag\": \"\ud83c\udde7\ud83c\uddf7\", \"group\": \"C\"}, {\"code\": \"Marokko\", \"name\": \"Marokko\", \"flag\": \"\ud83c\uddf2\ud83c\udde6\", \"group\": \"C\"}, {\"code\": \"VS\", \"name\": \"VS\", \"flag\": \"\ud83c\uddfa\ud83c\uddf8\", \"group\": \"D\"}, {\"code\": \"Paraguay\", \"name\": \"Paraguay\", \"flag\": \"\ud83c\uddf5\ud83c\uddfe\", \"group\": \"D\"}, {\"code\": \"Australi\u00eb\", \"name\": \"Australi\u00eb\", \"flag\": \"\ud83c\udde6\ud83c\uddfa\", \"group\": \"D\"}, {\"code\": \"Turkije\", \"name\": \"Turkije\", \"flag\": \"\ud83c\uddf9\ud83c\uddf7\", \"group\": \"D\"}, {\"code\": \"Ivoorkust\", \"name\": \"Ivoorkust\", \"flag\": \"\ud83c\udde8\ud83c\uddee\", \"group\": \"E\"}, {\"code\": \"Ecuador\", \"name\": \"Ecuador\", \"flag\": \"\ud83c\uddea\ud83c\udde8\", \"group\": \"E\"}, {\"code\": \"Duitsland\", \"name\": \"Duitsland\", \"flag\": \"\ud83c\udde9\ud83c\uddea\", \"group\": \"E\"}, {\"code\": \"Cura\u00e7ao\", \"name\": \"Cura\u00e7ao\", \"flag\": \"\ud83c\udde8\ud83c\uddfc\", \"group\": \"E\"}, {\"code\": \"Nederland\", \"name\": \"Nederland\", \"flag\": \"\ud83c\uddf3\ud83c\uddf1\", \"group\": \"F\"}, {\"code\": \"Japan\", \"name\": \"Japan\", \"flag\": \"\ud83c\uddef\ud83c\uddf5\", \"group\": \"F\"}, {\"code\": \"Zweden\", \"name\": \"Zweden\", \"flag\": \"\ud83c\uddf8\ud83c\uddea\", \"group\": \"F\"}, {\"code\": \"Tunesi\u00eb\", \"name\": \"Tunesi\u00eb\", \"flag\": \"\ud83c\uddf9\ud83c\uddf3\", \"group\": \"F\"}, {\"code\": \"Iran\", \"name\": \"Iran\", \"flag\": \"\ud83c\uddee\ud83c\uddf7\", \"group\": \"G\"}, {\"code\": \"Nieuw-Zeeland\", \"name\": \"Nieuw-Zeeland\", \"flag\": \"\ud83c\uddf3\ud83c\uddff\", \"group\": \"G\"}, {\"code\": \"Belgi\u00eb\", \"name\": \"Belgi\u00eb\", \"flag\": \"\ud83c\udde7\ud83c\uddea\", \"group\": \"G\"}, {\"code\": \"Egypte\", \"name\": \"Egypte\", \"flag\": \"\ud83c\uddea\ud83c\uddec\", \"group\": \"G\"}, {\"code\": \"Saoedi-Arabi\u00eb\", \"name\": \"Saoedi-Arabi\u00eb\", \"flag\": \"\ud83c\uddf8\ud83c\udde6\", \"group\": \"H\"}, {\"code\": \"Uruguay\", \"name\": \"Uruguay\", \"flag\": \"\ud83c\uddfa\ud83c\uddfe\", \"group\": \"H\"}, {\"code\": \"Spanje\", \"name\": \"Spanje\", \"flag\": \"\ud83c\uddea\ud83c\uddf8\", \"group\": \"H\"}, {\"code\": \"Kaapverdi\u00eb\", \"name\": \"Kaapverdi\u00eb\", \"flag\": \"\ud83c\udde8\ud83c\uddfb\", \"group\": \"H\"}, {\"code\": \"Frankrijk\", \"name\": \"Frankrijk\", \"flag\": \"\ud83c\uddeb\ud83c\uddf7\", \"group\": \"I\"}, {\"code\": \"Senegal\", \"name\": \"Senegal\", \"flag\": \"\ud83c\uddf8\ud83c\uddf3\", \"group\": \"I\"}, {\"code\": \"Irak\", \"name\": \"Irak\", \"flag\": \"\ud83c\uddee\ud83c\uddf6\", \"group\": \"I\"}, {\"code\": \"Noorwegen\", \"name\": \"Noorwegen\", \"flag\": \"\ud83c\uddf3\ud83c\uddf4\", \"group\": \"I\"}, {\"code\": \"Argentini\u00eb\", \"name\": \"Argentini\u00eb\", \"flag\": \"\ud83c\udde6\ud83c\uddf7\", \"group\": \"J\"}, {\"code\": \"Algerije\", \"name\": \"Algerije\", \"flag\": \"\ud83c\udde9\ud83c\uddff\", \"group\": \"J\"}, {\"code\": \"Oostenrijk\", \"name\": \"Oostenrijk\", \"flag\": \"\ud83c\udde6\ud83c\uddf9\", \"group\": \"J\"}, {\"code\": \"Jordani\u00eb\", \"name\": \"Jordani\u00eb\", \"flag\": \"\ud83c\uddef\ud83c\uddf4\", \"group\": \"J\"}, {\"code\": \"Portugal\", \"name\": \"Portugal\", \"flag\": \"\ud83c\uddf5\ud83c\uddf9\", \"group\": \"K\"}, {\"code\": \"DR Congo\", \"name\": \"DR Congo\", \"flag\": \"\ud83c\udde8\ud83c\udde9\", \"group\": \"K\"}, {\"code\": \"Oezbekistan\", \"name\": \"Oezbekistan\", \"flag\": \"\ud83c\uddfa\ud83c\uddff\", \"group\": \"K\"}, {\"code\": \"Colombia\", \"name\": \"Colombia\", \"flag\": \"\ud83c\udde8\ud83c\uddf4\", \"group\": \"K\"}, {\"code\": \"Ghana\", \"name\": \"Ghana\", \"flag\": \"\ud83c\uddec\ud83c\udded\", \"group\": \"L\"}, {\"code\": \"Panama\", \"name\": \"Panama\", \"flag\": \"\ud83c\uddf5\ud83c\udde6\", \"group\": \"L\"}, {\"code\": \"Engeland\", \"name\": \"Engeland\", \"flag\": \"\ud83c\udff4\udb40\udc67\udb40\udc62\udb40\udc65\udb40\udc6e\udb40\udc67\udb40\udc7f\", \"group\": \"L\"}, {\"code\": \"Kroati\u00eb\", \"name\": \"Kroati\u00eb\", \"flag\": \"\ud83c\udded\ud83c\uddf7\", \"group\": \"L\"}];\n    var TEAM = {}; TEAMS.forEach(function (t) { TEAM[t.code] = t; });\n    var GROUPS = 'ABCDEFGHIJKL'.split('');\n    var byGroup = {}; GROUPS.forEach(function (g) { byGroup[g] = TEAMS.filter(function (t) { return t.group === g; }); });\n    var GROUP_PRED = {\"A\": [\"Mexico\", \"Zuid-Korea\", \"Zuid-Afrika\", \"Tsjechi\u00eb\"], \"B\": [\"Canada\", \"Zwitserland\", \"Bosni\u00eb\", \"Qatar\"], \"C\": [\"Brazili\u00eb\", \"Marokko\", \"Haiti\", \"Schotland\"], \"D\": [\"VS\", \"Turkije\", \"Paraguay\", \"Australi\u00eb\"], \"E\": [\"Duitsland\", \"Ecuador\", \"Ivoorkust\", \"Cura\u00e7ao\"], \"F\": [\"Nederland\", \"Japan\", \"Zweden\", \"Tunesi\u00eb\"], \"G\": [\"Belgi\u00eb\", \"Egypte\", \"Iran\", \"Nieuw-Zeeland\"], \"H\": [\"Spanje\", \"Uruguay\", \"Saoedi-Arabi\u00eb\", \"Kaapverdi\u00eb\"], \"I\": [\"Frankrijk\", \"Noorwegen\", \"Senegal\", \"Irak\"], \"J\": [\"Argentini\u00eb\", \"Oostenrijk\", \"Algerije\", \"Jordani\u00eb\"], \"K\": [\"Portugal\", \"Colombia\", \"DR Congo\", \"Oezbekistan\"], \"L\": [\"Engeland\", \"Kroati\u00eb\", \"Ghana\", \"Panama\"]};\n\n    \/* ===== UITSLAGEN: vul hier in tijdens het toernooi (thuis-uit), bv. M1: \"2-1\" ===== *\/\n    var RESULTS = {\n      \/* \"M1\": \"2-1\", \"M2\": \"1-1\", ... *\/\n    };\n\n    \/* ===== 72 groepswedstrijden met de echte voorspelling per model ===== *\/\n    var FIX = [{\"id\": \"M1\", \"group\": \"A\", \"home\": \"Mexico\", \"away\": \"Zuid-Afrika\", \"preds\": {\"claude\": [2, 1], \"chatgpt\": [2, 0], \"copilot\": [2, 0], \"gemini\": [2, 1], \"perplexity\": [2, 1]}, \"md\": 1}, {\"id\": \"M2\", \"group\": \"A\", \"home\": \"Zuid-Korea\", \"away\": \"Tsjechi\u00eb\", \"preds\": {\"claude\": [2, 1], \"chatgpt\": [1, 1], \"copilot\": [1, 1], \"gemini\": [1, 1], \"perplexity\": [2, 0]}, \"md\": 1}, {\"id\": \"M25\", \"group\": \"A\", \"home\": \"Tsjechi\u00eb\", \"away\": \"Zuid-Afrika\", \"preds\": {\"claude\": [2, 1], \"chatgpt\": [2, 1], \"copilot\": [1, 1], \"gemini\": [2, 0], \"perplexity\": [1, 1]}, \"md\": 2}, {\"id\": \"M28\", \"group\": \"A\", \"home\": \"Mexico\", \"away\": \"Zuid-Korea\", \"preds\": {\"claude\": [2, 1], \"chatgpt\": [1, 1], \"copilot\": [2, 1], \"gemini\": [2, 0], \"perplexity\": [1, 1]}, \"md\": 2}, {\"id\": \"M53\", \"group\": \"A\", \"home\": \"Tsjechi\u00eb\", \"away\": \"Mexico\", \"preds\": {\"claude\": [1, 2], \"chatgpt\": [0, 1], \"copilot\": [0, 2], \"gemini\": [1, 1], \"perplexity\": [0, 2]}, \"md\": 3}, {\"id\": \"M54\", \"group\": \"A\", \"home\": \"Zuid-Afrika\", \"away\": \"Zuid-Korea\", \"preds\": {\"claude\": [0, 2], \"chatgpt\": [1, 2], \"copilot\": [0, 2], \"gemini\": [1, 2], \"perplexity\": [1, 2]}, \"md\": 3}, {\"id\": \"M3\", \"group\": \"B\", \"home\": \"Canada\", \"away\": \"Bosni\u00eb\", \"preds\": {\"claude\": [2, 0], \"chatgpt\": [2, 1], \"copilot\": [1, 0], \"gemini\": [2, 0], \"perplexity\": [2, 0]}, \"md\": 1}, {\"id\": \"M8\", \"group\": \"B\", \"home\": \"Qatar\", \"away\": \"Zwitserland\", \"preds\": {\"claude\": [0, 2], \"chatgpt\": [0, 2], \"copilot\": [0, 2], \"gemini\": [0, 3], \"perplexity\": [0, 2]}, \"md\": 1}, {\"id\": \"M26\", \"group\": \"B\", \"home\": \"Zwitserland\", \"away\": \"Bosni\u00eb\", \"preds\": {\"claude\": [2, 1], \"chatgpt\": [1, 0], \"copilot\": [2, 1], \"gemini\": [1, 0], \"perplexity\": [2, 1]}, \"md\": 2}, {\"id\": \"M27\", \"group\": \"B\", \"home\": \"Canada\", \"away\": \"Qatar\", \"preds\": {\"claude\": [3, 1], \"chatgpt\": [2, 0], \"copilot\": [3, 0], \"gemini\": [3, 1], \"perplexity\": [1, 1]}, \"md\": 2}, {\"id\": \"M51\", \"group\": \"B\", \"home\": \"Zwitserland\", \"away\": \"Canada\", \"preds\": {\"claude\": [2, 1], \"chatgpt\": [1, 1], \"copilot\": [1, 1], \"gemini\": [1, 1], \"perplexity\": [2, 1]}, \"md\": 3}, {\"id\": \"M52\", \"group\": \"B\", \"home\": \"Bosni\u00eb\", \"away\": \"Qatar\", \"preds\": {\"claude\": [2, 1], \"chatgpt\": [2, 1], \"copilot\": [2, 0], \"gemini\": [2, 1], \"perplexity\": [2, 1]}, \"md\": 3}, {\"id\": \"M5\", \"group\": \"C\", \"home\": \"Haiti\", \"away\": \"Schotland\", \"preds\": {\"claude\": [0, 2], \"chatgpt\": [0, 2], \"copilot\": [0, 3], \"gemini\": [0, 2], \"perplexity\": [0, 2]}, \"md\": 1}, {\"id\": \"M7\", \"group\": \"C\", \"home\": \"Brazili\u00eb\", \"away\": \"Marokko\", \"preds\": {\"claude\": [1, 1], \"chatgpt\": [2, 1], \"copilot\": [2, 0], \"gemini\": [2, 1], \"perplexity\": [2, 1]}, \"md\": 1}, {\"id\": \"M29\", \"group\": \"C\", \"home\": \"Brazili\u00eb\", \"away\": \"Haiti\", \"preds\": {\"claude\": [3, 0], \"chatgpt\": [3, 0], \"copilot\": [4, 0], \"gemini\": [5, 0], \"perplexity\": [3, 0]}, \"md\": 2}, {\"id\": \"M30\", \"group\": \"C\", \"home\": \"Schotland\", \"away\": \"Marokko\", \"preds\": {\"claude\": [0, 2], \"chatgpt\": [0, 1], \"copilot\": [1, 1], \"gemini\": [0, 2], \"perplexity\": [1, 1]}, \"md\": 2}, {\"id\": \"M49\", \"group\": \"C\", \"home\": \"Schotland\", \"away\": \"Brazili\u00eb\", \"preds\": {\"claude\": [1, 2], \"chatgpt\": [1, 2], \"copilot\": [0, 2], \"gemini\": [1, 3], \"perplexity\": [1, 2]}, \"md\": 3}, {\"id\": \"M50\", \"group\": \"C\", \"home\": \"Marokko\", \"away\": \"Haiti\", \"preds\": {\"claude\": [3, 0], \"chatgpt\": [3, 0], \"copilot\": [2, 0], \"gemini\": [4, 0], \"perplexity\": [3, 0]}, \"md\": 3}, {\"id\": \"M4\", \"group\": \"D\", \"home\": \"VS\", \"away\": \"Paraguay\", \"preds\": {\"claude\": [2, 0], \"chatgpt\": [2, 1], \"copilot\": [2, 1], \"gemini\": [2, 0], \"perplexity\": [2, 1]}, \"md\": 1}, {\"id\": \"M6\", \"group\": \"D\", \"home\": \"Australi\u00eb\", \"away\": \"Turkije\", \"preds\": {\"claude\": [1, 2], \"chatgpt\": [1, 2], \"copilot\": [0, 1], \"gemini\": [1, 2], \"perplexity\": [1, 1]}, \"md\": 1}, {\"id\": \"M31\", \"group\": \"D\", \"home\": \"Turkije\", \"away\": \"Paraguay\", \"preds\": {\"claude\": [2, 1], \"chatgpt\": [1, 1], \"copilot\": [1, 1], \"gemini\": [1, 1], \"perplexity\": [2, 1]}, \"md\": 2}, {\"id\": \"M32\", \"group\": \"D\", \"home\": \"VS\", \"away\": \"Australi\u00eb\", \"preds\": {\"claude\": [2, 1], \"chatgpt\": [2, 0], \"copilot\": [3, 0], \"gemini\": [3, 1], \"perplexity\": [2, 0]}, \"md\": 2}, {\"id\": \"M59\", \"group\": \"D\", \"home\": \"Turkije\", \"away\": \"VS\", \"preds\": {\"claude\": [1, 1], \"chatgpt\": [1, 1], \"copilot\": [1, 2], \"gemini\": [2, 2], \"perplexity\": [1, 2]}, \"md\": 3}, {\"id\": \"M60\", \"group\": \"D\", \"home\": \"Paraguay\", \"away\": \"Australi\u00eb\", \"preds\": {\"claude\": [1, 1], \"chatgpt\": [2, 1], \"copilot\": [2, 0], \"gemini\": [1, 0], \"perplexity\": [2, 1]}, \"md\": 3}, {\"id\": \"M9\", \"group\": \"E\", \"home\": \"Ivoorkust\", \"away\": \"Ecuador\", \"preds\": {\"claude\": [1, 2], \"chatgpt\": [0, 1], \"copilot\": [1, 1], \"gemini\": [1, 1], \"perplexity\": [2, 0]}, \"md\": 1}, {\"id\": \"M10\", \"group\": \"E\", \"home\": \"Duitsland\", \"away\": \"Cura\u00e7ao\", \"preds\": {\"claude\": [3, 0], \"chatgpt\": [4, 0], \"copilot\": [3, 0], \"gemini\": [4, 0], \"perplexity\": [3, 0]}, \"md\": 1}, {\"id\": \"M33\", \"group\": \"E\", \"home\": \"Duitsland\", \"away\": \"Ivoorkust\", \"preds\": {\"claude\": [2, 1], \"chatgpt\": [2, 1], \"copilot\": [2, 1], \"gemini\": [2, 1], \"perplexity\": [2, 1]}, \"md\": 2}, {\"id\": \"M34\", \"group\": \"E\", \"home\": \"Ecuador\", \"away\": \"Cura\u00e7ao\", \"preds\": {\"claude\": [2, 0], \"chatgpt\": [2, 0], \"copilot\": [2, 0], \"gemini\": [3, 0], \"perplexity\": [3, 0]}, \"md\": 2}, {\"id\": \"M55\", \"group\": \"E\", \"home\": \"Cura\u00e7ao\", \"away\": \"Ivoorkust\", \"preds\": {\"claude\": [0, 2], \"chatgpt\": [1, 3], \"copilot\": [1, 2], \"gemini\": [1, 3], \"perplexity\": [0, 2]}, \"md\": 3}, {\"id\": \"M56\", \"group\": \"E\", \"home\": \"Ecuador\", \"away\": \"Duitsland\", \"preds\": {\"claude\": [1, 2], \"chatgpt\": [1, 2], \"copilot\": [1, 1], \"gemini\": [1, 2], \"perplexity\": [1, 2]}, \"md\": 3}, {\"id\": \"M11\", \"group\": \"F\", \"home\": \"Nederland\", \"away\": \"Japan\", \"preds\": {\"claude\": [2, 1], \"chatgpt\": [2, 1], \"copilot\": [2, 1], \"gemini\": [1, 1], \"perplexity\": [2, 1]}, \"md\": 1}, {\"id\": \"M12\", \"group\": \"F\", \"home\": \"Zweden\", \"away\": \"Tunesi\u00eb\", \"preds\": {\"claude\": [1, 1], \"chatgpt\": [1, 0], \"copilot\": [1, 0], \"gemini\": [2, 0], \"perplexity\": [2, 0]}, \"md\": 1}, {\"id\": \"M35\", \"group\": \"F\", \"home\": \"Nederland\", \"away\": \"Zweden\", \"preds\": {\"claude\": [3, 1], \"chatgpt\": [1, 1], \"copilot\": [1, 1], \"gemini\": [2, 1], \"perplexity\": [2, 0]}, \"md\": 2}, {\"id\": \"M36\", \"group\": \"F\", \"home\": \"Tunesi\u00eb\", \"away\": \"Japan\", \"preds\": {\"claude\": [0, 2], \"chatgpt\": [0, 1], \"copilot\": [0, 2], \"gemini\": [0, 2], \"perplexity\": [1, 1]}, \"md\": 2}, {\"id\": \"M57\", \"group\": \"F\", \"home\": \"Japan\", \"away\": \"Zweden\", \"preds\": {\"claude\": [2, 1], \"chatgpt\": [2, 2], \"copilot\": [1, 1], \"gemini\": [2, 2], \"perplexity\": [2, 1]}, \"md\": 3}, {\"id\": \"M58\", \"group\": \"F\", \"home\": \"Tunesi\u00eb\", \"away\": \"Nederland\", \"preds\": {\"claude\": [0, 2], \"chatgpt\": [0, 2], \"copilot\": [0, 3], \"gemini\": [0, 2], \"perplexity\": [0, 2]}, \"md\": 3}, {\"id\": \"M15\", \"group\": \"G\", \"home\": \"Iran\", \"away\": \"Nieuw-Zeeland\", \"preds\": {\"claude\": [1, 0], \"chatgpt\": [2, 0], \"copilot\": [1, 0], \"gemini\": [2, 0], \"perplexity\": [1, 1]}, \"md\": 1}, {\"id\": \"M16\", \"group\": \"G\", \"home\": \"Belgi\u00eb\", \"away\": \"Egypte\", \"preds\": {\"claude\": [2, 1], \"chatgpt\": [2, 1], \"copilot\": [2, 0], \"gemini\": [2, 1], \"perplexity\": [2, 1]}, \"md\": 1}, {\"id\": \"M39\", \"group\": \"G\", \"home\": \"Belgi\u00eb\", \"away\": \"Iran\", \"preds\": {\"claude\": [2, 0], \"chatgpt\": [2, 0], \"copilot\": [1, 1], \"gemini\": [2, 0], \"perplexity\": [2, 0]}, \"md\": 2}, {\"id\": \"M40\", \"group\": \"G\", \"home\": \"Nieuw-Zeeland\", \"away\": \"Egypte\", \"preds\": {\"claude\": [1, 2], \"chatgpt\": [0, 2], \"copilot\": [0, 2], \"gemini\": [0, 2], \"perplexity\": [1, 1]}, \"md\": 2}, {\"id\": \"M63\", \"group\": \"G\", \"home\": \"Egypte\", \"away\": \"Iran\", \"preds\": {\"claude\": [1, 1], \"chatgpt\": [1, 1], \"copilot\": [1, 1], \"gemini\": [1, 1], \"perplexity\": [2, 1]}, \"md\": 3}, {\"id\": \"M64\", \"group\": \"G\", \"home\": \"Nieuw-Zeeland\", \"away\": \"Belgi\u00eb\", \"preds\": {\"claude\": [0, 2], \"chatgpt\": [0, 3], \"copilot\": [0, 3], \"gemini\": [0, 4], \"perplexity\": [0, 2]}, \"md\": 3}, {\"id\": \"M13\", \"group\": \"H\", \"home\": \"Saoedi-Arabi\u00eb\", \"away\": \"Uruguay\", \"preds\": {\"claude\": [0, 2], \"chatgpt\": [0, 2], \"copilot\": [1, 1], \"gemini\": [0, 3], \"perplexity\": [0, 2]}, \"md\": 1}, {\"id\": \"M14\", \"group\": \"H\", \"home\": \"Spanje\", \"away\": \"Kaapverdi\u00eb\", \"preds\": {\"claude\": [3, 0], \"chatgpt\": [2, 0], \"copilot\": [3, 0], \"gemini\": [4, 0], \"perplexity\": [3, 0]}, \"md\": 1}, {\"id\": \"M37\", \"group\": \"H\", \"home\": \"Uruguay\", \"away\": \"Kaapverdi\u00eb\", \"preds\": {\"claude\": [2, 0], \"chatgpt\": [2, 0], \"copilot\": [2, 0], \"gemini\": [3, 1], \"perplexity\": [2, 0]}, \"md\": 2}, {\"id\": \"M38\", \"group\": \"H\", \"home\": \"Spanje\", \"away\": \"Saoedi-Arabi\u00eb\", \"preds\": {\"claude\": [2, 0], \"chatgpt\": [3, 0], \"copilot\": [2, 0], \"gemini\": [3, 0], \"perplexity\": [2, 0]}, \"md\": 2}, {\"id\": \"M65\", \"group\": \"H\", \"home\": \"Kaapverdi\u00eb\", \"away\": \"Saoedi-Arabi\u00eb\", \"preds\": {\"claude\": [1, 1], \"chatgpt\": [1, 1], \"copilot\": [1, 1], \"gemini\": [1, 2], \"perplexity\": [1, 1]}, \"md\": 3}, {\"id\": \"M66\", \"group\": \"H\", \"home\": \"Uruguay\", \"away\": \"Spanje\", \"preds\": {\"claude\": [1, 2], \"chatgpt\": [1, 1], \"copilot\": [0, 2], \"gemini\": [1, 1], \"perplexity\": [1, 2]}, \"md\": 3}, {\"id\": \"M17\", \"group\": \"I\", \"home\": \"Frankrijk\", \"away\": \"Senegal\", \"preds\": {\"claude\": [2, 1], \"chatgpt\": [2, 1], \"copilot\": [2, 1], \"gemini\": [2, 1], \"perplexity\": [2, 1]}, \"md\": 1}, {\"id\": \"M18\", \"group\": \"I\", \"home\": \"Irak\", \"away\": \"Noorwegen\", \"preds\": {\"claude\": [0, 2], \"chatgpt\": [1, 3], \"copilot\": [0, 2], \"gemini\": [0, 3], \"perplexity\": [1, 1]}, \"md\": 1}, {\"id\": \"M41\", \"group\": \"I\", \"home\": \"Noorwegen\", \"away\": \"Senegal\", \"preds\": {\"claude\": [2, 1], \"chatgpt\": [2, 1], \"copilot\": [1, 1], \"gemini\": [1, 1], \"perplexity\": [2, 1]}, \"md\": 2}, {\"id\": \"M42\", \"group\": \"I\", \"home\": \"Frankrijk\", \"away\": \"Irak\", \"preds\": {\"claude\": [3, 0], \"chatgpt\": [3, 0], \"copilot\": [3, 0], \"gemini\": [4, 0], \"perplexity\": [3, 0]}, \"md\": 2}, {\"id\": \"M61\", \"group\": \"I\", \"home\": \"Noorwegen\", \"away\": \"Frankrijk\", \"preds\": {\"claude\": [1, 2], \"chatgpt\": [1, 2], \"copilot\": [1, 2], \"gemini\": [1, 2], \"perplexity\": [1, 2]}, \"md\": 3}, {\"id\": \"M62\", \"group\": \"I\", \"home\": \"Senegal\", \"away\": \"Irak\", \"preds\": {\"claude\": [2, 0], \"chatgpt\": [2, 0], \"copilot\": [2, 0], \"gemini\": [2, 0], \"perplexity\": [2, 0]}, \"md\": 3}, {\"id\": \"M19\", \"group\": \"J\", \"home\": \"Argentini\u00eb\", \"away\": \"Algerije\", \"preds\": {\"claude\": [2, 0], \"chatgpt\": [2, 0], \"copilot\": [3, 0], \"gemini\": [2, 0], \"perplexity\": [2, 0]}, \"md\": 1}, {\"id\": \"M20\", \"group\": \"J\", \"home\": \"Oostenrijk\", \"away\": \"Jordani\u00eb\", \"preds\": {\"claude\": [2, 1], \"chatgpt\": [2, 0], \"copilot\": [2, 0], \"gemini\": [3, 0], \"perplexity\": [2, 0]}, \"md\": 1}, {\"id\": \"M43\", \"group\": \"J\", \"home\": \"Argentini\u00eb\", \"away\": \"Oostenrijk\", \"preds\": {\"claude\": [2, 1], \"chatgpt\": [2, 1], \"copilot\": [2, 1], \"gemini\": [1, 1], \"perplexity\": [2, 1]}, \"md\": 2}, {\"id\": \"M44\", \"group\": \"J\", \"home\": \"Jordani\u00eb\", \"away\": \"Algerije\", \"preds\": {\"claude\": [1, 1], \"chatgpt\": [1, 2], \"copilot\": [0, 2], \"gemini\": [1, 2], \"perplexity\": [1, 1]}, \"md\": 2}, {\"id\": \"M69\", \"group\": \"J\", \"home\": \"Algerije\", \"away\": \"Oostenrijk\", \"preds\": {\"claude\": [1, 2], \"chatgpt\": [1, 1], \"copilot\": [1, 1], \"gemini\": [1, 2], \"perplexity\": [1, 1]}, \"md\": 3}, {\"id\": \"M70\", \"group\": \"J\", \"home\": \"Jordani\u00eb\", \"away\": \"Argentini\u00eb\", \"preds\": {\"claude\": [0, 3], \"chatgpt\": [0, 3], \"copilot\": [0, 4], \"gemini\": [0, 3], \"perplexity\": [0, 2]}, \"md\": 3}, {\"id\": \"M23\", \"group\": \"K\", \"home\": \"Portugal\", \"away\": \"DR Congo\", \"preds\": {\"claude\": [2, 0], \"chatgpt\": [3, 0], \"copilot\": [2, 0], \"gemini\": [2, 0], \"perplexity\": [2, 0]}, \"md\": 1}, {\"id\": \"M24\", \"group\": \"K\", \"home\": \"Oezbekistan\", \"away\": \"Colombia\", \"preds\": {\"claude\": [0, 2], \"chatgpt\": [1, 2], \"copilot\": [0, 2], \"gemini\": [0, 2], \"perplexity\": [1, 2]}, \"md\": 1}, {\"id\": \"M47\", \"group\": \"K\", \"home\": \"Portugal\", \"away\": \"Oezbekistan\", \"preds\": {\"claude\": [3, 1], \"chatgpt\": [2, 0], \"copilot\": [3, 0], \"gemini\": [3, 0], \"perplexity\": [2, 1]}, \"md\": 2}, {\"id\": \"M48\", \"group\": \"K\", \"home\": \"Colombia\", \"away\": \"DR Congo\", \"preds\": {\"claude\": [2, 1], \"chatgpt\": [2, 1], \"copilot\": [2, 1], \"gemini\": [2, 1], \"perplexity\": [2, 0]}, \"md\": 2}, {\"id\": \"M71\", \"group\": \"K\", \"home\": \"Colombia\", \"away\": \"Portugal\", \"preds\": {\"claude\": [1, 1], \"chatgpt\": [1, 1], \"copilot\": [1, 1], \"gemini\": [2, 2], \"perplexity\": [1, 1]}, \"md\": 3}, {\"id\": \"M72\", \"group\": \"K\", \"home\": \"DR Congo\", \"away\": \"Oezbekistan\", \"preds\": {\"claude\": [2, 1], \"chatgpt\": [1, 1], \"copilot\": [2, 0], \"gemini\": [1, 1], \"perplexity\": [2, 0]}, \"md\": 3}, {\"id\": \"M21\", \"group\": \"L\", \"home\": \"Ghana\", \"away\": \"Panama\", \"preds\": {\"claude\": [1, 1], \"chatgpt\": [2, 1], \"copilot\": [1, 1], \"gemini\": [2, 1], \"perplexity\": [1, 1]}, \"md\": 1}, {\"id\": \"M22\", \"group\": \"L\", \"home\": \"Engeland\", \"away\": \"Kroati\u00eb\", \"preds\": {\"claude\": [2, 1], \"chatgpt\": [2, 1], \"copilot\": [2, 1], \"gemini\": [2, 0], \"perplexity\": [2, 1]}, \"md\": 1}, {\"id\": \"M45\", \"group\": \"L\", \"home\": \"Engeland\", \"away\": \"Ghana\", \"preds\": {\"claude\": [3, 0], \"chatgpt\": [3, 0], \"copilot\": [3, 0], \"gemini\": [3, 1], \"perplexity\": [2, 0]}, \"md\": 2}, {\"id\": \"M46\", \"group\": \"L\", \"home\": \"Panama\", \"away\": \"Kroati\u00eb\", \"preds\": {\"claude\": [0, 2], \"chatgpt\": [0, 2], \"copilot\": [0, 2], \"gemini\": [0, 2], \"perplexity\": [0, 1]}, \"md\": 2}, {\"id\": \"M67\", \"group\": \"L\", \"home\": \"Panama\", \"away\": \"Engeland\", \"preds\": {\"claude\": [0, 3], \"chatgpt\": [0, 3], \"copilot\": [0, 3], \"gemini\": [0, 4], \"perplexity\": [1, 2]}, \"md\": 3}, {\"id\": \"M68\", \"group\": \"L\", \"home\": \"Kroati\u00eb\", \"away\": \"Ghana\", \"preds\": {\"claude\": [2, 1], \"chatgpt\": [2, 0], \"copilot\": [2, 1], \"gemini\": [2, 1], \"perplexity\": [2, 1]}, \"md\": 3}];\n    var MATCHES = FIX.map(function (f) {\n      var res = RESULTS[f.id]; var played = false, ah = null, aa = null;\n      if (res) { var pp = String(res).split(\"-\"); ah = parseInt(pp[0], 10); aa = parseInt(pp[1], 10); played = true; }\n      var preds = {}; for (var k in f.preds) { preds[k] = { h: f.preds[k][0], a: f.preds[k][1] }; }\n      return { id: f.id, group: f.group, md: f.md, date: \"\", city: \"\", home: TEAM[f.home], away: TEAM[f.away], played: played, ah: ah, aa: aa, preds: preds };\n    });\n\n    var TOPSCORERS = {\"claude\": [{\"name\": \"Kylian Mbapp\u00e9\", \"country\": \"Frankrijk\", \"goals\": 8}, {\"name\": \"Julian \u00c1lvarez\", \"country\": \"Argentini\u00eb\", \"goals\": 6}, {\"name\": \"Lamine Yamal\", \"country\": \"Spanje\", \"goals\": 5}, {\"name\": \"Erling Haaland\", \"country\": \"Noorwegen\", \"goals\": 5}, {\"name\": \"Harry Kane\", \"country\": \"Engeland\", \"goals\": 4}], \"chatgpt\": [{\"name\": \"Erling Haaland\", \"country\": \"Noorwegen\", \"goals\": 8}, {\"name\": \"Kylian Mbapp\u00e9\", \"country\": \"Frankrijk\", \"goals\": 7}, {\"name\": \"Harry Kane\", \"country\": \"Engeland\", \"goals\": 5}, {\"name\": \"Lionel Messi\", \"country\": \"Argentini\u00eb\", \"goals\": 5}, {\"name\": \"Lamine Yamal\", \"country\": \"Spanje\", \"goals\": 4}], \"copilot\": [{\"name\": \"Lionel Messi\", \"country\": \"Argentini\u00eb\", \"goals\": 6}, {\"name\": \"Neymar\", \"country\": \"Brazili\u00eb\", \"goals\": 5}, {\"name\": \"Erling Haaland\", \"country\": \"Noorwegen\", \"goals\": 5}, {\"name\": \"Kylian Mbapp\u00e9\", \"country\": \"Frankrijk\", \"goals\": 4}, {\"name\": \"Cristiano Ronaldo\", \"country\": \"Portugal\", \"goals\": 3}], \"gemini\": [{\"name\": \"Kylian Mbapp\u00e9\", \"country\": \"Frankrijk\", \"goals\": 7}, {\"name\": \"Vin\u00edcius J\u00fanior\", \"country\": \"Brazili\u00eb\", \"goals\": 6}, {\"name\": \"Harry Kane\", \"country\": \"Engeland\", \"goals\": 5}, {\"name\": \"Lamine Yamal\", \"country\": \"Spanje\", \"goals\": 4}, {\"name\": \"Lautaro Mart\u00ednez\", \"country\": \"Argentini\u00eb\", \"goals\": 4}], \"perplexity\": [{\"name\": \"Kylian Mbapp\u00e9\", \"country\": null, \"goals\": 7}, {\"name\": \"Lautaro Mart\u00ednez\", \"country\": null, \"goals\": 6}, {\"name\": \"Vin\u00edcius J\u00fanior\", \"country\": null, \"goals\": 5}, {\"name\": \"Harry Kane\", \"country\": null, \"goals\": 5}, {\"name\": \"Alvaro Morata\", \"country\": null, \"goals\": 4}]};\n    var KO = {\"claude\": [{\"home\": \"Zuid-Korea\", \"away\": \"Canada\", \"h\": 1, \"a\": 2, \"pen\": null, \"id\": \"M73\", \"slot\": \"2A vs 2B\", \"round\": \"r32\"}, {\"home\": \"Duitsland\", \"away\": \"Schotland\", \"h\": 3, \"a\": 0, \"pen\": null, \"id\": \"M74\", \"slot\": \"1E vs beste 3e\", \"round\": \"r32\"}, {\"home\": \"Nederland\", \"away\": \"Brazili\u00eb\", \"h\": 2, \"a\": 1, \"pen\": null, \"id\": \"M75\", \"slot\": \"1F vs 2C\", \"round\": \"r32\"}, {\"home\": \"Marokko\", \"away\": \"Japan\", \"h\": 2, \"a\": 0, \"pen\": null, \"id\": \"M76\", \"slot\": \"1C vs 2F\", \"round\": \"r32\"}, {\"home\": \"Frankrijk\", \"away\": \"Australi\u00eb\", \"h\": 4, \"a\": 0, \"pen\": null, \"id\": \"M77\", \"slot\": \"1I vs beste 3e\", \"round\": \"r32\"}, {\"home\": \"Ecuador\", \"away\": \"Noorwegen\", \"h\": 1, \"a\": 2, \"pen\": null, \"id\": \"M78\", \"slot\": \"2E vs 2I\", \"round\": \"r32\"}, {\"home\": \"Mexico\", \"away\": \"Ivoorkust\", \"h\": 2, \"a\": 1, \"pen\": null, \"id\": \"M79\", \"slot\": \"1A vs beste 3e\", \"round\": \"r32\"}, {\"home\": \"Engeland\", \"away\": \"DR Congo\", \"h\": 3, \"a\": 0, \"pen\": null, \"id\": \"M80\", \"slot\": \"1L vs beste 3e\", \"round\": \"r32\"}, {\"home\": \"VS\", \"away\": \"Bosni\u00eb\", \"h\": 2, \"a\": 1, \"pen\": null, \"id\": \"M81\", \"slot\": \"1D vs beste 3e\", \"round\": \"r32\"}, {\"home\": \"Belgi\u00eb\", \"away\": \"Tsjechi\u00eb\", \"h\": 2, \"a\": 0, \"pen\": null, \"id\": \"M82\", \"slot\": \"1G vs beste 3e\", \"round\": \"r32\"}, {\"home\": \"Colombia\", \"away\": \"Kroati\u00eb\", \"h\": 1, \"a\": 2, \"pen\": null, \"id\": \"M83\", \"slot\": \"2K vs 2L\", \"round\": \"r32\"}, {\"home\": \"Spanje\", \"away\": \"Oostenrijk\", \"h\": 3, \"a\": 0, \"pen\": null, \"id\": \"M84\", \"slot\": \"1H vs 2J\", \"round\": \"r32\"}, {\"home\": \"Zwitserland\", \"away\": \"Iran\", \"h\": 2, \"a\": 0, \"pen\": null, \"id\": \"M85\", \"slot\": \"1B vs beste 3e\", \"round\": \"r32\"}, {\"home\": \"Argentini\u00eb\", \"away\": \"Uruguay\", \"h\": 2, \"a\": 1, \"pen\": null, \"id\": \"M86\", \"slot\": \"1J vs 2H\", \"round\": \"r32\"}, {\"home\": \"Portugal\", \"away\": \"Senegal\", \"h\": 2, \"a\": 1, \"pen\": null, \"id\": \"M87\", \"slot\": \"1K vs beste 3e\", \"round\": \"r32\"}, {\"home\": \"Turkije\", \"away\": \"Egypte\", \"h\": 2, \"a\": 1, \"pen\": null, \"id\": \"M88\", \"slot\": \"2D vs 2G\", \"round\": \"r32\"}, {\"home\": \"Duitsland\", \"away\": \"Frankrijk\", \"h\": 1, \"a\": 2, \"pen\": null, \"id\": \"M89\", \"slot\": \"W74 vs W77\", \"round\": \"r16\"}, {\"home\": \"Canada\", \"away\": \"Nederland\", \"h\": 1, \"a\": 3, \"pen\": null, \"id\": \"M90\", \"slot\": \"W73 vs W75\", \"round\": \"r16\"}, {\"home\": \"Marokko\", \"away\": \"Noorwegen\", \"h\": 2, \"a\": 1, \"pen\": null, \"id\": \"M91\", \"slot\": \"W76 vs W78\", \"round\": \"r16\"}, {\"home\": \"Mexico\", \"away\": \"Engeland\", \"h\": 0, \"a\": 2, \"pen\": null, \"id\": \"M92\", \"slot\": \"W79 vs W80\", \"round\": \"r16\"}, {\"home\": \"Kroati\u00eb\", \"away\": \"Spanje\", \"h\": 0, \"a\": 2, \"pen\": null, \"id\": \"M93\", \"slot\": \"W83 vs W84\", \"round\": \"r16\"}, {\"home\": \"VS\", \"away\": \"Belgi\u00eb\", \"h\": 1, \"a\": 2, \"pen\": null, \"id\": \"M94\", \"slot\": \"W81 vs W82\", \"round\": \"r16\"}, {\"home\": \"Argentini\u00eb\", \"away\": \"Turkije\", \"h\": 3, \"a\": 1, \"pen\": null, \"id\": \"M95\", \"slot\": \"W86 vs W88\", \"round\": \"r16\"}, {\"home\": \"Zwitserland\", \"away\": \"Portugal\", \"h\": 1, \"a\": 2, \"pen\": null, \"id\": \"M96\", \"slot\": \"W85 vs W87\", \"round\": \"r16\"}, {\"home\": \"Frankrijk\", \"away\": \"Nederland\", \"h\": 2, \"a\": 1, \"pen\": null, \"id\": \"M97\", \"slot\": \"W89 vs W90\", \"round\": \"quarter\"}, {\"home\": \"Spanje\", \"away\": \"Belgi\u00eb\", \"h\": 2, \"a\": 1, \"pen\": null, \"id\": \"M98\", \"slot\": \"W93 vs W94\", \"round\": \"quarter\"}, {\"home\": \"Marokko\", \"away\": \"Engeland\", \"h\": 1, \"a\": 1, \"pen\": \"pen\", \"id\": \"M99\", \"slot\": \"W91 vs W92\", \"round\": \"quarter\"}, {\"home\": \"Argentini\u00eb\", \"away\": \"Portugal\", \"h\": 2, \"a\": 1, \"pen\": null, \"id\": \"M100\", \"slot\": \"W95 vs W96\", \"round\": \"quarter\"}, {\"home\": \"Frankrijk\", \"away\": \"Spanje\", \"h\": 1, \"a\": 2, \"pen\": null, \"id\": \"M101\", \"slot\": \"HF: W97 vs W98\", \"round\": \"semi\"}, {\"home\": \"Marokko\", \"away\": \"Argentini\u00eb\", \"h\": 0, \"a\": 2, \"pen\": null, \"id\": \"M102\", \"slot\": \"HF: W99 vs W100\", \"round\": \"semi\"}, {\"home\": \"Frankrijk\", \"away\": \"Marokko\", \"h\": 2, \"a\": 1, \"pen\": null, \"id\": \"M103\", \"slot\": \"3e\/4e plaats\", \"round\": \"third\"}, {\"home\": \"Spanje\", \"away\": \"Argentini\u00eb\", \"h\": 2, \"a\": 1, \"pen\": null, \"id\": \"M104\", \"slot\": \"FINALE\", \"round\": \"final\"}], \"chatgpt\": [{\"home\": \"Zuid-Korea\", \"away\": \"Zwitserland\", \"h\": 1, \"a\": 2, \"pen\": null, \"id\": \"M73\", \"slot\": \"2A vs 2B\", \"round\": \"r32\"}, {\"home\": \"Duitsland\", \"away\": \"Paraguay\", \"h\": 2, \"a\": 0, \"pen\": null, \"id\": \"M74\", \"slot\": \"1E vs beste 3e\", \"round\": \"r32\"}, {\"home\": \"Nederland\", \"away\": \"Marokko\", \"h\": 2, \"a\": 1, \"pen\": null, \"id\": \"M75\", \"slot\": \"1F vs 2C\", \"round\": \"r32\"}, {\"home\": \"Brazili\u00eb\", \"away\": \"Zweden\", \"h\": 2, \"a\": 0, \"pen\": null, \"id\": \"M76\", \"slot\": \"1C vs 2F\", \"round\": \"r32\"}, {\"home\": \"Frankrijk\", \"away\": \"Japan\", \"h\": 2, \"a\": 1, \"pen\": null, \"id\": \"M77\", \"slot\": \"1I vs beste 3e\", \"round\": \"r32\"}, {\"home\": \"Ecuador\", \"away\": \"Noorwegen\", \"h\": 1, \"a\": 2, \"pen\": \"nv\", \"id\": \"M78\", \"slot\": \"2E vs 2I\", \"round\": \"r32\"}, {\"home\": \"Mexico\", \"away\": \"Schotland\", \"h\": 2, \"a\": 1, \"pen\": null, \"id\": \"M79\", \"slot\": \"1A vs beste 3e\", \"round\": \"r32\"}, {\"home\": \"Engeland\", \"away\": \"Senegal\", \"h\": 2, \"a\": 1, \"pen\": null, \"id\": \"M80\", \"slot\": \"1L vs beste 3e\", \"round\": \"r32\"}, {\"home\": \"VS\", \"away\": \"Algerije\", \"h\": 2, \"a\": 1, \"pen\": null, \"id\": \"M81\", \"slot\": \"1D vs beste 3e\", \"round\": \"r32\"}, {\"home\": \"Belgi\u00eb\", \"away\": \"Tsjechi\u00eb\", \"h\": 2, \"a\": 0, \"pen\": null, \"id\": \"M82\", \"slot\": \"1G vs beste 3e\", \"round\": \"r32\"}, {\"home\": \"Colombia\", \"away\": \"Kroati\u00eb\", \"h\": 1, \"a\": 2, \"pen\": null, \"id\": \"M83\", \"slot\": \"2K vs 2L\", \"round\": \"r32\"}, {\"home\": \"Spanje\", \"away\": \"Oostenrijk\", \"h\": 2, \"a\": 0, \"pen\": null, \"id\": \"M84\", \"slot\": \"1H vs 2J\", \"round\": \"r32\"}, {\"home\": \"Canada\", \"away\": \"Iran\", \"h\": 1, \"a\": 0, \"pen\": null, \"id\": \"M85\", \"slot\": \"1B vs beste 3e\", \"round\": \"r32\"}, {\"home\": \"Argentini\u00eb\", \"away\": \"Uruguay\", \"h\": 2, \"a\": 1, \"pen\": null, \"id\": \"M86\", \"slot\": \"1J vs 2H\", \"round\": \"r32\"}, {\"home\": \"Portugal\", \"away\": \"Ivoorkust\", \"h\": 2, \"a\": 1, \"pen\": null, \"id\": \"M87\", \"slot\": \"1K vs beste 3e\", \"round\": \"r32\"}, {\"home\": \"Turkije\", \"away\": \"Egypte\", \"h\": 2, \"a\": 1, \"pen\": null, \"id\": \"M88\", \"slot\": \"2D vs 2G\", \"round\": \"r32\"}, {\"home\": \"Duitsland\", \"away\": \"Frankrijk\", \"h\": 1, \"a\": 2, \"pen\": null, \"id\": \"M89\", \"slot\": \"W74 vs W77\", \"round\": \"r16\"}, {\"home\": \"Zwitserland\", \"away\": \"Nederland\", \"h\": 1, \"a\": 2, \"pen\": null, \"id\": \"M90\", \"slot\": \"W73 vs W75\", \"round\": \"r16\"}, {\"home\": \"Brazili\u00eb\", \"away\": \"Noorwegen\", \"h\": 1, \"a\": 2, \"pen\": \"nv\", \"id\": \"M91\", \"slot\": \"W76 vs W78\", \"round\": \"r16\"}, {\"home\": \"Mexico\", \"away\": \"Engeland\", \"h\": 1, \"a\": 2, \"pen\": null, \"id\": \"M92\", \"slot\": \"W79 vs W80\", \"round\": \"r16\"}, {\"home\": \"Kroati\u00eb\", \"away\": \"Spanje\", \"h\": 1, \"a\": 2, \"pen\": null, \"id\": \"M93\", \"slot\": \"W83 vs W84\", \"round\": \"r16\"}, {\"home\": \"VS\", \"away\": \"Belgi\u00eb\", \"h\": 1, \"a\": 2, \"pen\": null, \"id\": \"M94\", \"slot\": \"W81 vs W82\", \"round\": \"r16\"}, {\"home\": \"Argentini\u00eb\", \"away\": \"Turkije\", \"h\": 2, \"a\": 0, \"pen\": null, \"id\": \"M95\", \"slot\": \"W86 vs W88\", \"round\": \"r16\"}, {\"home\": \"Canada\", \"away\": \"Portugal\", \"h\": 1, \"a\": 2, \"pen\": null, \"id\": \"M96\", \"slot\": \"W85 vs W87\", \"round\": \"r16\"}, {\"home\": \"Frankrijk\", \"away\": \"Nederland\", \"h\": 2, \"a\": 1, \"pen\": null, \"id\": \"M97\", \"slot\": \"W89 vs W90\", \"round\": \"quarter\"}, {\"home\": \"Spanje\", \"away\": \"Belgi\u00eb\", \"h\": 2, \"a\": 0, \"pen\": null, \"id\": \"M98\", \"slot\": \"W93 vs W94\", \"round\": \"quarter\"}, {\"home\": \"Noorwegen\", \"away\": \"Engeland\", \"h\": 2, \"a\": 1, \"pen\": \"nv\", \"id\": \"M99\", \"slot\": \"W91 vs W92\", \"round\": \"quarter\"}, {\"home\": \"Argentini\u00eb\", \"away\": \"Portugal\", \"h\": 2, \"a\": 1, \"pen\": null, \"id\": \"M100\", \"slot\": \"W95 vs W96\", \"round\": \"quarter\"}, {\"home\": \"Frankrijk\", \"away\": \"Spanje\", \"h\": 1, \"a\": 2, \"pen\": null, \"id\": \"M101\", \"slot\": \"HF: W97 vs W98\", \"round\": \"semi\"}, {\"home\": \"Noorwegen\", \"away\": \"Argentini\u00eb\", \"h\": 1, \"a\": 2, \"pen\": null, \"id\": \"M102\", \"slot\": \"HF: W99 vs W100\", \"round\": \"semi\"}, {\"home\": \"Frankrijk\", \"away\": \"Noorwegen\", \"h\": 3, \"a\": 1, \"pen\": null, \"id\": \"M103\", \"slot\": \"3e\/4e plaats\", \"round\": \"third\"}, {\"home\": \"Spanje\", \"away\": \"Argentini\u00eb\", \"h\": 2, \"a\": 1, \"pen\": null, \"id\": \"M104\", \"slot\": \"FINALE\", \"round\": \"final\"}], \"copilot\": [{\"home\": \"Zuid-Korea\", \"away\": \"Zwitserland\", \"h\": 1, \"a\": 2, \"pen\": null, \"id\": \"M73\", \"slot\": \"2A vs 2B\", \"round\": \"r32\"}, {\"home\": \"Duitsland\", \"away\": \"Japan\", \"h\": 2, \"a\": 1, \"pen\": null, \"id\": \"M74\", \"slot\": \"1E vs beste 3e\", \"round\": \"r32\"}, {\"home\": \"Nederland\", \"away\": \"Schotland\", \"h\": 2, \"a\": 0, \"pen\": null, \"id\": \"M75\", \"slot\": \"1F vs 2C\", \"round\": \"r32\"}, {\"home\": \"Brazili\u00eb\", \"away\": \"Zweden\", \"h\": 3, \"a\": 1, \"pen\": null, \"id\": \"M76\", \"slot\": \"1C vs 2F\", \"round\": \"r32\"}, {\"home\": \"Frankrijk\", \"away\": \"Marokko\", \"h\": 0, \"a\": 1, \"pen\": null, \"id\": \"M77\", \"slot\": \"1I vs beste 3e\", \"round\": \"r32\"}, {\"home\": \"Ecuador\", \"away\": \"Noorwegen\", \"h\": 1, \"a\": 2, \"pen\": null, \"id\": \"M78\", \"slot\": \"2E vs 2I\", \"round\": \"r32\"}, {\"home\": \"Mexico\", \"away\": \"Senegal\", \"h\": 2, \"a\": 1, \"pen\": null, \"id\": \"M79\", \"slot\": \"1A vs beste 3e\", \"round\": \"r32\"}, {\"home\": \"Engeland\", \"away\": \"Ivoorkust\", \"h\": 2, \"a\": 0, \"pen\": null, \"id\": \"M80\", \"slot\": \"1L vs beste 3e\", \"round\": \"r32\"}, {\"home\": \"VS\", \"away\": \"Algerije\", \"h\": 2, \"a\": 1, \"pen\": null, \"id\": \"M81\", \"slot\": \"1D vs beste 3e\", \"round\": \"r32\"}, {\"home\": \"Belgi\u00eb\", \"away\": \"Tsjechi\u00eb\", \"h\": 3, \"a\": 0, \"pen\": null, \"id\": \"M82\", \"slot\": \"1G vs beste 3e\", \"round\": \"r32\"}, {\"home\": \"Colombia\", \"away\": \"Kroati\u00eb\", \"h\": 1, \"a\": 2, \"pen\": null, \"id\": \"M83\", \"slot\": \"2K vs 2L\", \"round\": \"r32\"}, {\"home\": \"Spanje\", \"away\": \"Oostenrijk\", \"h\": 3, \"a\": 1, \"pen\": null, \"id\": \"M84\", \"slot\": \"1H vs 2J\", \"round\": \"r32\"}, {\"home\": \"Canada\", \"away\": \"Egypte\", \"h\": 2, \"a\": 0, \"pen\": null, \"id\": \"M85\", \"slot\": \"1B vs beste 3e\", \"round\": \"r32\"}, {\"home\": \"Argentini\u00eb\", \"away\": \"Uruguay\", \"h\": 3, \"a\": 0, \"pen\": null, \"id\": \"M86\", \"slot\": \"1J vs 2H\", \"round\": \"r32\"}, {\"home\": \"Portugal\", \"away\": \"Turkije\", \"h\": 2, \"a\": 1, \"pen\": null, \"id\": \"M87\", \"slot\": \"1K vs beste 3e\", \"round\": \"r32\"}, {\"home\": \"Paraguay\", \"away\": \"Iran\", \"h\": 0, \"a\": 1, \"pen\": null, \"id\": \"M88\", \"slot\": \"2D vs 2G\", \"round\": \"r32\"}, {\"home\": \"Duitsland\", \"away\": \"Marokko\", \"h\": 0, \"a\": 1, \"pen\": null, \"id\": \"M89\", \"slot\": \"W74 vs W77\", \"round\": \"r16\"}, {\"home\": \"Zwitserland\", \"away\": \"Nederland\", \"h\": 2, \"a\": 1, \"pen\": null, \"id\": \"M90\", \"slot\": \"W73 vs W75\", \"round\": \"r16\"}, {\"home\": \"Brazili\u00eb\", \"away\": \"Noorwegen\", \"h\": 2, \"a\": 1, \"pen\": null, \"id\": \"M91\", \"slot\": \"W76 vs W78\", \"round\": \"r16\"}, {\"home\": \"Mexico\", \"away\": \"Engeland\", \"h\": 1, \"a\": 2, \"pen\": null, \"id\": \"M92\", \"slot\": \"W79 vs W80\", \"round\": \"r16\"}, {\"home\": \"Kroati\u00eb\", \"away\": \"Spanje\", \"h\": 0, \"a\": 2, \"pen\": null, \"id\": \"M93\", \"slot\": \"W83 vs W84\", \"round\": \"r16\"}, {\"home\": \"VS\", \"away\": \"Belgi\u00eb\", \"h\": 1, \"a\": 2, \"pen\": null, \"id\": \"M94\", \"slot\": \"W81 vs W82\", \"round\": \"r16\"}, {\"home\": \"Argentini\u00eb\", \"away\": \"Iran\", \"h\": 3, \"a\": 0, \"pen\": null, \"id\": \"M95\", \"slot\": \"W86 vs W88\", \"round\": \"r16\"}, {\"home\": \"Canada\", \"away\": \"Portugal\", \"h\": 1, \"a\": 2, \"pen\": null, \"id\": \"M96\", \"slot\": \"W85 vs W87\", \"round\": \"r16\"}, {\"home\": \"Marokko\", \"away\": \"Zwitserland\", \"h\": 1, \"a\": 0, \"pen\": null, \"id\": \"M97\", \"slot\": \"W89 vs W90\", \"round\": \"quarter\"}, {\"home\": \"Spanje\", \"away\": \"Belgi\u00eb\", \"h\": 2, \"a\": 1, \"pen\": null, \"id\": \"M98\", \"slot\": \"W93 vs W94\", \"round\": \"quarter\"}, {\"home\": \"Brazili\u00eb\", \"away\": \"Engeland\", \"h\": 2, \"a\": 1, \"pen\": null, \"id\": \"M99\", \"slot\": \"W91 vs W92\", \"round\": \"quarter\"}, {\"home\": \"Argentini\u00eb\", \"away\": \"Portugal\", \"h\": 2, \"a\": 1, \"pen\": null, \"id\": \"M100\", \"slot\": \"W95 vs W96\", \"round\": \"quarter\"}, {\"home\": \"Marokko\", \"away\": \"Spanje\", \"h\": 1, \"a\": 2, \"pen\": null, \"id\": \"M101\", \"slot\": \"HF: W97 vs W98\", \"round\": \"semi\"}, {\"home\": \"Brazili\u00eb\", \"away\": \"Argentini\u00eb\", \"h\": 1, \"a\": 2, \"pen\": null, \"id\": \"M102\", \"slot\": \"HF: W99 vs W100\", \"round\": \"semi\"}, {\"home\": \"Marokko\", \"away\": \"Brazili\u00eb\", \"h\": 0, \"a\": 2, \"pen\": null, \"id\": \"M103\", \"slot\": \"3e\/4e plaats\", \"round\": \"third\"}, {\"home\": \"Spanje\", \"away\": \"Argentini\u00eb\", \"h\": 1, \"a\": 2, \"pen\": null, \"id\": \"M104\", \"slot\": \"FINALE\", \"round\": \"final\"}], \"gemini\": [{\"home\": \"Tsjechi\u00eb\", \"away\": \"Zwitserland\", \"h\": 1, \"a\": 2, \"pen\": null, \"id\": \"M73\", \"slot\": \"2A vs 2B\", \"round\": \"r32\"}, {\"home\": \"Duitsland\", \"away\": \"Schotland\", \"h\": 3, \"a\": 0, \"pen\": null, \"id\": \"M74\", \"slot\": \"1E vs beste 3e\", \"round\": \"r32\"}, {\"home\": \"Nederland\", \"away\": \"Marokko\", \"h\": 2, \"a\": 1, \"pen\": null, \"id\": \"M75\", \"slot\": \"1F vs 2C\", \"round\": \"r32\"}, {\"home\": \"Brazili\u00eb\", \"away\": \"Japan\", \"h\": 2, \"a\": 0, \"pen\": null, \"id\": \"M76\", \"slot\": \"1C vs 2F\", \"round\": \"r32\"}, {\"home\": \"Frankrijk\", \"away\": \"Zweden\", \"h\": 3, \"a\": 1, \"pen\": null, \"id\": \"M77\", \"slot\": \"1I vs beste 3e\", \"round\": \"r32\"}, {\"home\": \"Ivoorkust\", \"away\": \"Senegal\", \"h\": 1, \"a\": 2, \"pen\": null, \"id\": \"M78\", \"slot\": \"2E vs 2I\", \"round\": \"r32\"}, {\"home\": \"Mexico\", \"away\": \"Noorwegen\", \"h\": 2, \"a\": 1, \"pen\": \"nv\", \"id\": \"M79\", \"slot\": \"1A vs beste 3e\", \"round\": \"r32\"}, {\"home\": \"Engeland\", \"away\": \"Ecuador\", \"h\": 2, \"a\": 0, \"pen\": null, \"id\": \"M80\", \"slot\": \"1L vs beste 3e\", \"round\": \"r32\"}, {\"home\": \"VS\", \"away\": \"Bosni\u00eb\", \"h\": 2, \"a\": 0, \"pen\": null, \"id\": \"M81\", \"slot\": \"1D vs beste 3e\", \"round\": \"r32\"}, {\"home\": \"Belgi\u00eb\", \"away\": \"Zuid-Korea\", \"h\": 1, \"a\": 0, \"pen\": null, \"id\": \"M82\", \"slot\": \"1G vs beste 3e\", \"round\": \"r32\"}, {\"home\": \"Colombia\", \"away\": \"Kroati\u00eb\", \"h\": 1, \"a\": 2, \"pen\": null, \"id\": \"M83\", \"slot\": \"2K vs 2L\", \"round\": \"r32\"}, {\"home\": \"Spanje\", \"away\": \"Oostenrijk\", \"h\": 2, \"a\": 1, \"pen\": null, \"id\": \"M84\", \"slot\": \"1H vs 2J\", \"round\": \"r32\"}, {\"home\": \"Canada\", \"away\": \"Iran\", \"h\": 1, \"a\": 0, \"pen\": null, \"id\": \"M85\", \"slot\": \"1B vs beste 3e\", \"round\": \"r32\"}, {\"home\": \"Argentini\u00eb\", \"away\": \"Uruguay\", \"h\": 1, \"a\": 0, \"pen\": null, \"id\": \"M86\", \"slot\": \"1J vs 2H\", \"round\": \"r32\"}, {\"home\": \"Portugal\", \"away\": \"Paraguay\", \"h\": 3, \"a\": 1, \"pen\": null, \"id\": \"M87\", \"slot\": \"1K vs beste 3e\", \"round\": \"r32\"}, {\"home\": \"Turkije\", \"away\": \"Egypte\", \"h\": 2, \"a\": 1, \"pen\": null, \"id\": \"M88\", \"slot\": \"2D vs 2G\", \"round\": \"r32\"}, {\"home\": \"Duitsland\", \"away\": \"Frankrijk\", \"h\": 1, \"a\": 2, \"pen\": null, \"id\": \"M89\", \"slot\": \"W74 vs W77\", \"round\": \"r16\"}, {\"home\": \"Zwitserland\", \"away\": \"Nederland\", \"h\": 0, \"a\": 1, \"pen\": \"nv\", \"id\": \"M90\", \"slot\": \"W73 vs W75\", \"round\": \"r16\"}, {\"home\": \"Brazili\u00eb\", \"away\": \"Senegal\", \"h\": 3, \"a\": 1, \"pen\": null, \"id\": \"M91\", \"slot\": \"W76 vs W78\", \"round\": \"r16\"}, {\"home\": \"Mexico\", \"away\": \"Engeland\", \"h\": 1, \"a\": 2, \"pen\": null, \"id\": \"M92\", \"slot\": \"W79 vs W80\", \"round\": \"r16\"}, {\"home\": \"Kroati\u00eb\", \"away\": \"Spanje\", \"h\": 0, \"a\": 2, \"pen\": null, \"id\": \"M93\", \"slot\": \"W83 vs W84\", \"round\": \"r16\"}, {\"home\": \"VS\", \"away\": \"Belgi\u00eb\", \"h\": 2, \"a\": 1, \"pen\": null, \"id\": \"M94\", \"slot\": \"W81 vs W82\", \"round\": \"r16\"}, {\"home\": \"Argentini\u00eb\", \"away\": \"Turkije\", \"h\": 3, \"a\": 0, \"pen\": null, \"id\": \"M95\", \"slot\": \"W86 vs W88\", \"round\": \"r16\"}, {\"home\": \"Canada\", \"away\": \"Portugal\", \"h\": 1, \"a\": 2, \"pen\": null, \"id\": \"M96\", \"slot\": \"W85 vs W87\", \"round\": \"r16\"}, {\"home\": \"Frankrijk\", \"away\": \"Nederland\", \"h\": 2, \"a\": 0, \"pen\": null, \"id\": \"M97\", \"slot\": \"W89 vs W90\", \"round\": \"quarter\"}, {\"home\": \"Spanje\", \"away\": \"VS\", \"h\": 3, \"a\": 1, \"pen\": null, \"id\": \"M98\", \"slot\": \"W93 vs W94\", \"round\": \"quarter\"}, {\"home\": \"Brazili\u00eb\", \"away\": \"Engeland\", \"h\": 2, \"a\": 1, \"pen\": \"nv\", \"id\": \"M99\", \"slot\": \"W91 vs W92\", \"round\": \"quarter\"}, {\"home\": \"Argentini\u00eb\", \"away\": \"Portugal\", \"h\": 1, \"a\": 0, \"pen\": null, \"id\": \"M100\", \"slot\": \"W95 vs W96\", \"round\": \"quarter\"}, {\"home\": \"Frankrijk\", \"away\": \"Spanje\", \"h\": 2, \"a\": 3, \"pen\": \"nv\", \"id\": \"M101\", \"slot\": \"HF: W97 vs W98\", \"round\": \"semi\"}, {\"home\": \"Brazili\u00eb\", \"away\": \"Argentini\u00eb\", \"h\": 1, \"a\": 0, \"pen\": null, \"id\": \"M102\", \"slot\": \"HF: W99 vs W100\", \"round\": \"semi\"}, {\"home\": \"Frankrijk\", \"away\": \"Argentini\u00eb\", \"h\": 2, \"a\": 1, \"pen\": null, \"id\": \"M103\", \"slot\": \"3e\/4e plaats\", \"round\": \"third\"}, {\"home\": \"Brazili\u00eb\", \"away\": \"Spanje\", \"h\": 2, \"a\": 1, \"pen\": null, \"id\": \"M104\", \"slot\": \"FINALE\", \"round\": \"final\"}], \"perplexity\": [{\"home\": \"Zuid-Korea\", \"away\": \"Canada\", \"h\": 1, \"a\": 2, \"pen\": null, \"id\": \"M73\", \"slot\": \"2A vs 2B\", \"round\": \"r32\"}, {\"home\": \"Duitsland\", \"away\": \"Paraguay\", \"h\": 2, \"a\": 0, \"pen\": null, \"id\": \"M74\", \"slot\": \"1E vs beste 3e\", \"round\": \"r32\"}, {\"home\": \"Nederland\", \"away\": \"Marokko\", \"h\": 2, \"a\": 1, \"pen\": null, \"id\": \"M75\", \"slot\": \"1F vs 2C\", \"round\": \"r32\"}, {\"home\": \"Brazili\u00eb\", \"away\": \"Japan\", \"h\": 2, \"a\": 1, \"pen\": null, \"id\": \"M76\", \"slot\": \"1C vs 2F\", \"round\": \"r32\"}, {\"home\": \"Frankrijk\", \"away\": \"Zweden\", \"h\": 2, \"a\": 1, \"pen\": null, \"id\": \"M77\", \"slot\": \"1I vs beste 3e\", \"round\": \"r32\"}, {\"home\": \"Ivoorkust\", \"away\": \"Noorwegen\", \"h\": 1, \"a\": 0, \"pen\": null, \"id\": \"M78\", \"slot\": \"2E vs 2I\", \"round\": \"r32\"}, {\"home\": \"Mexico\", \"away\": \"Schotland\", \"h\": 2, \"a\": 0, \"pen\": null, \"id\": \"M79\", \"slot\": \"1A vs beste 3e\", \"round\": \"r32\"}, {\"home\": \"Engeland\", \"away\": \"DR Congo\", \"h\": 2, \"a\": 0, \"pen\": null, \"id\": \"M80\", \"slot\": \"1L vs beste 3e\", \"round\": \"r32\"}, {\"home\": \"VS\", \"away\": \"Bosni\u00eb\", \"h\": 2, \"a\": 1, \"pen\": null, \"id\": \"M81\", \"slot\": \"1D vs beste 3e\", \"round\": \"r32\"}, {\"home\": \"Belgi\u00eb\", \"away\": \"Senegal\", \"h\": 2, \"a\": 1, \"pen\": null, \"id\": \"M82\", \"slot\": \"1G vs beste 3e\", \"round\": \"r32\"}, {\"home\": \"Portugal\", \"away\": \"Kroati\u00eb\", \"h\": 2, \"a\": 1, \"pen\": null, \"id\": \"M83\", \"slot\": \"2K vs 2L\", \"round\": \"r32\"}, {\"home\": \"Spanje\", \"away\": \"Oostenrijk\", \"h\": 2, \"a\": 0, \"pen\": null, \"id\": \"M84\", \"slot\": \"1H vs 2J\", \"round\": \"r32\"}, {\"home\": \"Zwitserland\", \"away\": \"Nieuw-Zeeland\", \"h\": 2, \"a\": 0, \"pen\": null, \"id\": \"M85\", \"slot\": \"1B vs beste 3e\", \"round\": \"r32\"}, {\"home\": \"Argentini\u00eb\", \"away\": \"Uruguay\", \"h\": 2, \"a\": 1, \"pen\": null, \"id\": \"M86\", \"slot\": \"1J vs 2H\", \"round\": \"r32\"}, {\"home\": \"Colombia\", \"away\": \"Ecuador\", \"h\": 2, \"a\": 1, \"pen\": null, \"id\": \"M87\", \"slot\": \"1K vs beste 3e\", \"round\": \"r32\"}, {\"home\": \"Turkije\", \"away\": \"Egypte\", \"h\": 2, \"a\": 1, \"pen\": null, \"id\": \"M88\", \"slot\": \"2D vs 2G\", \"round\": \"r32\"}, {\"home\": \"Duitsland\", \"away\": \"Frankrijk\", \"h\": 1, \"a\": 2, \"pen\": null, \"id\": \"M89\", \"slot\": \"W74 vs W77\", \"round\": \"r16\"}, {\"home\": \"Canada\", \"away\": \"Nederland\", \"h\": 0, \"a\": 2, \"pen\": null, \"id\": \"M90\", \"slot\": \"W73 vs W75\", \"round\": \"r16\"}, {\"home\": \"Brazili\u00eb\", \"away\": \"Ivoorkust\", \"h\": 2, \"a\": 1, \"pen\": null, \"id\": \"M91\", \"slot\": \"W76 vs W78\", \"round\": \"r16\"}, {\"home\": \"Mexico\", \"away\": \"Engeland\", \"h\": 1, \"a\": 2, \"pen\": null, \"id\": \"M92\", \"slot\": \"W79 vs W80\", \"round\": \"r16\"}, {\"home\": \"Portugal\", \"away\": \"Spanje\", \"h\": 1, \"a\": 2, \"pen\": null, \"id\": \"M93\", \"slot\": \"W83 vs W84\", \"round\": \"r16\"}, {\"home\": \"VS\", \"away\": \"Belgi\u00eb\", \"h\": 0, \"a\": 1, \"pen\": null, \"id\": \"M94\", \"slot\": \"W81 vs W82\", \"round\": \"r16\"}, {\"home\": \"Argentini\u00eb\", \"away\": \"Turkije\", \"h\": 3, \"a\": 1, \"pen\": null, \"id\": \"M95\", \"slot\": \"W86 vs W88\", \"round\": \"r16\"}, {\"home\": \"Zwitserland\", \"away\": \"Colombia\", \"h\": 1, \"a\": 2, \"pen\": null, \"id\": \"M96\", \"slot\": \"W85 vs W87\", \"round\": \"r16\"}, {\"home\": \"Frankrijk\", \"away\": \"Nederland\", \"h\": 2, \"a\": 1, \"pen\": null, \"id\": \"M97\", \"slot\": \"W89 vs W90\", \"round\": \"quarter\"}, {\"home\": \"Spanje\", \"away\": \"Belgi\u00eb\", \"h\": 2, \"a\": 0, \"pen\": null, \"id\": \"M98\", \"slot\": \"W93 vs W94\", \"round\": \"quarter\"}, {\"home\": \"Brazili\u00eb\", \"away\": \"Engeland\", \"h\": 2, \"a\": 1, \"pen\": null, \"id\": \"M99\", \"slot\": \"W91 vs W92\", \"round\": \"quarter\"}, {\"home\": \"Argentini\u00eb\", \"away\": \"Colombia\", \"h\": 2, \"a\": 1, \"pen\": null, \"id\": \"M100\", \"slot\": \"W95 vs W96\", \"round\": \"quarter\"}, {\"home\": \"Frankrijk\", \"away\": \"Spanje\", \"h\": 1, \"a\": 2, \"pen\": null, \"id\": \"M101\", \"slot\": \"HF: W97 vs W98\", \"round\": \"semi\"}, {\"home\": \"Brazili\u00eb\", \"away\": \"Argentini\u00eb\", \"h\": 1, \"a\": 2, \"pen\": null, \"id\": \"M102\", \"slot\": \"HF: W99 vs W100\", \"round\": \"semi\"}, {\"home\": \"Frankrijk\", \"away\": \"Brazili\u00eb\", \"h\": 2, \"a\": 1, \"pen\": null, \"id\": \"M103\", \"slot\": \"3e\/4e plaats\", \"round\": \"third\"}, {\"home\": \"Spanje\", \"away\": \"Argentini\u00eb\", \"h\": 2, \"a\": 1, \"pen\": null, \"id\": \"M104\", \"slot\": \"FINALE\", \"round\": \"final\"}]};\n    var DARK_REACH = {\"claude\": \"Halve finale\", \"chatgpt\": \"Halve finale\", \"copilot\": \"Halve finale\", \"gemini\": \"Kwartfinale\", \"perplexity\": \"Kwartfinale\"};\n\n    \/* ===== scoring (Toto): exact=4, juist doelsaldo=2, juiste winnaar=1 ===== *\/\n    function sign(dd) { return dd > 0 ? 1 : dd < 0 ? -1 : 0; }\n    \/* Scorito-puntentelling \u2014 IN SYNC met wk-scoring.js (de geteste, canonieke module).\n       Punten = basiswaarde \u00d7 fase-multiplier (multiplier = fase-index 1..6).\n       Pas deze constanten centraal aan zodra de offici\u00eble spelregels geverifieerd zijn. *\/\n    var SCORING = {\n      phase_multiplier: { group: 1, r32: 2, r16: 3, quarter: 4, semi: 5, final: 6 },\n      match_base: { toto: 30, exact: 45 },\n      scorer_base_per_goal: { gk_def: 32, mid: 16, fwd: 8 },\n      country_points: {\n        advances_from_group: 50, correct_group_position: 75,\n        reaches_quarter: 30, reaches_semi: 60, reaches_final: 120, correct_champion: 250\n      }\n    };\n    \/* kwaliteit: 2 = exact, 1 = toto (juiste uitkomst), 0 = mis *\/\n    function quality(pred, ah, aa) {\n      if (pred.h === ah ? pred.a === aa : false) return 2;\n      if (sign(pred.h - pred.a) === sign(ah - aa)) return 1;\n      return 0;\n    }\n    function matchPoints(round, pred, ah, aa) {\n      var q = quality(pred, ah, aa); if (q === 0) return 0;\n      var mult = SCORING.phase_multiplier[round]; if (!mult) return 0;\n      return (q === 2 ? SCORING.match_base.exact : SCORING.match_base.toto) * mult;\n    }\n    function scoreTopscorer(round, position, goalsScored) {\n      var mult = SCORING.phase_multiplier[round]; if (!mult) return 0;\n      var base = SCORING.scorer_base_per_goal[position]; if (base == null) return 0;\n      return base * (goalsScored || 0) * mult;\n    }\n    function scorePred(pred, ah, aa) { return matchPoints('group', pred, ah, aa); }\n\n    \/* knock-outuitslagen per officieel matchnummer (M73..M104), gevuld door applyResults *\/\n    var KO_RESULTS = {};\n    function roundForNumber(n) {\n      if (n <= 72) return 'group';\n      if (n <= 88) return 'r32';\n      if (n <= 96) return 'r16';\n      if (n <= 100) return 'quarter';\n      if (n <= 102) return 'semi';\n      if (n === 103) return 'third';\n      if (n === 104) return 'final';\n      return null;\n    }\n    var MATCH_BY_ID = {}; MATCHES.forEach(function (m) { MATCH_BY_ID[m.id] = m; });\n    \/* map: { \"1\": {h,a,finished}, \"73\": {h,a,finished}, ... } afkomstig van de results-feed *\/\n    function applyResults(map) {\n      if (!map) return;\n      Object.keys(map).forEach(function (numStr) {\n        var n = parseInt(numStr, 10); var r = map[numStr];\n        if (r ? r.finished !== true : true) return;            \/* alleen afgeronde wedstrijden *\/\n        if (r.h == null ? true : r.a == null) return;\n        if (n <= 72) {\n          var m = MATCH_BY_ID['M' + n];\n          if (m) { m.played = true; m.ah = r.h; m.aa = r.a; }\n        } else {\n          KO_RESULTS['M' + n] = { h: r.h, a: r.a, n: n };\n        }\n      });\n    }\n\n    function computeLeaderboard() {\n      var rows = AIS.map(function (ai) { return { ai: ai, points: 0, exact: 0, toto: 0, outcome: 0, played: 0, perMd: { 1:{c:0,n:0}, 2:{c:0,n:0}, 3:{c:0,n:0} } }; });\n      var byId = {}; rows.forEach(function (r) { byId[r.ai.id] = r; });\n      MATCHES.filter(function (m) { return m.played; }).forEach(function (m) {\n        AIS.forEach(function (ai) {\n          var row = byId[ai.id]; var p = m.preds[ai.id]; var q = quality(p, m.ah, m.aa);\n          row.points += matchPoints('group', p, m.ah, m.aa); row.played++;\n          if (q === 2) row.exact++;\n          if (q === 1) row.toto++;\n          if (q >= 1) row.outcome++;\n          var md = row.perMd[m.md]; if (md) { md.n++; if (q >= 1) md.c++; }\n        });\n      });\n      \/* knock-out: scoor per bracket-slot (matchnummer) op de voorspelde score van elk model *\/\n      Object.keys(KO_RESULTS).forEach(function (koId) {\n        var real = KO_RESULTS[koId]; var rnd = roundForNumber(real.n); if (!rnd) return;\n        AIS.forEach(function (ai) {\n          var preds = KO[ai.id] || []; var pe = null;\n          for (var i = 0; i < preds.length; i++) { if (preds[i].id === koId) { pe = preds[i]; break; } }\n          if (!pe) return;\n          var row = byId[ai.id]; var pred = { h: pe.h, a: pe.a }; var q = quality(pred, real.h, real.a);\n          row.points += matchPoints(rnd, pred, real.h, real.a); row.played++;\n          if (q === 2) row.exact++;\n          if (q === 1) row.toto++;\n          if (q >= 1) row.outcome++;\n        });\n      });\n      rows.forEach(function (r) { r.acc = r.played ? Math.round((r.outcome \/ r.played) * 100) : 0; r.exactPct = r.played ? Math.round((r.exact \/ r.played) * 100) : 0; });\n      rows.sort(function (a, b) { return b.points - a.points || b.exact - a.exact || b.acc - a.acc; });\n      rows.forEach(function (r, i) { r.rank = i + 1; });\n      return rows;\n    }\n\n    function computeGroup(g) {\n      var table = {}; byGroup[g].forEach(function (t) { table[t.code] = { team: t, pld:0, w:0, d:0, l:0, gf:0, ga:0, pts:0 }; });\n      var pm = MATCHES.filter(function (m) { return m.group === g ? m.played : false; });\n      pm.forEach(function (m) {\n        var H = table[m.home.code], A2 = table[m.away.code];\n        H.pld++; A2.pld++; H.gf += m.ah; H.ga += m.aa; A2.gf += m.aa; A2.ga += m.ah;\n        if (m.ah > m.aa) { H.w++; A2.l++; H.pts += 3; }\n        else if (m.ah < m.aa) { A2.w++; H.l++; A2.pts += 3; }\n        else { H.d++; A2.d++; H.pts++; A2.pts++; }\n      });\n      var arr = Object.keys(table).map(function (k) { return table[k]; });\n      arr.forEach(function (r) { r.gd = r.gf - r.ga; });\n      var ord = GROUP_PRED[g];\n      var predicted = pm.length === 0;\n      if (predicted) { arr.sort(function (a, b) { return ord.indexOf(a.team.code) - ord.indexOf(b.team.code); }); }\n      else { arr.sort(function (a, b) { return b.pts - a.pts || b.gd - a.gd || b.gf - a.gf || (ord.indexOf(a.team.code) - ord.indexOf(b.team.code)); }); }\n      arr.forEach(function (r, i) { r.pos = i + 1; });\n      arr.predicted = predicted;\n      return arr;\n    }\n\n    var PICKS = {\"claude\": {\"champion\": \"Spanje\", \"runnerUp\": \"Argentini\u00eb\", \"third\": \"Frankrijk\", \"darkHorse\": \"Marokko\", \"flop\": \"Brazili\u00eb\", \"topScorer\": \"Kylian Mbapp\u00e9\", \"quote\": \"Spanje wint met balbezit en controle. Let op Marokko als verrassing; Brazili\u00eb stelt teleur.\"}, \"chatgpt\": {\"champion\": \"Spanje\", \"runnerUp\": \"Argentini\u00eb\", \"third\": \"Frankrijk\", \"darkHorse\": \"Noorwegen\", \"flop\": \"Brazili\u00eb\", \"topScorer\": \"Erling Haaland\", \"quote\": \"Spanje is de compleetste ploeg. Haaland en Noorwegen verrassen, Brazili\u00eb valt vroeg af.\"}, \"copilot\": {\"champion\": \"Argentini\u00eb\", \"runnerUp\": \"Spanje\", \"third\": \"Brazili\u00eb\", \"darkHorse\": \"Marokko\", \"flop\": \"Nederland\", \"topScorer\": \"Lionel Messi\", \"quote\": \"De ervaring van Argentini\u00eb beslist de knock-outs. Marokko stunt, Nederland stelt teleur.\"}, \"gemini\": {\"champion\": \"Brazili\u00eb\", \"runnerUp\": \"Spanje\", \"third\": \"Frankrijk\", \"darkHorse\": \"VS\", \"flop\": \"Duitsland\", \"topScorer\": \"Kylian Mbapp\u00e9\", \"quote\": \"Braziliaanse aanvalskracht pakt de titel. De VS verrast, Duitsland flopt.\"}, \"perplexity\": {\"champion\": \"Spanje\", \"runnerUp\": \"Argentini\u00eb\", \"third\": \"Frankrijk\", \"darkHorse\": \"Colombia\", \"flop\": \"Duitsland\", \"topScorer\": \"Kylian Mbapp\u00e9\", \"quote\": \"Op vorm en data wint Spanje. Colombia is de dark horse, Duitsland stelt teleur.\"}};\n\n    function disagreements(limit) {\n      var up = MATCHES.filter(function (m) { return !m.played; });\n      var scored = up.map(function (m) {\n        var outs = AIS.map(function (ai) { return sign(m.preds[ai.id].h - m.preds[ai.id].a); });\n        var uniq = new Set(outs).size;\n        var spread = uniq + (new Set(AIS.map(function (ai) { return m.preds[ai.id].h + \"x\" + m.preds[ai.id].a; })).size) \/ 10;\n        return { m: m, uniq: uniq, spread: spread };\n      });\n      scored.sort(function (a, b) { return b.spread - a.spread; });\n      return scored.slice(0, limit);\n    }\n\n    \/* gewaagdste: wedstrijden waar precies 1 model tegen de andere 4 ingaat *\/\n    function boldest(limit) {\n      var out = [];\n      MATCHES.forEach(function (m) {\n        var per = AIS.map(function (ai) { var p = m.preds[ai.id]; return { ai: ai, o: sign(p.h - p.a), p: p }; });\n        var counts = {}; per.forEach(function (x) { counts[x.o] = (counts[x.o] || 0) + 1; });\n        var loners = per.filter(function (x) { return counts[x.o] === 1; });\n        var majO = 0, majC = 0; Object.keys(counts).forEach(function (k) { if (counts[k] > majC) { majC = counts[k]; majO = parseInt(k, 10); } });\n        if (loners.length === 1 ? majC >= 4 : false) { out.push({ m: m, ai: loners[0].ai, p: loners[0].p, lonerO: loners[0].o, majO: majO }); }\n      });\n      return out.slice(0, limit);\n    }\n\n    return {\n      AIS: AIS, TEAMS: TEAMS, TEAM: TEAM, GROUPS: GROUPS, byGroup: byGroup, MATCHES: MATCHES, GROUP_PRED: GROUP_PRED,\n      computeLeaderboard: computeLeaderboard, computeGroup: computeGroup, scorePred: scorePred, sign: sign,\n      PICKS: PICKS, disagreements: disagreements, boldest: boldest,\n      TOPSCORERS: TOPSCORERS, KO: KO, DARK_REACH: DARK_REACH, SCORING: SCORING, quality: quality, matchPoints: matchPoints, scoreTopscorer: scoreTopscorer,\n      applyResults: applyResults, roundForNumber: roundForNumber,\n      KICKOFF: new Date('2026-06-11T17:00:00'), FINAL: new Date('2026-07-19T17:00:00')\n    };\n  })();\n\n  \/* ===============================================================\n     2. MINI-DOM HELPERS  (hyperscript, HTML + SVG)\n     =============================================================== *\/\n  var SVGNS = 'http:\/\/www.w3.org\/2000\/svg';\n  var UNITLESS = { opacity: 1, fontWeight: 1, zIndex: 1, lineHeight: 1, flex: 1, flexGrow: 1, flexShrink: 1, order: 1, zoom: 1 };\n\n  function setStyle(el, style) {\n    if (style == null) return;\n    if (typeof style === 'string') { el.style.cssText = style; return; }\n    for (var k in style) {\n      if (!Object.prototype.hasOwnProperty.call(style, k)) continue;\n      var v = style[k];\n      if (v == null) continue;\n      if (typeof v === 'number' ? !UNITLESS[k] : false) v = v + 'px';\n      el.style[k] = v;\n    }\n  }\n\n  function applyProps(el, props, isSvg) {\n    if (!props) return;\n    for (var k in props) {\n      if (!Object.prototype.hasOwnProperty.call(props, k)) continue;\n      var v = props[k];\n      if (v == null || v === false) continue;\n      if (k === 'style') { setStyle(el, v); }\n      else if (k === 'className' || k === 'class') { isSvg ? el.setAttribute('class', v) : (el.className = v); }\n      else if (k === 'html') { el.innerHTML = v; }\n      else if (k.slice(0, 2) === 'on' ? typeof v === 'function' : false) { el.addEventListener(k.slice(2).toLowerCase(), v); }\n      else { el.setAttribute(k, v); }\n    }\n  }\n\n  function appendKids(el, kids) {\n    for (var i = 0; i < kids.length; i++) {\n      var c = kids[i];\n      if (c == null || c === false || c === true) continue;\n      if (Array.isArray(c)) { appendKids(el, c); continue; }\n      if (typeof c === 'string' || typeof c === 'number') { el.appendChild(document.createTextNode(String(c))); continue; }\n      el.appendChild(c);\n    }\n  }\n\n  function h(tag, props) {\n    var el = document.createElement(tag);\n    applyProps(el, props, false);\n    appendKids(el, Array.prototype.slice.call(arguments, 2));\n    return el;\n  }\n  function s(tag, props) {\n    var el = document.createElementNS(SVGNS, tag);\n    applyProps(el, props, true);\n    appendKids(el, Array.prototype.slice.call(arguments, 2));\n    return el;\n  }\n\n  \/* runtime opties (gezet door mount) *\/\n  var OPT = { aiColors: true };\n  function aiColor(ai) { return OPT.aiColors !== false ? ai.color : 'var(--rs-fg-muted)'; }\n\n  \/* ===============================================================\n     3. GEDEELDE COMPONENTEN\n     =============================================================== *\/\n  function AIGlyph(type, size, color) {\n    size = size || 16; color = color || '#fff';\n    function base(sw) {\n      return { width: size, height: size, fill: 'none', stroke: color, 'stroke-width': sw || 2,\n        'stroke-linecap': 'round', 'stroke-linejoin': 'round', viewBox: '0 0 24 24' };\n    }\n    switch (type) {\n      case 'node':\n        return s('svg', base(2),\n          s('path', { d: 'M12 3l7 4v10l-7 4-7-4V7z' }),\n          s('circle', { cx: 12, cy: 12, r: 2.4, fill: color, stroke: 'none' }),\n          s('path', { d: 'M12 9.6V7M14 13.2l2.6 1.5M10 13.2l-2.6 1.5' }));\n      case 'burst':\n        return s('svg', base(2.1),\n          s('path', { d: 'M12 3v18M3 12h18M5.6 5.6l12.8 12.8M18.4 5.6L5.6 18.4' }));\n      case 'spark':\n        return s('svg', { width: size, height: size, viewBox: '0 0 24 24', fill: color },\n          s('path', { d: 'M12 2c.5 4.4 2.4 6.3 6.8 6.8C14.4 9.3 12.5 11.2 12 15.6 11.5 11.2 9.6 9.3 5.2 8.8 9.6 8.3 11.5 6.4 12 2z' }),\n          s('path', { d: 'M17.5 14c.25 2.2 1.2 3.15 3.4 3.4-2.2.25-3.15 1.2-3.4 3.4-.25-2.2-1.2-3.15-3.4-3.4 2.2-.25 3.15-1.2 3.4-3.4z', opacity: '0.85' }));\n      case 'loop':\n        return s('svg', base(2.1),\n          s('path', { d: 'M8.5 8.5c-2 0-3.5 1.6-3.5 3.5s1.5 3.5 3.5 3.5c2.2 0 3.5-2.4 7-2.4 2 0 3.5-1.6 3.5-3.5S18.5 8.5 16.5 8.5c-3.5 0-4.8 2.4-7 2.4' }));\n      case 'ring':\n        return s('svg', base(2),\n          s('circle', { cx: 12, cy: 12, r: 9 }),\n          s('circle', { cx: 12, cy: 12, r: 4.6 }),\n          s('circle', { cx: 12, cy: 12, r: 1, fill: color, stroke: 'none' }));\n      default:\n        return s('svg', base(2));\n    }\n  }\n\n  function AIBadge(ai, size) {\n    size = size || 32;\n    var useColor = OPT.aiColors !== false;\n    var bg = useColor ? ai.color : 'var(--rs-bg-secondary)';\n    var fg = useColor ? '#fff' : 'var(--rs-fg)';\n    return h('span', { className: 'ai-badge', title: ai.name,\n      style: { width: size, height: size, background: bg, boxShadow: useColor ? '0 2px 10px rgba(' + ai.glow + ',0.45)' : 'none' } },\n      AIGlyph(ai.glyph, size * 0.56, fg));\n  }\n\n  function AIChip(ai, size, showMaker, badgeOnly) {\n    size = size || 28;\n    var useColor = OPT.aiColors !== false;\n    return h('span', { className: 'ai-chip' },\n      AIBadge(ai, size),\n      badgeOnly ? null : h('span', { style: { display: 'flex', flexDirection: 'column', lineHeight: 1.15 } },\n        h('span', { className: 'nm', style: useColor ? { color: ai.color } : null }, ai.name),\n        showMaker ? h('span', { className: 'mk' }, ai.maker) : null));\n  }\n\n  function FlagTeam(team, away, size, bold) {\n    size = size || 22;\n    return h('span', { className: 'fx-team' + (away ? ' away' : ''), style: bold ? { fontWeight: 700 } : null },\n      away ? h('span', { style: { fontWeight: 'inherit' } }, team.name) : null,\n      h('span', { className: 'fx-flag', style: { fontSize: size } }, team.flag),\n      away ? null : h('span', { style: { fontWeight: 'inherit' } }, team.name));\n  }\n\n  \/* ===============================================================\n     4. SCHERM 1 \u2014 RANGLIJST\n     =============================================================== *\/\n  function MedalRank(rank) {\n    var m = { 1: '\ud83e\udd47', 2: '\ud83e\udd48', 3: '\ud83e\udd49' }[rank];\n    return h('span', { className: 'rkcell' }, m ? h('span', { className: 'medal' }, m) : String(rank));\n  }\n\n  function Leaderboard(rows) {\n    var PICKS = WK.PICKS;\n    var body = rows.map(function (r) {\n      var ai = r.ai;\n      var champ = PICKS[ai.id].champion;\n      var t = WK.TEAM[champ];\n      return h('tr', { className: r.rank === 1 ? 'leader' : '' },\n        h('td', null, MedalRank(r.rank)),\n        h('td', { className: 'l' }, AIChip(ai, 34, true)),\n        h('td', null, h('span', { className: 'ptsbig', style: { color: aiColor(ai) } }, r.points)),\n        h('td', { className: 'hide-sm' }, h('b', null, r.exact), h('span', { className: 'muted', style: { fontSize: 12 } }, r.played ? '\/' + r.played : '')),\n        h('td', { className: 'hide-sm muted' }, r.toto),\n        h('td', null, h('span', { style: { display: 'inline-flex', alignItems: 'center' } },\n          h('b', { style: { fontFamily: 'var(--rs-font-heading)', fontSize: 15, minWidth: 34, textAlign: 'right' } }, r.acc + '%'),\n          h('span', { className: 'accbar' }, h('i', { style: { width: r.acc + '%', background: aiColor(ai) } })))),\n        h('td', { className: 'l hide-sm' }, h('span', { style: { display: 'inline-flex', alignItems: 'center', gap: 7, fontSize: 13.5, fontWeight: 600 } },\n          h('span', { style: { fontSize: 17 } }, t ? t.flag : ''), champ)));\n    });\n    return h('div', { className: 'card', style: { overflow: 'hidden' } },\n      h('table', { className: 'lb' },\n        h('thead', null, h('tr', null,\n          h('th', null, '#'),\n          h('th', { className: 'l' }, 'Model'),\n          h('th', null, 'Punten'),\n          h('th', { className: 'hide-sm' }, 'Exact'),\n          h('th', { className: 'hide-sm' }, 'Toto'),\n          h('th', null, 'Nauwkeurigheid'),\n          h('th', { className: 'l hide-sm' }, 'Titelkandidaat'))),\n        h('tbody', null, body)));\n  }\n\n  function TrendChart() {\n    var MATCHES = WK.MATCHES, AIS = WK.AIS, scorePred = WK.scorePred;\n    var played = MATCHES.filter(function (m) { return m.played; });\n    var W = 920, H = 260, padL = 40, padR = 16, padT = 18, padB = 30;\n    var n = played.length;\n    if (n < 2) {\n      return h('div', { className: 'card chart-card' },\n        h('div', { className: 'subhead', style: { margin: '0 0 6px' } }, 'Nauwkeurigheid door het toernooi heen', h('span', { className: 'ln' })),\n        h('p', { className: 'muted', style: { fontSize: 13.5, margin: '6px 0 2px' } }, 'Zodra de eerste wedstrijden gespeeld zijn, verschijnt hier de doorlopende nauwkeurigheid per model.'));\n    }\n    var x = function (i) { return padL + (i \/ (n - 1)) * (W - padL - padR); };\n    var y = function (v) { return padT + (1 - v \/ 100) * (H - padT - padB); };\n\n    var series = AIS.map(function (ai) {\n      var correct = 0; var pts = [];\n      played.forEach(function (m, i) {\n        var sc = scorePred(m.preds[ai.id], m.ah, m.aa);\n        if (sc >= 1) correct++;\n        pts.push((correct \/ (i + 1)) * 100);\n      });\n      var d = pts.map(function (v, i) { return (i === 0 ? 'M' : 'L') + x(i).toFixed(1) + ',' + y(v).toFixed(1); }).join(' ');\n      return { ai: ai, d: d, last: pts[pts.length - 1] };\n    });\n    var midX = x((n \/ 2) - 0.5);\n\n    var grid = [25, 50, 75, 100].map(function (g) {\n      return s('g', null,\n        s('line', { x1: padL, x2: W - padR, y1: y(g), y2: y(g), stroke: 'var(--rs-border)', 'stroke-width': '1' }),\n        s('text', { x: padL - 8, y: y(g) + 4, 'text-anchor': 'end', 'font-size': '11', fill: 'var(--rs-fg-muted)' }, g + '%'));\n    });\n\n    var svg = s('svg', { viewBox: '0 0 ' + W + ' ' + H, style: 'width:100%;min-width:560px;display:block' },\n      grid,\n      s('line', { x1: midX, x2: midX, y1: padT, y2: H - padB, stroke: 'var(--rs-border)', 'stroke-dasharray': '3 4' }),\n      s('text', { x: padL + 4, y: H - 10, 'font-size': '11', fill: 'var(--rs-fg-muted)' }, 'Speelronde 1'),\n      s('text', { x: midX + 6, y: H - 10, 'font-size': '11', fill: 'var(--rs-fg-muted)' }, 'Speelronde 2'),\n      series.map(function (ser) {\n        return s('path', { d: ser.d, fill: 'none', stroke: aiColor(ser.ai), 'stroke-width': '2.4',\n          'stroke-linejoin': 'round', 'stroke-linecap': 'round', opacity: '0.95' });\n      }),\n      series.map(function (ser) {\n        return s('circle', { cx: x(n - 1), cy: y(ser.last), r: '3.5', fill: aiColor(ser.ai) });\n      }));\n\n    return h('div', { className: 'card chart-card' },\n      h('div', { className: 'subhead', style: { margin: '0 0 6px' } }, 'Nauwkeurigheid door het toernooi heen', h('span', { className: 'ln' })),\n      h('p', { className: 'muted', style: { fontSize: 13, margin: '0 0 14px' } }, 'Doorlopend percentage juist voorspelde uitslagen, wedstrijd voor wedstrijd.'),\n      h('div', { style: { width: '100%', overflowX: 'auto' } }, svg),\n      h('div', { className: 'legend' }, series.map(function (ser) {\n        return h('span', null, h('i', { style: { background: aiColor(ser.ai) } }), ser.ai.name + ' \u00b7 ' + Math.round(ser.last) + '%');\n      })));\n  }\n\n  function Personas() {\n    return h('div', { className: 'persona-grid' }, WK.AIS.map(function (ai) {\n      return h('div', { className: 'persona' },\n        h('span', { className: 'edge', style: { background: aiColor(ai) } }),\n        h('div', { className: 'top' },\n          AIBadge(ai, 36),\n          h('div', { style: { lineHeight: 1.2 } },\n            h('div', { style: { fontWeight: 700, color: aiColor(ai) } }, ai.name),\n            h('div', { className: 'mk', style: { fontSize: 11.5 } }, ai.maker)),\n          h('span', { className: 'style', style: { background: 'rgba(' + ai.glow + ',0.16)', color: aiColor(ai) } }, ai.style)),\n        h('p', null, ai.tagline));\n    }));\n  }\n\n  function SectionRanglijst(rows) {\n    var playedN = WK.MATCHES.filter(function (m) { return m.played; }).length;\n    return h('section', { className: 'sec' },\n      h('div', { className: 'sec-head' },\n        h('div', { className: 'kick' }, playedN > 0 ? 'De stand' : 'Nog te beginnen'),\n        h('h2', null, 'Ranglijst'),\n        h('p', null, 'Vijf taalmodellen, \u00e9\u00e9n voorspelpoule. Elke AI voorspelde vooraf alle 104 wedstrijden. Scoren volgens de ',\n          h('b', { style: { color: 'var(--rs-fg)' } }, 'Scorito-puntentelling'), ': in de groepsfase exact = 45 punten, juiste uitkomst (toto) = 30 \u2014 en elke knock-outronde telt zwaarder, tot 6\u00d7 in de finale (exact = 270).')),\n      playedN === 0 ? h('div', { className: 'card', style: { padding: '16px 20px', marginBottom: 16, fontSize: 14, color: 'var(--rs-fg-muted)' } },\n        'Het toernooi begint op 11 juni 2026. Zodra de eerste uitslagen binnen zijn, vullen de punten en de nauwkeurigheid zich hier vanzelf. Hieronder alvast de deelnemers en hun titelkandidaat.') : null,\n      Leaderboard(rows),\n      h('div', { className: 'subhead', style: { marginTop: 36 } }, 'Het verloop', h('span', { className: 'ln' })),\n      TrendChart(),\n      h('div', { className: 'subhead', style: { marginTop: 36 } }, 'Wie is wie', h('span', { className: 'ln' })),\n      Personas());\n  }\n\n  \/* ===============================================================\n     5. SCHERM 2 \u2014 WEDSTRIJDEN  (stateful: filters + load-more)\n     =============================================================== *\/\n  function PredCell(ai, pred, m) {\n    var played = m.played;\n    var q = 0, pts = 0, cls = '';\n    if (played) {\n      q = WK.quality(pred, m.ah, m.aa);\n      pts = WK.matchPoints(m.round || 'group', pred, m.ah, m.aa);\n      cls = q === 2 ? 's4' : q === 1 ? 's2' : 's0';\n    }\n    var label = played ? (q === 2 ? '+' + pts + ' exact' : q === 1 ? '+' + pts + ' toto' : '0') : '';\n    return h('div', { className: 'pred' + (played ? (q === 2 ? ' hit' : '') : '') },\n      h('div', { className: 'who' }, AIBadge(ai, 16), h('span', null, ai.name)),\n      h('div', { className: 'sc', style: { color: aiColor(ai) } }, pred.h + '\u2013' + pred.a),\n      played ? h('div', { className: 'pt ' + cls }, label)\n             : h('div', { className: 'pt', style: { color: 'var(--rs-fg-muted)' } }, '\u00a0'));\n  }\n\n  function MatchCard(m) {\n    return h('div', { className: 'match' },\n      h('div', { className: 'match-top' },\n        h('div', { className: 'match-meta' },\n          h('span', { className: 'gp' }, 'Groep ' + m.group),\n          h('span', null, '\u00b7 Ronde ' + m.md),\n          m.date ? h('span', null, '\u00b7 ' + m.date + (m.city ? ' \u00b7 ' + m.city : '')) : null),\n        h('span', { className: 'badge-played ' + (m.played ? 'done' : 'soon') }, m.played ? 'Eindstand' : 'Nog te spelen')),\n      h('div', { className: 'fixture' },\n        FlagTeam(m.home, false, 26, true),\n        m.played\n          ? h('div', { className: 'fx-score' }, String(m.ah), h('span', { className: 'vs' }, ' \u2013 '), String(m.aa))\n          : h('div', { className: 'fx-score soon' }, h('span', { className: 'vs' }, 'vs')),\n        FlagTeam(m.away, true, 26, true)),\n      h('div', { className: 'preds' }, WK.AIS.map(function (ai) { return PredCell(ai, m.preds[ai.id], m); })));\n  }\n\n  function Disagreements() {\n    var list = WK.disagreements(4), AIS = WK.AIS, sign = WK.sign;\n    return h('div', { className: 'split-grid' }, list.map(function (item) {\n      var m = item.m;\n      return h('div', { className: 'diomatch' },\n        h('div', { className: 'match-meta', style: { justifyContent: 'center', marginBottom: 10 } },\n          h('span', { className: 'gp' }, 'Groep ' + m.group), h('span', null, '\u00b7 Ronde ' + m.md)),\n        h('div', { className: 'fx' },\n          h('span', { className: 'tname', style: { justifyContent: 'flex-end' } }, m.home.name, h('span', { className: 'fl' }, m.home.flag)),\n          h('span', { style: { color: 'var(--rs-fg-muted)', fontWeight: 400 } }, 'vs'),\n          h('span', { className: 'tname' }, h('span', { className: 'fl' }, m.away.flag), m.away.name)),\n        h('div', { className: 'vote' }, AIS.map(function (ai) {\n          var p = m.preds[ai.id];\n          var o = sign(p.h - p.a);\n          var txt = o > 0 ? m.home.name : o < 0 ? m.away.name : 'Gelijkspel';\n          var col = o === 0 ? 'var(--rs-yellow)' : aiColor(ai);\n          return h('div', { className: 'voterow' },\n            h('span', { style: { display: 'inline-flex', alignItems: 'center', gap: 8 } },\n              AIBadge(ai, 20), h('span', { style: { fontWeight: 600 } }, ai.name)),\n            h('span', { className: 'pick', style: { background: 'rgba(' + ai.glow + ',0.14)', color: col } }, p.h + '\u2013' + p.a + ' \u00b7 ' + txt));\n        })));\n    }));\n  }\n\n  function SectionWedstrijden() {\n    var MATCHES = WK.MATCHES, GROUPS = WK.GROUPS;\n    var grp = 'all', status = 'all', limit = 12;\n\n    var statusChips = [['all', 'Alle'], ['done', 'Gespeeld'], ['soon', 'Aankomend']];\n    var statusBtns = {}, grpBtns = {};\n\n    var countEl = h('div', { className: 'muted', style: { fontSize: 12.5, marginBottom: 12, textTransform: 'uppercase', letterSpacing: '0.06em' } });\n    var listEl = h('div', null);\n    var moreEl = h('div', { style: { textAlign: 'center', marginTop: 8 } });\n\n    function update() {\n      var full = MATCHES.filter(function (m) {\n        return (grp === 'all' || m.group === grp)\n          ? (status === 'all' || (status === 'done' ? m.played : !m.played))\n          : false;\n      });\n      var list = full.slice(0, limit);\n      countEl.textContent = full.length + ' ' + (full.length === 1 ? 'wedstrijd' : 'wedstrijden');\n      listEl.innerHTML = '';\n      if (list.length === 0) {\n        listEl.appendChild(h('p', { className: 'muted' }, 'Geen wedstrijden voor deze filter.'));\n      } else {\n        list.forEach(function (m) { listEl.appendChild(MatchCard(m)); });\n      }\n      moreEl.innerHTML = '';\n      if (full.length > list.length) {\n        moreEl.appendChild(h('button', { className: 'chip', style: { padding: '10px 22px' },\n          onClick: function () { limit += 12; update(); } },\n          'Meer wedstrijden tonen (' + (full.length - list.length) + ')'));\n      }\n    }\n    function refreshChips() {\n      Object.keys(statusBtns).forEach(function (k) { statusBtns[k].className = 'chip' + (status === k ? ' on' : ''); });\n      Object.keys(grpBtns).forEach(function (k) { grpBtns[k].className = 'chip' + (grp === k ? ' on' : ''); });\n    }\n    function setStatus(v) { status = v; limit = 12; refreshChips(); update(); }\n    function setGrp(v) { grp = v; limit = 12; refreshChips(); update(); }\n\n    var statusRow = h('div', { className: 'filters' }, h('span', { className: 'fl-label' }, 'Status'),\n      statusChips.map(function (pair) {\n        var b = h('button', { className: 'chip' + (status === pair[0] ? ' on' : ''), onClick: function () { setStatus(pair[0]); } }, pair[1]);\n        statusBtns[pair[0]] = b; return b;\n      }));\n\n    var grpAll = h('button', { className: 'chip' + (grp === 'all' ? ' on' : ''), onClick: function () { setGrp('all'); } }, 'Alle');\n    grpBtns['all'] = grpAll;\n    var grpRow = h('div', { className: 'filters' }, h('span', { className: 'fl-label' }, 'Groep'), grpAll,\n      GROUPS.map(function (g) {\n        var b = h('button', { className: 'chip' + (grp === g ? ' on' : ''), onClick: function () { setGrp(g); } }, g);\n        grpBtns[g] = b; return b;\n      }));\n\n    update();\n\n    return h('section', { className: 'sec' },\n      h('div', { className: 'sec-head' },\n        h('div', { className: 'kick' }, 'Voorspeld vs. werkelijk'),\n        h('h2', null, 'Wedstrijden'),\n        h('p', null, 'Elke groepswedstrijd met de voorspelling van alle vijf modellen ernaast. Gespeelde duels tonen hoeveel punten elke AI pakte; aankomende duels tonen puur de voorspelling.')),\n      statusRow, grpRow,\n      h('div', { style: { marginTop: 4 } }, countEl, listEl, moreEl),\n      h('div', { className: 'subhead', style: { marginTop: 40 } }, 'Grootste verdeeldheid \u00b7 komende ronde', h('span', { className: 'ln' })),\n      h('p', { className: 'muted', style: { fontSize: 13.5, margin: '-6px 0 16px', maxWidth: '62ch' } },\n        'De duels waar de modellen het \u2019t meest oneens zijn. Hier wordt de poule beslist.'),\n      Disagreements());\n  }\n\n  \/* ===============================================================\n     6. SCHERM 3 \u2014 GROEPEN\n     =============================================================== *\/\n  function GroupCard(g) {\n    var rows = WK.computeGroup(g);\n    var favName = WK.GROUP_PRED[g][0];\n    var fav = WK.TEAM[favName];\n    var mdPlayed = Math.floor(WK.MATCHES.filter(function (m) { return m.group === g ? m.played : false; }).length \/ 2);\n    var qClass = function (pos) { return pos === 1 ? 'q1' : pos === 2 ? 'q2' : pos === 3 ? 'q3' : ''; };\n    return h('div', { className: 'gcard' },\n      h('div', { className: 'gh' },\n        h('span', { className: 'gl' }, 'Groep ', h('b', null, g)),\n        h('span', { className: 'muted', style: { fontSize: 11.5, textTransform: 'uppercase', letterSpacing: '0.06em' } },\n          rows.predicted ? 'AI-voorspelling' : (mdPlayed + ' \/ 3 gespeeld'))),\n      h('table', { className: 'gtab' },\n        h('thead', null, h('tr', null,\n          h('th', { className: 'l' }, '#\u00a0\u00a0Team'),\n          h('th', null, 'G'), h('th', null, 'W-G-V'), h('th', null, '+\/\u2013'), h('th', null, 'Ptn'))),\n        h('tbody', null, rows.map(function (r) {\n          return h('tr', { className: qClass(r.pos) },\n            h('td', { className: 'l' }, h('span', { className: 'tm' },\n              h('span', { className: 'pos' }, r.pos), h('span', { className: 'fl' }, r.team.flag), r.team.name)),\n            h('td', { className: 'muted' }, r.pld),\n            h('td', { style: { fontVariantNumeric: 'tabular-nums', fontSize: 12.5 } }, r.w + '-' + r.d + '-' + r.l),\n            h('td', { className: 'muted', style: { fontVariantNumeric: 'tabular-nums' } }, r.gd > 0 ? '+' + r.gd : String(r.gd)),\n            h('td', { className: 'ptcol' }, r.pts));\n        }))),\n      h('div', { className: 'gpick' },\n        h('span', { style: { fontSize: 15 } }, fav.flag),\n        h('span', null, 'AI-favoriet: ', h('b', null, fav.name), ' wint de groep')));\n  }\n\n  function SectionGroepen() {\n    var anyPlayed = WK.MATCHES.some(function (m) { return m.played; });\n    return h('section', { className: 'sec' },\n      h('div', { className: 'sec-head' },\n        h('div', { className: 'kick' }, '48 landen \u00b7 12 groepen'),\n        h('h2', null, 'Groepen'),\n        h('p', null, anyPlayed\n          ? 'De actuele stand, live berekend uit de gespeelde uitslagen. De top 2 van elke groep plaatst zich direct; de acht beste nummers 3 gaan mee naar de laatste 32.'\n          : 'Het toernooi moet nog beginnen \u2014 dit is de door de AI-modellen voorspelde eindstand per groep. Zodra er gespeeld wordt, verandert dit in de echte, live berekende stand.')),\n      h('div', { className: 'glegend', style: { border: 'none', padding: '0 0 16px', gap: 22 } },\n        h('span', null, h('i', { style: { background: 'hsl(145 65% 42%)' } }), ' Direct geplaatst (1\u20132)'),\n        h('span', null, h('i', { style: { background: 'var(--rs-yellow)', opacity: 0.6 } }), ' Kans als beste nr. 3'),\n        h('span', { style: { color: 'var(--rs-fg-muted)' } }, 'G = gespeeld \u00b7 W-G-V = winst-gelijk-verlies')),\n      h('div', { className: 'groups-grid' }, WK.GROUPS.map(function (g) { return GroupCard(g); })));\n  }\n\n  \/* ===============================================================\n     7. SCHERM 4 \u2014 EINDSTAND\n     =============================================================== *\/\n  function consensus() {\n    var PICKS = WK.PICKS, AIS = WK.AIS, TEAM = WK.TEAM;\n    var score = {}, champVotes = {};\n    var add = function (name, pts) { if (!name) return; score[name] = (score[name] || 0) + pts; };\n    AIS.forEach(function (ai) {\n      var p = PICKS[ai.id];\n      add(p.champion, 4); add(p.runnerUp, 3); add(p.third, 2); add(p.darkHorse, 1);\n      champVotes[p.champion] = (champVotes[p.champion] || 0) + 1;\n    });\n    return Object.keys(score).map(function (name) {\n      return { name: name, score: score[name], champVotes: champVotes[name] || 0, str: (TEAM[name] || {}).str || 0 };\n    }).sort(function (a, b) { return b.score - a.score || b.champVotes - a.champVotes || b.str - a.str; });\n  }\n\n  function Podium() {\n    var top = consensus().slice(0, 3);\n    var TEAM = WK.TEAM;\n    var order = [top[1], top[0], top[2]];\n    return h('div', { className: 'podium' }, order.map(function (c) {\n      var place = c === top[0] ? 1 : c === top[1] ? 2 : 3;\n      var t = TEAM[c.name];\n      return h('div', { className: 'pod p' + place },\n        place === 1 ? h('div', { className: 'crown' }, '\ud83d\udc51') : null,\n        h('div', { className: 'place' }, place === 1 ? 'Wereldkampioen' : place + 'e plaats'),\n        h('div', { className: 'fl' }, t ? t.flag : ''),\n        h('div', { className: 'tm' }, c.name),\n        h('div', { className: 'vt' }, c.champVotes > 0 ? c.champVotes + '\/5 modellen tippen de titel' : 'Consensus-score ' + c.score));\n    }));\n  }\n\n  function BracketCard(ai) {\n    var p = WK.PICKS[ai.id];\n    function Row(lab, name, big) {\n      var t = WK.TEAM[name];\n      return h('div', { className: 'brow' },\n        h('span', { className: 'lab' }, lab),\n        h('span', { className: 'val' },\n          t ? h('span', { style: { fontSize: big ? 20 : 16 } }, t.flag) : null,\n          h('span', { className: big ? 'champ-tag' : '', style: big ? { color: aiColor(ai) } : null }, name)));\n    }\n    return h('div', { className: 'bcard' },\n      h('span', { className: 'edge', style: { background: aiColor(ai) } }),\n      h('div', { className: 'bh' },\n        AIBadge(ai, 34),\n        h('div', { style: { lineHeight: 1.2 } },\n          h('div', { style: { fontWeight: 700, color: aiColor(ai) } }, ai.name),\n          h('div', { className: 'mk', style: { fontSize: 11.5 } }, 'tipt de eindstand'))),\n      Row('\ud83c\udfc6 Kampioen', p.champion, true),\n      Row('Verliezend finalist', p.runnerUp, false),\n      Row('Nummer 3', p.third, false),\n      Row('Verrassing', p.darkHorse, false),\n      p.flop ? Row('Grootste flop', p.flop, false) : null,\n      Row('Topscorer', p.topScorer, false),\n      h('div', { className: 'bquote' }, '\u201c' + p.quote + '\u201d'));\n  }\n\n  function BoldestCalls() {\n    var list = WK.boldest(6);\n    var outName = function (m, o) { return o > 0 ? m.home.name : o < 0 ? m.away.name : 'gelijkspel'; };\n    return h('div', { className: 'split-grid' }, list.map(function (item) {\n      var m = item.m, ai = item.ai, p = item.p;\n      var lone = outName(m, item.lonerO);\n      var maj = outName(m, item.majO);\n      return h('div', { className: 'diomatch' },\n        h('div', { style: { display: 'flex', alignItems: 'center', gap: 9, marginBottom: 12 } },\n          AIBadge(ai, 26),\n          h('span', { style: { fontWeight: 700, color: aiColor(ai) } }, ai.name),\n          h('span', { className: 'badge-played soon', style: { marginLeft: 'auto' } }, 'Groep ' + m.group)),\n        h('div', { className: 'fx', style: { fontSize: 14 } },\n          h('span', { className: 'tname', style: { justifyContent: 'flex-end' } }, m.home.name, h('span', { className: 'fl' }, m.home.flag)),\n          h('span', { style: { fontFamily: 'var(--rs-font-heading)', fontWeight: 700, color: aiColor(ai) } }, p.h + '\u2013' + p.a),\n          h('span', { className: 'tname' }, h('span', { className: 'fl' }, m.away.flag), m.away.name)),\n        h('p', { className: 'muted', style: { fontSize: 13, margin: '4px 0 0', textAlign: 'center' } },\n          'Als enige op ', h('b', { style: { color: 'var(--rs-fg)' } }, lone), ' \u2014 de andere vier kozen ' + maj + '.'));\n    }));\n  }\n\n  function TopscorersBlock() {\n    return h('div', { className: 'ts-grid' }, WK.AIS.map(function (ai) {\n      var list = WK.TOPSCORERS[ai.id] || [];\n      return h('div', { className: 'ts-card' },\n        h('span', { className: 'edge', style: { background: aiColor(ai) } }),\n        h('div', { className: 'bh' }, AIBadge(ai, 30),\n          h('div', { style: { lineHeight: 1.2 } },\n            h('div', { style: { fontWeight: 700, color: aiColor(ai) } }, ai.name),\n            h('div', { className: 'mk', style: { fontSize: 11.5 } }, 'voorspelde topscorers'))),\n        h('div', { className: 'ts-list' }, list.map(function (p, i) {\n          var t = p.country ? WK.TEAM[p.country] : null;\n          return h('div', { className: 'ts-row' },\n            h('span', { className: 'ts-rank' }, String(i + 1)),\n            t ? h('span', { className: 'ts-fl' }, t.flag) : h('span', { className: 'ts-fl' }, ''),\n            h('span', { className: 'ts-nm' }, p.name),\n            h('span', { className: 'ts-g', style: { color: aiColor(ai) } }, p.goals != null ? p.goals + '\u00d7' : ''));\n        })));\n    }));\n  }\n\n  function DarkHorses() {\n    return h('div', { className: 'split-grid' }, WK.AIS.map(function (ai) {\n      var name = WK.PICKS[ai.id].darkHorse; var t = WK.TEAM[name]; var reach = WK.DARK_REACH[ai.id];\n      return h('div', { className: 'diomatch', style: { textAlign: 'center' } },\n        h('div', { style: { display: 'flex', alignItems: 'center', justifyContent: 'center', gap: 9, marginBottom: 8 } },\n          AIBadge(ai, 24), h('span', { style: { fontWeight: 700, color: aiColor(ai) } }, ai.name)),\n        h('div', { style: { fontSize: 38, lineHeight: 1, margin: '2px 0 6px' } }, t ? t.flag : ''),\n        h('div', { style: { fontFamily: 'var(--rs-font-heading)', fontWeight: 800, fontSize: 19 } }, name),\n        reach ? h('div', { className: 'muted', style: { fontSize: 12.5, marginTop: 4 } }, 'komt tot de ' + reach.toLowerCase()) : null);\n    }));\n  }\n\n  function SectionEindstand() {\n    return h('section', { className: 'sec' },\n      h('div', { className: 'sec-head' },\n        h('div', { className: 'kick' }, 'Het grote plaatje'),\n        h('h2', null, 'Eindstand'),\n        h('p', null, 'Los van wedstrijd-voor-wedstrijd: wie wint volgens de modellen het hele toernooi? Hieronder de gecombineerde AI-voorspelling en het volledige rapport per model.')),\n      h('div', { className: 'subhead', style: { marginTop: 8 } }, 'Het AI-consensuspodium', h('span', { className: 'ln' })),\n      Podium(),\n      h('div', { className: 'subhead', style: { marginTop: 40 } }, 'Het rapport per model', h('span', { className: 'ln' })),\n      h('div', { className: 'bracket-grid' }, WK.AIS.map(function (ai) { return BracketCard(ai); })),\n      h('div', { className: 'subhead', style: { marginTop: 40 } }, 'De gewaagdste voorspellingen', h('span', { className: 'ln' })),\n      h('p', { className: 'muted', style: { fontSize: 13.5, margin: '-6px 0 16px', maxWidth: '62ch' } },\n        'Wedstrijden waar \u00e9\u00e9n model lef toonde en als enige tegen de andere vier in ging.'),\n      BoldestCalls());\n  }\n\n  function SectionTopscorers() {\n    return h('section', { className: 'sec' },\n      h('div', { className: 'sec-head' },\n        h('div', { className: 'kick' }, 'Gouden Schoen'),\n        h('h2', null, 'Topscorers'),\n        h('p', null, 'Wie wordt volgens de modellen topscorer van het WK? De voorspelde top 5 per model, met het verwachte aantal doelpunten.')),\n      TopscorersBlock());\n  }\n\n  function SectionDarkHorses() {\n    return h('section', { className: 'sec' },\n      h('div', { className: 'sec-head' },\n        h('div', { className: 'kick' }, 'De verrassing'),\n        h('h2', null, 'Dark horses'),\n        h('p', null, 'Elk model koos \u00e9\u00e9n outsider die verrassend ver komt. Hieronder de dark horse per model \u2014 en tot welke ronde die volgens hen reikt.')),\n      DarkHorses());\n  }\n\n  \/* ===============================================================\n     SCHERM \u2014 KNOCKOUT (bracket per model)\n     =============================================================== *\/\n  function SectionKnockout() {\n    var AIS = WK.AIS;\n    var sel = AIS[0].id;\n    var ROUNDS = [['r32', 'Laatste 32'], ['r16', 'Laatste 16'], ['quarter', 'Kwartfinale'], ['semi', 'Halve finale'], ['third', 'Troostfinale'], ['final', 'Finale']];\n    var btns = {};\n    var body = h('div', null);\n    function koCard(x) {\n      var home = WK.TEAM[x.home], away = WK.TEAM[x.away];\n      return h('div', { className: 'komatch' },\n        h('span', { className: 'tname', style: { justifyContent: 'flex-end' } }, x.home, h('span', { className: 'fl' }, home ? home.flag : '')),\n        h('span', { className: 'koscore' }, x.h + '\u2013' + x.a, x.pen ? h('span', { className: 'kopen' }, ' (' + x.pen + ')') : null),\n        h('span', { className: 'tname' }, h('span', { className: 'fl' }, away ? away.flag : ''), x.away));\n    }\n    function render() {\n      body.innerHTML = '';\n      var list = WK.KO[sel] || [];\n      ROUNDS.forEach(function (rr) {\n        var ms = list.filter(function (x) { return x.round === rr[0]; });\n        if (!ms.length) return;\n        body.appendChild(h('div', { className: 'subhead', style: { marginTop: 24 } }, rr[1], h('span', { className: 'ln' })));\n        body.appendChild(h('div', { className: 'ko-grid' }, ms.map(koCard)));\n      });\n    }\n    function setSel(id) { sel = id; Object.keys(btns).forEach(function (k) { btns[k].className = 'chip' + (sel === k ? ' on' : ''); }); render(); }\n    var chips = h('div', { className: 'filters' }, h('span', { className: 'fl-label' }, 'Model'),\n      AIS.map(function (ai) { var b = h('button', { className: 'chip' + (sel === ai.id ? ' on' : ''), onClick: function () { setSel(ai.id); } }, ai.name); btns[ai.id] = b; return b; }));\n    render();\n    return h('section', { className: 'sec' },\n      h('div', { className: 'sec-head' },\n        h('div', { className: 'kick' }, 'Van laatste 32 tot finale'),\n        h('h2', null, 'Knockout'),\n        h('p', null, 'Elk model tekende een compleet knock-outschema uit \u2014 de deelnemers verschillen dus per model. Kies een model en volg zijn voorspelde weg naar de titel. (nv) = na verlenging, (pen) = beslist op strafschoppen.')),\n      chips, body);\n  }\n\n  \/* ===============================================================\n     SCHERM \u2014 LIVE (echte tussenstanden + topscorers uit SportMonks)\n     =============================================================== *\/\n  var PROXY_URL = '';\n  var LIVE = { timers: [], reload: null };\n  var WKAMP = String.fromCharCode(38);\n  var __jid = 0;\n  function jsonp(base, feed) {\n    return new Promise(function (resolve, reject) {\n      var cb = 'wkj_' + Date.now() + '_' + (++__jid);\n      var sc = document.createElement('script');\n      var to = setTimeout(function () { cleanup(); reject(new Error('timeout')); }, 15000);\n      function cleanup() { clearTimeout(to); try { delete window[cb]; } catch (e) {} if (sc.parentNode) sc.parentNode.removeChild(sc); }\n      window[cb] = function (d) { cleanup(); resolve(d); };\n      sc.onerror = function () { cleanup(); reject(new Error('jsonp_error')); };\n      sc.src = base + '?feed=' + feed + WKAMP + 'callback=' + cb + WKAMP + '_=' + Date.now();\n      document.head.appendChild(sc);\n    });\n  }\n  function clearLive() { LIVE.timers.forEach(function (t) { clearInterval(t); }); LIVE.timers = []; LIVE.reload = null; }\n\n  var STATE_NL = { HT: 'Rust', BREAK: 'Pauze', PEN: 'Penalty\u2019s', ET: 'Verlenging', AET: 'Na verlenging', FT: 'Afgelopen' };\n  function liveStatus(m) {\n    if (m.minute != null) return m.minute + '\u2019';\n    var sn = m.state ? m.state.short_name : null;\n    if (sn ? STATE_NL[sn] : false) return STATE_NL[sn];\n    return m.state ? (m.state.name || 'Bezig') : 'Bezig';\n  }\n  function parseLive(json) {\n    var arr = (json ? json.data : null) || []; var out = [];\n    arr.forEach(function (fx) {\n      var home = null, away = null;\n      (fx.participants || []).forEach(function (p) { var loc = p.meta ? p.meta.location : null; if (loc === 'home') home = p; else if (loc === 'away') away = p; });\n      if (home ? !away : true) return;\n      var hg = 0, ag = 0;\n      (fx.scores || []).forEach(function (s) { if (s.description === 'CURRENT' ? s.score : false) { if (s.score.participant === 'home') hg = s.score.goals; else if (s.score.participant === 'away') ag = s.score.goals; } });\n      var minute = null; (fx.periods || []).forEach(function (pe) { if (pe ? pe.ticking : false) minute = pe.minutes; });\n      out.push({ home: home, away: away, hg: hg, ag: ag, state: fx.state || {}, minute: minute });\n    });\n    return out;\n  }\n  function parseScorers(json) {\n    var arr = (json ? json.data : null) || [];\n    var goals = arr.filter(function (it) { var t = it.type || {}; return (t.developer_name === 'GOAL_TOPSCORER') ? true : (t.id === 208); });\n    goals.sort(function (a, b) { return (b.total || 0) - (a.total || 0); });\n    return goals.slice(0, 10).map(function (it) { var pl = it.player || {}, pt = it.participant || {}; return { name: pl.name || pl.display_name || '-', team: pt.name || '', img: pt.image_path || '', goals: it.total || 0 }; });\n  }\n  function liveImg(src, cls) {\n    var i = h('img', { className: cls, alt: '', loading: 'lazy', onerror: function () { i.style.visibility = 'hidden'; } });\n    if (src) i.src = src;\n    return i;\n  }\n  function liveTeam(p, away) {\n    var nm = (p ? p.name : '') || '';\n    var logo = (p ? p.image_path : '') ? liveImg(p.image_path, 'live-logo') : h('span', { className: 'live-logo' });\n    return away ? h('span', { className: 'fx-team away' }, h('span', null, nm), logo)\n                : h('span', { className: 'fx-team' }, logo, h('span', null, nm));\n  }\n  function SectionLive() {\n    var liveBody = h('div');\n    var tsBody = h('div');\n    var liveOk = false, tsOk = false;\n    function note(t) { return h('div', { className: 'card', style: { padding: '16px 20px', fontSize: 14, color: 'var(--rs-fg-muted)' } }, t); }\n    function renderLiveList(list) {\n      liveBody.innerHTML = '';\n      if (!list.length) { liveBody.appendChild(note('Er zijn nu geen wedstrijden live. Tijdens speelmomenten verschijnen de tussenstanden hier automatisch.')); return; }\n      list.forEach(function (m) {\n        liveBody.appendChild(h('div', { className: 'match' },\n          h('div', { className: 'match-top' },\n            h('div', { className: 'match-meta' }, h('span', { className: 'gp' }, m.state ? (m.state.name || 'Live') : 'Live')),\n            h('span', { className: 'badge-played', style: { background: 'rgba(234,85,32,0.10)', color: 'var(--rs-red)' } }, liveStatus(m))),\n          h('div', { className: 'fixture' }, liveTeam(m.home, false), h('div', { className: 'fx-score' }, m.hg + ' \u2013 ' + m.ag), liveTeam(m.away, true))));\n      });\n    }\n    function renderTsList(list) {\n      tsBody.innerHTML = '';\n      if (!list.length) { tsBody.appendChild(note('Nog geen doelpunten \u2014 de topscorerslijst verschijnt zodra er gescoord wordt.')); return; }\n      var box = h('div', { className: 'card', style: { overflow: 'hidden' } });\n      list.forEach(function (sc, i) {\n        box.appendChild(h('div', { className: 'lts-row' },\n          h('span', { className: 'lts-rank' }, String(i + 1)),\n          sc.img ? liveImg(sc.img, 'lts-img') : h('span', { className: 'lts-img' }),\n          h('span', { className: 'lts-nm' }, sc.name, sc.team ? h('span', { className: 'lts-team' }, sc.team) : null),\n          h('span', { className: 'lts-goals' }, sc.goals + '\u00d7')));\n      });\n      tsBody.appendChild(box);\n    }\n    function loadLive(force) { if (!PROXY_URL) return; if (force ? false : document.visibilityState !== 'visible') return; jsonp(PROXY_URL, 'live').then(function (j) { liveOk = true; renderLiveList(parseLive(j)); }).catch(function () { if (!liveOk) renderLiveList([]); }); }\n    function loadTs(force) { if (!PROXY_URL) return; if (force ? false : document.visibilityState !== 'visible') return; jsonp(PROXY_URL, 'topscorers').then(function (j) { tsOk = true; renderTsList(parseScorers(j)); }).catch(function () { if (!tsOk) renderTsList([]); }); }\n\n    clearLive();\n    if (PROXY_URL) {\n      loadLive(true); loadTs(true);\n      LIVE.timers.push(setInterval(function () { loadLive(false); }, 20000));\n      LIVE.timers.push(setInterval(function () { loadTs(false); }, 600000));\n      LIVE.reload = function () { loadLive(true); loadTs(true); };\n    } else { renderLiveList([]); renderTsList([]); }\n\n    return h('section', { className: 'sec' },\n      h('div', { className: 'sec-head' },\n        h('div', { className: 'kick' }, 'Rechtstreeks van het WK'),\n        h('h2', null, 'Live'),\n        h('p', null, 'Tussenstanden van wedstrijden die nu bezig zijn en de echte topscorers van het toernooi \u2014 rechtstreeks uit de offici\u00eble data, automatisch ververst.')),\n      h('div', { className: 'subhead', style: { marginTop: 8 } }, 'Live wedstrijden', h('span', { className: 'ln' })),\n      liveBody,\n      h('div', { className: 'subhead', style: { marginTop: 36 } }, 'Topscorers (live)', h('span', { className: 'ln' })),\n      tsBody);\n  }\n\n  \/* ===============================================================\n     8. SHELL \u2014 masthead, hero (+countdown), tabs, routing, footer\n     =============================================================== *\/\n  var TABS = [\n    { id: 'ranglijst', label: 'Ranglijst' },\n    { id: 'wedstrijden', label: 'Wedstrijden' },\n    { id: 'live', label: 'Live' },\n    { id: 'groepen', label: 'Groepen' },\n    { id: 'knockout', label: 'Knockout' },\n    { id: 'topscorers', label: 'Topscorers' },\n    { id: 'darkhorses', label: 'Dark horses' },\n    { id: 'eindstand', label: 'Eindstand' }\n  ];\n\n  function Masthead(onBrand) {\n    var navItems = ['SEO diensten', 'AI SEO', 'Conversie optimalisatie', 'Cursussen', 'Blog', 'Wij zijn Onder!'];\n    var caret = function () {\n      return s('svg', { width: '11', height: '11', viewBox: '0 0 24 24', fill: 'none', stroke: 'currentColor',\n        'stroke-width': '3', 'stroke-linecap': 'round', 'stroke-linejoin': 'round' }, s('path', { d: 'M6 9l6 6 6-6' }));\n    };\n    var ring = s('svg', { class: 'ring', viewBox: '0 0 100 100', fill: 'none', style: 'color:var(--rs-red)' },\n      s('path', { d: 'M35.6 19.2 A34 34 0 1 0 64.4 19.2', stroke: 'currentColor', 'stroke-width': '15', 'stroke-linecap': 'round' }));\n    return h('div', { className: 'mast' },\n      h('div', { className: 'mast-row' },\n        h('a', { className: 'brand', href: '#ranglijst', onClick: function (e) { e.preventDefault(); onBrand(); } }, ring,\n          h('span', { className: 'wordmark' }, 'NDER')),\n        h('nav', { className: 'mast-nav' },\n          navItems.map(function (nm) {\n            return h('a', { href: '#', onClick: function (e) { e.preventDefault(); } }, nm, caret());\n          }),\n          h('a', { className: 'mast-cta', href: '#', onClick: function (e) { e.preventDefault(); } }, 'Contact'))));\n  }\n\n  function HeroLeader(rows) {\n    var max = rows[0].points || 1;\n    var started = (rows[0].points || 0) > 0;\n    var target = (started ? WK.FINAL : WK.KICKOFF).getTime();\n    var valEl = h('span', { className: 'val' });\n    function tick() {\n      var d = Math.max(0, Math.floor((target - Date.now()) \/ 1000));\n      var days = Math.floor(d \/ 86400); d -= days * 86400;\n      var hrs = Math.floor(d \/ 3600); d -= hrs * 3600;\n      var mins = Math.floor(d \/ 60); var secs = d - mins * 60;\n      valEl.textContent = days + 'd ' + String(hrs).padStart(2, '0') + 'u ' + String(mins).padStart(2, '0') + 'm ' + String(secs).padStart(2, '0') + 's';\n    }\n    tick();\n    if (window.__wkHeroTimer) clearInterval(window.__wkHeroTimer);\n    window.__wkHeroTimer = setInterval(tick, 1000);\n    var liveRow = function (r) {\n      return h('div', { className: 'mini-row' },\n        h('span', { className: 'mini-rank' }, r.rank),\n        AIBadge(r.ai, 26),\n        h('span', { className: 'nm', style: { color: aiColor(r.ai) } }, r.ai.name),\n        h('span', { className: 'pts', style: { color: aiColor(r.ai) } }, r.points),\n        h('span', { className: 'bar-track' }, h('span', { className: 'bar-fill', style: { width: (r.points \/ max * 100) + '%', background: aiColor(r.ai) } })));\n    };\n    var pickRow = function (r) {\n      var champ = WK.PICKS[r.ai.id].champion; var t = WK.TEAM[champ];\n      return h('div', { className: 'mini-row', style: { gridTemplateColumns: '30px 1fr auto' } },\n        AIBadge(r.ai, 26),\n        h('span', { className: 'nm', style: { color: aiColor(r.ai) } }, r.ai.name),\n        h('span', { style: { display: 'inline-flex', alignItems: 'center', gap: 6, fontWeight: 700, fontSize: 13.5 } },\n          h('span', { style: { fontSize: 16 } }, t ? t.flag : ''), champ));\n    };\n    return h('div', { className: 'leadcard' },\n      h('h4', null, started ? 'De koploper' : 'Wie tipt de titel?',\n        h('span', { className: 'live-pill' }, h('span', { className: 'live-dot' }), started ? 'Live' : 'Binnenkort')),\n      rows.map(function (r) { return started ? liveRow(r) : pickRow(r); }),\n      h('div', { className: 'countdown-row' },\n        h('span', { className: 'lbl' }, started ? 'Finale over' : 'Aftrap WK over'), valEl));\n  }\n\n  function Hero(rows, played) {\n    return h('header', { className: 'hero' },\n      h('div', { className: 'hero-in' },\n        h('div', null,\n          h('div', { className: 'eyebrow' }, h('span', { className: 'bar' }), 'WK 2026 \u00b7 AI Voorspelpoule'),\n          h('h1', null, 'Welke AI ', h('span', { className: 'em' }, 'voorspelt'), h('br'), 'het WK het best?'),\n          h('p', { className: 'lead' }, 'Vijf taalmodellen (ChatGPT, Claude, Gemini, Copilot en Perplexity) voorspelden vooraf \u00e9lke wedstrijd van het WK 2026. Wij houden de score bij. Elke wedstrijd en zowel groepsfase als knock-outfase.'),\n          h('div', { className: 'hero-stats' },\n            h('div', { className: 'hstat' }, h('div', { className: 'n', style: { color: 'var(--accent)' } }, '5'), h('div', { className: 'l' }, 'Modellen')),\n            h('div', { className: 'hstat' }, h('div', { className: 'n' }, '360'), h('div', { className: 'l' }, 'Voorspellingen')),\n            h('div', { className: 'hstat' }, h('div', { className: 'n' }, String(played)), h('div', { className: 'l' }, 'Duels gespeeld')))),\n        HeroLeader(rows)));\n  }\n\n  function Footer() {\n    return h('footer', { className: 'wk-footer' },\n      h('div', { className: 'wk-app' },\n        h('p', { className: 'disc' },\n          h('b', null, 'Over deze pagina.'),\n          ' De vijf modellen kregen v\u00f3\u00f3r het toernooi dezelfde opdracht: voorspel de uitslag van elke groepswedstrijd. Sindsdien houden we per speelronde bij wie het dichtst bij de werkelijke uitslagen zit. Groepsindeling en uitslagen zijn illustratief voor deze demo. AI-namen en -logo\u2019s zijn eigendom van hun makers; deze pagina is niet aan hen gelieerd.')));\n  }\n\n  \/* ===============================================================\n     9. APP \u2014 mount + state\n     =============================================================== *\/\n  var ACCENTS = {\n    oranje:   { color: '#EA5520', glow: '16 83% 52%' },\n    petrol:   { color: '#17818F', glow: '187 72% 33%' },\n    framboos: { color: '#D6446E', glow: '340 63% 55%' },\n    blauw:    { color: '#2C74C8', glow: '212 64% 48%' },\n    groen:    { color: '#1E9E6A', glow: '152 68% 37%' }\n  };\n  var HEAD_FONTS = { 'Poppins': \"'Poppins', sans-serif\", 'Mulish': \"'Mulish', sans-serif\", 'Rajdhani': \"'Rajdhani', sans-serif\" };\n\n  function mount(root, cfg) {\n    cfg = cfg || {};\n    OPT.aiColors = cfg.aiColors !== false;\n    var chrome = cfg.chrome || root.getAttribute('data-chrome') || 'full';\n\n    \/\/ wrapper-klassen + thema-opties op de root zelf\n    root.classList.add('wk2026');\n    root.classList.add(chrome === 'embed' ? 'embed' : 'full');\n    var acc = ACCENTS[cfg.accent] || ACCENTS.oranje;\n    root.style.setProperty('--accent', acc.color);\n    root.style.setProperty('--accent-glow', acc.glow);\n    root.style.setProperty('--rs-font-heading', HEAD_FONTS[cfg.headFont] || HEAD_FONTS.Poppins);\n    root.setAttribute('data-density', cfg.density || 'normaal');\n\n    var tab = (function () {\n      var hsh = (location.hash || '').replace('#', '');\n      return TABS.some(function (x) { return x.id === hsh; }) ? hsh : 'ranglijst';\n    })();\n\n    var mainEl = h('main', { className: 'wk-app' });\n    var tabBtns = {};\n\n    function renderSection() {\n      clearLive();\n      mainEl.innerHTML = '';\n      if (tab === 'ranglijst') mainEl.appendChild(SectionRanglijst(WK.computeLeaderboard()));\n      else if (tab === 'wedstrijden') mainEl.appendChild(SectionWedstrijden());\n      else if (tab === 'live') mainEl.appendChild(SectionLive());\n      else if (tab === 'groepen') mainEl.appendChild(SectionGroepen());\n      else if (tab === 'knockout') mainEl.appendChild(SectionKnockout());\n      else if (tab === 'topscorers') mainEl.appendChild(SectionTopscorers());\n      else if (tab === 'darkhorses') mainEl.appendChild(SectionDarkHorses());\n      else if (tab === 'eindstand') mainEl.appendChild(SectionEindstand());\n    }\n    function setTab(id, scroll) {\n      tab = id;\n      Object.keys(tabBtns).forEach(function (k) { tabBtns[k].className = 'tab' + (tab === k ? ' active' : ''); });\n      try { history.replaceState(null, '', '#' + id); } catch (e) { location.hash = id; }\n      renderSection();\n      if (scroll !== false) {\n        var el = root.querySelector('.tabs-wrap');\n        if (el) {\n          var top = el.getBoundingClientRect().top + window.pageYOffset - 60;\n          window.scrollTo({ top: Math.max(0, top), behavior: 'smooth' });\n        }\n      }\n    }\n\n    var tabsWrap = h('div', { className: 'tabs-wrap' },\n      h('div', { className: 'tabs' }, TABS.map(function (x) {\n        var b = h('button', { className: 'tab' + (tab === x.id ? ' active' : ''), onClick: function () { setTab(x.id); } }, x.label);\n        tabBtns[x.id] = b; return b;\n      })));\n\n    var heroHost = h('div');\n    function buildHero() {\n      heroHost.innerHTML = '';\n      var r2 = WK.computeLeaderboard();\n      var pl = WK.MATCHES.filter(function (m) { return m.played; }).length;\n      heroHost.appendChild(Hero(r2, pl));\n    }\n    function refreshAll() { buildHero(); renderSection(); }\n\n    \/\/ bouw de pagina\n    root.innerHTML = '';\n    if (chrome !== 'embed') root.appendChild(Masthead(function () { setTab('ranglijst'); }));\n    buildHero();\n    root.appendChild(heroHost);\n    root.appendChild(tabsWrap);\n    root.appendChild(mainEl);\n    if (chrome !== 'embed') root.appendChild(Footer());\n\n    renderSection();\n\n    \/\/ reageer op handmatige hash-wijziging (bv. terug-knop)\n    window.addEventListener('hashchange', function () {\n      var hsh = (location.hash || '').replace('#', '');\n      if (TABS.some(function (x) { return x.id === hsh; }) ? hsh !== tab : false) setTab(hsh, false);\n    });\n\n    \/\/ ===== automatische uitslagen + puntentelling (via Apps Script results-feed, JSONP) =====\n    PROXY_URL = cfg.resultsProxy || '';\n    function loadResults() {\n      if (!PROXY_URL) return;\n      if (document.visibilityState !== 'visible') return;\n      jsonp(PROXY_URL, 'results').then(function (data) { if (data ? data.results : false) { WK.applyResults(data.results); refreshAll(); } }).catch(function () {});\n    }\n    if (PROXY_URL) { loadResults(); setInterval(loadResults, cfg.resultsRefreshMs || 120000); }\n    document.addEventListener('visibilitychange', function () {\n      if (document.visibilityState !== 'visible') return;\n      loadResults();\n      if (LIVE.reload) LIVE.reload();\n    });\n\n    return { setTab: setTab, refresh: refreshAll, applyResults: function (m) { WK.applyResults(m); refreshAll(); } };\n  }\n\n  \/* publieke API + auto-mount *\/\n  window.WK2026 = { mount: mount, data: WK };\n\n  function autoInit() {\n    var cfg = window.WK_CONFIG || {};\n    var el = null;\n    if (cfg.target) el = typeof cfg.target === 'string' ? document.querySelector(cfg.target) : cfg.target;\n    if (!el) el = document.getElementById('wk-voorspelpoule-root');\n    if (!el) el = document.querySelector('[data-wk-voorspelpoule]');\n    if (el ? !el.getAttribute('data-wk-mounted') : false) {\n      el.setAttribute('data-wk-mounted', '1');\n      window.WK2026.instance = mount(el, cfg);\n    }\n  }\n  if (document.readyState !== 'loading') autoInit();\n  else document.addEventListener('DOMContentLoaded', autoInit);\n})();\n\n<\/script>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Hoe werkt deze voorspelpoule?<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">De vijf AI-modellen (de meest uitgebreide versies van ChatGPT, Claude, Gemini, Copilot en Perplexity) kregen exact dezelfde prompt en moesten op basis daarvan het volledige WK 2026 voorspellen. De opdracht was uitgebreid en specifiek: elke AI moest eerst zijn eigen methodologie verantwoorden, inclusief welke factoren hij meewoog en hoe zwaar.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Een aantal factoren die elke AI moest meenemen was vastgelegd in de prompt:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Recente vorm<\/strong> \u2014 de laatste 5 wedstrijden per land<\/li>\n\n\n\n<li><strong>Selectiekwaliteit<\/strong> \u2014 sterspelers, diepte van de selectie<\/li>\n\n\n\n<li><strong>FIFA-ranking<\/strong> \u2014 de actuele wereldranglijst<\/li>\n\n\n\n<li><strong>Blessures en beschikbaarheid<\/strong> \u2014 welke sleutelspelers ontbreken<\/li>\n\n\n\n<li><strong>Toernooi-context<\/strong> \u2014 heeft een land al iets te winnen of te verliezen, wordt er geroteerd?<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Elke AI mocht zelf bepalen hoe zwaar hij elke factor liet wegen, maar moest die keuze expliciet onderbouwen. Elke AI kreeg wel de ruimte om eigen factoren in te brengen.<br><br>Vervolgens moest hij op basis van die weging voorspellen:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Alle <strong>72 groepswedstrijden<\/strong> met exacte uitslag<\/li>\n\n\n\n<li>De <strong>eindstand per groep<\/strong> inclusief punten en doelsaldo<\/li>\n\n\n\n<li>Welke <strong>8 nummers 3<\/strong> doorgaan naar de knock-outfase<\/li>\n\n\n\n<li>De volledige knock-outfase: <strong>Laatste 32, Laatste 16, kwartfinales, halve finales en finale<\/strong><\/li>\n\n\n\n<li>Een <strong>dark horse<\/strong> \u2014 een buitenkansje dat verder komt dan verwacht, consistent met de eigen bracket<\/li>\n\n\n\n<li>Een <strong>flop<\/strong> \u2014 een topland dat eerder uitvalt dan verwacht, ook consistent met de eigen bracket<\/li>\n\n\n\n<li>Een <strong>top 5 topscorers<\/strong> van het toernooi<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">De voorspellingen zijn vastgelegd v\u00f3\u00f3r het toernooi begon en worden niet aangepast. We scoren alle voorspellingen volgens het Scorito-puntensysteem, zodat de vergelijking eerlijk en consistent is.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Vijf AI modellen kregen exact dezelfde opdracht: voorspel \u00e9lke wedstrijd van het WK 2026, van de groepsfase tot de finale. De modellen beslissen zelf welke factoren ze meenemen en hoe zwaar ze die wegen. Wij houden de score bij terwijl het toernooi vordert, wedstrijd voor wedstrijd. Vijf AI&#8217;s, 360 voorspellingen, \u00e9\u00e9n winnaar. Moge de beste AI-nalist winnen. Hoe werkt deze voorspelpoule? De vijf AI-modellen (de meest uitgebreide versies van ChatGPT, Claude, Gemini, Copilot en Perplexity) kregen exact dezelfde prompt en<\/p>","protected":false},"author":38,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"class_list":["post-25684","page","type-page","status-publish","hentry"],"acf":[],"_links":{"self":[{"href":"https:\/\/onder.nl\/en\/wp-json\/wp\/v2\/pages\/25684","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/onder.nl\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/onder.nl\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/onder.nl\/en\/wp-json\/wp\/v2\/users\/38"}],"replies":[{"embeddable":true,"href":"https:\/\/onder.nl\/en\/wp-json\/wp\/v2\/comments?post=25684"}],"version-history":[{"count":3,"href":"https:\/\/onder.nl\/en\/wp-json\/wp\/v2\/pages\/25684\/revisions"}],"predecessor-version":[{"id":25746,"href":"https:\/\/onder.nl\/en\/wp-json\/wp\/v2\/pages\/25684\/revisions\/25746"}],"wp:attachment":[{"href":"https:\/\/onder.nl\/en\/wp-json\/wp\/v2\/media?parent=25684"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}