@claudinho/cli 0.6.2 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (3) hide show
  1. package/README.md +6 -2
  2. package/dist/index.js +1363 -271
  3. package/package.json +4 -4
package/dist/index.js CHANGED
@@ -257,6 +257,151 @@ function nationToRegion(nameOrCode) {
257
257
  if (byCode) return byCode;
258
258
  return intlNameMap()[norm(nameOrCode)];
259
259
  }
260
+ var EN = {
261
+ "bracket.title": "Knockout bracket",
262
+ "bracket.stageTitle": "Knockout \xB7 {stage}",
263
+ "bracket.shareTitle": "Knockout bracket \xB7 2026",
264
+ "bracket.degraded": "Live scores unavailable \u2014 bracket structure only, no confirmed advancement.",
265
+ "bracket.standingsDegraded": "Live standings unavailable \u2014 group slots stay TBD until groups finish.",
266
+ "bracket.treeFallback": "Terminal too narrow for tree view \u2014 showing staged list.",
267
+ "bracket.empty": "No bracket matches available.",
268
+ "bracket.projected": "(proj.)",
269
+ "bracket.invalidStage": "Stage must be one of: R32, R16, QF, SF, 3P, F",
270
+ "bracket.unknownStage": 'Unknown stage "{stage}". Use R32, R16, QF, SF, 3P, or F.',
271
+ "bracket.slot.groupWinner": "Group {group} winner",
272
+ "bracket.slot.groupSecond": "Group {group} 2nd",
273
+ "bracket.slot.third": "3rd ({groups})",
274
+ "bracket.slot.winner": "{stage} {n} winner",
275
+ "bracket.slot.loser": "{stage} {n} loser",
276
+ "bracket.slot.tbd": "TBD",
277
+ "live.data": "Live data: {source}",
278
+ "share.tryIt": "Try it: {line}",
279
+ "stage.group": "Group {group}",
280
+ "stage.groupStage": "Group stage",
281
+ "stage.r32": "Round of 32",
282
+ "stage.r16": "Round of 16",
283
+ "stage.qf": "Quarter-final",
284
+ "stage.sf": "Semi-final",
285
+ "stage.3p": "Third-place play-off",
286
+ "stage.f": "Final",
287
+ "stage.friendly": "Friendly"
288
+ };
289
+ var ES = {
290
+ "bracket.title": "Cuadro de eliminatorias",
291
+ "bracket.stageTitle": "Eliminatorias \xB7 {stage}",
292
+ "bracket.shareTitle": "Cuadro de eliminatorias \xB7 2026",
293
+ "bracket.degraded": "Marcadores en vivo no disponibles \u2014 solo estructura del cuadro, sin avances confirmados.",
294
+ "bracket.standingsDegraded": "Tabla en vivo no disponible \u2014 los cupos de grupo siguen por definir hasta que terminen los grupos.",
295
+ "bracket.treeFallback": "Terminal demasiado estrecha para el \xE1rbol \u2014 mostrando lista por fase.",
296
+ "bracket.empty": "No hay partidos de eliminatorias disponibles.",
297
+ "bracket.projected": "(proy.)",
298
+ "bracket.invalidStage": "La fase debe ser una de: R32, R16, QF, SF, 3P, F",
299
+ "bracket.unknownStage": 'Fase desconocida "{stage}". Usa R32, R16, QF, SF, 3P o F.',
300
+ "bracket.slot.groupWinner": "Ganador del grupo {group}",
301
+ "bracket.slot.groupSecond": "2.\xBA del grupo {group}",
302
+ "bracket.slot.third": "3.\xBA ({groups})",
303
+ "bracket.slot.winner": "Ganador {stage} {n}",
304
+ "bracket.slot.loser": "Perdedor {stage} {n}",
305
+ "bracket.slot.tbd": "Por definir",
306
+ "live.data": "Datos en vivo: {source}",
307
+ "share.tryIt": "Pru\xE9balo: {line}",
308
+ "stage.group": "Grupo {group}",
309
+ "stage.groupStage": "Fase de grupos",
310
+ "stage.r32": "Dieciseisavos de final",
311
+ "stage.r16": "Octavos de final",
312
+ "stage.qf": "Cuartos de final",
313
+ "stage.sf": "Semifinal",
314
+ "stage.3p": "Tercer puesto",
315
+ "stage.f": "Final",
316
+ "stage.friendly": "Amistoso"
317
+ };
318
+ var PT = {
319
+ "bracket.title": "Chave do mata-mata",
320
+ "bracket.stageTitle": "Mata-mata \xB7 {stage}",
321
+ "bracket.shareTitle": "Chave do mata-mata \xB7 2026",
322
+ "bracket.degraded": "Placar ao vivo indispon\xEDvel \u2014 apenas a estrutura da chave, sem avan\xE7os confirmados.",
323
+ "bracket.standingsDegraded": "Classifica\xE7\xE3o ao vivo indispon\xEDvel \u2014 vagas de grupo seguem a definir at\xE9 o fim dos grupos.",
324
+ "bracket.treeFallback": "Terminal estreito demais para a \xE1rvore \u2014 mostrando lista por fase.",
325
+ "bracket.empty": "Nenhum jogo do mata-mata dispon\xEDvel.",
326
+ "bracket.projected": "(proj.)",
327
+ "bracket.invalidStage": "A fase deve ser uma de: R32, R16, QF, SF, 3P, F",
328
+ "bracket.unknownStage": 'Fase desconhecida "{stage}". Use R32, R16, QF, SF, 3P ou F.',
329
+ "bracket.slot.groupWinner": "Vencedor do grupo {group}",
330
+ "bracket.slot.groupSecond": "2.\xBA do grupo {group}",
331
+ "bracket.slot.third": "3.\xBA ({groups})",
332
+ "bracket.slot.winner": "Vencedor {stage} {n}",
333
+ "bracket.slot.loser": "Perdedor {stage} {n}",
334
+ "bracket.slot.tbd": "A definir",
335
+ "live.data": "Dados ao vivo: {source}",
336
+ "share.tryIt": "Experimente: {line}",
337
+ "stage.group": "Grupo {group}",
338
+ "stage.groupStage": "Fase de grupos",
339
+ "stage.r32": "Fase de 32 equipes",
340
+ "stage.r16": "Oitavas de final",
341
+ "stage.qf": "Quartas de final",
342
+ "stage.sf": "Semifinal",
343
+ "stage.3p": "Disputa do 3.\xBA lugar",
344
+ "stage.f": "Final",
345
+ "stage.friendly": "Amistoso"
346
+ };
347
+ var FR = {
348
+ "bracket.title": "Tableau \xE0 \xE9limination directe",
349
+ "bracket.stageTitle": "\xC9liminatoires \xB7 {stage}",
350
+ "bracket.shareTitle": "Tableau \xE0 \xE9limination directe \xB7 2026",
351
+ "bracket.degraded": "Scores en direct indisponibles \u2014 structure du tableau seulement, aucune qualification confirm\xE9e.",
352
+ "bracket.standingsDegraded": "Classement en direct indisponible \u2014 les places de groupe restent \xE0 d\xE9finir jusqu\u2019\xE0 la fin des poules.",
353
+ "bracket.treeFallback": "Terminal trop \xE9troit pour l\u2019arbre \u2014 affichage par phase.",
354
+ "bracket.empty": "Aucun match \xE0 \xE9limination directe disponible.",
355
+ "bracket.projected": "(proj.)",
356
+ "bracket.invalidStage": "La phase doit \xEAtre l\u2019une de : R32, R16, QF, SF, 3P, F",
357
+ "bracket.unknownStage": "Phase inconnue \xAB {stage} \xBB. Utilisez R32, R16, QF, SF, 3P ou F.",
358
+ "bracket.slot.groupWinner": "Vainqueur du groupe {group}",
359
+ "bracket.slot.groupSecond": "2e du groupe {group}",
360
+ "bracket.slot.third": "3e ({groups})",
361
+ "bracket.slot.winner": "Vainqueur {stage} {n}",
362
+ "bracket.slot.loser": "Perdant {stage} {n}",
363
+ "bracket.slot.tbd": "\xC0 d\xE9finir",
364
+ "live.data": "Donn\xE9es en direct : {source}",
365
+ "share.tryIt": "Essayez : {line}",
366
+ "stage.group": "Groupe {group}",
367
+ "stage.groupStage": "Phase de groupes",
368
+ "stage.r32": "Seizi\xE8mes de finale",
369
+ "stage.r16": "Huiti\xE8mes de finale",
370
+ "stage.qf": "Quarts de finale",
371
+ "stage.sf": "Demi-finale",
372
+ "stage.3p": "Match pour la 3e place",
373
+ "stage.f": "Finale",
374
+ "stage.friendly": "Match amical"
375
+ };
376
+ var CATALOGS = { en: EN, es: ES, pt: PT, fr: FR };
377
+ function normalizeLang(lang) {
378
+ const code = (lang ?? "en").slice(0, 2).toLowerCase();
379
+ if (code === "es" || code === "pt" || code === "fr") return code;
380
+ return "en";
381
+ }
382
+ function t(lang, key, vars) {
383
+ const dict = CATALOGS[normalizeLang(lang)];
384
+ let s = dict[key] ?? EN[key] ?? key;
385
+ if (vars) {
386
+ for (const [k, v] of Object.entries(vars)) s = s.replaceAll(`{${k}}`, v);
387
+ }
388
+ return s;
389
+ }
390
+ var STAGE_KEYS = {
391
+ GROUP: "stage.groupStage",
392
+ R32: "stage.r32",
393
+ R16: "stage.r16",
394
+ QF: "stage.qf",
395
+ SF: "stage.sf",
396
+ "3P": "stage.3p",
397
+ F: "stage.f",
398
+ FRIENDLY: "stage.friendly"
399
+ };
400
+ function stageLabelI18n(lang, stage, group) {
401
+ if (group) return t(lang, "stage.group", { group });
402
+ const key = STAGE_KEYS[stage];
403
+ return key ? t(lang, key) : stage;
404
+ }
260
405
  function isValidTimeZone(tz) {
261
406
  if (!tz) return false;
262
407
  try {
@@ -350,6 +495,11 @@ function localDate(iso, tz) {
350
495
  timeZone: zone
351
496
  }).format(new Date(iso));
352
497
  }
498
+ function outcomeFromScore(home, away) {
499
+ if (home > away) return "H";
500
+ if (home < away) return "A";
501
+ return "D";
502
+ }
353
503
  function isLive(status) {
354
504
  return status === "LIVE" || status === "HT";
355
505
  }
@@ -366,6 +516,29 @@ function matchLocation(match) {
366
516
  function byKickoff(a, b) {
367
517
  return a.kickoff.localeCompare(b.kickoff);
368
518
  }
519
+ function stageLabel(m) {
520
+ if (m.group) return `Group ${m.group}`;
521
+ switch (m.stage) {
522
+ case "GROUP":
523
+ return "Group stage";
524
+ case "R32":
525
+ return "Round of 32";
526
+ case "R16":
527
+ return "Round of 16";
528
+ case "QF":
529
+ return "Quarter-final";
530
+ case "SF":
531
+ return "Semi-final";
532
+ case "3P":
533
+ return "Third-place play-off";
534
+ case "F":
535
+ return "Final";
536
+ case "FRIENDLY":
537
+ return "Friendly";
538
+ default:
539
+ return "";
540
+ }
541
+ }
369
542
  var FLAVOR_LEVELS = ["off", "subtle", "full"];
370
543
  var DEFAULT_FLAVOR = "full";
371
544
  function isFlavorLevel(s) {
@@ -454,7 +627,7 @@ var schedule_2026_default = [
454
627
  flag: "\u{1F1FF}\u{1F1E6}"
455
628
  },
456
629
  status: "SCHEDULED",
457
- updatedAt: "2026-06-07T07:52:54.333Z"
630
+ updatedAt: "2026-06-24T01:20:06.301Z"
458
631
  },
459
632
  {
460
633
  id: "760414",
@@ -475,7 +648,7 @@ var schedule_2026_default = [
475
648
  flag: "\u{1F1E8}\u{1F1FF}"
476
649
  },
477
650
  status: "SCHEDULED",
478
- updatedAt: "2026-06-07T07:52:54.337Z"
651
+ updatedAt: "2026-06-24T01:20:06.302Z"
479
652
  },
480
653
  {
481
654
  id: "760416",
@@ -496,7 +669,7 @@ var schedule_2026_default = [
496
669
  flag: "\u{1F1E7}\u{1F1E6}"
497
670
  },
498
671
  status: "SCHEDULED",
499
- updatedAt: "2026-06-07T07:52:54.337Z"
672
+ updatedAt: "2026-06-24T01:20:06.302Z"
500
673
  },
501
674
  {
502
675
  id: "760417",
@@ -517,7 +690,7 @@ var schedule_2026_default = [
517
690
  flag: "\u{1F1F5}\u{1F1FE}"
518
691
  },
519
692
  status: "SCHEDULED",
520
- updatedAt: "2026-06-07T07:52:54.337Z"
693
+ updatedAt: "2026-06-24T01:20:06.302Z"
521
694
  },
522
695
  {
523
696
  id: "760420",
@@ -538,7 +711,7 @@ var schedule_2026_default = [
538
711
  flag: "\u{1F1E8}\u{1F1ED}"
539
712
  },
540
713
  status: "SCHEDULED",
541
- updatedAt: "2026-06-07T07:52:54.337Z"
714
+ updatedAt: "2026-06-24T01:20:06.302Z"
542
715
  },
543
716
  {
544
717
  id: "760419",
@@ -559,7 +732,7 @@ var schedule_2026_default = [
559
732
  flag: "\u{1F1F2}\u{1F1E6}"
560
733
  },
561
734
  status: "SCHEDULED",
562
- updatedAt: "2026-06-07T07:52:54.337Z"
735
+ updatedAt: "2026-06-24T01:20:06.302Z"
563
736
  },
564
737
  {
565
738
  id: "760418",
@@ -580,7 +753,7 @@ var schedule_2026_default = [
580
753
  flag: "\u{1F3F4}\u{E0067}\u{E0062}\u{E0073}\u{E0063}\u{E0074}\u{E007F}"
581
754
  },
582
755
  status: "SCHEDULED",
583
- updatedAt: "2026-06-07T07:52:54.337Z"
756
+ updatedAt: "2026-06-24T01:20:06.302Z"
584
757
  },
585
758
  {
586
759
  id: "760421",
@@ -601,7 +774,7 @@ var schedule_2026_default = [
601
774
  flag: "\u{1F1F9}\u{1F1F7}"
602
775
  },
603
776
  status: "SCHEDULED",
604
- updatedAt: "2026-06-07T07:52:54.337Z"
777
+ updatedAt: "2026-06-24T01:20:06.302Z"
605
778
  },
606
779
  {
607
780
  id: "760422",
@@ -622,7 +795,7 @@ var schedule_2026_default = [
622
795
  flag: "\u{1F1E8}\u{1F1FC}"
623
796
  },
624
797
  status: "SCHEDULED",
625
- updatedAt: "2026-06-07T07:52:54.337Z"
798
+ updatedAt: "2026-06-24T01:20:06.302Z"
626
799
  },
627
800
  {
628
801
  id: "760425",
@@ -643,7 +816,7 @@ var schedule_2026_default = [
643
816
  flag: "\u{1F1EF}\u{1F1F5}"
644
817
  },
645
818
  status: "SCHEDULED",
646
- updatedAt: "2026-06-07T07:52:54.337Z"
819
+ updatedAt: "2026-06-24T01:20:06.302Z"
647
820
  },
648
821
  {
649
822
  id: "760423",
@@ -664,7 +837,7 @@ var schedule_2026_default = [
664
837
  flag: "\u{1F1EA}\u{1F1E8}"
665
838
  },
666
839
  status: "SCHEDULED",
667
- updatedAt: "2026-06-07T07:52:54.337Z"
840
+ updatedAt: "2026-06-24T01:20:06.302Z"
668
841
  },
669
842
  {
670
843
  id: "760424",
@@ -685,7 +858,7 @@ var schedule_2026_default = [
685
858
  flag: "\u{1F1F9}\u{1F1F3}"
686
859
  },
687
860
  status: "SCHEDULED",
688
- updatedAt: "2026-06-07T07:52:54.337Z"
861
+ updatedAt: "2026-06-24T01:20:06.302Z"
689
862
  },
690
863
  {
691
864
  id: "760428",
@@ -706,7 +879,7 @@ var schedule_2026_default = [
706
879
  flag: "\u{1F1E8}\u{1F1FB}"
707
880
  },
708
881
  status: "SCHEDULED",
709
- updatedAt: "2026-06-07T07:52:54.337Z"
882
+ updatedAt: "2026-06-24T01:20:06.302Z"
710
883
  },
711
884
  {
712
885
  id: "760426",
@@ -727,7 +900,7 @@ var schedule_2026_default = [
727
900
  flag: "\u{1F1EA}\u{1F1EC}"
728
901
  },
729
902
  status: "SCHEDULED",
730
- updatedAt: "2026-06-07T07:52:54.337Z"
903
+ updatedAt: "2026-06-24T01:20:06.302Z"
731
904
  },
732
905
  {
733
906
  id: "760429",
@@ -748,7 +921,7 @@ var schedule_2026_default = [
748
921
  flag: "\u{1F1FA}\u{1F1FE}"
749
922
  },
750
923
  status: "SCHEDULED",
751
- updatedAt: "2026-06-07T07:52:54.337Z"
924
+ updatedAt: "2026-06-24T01:20:06.302Z"
752
925
  },
753
926
  {
754
927
  id: "760427",
@@ -769,7 +942,7 @@ var schedule_2026_default = [
769
942
  flag: "\u{1F1F3}\u{1F1FF}"
770
943
  },
771
944
  status: "SCHEDULED",
772
- updatedAt: "2026-06-07T07:52:54.337Z"
945
+ updatedAt: "2026-06-24T01:20:06.302Z"
773
946
  },
774
947
  {
775
948
  id: "760432",
@@ -790,7 +963,7 @@ var schedule_2026_default = [
790
963
  flag: "\u{1F1F8}\u{1F1F3}"
791
964
  },
792
965
  status: "SCHEDULED",
793
- updatedAt: "2026-06-07T07:52:54.337Z"
966
+ updatedAt: "2026-06-24T01:20:06.302Z"
794
967
  },
795
968
  {
796
969
  id: "760430",
@@ -811,7 +984,7 @@ var schedule_2026_default = [
811
984
  flag: "\u{1F1F3}\u{1F1F4}"
812
985
  },
813
986
  status: "SCHEDULED",
814
- updatedAt: "2026-06-07T07:52:54.337Z"
987
+ updatedAt: "2026-06-24T01:20:06.302Z"
815
988
  },
816
989
  {
817
990
  id: "760433",
@@ -832,7 +1005,7 @@ var schedule_2026_default = [
832
1005
  flag: "\u{1F1E9}\u{1F1FF}"
833
1006
  },
834
1007
  status: "SCHEDULED",
835
- updatedAt: "2026-06-07T07:52:54.337Z"
1008
+ updatedAt: "2026-06-24T01:20:06.302Z"
836
1009
  },
837
1010
  {
838
1011
  id: "760431",
@@ -853,7 +1026,7 @@ var schedule_2026_default = [
853
1026
  flag: "\u{1F1EF}\u{1F1F4}"
854
1027
  },
855
1028
  status: "SCHEDULED",
856
- updatedAt: "2026-06-07T07:52:54.337Z"
1029
+ updatedAt: "2026-06-24T01:20:06.302Z"
857
1030
  },
858
1031
  {
859
1032
  id: "760435",
@@ -874,7 +1047,7 @@ var schedule_2026_default = [
874
1047
  flag: "\u{1F1E8}\u{1F1E9}"
875
1048
  },
876
1049
  status: "SCHEDULED",
877
- updatedAt: "2026-06-07T07:52:54.337Z"
1050
+ updatedAt: "2026-06-24T01:20:06.302Z"
878
1051
  },
879
1052
  {
880
1053
  id: "760437",
@@ -895,7 +1068,7 @@ var schedule_2026_default = [
895
1068
  flag: "\u{1F1ED}\u{1F1F7}"
896
1069
  },
897
1070
  status: "SCHEDULED",
898
- updatedAt: "2026-06-07T07:52:54.337Z"
1071
+ updatedAt: "2026-06-24T01:20:06.302Z"
899
1072
  },
900
1073
  {
901
1074
  id: "760434",
@@ -916,7 +1089,7 @@ var schedule_2026_default = [
916
1089
  flag: "\u{1F1F5}\u{1F1E6}"
917
1090
  },
918
1091
  status: "SCHEDULED",
919
- updatedAt: "2026-06-07T07:52:54.337Z"
1092
+ updatedAt: "2026-06-24T01:20:06.302Z"
920
1093
  },
921
1094
  {
922
1095
  id: "760436",
@@ -937,7 +1110,7 @@ var schedule_2026_default = [
937
1110
  flag: "\u{1F1E8}\u{1F1F4}"
938
1111
  },
939
1112
  status: "SCHEDULED",
940
- updatedAt: "2026-06-07T07:52:54.337Z"
1113
+ updatedAt: "2026-06-24T01:20:06.302Z"
941
1114
  },
942
1115
  {
943
1116
  id: "760438",
@@ -958,7 +1131,7 @@ var schedule_2026_default = [
958
1131
  flag: "\u{1F1FF}\u{1F1E6}"
959
1132
  },
960
1133
  status: "SCHEDULED",
961
- updatedAt: "2026-06-07T07:52:54.418Z"
1134
+ updatedAt: "2026-06-24T01:20:06.394Z"
962
1135
  },
963
1136
  {
964
1137
  id: "760439",
@@ -979,7 +1152,7 @@ var schedule_2026_default = [
979
1152
  flag: "\u{1F1E7}\u{1F1E6}"
980
1153
  },
981
1154
  status: "SCHEDULED",
982
- updatedAt: "2026-06-07T07:52:54.418Z"
1155
+ updatedAt: "2026-06-24T01:20:06.394Z"
983
1156
  },
984
1157
  {
985
1158
  id: "760440",
@@ -1000,7 +1173,7 @@ var schedule_2026_default = [
1000
1173
  flag: "\u{1F1F6}\u{1F1E6}"
1001
1174
  },
1002
1175
  status: "SCHEDULED",
1003
- updatedAt: "2026-06-07T07:52:54.418Z"
1176
+ updatedAt: "2026-06-24T01:20:06.394Z"
1004
1177
  },
1005
1178
  {
1006
1179
  id: "760441",
@@ -1021,7 +1194,7 @@ var schedule_2026_default = [
1021
1194
  flag: "\u{1F1F0}\u{1F1F7}"
1022
1195
  },
1023
1196
  status: "SCHEDULED",
1024
- updatedAt: "2026-06-07T07:52:54.418Z"
1197
+ updatedAt: "2026-06-24T01:20:06.394Z"
1025
1198
  },
1026
1199
  {
1027
1200
  id: "760442",
@@ -1042,7 +1215,7 @@ var schedule_2026_default = [
1042
1215
  flag: "\u{1F1E6}\u{1F1FA}"
1043
1216
  },
1044
1217
  status: "SCHEDULED",
1045
- updatedAt: "2026-06-07T07:52:54.418Z"
1218
+ updatedAt: "2026-06-24T01:20:06.394Z"
1046
1219
  },
1047
1220
  {
1048
1221
  id: "760445",
@@ -1063,7 +1236,7 @@ var schedule_2026_default = [
1063
1236
  flag: "\u{1F1F2}\u{1F1E6}"
1064
1237
  },
1065
1238
  status: "SCHEDULED",
1066
- updatedAt: "2026-06-07T07:52:54.418Z"
1239
+ updatedAt: "2026-06-24T01:20:06.394Z"
1067
1240
  },
1068
1241
  {
1069
1242
  id: "760444",
@@ -1084,7 +1257,7 @@ var schedule_2026_default = [
1084
1257
  flag: "\u{1F1ED}\u{1F1F9}"
1085
1258
  },
1086
1259
  status: "SCHEDULED",
1087
- updatedAt: "2026-06-07T07:52:54.418Z"
1260
+ updatedAt: "2026-06-24T01:20:06.394Z"
1088
1261
  },
1089
1262
  {
1090
1263
  id: "760443",
@@ -1105,7 +1278,7 @@ var schedule_2026_default = [
1105
1278
  flag: "\u{1F1F5}\u{1F1FE}"
1106
1279
  },
1107
1280
  status: "SCHEDULED",
1108
- updatedAt: "2026-06-07T07:52:54.418Z"
1281
+ updatedAt: "2026-06-24T01:20:06.394Z"
1109
1282
  },
1110
1283
  {
1111
1284
  id: "760447",
@@ -1126,7 +1299,7 @@ var schedule_2026_default = [
1126
1299
  flag: "\u{1F1F8}\u{1F1EA}"
1127
1300
  },
1128
1301
  status: "SCHEDULED",
1129
- updatedAt: "2026-06-07T07:52:54.418Z"
1302
+ updatedAt: "2026-06-24T01:20:06.394Z"
1130
1303
  },
1131
1304
  {
1132
1305
  id: "760448",
@@ -1147,7 +1320,7 @@ var schedule_2026_default = [
1147
1320
  flag: "\u{1F1E8}\u{1F1EE}"
1148
1321
  },
1149
1322
  status: "SCHEDULED",
1150
- updatedAt: "2026-06-07T07:52:54.418Z"
1323
+ updatedAt: "2026-06-24T01:20:06.394Z"
1151
1324
  },
1152
1325
  {
1153
1326
  id: "760446",
@@ -1168,7 +1341,7 @@ var schedule_2026_default = [
1168
1341
  flag: "\u{1F1E8}\u{1F1FC}"
1169
1342
  },
1170
1343
  status: "SCHEDULED",
1171
- updatedAt: "2026-06-07T07:52:54.418Z"
1344
+ updatedAt: "2026-06-24T01:20:06.394Z"
1172
1345
  },
1173
1346
  {
1174
1347
  id: "760449",
@@ -1189,7 +1362,7 @@ var schedule_2026_default = [
1189
1362
  flag: "\u{1F1EF}\u{1F1F5}"
1190
1363
  },
1191
1364
  status: "SCHEDULED",
1192
- updatedAt: "2026-06-07T07:52:54.418Z"
1365
+ updatedAt: "2026-06-24T01:20:06.394Z"
1193
1366
  },
1194
1367
  {
1195
1368
  id: "760453",
@@ -1210,7 +1383,7 @@ var schedule_2026_default = [
1210
1383
  flag: "\u{1F1F8}\u{1F1E6}"
1211
1384
  },
1212
1385
  status: "SCHEDULED",
1213
- updatedAt: "2026-06-07T07:52:54.418Z"
1386
+ updatedAt: "2026-06-24T01:20:06.394Z"
1214
1387
  },
1215
1388
  {
1216
1389
  id: "760451",
@@ -1231,7 +1404,7 @@ var schedule_2026_default = [
1231
1404
  flag: "\u{1F1EE}\u{1F1F7}"
1232
1405
  },
1233
1406
  status: "SCHEDULED",
1234
- updatedAt: "2026-06-07T07:52:54.418Z"
1407
+ updatedAt: "2026-06-24T01:20:06.394Z"
1235
1408
  },
1236
1409
  {
1237
1410
  id: "760450",
@@ -1252,7 +1425,7 @@ var schedule_2026_default = [
1252
1425
  flag: "\u{1F1E8}\u{1F1FB}"
1253
1426
  },
1254
1427
  status: "SCHEDULED",
1255
- updatedAt: "2026-06-07T07:52:54.418Z"
1428
+ updatedAt: "2026-06-24T01:20:06.394Z"
1256
1429
  },
1257
1430
  {
1258
1431
  id: "760452",
@@ -1273,7 +1446,7 @@ var schedule_2026_default = [
1273
1446
  flag: "\u{1F1EA}\u{1F1EC}"
1274
1447
  },
1275
1448
  status: "SCHEDULED",
1276
- updatedAt: "2026-06-07T07:52:54.418Z"
1449
+ updatedAt: "2026-06-24T01:20:06.394Z"
1277
1450
  },
1278
1451
  {
1279
1452
  id: "760456",
@@ -1294,7 +1467,7 @@ var schedule_2026_default = [
1294
1467
  flag: "\u{1F1E6}\u{1F1F9}"
1295
1468
  },
1296
1469
  status: "SCHEDULED",
1297
- updatedAt: "2026-06-07T07:52:54.418Z"
1470
+ updatedAt: "2026-06-24T01:20:06.394Z"
1298
1471
  },
1299
1472
  {
1300
1473
  id: "760457",
@@ -1315,7 +1488,7 @@ var schedule_2026_default = [
1315
1488
  flag: "\u{1F1EE}\u{1F1F6}"
1316
1489
  },
1317
1490
  status: "SCHEDULED",
1318
- updatedAt: "2026-06-07T07:52:54.418Z"
1491
+ updatedAt: "2026-06-24T01:20:06.394Z"
1319
1492
  },
1320
1493
  {
1321
1494
  id: "760454",
@@ -1336,7 +1509,7 @@ var schedule_2026_default = [
1336
1509
  flag: "\u{1F1F8}\u{1F1F3}"
1337
1510
  },
1338
1511
  status: "SCHEDULED",
1339
- updatedAt: "2026-06-07T07:52:54.418Z"
1512
+ updatedAt: "2026-06-24T01:20:06.394Z"
1340
1513
  },
1341
1514
  {
1342
1515
  id: "760455",
@@ -1357,7 +1530,7 @@ var schedule_2026_default = [
1357
1530
  flag: "\u{1F1E9}\u{1F1FF}"
1358
1531
  },
1359
1532
  status: "SCHEDULED",
1360
- updatedAt: "2026-06-07T07:52:54.418Z"
1533
+ updatedAt: "2026-06-24T01:20:06.394Z"
1361
1534
  },
1362
1535
  {
1363
1536
  id: "760461",
@@ -1378,7 +1551,7 @@ var schedule_2026_default = [
1378
1551
  flag: "\u{1F1FA}\u{1F1FF}"
1379
1552
  },
1380
1553
  status: "SCHEDULED",
1381
- updatedAt: "2026-06-07T07:52:54.418Z"
1554
+ updatedAt: "2026-06-24T01:20:06.394Z"
1382
1555
  },
1383
1556
  {
1384
1557
  id: "760458",
@@ -1399,7 +1572,7 @@ var schedule_2026_default = [
1399
1572
  flag: "\u{1F1EC}\u{1F1ED}"
1400
1573
  },
1401
1574
  status: "SCHEDULED",
1402
- updatedAt: "2026-06-07T07:52:54.418Z"
1575
+ updatedAt: "2026-06-24T01:20:06.394Z"
1403
1576
  },
1404
1577
  {
1405
1578
  id: "760460",
@@ -1420,7 +1593,7 @@ var schedule_2026_default = [
1420
1593
  flag: "\u{1F1ED}\u{1F1F7}"
1421
1594
  },
1422
1595
  status: "SCHEDULED",
1423
- updatedAt: "2026-06-07T07:52:54.419Z"
1596
+ updatedAt: "2026-06-24T01:20:06.394Z"
1424
1597
  },
1425
1598
  {
1426
1599
  id: "760459",
@@ -1441,7 +1614,7 @@ var schedule_2026_default = [
1441
1614
  flag: "\u{1F1E8}\u{1F1E9}"
1442
1615
  },
1443
1616
  status: "SCHEDULED",
1444
- updatedAt: "2026-06-07T07:52:54.419Z"
1617
+ updatedAt: "2026-06-24T01:20:06.394Z"
1445
1618
  },
1446
1619
  {
1447
1620
  id: "760462",
@@ -1462,7 +1635,7 @@ var schedule_2026_default = [
1462
1635
  flag: "\u{1F1F6}\u{1F1E6}"
1463
1636
  },
1464
1637
  status: "SCHEDULED",
1465
- updatedAt: "2026-06-07T07:52:54.419Z"
1638
+ updatedAt: "2026-06-24T01:20:06.394Z"
1466
1639
  },
1467
1640
  {
1468
1641
  id: "760463",
@@ -1483,7 +1656,7 @@ var schedule_2026_default = [
1483
1656
  flag: "\u{1F1E8}\u{1F1E6}"
1484
1657
  },
1485
1658
  status: "SCHEDULED",
1486
- updatedAt: "2026-06-07T07:52:54.419Z"
1659
+ updatedAt: "2026-06-24T01:20:06.394Z"
1487
1660
  },
1488
1661
  {
1489
1662
  id: "760464",
@@ -1504,7 +1677,7 @@ var schedule_2026_default = [
1504
1677
  flag: "\u{1F1ED}\u{1F1F9}"
1505
1678
  },
1506
1679
  status: "SCHEDULED",
1507
- updatedAt: "2026-06-07T07:52:54.419Z"
1680
+ updatedAt: "2026-06-24T01:20:06.394Z"
1508
1681
  },
1509
1682
  {
1510
1683
  id: "760465",
@@ -1525,7 +1698,7 @@ var schedule_2026_default = [
1525
1698
  flag: "\u{1F1E7}\u{1F1F7}"
1526
1699
  },
1527
1700
  status: "SCHEDULED",
1528
- updatedAt: "2026-06-07T07:52:54.419Z"
1701
+ updatedAt: "2026-06-24T01:20:06.394Z"
1529
1702
  },
1530
1703
  {
1531
1704
  id: "760467",
@@ -1546,7 +1719,7 @@ var schedule_2026_default = [
1546
1719
  flag: "\u{1F1F2}\u{1F1FD}"
1547
1720
  },
1548
1721
  status: "SCHEDULED",
1549
- updatedAt: "2026-06-07T07:52:54.419Z"
1722
+ updatedAt: "2026-06-24T01:20:06.394Z"
1550
1723
  },
1551
1724
  {
1552
1725
  id: "760466",
@@ -1567,7 +1740,7 @@ var schedule_2026_default = [
1567
1740
  flag: "\u{1F1F0}\u{1F1F7}"
1568
1741
  },
1569
1742
  status: "SCHEDULED",
1570
- updatedAt: "2026-06-07T07:52:54.419Z"
1743
+ updatedAt: "2026-06-24T01:20:06.394Z"
1571
1744
  },
1572
1745
  {
1573
1746
  id: "760473",
@@ -1588,7 +1761,7 @@ var schedule_2026_default = [
1588
1761
  flag: "\u{1F1E8}\u{1F1EE}"
1589
1762
  },
1590
1763
  status: "SCHEDULED",
1591
- updatedAt: "2026-06-07T07:52:54.511Z"
1764
+ updatedAt: "2026-06-24T01:20:06.523Z"
1592
1765
  },
1593
1766
  {
1594
1767
  id: "760468",
@@ -1609,7 +1782,7 @@ var schedule_2026_default = [
1609
1782
  flag: "\u{1F1E9}\u{1F1EA}"
1610
1783
  },
1611
1784
  status: "SCHEDULED",
1612
- updatedAt: "2026-06-07T07:52:54.511Z"
1785
+ updatedAt: "2026-06-24T01:20:06.523Z"
1613
1786
  },
1614
1787
  {
1615
1788
  id: "760471",
@@ -1630,7 +1803,7 @@ var schedule_2026_default = [
1630
1803
  flag: "\u{1F1F8}\u{1F1EA}"
1631
1804
  },
1632
1805
  status: "SCHEDULED",
1633
- updatedAt: "2026-06-07T07:52:54.511Z"
1806
+ updatedAt: "2026-06-24T01:20:06.523Z"
1634
1807
  },
1635
1808
  {
1636
1809
  id: "760472",
@@ -1651,7 +1824,7 @@ var schedule_2026_default = [
1651
1824
  flag: "\u{1F1F3}\u{1F1F1}"
1652
1825
  },
1653
1826
  status: "SCHEDULED",
1654
- updatedAt: "2026-06-07T07:52:54.511Z"
1827
+ updatedAt: "2026-06-24T01:20:06.523Z"
1655
1828
  },
1656
1829
  {
1657
1830
  id: "760469",
@@ -1672,7 +1845,7 @@ var schedule_2026_default = [
1672
1845
  flag: "\u{1F1E6}\u{1F1FA}"
1673
1846
  },
1674
1847
  status: "SCHEDULED",
1675
- updatedAt: "2026-06-07T07:52:54.511Z"
1848
+ updatedAt: "2026-06-24T01:20:06.523Z"
1676
1849
  },
1677
1850
  {
1678
1851
  id: "760470",
@@ -1693,7 +1866,7 @@ var schedule_2026_default = [
1693
1866
  flag: "\u{1F1FA}\u{1F1F8}"
1694
1867
  },
1695
1868
  status: "SCHEDULED",
1696
- updatedAt: "2026-06-07T07:52:54.511Z"
1869
+ updatedAt: "2026-06-24T01:20:06.523Z"
1697
1870
  },
1698
1871
  {
1699
1872
  id: "760475",
@@ -1714,7 +1887,7 @@ var schedule_2026_default = [
1714
1887
  flag: "\u{1F1EB}\u{1F1F7}"
1715
1888
  },
1716
1889
  status: "SCHEDULED",
1717
- updatedAt: "2026-06-07T07:52:54.511Z"
1890
+ updatedAt: "2026-06-24T01:20:06.523Z"
1718
1891
  },
1719
1892
  {
1720
1893
  id: "760474",
@@ -1735,7 +1908,7 @@ var schedule_2026_default = [
1735
1908
  flag: "\u{1F1EE}\u{1F1F6}"
1736
1909
  },
1737
1910
  status: "SCHEDULED",
1738
- updatedAt: "2026-06-07T07:52:54.511Z"
1911
+ updatedAt: "2026-06-24T01:20:06.523Z"
1739
1912
  },
1740
1913
  {
1741
1914
  id: "760478",
@@ -1756,7 +1929,7 @@ var schedule_2026_default = [
1756
1929
  flag: "\u{1F1F8}\u{1F1E6}"
1757
1930
  },
1758
1931
  status: "SCHEDULED",
1759
- updatedAt: "2026-06-07T07:52:54.511Z"
1932
+ updatedAt: "2026-06-24T01:20:06.523Z"
1760
1933
  },
1761
1934
  {
1762
1935
  id: "760479",
@@ -1777,7 +1950,7 @@ var schedule_2026_default = [
1777
1950
  flag: "\u{1F1EA}\u{1F1F8}"
1778
1951
  },
1779
1952
  status: "SCHEDULED",
1780
- updatedAt: "2026-06-07T07:52:54.511Z"
1953
+ updatedAt: "2026-06-24T01:20:06.523Z"
1781
1954
  },
1782
1955
  {
1783
1956
  id: "760476",
@@ -1798,7 +1971,7 @@ var schedule_2026_default = [
1798
1971
  flag: "\u{1F1EE}\u{1F1F7}"
1799
1972
  },
1800
1973
  status: "SCHEDULED",
1801
- updatedAt: "2026-06-07T07:52:54.511Z"
1974
+ updatedAt: "2026-06-24T01:20:06.523Z"
1802
1975
  },
1803
1976
  {
1804
1977
  id: "760477",
@@ -1819,7 +1992,7 @@ var schedule_2026_default = [
1819
1992
  flag: "\u{1F1E7}\u{1F1EA}"
1820
1993
  },
1821
1994
  status: "SCHEDULED",
1822
- updatedAt: "2026-06-07T07:52:54.511Z"
1995
+ updatedAt: "2026-06-24T01:20:06.523Z"
1823
1996
  },
1824
1997
  {
1825
1998
  id: "760480",
@@ -1840,7 +2013,7 @@ var schedule_2026_default = [
1840
2013
  flag: "\u{1F1EC}\u{1F1ED}"
1841
2014
  },
1842
2015
  status: "SCHEDULED",
1843
- updatedAt: "2026-06-07T07:52:54.512Z"
2016
+ updatedAt: "2026-06-24T01:20:06.523Z"
1844
2017
  },
1845
2018
  {
1846
2019
  id: "760485",
@@ -1861,7 +2034,7 @@ var schedule_2026_default = [
1861
2034
  flag: "\u{1F3F4}\u{E0067}\u{E0062}\u{E0065}\u{E006E}\u{E0067}\u{E007F}"
1862
2035
  },
1863
2036
  status: "SCHEDULED",
1864
- updatedAt: "2026-06-07T07:52:54.512Z"
2037
+ updatedAt: "2026-06-24T01:20:06.523Z"
1865
2038
  },
1866
2039
  {
1867
2040
  id: "760481",
@@ -1882,7 +2055,7 @@ var schedule_2026_default = [
1882
2055
  flag: "\u{1F1F5}\u{1F1F9}"
1883
2056
  },
1884
2057
  status: "SCHEDULED",
1885
- updatedAt: "2026-06-07T07:52:54.512Z"
2058
+ updatedAt: "2026-06-24T01:20:06.523Z"
1886
2059
  },
1887
2060
  {
1888
2061
  id: "760482",
@@ -1903,7 +2076,7 @@ var schedule_2026_default = [
1903
2076
  flag: "\u{1F1FA}\u{1F1FF}"
1904
2077
  },
1905
2078
  status: "SCHEDULED",
1906
- updatedAt: "2026-06-07T07:52:54.512Z"
2079
+ updatedAt: "2026-06-24T01:20:06.523Z"
1907
2080
  },
1908
2081
  {
1909
2082
  id: "760484",
@@ -1924,7 +2097,7 @@ var schedule_2026_default = [
1924
2097
  flag: "\u{1F1E6}\u{1F1F9}"
1925
2098
  },
1926
2099
  status: "SCHEDULED",
1927
- updatedAt: "2026-06-07T07:52:54.512Z"
2100
+ updatedAt: "2026-06-24T01:20:06.523Z"
1928
2101
  },
1929
2102
  {
1930
2103
  id: "760483",
@@ -1945,7 +2118,7 @@ var schedule_2026_default = [
1945
2118
  flag: "\u{1F1E6}\u{1F1F7}"
1946
2119
  },
1947
2120
  status: "SCHEDULED",
1948
- updatedAt: "2026-06-07T07:52:54.512Z"
2121
+ updatedAt: "2026-06-24T01:20:06.523Z"
1949
2122
  },
1950
2123
  {
1951
2124
  id: "760486",
@@ -1965,7 +2138,7 @@ var schedule_2026_default = [
1965
2138
  flag: "\u{1F3F3}\uFE0F"
1966
2139
  },
1967
2140
  status: "SCHEDULED",
1968
- updatedAt: "2026-06-07T07:52:54.540Z"
2141
+ updatedAt: "2026-06-24T01:20:06.529Z"
1969
2142
  },
1970
2143
  {
1971
2144
  id: "760487",
@@ -1985,7 +2158,7 @@ var schedule_2026_default = [
1985
2158
  flag: "\u{1F3F3}\uFE0F"
1986
2159
  },
1987
2160
  status: "SCHEDULED",
1988
- updatedAt: "2026-06-07T07:52:54.540Z"
2161
+ updatedAt: "2026-06-24T01:20:06.529Z"
1989
2162
  },
1990
2163
  {
1991
2164
  id: "760489",
@@ -1995,8 +2168,8 @@ var schedule_2026_default = [
1995
2168
  city: "Foxborough, Massachusetts",
1996
2169
  country: "USA",
1997
2170
  home: {
1998
- code: "1E",
1999
- name: "Group E Winner",
2171
+ code: "TBD",
2172
+ name: "Germany",
2000
2173
  flag: "\u{1F3F3}\uFE0F"
2001
2174
  },
2002
2175
  away: {
@@ -2005,7 +2178,7 @@ var schedule_2026_default = [
2005
2178
  flag: "\u{1F3F3}\uFE0F"
2006
2179
  },
2007
2180
  status: "SCHEDULED",
2008
- updatedAt: "2026-06-07T07:52:54.540Z"
2181
+ updatedAt: "2026-06-24T01:20:06.529Z"
2009
2182
  },
2010
2183
  {
2011
2184
  id: "760488",
@@ -2025,7 +2198,7 @@ var schedule_2026_default = [
2025
2198
  flag: "\u{1F3F3}\uFE0F"
2026
2199
  },
2027
2200
  status: "SCHEDULED",
2028
- updatedAt: "2026-06-07T07:52:54.540Z"
2201
+ updatedAt: "2026-06-24T01:20:06.529Z"
2029
2202
  },
2030
2203
  {
2031
2204
  id: "760490",
@@ -2045,7 +2218,7 @@ var schedule_2026_default = [
2045
2218
  flag: "\u{1F3F3}\uFE0F"
2046
2219
  },
2047
2220
  status: "SCHEDULED",
2048
- updatedAt: "2026-06-07T07:52:54.540Z"
2221
+ updatedAt: "2026-06-24T01:20:06.529Z"
2049
2222
  },
2050
2223
  {
2051
2224
  id: "760492",
@@ -2065,7 +2238,7 @@ var schedule_2026_default = [
2065
2238
  flag: "\u{1F3F3}\uFE0F"
2066
2239
  },
2067
2240
  status: "SCHEDULED",
2068
- updatedAt: "2026-06-07T07:52:54.541Z"
2241
+ updatedAt: "2026-06-24T01:20:06.529Z"
2069
2242
  },
2070
2243
  {
2071
2244
  id: "760491",
@@ -2075,8 +2248,8 @@ var schedule_2026_default = [
2075
2248
  city: "Mexico City",
2076
2249
  country: "Mexico",
2077
2250
  home: {
2078
- code: "1A",
2079
- name: "Group A Winner",
2251
+ code: "TBD",
2252
+ name: "Mexico",
2080
2253
  flag: "\u{1F3F3}\uFE0F"
2081
2254
  },
2082
2255
  away: {
@@ -2085,7 +2258,7 @@ var schedule_2026_default = [
2085
2258
  flag: "\u{1F3F3}\uFE0F"
2086
2259
  },
2087
2260
  status: "SCHEDULED",
2088
- updatedAt: "2026-06-07T07:52:54.541Z"
2261
+ updatedAt: "2026-06-24T01:20:06.529Z"
2089
2262
  },
2090
2263
  {
2091
2264
  id: "760495",
@@ -2105,7 +2278,7 @@ var schedule_2026_default = [
2105
2278
  flag: "\u{1F3F3}\uFE0F"
2106
2279
  },
2107
2280
  status: "SCHEDULED",
2108
- updatedAt: "2026-06-07T07:52:54.541Z"
2281
+ updatedAt: "2026-06-24T01:20:06.529Z"
2109
2282
  },
2110
2283
  {
2111
2284
  id: "760493",
@@ -2125,7 +2298,7 @@ var schedule_2026_default = [
2125
2298
  flag: "\u{1F3F3}\uFE0F"
2126
2299
  },
2127
2300
  status: "SCHEDULED",
2128
- updatedAt: "2026-06-07T07:52:54.541Z"
2301
+ updatedAt: "2026-06-24T01:20:06.529Z"
2129
2302
  },
2130
2303
  {
2131
2304
  id: "760494",
@@ -2135,8 +2308,8 @@ var schedule_2026_default = [
2135
2308
  city: "Santa Clara, California",
2136
2309
  country: "USA",
2137
2310
  home: {
2138
- code: "1D",
2139
- name: "Group D Winner",
2311
+ code: "TBD",
2312
+ name: "United States",
2140
2313
  flag: "\u{1F3F3}\uFE0F"
2141
2314
  },
2142
2315
  away: {
@@ -2145,7 +2318,7 @@ var schedule_2026_default = [
2145
2318
  flag: "\u{1F3F3}\uFE0F"
2146
2319
  },
2147
2320
  status: "SCHEDULED",
2148
- updatedAt: "2026-06-07T07:52:54.541Z"
2321
+ updatedAt: "2026-06-24T01:20:06.529Z"
2149
2322
  },
2150
2323
  {
2151
2324
  id: "760497",
@@ -2165,7 +2338,7 @@ var schedule_2026_default = [
2165
2338
  flag: "\u{1F3F3}\uFE0F"
2166
2339
  },
2167
2340
  status: "SCHEDULED",
2168
- updatedAt: "2026-06-07T07:52:54.616Z"
2341
+ updatedAt: "2026-06-24T01:20:06.593Z"
2169
2342
  },
2170
2343
  {
2171
2344
  id: "760496",
@@ -2185,7 +2358,7 @@ var schedule_2026_default = [
2185
2358
  flag: "\u{1F3F3}\uFE0F"
2186
2359
  },
2187
2360
  status: "SCHEDULED",
2188
- updatedAt: "2026-06-07T07:52:54.616Z"
2361
+ updatedAt: "2026-06-24T01:20:06.593Z"
2189
2362
  },
2190
2363
  {
2191
2364
  id: "760498",
@@ -2205,7 +2378,7 @@ var schedule_2026_default = [
2205
2378
  flag: "\u{1F3F3}\uFE0F"
2206
2379
  },
2207
2380
  status: "SCHEDULED",
2208
- updatedAt: "2026-06-07T07:52:54.616Z"
2381
+ updatedAt: "2026-06-24T01:20:06.593Z"
2209
2382
  },
2210
2383
  {
2211
2384
  id: "760499",
@@ -2225,7 +2398,7 @@ var schedule_2026_default = [
2225
2398
  flag: "\u{1F3F3}\uFE0F"
2226
2399
  },
2227
2400
  status: "SCHEDULED",
2228
- updatedAt: "2026-06-07T07:52:54.616Z"
2401
+ updatedAt: "2026-06-24T01:20:06.593Z"
2229
2402
  },
2230
2403
  {
2231
2404
  id: "760500",
@@ -2235,8 +2408,8 @@ var schedule_2026_default = [
2235
2408
  city: "Miami Gardens, Florida",
2236
2409
  country: "USA",
2237
2410
  home: {
2238
- code: "1J",
2239
- name: "Group J Winner",
2411
+ code: "TBD",
2412
+ name: "Argentina",
2240
2413
  flag: "\u{1F3F3}\uFE0F"
2241
2414
  },
2242
2415
  away: {
@@ -2245,7 +2418,7 @@ var schedule_2026_default = [
2245
2418
  flag: "\u{1F3F3}\uFE0F"
2246
2419
  },
2247
2420
  status: "SCHEDULED",
2248
- updatedAt: "2026-06-07T07:52:54.616Z"
2421
+ updatedAt: "2026-06-24T01:20:06.593Z"
2249
2422
  },
2250
2423
  {
2251
2424
  id: "760501",
@@ -2265,7 +2438,7 @@ var schedule_2026_default = [
2265
2438
  flag: "\u{1F3F3}\uFE0F"
2266
2439
  },
2267
2440
  status: "SCHEDULED",
2268
- updatedAt: "2026-06-07T07:52:54.616Z"
2441
+ updatedAt: "2026-06-24T01:20:06.593Z"
2269
2442
  },
2270
2443
  {
2271
2444
  id: "760502",
@@ -2285,7 +2458,7 @@ var schedule_2026_default = [
2285
2458
  flag: "\u{1F3F3}\uFE0F"
2286
2459
  },
2287
2460
  status: "SCHEDULED",
2288
- updatedAt: "2026-06-07T07:52:54.616Z"
2461
+ updatedAt: "2026-06-24T01:20:06.593Z"
2289
2462
  },
2290
2463
  {
2291
2464
  id: "760503",
@@ -2305,7 +2478,7 @@ var schedule_2026_default = [
2305
2478
  flag: "\u{1F3F3}\uFE0F"
2306
2479
  },
2307
2480
  status: "SCHEDULED",
2308
- updatedAt: "2026-06-07T07:52:54.616Z"
2481
+ updatedAt: "2026-06-24T01:20:06.593Z"
2309
2482
  },
2310
2483
  {
2311
2484
  id: "760504",
@@ -2325,7 +2498,7 @@ var schedule_2026_default = [
2325
2498
  flag: "\u{1F3F3}\uFE0F"
2326
2499
  },
2327
2500
  status: "SCHEDULED",
2328
- updatedAt: "2026-06-07T07:52:54.616Z"
2501
+ updatedAt: "2026-06-24T01:20:06.593Z"
2329
2502
  },
2330
2503
  {
2331
2504
  id: "760505",
@@ -2345,7 +2518,7 @@ var schedule_2026_default = [
2345
2518
  flag: "\u{1F3F3}\uFE0F"
2346
2519
  },
2347
2520
  status: "SCHEDULED",
2348
- updatedAt: "2026-06-07T07:52:54.616Z"
2521
+ updatedAt: "2026-06-24T01:20:06.593Z"
2349
2522
  },
2350
2523
  {
2351
2524
  id: "760506",
@@ -2365,7 +2538,7 @@ var schedule_2026_default = [
2365
2538
  flag: "\u{1F3F3}\uFE0F"
2366
2539
  },
2367
2540
  status: "SCHEDULED",
2368
- updatedAt: "2026-06-07T07:52:54.616Z"
2541
+ updatedAt: "2026-06-24T01:20:06.593Z"
2369
2542
  },
2370
2543
  {
2371
2544
  id: "760507",
@@ -2385,7 +2558,7 @@ var schedule_2026_default = [
2385
2558
  flag: "\u{1F3F3}\uFE0F"
2386
2559
  },
2387
2560
  status: "SCHEDULED",
2388
- updatedAt: "2026-06-07T07:52:54.616Z"
2561
+ updatedAt: "2026-06-24T01:20:06.593Z"
2389
2562
  },
2390
2563
  {
2391
2564
  id: "760509",
@@ -2405,7 +2578,7 @@ var schedule_2026_default = [
2405
2578
  flag: "\u{1F3F3}\uFE0F"
2406
2579
  },
2407
2580
  status: "SCHEDULED",
2408
- updatedAt: "2026-06-07T07:52:54.616Z"
2581
+ updatedAt: "2026-06-24T01:20:06.593Z"
2409
2582
  },
2410
2583
  {
2411
2584
  id: "760508",
@@ -2425,7 +2598,7 @@ var schedule_2026_default = [
2425
2598
  flag: "\u{1F3F3}\uFE0F"
2426
2599
  },
2427
2600
  status: "SCHEDULED",
2428
- updatedAt: "2026-06-07T07:52:54.616Z"
2601
+ updatedAt: "2026-06-24T01:20:06.593Z"
2429
2602
  },
2430
2603
  {
2431
2604
  id: "760510",
@@ -2435,17 +2608,17 @@ var schedule_2026_default = [
2435
2608
  city: "Foxborough, Massachusetts",
2436
2609
  country: "USA",
2437
2610
  home: {
2438
- code: "RD16 W1",
2611
+ code: "RD32",
2439
2612
  name: "Round of 16 1 Winner",
2440
2613
  flag: "\u{1F3F3}\uFE0F"
2441
2614
  },
2442
2615
  away: {
2443
- code: "RD16 W2",
2616
+ code: "RD32",
2444
2617
  name: "Round of 16 2 Winner",
2445
2618
  flag: "\u{1F3F3}\uFE0F"
2446
2619
  },
2447
2620
  status: "SCHEDULED",
2448
- updatedAt: "2026-06-07T07:52:54.684Z"
2621
+ updatedAt: "2026-06-24T01:20:06.650Z"
2449
2622
  },
2450
2623
  {
2451
2624
  id: "760511",
@@ -2455,17 +2628,17 @@ var schedule_2026_default = [
2455
2628
  city: "Inglewood, California",
2456
2629
  country: "USA",
2457
2630
  home: {
2458
- code: "RD16 W5",
2631
+ code: "RD32",
2459
2632
  name: "Round of 16 5 Winner",
2460
2633
  flag: "\u{1F3F3}\uFE0F"
2461
2634
  },
2462
2635
  away: {
2463
- code: "RD16 W6",
2636
+ code: "RD32",
2464
2637
  name: "Round of 16 6 Winner",
2465
2638
  flag: "\u{1F3F3}\uFE0F"
2466
2639
  },
2467
2640
  status: "SCHEDULED",
2468
- updatedAt: "2026-06-07T07:52:54.684Z"
2641
+ updatedAt: "2026-06-24T01:20:06.650Z"
2469
2642
  },
2470
2643
  {
2471
2644
  id: "760512",
@@ -2475,17 +2648,17 @@ var schedule_2026_default = [
2475
2648
  city: "Miami Gardens, Florida",
2476
2649
  country: "USA",
2477
2650
  home: {
2478
- code: "RD16 W3",
2651
+ code: "RD32",
2479
2652
  name: "Round of 16 3 Winner",
2480
2653
  flag: "\u{1F3F3}\uFE0F"
2481
2654
  },
2482
2655
  away: {
2483
- code: "RD16 W4",
2656
+ code: "RD32",
2484
2657
  name: "Round of 16 4 Winner",
2485
2658
  flag: "\u{1F3F3}\uFE0F"
2486
2659
  },
2487
2660
  status: "SCHEDULED",
2488
- updatedAt: "2026-06-07T07:52:54.684Z"
2661
+ updatedAt: "2026-06-24T01:20:06.650Z"
2489
2662
  },
2490
2663
  {
2491
2664
  id: "760513",
@@ -2495,17 +2668,17 @@ var schedule_2026_default = [
2495
2668
  city: "Kansas City, Missouri",
2496
2669
  country: "USA",
2497
2670
  home: {
2498
- code: "RD16 W7",
2671
+ code: "RD32",
2499
2672
  name: "Round of 16 7 Winner",
2500
2673
  flag: "\u{1F3F3}\uFE0F"
2501
2674
  },
2502
2675
  away: {
2503
- code: "RD16 W8",
2676
+ code: "RD32",
2504
2677
  name: "Round of 16 8 Winner",
2505
2678
  flag: "\u{1F3F3}\uFE0F"
2506
2679
  },
2507
2680
  status: "SCHEDULED",
2508
- updatedAt: "2026-06-07T07:52:54.684Z"
2681
+ updatedAt: "2026-06-24T01:20:06.650Z"
2509
2682
  },
2510
2683
  {
2511
2684
  id: "760514",
@@ -2515,17 +2688,17 @@ var schedule_2026_default = [
2515
2688
  city: "Arlington, Texas",
2516
2689
  country: "USA",
2517
2690
  home: {
2518
- code: "QFW1",
2691
+ code: "RD32",
2519
2692
  name: "Quarterfinal 1 Winner",
2520
2693
  flag: "\u{1F3F3}\uFE0F"
2521
2694
  },
2522
2695
  away: {
2523
- code: "QFW2",
2696
+ code: "RD32",
2524
2697
  name: "Quarterfinal 2 Winner",
2525
2698
  flag: "\u{1F3F3}\uFE0F"
2526
2699
  },
2527
2700
  status: "SCHEDULED",
2528
- updatedAt: "2026-06-07T07:52:54.684Z"
2701
+ updatedAt: "2026-06-24T01:20:06.650Z"
2529
2702
  },
2530
2703
  {
2531
2704
  id: "760515",
@@ -2535,17 +2708,17 @@ var schedule_2026_default = [
2535
2708
  city: "Atlanta, Georgia",
2536
2709
  country: "USA",
2537
2710
  home: {
2538
- code: "QFW3",
2711
+ code: "RD32",
2539
2712
  name: "Quarterfinal 3 Winner",
2540
2713
  flag: "\u{1F3F3}\uFE0F"
2541
2714
  },
2542
2715
  away: {
2543
- code: "QW4",
2716
+ code: "RD32",
2544
2717
  name: "Quarterfinal 4 Winner",
2545
2718
  flag: "\u{1F3F3}\uFE0F"
2546
2719
  },
2547
2720
  status: "SCHEDULED",
2548
- updatedAt: "2026-06-07T07:52:54.684Z"
2721
+ updatedAt: "2026-06-24T01:20:06.650Z"
2549
2722
  },
2550
2723
  {
2551
2724
  id: "760516",
@@ -2555,17 +2728,17 @@ var schedule_2026_default = [
2555
2728
  city: "Miami Gardens, Florida",
2556
2729
  country: "USA",
2557
2730
  home: {
2558
- code: "SF L1",
2731
+ code: "RD32",
2559
2732
  name: "Semifinal 1 Loser",
2560
2733
  flag: "\u{1F3F3}\uFE0F"
2561
2734
  },
2562
2735
  away: {
2563
- code: "SF L2",
2736
+ code: "RD32",
2564
2737
  name: "Semifinal 2 Loser",
2565
2738
  flag: "\u{1F3F3}\uFE0F"
2566
2739
  },
2567
2740
  status: "SCHEDULED",
2568
- updatedAt: "2026-06-07T07:52:54.772Z"
2741
+ updatedAt: "2026-06-24T01:20:06.749Z"
2569
2742
  },
2570
2743
  {
2571
2744
  id: "760517",
@@ -2575,17 +2748,17 @@ var schedule_2026_default = [
2575
2748
  city: "East Rutherford, New Jersey",
2576
2749
  country: "USA",
2577
2750
  home: {
2578
- code: "SFW1",
2751
+ code: "RD32",
2579
2752
  name: "Semifinal 1 Winner",
2580
2753
  flag: "\u{1F3F3}\uFE0F"
2581
2754
  },
2582
2755
  away: {
2583
- code: "SFW2",
2756
+ code: "RD32",
2584
2757
  name: "Semifinal 2 Winner",
2585
2758
  flag: "\u{1F3F3}\uFE0F"
2586
2759
  },
2587
2760
  status: "SCHEDULED",
2588
- updatedAt: "2026-06-07T07:52:54.772Z"
2761
+ updatedAt: "2026-06-24T01:20:06.749Z"
2589
2762
  }
2590
2763
  ];
2591
2764
  var SCHEDULE = schedule_2026_default;
@@ -2635,46 +2808,13 @@ function blankRow(team) {
2635
2808
  points: 0
2636
2809
  };
2637
2810
  }
2638
- function computeStandings(matches) {
2639
- const rows = /* @__PURE__ */ new Map();
2640
- const ensure = (t) => {
2641
- let r = rows.get(t.code);
2642
- if (!r) {
2643
- r = blankRow(t);
2644
- rows.set(t.code, r);
2645
- }
2646
- return r;
2647
- };
2811
+ function rosterAtZero(matches) {
2812
+ const teams = /* @__PURE__ */ new Map();
2648
2813
  for (const m of matches) {
2649
- const home = ensure(m.home);
2650
- const away = ensure(m.away);
2651
- if (!isFinished(m.status) || !m.score) continue;
2652
- const { home: hg, away: ag } = m.score;
2653
- home.played++;
2654
- away.played++;
2655
- home.goalsFor += hg;
2656
- home.goalsAgainst += ag;
2657
- away.goalsFor += ag;
2658
- away.goalsAgainst += hg;
2659
- if (hg > ag) {
2660
- home.won++;
2661
- away.lost++;
2662
- home.points += 3;
2663
- } else if (hg < ag) {
2664
- away.won++;
2665
- home.lost++;
2666
- away.points += 3;
2667
- } else {
2668
- home.drawn++;
2669
- away.drawn++;
2670
- home.points++;
2671
- away.points++;
2672
- }
2814
+ teams.set(m.home.code, m.home);
2815
+ teams.set(m.away.code, m.away);
2673
2816
  }
2674
- for (const r of rows.values()) r.goalDiff = r.goalsFor - r.goalsAgainst;
2675
- return [...rows.values()].sort(
2676
- (a, b) => b.points - a.points || b.goalDiff - a.goalDiff || b.goalsFor - a.goalsFor || a.team.name.localeCompare(b.team.name)
2677
- );
2817
+ return [...teams.values()].sort((a, b) => a.name.localeCompare(b.name)).map(blankRow);
2678
2818
  }
2679
2819
  var ESPN_SOCCER = "https://site.api.espn.com/apis/site/v2/sports/soccer";
2680
2820
  var DEFAULT_COMPETITION = "fifa.world";
@@ -2722,10 +2862,10 @@ function toInt(s) {
2722
2862
  const n = parseInt(s, 10);
2723
2863
  return Number.isFinite(n) ? n : void 0;
2724
2864
  }
2725
- function toTeam(t) {
2726
- const name = t?.displayName ?? t?.name ?? t?.location ?? t?.shortDisplayName ?? "TBD";
2727
- const code = (t?.abbreviation ?? name.slice(0, 3)).toUpperCase();
2728
- return { code, name, flag: nationToFlag(t?.displayName ?? t?.abbreviation ?? name) };
2865
+ function toTeam(t2) {
2866
+ const name = t2?.displayName ?? t2?.name ?? t2?.location ?? t2?.shortDisplayName ?? "TBD";
2867
+ const code = (t2?.abbreviation ?? name.slice(0, 3)).toUpperCase();
2868
+ return { code, name, flag: nationToFlag(t2?.displayName ?? t2?.abbreviation ?? name) };
2729
2869
  }
2730
2870
  function mapEspnEvent(ev, ctx = {}) {
2731
2871
  const comp = ev.competitions?.[0];
@@ -2743,6 +2883,11 @@ function mapEspnEvent(ev, ctx = {}) {
2743
2883
  const hs = toInt(homeC?.score);
2744
2884
  const as = toInt(awayC?.score);
2745
2885
  const hasScore = status !== "SCHEDULED" && hs !== void 0 && as !== void 0;
2886
+ let winnerCode;
2887
+ if (isFinished(status)) {
2888
+ if (homeC?.winner) winnerCode = home.code;
2889
+ else if (awayC?.winner) winnerCode = away.code;
2890
+ }
2746
2891
  return {
2747
2892
  id: ev.id,
2748
2893
  stage,
@@ -2756,6 +2901,7 @@ function mapEspnEvent(ev, ctx = {}) {
2756
2901
  score: hasScore ? { home: hs, away: as } : void 0,
2757
2902
  minute: parseMinute(ev.status ?? comp?.status),
2758
2903
  status,
2904
+ winnerCode,
2759
2905
  updatedAt: (/* @__PURE__ */ new Date()).toISOString()
2760
2906
  };
2761
2907
  }
@@ -2847,7 +2993,7 @@ var EspnAdapter = class {
2847
2993
  const map = {};
2848
2994
  try {
2849
2995
  const tables = parseStandings(await this.get(this.standingsUrl()));
2850
- for (const t of tables) for (const r of t.rows) map[r.team.code] = t.group;
2996
+ for (const t2 of tables) for (const r of t2.rows) map[r.team.code] = t2.group;
2851
2997
  } catch {
2852
2998
  }
2853
2999
  this.groupMap = map;
@@ -2883,6 +3029,688 @@ var EspnAdapter = class {
2883
3029
  }
2884
3030
  }
2885
3031
  };
3032
+ function teamFromMatch(match, code) {
3033
+ if (match.home.code === code) return match.home;
3034
+ if (match.away.code === code) return match.away;
3035
+ return void 0;
3036
+ }
3037
+ function matchKey(stage, index) {
3038
+ return `${stage}:${index}`;
3039
+ }
3040
+ function isGroupComplete(group, tables, standingsDegraded) {
3041
+ if (standingsDegraded) return false;
3042
+ const table = tables.find((t2) => t2.group === group);
3043
+ if (!table?.rows.length || table.rows.length !== 4) return false;
3044
+ return table.rows.every((r) => r.played >= 3);
3045
+ }
3046
+ function teamFromStandings(group, position, tables) {
3047
+ const table = tables.find((t2) => t2.group === group);
3048
+ if (!table) return void 0;
3049
+ const row = table.rows[position - 1];
3050
+ return row?.team;
3051
+ }
3052
+ function resolveWinner(match) {
3053
+ if (!isFinished(match.status)) return void 0;
3054
+ if (match.winnerCode) {
3055
+ const w = teamFromMatch(match, match.winnerCode);
3056
+ if (w && w.flag !== "\u{1F3F3}\uFE0F") return w;
3057
+ }
3058
+ if (!match.score) return void 0;
3059
+ const outcome = outcomeFromScore(match.score.home, match.score.away);
3060
+ if (outcome === "H") return match.home.flag !== "\u{1F3F3}\uFE0F" ? match.home : void 0;
3061
+ if (outcome === "A") return match.away.flag !== "\u{1F3F3}\uFE0F" ? match.away : void 0;
3062
+ return void 0;
3063
+ }
3064
+ function resolveLoser(match) {
3065
+ if (!isFinished(match.status)) return void 0;
3066
+ if (match.winnerCode) {
3067
+ const winner = teamFromMatch(match, match.winnerCode);
3068
+ if (winner?.code === match.home.code) {
3069
+ return match.away.flag !== "\u{1F3F3}\uFE0F" ? match.away : void 0;
3070
+ }
3071
+ if (winner?.code === match.away.code) {
3072
+ return match.home.flag !== "\u{1F3F3}\uFE0F" ? match.home : void 0;
3073
+ }
3074
+ }
3075
+ if (!match.score) return void 0;
3076
+ const outcome = outcomeFromScore(match.score.home, match.score.away);
3077
+ if (outcome === "H") return match.away.flag !== "\u{1F3F3}\uFE0F" ? match.away : void 0;
3078
+ if (outcome === "A") return match.home.flag !== "\u{1F3F3}\uFE0F" ? match.home : void 0;
3079
+ return void 0;
3080
+ }
3081
+ function participant(team, status) {
3082
+ return { label: team.name, flag: team.flag, code: team.code, status };
3083
+ }
3084
+ function tbd(label) {
3085
+ return { label, flag: "\u{1F3F3}\uFE0F", status: "tbd" };
3086
+ }
3087
+ function winnerLabel(ctx, stage, index) {
3088
+ return t(ctx.lang, "bracket.slot.winner", {
3089
+ stage: stageLabelI18n(ctx.lang, stage),
3090
+ n: String(index)
3091
+ });
3092
+ }
3093
+ function resolveSlot(ref, ctx) {
3094
+ switch (ref.kind) {
3095
+ case "seed":
3096
+ return tbd(ref.label);
3097
+ case "group": {
3098
+ if (isGroupComplete(ref.group, ctx.tables, ctx.standingsDegraded)) {
3099
+ const team = teamFromStandings(ref.group, ref.position, ctx.tables);
3100
+ if (team) return participant(team, "projected");
3101
+ }
3102
+ const label = ref.position === 1 ? t(ctx.lang, "bracket.slot.groupWinner", { group: ref.group }) : t(ctx.lang, "bracket.slot.groupSecond", { group: ref.group });
3103
+ return tbd(label);
3104
+ }
3105
+ case "third":
3106
+ return tbd(t(ctx.lang, "bracket.slot.third", { groups: ref.groups.join("/") }));
3107
+ case "winner": {
3108
+ const node = ctx.nodesByKey.get(matchKey(ref.stage, ref.index));
3109
+ const match = node ? ctx.matchesById.get(node.matchId) : void 0;
3110
+ if (match) {
3111
+ const winner = resolveWinner(match);
3112
+ if (winner) return participant(winner, "confirmed");
3113
+ }
3114
+ return tbd(winnerLabel(ctx, ref.stage, ref.index));
3115
+ }
3116
+ case "loser": {
3117
+ const node = ctx.nodesByKey.get(matchKey(ref.stage, ref.index));
3118
+ const match = node ? ctx.matchesById.get(node.matchId) : void 0;
3119
+ if (match) {
3120
+ const loser = resolveLoser(match);
3121
+ if (loser) return participant(loser, "confirmed");
3122
+ }
3123
+ return tbd(
3124
+ t(ctx.lang, "bracket.slot.loser", {
3125
+ stage: stageLabelI18n(ctx.lang, ref.stage),
3126
+ n: String(ref.index)
3127
+ })
3128
+ );
3129
+ }
3130
+ default:
3131
+ return tbd(t(ctx.lang, "bracket.slot.tbd"));
3132
+ }
3133
+ }
3134
+ function buildBracketView(topology, matches, tables, standingsDegraded, liveDegraded, filterStage, lang) {
3135
+ const knockout = matches.filter((m) => m.stage !== "GROUP" && m.stage !== "FRIENDLY");
3136
+ const matchesById = new Map(knockout.map((m) => [m.id, m]));
3137
+ const nodesByKey = new Map(topology.matches.map((n) => [matchKey(n.stage, n.index), n]));
3138
+ const ctx = { nodesByKey, matchesById, tables, standingsDegraded, lang };
3139
+ const want = filterStage?.toUpperCase();
3140
+ const stages = [];
3141
+ for (const stage of topology.stages) {
3142
+ if (want && stage !== want) continue;
3143
+ const nodes = topology.matches.filter((n) => n.stage === stage);
3144
+ const matchViews = nodes.map((node) => {
3145
+ const match = matchesById.get(node.matchId) ?? {
3146
+ id: node.matchId,
3147
+ stage: node.stage,
3148
+ kickoff: "",
3149
+ venue: "",
3150
+ home: { code: "?", name: "TBD", flag: "\u{1F3F3}\uFE0F" },
3151
+ away: { code: "?", name: "TBD", flag: "\u{1F3F3}\uFE0F" },
3152
+ status: "SCHEDULED",
3153
+ updatedAt: ""
3154
+ };
3155
+ return {
3156
+ matchId: node.matchId,
3157
+ stage: node.stage,
3158
+ index: node.index,
3159
+ kickoff: match.kickoff,
3160
+ home: resolveSlot(node.home, ctx),
3161
+ away: resolveSlot(node.away, ctx),
3162
+ match
3163
+ };
3164
+ });
3165
+ stages.push({
3166
+ stage,
3167
+ label: stageLabelI18n(lang, stage),
3168
+ matches: matchViews
3169
+ });
3170
+ }
3171
+ return {
3172
+ stages,
3173
+ degraded: liveDegraded,
3174
+ standingsDegraded
3175
+ };
3176
+ }
3177
+ var bracket_2026_default = {
3178
+ generatedAt: "2026-06-24T01:20:06.749Z",
3179
+ stages: [
3180
+ "R32",
3181
+ "R16",
3182
+ "QF",
3183
+ "SF",
3184
+ "3P",
3185
+ "F"
3186
+ ],
3187
+ matches: [
3188
+ {
3189
+ matchId: "760486",
3190
+ stage: "R32",
3191
+ index: 1,
3192
+ home: {
3193
+ kind: "group",
3194
+ position: 2,
3195
+ group: "A"
3196
+ },
3197
+ away: {
3198
+ kind: "group",
3199
+ position: 2,
3200
+ group: "B"
3201
+ }
3202
+ },
3203
+ {
3204
+ matchId: "760487",
3205
+ stage: "R32",
3206
+ index: 2,
3207
+ home: {
3208
+ kind: "group",
3209
+ position: 1,
3210
+ group: "C"
3211
+ },
3212
+ away: {
3213
+ kind: "group",
3214
+ position: 2,
3215
+ group: "F"
3216
+ }
3217
+ },
3218
+ {
3219
+ matchId: "760488",
3220
+ stage: "R32",
3221
+ index: 3,
3222
+ home: {
3223
+ kind: "group",
3224
+ position: 1,
3225
+ group: "F"
3226
+ },
3227
+ away: {
3228
+ kind: "group",
3229
+ position: 2,
3230
+ group: "C"
3231
+ }
3232
+ },
3233
+ {
3234
+ matchId: "760489",
3235
+ stage: "R32",
3236
+ index: 4,
3237
+ home: {
3238
+ kind: "seed",
3239
+ label: "Germany",
3240
+ code: "TBD"
3241
+ },
3242
+ away: {
3243
+ kind: "third",
3244
+ groups: [
3245
+ "A",
3246
+ "B",
3247
+ "C",
3248
+ "D",
3249
+ "F"
3250
+ ]
3251
+ }
3252
+ },
3253
+ {
3254
+ matchId: "760490",
3255
+ stage: "R32",
3256
+ index: 5,
3257
+ home: {
3258
+ kind: "group",
3259
+ position: 2,
3260
+ group: "E"
3261
+ },
3262
+ away: {
3263
+ kind: "group",
3264
+ position: 2,
3265
+ group: "I"
3266
+ }
3267
+ },
3268
+ {
3269
+ matchId: "760491",
3270
+ stage: "R32",
3271
+ index: 6,
3272
+ home: {
3273
+ kind: "seed",
3274
+ label: "Mexico",
3275
+ code: "TBD"
3276
+ },
3277
+ away: {
3278
+ kind: "third",
3279
+ groups: [
3280
+ "C",
3281
+ "E",
3282
+ "F",
3283
+ "H",
3284
+ "I"
3285
+ ]
3286
+ }
3287
+ },
3288
+ {
3289
+ matchId: "760492",
3290
+ stage: "R32",
3291
+ index: 7,
3292
+ home: {
3293
+ kind: "group",
3294
+ position: 1,
3295
+ group: "I"
3296
+ },
3297
+ away: {
3298
+ kind: "third",
3299
+ groups: [
3300
+ "C",
3301
+ "D",
3302
+ "F",
3303
+ "G",
3304
+ "H"
3305
+ ]
3306
+ }
3307
+ },
3308
+ {
3309
+ matchId: "760493",
3310
+ stage: "R32",
3311
+ index: 8,
3312
+ home: {
3313
+ kind: "group",
3314
+ position: 1,
3315
+ group: "G"
3316
+ },
3317
+ away: {
3318
+ kind: "third",
3319
+ groups: [
3320
+ "A",
3321
+ "E",
3322
+ "H",
3323
+ "I",
3324
+ "J"
3325
+ ]
3326
+ }
3327
+ },
3328
+ {
3329
+ matchId: "760494",
3330
+ stage: "R32",
3331
+ index: 9,
3332
+ home: {
3333
+ kind: "seed",
3334
+ label: "United States",
3335
+ code: "TBD"
3336
+ },
3337
+ away: {
3338
+ kind: "third",
3339
+ groups: [
3340
+ "B",
3341
+ "E",
3342
+ "F",
3343
+ "I",
3344
+ "J"
3345
+ ]
3346
+ }
3347
+ },
3348
+ {
3349
+ matchId: "760495",
3350
+ stage: "R32",
3351
+ index: 10,
3352
+ home: {
3353
+ kind: "group",
3354
+ position: 1,
3355
+ group: "L"
3356
+ },
3357
+ away: {
3358
+ kind: "third",
3359
+ groups: [
3360
+ "E",
3361
+ "H",
3362
+ "I",
3363
+ "J",
3364
+ "K"
3365
+ ]
3366
+ }
3367
+ },
3368
+ {
3369
+ matchId: "760496",
3370
+ stage: "R32",
3371
+ index: 11,
3372
+ home: {
3373
+ kind: "group",
3374
+ position: 2,
3375
+ group: "K"
3376
+ },
3377
+ away: {
3378
+ kind: "group",
3379
+ position: 2,
3380
+ group: "L"
3381
+ }
3382
+ },
3383
+ {
3384
+ matchId: "760497",
3385
+ stage: "R32",
3386
+ index: 12,
3387
+ home: {
3388
+ kind: "group",
3389
+ position: 1,
3390
+ group: "H"
3391
+ },
3392
+ away: {
3393
+ kind: "group",
3394
+ position: 2,
3395
+ group: "J"
3396
+ }
3397
+ },
3398
+ {
3399
+ matchId: "760498",
3400
+ stage: "R32",
3401
+ index: 13,
3402
+ home: {
3403
+ kind: "group",
3404
+ position: 1,
3405
+ group: "B"
3406
+ },
3407
+ away: {
3408
+ kind: "third",
3409
+ groups: [
3410
+ "E",
3411
+ "F",
3412
+ "G",
3413
+ "I",
3414
+ "J"
3415
+ ]
3416
+ }
3417
+ },
3418
+ {
3419
+ matchId: "760499",
3420
+ stage: "R32",
3421
+ index: 14,
3422
+ home: {
3423
+ kind: "group",
3424
+ position: 2,
3425
+ group: "D"
3426
+ },
3427
+ away: {
3428
+ kind: "group",
3429
+ position: 2,
3430
+ group: "G"
3431
+ }
3432
+ },
3433
+ {
3434
+ matchId: "760500",
3435
+ stage: "R32",
3436
+ index: 15,
3437
+ home: {
3438
+ kind: "seed",
3439
+ label: "Argentina",
3440
+ code: "TBD"
3441
+ },
3442
+ away: {
3443
+ kind: "group",
3444
+ position: 2,
3445
+ group: "H"
3446
+ }
3447
+ },
3448
+ {
3449
+ matchId: "760501",
3450
+ stage: "R32",
3451
+ index: 16,
3452
+ home: {
3453
+ kind: "group",
3454
+ position: 1,
3455
+ group: "K"
3456
+ },
3457
+ away: {
3458
+ kind: "third",
3459
+ groups: [
3460
+ "D",
3461
+ "E",
3462
+ "I",
3463
+ "J",
3464
+ "L"
3465
+ ]
3466
+ }
3467
+ },
3468
+ {
3469
+ matchId: "760502",
3470
+ stage: "R16",
3471
+ index: 1,
3472
+ home: {
3473
+ kind: "winner",
3474
+ stage: "R32",
3475
+ index: 1
3476
+ },
3477
+ away: {
3478
+ kind: "winner",
3479
+ stage: "R32",
3480
+ index: 3
3481
+ }
3482
+ },
3483
+ {
3484
+ matchId: "760503",
3485
+ stage: "R16",
3486
+ index: 2,
3487
+ home: {
3488
+ kind: "winner",
3489
+ stage: "R32",
3490
+ index: 2
3491
+ },
3492
+ away: {
3493
+ kind: "winner",
3494
+ stage: "R32",
3495
+ index: 5
3496
+ }
3497
+ },
3498
+ {
3499
+ matchId: "760504",
3500
+ stage: "R16",
3501
+ index: 3,
3502
+ home: {
3503
+ kind: "winner",
3504
+ stage: "R32",
3505
+ index: 4
3506
+ },
3507
+ away: {
3508
+ kind: "winner",
3509
+ stage: "R32",
3510
+ index: 6
3511
+ }
3512
+ },
3513
+ {
3514
+ matchId: "760505",
3515
+ stage: "R16",
3516
+ index: 4,
3517
+ home: {
3518
+ kind: "winner",
3519
+ stage: "R32",
3520
+ index: 7
3521
+ },
3522
+ away: {
3523
+ kind: "winner",
3524
+ stage: "R32",
3525
+ index: 8
3526
+ }
3527
+ },
3528
+ {
3529
+ matchId: "760506",
3530
+ stage: "R16",
3531
+ index: 5,
3532
+ home: {
3533
+ kind: "winner",
3534
+ stage: "R32",
3535
+ index: 11
3536
+ },
3537
+ away: {
3538
+ kind: "winner",
3539
+ stage: "R32",
3540
+ index: 12
3541
+ }
3542
+ },
3543
+ {
3544
+ matchId: "760507",
3545
+ stage: "R16",
3546
+ index: 6,
3547
+ home: {
3548
+ kind: "winner",
3549
+ stage: "R32",
3550
+ index: 9
3551
+ },
3552
+ away: {
3553
+ kind: "winner",
3554
+ stage: "R32",
3555
+ index: 10
3556
+ }
3557
+ },
3558
+ {
3559
+ matchId: "760508",
3560
+ stage: "R16",
3561
+ index: 7,
3562
+ home: {
3563
+ kind: "winner",
3564
+ stage: "R32",
3565
+ index: 13
3566
+ },
3567
+ away: {
3568
+ kind: "winner",
3569
+ stage: "R32",
3570
+ index: 15
3571
+ }
3572
+ },
3573
+ {
3574
+ matchId: "760509",
3575
+ stage: "R16",
3576
+ index: 8,
3577
+ home: {
3578
+ kind: "winner",
3579
+ stage: "R32",
3580
+ index: 14
3581
+ },
3582
+ away: {
3583
+ kind: "winner",
3584
+ stage: "R32",
3585
+ index: 16
3586
+ }
3587
+ },
3588
+ {
3589
+ matchId: "760510",
3590
+ stage: "QF",
3591
+ index: 1,
3592
+ home: {
3593
+ kind: "winner",
3594
+ stage: "R16",
3595
+ index: 1
3596
+ },
3597
+ away: {
3598
+ kind: "winner",
3599
+ stage: "R16",
3600
+ index: 2
3601
+ }
3602
+ },
3603
+ {
3604
+ matchId: "760511",
3605
+ stage: "QF",
3606
+ index: 2,
3607
+ home: {
3608
+ kind: "winner",
3609
+ stage: "R16",
3610
+ index: 5
3611
+ },
3612
+ away: {
3613
+ kind: "winner",
3614
+ stage: "R16",
3615
+ index: 6
3616
+ }
3617
+ },
3618
+ {
3619
+ matchId: "760512",
3620
+ stage: "QF",
3621
+ index: 3,
3622
+ home: {
3623
+ kind: "winner",
3624
+ stage: "R16",
3625
+ index: 3
3626
+ },
3627
+ away: {
3628
+ kind: "winner",
3629
+ stage: "R16",
3630
+ index: 4
3631
+ }
3632
+ },
3633
+ {
3634
+ matchId: "760513",
3635
+ stage: "QF",
3636
+ index: 4,
3637
+ home: {
3638
+ kind: "winner",
3639
+ stage: "R16",
3640
+ index: 7
3641
+ },
3642
+ away: {
3643
+ kind: "winner",
3644
+ stage: "R16",
3645
+ index: 8
3646
+ }
3647
+ },
3648
+ {
3649
+ matchId: "760514",
3650
+ stage: "SF",
3651
+ index: 1,
3652
+ home: {
3653
+ kind: "winner",
3654
+ stage: "QF",
3655
+ index: 1
3656
+ },
3657
+ away: {
3658
+ kind: "winner",
3659
+ stage: "QF",
3660
+ index: 2
3661
+ }
3662
+ },
3663
+ {
3664
+ matchId: "760515",
3665
+ stage: "SF",
3666
+ index: 2,
3667
+ home: {
3668
+ kind: "winner",
3669
+ stage: "QF",
3670
+ index: 3
3671
+ },
3672
+ away: {
3673
+ kind: "winner",
3674
+ stage: "QF",
3675
+ index: 4
3676
+ }
3677
+ },
3678
+ {
3679
+ matchId: "760516",
3680
+ stage: "3P",
3681
+ index: 1,
3682
+ home: {
3683
+ kind: "loser",
3684
+ stage: "SF",
3685
+ index: 1
3686
+ },
3687
+ away: {
3688
+ kind: "loser",
3689
+ stage: "SF",
3690
+ index: 2
3691
+ }
3692
+ },
3693
+ {
3694
+ matchId: "760517",
3695
+ stage: "F",
3696
+ index: 1,
3697
+ home: {
3698
+ kind: "winner",
3699
+ stage: "SF",
3700
+ index: 1
3701
+ },
3702
+ away: {
3703
+ kind: "winner",
3704
+ stage: "SF",
3705
+ index: 2
3706
+ }
3707
+ }
3708
+ ]
3709
+ };
3710
+ var TOPOLOGY = bracket_2026_default;
3711
+ function loadBracketTopology() {
3712
+ return TOPOLOGY;
3713
+ }
2886
3714
  function resolveCompetition(explicit) {
2887
3715
  if (explicit) return explicit;
2888
3716
  if (typeof process !== "undefined" && process.env?.CLAUDINHO_COMPETITION) {
@@ -2923,7 +3751,7 @@ async function getStandings(adapter, group) {
2923
3751
  if (adapter.fetchStandings) {
2924
3752
  try {
2925
3753
  const all = await adapter.fetchStandings();
2926
- const tables2 = (want ? all.filter((t) => t.group === want) : all).sort(
3754
+ const tables2 = (want ? all.filter((t2) => t2.group === want) : all).sort(
2927
3755
  (a, b) => a.group.localeCompare(b.group)
2928
3756
  );
2929
3757
  return { tables: tables2, degraded: false, source: adapter.name };
@@ -2931,9 +3759,45 @@ async function getStandings(adapter, group) {
2931
3759
  }
2932
3760
  }
2933
3761
  const letters = want ? [want] : groups();
2934
- const tables = letters.map((g) => ({ group: g, rows: computeStandings(fixturesByGroup(g)) })).filter((t) => t.rows.length > 0);
3762
+ const tables = letters.map((g) => ({ group: g, rows: rosterAtZero(fixturesByGroup(g)) })).filter((t2) => t2.rows.length > 0);
2935
3763
  return { tables, degraded: true };
2936
3764
  }
3765
+ var KNOCKOUT_WINDOW_START = "20260628";
3766
+ var KNOCKOUT_WINDOW_END = "20260719";
3767
+ async function getBracket(adapter, opts = {}) {
3768
+ const topology = loadBracketTopology();
3769
+ const base = allFixtures().filter((m) => m.stage !== "GROUP" && m.stage !== "FRIENDLY");
3770
+ let matches = base;
3771
+ let liveDegraded = true;
3772
+ let source;
3773
+ try {
3774
+ const live = adapter.fetchWindow ? await adapter.fetchWindow(KNOCKOUT_WINDOW_START, KNOCKOUT_WINDOW_END) : [];
3775
+ matches = mergeLive(base, live);
3776
+ liveDegraded = false;
3777
+ source = adapter.name;
3778
+ } catch {
3779
+ }
3780
+ const standings = await getStandings(adapter);
3781
+ if (!source && !standings.degraded && standings.source) {
3782
+ source = standings.source;
3783
+ }
3784
+ const view = buildBracketView(
3785
+ topology,
3786
+ matches,
3787
+ standings.tables,
3788
+ standings.degraded,
3789
+ liveDegraded,
3790
+ opts.stage,
3791
+ opts.lang
3792
+ );
3793
+ if (source) view.source = source;
3794
+ return {
3795
+ view,
3796
+ degraded: liveDegraded,
3797
+ standingsDegraded: standings.degraded,
3798
+ source
3799
+ };
3800
+ }
2937
3801
  function shiftUtcDate(dateISO, days) {
2938
3802
  const [y, m, d] = dateISO.slice(0, 10).split("-").map(Number);
2939
3803
  return new Date(Date.UTC(y ?? 1970, (m ?? 1) - 1, (d ?? 1) + days)).toISOString().slice(0, 10);
@@ -3087,9 +3951,9 @@ function outcomeLabel(o, match) {
3087
3951
  return o.label;
3088
3952
  }
3089
3953
  function utcHhmm(iso) {
3090
- const t = Date.parse(iso);
3091
- if (!Number.isFinite(t)) return "";
3092
- return `${new Date(t).toISOString().slice(11, 16)} UTC`;
3954
+ const t2 = Date.parse(iso);
3955
+ if (!Number.isFinite(t2)) return "";
3956
+ return `${new Date(t2).toISOString().slice(11, 16)} UTC`;
3093
3957
  }
3094
3958
  function marketFavoriteText(signal, match) {
3095
3959
  const fav = signal.favorite;
@@ -3445,6 +4309,7 @@ function socialCard(m, input) {
3445
4309
  }
3446
4310
  const loc = matchLocation(m);
3447
4311
  if (loc) lines.push(loc);
4312
+ if (m.stage !== "GROUP") lines.push(stageLabel(m));
3448
4313
  return lines;
3449
4314
  }
3450
4315
  function formatShareSnippet(input, options = {}) {
@@ -3519,6 +4384,107 @@ function formatShareTable(input, options = {}) {
3519
4384
  );
3520
4385
  return blocks.join("\n\n");
3521
4386
  }
4387
+ function formatParticipant(p, flags, locale) {
4388
+ const suffix = p.status === "projected" ? ` ${t(locale, "bracket.projected")}` : "";
4389
+ if (flags && p.flag !== "\u{1F3F3}\uFE0F") return `${p.flag} ${p.label}${suffix}`;
4390
+ if (p.code) return `${p.code}${suffix}`;
4391
+ return `${p.label}${suffix}`;
4392
+ }
4393
+ function statusTail2(m) {
4394
+ if (m.status === "LIVE" && m.minute) return ` ${m.minute}'`;
4395
+ if (m.status === "HT") return " HT";
4396
+ if (m.status === "FT") return " FT";
4397
+ if (isLive(m.status)) return " LIVE";
4398
+ return "";
4399
+ }
4400
+ function formatBracketMatchLine(mv, opts = {}) {
4401
+ const flags = opts.flags !== false;
4402
+ const home = formatParticipant(mv.home, flags, opts.locale);
4403
+ const away = formatParticipant(mv.away, flags, opts.locale);
4404
+ const m = mv.match;
4405
+ if (isFinished(m.status) || isLive(m.status)) {
4406
+ return ` ${home} ${scoreline(m)} ${away}${statusTail2(m)}`;
4407
+ }
4408
+ const kickoff = mv.kickoff ? formatKickoff(mv.kickoff, { tz: opts.tz, locale: opts.locale }) : "";
4409
+ return ` ${home} vs ${away}${kickoff ? ` \xB7 ${kickoff}` : ""}`;
4410
+ }
4411
+ function formatBracketList(view, opts = {}) {
4412
+ const blocks = [];
4413
+ for (const stage of view.stages) {
4414
+ blocks.push(stage.label);
4415
+ for (const mv of stage.matches) {
4416
+ blocks.push(formatBracketMatchLine(mv, opts));
4417
+ }
4418
+ blocks.push("");
4419
+ }
4420
+ if (opts.footer !== false) {
4421
+ if (view.degraded) {
4422
+ blocks.push(`(${t(opts.locale, "bracket.degraded")})`);
4423
+ } else if (view.standingsDegraded) {
4424
+ blocks.push(`(${t(opts.locale, "bracket.standingsDegraded")})`);
4425
+ }
4426
+ if (view.source) {
4427
+ blocks.push(t(opts.locale, "live.data", { source: liveSourceLabel(view.source) }));
4428
+ }
4429
+ }
4430
+ return blocks.join("\n").trimEnd();
4431
+ }
4432
+ var MIN_TREE_WIDTH = 80;
4433
+ function formatBracketTree(view, opts = {}) {
4434
+ const width = opts.width ?? 80;
4435
+ if (width < MIN_TREE_WIDTH) return null;
4436
+ const blocks = [];
4437
+ for (let i = 0; i < view.stages.length; i++) {
4438
+ const stage = view.stages[i];
4439
+ blocks.push(`\u2501\u2501\u2501 ${stage.label} \u2501\u2501\u2501`);
4440
+ for (const mv of stage.matches) {
4441
+ blocks.push(formatBracketMatchLine(mv, opts));
4442
+ }
4443
+ if (i < view.stages.length - 1) {
4444
+ blocks.push(" \u2502");
4445
+ blocks.push(" \u25BC");
4446
+ }
4447
+ blocks.push("");
4448
+ }
4449
+ if (opts.footer !== false) {
4450
+ if (view.degraded) {
4451
+ blocks.push(`(${t(opts.locale, "bracket.degraded")})`);
4452
+ } else if (view.standingsDegraded) {
4453
+ blocks.push(`(${t(opts.locale, "bracket.standingsDegraded")})`);
4454
+ }
4455
+ if (view.source) {
4456
+ blocks.push(t(opts.locale, "live.data", { source: liveSourceLabel(view.source) }));
4457
+ }
4458
+ }
4459
+ return blocks.join("\n").trimEnd();
4460
+ }
4461
+ function formatShareBracket(input, options = {}) {
4462
+ const includeHashtag = options.includeHashtag !== false;
4463
+ const includeInstall = options.includeInstallLine !== false;
4464
+ const locale = options.locale;
4465
+ const blocks = [t(locale, "bracket.shareTitle"), ""];
4466
+ if (input.view.stages.length === 0) {
4467
+ blocks.push(input.emptyNote ?? t(locale, "bracket.empty"));
4468
+ } else {
4469
+ blocks.push(formatBracketList(input.view, { footer: false, locale }));
4470
+ if (input.view.degraded) {
4471
+ blocks.push(`(${t(locale, "bracket.degraded")})`);
4472
+ } else if (input.view.standingsDegraded) {
4473
+ blocks.push(`(${t(locale, "bracket.standingsDegraded")})`);
4474
+ }
4475
+ }
4476
+ const footer = [];
4477
+ const src = input.source ?? input.view.source;
4478
+ if (src) footer.push(t(locale, "live.data", { source: liveSourceLabel(src) }));
4479
+ footer.push(
4480
+ [includeHashtag ? SHARE_HASHTAG : "", SHARE_DISCLAIMER].filter(Boolean).join(" \xB7 ")
4481
+ );
4482
+ if (includeInstall && input.installLine) {
4483
+ footer.push(t(locale, "share.tryIt", { line: input.installLine }));
4484
+ }
4485
+ blocks.push("", footer.join("\n"));
4486
+ return blocks.join("\n");
4487
+ }
3522
4488
 
3523
4489
  // src/config.ts
3524
4490
  var SUPPORTED_LANGS = ["en", "es", "pt", "fr"];
@@ -3564,7 +4530,7 @@ function resolveConfig(opts) {
3564
4530
  }
3565
4531
 
3566
4532
  // src/i18n.ts
3567
- var EN = {
4533
+ var EN2 = {
3568
4534
  "today.title": "Today's matches",
3569
4535
  "today.on": "Matches",
3570
4536
  "today.none": "No matches scheduled for this date.",
@@ -3598,7 +4564,7 @@ var EN = {
3598
4564
  "warn.lang": "Unsupported language {lang}; using English. (supported: en, es, pt, fr)",
3599
4565
  disclaimer: "Not affiliated with FIFA or Anthropic."
3600
4566
  };
3601
- var ES = {
4567
+ var ES2 = {
3602
4568
  "today.title": "Partidos de hoy",
3603
4569
  "today.on": "Partidos",
3604
4570
  "today.none": "No hay partidos para esta fecha.",
@@ -3632,7 +4598,7 @@ var ES = {
3632
4598
  "warn.lang": "Idioma no soportado {lang}; usando ingl\xE9s. (disponibles: en, es, pt, fr)",
3633
4599
  disclaimer: "No afiliado a FIFA ni Anthropic."
3634
4600
  };
3635
- var PT = {
4601
+ var PT2 = {
3636
4602
  "today.title": "Jogos de hoje",
3637
4603
  "today.on": "Jogos",
3638
4604
  "today.none": "Nenhum jogo para esta data.",
@@ -3666,7 +4632,7 @@ var PT = {
3666
4632
  "warn.lang": "Idioma n\xE3o suportado {lang}; usando ingl\xEAs. (dispon\xEDveis: en, es, pt, fr)",
3667
4633
  disclaimer: "N\xE3o afiliado \xE0 FIFA nem \xE0 Anthropic."
3668
4634
  };
3669
- var FR = {
4635
+ var FR2 = {
3670
4636
  "today.title": "Matchs d'aujourd'hui",
3671
4637
  "today.on": "Matchs",
3672
4638
  "today.none": "Aucun match pr\xE9vu pour cette date.",
@@ -3700,11 +4666,11 @@ var FR = {
3700
4666
  "warn.lang": "Langue non prise en charge {lang} ; utilisation de l\u2019anglais. (disponibles : en, es, pt, fr)",
3701
4667
  disclaimer: "Non affili\xE9 \xE0 la FIFA ni \xE0 Anthropic."
3702
4668
  };
3703
- var CATALOGS = { en: EN, es: ES, pt: PT, fr: FR };
4669
+ var CATALOGS2 = { en: EN2, es: ES2, pt: PT2, fr: FR2 };
3704
4670
  function makeT(lang) {
3705
- const dict = CATALOGS[lang] ?? EN;
4671
+ const dict = CATALOGS2[lang] ?? EN2;
3706
4672
  return (key, vars) => {
3707
- let s = dict[key] ?? EN[key] ?? key;
4673
+ let s = dict[key] ?? EN2[key] ?? key;
3708
4674
  if (vars) for (const [k, v] of Object.entries(vars)) s = s.replace(`{${k}}`, v);
3709
4675
  return s;
3710
4676
  };
@@ -3738,28 +4704,31 @@ function paint(enabled) {
3738
4704
  gray: pc.gray
3739
4705
  };
3740
4706
  }
4707
+ function tableTeamCell(team, flags) {
4708
+ return flags ? `${team.flag} ${team.name}` : team.name;
4709
+ }
3741
4710
  function painterFor(cfg) {
3742
4711
  return paint(cfg.color);
3743
4712
  }
3744
- function statusToken(m, t, c) {
4713
+ function statusToken(m, t2, c) {
3745
4714
  switch (m.status) {
3746
4715
  case "LIVE":
3747
- return c.green(`${m.minute ? `${m.minute}'` : t("status.live")}`);
4716
+ return c.green(`${m.minute ? `${m.minute}'` : t2("status.live")}`);
3748
4717
  case "HT":
3749
- return c.yellow(t("status.ht"));
4718
+ return c.yellow(t2("status.ht"));
3750
4719
  case "FT":
3751
- return c.gray(t("status.ft"));
4720
+ return c.gray(t2("status.ft"));
3752
4721
  case "POSTPONED":
3753
- return c.red(t("status.postponed"));
4722
+ return c.red(t2("status.postponed"));
3754
4723
  case "CANCELLED":
3755
- return c.red(t("status.cancelled"));
4724
+ return c.red(t2("status.cancelled"));
3756
4725
  default:
3757
4726
  return "";
3758
4727
  }
3759
4728
  }
3760
- function matchLine(m, cfg, t, c) {
3761
- const home = `${m.home.flag} ${m.home.name}`;
3762
- const away = `${m.away.name} ${m.away.flag}`;
4729
+ function matchLine(m, cfg, t2, c, flags = true) {
4730
+ const home = flags ? `${m.home.flag} ${m.home.name}` : m.home.name;
4731
+ const away = flags ? `${m.away.name} ${m.away.flag}` : m.away.name;
3763
4732
  const mid2 = isLive(m.status) || m.status === "FT" ? c.bold(scoreline(m)) : c.dim("vs");
3764
4733
  const left = `${home.padEnd(22)} ${mid2.padStart(3)} ${away}`;
3765
4734
  let right = "";
@@ -3768,7 +4737,7 @@ function matchLine(m, cfg, t, c) {
3768
4737
  `${formatKickoff(m.kickoff, { tz: cfg.tz, locale: cfg.lang })}`
3769
4738
  );
3770
4739
  } else {
3771
- right = statusToken(m, t, c);
4740
+ right = statusToken(m, t2, c);
3772
4741
  }
3773
4742
  const flair = matchFlavor(m, { level: cfg.flavor, locale: cfg.lang });
3774
4743
  const tail = flair ? ` ${c.dim(flair)}` : "";
@@ -3777,8 +4746,8 @@ function matchLine(m, cfg, t, c) {
3777
4746
  function header(text, c) {
3778
4747
  return c.bold(c.cyan(text));
3779
4748
  }
3780
- function disclaimer(t, c) {
3781
- return c.dim(t("disclaimer"));
4749
+ function disclaimer(t2, c) {
4750
+ return c.dim(t2("disclaimer"));
3782
4751
  }
3783
4752
  function dataSource(source, c) {
3784
4753
  return source ? c.dim(`Live data: ${liveSourceLabel(source)}`) : "";
@@ -3812,10 +4781,10 @@ function readMarketCache(source, competition, now = Date.now()) {
3812
4781
  return { signals, checked };
3813
4782
  }
3814
4783
  for (const [id, entry] of Object.entries(file.entries ?? {})) {
3815
- const t = Date.parse(entry.fetchedAt);
3816
- if (!Number.isFinite(t)) continue;
4784
+ const t2 = Date.parse(entry.fetchedAt);
4785
+ if (!Number.isFinite(t2)) continue;
3817
4786
  const ttl = entry.signal ? POSITIVE_TTL_MS : NEGATIVE_TTL_MS;
3818
- if (now - t > ttl) continue;
4787
+ if (now - t2 > ttl) continue;
3819
4788
  checked.add(id);
3820
4789
  if (entry.signal) signals.set(id, entry.signal);
3821
4790
  }
@@ -3916,8 +4885,8 @@ function writeFileSync_(path, data) {
3916
4885
  }
3917
4886
  function ageMs(state, now = Date.now()) {
3918
4887
  if (!state) return Infinity;
3919
- const t = Date.parse(state.updatedAt);
3920
- return Number.isFinite(t) ? now - t : Infinity;
4888
+ const t2 = Date.parse(state.updatedAt);
4889
+ return Number.isFinite(t2) ? now - t2 : Infinity;
3921
4890
  }
3922
4891
  function lockAgeMs(now = Date.now()) {
3923
4892
  const lp = lockPath();
@@ -3993,8 +4962,8 @@ function inLiveWindow(now = Date.now(), fixtures = allFixtures()) {
3993
4962
  function nextOverall(now, fixtures = allFixtures()) {
3994
4963
  return [...fixtures].sort(byKickoff).find((m) => Date.parse(m.kickoff) >= now);
3995
4964
  }
3996
- function teamTok(t, flags) {
3997
- return flags ? t.flag : t.code;
4965
+ function teamTok(t2, flags) {
4966
+ return flags ? t2.flag : t2.code;
3998
4967
  }
3999
4968
  function matchSegment(m, compact, flags) {
4000
4969
  const minute = m.status === "HT" ? "HT" : m.minute ? `${m.minute}'` : "LIVE";
@@ -4369,12 +5338,12 @@ function emitJson(data) {
4369
5338
  }
4370
5339
  var InputError = class extends Error {
4371
5340
  };
4372
- function precheck(cfg, t, date) {
5341
+ function precheck(cfg, t2, date) {
4373
5342
  if (cfg.langRequestedUnsupported) {
4374
- process.stderr.write(t("warn.lang", { lang: cfg.langRequestedUnsupported }) + "\n");
5343
+ process.stderr.write(t2("warn.lang", { lang: cfg.langRequestedUnsupported }) + "\n");
4375
5344
  }
4376
5345
  if (cfg.tz && !isValidTimeZone(cfg.tz)) {
4377
- process.stderr.write(t("warn.tz", { tz: cfg.tz }) + "\n");
5346
+ process.stderr.write(t2("warn.tz", { tz: cfg.tz }) + "\n");
4378
5347
  }
4379
5348
  const competition = resolveCompetition();
4380
5349
  if (competition !== DEFAULT_COMPETITION) {
@@ -4384,7 +5353,7 @@ function precheck(cfg, t, date) {
4384
5353
  );
4385
5354
  }
4386
5355
  if (date !== void 0 && !isValidDate(date)) {
4387
- throw new InputError(t("err.date", { date }));
5356
+ throw new InputError(t2("err.date", { date }));
4388
5357
  }
4389
5358
  }
4390
5359
  function resolveTeamArg(team, usage) {
@@ -4393,8 +5362,8 @@ function resolveTeamArg(team, usage) {
4393
5362
  return code.toUpperCase();
4394
5363
  }
4395
5364
  async function cmdToday(date, ctx) {
4396
- const { cfg, t } = ctx;
4397
- precheck(cfg, t, date);
5365
+ const { cfg, t: t2 } = ctx;
5366
+ precheck(cfg, t2, date);
4398
5367
  const adapter = adapterFor(ctx);
4399
5368
  const targetDate = date ?? localDate((/* @__PURE__ */ new Date()).toISOString(), cfg.tz);
4400
5369
  const { matches, degraded, source } = await getMatchesForDate(adapter, targetDate);
@@ -4411,28 +5380,29 @@ async function cmdToday(date, ctx) {
4411
5380
  return;
4412
5381
  }
4413
5382
  const c = painterFor(cfg);
4414
- const title = date === void 0 ? t("today.title") : t("today.on");
5383
+ const flags = flagsEnabled();
5384
+ const title = date === void 0 ? t2("today.title") : t2("today.on");
4415
5385
  out();
4416
5386
  out(header(`${title} \xB7 ${targetDate}`, c));
4417
5387
  out();
4418
5388
  if (todays.length === 0) {
4419
- out(c.dim(" " + t("today.none")));
5389
+ out(c.dim(" " + t2("today.none")));
4420
5390
  } else {
4421
5391
  for (const m of todays) {
4422
- out(matchLine(m, cfg, t, c));
5392
+ out(matchLine(m, cfg, t2, c, flags));
4423
5393
  const s = signals.get(m.id);
4424
5394
  if (s) out(" " + c.dim(marketLine(s, m)));
4425
5395
  }
4426
5396
  }
4427
5397
  out();
4428
- if (degraded) out(c.dim(" " + t("feed.degraded")));
5398
+ if (degraded) out(c.dim(" " + t2("feed.degraded")));
4429
5399
  const src = dataSource(source, c);
4430
5400
  if (src) out(src);
4431
- out(disclaimer(t, c));
5401
+ out(disclaimer(t2, c));
4432
5402
  }
4433
5403
  async function cmdLive(ctx) {
4434
- const { cfg, t } = ctx;
4435
- precheck(cfg, t);
5404
+ const { cfg, t: t2 } = ctx;
5405
+ precheck(cfg, t2);
4436
5406
  const adapter = adapterFor(ctx);
4437
5407
  const { matches, degraded, source } = await getLiveMatches(adapter);
4438
5408
  if (cfg.json) {
@@ -4440,23 +5410,24 @@ async function cmdLive(ctx) {
4440
5410
  return;
4441
5411
  }
4442
5412
  const c = painterFor(cfg);
5413
+ const flags = flagsEnabled();
4443
5414
  out();
4444
- out(header(t("live.title"), c));
5415
+ out(header(t2("live.title"), c));
4445
5416
  out();
4446
5417
  if (degraded) {
4447
- out(c.dim(" " + t("live.degraded")));
5418
+ out(c.dim(" " + t2("live.degraded")));
4448
5419
  } else if (matches.length === 0) {
4449
- out(c.dim(" " + t("live.none")));
5420
+ out(c.dim(" " + t2("live.none")));
4450
5421
  } else {
4451
- for (const m of matches) out(matchLine(m, cfg, t, c));
5422
+ for (const m of matches) out(matchLine(m, cfg, t2, c, flags));
4452
5423
  }
4453
5424
  out();
4454
5425
  const src = dataSource(source, c);
4455
5426
  if (src) out(src);
4456
- out(disclaimer(t, c));
5427
+ out(disclaimer(t2, c));
4457
5428
  }
4458
- async function cmdNext(team, { cfg, t, now }) {
4459
- precheck(cfg, t);
5429
+ async function cmdNext(team, { cfg, t: t2, now }) {
5430
+ precheck(cfg, t2);
4460
5431
  const code = resolveTeamArg(team, "Usage: claudinho next <team> (or set CLAUDINHO_TEAM)");
4461
5432
  const fixture = nextFixtureForTeam(code, { from: now ?? /* @__PURE__ */ new Date() });
4462
5433
  if (cfg.json) {
@@ -4464,27 +5435,29 @@ async function cmdNext(team, { cfg, t, now }) {
4464
5435
  return;
4465
5436
  }
4466
5437
  const c = painterFor(cfg);
5438
+ const flags = flagsEnabled();
4467
5439
  out();
4468
5440
  if (!fixture) {
4469
- out(c.dim(" " + t("next.none", { team: code })));
5441
+ out(c.dim(" " + t2("next.none", { team: code })));
4470
5442
  out();
4471
- out(disclaimer(t, c));
5443
+ out(disclaimer(t2, c));
4472
5444
  return;
4473
5445
  }
4474
- out(header(t("next.label", { team: code }), c));
5446
+ out(header(t2("next.label", { team: code }), c));
4475
5447
  out();
4476
- out(matchLine(fixture, cfg, t, c));
5448
+ out(matchLine(fixture, cfg, t2, c, flags));
5449
+ const stage = fixture.stage !== "GROUP" ? `${stageLabel(fixture)} \xB7 ` : "";
4477
5450
  out(
4478
5451
  " " + c.dim(
4479
- `${formatKickoff(fixture.kickoff, { tz: cfg.tz, locale: cfg.lang })} \xB7 ` + t("next.in", { countdown: countdown(fixture.kickoff) })
5452
+ `${stage}${formatKickoff(fixture.kickoff, { tz: cfg.tz, locale: cfg.lang })} \xB7 ` + t2("next.in", { countdown: countdown(fixture.kickoff) })
4480
5453
  )
4481
5454
  );
4482
5455
  out();
4483
- out(disclaimer(t, c));
5456
+ out(disclaimer(t2, c));
4484
5457
  }
4485
5458
  async function cmdTable(group, ctx) {
4486
- const { cfg, t } = ctx;
4487
- precheck(cfg, t);
5459
+ const { cfg, t: t2 } = ctx;
5460
+ precheck(cfg, t2);
4488
5461
  const { tables, degraded, source } = await getStandings(adapterFor(ctx), group);
4489
5462
  if (cfg.json) {
4490
5463
  const json = tables.map((tb) => ({ group: tb.group, standings: tb.rows }));
@@ -4496,37 +5469,38 @@ async function cmdTable(group, ctx) {
4496
5469
  return;
4497
5470
  }
4498
5471
  const c = painterFor(cfg);
5472
+ const flags = flagsEnabled();
4499
5473
  if (tables.length === 0) {
4500
5474
  out();
4501
5475
  out(
4502
5476
  c.dim(
4503
- " " + (group ? t("table.none", { group: group.toUpperCase() }) : t("table.empty"))
5477
+ " " + (group ? t2("table.none", { group: group.toUpperCase() }) : t2("table.empty"))
4504
5478
  )
4505
5479
  );
4506
5480
  out();
4507
- if (degraded) out(c.dim(" " + t("table.degraded")));
4508
- out(disclaimer(t, c));
5481
+ if (degraded) out(c.dim(" " + t2("table.degraded")));
5482
+ out(disclaimer(t2, c));
4509
5483
  return;
4510
5484
  }
4511
5485
  for (const { group: g, rows } of tables) {
4512
5486
  out();
4513
- out(header(t("table.title", { group: g }), c));
5487
+ out(header(t2("table.title", { group: g }), c));
4514
5488
  const table = new Table({
4515
5489
  head: [
4516
- t("col.team"),
4517
- t("col.p"),
4518
- t("col.w"),
4519
- t("col.d"),
4520
- t("col.l"),
4521
- t("col.gd"),
4522
- t("col.pts")
5490
+ t2("col.team"),
5491
+ t2("col.p"),
5492
+ t2("col.w"),
5493
+ t2("col.d"),
5494
+ t2("col.l"),
5495
+ t2("col.gd"),
5496
+ t2("col.pts")
4523
5497
  ],
4524
5498
  colAligns: ["left", "right", "right", "right", "right", "right", "right"],
4525
5499
  style: { head: cfg.color ? ["cyan"] : [], border: cfg.color ? ["gray"] : [] }
4526
5500
  });
4527
5501
  for (const r of rows) {
4528
5502
  table.push([
4529
- `${r.team.flag} ${r.team.name}`,
5503
+ tableTeamCell(r.team, flags),
4530
5504
  r.played,
4531
5505
  r.won,
4532
5506
  r.drawn,
@@ -4538,10 +5512,61 @@ async function cmdTable(group, ctx) {
4538
5512
  out(table.toString());
4539
5513
  }
4540
5514
  out();
4541
- if (degraded) out(c.dim(" " + t("table.degraded")));
5515
+ if (degraded) out(c.dim(" " + t2("table.degraded")));
5516
+ const src = dataSource(source, c);
5517
+ if (src) out(src);
5518
+ out(disclaimer(t2, c));
5519
+ }
5520
+ var BRACKET_STAGES = /* @__PURE__ */ new Set(["R32", "R16", "QF", "SF", "3P", "F"]);
5521
+ async function cmdBracket(stage, opts, ctx) {
5522
+ const { cfg, t: t2 } = ctx;
5523
+ precheck(cfg, t2);
5524
+ const filter = stage?.toUpperCase();
5525
+ if (filter && !BRACKET_STAGES.has(filter)) {
5526
+ throw new InputError(t(cfg.lang, "bracket.invalidStage"));
5527
+ }
5528
+ const { view, degraded, standingsDegraded, source } = await getBracket(
5529
+ adapterFor(ctx),
5530
+ filter ? { stage: filter, lang: cfg.lang } : { lang: cfg.lang }
5531
+ );
5532
+ if (cfg.json) {
5533
+ emitJson({
5534
+ degraded,
5535
+ standingsDegraded,
5536
+ source: source ?? null,
5537
+ view
5538
+ });
5539
+ return;
5540
+ }
5541
+ const c = painterFor(cfg);
5542
+ const flags = flagsEnabled();
5543
+ const formatOpts = { flags, tz: cfg.tz, locale: cfg.lang, footer: false };
5544
+ let body;
5545
+ if (opts.tree) {
5546
+ const tree = formatBracketTree(view, {
5547
+ ...formatOpts,
5548
+ width: process.stdout.columns ?? 80
5549
+ });
5550
+ body = tree ?? formatBracketList(view, formatOpts);
5551
+ if (!tree) {
5552
+ out();
5553
+ out(c.dim(` ${t(cfg.lang, "bracket.treeFallback")}`));
5554
+ }
5555
+ } else {
5556
+ body = formatBracketList(view, formatOpts);
5557
+ }
5558
+ out();
5559
+ out(header(
5560
+ filter ? t(cfg.lang, "bracket.stageTitle", { stage: stageLabelI18n(cfg.lang, filter) }) : t(cfg.lang, "bracket.title"),
5561
+ c
5562
+ ));
5563
+ out(body);
5564
+ out();
5565
+ if (degraded) out(c.dim(` ${t(cfg.lang, "bracket.degraded")}`));
5566
+ else if (standingsDegraded) out(c.dim(` ${t(cfg.lang, "bracket.standingsDegraded")}`));
4542
5567
  const src = dataSource(source, c);
4543
5568
  if (src) out(src);
4544
- out(disclaimer(t, c));
5569
+ out(disclaimer(t2, c));
4545
5570
  }
4546
5571
  function cmdPrompt({ cfg }) {
4547
5572
  try {
@@ -4636,8 +5661,8 @@ function cmdInitClaude(opts, { cfg }) {
4636
5661
  out("\u2192 Restart Claude Code to see it.");
4637
5662
  }
4638
5663
  async function cmdMatch(id, ctx) {
4639
- const { cfg, t } = ctx;
4640
- precheck(cfg, t);
5664
+ const { cfg, t: t2 } = ctx;
5665
+ precheck(cfg, t2);
4641
5666
  const { match, degraded, source: liveSource } = await getMatchById(adapterFor(ctx), id);
4642
5667
  const marketSignal = match ? await reliableMarketSignalFor(ctx, match) : void 0;
4643
5668
  if (cfg.json) {
@@ -4652,17 +5677,17 @@ async function cmdMatch(id, ctx) {
4652
5677
  const c = painterFor(cfg);
4653
5678
  out();
4654
5679
  if (!match) {
4655
- out(c.dim(" " + t("match.none", { id })));
5680
+ out(c.dim(" " + t2("match.none", { id })));
4656
5681
  out();
4657
- out(disclaimer(t, c));
5682
+ out(disclaimer(t2, c));
4658
5683
  return;
4659
5684
  }
4660
- const stageLabel = match.group ? `${match.stage} ${match.group}` : match.stage;
5685
+ const stageLabelText = stageLabel(match);
4661
5686
  out(header(`${match.home.name} ${scoreline(match)} ${match.away.name}`, c));
4662
- out(" " + c.dim(`${stageLabel} \xB7 ${matchLocation(match)}`));
5687
+ out(" " + c.dim(`${stageLabelText} \xB7 ${matchLocation(match)}`));
4663
5688
  out(
4664
5689
  " " + c.dim(
4665
- `${formatKickoff(match.kickoff, { tz: cfg.tz, locale: cfg.lang })} ${statusToken(match, t, c)}`.trimEnd()
5690
+ `${formatKickoff(match.kickoff, { tz: cfg.tz, locale: cfg.lang })} ${statusToken(match, t2, c)}`.trimEnd()
4666
5691
  )
4667
5692
  );
4668
5693
  const flair = matchFlavor(match, { level: cfg.flavor, locale: cfg.lang });
@@ -4678,10 +5703,10 @@ async function cmdMatch(id, ctx) {
4678
5703
  for (const mline of marketBlock(marketSignal, match)) out(" " + c.dim(mline));
4679
5704
  }
4680
5705
  out();
4681
- if (degraded) out(c.dim(" " + t("feed.degraded")));
5706
+ if (degraded) out(c.dim(" " + t2("feed.degraded")));
4682
5707
  const src = dataSource(liveSource, c);
4683
5708
  if (src) out(src);
4684
- out(disclaimer(t, c));
5709
+ out(disclaimer(t2, c));
4685
5710
  }
4686
5711
  var MARKET_INFO = "Prediction-market data is informational only.";
4687
5712
  function marketDisplayable(sig) {
@@ -4699,9 +5724,9 @@ function printMarketBlock(m, sig, c) {
4699
5724
  for (const line2 of marketBlock(sig, m)) out(" " + c.dim(line2));
4700
5725
  }
4701
5726
  async function cmdMarkets(target, team, ctx) {
4702
- const { cfg, t } = ctx;
5727
+ const { cfg, t: t2 } = ctx;
4703
5728
  if (target === "next") {
4704
- precheck(cfg, t);
5729
+ precheck(cfg, t2);
4705
5730
  const code = resolveTeamArg(team, "Usage: claudinho markets next <team> (or set CLAUDINHO_TEAM)");
4706
5731
  const now2 = ctx.now ?? /* @__PURE__ */ new Date();
4707
5732
  const { match: fixture } = await marketFixtureForTeam(adapterFor(ctx), code, now2);
@@ -4719,7 +5744,7 @@ async function cmdMarkets(target, team, ctx) {
4719
5744
  const c2 = painterFor(cfg);
4720
5745
  out();
4721
5746
  if (!fixture) {
4722
- out(c2.dim(" " + t("next.none", { team: code })));
5747
+ out(c2.dim(" " + t2("next.none", { team: code })));
4723
5748
  } else {
4724
5749
  out(header(marketHeaderLine(fixture, cfg), c2));
4725
5750
  out();
@@ -4727,12 +5752,12 @@ async function cmdMarkets(target, team, ctx) {
4727
5752
  else out(c2.dim(" " + noSignalLine(fixture, now2)));
4728
5753
  }
4729
5754
  out();
4730
- out(disclaimer(t, c2));
5755
+ out(disclaimer(t2, c2));
4731
5756
  out(c2.dim(MARKET_INFO));
4732
5757
  return;
4733
5758
  }
4734
5759
  if (target && target !== "today" && !isValidDate(target)) {
4735
- precheck(cfg, t);
5760
+ precheck(cfg, t2);
4736
5761
  const now2 = ctx.now ?? /* @__PURE__ */ new Date();
4737
5762
  const { match } = await getMatchById(adapterFor(ctx), target);
4738
5763
  const sig = match && marketRelevant(match, now2) ? (await marketSignalsFor(ctx, [match], MARKETS_CMD_OPTS)).get(match.id) : void 0;
@@ -4744,7 +5769,7 @@ async function cmdMarkets(target, team, ctx) {
4744
5769
  const c2 = painterFor(cfg);
4745
5770
  out();
4746
5771
  if (!match) {
4747
- out(c2.dim(" " + t("match.none", { id: target })));
5772
+ out(c2.dim(" " + t2("match.none", { id: target })));
4748
5773
  } else {
4749
5774
  out(header(marketHeaderLine(match, cfg), c2));
4750
5775
  out();
@@ -4752,12 +5777,12 @@ async function cmdMarkets(target, team, ctx) {
4752
5777
  else out(c2.dim(" " + noSignalLine(match, now2)));
4753
5778
  }
4754
5779
  out();
4755
- out(disclaimer(t, c2));
5780
+ out(disclaimer(t2, c2));
4756
5781
  out(c2.dim(MARKET_INFO));
4757
5782
  return;
4758
5783
  }
4759
5784
  const explicitDate = target && target !== "today" ? target : void 0;
4760
- precheck(cfg, t, explicitDate);
5785
+ precheck(cfg, t2, explicitDate);
4761
5786
  const now = ctx.now ?? /* @__PURE__ */ new Date();
4762
5787
  const date = explicitDate ?? localDate(now.toISOString(), cfg.tz);
4763
5788
  const { matches } = await getMatchesForDate(adapterFor(ctx), date);
@@ -4786,7 +5811,7 @@ async function cmdMarkets(target, team, ctx) {
4786
5811
  out();
4787
5812
  }
4788
5813
  }
4789
- out(disclaimer(t, c));
5814
+ out(disclaimer(t2, c));
4790
5815
  out(c.dim(MARKET_INFO));
4791
5816
  }
4792
5817
  function pickShareStyle(v) {
@@ -4855,8 +5880,39 @@ function emitShareTable(ctx, e, copy) {
4855
5880
  );
4856
5881
  }
4857
5882
  }
5883
+ function emitShareBracket(ctx, e, copy) {
5884
+ const snippet = formatShareBracket(
5885
+ {
5886
+ view: e.view,
5887
+ source: e.source,
5888
+ installLine: e.installLine,
5889
+ emptyNote: e.emptyNote
5890
+ },
5891
+ e.options
5892
+ );
5893
+ if (ctx.cfg.json) {
5894
+ emitJson({
5895
+ kind: "bracket",
5896
+ target: "bracket",
5897
+ ...e.stage ? { stage: e.stage } : {},
5898
+ source: e.source ?? null,
5899
+ degraded: e.degraded,
5900
+ informationalOnly: true,
5901
+ snippet,
5902
+ view: e.view
5903
+ });
5904
+ } else {
5905
+ out(snippet);
5906
+ }
5907
+ if (copy) {
5908
+ const ok = (ctx.copy ?? copyToClipboard)(snippet);
5909
+ process.stderr.write(
5910
+ (ok ? "Copied share snippet to clipboard." : "Clipboard unavailable; printed snippet instead.") + "\n"
5911
+ );
5912
+ }
5913
+ }
4858
5914
  async function cmdShare(target, team, opts, ctx) {
4859
- const { cfg, t } = ctx;
5915
+ const { cfg, t: t2 } = ctx;
4860
5916
  const baseOptions = {
4861
5917
  style: pickShareStyle(opts.style),
4862
5918
  includeMarkets: cfg.markets !== false,
@@ -4865,7 +5921,7 @@ async function cmdShare(target, team, opts, ctx) {
4865
5921
  };
4866
5922
  const copy = opts.copy === true;
4867
5923
  if (target === "live") {
4868
- precheck(cfg, t);
5924
+ precheck(cfg, t2);
4869
5925
  const { matches, degraded: degraded2, source: source2 } = await getLiveMatches(adapterFor(ctx));
4870
5926
  emitShare(
4871
5927
  ctx,
@@ -4891,7 +5947,7 @@ async function cmdShare(target, team, opts, ctx) {
4891
5947
  return;
4892
5948
  }
4893
5949
  if (target === "table") {
4894
- precheck(cfg, t);
5950
+ precheck(cfg, t2);
4895
5951
  const group = team?.toUpperCase();
4896
5952
  const { tables, degraded: degraded2, source: source2 } = await getStandings(adapterFor(ctx), group);
4897
5953
  emitShareTable(
@@ -4910,8 +5966,37 @@ async function cmdShare(target, team, opts, ctx) {
4910
5966
  );
4911
5967
  return;
4912
5968
  }
5969
+ if (target === "bracket") {
5970
+ precheck(cfg, t2);
5971
+ const stageFilter = team?.toUpperCase();
5972
+ if (stageFilter && !BRACKET_STAGES.has(stageFilter)) {
5973
+ throw new InputError(t(cfg.lang, "bracket.invalidStage"));
5974
+ }
5975
+ const { view, degraded: degraded2, source: source2 } = await getBracket(
5976
+ adapterFor(ctx),
5977
+ stageFilter ? { stage: stageFilter, lang: cfg.lang } : { lang: cfg.lang }
5978
+ );
5979
+ emitShareBracket(
5980
+ ctx,
5981
+ {
5982
+ stage: stageFilter,
5983
+ view,
5984
+ source: degraded2 ? void 0 : source2,
5985
+ degraded: degraded2,
5986
+ installLine: stageFilter ? `npx @claudinho/cli bracket ${stageFilter}` : "npx @claudinho/cli bracket",
5987
+ emptyNote: t(cfg.lang, "bracket.empty"),
5988
+ options: {
5989
+ includeHashtag: baseOptions.includeHashtag,
5990
+ includeInstallLine: baseOptions.includeInstallLine,
5991
+ locale: cfg.lang
5992
+ }
5993
+ },
5994
+ copy
5995
+ );
5996
+ return;
5997
+ }
4913
5998
  if (target === "next") {
4914
- precheck(cfg, t);
5999
+ precheck(cfg, t2);
4915
6000
  const code = resolveTeamArg(team, "Usage: claudinho share next <team> (or set CLAUDINHO_TEAM)");
4916
6001
  const fixture = nextFixtureForTeam(code, { from: ctx.now ?? /* @__PURE__ */ new Date() });
4917
6002
  const matches = fixture ? [fixture] : [];
@@ -4939,7 +6024,7 @@ async function cmdShare(target, team, opts, ctx) {
4939
6024
  return;
4940
6025
  }
4941
6026
  if (target && target !== "today" && !isValidDate(target)) {
4942
- precheck(cfg, t);
6027
+ precheck(cfg, t2);
4943
6028
  const { match, degraded: degraded2, source: source2 } = await getMatchById(adapterFor(ctx), target);
4944
6029
  const matches = match ? [match] : [];
4945
6030
  const signals2 = await reliableShareSignals(ctx, matches);
@@ -4966,7 +6051,7 @@ async function cmdShare(target, team, opts, ctx) {
4966
6051
  return;
4967
6052
  }
4968
6053
  const explicitDate = target && target !== "today" ? target : void 0;
4969
- precheck(cfg, t, explicitDate);
6054
+ precheck(cfg, t2, explicitDate);
4970
6055
  const date = explicitDate ?? localDate((/* @__PURE__ */ new Date()).toISOString(), cfg.tz);
4971
6056
  const { matches: all, degraded, source } = await getMatchesForDate(adapterFor(ctx), date);
4972
6057
  const todays = fixturesByDate(date, all, cfg.tz);
@@ -5064,7 +6149,7 @@ function handlePipeError(stream) {
5064
6149
  }
5065
6150
  handlePipeError(process.stdout);
5066
6151
  handlePipeError(process.stderr);
5067
- var VERSION = "0.6.2";
6152
+ var VERSION = "0.8.0";
5068
6153
  var DISCLAIMER = "Claudinho is an independent fan project. Not affiliated with or endorsed by FIFA or Anthropic.";
5069
6154
  function ctxFrom(cmd) {
5070
6155
  let root = cmd;
@@ -5112,6 +6197,13 @@ program.command("table").description("show group standings (default: all groups)
5112
6197
  fail(e);
5113
6198
  }
5114
6199
  });
6200
+ program.command("bracket").description("show the knockout bracket (default: all rounds)").argument("[stage]", "filter by stage: R32, R16, QF, SF, 3P, F").option("--tree", "ASCII tree view (falls back to list when terminal is narrow)").action(async (stage, opts, cmd) => {
6201
+ try {
6202
+ await cmdBracket(stage, opts, ctxFrom(cmd));
6203
+ } catch (e) {
6204
+ fail(e);
6205
+ }
6206
+ });
5115
6207
  program.command("match").description("show a single match by id").argument("<id>", "match id").action(async (id, _opts, cmd) => {
5116
6208
  try {
5117
6209
  await cmdMatch(id, ctxFrom(cmd));
@@ -5126,9 +6218,9 @@ program.command("markets").description("show prediction-market signals (read-onl
5126
6218
  fail(e);
5127
6219
  }
5128
6220
  });
5129
- program.command("share").description("print a shareable, copy-pasteable match snippet (#VibingLaVidaLoca)").argument("[target]", '"today" (default), "live", a date, a match id, "next", or "table"').argument(
6221
+ program.command("share").description("print a shareable, copy-pasteable match snippet (#VibingLaVidaLoca)").argument("[target]", '"today" (default), "live", a date, a match id, "next", "table", or "bracket"').argument(
5130
6222
  "[team]",
5131
- 'team code for "next" (default: $CLAUDINHO_TEAM), or group letter for "table" (omit for all groups)'
6223
+ 'team code for "next" (default: $CLAUDINHO_TEAM), group letter for "table", or stage for "bracket"'
5132
6224
  ).option("--style <style>", "snippet style: social (default) or compact").option("--copy", "also copy the snippet to the clipboard (best-effort)").option("--no-hashtag", "omit the #VibingLaVidaLoca tag").option("--no-install-line", "omit the install/run cue").action(async (target, team, opts, cmd) => {
5133
6225
  try {
5134
6226
  await cmdShare(target, team, opts, ctxFrom(cmd));